diff --git a/.eleventy.js b/.eleventy.js index 1c8c7775bc..b913246ac9 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -44,6 +44,7 @@ module.exports = function (eleventyConfig) { eleventyConfig.addCollection("elixirPosts", require("./collections/elixirPosts")); eleventyConfig.addCollection("rustPosts", require("./collections/rustPosts")); eleventyConfig.addCollection("sveltePosts", require("./collections/sveltePosts")); + eleventyConfig.addCollection("travelPosts", require("./collections/travelPosts")); eleventyConfig.addCollection("authors", require("./collections/authors")); eleventyConfig.addCollection("authorsPostsPaged", require("./collections/authorsPostsPaged")); eleventyConfig.addCollection("tags", require("./collections/tags")); @@ -224,6 +225,11 @@ module.exports = function (eleventyConfig) { return response.data.replace(" { + const [user, server] = handle.split("@").filter(Boolean); + return `https://${server}/@${user}`; + }); + eleventyConfig.setServerOptions({ watch: ["./dist/assets/css/*.css", "./dist/assets/js/*.js"], }); diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eb188ce202..79734e4d96 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,9 +12,10 @@ jobs: lint: name: Linting runs-on: ubuntu-latest + if: ${{ github.event_name != 'schedule' }} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - uses: actions/setup-node@v4 with: registry-url: "https://registry.npmjs.org" @@ -34,9 +35,10 @@ jobs: visual-regressions: name: 'Visual Regressions' runs-on: ubuntu-latest + if: ${{ github.event_name != 'schedule' }} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - uses: actions/setup-node@v4 with: registry-url: "https://registry.npmjs.org" @@ -62,9 +64,10 @@ jobs: performance: name: 'Performance' runs-on: ubuntu-latest + if: ${{ github.event_name != 'schedule' }} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: ref: ${{ github.event.pull_request.head.sha }} - uses: actions/setup-node@v4 @@ -91,9 +94,10 @@ jobs: crawl: name: 'Crawl Links' runs-on: ubuntu-latest + if: ${{ github.event_name != 'schedule' }} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: ref: ${{ github.event.pull_request.head.sha }} - uses: actions/setup-node@v4 @@ -118,9 +122,10 @@ jobs: gravity: name: 'Gravity' runs-on: ubuntu-latest + if: ${{ github.event_name != 'schedule' }} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: ref: ${{ github.event.pull_request.head.sha }} - uses: actions/setup-node@v4 diff --git a/.prettierrc.js b/.prettierrc.js index e77dc422b5..86ae1ecc4d 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -10,8 +10,8 @@ module.exports = { { files: "*.md", options: { + proseWrap: "never", printWidth: 80, - proseWrap: "always", }, }, { diff --git a/README.md b/README.md index 33cf0a5821..2a9492ef39 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,4 @@ The source code for [https://mainmatter.com](https://mainmatter.com). ## Copyright -Copyright © 2019-2022 Mainmatter GmbH (https://mainmatter.com), released -under the -[Creative Commons Attribution-NonCommercial 4.0 International license](https://creativecommons.org/licenses/by-nc/4.0/). +Copyright © 2019-2022 Mainmatter GmbH (https://mainmatter.com), released under the [Creative Commons Attribution-NonCommercial 4.0 International license](https://creativecommons.org/licenses/by-nc/4.0/). diff --git a/collections/travelPosts.js b/collections/travelPosts.js new file mode 100644 index 0000000000..36c8b07a90 --- /dev/null +++ b/collections/travelPosts.js @@ -0,0 +1,10 @@ +const livePosts = require("./posts"); + +module.exports = collection => { + const allPosts = livePosts(collection); + return allPosts.filter( + post => + Array.isArray(post.data.tags) && + post.data.tags.some(t => t.match(/^process/) || t.match(/^culture/) || t.match(/^consulting/)) + ); +}; diff --git a/config/this-week-in-open-source.config.json b/config/this-week-in-open-source.config.json index ddbbe82f1d..b44f6e738a 100644 --- a/config/this-week-in-open-source.config.json +++ b/config/this-week-in-open-source.config.json @@ -22,7 +22,9 @@ "rust-lang/www.rust-lang.org", "dimforge/rapier.rs", "marcoow/pacesetter", - "mainmatter/cargo-autoinherit" + "mainmatter/cargo-autoinherit", + "mainmatter/100-exercises-to-learn-rust", + "mainmatter/gerust" ] }, { @@ -88,7 +90,8 @@ "sveltejs/language-tools", "svecosystem/runed", "mainmatter/sheepdog", - "paoloricciuti/optimistikit" + "paoloricciuti/optimistikit", + "animotionjs/animotion" ] }, { @@ -205,7 +208,9 @@ "adopted-ember-addons/ember-drag-drop", "tleunen/babel-plugin-module-resolver", "snewcomer/intersection-observer-admin", - "mansona/auto-reveal-theme-mainmatter" + "mansona/auto-reveal-theme-mainmatter", + "formatjs/formatjs", + "vitejs/vite" ] }, { @@ -464,7 +469,9 @@ "ember-cli/ember-cli-deprecation-workflow", "ember-cli/babel-plugin-debug-macros", "adopted-ember-addons/ember-sortable", - "elwayman02/ember-resize-modifier" + "elwayman02/ember-resize-modifier", + "ember-codemods/tagless-ember-components-codemod", + "adopted-ember-addons/ember-paper" ] }, { @@ -563,7 +570,8 @@ "oscard0m/example-probot-vercel-ts", "paoloricciuti/darkmodething", "mansona/testing-release-plan", - "BlueCutOfficial/site-cv" + "BlueCutOfficial/site-cv", + "mainmatter/gravity_dummy" ], "exclude_closed_not_merged": true, "output_path": "src/twios/", diff --git a/netlify.toml b/netlify.toml index e40c6d0ce3..c38a3b715d 100644 --- a/netlify.toml +++ b/netlify.toml @@ -199,7 +199,7 @@ # redirect old "Web-based Services in Rust" landing page to regular workshop [[redirects]] from = "https://rust-web-services-workshop.mainmatter.com/*" - to = "https://mainmatter.com/services/workshops/web-based-services-in-rust/" + to = "https://mainmatter.com/services/workshops/build-production-ready-apis-in-rust/" force = true # redirect old "Web-based Servides in Rust" workshop to new one diff --git a/package.json b/package.json index af203c98a9..a8dc5a5afa 100644 --- a/package.json +++ b/package.json @@ -34,15 +34,15 @@ }, "devDependencies": { "@11ty/eleventy": "^2.0.1", - "@11ty/eleventy-img": "^4.0.0", + "@11ty/eleventy-img": "^6.0.0", "@11ty/eleventy-navigation": "^0.3.2", "@11ty/eleventy-plugin-rss": "1.2.0", "@11ty/eleventy-plugin-syntaxhighlight": "5.0.0", - "@lhci/cli": "^0.13.0", + "@lhci/cli": "^0.14.0", "@percy/cli": "^1.28.7", "@quasibit/eleventy-plugin-sitemap": "^2.1.5", - "@rollup/plugin-commonjs": "^26.0.1", - "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-commonjs": "^28.0.0", + "@rollup/plugin-node-resolve": "^16.0.0", "@rollup/plugin-terser": "^0.4.4", "@tbranyen/jsdom": "13.0.0", "broken-link-checker": "^0.7.8", @@ -50,7 +50,7 @@ "cross-env": "7.0.3", "dayjs": "^1.10.4", "eslint": "^9.0.0", - "eslint-config-prettier": "^9.1.0", + "eslint-config-prettier": "^10.0.0", "eslint-plugin-n": "^17.0.0", "eslint-plugin-prettier": "^5.1.3", "express": "^4.18.1", @@ -58,9 +58,9 @@ "markdown-it": "14.1.0", "markdown-it-footnote": "^4.0.0", "netlify-plugin-11ty": "^1.1.0", - "npm-run-all2": "^6.0.0", - "prettier": "3.2.5", - "prettier-plugin-jinja-template": "^1.3.3", + "npm-run-all2": "^7.0.0", + "prettier": "3.4.2", + "prettier-plugin-jinja-template": "^2.0.0", "replace-in-file": "^7.0.0", "rollup": "^4.18.0", "sass": "^1.32.8", @@ -83,7 +83,7 @@ "node": ">=20" }, "volta": { - "node": "20.15.1", - "pnpm": "9.7.0" + "node": "22.13.0", + "pnpm": "9.15.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dfd24c5413..6816642f13 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@sentry/browser': specifier: ^8.0.0 - version: 8.15.0 + version: 8.48.0 gsap: specifier: ^3.12.3 version: 3.12.5 @@ -22,8 +22,8 @@ importers: specifier: ^2.0.1 version: 2.0.1 '@11ty/eleventy-img': - specifier: ^4.0.0 - version: 4.0.2 + specifier: ^6.0.0 + version: 6.0.0 '@11ty/eleventy-navigation': specifier: ^0.3.2 version: 0.3.5 @@ -34,23 +34,23 @@ importers: specifier: 5.0.0 version: 5.0.0 '@lhci/cli': - specifier: ^0.13.0 - version: 0.13.0 + specifier: ^0.14.0 + version: 0.14.0 '@percy/cli': specifier: ^1.28.7 - version: 1.28.8 + version: 1.30.6 '@quasibit/eleventy-plugin-sitemap': specifier: ^2.1.5 version: 2.2.0 '@rollup/plugin-commonjs': - specifier: ^26.0.1 - version: 26.0.1(rollup@4.18.0) + specifier: ^28.0.0 + version: 28.0.2(rollup@4.30.1) '@rollup/plugin-node-resolve': - specifier: ^15.2.3 - version: 15.2.3(rollup@4.18.0) + specifier: ^16.0.0 + version: 16.0.0(rollup@4.30.1) '@rollup/plugin-terser': specifier: ^0.4.4 - version: 0.4.4(rollup@4.18.0) + version: 0.4.4(rollup@4.30.1) '@tbranyen/jsdom': specifier: 13.0.0 version: 13.0.0 @@ -65,22 +65,22 @@ importers: version: 7.0.3 dayjs: specifier: ^1.10.4 - version: 1.11.11 + version: 1.11.13 eslint: specifier: ^9.0.0 - version: 9.6.0 + version: 9.18.0 eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@9.6.0) + specifier: ^10.0.0 + version: 10.0.1(eslint@9.18.0) eslint-plugin-n: specifier: ^17.0.0 - version: 17.9.0(eslint@9.6.0) + version: 17.15.1(eslint@9.18.0) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.1.3(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint@9.6.0)(prettier@3.2.5) + version: 5.2.1(eslint-config-prettier@10.0.1(eslint@9.18.0))(eslint@9.18.0)(prettier@3.4.2) express: specifier: ^4.18.1 - version: 4.19.2 + version: 4.21.2 html-minifier: specifier: 4.0.0 version: 4.0.0 @@ -94,23 +94,23 @@ importers: specifier: ^1.1.0 version: 1.4.0 npm-run-all2: - specifier: ^6.0.0 - version: 6.2.2 + specifier: ^7.0.0 + version: 7.0.2 prettier: - specifier: 3.2.5 - version: 3.2.5 + specifier: 3.4.2 + version: 3.4.2 prettier-plugin-jinja-template: - specifier: ^1.3.3 - version: 1.4.1(prettier@3.2.5) + specifier: ^2.0.0 + version: 2.0.0(prettier@3.4.2) replace-in-file: specifier: ^7.0.0 version: 7.2.0 rollup: specifier: ^4.18.0 - version: 4.18.0 + version: 4.30.1 sass: specifier: ^1.32.8 - version: 1.77.6 + version: 1.83.1 slugify: specifier: 1.6.6 version: 1.6.6 @@ -119,7 +119,7 @@ importers: version: 3.3.2 wicg-inert: specifier: ^3.1.1 - version: 3.1.2 + version: 3.1.3 packages: @@ -131,12 +131,12 @@ packages: engines: {node: '>=14'} hasBin: true - '@11ty/eleventy-fetch@4.0.1': - resolution: {integrity: sha512-yIiLM5ziBmg86i4TlXpBdcIygJHvh/GgPJyAiFOckO9H4y9cQDM8eIcJCUQ4Mum0NEVui/OjhEut2R08xw0vlQ==} - engines: {node: '>=14'} + '@11ty/eleventy-fetch@5.0.2': + resolution: {integrity: sha512-yu7oZ5iv7zvFDawSYcN19cz7ddJB7OXPGZ47z/MzYmLa2LkpJm0KnZW2xGwpKvVrXd+tyb96ts6AqlkJT/ibwQ==} + engines: {node: '>=18'} - '@11ty/eleventy-img@4.0.2': - resolution: {integrity: sha512-MSCkZRJk9rWa7nojx9HBMZJePOrm+V3XNpT091qguj61SG5UsgXbxAkoeejO3npmKIQJTyVIV/rrA6d7xZYOvw==} + '@11ty/eleventy-img@6.0.0': + resolution: {integrity: sha512-5vQj6NMxaRwI/rkRkrDajUvNy4p4xJz2DJrlgk0JpvYegkC8OxAoLE+sXqd5Ij5IgqfoPHiepf/3FbTHAnYXzg==} engines: {node: '>=18'} '@11ty/eleventy-navigation@0.3.5': @@ -152,6 +152,10 @@ packages: resolution: {integrity: sha512-nULO91om7vQw4Y/UBjM8i7nJ1xl+/nyK4rImZ41lFxiY2d+XUz7ChAj1CDYFjrLZeu0utAYJTZ45LlcHTkUG4g==} engines: {node: '>=12'} + '@11ty/eleventy-utils@2.0.0': + resolution: {integrity: sha512-rKny6X7+ARuke0TaA6FwNv2PWJCNSdPQqbqDgaZgi+bPXwnPRTEi3CWzvr6vVgh/1XpO1G4FhRPreLhtcwHUyg==} + engines: {node: '>=18'} + '@11ty/eleventy@2.0.1': resolution: {integrity: sha512-t8XVUbCJByhVEa1RzO0zS2QzbL3wPY8ot1yUw9noqiSHxJWUwv6jiwm1/MZDPTYtkZH2ZHvdQIRQ5/SjG9XmLw==} engines: {node: '>=14'} @@ -161,205 +165,209 @@ packages: resolution: {integrity: sha512-Mqt6im1xpb1Ykn3nbcCovWXK3ggywRJa+IXIdoz4wIIK+cvozADH63lexcuPpGS/gJ6/m2JxyyXDyupkMr5DHw==} engines: {node: '>=14'} - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.24.7': - resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.7': - resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.24.7': - resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} engines: {node: '>=6.9.0'} - '@emnapi/runtime@1.2.0': - resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} + '@emnapi/runtime@1.3.1': + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.17.0': - resolution: {integrity: sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA==} + '@eslint/config-array@0.19.1': + resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.10.0': + resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.1.0': - resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + '@eslint/js@9.18.0': + resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.6.0': - resolution: {integrity: sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==} + '@eslint/object-schema@2.1.5': + resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.4': - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + '@eslint/plugin-kit@0.2.5': + resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@formatjs/ecma402-abstract@2.0.0': - resolution: {integrity: sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==} + '@formatjs/ecma402-abstract@2.3.2': + resolution: {integrity: sha512-6sE5nyvDloULiyOMbOTJEEgWL32w+VHkZQs8S02Lnn8Y/O5aQhjOEXwWzvR7SsBE/exxlSpY2EsWZgqHbtLatg==} - '@formatjs/fast-memoize@2.2.0': - resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} + '@formatjs/fast-memoize@2.2.6': + resolution: {integrity: sha512-luIXeE2LJbQnnzotY1f2U2m7xuQNj2DA8Vq4ce1BY9ebRZaoPB1+8eZ6nXpLzsxuW5spQxr7LdCg+CApZwkqkw==} - '@formatjs/icu-messageformat-parser@2.7.8': - resolution: {integrity: sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==} + '@formatjs/icu-messageformat-parser@2.9.8': + resolution: {integrity: sha512-hZlLNI3+Lev8IAXuwehLoN7QTKqbx3XXwFW1jh0AdIA9XJdzn9Uzr+2LLBspPm/PX0+NLIfykj/8IKxQqHUcUQ==} - '@formatjs/icu-skeleton-parser@1.8.2': - resolution: {integrity: sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==} + '@formatjs/icu-skeleton-parser@1.8.12': + resolution: {integrity: sha512-QRAY2jC1BomFQHYDMcZtClqHR55EEnB96V7Xbk/UiBodsuFc5kujybzt87+qj1KqmJozFhk6n4KiT1HKwAkcfg==} - '@formatjs/intl-localematcher@0.5.4': - resolution: {integrity: sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==} + '@formatjs/intl-localematcher@0.5.10': + resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.0': - resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} engines: {node: '>=18.18'} '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} - '@img/sharp-darwin-arm64@0.33.4': - resolution: {integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.4': - resolution: {integrity: sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.2': - resolution: {integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==} - engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.2': - resolution: {integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==} - engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.2': - resolution: {integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==} - engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.0.2': - resolution: {integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==} - engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-s390x@1.0.2': - resolution: {integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==} - engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.0.2': - resolution: {integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==} - engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.0.2': - resolution: {integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==} - engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.0.2': - resolution: {integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==} - engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.33.4': - resolution: {integrity: sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.33.4': - resolution: {integrity: sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==} - engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.33.4': - resolution: {integrity: sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==} - engines: {glibc: '>=2.31', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.33.4': - resolution: {integrity: sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.33.4': - resolution: {integrity: sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==} - engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.33.4': - resolution: {integrity: sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==} - engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.33.4': - resolution: {integrity: sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-ia32@0.33.4': - resolution: {integrity: sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.4': - resolution: {integrity: sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': @@ -373,18 +381,21 @@ packages: '@jridgewell/source-map@0.3.6': resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@lhci/cli@0.13.0': - resolution: {integrity: sha512-Y/ulyvT3h2j1jeFEoNC9RM5zOTW9s48Np3yC/kpKP6++to4ulMu4mKrmFit5zFHKuH7pC1+bkcYwM1/ul78FfQ==} + '@keyv/serialize@1.0.2': + resolution: {integrity: sha512-+E/LyaAeuABniD/RvUezWVXKpeuvwLEA9//nE9952zBaOdBd2mQ3pPoM8cUe2X6IcMByfuSLzmYqnYshG60+HQ==} + + '@lhci/cli@0.14.0': + resolution: {integrity: sha512-TxOH9pFBnmmN7Jmo2Aimxx5UhE8veqXpHfFJDMWsCVxkwh7mGxcAWchGl84mK139SZbbRmerqZ72c+h2nG9/QQ==} hasBin: true - '@lhci/utils@0.13.0': - resolution: {integrity: sha512-QkICuVx9rwP8cw0KIV7nEqMldKCddGwYVHal3NnvXl1dGkGJn+0kHZeN8RYZ6aBbLnjTqTCnK0KNAiVxIpD4cw==} + '@lhci/utils@0.14.0': + resolution: {integrity: sha512-LyP1RbvYQ9xNl7uLnl5AO8fDRata9MG/KYfVFKFkYenlsVS6QJsNjLzWNEoMIaE4jOPdQQlSp4tO7dtnyDxzbQ==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -398,90 +409,175 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@percy/cli-app@1.28.8': - resolution: {integrity: sha512-UQzO/I2WKhhh18M5zKzOdqSOGLzViIKDX/77r+pEvz3DC/wlEB4bVTrEKFVvLdj1F4WGLfYCpGh2yIf/+OoDEg==} + '@parcel/watcher-android-arm64@2.5.0': + resolution: {integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.0': + resolution: {integrity: sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.0': + resolution: {integrity: sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.0': + resolution: {integrity: sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.0': + resolution: {integrity: sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.0': + resolution: {integrity: sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.0': + resolution: {integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.0': + resolution: {integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.0': + resolution: {integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.0': + resolution: {integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.0': + resolution: {integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.0': + resolution: {integrity: sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.0': + resolution: {integrity: sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.0': + resolution: {integrity: sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==} + engines: {node: '>= 10.0.0'} + + '@paulirish/trace_engine@0.0.23': + resolution: {integrity: sha512-2ym/q7HhC5K+akXkNV6Gip3oaHpbI6TsGjmcAsl7bcJ528MVbacPQeoauLFEeLXH4ulJvsxQwNDIg/kAEhFZxw==} + + '@percy/cli-app@1.30.6': + resolution: {integrity: sha512-IjsWqXcjjXBPErU87Zrvui2k8nogz6trXVUpiGVkPGlFXeGjQXzB95wUECRDqvDTRRrisW1p/XVJi62dUAOX2A==} engines: {node: '>=14'} - '@percy/cli-build@1.28.8': - resolution: {integrity: sha512-4PiMffATEsr3CKaHUU9dXPKUu5gWfpVnp2YLawsSjxZj4XsOPqkWC8MsBv7CFVpNBbfjYufSzMe9YLHVcPS14A==} + '@percy/cli-build@1.30.6': + resolution: {integrity: sha512-8MxuqrjIn2pxuGOVm2V1XkVNrC88a2Xog6qC9omqf69LQfFB5hR1+s40M/MC/9oM8MJFRsNJJ5PUDRHOwgM02Q==} engines: {node: '>=14'} - '@percy/cli-command@1.28.8': - resolution: {integrity: sha512-pXV0RqFQYK8bcYvMmf04Bp0HFprq+gqF0B8MrevhqA2YJldISln6TrOEpymQI89Sfj261xdOe6tl0WMIbawAiw==} + '@percy/cli-command@1.30.6': + resolution: {integrity: sha512-k+/5GTXcbPfgKV6N7yqqt2E3OwQYJl/+fXQZSy7LAfNMR9X0w26ah2ErznyaCsLTPeDyurAJ7SPIOXHsq28uRA==} engines: {node: '>=14'} hasBin: true - '@percy/cli-config@1.28.8': - resolution: {integrity: sha512-uD13cLYZAhCFdh2zBCCk73LqG/Dx4MUBybs4lLMlAwQZsWRnn4X//99dgVyzOUDzLS8oRWzouFx7Z/5SOcMPvA==} + '@percy/cli-config@1.30.6': + resolution: {integrity: sha512-hKsadKRizSxe+SuuDItDZV0qd32FNpfUYHhpA1gxkAhAtgZy4d1bINmKgrB6I55cSD1yYZgRGXI1e2+NI5q5ig==} engines: {node: '>=14'} - '@percy/cli-exec@1.28.8': - resolution: {integrity: sha512-a2EhPuuykz9WTIdEEdf9zmqGOu1MATz+Ss4rzIIpXlto5k40K42hn/lzRRIQzGNok6ADXJ0vZ0lLgoBX+SMEPw==} + '@percy/cli-exec@1.30.6': + resolution: {integrity: sha512-N/vdTi5NJWT7AqQt8XgheGgB+vByZtX/WkpG5/a0WsJltOIYJKM0ZZIaUxZsUtXwgustdrEFchlAin/87aasvg==} engines: {node: '>=14'} - '@percy/cli-snapshot@1.28.8': - resolution: {integrity: sha512-mIOI9uD0GiOqo4jhaJPRShrgy8isAir3ID9vMQ96B+g2ziUhRWceNdFr+N/OwHFRJ8wyUmJnji2Fr0bNagOWGA==} + '@percy/cli-snapshot@1.30.6': + resolution: {integrity: sha512-D5qYBLVXBmIYloVfCGfIwYBg3vUXWaTA0dne0aEvIVWBN7QRKncFTHeehGe4CXal9tceFbJyx7yJCu3XXP10hg==} engines: {node: '>=14'} - '@percy/cli-upload@1.28.8': - resolution: {integrity: sha512-qgj610GPo3a5cbRXoP6LPfqp9+Qrgo8Sg7aYswomrt6j7zdoV1RAf419eNfP4pYtLoMji4EIGcSMQ91tWv2DoA==} + '@percy/cli-upload@1.30.6': + resolution: {integrity: sha512-5buyO7tljBOeCKARLegoxT8NvtiZs/kIXt63d7BRVTfJKa7rn/2Xw0Y/DVseGixHFryZ6C//osvE50nHifcKYw==} engines: {node: '>=14'} - '@percy/cli@1.28.8': - resolution: {integrity: sha512-sbbiC7Kfs1i+4AsLpHgEx3f6rntXiRShuQa3aNuAQMugXuKgZrr2kI6wzygfO352mYeplblyZNxC0zhXPxtyFA==} + '@percy/cli@1.30.6': + resolution: {integrity: sha512-bR6niEywRPMXe3Koadk9ryQtCYP62LOTVQddi8I6STlOy8iEUsD2GMa8Sw4oU9hvD250Im0zpe5jP08BwrSfnw==} engines: {node: '>=14'} hasBin: true - '@percy/client@1.28.8': - resolution: {integrity: sha512-icBiRmLwODrnbxSDmhhN1KLz6W4xE+0bM8rEF/qcUC8SRKecBrz0RA60kyg/jn3H01iv0TOe4NXEMHHk+f7s7w==} + '@percy/client@1.30.6': + resolution: {integrity: sha512-iHcYK4djy/WA3ZqIVcgOmuOtDeMiGDmJZ0DlDG38HMmAPgXHSThNXNz9bnXb2OSJFxXVRdlAE8DoqFK5FnwNsg==} engines: {node: '>=14'} - '@percy/config@1.28.8': - resolution: {integrity: sha512-jsH1CdJQDHfnqRNiR+apugxz3HuMq129LH2+qrf1Ow3nFLRbYfeGD25xiCGMaeDfYCHkY26oSo6409/asBdvpA==} + '@percy/config@1.30.6': + resolution: {integrity: sha512-qYUu4TVLJgtG/RIwa/AM+d3f1xH4D3uSvCoWUhX4y5rK5QDZ0UqWEvDOD6CJDn8i1xXi4ZY/JB7HKYKUTHeppQ==} engines: {node: '>=14'} - '@percy/core@1.28.8': - resolution: {integrity: sha512-6YfhDoTqUhn3Zs8L9xLNHyGVcRzTjCdi51gwZtf9by/+pDCe8eaqpd5QrkoLocdEcV7Oi+FJcoZxE4OZlQNlyQ==} + '@percy/core@1.30.6': + resolution: {integrity: sha512-G0ULd3pHz8s4RajxUGTWGx8Ngl+jhOjIPNxOBtKh0ywgAnbvUWNWLKYvs9QinZcoPGfWgwc5+1btbeJxTAVGQg==} engines: {node: '>=14'} - '@percy/dom@1.28.8': - resolution: {integrity: sha512-0e/357X13C5lt/49ZiB7WHcYDgRs9nEz0hPFA7qnBa+Q0N5pemZCgUZzY1ltge2v9XYT0IAwYgO7P0V0xObRVQ==} - - '@percy/env@1.28.8': - resolution: {integrity: sha512-ZuyOPaaQxpCIVs1lgFeb2DRFAfhbAX7LaK8RAKtcAzoKW86YUosL/OWUtmmzQUvnGMWZb611WLIcV48lspkrQQ==} - engines: {node: '>=14'} + '@percy/dom@1.30.6': + resolution: {integrity: sha512-pMlzYYJfgVdNYbw1iJIQZxXzszL3EmIrbGvvpkred3RciJ4T3/pFlqiLiPS7TTUovMFFgRjTR1gLOH1eeWyM5A==} - '@percy/logger@1.28.8': - resolution: {integrity: sha512-yw5O8ZJjA9wNaHv/AgzvPDxDEWpHVFBmF6BDKZ+bT2xErgJt8UFgm0+Zv7pRbqXdoEAEHQbBeaYMrI7QkFaebg==} + '@percy/env@1.30.6': + resolution: {integrity: sha512-GU3ZcyiCUM3KiRmcpa5fpOIkuHBUonvBhNeg1jErZFEZFQDNm238SFnKQFEJIYCX96W5Q9qqXMwjApj7qBpiWg==} engines: {node: '>=14'} - '@percy/sdk-utils@1.28.8': - resolution: {integrity: sha512-eqeIloD3OvHtPVUn08jDKt8m46oakKliEWDGliPdeWTtrfnoTJZtk8yNKe7jn8N3gzNYgU8iytwWFQV00zHBjQ==} + '@percy/logger@1.30.6': + resolution: {integrity: sha512-HDhAIjjqOlpAIqClu+fvuWSA2cvxh3aMHtKN3gRdRMppHCvyyfmVbKd1PoLPV7Z0SQzZkyaBMAjiRXWMPksLig==} engines: {node: '>=14'} - '@percy/webdriver-utils@1.28.8': - resolution: {integrity: sha512-xrL3zBw+coeBs1nrKxHo6Fa3xqLjVACnR9KYc+GR/KrltK3TZF4gmGOHUtFHq7Y+OK9iKFyWqpl0RRwq0Ne2eg==} + '@percy/sdk-utils@1.30.6': + resolution: {integrity: sha512-LSayDfxAaXJaSv5SIDKMf7EjDl+k4kufYO88YQwc9+9Yr58qqrPFon11x0PvJdA2IDGBo1G6QbvpLUO0Vem2FQ==} engines: {node: '>=14'} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + '@percy/webdriver-utils@1.30.6': + resolution: {integrity: sha512-B1M9HWP3ZEM5CuDSMUx+68mrrKm9/JjJ0KO/OLztRh+v7TOsgOWpHMHalurwEIfoNf/olduQ4/Vv9TPrTSj72Q==} engines: {node: '>=14'} '@pkgr/core@0.1.1': resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@puppeteer/browsers@1.9.1': - resolution: {integrity: sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==} - engines: {node: '>=16.3.0'} + '@puppeteer/browsers@2.3.0': + resolution: {integrity: sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==} + engines: {node: '>=18'} hasBin: true '@quasibit/eleventy-plugin-sitemap@2.2.0': resolution: {integrity: sha512-7YoU4jjipLjifBhZwttLWbAAkImmBfeMQ0+1ST6mJO45z2mFLHZcgnfHwGF2joNk74wiYNsNOB1ennouzQFZIQ==} engines: {node: '>=10.0.0'} - '@rollup/plugin-commonjs@26.0.1': - resolution: {integrity: sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==} + '@rgrove/parse-xml@4.2.0': + resolution: {integrity: sha512-UuBOt7BOsKVOkFXRe4Ypd/lADuNIfqJXv8GvHqtXaTYXPPKkj2nS2zPllVsrtRjcomDhIJVBnZwfmlI222WH8g==} + engines: {node: '>=14.0.0'} + + '@rollup/plugin-commonjs@28.0.2': + resolution: {integrity: sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==} engines: {node: '>=16.0.0 || 14 >= 14.17'} peerDependencies: rollup: ^2.68.0||^3.0.0||^4.0.0 @@ -489,8 +585,8 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@15.2.3': - resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + '@rollup/plugin-node-resolve@16.0.0': + resolution: {integrity: sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 @@ -507,8 +603,8 @@ packages: rollup: optional: true - '@rollup/pluginutils@5.1.0': - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -516,112 +612,127 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.18.0': - resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + '@rollup/rollup-android-arm-eabi@4.30.1': + resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.18.0': - resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + '@rollup/rollup-android-arm64@4.30.1': + resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.18.0': - resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + '@rollup/rollup-darwin-arm64@4.30.1': + resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.18.0': - resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + '@rollup/rollup-darwin-x64@4.30.1': + resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': - resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + '@rollup/rollup-freebsd-arm64@4.30.1': + resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.30.1': + resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.18.0': - resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + '@rollup/rollup-linux-arm-musleabihf@4.30.1': + resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.18.0': - resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + '@rollup/rollup-linux-arm64-gnu@4.30.1': + resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.18.0': - resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + '@rollup/rollup-linux-arm64-musl@4.30.1': + resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': - resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.18.0': - resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + '@rollup/rollup-linux-riscv64-gnu@4.30.1': + resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.18.0': - resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + '@rollup/rollup-linux-s390x-gnu@4.30.1': + resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.18.0': - resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + '@rollup/rollup-linux-x64-gnu@4.30.1': + resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.18.0': - resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + '@rollup/rollup-linux-x64-musl@4.30.1': + resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.18.0': - resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + '@rollup/rollup-win32-arm64-msvc@4.30.1': + resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.18.0': - resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + '@rollup/rollup-win32-ia32-msvc@4.30.1': + resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.18.0': - resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + '@rollup/rollup-win32-x64-msvc@4.30.1': + resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} cpu: [x64] os: [win32] - '@sentry-internal/browser-utils@8.15.0': - resolution: {integrity: sha512-DquySUQRnmMyRbfHH9t/JDwPMsVaCOCzV/6XmMb7s4FDYTWSCSpumJEYfiyJCuI9NeebPHZWF7LZCHH4glSAJQ==} + '@sentry-internal/browser-utils@8.48.0': + resolution: {integrity: sha512-pLtu0Fa1Ou0v3M1OEO1MB1EONJVmXEGtoTwFRCO1RPQI2ulmkG6BikINClFG5IBpoYKZ33WkEXuM6U5xh+pdZg==} engines: {node: '>=14.18'} - '@sentry-internal/feedback@8.15.0': - resolution: {integrity: sha512-W6XiLpw7fL1A0KaHxIH45nbC2M8uagrMoBnMZ1NcqE4AoSe7VtoDqPsLvQ7MgMXwsBYiPu2AItRnKoGFS/dUBA==} + '@sentry-internal/feedback@8.48.0': + resolution: {integrity: sha512-6PwcJNHVPg0EfZxmN+XxVOClfQpv7MBAweV8t9i5l7VFr8sM/7wPNSeU/cG7iK19Ug9ZEkBpzMOe3G4GXJ5bpw==} engines: {node: '>=14.18'} - '@sentry-internal/replay-canvas@8.15.0': - resolution: {integrity: sha512-gfezIuvf94wY748l5wSy4pRm+45GjiBm0Q/KLnXROLZKmbI7MTJrdQXA2Oxut848iISTQo4/LimecFnBDiaGtw==} + '@sentry-internal/replay-canvas@8.48.0': + resolution: {integrity: sha512-LdivLfBXXB9us1aAc6XaL7/L2Ob4vi3C/fEOXElehg3qHjX6q6pewiv5wBvVXGX1NfZTRvu+X11k6TZoxKsezw==} engines: {node: '>=14.18'} - '@sentry-internal/replay@8.15.0': - resolution: {integrity: sha512-d4cA8pjr0CGHkTe8ulqMROYCX3bMHBAi/7DJBr11i4MdNCUl+/pndA9C5TiFv0sFzk/hDZQZS3J+MfGp56ZQHw==} + '@sentry-internal/replay@8.48.0': + resolution: {integrity: sha512-csILVupc5RkrsTrncuUTGmlB56FQSFjXPYWG8I8yBTGlXEJ+o8oTuF6+55R4vbw3EIzBveXWi4kEBbnQlXW/eg==} engines: {node: '>=14.18'} - '@sentry/browser@8.15.0': - resolution: {integrity: sha512-Tx4eFgAqa8tedg30+Cgr7qFocWHise8p3jb/RSNs+TCEBXLVtQidHHVZMO71FWUAC86D7woo5hMKTt+UmB8pgg==} + '@sentry/browser@8.48.0': + resolution: {integrity: sha512-fuuVULB5/1vI8NoIwXwR3xwhJJqk+y4RdSdajExGF7nnUDBpwUJyXsmYJnOkBO+oLeEs58xaCpotCKiPUNnE3g==} engines: {node: '>=14.18'} '@sentry/core@6.19.7': resolution: {integrity: sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==} engines: {node: '>=6'} - '@sentry/core@8.15.0': - resolution: {integrity: sha512-RjuEq/34VjNmxlfzq+485jG63/Vst90svQapLwVgBZWgM8jxrLyCRXHU0wfBc7/1IhV/T9GYAplrJQAkG4J9Ow==} + '@sentry/core@8.48.0': + resolution: {integrity: sha512-VGwYgTfLpvJ5LRO5A+qWo1gpo6SfqaGXL9TOzVgBucAdpzbrYHpZ87sEarDVq/4275uk1b0S293/mfsskFczyw==} engines: {node: '>=14.18'} '@sentry/hub@6.19.7': @@ -640,18 +751,10 @@ packages: resolution: {integrity: sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==} engines: {node: '>=6'} - '@sentry/types@8.15.0': - resolution: {integrity: sha512-AZc9nSHKuNH8P/7ihmq5fbZBiQ7Gr35kJq9Tad9eVuOgL8D+2b6Vqu/61ljVVlMFI0tBGFsSkWJ/00PfBcVKWg==} - engines: {node: '>=14.18'} - '@sentry/utils@6.19.7': resolution: {integrity: sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==} engines: {node: '>=6'} - '@sentry/utils@8.15.0': - resolution: {integrity: sha512-1ISmyYFuRHJbGun0gUYscyz1aP6RfILUldNAUwQwF0Ycu8YOi4n8uwJRN0aov6cCi41tnZWOMBagSeLxbJiJgQ==} - engines: {node: '>=14.18'} - '@sindresorhus/slugify@1.1.2': resolution: {integrity: sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA==} engines: {node: '>=10'} @@ -671,8 +774,11 @@ packages: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/minimatch@3.0.5': resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} @@ -680,8 +786,8 @@ packages: '@types/node@14.18.63': resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} - '@types/node@20.14.10': - resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} + '@types/node@22.10.5': + resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -728,8 +834,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true @@ -737,15 +843,15 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.16.0: - resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -775,10 +881,6 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - ansi-styles@1.1.0: resolution: {integrity: sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==} engines: {node: '>=0.10.0'} @@ -859,8 +961,8 @@ packages: asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - assert-never@1.3.0: - resolution: {integrity: sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==} + assert-never@1.4.0: + resolution: {integrity: sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==} assert-plus@1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} @@ -873,8 +975,8 @@ packages: async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -882,15 +984,15 @@ packages: aws-sign2@0.7.0: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - aws4@1.13.0: - resolution: {integrity: sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==} + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - axe-core@4.9.1: - resolution: {integrity: sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==} + axe-core@4.10.2: + resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} engines: {node: '>=4'} - b4a@1.6.6: - resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} babel-walk@3.0.0-canary-5: resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} @@ -899,8 +1001,20 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.4.2: - resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} + bare-events@2.5.4: + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} + + bare-fs@2.3.5: + resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} + + bare-os@2.4.4: + resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} + + bare-path@2.1.3: + resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + + bare-stream@2.6.1: + resolution: {integrity: sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -931,8 +1045,8 @@ packages: bluebird@2.11.0: resolution: {integrity: sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==} - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} boolbase@1.0.0: @@ -969,20 +1083,22 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - - bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + cacheable@1.8.7: + resolution: {integrity: sha512-AbfG7dAuYNjYxFUtL1lAqmlWdxczCJ47w7cFjhGcnGnUdwSo6VgmSojfoW3tUI12HUkgTJ5kqj78yyq6TsFtlg==} + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} caller-path@0.1.0: @@ -1044,6 +1160,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + chrome-launcher@0.13.4: resolution: {integrity: sha512-nnzXiDbGKjDSK6t2I+35OAPBy5Pw/39bgkb/ZAFwMhwJbdYBp6aH+vW28ZgtjdU890Q7D+3wN/tB8N66q5Gi2A==} @@ -1052,8 +1172,8 @@ packages: engines: {node: '>=12.13.0'} hasBin: true - chromium-bidi@0.5.8: - resolution: {integrity: sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==} + chromium-bidi@0.6.3: + resolution: {integrity: sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==} peerDependencies: devtools-protocol: '*' @@ -1136,8 +1256,8 @@ packages: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} - compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + compression@1.7.5: + resolution: {integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==} engines: {node: '>= 0.8.0'} concat-map@0.0.1: @@ -1173,8 +1293,8 @@ packages: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} core-util-is@1.0.2: @@ -1197,11 +1317,8 @@ packages: engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true - cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} crypto-random-string@2.0.0: @@ -1247,8 +1364,8 @@ packages: data-urls@1.1.0: resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} - dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} @@ -1258,17 +1375,8 @@ packages: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1280,6 +1388,9 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1291,10 +1402,6 @@ packages: resolution: {integrity: sha512-bDF7bg6OSNcSwFWPu4zYKpVkJZQYVrAANMYB8bc9Szem1D0yKdm4sa/rOCs2aC9+2GMqQ7KnwtZRvDhmLF0dXw==} engines: {node: '>= 0.10.0'} - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} @@ -1319,6 +1426,11 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} @@ -1331,11 +1443,8 @@ packages: dev-null@0.1.1: resolution: {integrity: sha512-nMNZG0zfMgmdv8S5O0TM5cpwNbGKRGPCxVsr0SmA3NZZy9CYBbuNLL0PD3Acx9e5LIUgwONXtM9kM6RlawPxEQ==} - devtools-protocol@0.0.1211954: - resolution: {integrity: sha512-f6BRhngr9wpHN8omZOoSaEJFscTL+tjNhmeBqHHC3CZ3K2N75sDeKXZeTkAEkTCcrusDatfwjRRBh0uz4ov/sA==} - - devtools-protocol@0.0.1232444: - resolution: {integrity: sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==} + devtools-protocol@0.0.1312386: + resolution: {integrity: sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==} doctypes@1.1.0: resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} @@ -1364,22 +1473,23 @@ packages: domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + duplexer@0.1.1: resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} @@ -1394,18 +1504,19 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enhanced-resolve@5.17.0: - resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} + enhanced-resolve@5.18.0: + resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -1423,6 +1534,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.0: + resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} + engines: {node: '>=0.12'} + eol@0.2.0: resolution: {integrity: sha512-LCBxmDyUDh5pAXALohe9NCwyedyECwpFrcebZyW/XNTzn4WZFY3cX9MdkrJQu71ojEoHqcsciqFG7d3WQA+1Ew==} @@ -1436,16 +1551,20 @@ packages: errors@0.2.0: resolution: {integrity: sha512-W0w4yTo+twP/wGTF25kBGAXroAHzvxZvEDHJsCixlWS8lf8li0aZDhT+hz0mHQwsSW5esD5jyTQkaqA0ZHF83A==} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-html@1.0.3: @@ -1479,8 +1598,8 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + eslint-config-prettier@10.0.1: + resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -1491,14 +1610,14 @@ packages: peerDependencies: eslint: '>=8' - eslint-plugin-n@17.9.0: - resolution: {integrity: sha512-CPSaXDXdrT4nsrOrO4mT4VB6FMUkoySRkHWuuJJHVqsIEjIeZgMY1H7AzSwPbDScikBmLN82KeM1u7ixV7PzGg==} + eslint-plugin-n@17.15.1: + resolution: {integrity: sha512-KFw7x02hZZkBdbZEFQduRGH4VkIH4MW97ClsbAM4Y4E6KguBJWGfWG1P4HEIpZk2bkoWf0bojpnjNAhYQP8beA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' - eslint-plugin-prettier@5.1.3: - resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + eslint-plugin-prettier@5.2.1: + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -1511,25 +1630,30 @@ packages: eslint-config-prettier: optional: true - eslint-scope@8.0.1: - resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.6.0: - resolution: {integrity: sha512-ElQkdLMEEqQNM9Njff+2Y4q2afHk7JpkPvrd7Xh7xefwgQynqPxwf55J7di9+MEibWUGdNjFF9ITG9Pck5M84w==} + eslint@9.18.0: + resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: @@ -1537,8 +1661,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -1567,8 +1691,8 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} extend-shallow@2.0.1: @@ -1603,8 +1727,8 @@ packages: fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -1613,12 +1737,23 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fast-uri@3.0.5: + resolution: {integrity: sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==} + + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + figures@2.0.0: resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} engines: {node: '>=4'} @@ -1634,8 +1769,8 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} find-up@4.1.0: @@ -1646,20 +1781,15 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flat-cache@6.1.5: + resolution: {integrity: sha512-QR+2kN38f8nMfiIQ1LHYjuDEmZNZVjxuxY+HufbS3BW0EX01Q5OnH7iduOYRutmgiXb797HAKcXUeXrvRjjgSQ==} - foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} - engines: {node: '>=14'} + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} @@ -1682,10 +1812,6 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1701,19 +1827,23 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} - get-tsconfig@4.7.5: - resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} - get-uri@6.0.3: - resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} + get-uri@6.0.4: + resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} engines: {node: '>= 14'} getpass@0.1.7: @@ -1727,11 +1857,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.3: - resolution: {integrity: sha512-Q38SGlYRpVtDBPSWEylRyctn7uDeTp4NQERTLiCT1FqA9JXPYWqAVmQU6qh4r/zMM5ehxTcbaO8EjhWnvEhmyg==} - engines: {node: '>=18'} - hasBin: true - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -1745,12 +1870,13 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.8.0: - resolution: {integrity: sha512-VZAJ4cewHTExBWDHR6yptdIBlx9YSSZuwojj9Nt5mBRXQzrKakDsVKQ1J63sklLvzAJm0X5+RpO4i3Y2hcOnFw==} + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} engines: {node: '>=18'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -1796,15 +1922,8 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} has-tostringtag@1.0.2: @@ -1819,6 +1938,9 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hookified@1.6.0: + resolution: {integrity: sha512-se7cpwTA+iA/eY548Bu03JJqBiEZAqU2jnyKdj5B5qurtBg64CZGHTgqCv4Yh7NWu6FGI09W61MCq+NoPj9GXA==} + html-encoding-sniffer@1.0.2: resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} @@ -1854,8 +1976,8 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} humanize-duration@3.32.1: @@ -1868,20 +1990,20 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - image-size@1.1.1: - resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + image-size@1.2.0: + resolution: {integrity: sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==} engines: {node: '>=16.x'} hasBin: true image-ssim@0.2.0: resolution: {integrity: sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==} - immutable@4.3.6: - resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} + immutable@5.0.3: + resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==} import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -1902,8 +2024,8 @@ packages: resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==} engines: {node: '>=6.0.0'} - intl-messageformat@10.5.14: - resolution: {integrity: sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==} + intl-messageformat@10.7.11: + resolution: {integrity: sha512-IB2N1tmI24k2EFH3PWjU7ivJsnWyLwOWOva0jnXFa29WzB6fb0JZ5EMQGu+XN5lDtjHYFo0/UooP67zBwUg7rQ==} ip-address@9.0.5: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} @@ -1932,12 +2054,8 @@ packages: is-browser@2.1.0: resolution: {integrity: sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==} - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - - is-core-module@2.14.0: - resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} is-decimal@1.0.4: @@ -1988,10 +2106,6 @@ packages: is-object@1.0.2: resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -2001,16 +2115,16 @@ packages: is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} is-typedarray@1.0.0: @@ -2033,6 +2147,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + iso-639-1@2.1.15: resolution: {integrity: sha512-7c7mBznZu2ktfvyT582E2msM+Udc1EjOyhVRE/0ZsjD9LBtWSm23h3PtiRh2a35XoUsTQQjJXaJzuLjXsOdFDg==} engines: {node: '>=6.0'} @@ -2043,12 +2161,8 @@ packages: isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - jackspeak@3.4.1: - resolution: {integrity: sha512-U23pQPDnmYybVkYjObcuYMk43VRlMLLqLI+RdZy8s8WV8WsxO9SnqSroKaluuvcNOdCAlauKszDwd+umbot5Mg==} - engines: {node: '>=18'} - - jake@10.9.1: - resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==} + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} hasBin: true @@ -2085,9 +2199,9 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-parse-even-better-errors@3.0.2: - resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + json-parse-even-better-errors@4.0.0: + resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==} + engines: {node: ^18.17.0 || >=20.5.0} json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -2104,9 +2218,6 @@ packages: json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - jsprim@1.4.2: resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} engines: {node: '>=0.6.0'} @@ -2121,6 +2232,9 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@5.2.3: + resolution: {integrity: sha512-AGKecUfzrowabUv0bH1RIR5Vf7w+l4S3xtQAypKaUpTdIR1EbrAcTxHCrpo9Q+IWeUlFE2palRtgIQcgm+PQJw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -2149,8 +2263,8 @@ packages: lighthouse-stack-packs@1.12.1: resolution: {integrity: sha512-i4jTmg7tvZQFwNFiwB+nCK6a7ICR68Xcwo+VIVd6Spi71vBNFUlds5HiDrSbClZdkQDON2Bhqv+KKJIo5zkPeA==} - lighthouse@11.4.0: - resolution: {integrity: sha512-NmGBIdLznIBTfla566gpNPdbascVA0uWFG2LyuRQPeMT06ai3QxzDqSpaR5dToDuEQIPkyU0qqxwHj8kst8x+g==} + lighthouse@12.1.0: + resolution: {integrity: sha512-PQLaNcv3tQcybnYux6T8uoS6+RNrNYvVJBbGo0kkbD4XTjesGslOXWeMkUQDK7c28nLfVZi7gYWDUsicTLglKQ==} engines: {node: '>=18.16'} hasBin: true @@ -2171,8 +2285,8 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - liquidjs@10.14.0: - resolution: {integrity: sha512-Zjg35Yo3L/2aNy7QkICha/ulbXRtZS7oRenWyDDfw+J34Xy3fOKWWHxASC9r0gbxN661nrwmG/kOIKHfYcVk4Q==} + liquidjs@10.20.1: + resolution: {integrity: sha512-eZ33jfxjj0It8tkY+I4gbKWfXvMmOvQvvraxVFSLcTjZWCjdWMLBnevk48qw9AQIwIHFp58vZc59vH9Qwdq7mw==} engines: {node: '>=14'} hasBin: true @@ -2208,10 +2322,6 @@ packages: lower-case@1.1.4: resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} - lru-cache@10.4.0: - resolution: {integrity: sha512-bfJaPTuEiTYBu+ulDaeQ0F+uLmlfFkMgXj4cbwfuMSjgObGMzb55FMMbDvbRU0fAHZ4sLGkz2mKwcMg8Dvm8Ww==} - engines: {node: '>=18'} - lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -2222,12 +2332,12 @@ packages: lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} - luxon@3.4.4: - resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} + luxon@3.5.0: + resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} engines: {node: '>=12'} - magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -2247,6 +2357,10 @@ packages: marky@1.2.5: resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + maximatch@0.1.0: resolution: {integrity: sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==} engines: {node: '>=0.10.0'} @@ -2274,8 +2388,8 @@ packages: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} - merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -2288,14 +2402,18 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} @@ -2332,16 +2450,9 @@ packages: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -2349,15 +2460,12 @@ packages: moo@0.5.2: resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} - morphdom@2.7.3: - resolution: {integrity: sha512-rvGK92GxSuPEZLY8D/JH07cG3BxyA+/F0Bxg32OoGAEFFhGWA3OqVpqPZlOgZTCR52clXrmz+z2pYSJ6gOig1w==} + morphdom@2.7.4: + resolution: {integrity: sha512-ATTbWMgGa+FaMU3FhnFYB6WgulCqwf6opOll4CBzmVDTLvPMmUPrEv8CudmLPK0MESa64+6B89fWOxP3+YIlxQ==} ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2379,6 +2487,10 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -2393,6 +2505,9 @@ packages: no-case@2.3.2: resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -2415,13 +2530,13 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-normalize-package-bin@4.0.0: + resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} + engines: {node: ^18.17.0 || >=20.5.0} - npm-run-all2@6.2.2: - resolution: {integrity: sha512-Q+alQAGIW7ZhKcxLt8GcSi3h3ryheD6xnmXahkMRVM5LYmajcUrSITm8h+OPC9RYWMV2GR0Q1ntTUCfxaNoOJw==} - engines: {node: ^14.18.0 || ^16.13.0 || >=18.0.0, npm: '>= 8'} + npm-run-all2@7.0.2: + resolution: {integrity: sha512-7tXR+r9hzRNOPNTvXegM+QzCuMjzUIIq66VDunL6j60O4RrExx32XUhlrS7UK4VcdGw5/Wxzb3kfNcFix9JKDA==} + engines: {node: ^18.17.0 || >=20.5.0, npm: '>= 9'} hasBin: true nth-check@2.1.1: @@ -2437,8 +2552,8 @@ packages: chokidar: optional: true - nwsapi@2.2.10: - resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} + nwsapi@2.2.16: + resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} @@ -2451,8 +2566,8 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} engines: {node: '>= 0.4'} on-finished@2.4.1: @@ -2532,17 +2647,14 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - pac-proxy-agent@7.0.2: - resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==} + pac-proxy-agent@7.1.0: + resolution: {integrity: sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==} engines: {node: '>= 14'} pac-resolver@7.0.1: resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} engines: {node: '>= 14'} - package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} - pako@2.1.0: resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} @@ -2591,15 +2703,11 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - - path-to-regexp@6.2.2: - resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -2611,13 +2719,17 @@ packages: performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} @@ -2661,13 +2773,13 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier-plugin-jinja-template@1.4.1: - resolution: {integrity: sha512-YHDa/f9BpEDIYIPKsnmoKQudWszXBPaVifjR7X+W2n/uAzWLXV/j9FEvua3np7gkzSEOFyapJQrCS4YhhbhbdA==} + prettier-plugin-jinja-template@2.0.0: + resolution: {integrity: sha512-REZDAcZuOUvMDaPS47/GNRLKvbxh9DO9euXhWA7gJGqTLGzHPK2Z841F8I4bxsR7e2lqnHezkQ8GcWaKekKBVQ==} peerDependencies: prettier: ^3.0.0 - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} engines: {node: '>=14'} hasBin: true @@ -2692,8 +2804,8 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-agent@6.3.1: - resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} engines: {node: '>= 14'} proxy-from-env@1.1.0: @@ -2702,15 +2814,11 @@ packages: prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - ps-list@8.1.1: - resolution: {integrity: sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} pug-attrs@3.0.0: resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} @@ -2748,8 +2856,8 @@ packages: pug@3.0.3: resolution: {integrity: sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==} - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} @@ -2759,12 +2867,12 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@21.11.0: - resolution: {integrity: sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==} - engines: {node: '>=16.13.2'} + puppeteer-core@22.15.0: + resolution: {integrity: sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==} + engines: {node: '>=18'} - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} qs@6.5.3: @@ -2791,9 +2899,9 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} - read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read-package-json-fast@4.0.0: + resolution: {integrity: sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==} + engines: {node: ^18.17.0 || >=20.5.0} readable-stream@1.0.34: resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} @@ -2805,6 +2913,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.1.1: + resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} + engines: {node: '>= 14.18.0'} + recursive-copy@2.0.14: resolution: {integrity: sha512-K8WNY8f8naTpfbA+RaXmkaQuD1IeW9EgNEfyGxSqqTQukpVtoOKros9jUqbpEsSw59YOmpd8nCBgtqJZy5nvog==} @@ -2853,8 +2965,9 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true restore-cursor@2.0.0: @@ -2889,8 +3002,8 @@ packages: robots-txt-parse@0.0.4: resolution: {integrity: sha512-B2VQEC5oe9MD/77oILGi98NNAqtY1BlqgrwlYjq/RR5sDfZqpkFj1sG5pCieiSApoTxatJgGW+yWCh0zFfOGMQ==} - rollup@4.18.0: - resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + rollup@4.30.1: + resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2914,8 +3027,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass@1.77.6: - resolution: {integrity: sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==} + sass@1.83.1: + resolution: {integrity: sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==} engines: {node: '>=14.0.0'} hasBin: true @@ -2945,35 +3058,31 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sharp@0.33.4: - resolution: {integrity: sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==} - engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -2983,20 +3092,29 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -3020,16 +3138,16 @@ packages: smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} - socks-proxy-agent@8.0.4: - resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} socks@2.8.3: resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map-support@0.5.21: @@ -3078,8 +3196,8 @@ packages: stream-length@1.0.2: resolution: {integrity: sha512-aI+qKFiwoDV4rsXiS7WRoCt+v2RX1nUj17+KJC5r2gfh5xoSJIfP6Y3Do/HtvesFcTSWthIuJ3l1cvKQY/+nZg==} - streamx@2.18.0: - resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==} + streamx@2.21.1: + resolution: {integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==} string-width@2.1.1: resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} @@ -3089,10 +3207,6 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - string_decoder@0.10.31: resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} @@ -3120,10 +3234,6 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - strip-bom-string@1.0.0: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} @@ -3161,33 +3271,30 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} engines: {node: ^14.18.0 || >=16.0.0} tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar-fs@3.0.4: - resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + tar-fs@3.0.7: + resolution: {integrity: sha512-2sAfoF/zw/2n8goUGnGRZTWTD4INtnScPZvyYBI6BDlJ3wNR5o1dw03EfBvuhG6GBLvC4J+C7j7W+64aZ0ogQA==} tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - terser@5.31.1: - resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} + terser@5.37.0: + resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} engines: {node: '>=10'} hasBin: true - text-decoder@1.1.0: - resolution: {integrity: sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==} + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - third-party-web@0.24.3: - resolution: {integrity: sha512-imE6hXZyaCeGinGFCvpWsv0oelsEaufSG39qYBQhp3urGq4OLOtsuEddf3XgKxmAAczBD/I1Tnp8L3gJ3ksTuQ==} + third-party-web@0.24.5: + resolution: {integrity: sha512-1rUOdMYpNTRajgk1F7CmHD26oA6rTKekBjHay854J6OkPXeNyPcR54rhWDaamlWyi9t2wAVPQESdedBhucmOLA==} through2-sink@1.0.0: resolution: {integrity: sha512-9HvIHIEXZ5YgstQx3vsu4U/QQ/n7X5RHlXf8MsfSEnEzeUFbX9BHBWmlwdQ1b6CzDlUEDwjFnkSIxpJZ6qP+0Q==} @@ -3201,11 +3308,11 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - tldts-core@6.1.31: - resolution: {integrity: sha512-IdTd0OpW2qgG1mbFxoXp14ohLNO6KP+H3htsNb3pk2FF8m21vvIaDlTWmKBR+UnZmXkSFOfZYYeswPAjSoHs+g==} + tldts-core@6.1.71: + resolution: {integrity: sha512-LRbChn2YRpic1KxY+ldL1pGXN/oVvKfCVufwfVzEQdFYNo39uF7AJa/WXdo+gYO7PTvdfkCPCed6Hkvz/kR7jg==} - tldts-icann@6.1.31: - resolution: {integrity: sha512-C4skEg7UQ039td+I2vkNIPqv9h7T4EOocOAaco1Y5elNSJQhdcHlGm9QhqYVtFmPRN5apUrpu3lc2QiAtVV66A==} + tldts-icann@6.1.71: + resolution: {integrity: sha512-hEbB+VrNQM3Nhs+2FFWrCNbYGhFJb9MzfzEjK4qrZUBC2y2v0V99sJofJE99SfI0jac4ZdPBtdU82ges+EQGIw==} tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} @@ -3215,10 +3322,6 @@ packages: resolution: {integrity: sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==} engines: {node: '>=6'} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3247,8 +3350,8 @@ packages: tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -3280,25 +3383,21 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - uglify-js@3.18.0: - resolution: {integrity: sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -3392,8 +3491,13 @@ packages: engines: {node: '>= 8'} hasBin: true - wicg-inert@3.1.2: - resolution: {integrity: sha512-Ba9tGNYxXwaqKEi9sJJvPMKuo063umUPsHN0JJsjrs2j8KDSzkWLMZGZ+MH1Jf1Fq4OWZ5HsESJID6nRza2ang==} + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + wicg-inert@3.1.3: + resolution: {integrity: sha512-5L0PKK7iP+0Q/jv2ccgmkz/pfXbumZtlEyWS/xnX+L+Og3f7WjL4+iEs18k4IuldOX3PgGpza3qGndL9xUBjCQ==} win-release@1.1.1: resolution: {integrity: sha512-iCRnKVvGxOQdsKhcQId2PXV1vV3J/sDPXKA4Oe9+Eti2nb2ESEsYHRYls/UjoUW3bIc5ZDO8dTH50A/5iVN+bw==} @@ -3418,10 +3522,6 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -3451,18 +3551,6 @@ packages: utf-8-validate: optional: true - ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -3502,8 +3590,8 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.4.5: - resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} engines: {node: '>= 14'} hasBin: true @@ -3536,6 +3624,9 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + snapshots: '@11ty/dependency-tree@2.0.1': {} @@ -3544,12 +3635,12 @@ snapshots: dependencies: '@11ty/eleventy-utils': 1.0.3 chokidar: 3.6.0 - debug: 4.3.5 + debug: 4.4.0 dev-ip: 1.0.1 - finalhandler: 1.2.0 + finalhandler: 1.3.1 mime: 3.0.0 minimist: 1.2.8 - morphdom: 2.7.3 + morphdom: 2.7.4 please-upgrade-node: 3.2.0 ssri: 8.0.1 ws: 8.18.0 @@ -3558,27 +3649,27 @@ snapshots: - supports-color - utf-8-validate - '@11ty/eleventy-fetch@4.0.1': + '@11ty/eleventy-fetch@5.0.2': dependencies: - debug: 4.3.5 - flat-cache: 3.2.0 - node-fetch: 2.7.0 + '@rgrove/parse-xml': 4.2.0 + debug: 4.4.0 + flat-cache: 6.1.5 + graceful-fs: 4.2.11 p-queue: 6.6.2 transitivePeerDependencies: - - encoding - supports-color - '@11ty/eleventy-img@4.0.2': + '@11ty/eleventy-img@6.0.0': dependencies: - '@11ty/eleventy-fetch': 4.0.1 + '@11ty/eleventy-fetch': 5.0.2 + '@11ty/eleventy-utils': 2.0.0 brotli-size: 4.0.0 - debug: 4.3.5 - entities: 4.5.0 - image-size: 1.1.1 + debug: 4.4.0 + entities: 6.0.0 + image-size: 1.2.0 p-queue: 6.6.2 - sharp: 0.33.4 + sharp: 0.33.5 transitivePeerDependencies: - - encoding - supports-color '@11ty/eleventy-navigation@0.3.5': @@ -3587,7 +3678,7 @@ snapshots: '@11ty/eleventy-plugin-rss@1.2.0': dependencies: - debug: 4.3.5 + debug: 4.4.0 posthtml: 0.16.6 posthtml-urls: 1.0.0 transitivePeerDependencies: @@ -3601,6 +3692,8 @@ snapshots: dependencies: normalize-path: 3.0.0 + '@11ty/eleventy-utils@2.0.0': {} + '@11ty/eleventy@2.0.1': dependencies: '@11ty/dependency-tree': 2.0.1 @@ -3611,11 +3704,11 @@ snapshots: '@sindresorhus/slugify': 1.1.2 bcp-47-normalize: 1.1.1 chokidar: 3.6.0 - cross-spawn: 7.0.3 - debug: 4.3.5 + cross-spawn: 7.0.6 + debug: 4.4.0 dependency-graph: 0.11.0 ejs: 3.1.10 - fast-glob: 3.3.2 + fast-glob: 3.3.3 graceful-fs: 4.2.11 gray-matter: 4.0.3 hamljs: 0.6.2 @@ -3623,23 +3716,23 @@ snapshots: is-glob: 4.0.3 iso-639-1: 2.1.15 kleur: 4.1.5 - liquidjs: 10.14.0 - luxon: 3.4.4 + liquidjs: 10.20.1 + luxon: 3.5.0 markdown-it: 13.0.2 - micromatch: 4.0.7 + micromatch: 4.0.8 minimist: 1.2.8 moo: 0.5.2 multimatch: 5.0.0 mustache: 4.2.0 normalize-path: 3.0.0 nunjucks: 3.2.4(chokidar@3.6.0) - path-to-regexp: 6.2.2 + path-to-regexp: 6.3.0 please-upgrade-node: 3.2.0 posthtml: 0.16.6 posthtml-urls: 1.0.0 pug: 3.0.3 recursive-copy: 2.0.14 - semver: 7.6.2 + semver: 7.6.3 slugify: 1.6.6 transitivePeerDependencies: - bufferutil @@ -3648,59 +3741,56 @@ snapshots: '@11ty/lodash-custom@4.17.21': {} - '@babel/code-frame@7.24.7': + '@babel/code-frame@7.26.2': dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 - - '@babel/helper-string-parser@7.24.7': {} + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 - '@babel/helper-validator-identifier@7.24.7': {} + '@babel/helper-string-parser@7.25.9': {} - '@babel/highlight@7.24.7': - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 + '@babel/helper-validator-identifier@7.25.9': {} - '@babel/parser@7.24.7': + '@babel/parser@7.26.5': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.26.5 - '@babel/types@7.24.7': + '@babel/types@7.26.5': dependencies: - '@babel/helper-string-parser': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 - '@emnapi/runtime@1.2.0': + '@emnapi/runtime@1.3.1': dependencies: - tslib: 2.6.3 + tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.6.0)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0)': dependencies: - eslint: 9.6.0 + eslint: 9.18.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.0': {} + '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.17.0': + '@eslint/config-array@0.19.1': dependencies: - '@eslint/object-schema': 2.1.4 - debug: 4.3.5 + '@eslint/object-schema': 2.1.5 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/eslintrc@3.1.0': + '@eslint/core@0.10.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 - debug: 4.3.5 - espree: 10.1.0 + debug: 4.4.0 + espree: 10.3.0 globals: 14.0.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -3708,128 +3798,135 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.6.0': {} + '@eslint/js@9.18.0': {} + + '@eslint/object-schema@2.1.5': {} + + '@eslint/plugin-kit@0.2.5': + dependencies: + '@eslint/core': 0.10.0 + levn: 0.4.1 - '@eslint/object-schema@2.1.4': {} + '@formatjs/ecma402-abstract@2.3.2': + dependencies: + '@formatjs/fast-memoize': 2.2.6 + '@formatjs/intl-localematcher': 0.5.10 + decimal.js: 10.4.3 + tslib: 2.8.1 - '@formatjs/ecma402-abstract@2.0.0': + '@formatjs/fast-memoize@2.2.6': dependencies: - '@formatjs/intl-localematcher': 0.5.4 - tslib: 2.6.3 + tslib: 2.8.1 - '@formatjs/fast-memoize@2.2.0': + '@formatjs/icu-messageformat-parser@2.9.8': dependencies: - tslib: 2.6.3 + '@formatjs/ecma402-abstract': 2.3.2 + '@formatjs/icu-skeleton-parser': 1.8.12 + tslib: 2.8.1 - '@formatjs/icu-messageformat-parser@2.7.8': + '@formatjs/icu-skeleton-parser@1.8.12': dependencies: - '@formatjs/ecma402-abstract': 2.0.0 - '@formatjs/icu-skeleton-parser': 1.8.2 - tslib: 2.6.3 + '@formatjs/ecma402-abstract': 2.3.2 + tslib: 2.8.1 - '@formatjs/icu-skeleton-parser@1.8.2': + '@formatjs/intl-localematcher@0.5.10': dependencies: - '@formatjs/ecma402-abstract': 2.0.0 - tslib: 2.6.3 + tslib: 2.8.1 + + '@humanfs/core@0.19.1': {} - '@formatjs/intl-localematcher@0.5.4': + '@humanfs/node@0.16.6': dependencies: - tslib: 2.6.3 + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.0': {} + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.1': {} '@iarna/toml@2.2.5': {} - '@img/sharp-darwin-arm64@0.33.4': + '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.2 + '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true - '@img/sharp-darwin-x64@0.33.4': + '@img/sharp-darwin-x64@0.33.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.2 + '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.0.2': + '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true - '@img/sharp-libvips-darwin-x64@1.0.2': + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm64@1.0.2': + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm@1.0.2': + '@img/sharp-libvips-linux-arm@1.0.5': optional: true - '@img/sharp-libvips-linux-s390x@1.0.2': + '@img/sharp-libvips-linux-s390x@1.0.4': optional: true - '@img/sharp-libvips-linux-x64@1.0.2': + '@img/sharp-libvips-linux-x64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.2': + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.2': + '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true - '@img/sharp-linux-arm64@0.33.4': + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.2 + '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true - '@img/sharp-linux-arm@0.33.4': + '@img/sharp-linux-arm@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.2 + '@img/sharp-libvips-linux-arm': 1.0.5 optional: true - '@img/sharp-linux-s390x@0.33.4': + '@img/sharp-linux-s390x@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.2 + '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true - '@img/sharp-linux-x64@0.33.4': + '@img/sharp-linux-x64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.2 + '@img/sharp-libvips-linux-x64': 1.0.4 optional: true - '@img/sharp-linuxmusl-arm64@0.33.4': + '@img/sharp-linuxmusl-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true - '@img/sharp-linuxmusl-x64@0.33.4': + '@img/sharp-linuxmusl-x64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true - '@img/sharp-wasm32@0.33.4': + '@img/sharp-wasm32@0.33.5': dependencies: - '@emnapi/runtime': 1.2.0 + '@emnapi/runtime': 1.3.1 optional: true - '@img/sharp-win32-ia32@0.33.4': + '@img/sharp-win32-ia32@0.33.5': optional: true - '@img/sharp-win32-x64@0.33.4': + '@img/sharp-win32-x64@0.33.5': optional: true - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} @@ -3838,29 +3935,33 @@ snapshots: '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@keyv/serialize@1.0.2': + dependencies: + buffer: 6.0.3 - '@lhci/cli@0.13.0': + '@lhci/cli@0.14.0': dependencies: - '@lhci/utils': 0.13.0 + '@lhci/utils': 0.14.0 chrome-launcher: 0.13.4 - compression: 1.7.4 - debug: 4.3.5 - express: 4.19.2 - https-proxy-agent: 5.0.1 + compression: 1.7.5 + debug: 4.4.0 + express: 4.21.2 inquirer: 6.5.2 isomorphic-fetch: 3.0.0 - lighthouse: 11.4.0 + lighthouse: 12.1.0 lighthouse-logger: 1.2.0 open: 7.4.2 + proxy-agent: 6.5.0 tmp: 0.1.0 uuid: 8.3.2 yargs: 15.4.1 @@ -3871,12 +3972,12 @@ snapshots: - supports-color - utf-8-validate - '@lhci/utils@0.13.0': + '@lhci/utils@0.14.0': dependencies: - debug: 4.3.5 + debug: 4.4.0 isomorphic-fetch: 3.0.0 js-yaml: 3.14.1 - lighthouse: 11.4.0 + lighthouse: 12.1.0 tree-kill: 1.2.2 transitivePeerDependencies: - bufferutil @@ -3894,52 +3995,115 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.18.0 + + '@parcel/watcher-android-arm64@2.5.0': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.0': + optional: true + + '@parcel/watcher-darwin-x64@2.5.0': + optional: true - '@percy/cli-app@1.28.8': + '@parcel/watcher-freebsd-x64@2.5.0': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.0': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.0': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.0': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.0': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.0': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.0': + optional: true + + '@parcel/watcher-win32-arm64@2.5.0': + optional: true + + '@parcel/watcher-win32-ia32@2.5.0': + optional: true + + '@parcel/watcher-win32-x64@2.5.0': + optional: true + + '@parcel/watcher@2.5.0': dependencies: - '@percy/cli-command': 1.28.8 - '@percy/cli-exec': 1.28.8 + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.0 + '@parcel/watcher-darwin-arm64': 2.5.0 + '@parcel/watcher-darwin-x64': 2.5.0 + '@parcel/watcher-freebsd-x64': 2.5.0 + '@parcel/watcher-linux-arm-glibc': 2.5.0 + '@parcel/watcher-linux-arm-musl': 2.5.0 + '@parcel/watcher-linux-arm64-glibc': 2.5.0 + '@parcel/watcher-linux-arm64-musl': 2.5.0 + '@parcel/watcher-linux-x64-glibc': 2.5.0 + '@parcel/watcher-linux-x64-musl': 2.5.0 + '@parcel/watcher-win32-arm64': 2.5.0 + '@parcel/watcher-win32-ia32': 2.5.0 + '@parcel/watcher-win32-x64': 2.5.0 + optional: true + + '@paulirish/trace_engine@0.0.23': {} + + '@percy/cli-app@1.30.6': + dependencies: + '@percy/cli-command': 1.30.6 + '@percy/cli-exec': 1.30.6 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-build@1.28.8': + '@percy/cli-build@1.30.6': dependencies: - '@percy/cli-command': 1.28.8 + '@percy/cli-command': 1.30.6 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-command@1.28.8': + '@percy/cli-command@1.30.6': dependencies: - '@percy/config': 1.28.8 - '@percy/core': 1.28.8 - '@percy/logger': 1.28.8 + '@percy/config': 1.30.6 + '@percy/core': 1.30.6 + '@percy/logger': 1.30.6 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-config@1.28.8': + '@percy/cli-config@1.30.6': dependencies: - '@percy/cli-command': 1.28.8 + '@percy/cli-command': 1.30.6 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-exec@1.28.8': + '@percy/cli-exec@1.30.6': dependencies: - '@percy/cli-command': 1.28.8 - '@percy/logger': 1.28.8 - cross-spawn: 7.0.3 + '@percy/cli-command': 1.30.6 + '@percy/logger': 1.30.6 + cross-spawn: 7.0.6 which: 2.0.2 transitivePeerDependencies: - bufferutil @@ -3947,112 +4111,110 @@ snapshots: - typescript - utf-8-validate - '@percy/cli-snapshot@1.28.8': + '@percy/cli-snapshot@1.30.6': dependencies: - '@percy/cli-command': 1.28.8 - yaml: 2.4.5 + '@percy/cli-command': 1.30.6 + yaml: 2.7.0 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-upload@1.28.8': + '@percy/cli-upload@1.30.6': dependencies: - '@percy/cli-command': 1.28.8 - fast-glob: 3.3.2 - image-size: 1.1.1 + '@percy/cli-command': 1.30.6 + fast-glob: 3.3.3 + image-size: 1.2.0 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli@1.28.8': - dependencies: - '@percy/cli-app': 1.28.8 - '@percy/cli-build': 1.28.8 - '@percy/cli-command': 1.28.8 - '@percy/cli-config': 1.28.8 - '@percy/cli-exec': 1.28.8 - '@percy/cli-snapshot': 1.28.8 - '@percy/cli-upload': 1.28.8 - '@percy/client': 1.28.8 - '@percy/logger': 1.28.8 + '@percy/cli@1.30.6': + dependencies: + '@percy/cli-app': 1.30.6 + '@percy/cli-build': 1.30.6 + '@percy/cli-command': 1.30.6 + '@percy/cli-config': 1.30.6 + '@percy/cli-exec': 1.30.6 + '@percy/cli-snapshot': 1.30.6 + '@percy/cli-upload': 1.30.6 + '@percy/client': 1.30.6 + '@percy/logger': 1.30.6 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/client@1.28.8': + '@percy/client@1.30.6': dependencies: - '@percy/env': 1.28.8 - '@percy/logger': 1.28.8 + '@percy/env': 1.30.6 + '@percy/logger': 1.30.6 pako: 2.1.0 - '@percy/config@1.28.8': + '@percy/config@1.30.6': dependencies: - '@percy/logger': 1.28.8 - ajv: 8.16.0 + '@percy/logger': 1.30.6 + ajv: 8.17.1 cosmiconfig: 8.3.6 - yaml: 2.4.5 + yaml: 2.7.0 transitivePeerDependencies: - typescript - '@percy/core@1.28.8': + '@percy/core@1.30.6': dependencies: - '@percy/client': 1.28.8 - '@percy/config': 1.28.8 - '@percy/dom': 1.28.8 - '@percy/logger': 1.28.8 - '@percy/webdriver-utils': 1.28.8 + '@percy/client': 1.30.6 + '@percy/config': 1.30.6 + '@percy/dom': 1.30.6 + '@percy/logger': 1.30.6 + '@percy/webdriver-utils': 1.30.6 content-disposition: 0.5.4 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 extract-zip: 2.0.1 - fast-glob: 3.3.2 - micromatch: 4.0.7 + fast-glob: 3.3.3 + micromatch: 4.0.8 mime-types: 2.1.35 pako: 2.1.0 - path-to-regexp: 6.2.2 + path-to-regexp: 6.3.0 rimraf: 3.0.2 ws: 8.18.0 - yaml: 2.4.5 + yaml: 2.7.0 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/dom@1.28.8': {} + '@percy/dom@1.30.6': {} - '@percy/env@1.28.8': + '@percy/env@1.30.6': dependencies: - '@percy/logger': 1.28.8 + '@percy/logger': 1.30.6 - '@percy/logger@1.28.8': {} + '@percy/logger@1.30.6': {} - '@percy/sdk-utils@1.28.8': {} + '@percy/sdk-utils@1.30.6': {} - '@percy/webdriver-utils@1.28.8': + '@percy/webdriver-utils@1.30.6': dependencies: - '@percy/config': 1.28.8 - '@percy/sdk-utils': 1.28.8 + '@percy/config': 1.30.6 + '@percy/sdk-utils': 1.30.6 transitivePeerDependencies: - typescript - '@pkgjs/parseargs@0.11.0': - optional: true - '@pkgr/core@0.1.1': {} - '@puppeteer/browsers@1.9.1': + '@puppeteer/browsers@2.3.0': dependencies: - debug: 4.3.4 + debug: 4.4.0 extract-zip: 2.0.1 progress: 2.0.3 - proxy-agent: 6.3.1 - tar-fs: 3.0.4 + proxy-agent: 6.5.0 + semver: 7.6.3 + tar-fs: 3.0.7 unbzip2-stream: 1.4.3 yargs: 17.7.2 transitivePeerDependencies: @@ -4063,127 +4225,128 @@ snapshots: array-flat-polyfill: 1.0.1 sitemap: 6.4.0 - '@rollup/plugin-commonjs@26.0.1(rollup@4.18.0)': + '@rgrove/parse-xml@4.2.0': {} + + '@rollup/plugin-commonjs@28.0.2(rollup@4.30.1)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.4(rollup@4.30.1) commondir: 1.0.1 estree-walker: 2.0.2 - glob: 10.4.3 + fdir: 6.4.2(picomatch@4.0.2) is-reference: 1.2.1 - magic-string: 0.30.10 + magic-string: 0.30.17 + picomatch: 4.0.2 optionalDependencies: - rollup: 4.18.0 + rollup: 4.30.1 - '@rollup/plugin-node-resolve@15.2.3(rollup@4.18.0)': + '@rollup/plugin-node-resolve@16.0.0(rollup@4.30.1)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.4(rollup@4.30.1) '@types/resolve': 1.20.2 deepmerge: 4.3.1 - is-builtin-module: 3.2.1 is-module: 1.0.0 - resolve: 1.22.8 + resolve: 1.22.10 optionalDependencies: - rollup: 4.18.0 + rollup: 4.30.1 - '@rollup/plugin-terser@0.4.4(rollup@4.18.0)': + '@rollup/plugin-terser@0.4.4(rollup@4.30.1)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 - terser: 5.31.1 + terser: 5.37.0 optionalDependencies: - rollup: 4.18.0 + rollup: 4.30.1 - '@rollup/pluginutils@5.1.0(rollup@4.18.0)': + '@rollup/pluginutils@5.1.4(rollup@4.30.1)': dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-walker: 2.0.2 - picomatch: 2.3.1 + picomatch: 4.0.2 optionalDependencies: - rollup: 4.18.0 + rollup: 4.30.1 + + '@rollup/rollup-android-arm-eabi@4.30.1': + optional: true + + '@rollup/rollup-android-arm64@4.30.1': + optional: true - '@rollup/rollup-android-arm-eabi@4.18.0': + '@rollup/rollup-darwin-arm64@4.30.1': optional: true - '@rollup/rollup-android-arm64@4.18.0': + '@rollup/rollup-darwin-x64@4.30.1': optional: true - '@rollup/rollup-darwin-arm64@4.18.0': + '@rollup/rollup-freebsd-arm64@4.30.1': optional: true - '@rollup/rollup-darwin-x64@4.18.0': + '@rollup/rollup-freebsd-x64@4.30.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.18.0': + '@rollup/rollup-linux-arm-musleabihf@4.30.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.18.0': + '@rollup/rollup-linux-arm64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.18.0': + '@rollup/rollup-linux-arm64-musl@4.30.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.18.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.18.0': + '@rollup/rollup-linux-riscv64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.18.0': + '@rollup/rollup-linux-s390x-gnu@4.30.1': optional: true - '@rollup/rollup-linux-x64-musl@4.18.0': + '@rollup/rollup-linux-x64-gnu@4.30.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.18.0': + '@rollup/rollup-linux-x64-musl@4.30.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.18.0': + '@rollup/rollup-win32-arm64-msvc@4.30.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.18.0': + '@rollup/rollup-win32-ia32-msvc@4.30.1': optional: true - '@sentry-internal/browser-utils@8.15.0': + '@rollup/rollup-win32-x64-msvc@4.30.1': + optional: true + + '@sentry-internal/browser-utils@8.48.0': dependencies: - '@sentry/core': 8.15.0 - '@sentry/types': 8.15.0 - '@sentry/utils': 8.15.0 + '@sentry/core': 8.48.0 - '@sentry-internal/feedback@8.15.0': + '@sentry-internal/feedback@8.48.0': dependencies: - '@sentry/core': 8.15.0 - '@sentry/types': 8.15.0 - '@sentry/utils': 8.15.0 + '@sentry/core': 8.48.0 - '@sentry-internal/replay-canvas@8.15.0': + '@sentry-internal/replay-canvas@8.48.0': dependencies: - '@sentry-internal/replay': 8.15.0 - '@sentry/core': 8.15.0 - '@sentry/types': 8.15.0 - '@sentry/utils': 8.15.0 + '@sentry-internal/replay': 8.48.0 + '@sentry/core': 8.48.0 - '@sentry-internal/replay@8.15.0': + '@sentry-internal/replay@8.48.0': dependencies: - '@sentry-internal/browser-utils': 8.15.0 - '@sentry/core': 8.15.0 - '@sentry/types': 8.15.0 - '@sentry/utils': 8.15.0 + '@sentry-internal/browser-utils': 8.48.0 + '@sentry/core': 8.48.0 - '@sentry/browser@8.15.0': + '@sentry/browser@8.48.0': dependencies: - '@sentry-internal/browser-utils': 8.15.0 - '@sentry-internal/feedback': 8.15.0 - '@sentry-internal/replay': 8.15.0 - '@sentry-internal/replay-canvas': 8.15.0 - '@sentry/core': 8.15.0 - '@sentry/types': 8.15.0 - '@sentry/utils': 8.15.0 + '@sentry-internal/browser-utils': 8.48.0 + '@sentry-internal/feedback': 8.48.0 + '@sentry-internal/replay': 8.48.0 + '@sentry-internal/replay-canvas': 8.48.0 + '@sentry/core': 8.48.0 '@sentry/core@6.19.7': dependencies: @@ -4193,10 +4356,7 @@ snapshots: '@sentry/utils': 6.19.7 tslib: 1.14.1 - '@sentry/core@8.15.0': - dependencies: - '@sentry/types': 8.15.0 - '@sentry/utils': 8.15.0 + '@sentry/core@8.48.0': {} '@sentry/hub@6.19.7': dependencies: @@ -4225,17 +4385,11 @@ snapshots: '@sentry/types@6.19.7': {} - '@sentry/types@8.15.0': {} - '@sentry/utils@6.19.7': dependencies: '@sentry/types': 6.19.7 tslib: 1.14.1 - '@sentry/utils@8.15.0': - dependencies: - '@sentry/types': 8.15.0 - '@sindresorhus/slugify@1.1.2': dependencies: '@sindresorhus/transliterate': 0.1.2 @@ -4259,7 +4413,7 @@ snapshots: escodegen: 1.14.3 html-encoding-sniffer: 1.0.2 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.10 + nwsapi: 2.2.16 parse5: 5.1.0 pn: 1.1.0 request: 2.88.2 @@ -4283,15 +4437,17 @@ snapshots: '@trysound/sax@0.2.0': {} - '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} + + '@types/json-schema@7.0.15': {} '@types/minimatch@3.0.5': {} '@types/node@14.18.63': {} - '@types/node@20.14.10': + '@types/node@22.10.5': dependencies: - undici-types: 5.26.5 + undici-types: 6.20.0 '@types/resolve@1.20.2': {} @@ -4301,7 +4457,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.14.10 + '@types/node': 22.10.5 optional: true a-sync-waterfall@1.0.1: {} @@ -4320,9 +4476,9 @@ snapshots: acorn: 6.4.2 acorn-walk: 6.2.0 - acorn-jsx@5.3.2(acorn@8.12.1): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.12.1 + acorn: 8.14.0 acorn-walk@6.2.0: {} @@ -4330,19 +4486,15 @@ snapshots: acorn@7.4.1: {} - acorn@8.12.1: {} + acorn@8.14.0: {} agent-base@6.0.2: dependencies: - debug: 4.3.5 + debug: 4.4.0 transitivePeerDependencies: - supports-color - agent-base@7.1.1: - dependencies: - debug: 4.3.5 - transitivePeerDependencies: - - supports-color + agent-base@7.1.3: {} ajv@6.12.6: dependencies: @@ -4351,12 +4503,12 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.16.0: + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.0.5 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 ansi-colors@4.1.3: {} @@ -4372,8 +4524,6 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} - ansi-styles@1.1.0: {} ansi-styles@2.2.1: {} @@ -4431,35 +4581,55 @@ snapshots: dependencies: safer-buffer: 2.1.2 - assert-never@1.3.0: {} + assert-never@1.4.0: {} assert-plus@1.0.0: {} ast-types@0.13.4: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 async-limiter@1.0.1: {} - async@3.2.5: {} + async@3.2.6: {} asynckit@0.4.0: {} aws-sign2@0.7.0: {} - aws4@1.13.0: {} + aws4@1.13.2: {} - axe-core@4.9.1: {} + axe-core@4.10.2: {} - b4a@1.6.6: {} + b4a@1.6.7: {} babel-walk@3.0.0-canary-5: dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.26.5 balanced-match@1.0.2: {} - bare-events@2.4.2: + bare-events@2.5.4: + optional: true + + bare-fs@2.3.5: + dependencies: + bare-events: 2.5.4 + bare-path: 2.1.3 + bare-stream: 2.6.1 + optional: true + + bare-os@2.4.4: + optional: true + + bare-path@2.1.3: + dependencies: + bare-os: 2.4.4 + optional: true + + bare-stream@2.6.1: + dependencies: + streamx: 2.21.1 optional: true base64-js@1.5.1: {} @@ -4506,7 +4676,7 @@ snapshots: bluebird@2.11.0: {} - body-parser@1.20.2: + body-parser@1.20.3: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -4516,7 +4686,7 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.11.0 + qs: 6.13.0 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 @@ -4551,7 +4721,7 @@ snapshots: http-equiv-refresh: 1.0.0 humanize-duration: 3.32.1 is-stream: 1.1.0 - is-string: 1.0.7 + is-string: 1.1.1 limited-request-queue: 2.0.0 link-types: 1.1.0 maybe-callback: 2.1.0 @@ -4580,19 +4750,27 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - builtin-modules@3.3.0: {} - - bytes@3.0.0: {} + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 bytes@3.1.2: {} - call-bind@1.0.7: + cacheable@1.8.7: + dependencies: + hookified: 1.6.0 + keyv: 5.2.3 + + call-bind-apply-helpers@1.0.1: dependencies: - es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 caller-path@0.1.0: dependencies: @@ -4646,7 +4824,7 @@ snapshots: character-parser@2.2.0: dependencies: - is-regex: 1.1.4 + is-regex: 1.2.1 chardet@0.7.0: {} @@ -4662,9 +4840,13 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.1 + chrome-launcher@0.13.4: dependencies: - '@types/node': 20.14.10 + '@types/node': 22.10.5 escape-string-regexp: 1.0.5 is-wsl: 2.2.0 lighthouse-logger: 1.2.0 @@ -4675,18 +4857,19 @@ snapshots: chrome-launcher@1.1.2: dependencies: - '@types/node': 20.14.10 + '@types/node': 22.10.5 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 2.0.1 transitivePeerDependencies: - supports-color - chromium-bidi@0.5.8(devtools-protocol@0.0.1232444): + chromium-bidi@0.6.3(devtools-protocol@0.0.1312386): dependencies: - devtools-protocol: 0.0.1232444 + devtools-protocol: 0.0.1312386 mitt: 3.0.1 urlpattern-polyfill: 10.0.0 + zod: 3.23.8 clean-css@4.2.4: dependencies: @@ -4764,16 +4947,16 @@ snapshots: compressible@2.0.18: dependencies: - mime-db: 1.52.0 + mime-db: 1.53.0 - compression@1.7.4: + compression@1.7.5: dependencies: - accepts: 1.3.8 - bytes: 3.0.0 + bytes: 3.1.2 compressible: 2.0.18 debug: 2.6.9 + negotiator: 0.6.4 on-headers: 1.0.2 - safe-buffer: 5.1.2 + safe-buffer: 5.2.1 vary: 1.1.2 transitivePeerDependencies: - supports-color @@ -4800,8 +4983,8 @@ snapshots: constantinople@4.0.1: dependencies: - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 content-disposition@0.5.4: dependencies: @@ -4813,7 +4996,7 @@ snapshots: cookie@0.4.2: {} - cookie@0.6.0: {} + cookie@0.7.1: {} core-util-is@1.0.2: {} @@ -4828,15 +5011,9 @@ snapshots: cross-env@7.0.3: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 - cross-fetch@4.0.0: - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -4851,18 +5028,18 @@ snapshots: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 nth-check: 2.1.1 css-tree@2.2.1: dependencies: mdn-data: 2.0.28 - source-map-js: 1.2.0 + source-map-js: 1.2.1 css-tree@2.3.1: dependencies: mdn-data: 2.0.30 - source-map-js: 1.2.0 + source-map-js: 1.2.1 css-what@6.1.0: {} @@ -4888,22 +5065,20 @@ snapshots: whatwg-mimetype: 2.3.0 whatwg-url: 7.1.0 - dayjs@1.11.11: {} + dayjs@1.11.13: {} debug@2.6.9: dependencies: ms: 2.0.0 - debug@4.3.4: - dependencies: - ms: 2.1.2 - - debug@4.3.5: + debug@4.4.0: dependencies: - ms: 2.1.2 + ms: 2.1.3 decamelize@1.2.0: {} + decimal.js@10.4.3: {} + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -4912,12 +5087,6 @@ snapshots: dependencies: os-name: 1.0.3 - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - define-lazy-prop@2.0.0: {} degenerator@5.0.1: @@ -4934,15 +5103,16 @@ snapshots: destroy@1.2.0: {} + detect-libc@1.0.3: + optional: true + detect-libc@2.0.3: {} dev-ip@1.0.1: {} dev-null@0.1.1: {} - devtools-protocol@0.0.1211954: {} - - devtools-protocol@0.0.1232444: {} + devtools-protocol@0.0.1312386: {} doctypes@1.1.0: {} @@ -4978,7 +5148,7 @@ snapshots: domelementtype: 2.3.0 domhandler: 4.3.1 - domutils@3.1.0: + domutils@3.2.2: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -4988,12 +5158,16 @@ snapshots: dependencies: is-obj: 2.0.0 + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + duplexer@0.1.1: {} duplexer@0.1.2: {} - eastasianwidth@0.2.0: {} - ecc-jsbn@0.1.2: dependencies: jsbn: 0.1.1 @@ -5003,19 +5177,19 @@ snapshots: ejs@3.1.10: dependencies: - jake: 10.9.1 + jake: 10.9.2 emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} - encodeurl@1.0.2: {} + encodeurl@2.0.0: {} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - enhanced-resolve@5.17.0: + enhanced-resolve@5.18.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -5031,6 +5205,8 @@ snapshots: entities@4.5.0: {} + entities@6.0.0: {} + eol@0.2.0: {} errno@0.1.8: @@ -5043,13 +5219,15 @@ snapshots: errors@0.2.0: {} - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} es-errors@1.3.0: {} - escalade@3.1.2: {} + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -5076,100 +5254,100 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-compat-utils@0.5.1(eslint@9.6.0): + eslint-compat-utils@0.5.1(eslint@9.18.0): dependencies: - eslint: 9.6.0 - semver: 7.6.2 + eslint: 9.18.0 + semver: 7.6.3 - eslint-config-prettier@9.1.0(eslint@9.6.0): + eslint-config-prettier@10.0.1(eslint@9.18.0): dependencies: - eslint: 9.6.0 + eslint: 9.18.0 - eslint-plugin-es-x@7.8.0(eslint@9.6.0): + eslint-plugin-es-x@7.8.0(eslint@9.18.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - '@eslint-community/regexpp': 4.11.0 - eslint: 9.6.0 - eslint-compat-utils: 0.5.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0) + '@eslint-community/regexpp': 4.12.1 + eslint: 9.18.0 + eslint-compat-utils: 0.5.1(eslint@9.18.0) - eslint-plugin-n@17.9.0(eslint@9.6.0): + eslint-plugin-n@17.15.1(eslint@9.18.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - enhanced-resolve: 5.17.0 - eslint: 9.6.0 - eslint-plugin-es-x: 7.8.0(eslint@9.6.0) - get-tsconfig: 4.7.5 - globals: 15.8.0 - ignore: 5.3.1 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0) + enhanced-resolve: 5.18.0 + eslint: 9.18.0 + eslint-plugin-es-x: 7.8.0(eslint@9.18.0) + get-tsconfig: 4.8.1 + globals: 15.14.0 + ignore: 5.3.2 minimatch: 9.0.5 - semver: 7.6.2 + semver: 7.6.3 - eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint@9.6.0)(prettier@3.2.5): + eslint-plugin-prettier@5.2.1(eslint-config-prettier@10.0.1(eslint@9.18.0))(eslint@9.18.0)(prettier@3.4.2): dependencies: - eslint: 9.6.0 - prettier: 3.2.5 + eslint: 9.18.0 + prettier: 3.4.2 prettier-linter-helpers: 1.0.0 - synckit: 0.8.8 + synckit: 0.9.2 optionalDependencies: - eslint-config-prettier: 9.1.0(eslint@9.6.0) + eslint-config-prettier: 10.0.1(eslint@9.18.0) - eslint-scope@8.0.1: + eslint-scope@8.2.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.0.0: {} + eslint-visitor-keys@4.2.0: {} - eslint@9.6.0: + eslint@9.18.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - '@eslint-community/regexpp': 4.11.0 - '@eslint/config-array': 0.17.0 - '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.6.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.1 + '@eslint/core': 0.10.0 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.18.0 + '@eslint/plugin-kit': 0.2.5 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.0 - '@nodelib/fs.walk': 1.2.8 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.5 + cross-spawn: 7.0.6 + debug: 4.4.0 escape-string-regexp: 4.0.0 - eslint-scope: 8.0.1 - eslint-visitor-keys: 4.0.0 - espree: 10.1.0 - esquery: 1.5.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 transitivePeerDependencies: - supports-color - espree@10.1.0: + espree@10.3.0: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 4.0.0 + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 esprima@4.0.1: {} - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -5189,34 +5367,34 @@ snapshots: eventemitter3@4.0.7: {} - express@4.19.2: + express@4.21.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.2 + body-parser: 1.20.3 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.6.0 + cookie: 0.7.1 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 + finalhandler: 1.3.1 fresh: 0.5.2 http-errors: 2.0.0 - merge-descriptors: 1.0.1 + merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.7 + path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.11.0 + qs: 6.13.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: 0.19.0 + serve-static: 1.16.2 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -5241,7 +5419,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.5 + debug: 4.4.0 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -5257,19 +5435,21 @@ snapshots: fast-fifo@1.3.2: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fastq@1.17.1: + fast-uri@3.0.5: {} + + fastq@1.18.0: dependencies: reusify: 1.0.4 @@ -5277,6 +5457,10 @@ snapshots: dependencies: pend: 1.2.0 + fdir@6.4.2(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + figures@2.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -5293,10 +5477,10 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.2.0: + finalhandler@1.3.1: dependencies: debug: 2.6.9 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 @@ -5315,23 +5499,18 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - flat-cache@4.0.1: dependencies: - flatted: 3.3.1 + flatted: 3.3.2 keyv: 4.5.4 - flatted@3.3.1: {} - - foreground-child@3.2.1: + flat-cache@6.1.5: dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 + cacheable: 1.8.7 + flatted: 3.3.2 + hookified: 1.6.0 + + flatted@3.3.2: {} forever-agent@0.6.1: {} @@ -5357,12 +5536,6 @@ snapshots: fresh@0.5.2: {} - fs-extra@11.2.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -5372,28 +5545,37 @@ snapshots: get-caller-file@2.0.5: {} - get-intrinsic@1.2.4: + get-intrinsic@1.2.7: dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 es-errors: 1.3.0 + es-object-atoms: 1.0.0 function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.0.0 get-stream@5.2.0: dependencies: - pump: 3.0.0 + pump: 3.0.2 - get-tsconfig@4.7.5: + get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 - get-uri@6.0.3: + get-uri@6.0.4: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.3.5 - fs-extra: 11.2.0 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -5409,15 +5591,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.3: - dependencies: - foreground-child: 3.2.1 - jackspeak: 3.4.1 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.0 - path-scurry: 1.11.1 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -5437,11 +5610,9 @@ snapshots: globals@14.0.0: {} - globals@15.8.0: {} + globals@15.14.0: {} - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -5463,7 +5634,7 @@ snapshots: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.18.0 + uglify-js: 3.19.3 har-schema@2.0.0: {} @@ -5484,17 +5655,11 @@ snapshots: has-flag@4.0.0: {} - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} + has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 hasown@2.0.2: dependencies: @@ -5502,6 +5667,8 @@ snapshots: he@1.2.0: {} + hookified@1.6.0: {} + html-encoding-sniffer@1.0.2: dependencies: whatwg-encoding: 1.0.5 @@ -5514,7 +5681,7 @@ snapshots: he: 1.2.0 param-case: 2.1.1 relateurl: 0.2.7 - uglify-js: 3.18.0 + uglify-js: 3.19.3 htmlparser2@7.2.0: dependencies: @@ -5537,8 +5704,8 @@ snapshots: http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.1 - debug: 4.3.5 + agent-base: 7.1.3 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -5551,14 +5718,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.5 + debug: 4.4.0 transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.5: + https-proxy-agent@7.0.6: dependencies: - agent-base: 7.1.1 - debug: 4.3.5 + agent-base: 7.1.3 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -5570,15 +5737,15 @@ snapshots: ieee754@1.2.1: {} - ignore@5.3.1: {} + ignore@5.3.2: {} - image-size@1.1.1: + image-size@1.2.0: dependencies: queue: 6.0.2 image-ssim@0.2.0: {} - immutable@4.3.6: {} + immutable@5.0.3: {} import-fresh@3.3.0: dependencies: @@ -5610,12 +5777,12 @@ snapshots: strip-ansi: 5.2.0 through: 2.3.8 - intl-messageformat@10.5.14: + intl-messageformat@10.7.11: dependencies: - '@formatjs/ecma402-abstract': 2.0.0 - '@formatjs/fast-memoize': 2.2.0 - '@formatjs/icu-messageformat-parser': 2.7.8 - tslib: 2.6.3 + '@formatjs/ecma402-abstract': 2.3.2 + '@formatjs/fast-memoize': 2.2.6 + '@formatjs/icu-messageformat-parser': 2.9.8 + tslib: 2.8.1 ip-address@9.0.5: dependencies: @@ -5641,11 +5808,7 @@ snapshots: is-browser@2.1.0: {} - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - - is-core-module@2.14.0: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -5680,25 +5843,26 @@ snapshots: is-object@1.0.2: {} - is-path-inside@3.0.3: {} - is-potential-custom-element-name@1.0.1: {} is-promise@2.2.2: {} is-reference@1.2.1: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 - is-regex@1.1.4: + is-regex@1.2.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 + gopd: 1.2.0 has-tostringtag: 1.0.2 + hasown: 2.0.2 is-stream@1.1.0: {} - is-string@1.0.7: + is-string@1.1.1: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-typedarray@1.0.0: {} @@ -5715,6 +5879,8 @@ snapshots: isexe@2.0.0: {} + isexe@3.1.1: {} + iso-639-1@2.1.15: {} isomorphic-fetch@3.0.0: @@ -5726,15 +5892,9 @@ snapshots: isstream@0.1.2: {} - jackspeak@3.4.1: + jake@10.9.2: dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jake@10.9.1: - dependencies: - async: 3.2.5 + async: 3.2.6 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 @@ -5764,7 +5924,7 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-parse-even-better-errors@3.0.2: {} + json-parse-even-better-errors@4.0.0: {} json-schema-traverse@0.4.1: {} @@ -5776,12 +5936,6 @@ snapshots: json-stringify-safe@5.0.1: {} - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - jsprim@1.4.2: dependencies: assert-plus: 1.0.0 @@ -5800,6 +5954,10 @@ snapshots: dependencies: json-buffer: 3.0.1 + keyv@5.2.3: + dependencies: + '@keyv/serialize': 1.0.2 + kind-of@6.0.3: {} kleur@4.1.5: {} @@ -5832,17 +5990,18 @@ snapshots: lighthouse-stack-packs@1.12.1: {} - lighthouse@11.4.0: + lighthouse@12.1.0: dependencies: + '@paulirish/trace_engine': 0.0.23 '@sentry/node': 6.19.7 - axe-core: 4.9.1 + axe-core: 4.10.2 chrome-launcher: 1.1.2 configstore: 5.0.1 csp_evaluator: 1.1.1 - devtools-protocol: 0.0.1211954 + devtools-protocol: 0.0.1312386 enquirer: 2.4.1 http-link-header: 1.1.3 - intl-messageformat: 10.5.14 + intl-messageformat: 10.7.11 jpeg-js: 0.4.4 js-library-detector: 6.7.0 lighthouse-logger: 2.0.1 @@ -5852,19 +6011,17 @@ snapshots: metaviewport-parser: 0.3.0 open: 8.4.2 parse-cache-control: 1.0.1 - ps-list: 8.1.1 - puppeteer-core: 21.11.0 + puppeteer-core: 22.15.0 robots-parser: 3.0.1 semver: 5.7.2 speedline-core: 1.4.3 - third-party-web: 0.24.3 - tldts-icann: 6.1.31 + third-party-web: 0.24.5 + tldts-icann: 6.1.71 ws: 7.5.10 yargs: 17.7.2 yargs-parser: 21.1.1 transitivePeerDependencies: - bufferutil - - encoding - supports-color - utf-8-validate @@ -5885,7 +6042,7 @@ snapshots: dependencies: uc.micro: 2.1.0 - liquidjs@10.14.0: + liquidjs@10.20.1: dependencies: commander: 10.0.1 @@ -5913,8 +6070,6 @@ snapshots: lower-case@1.1.4: {} - lru-cache@10.4.0: {} - lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -5924,11 +6079,11 @@ snapshots: lru_map@0.3.3: {} - luxon@3.4.4: {} + luxon@3.5.0: {} - magic-string@0.30.10: + magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 make-dir@3.1.0: dependencies: @@ -5955,6 +6110,8 @@ snapshots: marky@1.2.5: {} + math-intrinsics@1.1.0: {} + maximatch@0.1.0: dependencies: array-differ: 1.0.0 @@ -5976,7 +6133,7 @@ snapshots: memorystream@0.3.1: {} - merge-descriptors@1.0.1: {} + merge-descriptors@1.0.3: {} merge2@1.4.1: {} @@ -5984,13 +6141,15 @@ snapshots: methods@1.1.2: {} - micromatch@4.0.7: + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 mime-db@1.52.0: {} + mime-db@1.53.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 @@ -6019,24 +6178,18 @@ snapshots: dependencies: yallist: 4.0.0 - minipass@7.1.2: {} - mitt@3.0.1: {} - mkdirp-classic@0.5.3: {} - mkdirp@0.5.6: dependencies: minimist: 1.2.8 moo@0.5.2: {} - morphdom@2.7.3: {} + morphdom@2.7.4: {} ms@2.0.0: {} - ms@2.1.2: {} - ms@2.1.3: {} multimatch@5.0.0: @@ -6055,6 +6208,8 @@ snapshots: negotiator@0.6.3: {} + negotiator@0.6.4: {} + neo-async@2.6.2: {} netlify-plugin-11ty@1.4.0: {} @@ -6065,6 +6220,9 @@ snapshots: dependencies: lower-case: 1.1.4 + node-addon-api@7.1.1: + optional: true + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -6086,17 +6244,18 @@ snapshots: normalize-path@3.0.0: {} - npm-normalize-package-bin@3.0.1: {} + npm-normalize-package-bin@4.0.0: {} - npm-run-all2@6.2.2: + npm-run-all2@7.0.2: dependencies: ansi-styles: 6.2.1 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 memorystream: 0.3.1 minimatch: 9.0.5 pidtree: 0.6.0 - read-package-json-fast: 3.0.2 - shell-quote: 1.8.1 + read-package-json-fast: 4.0.0 + shell-quote: 1.8.2 + which: 5.0.0 nth-check@2.1.1: dependencies: @@ -6110,7 +6269,7 @@ snapshots: optionalDependencies: chokidar: 3.6.0 - nwsapi@2.2.10: {} + nwsapi@2.2.16: {} oauth-sign@0.9.0: {} @@ -6118,7 +6277,7 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.2: {} + object-inspect@1.13.3: {} on-finished@2.4.1: dependencies: @@ -6203,16 +6362,16 @@ snapshots: p-try@2.2.0: {} - pac-proxy-agent@7.0.2: + pac-proxy-agent@7.1.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.1 - debug: 4.3.5 - get-uri: 6.0.3 + agent-base: 7.1.3 + debug: 4.4.0 + get-uri: 6.0.4 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.4 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color @@ -6221,8 +6380,6 @@ snapshots: degenerator: 5.0.1 netmask: 2.0.2 - package-json-from-dist@1.0.0: {} - pako@2.1.0: {} param-case@2.1.1: @@ -6239,7 +6396,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -6248,7 +6405,7 @@ snapshots: parse5@3.0.3: dependencies: - '@types/node': 20.14.10 + '@types/node': 22.10.5 parse5@5.1.0: {} @@ -6262,14 +6419,9 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.0 - minipass: 7.1.2 + path-to-regexp@0.1.12: {} - path-to-regexp@0.1.7: {} - - path-to-regexp@6.2.2: {} + path-to-regexp@6.3.0: {} path-type@4.0.0: {} @@ -6277,10 +6429,12 @@ snapshots: performance-now@2.1.0: {} - picocolors@1.0.1: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} + picomatch@4.0.2: {} + pidtree@0.6.0: {} pify@2.3.0: {} @@ -6319,11 +6473,11 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-jinja-template@1.4.1(prettier@3.2.5): + prettier-plugin-jinja-template@2.0.0(prettier@3.4.2): dependencies: - prettier: 3.2.5 + prettier: 3.4.2 - prettier@3.2.5: {} + prettier@3.4.2: {} prismjs@1.29.0: {} @@ -6344,16 +6498,16 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-agent@6.3.1: + proxy-agent@6.5.0: dependencies: - agent-base: 7.1.1 - debug: 4.3.5 + agent-base: 7.1.3 + debug: 4.4.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 lru-cache: 7.18.3 - pac-proxy-agent: 7.0.2 + pac-proxy-agent: 7.1.0 proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.4 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color @@ -6361,11 +6515,11 @@ snapshots: prr@1.0.1: {} - ps-list@8.1.1: {} - pseudomap@1.0.2: {} - psl@1.9.0: {} + psl@1.15.0: + dependencies: + punycode: 2.3.1 pug-attrs@3.0.0: dependencies: @@ -6392,7 +6546,7 @@ snapshots: jstransformer: 1.0.0 pug-error: 2.1.0 pug-walk: 2.0.0 - resolve: 1.22.8 + resolve: 1.22.10 pug-lexer@5.0.1: dependencies: @@ -6434,7 +6588,7 @@ snapshots: pug-runtime: 3.0.1 pug-strip-comments: 2.0.0 - pump@3.0.0: + pump@3.0.2: dependencies: end-of-stream: 1.4.4 once: 1.4.0 @@ -6443,23 +6597,21 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@21.11.0: + puppeteer-core@22.15.0: dependencies: - '@puppeteer/browsers': 1.9.1 - chromium-bidi: 0.5.8(devtools-protocol@0.0.1232444) - cross-fetch: 4.0.0 - debug: 4.3.4 - devtools-protocol: 0.0.1232444 - ws: 8.16.0 + '@puppeteer/browsers': 2.3.0 + chromium-bidi: 0.6.3(devtools-protocol@0.0.1312386) + debug: 4.4.0 + devtools-protocol: 0.0.1312386 + ws: 8.18.0 transitivePeerDependencies: - bufferutil - - encoding - supports-color - utf-8-validate - qs@6.11.0: + qs@6.13.0: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 qs@6.5.3: {} @@ -6484,10 +6636,10 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - read-package-json-fast@3.0.2: + read-package-json-fast@4.0.0: dependencies: - json-parse-even-better-errors: 3.0.2 - npm-normalize-package-bin: 3.0.1 + json-parse-even-better-errors: 4.0.0 + npm-normalize-package-bin: 4.0.0 readable-stream@1.0.34: dependencies: @@ -6510,6 +6662,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.1.1: {} + recursive-copy@2.0.14: dependencies: errno: 0.1.8 @@ -6545,7 +6699,7 @@ snapshots: request@2.88.2: dependencies: aws-sign2: 0.7.0 - aws4: 1.13.0 + aws4: 1.13.2 caseless: 0.12.0 combined-stream: 1.0.8 extend: 3.0.2 @@ -6575,9 +6729,9 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.8: + resolve@1.22.10: dependencies: - is-core-module: 2.14.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -6612,26 +6766,29 @@ snapshots: stream-combiner: 0.2.2 through: 2.3.8 - rollup@4.18.0: + rollup@4.30.1: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.18.0 - '@rollup/rollup-android-arm64': 4.18.0 - '@rollup/rollup-darwin-arm64': 4.18.0 - '@rollup/rollup-darwin-x64': 4.18.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 - '@rollup/rollup-linux-arm-musleabihf': 4.18.0 - '@rollup/rollup-linux-arm64-gnu': 4.18.0 - '@rollup/rollup-linux-arm64-musl': 4.18.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 - '@rollup/rollup-linux-riscv64-gnu': 4.18.0 - '@rollup/rollup-linux-s390x-gnu': 4.18.0 - '@rollup/rollup-linux-x64-gnu': 4.18.0 - '@rollup/rollup-linux-x64-musl': 4.18.0 - '@rollup/rollup-win32-arm64-msvc': 4.18.0 - '@rollup/rollup-win32-ia32-msvc': 4.18.0 - '@rollup/rollup-win32-x64-msvc': 4.18.0 + '@rollup/rollup-android-arm-eabi': 4.30.1 + '@rollup/rollup-android-arm64': 4.30.1 + '@rollup/rollup-darwin-arm64': 4.30.1 + '@rollup/rollup-darwin-x64': 4.30.1 + '@rollup/rollup-freebsd-arm64': 4.30.1 + '@rollup/rollup-freebsd-x64': 4.30.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 + '@rollup/rollup-linux-arm-musleabihf': 4.30.1 + '@rollup/rollup-linux-arm64-gnu': 4.30.1 + '@rollup/rollup-linux-arm64-musl': 4.30.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 + '@rollup/rollup-linux-riscv64-gnu': 4.30.1 + '@rollup/rollup-linux-s390x-gnu': 4.30.1 + '@rollup/rollup-linux-x64-gnu': 4.30.1 + '@rollup/rollup-linux-x64-musl': 4.30.1 + '@rollup/rollup-win32-arm64-msvc': 4.30.1 + '@rollup/rollup-win32-ia32-msvc': 4.30.1 + '@rollup/rollup-win32-x64-msvc': 4.30.1 fsevents: 2.3.3 run-async@2.4.1: {} @@ -6650,11 +6807,13 @@ snapshots: safer-buffer@2.1.2: {} - sass@1.77.6: + sass@1.83.1: dependencies: - chokidar: 3.6.0 - immutable: 4.3.6 - source-map-js: 1.2.0 + chokidar: 4.0.3 + immutable: 5.0.3 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.0 sax@1.4.1: {} @@ -6675,9 +6834,9 @@ snapshots: semver@6.3.1: {} - semver@7.6.2: {} + semver@7.6.3: {} - send@0.18.0: + send@0.19.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -6699,53 +6858,44 @@ snapshots: dependencies: randombytes: 2.1.0 - serve-static@1.15.0: + serve-static@1.16.2: dependencies: - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 0.19.0 transitivePeerDependencies: - supports-color set-blocking@2.0.0: {} - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - setprototypeof@1.2.0: {} - sharp@0.33.4: + sharp@0.33.5: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.6.2 + semver: 7.6.3 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.4 - '@img/sharp-darwin-x64': 0.33.4 - '@img/sharp-libvips-darwin-arm64': 1.0.2 - '@img/sharp-libvips-darwin-x64': 1.0.2 - '@img/sharp-libvips-linux-arm': 1.0.2 - '@img/sharp-libvips-linux-arm64': 1.0.2 - '@img/sharp-libvips-linux-s390x': 1.0.2 - '@img/sharp-libvips-linux-x64': 1.0.2 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 - '@img/sharp-libvips-linuxmusl-x64': 1.0.2 - '@img/sharp-linux-arm': 0.33.4 - '@img/sharp-linux-arm64': 0.33.4 - '@img/sharp-linux-s390x': 0.33.4 - '@img/sharp-linux-x64': 0.33.4 - '@img/sharp-linuxmusl-arm64': 0.33.4 - '@img/sharp-linuxmusl-x64': 0.33.4 - '@img/sharp-wasm32': 0.33.4 - '@img/sharp-win32-ia32': 0.33.4 - '@img/sharp-win32-x64': 0.33.4 + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 shebang-command@2.0.0: dependencies: @@ -6753,18 +6903,37 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.1: {} + shell-quote@1.8.2: {} - side-channel@1.0.6: + side-channel-list@1.0.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.2 + object-inspect: 1.13.3 - signal-exit@3.0.7: {} + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 - signal-exit@4.1.0: {} + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} simple-swizzle@0.2.2: dependencies: @@ -6785,10 +6954,10 @@ snapshots: smob@1.5.0: {} - socks-proxy-agent@8.0.4: + socks-proxy-agent@8.0.5: dependencies: - agent-base: 7.1.1 - debug: 4.3.5 + agent-base: 7.1.3 + debug: 4.4.0 socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -6798,7 +6967,7 @@ snapshots: ip-address: 9.0.5 smart-buffer: 4.2.0 - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} source-map-support@0.5.21: dependencies: @@ -6809,7 +6978,7 @@ snapshots: speedline-core@1.4.3: dependencies: - '@types/node': 20.14.10 + '@types/node': 22.10.5 image-ssim: 0.2.0 jpeg-js: 0.4.4 @@ -6852,13 +7021,13 @@ snapshots: dependencies: bluebird: 2.11.0 - streamx@2.18.0: + streamx@2.21.1: dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 - text-decoder: 1.1.0 + text-decoder: 1.2.3 optionalDependencies: - bare-events: 2.4.2 + bare-events: 2.5.4 string-width@2.1.1: dependencies: @@ -6871,12 +7040,6 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - string_decoder@0.10.31: {} string_decoder@1.1.1: @@ -6903,10 +7066,6 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.0.1 - strip-bom-string@1.0.0: {} strip-json-comments@3.1.1: {} @@ -6933,43 +7092,43 @@ snapshots: css-tree: 2.3.1 css-what: 6.1.0 csso: 5.0.5 - picocolors: 1.0.1 + picocolors: 1.1.1 symbol-tree@3.2.4: {} - synckit@0.8.8: + synckit@0.9.2: dependencies: '@pkgr/core': 0.1.1 - tslib: 2.6.3 + tslib: 2.8.1 tapable@2.2.1: {} - tar-fs@3.0.4: + tar-fs@3.0.7: dependencies: - mkdirp-classic: 0.5.3 - pump: 3.0.0 + pump: 3.0.2 tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 2.3.5 + bare-path: 2.1.3 tar-stream@3.1.7: dependencies: - b4a: 1.6.6 + b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.18.0 + streamx: 2.21.1 - terser@5.31.1: + terser@5.37.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.12.1 + acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 - text-decoder@1.1.0: + text-decoder@1.2.3: dependencies: - b4a: 1.6.6 - - text-table@0.2.0: {} + b4a: 1.6.7 - third-party-web@0.24.3: {} + third-party-web@0.24.5: {} through2-sink@1.0.0: dependencies: @@ -6988,11 +7147,11 @@ snapshots: through@2.3.8: {} - tldts-core@6.1.31: {} + tldts-core@6.1.71: {} - tldts-icann@6.1.31: + tldts-icann@6.1.71: dependencies: - tldts-core: 6.1.31 + tldts-core: 6.1.71 tmp@0.0.33: dependencies: @@ -7002,8 +7161,6 @@ snapshots: dependencies: rimraf: 2.7.1 - to-fast-properties@2.0.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -7014,7 +7171,7 @@ snapshots: tough-cookie@2.5.0: dependencies: - psl: 1.9.0 + psl: 1.15.0 punycode: 2.3.1 tr46@0.0.3: {} @@ -7027,7 +7184,7 @@ snapshots: tslib@1.14.1: {} - tslib@2.6.3: {} + tslib@2.8.1: {} tunnel-agent@0.6.0: dependencies: @@ -7058,21 +7215,19 @@ snapshots: uc.micro@2.1.0: {} - uglify-js@3.18.0: {} + uglify-js@3.19.3: {} unbzip2-stream@1.4.3: dependencies: buffer: 5.7.1 through: 2.3.8 - undici-types@5.26.5: {} + undici-types@6.20.0: {} unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 - universalify@2.0.1: {} - unpipe@1.0.0: {} upper-case@1.1.3: {} @@ -7088,7 +7243,7 @@ snapshots: urlobj@0.0.11: dependencies: is-object: 1.0.2 - is-string: 1.0.7 + is-string: 1.1.1 object-assign: 4.1.1 urlpattern-polyfill@10.0.0: {} @@ -7160,7 +7315,11 @@ snapshots: dependencies: isexe: 2.0.0 - wicg-inert@3.1.2: {} + which@5.0.0: + dependencies: + isexe: 3.1.1 + + wicg-inert@3.1.3: {} win-release@1.1.1: dependencies: @@ -7168,9 +7327,9 @@ snapshots: with@7.0.2: dependencies: - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 - assert-never: 1.3.0 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 + assert-never: 1.4.0 babel-walk: 3.0.0-canary-5 word-wrap@1.2.5: {} @@ -7189,12 +7348,6 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - wrappy@1.0.2: {} write-file-atomic@3.0.3: @@ -7210,8 +7363,6 @@ snapshots: ws@7.5.10: {} - ws@8.16.0: {} - ws@8.18.0: {} xdg-basedir@4.0.0: {} @@ -7230,7 +7381,7 @@ snapshots: yallist@4.0.0: {} - yaml@2.4.5: {} + yaml@2.7.0: {} yamlparser@0.0.2: {} @@ -7263,7 +7414,7 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -7276,3 +7427,5 @@ snapshots: fd-slicer: 1.1.0 yocto-queue@0.1.0: {} + + zod@3.23.8: {} diff --git a/src/_data/config.js b/src/_data/config.js index aafca79f2d..7a53618e9c 100644 --- a/src/_data/config.js +++ b/src/_data/config.js @@ -9,6 +9,6 @@ module.exports = { authorHandle: "", authorName: "", description: - "We are Europe’s leading mobile and web design & development consultancy. Our clients value code quality, dependability and honesty. We are trusted by Generali, Qonto, Trainline, and CLARK.", + "We know the code, tools, and practices that go into successful development. We partner with our clients to solve their toughest tech challenges by sharing our skills and expertise as teammates.", maxPostsPerPage: 6, }; diff --git a/src/_data/publicRustWorkshops.json b/src/_data/publicRustWorkshops.json index 681415c421..6b8e1c2c53 100644 --- a/src/_data/publicRustWorkshops.json +++ b/src/_data/publicRustWorkshops.json @@ -1,10 +1,22 @@ { "workshops": [ { - "endDate": "2024-05-29T18:00+02:00", - "date": "May 28th + 29th, 2024, 14:00-18:00 CEST", - "text": "Remote Workshop: Telemetry for Rust APIs – you can't fix what you can't see", - "link": "https://ti.to/mainmatter/rust-telemetry-may-2024" + "endDate": "2025-01-24T18:00+01:00", + "date": "Jan 23rd + 24th, 2025, 14:00-18:00 CET", + "text": "Remote Workshop: Testing for Rust projects – going beyond the basics", + "link": "https://ti.to/mainmatter/rust-testing-jan-2025" + }, + { + "endDate": "2025-02-28T18:00+01:00", + "date": "Feb 27th + 28th, 2025, 14:00-18:00 CET", + "text": "Remote Workshop: Rust-Python Interoperability", + "link": "https://ti.to/mainmatter/rust-python-feb-2025" + }, + { + "endDate": "2025-02-21T18:00+01:00", + "date": "Jan 30th – Feb 21st, 2025, 14:00-18:00 CET", + "text": "Remote Workshop: Learn Rust, starting from scratch", + "link": "https://ti.to/mainmatter/rust-from-scratch-jan-2025" } ] } diff --git a/src/_data/publicSvelteWorkshops.json b/src/_data/publicSvelteWorkshops.json new file mode 100644 index 0000000000..de65474db5 --- /dev/null +++ b/src/_data/publicSvelteWorkshops.json @@ -0,0 +1,10 @@ +{ + "workshops": [ + { + "endDate": "2025-02-07T18:00+01:00", + "date": "Feb 6th – 7th, 2025, 14:00-18:00 CET", + "text": "Remote Workshop: Svelte 5 & Runes", + "link": "https://ti.to/mainmatter/svelte-5-runes-feb-2025" + } + ] +} diff --git a/src/_data/services.json b/src/_data/services.json index 6da137f66c..317b059a5c 100644 --- a/src/_data/services.json +++ b/src/_data/services.json @@ -21,6 +21,23 @@ "linkUrl": "/services/strategic-advice" } ], + "services-list-clutch": [ + { + "heading": "Launch your idea", + "text": "From Concept to MVP", + "linkUrl": "/services/launch-your-idea/" + }, + { + "heading": "Modernize your tech stack", + "text": "Upgrades instead of rewrites", + "linkUrl": "/services/tech-modernization/" + }, + { + "heading": "Get strategic advice", + "text": "Assessments, transformation and scaling", + "linkUrl": "/services/strategic-advice" + } + ], "team-reinforcement": [ { "heading": "Launch your idea", diff --git a/src/_data/socials.json b/src/_data/socials.json index 2b7a11258c..e8ac48f306 100644 --- a/src/_data/socials.json +++ b/src/_data/socials.json @@ -8,6 +8,10 @@ "text": "LinkedIn", "link": "https://www.linkedin.com/company/mainmatter/" }, + { + "text": "Bluesky", + "link": "https://bsky.app/profile/mainmatter.com" + }, { "text": "Twitter", "link": "https://twitter.com/mainmatter/" diff --git a/src/_data/team.json b/src/_data/team.json index fa58c26679..16a5f7f500 100644 --- a/src/_data/team.json +++ b/src/_data/team.json @@ -56,14 +56,14 @@ "name": "Majd Bayassi", "imgPath": "/assets/images/team/majd.jpg" }, - { - "name": "Emma Sofia Dell'Acqua", - "imgPath": "/assets/images/team/emma.jpg" - }, { "name": "Marco Otte-Witte", "imgPath": "/assets/images/team/marco.jpg" }, + { + "name": "Celli", + "imgPath": "/assets/images/team/celli.jpg" + }, { "name": "Chris Manson", "imgPath": "/assets/images/team/chris.jpg" diff --git a/src/appearances/2016-07-12-authentication-and-session-management-in-fastboot.md b/src/appearances/2016-07-12-authentication-and-session-management-in-fastboot.md index 5fd1047ffc..6ba5d76ddd 100644 --- a/src/appearances/2016-07-12-authentication-and-session-management-in-fastboot.md +++ b/src/appearances/2016-07-12-authentication-and-session-management-in-fastboot.md @@ -6,5 +6,4 @@ media: video channel: embercamp-2016 --- -Marco Otte-Witte shows how authentication ans session management works in -FastBoot with cookies. +Marco Otte-Witte shows how authentication ans session management works in FastBoot with cookies. diff --git a/src/appearances/2017-03-28-animate-the-web-with-ember.md b/src/appearances/2017-03-28-animate-the-web-with-ember.md index 0b1c8f8f0c..f457f3fa9f 100644 --- a/src/appearances/2017-03-28-animate-the-web-with-ember.md +++ b/src/appearances/2017-03-28-animate-the-web-with-ember.md @@ -6,5 +6,4 @@ media: video channel: emberconf-2017 --- -Jessica Jordan shows how to do animations on the web leveraging HTML5 canvas and -the Web Animation API. +Jessica Jordan shows how to do animations on the web leveraging HTML5 canvas and the Web Animation API. diff --git a/src/appearances/2017-05-24-feel-the-glimmer.md b/src/appearances/2017-05-24-feel-the-glimmer.md index 10d5a19799..cc54f6821a 100644 --- a/src/appearances/2017-05-24-feel-the-glimmer.md +++ b/src/appearances/2017-05-24-feel-the-glimmer.md @@ -6,5 +6,4 @@ media: video channel: ember-munich --- -Marco Otte-Witte introduces Glimmer.js and the Glimmer VM and explains how they -work. +Marco Otte-Witte introduces Glimmer.js and the Glimmer VM and explains how they work. diff --git a/src/appearances/2017-07-11-the-modern-state-of-web-components.md b/src/appearances/2017-07-11-the-modern-state-of-web-components.md index 0b2cdb7c37..713a48976b 100644 --- a/src/appearances/2017-07-11-the-modern-state-of-web-components.md +++ b/src/appearances/2017-07-11-the-modern-state-of-web-components.md @@ -6,5 +6,4 @@ media: video channel: embercamp-2017 --- -Jessica Jordan gives an update on the status of native web components and shows -how they can be used via Glimmer.js today. +Jessica Jordan gives an update on the status of native web components and shows how they can be used via Glimmer.js today. diff --git a/src/appearances/2017-10-23-a-glimmer-of-hope-creating-modern-web-components-with-glimmer.md b/src/appearances/2017-10-23-a-glimmer-of-hope-creating-modern-web-components-with-glimmer.md index 1539cc4631..7825f45878 100644 --- a/src/appearances/2017-10-23-a-glimmer-of-hope-creating-modern-web-components-with-glimmer.md +++ b/src/appearances/2017-10-23-a-glimmer-of-hope-creating-modern-web-components-with-glimmer.md @@ -6,5 +6,4 @@ media: video channel: international-javascript-conference-2017 --- -Jessica Jordan elaborates on how web components can be built today leveraging -Glimmer.js. +Jessica Jordan elaborates on how web components can be built today leveraging Glimmer.js. diff --git a/src/appearances/2018-02-22-testing-against-time-in-javascript-applications.md b/src/appearances/2018-02-22-testing-against-time-in-javascript-applications.md index b1785abcd7..ca54e56269 100644 --- a/src/appearances/2018-02-22-testing-against-time-in-javascript-applications.md +++ b/src/appearances/2018-02-22-testing-against-time-in-javascript-applications.md @@ -6,5 +6,4 @@ media: video channel: assertjs-2018 --- -Jessica Jordan introduces patterns and best practices around testing -asynchronous and time-dependent behaviors. +Jessica Jordan introduces patterns and best practices around testing asynchronous and time-dependent behaviors. diff --git a/src/appearances/2018-03-13-everything-they-didnt-tell-you-about-the-ember-community.md b/src/appearances/2018-03-13-everything-they-didnt-tell-you-about-the-ember-community.md index 6ebb7109fa..48b876ec2d 100644 --- a/src/appearances/2018-03-13-everything-they-didnt-tell-you-about-the-ember-community.md +++ b/src/appearances/2018-03-13-everything-they-didnt-tell-you-about-the-ember-community.md @@ -6,5 +6,4 @@ media: video channel: emberconf-2018 --- -Jessica Jordan shares some insights to what defines the Ember Community and what -drives it forward. +Jessica Jordan shares some insights to what defines the Ember Community and what drives it forward. diff --git a/src/appearances/2018-03-13-the-next-generation-of-testing.md b/src/appearances/2018-03-13-the-next-generation-of-testing.md index 3678954021..078b6f0d0e 100644 --- a/src/appearances/2018-03-13-the-next-generation-of-testing.md +++ b/src/appearances/2018-03-13-the-next-generation-of-testing.md @@ -6,5 +6,4 @@ media: video channel: emberconf-2018 --- -Tobias Bieniek elaborates on what modern testing of Ember.js applications looks -like. +Tobias Bieniek elaborates on what modern testing of Ember.js applications looks like. diff --git a/src/appearances/2018-09-21-internationalization-its-easy-in-ember.md b/src/appearances/2018-09-21-internationalization-its-easy-in-ember.md index 6dc6955049..584d2c6566 100644 --- a/src/appearances/2018-09-21-internationalization-its-easy-in-ember.md +++ b/src/appearances/2018-09-21-internationalization-its-easy-in-ember.md @@ -6,5 +6,4 @@ media: video channel: embercamp-2018 --- -Tobias Bieniek shares just how easy internationalization of Ember apps can be -when done right. +Tobias Bieniek shares just how easy internationalization of Ember apps can be when done right. diff --git a/src/appearances/2018-10-11-deliver-fast-apps-even-faster.md b/src/appearances/2018-10-11-deliver-fast-apps-even-faster.md index 8d6f826c95..afd8c21f3d 100644 --- a/src/appearances/2018-10-11-deliver-fast-apps-even-faster.md +++ b/src/appearances/2018-10-11-deliver-fast-apps-even-faster.md @@ -6,5 +6,4 @@ media: video channel: emberfest-2018 --- -Marco Otte-Witte talks about optimizing JavaScript bundles and loading behaviour -of Ember.js apps. +Marco Otte-Witte talks about optimizing JavaScript bundles and loading behaviour of Ember.js apps. diff --git a/src/appearances/2018-10-11-els-the-ember-language-server.md b/src/appearances/2018-10-11-els-the-ember-language-server.md index e56b42bb63..1697b1c276 100644 --- a/src/appearances/2018-10-11-els-the-ember-language-server.md +++ b/src/appearances/2018-10-11-els-the-ember-language-server.md @@ -6,5 +6,4 @@ media: video channel: emberfest-2018 --- -Tobias Bieniek gives an update on the status of the Ember Language Server and -goals for the future. +Tobias Bieniek gives an update on the status of the Ember Language Server and goals for the future. diff --git a/src/appearances/2018-10-29-crafting-web-comics-with-ember.md b/src/appearances/2018-10-29-crafting-web-comics-with-ember.md index 7943e691f4..91fa1f2efc 100644 --- a/src/appearances/2018-10-29-crafting-web-comics-with-ember.md +++ b/src/appearances/2018-10-29-crafting-web-comics-with-ember.md @@ -6,5 +6,4 @@ media: video channel: reactiveconf-2018 --- -Jessica Jordan shares how to build comics for the web using Ember.js and the Web -Animation API. +Jessica Jordan shares how to build comics for the web using Ember.js and the Web Animation API. diff --git a/src/appearances/2019-06-01-crafting-comics-for-literally-everyone.md b/src/appearances/2019-06-01-crafting-comics-for-literally-everyone.md index d617e4f9e0..e12f9fad70 100644 --- a/src/appearances/2019-06-01-crafting-comics-for-literally-everyone.md +++ b/src/appearances/2019-06-01-crafting-comics-for-literally-everyone.md @@ -6,5 +6,4 @@ media: video channel: jsconf-eu-2019 --- -Jessica Jordan demonstrates how to create an immersive web comic experience that -is not only engaging for sighted users but accessible for everyone. +Jessica Jordan demonstrates how to create an immersive web comic experience that is not only engaging for sighted users but accessible for everyone. diff --git a/src/appearances/2019-06-22-thriving-through-the-hype-cycle.md b/src/appearances/2019-06-22-thriving-through-the-hype-cycle.md index 787a62c143..7321e60d23 100644 --- a/src/appearances/2019-06-22-thriving-through-the-hype-cycle.md +++ b/src/appearances/2019-06-22-thriving-through-the-hype-cycle.md @@ -6,5 +6,4 @@ media: video channel: commit-porto-2019 --- -Ricardo Mendes goes through the history of Ember.js as a project and how it -braves the fads of front-end development. +Ricardo Mendes goes through the history of Ember.js as a project and how it braves the fads of front-end development. diff --git a/src/appearances/2019-10-17-console-group-and-qunit.md b/src/appearances/2019-10-17-console-group-and-qunit.md index 688465d3c7..f3c990c46b 100644 --- a/src/appearances/2019-10-17-console-group-and-qunit.md +++ b/src/appearances/2019-10-17-console-group-and-qunit.md @@ -6,5 +6,4 @@ media: video channel: emberfest-2019 --- -Tobias Bieniek shows how grouping console statements makes for a better QUnit -experience. +Tobias Bieniek shows how grouping console statements makes for a better QUnit experience. diff --git a/src/appearances/2019-10-17-jam-stack-for-human-beings.md b/src/appearances/2019-10-17-jam-stack-for-human-beings.md index 0ff02b4db7..57542bc5ef 100644 --- a/src/appearances/2019-10-17-jam-stack-for-human-beings.md +++ b/src/appearances/2019-10-17-jam-stack-for-human-beings.md @@ -6,5 +6,4 @@ media: video channel: emberfest-2019 --- -Chris Manson shares what the JAM stack even is and how Ember developers can -leverage its concepts. +Chris Manson shares what the JAM stack even is and how Ember developers can leverage its concepts. diff --git a/src/appearances/2019-10-17-steady-state-with-ember-octane.md b/src/appearances/2019-10-17-steady-state-with-ember-octane.md index 692587dbac..23e9bd1ddb 100644 --- a/src/appearances/2019-10-17-steady-state-with-ember-octane.md +++ b/src/appearances/2019-10-17-steady-state-with-ember-octane.md @@ -6,5 +6,4 @@ media: video channel: emberfest-2019 --- -Jessica Jordan explains how state management works with decorators and tracked -properties in Ember Octane apps. +Jessica Jordan explains how state management works with decorators and tracked properties in Ember Octane apps. diff --git a/src/appearances/2020-03-16-decorators-in-depth.md b/src/appearances/2020-03-16-decorators-in-depth.md index 126da8e6ae..19284b562b 100644 --- a/src/appearances/2020-03-16-decorators-in-depth.md +++ b/src/appearances/2020-03-16-decorators-in-depth.md @@ -6,5 +6,4 @@ media: video channel: emberconf-2020 --- -Marco Otte-Witte explains how decorators that are the foundation for Ember's -@tracked and @actions work under the hood. +Marco Otte-Witte explains how decorators that are the foundation for Ember's @tracked and @actions work under the hood. diff --git a/src/appearances/2020-03-16-the-power-of-debugging.md b/src/appearances/2020-03-16-the-power-of-debugging.md index 5f702cd3df..8843356708 100644 --- a/src/appearances/2020-03-16-the-power-of-debugging.md +++ b/src/appearances/2020-03-16-the-power-of-debugging.md @@ -6,5 +6,4 @@ media: video channel: emberconf-2020 --- -Samanta de Barros explains how to leverage tools to debug and better understand -the structure of Ember apps. +Samanta de Barros explains how to leverage tools to debug and better understand the structure of Ember apps. diff --git a/src/appearances/2020-12-10-the-three-pillars-of-successful-digital-product-development.md b/src/appearances/2020-12-10-the-three-pillars-of-successful-digital-product-development.md index 0f21f81fa1..20a87c43a7 100644 --- a/src/appearances/2020-12-10-the-three-pillars-of-successful-digital-product-development.md +++ b/src/appearances/2020-12-10-the-three-pillars-of-successful-digital-product-development.md @@ -6,6 +6,4 @@ media: video channel: product-circle --- -Marco Otte-Witte shares best practices for digital product development in the -areas of planning and preparation, process and collaboration, as well as -infrastructure and practices. +Marco Otte-Witte shares best practices for digital product development in the areas of planning and preparation, process and collaboration, as well as infrastructure and practices. diff --git a/src/appearances/2020-12-10-version-control-in-design.md b/src/appearances/2020-12-10-version-control-in-design.md index d8f1ae1a73..fc7a41a954 100644 --- a/src/appearances/2020-12-10-version-control-in-design.md +++ b/src/appearances/2020-12-10-version-control-in-design.md @@ -6,5 +6,4 @@ media: video channel: on-product --- -Mar High explains how design teams can benefit from version control and explores -best practices for collaboration. +Mar High explains how design teams can benefit from version control and explores best practices for collaboration. diff --git a/src/appearances/2021-03-29-handling-images-on-the-web.md b/src/appearances/2021-03-29-handling-images-on-the-web.md index daabdc0f47..b4c2c3c309 100644 --- a/src/appearances/2021-03-29-handling-images-on-the-web.md +++ b/src/appearances/2021-03-29-handling-images-on-the-web.md @@ -6,6 +6,4 @@ media: video channel: emberconf-2021 --- -Handling images on the web has evolved from a simple task to a complex topic. -Marco Otte-Witte presents options for different scenarios along with challenges -and advantages as well as disadvantages of different approaches. +Handling images on the web has evolved from a simple task to a complex topic. Marco Otte-Witte presents options for different scenarios along with challenges and advantages as well as disadvantages of different approaches. diff --git a/src/appearances/2021-03-29-please-wait-oh-it-didnt-work.md b/src/appearances/2021-03-29-please-wait-oh-it-didnt-work.md index 161288d1b2..d9c23be21a 100644 --- a/src/appearances/2021-03-29-please-wait-oh-it-didnt-work.md +++ b/src/appearances/2021-03-29-please-wait-oh-it-didnt-work.md @@ -6,6 +6,4 @@ media: video channel: emberconf-2021 --- -Tobias Bieniek explains how to implement and test loading states, how to deal -with network errors and how to prevent Sentry from filling up with uncaught -promise errors. +Tobias Bieniek explains how to implement and test loading states, how to deal with network errors and how to prevent Sentry from filling up with uncaught promise errors. diff --git a/src/appearances/2021-09-30-data-validation-in-ember-apps.md b/src/appearances/2021-09-30-data-validation-in-ember-apps.md index cf663b5f2f..10d328bdc0 100644 --- a/src/appearances/2021-09-30-data-validation-in-ember-apps.md +++ b/src/appearances/2021-09-30-data-validation-in-ember-apps.md @@ -6,7 +6,4 @@ media: video channel: emberfest-2021 --- -Ember Octane’s tracking system makes it easier to integrate libraries from the -wider JavaScript ecosystem in Ember apps. Bartłomiej Dudzik explained how to -leverage other packages for validating data than ember-cp-validations or -ember-changeset. +Ember Octane’s tracking system makes it easier to integrate libraries from the wider JavaScript ecosystem in Ember apps. Bartłomiej Dudzik explained how to leverage other packages for validating data than ember-cp-validations or ember-changeset. diff --git a/src/appearances/2021-09-30-making-mira.md b/src/appearances/2021-09-30-making-mira.md index ec5bbc2f48..5851a4242c 100644 --- a/src/appearances/2021-09-30-making-mira.md +++ b/src/appearances/2021-09-30-making-mira.md @@ -6,6 +6,4 @@ media: video channel: emberfest-2021 --- -Mira is a robot created by Pixar artist Alonso Martinez, capable of recreating a -great number of emotions and interactions. In his talk, Nick Schot brings Mira -to the web while explaining different animation techniques. +Mira is a robot created by Pixar artist Alonso Martinez, capable of recreating a great number of emotions and interactions. In his talk, Nick Schot brings Mira to the web while explaining different animation techniques. diff --git a/src/appearances/2021-09-30-universal-design-systems-the-ember-way.md b/src/appearances/2021-09-30-universal-design-systems-the-ember-way.md index 4f34e1ed27..999207e9cb 100644 --- a/src/appearances/2021-09-30-universal-design-systems-the-ember-way.md +++ b/src/appearances/2021-09-30-universal-design-systems-the-ember-way.md @@ -6,6 +6,4 @@ media: video channel: emberfest-2021 --- -With Ember being HTML-First, doors open to new possibilities. Chris Manson -explores the opportunity of building a design system with Ember that can also be -consumed by apps that are not using JavaScript in his talk. +With Ember being HTML-First, doors open to new possibilities. Chris Manson explores the opportunity of building a design system with Ember that can also be consumed by apps that are not using JavaScript in his talk. diff --git a/src/appearances/2022-04-19-lint-your-code-into-the-future.md b/src/appearances/2022-04-19-lint-your-code-into-the-future.md index f7c120227f..d216428761 100644 --- a/src/appearances/2022-04-19-lint-your-code-into-the-future.md +++ b/src/appearances/2022-04-19-lint-your-code-into-the-future.md @@ -6,9 +6,6 @@ media: video channel: emberconf-2022 --- -Adopting new linting rules in modestly sized apps can often leave you with -several linting errors across hundreds of files. +Adopting new linting rules in modestly sized apps can often leave you with several linting errors across hundreds of files. -Chris Manson explains how you can reduce the struggle and happily lint large -apps all the way to modern Ember at your own pace in his talk from -EmberConf 2022. +Chris Manson explains how you can reduce the struggle and happily lint large apps all the way to modern Ember at your own pace in his talk from EmberConf 2022. diff --git a/src/appearances/2022-09-22-bottled-ember.md b/src/appearances/2022-09-22-bottled-ember.md index 20631123e9..930d4ec25c 100644 --- a/src/appearances/2022-09-22-bottled-ember.md +++ b/src/appearances/2022-09-22-bottled-ember.md @@ -1,15 +1,9 @@ --- -title: - "Bottled Ember - Batteries Included Web Framework, tiny tiny living space" +title: "Bottled Ember - Batteries Included Web Framework, tiny tiny living space" image: "/assets/images/talks/2022-09-22-emberfest-2022/bottled-ember.jpg" url: https://www.youtube.com/watch?v=On7gcZsuQ7g media: video channel: emberfest-2022 --- -All Ember addons come with the concept of a “dummy app”. This has been super -useful to test our addons and has even been part of the reason why we have been -able to support so many different versions of Ember from a single addon using -ember-try scenarios. This talk by Chris from EmberFest 2022, gives a bit of -detail on how “classic” addons work and proposes an alternative to replacing the -idea of the addon's dummy app with a monorepo in V2 addons. +All Ember addons come with the concept of a “dummy app”. This has been super useful to test our addons and has even been part of the reason why we have been able to support so many different versions of Ember from a single addon using ember-try scenarios. This talk by Chris from EmberFest 2022, gives a bit of detail on how “classic” addons work and proposes an alternative to replacing the idea of the addon's dummy app with a monorepo in V2 addons. diff --git a/src/appearances/2022-09-22-certificates-for-ember-serve.md b/src/appearances/2022-09-22-certificates-for-ember-serve.md index f10a2b3c82..f3f6a19caf 100644 --- a/src/appearances/2022-09-22-certificates-for-ember-serve.md +++ b/src/appearances/2022-09-22-certificates-for-ember-serve.md @@ -6,7 +6,6 @@ media: video channel: emberfest-2022 --- -From enabling secure cookies to working with crypto, there are many reasons why -you might want to serve your Ember application over HTTPS locally. +From enabling secure cookies to working with crypto, there are many reasons why you might want to serve your Ember application over HTTPS locally. Learn how in this talk by Florian from EmberFest 2022. diff --git a/src/appearances/2022-09-22-the-future-of-ember.md b/src/appearances/2022-09-22-the-future-of-ember.md index 7d5fb4b50a..3c3640933f 100644 --- a/src/appearances/2022-09-22-the-future-of-ember.md +++ b/src/appearances/2022-09-22-the-future-of-ember.md @@ -6,7 +6,4 @@ media: video channel: emberfest-2022 --- -EmberFest 2022 closed with a panel about the future of Ember, moderated by Marco -Otte-Witte with panelists Melanie Sumner, Chris Manson, Ed Faulkner, and Chris -Krycho. The panel discussed challenges and opportunities, how we market Ember -and where it fits in in the wider ecosystem of frontend frameworks. +EmberFest 2022 closed with a panel about the future of Ember, moderated by Marco Otte-Witte with panelists Melanie Sumner, Chris Manson, Ed Faulkner, and Chris Krycho. The panel discussed challenges and opportunities, how we market Ember and where it fits in in the wider ecosystem of frontend frameworks. diff --git a/src/appearances/2022-12-09-misusing-cucumber.md b/src/appearances/2022-12-09-misusing-cucumber.md index 3077afc78a..9c1dc50d18 100644 --- a/src/appearances/2022-12-09-misusing-cucumber.md +++ b/src/appearances/2022-12-09-misusing-cucumber.md @@ -6,5 +6,4 @@ media: video channel: embereurope-q4-2022 --- -Andrey Mikhaylov explained how to test Ember apps with Cucumber at the Ember -Europe Q4 2002 Meetup. +Andrey Mikhaylov explained how to test Ember apps with Cucumber at the Ember Europe Q4 2002 Meetup. diff --git a/src/appearances/2022-12-09-properly-flaky-modifiers.md b/src/appearances/2022-12-09-properly-flaky-modifiers.md index 81fe3285da..7a53b37d2c 100644 --- a/src/appearances/2022-12-09-properly-flaky-modifiers.md +++ b/src/appearances/2022-12-09-properly-flaky-modifiers.md @@ -6,5 +6,4 @@ media: video channel: embereurope-q4-2022 --- -Florian Pichler showed how to build a snowflake effect with modifiers and Ember -components at the last Ember Europe Q4 2022 Meetup. +Florian Pichler showed how to build a snowflake effect with modifiers and Ember components at the last Ember Europe Q4 2022 Meetup. diff --git a/src/appearances/2023-03-23-animations-in-ember-update.md b/src/appearances/2023-03-23-animations-in-ember-update.md index 1f8382f62c..4c7ac34ef1 100644 --- a/src/appearances/2023-03-23-animations-in-ember-update.md +++ b/src/appearances/2023-03-23-animations-in-ember-update.md @@ -6,7 +6,4 @@ media: video channel: embereurope-q1-2023 --- -Animations in Ember are evolving! Nick Schot presented upcoming changes, -covering different animation techniques with demos. He also shared the progress -on a new framework he’s been working on that will make animations in Ember even -better. +Animations in Ember are evolving! Nick Schot presented upcoming changes, covering different animation techniques with demos. He also shared the progress on a new framework he’s been working on that will make animations in Ember even better. diff --git a/src/appearances/2023-04-20-sending-emails-from-the-edge.md b/src/appearances/2023-04-20-sending-emails-from-the-edge.md index 0f9599fd15..67f80728a9 100644 --- a/src/appearances/2023-04-20-sending-emails-from-the-edge.md +++ b/src/appearances/2023-04-20-sending-emails-from-the-edge.md @@ -6,6 +6,4 @@ media: video channel: rustmunich-2-2023 --- -Marco Otte-Witte explained how to run Rust code on edge functions in his talk at -the Rust Munich Meetup. He showed how Rust, compiled to WASM, running on -Cloudflare Workers handles submissions of [Mainmatter's contact form](/contact). +Marco Otte-Witte explained how to run Rust code on edge functions in his talk at the Rust Munich Meetup. He showed how Rust, compiled to WASM, running on Cloudflare Workers handles submissions of [Mainmatter's contact form](/contact). diff --git a/src/appearances/2023-09-13-continuous-deployment-workflows.md b/src/appearances/2023-09-13-continuous-deployment-workflows.md index 6907811dfd..2623ccf241 100644 --- a/src/appearances/2023-09-13-continuous-deployment-workflows.md +++ b/src/appearances/2023-09-13-continuous-deployment-workflows.md @@ -6,7 +6,4 @@ media: video channel: stackconf-2023 --- -Marco Otte-Witte presented the main advantages of continuous deployment over -traditional release processes, explained the essential components of a -continuous deployment infrastructure, and discussed typical challenges as well -as strategies to overcome them. +Marco Otte-Witte presented the main advantages of continuous deployment over traditional release processes, explained the essential components of a continuous deployment infrastructure, and discussed typical challenges as well as strategies to overcome them. diff --git a/src/appearances/2023-09-21-securing-the-investment.md b/src/appearances/2023-09-21-securing-the-investment.md index d25561bfa7..fe5343b06b 100644 --- a/src/appearances/2023-09-21-securing-the-investment.md +++ b/src/appearances/2023-09-21-securing-the-investment.md @@ -6,7 +6,4 @@ media: video channel: emberfest-2023 --- -Marco Otte-Witte talked about investing into open source projects that companies -depend on, the risks of failing to invest, and the Embroider initiative that -Mainmatter is running with a group of sponsors to ship Embroider, Ember's new -build system, at EmberFest 2023 in Madrid. +Marco Otte-Witte talked about investing into open source projects that companies depend on, the risks of failing to invest, and the Embroider initiative that Mainmatter is running with a group of sponsors to ship Embroider, Ember's new build system, at EmberFest 2023 in Madrid. diff --git a/src/appearances/2023-09-22-the-emberguides-in-french.md b/src/appearances/2023-09-22-the-emberguides-in-french.md index 013fb7df1a..510c668aa2 100644 --- a/src/appearances/2023-09-22-the-emberguides-in-french.md +++ b/src/appearances/2023-09-22-the-emberguides-in-french.md @@ -6,6 +6,4 @@ media: video channel: emberfest-2023 --- -Marine Dunstetter walked us through the process of translating the Ember Guides -to French and highlighted the importance of translation in making documentation -more accessible at EmberFest 2023 in Madrid. +Marine Dunstetter walked us through the process of translating the Ember Guides to French and highlighted the importance of translation in making documentation more accessible at EmberFest 2023 in Madrid. diff --git a/src/appearances/2023-10-12-reasoning-about-rust.md b/src/appearances/2023-10-12-reasoning-about-rust.md index e205ea7c6e..e0bb9ddb85 100644 --- a/src/appearances/2023-10-12-reasoning-about-rust.md +++ b/src/appearances/2023-10-12-reasoning-about-rust.md @@ -6,6 +6,4 @@ media: video channel: eurorust23 --- -Our Principal Engineering Consultant, Luca Palmieri, introduced us to Rustdoc’s -JSON format and the possibilities that come with this new #rustlang feature in -his talk at EuroRust 2023. +Our Principal Engineering Consultant, Luca Palmieri, introduced us to Rustdoc’s JSON format and the possibilities that come with this new #rustlang feature in his talk at EuroRust 2023. diff --git a/src/appearances/2023-10-25-rust-in-production-panel.md b/src/appearances/2023-10-25-rust-in-production-panel.md index e05094c9ed..ff5365d53f 100644 --- a/src/appearances/2023-10-25-rust-in-production-panel.md +++ b/src/appearances/2023-10-25-rust-in-production-panel.md @@ -6,7 +6,4 @@ media: video channel: rustweb --- -Our Principal Engineering Consultant, Luca Palmieri, moderated a panel on real -world use cases and experiences with Rust in production, with panelists Jeremy -Lempereur (Rust engineer at Apollo GraphQL), and Bastien Dolla (co-founder at -Rayon). +Our Principal Engineering Consultant, Luca Palmieri, moderated a panel on real world use cases and experiences with Rust in production, with panelists Jeremy Lempereur (Rust engineer at Apollo GraphQL), and Bastien Dolla (co-founder at Rayon). diff --git a/src/appearances/2023-10-27-get-ready-to-rustle.md b/src/appearances/2023-10-27-get-ready-to-rustle.md index 251ee4c2fa..a02b01cefb 100644 --- a/src/appearances/2023-10-27-get-ready-to-rustle.md +++ b/src/appearances/2023-10-27-get-ready-to-rustle.md @@ -6,5 +6,4 @@ media: video channel: portotechhub-2023 --- -Marco Otte-Witte talked about how Rust is the next step for backend web -development at Porto Tech Hub 2023. +Marco Otte-Witte talked about how Rust is the next step for backend web development at Porto Tech Hub 2023. diff --git a/src/appearances/2023-11-11-enhance.md b/src/appearances/2023-11-11-enhance.md index b31da49570..df2b6add9a 100644 --- a/src/appearances/2023-11-11-enhance.md +++ b/src/appearances/2023-11-11-enhance.md @@ -6,5 +6,4 @@ media: video channel: sveltesummit --- -Paolo Ricciuti introduced us to progressive enhancement in SvelteKit at Svelte -Summit Fall 2023. +Paolo Ricciuti introduced us to progressive enhancement in SvelteKit at Svelte Summit Fall 2023. diff --git a/src/appearances/2023-12-07-embroider-ama.md b/src/appearances/2023-12-07-embroider-ama.md index a1d761e5fb..99d209ba1d 100644 --- a/src/appearances/2023-12-07-embroider-ama.md +++ b/src/appearances/2023-12-07-embroider-ama.md @@ -6,6 +6,4 @@ media: video channel: embereurope-q4-2023 --- -Chris Manson and Ed Faulkner answered questions about Embroider and previewed -the upcoming release as well as Vite support, at the Q4 2023 Ember Europe -meetup. +Chris Manson and Ed Faulkner answered questions about Embroider and previewed the upcoming release as well as Vite support, at the Q4 2023 Ember Europe meetup. diff --git a/src/appearances/2023-12-07-embroider-update.md b/src/appearances/2023-12-07-embroider-update.md index 9a649d2ca1..3370d90e6b 100644 --- a/src/appearances/2023-12-07-embroider-update.md +++ b/src/appearances/2023-12-07-embroider-update.md @@ -6,6 +6,4 @@ media: video channel: embereurope-q4-2023 --- -Chris Manson gave an update on the Embroider Initiative's progress so far. He -discussed Vite support, challenges the team is facing and what's coming in the -future. +Chris Manson gave an update on the Embroider Initiative's progress so far. He discussed Vite support, challenges the team is facing and what's coming in the future. diff --git a/src/appearances/2024-02-07-rust-in-production-why-how.md b/src/appearances/2024-02-07-rust-in-production-why-how.md index d28da96277..e66c34f027 100644 --- a/src/appearances/2024-02-07-rust-in-production-why-how.md +++ b/src/appearances/2024-02-07-rust-in-production-why-how.md @@ -1,13 +1,9 @@ --- title: "Panel - Rust in Production: Why? How?" -image: "/assets/images/talks/2024-02-07-rustweb-london/thumbnail-panel.jpg" +image: "/assets/images/talks/2024-02-07-rustweb-london/new-thumbnail.png" url: https://youtu.be/ZRBayed8cLw media: video channel: rustweb-london --- -Moderator Luca Palmieri (Principal Engineering Consultant at Mainmatter) and -panelists ​Edward Wright (Lead GIS Engineer at Vortexa), ​Nodar Daneliya -(Founder and CEO of Shuttle), and ​James Cole (Arwen.ai), discussed the reasons -for choosing Rust and how they use it in production at our Rust for the Web -meetup in London. +Moderator Luca Palmieri (Principal Engineering Consultant at Mainmatter) and panelists ​Edward Wright (Lead GIS Engineer at Vortexa), ​Nodar Daneliya (Founder and CEO of Shuttle), and ​James Cole (Arwen.ai), discussed the reasons for choosing Rust and how they use it in production at our Rust for the Web meetup in London. diff --git a/src/appearances/2024-02-07-rust-playbook.md b/src/appearances/2024-02-07-rust-playbook.md index 6ef35ff4e0..23de44c83d 100644 --- a/src/appearances/2024-02-07-rust-playbook.md +++ b/src/appearances/2024-02-07-rust-playbook.md @@ -1,11 +1,9 @@ --- title: "Adopting Rust: the missing playbook for managers and CTOs" -image: "/assets/images/talks/2024-02-07-rustweb-london/thumbnail-luca.jpg" +image: "/assets/images/talks/2024-02-07-rustweb-london/new-thumbnail-luca.png" url: https://youtu.be/Y5NIgRTTS-A media: video channel: rustweb-london --- -Our Principal Engineering Consultant, Luca Palmieri, presented the missing -playbook for Rust adoption for managers and CTOs at our Rust for the Web meetup -in London. +Our Principal Engineering Consultant, Luca Palmieri, presented the missing playbook for Rust adoption for managers and CTOs at our Rust for the Web meetup in London. diff --git a/src/appearances/2024-03-21-embroider-update-vite.md b/src/appearances/2024-03-21-embroider-update-vite.md index 38e2aaf024..6ed8fb8ace 100644 --- a/src/appearances/2024-03-21-embroider-update-vite.md +++ b/src/appearances/2024-03-21-embroider-update-vite.md @@ -1,10 +1,9 @@ --- title: "Update on the Embroider Initiative (Vite 🤫)" -image: "/assets/images/talks/2024-03-21-embereurope-2024-q1/embroider-update-talk.jpg" +image: "/assets/images/talks/2024-03-21-embereurope-2024-q1/new-thumbnails.png" url: https://youtu.be/SCWpDNE0IaA media: video channel: embereurope-q1-2024 --- -Chris Manson gave an update on the Embroider Initiative's progress so far and -showed off a real world Vite build. +Chris Manson gave an update on the Embroider Initiative's progress so far and showed off a real world Vite build. diff --git a/src/appearances/2024-03-26-pavex-api-development-in-rust.md b/src/appearances/2024-03-26-pavex-api-development-in-rust.md index 1e58227cab..bdcd7b3c13 100644 --- a/src/appearances/2024-03-26-pavex-api-development-in-rust.md +++ b/src/appearances/2024-03-26-pavex-api-development-in-rust.md @@ -1,10 +1,9 @@ --- title: "Pavex: re-imaging API development in Rust" -image: "/assets/images/talks/2024-03-26-rustnationuk-2024/talk-thumbnail.jpg" +image: "/assets/images/talks/2024-03-26-rustnationuk-2024/new-thumbnails.png" url: https://youtu.be/cMea6IMRk2s media: video channel: rustnationuk --- -Our Principal Engineering Consultant, Luca Palmieri, talked about the state of -Rust’s web ecosystem and his Pavex project in his talk at Rust Nation UK 2024. +Our Principal Engineering Consultant, Luca Palmieri, talked about the state of Rust’s web ecosystem and his Pavex project in his talk at Rust Nation UK 2024. diff --git a/src/appearances/2024-04-23-rust-panel.md b/src/appearances/2024-04-23-rust-panel.md index 2409348bf4..1be94bb906 100644 --- a/src/appearances/2024-04-23-rust-panel.md +++ b/src/appearances/2024-04-23-rust-panel.md @@ -1,11 +1,9 @@ --- title: "Panel discussion at Rust'n'Tell Berlin" -image: "/assets/images/talks/2024-04-23-rust-web-berlin/thumbnail-panel.jpg" +image: "/assets/images/talks/2024-04-23-rust-web-berlin/new-thumbnails.png" url: https://youtu.be/_D0IS1ftlPc media: video channel: rustweb-berlin --- -Mainmatter's Principal Engineering Consultant Luca Palmieri, SAP's Jonas Dohse, -and Fermyon's Ryan Levick discussed aspects of using Rust in production and -answered questions from the audience at our Rust for the Web event in Berlin. +Mainmatter's Principal Engineering Consultant Luca Palmieri, SAP's Jonas Dohse, and Fermyon's Ryan Levick discussed aspects of using Rust in production and answered questions from the audience at our Rust for the Web event in Berlin. diff --git a/src/appearances/2024-04-27-fullstack-testing.md b/src/appearances/2024-04-27-fullstack-testing.md index ec49fc6404..e8b4ea6a6b 100644 --- a/src/appearances/2024-04-27-fullstack-testing.md +++ b/src/appearances/2024-04-27-fullstack-testing.md @@ -1,10 +1,9 @@ --- title: "Fullstack Testing SvelteKit apps" -image: "/assets/images/talks/2024-04-27-fullstack-testing/thumbnail.jpg" +image: "/assets/images/talks/2024-04-27-fullstack-testing/new-thumbnails.png" url: https://www.youtube.com/watch?v=gkJ09joGBZ4&t=6752s media: video channel: sveltesummit --- -Paolo Ricciuti shared how to full-stack-test SvelteKit applications at Svelte -Summit Spring 2024. +Paolo Ricciuti shared how to full-stack-test SvelteKit applications at Svelte Summit Spring 2024. diff --git a/src/appearances/2024-09-13-emberconf-2024.md b/src/appearances/2024-09-13-emberconf-2024.md new file mode 100644 index 0000000000..d657997e3a --- /dev/null +++ b/src/appearances/2024-09-13-emberconf-2024.md @@ -0,0 +1,9 @@ +--- +title: "Launching Ember into the Future" +image: "/assets/images/talks/2024-09-13-emberconf-2024/new-thumbnail.png" +url: https://www.youtube.com/watch?v=qlLWRCEDvPI +media: video +channel: emberconf-2024 +--- + +Chris Manson explained how Embroider translates old "Emberisms" into modern JavaScript to use with Vite, and shared an update on the Embroider initiative in his talk at EmberConf. diff --git a/src/appearances/2024-09-13-rust-opensource-more.md b/src/appearances/2024-09-13-rust-opensource-more.md new file mode 100644 index 0000000000..cccbb0fbfb --- /dev/null +++ b/src/appearances/2024-09-13-rust-opensource-more.md @@ -0,0 +1,9 @@ +--- +title: "Rust, Open Source, and more @ Linux Inlaws" +image: "/assets/images/talks/2024-09-13-rust-linux-inlaws/new-thumbnail.png" +url: https://ia802203.us.archive.org/25/items/LI_S02E14_Rustacean_Station__54D6/LI_S02E14_Rustacean_Station_.mp3 +media: video +channel: rust-linux-inlaws +--- + +Mainmatter’s Founder Marco Otte-Witte was on the Linux Inlaws podcast to discuss Rust, open source, foundations, EuroRust and more. diff --git a/src/appearances/2024-09-13-rust-panel.md b/src/appearances/2024-09-13-rust-panel.md new file mode 100644 index 0000000000..b6c9d1cddd --- /dev/null +++ b/src/appearances/2024-09-13-rust-panel.md @@ -0,0 +1,9 @@ +--- +title: "Panel discussion at Rust for the Web x BCN Rust" +image: "/assets/images/talks/2024-09-13-rustweb-barcelona/new-thumbnail.png" +url: https://youtu.be/3G4DPk5y6iM +media: video +channel: rustweb-barcelona +--- + +Mainmatter's Principal Engineering Consultant Luca Palmieri, Software Engineer at Matchday, Matilda Smeds, and Engineering Director at Workato, Gleb Pomykalov had a panel discussion about Rust and answered questions from the audience at our Rust for the Web event in Barcelona. diff --git a/src/appearances/2024-10-03-viteconf.md b/src/appearances/2024-10-03-viteconf.md new file mode 100644 index 0000000000..bc7d96e70e --- /dev/null +++ b/src/appearances/2024-10-03-viteconf.md @@ -0,0 +1,9 @@ +--- +title: "Ember's Journey to Build with Vite" +image: "/assets/images/talks/2024-10-03-viteconf/thumbnail.png" +url: https://www.youtube.com/watch?v=Nh6S4cfehs0 +media: video +channel: viteconf-2024 +--- + +At ViteConf, our Ember expert Chris Manson, member of the Ember.js Core Learning and Tooling Teams, presented Ember's move to Vite for its new Embroider build system that sets the foundation for Ember's future. diff --git a/src/assets/css/app.scss b/src/assets/css/app.scss index 28518fb669..e6b1c38a0e 100644 --- a/src/assets/css/app.scss +++ b/src/assets/css/app.scss @@ -67,6 +67,7 @@ @import "components/embroider-sponsors"; @import "components/images-side-by-side-grid"; @import "components/grid-event-card"; +@import "components/form-with-image"; @import "animations/text-animation"; diff --git a/src/assets/css/base/_prism-theme.scss b/src/assets/css/base/_prism-theme.scss index 82f58887c0..5ff6c5216f 100644 --- a/src/assets/css/base/_prism-theme.scss +++ b/src/assets/css/base/_prism-theme.scss @@ -98,14 +98,14 @@ pre > code { .token.char, .token.builtin, .token.inserted { - color: #03DAC5; + color: #a5d6ff; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { - color: #03DAC5; + color: #a5d6ff; background: #161b22; } .token.atrule, diff --git a/src/assets/css/components/_contact-form.scss b/src/assets/css/components/_contact-form.scss index 57906b3eb2..b456c65cb8 100644 --- a/src/assets/css/components/_contact-form.scss +++ b/src/assets/css/components/_contact-form.scss @@ -81,6 +81,23 @@ $states: "loading", "success", "error"; transition: opacity 0.3s ease, transform 0.3s ease; + + &.contact-form__label-checkbox { + color: var(--color-white); + font-weight: 700; + display: inline-block; + padding: 1rem 0; + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0; + position: relative; + opacity: 1; + display: flex; + flex-direction: row; + align-items: baseline; + justify-content: flex-start; + } } .contact-form__label-required { @@ -117,6 +134,35 @@ $states: "loading", "success", "error"; opacity: 0; } } + + &.contact-form__input-checkbox { + display: grid; + place-content: center; + padding: 0; + margin-right: 1rem; + -webkit-appearance: none; + appearance: none; + background-color: transparent; + font: inherit; + color: currentColor; + width: 1em; + height: 100%; + border: 0.15em solid currentColor; + border-radius: 0.15em; + transform: translateY(-0.075em); + transition: 0.3s background-color ease; + + &::before { + content: ""; + width: 0.5em; + height: 0.5em; + opacity: 0; + } + + &:checked { + background-color: currentcolor; + } + } } .contact-form__select { @@ -168,7 +214,7 @@ $states: "loading", "success", "error"; opacity: 0; background-color: rgba(0, 0, 0, 0); text-align: center; - z-index: 1; + z-index: 2; pointer-events: none; transition: background-color 0.3s ease, diff --git a/src/assets/css/components/_cta-banner.scss b/src/assets/css/components/_cta-banner.scss index f80d467c18..7c20dadc70 100644 --- a/src/assets/css/components/_cta-banner.scss +++ b/src/assets/css/components/_cta-banner.scss @@ -1,5 +1,4 @@ .cta-banner { - position: relative; z-index: 50; &--purple { diff --git a/src/assets/css/components/_featured-case-studies.scss b/src/assets/css/components/_featured-case-studies.scss index fdf96f40b8..d05ae004cc 100644 --- a/src/assets/css/components/_featured-case-studies.scss +++ b/src/assets/css/components/_featured-case-studies.scss @@ -1,5 +1,6 @@ .featured-case-studies { - padding: 3rem 0 5rem; + margin-block-start: 3rem; + margin-block-end: 5rem; } .featured-case-studies__heading { @@ -18,7 +19,8 @@ @media (min-width: $breakpoint-m) { .featured-case-studies { - padding: 5rem 0 11rem; + margin-block-start: 5rem; + margin-block-end: 11rem; } .featured-case-studies__list { diff --git a/src/assets/css/components/_form-with-image.scss b/src/assets/css/components/_form-with-image.scss new file mode 100644 index 0000000000..553294d3a0 --- /dev/null +++ b/src/assets/css/components/_form-with-image.scss @@ -0,0 +1,29 @@ +.form-with-image { + display: flex; + flex-direction:column-reverse; +} + +.form-with-image__form { + margin-top:0; +} + +.form-with-image__image { + margin: 3rem 0 0 0; +} + +.form-with-image__image img { + width: 100%; +} + +@media (min-width: $breakpoint-m) { + .form-with-image { + display: flex; + flex-direction: row; + justify-content: space-between; + gap: 2.5rem; + } + + .form-with-image__image { + margin: 0; + } +} diff --git a/src/assets/js/app.js b/src/assets/js/app.js index d032502682..746e13ed08 100644 --- a/src/assets/js/app.js +++ b/src/assets/js/app.js @@ -14,8 +14,9 @@ if (window.location.host === "mainmatter.com") { const navElement = document.getElementById("nav"); new Nav(navElement); -const contactForm = document.getElementById("contact-form"); -if (contactForm) new ContactForm(contactForm); +for (const form of document.querySelectorAll("[data-contact-form]")) { + new ContactForm(form); +} const logoList = document.getElementById("logo-list"); if (logoList) new LogoList(logoList); diff --git a/src/assets/js/contact-form.js b/src/assets/js/contact-form.js index df251b3513..fd66b26305 100644 --- a/src/assets/js/contact-form.js +++ b/src/assets/js/contact-form.js @@ -30,7 +30,7 @@ export class ContactForm { } sendMessage(formData) { - const handleError = () => { + const handleError = e => { this.updateFormState("error", "An error occurred."); if (window.location.host === "mainmatter.com") { Sentry.addBreadcrumb({ @@ -39,34 +39,45 @@ export class ContactForm { level: "info", data: formData, }); - Sentry.captureException(new Error("Failed to deliver message via contact form!")); + Sentry.captureException(e); } }; const { plausible } = window; + const { goal } = this.form.dataset; if (plausible) { - plausible("Contact"); + plausible(goal); } - return fetch("https://contact.mainmatter.dev/send", { - body: JSON.stringify(formData), + let { action, method } = this.form.dataset; + + let params = { cache: "no-cache", - headers: { - "Content-Type": "application/json; charset=UTF-8'", - }, - method: "POST", + method, mode: "cors", - }) + }; + if (method.toLowerCase() === "get") { + const queryString = new URLSearchParams(formData).toString(); + action = `${action}?${queryString}`; + } else { + params = { + ...params, + body: JSON.stringify(formData), + headers: { + "Content-Type": "application/json; charset=UTF-8'", + }, + }; + } + + return fetch(action, params) .then(response => { if (response.ok) { this.updateFormState("success", "Message sent successfully."); } else { - handleError(); + handleError(new Error("Failed to deliver message via contact form!")); } }) - .catch(() => { - handleError(); - }); + .catch(handleError); } updateFormState(state, screenreaderAnnouncement) { diff --git a/src/atom.njk b/src/atom.njk index 95558e4a7c..4887ea74d5 100644 --- a/src/atom.njk +++ b/src/atom.njk @@ -4,7 +4,7 @@ eleventyExcludeFromCollections: true layout: "" metadata: title: "Mainmatter" - subtitle: "We are Europe’s leading mobile and web design & development consultancy. Our clients value code quality, dependability and honesty. We are trusted by Generali, Qonto, Trainline, and CLARK." + subtitle: "We know the code, tools, and practices that go into successful development. We partner with our clients to solve their toughest tech challenges by sharing our skills and expertise as teammates." language: "en" url: "https://mainmatter.com/" author: diff --git a/src/author.njk b/src/author.njk index f60e2a1435..311bf73c82 100644 --- a/src/author.njk +++ b/src/author.njk @@ -65,7 +65,7 @@ permalink: "/blog/author/{{ paged.author.fileSlug }}/{% if paged.number > 1 %}/p {% set 'content' = { - "title": "Grow your business with us", + "title": "Team up with us to go further!", "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" diff --git a/src/authors/algo_luca.md b/src/authors/algo_luca.md index 70c3da5e0e..9de4dfb958 100644 --- a/src/authors/algo_luca.md +++ b/src/authors/algo_luca.md @@ -2,5 +2,6 @@ name: "Luca Palmieri" github: LukeMathWalker twitter: algo_luca +mastodon: "@algo_luca@hachyderm.io" bio: "Principal Engineering Consultant" --- diff --git a/src/authors/hdoordt.md b/src/authors/hdoordt.md new file mode 100644 index 0000000000..8f44abb377 --- /dev/null +++ b/src/authors/hdoordt.md @@ -0,0 +1,6 @@ +--- +name: "Henk Oordt" +github: hdoordt +linkedin: hdoordt +bio: "Senior Software Engineering Consultant" +--- diff --git a/src/authors/marcoow.md b/src/authors/marcoow.md index b5263b9420..001e4e48e2 100644 --- a/src/authors/marcoow.md +++ b/src/authors/marcoow.md @@ -3,5 +3,7 @@ name: "Marco Otte-Witte" github: marcoow twitter: marcoow linkedin: marco-otte-witte +mastodon: "@marcoow@mastodon.social" +bluesky: marcoow.bsky.social bio: "Founder and Managing Director of Mainmatter" --- diff --git a/src/authors/nickschot.md b/src/authors/nickschot.md index 82643d0dfc..430ee89cad 100644 --- a/src/authors/nickschot.md +++ b/src/authors/nickschot.md @@ -2,5 +2,7 @@ name: "Nick Schot" github: nickschot twitter: nickschot +bluesky: nickschot.bsky.social +mastodon: "@nickschot@toot.community" bio: "Senior Software Engineer" --- diff --git a/src/authors/oscard0m_.md b/src/authors/oscard0m_.md index e70df80a5a..13831a1250 100644 --- a/src/authors/oscard0m_.md +++ b/src/authors/oscard0m_.md @@ -2,5 +2,6 @@ name: "Oscar Dominguez" github: oscard0m twitter: oscard0m_ +mastodon: "@OscarDOM@mastodon.social" bio: "Software Engineer" --- diff --git a/src/authors/paoloricciuti.md b/src/authors/paoloricciuti.md index c695045804..3bda2795d9 100644 --- a/src/authors/paoloricciuti.md +++ b/src/authors/paoloricciuti.md @@ -3,7 +3,7 @@ name: "Paolo Ricciuti" github: paoloricciuti twitter: paoloricciuti linkedin: paolo-ricciuti-571a91187 -bio: - 'Senior Software Engineer at Mainmatter, Co-creator of sveltelab.dev' +bluesky: paolo.ricciuti.me +mastodon: "@paoloricciuti@front-end.social" +bio: 'Senior Software Engineer at Mainmatter, Co-creator of sveltelab.dev' --- diff --git a/src/authors/pichfl.md b/src/authors/pichfl.md index bf309cfa95..b8f2905997 100644 --- a/src/authors/pichfl.md +++ b/src/authors/pichfl.md @@ -1,7 +1,8 @@ --- name: "Florian Pichler" github: pichfl -twitter: pichfl linkedin: pichfl +mastodon: "@fp@social.lol" +bluesky: pichfl.bsky.social bio: "Consultant for Technology and Design at Mainmatter" --- diff --git a/src/authors/real_ate.md b/src/authors/real_ate.md index f9346e3ea2..e2c8001af9 100644 --- a/src/authors/real_ate.md +++ b/src/authors/real_ate.md @@ -1,7 +1,7 @@ --- name: "Chris Manson" github: mansona -twitter: real_ate linkedin: realate +mastodon: "@real_ate@mastodon.social" bio: "Senior Software Engineer, Ember Learning Core Team member" --- diff --git a/src/authors/zeppelin.md b/src/authors/zeppelin.md index a13f42c344..74ca7469d3 100644 --- a/src/authors/zeppelin.md +++ b/src/authors/zeppelin.md @@ -1,7 +1,7 @@ --- name: "Gabor Babicz" github: zeppelin -twitter: xeppelin +mastodon: "@gabor@babicz.social" linkedin: xeppelin bio: "Senior Software Engineer" --- diff --git a/src/blog.njk b/src/blog.njk index 5d429b810c..1399c8e1d4 100644 --- a/src/blog.njk +++ b/src/blog.njk @@ -3,7 +3,7 @@ eleventyComputed: title: "Engineering, Design & Product Blog {% if pagination.pageNumber > 0 %} - Page {{ pagination.pageNumber + 1 }} {% endif %}" -description: "Frontend and JavaScript, Svelte and Ember, Rust and WASM, Elixir and Phoenix, Product and Design: Stay on top of what's happening." +description: "Frontend and JavaScript, Svelte and Ember, Rust and WASM, Elixir and Phoenix, Product and Design, Process and Tools: Stay on top of what's happening." permalink: "/blog/{% if pagination.pageNumber > 0 %}/page/{{ pagination.pageNumber + 1 }}/{% endif %}" layout: base pagination: @@ -51,7 +51,7 @@ eleventyNavigation: {% set 'content' = { - "title": "Grow your business with us", + "title": "Team up with us to go further!", "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" diff --git a/src/calendar/2019-05-25-emberginners.md b/src/calendar/2019-05-25-emberginners.md index abb4b6e92a..e2f1caec2a 100644 --- a/src/calendar/2019-05-25-emberginners.md +++ b/src/calendar/2019-05-25-emberginners.md @@ -6,6 +6,4 @@ url: https://www.meetup.com/Ember-js-Berlin/events/260668987/ kind: meetup --- -Mainmatter holds a JavaScript beginner workshop for women and non-binary people -that will guide attendees through building their first web application using -EmberJS. +Mainmatter holds a JavaScript beginner workshop for women and non-binary people that will guide attendees through building their first web application using EmberJS. diff --git a/src/calendar/2019-06-01-jsconfeu.md b/src/calendar/2019-06-01-jsconfeu.md index 92046abdd4..1063b83c0f 100644 --- a/src/calendar/2019-06-01-jsconfeu.md +++ b/src/calendar/2019-06-01-jsconfeu.md @@ -6,5 +6,4 @@ url: https://2019.jsconf.eu kind: conference --- -Our own [@jjordan_dev](https://twitter.com/jjordan_dev) will speak about -crafting accessible web comics for everyone. +Our own [@jjordan_dev](https://twitter.com/jjordan_dev) will speak about crafting accessible web comics for everyone. diff --git a/src/calendar/2019-06-22-commitporto.md b/src/calendar/2019-06-22-commitporto.md index 982cb96b5c..25b69a05d3 100644 --- a/src/calendar/2019-06-22-commitporto.md +++ b/src/calendar/2019-06-22-commitporto.md @@ -6,5 +6,4 @@ url: https://commitporto.com kind: conference --- -Ricardo Mendes will tell a story about the JavaScript hype cycles and how -Ember.js has managed to keep up with them. +Ricardo Mendes will tell a story about the JavaScript hype cycles and how Ember.js has managed to keep up with them. diff --git a/src/calendar/2019-07-10-fullstacklondon.md b/src/calendar/2019-07-10-fullstacklondon.md index 555212d5ac..8a26e83df9 100644 --- a/src/calendar/2019-07-10-fullstacklondon.md +++ b/src/calendar/2019-07-10-fullstacklondon.md @@ -6,5 +6,4 @@ url: https://skillsmatter.com/conferences/11213-fullstack-london-2019-the-confer kind: conference --- -Jessica Jordan will give a talk about crafting web comics for literally -everyone. +Jessica Jordan will give a talk about crafting web comics for literally everyone. diff --git a/src/calendar/2019-09-19-hiveconf.md b/src/calendar/2019-09-19-hiveconf.md index f17d22317c..07b40be6e9 100644 --- a/src/calendar/2019-09-19-hiveconf.md +++ b/src/calendar/2019-09-19-hiveconf.md @@ -6,5 +6,4 @@ url: http://hiveconf19.eventbrite.com kind: conference --- -Jessica Jordan will be joining the panel to talk about topics around Tech and -HR. +Jessica Jordan will be joining the panel to talk about topics around Tech and HR. diff --git a/src/calendar/2019-09-30-emberfest.md b/src/calendar/2019-09-30-emberfest.md index 34fe0dcfbd..96aeab5f3e 100644 --- a/src/calendar/2019-09-30-emberfest.md +++ b/src/calendar/2019-09-30-emberfest.md @@ -6,6 +6,4 @@ url: https://emberfest.eu kind: conference --- -EmberFest is back with a hybrid on-site/virtual event in September. We are -co-organizing the event and our team is looking forward to meeting up with the -Ember.js community in Rome. +EmberFest is back with a hybrid on-site/virtual event in September. We are co-organizing the event and our team is looking forward to meeting up with the Ember.js community in Rome. diff --git a/src/calendar/2019-10-17-emberfest.md b/src/calendar/2019-10-17-emberfest.md index 4ddb9345b9..ad69a1e89f 100644 --- a/src/calendar/2019-10-17-emberfest.md +++ b/src/calendar/2019-10-17-emberfest.md @@ -6,5 +6,4 @@ url: https://emberfest.eu kind: conference --- -We are co-organizing EmberFest and the team is looking forward to meeting up -with the Ember.js community in Copenhagen. +We are co-organizing EmberFest and the team is looking forward to meeting up with the Ember.js community in Copenhagen. diff --git a/src/calendar/2020-03-16-emberconf.md b/src/calendar/2020-03-16-emberconf.md index 5b0aec1e4c..c13ce9e446 100644 --- a/src/calendar/2020-03-16-emberconf.md +++ b/src/calendar/2020-03-16-emberconf.md @@ -6,5 +6,4 @@ url: https://emberconf.com/ kind: conference --- -EmberConf is the main yearly conference around all things Ember.js and the -Mainmatter team will be present in full force, delivering workshops and talks. +EmberConf is the main yearly conference around all things Ember.js and the Mainmatter team will be present in full force, delivering workshops and talks. diff --git a/src/calendar/2020-06-18-banking-innovation-forum.md b/src/calendar/2020-06-18-banking-innovation-forum.md index 46ed52a7ee..720d79db32 100644 --- a/src/calendar/2020-06-18-banking-innovation-forum.md +++ b/src/calendar/2020-06-18-banking-innovation-forum.md @@ -6,7 +6,4 @@ url: https://ict-solutions-events.com/2nd-annual-international-banking-innovatio kind: conference --- -The Banking Innovation Forum covers the latest trends, developments and -disrupting technology that will affect The Banking Industry. Marco Otte-Witte -will deliver a talk about how banks and FinTechs can leverage technology to -build better products. +The Banking Innovation Forum covers the latest trends, developments and disrupting technology that will affect The Banking Industry. Marco Otte-Witte will deliver a talk about how banks and FinTechs can leverage technology to build better products. diff --git a/src/calendar/2020-10-06-modern-re.md b/src/calendar/2020-10-06-modern-re.md index be6dc52a17..8a582c645a 100644 --- a/src/calendar/2020-10-06-modern-re.md +++ b/src/calendar/2020-10-06-modern-re.md @@ -6,7 +6,4 @@ url: https://www.modern-re.de kind: conference --- -Modern RE focusses on topics around requirements engineering and agile project -management. Marco Otte-Witte will deliver a talk about how bad patterns in -planning, management and project setup lead to dissatisfying results and how -teams can avoid them. +Modern RE focusses on topics around requirements engineering and agile project management. Marco Otte-Witte will deliver a talk about how bad patterns in planning, management and project setup lead to dissatisfying results and how teams can avoid them. diff --git a/src/calendar/2020-10-16-emberfest.md b/src/calendar/2020-10-16-emberfest.md index 324d891ee6..f15e3e93d1 100644 --- a/src/calendar/2020-10-16-emberfest.md +++ b/src/calendar/2020-10-16-emberfest.md @@ -6,6 +6,4 @@ url: https://emberfest.eu kind: conference --- -EmberFest is the European Community Ember Conference. While there will be no -actual conference in 2020, Chris Manson and Ricardo Mendes will lead a remote -Ember.js contributor workshop. +EmberFest is the European Community Ember Conference. While there will be no actual conference in 2020, Chris Manson and Ricardo Mendes will lead a remote Ember.js contributor workshop. diff --git a/src/calendar/2020-11-26-womentechmakers.md b/src/calendar/2020-11-26-womentechmakers.md index 0cb2683236..ac095c7b80 100644 --- a/src/calendar/2020-11-26-womentechmakers.md +++ b/src/calendar/2020-11-26-womentechmakers.md @@ -1,22 +1,11 @@ --- -title: - "[Women Techmakers Berlin] Version control in design: best practices for - collaboration" +title: "[Women Techmakers Berlin] Version control in design: best practices for collaboration" image: "/assets/images/calendar/2020-11-26-womentechmakers/logo.svg" location: Remote url: https://www.meetup.com/Women-Techmakers-Berlin/events/274409725/ kind: meetup --- -Women Techmakers Berlin has been encouraging diversity in tech in Berlin -since 2015. They strive for visibility, networking and resources to make the -tech community of Berlin inclusive. They are one of the most active chapters of -the global Women Techmakers program run by Google. +Women Techmakers Berlin has been encouraging diversity in tech in Berlin since 2015. They strive for visibility, networking and resources to make the tech community of Berlin inclusive. They are one of the most active chapters of the global Women Techmakers program run by Google. -On November 26th, Mar High will be giving a talk about version control in -design. Version control systems (VCS) have long been used by software engineers -to manage their codebases and collaborate effectively. In this talk, Mar will -explore best practices of VCS as they apply to user interface design, go over a -brief history, and analyze strengths and limitations of the most popular UI -design programs (Sketch & Adobe XD with Abstract, and Figma with Version -History). +On November 26th, Mar High will be giving a talk about version control in design. Version control systems (VCS) have long been used by software engineers to manage their codebases and collaborate effectively. In this talk, Mar will explore best practices of VCS as they apply to user interface design, go over a brief history, and analyze strengths and limitations of the most popular UI design programs (Sketch & Adobe XD with Abstract, and Figma with Version History). diff --git a/src/calendar/2020-12-10-onproduct.md b/src/calendar/2020-12-10-onproduct.md index 0dbefebbbd..f6c7346250 100644 --- a/src/calendar/2020-12-10-onproduct.md +++ b/src/calendar/2020-12-10-onproduct.md @@ -1,20 +1,11 @@ --- -title: - "[OnProduct #26] Version control in design: best practices for collaboration" +title: "[OnProduct #26] Version control in design: best practices for collaboration" image: "/assets/images/calendar/2020-12-10-onproduct/logo.svg" location: Remote url: https://www.meetup.com/OnProduct/events/274647325 kind: meetup --- -OnProduct is a meetup for product people in Berlin. Their goal is to create a -living community of designers, product managers, developers, QA engineers that -exchange ideas, best practices and know how. +OnProduct is a meetup for product people in Berlin. Their goal is to create a living community of designers, product managers, developers, QA engineers that exchange ideas, best practices and know how. -In case you miss the previous presentation, Mar High will share once again give -a talk about version control in design on December 10th. Version control systems -(VCS) have long been used by software engineers to manage their codebases and -collaborate effectively. In this talk, Mar will explore best practices of VCS as -they apply to user interface design, go over a brief history, and analyze -strengths and limitations of the most popular UI design programs (Sketch & Adobe -XD with Abstract, and Figma with Version History). +In case you miss the previous presentation, Mar High will share once again give a talk about version control in design on December 10th. Version control systems (VCS) have long been used by software engineers to manage their codebases and collaborate effectively. In this talk, Mar will explore best practices of VCS as they apply to user interface design, go over a brief history, and analyze strengths and limitations of the most popular UI design programs (Sketch & Adobe XD with Abstract, and Figma with Version History). diff --git a/src/calendar/2020-12-10-product-circle-london.md b/src/calendar/2020-12-10-product-circle-london.md index 4aa64d2296..0ad6f9587f 100644 --- a/src/calendar/2020-12-10-product-circle-london.md +++ b/src/calendar/2020-12-10-product-circle-london.md @@ -1,21 +1,11 @@ --- -title: - "[Product Circle London] The three pillars of effective digital product - development" +title: "[Product Circle London] The three pillars of effective digital product development" image: "/assets/images/calendar/2020-12-10-product-circle-london/logo.png" location: Remote url: https://www.meetup.com/Product-Circle/events/274691004/ kind: meetup --- -Product Circle is an opportunity for all PMO's, Product Owners, Project -Managers, Delivery Leads, and anyone involved in a Digital Product / Project -team to come and network as well as to discuss trends and topics. +Product Circle is an opportunity for all PMO's, Product Owners, Project Managers, Delivery Leads, and anyone involved in a Digital Product / Project team to come and network as well as to discuss trends and topics. -Mainmatter's founder and CEO Marco Otte-Witte will present at Product Circle's -Christmas Special and deliver a talk about the three pillars of effective -digital product development. In the talk, Marco will explain how successful -projects are scoped, planned and executed as well as what techniques and -strategies to avoid. He will also dive deep into how successful product teams -are structured and what is needed to establish an efficient infrastructure that -will support ambitious projects sustainably. +Mainmatter's founder and CEO Marco Otte-Witte will present at Product Circle's Christmas Special and deliver a talk about the three pillars of effective digital product development. In the talk, Marco will explain how successful projects are scoped, planned and executed as well as what techniques and strategies to avoid. He will also dive deep into how successful product teams are structured and what is needed to establish an efficient infrastructure that will support ambitious projects sustainably. diff --git a/src/calendar/2021-03-29-emberconf.md b/src/calendar/2021-03-29-emberconf.md index 0738ab88c6..f6a899c4f7 100644 --- a/src/calendar/2021-03-29-emberconf.md +++ b/src/calendar/2021-03-29-emberconf.md @@ -6,5 +6,4 @@ url: https://emberconf.com/ kind: conference --- -EmberConf 2021 is going virtual again and will be live-streamed everywhere. The -Mainmatter team will be around like every year, delivering workshops and talks. +EmberConf 2021 is going virtual again and will be live-streamed everywhere. The Mainmatter team will be around like every year, delivering workshops and talks. diff --git a/src/calendar/2022-09-22-emberfest.md b/src/calendar/2022-09-22-emberfest.md index 070d02037d..e3a4c48621 100644 --- a/src/calendar/2022-09-22-emberfest.md +++ b/src/calendar/2022-09-22-emberfest.md @@ -7,9 +7,4 @@ kind: conference color: purple --- -EmberFest is the European Community Ember Conference happening in Paris, from -the 22nd to the 23rd of September. If you’re looking for updates on the latest -and greatest in Ember and Glimmer this is the place to be. EmberFest is also a -great opportunity to get in touch with the European Ember Community (and friends -from abroad) and hiring Ember talent. Like every year, we’re happy to be -co-organizing the event! +EmberFest is the European Community Ember Conference happening in Paris, from the 22nd to the 23rd of September. If you’re looking for updates on the latest and greatest in Ember and Glimmer this is the place to be. EmberFest is also a great opportunity to get in touch with the European Ember Community (and friends from abroad) and hiring Ember talent. Like every year, we’re happy to be co-organizing the event! diff --git a/src/calendar/2022-10-13-eurorust.md b/src/calendar/2022-10-13-eurorust.md index 0c275a3ccc..69a1af3be8 100644 --- a/src/calendar/2022-10-13-eurorust.md +++ b/src/calendar/2022-10-13-eurorust.md @@ -7,6 +7,4 @@ kind: conference color: aqua --- -EuroRust is a 2 day conference for the European Rust community, organized by -Mainmatter. We cover all things Rust: from Rust patterns and idioms to systems -programming and CLI tooling, servers WASM, and embedded systems. +EuroRust is a 2 day conference for the European Rust community, organized by Mainmatter. We cover all things Rust: from Rust patterns and idioms to systems programming and CLI tooling, servers WASM, and embedded systems. diff --git a/src/calendar/2022-12-08-embereurope-london.md b/src/calendar/2022-12-08-embereurope-london.md index 1333e914c3..00d05092a9 100644 --- a/src/calendar/2022-12-08-embereurope-london.md +++ b/src/calendar/2022-12-08-embereurope-london.md @@ -7,8 +7,4 @@ kind: meetup color: aqua --- -Ember Europe is back in Q4 with the last event for the year, this time hosted by -CrowdStrike in London. The Ember Europe meetup series brings together the Ember -community from all of Europe once a quarter. The meetup is organized by -Mainmatter and Intercom as a hybrid event, hosted from a different city each -time with the option for people to join remotely as well. +Ember Europe is back in Q4 with the last event for the year, this time hosted by CrowdStrike in London. The Ember Europe meetup series brings together the Ember community from all of Europe once a quarter. The meetup is organized by Mainmatter and Intercom as a hybrid event, hosted from a different city each time with the option for people to join remotely as well. diff --git a/src/calendar/2023-03-23-embereurope-ghent.md b/src/calendar/2023-03-23-embereurope-ghent.md index 8d02c96b33..be5b2edc8b 100644 --- a/src/calendar/2023-03-23-embereurope-ghent.md +++ b/src/calendar/2023-03-23-embereurope-ghent.md @@ -7,7 +7,4 @@ kind: meetup color: purple --- -Ember Europe is back in 2023 with the first meetup of the year, hosted by OTA -Insight in Ghent, Belgium. The Ember Europe meetup series brings together the -Ember community from all of Europe once a quarter. The meetup is organized by -Mainmatter and Intercom. +Ember Europe is back in 2023 with the first meetup of the year, hosted by OTA Insight in Ghent, Belgium. The Ember Europe meetup series brings together the Ember community from all of Europe once a quarter. The meetup is organized by Mainmatter and Intercom. diff --git a/src/calendar/2023-04-20-elixirconf-eu.md b/src/calendar/2023-04-20-elixirconf-eu.md index 7bed1450c4..9bd948d933 100644 --- a/src/calendar/2023-04-20-elixirconf-eu.md +++ b/src/calendar/2023-04-20-elixirconf-eu.md @@ -7,7 +7,4 @@ kind: conference color: aqua --- -ElixirConf is a 2-day hybrid conference, gathering hundreds of developers with a -passion for Elixir to learn about, share and inspire the progression of the -Elixir ecosystem. Mainmatter will be supporting the conference as a silver -sponsor! +ElixirConf is a 2-day hybrid conference, gathering hundreds of developers with a passion for Elixir to learn about, share and inspire the progression of the Elixir ecosystem. Mainmatter will be supporting the conference as a silver sponsor! diff --git a/src/calendar/2023-04-20-rust-munich.md b/src/calendar/2023-04-20-rust-munich.md index a36f539240..acea33a335 100644 --- a/src/calendar/2023-04-20-rust-munich.md +++ b/src/calendar/2023-04-20-rust-munich.md @@ -7,5 +7,4 @@ kind: meetup color: purple --- -The next Rust meetup for Rust fans in and around Munich is happening on the 20th -of April. The meetup is hosted by Mainmatter at our office. +The next Rust meetup for Rust fans in and around Munich is happening on the 20th of April. The meetup is hosted by Mainmatter at our office. diff --git a/src/calendar/2023-05-08-magdeburger-developer-days.md b/src/calendar/2023-05-08-magdeburger-developer-days.md index 5cc57ccbda..47c8dd73b6 100644 --- a/src/calendar/2023-05-08-magdeburger-developer-days.md +++ b/src/calendar/2023-05-08-magdeburger-developer-days.md @@ -7,9 +7,4 @@ kind: conference color: aqua --- -Magdeburger Developer Days is a 3-day software engineering conference in -Magdeburg. Mainmatter Founder Marco Otte-Witte will talk about Continuous -Deployment Workflows. He will present main advantages compared to classical -processes, explain the essential components of such a process (especially with -regard to testing and automation), and discuss typical challenges and strategies -to overcome them. +Magdeburger Developer Days is a 3-day software engineering conference in Magdeburg. Mainmatter Founder Marco Otte-Witte will talk about Continuous Deployment Workflows. He will present main advantages compared to classical processes, explain the essential components of such a process (especially with regard to testing and automation), and discuss typical challenges and strategies to overcome them. diff --git a/src/calendar/2023-05-25-devdays-europe.md b/src/calendar/2023-05-25-devdays-europe.md index d2c6027266..2b22e86ea4 100644 --- a/src/calendar/2023-05-25-devdays-europe.md +++ b/src/calendar/2023-05-25-devdays-europe.md @@ -7,9 +7,4 @@ kind: conference color: purple --- -DevDays Europe is a 2-day software development conference covering the emerging -technologies and best practices in the software development industry – -regardless of technological platform or language. Mainmatter Founder Marco -Otte-Witte will discuss the state of the web development ecosystem for Rust, the -challenges that come with adopting it, and share some real-world examples to -show what’s possible in his talk "Get Ready to Rustle". +DevDays Europe is a 2-day software development conference covering the emerging technologies and best practices in the software development industry – regardless of technological platform or language. Mainmatter Founder Marco Otte-Witte will discuss the state of the web development ecosystem for Rust, the challenges that come with adopting it, and share some real-world examples to show what’s possible in his talk "Get Ready to Rustle". diff --git a/src/calendar/2023-06-15-embereurope-dublin.md b/src/calendar/2023-06-15-embereurope-dublin.md index 33dd3d5350..b687e9ebe3 100644 --- a/src/calendar/2023-06-15-embereurope-dublin.md +++ b/src/calendar/2023-06-15-embereurope-dublin.md @@ -7,7 +7,4 @@ kind: meetup color: purple --- -The second Ember Europe meetup of 2023 is happening on June 15th and is hosted -by Intercom at their Dublin office. The Ember Europe meetup series brings -together the Ember community from all of Europe once a quarter. The meetup is -organized by Mainmatter and Intercom. +The second Ember Europe meetup of 2023 is happening on June 15th and is hosted by Intercom at their Dublin office. The Ember Europe meetup series brings together the Ember community from all of Europe once a quarter. The meetup is organized by Mainmatter and Intercom. diff --git a/src/calendar/2023-07-20-emberconf.md b/src/calendar/2023-07-20-emberconf.md index 55118f5b42..bb14ebb2f2 100644 --- a/src/calendar/2023-07-20-emberconf.md +++ b/src/calendar/2023-07-20-emberconf.md @@ -7,6 +7,4 @@ kind: conference color: aqua --- -EmberConf is a 2-day Ember.js conference, taking place in Portland and online on -July 20th-21st. Nick Schot will be giving a workshop on animating Ember apps, -and Chris Manson will show how to build a modern Ember Addon. +EmberConf is a 2-day Ember.js conference, taking place in Portland and online on July 20th-21st. Nick Schot will be giving a workshop on animating Ember apps, and Chris Manson will show how to build a modern Ember Addon. diff --git a/src/calendar/2023-07-27-wearedevelopers.md b/src/calendar/2023-07-27-wearedevelopers.md index 2036b4ac23..4061f5ab47 100644 --- a/src/calendar/2023-07-27-wearedevelopers.md +++ b/src/calendar/2023-07-27-wearedevelopers.md @@ -7,9 +7,4 @@ kind: conference color: purple --- -WeAreDevelopers World Congress is a 2-day conference and the best place to get a -complete overview of recent insights and future trends in modern software -development. Mainmatter Founder Marco Otte-Witte will discuss the state of the -web development ecosystem for Rust, the challenges that come with adopting it, -and share some real-world examples to show what’s possible in his talk "Get -Ready to Rustle". +WeAreDevelopers World Congress is a 2-day conference and the best place to get a complete overview of recent insights and future trends in modern software development. Mainmatter Founder Marco Otte-Witte will discuss the state of the web development ecosystem for Rust, the challenges that come with adopting it, and share some real-world examples to show what’s possible in his talk "Get Ready to Rustle". diff --git a/src/calendar/2023-07-29-coscup.md b/src/calendar/2023-07-29-coscup.md index 73656b116d..a62622c027 100644 --- a/src/calendar/2023-07-29-coscup.md +++ b/src/calendar/2023-07-29-coscup.md @@ -7,7 +7,4 @@ kind: conference color: aqua --- -COSCUP is a 2-day conference for Open Source coders, users, and promoters taking -place in Taipei on July 29-30. Luca Palmieri will share his experience writing -“Zero to Production in Rust” covering all aspects from topic definition to -marketing and distribution of a technical book. +COSCUP is a 2-day conference for Open Source coders, users, and promoters taking place in Taipei on July 29-30. Luca Palmieri will share his experience writing “Zero to Production in Rust” covering all aspects from topic definition to marketing and distribution of a technical book. diff --git a/src/calendar/2023-09-13-stackconf.md b/src/calendar/2023-09-13-stackconf.md index 184148fa87..8b4960b14a 100644 --- a/src/calendar/2023-09-13-stackconf.md +++ b/src/calendar/2023-09-13-stackconf.md @@ -7,9 +7,4 @@ kind: conference color: purple --- -stackconf is a 2-day Open Source Infrastructure conference, covering solutions -in the spectrum of continuous integration, container, hybrid and cloud -technologies. Mainmatter's Founder Marco Otte-Witte will discuss the main -advantages of continuous deployment over traditional release processes, explain -the essential components of a continuous deployment infrastructure, and discuss -typical challenges and strategies to overcome them in his talk. +stackconf is a 2-day Open Source Infrastructure conference, covering solutions in the spectrum of continuous integration, container, hybrid and cloud technologies. Mainmatter's Founder Marco Otte-Witte will discuss the main advantages of continuous deployment over traditional release processes, explain the essential components of a continuous deployment infrastructure, and discuss typical challenges and strategies to overcome them in his talk. diff --git a/src/calendar/2023-09-21-emberfest.md b/src/calendar/2023-09-21-emberfest.md index 88e846eb08..55e89557e7 100644 --- a/src/calendar/2023-09-21-emberfest.md +++ b/src/calendar/2023-09-21-emberfest.md @@ -7,9 +7,4 @@ kind: conference color: aqua --- -EmberFest is the European Community Ember Conference, this year happening in -Madrid, from September 22nd to 23rd. If you’re looking for updates on the latest -and greatest in Ember and Glimmer this is the place to be. EmberFest is also a -great opportunity to get in touch with the European Ember Community (and friends -from abroad) and hiring Ember talent. Mainmatter is co-organizing the event and -our team will be in Madrid in full force! +EmberFest is the European Community Ember Conference, this year happening in Madrid, from September 22nd to 23rd. If you’re looking for updates on the latest and greatest in Ember and Glimmer this is the place to be. EmberFest is also a great opportunity to get in touch with the European Ember Community (and friends from abroad) and hiring Ember talent. Mainmatter is co-organizing the event and our team will be in Madrid in full force! diff --git a/src/calendar/2023-10-12-eurorust.md b/src/calendar/2023-10-12-eurorust.md index 29afb4c19f..bacdd4ab24 100644 --- a/src/calendar/2023-10-12-eurorust.md +++ b/src/calendar/2023-10-12-eurorust.md @@ -7,6 +7,4 @@ kind: conference color: aqua --- -EuroRust is a 2 day conference for the European Rust community, organized by -Mainmatter. We cover all things Rust: from Rust patterns and idioms to systems -programming and CLI tooling, servers WASM, and embedded systems. +EuroRust is a 2 day conference for the European Rust community, organized by Mainmatter. We cover all things Rust: from Rust patterns and idioms to systems programming and CLI tooling, servers WASM, and embedded systems. diff --git a/src/calendar/2023-10-25-rust-on-the-web.md b/src/calendar/2023-10-25-rust-on-the-web.md index 6208caab81..d9bdf64f4e 100644 --- a/src/calendar/2023-10-25-rust-on-the-web.md +++ b/src/calendar/2023-10-25-rust-on-the-web.md @@ -7,8 +7,4 @@ kind: meetup color: purple --- -We are running a meetup together with the Rust Paris meetup group to talk about -Rust for web and cloud applications. The event will be hosted by our friends at -Qonto in their office in Paris. Our Principal Engineering Consultant, Luca -Palmieri, will be moderating a panel on real world use cases and experiences -with Rust in production. +We are running a meetup together with the Rust Paris meetup group to talk about Rust for web and cloud applications. The event will be hosted by our friends at Qonto in their office in Paris. Our Principal Engineering Consultant, Luca Palmieri, will be moderating a panel on real world use cases and experiences with Rust in production. diff --git a/src/calendar/2023-10-27-portotechhub.md b/src/calendar/2023-10-27-portotechhub.md index d1075ddbaf..2ae7e806ef 100644 --- a/src/calendar/2023-10-27-portotechhub.md +++ b/src/calendar/2023-10-27-portotechhub.md @@ -7,8 +7,4 @@ kind: conference color: purple --- -Porto Tech Hub is the biggest tech conference in Porto, taking place on October -27th in Alfândega do Porto. Mainmatter Founder Marco Otte-Witte will discuss the -state of the web development ecosystem for Rust, the challenges that come with -adopting it, and share some real-world examples to show what’s possible in his -talk "Get Ready to Rustle". +Porto Tech Hub is the biggest tech conference in Porto, taking place on October 27th in Alfândega do Porto. Mainmatter Founder Marco Otte-Witte will discuss the state of the web development ecosystem for Rust, the challenges that come with adopting it, and share some real-world examples to show what’s possible in his talk "Get Ready to Rustle". diff --git a/src/calendar/2023-11-11-svelte-summit.md b/src/calendar/2023-11-11-svelte-summit.md index 87c29768fd..5aea45e56f 100644 --- a/src/calendar/2023-11-11-svelte-summit.md +++ b/src/calendar/2023-11-11-svelte-summit.md @@ -7,7 +7,4 @@ kind: summit color: aqua --- -Svelte Summit is an online conference dedicated to Svelte and everything that is -happening in the community. Mainmatter's Svelte expert Paolo Ricciuti will talk -about progressive enhancements in SvelteKit in his talk "Enhance!!!" and we are -supporting the event as a Gold Sponsor as well. +Svelte Summit is an online conference dedicated to Svelte and everything that is happening in the community. Mainmatter's Svelte expert Paolo Ricciuti will talk about progressive enhancements in SvelteKit in his talk "Enhance!!!" and we are supporting the event as a Gold Sponsor as well. diff --git a/src/calendar/2023-11-19-rustlabit.md b/src/calendar/2023-11-19-rustlabit.md index 0b74489fd0..75e77b69e3 100644 --- a/src/calendar/2023-11-19-rustlabit.md +++ b/src/calendar/2023-11-19-rustlabit.md @@ -7,7 +7,4 @@ kind: conference color: purple --- -RustLab is an international Rust conference taking place annually over the -course of two days: this year's event is hosted in Florence. Mainmatter's -Principal Engineering Consultant Luca Palmieri will discuss the current state -and shortcomings of pavex, a new Rust framework for building APIs, in his talk. +RustLab is an international Rust conference taking place annually over the course of two days: this year's event is hosted in Florence. Mainmatter's Principal Engineering Consultant Luca Palmieri will discuss the current state and shortcomings of pavex, a new Rust framework for building APIs, in his talk. diff --git a/src/calendar/2023-11-22-shsession.md b/src/calendar/2023-11-22-shsession.md index 3c6c654e29..7a4852bb5b 100644 --- a/src/calendar/2023-11-22-shsession.md +++ b/src/calendar/2023-11-22-shsession.md @@ -7,7 +7,4 @@ kind: meetup color: aqua --- -Schrodinger Session is a meetup series fully accessible and free for everyone, -organized by Schrödinger Hat. Mainmatter's Principal Engineering Consultant Luca -Palmieri will host the workshop "Learning Rust, one exercise at a time!", -covering all core concepts of the Rust programming language. +Schrodinger Session is a meetup series fully accessible and free for everyone, organized by Schrödinger Hat. Mainmatter's Principal Engineering Consultant Luca Palmieri will host the workshop "Learning Rust, one exercise at a time!", covering all core concepts of the Rust programming language. diff --git a/src/calendar/2023-12-07-embereurope-remote.md b/src/calendar/2023-12-07-embereurope-remote.md index 426b54a2c7..38e39afc83 100644 --- a/src/calendar/2023-12-07-embereurope-remote.md +++ b/src/calendar/2023-12-07-embereurope-remote.md @@ -7,9 +7,4 @@ kind: meetup color: purple --- -The final Ember Europe meetup of 2023 is happening on December 7th and will be -fully remote. Our Chris Manson will give an update on the progress made with the -Embroider initiative and answer questions in an Embroider AMA session together -with Ed Faulkner. The Ember Europe meetup series brings together the Ember -community from all of Europe once a quarter. The meetup is organized by -Mainmatter and Intercom. +The final Ember Europe meetup of 2023 is happening on December 7th and will be fully remote. Our Chris Manson will give an update on the progress made with the Embroider initiative and answer questions in an Embroider AMA session together with Ed Faulkner. The Ember Europe meetup series brings together the Ember community from all of Europe once a quarter. The meetup is organized by Mainmatter and Intercom. diff --git a/src/calendar/2023-12-11-ittage.md b/src/calendar/2023-12-11-ittage.md index bfe4bf6325..4e20ed900c 100644 --- a/src/calendar/2023-12-11-ittage.md +++ b/src/calendar/2023-12-11-ittage.md @@ -7,7 +7,4 @@ kind: conference color: aqua --- -Learn about the essential components of Continuous Deployment Workflows, their -main advantages, and typical challenges along with the strategies to overcome -them in Marco Otte-Witte's talk at IT-Tage. IT-Tage is a 4-day IT conference -happening in Frankfurt. +Learn about the essential components of Continuous Deployment Workflows, their main advantages, and typical challenges along with the strategies to overcome them in Marco Otte-Witte's talk at IT-Tage. IT-Tage is a 4-day IT conference happening in Frankfurt. diff --git a/src/calendar/2023-12-12-telemetry-rust-workshop.md b/src/calendar/2023-12-12-telemetry-rust-workshop.md index 88e3b04fe0..7523d77317 100644 --- a/src/calendar/2023-12-12-telemetry-rust-workshop.md +++ b/src/calendar/2023-12-12-telemetry-rust-workshop.md @@ -7,6 +7,4 @@ kind: workshop color: aqua --- -We are running a remote Rust Telemetry workshop over two afternoons in December. -Host Luca Palmieri will introduce you to a comprehensive toolkit to detect, -troubleshoot and resolve issues in your Rust applications. +We are running a remote Rust Telemetry workshop over two afternoons in December. Host Luca Palmieri will introduce you to a comprehensive toolkit to detect, troubleshoot and resolve issues in your Rust applications. diff --git a/src/calendar/2024-01-24-rust-day.md b/src/calendar/2024-01-24-rust-day.md index a6aeb646b9..9399640c77 100644 --- a/src/calendar/2024-01-24-rust-day.md +++ b/src/calendar/2024-01-24-rust-day.md @@ -7,7 +7,4 @@ kind: conference color: purple --- -Rust Day is an online event organized by WeAreDevelopers and fully dedicated to -Rust. Mainmatter's Principal Engineering Consultant Luca Palmieri will give an -introduction to Rustdoc's JSON format and discuss some of its possible usecases -in his talk. +Rust Day is an online event organized by WeAreDevelopers and fully dedicated to Rust. Mainmatter's Principal Engineering Consultant Luca Palmieri will give an introduction to Rustdoc's JSON format and discuss some of its possible usecases in his talk. diff --git a/src/calendar/2024-01-30-svelte-workshop.md b/src/calendar/2024-01-30-svelte-workshop.md index ff35676088..64c4c17505 100644 --- a/src/calendar/2024-01-30-svelte-workshop.md +++ b/src/calendar/2024-01-30-svelte-workshop.md @@ -7,7 +7,4 @@ kind: workshop color: purple --- -We are running a remote hands-on Svelte and SvelteKit workshop over three -afternoons from January 30th to February 1st. Hosts Florian Pichler and Paolo -Ricciuti take participants through the entire process of building a real-world, -progressively enhanced SvelteKit application. +We are running a remote hands-on Svelte and SvelteKit workshop over three afternoons from January 30th to February 1st. Hosts Florian Pichler and Paolo Ricciuti take participants through the entire process of building a real-world, progressively enhanced SvelteKit application. diff --git a/src/calendar/2024-02-07-rust-for-the-web.md b/src/calendar/2024-02-07-rust-for-the-web.md index 5521ad3a20..dbbab4126f 100644 --- a/src/calendar/2024-02-07-rust-for-the-web.md +++ b/src/calendar/2024-02-07-rust-for-the-web.md @@ -7,9 +7,4 @@ kind: meetup color: purple --- -We are running an event together with Shuttle, Vortexa, and the Rust London -meetup group focused on using Rust for web development. The event will be hosted -by TrueLayer in London on Feb. 7th, 2024. Our Principal Engineering Consultant, -Luca Palmieri, will present the playbook for successful Rust adoption as well as -moderate a panel talking about success stories and challenges with David Cole -from Arwen.ai and Nodar Daneliya from Shuttle. +We are running an event together with Shuttle, Vortexa, and the Rust London meetup group focused on using Rust for web development. The event will be hosted by TrueLayer in London on Feb. 7th, 2024. Our Principal Engineering Consultant, Luca Palmieri, will present the playbook for successful Rust adoption as well as moderate a panel talking about success stories and challenges with David Cole from Arwen.ai and Nodar Daneliya from Shuttle. diff --git a/src/calendar/2024-02-23-svelte-workshop.md b/src/calendar/2024-02-23-svelte-workshop.md index b63fae4e4c..0c440d930d 100644 --- a/src/calendar/2024-02-23-svelte-workshop.md +++ b/src/calendar/2024-02-23-svelte-workshop.md @@ -7,6 +7,4 @@ kind: workshop color: purple --- -We are running a free, one-day, Svelte and SvelteKit introductory workshop in -Munich, hosted by our friends at Experteer in their office. The workshop is held -by Svelte Ambassador Paolo Ricciuti and Mainmatter's Founder Marco Otte-Witte. +We are running a free, one-day, Svelte and SvelteKit introductory workshop in Munich, hosted by our friends at Experteer in their office. The workshop is held by Svelte Ambassador Paolo Ricciuti and Mainmatter's Founder Marco Otte-Witte. diff --git a/src/calendar/2024-02-29-devworld.md b/src/calendar/2024-02-29-devworld.md index 66b679c47b..c893d6aa5b 100644 --- a/src/calendar/2024-02-29-devworld.md +++ b/src/calendar/2024-02-29-devworld.md @@ -7,6 +7,4 @@ kind: conference color: aqua --- -DevWorld is a 2-Day Festival of Tech with Developers from around the Planet, -taking place in Amsterdam on February 29th to March 1st. Mainmatter's Principal -Engineering Consultant Luca Palmieri will give a talk on Rust for Backend. +DevWorld is a 2-Day Festival of Tech with Developers from around the Planet, taking place in Amsterdam on February 29th to March 1st. Mainmatter's Principal Engineering Consultant Luca Palmieri will give a talk on Rust for Backend. diff --git a/src/calendar/2024-03-21-embereurope-remote.md b/src/calendar/2024-03-21-embereurope-remote.md index fde526ec83..763bd92eae 100644 --- a/src/calendar/2024-03-21-embereurope-remote.md +++ b/src/calendar/2024-03-21-embereurope-remote.md @@ -7,8 +7,4 @@ kind: meetup color: purple --- -The first Ember Europe meetup of 2024 is taking place remotely on March 21st. -Our Chris Manson will give an update on the progress made with the Embroider -initiative and show the current state of Vite support with Embroider. The Ember -Europe meetup series brings together the Ember community from all of Europe once -a quarter. The meetup is organized by Mainmatter. +The first Ember Europe meetup of 2024 is taking place remotely on March 21st. Our Chris Manson will give an update on the progress made with the Embroider initiative and show the current state of Vite support with Embroider. The Ember Europe meetup series brings together the Ember community from all of Europe once a quarter. The meetup is organized by Mainmatter. diff --git a/src/calendar/2024-03-26-rust-nation.md b/src/calendar/2024-03-26-rust-nation.md index c86e0f4b4a..4e4c3c0ef4 100644 --- a/src/calendar/2024-03-26-rust-nation.md +++ b/src/calendar/2024-03-26-rust-nation.md @@ -7,9 +7,4 @@ kind: conference color: aqua --- -Rust Nation is the first UK conference dedicated to the Rust language. It will -be held in London on March 26th to 28th. Mainmatter's Principal Engineering -Consultant Luca Palmieri will discuss the current state of Rust's web ecosystem -and the reasons for starting pavex, a new Rust framework for building APIs, in -his talk. Luca will also host the expert workshop "Testing for Rust projects: -going beyond the basics". +Rust Nation is the first UK conference dedicated to the Rust language. It will be held in London on March 26th to 28th. Mainmatter's Principal Engineering Consultant Luca Palmieri will discuss the current state of Rust's web ecosystem and the reasons for starting pavex, a new Rust framework for building APIs, in his talk. Luca will also host the expert workshop "Testing for Rust projects: going beyond the basics". diff --git a/src/calendar/2024-04-15-testing-for-rust-projects.md b/src/calendar/2024-04-15-testing-for-rust-projects.md index 3bfb23768a..3696e349ee 100644 --- a/src/calendar/2024-04-15-testing-for-rust-projects.md +++ b/src/calendar/2024-04-15-testing-for-rust-projects.md @@ -7,6 +7,4 @@ kind: workshop color: aqua --- -We are running a remote Rust workshop over two afternoons on April 15th & 16th, -hosted by Luca Palmieri. Luca will present advanced testing patterns for Rust -projects. +We are running a remote Rust workshop over two afternoons on April 15th & 16th, hosted by Luca Palmieri. Luca will present advanced testing patterns for Rust projects. diff --git a/src/calendar/2024-04-18-elixirconf-eu.md b/src/calendar/2024-04-18-elixirconf-eu.md index eefdd56384..76f88580c2 100644 --- a/src/calendar/2024-04-18-elixirconf-eu.md +++ b/src/calendar/2024-04-18-elixirconf-eu.md @@ -7,6 +7,4 @@ kind: conference color: purple --- -ElixirConf is a 2-day hybrid conference, gathering hundreds of developers with a -passion for Elixir to learn about, share and inspire the progression of the -Elixir ecosystem. We are supporting the conference as a silver sponsor! +ElixirConf is a 2-day hybrid conference, gathering hundreds of developers with a passion for Elixir to learn about, share and inspire the progression of the Elixir ecosystem. We are supporting the conference as a silver sponsor! diff --git a/src/calendar/2024-04-23-rust-for-the-web.md b/src/calendar/2024-04-23-rust-for-the-web.md index 97c5bc832f..8a416ffd18 100644 --- a/src/calendar/2024-04-23-rust-for-the-web.md +++ b/src/calendar/2024-04-23-rust-for-the-web.md @@ -7,7 +7,4 @@ kind: meetup color: aqua --- -We are running an event together with the Rust Berlin meetup group focused on -using Rust for web development. The event is happening at Bauhaus, in Berlin, on -April 23rd. Our Principal Engineering Consultant, Luca Palmieri, will moderate a -panel featuring Ryan Levick and Jonas Dohse. +We are running an event together with the Rust Berlin meetup group focused on using Rust for web development. The event is happening at Bauhaus, in Berlin, on April 23rd. Our Principal Engineering Consultant, Luca Palmieri, will moderate a panel featuring Ryan Levick and Jonas Dohse. diff --git a/src/calendar/2024-04-27-svelte-summit-spring.md b/src/calendar/2024-04-27-svelte-summit-spring.md index 1f75fb30cf..837d1e5010 100644 --- a/src/calendar/2024-04-27-svelte-summit-spring.md +++ b/src/calendar/2024-04-27-svelte-summit-spring.md @@ -7,6 +7,4 @@ kind: summit color: aqua --- -Svelte Summit is an online conference dedicated to Svelte and everything that is -happening in the community. Mainmatter's Svelte expert Paolo Ricciuti will talk -about full-stack testing for SvelteKit applications. +Svelte Summit is an online conference dedicated to Svelte and everything that is happening in the community. Mainmatter's Svelte expert Paolo Ricciuti will talk about full-stack testing for SvelteKit applications. diff --git a/src/calendar/2024-05-07-advanced-developers-conference.md b/src/calendar/2024-05-07-advanced-developers-conference.md index d5064938fe..52e6db1422 100644 --- a/src/calendar/2024-05-07-advanced-developers-conference.md +++ b/src/calendar/2024-05-07-advanced-developers-conference.md @@ -7,8 +7,4 @@ kind: conference color: purple --- -ADC 24 is taking place in Regensburg's Jahnstadion on May 6th to 8th. Mainmatter -Founder Marco Otte-Witte will present the state of the web development ecosystem -for Rust, reasons for adopting Rust for web developments, challenges that come -with that, and share some real-world examples to show what’s possible in his -talk "Get Ready to Rustle". +ADC 24 is taking place in Regensburg's Jahnstadion on May 6th to 8th. Mainmatter Founder Marco Otte-Witte will present the state of the web development ecosystem for Rust, reasons for adopting Rust for web developments, challenges that come with that, and share some real-world examples to show what’s possible in his talk "Get Ready to Rustle". diff --git a/src/calendar/2024-05-28-telemetry-rust-workshop.md b/src/calendar/2024-05-28-telemetry-rust-workshop.md index 2bb8773d16..6b746b449d 100644 --- a/src/calendar/2024-05-28-telemetry-rust-workshop.md +++ b/src/calendar/2024-05-28-telemetry-rust-workshop.md @@ -1,6 +1,5 @@ --- -title: - "Remote Workshop: Telemetry for Rust APIs – you can't fix what you can't see" +title: "Remote Workshop: Telemetry for Rust APIs – you can't fix what you can't see" image: "/assets/images/calendar/2024-05-28-telemetry-rust-workshop/rust.png" location: "Online" url: https://ti.to/mainmatter/rust-telemetry-may-2024 @@ -8,6 +7,4 @@ kind: workshop color: aqua --- -We are running a remote Rust Telemetry workshop over two afternoons on May 28th -& 29th. Host Luca Palmieri will introduce a comprehensive toolkit to detect, -troubleshoot and resolve issues in your Rust applications. +We are running a remote Rust Telemetry workshop over two afternoons on May 28th & 29th. Host Luca Palmieri will introduce a comprehensive toolkit to detect, troubleshoot and resolve issues in your Rust applications. diff --git a/src/calendar/2024-05-30-rust-for-the-web.md b/src/calendar/2024-05-30-rust-for-the-web.md index a2b8a190d3..570b304fc9 100644 --- a/src/calendar/2024-05-30-rust-for-the-web.md +++ b/src/calendar/2024-05-30-rust-for-the-web.md @@ -7,7 +7,4 @@ kind: meetup color: aqua --- -We are running an event together with the Barcelona Rust meetup group focused on -using Rust for web development. The event is happening at AdevintaSpain, in -Barcelona, on May 30th. Our Principal Engineering Consultant, Luca Palmieri, -will moderate a panel featuring Matilda Smeds and Gleb Pomykalov. +We are running an event together with the Barcelona Rust meetup group focused on using Rust for web development. The event is happening at AdevintaSpain, in Barcelona, on May 30th. Our Principal Engineering Consultant, Luca Palmieri, will moderate a panel featuring Matilda Smeds and Gleb Pomykalov. diff --git a/src/calendar/2024-05-31-emberconf.md b/src/calendar/2024-05-31-emberconf.md index a610909cbf..cb9228ac4e 100644 --- a/src/calendar/2024-05-31-emberconf.md +++ b/src/calendar/2024-05-31-emberconf.md @@ -7,7 +7,4 @@ kind: conference color: purple --- -EmberConf is taking place in New York and online on May 31st. Chris Manson will -discuss how ember-cli’s old Emberisms were translated to modern JavaScript -tooling like ViteJs and more updates on Embroider and the -[Embroider initiative](/ember-initiative/). +EmberConf is taking place in New York and online on May 31st. Chris Manson will discuss how ember-cli’s old Emberisms were translated to modern JavaScript tooling like ViteJs and more updates on Embroider and the [Embroider initiative](/ember-initiative/). diff --git a/src/calendar/2024-07-18-embereurope-remote.md b/src/calendar/2024-07-18-embereurope-remote.md index 0aa03c9c4f..d3f9d4d9f3 100644 --- a/src/calendar/2024-07-18-embereurope-remote.md +++ b/src/calendar/2024-07-18-embereurope-remote.md @@ -10,7 +10,4 @@ hero: imageAlt: "A tiled background of European flags" --- -We are back with our Q2 2024 event in July (yes, we're doing a Q2 event in Q3). -Join remotely on July 18th starting from 19:00 CEST. The Ember Europe meetup -series brings together the Ember community from all of Europe once a quarter. -The meetup is organized by Mainmatter and Intercom. +We are back with our Q2 2024 event in July (yes, we're doing a Q2 event in Q3). Join remotely on July 18th starting from 19:00 CEST. The Ember Europe meetup series brings together the Ember community from all of Europe once a quarter. The meetup is organized by Mainmatter and Intercom. diff --git a/src/calendar/2024-09-12-emberfest.md b/src/calendar/2024-09-12-emberfest.md index 2eb5dc38e9..6714ab846f 100644 --- a/src/calendar/2024-09-12-emberfest.md +++ b/src/calendar/2024-09-12-emberfest.md @@ -10,9 +10,4 @@ hero: imageAlt: "EmberFest Venue, Williams & Woods" --- -EmberFest is the European Community Ember Conference, this year happening in -Dublin, on September 12th & 13th. If you’re looking for updates on the latest -and greatest in Ember and Glimmer this is the place to be. EmberFest is also a -great opportunity to get in touch with the European Ember Community (and friends -from abroad) and hiring Ember talent. Mainmatter is co-organizing the event and -our team will be in Dublin in full force! +EmberFest is the European Community Ember Conference, this year happening in Dublin, on September 12th & 13th. If you’re looking for updates on the latest and greatest in Ember and Glimmer this is the place to be. EmberFest is also a great opportunity to get in touch with the European Ember Community (and friends from abroad) and hiring Ember talent. Mainmatter is co-organizing the event and our team will be in Dublin in full force! diff --git a/src/calendar/2024-10-03-vite-conf.md b/src/calendar/2024-10-03-vite-conf.md new file mode 100644 index 0000000000..5a55b715e7 --- /dev/null +++ b/src/calendar/2024-10-03-vite-conf.md @@ -0,0 +1,13 @@ +--- +title: "ViteConf" +image: "/assets/images/calendar/2024-10-03-viteconf-24/viteconf-logo.png" +location: Online +url: https://viteconf.org/ +kind: conference +color: purple +hero: + image: "/assets/images/hero/viteconf-24.png" + imageAlt: "ViteConf pyramid." +--- + +ViteConf 2024 will be held online on October 3rd and 4th. Mainmatter’s Chris Manson, will present “Ember’s Journey to Build with Vite”. His talk will cover how Ember.js developers can now, after the successful Embroider initiative, use Vite to build their applications, offering a new approach for Ember development. diff --git a/src/calendar/2024-10-10-eurorust.md b/src/calendar/2024-10-10-eurorust.md index 9ddb7910e1..27f91748e6 100644 --- a/src/calendar/2024-10-10-eurorust.md +++ b/src/calendar/2024-10-10-eurorust.md @@ -10,6 +10,4 @@ hero: imageAlt: "A conference room of attendees." --- -EuroRust is a 2 day conference for the European Rust community, organized by -Mainmatter. We cover all things Rust: from Rust patterns and idioms to systems -programming and CLI tooling, servers WASM, and embedded systems. +EuroRust is a 2 day conference for the European Rust community, organized by Mainmatter. We cover all things Rust: from Rust patterns and idioms to systems programming and CLI tooling, servers WASM, and embedded systems. diff --git a/src/calendar/2024-11-19-embereuropeq4-remote.md b/src/calendar/2024-11-19-embereuropeq4-remote.md new file mode 100644 index 0000000000..50105530c7 --- /dev/null +++ b/src/calendar/2024-11-19-embereuropeq4-remote.md @@ -0,0 +1,13 @@ +--- +title: "Ember Europe Q4 Meetup" +image: "/assets/images/calendar/2024-11-19-embereuropeq4-remote/logo.png" +location: Remote +url: https://www.meetup.com/ember-europe/events/304061078/ +kind: meetup +color: purple +hero: + image: "/assets/images/calendar/2024-11-19-embereuropeq4-remote/embereurope.png" + imageAlt: "A tiled background of European flags" +--- + +We’re back with our Q4 2024 event! Join us remotely on November 19th, starting at 19:00 CET. The Ember Europe meetup series connects the Ember community from across Europe every quarter. diff --git a/src/calendar/2024-11-27-wey-wey-web.md b/src/calendar/2024-11-27-wey-wey-web.md new file mode 100644 index 0000000000..73ec70dc3b --- /dev/null +++ b/src/calendar/2024-11-27-wey-wey-web.md @@ -0,0 +1,13 @@ +--- +title: "Wey Wey Web" +image: "/assets/images/calendar/2024-11-27-weyweyweb/weyweyweb-logo.png" +location: ESAD, Malaga, Spain +url: https://www.weyweyweb.com/ +kind: conference +color: purple +hero: + image: "/assets/images/hero/weyweyweb-malaga-spain.jpg" + imageAlt: "The view of Málaga, Spain." +--- + +Wey Wey Web is an annual conference for UI enthusiasts, taking place in Málaga, Spain, this year. Mainmatter’s full-stack web developer, Paolo Ricciuti, will lead a workshop titled “Svelte and SvelteKit - From 0 to Fullstack,” where attendees will learn Svelte from the basics, progressing from a syntax showcase to building a fully scalable, full-stack, progressively enhanced application. diff --git a/src/calendar/2024-11-28-rust-hack-and-learn-with-mainmatter-and-otto.md b/src/calendar/2024-11-28-rust-hack-and-learn-with-mainmatter-and-otto.md new file mode 100644 index 0000000000..d3f37dbf2f --- /dev/null +++ b/src/calendar/2024-11-28-rust-hack-and-learn-with-mainmatter-and-otto.md @@ -0,0 +1,13 @@ +--- +title: "Rust Hack & Learn with Mainmatter & Otto" +image: "/assets/images/calendar/2024-11-28-rust-hack-and-learn-with-mainmatter-and-otto/rust.png" +location: "Hamburg" +url: https://www.meetup.com/rust-meetup-hamburg/events/303898286/ +kind: meetup +color: aqua +hero: + image: "/assets/images/hero/hamburg.png" + imageAlt: "The view of Hamburg" +--- + +We're hosting an event in collaboration with the Rust Hamburg meetup group and Otto in November. The event will take place at Otto's Collabor8 space in Hamburg, on November 28th. Mainmatter's Founder, Marco Otte-Witte, will introduce [gerust](https://github.com/mainmatter/gerust), a project generator and manager for Rust backend projects. diff --git a/src/calendar/2025-05-05-rust-workshop-adc.md b/src/calendar/2025-05-05-rust-workshop-adc.md new file mode 100644 index 0000000000..3216b27aee --- /dev/null +++ b/src/calendar/2025-05-05-rust-workshop-adc.md @@ -0,0 +1,13 @@ +--- +title: "100 Exercises to Learn Rust at ADC" +image: "/assets/images/calendar/2025-05-05-rust-workshop-adc/rust.png" +location: "Regensburg & Online" +url: https://adc.ms/25/Workshops +kind: workshop +color: purple +hero: + image: "/assets/images/hero/Regensburg.png" + imageAlt: "The view of Regensburg" +--- + +Join our 100 Exercises to Learn Rust workshop at ADC 2024 in Regensburg! This hands-on session, led by Marco Otte-Witte, introduces Rust fundamentals – from syntax to the Rust ecosystem – through 100 practical exercises you can complete at your own pace. Designed for developers with experience in any programming language, with materials in English and questions welcome in German or English. diff --git a/src/calendar/2025-05-08-svelte-summit.md b/src/calendar/2025-05-08-svelte-summit.md new file mode 100644 index 0000000000..8f7c5dcbf7 --- /dev/null +++ b/src/calendar/2025-05-08-svelte-summit.md @@ -0,0 +1,13 @@ +--- +title: "Svelte Summit Spring 2025" +image: "/assets/images/calendar/2025-05-08-svelte-summit/svelte.png" +location: "Barcelona & Online" +url: https://www.sveltesummit.com +kind: conference +color: aqua +hero: + image: "/assets/images/calendar/2025-05-08-svelte-summit/venue.jpg" + imageAlt: "View of the Svelte Summit venue in Barcelona: a courtyard with concrete floor, tablees with chairs and light garlands." +--- + +We're co-organizing Svelte Summit Spring 2025 in Barcelona together with our friends from Svelte Society. Rich Harris, the creator of Svelte, will join us for a talk on-site in Barcelona. Mainmatter will run a workshops on the day before the main conference. diff --git a/src/calendar/2025-10-09-eurorust.md b/src/calendar/2025-10-09-eurorust.md new file mode 100644 index 0000000000..3209417659 --- /dev/null +++ b/src/calendar/2025-10-09-eurorust.md @@ -0,0 +1,13 @@ +--- +title: "EuroRust 2025" +image: "/assets/images/calendar/2025-10-09-eurorust/rust.png" +location: "Paris & Online" +url: https://eurorust.eu +kind: conference +color: purple +hero: + image: "/assets/images/calendar/2025-10-09-eurorust/paris.jpg" + imageAlt: "View of a Parisian street with the Eiffel tower in the background" +--- + +EuroRust is a 2 day conference for the European Rust community. It covers all things Rust: from Rust patterns and idioms to system programming and CLI tooling, servers WASM and embedded systems. Mainmatter will host EuroRust 2025 in Paris and online. diff --git a/src/cases/ais.md b/src/cases/ais.md index 3bde889cfa..f8eec907bd 100644 --- a/src/cases/ais.md +++ b/src/cases/ais.md @@ -3,17 +3,10 @@ layout: case-study company: AIS title: An MVP for an IT security dashboard | Work problem: AIS wanted to be able to supervise their metrics with a dashboard. -solution: - We helped defining and shaping the goal as well as designed and implemented a - finished MVP. +solution: We helped defining and shaping the goal as well as designed and implemented a finished MVP. tags: Launch your idea displayTitle: "An MVP for an IT infrastructure security dashboard" -description: -

AIS provides continuous monitoring of companies' external assets, allowing - to proactively secure their attack surfaces.

Having built the core of - their product in-house, they approached Mainmatter for support with building a - web frontend for it. We conceptualized, designed and developed the application - in 6 weeks, guiding AIS\' team along the way.

+description:

AIS provides continuous monitoring of companies' external assets, allowing to proactively secure their attack surfaces.

Having built the core of their product in-house, they approached Mainmatter for support with building a web frontend for it. We conceptualized, designed and developed the application in 6 weeks, guiding AIS\' team along the way.

hero: color: purple image: "/assets/images/work/ais.jpg" diff --git a/src/cases/aleph-alpha.md b/src/cases/aleph-alpha.md index 67a9966556..63afe9d35f 100644 --- a/src/cases/aleph-alpha.md +++ b/src/cases/aleph-alpha.md @@ -1,20 +1,12 @@ --- layout: case-study company: Aleph Alpha -problem: - Aleph Alpha wanted to take advantage of Rust’s built-in efficiency for their - latest learning model. +problem: Aleph Alpha wanted to take advantage of Rust’s built-in efficiency for their latest learning model. solution: We provided the know-how to build the infrastructure. tags: Team reinforcement title: Preprocessing trillions of tokens with Rust | Work displayTitle: "Preprocessing trillions of tokens with Rust" -description: -

Aleph Alpha empowers businesses and governments with the most advanced - generative AI technology, to gain a decisive edge in the thriving AI - economy.

Training AI models requires preprocessing large amounts of - data. When Aleph Alpha set out to leverage Rust to prepare the training - dataset for their new model, they reached out to Mainmatter for support in - architecting and implementing a scalable and efficient data pipeline.

+description:

Aleph Alpha empowers businesses and governments with the most advanced generative AI technology, to gain a decisive edge in the thriving AI economy.

Training AI models requires preprocessing large amounts of data. When Aleph Alpha set out to leverage Rust to prepare the training dataset for their new model, they reached out to Mainmatter for support in architecting and implementing a scalable and efficient data pipeline.

hero: color: purple image: "/assets/images/work/aleph-alpha-background-2.jpg" @@ -24,8 +16,7 @@ og: image: /assets/images/cases/cs-aleph-alpha-og-image.jpg --- -{% from "image-aspect-ratio.njk" import imageAspectRatio %} -{% from "quote.njk" import quote %} +{% from "image-aspect-ratio.njk" import imageAspectRatio %} {% from "quote.njk" import quote %}

About Aleph Alpha

diff --git a/src/cases/asilimia.md b/src/cases/asilimia.md index 36b3774796..cb5f6a1791 100644 --- a/src/cases/asilimia.md +++ b/src/cases/asilimia.md @@ -2,11 +2,7 @@ layout: case-study company: Asilimia tags: Team reinforcement -description: -

Asilimia is a Kenyan digital payment application tailored for micro and - small businesses in Sub-Saharan Africa.

Mainmatter facilitated two - remote product design sprints to ideate, prototype, validate and test - product-market fit of its new bookkeeping features.

+description:

Asilimia is a Kenyan digital payment application tailored for micro and small businesses in Sub-Saharan Africa.

Mainmatter facilitated two remote product design sprints to ideate, prototype, validate and test product-market fit of its new bookkeeping features.

hero: tags: "design sprint" permalink: false diff --git a/src/cases/auditboard.md b/src/cases/auditboard.md index d9ac44bae5..f588d9e77b 100644 --- a/src/cases/auditboard.md +++ b/src/cases/auditboard.md @@ -1,17 +1,10 @@ --- layout: case-study company: Auditboard -problem: - AuditBoard needed senior developers to translate their entire application. -solution: - We took it on so they didn’t have to disrupt their roadmap to get it done. +problem: AuditBoard needed senior developers to translate their entire application. +solution: We took it on so they didn’t have to disrupt their roadmap to get it done. tags: Team reinforcement -description: -

Auditboard enables companies to elevate their audit, risk, and compliance - teams with their online risk management platform.

Their application was - only available in english when they approached us for support with - localization. We set up an architecture and migrated their code automatically, - saving their team months of effort.

+description:

Auditboard enables companies to elevate their audit, risk, and compliance teams with their online risk management platform.

Their application was only available in english when they approached us for support with localization. We set up an architecture and migrated their code automatically, saving their team months of effort.

hero: tags: "development / Ember.js / Format.js" permalink: false diff --git a/src/cases/bmw-car-it.md b/src/cases/bmw-car-it.md index 004a5f2e8f..08c291bdfb 100644 --- a/src/cases/bmw-car-it.md +++ b/src/cases/bmw-car-it.md @@ -1,17 +1,10 @@ --- layout: case-study company: BMW Car IT -problem: - BMW Car IT was looking to get a group of developers up to speed with Rust. -solution: - We ran a 4-day mixed on-site and remote workshop for them, covering all the - topics they needed to know. +problem: BMW Car IT was looking to get a group of developers up to speed with Rust. +solution: We ran a 4-day mixed on-site and remote workshop for them, covering all the topics they needed to know. tags: Workshops -description: -

BMW Car IT develops software for infotainment and autonomous - driving.

When they wanted to get a team of developers up to speed with - Rust, they reached out to Mainmatter. We ran a workshop for them, giving them - a smooth entry to Rust.

+description:

BMW Car IT develops software for infotainment and autonomous driving.

When they wanted to get a team of developers up to speed with Rust, they reached out to Mainmatter. We ran a workshop for them, giving them a smooth entry to Rust.

hero: tags: "Rust / training" permalink: false diff --git a/src/cases/camilyo.md b/src/cases/camilyo.md index d58c3f465d..3900c1417a 100644 --- a/src/cases/camilyo.md +++ b/src/cases/camilyo.md @@ -2,16 +2,9 @@ layout: case-study company: Camilyo problem: Camilyo's codebase lacked tests which slowed down velocity. -solution: - We introduced solid testing practices and based on those, modernized the - codebase. +solution: We introduced solid testing practices and based on those, modernized the codebase. tags: Tech Modernization -description: -

Camilyo is an integrated marketing platform for online service - providers.

Mainmatter supported their team with identifying and fixing - issues in their Ember.js applications, improving their testing practices, - adopting modern Ember.js patterns and leveling up their team along the - way.

+description:

Camilyo is an integrated marketing platform for online service providers.

Mainmatter supported their team with identifying and fixing issues in their Ember.js applications, improving their testing practices, adopting modern Ember.js patterns and leveling up their team along the way.

hero: tags: "development / mentoring / Ember.js" permalink: false diff --git a/src/cases/cardstack.md b/src/cases/cardstack.md index 83e707bd48..3ca892cd98 100644 --- a/src/cases/cardstack.md +++ b/src/cases/cardstack.md @@ -2,11 +2,7 @@ layout: case-study company: Cardstack tags: Team reinforcement -description: -

Cardstack builds the experience layer for a decentralized - internet.

Mainmatter helped them complete their Card UI system and - validate its abilities in various prototype projects, identifying and fixing - some issues in their core framework along the way.

+description:

Cardstack builds the experience layer for a decentralized internet.

Mainmatter helped them complete their Card UI system and validate its abilities in various prototype projects, identifying and fixing some issues in their core framework along the way.

hero: tags: "development / Ember.js" permalink: false diff --git a/src/cases/clark.md b/src/cases/clark.md index 842b69216d..c6a5765c61 100644 --- a/src/cases/clark.md +++ b/src/cases/clark.md @@ -2,12 +2,7 @@ layout: case-study company: CLARK tags: Team reinforcement -description: -

CLARK is a leading insurance broker app in the DACH region.

They - approached Mainmatter when they were looking for guidance on how to solidify - the codebase of their insurance management app. We conducted a thorough - review, presented the report to the team and layed out a plan for addressing - the identified issues.

+description:

CLARK is a leading insurance broker app in the DACH region.

They approached Mainmatter when they were looking for guidance on how to solidify the codebase of their insurance management app. We conducted a thorough review, presented the report to the team and layed out a plan for addressing the identified issues.

hero: tags: "assessment / architecture / Ember.js" permalink: false diff --git a/src/cases/ddwrt.md b/src/cases/ddwrt.md index b676616b96..90cdfd3610 100644 --- a/src/cases/ddwrt.md +++ b/src/cases/ddwrt.md @@ -3,10 +3,7 @@ layout: case-study company: DDWRT title: A modern UI for DD-WRT NXT based on Ember.js | Work displayTitle: "A modern user interface for perennial router firmware" -description: - "DD-WRT is a firmware for wireless routers running on millions of devices - worldwide. Mainmatter developed an Ember.js based foundation for a new - configuration UI." +description: "DD-WRT is a firmware for wireless routers running on millions of devices worldwide. Mainmatter developed an Ember.js based foundation for a new configuration UI." problem: DD-WRT wanted a new user experience for their Linux-based firmware. solution: We built a new user interface using Ember.js as a strong foundation. tags: Team reinforcement @@ -19,9 +16,7 @@ og: image: /assets/images/cases/cs-dd-wrt-og-image.jpg --- -{% from "secondary-feature.njk" import secondaryFeature %} -{% from "quote.njk" import quote %} -{% from "btn-secondary.njk" import btnSecondary %} +{% from "secondary-feature.njk" import secondaryFeature %} {% from "quote.njk" import quote %} {% from "btn-secondary.njk" import btnSecondary %}

About DD-WRT

diff --git a/src/cases/dim3.md b/src/cases/dim3.md index 830cab8c4a..725748c4aa 100644 --- a/src/cases/dim3.md +++ b/src/cases/dim3.md @@ -2,11 +2,7 @@ layout: case-study company: Dim3 tags: Team reinforcement -description: -

Dim3 delivers software allowing hospitals to manage and optimize their - patients’ nutrition plans.

They approached Mainmatter when they faced - severe performance problem in their app. We identified and fixed these issues - and also found and solved some potential future problems along the way.

+description:

Dim3 delivers software allowing hospitals to manage and optimize their patients’ nutrition plans.

They approached Mainmatter when they faced severe performance problem in their app. We identified and fixed these issues and also found and solved some potential future problems along the way.

hero: tags: "assessment / Ember.js" permalink: false diff --git a/src/cases/embedd.md b/src/cases/embedd.md index d3e0febb33..7054b75b89 100644 --- a/src/cases/embedd.md +++ b/src/cases/embedd.md @@ -2,10 +2,7 @@ layout: case-study company: embeDD tags: Team reinforcement -description: -

embeDD is the company behind the popular router firmware DD-WRT.

We - guided embeDD in laying the foundation for the next version of the firmware's - UI component so they could rely on it for years to come.

+description:

embeDD is the company behind the popular router firmware DD-WRT.

We guided embeDD in laying the foundation for the next version of the firmware's UI component so they could rely on it for years to come.

hero: tags: "architecture / development / Ember.js" permalink: false diff --git a/src/cases/erdil.md b/src/cases/erdil.md index 59573f650d..a303e6db19 100644 --- a/src/cases/erdil.md +++ b/src/cases/erdil.md @@ -2,11 +2,7 @@ layout: case-study company: ERDiL tags: Team reinforcement -description: -

ERDiL builds natural language processing software that helps companies - analyze messages from their customers.

They reached out to Mainmatter - for guidance on writing tests for their dashboard app based on Ember.js and - Ruby on Rails as well as establishing a sustainable testing culture.

+description:

ERDiL builds natural language processing software that helps companies analyze messages from their customers.

They reached out to Mainmatter for guidance on writing tests for their dashboard app based on Ember.js and Ruby on Rails as well as establishing a sustainable testing culture.

hero: tags: "architecture / Ember.js / Ruby on Rails" permalink: false diff --git a/src/cases/expedition.md b/src/cases/expedition.md index 02e29db318..a01d0d5d34 100644 --- a/src/cases/expedition.md +++ b/src/cases/expedition.md @@ -3,16 +3,9 @@ layout: case-study company: Expedition title: An architecture based on Elixir and Ember.js for Expedition | Work displayTitle: "A sturdy foundation for advanced system architecture" -description: -

Expedition is an online travel magazine for global citizens.

They - turned to Mainmatter when they were looking for guidance to get the most out - of their technology stack based on Elixir, Phoenix and Ember.js.

-problem: - Expedition needed help sharpening up their Ember.js client and their Elixir & - Phoenix API. -solution: - We reviewed their codebase and identified a priority list for the existing - issues. +description:

Expedition is an online travel magazine for global citizens.

They turned to Mainmatter when they were looking for guidance to get the most out of their technology stack based on Elixir, Phoenix and Ember.js.

+problem: Expedition needed help sharpening up their Ember.js client and their Elixir & Phoenix API. +solution: We reviewed their codebase and identified a priority list for the existing issues. tags: Strategic Advice hero: color: purple diff --git a/src/cases/experteer.md b/src/cases/experteer.md index 922fffdbd0..f8d513041c 100644 --- a/src/cases/experteer.md +++ b/src/cases/experteer.md @@ -2,18 +2,11 @@ layout: case-study company: Experteer title: A mobile onboarding experience | Work -problem: - Experteer was lacking the internal UI/UX capacity they needed to build - user-focused solutions. +problem: Experteer was lacking the internal UI/UX capacity they needed to build user-focused solutions. solution: Our experts mentored their team through designing a solution. tags: Launch your idea -displayTitle: - "A smooth mobile onboarding experience – design to release" -description: -

Experteer is Europe’s leading executive career service.

Mainmatter - has supported them in various ways over the years, building custom web apps, - reviewing their code as well as providing architecture and process - consulting.

+displayTitle: "A smooth mobile onboarding experience – design to release" +description:

Experteer is Europe’s leading executive career service.

Mainmatter has supported them in various ways over the years, building custom web apps, reviewing their code as well as providing architecture and process consulting.

hero: color: purple image: "/assets/images/work/experteer.jpg" diff --git a/src/cases/generali.md b/src/cases/generali.md index bacff7af65..42fd9b8e7b 100644 --- a/src/cases/generali.md +++ b/src/cases/generali.md @@ -2,11 +2,7 @@ layout: case-study company: Generali tags: Team reinforcement -description: -

Generali approached Mainmatter when they were looking for support with an - internal Ember.js project.

We guided their team during the course of the - project by teaching and establishing best practices until the project’s - successful completion.

+description:

Generali approached Mainmatter when they were looking for support with an internal Ember.js project.

We guided their team during the course of the project by teaching and establishing best practices until the project’s successful completion.

hero: tags: "architecture / mentoring / Ember.js" permalink: false diff --git a/src/cases/hop-skip-drive.md b/src/cases/hop-skip-drive.md index f3e416f3a1..6170ea763e 100644 --- a/src/cases/hop-skip-drive.md +++ b/src/cases/hop-skip-drive.md @@ -2,16 +2,9 @@ layout: case-study company: HopSkipDrive tags: Team reinforcement -problem: - HopSkipDrive wanted to track rides in real time and react to exceptions - immediately. -solution: - Mainmatter built their internal dashboard on Ruby on Rails and Ember.js. -description: -

HopSkipDrive builds a safe and dependable transportation solution for - schools and families.

Mainmatter built their internal dashboard on Ruby - on Rails and Ember.js, allowing them to track rides in real time and react to - exceptions immediately.

+problem: HopSkipDrive wanted to track rides in real time and react to exceptions immediately. +solution: Mainmatter built their internal dashboard on Ruby on Rails and Ember.js. +description:

HopSkipDrive builds a safe and dependable transportation solution for schools and families.

Mainmatter built their internal dashboard on Ruby on Rails and Ember.js, allowing them to track rides in real time and react to exceptions immediately.

hero: tags: "architecture / Ember.js / Ruby on Rails" permalink: false diff --git a/src/cases/kisters.md b/src/cases/kisters.md index f27c1ae2a4..9b0fd4cf4f 100644 --- a/src/cases/kisters.md +++ b/src/cases/kisters.md @@ -1,18 +1,10 @@ --- layout: case-study company: POELLATH -problem: - KISTERS was looking for a way to move load transparently between their - servers, edge functions, and users' browsers. -solution: - We developed a prototype tool for them that runs the same Rust code on the - server, edge function, and browsers via WebAssembly. +problem: KISTERS was looking for a way to move load transparently between their servers, edge functions, and users' browsers. +solution: We developed a prototype tool for them that runs the same Rust code on the server, edge function, and browsers via WebAssembly. tags: Launch your idea -description: -

KISTERS are experts in environmental monitoring, IT and data - management

We developed a prototype tool for them that runs the same - Rust code on the server as well as on an edge function and in the browser via - WebAssembly.

+description:

KISTERS are experts in environmental monitoring, IT and data management

We developed a prototype tool for them that runs the same Rust code on the server as well as on an edge function and in the browser via WebAssembly.

hero: tags: "architecture / Rust / WASM" permalink: false diff --git a/src/cases/loconet.md b/src/cases/loconet.md index 938d489e95..56b009efc5 100644 --- a/src/cases/loconet.md +++ b/src/cases/loconet.md @@ -2,11 +2,7 @@ layout: case-study company: LoCoNET tags: Team reinforcement -description: -

LoCoNET builds online games for the web. They reached out to Mainmatter to - improve their team’s productivity.

We identified and fixed some blocking - issues, laid the architectural foundation for some advanced features and - conducted workshops to level up their team’s expertise.

+description:

LoCoNET builds online games for the web. They reached out to Mainmatter to improve their team’s productivity.

We identified and fixed some blocking issues, laid the architectural foundation for some advanced features and conducted workshops to level up their team’s expertise.

hero: tags: "architecture / mentoring / Ember.js" permalink: false diff --git a/src/cases/medify.md b/src/cases/medify.md index a57598ce50..455b0392f7 100644 --- a/src/cases/medify.md +++ b/src/cases/medify.md @@ -2,11 +2,7 @@ layout: case-study company: Medify tags: Team reinforcement -description: -

Medify offers high-quality medical admissions help and was used by 2 in 3 - of 2020's UCAT applicants in the UK.

Mainmatter supported their team - with identifying issues in their Ember.js apps, architectural advice as well - as releasing a business-critical project on schedule.

+description:

Medify offers high-quality medical admissions help and was used by 2 in 3 of 2020's UCAT applicants in the UK.

Mainmatter supported their team with identifying issues in their Ember.js apps, architectural advice as well as releasing a business-critical project on schedule.

hero: tags: "development / Ember.js / Ruby on Rails" permalink: false diff --git a/src/cases/mobimed.md b/src/cases/mobimed.md index ba8cb2505f..9c8c4da25f 100644 --- a/src/cases/mobimed.md +++ b/src/cases/mobimed.md @@ -4,21 +4,13 @@ company: Mobi.MED title: Modernizing Code and Design for a Healthcare Software Supplier displayTitle: "Modernizing Healthcare Software" problem: mobi.MED needed to refresh their codebase and UI. -solution: - Our team developed a design system, implemented it in the application, and - modernized the codebase along the way. +solution: Our team developed a design system, implemented it in the application, and modernized the codebase along the way. tags: Tech modernization -description: -

mobi.MED offers an all-in-one software solution for doctors' practices in - Austria and Germany

Mainmatter modernized the codebase of their - frontend, established a design system and refreshed the UI and UX of the - application.

+description:

mobi.MED offers an all-in-one software solution for doctors' practices in Austria and Germany

Mainmatter modernized the codebase of their frontend, established a design system and refreshed the UI and UX of the application.

hero: color: purple image: "/assets/images/work/mobimed.jpg" - imageAlt: - "Woman in green protective clothes sitting in front of 3 computer screens - holding a computer mouse" + imageAlt: "Woman in green protective clothes sitting in front of 3 computer screens holding a computer mouse" tags: "design / development / mentoring" og: image: /assets/images/cases/cs-mobimed-og-image.jpg diff --git a/src/cases/mvb.md b/src/cases/mvb.md index 8555fe7aa8..ebff3b3739 100644 --- a/src/cases/mvb.md +++ b/src/cases/mvb.md @@ -1,18 +1,12 @@ --- layout: case-study company: MVB -problem: - MVB lacked the experience to feel confident that they were delivering on - quality under time pressure. +problem: MVB lacked the experience to feel confident that they were delivering on quality under time pressure. solution: Our experts mentored the team to achieve both requirements. tags: Team reinforcement title: A platform for the german book industry | Work displayTitle: "A platform for the german book industry" -description: -

MVB provides marketing solutions for the German book industry.

They - approached Mainmatter when they were looking for external expertise. We - performed a workshop, leveling up the team’s expertise and guided the project - until its successful completion.

+description:

MVB provides marketing solutions for the German book industry.

They approached Mainmatter when they were looking for external expertise. We performed a workshop, leveling up the team’s expertise and guided the project until its successful completion.

hero: color: purple image: "/assets/images/work/mvb-background.jpg" diff --git a/src/cases/neighbourhoodie.md b/src/cases/neighbourhoodie.md index e59a289fde..ac324c83a2 100644 --- a/src/cases/neighbourhoodie.md +++ b/src/cases/neighbourhoodie.md @@ -2,11 +2,7 @@ layout: case-study company: Neighbourhoodie tags: Team reinforcement -description: - Mainmatter helped Neighbourhoodie successfully complete their first Ember.js - project. We conducted an on-site workshop for their team, teaching Ember.js’ - fundamental concepts as well as advanced patterns, enabling their team to - complete their project successfully. +description: Mainmatter helped Neighbourhoodie successfully complete their first Ember.js project. We conducted an on-site workshop for their team, teaching Ember.js’ fundamental concepts as well as advanced patterns, enabling their team to complete their project successfully. hero: tags: "mentoring / Ember.js" permalink: false diff --git a/src/cases/phorest.md b/src/cases/phorest.md index 77076b49ff..9975449890 100644 --- a/src/cases/phorest.md +++ b/src/cases/phorest.md @@ -2,11 +2,7 @@ layout: case-study company: Phorest tags: Team reinforcement -description: -

Phorest provides software that enables 150.000+ salon and spa professionals - worldwide to manage and market their businesses.

When they aimed to - migrate their existing Java based product to the web, they reached out to - Mainmatter for support with architecting and accelerating that transition.

+description:

Phorest provides software that enables 150.000+ salon and spa professionals worldwide to manage and market their businesses.

When they aimed to migrate their existing Java based product to the web, they reached out to Mainmatter for support with architecting and accelerating that transition.

hero: tags: "architecture / development / Ember.js" permalink: false diff --git a/src/cases/poellath.md b/src/cases/poellath.md index 67ff90bbc3..ec788cf0bd 100644 --- a/src/cases/poellath.md +++ b/src/cases/poellath.md @@ -1,17 +1,10 @@ --- layout: case-study company: POELLATH -problem: - POELLATH wanted to offer their investors a digital onboarding experience. -solution: - Our team walked them through the process and developed a concept they could - build off of. +problem: POELLATH wanted to offer their investors a digital onboarding experience. +solution: Our team walked them through the process and developed a concept they could build off of. tags: Launch your idea -description: -

POELLATH is a German law firm specializing in advice on transactions and - asset management.

When they were looking to build custom software tools - to improve workflows, we conducted a product strategy workshop with them to - develop a clear understanding of these tools and enable the next steps.

+description:

POELLATH is a German law firm specializing in advice on transactions and asset management.

When they were looking to build custom software tools to improve workflows, we conducted a product strategy workshop with them to develop a clear understanding of these tools and enable the next steps.

hero: tags: "product strategy / architecture" permalink: false diff --git a/src/cases/qonto.md b/src/cases/qonto.md index 35dc4556d4..279b8f3d57 100644 --- a/src/cases/qonto.md +++ b/src/cases/qonto.md @@ -3,18 +3,10 @@ layout: case-study company: Qonto title: Co-Engineering the Future of Banking for SMEs with Qonto | Work displayTitle: "A helping hand for a visionary fintech startup" -problem: - Qonto was facing a number of impediments that were slowing down their - workflow. -solution: - We helped them release new features quickly while laying the foundations for - sustainable growth at an accelerated pace. +problem: Qonto was facing a number of impediments that were slowing down their workflow. +solution: We helped them release new features quickly while laying the foundations for sustainable growth at an accelerated pace. tags: Team reinforcement -description: -

Qonto is the leading neobank for SMEs and freelancers in - Europe.

Mainmatter worked with their web frontend team to boost their - productivity, establish Ember.js best practices, and ensure long-term - success.

+description:

Qonto is the leading neobank for SMEs and freelancers in Europe.

Mainmatter worked with their web frontend team to boost their productivity, establish Ember.js best practices, and ensure long-term success.

hero: color: purple image: "/assets/images/work/qonto.jpg" diff --git a/src/cases/rail-europe.md b/src/cases/rail-europe.md index 0506ba7a44..033af27b44 100644 --- a/src/cases/rail-europe.md +++ b/src/cases/rail-europe.md @@ -1,21 +1,12 @@ --- layout: case-study company: Rail Europe -problem: - Rail Europe needed to establish the best way forward after an acquisition. -solution: - We provided an assessment and a roadmap – then supported the implementation. +problem: Rail Europe needed to establish the best way forward after an acquisition. +solution: We provided an assessment and a roadmap – then supported the implementation. tags: Strategic advice title: Transformation for Growth | Work displayTitle: Transformation for Growth -description: -

Rail Europe is the reference brand for European train booking, providing - technology service solutions to +15,000 travel professionals in 70 - countries.

When setting off on their growth initiative, Rail Europe - reached out to Mainmatter to perform an audit of their existing tech platform. - We identified impediments and since support their team to address those which - includes fixing performance bottlenecks and rebuilding the B2C offering in - Svelte.

+description:

Rail Europe is the reference brand for European train booking, providing technology service solutions to +15,000 travel professionals in 70 countries.

When setting off on their growth initiative, Rail Europe reached out to Mainmatter to perform an audit of their existing tech platform. We identified impediments and since support their team to address those which includes fixing performance bottlenecks and rebuilding the B2C offering in Svelte.

hero: color: purple image: "/assets/images/work/rail-europe.jpg" @@ -25,8 +16,7 @@ og: image: /assets/images/cases/cs-rail-europe-og-image.jpeg --- -{% from "quote.njk" import quote %} -{% from "image-aspect-ratio.njk" import imageAspectRatio %} +{% from "quote.njk" import quote %} {% from "image-aspect-ratio.njk" import imageAspectRatio %}

About Rail Europe

diff --git a/src/cases/ringler.md b/src/cases/ringler.md index a2a6487da0..170e00a04e 100644 --- a/src/cases/ringler.md +++ b/src/cases/ringler.md @@ -2,10 +2,7 @@ layout: case-study company: Ringler tags: Team reinforcement -description: - We helped Ringler meet the deadline for one their projects without sacrificing - on quality. Our technology experts joined Ringler’s internal team, increasing - the available workforce and sharing their expertise. +description: We helped Ringler meet the deadline for one their projects without sacrificing on quality. Our technology experts joined Ringler’s internal team, increasing the available workforce and sharing their expertise. hero: tags: "development / mentoring / Ember.js" permalink: false diff --git a/src/cases/robin-hood.md b/src/cases/robin-hood.md index 80e79ed628..c361876b24 100644 --- a/src/cases/robin-hood.md +++ b/src/cases/robin-hood.md @@ -3,14 +3,8 @@ layout: case-study company: Robin Hood tags: Team reinforcement problem: Robin Hood wanted a tool for managing Civic User Testing Groups. -solution: - Mainmatter helped them improve their engineering process and built a web based - tool with Ruby on Rails. -description: -

Robin Hood is a charitable foundation fighting poverty in New York - City.

Mainmatter helped them establish an effective engineering process - as well as build and release a web based tool with Ruby on Rails for managing - Civic User Testing Groups.

+solution: Mainmatter helped them improve their engineering process and built a web based tool with Ruby on Rails. +description:

Robin Hood is a charitable foundation fighting poverty in New York City.

Mainmatter helped them establish an effective engineering process as well as build and release a web based tool with Ruby on Rails for managing Civic User Testing Groups.

hero: tags: "process / development / Ruby on Rails" permalink: false diff --git a/src/cases/sage.md b/src/cases/sage.md index f06b57cb07..a93c0ff7f1 100644 --- a/src/cases/sage.md +++ b/src/cases/sage.md @@ -2,16 +2,9 @@ layout: case-study company: Sage Intacct problem: Sage Software was being slowed down by its legacy code. -solution: - We worked with them to update and streamline their codebase so they could move - forward. +solution: We worked with them to update and streamline their codebase so they could move forward. tags: Tech modernization -description: -

Sage Intacct is the leading provider of online Accounting and Finance - Management software.

Mainmatter helped their engineering team to - identify and overcome issues that had a negative impact on their velocity as - well as migrate the codebase to more modern patterns and a more sustainable - architecture.

+description:

Sage Intacct is the leading provider of online Accounting and Finance Management software.

Mainmatter helped their engineering team to identify and overcome issues that had a negative impact on their velocity as well as migrate the codebase to more modern patterns and a more sustainable architecture.

hero: tags: "development / architecture / mentoring" permalink: false diff --git a/src/cases/sutori.md b/src/cases/sutori.md index 777c730539..65f32a7fe7 100644 --- a/src/cases/sutori.md +++ b/src/cases/sutori.md @@ -2,12 +2,7 @@ layout: case-study company: Sutori tags: Team reinforcement -description: -

Sutori is an online, collaborative learning platform that helps teachers - present information in the remote classroom.

When they wanted to - internationalize their service, Mainmatter set up the architecture in their - application as well as the infrastructure that supports their development - team.

+description:

Sutori is an online, collaborative learning platform that helps teachers present information in the remote classroom.

When they wanted to internationalize their service, Mainmatter set up the architecture in their application as well as the infrastructure that supports their development team.

hero: tags: "architecture / development" permalink: false diff --git a/src/cases/terminal49.md b/src/cases/terminal49.md index 2aed4e32a0..5e542590f1 100644 --- a/src/cases/terminal49.md +++ b/src/cases/terminal49.md @@ -2,12 +2,9 @@ layout: case-study company: Terminal49 tags: Team reinforcement -description: -

Terminal49 is the all-in-one shipment and container tracking - platform.

When their team was facing challenges and delivery bottlenecks - with their frontend application, they reached out to Mainmatter for support. - We performed an assessment of their codebase, prepared a roadmap and supported - their team to follow that.

+problem: Terminal49 was facing challenges and delivery bottlenecks with their frontend application. +solution: Mainmatter performed an assessment of their codebase to create a product roadmap. +description:

Terminal49 is the all-in-one shipment and container tracking platform.

When their team was facing challenges and delivery bottlenecks with their frontend application, they reached out to Mainmatter for support. We performed an assessment of their codebase, prepared a roadmap and supported their team to follow that.

hero: tags: "architecture / development / Ember.js" permalink: false diff --git a/src/cases/timify.md b/src/cases/timify.md index 4f8309229c..e147775bff 100644 --- a/src/cases/timify.md +++ b/src/cases/timify.md @@ -4,14 +4,9 @@ company: Timify title: Laying a solid frontend foundation for an ambitious startup | Work displayTitle: "An engineering overhaul for a validated booking system" problem: Timify's entire system needed to be re-engineered from the ground up. -solution: - We completed the first release version of the new application and got them up - to speed on best practices and patterns for Ember.js +solution: We completed the first release version of the new application and got them up to speed on best practices and patterns for Ember.js tags: Team reinforcement -description: -

Timify is an online appointment scheduling service that connects service - providers with clients.

When they decided it was time to re-engineer - their existing product, they trusted us to set them up for future success.

+description:

Timify is an online appointment scheduling service that connects service providers with clients.

When they decided it was time to re-engineer their existing product, they trusted us to set them up for future success.

hero: color: purple image: "/assets/images/work/timify.jpg" diff --git a/src/cases/trainline.md b/src/cases/trainline.md index 5cdc4018bf..413cf1ca53 100644 --- a/src/cases/trainline.md +++ b/src/cases/trainline.md @@ -3,17 +3,10 @@ layout: case-study company: Trainline title: Mobile train tickets with Ember.js for Trainline | Work displayTitle: "The full market potential for a leading travel platform" -problem: - Trainline was in need of a mobile web app to complement their desktop - apllication. -solution: - We helped deliver the web app and developed the team’s expertise through - pair-programming sessions and code reviews. +problem: Trainline was in need of a mobile web app to complement their desktop apllication. +solution: We helped deliver the web app and developed the team’s expertise through pair-programming sessions and code reviews. tags: Team reinforcement -description: -

Trainline is Europe’s leading rail and coach platform.

We helped them - deliver a high-performance mobile web app, along with an improved engineering - process.

+description:

Trainline is Europe’s leading rail and coach platform.

We helped them deliver a high-performance mobile web app, along with an improved engineering process.

hero: color: purple image: "/assets/images/work/trainline.jpg" diff --git a/src/cases/weplan.md b/src/cases/weplan.md index 08054a6b8f..b3b2ffe27f 100644 --- a/src/cases/weplan.md +++ b/src/cases/weplan.md @@ -2,10 +2,7 @@ layout: case-study company: WePlan tags: Team reinforcement -description: -

WePlan is a software company offering smart workforce planning - solutions.

We worked with them to modernize their Ember.js codebase, - refactor old patterns and accelerate their team's value delivery.

+description:

WePlan is a software company offering smart workforce planning solutions.

We worked with them to modernize their Ember.js codebase, refactor old patterns and accelerate their team's value delivery.

hero: tags: "architecture / development / mentoring" permalink: false diff --git a/src/cases/xbav.md b/src/cases/xbav.md index 65539fdc66..1b94b13867 100644 --- a/src/cases/xbav.md +++ b/src/cases/xbav.md @@ -2,18 +2,9 @@ layout: case-study company: xbAV tags: Team reinforcement -problem: - xbAV were looking for support releasing a number of critical features built - with Ruby on Rails. -solution: - Our experts joined xbAV’s team, increasing the available workforce while - boosting their expertise. -description: -

xbAV makes pensions accessible for employees, employers and - agents.

They approached Mainmatter when they were looking for support - releasing a number of critical features built with Ruby on Rails. Our - technology experts joined xbAV’s internal team, increasing the available - workforce while boosting their expertise.

+problem: xbAV were looking for support releasing a number of critical features built with Ruby on Rails. +solution: Our experts joined xbAV’s team, increasing the available workforce while boosting their expertise. +description:

xbAV makes pensions accessible for employees, employers and agents.

They approached Mainmatter when they were looking for support releasing a number of critical features built with Ruby on Rails. Our technology experts joined xbAV’s internal team, increasing the available workforce while boosting their expertise.

hero: tags: "architecture / development / Ruby on Rails" permalink: false diff --git a/src/channels/assertjs-2018.md b/src/channels/assertjs-2018.md index 0575c1f8b4..6c177724c0 100644 --- a/src/channels/assertjs-2018.md +++ b/src/channels/assertjs-2018.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2018-02-22-assertjs-2018/logo.png" url: https://2018.assertjs.com --- -Assert(js) Testing Conference is a one-day, single-track conference with a laser -focus on testing for JavaScript developers. +Assert(js) Testing Conference is a one-day, single-track conference with a laser focus on testing for JavaScript developers. diff --git a/src/channels/bangbangconwest-2019.md b/src/channels/bangbangconwest-2019.md index f69f0403d6..763caa6d01 100644 --- a/src/channels/bangbangconwest-2019.md +++ b/src/channels/bangbangconwest-2019.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2019-02-23-bangbangconwest-2019/logo.png" url: http://bangbangcon.com/west/ --- -!!Con West was a two-day conference of ten-minute talks about the joy, -excitement, and surprise of computing. +!!Con West was a two-day conference of ten-minute talks about the joy, excitement, and surprise of computing. diff --git a/src/channels/commit-porto-2019.md b/src/channels/commit-porto-2019.md index 6190232c3f..6d5681912f 100644 --- a/src/channels/commit-porto-2019.md +++ b/src/channels/commit-porto-2019.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2019-06-22-commit-porto-2019/logo.png" url: https://commitporto.com/ --- -Commit Porto is a tech conference organized by AlumniEI-FEUP, annually taking -place in Porto, Portugal. +Commit Porto is a tech conference organized by AlumniEI-FEUP, annually taking place in Porto, Portugal. diff --git a/src/channels/devfest-nantes-2018.md b/src/channels/devfest-nantes-2018.md index a931413639..360af40e69 100644 --- a/src/channels/devfest-nantes-2018.md +++ b/src/channels/devfest-nantes-2018.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2018-10-18-devfest-nantes-2018/logo.png" url: https://devfest2018.gdgnantes.com --- -DevFest Nantes is a technical conference for developers, aimed at students, -professionals or simply curious techies. +DevFest Nantes is a technical conference for developers, aimed at students, professionals or simply curious techies. diff --git a/src/channels/ember-munich.md b/src/channels/ember-munich.md index 98ce852c1f..df5d90c2f7 100644 --- a/src/channels/ember-munich.md +++ b/src/channels/ember-munich.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2017-05-24-ember-munich/logo.png" url: https://www.meetup.com/Ember-js-Munich/ --- -Ember.js Munich is the local Ember.js meetup in Munich, held around 4 times per -year. +Ember.js Munich is the local Ember.js meetup in Munich, held around 4 times per year. diff --git a/src/channels/emberconf-2017.md b/src/channels/emberconf-2017.md index 7c5b4c2ebf..d733af5eda 100644 --- a/src/channels/emberconf-2017.md +++ b/src/channels/emberconf-2017.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2017-03-28-emberconf-2017/logo.png" url: https://2017.emberconf.com --- -EmberConf is the main yearly conference around all things Ember in Portland, OR, -USA. +EmberConf is the main yearly conference around all things Ember in Portland, OR, USA. diff --git a/src/channels/emberconf-2018.md b/src/channels/emberconf-2018.md index 2b333e1828..13af3a63b2 100644 --- a/src/channels/emberconf-2018.md +++ b/src/channels/emberconf-2018.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2018-03-13-emberconf-2018/logo.svg" url: https://2018.emberconf.com --- -EmberConf is the main yearly conference around all things Ember in Portland, OR, -USA. +EmberConf is the main yearly conference around all things Ember in Portland, OR, USA. diff --git a/src/channels/emberconf-2019.md b/src/channels/emberconf-2019.md index 20d317d8df..8b967ac7a5 100644 --- a/src/channels/emberconf-2019.md +++ b/src/channels/emberconf-2019.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2019-03-16-emberconf-2019/logo.png" url: https://emberconf.com --- -EmberConf is the main yearly conference around all things Ember in Portland, OR, -USA. +EmberConf is the main yearly conference around all things Ember in Portland, OR, USA. diff --git a/src/channels/emberconf-2020.md b/src/channels/emberconf-2020.md index 7e4effd7a6..ae7df66f93 100644 --- a/src/channels/emberconf-2020.md +++ b/src/channels/emberconf-2020.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2020-03-16-emberconf-2020/logo.svg" url: https://2020.emberconf.com --- -EmberConf is the main yearly conference around all things Ember – virtual and -streamed in 2020. +EmberConf is the main yearly conference around all things Ember – virtual and streamed in 2020. diff --git a/src/channels/emberconf-2021.md b/src/channels/emberconf-2021.md index cf1045839f..4684988bb4 100644 --- a/src/channels/emberconf-2021.md +++ b/src/channels/emberconf-2021.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2021-03-29-emberconf-2021/logo.svg" url: https://emberconf.com --- -EmberConf is 2 days of Ember talks, sessions and fun – streaming live virtually -everywhere. +EmberConf is 2 days of Ember talks, sessions and fun – streaming live virtually everywhere. diff --git a/src/channels/emberconf-2022.md b/src/channels/emberconf-2022.md index b92c3c9ae6..dcf9583d37 100644 --- a/src/channels/emberconf-2022.md +++ b/src/channels/emberconf-2022.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2022-04-19-emberconf-2022/logo.svg" url: https://emberconf.com --- -EmberConf is 4 days of Ember talks, sessions and fun – streaming live virtually -everywhere. +EmberConf is 4 days of Ember talks, sessions and fun – streaming live virtually everywhere. diff --git a/src/channels/emberconf-2024.md b/src/channels/emberconf-2024.md new file mode 100644 index 0000000000..1362839e40 --- /dev/null +++ b/src/channels/emberconf-2024.md @@ -0,0 +1,7 @@ +--- +title: "EmberConf 2024" +image: "/assets/images/talks/2024-09-13-emberconf-2024/new-logo.png" +url: https://emberconf.com +--- + +EmberConf is a one-day conference for the Ember.js community. This year's event happened in New York and online on May 31st. diff --git a/src/channels/embereurope-q1-2023.md b/src/channels/embereurope-q1-2023.md index 59c3fdbd14..d2df006eeb 100644 --- a/src/channels/embereurope-q1-2023.md +++ b/src/channels/embereurope-q1-2023.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2023-03-23-embereurope-2023-q1/logo.svg" url: https://www.meetup.com/ember-europe/events/291659853/ --- -The Ember.js Europe meetup brings together the Ember community from all of -Europe once a quarter. +The Ember.js Europe meetup brings together the Ember community from all of Europe once a quarter. diff --git a/src/channels/embereurope-q1-2024.md b/src/channels/embereurope-q1-2024.md index e73533d1f3..81dd80640f 100644 --- a/src/channels/embereurope-q1-2024.md +++ b/src/channels/embereurope-q1-2024.md @@ -1,8 +1,7 @@ --- title: "Ember Europe Q4 Meetup 2023" -image: "/assets/images/talks/2024-03-21-embereurope-2024-q1/logo.svg" +image: "/assets/images/talks/2024-03-21-embereurope-2024-q1/ember-logo.png" url: https://www.meetup.com/de-DE/ember-europe/ --- -The Ember.js Europe meetup brings together the Ember community from all of -Europe once a quarter. +The Ember.js Europe meetup brings together the Ember community from all of Europe once a quarter. diff --git a/src/channels/embereurope-q4-2022.md b/src/channels/embereurope-q4-2022.md index cc697472d2..bf3fd92171 100644 --- a/src/channels/embereurope-q4-2022.md +++ b/src/channels/embereurope-q4-2022.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2022-12-09-embereurope-2022/logo.svg" url: https://www.meetup.com/de-DE/ember-europe/ --- -The Ember.js Europe meetup brings together the Ember community from all of -Europe once a quarter. +The Ember.js Europe meetup brings together the Ember community from all of Europe once a quarter. diff --git a/src/channels/embereurope-q4-2023.md b/src/channels/embereurope-q4-2023.md index e699099305..a21f6afce0 100644 --- a/src/channels/embereurope-q4-2023.md +++ b/src/channels/embereurope-q4-2023.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2023-12-07-embereurope-2023-q4/logo.svg" url: https://www.meetup.com/de-DE/ember-europe/ --- -The Ember.js Europe meetup brings together the Ember community from all of -Europe once a quarter. Ember Europe is run by Mainmatter and Intercom. +The Ember.js Europe meetup brings together the Ember community from all of Europe once a quarter. Ember Europe is run by Mainmatter and Intercom. diff --git a/src/channels/emberfest-2019.md b/src/channels/emberfest-2019.md index 8e4107ffd4..8139b8406f 100644 --- a/src/channels/emberfest-2019.md +++ b/src/channels/emberfest-2019.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2019-10-17-emberfest-2019/logo.png" url: https://emberfest.eu --- -EmberFest is the European Community Ember Conference and took place in -Copenhagen, Denmark in 2019. +EmberFest is the European Community Ember Conference and took place in Copenhagen, Denmark in 2019. diff --git a/src/channels/eurorust23.md b/src/channels/eurorust23.md index cadb70cee6..7d516a53df 100644 --- a/src/channels/eurorust23.md +++ b/src/channels/eurorust23.md @@ -4,6 +4,4 @@ image: "/assets/images/talks/2023-10-12-eurorust-2023/logo.png" url: https://eurorust.eu/ --- -EuroRust is a 2 day conference for the European Rust community, organized by -Mainmatter. We cover all things Rust: from Rust patterns and idioms to systems -programming and CLI tooling, servers WASM, and embedded systems. +EuroRust is a 2 day conference for the European Rust community, organized by Mainmatter. We cover all things Rust: from Rust patterns and idioms to systems programming and CLI tooling, servers WASM, and embedded systems. diff --git a/src/channels/international-javascript-conference-2017.md b/src/channels/international-javascript-conference-2017.md index 9ee1388d22..6a1b3b8dd4 100644 --- a/src/channels/international-javascript-conference-2017.md +++ b/src/channels/international-javascript-conference-2017.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2017-10-23-international-javascript-conference-2017 url: https://javascript-conference.com/archiv/archiv-ijs-2017/ --- -International JavaScript Conference is a 3 day conference around everything -JavaScript. +International JavaScript Conference is a 3 day conference around everything JavaScript. diff --git a/src/channels/jsconf-eu-2019.md b/src/channels/jsconf-eu-2019.md index db36006a3e..0a4b98024b 100644 --- a/src/channels/jsconf-eu-2019.md +++ b/src/channels/jsconf-eu-2019.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2019-06-01-jsconf-eu-2019/logo.png" url: https://2019.jsconf.eu --- -JSConf EU is a major conference for the JavaScript community in Europe, annually -taking place in Berlin, Germany. +JSConf EU is a major conference for the JavaScript community in Europe, annually taking place in Berlin, Germany. diff --git a/src/channels/product-circle.md b/src/channels/product-circle.md index 94236409df..f7f3a15ce8 100644 --- a/src/channels/product-circle.md +++ b/src/channels/product-circle.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2020-12-10-product-circle/logo.jpg" url: https://www.meetup.com/Product-Circle/ --- -Product Circle is a meetup for all PMO's, Product Owners, Project Managers, -Delivery Leads, and anyone involved in a Digital Product/Project team. +Product Circle is a meetup for all PMO's, Product Owners, Project Managers, Delivery Leads, and anyone involved in a Digital Product/Project team. diff --git a/src/channels/rust-linux-inlaws.md b/src/channels/rust-linux-inlaws.md new file mode 100644 index 0000000000..ca3fda812b --- /dev/null +++ b/src/channels/rust-linux-inlaws.md @@ -0,0 +1,7 @@ +--- +title: "Linux Inlaws Podcast" +image: "/assets/images/talks/2024-09-13-rust-linux-inlaws/logo.png" +url: https://linuxinlaws.eu/#episodes +--- + +Linux Inlaws is a podcast dedicated to open-source software and technology, offering humorous insights and discussions. It has been running since January 2020. diff --git a/src/channels/rustnationuk.md b/src/channels/rustnationuk.md index 310af84d7a..5a392247c4 100644 --- a/src/channels/rustnationuk.md +++ b/src/channels/rustnationuk.md @@ -1,8 +1,7 @@ --- title: "Rust Nation UK 2024" -image: "/assets/images/talks/2024-03-26-rustnationuk-2024/logo.svg" +image: "/assets/images/talks/2024-03-26-rustnationuk-2024/new-logo.png" url: https://www.rustnationuk.com/ --- -Rust Nation is the first UK conference dedicated to the Rust language. It was -held in London on March 26th to 28th. +Rust Nation is the first UK conference dedicated to the Rust language. It was held in London on March 26th to 28th. diff --git a/src/channels/rustweb-barcelona.md b/src/channels/rustweb-barcelona.md new file mode 100644 index 0000000000..ca2e4cbefd --- /dev/null +++ b/src/channels/rustweb-barcelona.md @@ -0,0 +1,7 @@ +--- +title: "Rust for the web" +image: "/assets/images/talks/2024-09-13-rustweb-barcelona/logo.png" +url: https://www.meetup.com/es-ES/bcnrust/events/300765894/ +--- + +“Rust for the web” Barcelona was an event organized by the Mainmatter team in collaboration with BCN Rust, and hosted by Adevinta Spain. diff --git a/src/channels/rustweb-berlin.md b/src/channels/rustweb-berlin.md index e13eb53cd3..efd3a78ced 100644 --- a/src/channels/rustweb-berlin.md +++ b/src/channels/rustweb-berlin.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2024-04-23-rust-web-berlin/logo.png" url: https://www.meetup.com/rust-berlin/events/300047151/ --- -“Rust'n'tell - Rust for the Web” in Berlin in April 2024 was an event organized -by Mainmatter in collaboration with the Rust Berlin meetup group. +“Rust'n'tell - Rust for the Web” in Berlin in April 2024 was an event organized by Mainmatter in collaboration with the Rust Berlin meetup group. diff --git a/src/channels/rustweb-london.md b/src/channels/rustweb-london.md index 8eee3591af..906e373d69 100644 --- a/src/channels/rustweb-london.md +++ b/src/channels/rustweb-london.md @@ -4,6 +4,4 @@ image: "/assets/images/talks/2024-02-07-rustweb-london/logo.png" url: https://www.meetup.com/rust-london-user-group/events/298413388/ --- -“Rust for the Web” in London in February 2024 was an event organized by -Mainmatter in collaboration with Vortexa, Shuttle, and the Rust London meetup, -hosted by TrueLayer. +“Rust for the Web” in London in February 2024 was an event organized by Mainmatter in collaboration with Vortexa, Shuttle, and the Rust London meetup, hosted by TrueLayer. diff --git a/src/channels/rustweb.md b/src/channels/rustweb.md index 3d9aabc7a8..fb5b8c7948 100644 --- a/src/channels/rustweb.md +++ b/src/channels/rustweb.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2023-11-25-rust-web/logo.png" url: https://mobilizon.fr/events/149c0367-66cb-42c6-aa0c-8495bf6d2a52 --- -“Rust for the web” is an event organized by the Mainmatter team in collaboration -with the Rust Paris meetup, and hosted by Qonto. +“Rust for the web” is an event organized by the Mainmatter team in collaboration with the Rust Paris meetup, and hosted by Qonto. diff --git a/src/channels/stackconf-2023.md b/src/channels/stackconf-2023.md index 0ddbcc056a..ccca566c35 100644 --- a/src/channels/stackconf-2023.md +++ b/src/channels/stackconf-2023.md @@ -4,6 +4,4 @@ image: "/assets/images/talks/2023-09-13-stackconf-2023/logo.png" url: https://stackconf.eu/ --- -stackconf is a 2-day conference about open source infrastructure solutions in -the spectrum of continuous integration, container, hybrid and cloud -technologies. +stackconf is a 2-day conference about open source infrastructure solutions in the spectrum of continuous integration, container, hybrid and cloud technologies. diff --git a/src/channels/sveltesummit.md b/src/channels/sveltesummit.md index c7ffbe9f98..f8f358cc9d 100644 --- a/src/channels/sveltesummit.md +++ b/src/channels/sveltesummit.md @@ -4,5 +4,4 @@ image: "/assets/images/talks/2023-11-11-enhance/logo.png" url: https://www.sveltesummit.com/ --- -Svelte Summit is a virtual event dedicated to Svelte and everything that is -happening in the community. +Svelte Summit is a virtual event dedicated to Svelte and everything that is happening in the community. diff --git a/src/channels/viteconf-2024.md b/src/channels/viteconf-2024.md new file mode 100644 index 0000000000..259019c139 --- /dev/null +++ b/src/channels/viteconf-2024.md @@ -0,0 +1,7 @@ +--- +title: "ViteConf" +image: "/assets/images/talks/2024-10-03-viteconf/logo.png" +url: https://viteconf.org/ +--- + +ViteConf is a conference focused on Vite, the modern build tool and development server that enhances the front-end development experience with fast performance and a streamlined workflow. diff --git a/src/clutch.njk b/src/clutch.njk new file mode 100644 index 0000000000..16829bc8ab --- /dev/null +++ b/src/clutch.njk @@ -0,0 +1,223 @@ +--- +layout: "base" +title: "Team Up With Us for Better Tech!" +description: "We transform bold ideas into shipped products, sharing our skills and expertise with our clients as teammates." +og: + image: "/assets/images/clutch/og-image.jpg" +--- + +{% from "color-hero.njk" import colorHero %} +{% from "featured-services.njk" import featuredServices %} +{% from "logo-list.njk" import logoList %} +{% from "featured-case-studies.njk" import featuredCaseStudies %} +{% from "image-banner-with-text.njk" import imageBannerWithText %} +{% from "cta-banner.njk" import ctaBanner %} +{% from "image-aspect-ratio.njk" import imageAspectRatio %} +{% from "quote.njk" import quote %} +{% from "tech-cards.njk" import techCards %} +{% from "btn-secondary.njk" import btnSecondary %} +{% + set 'content' = { + "title": "Team Up With Us for Better Tech!", + "text": "We know the skills, practices and code that goes into winning product development. Our team of experts is ready to roll up their sleeves to help you tackle your toughest tech challenges so you can focus on your main matter.", + "image": "/assets/images/hero/home.jpg", + "alt": "Balloons flying over the sky", + "loading": "eager" + } +%} +{{ colorHero('purple', content) }} +{% + set 'content' = { + "title": "Discover our services", + "subtitle": "Transform bold ideas into shipped products" + } +%} +{{ featuredServices(services['services-list-clutch'], content) }} +{% + set awards = [ + 'ember', + 'node', + 'rust', + 'financial', + 'logistics', + 'arts-entertainment', + 'staff-aug' + ] +%} +{%- macro awardItem(award) -%} + {% set imagePath %}/assets/images/clutch/awards/{{ award }}.png{% endset %} +
  • +
    + {% image imagePath, "Clutch award icon", "5rem", "eager" %} +
    +
  • +{%- endmacro -%} + +
    +
    +
    +
      + {% for award in awards %} + {{ awardItem(award) }} + {% endfor %} +
    + +
    +
    + +
    + +
    + {% + set imageData = { + "imgPath": "/assets/images/photos/balloons-top.jpeg", + "alt": "Server room", + "sizes": "100vw", + "loading": "lazy", + "sizesArray": [760, 1440, 1920] + } + %} + {{ imageAspectRatio(imageData, "32/13", "35/19") }} +
    + +{% set clients = ['experteer', 'mvb', 'trainline', 'ais'] %} +{{ featuredCaseStudies(clients, 'Browse our work') }} + +
    + {% + set content = { + "text": "As we did not have any design or frontend expertise in-house, we could not professionally build the user interface of our platform and bring the product to the market. We were looking for support and chose to work with Mainmatter, which turned out to be a great partner for us. The experienced team of Mainmatter helped us release an MVP and set the foundation for developing the application in the future.", + "source": "Milivoj Simeonovski, Chief Product Officer (Founding)", + "image": "/assets/images/photos/milivoj-simeonovski.png", + "alt": "Milivoj Simeonovski smiling at the camera wearing a red sweater", + "loading": "lazy" + } + %} + {{ quote(content) }} +
    + +{% + set 'tech_1' = { + "title": "Rust is a competitive advantage", + "logo": "rust", + "link": "rust-consulting" + } +%} +{% + set 'tech_2' = { + "title": "Svelte is the future of frontend development", + "logo": "svelte", + "link": "svelte-consulting" + } +%} +{% + set 'tech_3' = { + "title": "Elixir and Phoenix: The best of all worlds", + "logo": "elixir", + "link": "expertise/elixir-phoenix" + } +%} +{% + set 'tech_4' = { + "title": "We're veteran Ruby and Ruby on Rails experts", + "logo": "ruby", + "link": "ruby-rails-consulting" + } +%} +{% + set 'tech_5' = { + "title": "Ember is our expertise", + "logo": "ember", + "link": "ember-consulting" + } +%} +{% set technologies = [tech_1, tech_2, tech_3, tech_4, tech_5] %} +{{ techCards('team-reinforcement_technologies', 'Technologies', 'Our skillset is based on a core set of technologies that cover architecture, backend and frontend development with: ', technologies) }} + +
    +
    + +
    +
    +

    + We are trusted by innovative companies with high ambitions – check out what they have to + say about us! +

    + {% + set link = { + "label": 'Read reviews', + "url": 'https://clutch.co/profile/mainmatter#reviews' + } + %} + {{ btnSecondary( link, 'mt-2' ) }} +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +{% + set logoCompanies = [ + 'Qonto', + 'Trainline', + 'Aleph Alpha', + 'Timify', + 'Experteer', + 'Robin Hood', + 'Rail Europe' + ] +%} +{{ logoList(logoCompanies) }} + +
    + {% + set imageData = { + "imgPath": "/assets/images/photos/balloons-line.jpeg", + "alt": "Server room", + "sizes": "100vw", + "loading": "lazy", + "sizesArray": [760, 1440, 1920] + } + %} + {{ imageAspectRatio(imageData, "32/13", "35/19") }} +
    + +{% include "global/default-newsletter-cta.njk" %} +{% + set 'content' = { + "title": "Team up with us for better tech!", + "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", + "linkUrl": "/contact", + "linkText": "Get in touch" + } +%} +{{ ctaBanner('purple', 'full', content) }} diff --git a/src/components/author-socials.njk b/src/components/author-socials.njk index b05538ec3f..2d78ab14f6 100644 --- a/src/components/author-socials.njk +++ b/src/components/author-socials.njk @@ -21,6 +21,22 @@ {% endif %} + {% if author.data.mastodon %} +
  • + + {% include 'svg/social-mastodon.njk' %} + {{ author.data.mastodon }} on Mastodon + +
  • + {% endif %} + {% if author.data.bluesky %} +
  • + + {% include 'svg/social-bluesky.njk' %} + {{ author.data.bluesky }} on Bluesky + +
  • + {% endif %} {% endif %} {%- endmacro -%} diff --git a/src/components/contact-form.njk b/src/components/contact-form.njk index dab44876f6..96b92332d9 100644 --- a/src/components/contact-form.njk +++ b/src/components/contact-form.njk @@ -9,7 +9,15 @@ your next big move.

    Send us a message

    -
    +
    Strategic advice - + @@ -95,7 +103,7 @@
    Your message is being sent… diff --git a/src/components/featured-case-studies.njk b/src/components/featured-case-studies.njk index 0a7e4f5da3..275d0098f6 100644 --- a/src/components/featured-case-studies.njk +++ b/src/components/featured-case-studies.njk @@ -9,7 +9,9 @@ list: An array where each item is the slug for the case study. {%- macro featuredCaseStudies(caseStudies, heading) -%}
    +
    + +
    +
    +

    Book this workshop

    +
    + Our mentors look forward to working with your team and unlocking new capabilities. +
    + + +
    + + + +
    +
    + + +
    +
    + + + +
    +
    + + +
    + +
    + +
    + Your message is being sent… + +
    +
    +
    +

    Unable to send message.

    +

    + Please try again later or contact us at + info@mainmatter.com +

    +
    +
    +
    +
    +

    Thank you!

    +

    We will be in touch soon.

    +
    +
    +
    + +
    +
    +
    + {% set 'content' = { "title": "Not the right workshop for you?", @@ -86,13 +195,4 @@ layout: "base" %} {{ ctaBanner('aqua', 'default', content) }} {{ newsletterCta(tags) }} - {% - set 'content' = { - "title": "Book this workshop", - "text": "Our mentors look forward to working with your team and unlocking new capabilities.", - "linkUrl": "/contact", - "linkText": "Get in touch" - } - %} - {{ ctaBanner('purple', 'full', content) }} {%- endblock -%} diff --git a/src/components/strategy-list.njk b/src/components/strategy-list.njk index 21b994cb90..a417376bf7 100644 --- a/src/components/strategy-list.njk +++ b/src/components/strategy-list.njk @@ -17,7 +17,7 @@ {{ el.eyebrow }} {% endif %} {% if el.title %} -

    {{ el.title }}

    +

    {{ el.title | safe }}

    {% endif %} {% if el.text %}

    {{ el.text | safe }}

    diff --git a/src/components/svg/social-bluesky.njk b/src/components/svg/social-bluesky.njk new file mode 100644 index 0000000000..1c70d3c053 --- /dev/null +++ b/src/components/svg/social-bluesky.njk @@ -0,0 +1,16 @@ + + + diff --git a/src/elixir-phoenix.njk b/src/elixir-phoenix.njk index 04c5e8c3c2..f38a95bcf9 100644 --- a/src/elixir-phoenix.njk +++ b/src/elixir-phoenix.njk @@ -1,10 +1,10 @@ --- layout: base -title: Level-up your team with Elixir & Phoenix experts +title: "Team Up With Us for Elixir & Phoenix! | Elixir consulting" description: Augment your in-house team with Elixir & Phoenix technology experts. Speed up projects and remove long-standing issues – from refactoring to shipping new features. permalink: /expertise/elixir-phoenix/ og: - image: /assets/images/elixir/lp-elixir-phoenix-consulting-og-image.jpg + image: /assets/images/elixir/og-image.png --- {% from "color-hero.njk" import colorHero %} @@ -19,7 +19,7 @@ og: {% from "quote.njk" import quote %} {% set 'content' = { - "title": "Elixir & Phoenix", + "title": "Team Up With Us for Elixir & Phoenix!", "text": "Elixir and Phoenix form a modern and capable stack for building ambitious digital products of the future, based on an established foundation that has proven itself for decades.", "image": "/assets/images/hero/phoenix.jpg", "alt": "Feathers of a bird, maybe a phoenix", @@ -112,8 +112,8 @@ og: {{ recentPosts("Latest from our blog on the topic", collections.elixirPosts) }} {% set 'content' = { - "title": "Grow your business with us", - "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", + "title": "Team up with us for Elixir and Phoenix!", + "text": "Our Elixir and Phoenix experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" } diff --git a/src/ember-consulting.njk b/src/ember-consulting.njk index 0e2bbaed4d..98d05ab61f 100644 --- a/src/ember-consulting.njk +++ b/src/ember-consulting.njk @@ -1,10 +1,10 @@ --- layout: base -title: Europe's leading Ember experts | Ember consulting +title: "Team Up With Us for Ember! | Ember consulting" description: Temporarily extend your team with Europe's leading Ember experts. Speed up projects and remove long-standing issues – from refactoring to shipping new features. permalink: /ember-consulting/ og: - image: /assets/images/ember/lp-ember-consulting-og-image.jpg + image: /assets/images/ember/og-image.png --- {% from "text-with-list.njk" import textWithList %} @@ -19,7 +19,7 @@ og: {% set 'content' = { "eyebrow": "Our Expertise: Ember", - "title": "Ember is our expertise", + "title": "Team Up With Us for Ember!", "text": "We are long-time Ember experts and active contributors to the ecosystem. Our team of community leaders makes Mainmatter the foremost Ember consultancy.", "image": "/assets/images/hero/ember.jpg", "alt": "A hamster sitting in the straw", @@ -428,8 +428,8 @@ og: {% include "global/ember-newsletter-cta.njk" %} {% set 'content' = { - "title": "Grow your business with us", - "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", + "title": "Team up with us for Ember!", + "text": "Our Ember experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" } diff --git a/src/events.njk b/src/events.njk index 1ea71b2e25..9e7ece8c87 100644 --- a/src/events.njk +++ b/src/events.njk @@ -80,7 +80,7 @@ eleventyImport: {% include "global/default-newsletter-cta.njk" %} {% set 'content' = { - "title": "Grow your business with us", + "title": "Team up with us to go further!", "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" diff --git a/src/feed.njk b/src/feed.njk index 2bf22a8c4c..65068b3051 100644 --- a/src/feed.njk +++ b/src/feed.njk @@ -4,7 +4,7 @@ eleventyExcludeFromCollections: true layout: "" metadata: title: "Mainmatter" - subtitle: "We are Europe’s leading mobile and web design & development consultancy. Our clients value code quality, dependability and honesty. We are trusted by Generali, Qonto, Trainline, and CLARK." + subtitle: "We know the code, tools, and practices that go into successful development. We partner with our clients to solve their toughest tech challenges by sharing our skills and expertise as teammates." language: "en" url: "https://mainmatter.com/" author: diff --git a/src/index.njk b/src/index.njk index 2777d9dd9c..9e48b6c6ae 100644 --- a/src/index.njk +++ b/src/index.njk @@ -15,8 +15,8 @@ eleventyImport: {% from "image-aspect-ratio.njk" import imageAspectRatio %} {% set 'content' = { - "title": "Your expert guides for the journey ahead", - "text": "It takes brains to develop a no-brainer. At Mainmatter we teach, cross-pollinate and collaborate with our clients to develop digital products and practices they can build on.", + "title": "Team Up With Us To Go Further!", + "text": "We know the code, tools, and practices that go into successful development. We partner with our clients to solve their toughest tech challenges by sharing our skills and expertise as teammates.", "image": "/assets/images/hero/home.jpg", "alt": "Balloons flying over the sky", "loading": "eager" @@ -177,7 +177,7 @@ eleventyImport: {% include "global/default-newsletter-cta.njk" %} {% set 'content' = { - "title": "Grow your business with us", + "title": "Team up with us to go further!", "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" diff --git a/src/playbook.njk b/src/playbook.njk index ac07607a5e..badbf8f5ab 100644 --- a/src/playbook.njk +++ b/src/playbook.njk @@ -53,7 +53,7 @@ permalink: /playbook/ {{ strategyList('playbook', list=elements) }} {% set 'content' = { - "title": "Grow your business with us", + "title": "Team up with us to go further!", "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" diff --git a/src/posts/2013-06-15-authentication-in-emberjs.md b/src/posts/2013-06-15-authentication-in-emberjs.md index a35cee42f7..c5063c5ddb 100644 --- a/src/posts/2013-06-15-authentication-in-emberjs.md +++ b/src/posts/2013-06-15-authentication-in-emberjs.md @@ -3,33 +3,18 @@ title: "Authentication in ember.js" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" tags: ember -description: - "Marco Otte-Witte describes an approach for implementing a session mechanism, - authentication and authorization in Ember.js applications." +description: "Marco Otte-Witte describes an approach for implementing a session mechanism, authentication and authorization in Ember.js applications." tagline: |

    Update:I released an Ember.js plugin that makes it very easy to implement an authentication system as described in this post: Ember.SimpleAuth.

    Update: After I wrote this I found out that it’s actually not the best approach to implement authentication in Ember.js… There are some things missing and some other things can be done in a much simpler way. I wrote a summary of the (better) authentication mechanism we moved to.

    I’m using the latest (as of mid June 2013) ember/ember-data/handlebars code directly from the respective github repositories in this example.

    --- -When we started our first project with [ember.js](http://emberjs.com), **the -first thing we came across was how to implement authentication**. While all of -us had implemented authentication in "normal" [Rails](http://rubyonrails.org) -apps several times we initially weren’t sure how to do it in ember.js. Also -information on the internet was scarce and hard to find. +When we started our first project with [ember.js](http://emberjs.com), **the first thing we came across was how to implement authentication**. While all of us had implemented authentication in "normal" [Rails](http://rubyonrails.org) apps several times we initially weren’t sure how to do it in ember.js. Also information on the internet was scarce and hard to find. -The only more elaborate sample project I found was the -[ember-auth](https://github.com/heartsentwined/ember-auth) plugin. While that -seemed to be very complete and high quality it is also very heavy weight and I -didn’t want to add such a big thing to our codebase only to implement simple -authentication into our app. So I rolled my own implementation. +The only more elaborate sample project I found was the [ember-auth](https://github.com/heartsentwined/ember-auth) plugin. While that seemed to be very complete and high quality it is also very heavy weight and I didn’t want to add such a big thing to our codebase only to implement simple authentication into our app. So I rolled my own implementation. ## The basics -The general route to go with authentication in ember.js is to use **token based -authentication** where the client submits the regular username/password -credentials to the server once and if those are valid receives an authentication -token in response. That token is then sent along with every request the client -makes to the server. Having understood this the first thing to do is to -implement a regular login form with username and password fields: +The general route to go with authentication in ember.js is to use **token based authentication** where the client submits the regular username/password credentials to the server once and if those are valid receives an authentication token in response. That token is then sent along with every request the client makes to the server. Having understood this the first thing to do is to implement a regular login form with username and password fields: ```hbs {% raw %} @@ -47,10 +32,7 @@ implement a regular login form with username and password fields: {% endraw %} ``` -That template is backed by a route that handles the submission event and posts -the data to the /session route on the server - which then responds with either -status 401 or 200 and a JSON containing the authentication token and the id of -the authenticated user: +That template is backed by a route that handles the submission event and posts the data to the /session route on the server - which then responds with either status 401 or 200 and a JSON containing the authentication token and the id of the authenticated user: ```js @@ -81,13 +63,9 @@ App.SessionsNewRoute = Ember.Route.extend({ {% endraw %} ``` -I’m using a route instead of a controller here as redirecting should only be -done from routes and not controllers. See e.g. -[this SO post](http://stackoverflow.com/questions/11552417/emberjs-how-to-transition-to-a-router-from-a-controllers-action/11555014#11555014) -for more info. +I’m using a route instead of a controller here as redirecting should only be done from routes and not controllers. See e.g. [this SO post](http://stackoverflow.com/questions/11552417/emberjs-how-to-transition-to-a-router-from-a-controllers-action/11555014#11555014) for more info. -The response JSON from the server would look somehow like this in the successful -login case: +The response JSON from the server would look somehow like this in the successful login case: ```js {% raw %}on @@ -100,11 +78,7 @@ login case: {% endraw %} ``` -At this point the client has the authentication data necessary to authenticate -itself against the server. As tat authentication data would be lost every time -the application on the client reloads and we don’t want to force a new login -every time the user reloads the page we can simply **store that data in a cookie -(of course you could use local storage etc.)**: +At this point the client has the authentication data necessary to authenticate itself against the server. As tat authentication data would be lost every time the application on the client reloads and we don’t want to force a new login every time the user reloads the page we can simply **store that data in a cookie (of course you could use local storage etc.)**: ```js {% raw %} @@ -115,13 +89,7 @@ $.cookie('auth_account', App.Auth.get('accountId')); ## Making authenticated requests -The next step is to actually send the authentication token to the server. As the -only point point of interaction between client and server in an ember.js app is -**when the store adapter reads or writes data, the token has to be integrated in -that adapter somehow**. As there’s not (yet) any out-off-the-box support for -authentication in the -[DS.RESTAdapter](https://github.com/emberjs/data/blob/v3.9.0/addon/adapters/rest.js), -I simply added it myself: +The next step is to actually send the authentication token to the server. As the only point point of interaction between client and server in an ember.js app is **when the store adapter reads or writes data, the token has to be integrated in that adapter somehow**. As there’s not (yet) any out-off-the-box support for authentication in the [DS.RESTAdapter](https://github.com/emberjs/data/blob/v3.9.0/addon/adapters/rest.js), I simply added it myself: ```js {% raw %} @@ -136,12 +104,7 @@ App.AuthenticatedRESTAdapter = DS.RESTAdapter.extend({ {% endraw %} ``` -Now the adapter will pass along the authentication token with every request to -the server. One thing that should be made sure though is that whenever the -adapter sees **a -[401](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#401) response -which would mean that for some reason the authentication token became invalid, -the session data on the client is deleted** and we require a fresh login: +Now the adapter will pass along the authentication token with every request to the server. One thing that should be made sure though is that whenever the adapter sees **a [401](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#401) response which would mean that for some reason the authentication token became invalid, the session data on the client is deleted** and we require a fresh login: ```js {% raw %} @@ -156,13 +119,7 @@ DS.rejectionHandler = function (reason) { ## Enforcing authentication on the client -Now that the general authentication mechanism is in place it would be cool to -have a way of enforcing authentication on the client for specific routes so the -user never gets to see any pages that they aren’t allowed to. This can be done -by simply **introducing a custom route class that will check for the presence of -a session and if none is present redirects to the login screen**. Any other -routes that require authentication can then inherit from that one instead if the -regular [`Ember.Route`](http://emberjs.com/api/classes/Ember.Route.html) +Now that the general authentication mechanism is in place it would be cool to have a way of enforcing authentication on the client for specific routes so the user never gets to see any pages that they aren’t allowed to. This can be done by simply **introducing a custom route class that will check for the presence of a session and if none is present redirects to the login screen**. Any other routes that require authentication can then inherit from that one instead if the regular [`Ember.Route`](http://emberjs.com/api/classes/Ember.Route.html) ```js {% raw %} @@ -179,10 +136,7 @@ App.AuthenticatedRoute = Ember.Route.extend({ {% endraw %} ``` -This is actually very similar to the concept of an `AuthController` in Rails -with a -[`before_filter`](http://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html#method-i-before_filter) -that enforces authentication: +This is actually very similar to the concept of an `AuthController` in Rails with a [`before_filter`](http://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html#method-i-before_filter) that enforces authentication: ```rb class AuthenticatedController < ApplicationController @@ -194,8 +148,7 @@ end ## Cleanup -As the code is now spread up into a number of files and classes, I added a -`Session` model: +As the code is now spread up into a number of files and classes, I added a `Session` model: ```js {% raw %} @@ -206,8 +159,7 @@ App.Session = DS.Model.extend({ {% endraw %} ``` -alongside an `App.AuthManager` accompanied by a custom initializer to clean it -up: +alongside an `App.AuthManager` accompanied by a custom initializer to clean it up: ```js diff --git a/src/posts/2013-06-27-excellent-172.md b/src/posts/2013-06-27-excellent-172.md index cc691869d7..8722ff1957 100644 --- a/src/posts/2013-06-27-excellent-172.md +++ b/src/posts/2013-06-27-excellent-172.md @@ -2,17 +2,13 @@ title: "excellent 1.7.2" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte announces excellent 1.7.2 with 3 new checks and a more - forgiving and stable parser mechanism." +description: "Marco Otte-Witte announces excellent 1.7.2 with 3 new checks and a more forgiving and stable parser mechanism." tags: ruby tagline: |

    We just released excellent 1.7.2 which includes the following fixes:

    --- - fixed `Simplabs::Excellent::Checks::Rails::CustomInitializeMethodCheck` -- fixed `Simplabs::Excellent::Checks::MethodNameCheck` so it allows method names - that exist in Ruby itself -- fixed `Simplabs::Excellent::Checks::GlobalVariableCheck` so it doesn't report - false positives for rescue bodies +- fixed `Simplabs::Excellent::Checks::MethodNameCheck` so it allows method names that exist in Ruby itself +- fixed `Simplabs::Excellent::Checks::GlobalVariableCheck` so it doesn't report false positives for rescue bodies - made the parser more forgiving/stable in some situations diff --git a/src/posts/2013-06-28-excellent-200.md b/src/posts/2013-06-28-excellent-200.md index 7cdfbc78fb..0db64b2205 100644 --- a/src/posts/2013-06-28-excellent-200.md +++ b/src/posts/2013-06-28-excellent-200.md @@ -2,21 +2,14 @@ title: "excellent 2.0.0" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte announces excellent 2.0.0 with support for a configuration - file, a whitelist of allowed global variables and re-enabled standard checks." +description: "Marco Otte-Witte announces excellent 2.0.0 with support for a configuration file, a whitelist of allowed global variables and re-enabled standard checks." tags: ruby tagline: |

    We just released excellent 2.0.0 which has some big improvements:

    --- -- now supporting config file `.excellent.yml` in current working directory to - configure which specs to run/ not to run with thresholds, patterns etc. -- predefined globals will not be reported anymore (`$!`, `$@`, `$&`, - `$```,`\$’`,`\$+`,`\$1`,`\$2..`,`\$~`,`\$=`,`\$/`,`\$\`,`\$,`,`\$;`,`\$.`,`\$`,`\$\_`,`\$0`,`\$\*`,`\$\$`,`\$?`,`\$:`,`\$"`,`\$DEBUG`,`\$FILENAME`,`\$LOAD_PATH`,`\$stdin`,`\$stdout`,`\$stderr`,`\$VERBOSE`,`\$-0`,`\$-a`,`\$-d`,`\$-F`,`\$-i`,`\$-I`,`\$-l`,`\$-p`,`\$-v`) -- enabled previously disable checks again: `AbcMetricMethodCheck`, - `ControlCouplingCheck`, `CyclomaticComplexityBlockCheck`, - `CyclomaticComplexityMethodCheck`, `ForLoopCheck`, `FlogBlockCheck`, - `FlogClassCheck`, `FlogMethodCheck` +- now supporting config file `.excellent.yml` in current working directory to configure which specs to run/ not to run with thresholds, patterns etc. +- predefined globals will not be reported anymore (`$!`, `$@`, `$&`, `$```,`\$’`,`\$+`,`\$1`,`\$2..`,`\$~`,`\$=`,`\$/`,`\$\`,`\$,`,`\$;`,`\$.`,`\$`,`\$\_`,`\$0`,`\$\*`,`\$\$`,`\$?`,`\$:`,`\$"`,`\$DEBUG`,`\$FILENAME`,`\$LOAD_PATH`,`\$stdin`,`\$stdout`,`\$stderr`,`\$VERBOSE`,`\$-0`,`\$-a`,`\$-d`,`\$-F`,`\$-i`,`\$-I`,`\$-l`,`\$-p`,`\$-v`) +- enabled previously disable checks again: `AbcMetricMethodCheck`, `ControlCouplingCheck`, `CyclomaticComplexityBlockCheck`, `CyclomaticComplexityMethodCheck`, `ForLoopCheck`, `FlogBlockCheck`, `FlogClassCheck`, `FlogMethodCheck` - testing now uses Rspec 2 - internal cleanups/simplifications diff --git a/src/posts/2013-08-08-better-authentication-in-emberjs.md b/src/posts/2013-08-08-better-authentication-in-emberjs.md index 893fbff625..a811c162ba 100644 --- a/src/posts/2013-08-08-better-authentication-in-emberjs.md +++ b/src/posts/2013-08-08-better-authentication-in-emberjs.md @@ -2,46 +2,25 @@ title: "(better) Authentication in ember.js" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte introduces an update to the mechanism for implementing a - session, authentication and authorization in Ember.js applications." +description: "Marco Otte-Witte introduces an update to the mechanism for implementing a session, authentication and authorization in Ember.js applications." tags: ember tagline: |

    Update:I released an Ember.js plugin that makes it very easy to implement an authentication system as described in this post: Ember.SimpleAuth.

    When we started our first ember.js project in June 2013, one of the first things we implemented was authentication. Now, almost 2 months later, it has become clear that our initial approach was not really the best and had some shortcomings. So I implemented a better authentication (mostly based on the embercasts on authentication).

    --- -_I’m using the latest (as of early August 2013) [ember.js](http://emberjs.com) -and [handlebars](http://handlebarsjs.com) releases in this example._ +_I’m using the latest (as of early August 2013) [ember.js](http://emberjs.com) and [handlebars](http://handlebarsjs.com) releases in this example._ -_**Update:**I changed the section on actually using the token to use -[\$.ajaxPrefilter](http://api.jquery.com/jQuery.ajaxPrefilter/) instead of a -custom ember-data adapter_ +_**Update:**I changed the section on actually using the token to use [\$.ajaxPrefilter](http://api.jquery.com/jQuery.ajaxPrefilter/) instead of a custom ember-data adapter_ ## The basics -The basic approach is still the same as in our initial implementation - we have -a **`/session` route in our Rails app that the client `POST`s its credentials to -and if those are valid gets back an authentication token** together with an id -that identifies the user’s account on the server side. +The basic approach is still the same as in our initial implementation - we have a **`/session` route in our Rails app that the client `POST`s its credentials to and if those are valid gets back an authentication token** together with an id that identifies the user’s account on the server side. -This data is stored in a _"session"_ object on the client side (while -technically there is no session in this stateless authentication mechanism, I -still call it session in absence of an idea for a better name). The -**authentication token is then sent in a header** with every request the client -makes. +This data is stored in a _"session"_ object on the client side (while technically there is no session in this stateless authentication mechanism, I still call it session in absence of an idea for a better name). The **authentication token is then sent in a header** with every request the client makes. ## The client _"session"_ -The _"session"_ object on the client side is a **plain `Ember.Object` that -simply keeps the data that is received from the server** on session creation. It -also stores the authentication token and the user’s account ID in cookies so the -user doesn’t have to login again after a page reload (As Ed points out in a -comment on the old post it’s a security issue to store the authentication token -in a cookie without the user’s permission - I think using a session cookie like -I do should be ok as it’s deleted when the browser window is closed. Of course -you could also use sth. like localStorage like Marc points out. I’m creating -this object in an initializer so I can be sure it exists (of course it might be -empty) when the application starts. +The _"session"_ object on the client side is a **plain `Ember.Object` that simply keeps the data that is received from the server** on session creation. It also stores the authentication token and the user’s account ID in cookies so the user doesn’t have to login again after a page reload (As Ed points out in a comment on the old post it’s a security issue to store the authentication token in a cookie without the user’s permission - I think using a session cookie like I do should be ok as it’s deleted when the browser window is closed. Of course you could also use sth. like localStorage like Marc points out. I’m creating this object in an initializer so I can be sure it exists (of course it might be empty) when the application starts. ```js @@ -74,22 +53,11 @@ Ember.Application.initializer({ {% endraw %} ``` -When this has run I can always access the current _"session"_ information as -`App.Session`. Notice the `.create()` at the end of the initializer that creates -an instance of the `Ember.Object` right away. When we need to **check whether a -user is authenticated we can simply check for presence of the `authToken` -property**. Of course we could add a `isAuthenticated()` method that could -perform additional checks but we didn’t have the need for that yet. +When this has run I can always access the current _"session"_ information as `App.Session`. Notice the `.create()` at the end of the initializer that creates an instance of the `Ember.Object` right away. When we need to **check whether a user is authenticated we can simply check for presence of the `authToken` property**. Of course we could add a `isAuthenticated()` method that could perform additional checks but we didn’t have the need for that yet. -This _"session"_ object will also load the actual account record from the server -if the `authAccountId` is set -(`this.set('authAccount', App.Account.find(authAccountId));`. This allows us to -e.g. use `App.Session.authAccount.fullName` in our templates to display the -user’s name or similar data.) +This _"session"_ object will also load the actual account record from the server if the `authAccountId` is set (`this.set('authAccount', App.Account.find(authAccountId));`. This allows us to e.g. use `App.Session.authAccount.fullName` in our templates to display the user’s name or similar data.) -To actually use the `authToken` when making server requests, **we register an -[AJAX prefilter](http://api.jquery.com/jQuery.ajaxPrefilter/) that adds the -authentication token in a header as long as the request is sent to our domain**: +To actually use the `authToken` when making server requests, **we register an [AJAX prefilter](http://api.jquery.com/jQuery.ajaxPrefilter/) that adds the authentication token in a header as long as the request is sent to our domain**: ```js {% raw %} @@ -104,8 +72,7 @@ Ember.$.ajaxPrefilter(function (options, originalOptions, jqXHR) { {% endraw %} ``` -The Rails server can then find the authenticated user by the token in the -header: +The Rails server can then find the authenticated user by the token in the header: ```rb class ApplicationController < ActionController::Base @@ -122,11 +89,7 @@ end ## Logging in -As described above, the login API is a simple `/session` route on the server -side that accepts the user’s login and password and **responds with either HTTP -status 401 when the credentials are invalid or a session JSON when the -authentication was successful**. On the client side we have routes for creating -and destroying the session: +As described above, the login API is a simple `/session` route on the server side that accepts the user’s login and password and **responds with either HTTP status 401 when the credentials are invalid or a session JSON when the authentication was successful**. On the client side we have routes for creating and destroying the session: ```js @@ -140,14 +103,7 @@ App.Router.map(function() { {% endraw %} ``` -The `SessionNewController` only needs one action `login` that sends the entered -credentials and acts according to the server’s response - if the server responds -successfully **it reads the session data from the response and updates the -`App.Session` object accordingly**. It also checks whether there is an attempted -transition that was intercepted due to missing authentication and retries that -if it exists (This is the case where the user tries to access a certain page -without having authenticated, is redirected to the login form, logs in and is -redirected again to the initially requested page). +The `SessionNewController` only needs one action `login` that sends the entered credentials and acts according to the server’s response - if the server responds successfully **it reads the session data from the response and updates the `App.Session` object accordingly**. It also checks whether there is an attempted transition that was intercepted due to missing authentication and retries that if it exists (This is the case where the user tries to access a certain page without having authenticated, is redirected to the login form, logs in and is redirected again to the initially requested page). ```js @@ -178,12 +134,9 @@ App.SessionNewController = Ember.Controller.extend({ {% endraw %} ``` -Notice that we do not handle the error case here. To have a better user -experience you would probably want to define a `.fail` handler as well that -display an error message. +Notice that we do not handle the error case here. To have a better user experience you would probably want to define a `.fail` handler as well that display an error message. -The template is just a simple form (actual elements, classes etc. of course -depend on your specific application): +The template is just a simple form (actual elements, classes etc. of course depend on your specific application): ```hbs {% raw %} @@ -206,11 +159,7 @@ depend on your specific application): ## Logging out -Logging out is actually pretty simple as well. The **client just sends a -`DELETE` to the same `/session` route** that makes the server reset the -authentication token in the database so that the token on the client side is -invalidated. The client also deletes the saved session information in -`App.Session` so there’s no stale data. +Logging out is actually pretty simple as well. The **client just sends a `DELETE` to the same `/session` route** that makes the server reset the authentication token in the database so that the token on the client side is invalidated. The client also deletes the saved session information in `App.Session` so there’s no stale data. ```js @@ -233,9 +182,7 @@ App.SessionDestroyController = Ember.Controller.extend({ {% endraw %} ``` -As this action should be triggered as soon as the user enters the -`/#/session/destroy` route, we have a simple route implementation that -**triggers the action upon route activation**: +As this action should be triggered as soon as the user enters the `/#/session/destroy` route, we have a simple route implementation that **triggers the action upon route activation**: ```js @@ -250,9 +197,7 @@ App.SessionDestroyRoute = Ember.Route.extend({ ## Authenticated routes -To easily enable authentication for any route in the application, I created an -**`App.AuthenticatedRoute` that extends `Ember.Route`** and that all routes that -need to enforce user authentication can extend again: +To easily enable authentication for any route in the application, I created an **`App.AuthenticatedRoute` that extends `Ember.Route`** and that all routes that need to enforce user authentication can extend again: ```js @@ -272,8 +217,6 @@ App.AuthenticatedRoute = Ember.Route.extend({ {% endraw %} ``` -Notice that `redirectToLogin` sets the `attemptedTransition` of `App.Session` so -that the user will be redirected to the initially requested page after -successfulyl logging in. +Notice that `redirectToLogin` sets the `attemptedTransition` of `App.Session` so that the user will be redirected to the initially requested page after successfulyl logging in. This is better authentication with ember.js - enjoy! diff --git a/src/posts/2013-10-09-embersimpleauth.md b/src/posts/2013-10-09-embersimpleauth.md index 3ab0b42c8b..dca27776fa 100644 --- a/src/posts/2013-10-09-embersimpleauth.md +++ b/src/posts/2013-10-09-embersimpleauth.md @@ -2,26 +2,17 @@ title: "Ember.SimpleAuth" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte announces Ember.SimpleAuth, an addon for implementing a - session mechanism, authentication and authorization for Ember.js applications." +description: "Marco Otte-Witte announces Ember.SimpleAuth, an addon for implementing a session mechanism, authentication and authorization for Ember.js applications." tags: ember tagline: |

    Update: Ember.SimpleAuth 0.1.0 has been released! The information in this is (partially) outdated.

    After I wrote 2 blog posts on implementing token based authentication in Ember.js applications and got quite some feedback, good suggestions etc., I thought it would be nice to pack all these ideas in an Ember.js plugin so everybody could easily integrate that into their applications. Now I finally managed to release version 0.0.1 of that plugin: Ember.SimpleAuth.

    --- -Instead of providing a heavyweight out-of-the-box solution with predefined -routes, controllers etc., Ember.SimpleAuth defines lightweight mixins that the -application code implements. It also **does not dictate anything with respect to -application structure, routing etc**. However, setting up Ember.SimpleAuth is -**very straight forward** and it can be **completely customized**. The -requirements on the server interface are minimal -([see the README for more information on the server side](https://github.com/mainmatter/ember-simple-auth#the-server-side)). +Instead of providing a heavyweight out-of-the-box solution with predefined routes, controllers etc., Ember.SimpleAuth defines lightweight mixins that the application code implements. It also **does not dictate anything with respect to application structure, routing etc**. However, setting up Ember.SimpleAuth is **very straight forward** and it can be **completely customized**. The requirements on the server interface are minimal ([see the README for more information on the server side](https://github.com/mainmatter/ember-simple-auth#the-server-side)). ## Using Ember.SimpleAuth -Using Ember.SimpleAuth in an application only requires a few simple steps. -First, it must be enabled which is best done in a custom initializer: +Using Ember.SimpleAuth in an application only requires a few simple steps. First, it must be enabled which is best done in a custom initializer: ```js {% raw %} @@ -45,8 +36,7 @@ App.Router.map(function () { {% endraw %} ``` -Then, the generated **controller and route must implement the mixins provided by -Ember.SimpleAuth**: +Then, the generated **controller and route must implement the mixins provided by Ember.SimpleAuth**: ```js {% raw %} @@ -82,12 +72,7 @@ Of course the application also needs a template that renders the login form: {% endraw %} ``` -At this point, everything that’s necessary for users to log in and out is set -up. Also, every AJAX request (unless it’s a cross domain request) that the -application makes will send the authentication token that is obtained when the -user logs in. **To actually protect routes so that they are only accessible for -authenticated users, simply implement the respective Ember.SimpleAuth mixin** in -the route classes: +At this point, everything that’s necessary for users to log in and out is set up. Also, every AJAX request (unless it’s a cross domain request) that the application makes will send the authentication token that is obtained when the user logs in. **To actually protect routes so that they are only accessible for authenticated users, simply implement the respective Ember.SimpleAuth mixin** in the route classes: ```js {% raw %} @@ -99,10 +84,6 @@ App.ProtectedRoute = Ember.Route.extend( ## More -There is more documentation as well as examples in the -[repository on github](https://github.com/mainmatter/ember-simple-auth). Also -the **code base is quite small so I suggest to read through it** to better -understand what’s going on internally. +There is more documentation as well as examples in the [repository on github](https://github.com/mainmatter/ember-simple-auth). Also the **code base is quite small so I suggest to read through it** to better understand what’s going on internally. -Patches, bug reports etc. are highly appreciated of course - -[get started by forking the project on github](https://github.com/mainmatter/ember-simple-auth)! +Patches, bug reports etc. are highly appreciated of course - [get started by forking the project on github](https://github.com/mainmatter/ember-simple-auth)! diff --git a/src/posts/2013-10-28-embersimpleauth-implements-rfc-6749-oauth-20.md b/src/posts/2013-10-28-embersimpleauth-implements-rfc-6749-oauth-20.md index ad4aa7f870..96a2957a74 100644 --- a/src/posts/2013-10-28-embersimpleauth-implements-rfc-6749-oauth-20.md +++ b/src/posts/2013-10-28-embersimpleauth-implements-rfc-6749-oauth-20.md @@ -2,31 +2,17 @@ title: "Ember.SimpleAuth implements RFC 6749 (OAuth 2.0)" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte announces support for OAuth 2.0 in Ember.SimpleAuth, the - addon for implementing a session and authentication/authorization for - Ember.js." +description: "Marco Otte-Witte announces support for OAuth 2.0 in Ember.SimpleAuth, the addon for implementing a session and authentication/authorization for Ember.js." tags: ember tagline: |

    Update: Ember.SimpleAuth 0.1.0 has been released! The information in this is (partially) outdated.

    With the release of Ember.SimpleAuth 0.0.4 the library is compliant with OAuth 2.0 - specifically it implements the "Resource Owner Password Credentials Grant Type" as defined in RFC 6749 (thanks adamlc for the suggestion). While this is only a minor change in terms of functionality and data flow, used headers etc. it makes everyone’s life a lot easier as instead of implementing your own server endpoints you can now utilize one of several OAuth 2.0 middlewares that already implement the spec.

    --- -With the OAuth 2.0 support also comes **support for access token expiration and -[refresh tokens](http://tools.ietf.org/html/rfc6749#section-6)**. Using expiring -access tokens improves overall security as replay attacks are less likely while -with refresh tokens **Ember.SimpleAuth can automatically obtain new access -tokens** before they expire so that the user doesn’t recognize the token -actually changes. +With the OAuth 2.0 support also comes **support for access token expiration and [refresh tokens](http://tools.ietf.org/html/rfc6749#section-6)**. Using expiring access tokens improves overall security as replay attacks are less likely while with refresh tokens **Ember.SimpleAuth can automatically obtain new access tokens** before they expire so that the user doesn’t recognize the token actually changes. ## Other changes -Other smaller additions include **support for -[external OAuth/OpenID providers](https://github.com/mainmatter/ember-simple-auth#external-oauthopenid-providers)** -and -[manipulation of the request used to obtain the access token](https://github.com/mainmatter/ember-simple-auth#custom-server-protocols). -Also the API was simplified and the `login` and `logout` actions were moved to -the `ApplicationControllerMixin` and the `/logout` route has been removed. The -new API now looks like this: +Other smaller additions include **support for [external OAuth/OpenID providers](https://github.com/mainmatter/ember-simple-auth#external-oauthopenid-providers)** and [manipulation of the request used to obtain the access token](https://github.com/mainmatter/ember-simple-auth#custom-server-protocols). Also the API was simplified and the `login` and `logout` actions were moved to the `ApplicationControllerMixin` and the `/logout` route has been removed. The new API now looks like this: ```js {% raw %} @@ -53,10 +39,4 @@ App.LoginController = Ember.Controller.extend( ## Future plans -Currently I’m working on adding API documentation within the source together -with a means of generating some nice HTML out of that. I don’t currently see -that there is much else missing in the library so **I’d like to release a 1.0.0 -version soon**. Of course I’d like to make sure that Ember.SimpleAuth is -actually being used and working so -[please submit bug reports, patches etc.](https://github.com/mainmatter/ember-simple-auth) -or **provide general feedback/ideas!** +Currently I’m working on adding API documentation within the source together with a means of generating some nice HTML out of that. I don’t currently see that there is much else missing in the library so **I’d like to release a 1.0.0 version soon**. Of course I’d like to make sure that Ember.SimpleAuth is actually being used and working so [please submit bug reports, patches etc.](https://github.com/mainmatter/ember-simple-auth) or **provide general feedback/ideas!** diff --git a/src/posts/2014-01-20-embersimpleauth-010.md b/src/posts/2014-01-20-embersimpleauth-010.md index dda3c17cea..76b5480eb2 100644 --- a/src/posts/2014-01-20-embersimpleauth-010.md +++ b/src/posts/2014-01-20-embersimpleauth-010.md @@ -2,10 +2,7 @@ title: "Ember.SimpleAuth 0.1.0" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte announces Ember.SimpleAuth 0.1.0 with an improved - architecture that allows for arbitrary authentication and authorization - strategies." +description: "Marco Otte-Witte announces Ember.SimpleAuth 0.1.0 with an improved architecture that allows for arbitrary authentication and authorization strategies." tags: ember tagline: |

    Since Ember.SimpleAuth was released in October 2013, there were lots of issues reported, pull requests submitted and merged etc. Now all this feedback together with some fundamental design improvements results in the release of the 0.1.0 version of Ember.SimpleAuth. This is hopefully paving the way for a soon-to-be-released version 1.0.

    @@ -13,12 +10,7 @@ tagline: | ## What changed? -The most significant change is the **extraction of everything specific to -specific authentication/authorization mechanisms (e.g. the default OAuth 2.0 -implementation) into strategy classes** which significantly improves -customizability and extensibility. Instead of having to override parts of the -library, using e.g. a custom authentication method is now as simple as -specifying the class in the respective controller: +The most significant change is the **extraction of everything specific to specific authentication/authorization mechanisms (e.g. the default OAuth 2.0 implementation) into strategy classes** which significantly improves customizability and extensibility. Instead of having to override parts of the library, using e.g. a custom authentication method is now as simple as specifying the class in the respective controller: ```js {% raw %} @@ -31,25 +23,13 @@ App.LoginController = Ember.Controller.extend( {% endraw %} ``` -This **makes implementations cleaner and also helps defining the public API that -Ember.SimpleAuth** will settle on in the long term. +This **makes implementations cleaner and also helps defining the public API that Ember.SimpleAuth** will settle on in the long term. -Other changes include the introduction of store strategies (Ember.SimpleAuth -comes with a cookie store that is equivalent to the old store, a store that uses -the browser’s localStorage API and which is the new default as well as an -in-memory store which is mainly useful for testing) as well as error -handling/token invalidation, added callback actions like -`sessionInvalidationSucceeded` etc. See the -[README](https://github.com/mainmatter/ember-simple-auth#readme) and the -[API docs](http://ember-simple-auth.com/api/) for complete documentation. +Other changes include the introduction of store strategies (Ember.SimpleAuth comes with a cookie store that is equivalent to the old store, a store that uses the browser’s localStorage API and which is the new default as well as an in-memory store which is mainly useful for testing) as well as error handling/token invalidation, added callback actions like `sessionInvalidationSucceeded` etc. See the [README](https://github.com/mainmatter/ember-simple-auth#readme) and the [API docs](http://ember-simple-auth.com/api/) for complete documentation. ## Upgrading -Upgrading will be pretty straight forward in most cases. The main change that -could bite you is probably the change in `Ember.SimpleAuth.setup`’s signature. -While it used to expect the `container` as well as the application instance, -**the `container` argument was dropped** as it wasn’t actually needed. So in the -initializer, change this: +Upgrading will be pretty straight forward in most cases. The main change that could bite you is probably the change in `Ember.SimpleAuth.setup`’s signature. While it used to expect the `container` as well as the application instance, **the `container` argument was dropped** as it wasn’t actually needed. So in the initializer, change this: ```js {% raw %} @@ -75,9 +55,7 @@ Ember.Application.initializer({ {% endraw %} ``` -Also, as the **`login` and `logout` actions in `ApplicationRouteMixin` were -renamed to `authenticateSession` and `invalidateSession`**, in your templates -change this: +Also, as the **`login` and `logout` actions in `ApplicationRouteMixin` were renamed to `authenticateSession` and `invalidateSession`**, in your templates change this: ```hbs {% raw %} @@ -101,8 +79,7 @@ to this: {% endraw %} ``` -Also the **`LoginControllerMixin`’s `login` action was renamed to -`authenticate`** so in your login template change this: +Also the **`LoginControllerMixin`’s `login` action was renamed to `authenticate`** so in your login template change this: ```hbs {% raw %} @@ -118,17 +95,8 @@ to this: {% endraw %} ``` -These are really the only changes needed if your application is using -Ember.SimpleAuth’s default settings, the default OAuth 2.0 mechanism etc. For -other scenarios, see the -[README](https://github.com/mainmatter/ember-simple-auth#readme), -[API docs](http://ember-simple-auth.com/api/) and also the examples provided in -the repository. +These are really the only changes needed if your application is using Ember.SimpleAuth’s default settings, the default OAuth 2.0 mechanism etc. For other scenarios, see the [README](https://github.com/mainmatter/ember-simple-auth#readme), [API docs](http://ember-simple-auth.com/api/) and also the examples provided in the repository. ## Outlook -**I hope that this release can pave the way towards a stable API for -Ember.SimpleAuth.** It would also be great of course if many people came up with -authenticator and authorizer implementations for all kinds of backends to prove -the design of Ember.SimpleAuth’s strategy approach as well as to build a library -of ready-to-use strategies for the most common setups. +**I hope that this release can pave the way towards a stable API for Ember.SimpleAuth.** It would also be great of course if many people came up with authenticator and authorizer implementations for all kinds of backends to prove the design of Ember.SimpleAuth’s strategy approach as well as to build a library of ready-to-use strategies for the most common setups. diff --git a/src/posts/2014-03-11-embersimpleauth-020.md b/src/posts/2014-03-11-embersimpleauth-020.md index ed77b7e015..25e7ba126e 100644 --- a/src/posts/2014-03-11-embersimpleauth-020.md +++ b/src/posts/2014-03-11-embersimpleauth-020.md @@ -2,14 +2,10 @@ title: "Ember.SimpleAuth 0.2.0" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte announces Ember.SimpleAuth 0.2.0 with a completely rebuilt - build and testing infrastructure as well as important bug fixes." +description: "Marco Otte-Witte announces Ember.SimpleAuth 0.2.0 with a completely rebuilt build and testing infrastructure as well as important bug fixes." tags: ember tagline: |

    We released Ember.SimpleAuth 0.2.0.

    --- -Ember.SimpleAuth was released with a **completely rebuilt build and testing -infrastructure as well as some important bug fixes. Find the -[complete release notes on github](https://github.com/mainmatter/ember-simple-auth/releases/tag/0.2.0).** +Ember.SimpleAuth was released with a **completely rebuilt build and testing infrastructure as well as some important bug fixes. Find the [complete release notes on github](https://github.com/mainmatter/ember-simple-auth/releases/tag/0.2.0).** diff --git a/src/posts/2014-04-06-embersimpleauth-021.md b/src/posts/2014-04-06-embersimpleauth-021.md index 724fa0d3ab..6df2f8580e 100644 --- a/src/posts/2014-04-06-embersimpleauth-021.md +++ b/src/posts/2014-04-06-embersimpleauth-021.md @@ -2,13 +2,10 @@ title: "Ember.SimpleAuth 0.2.1" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte announces Ember.SimpleAuth 0.2.1 with some minor - improvements." +description: "Marco Otte-Witte announces Ember.SimpleAuth 0.2.1 with some minor improvements." tags: ember tagline: |

    We released Ember.SimpleAuth 0.2.1.

    --- -Ember.SimpleAuth 0.2.1 was released with some minor improvements: -[https://github.com/mainmatter/ember-simple-auth/releases/tag/0.2.1](https://github.com/mainmatter/ember-simple-auth/releases/tag/0.2.1) +Ember.SimpleAuth 0.2.1 was released with some minor improvements: [https://github.com/mainmatter/ember-simple-auth/releases/tag/0.2.1](https://github.com/mainmatter/ember-simple-auth/releases/tag/0.2.1) diff --git a/src/posts/2014-04-10-embersimpleauth-030.md b/src/posts/2014-04-10-embersimpleauth-030.md index f08edb0da8..e5eb1c884f 100644 --- a/src/posts/2014-04-10-embersimpleauth-030.md +++ b/src/posts/2014-04-10-embersimpleauth-030.md @@ -2,9 +2,7 @@ title: "Ember.SimpleAuth 0.3.0" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte announces Ember.SimpleAuth 0.3.0, splitting the addon into a - core and extensions for specific authentication/authorization mechanisms." +description: "Marco Otte-Witte announces Ember.SimpleAuth 0.3.0, splitting the addon into a core and extensions for specific authentication/authorization mechanisms." tags: ember tagline: |

    Ember.SimpleAuth 0.3.0 was just released. The main change in this release is the split of Ember.SimpleAuth into one core library and a set of extension libraries. These extension libraries include everything that’s not mandatorily required for Ember.SimpleAuth like authenticators, stores etc. so that every application would only have to load whatever it needs.

    @@ -12,26 +10,13 @@ tagline: | These extension libraries are: -- **ember-simple-auth-oauth2**: includes the OAuth 2.0 authenticator and - authorizer which are just one option out of many and probably not needed in - many projects (e.g. when using a custom authenticator) -- **ember-simple-auth-devise**: new authenticator/authorizer package that is - compatible with the Ruby gem - [devise](https://github.com/plataformatec/devise). -- **ember-simple-auth-cookie-store**: The cookie store which is probably only - used in few projects. +- **ember-simple-auth-oauth2**: includes the OAuth 2.0 authenticator and authorizer which are just one option out of many and probably not needed in many projects (e.g. when using a custom authenticator) +- **ember-simple-auth-devise**: new authenticator/authorizer package that is compatible with the Ruby gem [devise](https://github.com/plataformatec/devise). +- **ember-simple-auth-cookie-store**: The cookie store which is probably only used in few projects. -There are hopefully more extension libraries to come as people start to provide -more authenticators, authorizers and other components and now there’s a (more or -less, pre 1.0) stable API for these libraries as well as a set of tasks to build -and test them +There are hopefully more extension libraries to come as people start to provide more authenticators, authorizers and other components and now there’s a (more or less, pre 1.0) stable API for these libraries as well as a set of tasks to build and test them -Another bigger change in this release is that **having an authorizer is now -optional**. As there are applications that are purely client side and don’t use -a server backend expecting every application to use an authorizer was probably -not so great in the first place. However, applications that do use an authorizer -can simply configure one in Ember.SimpleAuth’s setup method and everything will -behave as before: +Another bigger change in this release is that **having an authorizer is now optional**. As there are applications that are purely client side and don’t use a server backend expecting every application to use an authorizer was probably not so great in the first place. However, applications that do use an authorizer can simply configure one in Ember.SimpleAuth’s setup method and everything will behave as before: ```js {% raw %} @@ -46,5 +31,4 @@ Ember.Application.initializer({ {% endraw %} ``` -For more information about this release see the release notes at: -[https://github.com/mainmatter/ember-simple-auth/releases/tag/0.3.0](https://github.com/mainmatter/ember-simple-auth/releases/tag/0.3.0) +For more information about this release see the release notes at: [https://github.com/mainmatter/ember-simple-auth/releases/tag/0.3.0](https://github.com/mainmatter/ember-simple-auth/releases/tag/0.3.0) diff --git a/src/posts/2014-04-24-embersimpleauth-needs-a-logo.md b/src/posts/2014-04-24-embersimpleauth-needs-a-logo.md index 36f8d9a35f..be3d22c073 100644 --- a/src/posts/2014-04-24-embersimpleauth-needs-a-logo.md +++ b/src/posts/2014-04-24-embersimpleauth-needs-a-logo.md @@ -2,16 +2,10 @@ title: "Ember.SimpleAuth needs a logo!" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte posts a request for the community to contribute a logo to - Ember.SimpleAuth." +description: "Marco Otte-Witte posts a request for the community to contribute a logo to Ember.SimpleAuth." tags: ember tagline: |

    The project needs a logo.

    --- -Every good open source project needs a nice and shiny logo these days. It would -be great if Ember.SimpleAuth had one as well. As I’m not really an expert in -these things it would be great if some of the more artistic advanced -contributors/followers could -[contribute something](https://github.com/mainmatter/ember-simple-auth/issues/152)! +Every good open source project needs a nice and shiny logo these days. It would be great if Ember.SimpleAuth had one as well. As I’m not really an expert in these things it would be great if some of the more artistic advanced contributors/followers could [contribute something](https://github.com/mainmatter/ember-simple-auth/issues/152)! diff --git a/src/posts/2014-06-30-using-ember-simple-auth-with-ember-cli.md b/src/posts/2014-06-30-using-ember-simple-auth-with-ember-cli.md index da4cce3d3f..4a5671a501 100644 --- a/src/posts/2014-06-30-using-ember-simple-auth-with-ember-cli.md +++ b/src/posts/2014-06-30-using-ember-simple-auth-with-ember-cli.md @@ -2,9 +2,7 @@ title: "Using Ember Simple Auth with ember-cli" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte announces the release of ember-cli-simple-auth as an Ember - CLI addon." +description: "Marco Otte-Witte announces the release of ember-cli-simple-auth as an Ember CLI addon." tags: ember tagline: |

    With the latest release of Ember Simple Auth, using the library with ember-cli has become much simpler. As ember-cli in general is still pretty new to many people though, this post describes how to setup a project using Ember Simple Auth with ember-cli.

    @@ -12,9 +10,7 @@ tagline: | ## Setting up the basic project -First of all you need to install [PhantomJS](http://phantomjs.org), -[bower](http://bower.io) and of course ember-cli (Ember Simple Auth requires -**at least Ember CLI 0.0.44**): +First of all you need to install [PhantomJS](http://phantomjs.org), [bower](http://bower.io) and of course ember-cli (Ember Simple Auth requires **at least Ember CLI 0.0.44**): ```bash npm install -g phantomjs @@ -37,22 +33,16 @@ ember server ## Installing Ember Simple Auth -Installing Ember Simple Auth in an ember-cli project is really easy now. All you -have to do is install -[the ember-cli addon from npm](https://www.npmjs.com/package/ember-cli-simple-auth): +Installing Ember Simple Auth in an ember-cli project is really easy now. All you have to do is install [the ember-cli addon from npm](https://www.npmjs.com/package/ember-cli-simple-auth): ```bash npm install --save-dev ember-cli-simple-auth ember generate ember-cli-simple-auth ``` -This will install Ember Simple Auth’s -[AMD](http://requirejs.org/docs/whyamd.html) distribution into the project, -register the initializer so Ember Simple Auth automatically sets itself up and -add itself as a dependency to the project’s `package.json`. +This will install Ember Simple Auth’s [AMD](http://requirejs.org/docs/whyamd.html) distribution into the project, register the initializer so Ember Simple Auth automatically sets itself up and add itself as a dependency to the project’s `package.json`. -You can add a login route and login/logout links to verify it all actually -works: +You can add a login route and login/logout links to verify it all actually works: ```js {% raw %} @@ -89,20 +79,14 @@ export default Ember.Route.extend(ApplicationRouteMixin); ## Setting up authentication -To actually give the user the option to login, we need to add an authentication -package for Ember Simple Auth. Let’s assume you have an OAuth 2.0 compatible -server running at `http://localhost:3000`. To use that, install the -[OAuth 2.0 extension library](https://github.com/mainmatter/ember-simple-auth/blob/master/addon/authenticators/oauth2-password-grant.js) -which again is as easy as installing the -[package from npm](https://www.npmjs.com/package/ember-cli-simple-auth-oauth2): +To actually give the user the option to login, we need to add an authentication package for Ember Simple Auth. Let’s assume you have an OAuth 2.0 compatible server running at `http://localhost:3000`. To use that, install the [OAuth 2.0 extension library](https://github.com/mainmatter/ember-simple-auth/blob/master/addon/authenticators/oauth2-password-grant.js) which again is as easy as installing the [package from npm](https://www.npmjs.com/package/ember-cli-simple-auth-oauth2): ```bash npm install --save-dev ember-cli-simple-auth-oauth2 ember generate ember-cli-simple-auth-oauth2 ``` -Like the ember-cli-simple-auth package this will setup itself so that nothing -else has to be done in order to use the OAuth 2.0 functionality. +Like the ember-cli-simple-auth package this will setup itself so that nothing else has to be done in order to use the OAuth 2.0 functionality. The OAuth 2.0 authentication mechanism needs a login form, so let’s create that: @@ -123,8 +107,7 @@ The OAuth 2.0 authentication mechanism needs a login form, so let’s create tha {% endraw %} ``` -Then implement the `LoginControllerMixin` in the login controller and make that -use the OAuth 2.0 authenticator to perform the actual authentication: +Then implement the `LoginControllerMixin` in the login controller and make that use the OAuth 2.0 authenticator to perform the actual authentication: ```js {% raw %} @@ -138,9 +121,7 @@ export default Ember.Controller.extend(LoginControllerMixin, { {% endraw %} ``` -As the OAuth 2.0 authenticator would by default use the same domain and port to -send the authentication requests to that the Ember.js is loaded from you need to -configure it to use `http://localhost:3000` instead: +As the OAuth 2.0 authenticator would by default use the same domain and port to send the authentication requests to that the Ember.js is loaded from you need to configure it to use `http://localhost:3000` instead: ```js {% raw %} @@ -154,15 +135,8 @@ if (environment === 'development') { {% endraw %} ``` -You also need to make sure that your server allows cross origin requests by -[enabling CORS](http://enable-cors.org) (e.g. with -[rack-cors](https://github.com/cyu/rack-cors) if you’re using a rack based -server). +You also need to make sure that your server allows cross origin requests by [enabling CORS](http://enable-cors.org) (e.g. with [rack-cors](https://github.com/cyu/rack-cors) if you’re using a rack based server). ## Conclusion -This is how you set up an ember-cli project with Ember Simple Auth. For further -documentation and examples see the -[github repository](https://github.com/mainmatter/ember-simple-auth) and the -[API docs for Ember Simple Auth](http://ember-simple-auth.com/api/) and the -[OAuth 2.0 extension library](http://ember-simple-auth.com/api/). +This is how you set up an ember-cli project with Ember Simple Auth. For further documentation and examples see the [github repository](https://github.com/mainmatter/ember-simple-auth) and the [API docs for Ember Simple Auth](http://ember-simple-auth.com/api/) and the [OAuth 2.0 extension library](http://ember-simple-auth.com/api/). diff --git a/src/posts/2014-07-25-testing-with-ember-simple-auth-and-ember-cli.md b/src/posts/2014-07-25-testing-with-ember-simple-auth-and-ember-cli.md index 09b8be1e7f..2be2c54ae9 100644 --- a/src/posts/2014-07-25-testing-with-ember-simple-auth-and-ember-cli.md +++ b/src/posts/2014-07-25-testing-with-ember-simple-auth-and-ember-cli.md @@ -2,9 +2,7 @@ title: "Testing with Ember Simple Auth and Ember CLI" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte explains how to test Ember CLI applications using - ember-cli-simple-auth with the testing package ember-cli-simple-auth-testing." +description: "Marco Otte-Witte explains how to test Ember CLI applications using ember-cli-simple-auth with the testing package ember-cli-simple-auth-testing." tags: ember tagline: |

    The last blog post showed how to use Ember Simple Auth with Ember CLI to implement session handling and authentication. This post shows how to test that code.

    @@ -12,18 +10,14 @@ tagline: | ## The testing package -First of all **install the new -[ember-cli-simple-auth-testing package](https://www.npmjs.com/package/ember-cli-simple-auth-testing)**: +First of all **install the new [ember-cli-simple-auth-testing package](https://www.npmjs.com/package/ember-cli-simple-auth-testing)**: ```bash npm install --save-dev ember-cli-simple-auth-testing ember generate ember-cli-simple-auth-testing ``` -**This package adds test helpers to the application** (unless it’s running with -the `production` environment) that make it easy to authenticate and invalidate -the session in tests without having to stub server responses etc. To make these -helpers available to all tests, import them in `tests/helpers/start-app.js`: +**This package adds test helpers to the application** (unless it’s running with the `production` environment) that make it easy to authenticate and invalidate the session in tests without having to stub server responses etc. To make these helpers available to all tests, import them in `tests/helpers/start-app.js`: ```js {% raw %} @@ -38,13 +32,7 @@ export default function startApp(attrs) { ## Configuring the `test` environment -The next step is to configure the `test` environment. As the tests should be -isolated and leave no traces of any kind so that subsequent tests don’t have -implicit dependencies on the ones that have run earlier, Ember Simple Auth’s -default `localStorage` store cannot be used as that would leave data in the -`localStorage`. **Instead configure the -[ephemeral store](http://ember-simple-auth.com/api/classes/EphemeralStore.html) -to be used in the `test` environment**: +The next step is to configure the `test` environment. As the tests should be isolated and leave no traces of any kind so that subsequent tests don’t have implicit dependencies on the ones that have run earlier, Ember Simple Auth’s default `localStorage` store cannot be used as that would leave data in the `localStorage`. **Instead configure the [ephemeral store](http://ember-simple-auth.com/api/classes/EphemeralStore.html) to be used in the `test` environment**: ```js {% raw %} @@ -57,15 +45,11 @@ if (environment === 'test') { {% endraw %} ``` -The ephemeral store stores data in memory and thus will be completely fresh for -every test so that tests cannot influence each other. +The ephemeral store stores data in memory and thus will be completely fresh for every test so that tests cannot influence each other. ## Adding the Tests -Now everything is set up and a test can be added. To e.g. test that a certain -route can only be accessed when the session is authenticated, add tests like -these (notice the use of the test helpers `authenticateSession` and -`invalidateSession`): +Now everything is set up and a test can be added. To e.g. test that a certain route can only be accessed when the session is authenticated, add tests like these (notice the use of the test helpers `authenticateSession` and `invalidateSession`): ```js {% raw %} @@ -91,6 +75,4 @@ test('a protected route is not accessible when the session is not authenticated' {% endraw %} ``` -This is how easy it is to test session handling and authentication with Ember -Simple Auth and Ember CLI. The full example project can be -[found on github](https://github.com/mainmatter/ember-simple-auth-example) +This is how easy it is to test session handling and authentication with Ember Simple Auth and Ember CLI. The full example project can be [found on github](https://github.com/mainmatter/ember-simple-auth-example) diff --git a/src/posts/2014-10-15-the-most-important-command-when-working-with-xcode-6.md b/src/posts/2014-10-15-the-most-important-command-when-working-with-xcode-6.md index f61dc2976d..008d0685ff 100644 --- a/src/posts/2014-10-15-the-most-important-command-when-working-with-xcode-6.md +++ b/src/posts/2014-10-15-the-most-important-command-when-working-with-xcode-6.md @@ -2,9 +2,7 @@ title: "The most important command when working with XCode 6" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte shows how to disable XCode 6's crash reporter dialog for a - less annoying development experience." +description: "Marco Otte-Witte shows how to disable XCode 6's crash reporter dialog for a less annoying development experience." tags: misc tagline: |

    Switching off XCode's Crash Reporter saved my day.

    @@ -14,6 +12,4 @@ tagline: | defaults write com.apple.CrashReporter DialogType none ``` -This disables the Crash Reporter window that shows when SourceKitService crashes -(which is all the time). So while it doesn’t prevent SourceKitService from -crashing at least you don’t have to click that window away anymore. +This disables the Crash Reporter window that shows when SourceKitService crashes (which is all the time). So while it doesn’t prevent SourceKitService from crashing at least you don’t have to click that window away anymore. diff --git a/src/posts/2015-07-29-ember-simple-auth-10-a-first-look.md b/src/posts/2015-07-29-ember-simple-auth-10-a-first-look.md index d454c26ed0..0a4f64f43b 100644 --- a/src/posts/2015-07-29-ember-simple-auth-10-a-first-look.md +++ b/src/posts/2015-07-29-ember-simple-auth-10-a-first-look.md @@ -2,10 +2,7 @@ title: "Ember Simple Auth 1.0 - a first look" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte gives an outlook on Ember Simple Auth 1.0 with Ember.js 2.0 - support, a session service and discontinued support for non-Ember CLI - projects." +description: "Marco Otte-Witte gives an outlook on Ember Simple Auth 1.0 with Ember.js 2.0 support, a session service and discontinued support for non-Ember CLI projects." tags: ember tagline: |

    The first beta of Ember Simple Auth 1.0 will be released soon and this post provides a first look at the changes that come with it.

    @@ -13,18 +10,11 @@ tagline: | ## Ember 2.0 Compatibility -The biggest improvement of course is that the **library will be compatible with -Ember 2.0** (which is mainly due to the fact that it now uses instance -initializers for a majority of its setup work). Also when using Ember 1.13 you -shouldn’t be seeing any deprecations triggered by Ember Simple Auth anymore so -that the upgrade path to 2.0 is clean. +The biggest improvement of course is that the **library will be compatible with Ember 2.0** (which is mainly due to the fact that it now uses instance initializers for a majority of its setup work). Also when using Ember 1.13 you shouldn’t be seeing any deprecations triggered by Ember Simple Auth anymore so that the upgrade path to 2.0 is clean. ## Session as a Service -While previous versions of Ember Simple Auth injected the session into routes, -controllers and components, **Ember Simple Auth 1.0 drops that and instead -provides a new `Session` service** that encapsulates all access to the actual -session and can simply be injected wherever necessary, e.g.: +While previous versions of Ember Simple Auth injected the session into routes, controllers and components, **Ember Simple Auth 1.0 drops that and instead provides a new `Session` service** that encapsulates all access to the actual session and can simply be injected wherever necessary, e.g.: ```js @@ -48,17 +38,9 @@ export default Ember.Component.extend({ {% endraw %} ``` -It provides a similar UI as the old session object, including `authenticate` and -`invalidate` methods. Instead of reading the session content directly from the -session as was the case in old versions of the library, the session provides a -`content` property that can be used to read and write date from and to the -session. +It provides a similar UI as the old session object, including `authenticate` and `invalidate` methods. Instead of reading the session content directly from the session as was the case in old versions of the library, the session provides a `content` property that can be used to read and write date from and to the session. -Also support for defining a custom session class has been dropped in favor of -defining a service that uses the session service to provide functionality based -on that. E.g. the typical use case of providing access to the authenticated -account can now easily be implemented with a `SessionAccount` service that in -turn uses the `Session` service: +Also support for defining a custom session class has been dropped in favor of defining a service that uses the session service to provide functionality based on that. E.g. the typical use case of providing access to the authenticated account can now easily be implemented with a `SessionAccount` service that in turn uses the `Session` service: ```js @@ -84,45 +66,19 @@ export default Ember.Service.extend({ ## Ember CLI only -While previous versions of Ember Simple Auth provided 3 different versions (AMD, -globals and the Ember CLI addons) where the Ember CLI addon was also split up -into several sub addons, **1.0 will come as one single Ember CLI addon**. This -offers 3 main advantages: - -- The project structure is the standard Ember CLI addon structure and no longer - a custom set of grunt tasks etc. This not only makes the development and - release process much simpler but also promotes contributions from others. -- It is now much simpler to install Ember CLI as it’s now only - `ember install ember-simple-auth` command instead of install at least 2 - packages or potentially more. -- Since all the source is now transpiled with Babel as part of the Ember CLI - build process, all the source code has been updated to use thinks like - template strings, function literals, deconstruction etc., making the code far - more concise and readable. +While previous versions of Ember Simple Auth provided 3 different versions (AMD, globals and the Ember CLI addons) where the Ember CLI addon was also split up into several sub addons, **1.0 will come as one single Ember CLI addon**. This offers 3 main advantages: + +- The project structure is the standard Ember CLI addon structure and no longer a custom set of grunt tasks etc. This not only makes the development and release process much simpler but also promotes contributions from others. +- It is now much simpler to install Ember CLI as it’s now only `ember install ember-simple-auth` command instead of install at least 2 packages or potentially more. +- Since all the source is now transpiled with Babel as part of the Ember CLI build process, all the source code has been updated to use thinks like template strings, function literals, deconstruction etc., making the code far more concise and readable. ## Getting to 1.0 -1.0 is still not fully finished and ready for release. While I plan to release a -first beta until next week latest, getting to the final release still requires -some work: - -- The docs need to be updated to fit the new API and modules. Existing - documentation is still based on classes and namespaces and we need to find a - way to convert that so we document modules instead. -- The docs are also not complete for new features like the **Session** service - and existing documentation needs to be reviewed for whether it’s actually - still correct. -- The code should be reviewed and cleaned up before the final 1.0 release - much - of it is still what I wrote almost 2 years ago when I was still relatively new - to Ember and could probably be greatly improved. -- The setup of the AJAX prefilter should be decoupled from the library so that - it’s opt-in and could be replaced with a different approach (e.g. sth. that - sets a property on the application’s Ember Data adapter instead) - see - [#522](https://github.com/mainmatter/ember-simple-auth/pull/522) and - [#270](https://github.com/mainmatter/ember-simple-auth/issues/270). A - compatibility Addon should be extracted that implements the current behavior - of setting up the prefilter automatically. - -You can track the progress in the `jj-abrams` branch and if you want to submit a -PR for any of the above mentioned tasks that would be greatly appreciated of -course! +1.0 is still not fully finished and ready for release. While I plan to release a first beta until next week latest, getting to the final release still requires some work: + +- The docs need to be updated to fit the new API and modules. Existing documentation is still based on classes and namespaces and we need to find a way to convert that so we document modules instead. +- The docs are also not complete for new features like the **Session** service and existing documentation needs to be reviewed for whether it’s actually still correct. +- The code should be reviewed and cleaned up before the final 1.0 release - much of it is still what I wrote almost 2 years ago when I was still relatively new to Ember and could probably be greatly improved. +- The setup of the AJAX prefilter should be decoupled from the library so that it’s opt-in and could be replaced with a different approach (e.g. sth. that sets a property on the application’s Ember Data adapter instead) - see [#522](https://github.com/mainmatter/ember-simple-auth/pull/522) and [#270](https://github.com/mainmatter/ember-simple-auth/issues/270). A compatibility Addon should be extracted that implements the current behavior of setting up the prefilter automatically. + +You can track the progress in the `jj-abrams` branch and if you want to submit a PR for any of the above mentioned tasks that would be greatly appreciated of course! diff --git a/src/posts/2015-08-07-rails-api-auth.md b/src/posts/2015-08-07-rails-api-auth.md index 2e77d7488c..4820d8578f 100644 --- a/src/posts/2015-08-07-rails-api-auth.md +++ b/src/posts/2015-08-07-rails-api-auth.md @@ -2,9 +2,7 @@ title: "Rails API Auth" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - 'Marco Otte-Witte announces rails_api_auth, a Rails engine that implements the - "Resource Owner Password Credentials Grant" OAuth 2.0 flow.' +description: 'Marco Otte-Witte announces rails_api_auth, a Rails engine that implements the "Resource Owner Password Credentials Grant" OAuth 2.0 flow.' tags: ruby tagline: |

    We are happy to announce the first public release of the rails_api_auth gem. rails_api_auth is a lightweight Rails Engine that implements the "Resource Owner Password Credentials Grant" OAuth 2.0 flow as well as Facebook authentication and is built for usage in API projects. If you’re building a client side application with e.g. a browser MVC like Ember.js (where you might be using Ember Simple Auth which works great with rails_api_auth of course), a mobile app or anything else that’s backed by a Rails-based API, rails_api_auth is for you.

    @@ -12,49 +10,20 @@ tagline: | ## Why another Authentication Engine? -Of course there are lots of authentication libraries for Rails already. While -all of them are great and work well especially with traditional server rendered -applications none of them are really lightweight and simple. In fact they are -all pretty massive - all of them provide a lot more functionality than -rails_api_auth does of course though. However, when you’re building an API and -all you want is to provide a mechanism for users to exchange their login -credentials for a token and then validate that incoming requests include a valid -token in the `Authorization` header, you just don’t need most of that -functionality and could use sth. much smaller, easier to understand and debug. -In fact, rails_api_auth is basically just the controller and model plus a few -helper methods that we use in most of our Rails-based API projects. When we -realized we were reimplementing those in most projects we decided to extract -them into an engine so they could be easily reused and also shared with others. +Of course there are lots of authentication libraries for Rails already. While all of them are great and work well especially with traditional server rendered applications none of them are really lightweight and simple. In fact they are all pretty massive - all of them provide a lot more functionality than rails_api_auth does of course though. However, when you’re building an API and all you want is to provide a mechanism for users to exchange their login credentials for a token and then validate that incoming requests include a valid token in the `Authorization` header, you just don’t need most of that functionality and could use sth. much smaller, easier to understand and debug. In fact, rails_api_auth is basically just the controller and model plus a few helper methods that we use in most of our Rails-based API projects. When we realized we were reimplementing those in most projects we decided to extract them into an engine so they could be easily reused and also shared with others. ## The _"Resource Owner Password Credentials Grant"_ -The _"Resource Owner Password Credentials Grant"_ flow is really **just a -formalization of the process where the users send their login credentials to the -server and in return receive a token** (we’re using random Bearer tokens for now -but will also support JSON Web Tokens (JWTs) soon). That **token will then be -sent in the `Authorization` header** in subsequent requests so that the server -can validate the user’s identity. The engine stores these credentials and tokens -in `Login` models. Storing that data in a separate model instead of the -application’s `User` model keeps the authentication code clearly separated from -user profile data etc. and makes the engine easier to integrate. The `Login` -model can be associated to the application’s `User` model by setting the -`user_model_relation` configuration value -([see the README for more info on configuring the engine).](https://github.com/mainmatter/rails_api_auth#configuration) - -The _"Resource Owner Password Credentials Grant"_ flow defines 2 endpoints - one -for obtaining a token and one for revoking it (the 2nd one is actually optional -as users can be logged without any server interaction by simply deleting the -token on the client): +The _"Resource Owner Password Credentials Grant"_ flow is really **just a formalization of the process where the users send their login credentials to the server and in return receive a token** (we’re using random Bearer tokens for now but will also support JSON Web Tokens (JWTs) soon). That **token will then be sent in the `Authorization` header** in subsequent requests so that the server can validate the user’s identity. The engine stores these credentials and tokens in `Login` models. Storing that data in a separate model instead of the application’s `User` model keeps the authentication code clearly separated from user profile data etc. and makes the engine easier to integrate. The `Login` model can be associated to the application’s `User` model by setting the `user_model_relation` configuration value ([see the README for more info on configuring the engine).](https://github.com/mainmatter/rails_api_auth#configuration) + +The _"Resource Owner Password Credentials Grant"_ flow defines 2 endpoints - one for obtaining a token and one for revoking it (the 2nd one is actually optional as users can be logged without any server interaction by simply deleting the token on the client): ``` token POST /token oauth2#create revoke POST /revoke oauth2#destroy ``` -Both of these endpoints are already implemented in the engine. To validate that -incoming requests include a valid Bearer token, the library defines the -`authenticate!` method that is easily added as a `before_action` in -authenticated-only controllers: +Both of these endpoints are already implemented in the engine. To validate that incoming requests include a valid Bearer token, the library defines the `authenticate!` method that is easily added as a `before_action` in authenticated-only controllers: ```ruby class SecretThingsController < ApplicationController @@ -66,30 +35,14 @@ class SecretThingsController < ApplicationController end ``` -When a valid token is present and a `Login` with that token exists, the method -will save that in the `current_login` attribute so that it can be used in the -controller. If no token is present or no `Login` exists for the token, it will -respond with 401 and prevent the actual controller action from being executed. -The `authenticate!` method can also be called with a block to add custom checks -for the user’s authentication state. +When a valid token is present and a `Login` with that token exists, the method will save that in the `current_login` attribute so that it can be used in the controller. If no token is present or no `Login` exists for the token, it will respond with 401 and prevent the actual controller action from being executed. The `authenticate!` method can also be called with a block to add custom checks for the user’s authentication state. ## Facebook Authentication -Another common way of authenticating users that we’re using in many projects is -Facebook authentication. The typical flow for this authentication type in web -applications is opening a popup that displays Facebook’s login page and - after -that - a page where the users grants your application access to their profile -data. Once the user did that, Facebook will redirect to the web app and include -an `auth_code` in the response that the web app then takes and sends to its API -to validate it and exchange it for a Bearer token. +Another common way of authenticating users that we’re using in many projects is Facebook authentication. The typical flow for this authentication type in web applications is opening a popup that displays Facebook’s login page and - after that - a page where the users grants your application access to their profile data. Once the user did that, Facebook will redirect to the web app and include an `auth_code` in the response that the web app then takes and sends to its API to validate it and exchange it for a Bearer token. -rails_api_auth implements the API part of that in the `POST /token` route as -well - -[see the demo project for an example of how to use it](https://github.com/mainmatter/rails_api_auth-demo#facebook-authentication). +rails_api_auth implements the API part of that in the `POST /token` route as well - [see the demo project for an example of how to use it](https://github.com/mainmatter/rails_api_auth-demo#facebook-authentication). ## Feedback and contributions welcome! -As rails_api_auth is quite new and not yet widely used we’re happy to get -feedback and suggestions for things we have missed. Also please **try the gem -and report bugs** as you encounter them. **Contributions and pull requests are -also appreciated** of course! +As rails_api_auth is quite new and not yet widely used we’re happy to get feedback and suggestions for things we have missed. Also please **try the gem and report bugs** as you encounter them. **Contributions and pull requests are also appreciated** of course! diff --git a/src/posts/2015-11-27-updating-to-ember-simple-auth-1.0.md b/src/posts/2015-11-27-updating-to-ember-simple-auth-1.0.md index 44a6121806..94e68a6a9b 100644 --- a/src/posts/2015-11-27-updating-to-ember-simple-auth-1.0.md +++ b/src/posts/2015-11-27-updating-to-ember-simple-auth-1.0.md @@ -2,29 +2,17 @@ title: "Updating to Ember Simple Auth 1.0" authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte gives an update on the upcoming Ember Simple Auth 1.0 - release and shows how to use it in Ember CLI applications." +description: "Marco Otte-Witte gives an update on the upcoming Ember Simple Auth 1.0 release and shows how to use it in Ember CLI applications." tags: ember tagline: |

    With Ember Simple Auth 1.0.0 having been released a few days ago, a lot of people will want to upgrade their applications to it so they can finally make the switch to Ember.js 2.0. While quite a big part of the public API has been changed in 1.0.0, updating an application from Ember Simple Auth 0.8.0 or earlier versions is actually not as hard as it might appear at first glance. This post explains the steps that are necessary to bring an application to 1.0.0.

    --- -As 1.0.0 marks the first stable release of Ember Simple Auth, upcoming versions -will adhere to the [Semantic Versioning](http://semver.org) rule of not -including breaking changes in patch level or minor releases. In fact, **Ember -Simple Auth will follow Ember’s example and only make additive, backwards -compatible changes in all 1.x releases** and only remove deprecated parts of the -library in the next major release. +As 1.0.0 marks the first stable release of Ember Simple Auth, upcoming versions will adhere to the [Semantic Versioning](http://semver.org) rule of not including breaking changes in patch level or minor releases. In fact, **Ember Simple Auth will follow Ember’s example and only make additive, backwards compatible changes in all 1.x releases** and only remove deprecated parts of the library in the next major release. ## Uninstall previous versions -**Ember Simple Auth 1.0.0 is only distributed as an Ember CLI Addon** and drops -the previous bower distribution as well as the individual -`ember-cli-simple-auth-*` packages. The first step when upgrading to 1.0.0 is to -uninstall these packages from the application. To do that simply remove the -`ember-simple-auth` package from `bower.json` as well as all -`ember-cli-simple-auth-*` packages from `packages.json`. +**Ember Simple Auth 1.0.0 is only distributed as an Ember CLI Addon** and drops the previous bower distribution as well as the individual `ember-cli-simple-auth-*` packages. The first step when upgrading to 1.0.0 is to uninstall these packages from the application. To do that simply remove the `ember-simple-auth` package from `bower.json` as well as all `ember-cli-simple-auth-*` packages from `packages.json`. ## Install 1.0.0 @@ -36,10 +24,7 @@ ember install ember-simple-auth ## Fix the imports -With 1.0.0 all modules that it defines now live in the `ember-simple-auth` -namespace as opposed to the `simple-auth` namespace of previous versions. All -the `import` statements that import code from Ember Simple Auth need to be -updated accordingly, e.g. +With 1.0.0 all modules that it defines now live in the `ember-simple-auth` namespace as opposed to the `simple-auth` namespace of previous versions. All the `import` statements that import code from Ember Simple Auth need to be updated accordingly, e.g. ```js {% raw %} @@ -55,20 +40,11 @@ import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mi {% endraw %} ``` -Also the modules for the OAuth 2.0 authenticator and authorizer have been -renamed from just `oauth2` to `oauth2-password-grant` and `oauth2-bearer` -respectively so that `'simple-auth/authenticators/oauth2'` is now -`'ember-simple-auth/authenticators/oauth2-password-grant'` and -`'simple-auth/authorizers/oauth2'` is now -`'ember-simple-auth/authorizers/oauth2-bearer'`. +Also the modules for the OAuth 2.0 authenticator and authorizer have been renamed from just `oauth2` to `oauth2-password-grant` and `oauth2-bearer` respectively so that `'simple-auth/authenticators/oauth2'` is now `'ember-simple-auth/authenticators/oauth2-password-grant'` and `'simple-auth/authorizers/oauth2'` is now `'ember-simple-auth/authorizers/oauth2-bearer'`. ## Inject the session service -With Ember Simple Auth 1.0.0 the **session is no longer automatically injected -into all routes, controllers and components** but instead is **now available as -an [Ember.Service](http://emberjs.com/api/classes/Ember.Service.html)** so in -all routes, controllers and components that use the session (or back a template -that uses it), that session service needs to be injected, e.g.: +With Ember Simple Auth 1.0.0 the **session is no longer automatically injected into all routes, controllers and components** but instead is **now available as an [Ember.Service](http://emberjs.com/api/classes/Ember.Service.html)** so in all routes, controllers and components that use the session (or back a template that uses it), that session service needs to be injected, e.g.: ```js {% raw %} @@ -82,12 +58,7 @@ export default Ember.Controller.extend({ ## Define Authenticators and Authorizers -Ember Simple Auth 1.0.0 does not automatically merge all the predefined -authenticators and authorizers into the application anymore but instead -**requires authenticators and authorizers the application actually uses to be -defined explicitly**. So if you e.g. were previously using the OAuth 2.0 -authenticator simply define an authenticator that extends the OAuth 2.0 -authenticator in `app/authenticators`: +Ember Simple Auth 1.0.0 does not automatically merge all the predefined authenticators and authorizers into the application anymore but instead **requires authenticators and authorizers the application actually uses to be defined explicitly**. So if you e.g. were previously using the OAuth 2.0 authenticator simply define an authenticator that extends the OAuth 2.0 authenticator in `app/authenticators`: ```js {% raw %} @@ -100,9 +71,7 @@ export default OAuth2PasswordGrant.extend({ {% endraw %} ``` -In addition to the renamed module, the signature of the OAuth 2.0 authenticator -has changed as well so that it now expects dedicated arguments for the user’s -identification and password instead of one object containing both values, so +In addition to the renamed module, the signature of the OAuth 2.0 authenticator has changed as well so that it now expects dedicated arguments for the user’s identification and password instead of one object containing both values, so ```js {% raw %} @@ -127,20 +96,11 @@ this.get('session').authenticate( {% endraw %} ``` -Also authenticators and authorizers are not configured via -`config/environment.js` anymore but instead the respective properties are simply -overridden in the extended classes as for the `serverTokenRevocationEndpoint` -property in the example above. +Also authenticators and authorizers are not configured via `config/environment.js` anymore but instead the respective properties are simply overridden in the extended classes as for the `serverTokenRevocationEndpoint` property in the example above. ## Setup authorization -Ember Simple Auth’s **old auto-authorization mechanism** was complex (especially -when working with cross origin requests where configuring the -`crossOriginWhitelist` was causing big problems for many people) and **has been -removed in 1.0.0**. Instead authorization is now explicit. To authorize a block -of code use the -[session service’s `authorize` method](http://ember-simple-auth.com/api/classes/SessionService.html#method_authorize), -e.g.: +Ember Simple Auth’s **old auto-authorization mechanism** was complex (especially when working with cross origin requests where configuring the `crossOriginWhitelist` was causing big problems for many people) and **has been removed in 1.0.0**. Instead authorization is now explicit. To authorize a block of code use the [session service’s `authorize` method](http://ember-simple-auth.com/api/classes/SessionService.html#method_authorize), e.g.: ```js {% raw %} @@ -153,10 +113,7 @@ this.get('session').authorize( {% endraw %} ``` -If the application uses Ember Data, you can authorize all of the requests it -sends to the API by using the new -[`DataAdapterMixin`](http://ember-simple-auth.com/api/classes/DataAdapterMixin.html), -e.g.: +If the application uses Ember Data, you can authorize all of the requests it sends to the API by using the new [`DataAdapterMixin`](http://ember-simple-auth.com/api/classes/DataAdapterMixin.html), e.g.: ```js {% raw %} @@ -172,16 +129,11 @@ export default DS.JSONAPIAdapter.extend(DataAdapterMixin, { ## Migrating custom sessions -While previous versions of Ember Simple Auth allowed to configure a custom -session class in order to add properties and methods to the session, Ember -Simple Auth 1.0.0 makes the session private and only exposes the session -service. In order to migrate a custom session class to work with the service -there are 2 options. +While previous versions of Ember Simple Auth allowed to configure a custom session class in order to add properties and methods to the session, Ember Simple Auth 1.0.0 makes the session private and only exposes the session service. In order to migrate a custom session class to work with the service there are 2 options. ### Extend the session service -You can simply extend the session service and add custom properties and methods -in the subclass, e.g.: +You can simply extend the session service and add custom properties and methods in the subclass, e.g.: ```js {% raw %} @@ -207,8 +159,7 @@ export default SessionService.extend({ ### Create dedicated services -You can also create dedicated services that use the session service internally, -e.g.: +You can also create dedicated services that use the session service internally, e.g.: ```js {% raw %} @@ -231,29 +182,13 @@ export default Ember.Service.extend({ {% endraw %} ``` -In this case the session service remains unchanged and whenever you need the -currently authenticated account you’d use the `session-account` service to get -that. +In this case the session service remains unchanged and whenever you need the currently authenticated account you’d use the `session-account` service to get that. -Both solutions work fine but **the latter results in cleaner code and better -separation of concerns.** +Both solutions work fine but **the latter results in cleaner code and better separation of concerns.** ## Session Stores -Previous versions of Ember Simple Auth allowed the session store to be -configured in `config/environment.js`. **Ember Simple Auth 1.0.0 removes that -configuration setting and will always use the `'application'` session store**. -If not overridden by the application that session store will be an instance of -the new -[`AdaptiveStore`](http://ember-simple-auth.com/api/classes/AdaptiveStore.html) -that internally uses the -[`LocalStorageStore`](http://ember-simple-auth.com/api/classes/LocalStorageStore.html) -if `localStorage` storage is available and the -[`CookieStore`](http://ember-simple-auth.com/api/classes/CookieStore.html) if it -is not. To customize the application store, define it in -`app/session-stores/application.js`, extend a predefined session store and -customize properties (as done for authenticators and authorizers as described -above) or implement a fully custom store, e.g.: +Previous versions of Ember Simple Auth allowed the session store to be configured in `config/environment.js`. **Ember Simple Auth 1.0.0 removes that configuration setting and will always use the `'application'` session store**. If not overridden by the application that session store will be an instance of the new [`AdaptiveStore`](http://ember-simple-auth.com/api/classes/AdaptiveStore.html) that internally uses the [`LocalStorageStore`](http://ember-simple-auth.com/api/classes/LocalStorageStore.html) if `localStorage` storage is available and the [`CookieStore`](http://ember-simple-auth.com/api/classes/CookieStore.html) if it is not. To customize the application store, define it in `app/session-stores/application.js`, extend a predefined session store and customize properties (as done for authenticators and authorizers as described above) or implement a fully custom store, e.g.: ```js {% raw %} @@ -266,16 +201,11 @@ export default CookieStore.extend({ {% endraw %} ``` -**Ember Simple Auth 1.0.0 will also automatically use the -[`EphemeralStore`](http://ember-simple-auth.com/api/classes/EphemeralStore.html) -when running tests** so there is no need anymore to configure that for the test -environment (in fact the configuration setting has been removed). +**Ember Simple Auth 1.0.0 will also automatically use the [`EphemeralStore`](http://ember-simple-auth.com/api/classes/EphemeralStore.html) when running tests** so there is no need anymore to configure that for the test environment (in fact the configuration setting has been removed). ## Update acceptance tests -While previous versions of Ember Simple Auth automatically injected the test -helpers, version 1.0.0 requires them to be imported in the respective acceptance -tests, e.g.: +While previous versions of Ember Simple Auth automatically injected the test helpers, version 1.0.0 requires them to be imported in the respective acceptance tests, e.g.: ```js {% raw %} @@ -305,22 +235,8 @@ authenticateSession(App); ## Update the application route if necessary -The -[`ApplicationRouteMixin`](http://ember-simple-auth.com/api/classes/ApplicationRouteMixin.html) -in Ember Simple Auth 1.0.0 now only defines the two methods -[`sessionAuthenticated`](http://ember-simple-auth.com/api/classes/ApplicationRouteMixin.html#method_sessionAuthenticated) -and -[`sessionInvalidated`](http://ember-simple-auth.com/api/classes/ApplicationRouteMixin.html#method_sessionInvalidated) -as opposed to the previous four actions. If the application overrides any of -these actions it would now have to override these methods. +The [`ApplicationRouteMixin`](http://ember-simple-auth.com/api/classes/ApplicationRouteMixin.html) in Ember Simple Auth 1.0.0 now only defines the two methods [`sessionAuthenticated`](http://ember-simple-auth.com/api/classes/ApplicationRouteMixin.html#method_sessionAuthenticated) and [`sessionInvalidated`](http://ember-simple-auth.com/api/classes/ApplicationRouteMixin.html#method_sessionInvalidated) as opposed to the previous four actions. If the application overrides any of these actions it would now have to override these methods. ## Wrapping up -I hope this gives a good overview of how upgrading an Ember application to Ember -Simple Auth 1.0.0 works. **There is lots of documentation available** in the -[README](https://github.com/mainmatter/ember-simple-auth#readme) and the -[API Docs](http://ember-simple-auth.com/api/index.html). You might also want to -check out the -[dummy application](https://github.com/mainmatter/ember-simple-auth/tree/master/tests/dummy) -in the github repo and the -[intro video on the website](http://ember-simple-auth.com). +I hope this gives a good overview of how upgrading an Ember application to Ember Simple Auth 1.0.0 works. **There is lots of documentation available** in the [README](https://github.com/mainmatter/ember-simple-auth#readme) and the [API Docs](http://ember-simple-auth.com/api/index.html). You might also want to check out the [dummy application](https://github.com/mainmatter/ember-simple-auth/tree/master/tests/dummy) in the github repo and the [intro video on the website](http://ember-simple-auth.com). diff --git a/src/posts/2015-12-03-ember-cli-deploy-notifications.md b/src/posts/2015-12-03-ember-cli-deploy-notifications.md index 9e8c08e56c..0b7a735185 100644 --- a/src/posts/2015-12-03-ember-cli-deploy-notifications.md +++ b/src/posts/2015-12-03-ember-cli-deploy-notifications.md @@ -2,40 +2,25 @@ title: "ember-cli-deploy-notifications" authorHandle: LevelbossMike bio: "Full-Stack Engineer, Ember CLI Deploy core team member" -description: - "Michael Klein introduces ember-cli-deploy-notifications, an ember-cli-deploy - plugin for invoking arbitrary webhooks during the deployment process." +description: "Michael Klein introduces ember-cli-deploy-notifications, an ember-cli-deploy plugin for invoking arbitrary webhooks during the deployment process." tags: ember tagline: |

    A few weeks ago a new version of the "official" ember deployment solution ember-cli-deploy was released:

    ember-cli-deploy 0.5 is now released and ready for use with a great docs site and already-rich plugin ecosystem: <a href="https://t.co/6yhjmjQrYD">https://t.co/6yhjmjQrYD</a> <author>Luke Melia (@lukemelia) <a href="https://twitter.com/lukemelia/status/659787938625134592">29. Oktober 2015</a></author>

    --- -Aaron Chambers and me gave detailed walkthroughs of the basic ideas behind the -pipeline at the [Ember-London](https://vimeo.com/139125310) and -[Ember.js-Munich](https://www.youtube.com/watch?v=d4xwIv_9Cg0) meetups -respectively. +Aaron Chambers and me gave detailed walkthroughs of the basic ideas behind the pipeline at the [Ember-London](https://vimeo.com/139125310) and [Ember.js-Munich](https://www.youtube.com/watch?v=d4xwIv_9Cg0) meetups respectively. -The new release **encourages heavy use of -[deploy plugins](http://emberobserver.com/categories/ember-cli-deploy-plugins) -that all implement different parts of a deployment via -[hooks](http://ember-cli-deploy.com/docs/v0.5.x/pipeline-hooks/)** and are -themselves Ember CLI addons. What wasn’t available though was a plugin for -notifying external webservices (e.g. an error-tracking service) during or after -deployments so we decided to write one. +The new release **encourages heavy use of [deploy plugins](http://emberobserver.com/categories/ember-cli-deploy-plugins) that all implement different parts of a deployment via [hooks](http://ember-cli-deploy.com/docs/v0.5.x/pipeline-hooks/)** and are themselves Ember CLI addons. What wasn’t available though was a plugin for notifying external webservices (e.g. an error-tracking service) during or after deployments so we decided to write one. ## Introducing ember-cli-deploy-notifications -[ember-cli-deploy-notifications](https://github.com/mainmatter/ember-cli-deploy-notifications) -**makes it easy to notify external services** by adding them to a -`notifications.services.` property in `config/deploy.js`. First you -have to install the addon: +[ember-cli-deploy-notifications](https://github.com/mainmatter/ember-cli-deploy-notifications) **makes it easy to notify external services** by adding them to a `notifications.services.` property in `config/deploy.js`. First you have to install the addon: ```bash ember install ember-cli-deploy-notifications ``` -The second step is to configure the services that you want to notify while -executing the deployment pipeline. +The second step is to configure the services that you want to notify while executing the deployment pipeline. ```js {% raw %} @@ -60,30 +45,19 @@ module.exports = function (deployTarget) { {% endraw %} ``` -Every time a new revision gets activated now by `ember-cli-deploy`, -`ember-cli-deploy-notifications` will sent a `POST` request to the bugsnag -service to notify it of the newly activated deployment revision. +Every time a new revision gets activated now by `ember-cli-deploy`, `ember-cli-deploy-notifications` will sent a `POST` request to the bugsnag service to notify it of the newly activated deployment revision. ## Customization -We figured out that there are a lot of different internal and external services -that users of ember-cli-deploy wanted to notify when executing the deploy -pipeline. Thus **we wanted to make `ember-cli-deploy-notifications` as flexible -as possible but still keep things easy and simple** for the most basic use -cases. +We figured out that there are a lot of different internal and external services that users of ember-cli-deploy wanted to notify when executing the deploy pipeline. Thus **we wanted to make `ember-cli-deploy-notifications` as flexible as possible but still keep things easy and simple** for the most basic use cases. -Based on that assumption we came up with the idea of _"preconfigured"_ and -_"custom"_ services. +Based on that assumption we came up with the idea of _"preconfigured"_ and _"custom"_ services. ### Custom services -**Services need to be configured with values for `url`, `headers`, `method` and -`body`**. We figured out that these are all the necessary parts of a webservice -request that you need to be able to customize. +**Services need to be configured with values for `url`, `headers`, `method` and `body`**. We figured out that these are all the necessary parts of a webservice request that you need to be able to customize. -**Additionally you need to provide a property named the same as the hook that -you want the service to be notified on** when running through the deploy -pipeline (as we wouldn’t know when to notify a service otherwise): +**Additionally you need to provide a property named the same as the hook that you want the service to be notified on** when running through the deploy pipeline (as we wouldn’t know when to notify a service otherwise): ```js {% raw %} @@ -117,16 +91,9 @@ module.exports = function (deployTarget) { {% endraw %} ``` -`url`, `headers`, `method` and `body` are the basic ideas behind the service -abstraction in ember-cli-deploy-notifications but to keep things simple you -don’t have to provide `headers` and `method` for every custom service as these -properties will default to `{}` and `'POST'` respectively. +`url`, `headers`, `method` and `body` are the basic ideas behind the service abstraction in ember-cli-deploy-notifications but to keep things simple you don’t have to provide `headers` and `method` for every custom service as these properties will default to `{}` and `'POST'` respectively. -As you can see service configuration properties can either be defined directly -or generated dynamically based on the -[deployment context](http://ember-cli-deploy.com/docs/v0.5.x/deployment-context/). -`this` will always point to the service’s configuration itself in all of these -functions which enables you to do things like this: +As you can see service configuration properties can either be defined directly or generated dynamically based on the [deployment context](http://ember-cli-deploy.com/docs/v0.5.x/deployment-context/). `this` will always point to the service’s configuration itself in all of these functions which enables you to do things like this: ```js {% raw %} @@ -156,8 +123,7 @@ module.exports = function(deployTarget) { {% endraw %} ``` -The configuration properties named the same as ember-cli-deploy’s pipeline-hooks -can also be used to override configuration defaults on a per hook basis: +The configuration properties named the same as ember-cli-deploy’s pipeline-hooks can also be used to override configuration defaults on a per hook basis: ```js {% raw %} @@ -191,15 +157,9 @@ module.exports = function (deployTarget) { ### Preconfigured services -As we wanted to make it as easy as possible to get started with -ember-cli-deploy-notifications **there are already some preconfigured -services**. +As we wanted to make it as easy as possible to get started with ember-cli-deploy-notifications **there are already some preconfigured services**. -Preconfigured services differ from custom services in the fact that the -community has already provided a default configuration for these services. **For -example the popular error tracking service [bugsnag](http://bugsnag.com) is -already preconfigured which makes it easy to use out of the box** with -ember-cli-deploy-notifications: +Preconfigured services differ from custom services in the fact that the community has already provided a default configuration for these services. **For example the popular error tracking service [bugsnag](http://bugsnag.com) is already preconfigured which makes it easy to use out of the box** with ember-cli-deploy-notifications: ```js {% raw %} @@ -227,13 +187,6 @@ There is also a preconfigured service for slack. ## Next Steps -**We are excited to share this small ember-cli-deploy plugin with the ember -community and would like to hear your feedback!** We are already using it in -client projects and, though pretty small, found it to be a very useful addition -to our deployment workflow. +**We are excited to share this small ember-cli-deploy plugin with the ember community and would like to hear your feedback!** We are already using it in client projects and, though pretty small, found it to be a very useful addition to our deployment workflow. -Please refer to the project’s -[README](https://github.com/mainmatter/ember-cli-deploy-notifications#readme) -for more detailed information about the plugin and don’t hesitate to open issues -or ask questions, we’re happy to support you in setting up a great deployment -workflow for your Ember applications. +Please refer to the project’s [README](https://github.com/mainmatter/ember-cli-deploy-notifications#readme) for more detailed information about the plugin and don’t hesitate to open issues or ask questions, we’re happy to support you in setting up a great deployment workflow for your Ember applications. diff --git a/src/posts/2016-03-04-ember-test-selectors.md b/src/posts/2016-03-04-ember-test-selectors.md index 97fc63060d..30249cbfa8 100644 --- a/src/posts/2016-03-04-ember-test-selectors.md +++ b/src/posts/2016-03-04-ember-test-selectors.md @@ -2,9 +2,7 @@ title: Using better element selectors in Ember.js tests authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte announces the release of ember-test-selectors, an addon that - enables better element selectors in Ember.js tests." +description: "Marco Otte-Witte announces the release of ember-test-selectors, an addon that enables better element selectors in Ember.js tests." tags: ember tagline: |

    We just released ember-test-selectors, an Ember Addon that enables better element selectors in Ember.js tests. It removes all data attributes starting with data-test- from the application's templates in the production environment so that these attributes can be used to select elements with in acceptance and integration tests without polluting the markup that is delivered to the end user.

    @@ -12,15 +10,11 @@ tagline: | ## Why even use `data` attributes as test selectors? -Integration and acceptance tests usually **interact with and assert on the -presence of certain elements** in the markup that an application renders. These -elements are identified using CSS selectors. Most projects use one of three -approaches for CSS selectors in tests: +Integration and acceptance tests usually **interact with and assert on the presence of certain elements** in the markup that an application renders. These elements are identified using CSS selectors. Most projects use one of three approaches for CSS selectors in tests: ### Selectors based on HTML structure -This approach simply selects elements by their position in the rendered HTML. -For the following template: +This approach simply selects elements by their position in the rendered HTML. For the following template: ```html
    @@ -29,9 +23,7 @@ For the following template:
    ``` -one might select the post's title with the selector `'article h1'`. Of course -this breaks when changing the `

    ` to a `

    ` while the functionality being -tested is probably not affected by that change. +one might select the post's title with the selector `'article h1'`. Of course this breaks when changing the `

    ` to a `

    ` while the functionality being tested is probably not affected by that change. ### Selectors based on CSS classes @@ -46,19 +38,13 @@ This approach selects elements by CSS classes. For the following template: {% endraw %} ``` -one might select the post title with the selector `'.post-title'`. This of -course breaks when the CSS class is changed or renamed, although that would only -be a visual change which shouldn't affect the tests at all. +one might select the post title with the selector `'.post-title'`. This of course breaks when the CSS class is changed or renamed, although that would only be a visual change which shouldn't affect the tests at all. -Many projects use CSS classes with special prefixes that are only used for -testing to overcome this problem like `'js-post-title'`. While that approach is -definitely more stable it is often hard to maintain. Also it doesn't easily -allow to encode additional information like e.g. the post's id. +Many projects use CSS classes with special prefixes that are only used for testing to overcome this problem like `'js-post-title'`. While that approach is definitely more stable it is often hard to maintain. Also it doesn't easily allow to encode additional information like e.g. the post's id. ### Selectors based on `data` attributes -This approach uses HTML 5 `data` attributes to select elements. For the -following template: +This approach uses HTML 5 `data` attributes to select elements. For the following template: ```hbs {% raw %} @@ -69,14 +55,7 @@ following template: {% endraw %} ``` -one would select the post's title with the selector -`*[data-test-selector="post-title"]` (which selects any element with a -`data-test-selector` attribute that has the value `"post-title"`). While the -selector is arguably a bit longer this approach **clearly separates the test -selectors from the rest of the markup and is resilient to change** as the -attribute can be applied to any element rendering the post's title, regardless -of the HTML structure, CSS classes etc. Also it easily allows encoding more data -in the markup like e.g. the post's id: +one would select the post's title with the selector `*[data-test-selector="post-title"]` (which selects any element with a `data-test-selector` attribute that has the value `"post-title"`). While the selector is arguably a bit longer this approach **clearly separates the test selectors from the rest of the markup and is resilient to change** as the attribute can be applied to any element rendering the post's title, regardless of the HTML structure, CSS classes etc. Also it easily allows encoding more data in the markup like e.g. the post's id: ```hbs {% raw %} @@ -90,9 +69,7 @@ in the markup like e.g. the post's id: {% endraw %} ``` -`ember-test-selectors` makes sure to remove all these `data` attributes in the -`production` environment so that **users will have perfectly clean HTML -delivered**: +`ember-test-selectors` makes sure to remove all these `data` attributes in the `production` environment so that **users will have perfectly clean HTML delivered**: ```html
    @@ -103,17 +80,7 @@ delivered**: ## Future Plans -{% raw %} We have some future plans for ember-test-selectors to make working -with data attributes as test selectors even more convenient: - -- custom test helpers that find elements by data attributes so that you don't - have to write the quite long selectors yourselves; probably sth. like - `findViaTestSelector('selector', 'post-title')`, - [https://github.com/mainmatter/ember-test-selectors/issues/8](https://github.com/mainmatter/ember-test-selectors/issues/8) -- template helpers that generate data attributes for elements, e.g. - `

    {{post.title}}

    ` which would result in - `

    {{post.title}}

    ` or - `
    ` which would result in - `
    `, - [https://github.com/mainmatter/ember-test-selectors/issues/9](https://github.com/mainmatter/ember-test-selectors/issues/9) - {% endraw %} +{% raw %} We have some future plans for ember-test-selectors to make working with data attributes as test selectors even more convenient: + +- custom test helpers that find elements by data attributes so that you don't have to write the quite long selectors yourselves; probably sth. like `findViaTestSelector('selector', 'post-title')`, [https://github.com/mainmatter/ember-test-selectors/issues/8](https://github.com/mainmatter/ember-test-selectors/issues/8) +- template helpers that generate data attributes for elements, e.g. `

    {{post.title}}

    ` which would result in `

    {{post.title}}

    ` or `
    ` which would result in `
    `, [https://github.com/mainmatter/ember-test-selectors/issues/9](https://github.com/mainmatter/ember-test-selectors/issues/9) {% endraw %} diff --git a/src/posts/2016-12-06-out-of-the-box-fastboot-support-in-ember-simple-auth.md b/src/posts/2016-12-06-out-of-the-box-fastboot-support-in-ember-simple-auth.md index f774564d27..9a270a533d 100644 --- a/src/posts/2016-12-06-out-of-the-box-fastboot-support-in-ember-simple-auth.md +++ b/src/posts/2016-12-06-out-of-the-box-fastboot-support-in-ember-simple-auth.md @@ -2,9 +2,7 @@ title: Out-of-the-box FastBoot support in Ember Simple Auth authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte announces out-of-the-box support for FastBoot in Ember - Simple Auth and explains how it works using ember-cookies." +description: "Marco Otte-Witte announces out-of-the-box support for FastBoot in Ember Simple Auth and explains how it works using ember-cookies." tags: ember tagline: |

    Ever since FastBoot was first announced at EmberConf 2015 it was clear to us that we wanted to have out-of-the-box support for it in Ember Simple Auth. Our goal was to make sure that Ember Simple Auth did not keep anyone from adopting FastBoot and adopting FastBoot would not result in people having to figure out their own authentication and authorization solutions. Today we're happy to announce the availability of Ember Simple Auth 1.2.0-beta.1, the first release with out-of-the-box support for FastBoot.

    @@ -12,46 +10,15 @@ tagline: | ## Seamless Session Synchronization -Ember Simple Auth 1.2 seamlessly synchronizes the session state between -the browser and FastBoot server. When a user logs in to an Ember.js -application and refreshes the page or comes back to the app later - triggering a -request that's handled by the FastBoot server - Ember Simple Auth will send the -session state along with that request, pick it up in the app instance that's -running in the FastBoot server and make sure the Ember route is being -loaded and rendered in the correct session context. If the session -turns out to be invalid for some reason, the server will invalidate it and the -user will be redirected to the login page via a proper HTTP redirect. +Ember Simple Auth 1.2 seamlessly synchronizes the session state between the browser and FastBoot server. When a user logs in to an Ember.js application and refreshes the page or comes back to the app later - triggering a request that's handled by the FastBoot server - Ember Simple Auth will send the session state along with that request, pick it up in the app instance that's running in the FastBoot server and make sure the Ember route is being loaded and rendered in the correct session context. If the session turns out to be invalid for some reason, the server will invalidate it and the user will be redirected to the login page via a proper HTTP redirect. ## Under the hood -Ember Simple Auth has always had the concept of session stores that persist the -session state so that it survives page reloads (or users leaving the app and -coming back later). One of these session stores turned out to be the -perfect fit for the aforementioned session syncing mechanism – the cookie -session store. Browsers will automatically send cookies for a -particular origin along with any request to that origin. Also, servers can -modify cookies sent by the browser and include updates in the response that the -browser will automatically pick up - effectively enabling bidirectional state -synchronization. - -The main challenge with enabling the cookie session store to run both in the -browser as well as in Node though was that the APIs for cookie handling are -obviously totally different in both environments. In the browser there is -`document.cookie` while in server apps running in Node, cookies are being read -and written via the `Cookie` and `Set-Cookie` headers. That meant we had to come -up with a way to read and write cookies via a common interface that we could -rely on in the cookie session store and that abstracted these environment -specific APIs under the hood (much like what -ember-network does for -the fetch API). Therefore -we created -ember-cookies -which is a cookies abstraction that works in the browser as well as in -Node and that's now being used internally by the cookie session store. - -ember-cookies exposes a cookies service with -`read`, `write` and -`clear` methods: +Ember Simple Auth has always had the concept of session stores that persist the session state so that it survives page reloads (or users leaving the app and coming back later). One of these session stores turned out to be the perfect fit for the aforementioned session syncing mechanism – the cookie session store. Browsers will automatically send cookies for a particular origin along with any request to that origin. Also, servers can modify cookies sent by the browser and include updates in the response that the browser will automatically pick up - effectively enabling bidirectional state synchronization. + +The main challenge with enabling the cookie session store to run both in the browser as well as in Node though was that the APIs for cookie handling are obviously totally different in both environments. In the browser there is `document.cookie` while in server apps running in Node, cookies are being read and written via the `Cookie` and `Set-Cookie` headers. That meant we had to come up with a way to read and write cookies via a common interface that we could rely on in the cookie session store and that abstracted these environment specific APIs under the hood (much like what ember-network does for the fetch API). Therefore we created ember-cookies which is a cookies abstraction that works in the browser as well as in Node and that's now being used internally by the cookie session store. + +ember-cookies exposes a cookies service with `read`, `write` and `clear` methods: ```js @@ -75,9 +42,7 @@ export default Ember.Controller.extend({ ## Using Ember Simple Auth with FastBoot -As most of Ember Simple Auth's support for FastBoot is based on the cookie -session store, enabling FastBoot support is as easy as defining the -application session store as: +As most of Ember Simple Auth's support for FastBoot is based on the cookie session store, enabling FastBoot support is as easy as defining the application session store as: ```js {% raw %} @@ -88,53 +53,25 @@ export default Cookie.extend(); {% endraw %} ``` -If you're interested in learning more about the underlying concepts check out -the -talk -about Authentication and Session Management in FastBoot that I gave at -EmberCamp in London in June. +If you're interested in learning more about the underlying concepts check out the talk about Authentication and Session Management in FastBoot that I gave at EmberCamp in London in June. ## Other Changes and Fixes -Out-of-the-box support for FastBoot is likely the most prominent addition in -this release but there are quite some other changes as well, -including: +Out-of-the-box support for FastBoot is likely the most prominent addition in this release but there are quite some other changes as well, including: -- The default cookie names that the cookie session store uses are now compliant - with RFC 2616, see - #978 -- Server responses are now validated in authenticators, preventing successful - logins when required data is actually missing, see - #957 -- The OAuth 2.0 Password Grant authenticator can now send custom headers along - with authentication requests, see - #1018 +- The default cookie names that the cookie session store uses are now compliant with RFC 2616, see #978 +- Server responses are now validated in authenticators, preventing successful logins when required data is actually missing, see #957 +- The OAuth 2.0 Password Grant authenticator can now send custom headers along with authentication requests, see #1018 In addition to these changes, fixed issues include: -- Routes like the login route can now be configured inline in routes using the - respective mixins as opposed to `config/environment.js`, see - #1041 -- The cookie session store will now rewrite its cookies when any of its - configurable properties (like cookie name) change, see - #1056 +- Routes like the login route can now be configured inline in routes using the respective mixins as opposed to `config/environment.js`, see #1041 +- The cookie session store will now rewrite its cookies when any of its configurable properties (like cookie name) change, see #1056 ## A Community Effort -This certainly is one of the larger releases in Ember Simple Auth's history and -a lot of people have helped to make it happen. We'd like to -thank all of our (at the time of this writing) -141 -contributors, with particular mention to -Steven Wu, -Kyle Mellander, -Arjan Singh and -Josemar Luedke for awesome -contributions to the Fastboot effort and ember-cookies. +This certainly is one of the larger releases in Ember Simple Auth's history and a lot of people have helped to make it happen. We'd like to thank all of our (at the time of this writing) 141 contributors, with particular mention to Steven Wu, Kyle Mellander, Arjan Singh and Josemar Luedke for awesome contributions to the Fastboot effort and ember-cookies. ## Try it! -As this is a beta release, there are probably some rough edges. -We'd like everyone to try it, regardless of whether they're using Fastboot -already or not and report bugs, outdated or bad documentation etc. on -github. +As this is a beta release, there are probably some rough edges. We'd like everyone to try it, regardless of whether they're using Fastboot already or not and report bugs, outdated or bad documentation etc. on github. diff --git a/src/posts/2017-01-13-ember-test-selectors.md b/src/posts/2017-01-13-ember-test-selectors.md index 16a995f5f8..3e27a447e9 100644 --- a/src/posts/2017-01-13-ember-test-selectors.md +++ b/src/posts/2017-01-13-ember-test-selectors.md @@ -2,10 +2,7 @@ title: New features for ember-test-selectors authorHandle: tobiasbieniek bio: "Senior Frontend Engineer, Ember CLI core team member" -description: - "Tobias Bieniek announces new features in ember-test-selectors such as - automatic binding of data-test-* properties and how these are stripped in - production." +description: "Tobias Bieniek announces new features in ember-test-selectors such as automatic binding of data-test-* properties and how these are stripped in production." tags: ember tagline: |

    In March 2016 we have released the first version of ember-test-selectors and today we are proud to present you our next milestone: 0.1.0.

    While 0.1.0 does not sound like much has changed, the addon has actually gained a lot of new functionality and should be considered our release candidate for 1.0.0.

    This blog post will highlight the major changes in this release, and will give you a short introduction into how we have implemented these new features.

    @@ -13,10 +10,7 @@ tagline: | ## Automatic binding of `data-test-*` properties -As you may know from our -[previous blog post](/blog/2016/03/04/ember-test-selectors) on this topic, the -goal of this addon is to let you use attributes starting with `data-test-` in -your templates: +As you may know from our [previous blog post](/blog/2016/03/04/ember-test-selectors) on this topic, the goal of this addon is to let you use attributes starting with `data-test-` in your templates: ```handlebars {% raw %} @@ -27,8 +21,7 @@ your templates: {% endraw %} ``` -... so that you can use these as selectors in your acceptance and integration -tests: +... so that you can use these as selectors in your acceptance and integration tests: ```js {% raw %} @@ -37,15 +30,9 @@ assert.equal(find(testSelector('post-title')).text(), 'my first blog post'); {% endraw %} ``` -While this worked well on HTML tags, using the same pattern on components was a -little more complicated. The assigned `data-test-*` properties needed to be -bound to HTML attributes by adding them to the `attributeBindings` array on the -component class. +While this worked well on HTML tags, using the same pattern on components was a little more complicated. The assigned `data-test-*` properties needed to be bound to HTML attributes by adding them to the `attributeBindings` array on the component class. -One of the major changes in this new release is that modifying the -`attributeBindings` array is now done automatically for you, so that you can -just assign `data-test-*` properties in your templates and they will -automatically appear on the `
    ` tag wrapping the component: +One of the major changes in this new release is that modifying the `attributeBindings` array is now done automatically for you, so that you can just assign `data-test-*` properties in your templates and they will automatically appear on the `
    ` tag wrapping the component: ```handlebars {% raw %} @@ -61,29 +48,11 @@ automatically appear on the `
    ` tag wrapping the component: ### How we implemented this -Since we wanted to make this feature available on all components by default we -had to `reopen()` the `Ember.Component` class, figure out the list of -`data-test-*` properties on the component, and then add them to the -`attributeBindings` array. - -The natural way to do this within an addon is using an -[initializer](https://guides.emberjs.com/v2.10.0/applications/initializers/), so -that is what we -[did](https://github.com/mainmatter/ember-test-selectors/blob/v0.1.0/addon/initializers/ember-test-selectors.js#L5-L10). -Instead of putting all the logic in the initializer itself, we have extracted it -into a -[`bindDataTestAttributes()`](https://github.com/mainmatter/ember-test-selectors/blob/v0.1.0/addon/utils/bind-data-test-attributes.js) -function, which we were now able to -[unit test](https://github.com/mainmatter/ember-test-selectors/blob/v0.1.0/tests/unit/utils/bind-data-test-attributes-test.js) -separately. - -As we are committed to not including any unnecessary code in your production -builds, we also had to make sure to not include the initializer and utility -function in there. Since both of those are part of our `addon` and `app` -folders, which are included in your builds by default, we borrowed a -["trick"](https://github.com/ember-cli/ember-cli-chai/blob/master/index.js#L119-L123) -from [ember-cli-chai](https://github.com/ember-cli/ember-cli-chai/) which only -includes both folders if we are in [testing mode](#testing-in-production-mode). +Since we wanted to make this feature available on all components by default we had to `reopen()` the `Ember.Component` class, figure out the list of `data-test-*` properties on the component, and then add them to the `attributeBindings` array. + +The natural way to do this within an addon is using an [initializer](https://guides.emberjs.com/v2.10.0/applications/initializers/), so that is what we [did](https://github.com/mainmatter/ember-test-selectors/blob/v0.1.0/addon/initializers/ember-test-selectors.js#L5-L10). Instead of putting all the logic in the initializer itself, we have extracted it into a [`bindDataTestAttributes()`](https://github.com/mainmatter/ember-test-selectors/blob/v0.1.0/addon/utils/bind-data-test-attributes.js) function, which we were now able to [unit test](https://github.com/mainmatter/ember-test-selectors/blob/v0.1.0/tests/unit/utils/bind-data-test-attributes-test.js) separately. + +As we are committed to not including any unnecessary code in your production builds, we also had to make sure to not include the initializer and utility function in there. Since both of those are part of our `addon` and `app` folders, which are included in your builds by default, we borrowed a ["trick"](https://github.com/ember-cli/ember-cli-chai/blob/master/index.js#L119-L123) from [ember-cli-chai](https://github.com/ember-cli/ember-cli-chai/) which only includes both folders if we are in [testing mode](#testing-in-production-mode). ```js {% raw %} @@ -107,30 +76,15 @@ module.exports = { {% endraw %} ``` -**UPDATE:** After releasing `0.1.0` we were notified that this feature was not -working for component integration tests, which was actually a pretty obvious -problem as initializers are not running for these kinds of tests. After thinking -about the issue for a few hours we came up with a solution that seems to work -even better now. Instead of calling `Component.reopen()` in an initializer we -are now doing it in a file in our `vendor` folder, which is always being run -before any tests are executed. +**UPDATE:** After releasing `0.1.0` we were notified that this feature was not working for component integration tests, which was actually a pretty obvious problem as initializers are not running for these kinds of tests. After thinking about the issue for a few hours we came up with a solution that seems to work even better now. Instead of calling `Component.reopen()` in an initializer we are now doing it in a file in our `vendor` folder, which is always being run before any tests are executed. -We have released `0.1.1` including this change and are now also warning you if -you try to use `data-test-*` attributes on tagless components. +We have released `0.1.1` including this change and are now also warning you if you try to use `data-test-*` attributes on tagless components. ## Stripping out `data-test-*` attributes in templates -Our initial goal with this library was stripping our `data-test-*` attributes -from HTML tags in your templates. In the previous section we implemented -automatic bindings for `data-test-*` properties on components now too, but these -properties were not stripped from the template yet. +Our initial goal with this library was stripping our `data-test-*` attributes from HTML tags in your templates. In the previous section we implemented automatic bindings for `data-test-*` properties on components now too, but these properties were not stripped from the template yet. -To modify templates from within an addon our best bet was to use an -AST transform on the Handlebars AST, -that we get from the template parser. This can be accomplished by registering a -Handlebars AST plugin in the -[`setupPreprocessorRegistry()`](https://ember-cli.com/api/classes/Addon.html#method_setupPreprocessorRegistry) -hook of the addon: +To modify templates from within an addon our best bet was to use an AST transform on the Handlebars AST, that we get from the template parser. This can be accomplished by registering a Handlebars AST plugin in the [`setupPreprocessorRegistry()`](https://ember-cli.com/api/classes/Addon.html#method_setupPreprocessorRegistry) hook of the addon: ```js @@ -151,9 +105,7 @@ module.exports = { {% endraw %} ``` -While this AST transform already existed in the previous releases, it was only -able to handle `data-test-*` attributes on HTML tags (called `ElementNode`), but -not on curly components yet: +While this AST transform already existed in the previous releases, it was only able to handle `data-test-*` attributes on HTML tags (called `ElementNode`), but not on curly components yet: ```js {% raw %} @@ -177,11 +129,9 @@ module.exports = class { {% endraw %} ``` -You can try out what this transform does in the -[AST explorer](https://astexplorer.net/#/5ZDpdTbKwL). +You can try out what this transform does in the [AST explorer](https://astexplorer.net/#/5ZDpdTbKwL). -Fortunately for us the code to make this AST transform work for curly components -is very similar: +Fortunately for us the code to make this AST transform work for curly components is very similar: ```js {% raw %} @@ -193,16 +143,11 @@ if (node.type === 'MustacheStatement' || node.type === 'BlockStatement') { {% endraw %} ``` -If you try the same example template in the -[AST explorer](https://astexplorer.net/#/8wkrolD3V0), but with the modified -transform code, you will notice that the `data-test-comment-id=comment.id` part -of the `some-component` invocation is now gone. +If you try the same example template in the [AST explorer](https://astexplorer.net/#/8wkrolD3V0), but with the modified transform code, you will notice that the `data-test-comment-id=comment.id` part of the `some-component` invocation is now gone. ## Stripping out `data-test-*` properties in JS files -While one way of assigning data attributes to a component is in the template, -data attributes can also be defined as properties on the component class. So -instead of assigning `data-test-comment-id` inside the loop: +While one way of assigning data attributes to a component is in the template, data attributes can also be defined as properties on the component class. So instead of assigning `data-test-comment-id` inside the loop: ```handlebars {% raw %} @@ -212,8 +157,7 @@ instead of assigning `data-test-comment-id` inside the loop: {% endraw %} ``` -... we could also use a computed property inside the component that mirrors -`comment.id`: +... we could also use a computed property inside the component that mirrors `comment.id`: ```js {% raw %} @@ -224,16 +168,9 @@ export default Ember.Component({ {% endraw %} ``` -Unfortunately we have now have a property that is not stripped by the AST -transform described in the previous section. At this point we could have used a -similar strategy as before and added a JavaScript preprocessor, that strips all -those properties from the code, but instead we hooked into the existing -JavaScript processing pipeline using [Babel](http://babeljs.io/). +Unfortunately we have now have a property that is not stripped by the AST transform described in the previous section. At this point we could have used a similar strategy as before and added a JavaScript preprocessor, that strips all those properties from the code, but instead we hooked into the existing JavaScript processing pipeline using [Babel](http://babeljs.io/). -Fortunately for us the fantastic [AST explorer](https://astexplorer.net/) also -supports prototyping Babel plugins and so we came up with a simple -[plugin](https://astexplorer.net/#/xd5PB1rSD6) that basically just removes -`data-test-*` properties from all the objects in your code: +Fortunately for us the fantastic [AST explorer](https://astexplorer.net/) also supports prototyping Babel plugins and so we came up with a simple [plugin](https://astexplorer.net/#/xd5PB1rSD6) that basically just removes `data-test-*` properties from all the objects in your code: ```js {% raw %} @@ -253,11 +190,7 @@ module.exports = function (babel) { {% endraw %} ``` -With the Babel plugin done, all we had left to do was making sure that your app -actually uses that plugin at build time. While this is not quite public API and -may change in the future we have found a way to accomplish that in the official -[ember-cli-htmlbars-inline-precompile](https://github.com/ember-cli/ember-cli-htmlbars-inline-precompile/blob/v0.3.6/index.js#L64-L69) -addon: +With the Babel plugin done, all we had left to do was making sure that your app actually uses that plugin at build time. While this is not quite public API and may change in the future we have found a way to accomplish that in the official [ember-cli-htmlbars-inline-precompile](https://github.com/ember-cli/ember-cli-htmlbars-inline-precompile/blob/v0.3.6/index.js#L64-L69) addon: ```js {% raw %} @@ -285,29 +218,13 @@ module.exports = { ## Testing in `production` mode -In our previous releases we had offered an `environments` option to let you -choose when to strip attributes and when to keep them in the templates. The -default of this option was set to `['production']`, which made sense at the -time. - -Since then we had discovered though that this will keep you from running your -tests in `production` mode using `ember test --environment=production`. Instead -of just checking the `environment` we are now making use of the -([not yet documented](https://github.com/ember-cli/ember-cli/issues/6656)) -`tests` property on the `EmberApp` class in Ember CLI. - -This property will be `true` when using the `development` environment with -either `ember build`, `ember serve` or `ember test`, or it will be `true` when -using `ember test --environment=production`. That makes sure that we still strip -all the `data-test-*` attributes from your code in production builds, but you -should now again be able to also test your production builds using test -selectors. - -Since we previously offered an option to override our defaults, we were -committed to doing the same for the new defaults. For this we have deprecated -this existing `environments` option, and introduced a new `strip` option, which -can be set to `true` or `false`, but defaults to the `tests` property described -above: +In our previous releases we had offered an `environments` option to let you choose when to strip attributes and when to keep them in the templates. The default of this option was set to `['production']`, which made sense at the time. + +Since then we had discovered though that this will keep you from running your tests in `production` mode using `ember test --environment=production`. Instead of just checking the `environment` we are now making use of the ([not yet documented](https://github.com/ember-cli/ember-cli/issues/6656)) `tests` property on the `EmberApp` class in Ember CLI. + +This property will be `true` when using the `development` environment with either `ember build`, `ember serve` or `ember test`, or it will be `true` when using `ember test --environment=production`. That makes sure that we still strip all the `data-test-*` attributes from your code in production builds, but you should now again be able to also test your production builds using test selectors. + +Since we previously offered an option to override our defaults, we were committed to doing the same for the new defaults. For this we have deprecated this existing `environments` option, and introduced a new `strip` option, which can be set to `true` or `false`, but defaults to the `tests` property described above: ```js {% raw %} @@ -319,17 +236,11 @@ var app = new EmberApp({ {% endraw %} ``` -Note that using the `environments` option still works, but is deprecated and -will be removed by the time we release `1.0.0`. +Note that using the `environments` option still works, but is deprecated and will be removed by the time we release `1.0.0`. ## Simplified `testSelector()` import -The `testSelector()` helper function can be used to simplify building the -CSS/jQuery selector strings used for `find()` or `this.$()` in your tests. -Previously you had to import that function from -`/tests/helpers/ember-test-selectors`, but since our `addon` folder is -now removed from the build in production we were able to simplify that import to -just this: +The `testSelector()` helper function can be used to simplify building the CSS/jQuery selector strings used for `find()` or `this.$()` in your tests. Previously you had to import that function from `/tests/helpers/ember-test-selectors`, but since our `addon` folder is now removed from the build in production we were able to simplify that import to just this: ```js {% raw %} @@ -337,11 +248,6 @@ import testSelector from 'ember-test-selectors'; {% endraw %} ``` -We hope you enjoyed reading about our progress on this project and we would love -to get feedback on what else we can improve. Feel free to -[reach out](https://github.com/mainmatter/ember-test-selectors/issues/new)! +We hope you enjoyed reading about our progress on this project and we would love to get feedback on what else we can improve. Feel free to [reach out](https://github.com/mainmatter/ember-test-selectors/issues/new)! -**Note:** The code examples in this blog posts are simplified to be easier to -digest. Please refer to the -[actual implementation](https://github.com/mainmatter/ember-test-selectors) if -you want to see all the glory details. +**Note:** The code examples in this blog posts are simplified to be easier to digest. Please refer to the [actual implementation](https://github.com/mainmatter/ember-test-selectors) if you want to see all the glory details. diff --git a/src/posts/2017-02-01-class-based-computed-properties.md b/src/posts/2017-02-01-class-based-computed-properties.md index 355abf5237..86ab67347e 100644 --- a/src/posts/2017-02-01-class-based-computed-properties.md +++ b/src/posts/2017-02-01-class-based-computed-properties.md @@ -2,9 +2,7 @@ title: Class based Computed Properties authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte introduces a mechanism for class based computed properties - in Ember.js and how those can be used instead of helpers." +description: "Marco Otte-Witte introduces a mechanism for class based computed properties in Ember.js and how those can be used instead of helpers." tags: ember tagline: |

    We think Computed Properties in Ember are awesome. We also think they are in many cases the better alternative to template helpers as they allow for cleaner separation of where a computation is triggered and the implementation of that computation. In some cases though it is currently very hard to do things in Computed Properties (and Computed Property macros in particular) that are possible with Class based helpers. With the introduction of Class based Computed Properties we're aiming at making these scenarios solvable easily.

    @@ -12,13 +10,9 @@ tagline: | ## Computed Properties and Computed Property Macros -Computed Properties are among the first things developers new to Ember learn. -They are a great way of defining dependencies between data points in the -application and **ensuring the UI stays consistent as these data points -change**. +Computed Properties are among the first things developers new to Ember learn. They are a great way of defining dependencies between data points in the application and **ensuring the UI stays consistent as these data points change**. -Ember comes with a set of macros that implement property logic that most -applications need and allow for short and expressive definitions like +Ember comes with a set of macros that implement property logic that most applications need and allow for short and expressive definitions like ```js {% raw %} @@ -26,22 +20,13 @@ isActive: Ember.computed.equal('state', 'isActive'); {% endraw %} ``` -There are addons that provide even more macros for common use cases like -[ember-cpm](https://github.com/cibernox/ember-cpm) or -[ember-awesome-macros](https://github.com/kellyselden/ember-awesome-macros). +There are addons that provide even more macros for common use cases like [ember-cpm](https://github.com/cibernox/ember-cpm) or [ember-awesome-macros](https://github.com/kellyselden/ember-awesome-macros). ## Where Computed Property Macros fall short today -**Computed Properties are very similar to template helpers** in the way that -both are [pure functions](https://en.wikipedia.org/wiki/Pure_function) that can -only depend on their inputs. While a template helpers receives its inputs as -arguments, **Computed Properties define their inputs as dependent keys**. +**Computed Properties are very similar to template helpers** in the way that both are [pure functions](https://en.wikipedia.org/wiki/Pure_function) that can only depend on their inputs. While a template helpers receives its inputs as arguments, **Computed Properties define their inputs as dependent keys**. -In some cases pure functions are not sufficient though as the computation in the -template helper or computed property also depends on global state or the inputs -cannot statically be listed in the helper or property definition. This is the -case for example for computations on collections when it is unknown upfront on -which property of each element in the collection the computation depends, e.g. +In some cases pure functions are not sufficient though as the computation in the template helper or computed property also depends on global state or the inputs cannot statically be listed in the helper or property definition. This is the case for example for computations on collections when it is unknown upfront on which property of each element in the collection the computation depends, e.g. ```js {% raw %} @@ -49,14 +34,9 @@ filteredUsers: filterByProperty('users' 'filter') {% endraw %} ``` -Here what we would like to do is filter the `users` array by the value of the -`filter` property of the context. E.g. when `filter` is `'isActive'` we'd expect -`filteredUsers` to contain all active users, when `filter` is `'isBlocked'` we'd -expect it to contain all blocked users and so on. +Here what we would like to do is filter the `users` array by the value of the `filter` property of the context. E.g. when `filter` is `'isActive'` we'd expect `filteredUsers` to contain all active users, when `filter` is `'isBlocked'` we'd expect it to contain all blocked users and so on. -With template helpers and the -[ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) -addon, we're be able to write something like this in the template: +With template helpers and the [ember-composable-helpers](https://github.com/DockYard/ember-composable-helpers) addon, we're be able to write something like this in the template: ```hbs {% raw %} @@ -66,25 +46,13 @@ addon, we're be able to write something like this in the template: {% endraw %} ``` -and because the -[`filter-by` helper is a Class based helper](https://github.com/DockYard/ember-composable-helpers/blob/master/addon/helpers/filter-by.js) -this actually works and the DOM updates correctly whenever the value of the -`filter` property or e.g. the `isActive` property of any user changes. +and because the [`filter-by` helper is a Class based helper](https://github.com/DockYard/ember-composable-helpers/blob/master/addon/helpers/filter-by.js) this actually works and the DOM updates correctly whenever the value of the `filter` property or e.g. the `isActive` property of any user changes. -With Computed Properties **it is not currently possible to implement something -like this** (at least not as a reusable macro). +With Computed Properties **it is not currently possible to implement something like this** (at least not as a reusable macro). ## Enter Class based Computed Properties -With the Class based Computed Properties that -[ember-classy-computed](https://github.com/mainmatter/ember-classy-computed) -introduces it is **actually possible now to implement something like the above -mentioned `filterByProperty` macro**. The computed property returned by that -macro can now correctly be invalidated when any of the user's `isActive`, -`isBlocked` etc. properties change although it is not actually possible to know -what these properties might be upfront. This **allows keeping the filtering -logic in JavaScript as opposed to in the template** when using a Class based -template helper: +With the Class based Computed Properties that [ember-classy-computed](https://github.com/mainmatter/ember-classy-computed) introduces it is **actually possible now to implement something like the above mentioned `filterByProperty` macro**. The computed property returned by that macro can now correctly be invalidated when any of the user's `isActive`, `isBlocked` etc. properties change although it is not actually possible to know what these properties might be upfront. This **allows keeping the filtering logic in JavaScript as opposed to in the template** when using a Class based template helper: ```js {% raw %} @@ -145,21 +113,8 @@ export default ClassBasedComputedProperty.property(DynamicFilterByComputed); {% endraw %} ``` -Comparing this code to the implementation of the -[`filter-by` helper](https://github.com/DockYard/ember-composable-helpers/blob/master/addon/helpers/filter-by.js) -mentioned above you will recognize that both are almost identical. This -illustrates very well what Class based Computed Properties are: a way to **use -the same mechanisms that are already established for Class based template -helpers for Computed Properties** as well. +Comparing this code to the implementation of the [`filter-by` helper](https://github.com/DockYard/ember-composable-helpers/blob/master/addon/helpers/filter-by.js) mentioned above you will recognize that both are almost identical. This illustrates very well what Class based Computed Properties are: a way to **use the same mechanisms that are already established for Class based template helpers for Computed Properties** as well. ## Notice -**[ember-classy-computed](https://github.com/mainmatter/ember-classy-computed) -is currently at a very early stage** and we haven't thoroughly tested the -implementation just yet. We have also not done any benchmarking to get a better -understanding of what the performance implications are. That is to say, **while -we encourage everyone to try this out, be aware you're currently doing so at -your own risk** as this is most likely not production ready (yet). We have the -feeling though that this will be a valuable addition to Computed Properties in -the future and can close the gap that currently exists between Computed -Properties and template helpers. +**[ember-classy-computed](https://github.com/mainmatter/ember-classy-computed) is currently at a very early stage** and we haven't thoroughly tested the implementation just yet. We have also not done any benchmarking to get a better understanding of what the performance implications are. That is to say, **while we encourage everyone to try this out, be aware you're currently doing so at your own risk** as this is most likely not production ready (yet). We have the feeling though that this will be a valuable addition to Computed Properties in the future and can close the gap that currently exists between Computed Properties and template helpers. diff --git a/src/posts/2017-02-13-npm-libs-in-ember-cli.md b/src/posts/2017-02-13-npm-libs-in-ember-cli.md index 7468ca6ade..1bda11c4d6 100644 --- a/src/posts/2017-02-13-npm-libs-in-ember-cli.md +++ b/src/posts/2017-02-13-npm-libs-in-ember-cli.md @@ -2,9 +2,7 @@ title: Using npm libraries in Ember CLI authorHandle: tobiasbieniek bio: "Senior Frontend Engineer, Ember CLI core team member" -description: - "Tobias Bieniek introduces a mechanism for using arbitrary npm libraries in - Ember CLI applications and explains how that works under the hood." +description: "Tobias Bieniek introduces a mechanism for using arbitrary npm libraries in Ember CLI applications and explains how that works under the hood." tags: ember og: image: /assets/images/posts/2017-02-13-npm-libs-in-ember-cli/og-image.jpg @@ -14,16 +12,13 @@ tagline: | ## Status Quo -The way to import Bower libraries into your app consists of three major steps. -First we will have to install the library. We will use the popular -[Moment.js][moment.js] library as an example here: +The way to import Bower libraries into your app consists of three major steps. First we will have to install the library. We will use the popular [Moment.js][moment.js] library as an example here: ``` bower install --save moment ``` -Secondly we will import it into the Ember CLI build pipeline by adding the -following line to our `ember-cli-build.js` file: +Secondly we will import it into the Ember CLI build pipeline by adding the following line to our `ember-cli-build.js` file: ```js {% raw %} @@ -31,19 +26,15 @@ app.import('bower_components/moment/moment.js'); {% endraw %} ``` -This `import()` call tells Ember CLI to add the `moment.js` file to the -generated `vendor.js` file to make the `moment` global available to the app. +This `import()` call tells Ember CLI to add the `moment.js` file to the generated `vendor.js` file to make the `moment` global available to the app. -As we prefer to use ES6 imports instead of globals we will generate a so-called -"vendor shim" which essentially just wraps the global and provides us with a way -to import it as an ES6 module: +As we prefer to use ES6 imports instead of globals we will generate a so-called "vendor shim" which essentially just wraps the global and provides us with a way to import it as an ES6 module: ``` ember generate vendor-shim moment ``` -Running this command will generate a `vendor/shims/moment.js` file that looks -like this: +Running this command will generate a `vendor/shims/moment.js` file that looks like this: ```js {% raw %} @@ -59,20 +50,11 @@ like this: {% endraw %} ``` -This looks a little cryptic at first, but once you understand the individual -parts it starts to make sense. +This looks a little cryptic at first, but once you understand the individual parts it starts to make sense. -The files that the Ember CLI build pipeline generates use the [Asynchronous -Module Definition][amd] (or shorter: AMD). The `define()` call in the code above -defines a new AMD module with the name `moment` and the return value of the -`vendorModule` function describes what the module exports, or what we can import -from that module in our own code. In this case we export an object with a -`default` property that contains the `moment` global. You can find more -information on "default exports" and ES6 modules in general in the -[Exploring ES6](http://exploringjs.com/es6/ch_modules.html) ebook. +The files that the Ember CLI build pipeline generates use the [Asynchronous Module Definition][amd] (or shorter: AMD). The `define()` call in the code above defines a new AMD module with the name `moment` and the return value of the `vendorModule` function describes what the module exports, or what we can import from that module in our own code. In this case we export an object with a `default` property that contains the `moment` global. You can find more information on "default exports" and ES6 modules in general in the [Exploring ES6](http://exploringjs.com/es6/ch_modules.html) ebook. -To use this vendor shim we will have to `app.import()` it like we did with the -library itself: +To use this vendor shim we will have to `app.import()` it like we did with the library itself: ```js {% raw %} @@ -84,13 +66,9 @@ We are now able to use `import moment from 'moment';` in our Ember code. ## App vs. Addon -The above instructions work great for apps, but what about addons? The -`ember-cli-build.js` file for addons is only relevant for building the dummy app -of the addon, but not for any other app using the addon. That means we can't -just call `app.import()` in the `ember-cli-build.js` file like we did above. +The above instructions work great for apps, but what about addons? The `ember-cli-build.js` file for addons is only relevant for building the dummy app of the addon, but not for any other app using the addon. That means we can't just call `app.import()` in the `ember-cli-build.js` file like we did above. -The solution to that is using the [`included()`][included-hook] in the -`index.js` file of the addon: +The solution to that is using the [`included()`][included-hook] in the `index.js` file of the addon: ```js {% raw %} @@ -102,34 +80,20 @@ included() { {% endraw %} ``` -Note that the `this.import()` method is only available starting with Ember CLI -2.7. You can easily polyfill it though if you want to support Ember CLI releases -below that. Have a look at the -[ember-simple-auth](https://github.com/mainmatter/ember-simple-auth/blob/1ca4ae678b7be9905076762220dcd9fcb0f27ac0/index.js#L24-L39) -code to find out how to do it. +Note that the `this.import()` method is only available starting with Ember CLI 2.7. You can easily polyfill it though if you want to support Ember CLI releases below that. Have a look at the [ember-simple-auth](https://github.com/mainmatter/ember-simple-auth/blob/1ca4ae678b7be9905076762220dcd9fcb0f27ac0/index.js#L24-L39) code to find out how to do it. -This seems to work fine now if we are just looking at the dummy app, but in -reality it will not work yet for any other apps. The reason for this is that the -`bower_components` folder above refers to the `bower_components` folder of the -"host app", not of the addon itself. That means we will have to -`bower install --save moment` into the host app itself and there are two ways to -do it: +This seems to work fine now if we are just looking at the dummy app, but in reality it will not work yet for any other apps. The reason for this is that the `bower_components` folder above refers to the `bower_components` folder of the "host app", not of the addon itself. That means we will have to `bower install --save moment` into the host app itself and there are two ways to do it: - the lazy way: tell the users in the `README` file to install it like that -- the comfortable way: install it automatically for them using an Ember CLI - blueprint +- the comfortable way: install it automatically for them using an Ember CLI blueprint -Since we want to make it as easy for our users as possible we will prefer the -second solution, which is not actually that hard to implement either. First we -will have to generate a blueprint that matches the package name of our addon. So -if our addon was called `ember-moment` we would run: +Since we want to make it as easy for our users as possible we will prefer the second solution, which is not actually that hard to implement either. First we will have to generate a blueprint that matches the package name of our addon. So if our addon was called `ember-moment` we would run: ``` ember generate blueprint ember-moment ``` -This will generate a `blueprints/ember-moment/index.js` file in which we will -have to implement two hooks: +This will generate a `blueprints/ember-moment/index.js` file in which we will have to implement two hooks: ```js {% raw %} @@ -143,44 +107,19 @@ module.exports = { {% endraw %} ``` -The `normalizeEntityName` hook is usually used to e.g. read the name of the -route you want to generate with `ember generate route `. Since this -is the default blueprint which will be executed automatically when the our addon -is installed through `ember install ember-moment` we don't need this method and -have to overwrite it to make sure it does not complain about a missing name. - -The `afterInstall` hook is the important part. The -[`addBowerPackageToProject()`](https://ember-cli.com/api/classes/Blueprint.html#method_addBowerPackageToProject) -method installs the `moment` Bower package into the application by adding it to -the host app `bower.json` file. That way the Moment.js files will be present in -the top level `bower_components` folder of the application instead of being -available only inside of the addon. Since the `addBowerPackageToProject()` -method returns a `Promise` we have to return it from the `afterInstall` hook to -make sure that Ember CLI waits for the installation to finish. +The `normalizeEntityName` hook is usually used to e.g. read the name of the route you want to generate with `ember generate route `. Since this is the default blueprint which will be executed automatically when the our addon is installed through `ember install ember-moment` we don't need this method and have to overwrite it to make sure it does not complain about a missing name. + +The `afterInstall` hook is the important part. The [`addBowerPackageToProject()`](https://ember-cli.com/api/classes/Blueprint.html#method_addBowerPackageToProject) method installs the `moment` Bower package into the application by adding it to the host app `bower.json` file. That way the Moment.js files will be present in the top level `bower_components` folder of the application instead of being available only inside of the addon. Since the `addBowerPackageToProject()` method returns a `Promise` we have to return it from the `afterInstall` hook to make sure that Ember CLI waits for the installation to finish. ## npm vs. Bower -> "What's bower?" > "A package manager, install it with -> npm." > "What's npm?" > "A package manager, you can -> install it with brew" > "What's brew?" ... Stefan -> Baumgartner (@ddprrt) -> 5. November -> 2014 +> "What's bower?" > "A package manager, install it with npm." > "What's npm?" > "A package manager, you can install it with brew" > "What's brew?" ... Stefan Baumgartner (@ddprrt) 5. November 2014 -In an effort to simplify the situation the Ember team decided to focus on npm in -the future. Bower support will still be available to support older addons for -now, but might be deprecated at some point. That means that we should modify our -`ember-moment` addon above to install Moment.js via npm instead of Bower. +In an effort to simplify the situation the Ember team decided to focus on npm in the future. Bower support will still be available to support older addons for now, but might be deprecated at some point. That means that we should modify our `ember-moment` addon above to install Moment.js via npm instead of Bower. -Fortunately for us Moment.js is also distributed on npm so we can just -`npm install --save moment` instead of using Bower and we're done, right? Well, -not quite. Unfortunately for the time being things are a little more -complicated, but the Ember CLI team has plans to make it easier in the future. +Fortunately for us Moment.js is also distributed on npm so we can just `npm install --save moment` instead of using Bower and we're done, right? Well, not quite. Unfortunately for the time being things are a little more complicated, but the Ember CLI team has plans to make it easier in the future. -Let's start with the simple part: Installing via npm instead of Bower. Instead -of using `addBowerPackageToProject()` to install Moment.js we can use the -[`addPackageToProject()`](https://ember-cli.com/api/classes/Blueprint.html#method_addPackageToProject) -method instead: +Let's start with the simple part: Installing via npm instead of Bower. Instead of using `addBowerPackageToProject()` to install Moment.js we can use the [`addPackageToProject()`](https://ember-cli.com/api/classes/Blueprint.html#method_addPackageToProject) method instead: ```js {% raw %} @@ -192,31 +131,17 @@ afterInstall() { That was easy! So where is the problem now? -Remember how we called `this.import()` to import the `moment.js` file into the -build pipeline and the `vendor.js` file? The `import()` method currently only -works for files inside the `bower_components` and `vendor` folders, but not the -`node_modules` folder. This was done for reasons of build performance but might -change at some point in the future once other issues are resolved. As we cannot -simply import `moment` from the `node_modules` folder we have to find another -way for loading the newly installed dependency into the app. +Remember how we called `this.import()` to import the `moment.js` file into the build pipeline and the `vendor.js` file? The `import()` method currently only works for files inside the `bower_components` and `vendor` folders, but not the `node_modules` folder. This was done for reasons of build performance but might change at some point in the future once other issues are resolved. As we cannot simply import `moment` from the `node_modules` folder we have to find another way for loading the newly installed dependency into the app. -At this point we could just stop and give up, but instead we will use a -workaround that "moves" the file into our `vendor` folder and import it from -there. Instead of actually moving it as part of the installation process though -we tell Ember CLI to move it automatically as part of the build process. +At this point we could just stop and give up, but instead we will use a workaround that "moves" the file into our `vendor` folder and import it from there. Instead of actually moving it as part of the installation process though we tell Ember CLI to move it automatically as part of the build process. -To implement this we will need the fundamental -[broccoli-funnel](https://github.com/broccolijs/broccoli-funnel) and -[broccoli-merge-trees](https://github.com/broccolijs/broccoli-merge-trees) npm -packages: +To implement this we will need the fundamental [broccoli-funnel](https://github.com/broccolijs/broccoli-funnel) and [broccoli-merge-trees](https://github.com/broccolijs/broccoli-merge-trees) npm packages: ``` npm install --save broccoli-funnel broccoli-merge-trees ``` -Next we will implement the `treeForVendor()` hook in our `index.js` file and -adjust the `moment.js` import in the `included()` hook to point to -`vendor/moment.js` instead: +Next we will implement the `treeForVendor()` hook in our `index.js` file and adjust the `moment.js` import in the `included()` hook to point to `vendor/moment.js` instead: ```js {% raw %} @@ -247,28 +172,15 @@ module.exports = { {% endraw %} ``` -Let me explain what we did here. The `vendorTree` argument holds the actual -content of our `vendor` folder as we can see it in our addon. Next we create a -new `Funnel` tree, which is a fancy way of saying: import files into the build -pipeline. Essentially we just lookup the `moment.js` file inside the -`node_modules/moment` folder of the host app and wrap that in a Broccoli tree. -The last step merges the `vendorTree` and the `momentTree` into a single tree -which now contains the `moment.js` file and our vendor shim for the `vendor` -folder. +Let me explain what we did here. The `vendorTree` argument holds the actual content of our `vendor` folder as we can see it in our addon. Next we create a new `Funnel` tree, which is a fancy way of saying: import files into the build pipeline. Essentially we just lookup the `moment.js` file inside the `node_modules/moment` folder of the host app and wrap that in a Broccoli tree. The last step merges the `vendorTree` and the `momentTree` into a single tree which now contains the `moment.js` file and our vendor shim for the `vendor` folder. -If you want to learn more about Broccoli and how the build pipeline works I -recommend watching Estelle DeBlois explain it in her fantastic EmberConf talk: -[Dissecting an Ember CLI Build](https://youtu.be/hNwgp9alwKg). +If you want to learn more about Broccoli and how the build pipeline works I recommend watching Estelle DeBlois explain it in her fantastic EmberConf talk: [Dissecting an Ember CLI Build](https://youtu.be/hNwgp9alwKg). -Now that we've imported the `moment.js` file into our `vendor` tree we can -finally `import()` it in the `included()` hook and everything works again. +Now that we've imported the `moment.js` file into our `vendor` tree we can finally `import()` it in the `included()` hook and everything works again. ## npm dependencies -As we are using npm now we can also take advantage of the way that npm resolves -dependencies. That means instead of using a blueprint to install the npm package -into the host app we declare `moment` as a dependency of the addon instead in -our `package.json` file: +As we are using npm now we can also take advantage of the way that npm resolves dependencies. That means instead of using a blueprint to install the npm package into the host app we declare `moment` as a dependency of the addon instead in our `package.json` file: ```js {% raw %}on @@ -280,12 +192,7 @@ our `package.json` file: {% endraw %} ``` -Since npm deduplicates packages during installation we can not be certain about -the path where `moment` is actually installed though. We need to use a resolver -algorithm to find the file inside the `node_modules` folder. Fortunately Node.js -has that algorithm built-in and we can just use it through the -`require.resolve()` function. All we have to do now is modify the `momentTree` -code like this: +Since npm deduplicates packages during installation we can not be certain about the path where `moment` is actually installed though. We need to use a resolver algorithm to find the file inside the `node_modules` folder. Fortunately Node.js has that algorithm built-in and we can just use it through the `require.resolve()` function. All we have to do now is modify the `momentTree` code like this: ```js {% raw %} @@ -295,28 +202,17 @@ var momentTree = new Funnel(path.dirname(require.resolve('moment/moment.js')), { {% endraw %} ``` -Note that we are passing the path to the `moment` **folder**, not to the -`moment.js` file itself, to the `Funnel` constructor. +Note that we are passing the path to the `moment` **folder**, not to the `moment.js` file itself, to the `Funnel` constructor. -Everything should work fine now and we can remove the `ember-moment` blueprint -and the `moment` dependency from the host app again since that is now a -subdependency via `ember-moment`. +Everything should work fine now and we can remove the `ember-moment` blueprint and the `moment` dependency from the host app again since that is now a subdependency via `ember-moment`. -If you want to see these things applied to a real addon visit the code of the -[`ember-cli-moment-shim`](https://github.com/jasonmit/ember-cli-moment-shim) -addon and have a look at their `index.js` file. They do support fastboot too -though which makes the code a little more complicated compared to our simplified -example here. +If you want to see these things applied to a real addon visit the code of the [`ember-cli-moment-shim`](https://github.com/jasonmit/ember-cli-moment-shim) addon and have a look at their `index.js` file. They do support fastboot too though which makes the code a little more complicated compared to our simplified example here. ## App vs. Addon again -Now that we have converted our `ember-moment` addon to use npm instead of Bower, -how could we do the same if we wanted to use Moment.js in our app directly -without an additional addon? +Now that we have converted our `ember-moment` addon to use npm instead of Bower, how could we do the same if we wanted to use Moment.js in our app directly without an additional addon? -Unfortunately there is currently no perfect solution for this and the best way -is using an [in-repo-addon](https://ember-cli.com/extending/#in-repo-addons) for -that. You could for example generate a `ember-moment` in-repo-addon: +Unfortunately there is currently no perfect solution for this and the best way is using an [in-repo-addon](https://ember-cli.com/extending/#in-repo-addons) for that. You could for example generate a `ember-moment` in-repo-addon: ``` ember generate in-repo-addon ember-moment @@ -326,11 +222,7 @@ and use the same code as above inside the `lib/ember-moment/index.js` file. ## Next: CommonJS and ES6 modules -Things get a little more complicated when you want to use npm packages that are -not distributed in a prebuilt form like Moment.js. If they instead export only -CommonJS modules or ES6 modules we will need to add a few more plugins to the -build pipeline to make this work and we will explain how to do that in a future -blog post. +Things get a little more complicated when you want to use npm packages that are not distributed in a prebuilt form like Moment.js. If they instead export only CommonJS modules or ES6 modules we will need to add a few more plugins to the build pipeline to make this work and we will explain how to do that in a future blog post. [ember-source]: https://www.npmjs.com/package/ember-source [bower]: https://bower.io/ diff --git a/src/posts/2017-03-21-on-computed-properties-vs-helpers.md b/src/posts/2017-03-21-on-computed-properties-vs-helpers.md index 863e82428a..efc65b9b72 100644 --- a/src/posts/2017-03-21-on-computed-properties-vs-helpers.md +++ b/src/posts/2017-03-21-on-computed-properties-vs-helpers.md @@ -2,9 +2,7 @@ title: On Computed Properties vs. Helpers authorHandle: marcoow bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte discusses differences between computed properties and - helpers and explains pros and cons of each alternative." +description: "Marco Otte-Witte discusses differences between computed properties and helpers and explains pros and cons of each alternative." tags: ember og: image: /assets/images/posts/2017-03-21-on-computed-properties-vs-helpers/og-image.jpg @@ -14,12 +12,9 @@ tagline: | ## Computed Properties -Computed Properties allow defining properties as functions of other properties. -Ember automatically re-evaluates computed properties (lazily) when any of its -dependents change so that they don't get out of sync. +Computed Properties allow defining properties as functions of other properties. Ember automatically re-evaluates computed properties (lazily) when any of its dependents change so that they don't get out of sync. -Here's a simple example of a computed property that is `true` when the `age` -property is at least `65`: +Here's a simple example of a computed property that is `true` when the `age` property is at least `65`: ```js {% raw %} @@ -29,14 +24,9 @@ isSenior: computed('age', function () { {% endraw %} ``` -The `age` property is listed as a dependency of the `isSenior` property, thus -the `isSenior` property will be invalidated whenever the `age` property changes -and re-evaluated the next time it is accessed (unless it is used in a template -in which case the property is immediately re-evaluated so that the UI stays in -sync with the underlying data). +The `age` property is listed as a dependency of the `isSenior` property, thus the `isSenior` property will be invalidated whenever the `age` property changes and re-evaluated the next time it is accessed (unless it is used in a template in which case the property is immediately re-evaluated so that the UI stays in sync with the underlying data). -The `isSenior` property can then be used in a template (we're assuming it is -defined on the `user` here): +The `isSenior` property can then be used in a template (we're assuming it is defined on the `user` here): ```hbs {% raw %} @@ -51,9 +41,7 @@ defined on the `user` here): ## Template Helpers -The above example **could just as easily be implemented using a template -helper**. Instead of defining the `isSenior` property with its dependents -upfront, one could define an `lte` helper like this: +The above example **could just as easily be implemented using a template helper**. Instead of defining the `isSenior` property with its dependents upfront, one could define an `lte` helper like this: ```js {% raw %} @@ -78,36 +66,17 @@ and move the comparison into the template: ## What's the difference? -Both alternatives are obviously very similar - both compare the user's `age` -property with a comparison value and depending on the outcome of that comparison -render some nodes to the DOM (or don't render them). The main difference is that -**with the computed property that comparison lives in the template context** and -is only invoked from the template (via the `isSenior` identifier) while **when -using a helper the comparison is defined inline right in the template** itself. +Both alternatives are obviously very similar - both compare the user's `age` property with a comparison value and depending on the outcome of that comparison render some nodes to the DOM (or don't render them). The main difference is that **with the computed property that comparison lives in the template context** and is only invoked from the template (via the `isSenior` identifier) while **when using a helper the comparison is defined inline right in the template** itself. -This might not seem like a big thing but there actually are some differences -between the two alternatives that have consequences on certain aspects of the -application. +This might not seem like a big thing but there actually are some differences between the two alternatives that have consequences on certain aspects of the application. ### Separation vs. Unification -The main difference is that with the computed property solution, the logic and -its internals are separated from the template. The **logic lives in the template -context and appears as a black box to the template** which merely uses some -named properties - this is actually quite **similar to a class exposing named -methods** where the caller of these methods does not have to worry about their -internals as long as it's clear what they are supposed to be used for. +The main difference is that with the computed property solution, the logic and its internals are separated from the template. The **logic lives in the template context and appears as a black box to the template** which merely uses some named properties - this is actually quite **similar to a class exposing named methods** where the caller of these methods does not have to worry about their internals as long as it's clear what they are supposed to be used for. -With the **template helpers solution though both the rendering as well as the -logic are merged in the template**. That means that understanding and -maintaining the template includes understanding all of the logic encoded in the -helper invocations. +With the **template helpers solution though both the rendering as well as the logic are merged in the template**. That means that understanding and maintaining the template includes understanding all of the logic encoded in the helper invocations. -While the complexity that's added to the template in the above example is fairly -limited of course, this point gets more obvious when looking at a slightly more -involved example. Assume there is a collection of users from which we want to -select a random one with a `status` of `'active'`. A computed property returning -such a user could look like this: +While the complexity that's added to the template in the above example is fairly limited of course, this point gets more obvious when looking at a slightly more involved example. Assume there is a collection of users from which we want to select a random one with a `status` of `'active'`. A computed property returning such a user could look like this: ```js {% raw %} @@ -118,8 +87,7 @@ userToDisplay: computed('users.@each.state', function () { {% endraw %} ``` -Rendering that user's `name` then is as easy as using the `userToDisplay` -property in the template: +Rendering that user's `name` then is as easy as using the `userToDisplay` property in the template: ```hbs {% raw %} @@ -127,9 +95,7 @@ property in the template: {% endraw %} ``` -Comparing this to a solution that moves all of the logic for selecting the user -into the template via helpers illustrates how much harder it becomes to -understand the template now: +Comparing this to a solution that moves all of the logic for selecting the user into the template via helpers illustrates how much harder it becomes to understand the template now: ```hbs {% raw %} @@ -139,46 +105,21 @@ understand the template now: {% endraw %} ``` -Instead of hiding this complexity behind a named interface all of it is right -there in the template and cannot be ignored as it can be when using a computed -property. +Instead of hiding this complexity behind a named interface all of it is right there in the template and cannot be ignored as it can be when using a computed property. ### Testability -Another consequence of **moving logic into the template is that the logic itself -becomes harder to test**. While logic that lives in the template context in the -form of computed properties is easily unit-testable, **logic that lives in the -template can only be tested by actually rendering the template** which again -leads to a few other consequences: - -- Tests become slower to execute as it's obviously slower to render than not to - render. -- Each test case becomes more complex. While unit tests can assert on the value - of the computed property (e.g. `asser.equal(user.get('isSenior') true)`), - (integration) tests for logic inside of templates have to assert on the - presence or absence of DOM nodes (e.g. - `assert.ok(find(testSelector('senior-flag')))`) which obviously is a much more - indirect way of testing the same thing. -- Test cases (potentially) require more and unrelated context to be set up. - While unit tests for computed properties only require the dependent properties - of the computed property under test to be set up, rendering a template - requires the full context for that template to be set up which might include - elements that are unrelated to the current test case. +Another consequence of **moving logic into the template is that the logic itself becomes harder to test**. While logic that lives in the template context in the form of computed properties is easily unit-testable, **logic that lives in the template can only be tested by actually rendering the template** which again leads to a few other consequences: + +- Tests become slower to execute as it's obviously slower to render than not to render. +- Each test case becomes more complex. While unit tests can assert on the value of the computed property (e.g. `asser.equal(user.get('isSenior') true)`), (integration) tests for logic inside of templates have to assert on the presence or absence of DOM nodes (e.g. `assert.ok(find(testSelector('senior-flag')))`) which obviously is a much more indirect way of testing the same thing. +- Test cases (potentially) require more and unrelated context to be set up. While unit tests for computed properties only require the dependent properties of the computed property under test to be set up, rendering a template requires the full context for that template to be set up which might include elements that are unrelated to the current test case. ### Helpers don't always work as expected -One of the main reasons that we hear why people prefer template helpers over -computed properties is the fact that computed properties need to list their -dependent keys. **Especially newcomers to Ember.js are afraid of forgetting a -key or making a mistake** (especially when it comes to collections) which can -lead to hard to track down errors (see below for a potential fix for the need to -specify dependent keys at all). **Template helpers instead don't need to list -dependencies and are automatically re-executed** when any of their arguments -change. While that is true in most cases there are some edge cases where -**helpers might actually not work as expected**. +One of the main reasons that we hear why people prefer template helpers over computed properties is the fact that computed properties need to list their dependent keys. **Especially newcomers to Ember.js are afraid of forgetting a key or making a mistake** (especially when it comes to collections) which can lead to hard to track down errors (see below for a potential fix for the need to specify dependent keys at all). **Template helpers instead don't need to list dependencies and are automatically re-executed** when any of their arguments change. While that is true in most cases there are some edge cases where **helpers might actually not work as expected**. -Consider a slightly modified version of the above example that compares the -user's `age` property with a comparison value: +Consider a slightly modified version of the above example that compares the user's `age` property with a comparison value: ```hbs {% raw %} @@ -188,8 +129,7 @@ user's `age` property with a comparison value: {% endraw %} ``` -Here, the internals of the comparison logic have been moved into the `is-senior` -helper: +Here, the internals of the comparison logic have been moved into the `is-senior` helper: ```js {% raw %} @@ -199,22 +139,11 @@ export default Ember.Helper.helper(function ([user]) { {% endraw %} ``` -The problem with this solution is that the DOM does not get updated when the -user's `age` property changes. While arguments that are passed to helpers are -observed by Ember automatically and the **helper will be re-executed when any of -these arguments change to a different value, the same is not true when any -property on any of the arguments changes**. In this case changes of the user's -`age` property would go unnoticed and the DOM would get out of sync with the -underlying data. +The problem with this solution is that the DOM does not get updated when the user's `age` property changes. While arguments that are passed to helpers are observed by Ember automatically and the **helper will be re-executed when any of these arguments change to a different value, the same is not true when any property on any of the arguments changes**. In this case changes of the user's `age` property would go unnoticed and the DOM would get out of sync with the underlying data. ### Performance -In general, **performance should be more or less on par for computed properties -and template helpers** in comparable scenarios. There's one slight difference -though in the way that helpers and computed properties work that can have -relevant performance implications though: **all arguments passed to helpers are -eagerly evaluated before the helper function is invoked**. This is a major -difference compared to computed properties actually. +In general, **performance should be more or less on par for computed properties and template helpers** in comparable scenarios. There's one slight difference though in the way that helpers and computed properties work that can have relevant performance implications though: **all arguments passed to helpers are eagerly evaluated before the helper function is invoked**. This is a major difference compared to computed properties actually. Consider this example: @@ -226,9 +155,7 @@ Consider this example: {% endraw %} ``` -Here, both `propA` and `propB` will be eagerly evaluated before being passed to -the `and` helper. Comparing this to the same logic implemented as a computed -property makes the difference clear: +Here, both `propA` and `propB` will be eagerly evaluated before being passed to the `and` helper. Comparing this to the same logic implemented as a computed property makes the difference clear: ```js {% raw %} @@ -238,76 +165,29 @@ areBothTruthy: computed('propA', 'propB', function () { {% endraw %} ``` -As the `&&` operator will actually short-circuit execution when -`this.get('propA')` is false, `this.get('propB')` will never be evaluated in -these cases while both properties will always be eagerly evaluated when using a -helper. If calculating `propB` is a costly operation that is obviously not -desirable but something that cannot actually be prevented with template helpers. +As the `&&` operator will actually short-circuit execution when `this.get('propA')` is false, `this.get('propB')` will never be evaluated in these cases while both properties will always be eagerly evaluated when using a helper. If calculating `propB` is a costly operation that is obviously not desirable but something that cannot actually be prevented with template helpers. ## Pick one -As shown above there are many cases in which either computed properties or -template helpers can be used to implement the same functionality. There are -**some drawbacks though that template helpers come with while not actually -providing any additional value** in these scenarios. - -We at Mainmatter prefer computed properties over template helpers in all of our -projects and are putting some effort in making computed properties better. -[ember-classy-computed](https://github.com/mainmatter/ember-classy-computed) for -example introduces a mechanism for class based computed properties that is -actually quite similar to class based helpers. We are also currently -[experimenting with computed properties that automatically track their dependent keys](https://github.com/mainmatter/ember-auto-computed) -which would obviously remove a lot of complexity and eliminate people's fear to -accidentally omit a dependency or specify a wrong one (besides that there could -even be performance improvements as there could be less invalidations). - -There is also a **bunch of great computed property macro addons** like -[ember-cpm](https://github.com/cibernox/ember-cpm) by -[Miguel Camba](https://github.com/cibernox) and -[ember-awesome-macros](https://github.com/kellyselden/ember-awesome-macros) and -[ember-macro-helpers](https://github.com/kellyselden/ember-macro-helpers) by -[Kelly Selden](https://github.com/kellyselden) who has done a lot of great work -making computed properties easier accessible and more powerful recently. Check -out -[Kelly's talk on computed properties he gave at the recent Ember.js SF meetup](http://slides.com/kellyselden/the-world-of-ember-macros-and-how-to-create-your-own-2#/43). +As shown above there are many cases in which either computed properties or template helpers can be used to implement the same functionality. There are **some drawbacks though that template helpers come with while not actually providing any additional value** in these scenarios. + +We at Mainmatter prefer computed properties over template helpers in all of our projects and are putting some effort in making computed properties better. [ember-classy-computed](https://github.com/mainmatter/ember-classy-computed) for example introduces a mechanism for class based computed properties that is actually quite similar to class based helpers. We are also currently [experimenting with computed properties that automatically track their dependent keys](https://github.com/mainmatter/ember-auto-computed) which would obviously remove a lot of complexity and eliminate people's fear to accidentally omit a dependency or specify a wrong one (besides that there could even be performance improvements as there could be less invalidations). + +There is also a **bunch of great computed property macro addons** like [ember-cpm](https://github.com/cibernox/ember-cpm) by [Miguel Camba](https://github.com/cibernox) and [ember-awesome-macros](https://github.com/kellyselden/ember-awesome-macros) and [ember-macro-helpers](https://github.com/kellyselden/ember-macro-helpers) by [Kelly Selden](https://github.com/kellyselden) who has done a lot of great work making computed properties easier accessible and more powerful recently. Check out [Kelly's talk on computed properties he gave at the recent Ember.js SF meetup](http://slides.com/kellyselden/the-world-of-ember-macros-and-how-to-create-your-own-2#/43). ### Pure Functions -One thing I hear a lot is that template helpers are better than computed -properties because helpers are (supposed to be) pure functions. While **pure -functions are great** and helpers are (unless you make a mistake) pure -functions, **computed properties are actually pure functions as well** so this -is not something that speaks for either of the alternatives. - -For some context: a pure function is a function that only depends on its inputs -and will return the same value for the same inputs each time it is called. A -pure function also has no side effects. While this is true for helpers it is -obviously true for computed properties with the only distinction that **a -computed property's inputs are called its dependent keys**. Of course there's -also class based helpers whose whole purpose is to enable template helpers that -can depend on global state and thus are not pure functions (and the same concept -exists for computed properties with ember-classy-computed now). +One thing I hear a lot is that template helpers are better than computed properties because helpers are (supposed to be) pure functions. While **pure functions are great** and helpers are (unless you make a mistake) pure functions, **computed properties are actually pure functions as well** so this is not something that speaks for either of the alternatives. + +For some context: a pure function is a function that only depends on its inputs and will return the same value for the same inputs each time it is called. A pure function also has no side effects. While this is true for helpers it is obviously true for computed properties with the only distinction that **a computed property's inputs are called its dependent keys**. Of course there's also class based helpers whose whole purpose is to enable template helpers that can depend on global state and thus are not pure functions (and the same concept exists for computed properties with ember-classy-computed now). ### Original concerns of the template layer -The intention of this post is not to say template helpers are bad and computed -properties should be used for everything. That would be a pretty ignorant -statement to make. **There are original concerns of the template layer that are -best implemented in helpers** - typical examples being translating strings, -formatting numbers or dates etc. We use template helpers almost exclusively for -this kind of functionality which is usually only a small part part of any -application though - we often only have a few helpers defined even in pretty big -and involved applications. +The intention of this post is not to say template helpers are bad and computed properties should be used for everything. That would be a pretty ignorant statement to make. **There are original concerns of the template layer that are best implemented in helpers** - typical examples being translating strings, formatting numbers or dates etc. We use template helpers almost exclusively for this kind of functionality which is usually only a small part part of any application though - we often only have a few helpers defined even in pretty big and involved applications. ### Missing a property context -There is one slightly more evolved scenario where computed properties cannot -easily be used instead of template helpers to achieve the same functionality. -That is when there is **no context the computed property could be defined on or -the context it would be needed on is unrelated to the template context**. One -example for this is a component that renders a list of items and keeps track of -which of these items is currently selected. The easiest way to do something like -that using template helpers would look something like this: +There is one slightly more evolved scenario where computed properties cannot easily be used instead of template helpers to achieve the same functionality. That is when there is **no context the computed property could be defined on or the context it would be needed on is unrelated to the template context**. One example for this is a component that renders a list of items and keeps track of which of these items is currently selected. The easiest way to do something like that using template helpers would look something like this: ```hbs {% raw %} @@ -319,14 +199,9 @@ that using template helpers would look something like this: {% endraw %} ``` -This isn't as straight forward to replace with a computed property as the -previous examples. While defining an `isSelected` property on the template -context isn't possible as the property is needed per item in the list, the -property can also not be defined on the items as the items have no notion of the -list component or how that keeps track of the selected element at all. +This isn't as straight forward to replace with a computed property as the previous examples. While defining an `isSelected` property on the template context isn't possible as the property is needed per item in the list, the property can also not be defined on the items as the items have no notion of the list component or how that keeps track of the selected element at all. -The solution to this problem is to construct a new context that has access to -both the item as well as the component: +The solution to this problem is to construct a new context that has access to both the item as well as the component: ```js {% raw %} @@ -342,8 +217,7 @@ _listItems: computed('items.[]', 'selectedItem', function() { {% endraw %} ``` -The template iterates over this wrapper collection instead of the original -collection then: +The template iterates over this wrapper collection instead of the original collection then: ```hbs {% raw %} @@ -355,21 +229,10 @@ collection then: {% endraw %} ``` -This pattern - **defining a wrapper context that combines two or more other -contexts** - should work in similar scenarios as well. +This pattern - **defining a wrapper context that combines two or more other contexts** - should work in similar scenarios as well. ## Conclusion -Computed properties and template helpers are both valuable parts of the Ember -framework and **both have their use cases**. Being aware of which one is best -suited for which use case and what the consequences and drawbacks are when -picking either one is crucial for **preventing long term maintainability -issues**. - -Computed properties are powerful already and will continue to improve with tools -like [ember-cpm](https://github.com/cibernox/ember-cpm), -[ember-awesome-macros](https://github.com/kellyselden/ember-awesome-macros), -[ember-macro-helpers](https://github.com/kellyselden/ember-macro-helpers) and -eventually perhaps computed properties that automatically track their -dependencies. Before turning towards a seemingly easier alternative, have a -close look at the consequences of your decision though. +Computed properties and template helpers are both valuable parts of the Ember framework and **both have their use cases**. Being aware of which one is best suited for which use case and what the consequences and drawbacks are when picking either one is crucial for **preventing long term maintainability issues**. + +Computed properties are powerful already and will continue to improve with tools like [ember-cpm](https://github.com/cibernox/ember-cpm), [ember-awesome-macros](https://github.com/kellyselden/ember-awesome-macros), [ember-macro-helpers](https://github.com/kellyselden/ember-macro-helpers) and eventually perhaps computed properties that automatically track their dependencies. Before turning towards a seemingly easier alternative, have a close look at the consequences of your decision though. diff --git a/src/posts/2017-08-28-creating-web-components-with-glimmer.md b/src/posts/2017-08-28-creating-web-components-with-glimmer.md index 4cea44293f..e36aac6aca 100644 --- a/src/posts/2017-08-28-creating-web-components-with-glimmer.md +++ b/src/posts/2017-08-28-creating-web-components-with-glimmer.md @@ -2,32 +2,19 @@ title: Creating Web Components with Glimmer authorHandle: jjordan_dev bio: "Senior Frontend Engineer, Ember Learning core team member" -description: - "Jessica Jordan explains what web components (aka custom elements) are and - shows how they can be built using Glimmer.js." +description: "Jessica Jordan explains what web components (aka custom elements) are and shows how they can be built using Glimmer.js." tags: ember tagline: |

    At this year's EmberConf the Ember core team officially announced the release of Glimmer - a light-weight JavaScript library aimed to provide a useful toolset for creating fast and reusable UI components. Powered by the already battle-tested Ember-CLI, developers can build their Glimmer apps in an easy and efficient manner as they already came to love building applications in Ember.js before.

    --- -In addition to building standalone Glimmer applications, the library allows the -creation of components **according to the Custom Elements v1 specification**, -making it possible to build native web components which can be reused across all -kinds of front end stacks. +In addition to building standalone Glimmer applications, the library allows the creation of components **according to the Custom Elements v1 specification**, making it possible to build native web components which can be reused across all kinds of front end stacks. ## What's in the Custom Elements v1 specification -The **Custom Elements spec** describes a technology which is - alongside of HTML -templates, Shadow DOM and HTML imports - an integral part of the -[current Web Component specification](https://www.w3.org/wiki/WebComponents/). -The Custom Elements spec describes capabilities for creating custom HTML -elements which can be used just like native HTML elements: ``. +The **Custom Elements spec** describes a technology which is - alongside of HTML templates, Shadow DOM and HTML imports - an integral part of the [current Web Component specification](https://www.w3.org/wiki/WebComponents/). The Custom Elements spec describes capabilities for creating custom HTML elements which can be used just like native HTML elements: ``. -The -[current version of this specification](https://www.w3.org/TR/custom-elements/) -defines a `CustomElementRegistry` interface global which is available as the -`customElements` global in the browser. Custom elements are based on extensions -of the native `HTMLElement` base class: +The [current version of this specification](https://www.w3.org/TR/custom-elements/) defines a `CustomElementRegistry` interface global which is available as the `customElements` global in the browser. Custom elements are based on extensions of the native `HTMLElement` base class: ```js {% raw %} @@ -37,9 +24,7 @@ class CustomElementClass extends HTMLElement { {% endraw %} ``` -The `CustomElementRegistry`'s `define` method can subsequently be used to -register custom elements, e.g. a custom element named `my-customelement`, would -be registered as follows: +The `CustomElementRegistry`'s `define` method can subsequently be used to register custom elements, e.g. a custom element named `my-customelement`, would be registered as follows: ```js {% raw %} @@ -51,8 +36,7 @@ customElements.define('my-customelement', CustomElementClass); {% endraw %} ``` -Finally, a custom element that has been registered via the -`CustomElementRegistry` can simply be used anywhere in HTML like any other tag: +Finally, a custom element that has been registered via the `CustomElementRegistry` can simply be used anywhere in HTML like any other tag: ```html @@ -67,81 +51,39 @@ Finally, a custom element that has been registered via the ``` -Being able to encapsulate functionality this way and to be able to reuse it via -HTML markup is powerful for several reasons: - -First, it enables usage of these components **beyond the boundaries of a single -front-end tech stack**, including the diverse set of client-side JavaScript -frameworks out there. Imagine being able to develop a menu header once and to -reuse it across all the different applications that are built in the scope of -your project, no matter if these applications were built upon React or Ember. -This also furthers even greater efforts to create well-maintained and highly -flexible widgets, not only on a project's or company's scale, but also in terms -of open-source as an even greater community of developers will be interested in -creating and using that e.g. one well-built `date-picker` component. Imagine if -the community behind the `ember-power-datepicker`, `react-datepicker`, -`angular-datepicker` and others could funnel their work into creating one -component that is of great benefit to all of these JavaScript communities at -once. - -Second, the **standalone and self-contained** nature of web components creates -an API, that is not only straight-forward to use, but is also easy to reason -about; a well-structured web component will bring in all the dependencies needed -for its core functionality and will be configured - if needed at all - with -string based HTML attributes alone - making the final **mark up** very -**descriptive**. Advanced users will still be able to configure additional, more -specific functionality, as e.g. event listeners, via JavaScript themselves on -top of that. - -Third, using web components is very easy as only **knowledge of the HTML markup -language is required** to do so. Using the basic and likely most well-known -language of the web alone, it **empowers an even larger community of -developers** to build their websites and web apps with and upon web components. +Being able to encapsulate functionality this way and to be able to reuse it via HTML markup is powerful for several reasons: + +First, it enables usage of these components **beyond the boundaries of a single front-end tech stack**, including the diverse set of client-side JavaScript frameworks out there. Imagine being able to develop a menu header once and to reuse it across all the different applications that are built in the scope of your project, no matter if these applications were built upon React or Ember. This also furthers even greater efforts to create well-maintained and highly flexible widgets, not only on a project's or company's scale, but also in terms of open-source as an even greater community of developers will be interested in creating and using that e.g. one well-built `date-picker` component. Imagine if the community behind the `ember-power-datepicker`, `react-datepicker`, `angular-datepicker` and others could funnel their work into creating one component that is of great benefit to all of these JavaScript communities at once. + +Second, the **standalone and self-contained** nature of web components creates an API, that is not only straight-forward to use, but is also easy to reason about; a well-structured web component will bring in all the dependencies needed for its core functionality and will be configured - if needed at all - with string based HTML attributes alone - making the final **mark up** very **descriptive**. Advanced users will still be able to configure additional, more specific functionality, as e.g. event listeners, via JavaScript themselves on top of that. + +Third, using web components is very easy as only **knowledge of the HTML markup language is required** to do so. Using the basic and likely most well-known language of the web alone, it **empowers an even larger community of developers** to build their websites and web apps with and upon web components. Let’s now dive into how we can create our own custom elements using Glimmer. ## Glimmer Web Component Example: A Reusable Open Street Map -A common use case for a reusable component is the interactive view of a street -map which usually can be embedded into websites and apps quickly with some -configuration using services like the Google Maps API or Leaflet. What if we -could create our own custom element that can simply be shared and reused using -HTML alone? +A common use case for a reusable component is the interactive view of a street map which usually can be embedded into websites and apps quickly with some configuration using services like the Google Maps API or Leaflet. What if we could create our own custom element that can simply be shared and reused using HTML alone? -In the following we will **create a simple street map** based on -[Leaflet.js](http://leafletjs.com/) which can be re-used as such a custom -element in any other application or static website: +In the following we will **create a simple street map** based on [Leaflet.js](http://leafletjs.com/) which can be re-used as such a custom element in any other application or static website: ![Screenshot of Final Glimmer Map Component Example - Open Street Map View Centered on Munich](/assets/images/posts/2017-08-30-creating-web-components-with-glimmer/glimmer-map-screenshot-final.jpg#@1200-2400) -You can also check out the project on -[Github](https://github.com/jessica-jordan/glimmer-map). +You can also check out the project on [Github](https://github.com/jessica-jordan/glimmer-map). ### Starting a new Glimmer Web Component Project -To get started with an initial, running project setup, we will be using -[Ember CLI](https://ember-cli.com/) for scaffolding and configuration of our -Glimmer app. From `ember-cli@2.14.0` onwards, we can get started to create a -Glimmer-backed web component by using the `ember new` generator, the -[respective glimmer blueprint](https://github.com/glimmerjs/glimmer-blueprint) -and the `--web-component` flag: +To get started with an initial, running project setup, we will be using [Ember CLI](https://ember-cli.com/) for scaffolding and configuration of our Glimmer app. From `ember-cli@2.14.0` onwards, we can get started to create a Glimmer-backed web component by using the `ember new` generator, the [respective glimmer blueprint](https://github.com/glimmerjs/glimmer-blueprint) and the `--web-component` flag: ```bash ember new glimmer-map -b @glimmer/blueprint --web-component ``` -generating the needed scaffolding for our first Glimmer app. As soon as the -Glimmer app is booted up via a simple `ember serve` and we navigate to the -typical `http://localhost:4200`, we will find that our first component project -is already rendered with a "Welcome to Glimmer!" headline: +generating the needed scaffolding for our first Glimmer app. As soon as the Glimmer app is booted up via a simple `ember serve` and we navigate to the typical `http://localhost:4200`, we will find that our first component project is already rendered with a "Welcome to Glimmer!" headline: ![Screenshot of First Page of a New Glimmer App - Headline: Hello Glimmer!](/assets/images/posts/2017-08-30-creating-web-components-with-glimmer/glimmer-map-startup.png#@1200-2400) -Let's have a look at our project's file structure as well; following the new -folder structure planned out in the -[module unification RFC](https://github.com/emberjs/rfcs/pull/143) we can -already find our `component.ts` and `template.hbs` files for creating our -component co-located in the same directory below the `src` directory: +Let's have a look at our project's file structure as well; following the new folder structure planned out in the [module unification RFC](https://github.com/emberjs/rfcs/pull/143) we can already find our `component.ts` and `template.hbs` files for creating our component co-located in the same directory below the `src` directory: ``` src @@ -161,13 +103,7 @@ src └── test-helper.ts ``` -Having a closer look at the app setup in -`glimmer-web-component/src/initialize-custom-elements.ts`, we can see how the -Glimmer app is started up and rendered as a custom element. Under the hood, -Glimmer’s `renderComponent` API is taking care of initial setup and rendering of -the component into the aforementioned placeholder in the DOM and the -`initializeCustomElements` API for registering the component as a native custom -element: +Having a closer look at the app setup in `glimmer-web-component/src/initialize-custom-elements.ts`, we can see how the Glimmer app is started up and rendered as a custom element. Under the hood, Glimmer’s `renderComponent` API is taking care of initial setup and rendering of the component into the aforementioned placeholder in the DOM and the `initializeCustomElements` API for registering the component as a native custom element: ```ts function initializeCustomElement(app: Application, name: string): void { @@ -195,21 +131,13 @@ function initializeCustomElement(app: Application, name: string): void { } ``` -The final line makes use of the `CustomElementRegistry`'s `define` method to -register the `GlimmerElement` class as a custom element, just as we expect it -from the Custom Elements specification. Interesting to note here as well is the -call to the `assignAttributes` method, ensuring that any top-level attributes -defined on our custom element are later on also mapped to attributes on our -rendered Glimmer component. +The final line makes use of the `CustomElementRegistry`'s `define` method to register the `GlimmerElement` class as a custom element, just as we expect it from the Custom Elements specification. Interesting to note here as well is the call to the `assignAttributes` method, ensuring that any top-level attributes defined on our custom element are later on also mapped to attributes on our rendered Glimmer component. -So, after having that quick dive into how our component is spun up in Glimmer, -let’s get started developing it: +So, after having that quick dive into how our component is spun up in Glimmer, let’s get started developing it: ### Developing a Web Component with Glimmer's API -So far the blueprint for our main component module has already been setup by -Ember CLI's generator. The class used for generating our `glimmer-map` component -is now defined in `src/ui/components/glimmer-map/component.ts`: +So far the blueprint for our main component module has already been setup by Ember CLI's generator. The class used for generating our `glimmer-map` component is now defined in `src/ui/components/glimmer-map/component.ts`: ```ts // src/ui/components/glimmer-map/component.ts @@ -218,21 +146,13 @@ import Component from "@glimmer/component"; export default class GlimmerMap extends Component {} ``` -As we would like to create a map based on `Leaflet.js`, let's also get that -dependency installed in our project: +As we would like to create a map based on `Leaflet.js`, let's also get that dependency installed in our project: ```bash yarn add --dev leaflet ``` -Similar to many other npm packages that you will find out there, the Leaflet -dependency exports its internals via **the CommonJS module** syntax. Since the -[glimmer-application-pipeline](https://github.com/glimmerjs/glimmer-application-pipeline) -only supports the import of modules following the ES6 syntax out of the box, we -can make ends meet by configuring rollup in our `ember-cli-build.js` as -[also seen in the glimmer-application-pipeline documentation](https://github.com/glimmerjs/glimmer-application-pipeline#importing-commonjs-modules) -and install the `rollup-plugin-node-resolve` and `rollup-plugin-commonjs` -dependencies: +Similar to many other npm packages that you will find out there, the Leaflet dependency exports its internals via **the CommonJS module** syntax. Since the [glimmer-application-pipeline](https://github.com/glimmerjs/glimmer-application-pipeline) only supports the import of modules following the ES6 syntax out of the box, we can make ends meet by configuring rollup in our `ember-cli-build.js` as [also seen in the glimmer-application-pipeline documentation](https://github.com/glimmerjs/glimmer-application-pipeline#importing-commonjs-modules) and install the `rollup-plugin-node-resolve` and `rollup-plugin-commonjs` dependencies: ```bash yarn add --dev rollup-plugin-node-resolve @@ -274,9 +194,7 @@ import L from "leaflet"; export default class GlimmerMap extends Component {} ``` -Now for creating and rendering the map, let's use the component's -`didInsertElement` lifecycle hook to ensure that the Glimmer component has been -inserted into the DOM already before the map instance is created and rendered: +Now for creating and rendering the map, let's use the component's `didInsertElement` lifecycle hook to ensure that the Glimmer component has been inserted into the DOM already before the map instance is created and rendered: ```ts // src/ui/components/glimmer-map/component.ts @@ -320,11 +238,7 @@ With this setup, our map already renders for the map points set intially: ![Screenshot of Open Street Map View of First Pass on the Glimmer Map Component](/assets/images/posts/2017-08-30-creating-web-components-with-glimmer/glimmer-map-screenshot.jpg#@1200-2400) -We also aim to make our map respond to user input. Specifically, we would like -to be able to set the marker to different locations on the map using a property -for the longitude (`lon`) and the latitude (`lat`) easily. To allow any property -changes to be reflected in the component's DOM, we can make use of the -`@tracked` decorator: +We also aim to make our map respond to user input. Specifically, we would like to be able to set the marker to different locations on the map using a property for the longitude (`lon`) and the latitude (`lat`) easily. To allow any property changes to be reflected in the component's DOM, we can make use of the `@tracked` decorator: ```ts // src/ui/components/glimmer-map/component.ts @@ -338,9 +252,7 @@ export default class GlimmerMap extends Component { } ``` -Anytime there is a change to one of the tracked properties' values, a re-render -of the component with a newly updated DOM will follow. And promote the changes -to these properties via actions by updating our template +Anytime there is a change to one of the tracked properties' values, a re-render of the component with a newly updated DOM will follow. And promote the changes to these properties via actions by updating our template ```hbs {% raw %} @@ -387,27 +299,17 @@ export default class GlimmerMap extends Component { } ``` -With this we are already done and can get started with distributing our -component. +With this we are already done and can get started with distributing our component. ## Reusing Glimmer components as custom elements -As mentioned in the beginning of this article, the current blueprint for Glimmer -web components comes with a wrapper for being able to package and reuse our -Glimmer components as custom elements. To **create the assets** needed for -reusage, let’s build those like we are already used to when building Ember apps: +As mentioned in the beginning of this article, the current blueprint for Glimmer web components comes with a wrapper for being able to package and reuse our Glimmer components as custom elements. To **create the assets** needed for reusage, let’s build those like we are already used to when building Ember apps: ```bash ember build --production ``` -This will store all the assets needed for reusing our custom element in the -`/dist` directory of the project. For our example, only the `app.js` file has to -be copied to be reused in our target app where we would like to use the -`glimmer-map` web component. Adding in the external stylesheet for the styles of -our map, as well as a -[polyfill for ensuring cross-browser support for all custom element features](https://github.com/webcomponents/webcomponentsjs) -finalizes our example: +This will store all the assets needed for reusing our custom element in the `/dist` directory of the project. For our example, only the `app.js` file has to be copied to be reused in our target app where we would like to use the `glimmer-map` web component. Adding in the external stylesheet for the styles of our map, as well as a [polyfill for ensuring cross-browser support for all custom element features](https://github.com/webcomponents/webcomponentsjs) finalizes our example: ```html // your/other/app/template/or/plain/html/page.html @@ -430,8 +332,7 @@ finalizes our example: ``` -And finally, we can see our Glimmer-based street map being rendered just as seen -below: +And finally, we can see our Glimmer-based street map being rendered just as seen below: Often when working on large codebases, my changes break some existing tests. While I would prefer my coding to be perfect, it's highly unlikely that I'll ever achieve the state of coding zen, so it's nice to know I have a test suite to catch me when I fall. Given that the codebase is large and in the majority not written by me, I tend to be introduced to code via the test files. One important principle I've started to follow when writing and refactoring tests is AAA.

    --- -The [AAA principle](http://wiki.c2.com/?ArrangeActAssert) for testing is Arrange -Act Assert and it's Amazing. The TL;DR is: +The [AAA principle](http://wiki.c2.com/?ArrangeActAssert) for testing is Arrange Act Assert and it's Amazing. The TL;DR is: - Setup the data/inputs for the code you're testing (Arrange) - Invoke the code you are testing (Act) @@ -36,13 +33,11 @@ test('toLowerCase makes string all lower case', function (assert) { If you have a test that doesn't Arrange, your test may be brittle. -Don't believe me? Lets go through a real life example. You are tasked with -making a country/language picker for a website that looks something like this. +Don't believe me? Lets go through a real life example. You are tasked with making a country/language picker for a website that looks something like this. ![Country picker component](/assets/images/posts/2017-09-25-magic-test-data/tl-country-picker.png) -You will probably have a hardcoded list of countries that your website supports -somewhere in your app. +You will probably have a hardcoded list of countries that your website supports somewhere in your app. ```js {% raw %} @@ -64,11 +59,9 @@ export default [ {% endraw %} ``` -We need to write a function that adds a url pointing to an image of the country -flag so that the component can display that flag image. +We need to write a function that adds a url pointing to an image of the country flag so that the component can display that flag image. -So we write a component, here we're using Ember, but the principle is similar -for any JS framework or vanilla JS. +So we write a component, here we're using Ember, but the principle is similar for any JS framework or vanilla JS. ```js {% raw %} @@ -109,8 +102,7 @@ I don't think it's a good test though. The test is brittle. -Let's say our business development team have made inroads into Bulgaria and now -we need to add it to the the list of countries and locales. +Let's say our business development team have made inroads into Bulgaria and now we need to add it to the the list of countries and locales. ```js {% raw %} @@ -138,19 +130,11 @@ export default [ {% endraw %} ``` -The test will now fail without us having changed the code. No code change, no -behaviour change, but failing tests. The definition of a brittle test. The test -relies on magic data from an external file, namely `COUNTRIES`. It may only take -the original writer of the test minutes to figure out why the test fails, but it -might take any one new to the code unit a bit longer to figure out why. +The test will now fail without us having changed the code. No code change, no behaviour change, but failing tests. The definition of a brittle test. The test relies on magic data from an external file, namely `COUNTRIES`. It may only take the original writer of the test minutes to figure out why the test fails, but it might take any one new to the code unit a bit longer to figure out why. -What you should do is _Arrange_ the data. When you do this it becomes clear that -the function is simply adding a key, and it won't break due to external data -changes. All you care about is that given a starting set of data, after applying -your function you get the resultant set of data, as clearly defined in the test. +What you should do is _Arrange_ the data. When you do this it becomes clear that the function is simply adding a key, and it won't break due to external data changes. All you care about is that given a starting set of data, after applying your function you get the resultant set of data, as clearly defined in the test. -First we need to stop using a constant directly in our component. This way we -can override the `countries` property in the test and _arrange_ the data. +First we need to stop using a constant directly in our component. This way we can override the `countries` property in the test and _arrange_ the data. ```js {% raw %} @@ -205,8 +189,7 @@ test('displayCountries will add a flag key to a country object', function (asser {% endraw %} ``` -I feel much better about this test. It is no longer brittle as it's not -dependent on an external `JSON` file. +I feel much better about this test. It is no longer brittle as it's not dependent on an external `JSON` file. And I get to commit GoT & LOTR to the code base. diff --git a/src/posts/2017-10-24-high-level-assertions-with-qunit-dom.md b/src/posts/2017-10-24-high-level-assertions-with-qunit-dom.md index c058d0564a..fb1410e040 100644 --- a/src/posts/2017-10-24-high-level-assertions-with-qunit-dom.md +++ b/src/posts/2017-10-24-high-level-assertions-with-qunit-dom.md @@ -2,17 +2,13 @@ title: High Level Assertions with qunit-dom authorHandle: tobiasbieniek bio: "Senior Frontend Engineer, Ember CLI core team member" -description: - "Tobias Bieniek introduces qunit-dom, an extension for qunit that allows - writing more expressive and less complex UI tests using high level DOM - assertions." +description: "Tobias Bieniek introduces qunit-dom, an extension for qunit that allows writing more expressive and less complex UI tests using high level DOM assertions." tags: javascript tagline: |

    At EmberFest this year we presented and released qunit-dom. A plugin for QUnit providing High Level DOM Assertions with the goal to reduce test complexity for all QUnit users. This blog post will show you how to write simpler tests using async/await and qunit-dom.

    --- -As an introduction to what this means let's start with an example template for -an Ember app that we will write a test for: +As an introduction to what this means let's start with an example template for an Ember app that we will write a test for: ```handlebars {% raw %} @@ -27,8 +23,7 @@ an Ember app that we will write a test for: {% endraw %} ``` -From the template above you can see that we have essentially two states that we -need to test: one with and one without a `username` property being set. +From the template above you can see that we have essentially two states that we need to test: one with and one without a `username` property being set. ## Status Quo @@ -57,22 +52,13 @@ test('frontpage should be welcoming', function (assert) { {% endraw %} ``` -First we will `visit` the index page `andThen` check if the welcome message -matches our expectation. Next we will `fill` an `` field with a custom -`username` like "John Doe" `andThen` finally we will check if the welcome -message was updated correctly. +First we will `visit` the index page `andThen` check if the welcome message matches our expectation. Next we will `fill` an `` field with a custom `username` like "John Doe" `andThen` finally we will check if the welcome message was updated correctly. ## Promise chains -If you've used [Ember.js](https://emberjs.com/) for some time you will probably -be used to the `andThen` blocks above. One of the reasons for them to exist is -that Ember.js is older than the `Promise` implementation that came with ES6 and -before that existed there was already a need for handling async behavior in -tests. +If you've used [Ember.js](https://emberjs.com/) for some time you will probably be used to the `andThen` blocks above. One of the reasons for them to exist is that Ember.js is older than the `Promise` implementation that came with ES6 and before that existed there was already a need for handling async behavior in tests. -Since Ember.js has kept up very well with the latest developments in JavaScript -you can also use a `Promise` chain instead of the `andThen` blocks which would -look like this: +Since Ember.js has kept up very well with the latest developments in JavaScript you can also use a `Promise` chain instead of the `andThen` blocks which would look like this: ```js {% raw %} @@ -95,28 +81,17 @@ test('frontpage should be welcoming', function (assert) { {% endraw %} ``` -While that code makes it more obvious that we are dealing with asynchronous code -here, it also make the code a little harder to read. Which is one of the reasons -why a lot of Ember developers still prefer the `andThen` blocks over using -`Promise` chains. +While that code makes it more obvious that we are dealing with asynchronous code here, it also make the code a little harder to read. Which is one of the reasons why a lot of Ember developers still prefer the `andThen` blocks over using `Promise` chains. ## async/await -In one of the recent changes to the JavaScript language (or ECMAScript to be -precise) two new keywords were introduced to simplify dealing with `Promises`: -`async` and `await`. +In one of the recent changes to the JavaScript language (or ECMAScript to be precise) two new keywords were introduced to simplify dealing with `Promises`: `async` and `await`. -Whenever you mark a `function` as `async` it will automatically return a -`Promise` and once you `return` something from that function it will `resolve` -that `Promise`. Similarly if you `throw` an error it will `reject` the -`Promise`. +Whenever you mark a `function` as `async` it will automatically return a `Promise` and once you `return` something from that function it will `resolve` that `Promise`. Similarly if you `throw` an error it will `reject` the `Promise`. -But the real power comes with the `await` keyword that can only be used inside -of `async` functions. Using `await` you can wait on another `Promise` before -resolving or rejecting the `Promise` of your own `async` function. +But the real power comes with the `await` keyword that can only be used inside of `async` functions. Using `await` you can wait on another `Promise` before resolving or rejecting the `Promise` of your own `async` function. -That description was pretty abstract so let's look at an example using the -`Promise` chain above: +That description was pretty abstract so let's look at an example using the `Promise` chain above: ```js {% raw %} @@ -137,23 +112,15 @@ test('frontpage should be welcoming', async function (assert) { {% endraw %} ``` -As you can see this looks a lot more readable than what we had before and almost -like the synchronous code we usually write. +As you can see this looks a lot more readable than what we had before and almost like the synchronous code we usually write. -The assertions (the lines starting with `assert.`) however are still quite hard -to read, and it takes a short while to figure out what the intent of that -assertion was. +The assertions (the lines starting with `assert.`) however are still quite hard to read, and it takes a short while to figure out what the intent of that assertion was. ## chai and chai-dom -If you're using [Mocha](https://mochajs.org/) and [Chai](http://chaijs.com/) to -write your tests, you are already used to more readable assertions since Chai -emphasizes an "expressive language and readable style" for their assertions. +If you're using [Mocha](https://mochajs.org/) and [Chai](http://chaijs.com/) to write your tests, you are already used to more readable assertions since Chai emphasizes an "expressive language and readable style" for their assertions. -Fortunately for Chai there is a plugin called -[`chai-dom`](https://github.com/nathanboktae/chai-dom) which provides even -better assertions so that we could rewrite our assertions above to something -like: +Fortunately for Chai there is a plugin called [`chai-dom`](https://github.com/nathanboktae/chai-dom) which provides even better assertions so that we could rewrite our assertions above to something like: ```js {% raw %} @@ -167,21 +134,13 @@ expect(find('h1.title')).to.have.class('has-username'); {% endraw %} ``` -`chai-dom` is also supported by default in `ember-cli-chai`, so if you used -`ember-cli-chai` today you only need to `npm install --save-dev chai-dom`, -restart Ember CLI and now you can use the additional assertions that `chai-dom` -provides. +`chai-dom` is also supported by default in `ember-cli-chai`, so if you used `ember-cli-chai` today you only need to `npm install --save-dev chai-dom`, restart Ember CLI and now you can use the additional assertions that `chai-dom` provides. ## qunit-dom -While `ember-cli-chai` also works with QUnit it is essentially just a hack and -not really supported properly by QUnit or Chai so be careful if you're using it. +While `ember-cli-chai` also works with QUnit it is essentially just a hack and not really supported properly by QUnit or Chai so be careful if you're using it. -As we were getting more and more annoyed by the hard-to-read assertions when -using QUnit we were starting to wonder if it would be possible to build -something like `chai-dom` but for QUnit instead and how that would look like. -After a bit of brainstorming we figured we would want our assertions to look -roughly like this: +As we were getting more and more annoyed by the hard-to-read assertions when using QUnit we were starting to wonder if it would be possible to build something like `chai-dom` but for QUnit instead and how that would look like. After a bit of brainstorming we figured we would want our assertions to look roughly like this: ```js {% raw %} @@ -197,39 +156,21 @@ assert.dom('h1.title').hasClass('has-username'); Compared to what we started with this: -- automatically finds the correct element on the `document` (or `#ember-testing` - element) based on the selector passed into the `dom()` function -- collapses whitespace according to the HTML spec to get rid of the irrelevant - `\n` part of the expected string -- provides readable high level assertions for the most common checks on DOM - elements +- automatically finds the correct element on the `document` (or `#ember-testing` element) based on the selector passed into the `dom()` function +- collapses whitespace according to the HTML spec to get rid of the irrelevant `\n` part of the expected string +- provides readable high level assertions for the most common checks on DOM elements -As you might have figured out by now we've not just planned how it could look, -we've also built and released it at . +As you might have figured out by now we've not just planned how it could look, we've also built and released it at . -One additional advantage for Ember.js users is that it automatically hooks -itself into the build pipeline of your projects, so all you need to do is -`ember install qunit-dom`, and then you can immediately start using it! +One additional advantage for Ember.js users is that it automatically hooks itself into the build pipeline of your projects, so all you need to do is `ember install qunit-dom`, and then you can immediately start using it! -You can find examples of what assertions are available in the -[README](https://github.com/mainmatter/qunit-dom#qunit-dom) of the project and -even more information in the -[API reference](https://github.com/mainmatter/qunit-dom/blob/master/API.md). +You can find examples of what assertions are available in the [README](https://github.com/mainmatter/qunit-dom#qunit-dom) of the project and even more information in the [API reference](https://github.com/mainmatter/qunit-dom/blob/master/API.md). ## qunit-dom-codemod -During the EmberFest conference we realized that while a lot of people would -probably appreciate what we had built, nobody would go over their thousands of -existing assertions and rewrite them all to use `qunit-dom`. Since a lot of the -existing assertions in our client projects followed similar patterns we figured -it might be possible to build a -[codemod](https://medium.com/airbnb-engineering/turbocharged-javascript-refactoring-with-codemods-b0cae8b326b9) -that did most of the rewriting automatically for us. +During the EmberFest conference we realized that while a lot of people would probably appreciate what we had built, nobody would go over their thousands of existing assertions and rewrite them all to use `qunit-dom`. Since a lot of the existing assertions in our client projects followed similar patterns we figured it might be possible to build a [codemod](https://medium.com/airbnb-engineering/turbocharged-javascript-refactoring-with-codemods-b0cae8b326b9) that did most of the rewriting automatically for us. -After that initial thought we started working and after only a few minutes we -already had a working proof-of-concept including passing tests. Since then we -have put in some more work into the codemod and are happy to share it with you -at . +After that initial thought we started working and after only a few minutes we already had a working proof-of-concept including passing tests. Since then we have put in some more work into the codemod and are happy to share it with you at . All you need to do is install `jscodeshift` (the thing that runs the codemod): @@ -245,8 +186,4 @@ jscodeshift -t https://raw.githubusercontent.com/mainmatter/qunit-dom-codemod/ma ## Conclusion -Moving the tests to `async/await` and `qunit-dom` makes them a lot more readable -and easier to understand for new developers and is just a few keystrokes away if -you're already using Ember.js for your frontend projects. If you need help -refactoring your tests or even your production code to be more structured and -understandable feel free to [contact us](/contact/). +Moving the tests to `async/await` and `qunit-dom` makes them a lot more readable and easier to understand for new developers and is just a few keystrokes away if you're already using Ember.js for your frontend projects. If you need help refactoring your tests or even your production code to be more structured and understandable feel free to [contact us](/contact/). diff --git a/src/posts/2017-11-17-ember-test-selectors-road-to-1-0.md b/src/posts/2017-11-17-ember-test-selectors-road-to-1-0.md index c5125766eb..885601a212 100644 --- a/src/posts/2017-11-17-ember-test-selectors-road-to-1-0.md +++ b/src/posts/2017-11-17-ember-test-selectors-road-to-1-0.md @@ -2,9 +2,7 @@ title: "ember-test-selectors: The road to 1.0" authorHandle: tobiasbieniek bio: "Senior Frontend Engineer, Ember CLI core team member" -description: - "Tobias Bieniek goes through what happened in ember-test-selectors during the - past year and what the roadmap towards a 1.0 release is." +description: "Tobias Bieniek goes through what happened in ember-test-selectors during the past year and what the roadmap towards a 1.0 release is." tags: ember tagline: |

    Back in January we wrote about the latest changes in ember-test-selectors and how we implemented them. Since then we adjusted a few things and this blog post should give you an idea what has happened so far and what else will happen before we feel comfortable promoting the addon to v1.0.0.

    @@ -20,8 +18,7 @@ In HTML it is possible to add attributes to an element that don't have a value: {% endraw %} ``` -In Ember.js templates the same is possible for HTML elements, but for components -everything is a little different. +In Ember.js templates the same is possible for HTML elements, but for components everything is a little different. ```handlebars {% raw %} @@ -29,17 +26,11 @@ everything is a little different. {% endraw %} ``` -The above snippet does compile, but instead of setting a `data-test-user-list` -property on the `user-list` component it will take the value of the -`data-test-user-list` property on the parent component and pass that as a -positional parameter to the `user-list` component. +The above snippet does compile, but instead of setting a `data-test-user-list` property on the `user-list` component it will take the value of the `data-test-user-list` property on the parent component and pass that as a positional parameter to the `user-list` component. -In v0.2.0 of `ember-test-selectors` we introduced another Handlebars AST -transform which transforms all such valueless `data-test-foo` instances to -`data-test-foo=true` by default. +In v0.2.0 of `ember-test-selectors` we introduced another Handlebars AST transform which transforms all such valueless `data-test-foo` instances to `data-test-foo=true` by default. -While that seems like a convenient thing, it has drawbacks and does not always -work as expected, as you can see in the following template: +While that seems like a convenient thing, it has drawbacks and does not always work as expected, as you can see in the following template: ```handlebars {% raw %} @@ -51,13 +42,9 @@ work as expected, as you can see in the following template: {% endraw %} ``` -The issue here is that Handlebars expects positional parameters in front of any -named parameters and will throw an error otherwise. It is common however to put -the more important things first in a component invocation which conflicts with -having to put the valueless `data-test-*` attributes first as seen above. +The issue here is that Handlebars expects positional parameters in front of any named parameters and will throw an error otherwise. It is common however to put the more important things first in a component invocation which conflicts with having to put the valueless `data-test-*` attributes first as seen above. -Due to these problems we believe it is best to be explicit about these -attributes and always declare them with a value: +Due to these problems we believe it is best to be explicit about these attributes and always declare them with a value: ```handlebars {% raw %} @@ -65,51 +52,27 @@ attributes and always declare them with a value: {% endraw %} ``` -We will deprecate the usage of valueless `data-test-*` attributes on components -in an upcoming release and remove the transform completely for the v1.0.0 -release. +We will deprecate the usage of valueless `data-test-*` attributes on components in an upcoming release and remove the transform completely for the v1.0.0 release. ## v0.3.0: Support for Babel 6 -This year (2017) the Ember ecosystem finally moved from Babel 5 to Babel 6, -which happened mostly without issues for app developers as it was just a -dependency upgrade from `ember-cli-babel@5` to `ember-cli-babel@6`. Some app -developers might think they are still only using Babel 5 for their app, but it -is very likely that some of their addons are already using Babel 6 under the -hood since all Ember addons controls their own transpilation. +This year (2017) the Ember ecosystem finally moved from Babel 5 to Babel 6, which happened mostly without issues for app developers as it was just a dependency upgrade from `ember-cli-babel@5` to `ember-cli-babel@6`. Some app developers might think they are still only using Babel 5 for their app, but it is very likely that some of their addons are already using Babel 6 under the hood since all Ember addons controls their own transpilation. -For addons that rely on Babel transforms the upgrade unfortunately was not quite -as smooth, as the Babel transforms API had changed significantly with Babel 6. +For addons that rely on Babel transforms the upgrade unfortunately was not quite as smooth, as the Babel transforms API had changed significantly with Babel 6. -As `ember-test-selectors` relies on Babel transforms we needed to figure out a -solution to this problem. We wanted to support both Babel 5 and Babel 6 in the -same addon instead of having to publish two different variants of the addon each -targeting a different Babel version. +As `ember-test-selectors` relies on Babel transforms we needed to figure out a solution to this problem. We wanted to support both Babel 5 and Babel 6 in the same addon instead of having to publish two different variants of the addon each targeting a different Babel version. -Fortunately at [EmberConf](http://emberconf.com/) in March we found a solution: -The addon now checks the dependencies of your project and figures out which -version of `ember-cli-babel` you use. Based on that information we inject -different Babel transforms into the build pipeline so that we can support both -major Babel versions with the same addon. +Fortunately at [EmberConf](http://emberconf.com/) in March we found a solution: The addon now checks the dependencies of your project and figures out which version of `ember-cli-babel` you use. Based on that information we inject different Babel transforms into the build pipeline so that we can support both major Babel versions with the same addon. ## v0.3.4: Support for test-selectors in nested addons -In April we were notified by [Luke Melia](https://github.com/lukemelia) that -test-selectors in templates in an addon that he extracted were stripped -unconditionally. It turned out that if `ember-test-selectors` was used as a -nested addon some of the build logic that we had in place was not working -properly. +In April we were notified by [Luke Melia](https://github.com/lukemelia) that test-selectors in templates in an addon that he extracted were stripped unconditionally. It turned out that if `ember-test-selectors` was used as a nested addon some of the build logic that we had in place was not working properly. -A few days later Luke provided us with a repository that reproduced his problem. -Using his reproduction we have been able to fix the issue and it is now possible -to also use `ember-test-selectors` as a nested addon dependency and rely on -correct test-selector stripping depending on the build environment. +A few days later Luke provided us with a repository that reproduced his problem. Using his reproduction we have been able to fix the issue and it is now possible to also use `ember-test-selectors` as a nested addon dependency and rely on correct test-selector stripping depending on the build environment. ## v0.3.7: Deprecation of the `testSelector` helper function -A few weeks later [Kelly Selden](https://github.com/kellyselden) triggered a -[conversation](https://github.com/mainmatter/ember-test-selectors/issues/121) -about the `testSelector` helper function in `ember-test-selectors`. +A few weeks later [Kelly Selden](https://github.com/kellyselden) triggered a [conversation](https://github.com/mainmatter/ember-test-selectors/issues/121) about the `testSelector` helper function in `ember-test-selectors`. The purpose of the `testSelector` function is turning: @@ -129,39 +92,17 @@ let bar = '[data-test-bar="baz"]'; {% endraw %} ``` -After discussing back and forth and coming up with -[alternative APIs](https://github.com/mainmatter/ember-test-selectors/pull/122) -we decided the best way forward was actually to not use any helpers at all. This -has the advantage of not hiding the actual CSS selector that is being used and -requiring less knowledge of how `ember-test-selectors` works to understand what -any test code is doing. +After discussing back and forth and coming up with [alternative APIs](https://github.com/mainmatter/ember-test-selectors/pull/122) we decided the best way forward was actually to not use any helpers at all. This has the advantage of not hiding the actual CSS selector that is being used and requiring less knowledge of how `ember-test-selectors` works to understand what any test code is doing. -Following the discussion we have deprecated the `testSelector` helper function -and will remove it before releasing v1.0.0. If you have used the function a lot -there is a third-party -[codemod](https://github.com/lorcan/test-selectors-codemod) that might be able -to save you a few minutes or hours by converting the code for you automatically. +Following the discussion we have deprecated the `testSelector` helper function and will remove it before releasing v1.0.0. If you have used the function a lot there is a third-party [codemod](https://github.com/lorcan/test-selectors-codemod) that might be able to save you a few minutes or hours by converting the code for you automatically. ## v0.3.8: Support for Ember 1.11 and 1.12 -Only a few weeks ago [Chris Garrett](https://github.com/pzuraq/), better known -as @pzuraq, approached us about supporting Ember 1.11 and 1.12 in -`ember-test-selectors`. He was working on some projects that were started in the -early days of Ember and to be able to upgrade them confidently to a newer Ember -version he needed to write better tests. For those tests he wanted to use -test-selectors, but since they required a newer Ember version he was stuck in a -vicious circle. - -It seemed that the main issue with Ember 1.11/1.12 support was that our template -AST transforms were failing and as a first attempt we simply disabled them -completely which resolved the problem. Unfortunately that meant that -test-selectors were no longer stripped at all from the templates which did not -seem like a good solution to us so we dug deeper. - -Thanks to [ember-try](https://github.com/ember-cli/ember-try) it was very fast -and easy to try out our addon on many different Ember versions and we quickly -discovered that the Handlebars AST had changed between Ember 1.12 and 1.13 in a -way that caused our transforms to crash. +Only a few weeks ago [Chris Garrett](https://github.com/pzuraq/), better known as @pzuraq, approached us about supporting Ember 1.11 and 1.12 in `ember-test-selectors`. He was working on some projects that were started in the early days of Ember and to be able to upgrade them confidently to a newer Ember version he needed to write better tests. For those tests he wanted to use test-selectors, but since they required a newer Ember version he was stuck in a vicious circle. + +It seemed that the main issue with Ember 1.11/1.12 support was that our template AST transforms were failing and as a first attempt we simply disabled them completely which resolved the problem. Unfortunately that meant that test-selectors were no longer stripped at all from the templates which did not seem like a good solution to us so we dug deeper. + +Thanks to [ember-try](https://github.com/ember-cli/ember-try) it was very fast and easy to try out our addon on many different Ember versions and we quickly discovered that the Handlebars AST had changed between Ember 1.12 and 1.13 in a way that caused our transforms to crash. The AST for a template like: @@ -215,21 +156,12 @@ MustacheStatement { } ``` -As you can see the AST looks almost similar, but not exactly the same. In the -end we figured out we could check if the `MustacheStatement` has a `sexpr` -property, and in that case use the `hash` property inside of that instead. +As you can see the AST looks almost similar, but not exactly the same. In the end we figured out we could check if the `MustacheStatement` has a `sexpr` property, and in that case use the `hash` property inside of that instead. -Once we had that conditional in place all our tests were 🍏 again and we were -able to adjust our range of supported Ember versions all the way down to Ember -1.11. +Once we had that conditional in place all our tests were 🍏 again and we were able to adjust our range of supported Ember versions all the way down to Ember 1.11. ## Conclusion -A lot of things have happened on the project this year and we will continue to -iterate forward on this. One exciting enhancement that we are looking into is -adding support for [glimmer.js](https://glimmerjs.com/) to the addon. This will -likely not be done by the time we release v1.0.0, but will be something for us -to work on in the next year. +A lot of things have happened on the project this year and we will continue to iterate forward on this. One exciting enhancement that we are looking into is adding support for [glimmer.js](https://glimmerjs.com/) to the addon. This will likely not be done by the time we release v1.0.0, but will be something for us to work on in the next year. -If you have questions on how to best take advantage of test-selectors or how to -structure your tests in general make sure to [contact us](/contact/). +If you have questions on how to best take advantage of test-selectors or how to structure your tests in general make sure to [contact us](/contact/). diff --git a/src/posts/2017-12-04-enginification.md b/src/posts/2017-12-04-enginification.md index d07fa71fb7..fff51851af 100644 --- a/src/posts/2017-12-04-enginification.md +++ b/src/posts/2017-12-04-enginification.md @@ -2,9 +2,7 @@ title: Enginification authorHandle: pangratz bio: "Full-Stack Engineer, Ember Data core team member" -description: - "Clemens Müller gives an overview of Ember Engines and shows how they can be - used to reduce the footprint of big applications for an improved startup time." +description: "Clemens Müller gives an overview of Ember Engines and shows how they can be used to reduce the footprint of big applications for an improved startup time." tags: ember tagline: |

    We recently improved the initial load time of an Ember.js app for mobile clients, by using Ember Engines and leveraging that to lazily loaded parts of the app's code. In this blog post we're going to show how we extracted the engine out of the app and discuss some smaller issues we ran into along the way and how we solved them. So let's dive right in!

    @@ -12,16 +10,9 @@ tagline: | ## Status quo -The app is a mobile ticket counter for rail tickets. The basic flow through the -app is as follows: a user enters an departure and arrival station and specifies -the dates and passengers of the journey. After a search is initiated the results -are shown, a specific trip is chosen, details like seating preference and -passenger details are entered, the payment is processed and at the end, the -details of the booked trip are shown and the purchased tickets can be -downloaded. +The app is a mobile ticket counter for rail tickets. The basic flow through the app is as follows: a user enters an departure and arrival station and specifies the dates and passengers of the journey. After a search is initiated the results are shown, a specific trip is chosen, details like seating preference and passenger details are entered, the payment is processed and at the end, the details of the booked trip are shown and the purchased tickets can be downloaded. -At the moment Ember.js v2.14 is used and the app has 39 routes, 28 services, 77 -components, 24 models which result in the following asset sizes: +At the moment Ember.js v2.14 is used and the app has 39 routes, 28 services, 77 components, 24 models which result in the following asset sizes: | Asset | Size | | ----------- | ----------------------------- | @@ -29,27 +20,15 @@ components, 24 models which result in the following asset sizes: | `vendor.js` | 1.51 MB (342.87 KB gzipped) | | `app.css` | 104.31 KB (19.25 KB gzipped) | -Taken from the -[Ember Engine RFC](https://github.com/emberjs/rfcs/blob/master/text/0010-engines.md): +Taken from the [Ember Engine RFC](https://github.com/emberjs/rfcs/blob/master/text/0010-engines.md): -> Engines allow multiple logical applications to be composed together into a -> single application from the user's perspective. +> Engines allow multiple logical applications to be composed together into a single application from the user's perspective. -As users need to fill in the search form - specify what kind of ticket they are -looking for and for which connection - before they can even proceed to the next -step, there is no reason to load all of the code that supports the subsequent -booking flow on application startup. All of that code can be loaded lazily once -the user proceeds to the next step by actually initiating a search or even while -they are filling out the login form. +As users need to fill in the search form - specify what kind of ticket they are looking for and for which connection - before they can even proceed to the next step, there is no reason to load all of the code that supports the subsequent booking flow on application startup. All of that code can be loaded lazily once the user proceeds to the next step by actually initiating a search or even while they are filling out the login form. ## Extract common functionality used in app into an addon -One fundamental design principle of engines is that they are isolated from the -hosting app. It is possible to pass in services from the hosting app but apart -from that, engines don't have access to anything of the app which mounts the -engine. In order for components, helpers and styles to be accessible from both -the host app and the engine, those common elements need to be put into an addon, -which then the app and the engine depend on. +One fundamental design principle of engines is that they are isolated from the hosting app. It is possible to pass in services from the hosting app but apart from that, engines don't have access to anything of the app which mounts the engine. In order for components, helpers and styles to be accessible from both the host app and the engine, those common elements need to be put into an addon, which then the app and the engine depend on. We're using an in repo addon for that: @@ -57,9 +36,7 @@ We're using an in repo addon for that: ember generate in-repo-addon common ``` -After the addon is created, we want to move common components and helpers into -the addon. Let's look at the `loading-indicator` component: it shows a loading -animation of 3 dots, which is used in the host app and the engine: +After the addon is created, we want to move common components and helpers into the addon. Let's look at the `loading-indicator` component: it shows a loading animation of 3 dots, which is used in the host app and the engine: ```shell ember generate component loading-indicator --in-repo common @@ -75,9 +52,7 @@ git mv app/templates/components/loading-indicator.hbs \ git add lib/common/app/components/loading-indicator.js ``` -Since the component is now located within the `addon` folder, we need to modify -`lib/common/addon/components/loading-indicator.js` so the correct layout is -used: +Since the component is now located within the `addon` folder, we need to modify `lib/common/addon/components/loading-indicator.js` so the correct layout is used: ```js {% raw %} @@ -92,11 +67,7 @@ export default Component.extend({ {% endraw %} ``` -The application uses -[ember-cli-sass](https://github.com/aexmachina/ember-cli-sass) for its styles -and defines a number of variables for colors, sizes etc. In order for those to -be accessible from both the host app and the engine, these style definitions -need to be moved into the common addon as well: +The application uses [ember-cli-sass](https://github.com/aexmachina/ember-cli-sass) for its styles and defines a number of variables for colors, sizes etc. In order for those to be accessible from both the host app and the engine, these style definitions need to be moved into the common addon as well: ```shell git mv app/styles/vars.scss \ @@ -112,9 +83,7 @@ git mv app/styles/components/loading-indicator.scss \ lib/common/app/styles/common/components/ ``` -Apart from this, we also need to create a file which includes all the styles -from the common components and helpers. By this all the styles from the `common` -addon are included in the hosting app: +Apart from this, we also need to create a file which includes all the styles from the common components and helpers. By this all the styles from the `common` addon are included in the hosting app: ```scss // lib/common/app/styles/common.scss @@ -122,9 +91,7 @@ addon are included in the hosting app: @import "common/components/loading-indicator"; ``` -Within the app we import the style definitions for the common addon, so all the -styles for the components are included and we can use the `variables`, `colors` -and `mixins` defined in the common addon. +Within the app we import the style definitions for the common addon, so all the styles for the components are included and we can use the `variables`, `colors` and `mixins` defined in the common addon. ```scss // app/styles/app.scss @@ -132,29 +99,19 @@ and `mixins` defined in the common addon. @import "common"; ``` -After all that is done, we now have all common components and helpers, as well -as common style definitions moved into the addon. The next step is to finally -create the engine, which will contain most of the application code. +After all that is done, we now have all common components and helpers, as well as common style definitions moved into the addon. The next step is to finally create the engine, which will contain most of the application code. ## Move functionality into engine -An engine is basically an Ember.js addon. Since the engine won't be reused -within another application, we decided to go with the in-repo solution for the -engine as well: +An engine is basically an Ember.js addon. Since the engine won't be reused within another application, we decided to go with the in-repo solution for the engine as well: ```shell ember generate in-repo-addon booking-flow ``` -After that, setting up the in-repo engine according to -[the guides](http://ember-engines.com/guide/creating-an-engine) is pretty -straight forward. At the end of that we have an engine, located at -`lib/booking-flow`, so now it's time to move relevant routes, components, -templates, ... out of `app/` into it. +After that, setting up the in-repo engine according to [the guides](http://ember-engines.com/guide/creating-an-engine) is pretty straight forward. At the end of that we have an engine, located at `lib/booking-flow`, so now it's time to move relevant routes, components, templates, ... out of `app/` into it. -The first thing we want to do is to depend on the `common` in-repo addon, so we -can re-use the common elements within the engine. Let's take a look at -`lib/booking-flow/package.json`: +The first thing we want to do is to depend on the `common` in-repo addon, so we can re-use the common elements within the engine. Let's take a look at `lib/booking-flow/package.json`: ```js {% raw %}on @@ -173,16 +130,9 @@ can re-use the common elements within the engine. Let's take a look at {% endraw %} ``` -After that we can start to move all the routes, components, services which are -only used within the booking-flow engine into the corresponding folders within -`lib/booking-flow/addon/`. The nice thing about Ember Engines is that they don't -introduce any new concepts in terms of location of the files. So a simple -`git mv` does the trick. +After that we can start to move all the routes, components, services which are only used within the booking-flow engine into the corresponding folders within `lib/booking-flow/addon/`. The nice thing about Ember Engines is that they don't introduce any new concepts in terms of location of the files. So a simple `git mv` does the trick. -The booking-flow addon should use the same style definitions as the hosting app, -so we'd like to import the common style definitions within the booking-flow -engines styles. For the imports to work properly, we need to add the path to the -`common` addon to the `sassOptions` of the engine: +The booking-flow addon should use the same style definitions as the hosting app, so we'd like to import the common style definitions within the booking-flow engines styles. For the imports to work properly, we need to add the path to the `common` addon to the `sassOptions` of the engine: ```js {% raw %} @@ -203,9 +153,7 @@ module.exports = EngineAddon.extend({ {% endraw %} ``` -By this we can import the variables, colors and mixins in the engines' style -definitions. And since we namespaced the files in the `common` addon under the -`common/` folder, we get distinct import paths: +By this we can import the variables, colors and mixins in the engines' style definitions. And since we namespaced the files in the `common` addon under the `common/` folder, we get distinct import paths: ```scss // lib/booking-flow/addon/styles/components/booking-button.scss @@ -221,16 +169,11 @@ definitions. And since we namespaced the files in the `common` addon under the } ``` -So now we have moved all the non-essential logic not needed at the beginning of -the app into an in-repo engine. As a next optimization, let's make use of a -nifty feature of Ember Engines… +So now we have moved all the non-essential logic not needed at the beginning of the app into an in-repo engine. As a next optimization, let's make use of a nifty feature of Ember Engines… ## Make it lazy -After we extracted the `common` addon and the `booking-flow` engine, we are -ready to load the engine lazily to actually reduce the amount of JavaScript that -needs to be loaded, parsed and compiled to boot up the application. This is as -hard work as switching a boolean: +After we extracted the `common` addon and the `booking-flow` engine, we are ready to load the engine lazily to actually reduce the amount of JavaScript that needs to be loaded, parsed and compiled to boot up the application. This is as hard work as switching a boolean: ```js {% raw %} @@ -252,23 +195,17 @@ module.exports = EngineAddon.extend({ {% endraw %} ``` -And et voilà: we now have 3 new, separate assets, which are loaded on demand -once we navigate into a route within the engine. Since the initial assets only -contain the essential logic needed for the search, they have shrunken in size as -well: +And et voilà: we now have 3 new, separate assets, which are loaded on demand once we navigate into a route within the engine. Since the initial assets only contain the essential logic needed for the search, they have shrunken in size as well: -| Asset | Before | After | -| ------------------------ | ----------------------------- | ---------------------------- | -| `app.js` | 627.03 KB (117.22 KB gzipped) | 375.01 KB (78.23 KB gzipped) | -| `vendor.js` | 1.51 MB (342.87 KB gzipped) | 1.6 MB (364.5 KB gzipped) | -| `app.css` | 104.31 KB (19.25 KB gzipped) | 58.65 KB (12.17 KB gzipped) | -| `booking-flow.js` | | 290.47 KB (48.48 KB gzipped) | -| `booking-flow-vendor.js` | | 117 B (127 B gzipped) | -| `booking-flow.css` | | 45.24 KB (7.97 KB gzipped) | +| Asset | Before | After | +| --- | --- | --- | +| `app.js` | 627.03 KB (117.22 KB gzipped) | 375.01 KB (78.23 KB gzipped) | +| `vendor.js` | 1.51 MB (342.87 KB gzipped) | 1.6 MB (364.5 KB gzipped) | +| `app.css` | 104.31 KB (19.25 KB gzipped) | 58.65 KB (12.17 KB gzipped) | +| `booking-flow.js` | | 290.47 KB (48.48 KB gzipped) | +| `booking-flow-vendor.js` | | 117 B (127 B gzipped) | +| `booking-flow.css` | | 45.24 KB (7.97 KB gzipped) | ## Conclusion -We created an in-repo addon for commonly used components, helpers and style -definitions. After that, everything which is not needed for the initial search -screen has been moved into an in-repo engine. This helped us reduce the size of -the initially served assets. +We created an in-repo addon for commonly used components, helpers and style definitions. After that, everything which is not needed for the initial search screen has been moved into an in-repo engine. This helped us reduce the size of the initially served assets. diff --git a/src/posts/2018-01-24-ember-freestyle.md b/src/posts/2018-01-24-ember-freestyle.md index 696f4b0cc3..f814075a91 100644 --- a/src/posts/2018-01-24-ember-freestyle.md +++ b/src/posts/2018-01-24-ember-freestyle.md @@ -2,9 +2,7 @@ title: "Using ember-freestyle as a component playground" authorHandle: tobiasbieniek bio: "Senior Frontend Engineer, Ember CLI core team member" -description: - "Tobias Bieniek gives an overview of how ember-freestyle can be used in - Ember.js applications for building and testing components in isolation." +description: "Tobias Bieniek gives an overview of how ember-freestyle can be used in Ember.js applications for building and testing components in isolation." tags: ember tagline: |

    A component playground is an application that you can use to test out and play around with your custom components in isolation from the rest of your project. In the React and Vue ecosystem Storybook is a quite popular project that implements such a component playground as part of your app. In the Ember ecosystem we have the ember-freestyle addon that can be used for this purpose. This blog post will show you how to install ember-freestyle in your app and how to use it to build and test components in isolation.

    @@ -12,60 +10,32 @@ tagline: | ## Component Playgrounds -You might be wondering "Why would would I need something like this? I can just -test my components in the app!" and you're right. But imagine building a -reasonably large application with dozens of routes, hundreds of components and -thousands of possible component states. Checking all of these component states -manually on the different routes that they are appearing on is a very time -consuming task. A component playground solves this by allowing you to display -multiple component states next to each other on a single page to give you a much -better and quicker overview of how the component will look like in the end. - -Another big advantage of using component playgrounds is that it forces you to -build reusable components that are isolated from the app's business logic and -layout. That means they don't depend on any state or actions in your -controllers, routes and ideally services, but only on the data and action -handlers that are passed into them. - -If you want to know more about why component playgrounds are useful in general I -recommend reading this great blog post ["UI component explorers — your new -favorite tool"][ui-component-explorers] by Dominic Nguyen that explains the -benefits very well. - -[ui-component-explorers]: - https://blog.hichroma.com/the-crucial-tool-for-modern-frontend-engineers-fb849b06187a +You might be wondering "Why would would I need something like this? I can just test my components in the app!" and you're right. But imagine building a reasonably large application with dozens of routes, hundreds of components and thousands of possible component states. Checking all of these component states manually on the different routes that they are appearing on is a very time consuming task. A component playground solves this by allowing you to display multiple component states next to each other on a single page to give you a much better and quicker overview of how the component will look like in the end. + +Another big advantage of using component playgrounds is that it forces you to build reusable components that are isolated from the app's business logic and layout. That means they don't depend on any state or actions in your controllers, routes and ideally services, but only on the data and action handlers that are passed into them. + +If you want to know more about why component playgrounds are useful in general I recommend reading this great blog post ["UI component explorers — your new favorite tool"][ui-component-explorers] by Dominic Nguyen that explains the benefits very well. + +[ui-component-explorers]: https://blog.hichroma.com/the-crucial-tool-for-modern-frontend-engineers-fb849b06187a ## Installing `ember-freestyle` -Installing and configuring `ember-freestyle` correctly is unfortunately a little -complicated right now so if you want to take a look at the final outcome, you -can skip forward to the ["Using `ember-freestyle`"](#using-ember-freestyle) -section for now. +Installing and configuring `ember-freestyle` correctly is unfortunately a little complicated right now so if you want to take a look at the final outcome, you can skip forward to the ["Using `ember-freestyle`"](#using-ember-freestyle) section for now. -Before we start installing anything we should make sure we know what situation -we would like to be in at the end. Our plan is to use `ember-freestyle` to -generate a component playground at the `/freestyle` route, that is only -available during development and does not affect the final asset sizes of the -production build. +Before we start installing anything we should make sure we know what situation we would like to be in at the end. Our plan is to use `ember-freestyle` to generate a component playground at the `/freestyle` route, that is only available during development and does not affect the final asset sizes of the production build. -Let's start by following the official instructions on the `ember-freestyle` -website: +Let's start by following the official instructions on the `ember-freestyle` website: - `ember install ember-freestyle` - Add `this.route('freestyle');` to the `app/router.js` file ### Adjusting the `application` template -If you try this in a fresh new Ember app, run the development server using -`ember serve` and visit `http://localhost:4200/freestyle` you will notice the -first problem: The `ember-freestyle` components are appearing underneath the -`{{welcome-page}}` component: +If you try this in a fresh new Ember app, run the development server using `ember serve` and visit `http://localhost:4200/freestyle` you will notice the first problem: The `ember-freestyle` components are appearing underneath the `{{welcome-page}}` component: ![Screenshot](/assets/images/posts/2017-12-07-ember-freestyle/freestyle-underneath-welcome-page.png) -This is obviously not what we want. To fix this we will need to adjust the -`app/templates/application.hbs` file and wrap the existing contents in a -condition: +This is obviously not what we want. To fix this we will need to adjust the `app/templates/application.hbs` file and wrap the existing contents in a condition: ```diff-hbs {% raw %} @@ -81,12 +51,7 @@ condition: {% endraw %} ``` -`onFreestyleRoute` is a property on the `application` controller that will be -set to `true` once we visit the `/freestyle` route and and back to `false` once -we leave it again. This can be implemented in the `app/routes/freestyle.js` -file, and since that does not exist yet, we can generate it using -`ember generate route freestyle` (choose not to overwrite the existing -template!) and then adjusting it like this: +`onFreestyleRoute` is a property on the `application` controller that will be set to `true` once we visit the `/freestyle` route and and back to `false` once we leave it again. This can be implemented in the `app/routes/freestyle.js` file, and since that does not exist yet, we can generate it using `ember generate route freestyle` (choose not to overwrite the existing template!) and then adjusting it like this: ```js {% raw %} @@ -104,17 +69,13 @@ export default Route.extend({ {% endraw %} ``` -If you check `/freestyle` again you should see that now the only thing that is -displayed is the `ember-freestyle` guide. 🎉 +If you check `/freestyle` again you should see that now the only thing that is displayed is the `ember-freestyle` guide. 🎉 ### Removing `ember-freestyle` from the production build -Once you try to ship this to production you might notice another issue: your -asset size has increased significantly, so it seems that `ember-freestyle` is -not disabled for production builds by default. Let's fix this! +Once you try to ship this to production you might notice another issue: your asset size has increased significantly, so it seems that `ember-freestyle` is not disabled for production builds by default. Let's fix this! -According to the `ember-freestyle` documentation we are supposed to "blacklist" -the addon in the `ember-cli-build.js` file of our app: +According to the `ember-freestyle` documentation we are supposed to "blacklist" the addon in the `ember-cli-build.js` file of our app: ```js {% raw %} @@ -134,24 +95,13 @@ module.exports = function (defaults) { {% endraw %} ``` -Great! Now our asset size is back to normal. Wait... it is smaller now, but -still not quite back to what we had before. 🤔 +Great! Now our asset size is back to normal. Wait... it is smaller now, but still not quite back to what we had before. 🤔 -The code above only removes all the components from the build that -`ember-freestyle` brings with it itself. That means components like -`{{freestyle-guide}}` and `{{freestyle-usage}}` are no longer part of the -production build, but the `freestyle` controller, route and template are still -included. +The code above only removes all the components from the build that `ember-freestyle` brings with it itself. That means components like `{{freestyle-guide}}` and `{{freestyle-usage}}` are no longer part of the production build, but the `freestyle` controller, route and template are still included. -The solution to this problem is moving the `freestyle` files into a dedicated -`in-repo-addon` and then blacklisting that one too. First we generate a new -`in-repo-addon` using `ember generate in-repo-addon freestyle`. After that we -move `app/controllers/freestyle.js` to -`lib/freestyle/app/controllers/freestyle.js` and do the same for the `freestyle` -route and template. +The solution to this problem is moving the `freestyle` files into a dedicated `in-repo-addon` and then blacklisting that one too. First we generate a new `in-repo-addon` using `ember generate in-repo-addon freestyle`. After that we move `app/controllers/freestyle.js` to `lib/freestyle/app/controllers/freestyle.js` and do the same for the `freestyle` route and template. -Next we will add our new `freestyle` in-repo-addon to the `pluginsToBlacklist` -list above: +Next we will add our new `freestyle` in-repo-addon to the `pluginsToBlacklist` list above: ```js {% raw %} @@ -160,10 +110,7 @@ let pluginsToBlacklist = {% endraw %} ``` -Finally we need to adjust the paths that `ember-freestyle` uses to search for -the code snippets that show how the component is used in a host application. For -that we will add a `snippetSearchPaths` property in the `ember-cli-build.js` -file: +Finally we need to adjust the paths that `ember-freestyle` uses to search for the code snippets that show how the component is used in a host application. For that we will add a `snippetSearchPaths` property in the `ember-cli-build.js` file: ```js {% raw %} @@ -176,28 +123,15 @@ let app = new EmberApp(defaults, { {% endraw %} ``` -If you now restart the development server and check the `/freestyle` route you -should see that everything is working as before, but if instead you run -`ember serve -prod` you will notice that you only see a blank page because the -`freestyle` controller, route and template are no longer available. If you would -like to use your default 404 page instead you can put the -`this.route('freestyle');` call in the `router.js` file in a condition that -checks `if (config.environment === 'development')`. +If you now restart the development server and check the `/freestyle` route you should see that everything is working as before, but if instead you run `ember serve -prod` you will notice that you only see a blank page because the `freestyle` controller, route and template are no longer available. If you would like to use your default 404 page instead you can put the `this.route('freestyle');` call in the `router.js` file in a condition that checks `if (config.environment === 'development')`. -This leaves us with only the single condition in the `application` template and -the `this.route('freestyle');` call in the `router.js` file that we ship to -production. While we could put in some effort to remove those too the situation -is good enough and we can finally focus on putting content into our new -component playground! 🎉 +This leaves us with only the single condition in the `application` template and the `this.route('freestyle');` call in the `router.js` file that we ship to production. While we could put in some effort to remove those too the situation is good enough and we can finally focus on putting content into our new component playground! 🎉 ## Using `ember-freestyle` -The good news is that **using** `ember-freestyle` is much easier than setting it -up correctly! +The good news is that **using** `ember-freestyle` is much easier than setting it up correctly! -Let's pretend we are writing a component called `styled-button`. We can create a -new file at `app/components/styled-button.js` and put the following content in -it: +Let's pretend we are writing a component called `styled-button`. We can create a new file at `app/components/styled-button.js` and put the following content in it: ```js {% raw %} @@ -210,8 +144,7 @@ export default Component.extend({ {% endraw %} ``` -In addition to that we'll add some styles for this button to our -`app/styles/app.css` file: +In addition to that we'll add some styles for this button to our `app/styles/app.css` file: ```css .styled-button { @@ -224,8 +157,7 @@ In addition to that we'll add some styles for this button to our } ``` -Finally we will add the button to our component playground by editing the -`lib/freestyle/app/templates/freestyle.hbs` template: +Finally we will add the button to our component playground by editing the `lib/freestyle/app/templates/freestyle.hbs` template: ```handlebars {% raw %} @@ -249,21 +181,12 @@ Finally we will add the button to our component playground by editing the {% endraw %} ``` -If we now visit `http://localhost:4200/freestyle` we will see a new "Components" -section in the sidebar on the left that includes our "styled-button" subsection. -Once we click on that we will see our `styled-button` usage examples including -the snippets there were used to display them: +If we now visit `http://localhost:4200/freestyle` we will see a new "Components" section in the sidebar on the left that includes our "styled-button" subsection. Once we click on that we will see our `styled-button` usage examples including the snippets there were used to display them: ![Screenshot](/assets/images/posts/2017-12-07-ember-freestyle/styled-button.png#@900-1800) -As this blog post has gotten much longer than intended already I'll leave it up -to your imagination what other things you can put into such a component -playground. In a follow-up post we will soon discuss how to extract subsections -into components and how to automatically discover and inject them into the main -template. +As this blog post has gotten much longer than intended already I'll leave it up to your imagination what other things you can put into such a component playground. In a follow-up post we will soon discuss how to extract subsections into components and how to automatically discover and inject them into the main template. -Finally I would like to thank [Chris LoPresto][chris-lopresto] and the other -contributors for working on `ember-freestyle` and would encourage you to give it -a try! +Finally I would like to thank [Chris LoPresto][chris-lopresto] and the other contributors for working on `ember-freestyle` and would encourage you to give it a try! [chris-lopresto]: https://github.com/chrislopresto diff --git a/src/posts/2018-02-14-handling-webhooks-in-phoenix.md b/src/posts/2018-02-14-handling-webhooks-in-phoenix.md index 0e820ce1fd..6a5e221d80 100644 --- a/src/posts/2018-02-14-handling-webhooks-in-phoenix.md +++ b/src/posts/2018-02-14-handling-webhooks-in-phoenix.md @@ -2,9 +2,7 @@ title: Handling Webhooks in Phoenix authorHandle: niklas_long bio: "Backend Engineer, author of Breethe API" -description: - "Niklas Long introduces an effective and simple approach for handling incoming - webhook requests in Phoenix applications with advanced routing." +description: "Niklas Long introduces an effective and simple approach for handling incoming webhook requests in Phoenix applications with advanced routing." tags: elixir tagline: |

    I recently had to implement a controller, which took care of receiving and processing webhooks. The thing is, the application had to handle webhooks which often contained very different information, and they were all going to one route and one controller action. This didn't really seem to fit with my goal of keeping controller actions concise and focused. So I set out to find a better solution.

    @@ -12,15 +10,11 @@ tagline: | ## tl;dr -Use `forward` on `MyApp.Router` to forward the request (`%Conn{}`) to a custom -plug (`MyApp.Plugs.WebhookShunt`) which maps `%Conn{}` to a route (and thus a -controller action) defined on `MyApp.WebhookRouter`, based on the data in the -request body. +Use `forward` on `MyApp.Router` to forward the request (`%Conn{}`) to a custom plug (`MyApp.Plugs.WebhookShunt`) which maps `%Conn{}` to a route (and thus a controller action) defined on `MyApp.WebhookRouter`, based on the data in the request body. I.e., -`%Conn{}` -> `Router` -> `WebhookShunt` -> `WebhookRouter` -> -`WebhookController` +`%Conn{}` -> `Router` -> `WebhookShunt` -> `WebhookRouter` -> `WebhookController` ## lv;e (long version; enjoy!) @@ -30,12 +24,9 @@ Let's restate the problem: - there are many different possible request payloads - application requires different computation depending on payload -Let's say we're receiving webhooks which contain an `event` key in the request -body. It describes the event which triggered the webhook and we can use it to -determine what code we are going to run. +Let's say we're receiving webhooks which contain an `event` key in the request body. It describes the event which triggered the webhook and we can use it to determine what code we are going to run. -Below was my first and somewhat naïve implementation. This is what the router -looked like: +Below was my first and somewhat naïve implementation. This is what the router looked like: ```elixir scope "/", MyAppWeb do @@ -56,12 +47,9 @@ def hook(conn, params) do end ``` -All incoming webhooks go to the same route and therefore, the same controller -action. +All incoming webhooks go to the same route and therefore, the same controller action. -It took three refactors to get to a satisfactory solution. I will, however, -explain each one in this post, as they are logical steps in reaching the final -solution and proved interesting learning opportunities: +It took three refactors to get to a satisfactory solution. I will, however, explain each one in this post, as they are logical steps in reaching the final solution and proved interesting learning opportunities: 1. Multiple function clauses for controller action 2. Plug called from endpoint @@ -69,11 +57,7 @@ solution and proved interesting learning opportunities: ## Multiple function clauses -Let's start separating the computation into smaller fragments by moving the -pattern matching from the `case` statement to the function's definition. We are -still using only one route and only one controller action, but we write multiple -clauses of that function to match a certain value of the `event` key in the -params. +Let's start separating the computation into smaller fragments by moving the pattern matching from the `case` statement to the function's definition. We are still using only one route and only one controller action, but we write multiple clauses of that function to match a certain value of the `event` key in the params. Here's our controller with the multiple clauses: @@ -84,18 +68,11 @@ def hook(conn, %{"event" => "multiplication"} = params), do: multiply(params) def hook(conn, %{"event" => "division"} = params), do: divide(params) ``` -The request payload will match the clauses for the `hook/2` function and execute -different functions depending on what `event` was passed in. This refactor is a -step in the right direction, but it still doesn't fit well with the idea that a -controller action should handle one specific request. The router serves no real -purpose, as there is still only one route, and our code has the potential to get -very messy. +The request payload will match the clauses for the `hook/2` function and execute different functions depending on what `event` was passed in. This refactor is a step in the right direction, but it still doesn't fit well with the idea that a controller action should handle one specific request. The router serves no real purpose, as there is still only one route, and our code has the potential to get very messy. ## Shunting incoming connections -What if we could interfere with the incoming webhook before it hits the router? -We could then modify the path of the request depending on the params, match a -route and execute the corresponding controller action. +What if we could interfere with the incoming webhook before it hits the router? We could then modify the path of the request depending on the params, match a route and execute the corresponding controller action. The router would look something like this: @@ -117,25 +94,11 @@ def multiply(conn, params), do: #handle multiplication def divide(conn, params), do: #handle division ``` -In this case, each controller action serves a specific function, the router maps -each incoming request to these actions and the code is easily maintainable, -well-structured and won't become jumbled over time. To achieve this, however, we -need to change a couple of things. - -First off, we need to interfere with the incoming request before it hits the -router so it will match our new routes. This is because the webhook callback url -is always the same and doesn't depend on what event triggered it e.g., -`"my_app_url/webhook"`. You would think we could create a plug for this and -simply add it to a custom pipeline for the routes. The problem with this, is the -router will invoke the pipeline **after** it matches a route. Therefore, we -cannot modify the request's path in this pipeline and expect it to match our -`addition`, `subtraction`, `multiplication` or `division` routes. If we want our -new routes to match, we need to intercept the `%Conn{}` in a plug called in the -endpoint. The endpoint handles starting the web server and transforming requests -through several defined plugs before calling the router. - -Let's add a plug called `MyApp.WebhookShunt` to the endpoint, just before the -router. +In this case, each controller action serves a specific function, the router maps each incoming request to these actions and the code is easily maintainable, well-structured and won't become jumbled over time. To achieve this, however, we need to change a couple of things. + +First off, we need to interfere with the incoming request before it hits the router so it will match our new routes. This is because the webhook callback url is always the same and doesn't depend on what event triggered it e.g., `"my_app_url/webhook"`. You would think we could create a plug for this and simply add it to a custom pipeline for the routes. The problem with this, is the router will invoke the pipeline **after** it matches a route. Therefore, we cannot modify the request's path in this pipeline and expect it to match our `addition`, `subtraction`, `multiplication` or `division` routes. If we want our new routes to match, we need to intercept the `%Conn{}` in a plug called in the endpoint. The endpoint handles starting the web server and transforming requests through several defined plugs before calling the router. + +Let's add a plug called `MyApp.WebhookShunt` to the endpoint, just before the router. ```elixir defmodule MyApp.Endpoint do @@ -145,8 +108,7 @@ defmodule MyApp.Endpoint do end ``` -And let's create a file called `webhook_shunt.ex` and add it to our `plugs` -folder: +And let's create a file called `webhook_shunt.ex` and add it to our `plugs` folder: ```elixir defmodule MyAppWeb.Plug.WebhookShunt do @@ -158,22 +120,14 @@ defmodule MyAppWeb.Plug.WebhookShunt do end ``` -The core components of a Phoenix application are plugs. This includes endpoints, -routers and controllers. There are two flavors of `Plug`, function plugs and -module plugs. We'll be using the latter in this example, but I highly suggest -checking out the [docs](https://hexdocs.pm/plug/readme.html). +The core components of a Phoenix application are plugs. This includes endpoints, routers and controllers. There are two flavors of `Plug`, function plugs and module plugs. We'll be using the latter in this example, but I highly suggest checking out the [docs](https://hexdocs.pm/plug/readme.html). -Let's examine the code above, you'll notice there are two functions already -defined: +Let's examine the code above, you'll notice there are two functions already defined: -- `init/1` which initializes any arguments or options to be passed to `call/2` - (executed at compile time) -- `call/2` which transforms the connection (it's actually a simple function plug - and is executed at run time) +- `init/1` which initializes any arguments or options to be passed to `call/2` (executed at compile time) +- `call/2` which transforms the connection (it's actually a simple function plug and is executed at run time) -Both of these need to be implemented in a module plug. Let's modify `call/2` to -match the `addition` event in the request payload and change the request path to -the route we defined for addition: +Both of these need to be implemented in a module plug. Let's modify `call/2` to match the `addition` event in the request payload and change the request path to the route we defined for addition: ```elixir defmodule MyAppWeb.Plug.WebhookShunt do @@ -193,48 +147,30 @@ defmodule MyAppWeb.Plug.WebhookShunt do end ``` -`change_path_info/2` changes the `path_info` property on the `%Conn{}`, based on -the request payload matched in `call/2`, in this case to `"webhook/addition"`. -You'll notice I also added a no-op function clause for `call/2`. If other routes -are added and don't need to be manipulated in the same way as the ones above, we -need to make sure the request gets through to the router unmodified. +`change_path_info/2` changes the `path_info` property on the `%Conn{}`, based on the request payload matched in `call/2`, in this case to `"webhook/addition"`. You'll notice I also added a no-op function clause for `call/2`. If other routes are added and don't need to be manipulated in the same way as the ones above, we need to make sure the request gets through to the router unmodified. -This strategy isn't great, however. We are placing code in the endpoint, which -will be executed no matter what the request path is. Furthermore, the endpoint -is only supposed to (from the -[docs](https://hexdocs.pm/phoenix/Phoenix.Endpoint.html#content)): +This strategy isn't great, however. We are placing code in the endpoint, which will be executed no matter what the request path is. Furthermore, the endpoint is only supposed to (from the [docs](https://hexdocs.pm/phoenix/Phoenix.Endpoint.html#content)): -- provide a wrapper for starting and stopping the endpoint as part of a - supervision tree +- provide a wrapper for starting and stopping the endpoint as part of a supervision tree - define an initial plug pipeline for requests to pass through - host web specific configuration for your application -Interfering with the request to map it to a route at this point would be -unidiomatic Phoenix. It would also make the app slower, and harder to maintain -and debug. +Interfering with the request to map it to a route at this point would be unidiomatic Phoenix. It would also make the app slower, and harder to maintain and debug. ## Forwarding conn to the shunt and calling another router -Instead of intercepting the `%Conn{}` in the endpoint, we could forward it from -the application's main router to the `WebhookShunt`, modify it and call a second -router whose sole purpose would be to handle the incoming webhooks. +Instead of intercepting the `%Conn{}` in the endpoint, we could forward it from the application's main router to the `WebhookShunt`, modify it and call a second router whose sole purpose would be to handle the incoming webhooks. 1. The request hits router which has one path for all webhooks (`"/webhook"`) -2. `%Conn{}` is forwarded to the `WebhookShunt` which modifies the path based on - the request payload -3. The `WebhookShunt` calls the `WebhookRouter`, passing it the modified - `%Conn{}` -4. The `WebhookRouter` matches the `%Conn{}` path and calls the appropriate - action on the `WebhookController` +2. `%Conn{}` is forwarded to the `WebhookShunt` which modifies the path based on the request payload +3. The `WebhookShunt` calls the `WebhookRouter`, passing it the modified `%Conn{}` +4. The `WebhookRouter` matches the `%Conn{}` path and calls the appropriate action on the `WebhookController` I.e., -`%Conn{}` -> `Router` -> `WebhookShunt` -> `WebhookRouter` -> -`WebhookController` +`%Conn{}` -> `Router` -> `WebhookShunt` -> `WebhookRouter` -> `WebhookController` -I think this approach is better. We don't need to modify the endpoint, the -router simply forwards anything that matches the webhook path to the shunt and -the app's concerns are clearly separated. +I think this approach is better. We don't need to modify the endpoint, the router simply forwards anything that matches the webhook path to the shunt and the app's concerns are clearly separated. Let's set up our webhook path in `router.ex`: @@ -244,12 +180,9 @@ scope "/", MyAppWeb do end ``` -As long as your external APIs makes a request to this path when you do the setup -for the webhook callbacks, every incoming request to this path will be forwarded -to the `WebhookShunt`. +As long as your external APIs makes a request to this path when you do the setup for the webhook callbacks, every incoming request to this path will be forwarded to the `WebhookShunt`. -Let's refactor `call/2` to handle all events by replacing the hardcoded -`"addition"` event and path with the `event` variable: +Let's refactor `call/2` to handle all events by replacing the hardcoded `"addition"` event and path with the `event` variable: ```elixir defmodule MyAppWeb.Plugs.WebhookShunt do @@ -268,18 +201,11 @@ defmodule MyAppWeb.Plugs.WebhookShunt do end ``` -With this refactor, all our routes must follow the `"webhook/event"` pattern. In -more complex applications, you might not be able to conveniently use the event -name as a part of the path but the principle remains the same. +With this refactor, all our routes must follow the `"webhook/event"` pattern. In more complex applications, you might not be able to conveniently use the event name as a part of the path but the principle remains the same. -You'll notice I've removed the no-op `call/2` function clause. This is because -we no longer have to handle all potential requests like we did in the endpoint; -we can focus entirely on the webhhooks. Now, if we receive a request with an -event which doesn't match a route, Phoenix will raise an error, which is what we -want as we don't know how to handle that request. +You'll notice I've removed the no-op `call/2` function clause. This is because we no longer have to handle all potential requests like we did in the endpoint; we can focus entirely on the webhhooks. Now, if we receive a request with an event which doesn't match a route, Phoenix will raise an error, which is what we want as we don't know how to handle that request. -Note: if you can't configure your API to send only the webhooks you're -interested in handling, you should write some code to take care of that. +Note: if you can't configure your API to send only the webhooks you're interested in handling, you should write some code to take care of that. Let's also create `webhook_router.ex` in the `_web` directory: @@ -296,9 +222,7 @@ defmodule MyAppWeb.WebhookRouter do end ``` -The `WebhookRouter` is called from the `WebhookShunt` with -`WebhookRouter.call(conn, opts)`, and maps the modified `%Conn{}`s to the -appropriate controller action on the `WebhookController`, which looks like this: +The `WebhookRouter` is called from the `WebhookShunt` with `WebhookRouter.call(conn, opts)`, and maps the modified `%Conn{}`s to the appropriate controller action on the `WebhookController`, which looks like this: ```elixir def add(conn, params), do: #handle addition @@ -307,9 +231,6 @@ def multiply(conn, params), do: #handle multiplication def divide(conn, params), do: #handle division ``` -I think this last solution ticks all the boxes. Externally, there is still only -one webhook callback url; internally, we have a route and a controller action -for each event our application needs to handle. Our concerns are therefore -clearly separated, making the application extensible and easy to maintain. +I think this last solution ticks all the boxes. Externally, there is still only one webhook callback url; internally, we have a route and a controller action for each event our application needs to handle. Our concerns are therefore clearly separated, making the application extensible and easy to maintain. So there you have it, handling webhooks in Phoenix. diff --git a/src/posts/2018-05-30-a-little-encouragement-goes-a-long-way-in-2018.md b/src/posts/2018-05-30-a-little-encouragement-goes-a-long-way-in-2018.md index e5b1e359be..a6d1c43f84 100644 --- a/src/posts/2018-05-30-a-little-encouragement-goes-a-long-way-in-2018.md +++ b/src/posts/2018-05-30-a-little-encouragement-goes-a-long-way-in-2018.md @@ -2,205 +2,56 @@ title: A Little Encouragement Goes a Long Way in 2018 authorHandle: jjordan_dev bio: "Senior Frontend Engineer, Ember Learning core team member" -description: - "Jessica Jordan shares her thoughts for Ember.js in the coming year in - response to the Ember 2018 Roadmap Call for Blog Posts." +description: "Jessica Jordan shares her thoughts for Ember.js in the coming year in response to the Ember 2018 Roadmap Call for Blog Posts." tags: ember tagline: |

    In May 2018, Ember Core team member Katie Gengler published Ember's 2018 Roadmap: A Call for Blog Posts. With this call-to-action she invites the community to give feedback on their hopes and wishes for Ember moving forward. In this context, I also want to share some of my own thoughts on Ember and what I'd be excited to see in its nearest future.

    --- -> The Ember team would like you to write a blog post to propose goals and -> direction for Ember in the remainder of 2018. The content of these posts will -> help us to draft our first Roadmap RFC. - -First off, I'm confident that Ember already has done a lot to allow me and many -others to create great and maintainable applications. And it has done so very -early on. For a while naming conventions and a CLI-driven approach to scaffold, -build & serve apps have been hallmarks of Ember as a framework for the ambitious -developer. Other framework ecosystems are also adopting similar approaches to -increase developer productivity -([1](https://github.com/angular/angular-cli/tree/v1.6.8#cli-for-angular-applications-based-on-the-ember-cli-project), -[2](https://hackernoon.com/structuring-projects-and-naming-components-in-react-1261b6e18d76)) -and are having immense success with them. - -Other productivity improvements that emerged with Ember include its well-planned -release cycle -([3](https://www.emberjs.com/blog/2013/09/06/new-ember-release-process.html)) -that has been put into practice during the v1.x era as early as 5 years ago, and -the ongoing support through LTS releases -([4](https://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html?utm_source=javascriptweekly&utm_medium=email)) -for more than 2 years. This mature and dependable release process has not only -been extremely progressive back then, but in fact it still is. Furthermore, the -current testing story in Ember has evolved to be one of the most outstanding -community solutions in the JavaScript realm: The modern QUnit Testing API -([5](https://rwjblue.com/2017/10/23/ember-qunit-simplication/)) that ships with -v3.x apps out of the box in combination with the simple interface of -`@ember/test-helpers` -([6](https://github.com/emberjs/ember-test-helpers/blob/master/API.md)) improves -the readability of tests massively and also makes async testing more than -straightforward. - -These are some of the many examples in which Ember.js has repeatedly proven -itself to be a community solution that really empowers its users to get things -done. This is why Ember is a truly productive JavaScript framework. - -Not only in the past has Ember proven to put new ideas into practice in the -ecosystem of front-end web development; recent experiments with WebAssembly in -the Glimmer VM ([7](https://youtu.be/NhtpXs0ZtUc?t=35m56s)) signal that Ember.js -will continue to run on its innovative trajectory. New features in Ember are in -fact often ahead of its time. This is why Ember is a truly progressive -JavaScript framework. - -Progressive technologies give developers a head start in exploring new ways of -writing applications. Progressive technologies will draw the interest of many -new, early-adopting developers to communities. But progressiveness also poses -challenges: depending on their own experience level and the amount of work they -spent on critically evaluating a new feature a developer may or may not fully -grasp its meaning and extent early on. E.g. a JavaScript developer who entered -the field recently, might not be aware yet that a CLI can help them immensely in -building and serving their app. Even a person with extensive experience in one -certain programming language might not be aware of the challenges they might -encounter developing JavaScript applications specifically and overlook the -benefits of a progressive feature like WebAssembly easily. - -This makes me think that making features understandable to a diverse set of -people does not only include explaining how technologies work, but also why they -are so useful. - -I already believe that Ember.js is a great choice for any web developer who -wants to create scalable applications today. There's really not much I could -wish for on a technical level. Instead when I think about what I wish for Ember, -_visibility_ comes to my mind. I'd love both Ember's core characteristics and -its cutting-edge features to be understood by even more people; even by those -who haven't had much experience in using it to see its worthwhile benefits in -the long-run of a project. I believe Ember's bottleneck for adoption and -community growth isn't about technical aspects, it's about visibility and -outreach. +> The Ember team would like you to write a blog post to propose goals and direction for Ember in the remainder of 2018. The content of these posts will help us to draft our first Roadmap RFC. + +First off, I'm confident that Ember already has done a lot to allow me and many others to create great and maintainable applications. And it has done so very early on. For a while naming conventions and a CLI-driven approach to scaffold, build & serve apps have been hallmarks of Ember as a framework for the ambitious developer. Other framework ecosystems are also adopting similar approaches to increase developer productivity ([1](https://github.com/angular/angular-cli/tree/v1.6.8#cli-for-angular-applications-based-on-the-ember-cli-project), [2](https://hackernoon.com/structuring-projects-and-naming-components-in-react-1261b6e18d76)) and are having immense success with them. + +Other productivity improvements that emerged with Ember include its well-planned release cycle ([3](https://www.emberjs.com/blog/2013/09/06/new-ember-release-process.html)) that has been put into practice during the v1.x era as early as 5 years ago, and the ongoing support through LTS releases ([4](https://emberjs.com/blog/2016/02/25/announcing-embers-first-lts.html?utm_source=javascriptweekly&utm_medium=email)) for more than 2 years. This mature and dependable release process has not only been extremely progressive back then, but in fact it still is. Furthermore, the current testing story in Ember has evolved to be one of the most outstanding community solutions in the JavaScript realm: The modern QUnit Testing API ([5](https://rwjblue.com/2017/10/23/ember-qunit-simplication/)) that ships with v3.x apps out of the box in combination with the simple interface of `@ember/test-helpers` ([6](https://github.com/emberjs/ember-test-helpers/blob/master/API.md)) improves the readability of tests massively and also makes async testing more than straightforward. + +These are some of the many examples in which Ember.js has repeatedly proven itself to be a community solution that really empowers its users to get things done. This is why Ember is a truly productive JavaScript framework. + +Not only in the past has Ember proven to put new ideas into practice in the ecosystem of front-end web development; recent experiments with WebAssembly in the Glimmer VM ([7](https://youtu.be/NhtpXs0ZtUc?t=35m56s)) signal that Ember.js will continue to run on its innovative trajectory. New features in Ember are in fact often ahead of its time. This is why Ember is a truly progressive JavaScript framework. + +Progressive technologies give developers a head start in exploring new ways of writing applications. Progressive technologies will draw the interest of many new, early-adopting developers to communities. But progressiveness also poses challenges: depending on their own experience level and the amount of work they spent on critically evaluating a new feature a developer may or may not fully grasp its meaning and extent early on. E.g. a JavaScript developer who entered the field recently, might not be aware yet that a CLI can help them immensely in building and serving their app. Even a person with extensive experience in one certain programming language might not be aware of the challenges they might encounter developing JavaScript applications specifically and overlook the benefits of a progressive feature like WebAssembly easily. + +This makes me think that making features understandable to a diverse set of people does not only include explaining how technologies work, but also why they are so useful. + +I already believe that Ember.js is a great choice for any web developer who wants to create scalable applications today. There's really not much I could wish for on a technical level. Instead when I think about what I wish for Ember, _visibility_ comes to my mind. I'd love both Ember's core characteristics and its cutting-edge features to be understood by even more people; even by those who haven't had much experience in using it to see its worthwhile benefits in the long-run of a project. I believe Ember's bottleneck for adoption and community growth isn't about technical aspects, it's about visibility and outreach. ## A Gap in Visibility -As any other open-source project, the development of Ember lives and thrives -through the time and amount of work that is being put into it. In contrast to -some other major JavaScript frameworks, Ember is not being backed up by one -single major company - neither financially nor contribution-wise. Instead -Ember's user base is diverse in its professional backgrounds and interests. And -this makes Ember more independent and free to evolve according to real developer -needs instead of company requirements which is an amazing advantage. - -But who's putting in the time and effort to maintain such an independent -project? For a huge part, Ember's community does, and it does so in their free -time. Countless contributors work on improvements, bug fixes and features in the -early hours preceding their day jobs, on their weekends, their time-off - to -bring forward a software project which can compete with other major frameworks. -And this in itself is remarkable. - -This is why Ember truly is a framework of the community, by the community, for -the community. - -And this community effort is also what keeps Ember visible in the current -front-end ecosystem. In the end, who's stepping up to blog about latest -features, to screencast debugging sessions, to demo Ember at their local meetup, -to distribute Zoey stickers among their friends, to give talks on how to build -an Ember app or to improve, fix and update any of the official online resources -of Ember? - -It's not only the Ember Core or the Ember Learning Team who does all of this - -it's also you and me and us. - -Taking the opportunity to change the way Ember is represented in the world to -further its adoption is an open issue everyone can work on. Ember is still a -somewhat hidden gem -([8](http://blog.agilityworks.co.uk/our-blog/a-hidden-gem-ember-js)) and it -keeps on "quietly shipping new cutting-edge features to its users" -([9](https://twitter.com/sugarpirate_/status/923620576970731520)). But I don't -believe it has to be this way with a little help from the community. - -Of course, there are those who already have a clear vision in mind right now and -who are making consistent efforts to create online tutorials, write blog posts, -give talks, send pull requests to the Ember.js website repository -([10](https://github.com/emberjs/website/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Amerged)) -and much more without any prompting. What I'd wish for Ember's 2018 Roadmap -though is to find ways to **lower the entry barriers** for newcomers to get -started in their attempt to advocate Ember and to be creative on how to -**encourage a sense of empowerment** in the wider community regarding outreach -efforts. +As any other open-source project, the development of Ember lives and thrives through the time and amount of work that is being put into it. In contrast to some other major JavaScript frameworks, Ember is not being backed up by one single major company - neither financially nor contribution-wise. Instead Ember's user base is diverse in its professional backgrounds and interests. And this makes Ember more independent and free to evolve according to real developer needs instead of company requirements which is an amazing advantage. + +But who's putting in the time and effort to maintain such an independent project? For a huge part, Ember's community does, and it does so in their free time. Countless contributors work on improvements, bug fixes and features in the early hours preceding their day jobs, on their weekends, their time-off - to bring forward a software project which can compete with other major frameworks. And this in itself is remarkable. + +This is why Ember truly is a framework of the community, by the community, for the community. + +And this community effort is also what keeps Ember visible in the current front-end ecosystem. In the end, who's stepping up to blog about latest features, to screencast debugging sessions, to demo Ember at their local meetup, to distribute Zoey stickers among their friends, to give talks on how to build an Ember app or to improve, fix and update any of the official online resources of Ember? + +It's not only the Ember Core or the Ember Learning Team who does all of this - it's also you and me and us. + +Taking the opportunity to change the way Ember is represented in the world to further its adoption is an open issue everyone can work on. Ember is still a somewhat hidden gem ([8](http://blog.agilityworks.co.uk/our-blog/a-hidden-gem-ember-js)) and it keeps on "quietly shipping new cutting-edge features to its users" ([9](https://twitter.com/sugarpirate_/status/923620576970731520)). But I don't believe it has to be this way with a little help from the community. + +Of course, there are those who already have a clear vision in mind right now and who are making consistent efforts to create online tutorials, write blog posts, give talks, send pull requests to the Ember.js website repository ([10](https://github.com/emberjs/website/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Amerged)) and much more without any prompting. What I'd wish for Ember's 2018 Roadmap though is to find ways to **lower the entry barriers** for newcomers to get started in their attempt to advocate Ember and to be creative on how to **encourage a sense of empowerment** in the wider community regarding outreach efforts. ## Closing the Visibility Gap -I believe one of the biggest actions that could be taken to make contribution to -anything that is outreach-related easier is by increasing the discoverability of -discussion channels and already ongoing Github projects and related issues. On -the Ember Community Slack chat, most notably the -[#st-website](https://embercommunity.slack.com/messages/CAHEZTMBK/), -[#wb-marketing](https://embercommunity.slack.com/messages/C36ETE3DK/) and -[#topic-talks](https://embercommunity.slack.com/messages/C9RSE508J/) channels -are great first points of contact for anyone who was interested in helping out -with marketing efforts to find something to help out with. I believe making -these channels more discoverable for new developers, e.g. from having a -noticeable call-to-action on the Ember.js website ([11](https://emberjs.com/)) -or a dedicated, search-engine optimized landing page already goes a long way. - -The Learning Team and the community have already leveraged many amazing -initiatives recently, including a massive technical upgrade of the official -Guides which makes it even easier for developers to contribute -([12](https://guides.emberjs.com/)), the release of a status board to keep -potential contributors informed which initiatives are still ongoing and require -help ([13](https://emberjs.com/statusboard/)), making blog content discoverable -([14](https://github.com/emberjs/website/pull/3280)), creating a printable mini -book about the framework -([15](https://github.com/ember-learn/the-shortest-ember-book)), publishing -project-related updates through a newsletter every single week -([16](https://the-emberjs-times.ongoodbits.com/)) and many others. Speaking -about these initiatives more openly and often might also draw interest of -developers who don't know yet what to work on or what to start off with. In my -opinion the increased leverage of the RFC (Request for Comments) process adopted -by the Rust Community ([17](http://rust-lang.github.io/rfcs/)), Quest issues for -breaking down major work packages on these official resources, and the creation -of Strike Teams for agile collaboration will also deepen community interest, -increase a sense of ownership of how decisions are made and allow people to -succeed on their possibly first OSS issue easily. - -Also supporting both new and current speakers in finding events, a good talk -topic and in prepping and rehearsing a presentation is another great way to -encourage the community in their sense of empowerement. In fact, the Women -Helping Women Program ([18](https://emberwomen.com/)) has already been doing an -amazing job in supporting new speakers for years and it might be due to this -very program, that Ember managed to achieve record numbers of excellent talks -presented by women speakers at its conferences in the past. Encouraging even -larger parts of the community to speak and highlight Ember allows many great -talks to come: I'd love to see so many of the cool and new things that recently -landed or are just on their way to land in Ember highlighted: This year's -EmberConf Opening Keynote by Ember Core Team members Yehuda Katz & Tom Dale -([19](https://www.youtube.com/watch?v=NhtpXs0ZtUc)) at EmberConf is among others -([20](https://twitter.com/skillsmatter/status/984752827904950273), -[21](https://www.youtube.com/watch?v=8D-O4cSteRk)) an inspiring example of this -type of advocacy for Ember. I feel that beyond that there is a quite urgent need -for "introduction" type talks which are appealing to developers of any -experience level and any (JavaScript) background. Features of Ember that might -have already been around for a while and which have become obvious to the -regular Ember user still need to be highlighted to audiences who are not that -familiar with Ember yet on a regular basis. Therefore I'm confident supporting -speakers in promoting their own "Why Ember" type of presentations to events -outside of the Ember ecosystem is one of the most useful measures we as a -community can take to advocate Ember as a framework. +I believe one of the biggest actions that could be taken to make contribution to anything that is outreach-related easier is by increasing the discoverability of discussion channels and already ongoing Github projects and related issues. On the Ember Community Slack chat, most notably the [#st-website](https://embercommunity.slack.com/messages/CAHEZTMBK/), [#wb-marketing](https://embercommunity.slack.com/messages/C36ETE3DK/) and [#topic-talks](https://embercommunity.slack.com/messages/C9RSE508J/) channels are great first points of contact for anyone who was interested in helping out with marketing efforts to find something to help out with. I believe making these channels more discoverable for new developers, e.g. from having a noticeable call-to-action on the Ember.js website ([11](https://emberjs.com/)) or a dedicated, search-engine optimized landing page already goes a long way. + +The Learning Team and the community have already leveraged many amazing initiatives recently, including a massive technical upgrade of the official Guides which makes it even easier for developers to contribute ([12](https://guides.emberjs.com/)), the release of a status board to keep potential contributors informed which initiatives are still ongoing and require help ([13](https://emberjs.com/statusboard/)), making blog content discoverable ([14](https://github.com/emberjs/website/pull/3280)), creating a printable mini book about the framework ([15](https://github.com/ember-learn/the-shortest-ember-book)), publishing project-related updates through a newsletter every single week ([16](https://the-emberjs-times.ongoodbits.com/)) and many others. Speaking about these initiatives more openly and often might also draw interest of developers who don't know yet what to work on or what to start off with. In my opinion the increased leverage of the RFC (Request for Comments) process adopted by the Rust Community ([17](http://rust-lang.github.io/rfcs/)), Quest issues for breaking down major work packages on these official resources, and the creation of Strike Teams for agile collaboration will also deepen community interest, increase a sense of ownership of how decisions are made and allow people to succeed on their possibly first OSS issue easily. + +Also supporting both new and current speakers in finding events, a good talk topic and in prepping and rehearsing a presentation is another great way to encourage the community in their sense of empowerement. In fact, the Women Helping Women Program ([18](https://emberwomen.com/)) has already been doing an amazing job in supporting new speakers for years and it might be due to this very program, that Ember managed to achieve record numbers of excellent talks presented by women speakers at its conferences in the past. Encouraging even larger parts of the community to speak and highlight Ember allows many great talks to come: I'd love to see so many of the cool and new things that recently landed or are just on their way to land in Ember highlighted: This year's EmberConf Opening Keynote by Ember Core Team members Yehuda Katz & Tom Dale ([19](https://www.youtube.com/watch?v=NhtpXs0ZtUc)) at EmberConf is among others ([20](https://twitter.com/skillsmatter/status/984752827904950273), [21](https://www.youtube.com/watch?v=8D-O4cSteRk)) an inspiring example of this type of advocacy for Ember. I feel that beyond that there is a quite urgent need for "introduction" type talks which are appealing to developers of any experience level and any (JavaScript) background. Features of Ember that might have already been around for a while and which have become obvious to the regular Ember user still need to be highlighted to audiences who are not that familiar with Ember yet on a regular basis. Therefore I'm confident supporting speakers in promoting their own "Why Ember" type of presentations to events outside of the Ember ecosystem is one of the most useful measures we as a community can take to advocate Ember as a framework. ## Wishing Upon a Vocal Community -These are some of the ideas that came to my mind when thinking about what I'd -wish for Ember in 2018. I'd like to see Ember's community grow even further and -I believe one major way to achieve this goal is by improving its visibility - -the degree by which it is seen by those who are already becoming part of the -community and also by those outside of it. - -In my opinion more explicit call-to-actions can have a big impact on the sense -of community empowerment to make Ember visible: Being vocal about current -outreach efforts that require community help, making those initiatives more -discoverable and prompting the community to take action - just as has been done -in this very call for blog posts -([22](https://www.emberjs.com/blog/2018/05/02/ember-2018-roadmap-call-for-posts.html)) - -are some of the options that I believe should be leveraged even further. - -Ember is still a hidden gem but I'm confident that this can and will change. And -with a little encouragement I believe there's no one who could do a better job -at this than us - the community. +These are some of the ideas that came to my mind when thinking about what I'd wish for Ember in 2018. I'd like to see Ember's community grow even further and I believe one major way to achieve this goal is by improving its visibility - the degree by which it is seen by those who are already becoming part of the community and also by those outside of it. + +In my opinion more explicit call-to-actions can have a big impact on the sense of community empowerment to make Ember visible: Being vocal about current outreach efforts that require community help, making those initiatives more discoverable and prompting the community to take action - just as has been done in this very call for blog posts ([22](https://www.emberjs.com/blog/2018/05/02/ember-2018-roadmap-call-for-posts.html)) - are some of the options that I believe should be leveraged even further. + +Ember is still a hidden gem but I'm confident that this can and will change. And with a little encouragement I believe there's no one who could do a better job at this than us - the community. diff --git a/src/posts/2018-06-05-ember-component-playground.md b/src/posts/2018-06-05-ember-component-playground.md index 7704b532bb..f54dccb0f0 100644 --- a/src/posts/2018-06-05-ember-component-playground.md +++ b/src/posts/2018-06-05-ember-component-playground.md @@ -2,10 +2,7 @@ title: "Autodiscovery for the Ember.js component playground" authorHandle: tobiasbieniek bio: "Senior Frontend Engineer, Ember CLI core team member" -description: - "Tobias Bieniek introduces a mechanism for automatically discovering new - components in Ember.js applications and showing them in an ember-freestyle - playground." +description: "Tobias Bieniek introduces a mechanism for automatically discovering new components in Ember.js applications and showing them in an ember-freestyle playground." tags: ember tagline: |

    In our previous post about ember-freestyle we have setup a component playground for our Ember.js application. In this post we will discuss how to implement "convention over configuration" for it by automatically discovering new components and showing them in the playground.

    @@ -13,8 +10,7 @@ tagline: | ## Status Quo -You may remember that last time we closed with our `freestyle.hbs` template -looking roughly like this: +You may remember that last time we closed with our `freestyle.hbs` template looking roughly like this: ```handlebars {% raw %} @@ -38,13 +34,9 @@ looking roughly like this: {% endraw %} ``` -If we now start to add subsections for all the components in our app you can -imagine that our `freestyle.hbs` would soon grow out of proportion. As with any -other template in Ember.js we can tackle that problem by extracting components. +If we now start to add subsections for all the components in our app you can imagine that our `freestyle.hbs` would soon grow out of proportion. As with any other template in Ember.js we can tackle that problem by extracting components. -In this case we can create a -`lib/freestyle/app/templates/components/usage/styled-button.hbs` file that looks -like this: +In this case we can create a `lib/freestyle/app/templates/components/usage/styled-button.hbs` file that looks like this: ```handlebars {% raw %} @@ -68,28 +60,17 @@ and in the `freestyle.hbs` template we use the following snippet instead: {% endraw %} ``` -Now we would still have to add a subsection and a component for every component -in our app that we want to include in the component playground, but overall the -situation has gotten a lot more manageable. +Now we would still have to add a subsection and a component for every component in our app that we want to include in the component playground, but overall the situation has gotten a lot more manageable. -But there is always a way to improve the current situation so let's play around -a little... +But there is always a way to improve the current situation so let's play around a little... ## Autodiscovery -What if we could ask Ember what "usage components" it knows about and then -render them automatically in the `freestyle.hbs` template...? 🤔 +What if we could ask Ember what "usage components" it knows about and then render them automatically in the `freestyle.hbs` template...? 🤔 -It turns out the `loader.js` dependency that every Ember.js project has provides -us with an API to do exactly that. If we `import require from 'require';` and -then look at `require.entries` we will see a map of all the known module names -in your app and their corresponding module functions. We only care about the -module names though so we can use `Object.keys(require.entries)` to get a list -of all those module names. +It turns out the `loader.js` dependency that every Ember.js project has provides us with an API to do exactly that. If we `import require from 'require';` and then look at `require.entries` we will see a map of all the known module names in your app and their corresponding module functions. We only care about the module names though so we can use `Object.keys(require.entries)` to get a list of all those module names. -Next, we need to filter the list so that it only includes our "usage -components". We can do so by using the `.filter()` method and checking for the -right prefix: +Next, we need to filter the list so that it only includes our "usage components". We can do so by using the `.filter()` method and checking for the right prefix: ```js {% raw %} @@ -111,14 +92,9 @@ This should produce a list that looks roughly like this: {% endraw %} ``` -To be able to use those as component names in our template we will have to do a -few more things though. We will need to strip the -`myapp/templates/components/usage/` prefix and then we should sort the list -alphabetically, so that the order in the component playground is more -predictable. +To be able to use those as component names in our template we will have to do a few more things though. We will need to strip the `myapp/templates/components/usage/` prefix and then we should sort the list alphabetically, so that the order in the component playground is more predictable. -In the end our `lib/freestyle/controllers/freestyle.js` will look roughly like -this: +In the end our `lib/freestyle/controllers/freestyle.js` will look roughly like this: ```js {% raw %} @@ -143,10 +119,7 @@ function findUsageComponents() { {% endraw %} ``` -{% raw %} With that JavaScript code out of the way we can focus on our template. -Here, we now have a `components` list available with the names of all our "usage -components". As usual with lists we will use a `{{#each}}` block to iterate over -it: {% endraw %} +{% raw %} With that JavaScript code out of the way we can focus on our template. Here, we now have a `components` list available with the names of all our "usage components". As usual with lists we will use a `{{#each}}` block to iterate over it: {% endraw %} ```handlebars {% raw %} @@ -166,13 +139,8 @@ it: {% endraw %} {% endraw %} ``` -If we visit the `/freestyle` route now, we should see a list of all our "usage -components" that Ember.js knows about and usage examples for all of them. +If we visit the `/freestyle` route now, we should see a list of all our "usage components" that Ember.js knows about and usage examples for all of them. ## Summary -Just like Ember.js is able to automatically find components, models, and other -modules when you put them in the right folder, our component playground can now -do the same thing. "Convention over Configuration" saves us from the extra work -of having to manually maintain the `freestyle.hbs` template by discovering the -content automatically. +Just like Ember.js is able to automatically find components, models, and other modules when you put them in the right folder, our component playground can now do the same thing. "Convention over Configuration" saves us from the extra work of having to manually maintain the `freestyle.hbs` template by discovering the content automatically. diff --git a/src/posts/2018-06-11-actix.md b/src/posts/2018-06-11-actix.md index 4051cc49aa..4e629c382f 100644 --- a/src/posts/2018-06-11-actix.md +++ b/src/posts/2018-06-11-actix.md @@ -2,9 +2,7 @@ title: "actix – an actor framework for the Rust programming language" authorHandle: tobiasbieniek bio: "Senior Frontend Engineer, Ember CLI core team member" -description: - "Tobias Bieniek gives an overview of actix, an actor framework written in the - Rust programming language." +description: "Tobias Bieniek gives an overview of actix, an actor framework written in the Rust programming language." tags: rust og: image: /assets/images/posts/2018-06-11-actix/og-image.jpg @@ -16,47 +14,23 @@ tagline: | What is Rust? -Aside from being "an iron oxide" according to [Wikipedia][wikipedia], Rust is -also the name of a programming language that was originally invented by Graydon -Hoare back in 2006. You can think about it as an interesting mix of high-level -languages like JavaScript or Ruby and low-level high-performance languages like -C++. - -Similar to C++ it is a compiled language without a garbage collector. The fact -that it usually uses LLVM to compile to machine code means that a lot of the -optimizations that were developed to compile C/C++ code can also be applied to -Rust programs. - -Similar to JavaScript or Python the language often feels more high-level than -C/C++, and it has a built-in dependency manager called `cargo`. This is somewhat -similar to `npm` in JavaScript or `bundler` in Ruby, with the main difference -that `cargo` is also used to build and test your applications and libraries. - -The main advantage over all the other languages is safety. The Rust compiler is -often quite strict on what data you are allowed to access at what point in the -application logic, because it knows about concepts like threads and potential -race conditions. This might not seem relevant to JavaScript developers, but even -there with nested callbacks you might easily run into a situation where the -thing you're trying to access has been deleted already. This issue is impossible -with Rust. - -Why would you use it? It is very fast, it can be embedded into scripting -languages if raw speed is needed, it can compile to WebAssembly, and most of -all, it is much safer than C++, which would also be a candidate for all the -previous points. +Aside from being "an iron oxide" according to [Wikipedia][wikipedia], Rust is also the name of a programming language that was originally invented by Graydon Hoare back in 2006. You can think about it as an interesting mix of high-level languages like JavaScript or Ruby and low-level high-performance languages like C++. + +Similar to C++ it is a compiled language without a garbage collector. The fact that it usually uses LLVM to compile to machine code means that a lot of the optimizations that were developed to compile C/C++ code can also be applied to Rust programs. + +Similar to JavaScript or Python the language often feels more high-level than C/C++, and it has a built-in dependency manager called `cargo`. This is somewhat similar to `npm` in JavaScript or `bundler` in Ruby, with the main difference that `cargo` is also used to build and test your applications and libraries. + +The main advantage over all the other languages is safety. The Rust compiler is often quite strict on what data you are allowed to access at what point in the application logic, because it knows about concepts like threads and potential race conditions. This might not seem relevant to JavaScript developers, but even there with nested callbacks you might easily run into a situation where the thing you're trying to access has been deleted already. This issue is impossible with Rust. + +Why would you use it? It is very fast, it can be embedded into scripting languages if raw speed is needed, it can compile to WebAssembly, and most of all, it is much safer than C++, which would also be a candidate for all the previous points. How to get started? Follow the instructions at [rustup.rs][rustup] ## Actors -The "actor model" is the main primitive that powers the [Erlang] programming -language and its descendant, [Elixir]. It describes a programming model that -simplifies the development of concurrent and multi-threaded applications or even -applications that run distributed on multiple machines. +The "actor model" is the main primitive that powers the [Erlang] programming language and its descendant, [Elixir]. It describes a programming model that simplifies the development of concurrent and multi-threaded applications or even applications that run distributed on multiple machines. -An actor is a thing that can only be interacted with using "messages". A message -can basically be anything that the actor can understand and in response to a -message an actor is allowed to do several things, including: +An actor is a thing that can only be interacted with using "messages". A message can basically be anything that the actor can understand and in response to a message an actor is allowed to do several things, including: - send a response - send messages to other actors @@ -82,24 +56,15 @@ class CounterActor { {% endraw %} ``` -The `CounterActor` class in this example is initialized with an internal state -called `count` that is set to zero and it responds to `plus-one` messages by -increasing the `count` state and returning the new value. +The `CounterActor` class in this example is initialized with an internal state called `count` that is set to zero and it responds to `plus-one` messages by increasing the `count` state and returning the new value. -The complexity of actors is relatively low, and that is because the complexity -is usually hidden in the actor frameworks that are used to run these types of -primitives in the end. One example of such an actor framework is [actix], which -we will have a closer look at now. +The complexity of actors is relatively low, and that is because the complexity is usually hidden in the actor frameworks that are used to run these types of primitives in the end. One example of such an actor framework is [actix], which we will have a closer look at now. ## actix -[actix] is the low-level actor framework that powers [actix-web][actix-web], a -[high-performance][performance] web framework for the [Rust][rust] programming -language. +[actix] is the low-level actor framework that powers [actix-web][actix-web], a [high-performance][performance] web framework for the [Rust][rust] programming language. -While [actix-web][actix-web] is interesting and worth another blog post, we will -focus on the low-level primitive [actix][actix] for now as it is vital to -understanding the higher level concepts. +While [actix-web][actix-web] is interesting and worth another blog post, we will focus on the low-level primitive [actix][actix] for now as it is vital to understanding the higher level concepts. To get started with actix, let's port our `CounterActor` above to Rust: @@ -140,39 +105,19 @@ impl Handler for CounterActor { } ``` -Since Rust is a typed language all structures need to be declared upfront. In -the snippet above we first import all the necessary things from the -`actix::prelude` module, and then we define how a `PlusOne` message should look -like. In the JavaScript implementation the `message` had a `type` property, but -since we have a strict type system available in Rust there is no need to -explicitly declare that. That leaves us with an empty `PlusOne` message, -indicated by the `struct PlusOne` which does not have any content. The message -does have a `Result` type though, defined by `type Result = u32;` which means -"unsigned 32 bit integer". - -The `CounterActor` implementation is another `struct` which is roughly similar -to a `class` in JavaScript. It does implement several "traits", which is very -roughly what are called "interfaces" in e.g. TypeScript or Java. - -The `Actor` trait defines that `CounterActor` is in fact an actor that complies -with the necessary interface to be run by the actix framework. The `Context` -type declaration can be used for more advanced implementations, but for now we -can use the default implementation that is provided by actix itself. - -Finally we implement the `Handler` trait for the `PlusOne` message that we -defined earlier. In the `handle()` method we increment the `count` state and -then return the new value to tell actix that this is our response to the -message. +Since Rust is a typed language all structures need to be declared upfront. In the snippet above we first import all the necessary things from the `actix::prelude` module, and then we define how a `PlusOne` message should look like. In the JavaScript implementation the `message` had a `type` property, but since we have a strict type system available in Rust there is no need to explicitly declare that. That leaves us with an empty `PlusOne` message, indicated by the `struct PlusOne` which does not have any content. The message does have a `Result` type though, defined by `type Result = u32;` which means "unsigned 32 bit integer". + +The `CounterActor` implementation is another `struct` which is roughly similar to a `class` in JavaScript. It does implement several "traits", which is very roughly what are called "interfaces" in e.g. TypeScript or Java. + +The `Actor` trait defines that `CounterActor` is in fact an actor that complies with the necessary interface to be run by the actix framework. The `Context` type declaration can be used for more advanced implementations, but for now we can use the default implementation that is provided by actix itself. + +Finally we implement the `Handler` trait for the `PlusOne` message that we defined earlier. In the `handle()` method we increment the `count` state and then return the new value to tell actix that this is our response to the message. ### Running our `CounterActor` -While building the actor was relatively easy, running it is unfortunately still -a little hard while Rust figures out its version of `async/await` (see -[`futures-await`][futures-await]). +While building the actor was relatively easy, running it is unfortunately still a little hard while Rust figures out its version of `async/await` (see [`futures-await`][futures-await]). -The following code will startup our actor, send a message, wait for the -response, send another message, wait for the response and finally exit the -application: +The following code will startup our actor, send a message, wait for the response, send another message, wait for the response and finally exit the application: ```rust let sys = actix::System::new("test"); @@ -198,59 +143,30 @@ Arbiter::handle().spawn(result); sys.run(); ``` -The first thing to do when using actix actors is to set up a [`System`][system], -that handles all those actor interactions for us. We do so by calling -`actix::System::new()` and passing it a name. - -Next we start an [`Arbiter`][artiter] in a new thread, that runs our -`CounterActor`. If that sounds like a foreign language to you, don't worry, I -had the same feeling at first. For now all you need to know is that `Syn` means -that it is running in a separate thread, and that the `Arbiter` is the thing -that controls that thread. - -The `Arbiter::start()` call returns an `Addr` (short for address), that we can -use to talk to the actor. The `Addr` struct has methods like `send()` that can -be used to send messages to the actor and receive their responses. - -Rust is very strict around data ownership, and the "borrow checker" makes sure -that data access can only happen in safe ways. Since we use the `counter` -variable for the first `send()` call, we are (at least currently) not allowed to -reuse it inside the callback. Instead we need to create a `clone()` and use that -one instead. - -The large code structure in the middle of the snippet looks roughly like a -Promise-chain in JavaScript, and it is exactly that. The `counter.send()` call -returns what Rust calls a `Future`. A `Future` (like a `Promise`) has several -methods that can be used to assemble a sort of pipeline of how to handle the -result that the `Future` will at some point return. - -In this specific case we use `.and_then()` to wait for the result of the -`PlusOne` message, then print it out to the console, and then fire off another -`PlusOne` message. Once that second message has returned we print the response -again and then use a special system arbiter call to exit the process. - -The major difference between a `Promise` in JavaScript and a `Future` in Rust is -that a `Promise` automatically runs when it is created, but a `Future` needs to -be started explicitly. This difference exists for performance reasons, and -because in JavaScript there is no such thing as running on different threads. - -To start the `Future` that we have assembled we use the -`Arbiter::handle().spawn()` function, and then finally start the `System` once -everything is wired up correctly to block the current thread until all actors -have finished running. +The first thing to do when using actix actors is to set up a [`System`][system], that handles all those actor interactions for us. We do so by calling `actix::System::new()` and passing it a name. + +Next we start an [`Arbiter`][artiter] in a new thread, that runs our `CounterActor`. If that sounds like a foreign language to you, don't worry, I had the same feeling at first. For now all you need to know is that `Syn` means that it is running in a separate thread, and that the `Arbiter` is the thing that controls that thread. + +The `Arbiter::start()` call returns an `Addr` (short for address), that we can use to talk to the actor. The `Addr` struct has methods like `send()` that can be used to send messages to the actor and receive their responses. + +Rust is very strict around data ownership, and the "borrow checker" makes sure that data access can only happen in safe ways. Since we use the `counter` variable for the first `send()` call, we are (at least currently) not allowed to reuse it inside the callback. Instead we need to create a `clone()` and use that one instead. + +The large code structure in the middle of the snippet looks roughly like a Promise-chain in JavaScript, and it is exactly that. The `counter.send()` call returns what Rust calls a `Future`. A `Future` (like a `Promise`) has several methods that can be used to assemble a sort of pipeline of how to handle the result that the `Future` will at some point return. + +In this specific case we use `.and_then()` to wait for the result of the `PlusOne` message, then print it out to the console, and then fire off another `PlusOne` message. Once that second message has returned we print the response again and then use a special system arbiter call to exit the process. + +The major difference between a `Promise` in JavaScript and a `Future` in Rust is that a `Promise` automatically runs when it is created, but a `Future` needs to be started explicitly. This difference exists for performance reasons, and because in JavaScript there is no such thing as running on different threads. + +To start the `Future` that we have assembled we use the `Arbiter::handle().spawn()` function, and then finally start the `System` once everything is wired up correctly to block the current thread until all actors have finished running. ## Summary -This blog post covered some of the basic concepts of writing actors using the -actix framework for Rust. In a follow-up post we will look into writing a small -TCP client using these primitives, which can for example be used to forward -traffic to websocket clients or just log the received messages to the console. +This blog post covered some of the basic concepts of writing actors using the actix framework for Rust. In a follow-up post we will look into writing a small TCP client using these primitives, which can for example be used to forward traffic to websocket clients or just log the received messages to the console. [rustup]: https://rustup.rs/ [wikipedia]: https://en.wikipedia.org/wiki/Rust [erlang]: https://www.erlang.org/ -[performance]: - https://www.techempower.com/benchmarks/#section=data-r15&hw=ph&test=plaintext +[performance]: https://www.techempower.com/benchmarks/#section=data-r15&hw=ph&test=plaintext [actix-web]: https://github.com/actix/actix-web [futures-await]: https://github.com/alexcrichton/futures-await [system]: https://actix.rs/actix/actix/struct.System.html diff --git a/src/posts/2018-06-18-intl-polyfill-loading.md b/src/posts/2018-06-18-intl-polyfill-loading.md index b957f7264a..843a566fea 100644 --- a/src/posts/2018-06-18-intl-polyfill-loading.md +++ b/src/posts/2018-06-18-intl-polyfill-loading.md @@ -2,9 +2,7 @@ title: "ember-intl data loading patterns" authorHandle: tobiasbieniek bio: "Senior Frontend Engineer, Ember CLI core team member" -description: - "Tobias Bieniek shows how to load the necessary polyfills for the Intl API in - older browsers most effectively when using ember-intl." +description: "Tobias Bieniek shows how to load the necessary polyfills for the Intl API in older browsers most effectively when using ember-intl." tags: ember tagline: |

    At Mainmatter we ❤️ ember-intl and use it for all our projects where translations or other localizations are needed. ember-intl is based on the native Intl APIs that were introduced in all newer browsers a while ago. Unfortunately some users are still using browsers that don't support them and this blog post will show you our preferred way to load the necessary polyfill and the associated data.

    @@ -12,16 +10,9 @@ tagline: | ## Loading Translations -Let's first start with how translations are loaded in ember-intl. By default -ember-intl will bundle all translations into your `app.js` file, which works -okay for small projects, but if you want to support more than 2-3 languages and -have a significant number of translations this will quickly bloat your bundle -size out of proportion. +Let's first start with how translations are loaded in ember-intl. By default ember-intl will bundle all translations into your `app.js` file, which works okay for small projects, but if you want to support more than 2-3 languages and have a significant number of translations this will quickly bloat your bundle size out of proportion. -The solution to this problem is "side-loading". After you have determined what -language/locale your users would like to see you load the translations using an -AJAX request and after that has finished you call `setLocale()` to activate the -new translations. It looks roughly like this: +The solution to this problem is "side-loading". After you have determined what language/locale your users would like to see you load the translations using an AJAX request and after that has finished you call `setLocale()` to activate the new translations. It looks roughly like this: ```js {% raw %} @@ -38,17 +29,9 @@ async beforeModel() { {% endraw %} ``` -To make this work we need to tell ember-intl that it should no longer bundle the -translations in the `app.js` file, and instead it should write them out as JSON -files into our `dist` folder. We can do so by opening the `config/ember-intl.js` -file, and adjusting the `publicOnly` property to `true`. If we now call -`ember build` and look at the `dist` folder we will see a `translations` -subfolder including JSON files for all existing translations. +To make this work we need to tell ember-intl that it should no longer bundle the translations in the `app.js` file, and instead it should write them out as JSON files into our `dist` folder. We can do so by opening the `config/ember-intl.js` file, and adjusting the `publicOnly` property to `true`. If we now call `ember build` and look at the `dist` folder we will see a `translations` subfolder including JSON files for all existing translations. -We would like to make our translation loading code look a little simpler from -the outside, so what we could do is add a `loadTranslations()` method to the -`intl` service itself. For that we create a `myapp/app/services/intl.js` file -like this: +We would like to make our translation loading code look a little simpler from the outside, so what we could do is add a `loadTranslations()` method to the `intl` service itself. For that we create a `myapp/app/services/intl.js` file like this: ```js {% raw %} @@ -79,17 +62,11 @@ async beforeModel() { {% endraw %} ``` -If we now open our app in the browser and look at the "Network" tab of the -browser we should see the app making an AJAX request for the translations before -it starts. 🎉 +If we now open our app in the browser and look at the "Network" tab of the browser we should see the app making an AJAX request for the translations before it starts. 🎉 ## Loading the Intl.js polyfill -As mentioned in the intro -[some browsers](https://caniuse.com/#feat=internationalization) need a polyfill -for the new `Intl` APIs. ember-intl makes this easy for us as it supports an -`autoPolyfill` option in its config file. Setting this option to `true` will -automatically add script tags like this to your `index.html` file: +As mentioned in the intro [some browsers](https://caniuse.com/#feat=internationalization) need a polyfill for the new `Intl` APIs. ember-intl makes this easy for us as it supports an `autoPolyfill` option in its config file. Setting this option to `true` will automatically add script tags like this to your `index.html` file: ```html @@ -98,19 +75,11 @@ automatically add script tags like this to your `index.html` file: ``` -That is a nice first step, but should not be used for any real user-facing apps. -The reason for this is that it adds a significant number of additional HTTP -requests to the startup time of your app, and those requests aren't even that -small. `intl.min.js` downloads roughly 40 kB and each locale script another 25 -kB of uncompressed JavaScript code. It would be much better if we would only -load them if the browser actually needed the polyfill... +That is a nice first step, but should not be used for any real user-facing apps. The reason for this is that it adds a significant number of additional HTTP requests to the startup time of your app, and those requests aren't even that small. `intl.min.js` downloads roughly 40 kB and each locale script another 25 kB of uncompressed JavaScript code. It would be much better if we would only load them if the browser actually needed the polyfill... -Let's turn off the `autoPolyfill` option and implement lazy loading of the -polyfill files instead. +Let's turn off the `autoPolyfill` option and implement lazy loading of the polyfill files instead. -The first thing we need for this is a function that downloads JS code and then -runs it. We could hack something together with `fetch()` and `eval()`, but there -is a better solution: +The first thing we need for this is a function that downloads JS code and then runs it. We could hack something together with `fetch()` and `eval()`, but there is a better solution: ```js {% raw %} @@ -125,11 +94,9 @@ function loadJS(url) { {% endraw %} ``` -The above function creates a ` ``` -This calls the navigator's `serviceWorker` API's `register` method (if the -browser supports that API), passing the name of the JavaScript file with the -service worker code as an argument. The `register` method returns a promise that -rejects if the service worker could not be registered successfully. +This calls the navigator's `serviceWorker` API's `register` method (if the browser supports that API), passing the name of the JavaScript file with the service worker code as an argument. The `register` method returns a promise that rejects if the service worker could not be registered successfully. -Once the service worker is registered, it will start receiving various events -during the -[service worker lifecycle](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Basic_architecture). -The first event in that lifecycle is the _"install"_ event which is typically -used to pre-cache resources and thus make them available for later offline use. -In the Breethe PWA, we use that event to preload all of the app's essential -resources: +Once the service worker is registered, it will start receiving various events during the [service worker lifecycle](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Basic_architecture). The first event in that lifecycle is the _"install"_ event which is typically used to pre-cache resources and thus make them available for later offline use. In the Breethe PWA, we use that event to preload all of the app's essential resources: ```js @@ -266,14 +159,9 @@ self.addEventListener('install', function(event) { {% endraw %} ``` -Here, when the _"install"_ event is fired, we open the service worker cache, -request the critical assets and store them in the service worker's cache. +Here, when the _"install"_ event is fired, we open the service worker cache, request the critical assets and store them in the service worker's cache. -The next event in the lifecycle is the _"activate"_ event that is typically used -to delete old caches so that when the service worker is updated, no stale data -is left on the user's device. In the Breethe PWA, we only use one cache and when -the service worker is activated, simply delete all caches that are not that -current one: +The next event in the lifecycle is the _"activate"_ event that is typically used to delete old caches so that when the service worker is updated, no stale data is left on the user's device. In the Breethe PWA, we only use one cache and when the service worker is activated, simply delete all caches that are not that current one: ```js {% raw %} @@ -294,13 +182,7 @@ self.addEventListener('activate', function (event) { {% endraw %} ``` -After the service worker is installed and activated, it starts receiving -_"fetch"_ events whenever the browser makes a request for any remote resource. -This is the relevant event that we need to listen for in order to make sure the -PWA can start up successfully if the device is offline. In the case of an SPA -where there only is one HTML document (which is `index.html`), this is as easy -as always serving that from the service worker's cache when the original request -fails: +After the service worker is installed and activated, it starts receiving _"fetch"_ events whenever the browser makes a request for any remote resource. This is the relevant event that we need to listen for in order to make sure the PWA can start up successfully if the device is offline. In the case of an SPA where there only is one HTML document (which is `index.html`), this is as easy as always serving that from the service worker's cache when the original request fails: ```js {% raw %} @@ -316,37 +198,13 @@ self.addEventListener('fetch', function (event) { {% endraw %} ``` -Here, we first check whether the request is asking for an HTML document (in -reality in Breethe, -[we check a few other things as well](https://github.com/mainmatter/breethe-client/blob/master/lib/service-worker/workers/service-worker.js#L88)) -and if that is the case, try making the request and loading the resource from -the network first. If that fails and the promise returned from `fetch` rejects -(one possible reason for that being that the device is offline), we simply serve -the `index.html` from the service worker's cache so that the app can start up -successfully in the browser. All of the application's assets that are referenced -in `index.html` are cached to and served from the service worker's cache as well -in a -[separate event handler](https://github.com/mainmatter/breethe-client/blob/master/lib/service-worker/workers/service-worker.js#L65). - -Allowing apps to start up offline with Service Workers is very straight forward -and does not even require implementing a whole lot of logic - -[Breethe's service worker](https://github.com/mainmatter/breethe-client/blob/master/lib/service-worker/workers/service-worker.js) -does not even have 100 lines of code. Of course being able to start up the app -while the device is offline only solves half of the problem though when all of -the app's data is loaded from a remote API and thus would be unavailable when -offline. +Here, we first check whether the request is asking for an HTML document (in reality in Breethe, [we check a few other things as well](https://github.com/mainmatter/breethe-client/blob/master/lib/service-worker/workers/service-worker.js#L88)) and if that is the case, try making the request and loading the resource from the network first. If that fails and the promise returned from `fetch` rejects (one possible reason for that being that the device is offline), we simply serve the `index.html` from the service worker's cache so that the app can start up successfully in the browser. All of the application's assets that are referenced in `index.html` are cached to and served from the service worker's cache as well in a [separate event handler](https://github.com/mainmatter/breethe-client/blob/master/lib/service-worker/workers/service-worker.js#L65). + +Allowing apps to start up offline with Service Workers is very straight forward and does not even require implementing a whole lot of logic - [Breethe's service worker](https://github.com/mainmatter/breethe-client/blob/master/lib/service-worker/workers/service-worker.js) does not even have 100 lines of code. Of course being able to start up the app while the device is offline only solves half of the problem though when all of the app's data is loaded from a remote API and thus would be unavailable when offline. ## Offline Data -The web platform provides a number of APIs for storing data in the browser and -thus making it available for offline use. The -[WebStorage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API) -defines `localStorage` and `sessionStorage` which can be used for storing -key/value pairs. Cookies have been around for quite some time and not only can -they be used for tracking users or keeping their sessions alive when the browser -is closed but also for storing simple data. When dealing with bigger, structured -datasets though, the storage API of choice is generally -[`IndexedDB`](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API). +The web platform provides a number of APIs for storing data in the browser and thus making it available for offline use. The [WebStorage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API) defines `localStorage` and `sessionStorage` which can be used for storing key/value pairs. Cookies have been around for quite some time and not only can they be used for tracking users or keeping their sessions alive when the browser is closed but also for storing simple data. When dealing with bigger, structured datasets though, the storage API of choice is generally [`IndexedDB`](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API). `IndexedDB` is a transactional database system, similar to SQL-based RDBMS: @@ -366,18 +224,9 @@ openRequest.onsuccess = function (event) { {% endraw %} ``` -`IndexedDB`'s API can be a bit cumbersome to use though which is why instead of -interfacing with it directly, developers typically leverage libraries that -abstract its complexity behind more convenient APIs. For Breethe, we used -[Orbit.js](http://orbitjs.com) but there are other libraries like -[PouchDB](https://pouchdb.com) or -[localForage](https://localforage.github.io/localForage/). +`IndexedDB`'s API can be a bit cumbersome to use though which is why instead of interfacing with it directly, developers typically leverage libraries that abstract its complexity behind more convenient APIs. For Breethe, we used [Orbit.js](http://orbitjs.com) but there are other libraries like [PouchDB](https://pouchdb.com) or [localForage](https://localforage.github.io/localForage/). -Orbit.js works based on a schema definition that defines the models it operates -on, their attributes and relationships. In the case of Breethe which works with -measurement locations and data points, -[the schema](https://github.com/mainmatter/breethe-client/blob/master/src/utils/data/schema.ts) -looks like this: +Orbit.js works based on a schema definition that defines the models it operates on, their attributes and relationships. In the case of Breethe which works with measurement locations and data points, [the schema](https://github.com/mainmatter/breethe-client/blob/master/src/utils/data/schema.ts) looks like this: ```typescript import { SchemaSettings } from "@orbit/data"; @@ -418,10 +267,7 @@ export const schema: SchemaSettings = { }; ``` -The `location` model represents a measurement location that air quality data has -been recorded for. Each location has a number of `measurements` that represent -individual data points for particular parameters, e.g. 42.38 µg/m³ for Ozone -(O₃). With that schema, a store can be instantiated: +The `location` model represents a measurement location that air quality data has been recorded for. Each location has a number of `measurements` that represent individual data points for particular parameters, e.g. 42.38 µg/m³ for Ozone (O₃). With that schema, a store can be instantiated: ```typescript import Store from "@orbit/store"; @@ -430,9 +276,7 @@ import schema from "./schema"; const store = new Store({ schema }); ``` -Stores in Orbit.js are backed by sources. In the case of Breethe, we use a -[json:api](http://jsonapi.org) source for loading data from a -[server API](https://github.com/mainmatter/breethe-server): +Stores in Orbit.js are backed by sources. In the case of Breethe, we use a [json:api](http://jsonapi.org) source for loading data from a [server API](https://github.com/mainmatter/breethe-server): ```typescript import JSONAPISource from "@orbit/jsonapi"; @@ -444,9 +288,7 @@ const remote = new JSONAPISource({ }); ``` -In order to be able to use the data loaded from the remote store when the app is -offline, Breethe defines a second source that is backed by `IndexedDB` and that -all data that enters the store via the remote source is synced into: +In order to be able to use the data loaded from the remote store when the app is offline, Breethe defines a second source that is backed by `IndexedDB` and that all data that enters the store via the remote source is synced into: ```typescript import IndexedDBSource from "@orbit/indexeddb"; @@ -462,46 +304,17 @@ store.on("transform", transform => { }); ``` -With this setup, all data that gets loaded by the app while the device is online -is available for later offline use, where it will be read from `IndexedDB` -instead. This mechanism works the other way round as well of course, such that -the app could buffer any modifications to data in the store in `IndexedDB` while -offline and then sync these changes back to the remote API once the device comes -back online - refer to the [Orbit.js docs](http://orbitjs.com/v0.15/guide/) for -more information about advanced mechanics like this. +With this setup, all data that gets loaded by the app while the device is online is available for later offline use, where it will be read from `IndexedDB` instead. This mechanism works the other way round as well of course, such that the app could buffer any modifications to data in the store in `IndexedDB` while offline and then sync these changes back to the remote API once the device comes back online - refer to the [Orbit.js docs](http://orbitjs.com/v0.15/guide/) for more information about advanced mechanics like this. -With the combination of service workers and `IndexedDB`, PWAs are fully -independent of the network status and offer the same experience as native apps -when the device is offline. Modern libraries like Orbit.js make it easy to -manage data independently of the network condition and abstract most of the -details behind convenient APIs. +With the combination of service workers and `IndexedDB`, PWAs are fully independent of the network status and offer the same experience as native apps when the device is offline. Modern libraries like Orbit.js make it easy to manage data independently of the network condition and abstract most of the details behind convenient APIs. ## Testing -Testing is an essential part of modern software engineering and we at Mainmatter -(and I'm sure this is true for anyone reading this as well) would **never ship -code that is not fully tested** - as we could not know whether the code actually -works or whether we subsequently break it when making changes. The first thing -that comes to mind when thinking about tests are typically unit tests that test -a small part of an app (a unit) in isolation. Depending on the framework of -choice and its testing philosophy and tools, there might also be means of -[higher level test](https://guides.emberjs.com/release/testing/testing-components/) -that test larger subsets of an app (and we have -[quite](https://github.com/mainmatter/breethe-client/blob/master/src/ui/components/MeasurementRow/component-test.ts) -[a lot](https://github.com/mainmatter/breethe-client/blob/master/src/ui/components/SearchForm/component-test.ts) -of these for Breethe). - -Testing PWAs, in particular their offline behavior, is slightly different though -as it requires the correct interplay of various parts that cannot be isolated -well - namely the app itself, the service worker, storage APIs like `IndexedDB` -and the browser. A proper PWA test suite needs to take all of these parts into -account and have a higher level perspective on the system under test than is the -case in a unit test. A great tool for tests like these is Google's -[puppeteer](https://pptr.dev) that allows running and controlling a headless -instance of Chrome. - -Combining puppeteer with mocha allows for writing high level test cases that -test a PWA in its entirety: +Testing is an essential part of modern software engineering and we at Mainmatter (and I'm sure this is true for anyone reading this as well) would **never ship code that is not fully tested** - as we could not know whether the code actually works or whether we subsequently break it when making changes. The first thing that comes to mind when thinking about tests are typically unit tests that test a small part of an app (a unit) in isolation. Depending on the framework of choice and its testing philosophy and tools, there might also be means of [higher level test](https://guides.emberjs.com/release/testing/testing-components/) that test larger subsets of an app (and we have [quite](https://github.com/mainmatter/breethe-client/blob/master/src/ui/components/MeasurementRow/component-test.ts) [a lot](https://github.com/mainmatter/breethe-client/blob/master/src/ui/components/SearchForm/component-test.ts) of these for Breethe). + +Testing PWAs, in particular their offline behavior, is slightly different though as it requires the correct interplay of various parts that cannot be isolated well - namely the app itself, the service worker, storage APIs like `IndexedDB` and the browser. A proper PWA test suite needs to take all of these parts into account and have a higher level perspective on the system under test than is the case in a unit test. A great tool for tests like these is Google's [puppeteer](https://pptr.dev) that allows running and controlling a headless instance of Chrome. + +Combining puppeteer with mocha allows for writing high level test cases that test a PWA in its entirety: ```js {% raw %} @@ -550,30 +363,10 @@ describe('when offline', function () { {% endraw %} ``` -This test uses -[puppeteer's API](https://github.com/GoogleChrome/puppeteer/blob/v1.5.0/docs/api.md) -to create a new browser object (which will start an actual instance of Chrome in -the background), open a page, interact with DOM elements and assert on their -presence and state. It starts by going through the app's main flow once so data -is loaded from the API and `IndexedDB` is populated. It then disables the -network (`page.setOfflineMode(true)`), reloads the page (which is then served -from the service worker that was registered during first load) and asserts on -the DOM correctly being generated from the data read from `IndexedDB`. - -A testing setup like this makes it easy to achieve decent test coverage for -PWAs, testing all of the parts involved - the app itself but also the service -worker and storage APIs like `IndexedDB`. These test are even reasonably fast to -execute - -[Breethe's suite of puppeteer tests](https://github.com/mainmatter/breethe-client/tree/master/integration-tests) -completes in around 1min. +This test uses [puppeteer's API](https://github.com/GoogleChrome/puppeteer/blob/v1.5.0/docs/api.md) to create a new browser object (which will start an actual instance of Chrome in the background), open a page, interact with DOM elements and assert on their presence and state. It starts by going through the app's main flow once so data is loaded from the API and `IndexedDB` is populated. It then disables the network (`page.setOfflineMode(true)`), reloads the page (which is then served from the service worker that was registered during first load) and asserts on the DOM correctly being generated from the data read from `IndexedDB`. + +A testing setup like this makes it easy to achieve decent test coverage for PWAs, testing all of the parts involved - the app itself but also the service worker and storage APIs like `IndexedDB`. These test are even reasonably fast to execute - [Breethe's suite of puppeteer tests](https://github.com/mainmatter/breethe-client/tree/master/integration-tests) completes in around 1min. ## Outlook -This post and the -[previous one](/blog/2018/07/03/building-a-pwa-with-glimmer-js) have given an -overview of how to write an SPA (in this case with Glimmer.js) and then turning -that into a [Progressive Web App](http://breethe.app). With Breethe, we haven't -stopped there though but employed server side rendering to combine the -advantages of a PWA with those of classic server rendered websites. In the next -post in this series, we will have a detailed look at what specifically those -advantages are and how we were able to achieve them. +This post and the [previous one](/blog/2018/07/03/building-a-pwa-with-glimmer-js) have given an overview of how to write an SPA (in this case with Glimmer.js) and then turning that into a [Progressive Web App](http://breethe.app). With Breethe, we haven't stopped there though but employed server side rendering to combine the advantages of a PWA with those of classic server rendered websites. In the next post in this series, we will have a detailed look at what specifically those advantages are and how we were able to achieve them. diff --git a/src/posts/2018-11-27-open-source-maintenance.md b/src/posts/2018-11-27-open-source-maintenance.md index f831c8e970..02c8630070 100644 --- a/src/posts/2018-11-27-open-source-maintenance.md +++ b/src/posts/2018-11-27-open-source-maintenance.md @@ -2,9 +2,7 @@ title: "Open Source Maintenance" authorHandle: tobiasbieniek bio: "Senior Frontend Engineer, Ember CLI core team member" -description: - "Tobias Bieniek introduces best practices for simplifying and speeding up his - work on open-source and other projects." +description: "Tobias Bieniek introduces best practices for simplifying and speeding up his work on open-source and other projects." tags: misc tagline: |

    People often ask us how we can handle maintaining a large number of open-source projects. In this blog post we will introduce you to some of out internal best practices we have developed or discovered to simplify and speed up working on open-source and other projects.

    @@ -12,42 +10,19 @@ tagline: | ## Git -Version control systems have always been an important part of professional -software development, but the development of [git] over a decade ago and the -subsequent development of [GitHub] has made version control mainstream for open -source projects. +Version control systems have always been an important part of professional software development, but the development of [git] over a decade ago and the subsequent development of [GitHub] has made version control mainstream for open source projects. -While many tutorials focus on using Git from the command line, we have found -that using a graphical user interface to visualize the history graph can make it -quite a bit easier for beginners to understand what is going on. One good -example of such a tool is [Fork], which is freely available for Windows and -macOS: +While many tutorials focus on using Git from the command line, we have found that using a graphical user interface to visualize the history graph can make it quite a bit easier for beginners to understand what is going on. One good example of such a tool is [Fork], which is freely available for Windows and macOS: ![Screenshot of Fork](/assets/images/posts/2018-11-27-open-source-maintenance/git-fork.png#@1173-2346) -When working on multiple different projects, it is useful to rely on similar -conventions, for example, when naming things. In the context of Git this is most -relevant when naming -[remotes](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes), tags -and branches. - -When we publish new releases we "tag" the release commits with a tag name like -`v1.2.3`, corresponding to the new version. When working in the JavaScript -ecosystem we use `yarn version` (or `npm version`) to automatically adjust the -`version` field in the `package.json` file, commit the change and finally create -a tag on the new commit. - -For branches we use the default `master` branch as our main development branch. -Feature branches are named after the thing that they are implementing or fixing -and ideally only contain isolated, focused changes. Similar to the tag names we -sometimes keep version branches around to support older releases with names like -`v1.x` or `v2.3.x`. - -For remotes we use `upstream`, `origin` and for all other remotes the GitHub (or -GitLab, BitBucket, etc.) username of the remote owner. `upstream` means the main -project on GitHub and `origin` is my personal fork where I push feature -branches, which will turn into PRs against the `upstream` repository. Here is an -example for our `qunit-dom` project on my machine: +When working on multiple different projects, it is useful to rely on similar conventions, for example, when naming things. In the context of Git this is most relevant when naming [remotes](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes), tags and branches. + +When we publish new releases we "tag" the release commits with a tag name like `v1.2.3`, corresponding to the new version. When working in the JavaScript ecosystem we use `yarn version` (or `npm version`) to automatically adjust the `version` field in the `package.json` file, commit the change and finally create a tag on the new commit. + +For branches we use the default `master` branch as our main development branch. Feature branches are named after the thing that they are implementing or fixing and ideally only contain isolated, focused changes. Similar to the tag names we sometimes keep version branches around to support older releases with names like `v1.x` or `v2.3.x`. + +For remotes we use `upstream`, `origin` and for all other remotes the GitHub (or GitLab, BitBucket, etc.) username of the remote owner. `upstream` means the main project on GitHub and `origin` is my personal fork where I push feature branches, which will turn into PRs against the `upstream` repository. Here is an example for our `qunit-dom` project on my machine: | Name | URL | | ------------ | ----------------------------------------- | @@ -56,24 +31,20 @@ example for our `qunit-dom` project on my machine: | `lukemelia` | `git@github.com:lukemelia/qunit-dom.git` | | `jackbeegan` | `git@github.com:jackbeegan/qunit-dom.git` | -Why is this useful? Because it allows us to define -[shell aliases](https://shapeshed.com/unix-alias/) for some of the most commonly -used git commands for which we don't use a graphical user interface. Here are a -few examples of things we regularly use: - -| Alias | Command | Description | -| ----- | ----------------------------- | ----------------------------------------------------------------------------------------------------- | -| `cl` | `git clone` | Clones a repository | -| `clu` | `git clone --origin=upstream` | Clones a repository, and uses `upstream` as the default remote name | -| `ao` | `git remote add origin` | Adds a new remote called `origin` | -| `gfu` | `git fetch upstream` | Updates the local copies of the `upstream` remote branches | -| `gfo` | `git fetch origin` | Updates the local copies of the `origin` remote branches | -| `gp` | `git push` | Pushes the current branch to the corresponding remote | -| `gph` | `git push -u origin HEAD` | Pushes the current branch as a new branch to the `origin` remote | +Why is this useful? Because it allows us to define [shell aliases](https://shapeshed.com/unix-alias/) for some of the most commonly used git commands for which we don't use a graphical user interface. Here are a few examples of things we regularly use: + +| Alias | Command | Description | +| --- | --- | --- | +| `cl` | `git clone` | Clones a repository | +| `clu` | `git clone --origin=upstream` | Clones a repository, and uses `upstream` as the default remote name | +| `ao` | `git remote add origin` | Adds a new remote called `origin` | +| `gfu` | `git fetch upstream` | Updates the local copies of the `upstream` remote branches | +| `gfo` | `git fetch origin` | Updates the local copies of the `origin` remote branches | +| `gp` | `git push` | Pushes the current branch to the corresponding remote | +| `gph` | `git push -u origin HEAD` | Pushes the current branch as a new branch to the `origin` remote | | `gpf` | `git push --force-with-lease` | Pushes the current branch to the corresponding remote, overwriting the existing history of the branch | -With these commands we can already speed up our workflow quite significantly. -Here is an example for working on `qunit-dom` from zero to open pull request: +With these commands we can already speed up our workflow quite significantly. Here is an example for working on `qunit-dom` from zero to open pull request: ```bash clu git@github.com:mainmatter/qunit-dom.git @@ -87,147 +58,68 @@ gph ## Tests -Having a good test suite is very important to be able to change code and be -confident that the change is not breaking anything. This is one of the major -reasons why we love [Ember.js], because it comes with a great testing system -out-of-the-box and allows us to write tests for all of the critical parts of the -apps that we develop. +Having a good test suite is very important to be able to change code and be confident that the change is not breaking anything. This is one of the major reasons why we love [Ember.js], because it comes with a great testing system out-of-the-box and allows us to write tests for all of the critical parts of the apps that we develop. -You can find more information on testing in Ember.js on the official -[guides](https://guides.emberjs.com/release/testing/). +You can find more information on testing in Ember.js on the official [guides](https://guides.emberjs.com/release/testing/). -But this topic not limited to just Ember.js, other ecosystems have similar -tools. For Node.js the most popular testing solutions these days are [Jest] and -[Mocha]. In the [Rust] ecosystem testing is already built into their package -manager [cargo], but there are -[plenty of crates](https://github.com/rust-unofficial/awesome-rust#testing) to -make testing even more pleasant, including the very valuable [proptest] crate. +But this topic not limited to just Ember.js, other ecosystems have similar tools. For Node.js the most popular testing solutions these days are [Jest] and [Mocha]. In the [Rust] ecosystem testing is already built into their package manager [cargo], but there are [plenty of crates](https://github.com/rust-unofficial/awesome-rust#testing) to make testing even more pleasant, including the very valuable [proptest] crate. ## Linting -Similar to testing frameworks, a lot of ecosystems have tools to run "static -analysis" on your code to find bugs before you even run the applications. These -tools are often called "Linters". +Similar to testing frameworks, a lot of ecosystems have tools to run "static analysis" on your code to find bugs before you even run the applications. These tools are often called "Linters". -A very popular linter in the JavaScript world is [ESLint], which we often run in -combination with [Prettier], to also ensure that our code is formatted in a -consistent way. +A very popular linter in the JavaScript world is [ESLint], which we often run in combination with [Prettier], to also ensure that our code is formatted in a consistent way. -Again, similar tools also exist in other ecosystems like Rust ([clippy] and -[rustfmt]), Python ([pyflakes] and [black]) or Elixir (`mix format`). +Again, similar tools also exist in other ecosystems like Rust ([clippy] and [rustfmt]), Python ([pyflakes] and [black]) or Elixir (`mix format`). ## Continuous Integration -The above points about testing and linting are nice to have, but if nobody runs -your tests then they don't provide any value. This is where continuous -integration (or short "CI") systems come into play. These kinds of systems are -coupled to your version control servers and automatically run linting checks and -tests whenever you upload new commits to the server. - -Most of the time we use [TravisCI] for this purpose, which is coupled to GitHub, -free for open source projects, and supports running your tests on Linux and -macOS, and will soon support Windows too. Alternatives include the CI service -that is integrated into [GitLab], [CircleCI] (based on Docker images) and -[AppVeyor], which we currently use to test Windows support on projects where -this is relevant. - -One important thing to mention here is that CI can not only run your test suite -but can often also do other things like publishing new versions of your -projects. On most of our projects we have configured TravisCI to automatically -publish new releases to [npm] whenever we push a new Git tag to the server. You -can find instruction on how to configure this in their official -[documentation](https://docs.travis-ci.com/user/deployment/npm/). +The above points about testing and linting are nice to have, but if nobody runs your tests then they don't provide any value. This is where continuous integration (or short "CI") systems come into play. These kinds of systems are coupled to your version control servers and automatically run linting checks and tests whenever you upload new commits to the server. + +Most of the time we use [TravisCI] for this purpose, which is coupled to GitHub, free for open source projects, and supports running your tests on Linux and macOS, and will soon support Windows too. Alternatives include the CI service that is integrated into [GitLab], [CircleCI] (based on Docker images) and [AppVeyor], which we currently use to test Windows support on projects where this is relevant. + +One important thing to mention here is that CI can not only run your test suite but can often also do other things like publishing new versions of your projects. On most of our projects we have configured TravisCI to automatically publish new releases to [npm] whenever we push a new Git tag to the server. You can find instruction on how to configure this in their official [documentation](https://docs.travis-ci.com/user/deployment/npm/). ## Semantic Versioning -Semantic Versioning (or short "semver") is a way to assign meaning to version -numbers, and specifically to version number changes. The official -[specification](https://semver.org/) is a little longer, but there are five -important rules: - -1. version numbers have three main parts called major, minor and patch version - (Example: `v3.0.1`, major is `3`, minor is `0` and patch version is `1`) -2. when your release includes any changes that might break the apps of existing - users you should increase the **major** version -3. when your release includes only bug fixes you should increase the **patch** - version +Semantic Versioning (or short "semver") is a way to assign meaning to version numbers, and specifically to version number changes. The official [specification](https://semver.org/) is a little longer, but there are five important rules: + +1. version numbers have three main parts called major, minor and patch version (Example: `v3.0.1`, major is `3`, minor is `0` and patch version is `1`) +2. when your release includes any changes that might break the apps of existing users you should increase the **major** version +3. when your release includes only bug fixes you should increase the **patch** version 4. for all other changes you should increase the **minor** version -5. if your version is below `v1.0.0` (e.g. `v0.4.3`) you can release breaking - changes without increasing the major version because the project is - considered "unstable" - -Since the majority of package managers including [yarn], [cargo], [hex] and -[bundler] follow these semantics when resolving dependencies, it is very -important to comply with these rules. But they are also useful in order for your -users to get a sense of what they can expect from a new release. - -While this can be controversial, we consider dropping support for older Node.js, -Elixir, Ruby, Rust, or other language releases a breaking change. This means -that if your package -[declares](https://docs.npmjs.com/files/package.json#engines) that it works with -Node.js 4, and you release a new version that needs at least Node.js 6, then you -should increase the **major** version. +5. if your version is below `v1.0.0` (e.g. `v0.4.3`) you can release breaking changes without increasing the major version because the project is considered "unstable" + +Since the majority of package managers including [yarn], [cargo], [hex] and [bundler] follow these semantics when resolving dependencies, it is very important to comply with these rules. But they are also useful in order for your users to get a sense of what they can expect from a new release. + +While this can be controversial, we consider dropping support for older Node.js, Elixir, Ruby, Rust, or other language releases a breaking change. This means that if your package [declares](https://docs.npmjs.com/files/package.json#engines) that it works with Node.js 4, and you release a new version that needs at least Node.js 6, then you should increase the **major** version. ## Dependency Update Services -Any sufficiently large open source project has at least a few dependencies that -it is built upon, and even smaller projects typically have at least a dependency -on a test framework. While keeping the dependencies of a single project -up-to-date is a manageable task, it is becoming a full-time job once you -maintain a larger number of separate projects. - -Fortunately for us this is a task that can be automated quite well, at least if -you have a good test suite and continuous integration set up. While we first -used [Greenkeeper] for this task, we have lately transitioned to using -[dependabot], which supports not only npm, but all sorts of different package -managers, language ecosystems, and even monorepos. - -Dependabot will automatically open Pull Requests on your projects whenever one -of your dependencies has published a new version. This will cause your CI -service to run the test suite against that new dependency version and tell you -whether it is compatible with your code or not. If configured, dependabot can -also automatically merge those Pull Requests once CI has finished and the test -suite passed. +Any sufficiently large open source project has at least a few dependencies that it is built upon, and even smaller projects typically have at least a dependency on a test framework. While keeping the dependencies of a single project up-to-date is a manageable task, it is becoming a full-time job once you maintain a larger number of separate projects. + +Fortunately for us this is a task that can be automated quite well, at least if you have a good test suite and continuous integration set up. While we first used [Greenkeeper] for this task, we have lately transitioned to using [dependabot], which supports not only npm, but all sorts of different package managers, language ecosystems, and even monorepos. + +Dependabot will automatically open Pull Requests on your projects whenever one of your dependencies has published a new version. This will cause your CI service to run the test suite against that new dependency version and tell you whether it is compatible with your code or not. If configured, dependabot can also automatically merge those Pull Requests once CI has finished and the test suite passed. ## Changelogs -While Semantic Versioning helps your users to know if they need to expect -breaking changes from a release, it is much better to have a human-readable list -of changes that went into a release. This is what a "Changelog" is for. -Typically this is a `CHANGELOG.md` file in the root folder of your project that -lists all your released versions including the changes that went into each -release. - -It can be quite tedious to write these things by hand, but fortunately there are -generators that can do most of the work for us. These generators can be divided -into two groups: - -1. the first group is based on - [semantic commit messages](https://seesparkbox.com/foundry/semantic_commit_messages) - and lists all of the commits that are part of a certain release -2. the second group is based upon GitHub Pull Requests (or similar) and uses - issue/PR labels to categorize changes - -While "semantic commit messages" seem to be quite popular we prefer the second -group of changelog generators, as listing each commit often results in a long -list of very fine-grained changes that are not directly helpful to the user. - -Instead we use [lerna-changelog] to generate our changelogs from all of the -merged pull requests that went into each of the releases. To make this work -properly it is important to focus each pull request on only one single, logical -change, and label it properly as either `enhancement`, `bug`, `breaking`, or any -of the other supported/configured labels. To ensure that all of our projects use -the same set of labels we use [github-label-sync]. - -An -[example changelog](https://github.com/mainmatter/qunit-dom/blob/master/CHANGELOG.md) -can be seen on our qunit-dom project. +While Semantic Versioning helps your users to know if they need to expect breaking changes from a release, it is much better to have a human-readable list of changes that went into a release. This is what a "Changelog" is for. Typically this is a `CHANGELOG.md` file in the root folder of your project that lists all your released versions including the changes that went into each release. + +It can be quite tedious to write these things by hand, but fortunately there are generators that can do most of the work for us. These generators can be divided into two groups: + +1. the first group is based on [semantic commit messages](https://seesparkbox.com/foundry/semantic_commit_messages) and lists all of the commits that are part of a certain release +2. the second group is based upon GitHub Pull Requests (or similar) and uses issue/PR labels to categorize changes + +While "semantic commit messages" seem to be quite popular we prefer the second group of changelog generators, as listing each commit often results in a long list of very fine-grained changes that are not directly helpful to the user. + +Instead we use [lerna-changelog] to generate our changelogs from all of the merged pull requests that went into each of the releases. To make this work properly it is important to focus each pull request on only one single, logical change, and label it properly as either `enhancement`, `bug`, `breaking`, or any of the other supported/configured labels. To ensure that all of our projects use the same set of labels we use [github-label-sync]. + +An [example changelog](https://github.com/mainmatter/qunit-dom/blob/master/CHANGELOG.md) can be seen on our qunit-dom project. ## Summary -We hope that this blog post helped you improve your processes and speed up your -own development. If you need help with any of these topics or if you have -questions we encourage you to [contact us](/contact/)! +We hope that this blog post helped you improve your processes and speed up your own development. If you need help with any of these topics or if you have questions we encourage you to [contact us](/contact/)! [git]: https://git-scm.com/ [github]: https://github.com/ diff --git a/src/posts/2018-12-10-assert-your-style.md b/src/posts/2018-12-10-assert-your-style.md index 6282a182d2..539c14e139 100644 --- a/src/posts/2018-12-10-assert-your-style.md +++ b/src/posts/2018-12-10-assert-your-style.md @@ -2,9 +2,7 @@ title: "Assert Your Style - Testing CSS in Ember Apps" authorHandle: jjordan_dev bio: "Senior Frontend Engineer, Ember Learning core team member" -description: - "Jessica Jordan explains approaches and patterns for testing styles in - Ember.js applications." +description: "Jessica Jordan explains approaches and patterns for testing styles in Ember.js applications." tags: javascript og: image: /assets/images/posts/2018-12-10-assert-your-style/og-image.jpg @@ -12,18 +10,13 @@ tagline: |

    Sometimes you really want to make sure that your web application looks good; and that it keeps doing so in the future. Automated tests are an important foundation for making your application's appearance future-proof and this may involve the integration of a screenshot-based testing tool like Percy.io or PhantomCSS.

    But writing your own visual regression tests for critical styles in your application can be really useful, too - and it can be easily done on top of that!

    --- -These are a few approaches you can choose from to assert against the styling of -your web page as part of your automated integration and acceptance test suite: +These are a few approaches you can choose from to assert against the styling of your web page as part of your automated integration and acceptance test suite: ## Testing Inline Styles of a HTML Element -Although it's a good practice to keep your HTML and your CSS entirely separate, -**inline styles** on components and other elements in your application are -sometimes necessary to be able to apply CSS property values that change -dynamically. And testing those styles can be important, too. +Although it's a good practice to keep your HTML and your CSS entirely separate, **inline styles** on components and other elements in your application are sometimes necessary to be able to apply CSS property values that change dynamically. And testing those styles can be important, too. -Imagine you created a component with an inline style attached to it assigning a -variable blue background color to it: +Imagine you created a component with an inline style attached to it assigning a variable blue background color to it: ```js {% raw %} @@ -49,8 +42,7 @@ export default Component.extend({ {% endraw %} ``` -Using `ember-test-selectors` to apply `data-` attributes to this component, you -can make it easier to interact with your component later on in the test. +Using `ember-test-selectors` to apply `data-` attributes to this component, you can make it easier to interact with your component later on in the test. ```bash ember install ember-test-selectors @@ -83,13 +75,9 @@ export default Component.extend({ {% endraw %} ``` -To learn more about the rationale behind `ember-test-selectors`, be sure to also -[give this introduction a read](/blog/2017/11/17/ember-test-selectors-road-to-1-0). +To learn more about the rationale behind `ember-test-selectors`, be sure to also [give this introduction a read](/blog/2017/11/17/ember-test-selectors-road-to-1-0). -Using the -[HTMLElement.style](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style) -API, we can assert if the correct background color has been applied to our -component: +Using the [HTMLElement.style](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style) API, we can assert if the correct background color has been applied to our component: ```js {% raw %} @@ -112,48 +100,21 @@ module('Integration | Component | mainmatter-logo-tile', function (hooks) { {% endraw %} ``` -`HTMLElement.style` allows to check for the value of **individual CSS -properties**. The same API can also be used to assign new values for any CSS -property programmatically. You can read more about -[the style attribute in the MDN docs on HTMLElement.style here](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style). +`HTMLElement.style` allows to check for the value of **individual CSS properties**. The same API can also be used to assign new values for any CSS property programmatically. You can read more about [the style attribute in the MDN docs on HTMLElement.style here](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style). -A major **benefit** of testing **CSS properties** directly is that it allows us -to derive information on how inline styles are applied to elements in our -application. This is particularly useful if we want to test **dynamic styles**. +A major **benefit** of testing **CSS properties** directly is that it allows us to derive information on how inline styles are applied to elements in our application. This is particularly useful if we want to test **dynamic styles**. -**Testing inline styles** also has its **drawbacks** though: these styles don't -necessarily reflect the way the element is ultimately rendered on the page. In -this situation the assertion against an element's **computed style** provides -much more insight. +**Testing inline styles** also has its **drawbacks** though: these styles don't necessarily reflect the way the element is ultimately rendered on the page. In this situation the assertion against an element's **computed style** provides much more insight. ## Testing Computed Styles of a HTML Element -At times you also want to check against the actual **computed value** of your -element in your tests. Some CSS definitions require the browser to resolve the -basic computation, the actual computed styles will be applied during rendering. -For example, in the case of an element with a percentage-based width defined via -CSS stylesheets (e.g. `width: 80%`), the computed style will resolve to -`width: 800px` if the element happens to be a relatively positioned -(`position: relative`) child element of another DOM node with a computed width -of `1000px`. If the element's parent element turns out to have a width of -`500px` though, the computed width of the "80% wide" child will resolve to a -mere `400px`. - -Computed styles provide information about the styles that are **ultimately -assigned** to an element. Due to -[CSS specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity) -browsers will decide which CSS property value either defined in a CSS stylesheet -or an inline style is most relevant and this value will also be reflected in the -element's computed styles. - -The -[getComputedStyle method](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle) -will return an object containing these most relevant style values. In contrast -to the object returned from `HTMLElement.style` the return value of -`getComputedStyle` is read-only. - -Therefore the `getComputedStyle` method is the ideal candidate for asserting -styles of an element in rendering tests: +At times you also want to check against the actual **computed value** of your element in your tests. Some CSS definitions require the browser to resolve the basic computation, the actual computed styles will be applied during rendering. For example, in the case of an element with a percentage-based width defined via CSS stylesheets (e.g. `width: 80%`), the computed style will resolve to `width: 800px` if the element happens to be a relatively positioned (`position: relative`) child element of another DOM node with a computed width of `1000px`. If the element's parent element turns out to have a width of `500px` though, the computed width of the "80% wide" child will resolve to a mere `400px`. + +Computed styles provide information about the styles that are **ultimately assigned** to an element. Due to [CSS specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity) browsers will decide which CSS property value either defined in a CSS stylesheet or an inline style is most relevant and this value will also be reflected in the element's computed styles. + +The [getComputedStyle method](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle) will return an object containing these most relevant style values. In contrast to the object returned from `HTMLElement.style` the return value of `getComputedStyle` is read-only. + +Therefore the `getComputedStyle` method is the ideal candidate for asserting styles of an element in rendering tests: ```js {% raw %} @@ -184,14 +145,9 @@ module('Integration | Component | mainmatter-logo-tile', function (hooks) { ## Easy Style Assertions with qunit-dom -Now we know how we can write style-related tests for our automated test process -that assert that the expected styles are applied to elements on the web page. +Now we know how we can write style-related tests for our automated test process that assert that the expected styles are applied to elements on the web page. -But there's an even easier way to assert the computed styles of elements in your -**QUnit test suite**. Since -[v0.8.1](https://twitter.com/mainmatter/status/1065913669995978752) of -[qunit-dom](/blog/2017/10/24/high-level-assertions-with-qunit-dom) you can make -your tests truly ✨ +But there's an even easier way to assert the computed styles of elements in your **QUnit test suite**. Since [v0.8.1](https://twitter.com/mainmatter/status/1065913669995978752) of [qunit-dom](/blog/2017/10/24/high-level-assertions-with-qunit-dom) you can make your tests truly ✨ Check it [out](https://github.com/mainmatter/qunit-dom): @@ -205,8 +161,7 @@ or yarn add --dev qunit-dom ``` -In your rendering test you're now able to check for the component's style using -the `hasStyle` method: +In your rendering test you're now able to check for the component's style using the `hasStyle` method: ```js {% raw %} @@ -230,14 +185,10 @@ module('Integration | Component | mainmatter-logo-tile', function (hooks) { {% endraw %} ``` -You can read more about the usage of the `.hasStyle` method in the -[API documentation](https://github.com/mainmatter/qunit-dom/blob/master/API.md#hasStyle). +You can read more about the usage of the `.hasStyle` method in the [API documentation](https://github.com/mainmatter/qunit-dom/blob/master/API.md#hasStyle). --- -There are different ways to assert against inline styles and computed styles in -your application and if you're using Ember & QUnit, -[qunit-dom](https://github.com/mainmatter/qunit-dom) is your best bet to make -your style tests easy to write and read. +There are different ways to assert against inline styles and computed styles in your application and if you're using Ember & QUnit, [qunit-dom](https://github.com/mainmatter/qunit-dom) is your best bet to make your style tests easy to write and read. Questions? Suggestions? [Contact us!](/contact/) diff --git a/src/posts/2018-12-20-factories-best-practices.md b/src/posts/2018-12-20-factories-best-practices.md index 4b363a5894..599cab383c 100644 --- a/src/posts/2018-12-20-factories-best-practices.md +++ b/src/posts/2018-12-20-factories-best-practices.md @@ -3,61 +3,24 @@ title: "Factories best practices" authorHandle: geekygrappler tags: testing bio: "Senior Frontend Engineer" -description: - "Andy Brown introduces best practices for using factories in order to make - your colleagues' and your own future self's lives easier." +description: "Andy Brown introduces best practices for using factories in order to make your colleagues' and your own future self's lives easier." tagline: |

    Writing tests is like drinking beer 🍻. When you first try it, the taste is really quite unpalatable, but everyone else around you is doing it and they seem to be enjoying it. You've heard about all the benefits of it, people won't stop telling you how great it is, how it changed their lives for the better. Also there is a lot of peer pressure and judgement involved, don't be that dev... so you conceal your grimace and keep trying it, on a daily basis here at Mainmatter. And just like beer, in no time at all, on a long hot day, when you feel yourself tiring of writing all those features and tweaking all that CSS, you realise that what you need to relax is to write a good, concise, logical, cool and refreshing test. At least that's been my experience and I want to share a few tips for factories so that your tests are easy for your friends, colleagues, the next developer to read.

    --- ## AAA -Before I dive into factories, firstly I want to mention AAA: Arrange, Act, -Assert. I covered this paradigm over [here](/blog/2017/09/17/magic-test-data/), -and I still stand by it. It's the most important thing you can do to make your -tests straight forward and understandable for others. +Before I dive into factories, firstly I want to mention AAA: Arrange, Act, Assert. I covered this paradigm over [here](/blog/2017/09/17/magic-test-data/), and I still stand by it. It's the most important thing you can do to make your tests straight forward and understandable for others. ## Factories > Fixtures -Fixtures are hard coded data, a file with data representing a model in it, or -any data that your application needs. Factories generate data dynamically, using -functions, and can be called upon during the test with parameters passed to -manipulate to output data. - -I would strongly discourage the use of fixtures. There are many excellent posts -out there comparing factories and fixtures, and, apart from the ones that are -wrong, they all say that factories > fixtures 🎉. I want to focus on one -particular use case I've seen a few times, which often leads to the inclusion of -fixtures in a mostly factory based test suite. - -In most applications there is often one gnarly model. In ecommerce applications -it tends to be something like `order`. This will have many `products`, belong to -a `user`, may have some reference to a `payment` and `delivery`, maybe it will -have some kind of self referential relationship, or polymorphic relationship. -You get the picture, it's got a lot of stuff, it's grown over time to become and -all-encompassing monster and it _will_ make your head hurt to think about it. -It's often in these situtaion that we reach for a fixture, sometimes we even -copy and paste a response from our production API 😱. - -The full API response fixture is the worst kind of fixture and it is a code -smell. It means that rather than creating a declarative test that will help -future developers (and your future self) understand what parts of this model are -important for a particular test and how the model works, you get a 1,203 line -json file. If I ever see a fixture like this while fixing a broken test, I have -to replace it with a factory. I don't do this because I like creating extra work -for myself, believe me, I don't. I do it because I don't understand what -specific parts of that model were important to the test by looking at the -fixture. In order to fix the test I need to figure out how the model works. I -try to build a mental picture of the model and create the data for the test -using a factory (often many factories pulled together), so it's clear and -concise what parts of the `order` are required for the -`orders with multiple deliveries arriving on the same day, only show 1 estimated delivery date not multiple` -test. In this test (which is fantastically named), I can expect to see an -`order` factory which has a `delivery` factory with more than one delivery, but -all planned for the same day. All the other parts of the `order` model are -likely not relevant to this test, so don't include them, or leave them as the -defaults. Some pseudocode as we're so far into the post without a single line of -it. +Fixtures are hard coded data, a file with data representing a model in it, or any data that your application needs. Factories generate data dynamically, using functions, and can be called upon during the test with parameters passed to manipulate to output data. + +I would strongly discourage the use of fixtures. There are many excellent posts out there comparing factories and fixtures, and, apart from the ones that are wrong, they all say that factories > fixtures 🎉. I want to focus on one particular use case I've seen a few times, which often leads to the inclusion of fixtures in a mostly factory based test suite. + +In most applications there is often one gnarly model. In ecommerce applications it tends to be something like `order`. This will have many `products`, belong to a `user`, may have some reference to a `payment` and `delivery`, maybe it will have some kind of self referential relationship, or polymorphic relationship. You get the picture, it's got a lot of stuff, it's grown over time to become and all-encompassing monster and it _will_ make your head hurt to think about it. It's often in these situtaion that we reach for a fixture, sometimes we even copy and paste a response from our production API 😱. + +The full API response fixture is the worst kind of fixture and it is a code smell. It means that rather than creating a declarative test that will help future developers (and your future self) understand what parts of this model are important for a particular test and how the model works, you get a 1,203 line json file. If I ever see a fixture like this while fixing a broken test, I have to replace it with a factory. I don't do this because I like creating extra work for myself, believe me, I don't. I do it because I don't understand what specific parts of that model were important to the test by looking at the fixture. In order to fix the test I need to figure out how the model works. I try to build a mental picture of the model and create the data for the test using a factory (often many factories pulled together), so it's clear and concise what parts of the `order` are required for the `orders with multiple deliveries arriving on the same day, only show 1 estimated delivery date not multiple` test. In this test (which is fantastically named), I can expect to see an `order` factory which has a `delivery` factory with more than one delivery, but all planned for the same day. All the other parts of the `order` model are likely not relevant to this test, so don't include them, or leave them as the defaults. Some pseudocode as we're so far into the post without a single line of it. ```js {% raw %} @@ -89,11 +52,7 @@ test('orders with deliveries from different carriers arriving on the same day, o ## Fun fun factories 🏭 -This is the part where young me thinks old me is a boring loser. Don't give your -factories fun names 🙅‍♂️. Often with factory libraries you will be able to have a -default model, e.g. `user` and you'll be able to have named factories e.g. -`specialUser`. What is quite fun is to have themed names for your factories, for -example: +This is the part where young me thinks old me is a boring loser. Don't give your factories fun names 🙅‍♂️. Often with factory libraries you will be able to have a default model, e.g. `user` and you'll be able to have named factories e.g. `specialUser`. What is quite fun is to have themed names for your factories, for example: ```js {% raw %} @@ -116,14 +75,7 @@ Factory.define({ {% endraw %} ``` -Now while it's fun to have Game of Thrones characters in your testing code base, -it is a terrible practice. At the moment the difference between Jon and Rob is -quite clear, and if I was writing a test about inheritance of Winterfell, it -would be clear with a quick scan of the factory file, what the difference -between Jon and Rob is, regardless of whether I've watched GoT or not. However, -even though I know nothing about this ficticious GoT app, I can promise you one -thing, the model will grow with time and the list of attrs will start to grow -for both of our heroes. Let me give one scenario for what could happen: +Now while it's fun to have Game of Thrones characters in your testing code base, it is a terrible practice. At the moment the difference between Jon and Rob is quite clear, and if I was writing a test about inheritance of Winterfell, it would be clear with a quick scan of the factory file, what the difference between Jon and Rob is, regardless of whether I've watched GoT or not. However, even though I know nothing about this ficticious GoT app, I can promise you one thing, the model will grow with time and the list of attrs will start to grow for both of our heroes. Let me give one scenario for what could happen: ```js {% raw %} @@ -206,14 +158,7 @@ Factory.define({ {% endraw %} ``` -Now my example is a bit of fun, but my point is this: If you create wittily -themed named factories, the attributes they contain will be unclear to everyone -but you (and even to you on day 102). Often you will have a bare minimum number -of attributes required for a certain model, e.g. every user must have a name and -an email or the app will implode, and these things should live in the `default` -factory. If you need to modify the default, and admin users are a good example -of this, then keep the modification simple and make it obvious from the name -what properties are changing. +Now my example is a bit of fun, but my point is this: If you create wittily themed named factories, the attributes they contain will be unclear to everyone but you (and even to you on day 102). Often you will have a bare minimum number of attributes required for a certain model, e.g. every user must have a name and an email or the app will implode, and these things should live in the `default` factory. If you need to modify the default, and admin users are a good example of this, then keep the modification simple and make it obvious from the name what properties are changing. ```js {% raw %} @@ -232,21 +177,15 @@ Factory.define({ {% endraw %} ``` -But of course **you should not do this(!)**, even with sensible naming, because -it will become a dumping ground for each attribute a test requires if it -involves an admin user. +But of course **you should not do this(!)**, even with sensible naming, because it will become a dumping ground for each attribute a test requires if it involves an admin user. Which leads me onto my final topic. ## Declarative factories -Don't use named factories or traits, they're an antipattern\*. The admin user is -again a good example where you might be tempted to use one of these. If your -model is such that `isAdmin` boolean is all that is needed to make someone an -admin then your test should be. +Don't use named factories or traits, they're an antipattern\*. The admin user is again a good example where you might be tempted to use one of these. If your model is such that `isAdmin` boolean is all that is needed to make someone an admin then your test should be. -\* I think, I'm not really sure what an antipattern is, but humour -me. +\* I think, I'm not really sure what an antipattern is, but humour me. ```js {% raw %} @@ -263,15 +202,7 @@ test('Admin users are taken to the dashboard on login', async function(assert) { {% endraw %} ``` -This declarative factory use is slightly longer than `make('admin_user')` (👈 -named factory) or `make('user', 'isAdmin')` (👈 trait), but it's far superior, -like the difference between Jon 💘 and Rob 💀. Yes both the named factory and -the trait tell a reader that you're testing an admin (user), but the declarative -factory version used here also tells the reader how a user becomes an admin, -i.e. which properties are specifically important to adminship. Even if you -require a few more attributes to become an admin, I would still recommend -listing those attributes in the test, again informing any reader what attributes -are related to becoming an admin. +This declarative factory use is slightly longer than `make('admin_user')` (👈 named factory) or `make('user', 'isAdmin')` (👈 trait), but it's far superior, like the difference between Jon 💘 and Rob 💀. Yes both the named factory and the trait tell a reader that you're testing an admin (user), but the declarative factory version used here also tells the reader how a user becomes an admin, i.e. which properties are specifically important to adminship. Even if you require a few more attributes to become an admin, I would still recommend listing those attributes in the test, again informing any reader what attributes are related to becoming an admin. ```js {% raw %} @@ -291,43 +222,19 @@ test('Admin users are taken to the dashboard on login', async function(assert) { {% endraw %} ``` -If this list becomes quite long and it is used in a lot of places, and I mean -very long and _a lot_ of places, then maybe you could switch to a named factory -or trait, but you would need to police it quite strictly and ensure that nothing -else is added to that definition. What will happen is that developers add the -attribute they need for their specific test to the definition, rather than -writing it in the test, not realising that this attribute will now be created -unneccessarily in all tests using this named factory or trait. This won't break -those tests (usually), they'll be fine, but it leads to bloated factories and -developers unaware of which attributes are strictly relevant to the test they're -trying to fix. +If this list becomes quite long and it is used in a lot of places, and I mean very long and _a lot_ of places, then maybe you could switch to a named factory or trait, but you would need to police it quite strictly and ensure that nothing else is added to that definition. What will happen is that developers add the attribute they need for their specific test to the definition, rather than writing it in the test, not realising that this attribute will now be created unneccessarily in all tests using this named factory or trait. This won't break those tests (usually), they'll be fine, but it leads to bloated factories and developers unaware of which attributes are strictly relevant to the test they're trying to fix. ## Don't use Mirage for tests - Ember bonus topic 🐹 -Let me premise this section by saying I have always been a Mirage fanboy. I have -used it in a great number of my own personal projects for prototyping. I am not -throwing shade at the project or any of it's creators/contributors. I simply -have developed a strong opinion on where use of Mirage is appropriate. I prefer -using -[ember-data-factory-guy](https://github.com/danielspaniel/ember-data-factory-guy) -(Factory Guy) in tests. +Let me premise this section by saying I have always been a Mirage fanboy. I have used it in a great number of my own personal projects for prototyping. I am not throwing shade at the project or any of it's creators/contributors. I simply have developed a strong opinion on where use of Mirage is appropriate. I prefer using [ember-data-factory-guy](https://github.com/danielspaniel/ember-data-factory-guy) (Factory Guy) in tests. My arguments for not using Mirage: #### 1. Running a server for unit/integration tests -In my opinion the main use for Mirage is as a rapid prototyping tool. It can -also be used for testing, but by default, only testing in acceptance tests. -Mirage provides you with a Javascript server that runs in the browser and -intercepts API requests, responding to them before a network request is even -made, either those requests made by your application in `dev` or those made -during acceptance tests. +In my opinion the main use for Mirage is as a rapid prototyping tool. It can also be used for testing, but by default, only testing in acceptance tests. Mirage provides you with a Javascript server that runs in the browser and intercepts API requests, responding to them before a network request is even made, either those requests made by your application in `dev` or those made during acceptance tests. -If you want to use Mirage in testing, and you write more than acceptance tests -then you will need to use a -['hack' or 'workaround'](http://www.ember-cli-mirage.com/versions/v0.4.x/manually-starting-mirage/) -to manually start and stop the mirage server during integration and unit tests. -And you definitely should be writing integration and unit tests. +If you want to use Mirage in testing, and you write more than acceptance tests then you will need to use a ['hack' or 'workaround'](http://www.ember-cli-mirage.com/versions/v0.4.x/manually-starting-mirage/) to manually start and stop the mirage server during integration and unit tests. And you definitely should be writing integration and unit tests. #### 2. Test Clarity @@ -351,15 +258,9 @@ test('The page shows me all the foos', async function (assert) { {% endraw %} ``` -It's not bad, we are at least following AAA, but there is a step that is -unclear, between adding foos to the server and them appearing on the page. The -details of that are contained in Mirage's config file. Take a look at the -equivalent test with Factory Guy for the data and -[Pretender](https://github.com/pretenderjs/pretender) for mocking API calls -(Mirage uses this under the hood\*). +It's not bad, we are at least following AAA, but there is a step that is unclear, between adding foos to the server and them appearing on the page. The details of that are contained in Mirage's config file. Take a look at the equivalent test with Factory Guy for the data and [Pretender](https://github.com/pretenderjs/pretender) for mocking API calls (Mirage uses this under the hood\*). -\*Factory Guy also uses pretender under the hood to mock API calls for -certain helper functions that you can use with Factory Guy if you want. +\*Factory Guy also uses pretender under the hood to mock API calls for certain helper functions that you can use with Factory Guy if you want. ```js {% raw %} @@ -383,12 +284,7 @@ test('The page shows me all the foos', async function (assert) { {% endraw %} ``` -Here we're being a little more explicit in the test. Put yourself in the shoes -of a junior developer. The Mirage test shows me _more_ Ember magic, even though -they promised me there is a lot less magic now than there used to be in 2012. -The factory test is more explicit, it tells us that visiting `/foos` url will -trigger a `GET` request to `/api/foos` and we return a list of foos. It's a -small difference but will help a junior to realise what +Here we're being a little more explicit in the test. Put yourself in the shoes of a junior developer. The Mirage test shows me _more_ Ember magic, even though they promised me there is a lot less magic now than there used to be in 2012. The factory test is more explicit, it tells us that visiting `/foos` url will trigger a `GET` request to `/api/foos` and we return a list of foos. It's a small difference but will help a junior to realise what ```js {% raw %} @@ -402,22 +298,9 @@ is actually doing. #### 3. Duplication & Complexity -Mirage builds a server, with a database and its own ORM (Object-Relational -Mapping). This is quite a complex and interesting set up. Mirage attempts to -extract away this complexity and provide you with a simple API in order to -prototype and test, which it does quite well. Unfortunately one of the drawbacks -of this complexity is that Mirage uses a system of factory and model files to -generate your data for the server. The model files are used to declare -relationships and the factory files used to create default values or fake data. - -Factory Guy doesn't need to have a model file because it is much simpler. It -creates ember data models or JSON objects and returns them directly in tests -without creating a server. Factory Guy therefore uses your app's model files -along with its factory files and doesn't require any extra model files. Mirage -creates its own set of models on the 'server' to return in API calls and be -turned into ember data models by your app. The duplication and extra complexity -may appear minor, but I have often spent serious time debugging Mirage when its -ORM has not produced the data exactly how I expected. +Mirage builds a server, with a database and its own ORM (Object-Relational Mapping). This is quite a complex and interesting set up. Mirage attempts to extract away this complexity and provide you with a simple API in order to prototype and test, which it does quite well. Unfortunately one of the drawbacks of this complexity is that Mirage uses a system of factory and model files to generate your data for the server. The model files are used to declare relationships and the factory files used to create default values or fake data. + +Factory Guy doesn't need to have a model file because it is much simpler. It creates ember data models or JSON objects and returns them directly in tests without creating a server. Factory Guy therefore uses your app's model files along with its factory files and doesn't require any extra model files. Mirage creates its own set of models on the 'server' to return in API calls and be turned into ember data models by your app. The duplication and extra complexity may appear minor, but I have often spent serious time debugging Mirage when its ORM has not produced the data exactly how I expected. ## Conclusion @@ -425,5 +308,4 @@ I've been told it is always good to finish with a strong conclusion. ![Strong gif](/assets/images/posts/2018-12-20-factories-best-practices/strong.gif) -I hope you enjoyed this post and will start using factories over fixtures and -using named factories / traits more sparingly. +I hope you enjoyed this post and will start using factories over fixtures and using named factories / traits more sparingly. diff --git a/src/posts/2019-02-11-ember-js-film-berlin.md b/src/posts/2019-02-11-ember-js-film-berlin.md index 2206306fb6..8e81f847a0 100644 --- a/src/posts/2019-02-11-ember-js-film-berlin.md +++ b/src/posts/2019-02-11-ember-js-film-berlin.md @@ -3,9 +3,7 @@ title: "Ember.js: The Documentary - Berlin Screening" authorHandle: mrmrcoleman tags: ember bio: "Communications and Community Outreach Specialist" -description: - 'Mark Coleman announces the screening of "Ember.js: The Documentary" in - Berlin, Feb. 11th 2019.' +description: 'Mark Coleman announces the screening of "Ember.js: The Documentary" in Berlin, Feb. 11th 2019.' tagline: |

    Following on from last week's premiere in Amsterdam the new HoneyPot film 'Ember: A Mini Documentary' will be shown in Berlin this evening (2019-02-11).

    The film is a deep dive into the world of Ember.js and includes an interview with our CEO Marco Otte-Witte. After the screening Jessica Jordan from Mainmatter will present 'Everything They Didn't Tell You About the Ember Community' which will be followed by a Q&A.

    --- @@ -17,15 +15,11 @@ Here's the agenda from the meetup page: - 18.30 - 19.00: Doors open + drinks & snacks! - 19.00 - 19.15: Intro from documentary makers Honeypot - 19.15 - 19.45: Screening of Ember.js: The Documentary -- 19.45 - 20.15: Jessica Jordan: Everything They Didn't Tell You About the Ember - Community (+Q&A) +- 19.45 - 20.15: Jessica Jordan: Everything They Didn't Tell You About the Ember Community (+Q&A) - 20.15 - 22.00: Networking, mingling, drinking and partying. -Grab a spot while you still can: -[https://www.meetup.com/Honeypot_Berlin/events/258352778/](https://www.meetup.com/Honeypot_Berlin/events/258352778/) +Grab a spot while you still can: [https://www.meetup.com/Honeypot_Berlin/events/258352778/](https://www.meetup.com/Honeypot_Berlin/events/258352778/) -Check the trailer here: -[https://www.youtube.com/watch?v=V0AC3Z1WIcc](https://www.youtube.com/watch?v=V0AC3Z1WIcc) +Check the trailer here: [https://www.youtube.com/watch?v=V0AC3Z1WIcc](https://www.youtube.com/watch?v=V0AC3Z1WIcc) -We'd like to thank HoneyPot for making this film and we hope the evening is a -great success! +We'd like to thank HoneyPot for making this film and we hope the evening is a great success! diff --git a/src/posts/2019-03-13-elixir-umbrella-mox.md b/src/posts/2019-03-13-elixir-umbrella-mox.md index 6235c9a018..b377885191 100644 --- a/src/posts/2019-03-13-elixir-umbrella-mox.md +++ b/src/posts/2019-03-13-elixir-umbrella-mox.md @@ -3,51 +3,27 @@ title: Elixir Umbrella Applications and Testing with Mox authorHandle: niklas_long tags: elixir bio: "Backend Engineer, author of Breethe API" -description: - "Niklas Long shows how Elixir Umbrella applications not only improve the - organization of a code base but also allow for an improved testing setup." +description: "Niklas Long shows how Elixir Umbrella applications not only improve the organization of a code base but also allow for an improved testing setup." tagline: |

    What's the big deal with Elixir umbrellas?

    An Elixir umbrella is a container for mix apps; a structure useful to separate the application's concerns as each app is contained within its own mix project.

    Why is this cool?

    Because it's like Lego and Lego is cool.

    Who's Mox you ask?

    Mox is cool too... Let's dive in!

    --- ## Breethe -Throughout this post, we will use [Breethe](https://breethe.app) as an example. -Breethe is a Progressive Web App that gives users quick and easy access to air -quality data for locations around the world. Pollution and global warming are -getting worse. The first step to understanding and solving these problems is to -raise awareness by providing everyone with easy access to accurate data. +Throughout this post, we will use [Breethe](https://breethe.app) as an example. Breethe is a Progressive Web App that gives users quick and easy access to air quality data for locations around the world. Pollution and global warming are getting worse. The first step to understanding and solving these problems is to raise awareness by providing everyone with easy access to accurate data. ![Video of the Breethe PWA](/assets/images/posts/2018-07-24-from-spa-to-pwa/breethe-video.gif) -The application is [open source](https://github.com/mainmatter/breethe-server) -and we encourage everyone interested to look through the source for reference. -The server for this application was implemented using an -[Elixir](https://elixir-lang.org) umbrella application which will be the focus -of this post. The client for Breethe was built with -[Glimmer.js](http://glimmerjs.com), which we discussed in previous posts: +The application is [open source](https://github.com/mainmatter/breethe-server) and we encourage everyone interested to look through the source for reference. The server for this application was implemented using an [Elixir](https://elixir-lang.org) umbrella application which will be the focus of this post. The client for Breethe was built with [Glimmer.js](http://glimmerjs.com), which we discussed in previous posts: - [From SPA to PWA](/blog/2018/07/24/from-spa-to-pwa) - [Building a PWA with Glimmer.js](/blog/2018/07/03/building-a-pwa-with-glimmer-js/) ## Umbrella applications and separating concerns -When we first started building Breethe, we asked ourselves a simple question -which would dictate the structure of the application and our motivation for -using an umbrella app to organise our code. This question was: what if we want -to change our air quality data provider? It turns out this wasn't just -speculation as we are now in the process of doing just that and our decision to -use an umbrella app will make the process tremendously easy. - -Using an umbrella allowed us to split our server into two very distinct -applications, communicating together by way of rigorously defined APIs. The -first application functions as the data handling entity of the project - named -_breethe_ (see below). It communicates with the air quality data provider (a -third-party API) to gather the data, then processes and caches it for future -use. The second application in the umbrella is the web interface built with -Phoenix - named _breethe_web_. It requests the data from the first application, -serializes it to JSON and delivers the payload to the client in compliance with -the [JSON:API specification](https://jsonapi.org/). +When we first started building Breethe, we asked ourselves a simple question which would dictate the structure of the application and our motivation for using an umbrella app to organise our code. This question was: what if we want to change our air quality data provider? It turns out this wasn't just speculation as we are now in the process of doing just that and our decision to use an umbrella app will make the process tremendously easy. + +Using an umbrella allowed us to split our server into two very distinct applications, communicating together by way of rigorously defined APIs. The first application functions as the data handling entity of the project - named _breethe_ (see below). It communicates with the air quality data provider (a third-party API) to gather the data, then processes and caches it for future use. The second application in the umbrella is the web interface built with Phoenix - named _breethe_web_. It requests the data from the first application, serializes it to JSON and delivers the payload to the client in compliance with the [JSON:API specification](https://jsonapi.org/). Here's an overview of the umbrella structure used for Breethe: @@ -69,18 +45,9 @@ apps └── test ``` -We have defined a clear boundary between the business logic and the webserver. -This is cool because the umbrella becomes modular like Lego and who doesn't like -Lego? Need to change the air quality data provider? No problem, simply change -the data application, leaving the webserver untouched as long as the data app -continues to implement the same interface. The same would work the other way -round if we wanted to change the webserver. +We have defined a clear boundary between the business logic and the webserver. This is cool because the umbrella becomes modular like Lego and who doesn't like Lego? Need to change the air quality data provider? No problem, simply change the data application, leaving the webserver untouched as long as the data app continues to implement the same interface. The same would work the other way round if we wanted to change the webserver. -However, for this approach to work well, the APIs used to communicate between -the different applications in the umbrella need to be carefully defined. We want -to keep the interfaces as little as possible to keep complexity contained. As an -example, here are the publicly available functions on the _breethe_ app in the -umbrella: +However, for this approach to work well, the APIs used to communicate between the different applications in the umbrella need to be carefully defined. We want to keep the interfaces as little as possible to keep complexity contained. As an example, here are the publicly available functions on the _breethe_ app in the umbrella: ```elixir # apps/breethe/lib/breethe.ex @@ -93,33 +60,13 @@ def search_locations(lat, lon), do: # ... def search_measurements(location_id), do: # ... ``` -Equally, these are the only functions the Phoenix web app (or any other app in -the umbrella) can call on the _breethe_ app. These principles are of course not -only applicable at the top level of the application but also within its internal -logical contexts. For example, within the _breethe_ app, we have isolated the -functions explicitly making requests to third-party APIs and abstracted them -away behind an interface. This, again, reduces complexity and facilitates -testing as we can isolate the different components of the business logic. This -philosophy lends itself very well to being tested using Mox. +Equally, these are the only functions the Phoenix web app (or any other app in the umbrella) can call on the _breethe_ app. These principles are of course not only applicable at the top level of the application but also within its internal logical contexts. For example, within the _breethe_ app, we have isolated the functions explicitly making requests to third-party APIs and abstracted them away behind an interface. This, again, reduces complexity and facilitates testing as we can isolate the different components of the business logic. This philosophy lends itself very well to being tested using Mox. ## Testing domains independently using Mox -[Mox](https://github.com/plataformatec/mox), as the name suggests, is a library -that defines mocks bound to specific behaviours. A behaviour is a set of -function signatures that must be implemented by a module. Consequently, Mox -guarantees the mocks for a module be consistent with the original functions they -replace during testing. This rigidity makes the tests more maintainable and -requires that the behaviours for each module be meticulously defined; precisely -the qualities desired when implementing the APIs within our umbrella. - -For example, let's consider mocking the public API for the _breethe_ application -when testing _breethe_web_. As the bridge between the two is only composed of -the four functions shown in the previous section, mocking the _breethe_ -application's public interface when testing the webserver only requires mocking -those four functions. Naturally, this is only reasonable if we separately test -the _breethe_ application in full, from interface to database. Crucially, it is -the singularity of the interface which allows this degree of separation between -the two applications in the umbrella both in testing and in production. +[Mox](https://github.com/plataformatec/mox), as the name suggests, is a library that defines mocks bound to specific behaviours. A behaviour is a set of function signatures that must be implemented by a module. Consequently, Mox guarantees the mocks for a module be consistent with the original functions they replace during testing. This rigidity makes the tests more maintainable and requires that the behaviours for each module be meticulously defined; precisely the qualities desired when implementing the APIs within our umbrella. + +For example, let's consider mocking the public API for the _breethe_ application when testing _breethe_web_. As the bridge between the two is only composed of the four functions shown in the previous section, mocking the _breethe_ application's public interface when testing the webserver only requires mocking those four functions. Naturally, this is only reasonable if we separately test the _breethe_ application in full, from interface to database. Crucially, it is the singularity of the interface which allows this degree of separation between the two applications in the umbrella both in testing and in production. Let's take a look at the controller action for a location search by id: @@ -143,9 +90,7 @@ The interesting part is in the call to the _breethe_ application: |> @source.get_location() ``` -The reason we're using the `@source` module attribute is to be able to switch -between the mock and the real function defined on the _breethe_ application; -this is defined in the config files: +The reason we're using the `@source` module attribute is to be able to switch between the mock and the real function defined on the _breethe_ application; this is defined in the config files: ```elixir # config/config.exs @@ -155,15 +100,9 @@ config :breethe_web, source: Breethe config :breethe_web, source: Breethe.Mock ``` -By default `@source` points to the `Breethe` module - the _breethe_ -application's public API used in production and development. During testing it -switches to the `Breethe.Mock` module, which defines the mocks. +By default `@source` points to the `Breethe` module - the _breethe_ application's public API used in production and development. During testing it switches to the `Breethe.Mock` module, which defines the mocks. -The test for this controller action is meant to check two things. Firstly, that -the router redirects the connection to the appropriate controller action. -Secondly, that the controller action processes the call and queries the -_breethe_ application correctly using the right function defined on the latter's -API - in this case `get_location(location_id)`. +The test for this controller action is meant to check two things. Firstly, that the router redirects the connection to the appropriate controller action. Secondly, that the controller action processes the call and queries the _breethe_ application correctly using the right function defined on the latter's API - in this case `get_location(location_id)`. ```elixir # apps/breethe_web/test/breethe_web/controllers/location_controller_test.exs @@ -187,28 +126,20 @@ end I've broken it down into its four main parts: -1. It sets up the test data with - [ExMachina](https://github.com/thoughtbot/ex_machina).

    +1. It sets up the test data with [ExMachina](https://github.com/thoughtbot/ex_machina).

    ```elixir location = insert(:location, measurements: []) ``` -2. It defines a mock in the `Breethe.Mock` module for the - `get_location(location_id)` function defined in the _breethe_ application's - API and sets the return value to the location we created at 1. The mock is - passed as an argument to the `expect` clause which verifies the mock is - executed during the test (instead of the real function).

    +2. It defines a mock in the `Breethe.Mock` module for the `get_location(location_id)` function defined in the _breethe_ application's API and sets the return value to the location we created at 1. The mock is passed as an argument to the `expect` clause which verifies the mock is executed during the test (instead of the real function).

    ```elixir Breethe.Mock |> expect(:get_location, fn _location_id -> location end) ``` -As long as we’ve established the callback in the behaviour implemented by the -Breethe module, we don’t need to explicitly define the Breethe.Mock module (Mox -creates it). Here's the callback for this particular function (for reference, it -isn't coded in the test). +As long as we’ve established the callback in the behaviour implemented by the Breethe module, we don’t need to explicitly define the Breethe.Mock module (Mox creates it). Here's the callback for this particular function (for reference, it isn't coded in the test). ```elixir # apps/breethe/lib/breethe.ex @@ -217,16 +148,13 @@ defmodule Behaviour do end ``` -3. It builds a connection and makes a call to the webserver's route designed to - handle a location search by id.

    +3. It builds a connection and makes a call to the webserver's route designed to handle a location search by id.

    ```elixir conn = get(build_conn(), "api/locations/#{location.id}", []) ``` -4. It tests the JSON response (abridged for brevity) is correct by asserting on - the attributes of the location created in 1. and returned from the mock in 2. -

    +4. It tests the JSON response (abridged for brevity) is correct by asserting on the attributes of the location created in 1. and returned from the mock in 2.

    ```elixir assert json_response(conn, 200) == %{ @@ -236,26 +164,14 @@ assert json_response(conn, 200) == %{ } ``` -Using mocks greatly simplifies the testing process. Each test can be smaller and -more specific. Each test is faster as we are not making calls to the database or -external systems; we are only running the anonymous functions that define the -mocks. For instance, the mock in our example above only executes: +Using mocks greatly simplifies the testing process. Each test can be smaller and more specific. Each test is faster as we are not making calls to the database or external systems; we are only running the anonymous functions that define the mocks. For instance, the mock in our example above only executes: ```elixir fn _location_id -> location end ``` -Finally, each mock is self-contained in the test defining it and the callback -insures the mock matches the original function signature. The result is robust, -fast and modularised tests. +Finally, each mock is self-contained in the test defining it and the callback insures the mock matches the original function signature. The result is robust, fast and modularised tests. ## Conclusion -Elixir umbrella apps shine when structuring projects containing clear boundaries -between their constituent parts. The philosophy they implement deeply resembles -that of functional programming (and Lego), where small building blocks combine -into a larger whole. It is however important to be precise when defining the -internal APIs of the application as they act as the glue holding everything -together. Lastly, Mox is a wonderful tool for testing. Not only does it make -mocking APIs very simple and elegant, it also encourages best practices such as -defining behaviours to keep the code consistent and robust. +Elixir umbrella apps shine when structuring projects containing clear boundaries between their constituent parts. The philosophy they implement deeply resembles that of functional programming (and Lego), where small building blocks combine into a larger whole. It is however important to be precise when defining the internal APIs of the application as they act as the glue holding everything together. Lastly, Mox is a wonderful tool for testing. Not only does it make mocking APIs very simple and elegant, it also encourages best practices such as defining behaviours to keep the code consistent and robust. diff --git a/src/posts/2019-03-29-qonto-project.md b/src/posts/2019-03-29-qonto-project.md index 82240f802c..14085c989a 100644 --- a/src/posts/2019-03-29-qonto-project.md +++ b/src/posts/2019-03-29-qonto-project.md @@ -3,49 +3,23 @@ title: Qonto project authorHandle: mrmrcoleman tags: mainmatter bio: "Communications and Community Outreach Specialist" -description: - 'Mark Coleman announces our new client Qonto, a Paris based VC funded Fintech - startup who are "the ideal banking alternative for freelancers, startups and - SMEs."' +description: 'Mark Coleman announces our new client Qonto, a Paris based VC funded Fintech startup who are "the ideal banking alternative for freelancers, startups and SMEs."' tagline: |

    We're very pleased to announce that we've started working with Qonto, a Paris based VC funded Fintech startup who are "the ideal banking alternative for freelancers, startups and SMEs."

    --- ![Qonto Logo](/assets/images/posts/2019-03-29-qonto-project/qonto-logo.png) -Qonto reached out to Mainmatter looking for a combination of added engineering -power and outside expertise to help their in-house engineers improve, we call -this [Team reinforcement](/services/team-reinforcement/). - -This method of working sees our technology experts merge with our client's -in-house engineering teams to share their know-how. Mainmatter engineers -spearhead and guide new development initiatives while establishing best -practices and transferring knowledge to in-house engineers on the job via -reviews and pairing sessions. - -Just as with previous Team reinforcement projects like -[trainline](/cases/trainline/) this approach brings "double value for the -client" says simlpabs CEO Marco Otte-Witte, "short term value is added by the -client immediately gaining more engineering power, but additional long term -value is added through improved architecture, code quality, processes and -leveled up in-house engineers." - -Mainmatter engineers Tobias Bieniek and Ricardo Mendes who are both Ember.js -core members are working on the Qonto project. They started by analyzing Qonto's -code and found the templates were using the rather antiquated Emblem.js which -nobody was really happy with but was difficult to migrate away from. To tackle -this Tobias created and open sourced -[emblem-migrator](https://github.com/mainmatter/emblem-migrator/) which Qonto -and all other Emblem.js users can now use. - -Next Mainmatter engineers identified that Qonto's test suite speed was impeding -progress. They showed Qonto's engineers how to analyse the underlying causes and -then half the testing time. - -Both migrating away from Emblem.js and halving the test suite running time -happened in the first week! - -Mainmatter CEO Marco Otte-Witte says "I'm really pleased that Mainmatter have -been able to add so much value in such a short amount of time proving that our -Team reinforcement method works. We're all looking forward to continuing the -project and helping Qonto to succeed in their highly competitive market." +Qonto reached out to Mainmatter looking for a combination of added engineering power and outside expertise to help their in-house engineers improve, we call this [Team reinforcement](/services/team-reinforcement/). + +This method of working sees our technology experts merge with our client's in-house engineering teams to share their know-how. Mainmatter engineers spearhead and guide new development initiatives while establishing best practices and transferring knowledge to in-house engineers on the job via reviews and pairing sessions. + +Just as with previous Team reinforcement projects like [trainline](/cases/trainline/) this approach brings "double value for the client" says simlpabs CEO Marco Otte-Witte, "short term value is added by the client immediately gaining more engineering power, but additional long term value is added through improved architecture, code quality, processes and leveled up in-house engineers." + +Mainmatter engineers Tobias Bieniek and Ricardo Mendes who are both Ember.js core members are working on the Qonto project. They started by analyzing Qonto's code and found the templates were using the rather antiquated Emblem.js which nobody was really happy with but was difficult to migrate away from. To tackle this Tobias created and open sourced [emblem-migrator](https://github.com/mainmatter/emblem-migrator/) which Qonto and all other Emblem.js users can now use. + +Next Mainmatter engineers identified that Qonto's test suite speed was impeding progress. They showed Qonto's engineers how to analyse the underlying causes and then half the testing time. + +Both migrating away from Emblem.js and halving the test suite running time happened in the first week! + +Mainmatter CEO Marco Otte-Witte says "I'm really pleased that Mainmatter have been able to add so much value in such a short amount of time proving that our Team reinforcement method works. We're all looking forward to continuing the project and helping Qonto to succeed in their highly competitive market." diff --git a/src/posts/2019-04-05-spas-pwas-and-ssr.md b/src/posts/2019-04-05-spas-pwas-and-ssr.md index d9750b541a..2ae757dc6a 100644 --- a/src/posts/2019-04-05-spas-pwas-and-ssr.md +++ b/src/posts/2019-04-05-spas-pwas-and-ssr.md @@ -3,9 +3,7 @@ title: "SPAs, PWAs and SSR" authorHandle: marcoow tags: javascript bio: "Founding Director of Mainmatter, author of Ember Simple Auth" -description: - "Marco Otte-Witte dives deep into different approaches for building web apps - like SPAs, PWAs, SSR and how they all can be combined for the best result." +description: "Marco Otte-Witte dives deep into different approaches for building web apps like SPAs, PWAs, SSR and how they all can be combined for the best result." og: image: /assets/images/posts/2019-04-05-spas-pwas-and-ssr/og-image.jpg tagline: | @@ -14,218 +12,87 @@ tagline: | ## Desktop-grade apps -Modern websites are in many cases not really websites anymore, but in fact full -blown apps with desktop-grade feature sets and user experiences that happen to -run in a browser as opposed to standalone apps. While the much-loved -[Spacejam Website](https://www.spacejam.com/archive/spacejam/movie/jam.htm) was -a pretty standard page in terms of interactivity and design only about 2 decades -ago +Modern websites are in many cases not really websites anymore, but in fact full blown apps with desktop-grade feature sets and user experiences that happen to run in a browser as opposed to standalone apps. While the much-loved [Spacejam Website](https://www.spacejam.com/archive/spacejam/movie/jam.htm) was a pretty standard page in terms of interactivity and design only about 2 decades ago ![Screenshot of the Spacejam Website](/assets/images/posts/2019-03-16-spas-pwas-and-ssr/spacejam.png#@600-1200) -we can now go to [Google Maps](https://www.google.com/maps), zoom and rotate the -earth in 3D space, measure distances between arbitrary points and have a look at -our neighbor's backyard: +we can now go to [Google Maps](https://www.google.com/maps), zoom and rotate the earth in 3D space, measure distances between arbitrary points and have a look at our neighbor's backyard: ![Video of Google Maps](/assets/images/posts/2019-03-16-spas-pwas-and-ssr/maps.gif) -All of this functionality, interactivity and visual appeal comes at a cost -though, mainly in the the form of JavaScript code. The median size of JavaScript -used on pages across the Internet is now -[ca. 400KB on the desktop and ca. 360KB on mobile devices](https://httparchive.org/reports/state-of-javascript), -an increase of ca. 36% and ca. 50% respectively over the past 3 years. All of -this JavaScript not only has to be loaded via often spotty connections but also -parsed, compiled and executed - often on mobile devices that are far less -powerful than the average desktop or notebook computer (have a look at -[Addy Osmani's in-depth post on the matter](https://medium.com/@addyosmani/the-cost-of-javascript-in-2018-7d8950fbb5d4) -for more details). - -What all this leads to is that for many of these highly-interactive, -feature-rich and shiny apps that are being built today, the first impression -that users get is often this: +All of this functionality, interactivity and visual appeal comes at a cost though, mainly in the the form of JavaScript code. The median size of JavaScript used on pages across the Internet is now [ca. 400KB on the desktop and ca. 360KB on mobile devices](https://httparchive.org/reports/state-of-javascript), an increase of ca. 36% and ca. 50% respectively over the past 3 years. All of this JavaScript not only has to be loaded via often spotty connections but also parsed, compiled and executed - often on mobile devices that are far less powerful than the average desktop or notebook computer (have a look at [Addy Osmani's in-depth post on the matter](https://medium.com/@addyosmani/the-cost-of-javascript-in-2018-7d8950fbb5d4) for more details). + +What all this leads to is that for many of these highly-interactive, feature-rich and shiny apps that are being built today, the first impression that users get is often this: ![Video of a loading JS app](/assets/images/posts/2019-03-16-spas-pwas-and-ssr/loading.gif) ## SPAs -While JavaScript-heavy apps can be slow to start initially, the big benefit of -the Single Page App approach is that once the application has started up in the -browser, it is running continuously and handles route changes in the browser so -that no subsequent page loads are necessary — SPAs trade a slow initial -load for fast or often immediate subsequent route changes. +While JavaScript-heavy apps can be slow to start initially, the big benefit of the Single Page App approach is that once the application has started up in the browser, it is running continuously and handles route changes in the browser so that no subsequent page loads are necessary — SPAs trade a slow initial load for fast or often immediate subsequent route changes. -The initial response though that delivers the user's first impression will often -be either empty or just a basic loading state as shown above. Only after the -application's JavaScript has been loaded, parsed, compiled and executed, can the -application start up and render anything meaningful on the screen. This results -in relatively slow _time to first meaningful paint_ (TTFMP) and _time to -interactive_ (TTI) metrics. +The initial response though that delivers the user's first impression will often be either empty or just a basic loading state as shown above. Only after the application's JavaScript has been loaded, parsed, compiled and executed, can the application start up and render anything meaningful on the screen. This results in relatively slow _time to first meaningful paint_ (TTFMP) and _time to interactive_ (TTI) metrics. #### TTFMP: Time to first meaningful paint -This is the time when the browser can first paint any **meaningful** content on -the screen. While the time to first paint metric simply measures the first time -**anything** is painted (which would be when the loading spinner is painted in -the above example), for an SPA the time to first **meaningful** paint only -occurs once the app has started and the actual UI is painted on the screen. +This is the time when the browser can first paint any **meaningful** content on the screen. While the time to first paint metric simply measures the first time **anything** is painted (which would be when the loading spinner is painted in the above example), for an SPA the time to first **meaningful** paint only occurs once the app has started and the actual UI is painted on the screen. #### TTI: Time to interactive -This is the time when the app is first usable and able to react to user inputs. -In the above example of the SPA, time to interactive and time to first -meaningful paint happen at the same time which is when the app has fully started -up, has painted the UI on screen and is waiting for user input. +This is the time when the app is first usable and able to react to user inputs. In the above example of the SPA, time to interactive and time to first meaningful paint happen at the same time which is when the app has fully started up, has painted the UI on screen and is waiting for user input. ## The App Shell Model -One popular approach for improving the startup experience of JavaScript-heavy -applications is called the -[App Shell Model](https://developers.google.com/web/fundamentals/architecture/app-shell). -The idea behind this concept is that instead of responding to the user's first -request with an empty HTML document with only some script tags and maybe a -loading spinner, the server would respond with the minimal set of code that is -necessary for rendering the app's minimal UI and making it interactive. In most -cases, that would be the visual framework of the app's main blocks and some -barebones functionality associated to that (e.g. a working slideout menu without -the individual menu items actually being functional). - -Although this does not improve the app's _TTFMP_ or _TTI_, at least it gives the -user a first visual impression of what the app will look like once it has -started up. Of course the app shell can be cached in the browser using a service -worker so that for subsequent visits it can be served from that instantly. +One popular approach for improving the startup experience of JavaScript-heavy applications is called the [App Shell Model](https://developers.google.com/web/fundamentals/architecture/app-shell). The idea behind this concept is that instead of responding to the user's first request with an empty HTML document with only some script tags and maybe a loading spinner, the server would respond with the minimal set of code that is necessary for rendering the app's minimal UI and making it interactive. In most cases, that would be the visual framework of the app's main blocks and some barebones functionality associated to that (e.g. a working slideout menu without the individual menu items actually being functional). + +Although this does not improve the app's _TTFMP_ or _TTI_, at least it gives the user a first visual impression of what the app will look like once it has started up. Of course the app shell can be cached in the browser using a service worker so that for subsequent visits it can be served from that instantly. ## Back to SSR -The only really effective solution though for solving the problem of the -meaningless initial UI - be it an empty page, a loading indicator or an app -shell - is to leverage server-side rendering and respond with the full UI or -something that's close to it for the initial request. - -Of course it wouldn't be advisable to go back to classic server-side rendered -websites completely, dropping all of the benefits that Single Page Apps come -with (instance page transitions once the app has started, rich user interfaces -that would be almost impossible to build with server side rendering, etc.) A -better approach is to run the same single page app that is shipped to the -browser on the server side as well as follows: - -- the server responds to `GET` requests for all routes the single page app - supports -- once a request comes in, the server constructs an application state from the - request path and potentially additional data like a session cookie and injects - that into the app -- it then executes the app and renders the app's UI into a string, leveraging - libraries like [SimpleDOM](https://github.com/ember-fastboot/simple-dom) or - [jsdom](https://github.com/jsdom/jsdom) +The only really effective solution though for solving the problem of the meaningless initial UI - be it an empty page, a loading indicator or an app shell - is to leverage server-side rendering and respond with the full UI or something that's close to it for the initial request. + +Of course it wouldn't be advisable to go back to classic server-side rendered websites completely, dropping all of the benefits that Single Page Apps come with (instance page transitions once the app has started, rich user interfaces that would be almost impossible to build with server side rendering, etc.) A better approach is to run the same single page app that is shipped to the browser on the server side as well as follows: + +- the server responds to `GET` requests for all routes the single page app supports +- once a request comes in, the server constructs an application state from the request path and potentially additional data like a session cookie and injects that into the app +- it then executes the app and renders the app's UI into a string, leveraging libraries like [SimpleDOM](https://github.com/ember-fastboot/simple-dom) or [jsdom](https://github.com/jsdom/jsdom) - that string is then served as the response to the browser's initial request -- the pre-rendered response still contains all ` ``` -We'll need only a "from" and a "to" keyframe for now. The easing we set will -define the timing function used to interpolate between the keyframes. For now, -we will use the most basic one: "linear". +We'll need only a "from" and a "to" keyframe for now. The easing we set will define the timing function used to interpolate between the keyframes. For now, we will use the most basic one: "linear". -In addition to that there's some useful timing related functionality on the -animation instance we can use. +In addition to that there's some useful timing related functionality on the animation instance we can use. ```javascript // our animation instance @@ -199,8 +146,7 @@ With these building blocks we can start creating more complex animations. ### Moving an element around -Let's create an animation which applies a CSS transform to move the element from -one position to another. +Let's create an animation which applies a CSS transform to move the element from one position to another. ```javascript element.animate( @@ -212,15 +158,11 @@ element.animate( ); ``` -This will transform the element 100 pixels to the right from its original -position in 1 second with a linear timing function. When the animation is done, -its effects on the element are automatically removed. +This will transform the element 100 pixels to the right from its original position in 1 second with a linear timing function. When the animation is done, its effects on the element are automatically removed. ![Basic move animation](/assets/images/posts/2021-01-29-web-animations-intro/video1.mp4#video) -Like with CSS animations we need to specify a fill option to specify in what way -we want the animation's effects to be retained. We can specify `fill: forwards` -so our final state is retained. +Like with CSS animations we need to specify a fill option to specify in what way we want the animation's effects to be retained. We can specify `fill: forwards` so our final state is retained. ```javascript element.animate( @@ -233,38 +175,21 @@ element.animate( ); ``` -Our animation now behaves as we would expect and retains the styles specified in -the final keyframe. +Our animation now behaves as we would expect and retains the styles specified in the final keyframe. ![Basic move animation that retains final state](/assets/images/posts/2021-01-29-web-animations-intro/video2.mp4#video) -Alternatively the `animation.commitStyles()` feature can be used to put the -current animation state in the DOM as inline styles. The animation itself can -then safely be cancelled so the browser can free up the resources it consumes. +Alternatively the `animation.commitStyles()` feature can be used to put the current animation state in the DOM as inline styles. The animation itself can then safely be cancelled so the browser can free up the resources it consumes. ### Cancelling and resuming an animation -Cancellation is an important part of real-world animations. Animations take time -to complete and in that time the user might have interacted with the page in a -way where the running animation does not make sense anymore. In most cases when -an animation is interrupted, another animation will be started. This could be -the same animation in reverse or an entirely different one. In any case we will -want to start the animation from the element's current state. +Cancellation is an important part of real-world animations. Animations take time to complete and in that time the user might have interacted with the page in a way where the running animation does not make sense anymore. In most cases when an animation is interrupted, another animation will be started. This could be the same animation in reverse or an entirely different one. In any case we will want to start the animation from the element's current state. -In theory, you only need to specify a "to" keyframe which would make it trivial -to cancel an animation as the browser will calculate the "from" position based -on the current state. Unfortunately not all browsers currently support that -behaviour meaning we'll have to be a little more elaborate for now. +In theory, you only need to specify a "to" keyframe which would make it trivial to cancel an animation as the browser will calculate the "from" position based on the current state. Unfortunately not all browsers currently support that behaviour meaning we'll have to be a little more elaborate for now. -In order to cancel the current animation (if any) we'll need to take a few -steps. Before trying to calculate our starting keyframe we'll need to pause the -currently running animation (if any). Then we'll need to get the current -transform present on our element. Finally, we can start the new animation. +In order to cancel the current animation (if any) we'll need to take a few steps. Before trying to calculate our starting keyframe we'll need to pause the currently running animation (if any). Then we'll need to get the current transform present on our element. Finally, we can start the new animation. -Let's abstract our animation into a `move` function which takes `transformStart` -and `transformEnd` string arguments. We'll also add `animateRight` and -`animateLeft` functions which are hooked up to two buttons, so we can run the -animations by clicking those buttons. +Let's abstract our animation into a `move` function which takes `transformStart` and `transformEnd` string arguments. We'll also add `animateRight` and `animateLeft` functions which are hooked up to two buttons, so we can run the animations by clicking those buttons. ```html @@ -297,35 +222,19 @@ animations by clicking those buttons. ``` -Rapidly clicking the buttons interchangeably now shows a pretty jarring -animation! +Rapidly clicking the buttons interchangeably now shows a pretty jarring animation! ![Basic move animation](/assets/images/posts/2021-01-29-web-animations-intro/video3.mp4#video) -This is a good time to take a look at the developer tools to find out what's -going on. Note that you will not see the animated styles appear in the DOM as -you might be used to with JavaScript based animation. You can see the effect -they have in the computed styles and animation sections of the browser's -developer tools. +This is a good time to take a look at the developer tools to find out what's going on. Note that you will not see the animated styles appear in the DOM as you might be used to with JavaScript based animation. You can see the effect they have in the computed styles and animation sections of the browser's developer tools. -From the "Animations" pane we can slow down the animation to 25% of the original -speed to make it easier to see what is going on. We can also replay previous -animations. When we click the "Left" button while the animation is happening -we'll see that the animation is not starting at the correct point. +From the "Animations" pane we can slow down the animation to 25% of the original speed to make it easier to see what is going on. We can also replay previous animations. When we click the "Left" button while the animation is happening we'll see that the animation is not starting at the correct point. ![Debugging an animation using developer tools](/assets/images/posts/2021-01-29-web-animations-intro/devtools.mp4#video) -This happens because we explicitly specify a starting keyframe which is -obviously an incorrect starting point if we interrupt the animation in the -middle. +This happens because we explicitly specify a starting keyframe which is obviously an incorrect starting point if we interrupt the animation in the middle. -We can fix this by first pausing the animation. Next we can utilise the global -`getComputedStyle(element)` function to retrieve the current styles for our -element. We'll take the computed `transform` style as the starting point for our -keyframe. After doing this we can cancel the current animation to free up -browser resources and start the new animation. Let's modify our functions -accordingly. We also no longer have a need to pass in a `transformStart` -argument, as we will calculate that dynamically from now on. +We can fix this by first pausing the animation. Next we can utilise the global `getComputedStyle(element)` function to retrieve the current styles for our element. We'll take the computed `transform` style as the starting point for our keyframe. After doing this we can cancel the current animation to free up browser resources and start the new animation. Let's modify our functions accordingly. We also no longer have a need to pass in a `transformStart` argument, as we will calculate that dynamically from now on. ```javascript function move(transformEnd) { @@ -345,25 +254,13 @@ function animateLeft() { } ``` -Pressing the left or right button while an animation is running will now -correctly cancel the running animation. +Pressing the left or right button while an animation is running will now correctly cancel the running animation. ![Cancellable move animation](/assets/images/posts/2021-01-29-web-animations-intro/video4.mp4#video) -There is still a problem though! We have set a fixed duration for our animation. -This means that if we cancel the animation after for example 0.5 seconds it will -still take the full 1 second to revert the animation even though we're only -moving half the distance. Remembering the Web Animations basics mentioned -earlier, there is a way to get timing information from an animation. We can use -that information to correctly calculate the duration for our animation to -achieve a constant velocity. - -Let's modify our move function again. We'll need to get the `activeDuration` and -`progress` of the running animation. We can call -`currentAnimation.effect.getComputedTiming()` which will provide us with the -values we need. We can calculate the target duration with the following formula -`duration = duration - (activeDuration - progress * activeDuration)` where -duration is our default duration of 1 second; +There is still a problem though! We have set a fixed duration for our animation. This means that if we cancel the animation after for example 0.5 seconds it will still take the full 1 second to revert the animation even though we're only moving half the distance. Remembering the Web Animations basics mentioned earlier, there is a way to get timing information from an animation. We can use that information to correctly calculate the duration for our animation to achieve a constant velocity. + +Let's modify our move function again. We'll need to get the `activeDuration` and `progress` of the running animation. We can call `currentAnimation.effect.getComputedTiming()` which will provide us with the values we need. We can calculate the target duration with the following formula `duration = duration - (activeDuration - progress * activeDuration)` where duration is our default duration of 1 second; ```javascript function move(transformEnd) { @@ -397,32 +294,25 @@ function move(transformEnd) { } ``` -After this change our animations will always run with a constant velocity, no -matter when the running animation is cancelled. The final result can be seen in -this [CodePen](https://codepen.io/nickschot/pen/LYbPBmW). +After this change our animations will always run with a constant velocity, no matter when the running animation is cancelled. The final result can be seen in this [CodePen](https://codepen.io/nickschot/pen/LYbPBmW). ![Cancellable move animation with constant velocity](/assets/images/posts/2021-01-29-web-animations-intro/video5.mp4#video) ### When an animation finishes -It is likely you need to do something after an animation completes. The Web -Animations API provides a couple of options to do this. Firstly there is the -`Animation.onfinish` handler which runs the given function after the animation -completes. +It is likely you need to do something after an animation completes. The Web Animations API provides a couple of options to do this. Firstly there is the `Animation.onfinish` handler which runs the given function after the animation completes. ```javascript currentAnimation.onfinish = () => console.log("animation finished!"); ``` -Secondly there is also the `Animation.finished` promise, which resolves when the -animation finishes. +Secondly there is also the `Animation.finished` promise, which resolves when the animation finishes. ```javascript currentAnimation.finished.then(() => console.log("animation finished!")); ``` -These functions behave a bit differently when an animation is cancelled. The -`onfinish` hook is never called. Fortunately an `oncancel` hook also exists. +These functions behave a bit differently when an animation is cancelled. The `onfinish` hook is never called. Fortunately an `oncancel` hook also exists. ```javascript // handling cancellation with hooks @@ -430,8 +320,7 @@ currentAnimation.onfinish = () => console.log("animation finished!"); currentAnimation.oncancel = () => console.error("animation cancelled."); ``` -The `finished` promise will throw an error which we will need to handle. We can -of course also utilize async/await. +The `finished` promise will throw an error which we will need to handle. We can of course also utilize async/await. ```javascript // handling cancellation with promises @@ -449,11 +338,6 @@ try { ## Conclusion -With this we now have a basic understanding of the Web Animations API and can -create moderately complex animations for a given element controller from -JavaScript. From this basic understanding we can start thinking about expanding -this to more complex use cases such as animating between elements and pages. -Furthermore, we can think about using more advanced timing functions, their -benefits and implications. +With this we now have a basic understanding of the Web Animations API and can create moderately complex animations for a given element controller from JavaScript. From this basic understanding we can start thinking about expanding this to more complex use cases such as animating between elements and pages. Furthermore, we can think about using more advanced timing functions, their benefits and implications. [contact]: https://mainmatter.com/contact/ diff --git a/src/posts/2021-03-12-Ember.js-in-2021---a-beacon-of-productivity.md b/src/posts/2021-03-12-Ember.js-in-2021---a-beacon-of-productivity.md index ce9e27d8a6..f503220499 100644 --- a/src/posts/2021-03-12-Ember.js-in-2021---a-beacon-of-productivity.md +++ b/src/posts/2021-03-12-Ember.js-in-2021---a-beacon-of-productivity.md @@ -3,10 +3,7 @@ title: "Ember.js in 2021 – a beacon of productivity" authorHandle: marcoow tags: ember bio: "Founder and Managing Director of Mainmatter" -description: - "Marco Otte-Witte makes the case for Ember in 2021 and explains why he - considers the framework a beacon of productivity in the middle of a roaring - sea of complexity" +description: "Marco Otte-Witte makes the case for Ember in 2021 and explains why he considers the framework a beacon of productivity in the middle of a roaring sea of complexity" og: image: /assets/images/posts/2021-03-12-Ember.js-in-2021---a-beacon-of-productivity/og-image.jpg tagline: | @@ -15,323 +12,82 @@ tagline: | ### Mainmatter ❤️ Ember -To be completely transparent, I'm heavily biased towards Ember. With Mainmatter, -I founded what is now the -[leading Ember consultancy in Europe](/ember-consulting/). We've helped many -teams successfully build, evolve and maintain large applications with Ember over -the years. Some of our team members are involved in the Ember core team and we -maintain a number of widely adopted libraries in the ecosystem. -[We're one of the official sponsors of the framework even](https://emberjs.com/sponsors). -With all that experience and also some experience with teams using other -technology stacks, I think we do have a view on frontend development that's -maybe a bit different from other teams' views and because of that, it is worth -sharing. +To be completely transparent, I'm heavily biased towards Ember. With Mainmatter, I founded what is now the [leading Ember consultancy in Europe](/ember-consulting/). We've helped many teams successfully build, evolve and maintain large applications with Ember over the years. Some of our team members are involved in the Ember core team and we maintain a number of widely adopted libraries in the ecosystem. [We're one of the official sponsors of the framework even](https://emberjs.com/sponsors). With all that experience and also some experience with teams using other technology stacks, I think we do have a view on frontend development that's maybe a bit different from other teams' views and because of that, it is worth sharing. ## The Status Quo of Frontend Engineering -There have been huge amounts of progress in the frontend engineering world over -the past 10 years or so. Back when Ember was first released, -[jQuery](https://jquery.com/) (and sometimes even -[Prototype](http://prototypejs.org/)) were still the go-to solutions for making -otherwise static and server-rendered pages dynamic. And while jQuery remains -[the most used JavaScript library on the web to date](https://w3techs.com/technologies/history_overview/javascript_library/all/q), -techniques introduced first by Ember and Angular.js (and later React and others) -are now widely accepted and adopted. While frontend engineering was something -that many _"real"_ developers would look down on only a few years ago and that -was often merely an afterthought, the field has been professionalized -significantly and now gets the attention it deserves. That does not only -acknowledge the fact that frontend development is hugely challenging but also -its significance for businesses due to the direct impact on the end users' -experience. +There have been huge amounts of progress in the frontend engineering world over the past 10 years or so. Back when Ember was first released, [jQuery](https://jquery.com/) (and sometimes even [Prototype](http://prototypejs.org/)) were still the go-to solutions for making otherwise static and server-rendered pages dynamic. And while jQuery remains [the most used JavaScript library on the web to date](https://w3techs.com/technologies/history_overview/javascript_library/all/q), techniques introduced first by Ember and Angular.js (and later React and others) are now widely accepted and adopted. While frontend engineering was something that many _"real"_ developers would look down on only a few years ago and that was often merely an afterthought, the field has been professionalized significantly and now gets the attention it deserves. That does not only acknowledge the fact that frontend development is hugely challenging but also its significance for businesses due to the direct impact on the end users' experience. [![Yehuda Katz (@wycats) on Twitter](/assets/images/posts/2021-03-12-Ember.js-in-2021---a-beacon-of-productivity/wycats-tweet.png#plain@600-1200)](https://twitter.com/wycats/status/930463710941872128) -Things haven't slowed down in the world of frontend development though. In fact, -quite the opposite – we are seeing innovation and change at an extremely high -and seemingly still accelerating pace. JavaScript has become the -[world's dominant language](https://insights.stackoverflow.com/survey/2020#technology-programming-scripting-and-markup-languages) -and is the default answer many developers have to just about anything they might -be dealing with on the web -([you can even write your CSS in JS now 🙀](https://en.wikipedia.org/wiki/CSS-in-JS)). -And while innovation and exploring possibilities and new approaches are great, -the fact that a huge community of developers is collectively on the lookout for -the next big thing and everyone is only waiting to jump on the next bandwagon -does more harm than might be apparent at first glance. It's easy to -underestimate the cost that comes with the churn that adopting new approaches -over-eagerly brings with it which is often only to realize later the hype train -has changed direction again and what you bet on has now turned into a dead-end. +Things haven't slowed down in the world of frontend development though. In fact, quite the opposite – we are seeing innovation and change at an extremely high and seemingly still accelerating pace. JavaScript has become the [world's dominant language](https://insights.stackoverflow.com/survey/2020#technology-programming-scripting-and-markup-languages) and is the default answer many developers have to just about anything they might be dealing with on the web ([you can even write your CSS in JS now 🙀](https://en.wikipedia.org/wiki/CSS-in-JS)). And while innovation and exploring possibilities and new approaches are great, the fact that a huge community of developers is collectively on the lookout for the next big thing and everyone is only waiting to jump on the next bandwagon does more harm than might be apparent at first glance. It's easy to underestimate the cost that comes with the churn that adopting new approaches over-eagerly brings with it which is often only to realize later the hype train has changed direction again and what you bet on has now turned into a dead-end. [![Lee Robinson (@leeerob) on Twitter](/assets/images/posts/2021-03-12-Ember.js-in-2021---a-beacon-of-productivity/leeerob-tweet.png#plain@600-1200)](https://mobile.twitter.com/leeerob/status/1353523847937536000) ### The Complexity Fetish -I think that complexity is fetishized in the frontend world in a way – mainly -due to two sentiments. One is simply ego. As the virologists and epidemiologists -say (and we all have learned in the past year), _"there's no glory in -prevention"_. And just like that there's (surprisingly) little glory to be found -in steadily shipping real product value based on solutions to common problems -others have found before you and encoded in frameworks based on strong -conventions. On the other hand, there's all the engineering glory to be found in -figuring out the best™ way to address a particular problem and taming low-level -complexity even if all that work is not contributing to executing on a product -and business vision – taking on such problems is often done for the glory alone, -regardless of whether the problem has been solved before or even poses a -challenge in the respective project at all. Having ported a React app step by -step from Redux over MobX to hooks and beyond over the course of the past few -years likely was an exciting engineering journey and came with a whole bunch of -interesting and challenging work. However, the cost-benefit relationship of all -the time spent on the endeavor might be questionable. - -[Chris Manson](https://mainmatter.com/blog/author/real_ate) from the Mainmatter -and [Ember Learning Core](https://emberjs.com/teams/) teams recently told me the -story of an engineer he was talking to at a conference. They understood and -completely agreed with the value that Ember provided as a full-featured, -batteries included frontend application framework that enables teams to build -skyscrapers starting from the 20th floor instead of beginning with laying the -foundation. Yet they said they would never propose the framework to their boss -because then they wouldn't get to write as much code for solving low level -problems they found particularly exciting because _"Ember does it all for you"_. -While that **can** be a valid reason not to choose a technical solution at -times, in most cases shipping **is** important and should be the main driver for -decisions. - -The other sentiment that I believe contributes to the complexity fetish is a -desire to be in control of ever every single aspect and detail of one's app. -That might be driven partly by the Node community's – highly questionable in my -opinion – love relationship with micro packages where applications are made up -of a carefully assembled combination of tiny libraries that perfectly cater to a -particular application's very special needs – or in most cases, the personal -preferences of the engineer(s) setting up the project. Many teams I've talked to -over the years have strongly held opinions about what particular routing library -they need, why they cannot use the state management patterns of framework X but -have to use a different micro-library etc. And while many of these arguments -will make some sense from a purely technical point of view, the practical impact -is more often than not neglectable or irrelevant even. What's certain though is -that all the time and effort spent on assembling (and then maintaining) these -highly customized ad-hoc frameworks is **not** going into building and improving -real products for real users. +I think that complexity is fetishized in the frontend world in a way – mainly due to two sentiments. One is simply ego. As the virologists and epidemiologists say (and we all have learned in the past year), _"there's no glory in prevention"_. And just like that there's (surprisingly) little glory to be found in steadily shipping real product value based on solutions to common problems others have found before you and encoded in frameworks based on strong conventions. On the other hand, there's all the engineering glory to be found in figuring out the best™ way to address a particular problem and taming low-level complexity even if all that work is not contributing to executing on a product and business vision – taking on such problems is often done for the glory alone, regardless of whether the problem has been solved before or even poses a challenge in the respective project at all. Having ported a React app step by step from Redux over MobX to hooks and beyond over the course of the past few years likely was an exciting engineering journey and came with a whole bunch of interesting and challenging work. However, the cost-benefit relationship of all the time spent on the endeavor might be questionable. + +[Chris Manson](https://mainmatter.com/blog/author/real_ate) from the Mainmatter and [Ember Learning Core](https://emberjs.com/teams/) teams recently told me the story of an engineer he was talking to at a conference. They understood and completely agreed with the value that Ember provided as a full-featured, batteries included frontend application framework that enables teams to build skyscrapers starting from the 20th floor instead of beginning with laying the foundation. Yet they said they would never propose the framework to their boss because then they wouldn't get to write as much code for solving low level problems they found particularly exciting because _"Ember does it all for you"_. While that **can** be a valid reason not to choose a technical solution at times, in most cases shipping **is** important and should be the main driver for decisions. + +The other sentiment that I believe contributes to the complexity fetish is a desire to be in control of ever every single aspect and detail of one's app. That might be driven partly by the Node community's – highly questionable in my opinion – love relationship with micro packages where applications are made up of a carefully assembled combination of tiny libraries that perfectly cater to a particular application's very special needs – or in most cases, the personal preferences of the engineer(s) setting up the project. Many teams I've talked to over the years have strongly held opinions about what particular routing library they need, why they cannot use the state management patterns of framework X but have to use a different micro-library etc. And while many of these arguments will make some sense from a purely technical point of view, the practical impact is more often than not neglectable or irrelevant even. What's certain though is that all the time and effort spent on assembling (and then maintaining) these highly customized ad-hoc frameworks is **not** going into building and improving real products for real users. ## Ember: Turning Complexity into Simplicity -Contrary to that, Ember takes these low level and mostly unimportant -[bike-shedding](https://en.wikipedia.org/wiki/Law_of_triviality) decisions out -of the hands of developers. It is a full-featured, batteries-included framework -and like similar solutions for the backend like Ruby on Rails, it provides -everything one needs to build an app in a coherent way with a consistent API -where the individual parts all work together seamlessly since they were meant to -work together from the beginning. Because of that, it doesn't allow the level of -freedom and fine-grained control over every little detail that many are looking -for in the frontend world as mentioned above. And while that might sound -unappealing to many, it's actually its biggest strength as it allows teams to -focus on executing on their product and company vision and shipping real value -for their users. +Contrary to that, Ember takes these low level and mostly unimportant [bike-shedding](https://en.wikipedia.org/wiki/Law_of_triviality) decisions out of the hands of developers. It is a full-featured, batteries-included framework and like similar solutions for the backend like Ruby on Rails, it provides everything one needs to build an app in a coherent way with a consistent API where the individual parts all work together seamlessly since they were meant to work together from the beginning. Because of that, it doesn't allow the level of freedom and fine-grained control over every little detail that many are looking for in the frontend world as mentioned above. And while that might sound unappealing to many, it's actually its biggest strength as it allows teams to focus on executing on their product and company vision and shipping real value for their users. ### Essential vs. accidental complexity -Writing any software system means dealing with a large amount of complexity. -That complexity comes in two forms (see -[Fred Brooks' famous paper on the topic](https://en.wikipedia.org/wiki/No_Silver_Bullet)): -essential complexity and accidental complexity. Essential complexity is how hard -something is to do, regardless of one's experience, the technology used, etc. -It's an inherent property of the problem you're solving. Adding two numbers is -generally a relatively low complexity task while building a social network has -much higher complexity in comparison. On the other hand, accidental complexity -is the part of the complexity that is not inherent to the problem one is solving -but introduced as part of the solution. Adding two numbers in C++ is more -complex than doing the same thing in JavaScript, as in C++ you have to worry -about memory management, you have to compile, etc. – all of that isn't necessary -for JavaScript which thus leads to lower accidental complexity. - -Frameworks like Ember are all about reducing the amount of accidental complexity -that the developers have to deal with. Since Ember takes care of all or the vast -majority of aspects of the application that are not an essential part of the -particular application's problem domain (e.g. routing, data loading, etc.), it -takes all of the accidental complexity associated with these aspects out of the -hands of the developers. They instead can focus on tackling the essential -complexity only. Clearly separating the aspects the developer is in control of -from everything else is therefore a -[liberating constraint](https://wiki.c2.com/?LiberatingConstraint) – it -liberates developers from getting side-tracked and spending time on -non-essential aspects and enables them to spend their time and effort where they -truly add value. In contrast to that, building on micro packages and aiming for -fine-grained control over all of an application's aspects will necessarily -resurface all the accidental complexity associated with those and put the -responsibility for them back into the hands of developers. They now have to deal -with webpack configurations, integration between packages, etc. All effort and -time spent on these tasks are not going into delivering product value for real -users. +Writing any software system means dealing with a large amount of complexity. That complexity comes in two forms (see [Fred Brooks' famous paper on the topic](https://en.wikipedia.org/wiki/No_Silver_Bullet)): essential complexity and accidental complexity. Essential complexity is how hard something is to do, regardless of one's experience, the technology used, etc. It's an inherent property of the problem you're solving. Adding two numbers is generally a relatively low complexity task while building a social network has much higher complexity in comparison. On the other hand, accidental complexity is the part of the complexity that is not inherent to the problem one is solving but introduced as part of the solution. Adding two numbers in C++ is more complex than doing the same thing in JavaScript, as in C++ you have to worry about memory management, you have to compile, etc. – all of that isn't necessary for JavaScript which thus leads to lower accidental complexity. + +Frameworks like Ember are all about reducing the amount of accidental complexity that the developers have to deal with. Since Ember takes care of all or the vast majority of aspects of the application that are not an essential part of the particular application's problem domain (e.g. routing, data loading, etc.), it takes all of the accidental complexity associated with these aspects out of the hands of the developers. They instead can focus on tackling the essential complexity only. Clearly separating the aspects the developer is in control of from everything else is therefore a [liberating constraint](https://wiki.c2.com/?LiberatingConstraint) – it liberates developers from getting side-tracked and spending time on non-essential aspects and enables them to spend their time and effort where they truly add value. In contrast to that, building on micro packages and aiming for fine-grained control over all of an application's aspects will necessarily resurface all the accidental complexity associated with those and put the responsibility for them back into the hands of developers. They now have to deal with webpack configurations, integration between packages, etc. All effort and time spent on these tasks are not going into delivering product value for real users. [![Chad Fowler (@chadfowler) on Twitter](/assets/images/posts/2021-03-12-Ember.js-in-2021---a-beacon-of-productivity/chadfowler-tweet.png#plain@600-1200)](https://twitter.com/chadfowler/status/646624348028190720) -At Mainmatter, we have seen many teams struggling with all kinds of problems in -web projects and helped them overcome those. In none of those cases were those -problems caused by how frameworks like Ember or Rails handle the non-essential -aspects of applications. Most of the time what leads to problems is teams -struggling to organize code in a maintainable and extensible way in areas where -frameworks leave freedom and do not provide strong conventions (typical examples -being shaping and orchestrating components in Ember or organizing business logic -in Rails apps) – in fact, the worst kinds of problems typically arise where -teams build their own extensions to frameworks that add large amounts of -accidental complexity and create more problems than they solve. I have seen at -least eight different approaches to organizing business logic in custom -constructs in Rails apps during my career and every single one eventually lead -to a dead end. The same can be said for inventing custom data management -libraries instead of relying on solutions like -[ember-data](https://github.com/emberjs/data) or [Orbit](https://orbitjs.com). - -> With Ember, we have built a consistent codebase of a couple apps and and -> addons. It is shared by 25 front-end engineers, spread over a few teams. In an -> early phase, we could focus on providing new features for our clients. Later, -> while keeping this focus, we could evolve the codebase in a non-disruptive -> way. +At Mainmatter, we have seen many teams struggling with all kinds of problems in web projects and helped them overcome those. In none of those cases were those problems caused by how frameworks like Ember or Rails handle the non-essential aspects of applications. Most of the time what leads to problems is teams struggling to organize code in a maintainable and extensible way in areas where frameworks leave freedom and do not provide strong conventions (typical examples being shaping and orchestrating components in Ember or organizing business logic in Rails apps) – in fact, the worst kinds of problems typically arise where teams build their own extensions to frameworks that add large amounts of accidental complexity and create more problems than they solve. I have seen at least eight different approaches to organizing business logic in custom constructs in Rails apps during my career and every single one eventually lead to a dead end. The same can be said for inventing custom data management libraries instead of relying on solutions like [ember-data](https://github.com/emberjs/data) or [Orbit](https://orbitjs.com). + +> With Ember, we have built a consistent codebase of a couple apps and and addons. It is shared by 25 front-end engineers, spread over a few teams. In an early phase, we could focus on providing new features for our clients. Later, while keeping this focus, we could evolve the codebase in a non-disruptive way. > -> Ember and its ecosystem have given us enough stability to invest in our -> product and in the development of our engineers' skills. -> [Cyrille David](https://github.com/dcyriller), Head of Front-End, -> Qonto +> Ember and its ecosystem have given us enough stability to invest in our product and in the development of our engineers' skills. [Cyrille David](https://github.com/dcyriller), Head of Front-End, Qonto ## Stability without Stagnation -The fact that Ember hides most of the accidental complexity and takes control -over these aspects of applications doesn't mean nothing can ever change in the -framework and no progress can be had. There **is** steady and substantial -progress in the framework but Ember shields developers from having to deal with -the involved churn as much as possible. Instead, Ember constantly ships -improvements in backwards compatible minor releases with clear upgrade paths, -following its [release strategy](https://emberjs.com/releases) which emphasizes -stability. That allows teams to keep up with recent developments and benefit -from innovation in the frontend field while minimizing the incurred cost like -the team at CLARK: +The fact that Ember hides most of the accidental complexity and takes control over these aspects of applications doesn't mean nothing can ever change in the framework and no progress can be had. There **is** steady and substantial progress in the framework but Ember shields developers from having to deal with the involved churn as much as possible. Instead, Ember constantly ships improvements in backwards compatible minor releases with clear upgrade paths, following its [release strategy](https://emberjs.com/releases) which emphasizes stability. That allows teams to keep up with recent developments and benefit from innovation in the frontend field while minimizing the incurred cost like the team at CLARK: [![Jan Buschtoens (@buschtoens) on Twitter](/assets/images/posts/2021-03-12-Ember.js-in-2021---a-beacon-of-productivity/buschtoens-tweet.png#plain@600-1200)](https://twitter.com/buschtoens/status/1352734272675840006) -All changes to Ember itself go through the -[RFC process](https://github.com/emberjs/rfcs), are validated and tested in real -apps through the canary and beta releases before being rolled out to the -community. Once that happens, the previous APIs will remain available but be -deprecated along with extensive documentation for migrating to the new paradigms -(and in many cases there will be codemods even for automating the task; there's -also [a dedicated app](https://upgrade.emberjs.com) listing the changes between -two versions and the changes necessary for upgrading). So instead of every -single team paying the cost for exploration and experimentation, the framework -and community pay that cost once, for the entire community to benefit afterward. -That's what the Ember community also refers to as the -[safety of the herd](https://embermap.com/notes/62-safety-of-the-herd). +All changes to Ember itself go through the [RFC process](https://github.com/emberjs/rfcs), are validated and tested in real apps through the canary and beta releases before being rolled out to the community. Once that happens, the previous APIs will remain available but be deprecated along with extensive documentation for migrating to the new paradigms (and in many cases there will be codemods even for automating the task; there's also [a dedicated app](https://upgrade.emberjs.com) listing the changes between two versions and the changes necessary for upgrading). So instead of every single team paying the cost for exploration and experimentation, the framework and community pay that cost once, for the entire community to benefit afterward. That's what the Ember community also refers to as the [safety of the herd](https://embermap.com/notes/62-safety-of-the-herd). And Ember has seen many substantial changes to its core concepts over the years: - [introducing a completely new component API](https://guides.emberjs.com/release/upgrading/current-edition/glimmer-components/) -- [replacing the core rendering engine of the framework](https://blog.emberjs.com/ember-2-10-released/#changesinemberjs210) - ([Glimmer VM](https://github.com/glimmerjs/glimmer-vm)) +- [replacing the core rendering engine of the framework](https://blog.emberjs.com/ember-2-10-released/#changesinemberjs210) ([Glimmer VM](https://github.com/glimmerjs/glimmer-vm)) - [removing its custom object model and adopting native classes](https://guides.emberjs.com/release/upgrading/current-edition/native-classes/) -Each of those changes were substantial updates to the Ember programming model. -Yet, each one was released in a way that made it easy for the entire community -to follow along. The entire ecosystem revolving around a single defined set of -techniques and practices while making sure no project is left behind and stuck -on old patterns prevents fragmentation. Everyone in the community has a -collective interest in supporting, maintaining, and evolving the same set of -tools and the entire community will collectively make sure those continue to -work and work well for everyone using Ember. There is no risk on individual -teams and projects being left on their own because they bet on the wrong horse -that ends up not being actively maintained so that the teams would either have -to take over maintenance themselves or switch to a different solution which -would often result in large refactorings, again directing time and effort into -dealing with accidental complexity rather than essential complexity and -generating product value. +Each of those changes were substantial updates to the Ember programming model. Yet, each one was released in a way that made it easy for the entire community to follow along. The entire ecosystem revolving around a single defined set of techniques and practices while making sure no project is left behind and stuck on old patterns prevents fragmentation. Everyone in the community has a collective interest in supporting, maintaining, and evolving the same set of tools and the entire community will collectively make sure those continue to work and work well for everyone using Ember. There is no risk on individual teams and projects being left on their own because they bet on the wrong horse that ends up not being actively maintained so that the teams would either have to take over maintenance themselves or switch to a different solution which would often result in large refactorings, again directing time and effort into dealing with accidental complexity rather than essential complexity and generating product value. ## The right tool for the right job -As laid out above, Ember is a full-featured application framework that contains -coherent building blocks and concepts for all aspects that real-world -applications face and that are not inherently coupled to their problem domain. -While Ember encapsulates the internals of these concepts so developers do not -have to deal with them, all these concepts are still present and contribute to -the framework's public API and general architecture that one is exposed to when -working on an Ember project. This often leads to criticism focussed on the fact -that there is a lot to learn with Ember and some or much of that might not be -necessary for a particular project - -> I just want to build a calculator widget for my static site – why do I need to -> worry about routing, data loading, error states, etc. for that? +As laid out above, Ember is a full-featured application framework that contains coherent building blocks and concepts for all aspects that real-world applications face and that are not inherently coupled to their problem domain. While Ember encapsulates the internals of these concepts so developers do not have to deal with them, all these concepts are still present and contribute to the framework's public API and general architecture that one is exposed to when working on an Ember project. This often leads to criticism focussed on the fact that there is a lot to learn with Ember and some or much of that might not be necessary for a particular project + +> I just want to build a calculator widget for my static site – why do I need to worry about routing, data loading, error states, etc. for that? > > – someone who should have chosen React -Comments like that are hard to counter. Of course, there's no good reason why -anyone should have to set up a -[route structure](https://guides.emberjs.com/release/routing/) along with a -[template hierarchy](https://guides.emberjs.com/release/routing/rendering-a-template/) -or understand what -[adapters](https://guides.emberjs.com/release/models/customizing-adapters/) or -[serializers](https://guides.emberjs.com/release/models/customizing-serializers/) -are when the application they are building does not need any of that anyway. In -reality, though, this doesn't imply Ember is unnecessarily bloated or overly -complex but the complaining person turned to a tool that serves a different -purpose than what they need for their particular job in the first place. - -Even though the boundaries are sometimes blurry, there still is a substantial -difference between static or only partly dynamic web **sites** (like your -favorite news outlet's site or most e-commerce sites) and full-on web **apps** -(e.g. social networks like Facebook or LinkedIn or dashboard-style apps like the -online banking UI that [Qonto](https://qonto.com) is building). These different -use cases also come with different characteristics and requirements in terms of -interactivity, (load time) performance, and user expectations. Aral Balkan wrote -an -[interesting post in 2013](https://ar.al/notes/the-documents-to-applications-continuum/) -on the topic in which he introduces what he calls the -_"Documents-to-Applications Continuum"_ – and what he said almost 8 years ago, -still applies today. Ember's sweet spot is all the way on the _"Applications"_ -side of that spectrum: +Comments like that are hard to counter. Of course, there's no good reason why anyone should have to set up a [route structure](https://guides.emberjs.com/release/routing/) along with a [template hierarchy](https://guides.emberjs.com/release/routing/rendering-a-template/) or understand what [adapters](https://guides.emberjs.com/release/models/customizing-adapters/) or [serializers](https://guides.emberjs.com/release/models/customizing-serializers/) are when the application they are building does not need any of that anyway. In reality, though, this doesn't imply Ember is unnecessarily bloated or overly complex but the complaining person turned to a tool that serves a different purpose than what they need for their particular job in the first place. + +Even though the boundaries are sometimes blurry, there still is a substantial difference between static or only partly dynamic web **sites** (like your favorite news outlet's site or most e-commerce sites) and full-on web **apps** (e.g. social networks like Facebook or LinkedIn or dashboard-style apps like the online banking UI that [Qonto](https://qonto.com) is building). These different use cases also come with different characteristics and requirements in terms of interactivity, (load time) performance, and user expectations. Aral Balkan wrote an [interesting post in 2013](https://ar.al/notes/the-documents-to-applications-continuum/) on the topic in which he introduces what he calls the _"Documents-to-Applications Continuum"_ – and what he said almost 8 years ago, still applies today. Ember's sweet spot is all the way on the _"Applications"_ side of that spectrum: ![The Documents-to-Applications Continuum](/assets/images/posts/2021-03-12-Ember.js-in-2021---a-beacon-of-productivity/documents-to-applications-continuum.svg) -There are plenty of other and better options for other kinds of projects (and -for static content sites, I'd argue any client-side framework is the wrong -choice more often than not anyway – however, admittedly we went through the -[exercise of completely over-engineering a static site](/blog/2020/01/31/how-to-over-engineer-a-static-page/) -as well to learn that the hard way). The point is, **if you're not building a -web application, don't look at a web application framework to build it with.** -Yet, many teams would do that and then be disappointed that the framework they -tried does not turn out to be a great fit. To me, that's a bit like complaining -SpaceX's rockets aren't great to do grocery shopping with. A rocket not being an -ideal choice for that task doesn't mean it's a bad rocket, just that advanced -technology designed for tackling challenging tasks isn't necessarily also a -great fit for simpler tasks. +There are plenty of other and better options for other kinds of projects (and for static content sites, I'd argue any client-side framework is the wrong choice more often than not anyway – however, admittedly we went through the [exercise of completely over-engineering a static site](/blog/2020/01/31/how-to-over-engineer-a-static-page/) as well to learn that the hard way). The point is, **if you're not building a web application, don't look at a web application framework to build it with.** Yet, many teams would do that and then be disappointed that the framework they tried does not turn out to be a great fit. To me, that's a bit like complaining SpaceX's rockets aren't great to do grocery shopping with. A rocket not being an ideal choice for that task doesn't mean it's a bad rocket, just that advanced technology designed for tackling challenging tasks isn't necessarily also a great fit for simpler tasks. ## A productive future with Ember -Ember has never been the coolest kid on the block and probably never will be. -Building on solutions others have found before you isn't a particularly -attractive outlook for many developers. It takes quite a bit of experience and -reflection to let go of one's vanity and accept that the less you do yourself -and the more you build on existing, proven solutions, the better of an -engineering job you're actually doing and the better your work is in the -interest of the company you build or work for which is ultimately the top -priority as it is what's paying the bills and salaries. Ember developers -[frequently are the highest-paid and most senior in the annual state of JS survey](https://2019.stateofjs.com/front-end-frameworks/#front_end_frameworks_salary_heatmap) -and I don't think that's a coincidence. +Ember has never been the coolest kid on the block and probably never will be. Building on solutions others have found before you isn't a particularly attractive outlook for many developers. It takes quite a bit of experience and reflection to let go of one's vanity and accept that the less you do yourself and the more you build on existing, proven solutions, the better of an engineering job you're actually doing and the better your work is in the interest of the company you build or work for which is ultimately the top priority as it is what's paying the bills and salaries. Ember developers [frequently are the highest-paid and most senior in the annual state of JS survey](https://2019.stateofjs.com/front-end-frameworks/#front_end_frameworks_salary_heatmap) and I don't think that's a coincidence. [![Vlad Mihalcea (@vlad_mihalcea) on Twitter](/assets/images/posts/2021-03-12-Ember.js-in-2021---a-beacon-of-productivity/vlad_mihalcea-tweet.png#plain@600-1200)](https://twitter.com/vlad_mihalcea/status/1350775611434930177) -Ember has been an enabler of great productivity for many teams for almost a -decade and I'm sure it's going to continue to be that. It's changed and improved -a lot since its first release and is now in better shape than ever with its -[Octane edition](https://emberjs.com/editions/octane/). All those changes and -improvements were introduced with minimal effort for teams to stay up to date -and migrate their apps in small steps over time. There also is little to no -fragmentation within the community – everyone using Ember.js is basing their -work on the same idioms and techniques, all originating from the same highly -cohesive ecosystem. And when more changes and improvements are to come in the -future, they will be battle-tested **before** migrating the community, and that -migration will take everyone along, leaving no app behind. - -[Qonto](https://qonto.com) and [CLARK](http://clark.de) are two great examples -of teams executing on their product vision steadily and sustainably. The -companies are two of the most successful and fastest-growing FinTechs in Europe -and have scaled their teams significantly over the past few years while -continuing to ship steadily and sustainably. But they are not the only ones -using Ember successfully of course – others include companies building ambitious -apps with large and growing teams like LinkedIn, Apple, Square, Heroku, -Intercom, and many more. All those teams might generate little fuzz and hype but -ship product value constantly and will continue to do so building on Ember which -will keep lifting them to new heights for the time to come. +Ember has been an enabler of great productivity for many teams for almost a decade and I'm sure it's going to continue to be that. It's changed and improved a lot since its first release and is now in better shape than ever with its [Octane edition](https://emberjs.com/editions/octane/). All those changes and improvements were introduced with minimal effort for teams to stay up to date and migrate their apps in small steps over time. There also is little to no fragmentation within the community – everyone using Ember.js is basing their work on the same idioms and techniques, all originating from the same highly cohesive ecosystem. And when more changes and improvements are to come in the future, they will be battle-tested **before** migrating the community, and that migration will take everyone along, leaving no app behind. + +[Qonto](https://qonto.com) and [CLARK](http://clark.de) are two great examples of teams executing on their product vision steadily and sustainably. The companies are two of the most successful and fastest-growing FinTechs in Europe and have scaled their teams significantly over the past few years while continuing to ship steadily and sustainably. But they are not the only ones using Ember successfully of course – others include companies building ambitious apps with large and growing teams like LinkedIn, Apple, Square, Heroku, Intercom, and many more. All those teams might generate little fuzz and hype but ship product value constantly and will continue to do so building on Ember which will keep lifting them to new heights for the time to come. diff --git a/src/posts/2021-03-15-trying-your-github-actions-locally.md b/src/posts/2021-03-15-trying-your-github-actions-locally.md index 419633ee52..e0ea3089cb 100644 --- a/src/posts/2021-03-15-trying-your-github-actions-locally.md +++ b/src/posts/2021-03-15-trying-your-github-actions-locally.md @@ -10,37 +10,15 @@ tagline: |

    If, like me, configuring GitHub Actions is not your thing and you find yourself wanting to try something before actually pushing it to GitHub (and having to see the effects on real-life), follow this step by step of how to run your GitHub Actions on your own computer.

    --- -GitHub Actions is a service from GitHub that allows you to automate certain -tasks of your development cycle, right from your repository. It allows you to -define a series of commands to be run on specified events, and takes care of -executing those commands and providing you feedback. You can for instance, run -tests when code is pushed to a branch, or do a deployment when code is merged to -master. - -You may run into the situation where you have to change your action, push it, -and wait for GitHub to run it to see if your changes work as intended. In my -case, I wanted to test an action that is in charge of releasing -[ember-simple-auth](https://github.com/mainmatter/ember-simple-auth), to see if -the change I had made worked as I intended. I wanted to avoid having to make a -release for this and see it fail. After some digging, I couldn't find a way to -do a dry run of the action from GitHub, but I found -[act](https://github.com/nektos/act), a library that lets you run your GitHub -Actions locally. - -The library requires Docker, where it builds the images defined in your actions -and later runs them. So you'll have to install that first. After Docker and -[act]() are installed, you can start trying out your actions! There are two ways -to achieve that: telling `act` to trigger an event (see -[list of events](https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads)) -or to run a job by passing its name. - -To trigger an event, from your project folder, you can run `act event_name`. The -default event is `push` (no need to pass it as an argument). To run a specific -job, you can do `act -j job_name`. - -You can also list all the available actions in your project folder by running -`act -l`, or run `act event_name -l` to see all the actions run for a specific -event. +GitHub Actions is a service from GitHub that allows you to automate certain tasks of your development cycle, right from your repository. It allows you to define a series of commands to be run on specified events, and takes care of executing those commands and providing you feedback. You can for instance, run tests when code is pushed to a branch, or do a deployment when code is merged to master. + +You may run into the situation where you have to change your action, push it, and wait for GitHub to run it to see if your changes work as intended. In my case, I wanted to test an action that is in charge of releasing [ember-simple-auth](https://github.com/mainmatter/ember-simple-auth), to see if the change I had made worked as I intended. I wanted to avoid having to make a release for this and see it fail. After some digging, I couldn't find a way to do a dry run of the action from GitHub, but I found [act](https://github.com/nektos/act), a library that lets you run your GitHub Actions locally. + +The library requires Docker, where it builds the images defined in your actions and later runs them. So you'll have to install that first. After Docker and [act]() are installed, you can start trying out your actions! There are two ways to achieve that: telling `act` to trigger an event (see [list of events](https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads)) or to run a job by passing its name. + +To trigger an event, from your project folder, you can run `act event_name`. The default event is `push` (no need to pass it as an argument). To run a specific job, you can do `act -j job_name`. + +You can also list all the available actions in your project folder by running `act -l`, or run `act event_name -l` to see all the actions run for a specific event. As an example, our release workflow looks something like this: @@ -74,27 +52,21 @@ jobs: On every push of a tag, we release whatever is in that tag to npm. -To try it out, we can run `act -j release` which uses the job name. When doing -so, you will see an output that's roughly like this: +To try it out, we can run `act -j release` which uses the job name. When doing so, you will see an output that's roughly like this: ![Example output of running act](/assets/images/posts/2021-03-15-trying-github-actions-locally/act-run.mp4#video) -In my case, I wanted to make sure the `npm` tarball included the `README` file, -which is shown in the publish output here: +In my case, I wanted to make sure the `npm` tarball included the `README` file, which is shown in the publish output here: ![Partial view of npm publish output where README file can be seen](/assets/images/posts/2021-03-15-trying-github-actions-locally/readme-output.png#@800-1600) After that, I committed my changes with confidence. -P.S.: `act` is still under development, occasionally you may run into errors -like these: {% raw %} +P.S.: `act` is still under development, occasionally you may run into errors like these: {% raw %} ``` Error: yaml: unmarshal errors: line 92: cannot unmarshal !!str `${{ mat...` into bool ``` -It could mean a specific syntax is not yet supported, in this case, the use of -`${{...}}` in `continue-on-error`. Since this wasn't part of the -workflow/actions I wanted to try, I just worked around that by commenting that -line so `act` wouldn't fail when parsing my actions. {% endraw %} +It could mean a specific syntax is not yet supported, in this case, the use of `${{...}}` in `continue-on-error`. Since this wasn't part of the workflow/actions I wanted to try, I just worked around that by commenting that line so `act` wouldn't fail when parsing my actions. {% endraw %} diff --git a/src/posts/2021-05-26-keeping-a-clean-git-history.md b/src/posts/2021-05-26-keeping-a-clean-git-history.md index ec317f1ea7..2992b10f83 100644 --- a/src/posts/2021-05-26-keeping-a-clean-git-history.md +++ b/src/posts/2021-05-26-keeping-a-clean-git-history.md @@ -13,330 +13,132 @@ tagline: |

    This post is designed to help you form a solid mental model while working with Git both professionally and in an open source project, and how to ensure you are following best practices to make the process easier for everyone.

    --- -This topic was inspired by some of my pairing sessions with my colleague -[Tobias Bieniek](https://twitter.com/tobiasbieniek) and the concepts laid out in -this post have become invaluable to me while working with open source -development. If you haven't already checked out -[Tobias' blog on Open Source maintenance](/blog/2018/11/27/open-source-maintenance/) -I would highly recommend checking it out after reading this post 🎉 +This topic was inspired by some of my pairing sessions with my colleague [Tobias Bieniek](https://twitter.com/tobiasbieniek) and the concepts laid out in this post have become invaluable to me while working with open source development. If you haven't already checked out [Tobias' blog on Open Source maintenance](/blog/2018/11/27/open-source-maintenance/) I would highly recommend checking it out after reading this post 🎉 ## Git complexities -Git can sometimes be complex to get your head around. Most of us learn Git up to -a point where we're happy to use it day-to-day and then stick to the few -commands that we are comfortable with without trying anything too fancy. Most of -the time this works out, but then every so often we do something wrong or -someone asks us to rebase or "squash" something and we either panic and/or mess -up our git repo 😫 This is such a common feeling that sites like -[Oh shit, git!](https://ohshitgit.com/) have cropped up to help us _get out of -our messes_. - -It's my belief that a number of factors have held developers back from becoming -super productive with Git, and with a bit of guidance in pairing sessions I can -usually help people to unlock their full potential while using Git. This -potential I am talking about is not anything so complex as dealing with the -reflog, or knowing anything about blobs or the internals of Git, I am just -talking about people feeling comfortable understanding branches, rebasing, -cherrypicking, and have the ability to clean up a branch before submitting it to -a Pull Request (PR). - -The most egregious thing that holds back people's understanding of Git is the -concept that "if you don't use git on the command line then you're not a real -developer" and this idea it needs to die. Sure there are plenty of places in the -tech community where we have a gatekeeper problem, but this particular idea of -"you're not a real developer if you don't do X" is the most pervasive and -destructive. The fact that we funnel so many junior and intermediate developers -into using git on the command line, I believe, has significantly hampered their -ability to truly master Git. - -This is why, whenever I get the chance, I always recommend people to just -download [Fork](https://git-fork.com/). I have always been a visual learner so -when I think about Git I very much **see** the branching model in my head. Even -if you don't know exactly what you're looking at when you see the Fork -interface, you will pick up the concepts of branching in Git much faster when -you see a command's effect on the tree visualisation rather than an abstract set -of characters in the command line. +Git can sometimes be complex to get your head around. Most of us learn Git up to a point where we're happy to use it day-to-day and then stick to the few commands that we are comfortable with without trying anything too fancy. Most of the time this works out, but then every so often we do something wrong or someone asks us to rebase or "squash" something and we either panic and/or mess up our git repo 😫 This is such a common feeling that sites like [Oh shit, git!](https://ohshitgit.com/) have cropped up to help us _get out of our messes_. + +It's my belief that a number of factors have held developers back from becoming super productive with Git, and with a bit of guidance in pairing sessions I can usually help people to unlock their full potential while using Git. This potential I am talking about is not anything so complex as dealing with the reflog, or knowing anything about blobs or the internals of Git, I am just talking about people feeling comfortable understanding branches, rebasing, cherrypicking, and have the ability to clean up a branch before submitting it to a Pull Request (PR). + +The most egregious thing that holds back people's understanding of Git is the concept that "if you don't use git on the command line then you're not a real developer" and this idea it needs to die. Sure there are plenty of places in the tech community where we have a gatekeeper problem, but this particular idea of "you're not a real developer if you don't do X" is the most pervasive and destructive. The fact that we funnel so many junior and intermediate developers into using git on the command line, I believe, has significantly hampered their ability to truly master Git. + +This is why, whenever I get the chance, I always recommend people to just download [Fork](https://git-fork.com/). I have always been a visual learner so when I think about Git I very much **see** the branching model in my head. Even if you don't know exactly what you're looking at when you see the Fork interface, you will pick up the concepts of branching in Git much faster when you see a command's effect on the tree visualisation rather than an abstract set of characters in the command line. ![Screenshot of Fork with a number of branches](/assets/images/posts/2021-05-26-keeping-a-clean-git-history/fork-screenshot.png) ## It's all in the eye of the reviewer -So what is the point of mastering Git and becoming a rebasing wizard with the -ability to rewrite history like you are Hermione Granger wielding a time turner‽ - -The point of this post is not to get everyone rebasing their branches for the -sake of feeling cool, but instead I hope that more people learn **just enough** -Git skills to achieve one simple goal: make your pull requests more focused and -understandable to improve their chance of getting merged quickly (or even -getting merged at all). - -Making sure your pull requests have a good Git history can really streamline the -review process for your colleagues or maintainers of Open Source projects, and -has the added benefit of keeping the Git history clean in the long run. This -will help your colleagues, or even your future self, understand the thought -process behind your PR if you ever need to go back and do some code archaeology -to figure out why something was added or changed in the codebase. - -Open source projects tend to receive a large number of PRs out of the blue, some -of them are great but sometimes you get the dreaded "rewrite all your code" PR. -These are often very hard to ever get merged (if you would even want to merge -them) because they end up touching too much stuff in the same PR and can make it -next to impossible to review properly. - -I like to say to people interested in getting involved in OSS "the smaller the -PR the more likely it will be to get merged". This doesn't just apply to -external contributors. When I'm working on any Open Source project that I -manage, I try to take this into account and split any large rewrite or -substantial change into a series of smaller iterations. - -It is also important to note that when I refer to a "change" I'm not referring -to the classic Git reporting of _number of lines changed_. We are not computers -and we don't really care how many bits were flipped in a Pull Request. What we -really care about is the **number of concepts** that changed in a particular PR. -I have discussed this a bit with my colleagues and the best example I can come -up with is that I don't mind a PR that fixes 1000 instances of a linting rule as -long as it's the **same conceptual change** in all lines that are changed. If -you change 10 instances of one rule and 1 instance of another rule, the -cognitive load of reviewing that PR becomes too much. - -While this post inspired by my work in open source, I have also recently given a -[Git Workshop](https://mainmatter.com/resources/workshop/effective-git) for a -client where we communicated the exact same concepts: "the smaller the PR the -more likely it will be to get merged quickly". And if you or your employer cares -about efficiency then this can only be a good thing 😉 +So what is the point of mastering Git and becoming a rebasing wizard with the ability to rewrite history like you are Hermione Granger wielding a time turner‽ + +The point of this post is not to get everyone rebasing their branches for the sake of feeling cool, but instead I hope that more people learn **just enough** Git skills to achieve one simple goal: make your pull requests more focused and understandable to improve their chance of getting merged quickly (or even getting merged at all). + +Making sure your pull requests have a good Git history can really streamline the review process for your colleagues or maintainers of Open Source projects, and has the added benefit of keeping the Git history clean in the long run. This will help your colleagues, or even your future self, understand the thought process behind your PR if you ever need to go back and do some code archaeology to figure out why something was added or changed in the codebase. + +Open source projects tend to receive a large number of PRs out of the blue, some of them are great but sometimes you get the dreaded "rewrite all your code" PR. These are often very hard to ever get merged (if you would even want to merge them) because they end up touching too much stuff in the same PR and can make it next to impossible to review properly. + +I like to say to people interested in getting involved in OSS "the smaller the PR the more likely it will be to get merged". This doesn't just apply to external contributors. When I'm working on any Open Source project that I manage, I try to take this into account and split any large rewrite or substantial change into a series of smaller iterations. + +It is also important to note that when I refer to a "change" I'm not referring to the classic Git reporting of _number of lines changed_. We are not computers and we don't really care how many bits were flipped in a Pull Request. What we really care about is the **number of concepts** that changed in a particular PR. I have discussed this a bit with my colleagues and the best example I can come up with is that I don't mind a PR that fixes 1000 instances of a linting rule as long as it's the **same conceptual change** in all lines that are changed. If you change 10 instances of one rule and 1 instance of another rule, the cognitive load of reviewing that PR becomes too much. + +While this post inspired by my work in open source, I have also recently given a [Git Workshop](https://mainmatter.com/resources/workshop/effective-git) for a client where we communicated the exact same concepts: "the smaller the PR the more likely it will be to get merged quickly". And if you or your employer cares about efficiency then this can only be a good thing 😉 ## Smallest number of commits for the smallest conceptual change -So far I have been writing in terms of abstract ideas. This may be useful to a -few people but I think most people would find it a bit difficult to convert what -I have said so far into meaningful strategies to improve their Pull Requests in -future. Let's look at a concrete example that illustrates the point that I'm -trying to make with this blog. +So far I have been writing in terms of abstract ideas. This may be useful to a few people but I think most people would find it a bit difficult to convert what I have said so far into meaningful strategies to improve their Pull Requests in future. Let's look at a concrete example that illustrates the point that I'm trying to make with this blog. -Let's assume you now have a good "small" PR. I am calling this "small" because -it might have a lot of lines changed, but it is only one **conceptual** change -as I described in the last section. This PR of yours may be small from a -conceptual perspective, but it may have taken you quite a few commits to -complete it. Here is an example PR that I know has too many commits: -https://github.com/ember-learn/guides-app/pull/19 +Let's assume you now have a good "small" PR. I am calling this "small" because it might have a lot of lines changed, but it is only one **conceptual** change as I described in the last section. This PR of yours may be small from a conceptual perspective, but it may have taken you quite a few commits to complete it. Here is an example PR that I know has too many commits: https://github.com/ember-learn/guides-app/pull/19 -If you look at the -[list of commits](https://github.com/ember-learn/guides-app/pull/19/commits) you -will see commit messages that look like: +If you look at the [list of commits](https://github.com/ember-learn/guides-app/pull/19/commits) you will see commit messages that look like: - Testing Percy integration - Revert "testing percy integration" - fixing the Percy ignore rules -This is a great example of something that isn't very helpful for people -reviewing, and it also doesn't tell us anything meaningful about the work that -was done. This is essentially showing everyone your **failed experiments** and -is one of the examples of things that are so objectively unhelpful that we can -even make a rule about it: +This is a great example of something that isn't very helpful for people reviewing, and it also doesn't tell us anything meaningful about the work that was done. This is essentially showing everyone your **failed experiments** and is one of the examples of things that are so objectively unhelpful that we can even make a rule about it: -> Rule 1: Don't waste your reviewer's time by showing them all your failed -> experiments in your Git history. +> Rule 1: Don't waste your reviewer's time by showing them all your failed experiments in your Git history. -Some people might see commits like this and use this as a justification to -recommend squashing commits when merging this PR. I happen to disagree with this -sentiment because I believe this wipes out all the history of what happened in -this PR. Git history is fundamentally useful, as long as it is clean. +Some people might see commits like this and use this as a justification to recommend squashing commits when merging this PR. I happen to disagree with this sentiment because I believe this wipes out all the history of what happened in this PR. Git history is fundamentally useful, as long as it is clean. -In case anyone doesn't know exactly what I mean by "squashing commits when -merging this PR" let me show you the Git history when you do a squash-merge and -compare it to a merge-commit. Here is a screenshot of what the branch looks like -before you have merged anything: +In case anyone doesn't know exactly what I mean by "squashing commits when merging this PR" let me show you the Git history when you do a squash-merge and compare it to a merge-commit. Here is a screenshot of what the branch looks like before you have merged anything: ![Screenshot of a branch that is ready to be merged](/assets/images/posts/2021-05-26-keeping-a-clean-git-history/pr-ready.png) -The following photo is what it looks like when you create a merge commit when -merging on Github (the default behaviour): +The following photo is what it looks like when you create a merge commit when merging on Github (the default behaviour): ![Screenshot of a the branch merged using a merge commit](/assets/images/posts/2021-05-26-keeping-a-clean-git-history/merge-commit.png) -This next photo is the same merge action on Github but this time using the -"squash and merge" functionality of Github: +This next photo is the same merge action on Github but this time using the "squash and merge" functionality of Github: ![Screenshot of a the branch merged using a squash commit](/assets/images/posts/2021-05-26-keeping-a-clean-git-history/squash-commit.png) -You might think that there isn't much of a difference between these screenshots, -and from a "code on disk" perspective you would be right. The same code will be -in the `master` branch at the end of both of these operations, but as you can -see the history is very different. You are only able to see the previous commits -in this example because they are still on the remote `origin/feature/deploy` -branch and I have a local copy of that branch on my computer. If you delete that -remote branch all other contributors to this repo in the future would see a -history that looks a little bit more like this: +You might think that there isn't much of a difference between these screenshots, and from a "code on disk" perspective you would be right. The same code will be in the `master` branch at the end of both of these operations, but as you can see the history is very different. You are only able to see the previous commits in this example because they are still on the remote `origin/feature/deploy` branch and I have a local copy of that branch on my computer. If you delete that remote branch all other contributors to this repo in the future would see a history that looks a little bit more like this: ![Screenshot of a the branch merged using a squash commit](/assets/images/posts/2021-05-26-keeping-a-clean-git-history/actual-history-after-squash.png) -As I mentioned at the beginning of this post, you should always be thinking -about brave explorers that may be digging into the history of your code a year -from now trying to figure out what was done and **why** it was done that way. A -single commit that has a diff with `+4,762 −1,368` changes will be very hard to -understand and will likely slow down anyone who is doing serious code -archaeology. - -These examples all come from a branch that I created for a now deprecated -repository. As it turns out, the branch was so big and the history was so -unhelpful that whoever merged that branch chose to squash and merge so the -history was lost. I was only able to revive the history for these examples using -some extreme git mastery that is far above what a reasonable code archaeologist -should be expected to do when trying to figure out what happened, and which also -doesn't work if you're trying to do a git-bisect to find the source of an issue. - -The answer to this problem is to maintain a Git history closest to the **true -essence** of the work done, creating a number of small PRs that each makes **one -releasable change** to the codebase and keeping the number of commits as low as -possible. The question becomes, how can we effectively do that? +As I mentioned at the beginning of this post, you should always be thinking about brave explorers that may be digging into the history of your code a year from now trying to figure out what was done and **why** it was done that way. A single commit that has a diff with `+4,762 −1,368` changes will be very hard to understand and will likely slow down anyone who is doing serious code archaeology. + +These examples all come from a branch that I created for a now deprecated repository. As it turns out, the branch was so big and the history was so unhelpful that whoever merged that branch chose to squash and merge so the history was lost. I was only able to revive the history for these examples using some extreme git mastery that is far above what a reasonable code archaeologist should be expected to do when trying to figure out what happened, and which also doesn't work if you're trying to do a git-bisect to find the source of an issue. + +The answer to this problem is to maintain a Git history closest to the **true essence** of the work done, creating a number of small PRs that each makes **one releasable change** to the codebase and keeping the number of commits as low as possible. The question becomes, how can we effectively do that? ## Rebasing, fixups, and moderate git mastery - a case study -I'm going to spend some time actually fixing the PR that I was using as an -example in the previous section. This way you can see a practical example and -see a good before-and-after shot to compare the difference. I will also go into -some detail about each technique that I will use to actually perform the changes -in question. - -Some of the techniques that I will be using are rebase, interactive rebase, -fixup, cherrypicking, and commit splitting. Reading this list you might feel -like this article is targeted at the advanced Git user, but I would say that -this is not the case. With a tiny bit of guidance I believe every developer can -start making use of these powerful intermediate git tools and improve their -workflows. - -First things first, if you want to follow along with my examples you will need -to install the Git client called [Fork](https://git-fork.com/). I now use Fork -exclusively when I'm trying to do anything that requires you to have an image of -the Git history in your mind. This is mainly because it gives you such a great -visualisation of the history and you can actively see the effect your changes -have. Each of the examples in the previous section are screenshots from Fork. - -It is also worth mentioning that using Fork is not something that I consider -optional for the techniques that I am about to go through. Sure you can achieve -everything that I'm about to show you using only the command line, but I have -seen much more experienced developers than I struggle and make catastrophic -mistakes while using git on the command line. When people see examples of what I -do regularly with git and think I'm some sort of Git wizard, I usually tell them -that I'm just playing the game on easy mode using a visual Git tool like Fork. -If you take anything away from this article let it be to ignore any gatekeepers -in the industry that might tell you "you're not a real developer if you don't -use Git on the command line" and just start using Fork for 90% of the operations -that you do with Git. - -Now it's time to get started. The first thing that I like to do when trying to -split a giant PR into multiple smaller PRs is to go through each of the commits -and see very roughly what they are doing. This gives you a feeling for what the -overall PR is trying to achieve and it should allow you to locate any smaller -issues that can be fixed right away. To do this I literally just click through -each commit on the branch and browse some of the changes in Fork, starting at -the **bottom** of the branch in Fork because the oldest commit is at the bottom -and the newest is at the top. +I'm going to spend some time actually fixing the PR that I was using as an example in the previous section. This way you can see a practical example and see a good before-and-after shot to compare the difference. I will also go into some detail about each technique that I will use to actually perform the changes in question. + +Some of the techniques that I will be using are rebase, interactive rebase, fixup, cherrypicking, and commit splitting. Reading this list you might feel like this article is targeted at the advanced Git user, but I would say that this is not the case. With a tiny bit of guidance I believe every developer can start making use of these powerful intermediate git tools and improve their workflows. + +First things first, if you want to follow along with my examples you will need to install the Git client called [Fork](https://git-fork.com/). I now use Fork exclusively when I'm trying to do anything that requires you to have an image of the Git history in your mind. This is mainly because it gives you such a great visualisation of the history and you can actively see the effect your changes have. Each of the examples in the previous section are screenshots from Fork. + +It is also worth mentioning that using Fork is not something that I consider optional for the techniques that I am about to go through. Sure you can achieve everything that I'm about to show you using only the command line, but I have seen much more experienced developers than I struggle and make catastrophic mistakes while using git on the command line. When people see examples of what I do regularly with git and think I'm some sort of Git wizard, I usually tell them that I'm just playing the game on easy mode using a visual Git tool like Fork. If you take anything away from this article let it be to ignore any gatekeepers in the industry that might tell you "you're not a real developer if you don't use Git on the command line" and just start using Fork for 90% of the operations that you do with Git. + +Now it's time to get started. The first thing that I like to do when trying to split a giant PR into multiple smaller PRs is to go through each of the commits and see very roughly what they are doing. This gives you a feeling for what the overall PR is trying to achieve and it should allow you to locate any smaller issues that can be fixed right away. To do this I literally just click through each commit on the branch and browse some of the changes in Fork, starting at the **bottom** of the branch in Fork because the oldest commit is at the bottom and the newest is at the top. -Looking through the commits I have already seen a whole bunch of simple issues -that could be fixed. The most obvious and easiest to fix is the pair of commits -`testing percy integration` and `Revert "testing percy integration"`. This is a -perfect example of the thing I said earlier in this post where you **should not -show the reviewer your failed experiments**. If our branch didn't have either of -these commits the outcome would be exactly the same, so let's remove them! +Looking through the commits I have already seen a whole bunch of simple issues that could be fixed. The most obvious and easiest to fix is the pair of commits `testing percy integration` and `Revert "testing percy integration"`. This is a perfect example of the thing I said earlier in this post where you **should not show the reviewer your failed experiments**. If our branch didn't have either of these commits the outcome would be exactly the same, so let's remove them! -Note: Instead of trying to write out the full instructions of how to make these -changes I will demonstrate each of the techniques used in the rest of this post -in an embedded video. This has the benefit of being able to see the exact steps -that I need to do in Fork to achieve the intended goal and avoids any chance -that I missed a step in my description. +Note: Instead of trying to write out the full instructions of how to make these changes I will demonstrate each of the techniques used in the rest of this post in an embedded video. This has the benefit of being able to see the exact steps that I need to do in Fork to achieve the intended goal and avoids any chance that I missed a step in my description. -The next thing that I'm going to demonstrate is using the "fixup" command when -in an interactive rebase. This is another useful tool when trying to not show -the reviewer any of your failed experiments. The way I like to think of this -particular technique is that, firstly, all the commits in your PR should be -considered as being _additive_ in that they are adding a feature or a concept to -the codebase (even if you're actually deleting files). Each of the commits -should be building on top of each other to get from the current state of the -repo to the added concept, and you should do that in a straight line and not -zig-zag back on yourself. What this means in practice is that you should -**never** see a commit that "fixes lint" on something that was added in a -previous commit. So let's **fixup** some of these "fix lint". Commits now. +The next thing that I'm going to demonstrate is using the "fixup" command when in an interactive rebase. This is another useful tool when trying to not show the reviewer any of your failed experiments. The way I like to think of this particular technique is that, firstly, all the commits in your PR should be considered as being _additive_ in that they are adding a feature or a concept to the codebase (even if you're actually deleting files). Each of the commits should be building on top of each other to get from the current state of the repo to the added concept, and you should do that in a straight line and not zig-zag back on yourself. What this means in practice is that you should **never** see a commit that "fixes lint" on something that was added in a previous commit. So let's **fixup** some of these "fix lint". Commits now. -Looking through some of the other commits I can see there is one that fixes some -lint issues that were actually introduced in multiple different commits. This -makes it a tiny bit more difficult to fixup because we can't just apply it to a -single commit in our existing history. The way around this is to split this -single commit into multiple commits using the "edit" command during an -interactive rebase: +Looking through some of the other commits I can see there is one that fixes some lint issues that were actually introduced in multiple different commits. This makes it a tiny bit more difficult to fixup because we can't just apply it to a single commit in our existing history. The way around this is to split this single commit into multiple commits using the "edit" command during an interactive rebase: -Once the commit has been split we can then use fixup again exactly as we did in -the previous example. +Once the commit has been split we can then use fixup again exactly as we did in the previous example. -Now that we have the skills needed to cleanup all the "fix" commits, I'm going -to go ahead and apply these techniques to the rest of the branch. Just to be -clear, I'm not going to use any techniques other than what I have explained so -far in this post. +Now that we have the skills needed to cleanup all the "fix" commits, I'm going to go ahead and apply these techniques to the rest of the branch. Just to be clear, I'm not going to use any techniques other than what I have explained so far in this post. -After about 20 minutes of investigating and rebasing I have ended up with a new -history that is a significant improvement from what we had before +After about 20 minutes of investigating and rebasing I have ended up with a new history that is a significant improvement from what we had before ![Screenshot of an improved history in Fork](/assets/images/posts/2021-05-26-keeping-a-clean-git-history/improved-history.png) -This has improved the commit list from 34 commits to 22! But this is still far -too many commits for a single reviewer to be expected to look at all at once. -The problem that we currently face is that there are multiple "features" or -"logical changes" happening in this branch, and if we were to convert this -branch into a PR then we would be breaking one of my only rules: a PR should -only be making a single logical change. +This has improved the commit list from 34 commits to 22! But this is still far too many commits for a single reviewer to be expected to look at all at once. The problem that we currently face is that there are multiple "features" or "logical changes" happening in this branch, and if we were to convert this branch into a PR then we would be breaking one of my only rules: a PR should only be making a single logical change. -So let's start pulling out some logical Pull requests! I'll start with a super -simple one to demonstrate using interactive rebase or cherry-pick to pull out a -single commit. +So let's start pulling out some logical Pull requests! I'll start with a super simple one to demonstrate using interactive rebase or cherry-pick to pull out a single commit. -As you can see in the video, creating the new branch using interactive rebase or -using cherrypicking results in identical branches. It doesn't matter which -method that you use but I would recommend getting comfortable with each method -as they both can be useful depending on the situation. Once you have this branch -you can go through your normal process of pushing to GitHub and opening a PR. -Once that PR is merged we will then need to rebase our feature branch on master, -which should usually automatically remove the commits that we split out into the -other PR. This time it just needs to be a standard rebase without using -interactive rebase, and it should cause no issues. I have included a quick video -of that process for completeness: +As you can see in the video, creating the new branch using interactive rebase or using cherrypicking results in identical branches. It doesn't matter which method that you use but I would recommend getting comfortable with each method as they both can be useful depending on the situation. Once you have this branch you can go through your normal process of pushing to GitHub and opening a PR. Once that PR is merged we will then need to rebase our feature branch on master, which should usually automatically remove the commits that we split out into the other PR. This time it just needs to be a standard rebase without using interactive rebase, and it should cause no issues. I have included a quick video of that process for completeness: -And that's it! I have now shown you all of the techniques that you need to be -able to clean up your git history and truly make your reviewer's days better. I -would encourage you to try out these techniques and get more comfortable with -them over time, and hopefully you will start reaching for these techniques on a -regular basis. +And that's it! I have now shown you all of the techniques that you need to be able to clean up your git history and truly make your reviewer's days better. I would encourage you to try out these techniques and get more comfortable with them over time, and hopefully you will start reaching for these techniques on a regular basis. -I've spent a little bit of time applying the techniques described above to the -rest of the commits in the `feature/deploy` branch as a demonstration of what it -will ultimately look like. Here it is for reference: +I've spent a little bit of time applying the techniques described above to the rest of the commits in the `feature/deploy` branch as a demonstration of what it will ultimately look like. Here it is for reference: ![Screenshot of the finished version of the branch with everything cleaned up](/assets/images/posts/2021-05-26-keeping-a-clean-git-history/finished-version.png) -This screenshot is a perfect example of a git history in my opinion. It has -plenty of very small PRs that only have one commit in them, allowing the PR to -be reviewed and merged very quickly. It also has clear and understandable -commits in the larger PRs that can be reviewed commit-by-commit if the reviewer -would prefer, while still encapsulating the similar commits in a branch (and not -over-splitting branches and PRs). +This screenshot is a perfect example of a git history in my opinion. It has plenty of very small PRs that only have one commit in them, allowing the PR to be reviewed and merged very quickly. It also has clear and understandable commits in the larger PRs that can be reviewed commit-by-commit if the reviewer would prefer, while still encapsulating the similar commits in a branch (and not over-splitting branches and PRs). ## Summary -When I started writing this post I didn't expect it to be quite as long as it -turned out, but hopefully this can be a holistic guide for anyone who is using -Git but doesn't have a clear mental model for best practices around PRs, -merging, squashing, and rebasing. +When I started writing this post I didn't expect it to be quite as long as it turned out, but hopefully this can be a holistic guide for anyone who is using Git but doesn't have a clear mental model for best practices around PRs, merging, squashing, and rebasing. -While everything in this post is completely optional, I hope that you can see -the benefits and maybe adopt some of the ideas in your own workflow. +While everything in this post is completely optional, I hope that you can see the benefits and maybe adopt some of the ideas in your own workflow. diff --git a/src/posts/2021-06-02-how-to-create-an-interface-inventory.md b/src/posts/2021-06-02-how-to-create-an-interface-inventory.md index 6aa9b72295..e77e9577cf 100644 --- a/src/posts/2021-06-02-how-to-create-an-interface-inventory.md +++ b/src/posts/2021-06-02-how-to-create-an-interface-inventory.md @@ -12,80 +12,53 @@ tagline: | ## Interface inventories 101 -An interface inventory is a categorized collection of every piece of design that -makes up our digital product. They help us capture the status quo of every style -(e.g. colors, typography, spacing, borders) and components of a user interface. +An interface inventory is a categorized collection of every piece of design that makes up our digital product. They help us capture the status quo of every style (e.g. colors, typography, spacing, borders) and components of a user interface. There are many benefits for creating one: -1. They help us gain clarity regarding which design components make up a digital - product. +1. They help us gain clarity regarding which design components make up a digital product. 2. Help us discover and analyze unintentional inconsistencies between them. -3. Is a conversation starter for our team on how to refactor design with a - pattern-based approach. +3. Is a conversation starter for our team on how to refactor design with a pattern-based approach. 4. It serves as a blueprint for a pattern library. -5. And last but not least, it is an aid to communicate and gain buy-in from - stakeholders to establish a design system. +5. And last but not least, it is an aid to communicate and gain buy-in from stakeholders to establish a design system. ![An interface inventory displaying the button category](/assets/images/posts/2021-06-02-interface-inventory/interface_inventory.jpg#@800-1600) ## When should you start? -An interface inventory can be done at any phase of the product development -process. Some teams start when kicking off a redesign or if they are struggling -with confusion due to inconsistencies. However, there also may be no perfect -time to start. If you and your team don't have a clear overview of your digital -design, use that as a sign to get started with an interface inventory. +An interface inventory can be done at any phase of the product development process. Some teams start when kicking off a redesign or if they are struggling with confusion due to inconsistencies. However, there also may be no perfect time to start. If you and your team don't have a clear overview of your digital design, use that as a sign to get started with an interface inventory. ## Planning the project -When planning an interface inventory, we can lean on Nielsen Norman Group's -[guidelines for content inventory and auditing](https://www.nngroup.com/articles/content-audits/). -These ensure we are thinking of people, process, and tools: +When planning an interface inventory, we can lean on Nielsen Norman Group's [guidelines for content inventory and auditing](https://www.nngroup.com/articles/content-audits/). These ensure we are thinking of people, process, and tools: ### 1. People -- Establish ownership: Ensure there is a person responsible for both the process - of creating an inventory and the artifacts that are created as a result. -- Involve others early on: Inform stakeholders, designers, developers, and - product managers–anyone working on building the digital product. Agree on the - inventory criteria (e.g. color, spacing, typography, borders, sizes). -- Provide meaningful updates: Others are more likely to trust and care about - what you do with the interface if you keep them meaningfully informed. Don't - overwhelm with detail, and end with a funny gif (always end with a gif!). +- Establish ownership: Ensure there is a person responsible for both the process of creating an inventory and the artifacts that are created as a result. +- Involve others early on: Inform stakeholders, designers, developers, and product managers–anyone working on building the digital product. Agree on the inventory criteria (e.g. color, spacing, typography, borders, sizes). +- Provide meaningful updates: Others are more likely to trust and care about what you do with the interface if you keep them meaningfully informed. Don't overwhelm with detail, and end with a funny gif (always end with a gif!). ### 2. Process -- Develop a "baby steps" mindset: Break up the effort in small increments. Start - with a manageable yet impactful subset. -- Prioritize core features, the happy path (the optimal user journey), or the - top-level navigation. -- Divide and conquer with collaborators. Give a concrete example of the process - of capturing design for the inventory. +- Develop a "baby steps" mindset: Break up the effort in small increments. Start with a manageable yet impactful subset. +- Prioritize core features, the happy path (the optimal user journey), or the top-level navigation. +- Divide and conquer with collaborators. Give a concrete example of the process of capturing design for the inventory. ### 3. Tools -- Choose a tool that has a low learning curve. Use something that is already in - your toolset and is familiar to collaborators. -- Explore automation tools to gather data. However, ensure people handle the - audit portion. -- Time-box it (e.g. an initial period of 6 weeks). Make some meaningful progress - and gain momentum. +- Choose a tool that has a low learning curve. Use something that is already in your toolset and is familiar to collaborators. +- Explore automation tools to gather data. However, ensure people handle the audit portion. +- Time-box it (e.g. an initial period of 6 weeks). Make some meaningful progress and gain momentum. ## Step-by-step process ### Step 1: Identify the scope -Start off by identifying which part of your digital product you will be creating -an inventory of first. You can decide on starting an inventory of the happy -path, your core features, or your website's top-level navigation. +Start off by identifying which part of your digital product you will be creating an inventory of first. You can decide on starting an inventory of the happy path, your core features, or your website's top-level navigation. ### Step 2: Identify which characteristics you want to inventory -An interface inventory includes specific characteristics which are captured at -several layers. For example, a component (a button) can be captured as such, as -well as through the foundational styles that create it (colors, typography, -icons, spacing). +An interface inventory includes specific characteristics which are captured at several layers. For example, a component (a button) can be captured as such, as well as through the foundational styles that create it (colors, typography, icons, spacing). Use the following as a guideline: @@ -114,70 +87,41 @@ Components are reusable UI elements made with foundations: ### Step 3: Observe the existing CSS -When making an inventory of the foundations, [CSS stats](https://cssstats.com/) -can be a good place to start. CSS Stats is a free and open-source tool to help -visualize stylesheets. You can gain insights on existing layout and structure -(display, float, width, height), spacing (padding & margin), skins (color, -background color, border color, box-shadow), typography (font family, size, -weight, alignment, line height, etc.. ), and border styles. +When making an inventory of the foundations, [CSS stats](https://cssstats.com/) can be a good place to start. CSS Stats is a free and open-source tool to help visualize stylesheets. You can gain insights on existing layout and structure (display, float, width, height), spacing (padding & margin), skins (color, background color, border color, box-shadow), typography (font family, size, weight, alignment, line height, etc.. ), and border styles. ![An interface inventory displaying the icon category](/assets/images/posts/2021-06-02-interface-inventory/css-stats.png#@800-1600) ### Step 4: Manually capture styles in your selected inventory scope -Although it might be tempting to run CSS Stats and call it a day, we recommend -using it only as a first step and manually inspecting all elements in your -chosen scope. This helps us gain an understanding of what is being used where, -which is essential in step 5 (auditing our inventory). - -In order to capture styles, use your browser's developer tools to inspect the -page. Knowing how to use the developer tools is certainly a skill that I -recommend all designers and product experts to add to their tool belt. On -Chrome, right-click anywhere, and click "Inspect" from the bottom of the menu. - -As an alternative, there are many browser extensions made to identify certain -properties on the page, for example: -[WhatFont](https://chrome.google.com/webstore/detail/whatfont/jabopobgcpjmedljpbcaablpmlmfcogm?hl=en) -to identify fonts or -[ColorZilla](https://chrome.google.com/webstore/detail/colorzilla/bhlhnicpbhignbdhedgjhgdocnmhomnp/related?hl=en) -to get the color of any pixel. - -For icons, imagery, and components, simply take screenshots and organize them. -You can use existing pattern libraries as a reference, take a look at this -([curated list](https://designsystemsrepo.com/design-systems)) for inspiration. - -Keep in mind the different kinds of design patterns and use them as a guide for -organizing your interface: - -- **Functional:** Reusable parts of an interface. E.g. header, form elements, - menu. -- **Perceptual:** Describing the brand or aesthetics. E.g. iconography and - imagery styles, colors, typography, spacing and layout, shapes, design motifs, - interactions, animations, sounds. -- **Platform-specific:** Desktop vs mobile (web), and iOS vs Android (native - apps). -- **Domain-specific:** E-commerce (product displays, shopping cart, checkout), - data analysis (grids, charts, visualizations), online learning (progress - indicators, discussion threads). -- **Persuasive:** Cognition, game mechanics (unlock features), perception and - memory (chunking), feedback, social (liking, social proof). +Although it might be tempting to run CSS Stats and call it a day, we recommend using it only as a first step and manually inspecting all elements in your chosen scope. This helps us gain an understanding of what is being used where, which is essential in step 5 (auditing our inventory). + +In order to capture styles, use your browser's developer tools to inspect the page. Knowing how to use the developer tools is certainly a skill that I recommend all designers and product experts to add to their tool belt. On Chrome, right-click anywhere, and click "Inspect" from the bottom of the menu. + +As an alternative, there are many browser extensions made to identify certain properties on the page, for example: [WhatFont](https://chrome.google.com/webstore/detail/whatfont/jabopobgcpjmedljpbcaablpmlmfcogm?hl=en) to identify fonts or [ColorZilla](https://chrome.google.com/webstore/detail/colorzilla/bhlhnicpbhignbdhedgjhgdocnmhomnp/related?hl=en) to get the color of any pixel. + +For icons, imagery, and components, simply take screenshots and organize them. You can use existing pattern libraries as a reference, take a look at this ([curated list](https://designsystemsrepo.com/design-systems)) for inspiration. + +Keep in mind the different kinds of design patterns and use them as a guide for organizing your interface: + +- **Functional:** Reusable parts of an interface. E.g. header, form elements, menu. +- **Perceptual:** Describing the brand or aesthetics. E.g. iconography and imagery styles, colors, typography, spacing and layout, shapes, design motifs, interactions, animations, sounds. +- **Platform-specific:** Desktop vs mobile (web), and iOS vs Android (native apps). +- **Domain-specific:** E-commerce (product displays, shopping cart, checkout), data analysis (grids, charts, visualizations), online learning (progress indicators, discussion threads). +- **Persuasive:** Cognition, game mechanics (unlock features), perception and memory (chunking), feedback, social (liking, social proof). ### Step 5: Audit your inventory -An audit examines and evaluates the quality of the interface in the inventory. -The goal of an audit is to uncover: +An audit examines and evaluates the quality of the interface in the inventory. The goal of an audit is to uncover: - Unintentional inconsistencies - Outdated interface - Gaps that new interface patterns could fill - If a piece of interface should be deprecated -- Whether our design is meeting or failing guidelines (accessibility, examples, - patterns, principles, usage, tone of voice) +- Whether our design is meeting or failing guidelines (accessibility, examples, patterns, principles, usage, tone of voice)   -This is an example of a typography inventory. In this case, the inventory -criteria that were relevant are: +This is an example of a typography inventory. In this case, the inventory criteria that were relevant are: - Font size - Line height @@ -185,44 +129,14 @@ criteria that were relevant are: ![An interface inventory displaying the typography category](/assets/images/posts/2021-06-02-interface-inventory/typography_inventory.png#@800-1600) -Notice that font family and weight were not inventoried, as they were irrelevant -for my goal at the time: to understand what font sizes existed in the live -website so that I could start working with them when I designed new patterns. I -gathered this information for both of our breakpoints (mobile and desktop). The -first step in my audit was to determine whether the color contrast passes or -fails the -[WCAG AA accessibility guidelines](https://www.w3.org/WAI/standards-guidelines/wcag/). -I used WebAIM's -[Color Contrast Checker](https://webaim.org/resources/contrastchecker/). From -here I am able to make informed decisions regarding which font styles should be -deprecated, and which ones should be used in any new component I create. - -As another example, an icon inventory. We can see the plethora of styles and -colors used. In this case, breaking them down further into detailed criteria was -not necessary as it was clear that we would use an icon library to replace most -of them. The inventory helped us make an assessment of what should stay or go -and create guidelines for the future. +Notice that font family and weight were not inventoried, as they were irrelevant for my goal at the time: to understand what font sizes existed in the live website so that I could start working with them when I designed new patterns. I gathered this information for both of our breakpoints (mobile and desktop). The first step in my audit was to determine whether the color contrast passes or fails the [WCAG AA accessibility guidelines](https://www.w3.org/WAI/standards-guidelines/wcag/). I used WebAIM's [Color Contrast Checker](https://webaim.org/resources/contrastchecker/). From here I am able to make informed decisions regarding which font styles should be deprecated, and which ones should be used in any new component I create. + +As another example, an icon inventory. We can see the plethora of styles and colors used. In this case, breaking them down further into detailed criteria was not necessary as it was clear that we would use an icon library to replace most of them. The inventory helped us make an assessment of what should stay or go and create guidelines for the future. ![An interface inventory displaying the icon category](/assets/images/posts/2021-06-02-interface-inventory/icon_inventory.png#@800-1600) ### Step 6: Create a game plan with your team -Once the inventory has been created and audited, it's time to meet relevant -stakeholders and come up with a game plan to remove unintentional -inconsistencies and improve the existing interface. The goal should be to -transition into a pattern-based approach, and in the long run, an interface -inventory can serve as a blueprint for the creation of a pattern library. Since -it is a visual side-by-side comparison of the existing interface, it helps us -communicate the status quo in a tangible way, and it's very effective when -sharing it with stakeholders that are further removed from the digital product -design and development process (ahem...people that decide on budgets and -resources). - -Interface inventories are small but meaningful when transitioning to a design -system approach. Making one can help get the ball rolling in your team as they -help us align and bring in momentum. And know this: even if you do the inventory -and audit on your own, you are never alone. Consider joining the -[design systems community on Slack](https://design.systems/slack/) (it's a great -place to ask questions or get feedback regarding this process), or -[hire a facilitator](/services/workshops/design-system-kickoff-interface-inventory/) -to help make this project a success. +Once the inventory has been created and audited, it's time to meet relevant stakeholders and come up with a game plan to remove unintentional inconsistencies and improve the existing interface. The goal should be to transition into a pattern-based approach, and in the long run, an interface inventory can serve as a blueprint for the creation of a pattern library. Since it is a visual side-by-side comparison of the existing interface, it helps us communicate the status quo in a tangible way, and it's very effective when sharing it with stakeholders that are further removed from the digital product design and development process (ahem...people that decide on budgets and resources). + +Interface inventories are small but meaningful when transitioning to a design system approach. Making one can help get the ball rolling in your team as they help us align and bring in momentum. And know this: even if you do the inventory and audit on your own, you are never alone. Consider joining the [design systems community on Slack](https://design.systems/slack/) (it's a great place to ask questions or get feedback regarding this process), or [hire a facilitator](/services/workshops/design-system-kickoff-interface-inventory/) to help make this project a success. diff --git a/src/posts/2021-07-13-effective-infrastructure-for-efficient-development-workflows.md b/src/posts/2021-07-13-effective-infrastructure-for-efficient-development-workflows.md index b6e434fc0c..bd67869ac6 100644 --- a/src/posts/2021-07-13-effective-infrastructure-for-efficient-development-workflows.md +++ b/src/posts/2021-07-13-effective-infrastructure-for-efficient-development-workflows.md @@ -3,9 +3,7 @@ title: "Effective infrastructure for efficient development workflows" authorHandle: marcoow tags: process bio: "Founder and Managing Director of Mainmatter" -description: - "Marco Otte-Witte on how highly automated and integrated development - infrastructure enables simpler and more effective workflows." +description: "Marco Otte-Witte on how highly automated and integrated development infrastructure enables simpler and more effective workflows." og: image: /assets/images/posts/2021-07-13-effective-infrastructure-for-efficient-development-workflows/og-image.jpg tagline: | @@ -14,268 +12,88 @@ tagline: | ## The machine that builds the machine -Elon Musk famously talks about the real challenge that Tesla faced/s isn't -building cars but building and running the factories for building cars at scale. -He refers to the factories as _"the machine that builds the machine"_ and while -the factories aren't still fully autonomous and can't build cars without human -labor, those humans' productivity is multiplied manyfold through highly -automated and integrated production processes. The same applies to software -development – the code isn't going to write itself anytime soon (although -[we're getting closer to that situation step-by-step](http://copilot.github.com)), -but with the help of integrated and automated infrastructure, developers are -enabled to write code more efficiently, faster, and with more certainty. - -At the core of every development team's developer workflow, there is git (of -course [other](https://www.perforce.com) [version](http://darcs.net) -[control](https://subversion.apache.org) [systems](http://www.nongnu.org/cvs/) -exist as well, but in reality, almost everyone is using git these days). And -while git's cheap and simple (admittedly not everyone agrees about that) -branching model makes it easy for developers to code away in their own branch as -well as rebase and merge their branches back together, the real challenge that -teams are facing is orchestrating just that so that one person's changes -propagate to the codebases others are working on and merged code ends up in the -production system fast, predictably and with certainty. - -Most teams rely on one of two techniques for managing branches and getting -merged code deployed to production: - -- `main` branch plus feature branches: once a pull request is merged, the new - version of the `main` branch is deployed to production automatically. -- `main` or `production` branch, `development` branch and feature branches - branched off of that: pull requests are merged into `development`, and that - branch is merged into `production` in intervals following some sort of - schedule or process. +Elon Musk famously talks about the real challenge that Tesla faced/s isn't building cars but building and running the factories for building cars at scale. He refers to the factories as _"the machine that builds the machine"_ and while the factories aren't still fully autonomous and can't build cars without human labor, those humans' productivity is multiplied manyfold through highly automated and integrated production processes. The same applies to software development – the code isn't going to write itself anytime soon (although [we're getting closer to that situation step-by-step](http://copilot.github.com)), but with the help of integrated and automated infrastructure, developers are enabled to write code more efficiently, faster, and with more certainty. + +At the core of every development team's developer workflow, there is git (of course [other](https://www.perforce.com) [version](http://darcs.net) [control](https://subversion.apache.org) [systems](http://www.nongnu.org/cvs/) exist as well, but in reality, almost everyone is using git these days). And while git's cheap and simple (admittedly not everyone agrees about that) branching model makes it easy for developers to code away in their own branch as well as rebase and merge their branches back together, the real challenge that teams are facing is orchestrating just that so that one person's changes propagate to the codebases others are working on and merged code ends up in the production system fast, predictably and with certainty. + +Most teams rely on one of two techniques for managing branches and getting merged code deployed to production: + +- `main` branch plus feature branches: once a pull request is merged, the new version of the `main` branch is deployed to production automatically. +- `main` or `production` branch, `development` branch and feature branches branched off of that: pull requests are merged into `development`, and that branch is merged into `production` in intervals following some sort of schedule or process. ## Multi-branch setups -While in reality there are thousands of variations of the latter approach, they -are essentially all the same. The goal of those multi-branch setups is to add a -safety net between a pull request being merged and the code being deployed to -the production system. Whenever _"enough"_ changes have accumulated in the -`development` branch (or a scheduled release date has been reached), those -changes would typically go through some kind of testing process where they would -be checked for correctness (and potentially fixed) before eventually making -their way to the production system(s). +While in reality there are thousands of variations of the latter approach, they are essentially all the same. The goal of those multi-branch setups is to add a safety net between a pull request being merged and the code being deployed to the production system. Whenever _"enough"_ changes have accumulated in the `development` branch (or a scheduled release date has been reached), those changes would typically go through some kind of testing process where they would be checked for correctness (and potentially fixed) before eventually making their way to the production system(s). That results in all kinds of inefficiencies though: -- When bugs come up in the `development` branch it's often unclear where they - originate; all kinds of unrelated changes have been merged together in the - branch so it's unclear whether a bug originates in the pull request that - implemented the respective feature or whether it is only caused by the - combination of those changes with others. -- Once bugs or unmet requirements are identified, the developers responsible for - the changes will have switched to a different task already since there's a - delay between the merge of their PR to the `develop` branch and the - testing/validation being performed on that branch. They now have to get back - to something they considered done already, get all the context in their minds - again while at the same time leaving whatever they are working on now behind, - potentially causing problems for others that might be dependant on that work - so that in the worst case whole cascades of focus and context switches are - triggered. -- Changes can only be released to production with a delay. Something might be - done in one week but could potentially only be released the next week or even - later when the next release is scheduled or the testing cycle completes. -- Sometimes these branching models are so complex that developers don't always - understand where to branch from, where to merge back and how to resolve the - conflicts that might occur along the way (after all, rebasing git branches on - top of each other is a key technique to master with git but in reality not - something that all developers are comfortable doing). - -In fact, these branching models and the inefficient workflows they force -developer teams into are almost always only necessary due to a lack of powerful -infrastructure. If that infrastructure is in place with proper automation and -integration, teams are enabled to adopt a much simpler model and workflow: +- When bugs come up in the `development` branch it's often unclear where they originate; all kinds of unrelated changes have been merged together in the branch so it's unclear whether a bug originates in the pull request that implemented the respective feature or whether it is only caused by the combination of those changes with others. +- Once bugs or unmet requirements are identified, the developers responsible for the changes will have switched to a different task already since there's a delay between the merge of their PR to the `develop` branch and the testing/validation being performed on that branch. They now have to get back to something they considered done already, get all the context in their minds again while at the same time leaving whatever they are working on now behind, potentially causing problems for others that might be dependant on that work so that in the worst case whole cascades of focus and context switches are triggered. +- Changes can only be released to production with a delay. Something might be done in one week but could potentially only be released the next week or even later when the next release is scheduled or the testing cycle completes. +- Sometimes these branching models are so complex that developers don't always understand where to branch from, where to merge back and how to resolve the conflicts that might occur along the way (after all, rebasing git branches on top of each other is a key technique to master with git but in reality not something that all developers are comfortable doing). + +In fact, these branching models and the inefficient workflows they force developer teams into are almost always only necessary due to a lack of powerful infrastructure. If that infrastructure is in place with proper automation and integration, teams are enabled to adopt a much simpler model and workflow: ## Single `main` branch with auto-deployment -A branching model with a single `main` branch and feature branches that are -branched off of that and merged back right into it, is conceptually much simpler -obviously. Furthermore, deploying all changes that are merged back into the -`main` branch immediately and automatically, dramatically improves the workflow: - -- Changes can be tested in isolation so it's clear what causes bugs that are - found in the process (unless the bug exists in production already, it has to - be the changes in the respective branch since everything else is just like in - production). -- Developers will not have progressed to a different task yet. Their pull - request is still open and a short feedback loop gives them all the feedback - they need when they need it, thus reducing the need for context switches later - on. -- Changes can be released to production fast without the need to wait for a - release date to arrive or enough other changes to have accumulated to - _"justify"_ a release. -- There's never any uncertainty about what base branch to branch off from, where - to merge something into, what branch to rebase on what base etc. +A branching model with a single `main` branch and feature branches that are branched off of that and merged back right into it, is conceptually much simpler obviously. Furthermore, deploying all changes that are merged back into the `main` branch immediately and automatically, dramatically improves the workflow: + +- Changes can be tested in isolation so it's clear what causes bugs that are found in the process (unless the bug exists in production already, it has to be the changes in the respective branch since everything else is just like in production). +- Developers will not have progressed to a different task yet. Their pull request is still open and a short feedback loop gives them all the feedback they need when they need it, thus reducing the need for context switches later on. +- Changes can be released to production fast without the need to wait for a release date to arrive or enough other changes to have accumulated to _"justify"_ a release. +- There's never any uncertainty about what base branch to branch off from, where to merge something into, what branch to rebase on what base etc. ![Single `main` branch workflow](/assets/images/posts/2021-07-13-effective-infrastructure-for-efficient-development-workflows/workflow.png#@800-1600) -Of course, the challenge is to do all the testing (and QA in the wider sense) -that happens based on some sort of schedule or process in multi-branch models, -for every single pull request – and ideally for multiple pull requests in -parallel to achieve high throughput. **This is where infrastructure and -automation come in.** +Of course, the challenge is to do all the testing (and QA in the wider sense) that happens based on some sort of schedule or process in multi-branch models, for every single pull request – and ideally for multiple pull requests in parallel to achieve high throughput. **This is where infrastructure and automation come in.** ### Testing (sub)systems in isolation -The main building block of any effective developer infrastructure is of course a -good Continuous Integration (CI) system. The most basic task of which being to -run automated checks on a set of code changes to establish baseline correctness. - -Typically the foundation of those checks are some sort of unit tests (or -whatever concept the language/framework of choice uses) to ensure the code in -fact does what it is supposed to. They also help to catch regressions early on -in cases where a change to one feature causes another, seemingly unrelated one -to break. Good test coverage and a fast and stable CI system that runs tests are -an absolute requirement for any development team to be successful. While that's -something that's not really new or controversial in our industry, there's more -than just unit tests that can be leveraged to ensure a set of changes is correct -and doesn't lead to regressions - -- Visual regression testing can be used to ensure the code doesn't just **work** - correctly but the UI it generates also looks right (and doesn't change in - unexpected ways). Visual testing tools like [Percy](http://percy.io) will - report any visual deviation from a baseline caused by a set of code changes - and developers will manually approve (or revert) every single one of those. - That makes all UI changes intentional and avoids accidental changes. Once the - visual changes are approved and the respective code is merged back, they - become part of the visual baseline the next PR is compared against, etc. -- Linting and static analysis, in general, can be a powerful tool to find more - errors and inconsistencies than just particular lines that go against an - agreed-upon coding style. You could lint translation files to ensure all - language files have the same set of keys to prevent missing translations or - prevent the use of `document.cookie` in case you don't want your web app to be - required to render a cookie banner – there are countless opportunities and I - personally believe there's still a lot to do in that area that could have huge - positive impacts on developer teams' efficiency. -- For server systems with databases, migrations can be run against (anonymized) - snapshots of the production database(s) to ensure they in fact modify the data - as expected and won't run into unforeseen errors during deployment. It's also - advisable to test that the server system's currently deployed code runs - correctly with a migration applied and without it since that's usually what - will happen when a deployment is rolled back – while it's easy to roll back - code changes, rolling back migrations is often not an option or the migration - has to run and complete before the respective code changes can be deployed at - all. -- For server systems it's also essential to test the deployment of the code - itself as well as rolling back that deployment. Like with testing migrations, - this should be done with an (anonymized) snapshot of the production database - and all tests should be run on the system after the rollback to ensure it - still operates correctly. - -This list isn't even nearly complete. Carefully analyzing any system and its -history of issues usually reveals countless opportunities to automate checks -that would have prevented those issues or can help prevent other issues in the -future. - -All of these techniques test one (sub)system in isolation. However, many systems -today aren't built as monoliths but as networks of multiple, distributed systems -– e.g. single page apps (SPAs) with their respective server backends or -microservice architectures. In order to be able to auto-deploy any of the -individual subsystems of such architectures, it's critical to validate they -operate correctly in combination with all other subsystems. +The main building block of any effective developer infrastructure is of course a good Continuous Integration (CI) system. The most basic task of which being to run automated checks on a set of code changes to establish baseline correctness. + +Typically the foundation of those checks are some sort of unit tests (or whatever concept the language/framework of choice uses) to ensure the code in fact does what it is supposed to. They also help to catch regressions early on in cases where a change to one feature causes another, seemingly unrelated one to break. Good test coverage and a fast and stable CI system that runs tests are an absolute requirement for any development team to be successful. While that's something that's not really new or controversial in our industry, there's more than just unit tests that can be leveraged to ensure a set of changes is correct and doesn't lead to regressions + +- Visual regression testing can be used to ensure the code doesn't just **work** correctly but the UI it generates also looks right (and doesn't change in unexpected ways). Visual testing tools like [Percy](http://percy.io) will report any visual deviation from a baseline caused by a set of code changes and developers will manually approve (or revert) every single one of those. That makes all UI changes intentional and avoids accidental changes. Once the visual changes are approved and the respective code is merged back, they become part of the visual baseline the next PR is compared against, etc. +- Linting and static analysis, in general, can be a powerful tool to find more errors and inconsistencies than just particular lines that go against an agreed-upon coding style. You could lint translation files to ensure all language files have the same set of keys to prevent missing translations or prevent the use of `document.cookie` in case you don't want your web app to be required to render a cookie banner – there are countless opportunities and I personally believe there's still a lot to do in that area that could have huge positive impacts on developer teams' efficiency. +- For server systems with databases, migrations can be run against (anonymized) snapshots of the production database(s) to ensure they in fact modify the data as expected and won't run into unforeseen errors during deployment. It's also advisable to test that the server system's currently deployed code runs correctly with a migration applied and without it since that's usually what will happen when a deployment is rolled back – while it's easy to roll back code changes, rolling back migrations is often not an option or the migration has to run and complete before the respective code changes can be deployed at all. +- For server systems it's also essential to test the deployment of the code itself as well as rolling back that deployment. Like with testing migrations, this should be done with an (anonymized) snapshot of the production database and all tests should be run on the system after the rollback to ensure it still operates correctly. + +This list isn't even nearly complete. Carefully analyzing any system and its history of issues usually reveals countless opportunities to automate checks that would have prevented those issues or can help prevent other issues in the future. + +All of these techniques test one (sub)system in isolation. However, many systems today aren't built as monoliths but as networks of multiple, distributed systems – e.g. single page apps (SPAs) with their respective server backends or microservice architectures. In order to be able to auto-deploy any of the individual subsystems of such architectures, it's critical to validate they operate correctly in combination with all other subsystems. ### Testing all subsystems together -The key technique for testing a multitude of subsystems together of course is -end-to-end testing (sometimes also referred to as _"integration"_ or -_"acceptance"_ testing – the terminology is a bit unclear in practice, asking -four different people would typically result in five different opinions on the -exact meaning of each of these terms). For a proper end-to-end test, a pull -request that changes the code of one subsystem is tested together with the -respective deployed revisions of all other subsystems. That allows catching -situations where changes to the one subsystem, while completely consistent and -correct within that subsystem, cause problems when interfacing with other -subsystems. Typical examples for such situations would be backward-incompatible -API changes that would cause errors for any client of the API that hasn't been -updated yet. - -Running such tests requires the ability to spin up a complete system including -all of the subsystems on demand. Typically that is achieved by containerizing -all of the systems so that a set of interconnected containers could be started -up on the CI server. In the case of a web app that would mean serving the -frontend app as well as running the API server in two containers and then -running a headless browser to send requests to the frontend app (which would -make requests against the backend) and asserting on the response. - -Besides the simple ability to run these containers any time, another aspect of -this is to maintain an example data set to load into those containers so that -that data can be used in the end-to-end tests. Such datasets are typically -maintained in the form of seed scripts that generate a number of well-defined -resources. If such a setup isn't considered early in the project, this is -particularly hard to build later on when there is a plethora of different -resource types and data stores already – maintaining and evolving that data set -along with the code is much easier and efficient. - -End-to-end tests aren't the only valuable thing that is enabled by the ability -to spin up instances of the system on demand though: - -- Providing fully functional - [preview systems](https://github.com/mainmatter/playbook/tree/master/src/development-process#preview-systems) - for every pull request allows getting stakeholder approval. If there's a - preview link in every pull request that points to what's essentially the same - system that the end-to-end tests run against, allows product managers, - designers, and other stakeholders to see a new feature in action before it is - deployed to production. That way they can give feedback while the developer is - still actively working on the task which again shortens the feedback loop. -- That same system can also be used to do manual QA on a feature. Not everything - can be automatically tested all the time – sometimes it's just necessary for a - human to check for example whether an animation _"feels"_ good. -- To some extent, such an on-demand system could also be used for testing the - performance characteristics of a change. While a containerized system that's - spun up for testing purposes only will never use the same resources or - experience the same load as the real production system, of course, it might be - sufficient to get an idea for the performance characteristics of a feature and - help to identify problems earlier rather than later. - -With all this infrastructure in place, it's possible to move all of the testing -and validation that's done en-block after a whole bunch of pull requests have -been merged in a multi-branch model to the point **before** every individual -pull request is merged. Once it passes all these checks, it can be merged into -the `main` branch and auto-deployed to production with confidence. In fact, this -process can even lead to **increased confidence** in comparison to scheduled big -releases since every single deployment is now also much smaller in scope which -already reduces risk. +The key technique for testing a multitude of subsystems together of course is end-to-end testing (sometimes also referred to as _"integration"_ or _"acceptance"_ testing – the terminology is a bit unclear in practice, asking four different people would typically result in five different opinions on the exact meaning of each of these terms). For a proper end-to-end test, a pull request that changes the code of one subsystem is tested together with the respective deployed revisions of all other subsystems. That allows catching situations where changes to the one subsystem, while completely consistent and correct within that subsystem, cause problems when interfacing with other subsystems. Typical examples for such situations would be backward-incompatible API changes that would cause errors for any client of the API that hasn't been updated yet. + +Running such tests requires the ability to spin up a complete system including all of the subsystems on demand. Typically that is achieved by containerizing all of the systems so that a set of interconnected containers could be started up on the CI server. In the case of a web app that would mean serving the frontend app as well as running the API server in two containers and then running a headless browser to send requests to the frontend app (which would make requests against the backend) and asserting on the response. + +Besides the simple ability to run these containers any time, another aspect of this is to maintain an example data set to load into those containers so that that data can be used in the end-to-end tests. Such datasets are typically maintained in the form of seed scripts that generate a number of well-defined resources. If such a setup isn't considered early in the project, this is particularly hard to build later on when there is a plethora of different resource types and data stores already – maintaining and evolving that data set along with the code is much easier and efficient. + +End-to-end tests aren't the only valuable thing that is enabled by the ability to spin up instances of the system on demand though: + +- Providing fully functional [preview systems](https://github.com/mainmatter/playbook/tree/master/src/development-process#preview-systems) for every pull request allows getting stakeholder approval. If there's a preview link in every pull request that points to what's essentially the same system that the end-to-end tests run against, allows product managers, designers, and other stakeholders to see a new feature in action before it is deployed to production. That way they can give feedback while the developer is still actively working on the task which again shortens the feedback loop. +- That same system can also be used to do manual QA on a feature. Not everything can be automatically tested all the time – sometimes it's just necessary for a human to check for example whether an animation _"feels"_ good. +- To some extent, such an on-demand system could also be used for testing the performance characteristics of a change. While a containerized system that's spun up for testing purposes only will never use the same resources or experience the same load as the real production system, of course, it might be sufficient to get an idea for the performance characteristics of a feature and help to identify problems earlier rather than later. + +With all this infrastructure in place, it's possible to move all of the testing and validation that's done en-block after a whole bunch of pull requests have been merged in a multi-branch model to the point **before** every individual pull request is merged. Once it passes all these checks, it can be merged into the `main` branch and auto-deployed to production with confidence. In fact, this process can even lead to **increased confidence** in comparison to scheduled big releases since every single deployment is now also much smaller in scope which already reduces risk. ### Post deployment -With all that testing and automation in place, it is still possible for things -to blow up in production of course. Besides having error tracking with tools -like [Bugsnag](http://bugsnag.com) or others in place, the ideal infrastructure -also includes a process for running automated smoke tests against the production -system after every single deployment. +With all that testing and automation in place, it is still possible for things to blow up in production of course. Besides having error tracking with tools like [Bugsnag](http://bugsnag.com) or others in place, the ideal infrastructure also includes a process for running automated smoke tests against the production system after every single deployment. -These are quite similar in nature to the end-to-end tests with the main -difference that they run against the production system. Typically those tests -would focus on the main flows of an application that also have the highest -relevance for the business: +These are quite similar in nature to the end-to-end tests with the main difference that they run against the production system. Typically those tests would focus on the main flows of an application that also have the highest relevance for the business: - Can new users still sign up? - Does the payment flow still work? - Are the features that are critical to users still functional? -One concern when running anything automated against the production system – -potentially many times per day – is the amount of test data that is being -produced in the process and that could potentially interfere with analytics or -show up for real users. One way to address that (in the case of web -applications) is to set a custom header that identifies the client as a test -client so that the server can schedule the generated data to be deleted later on -or otherwise be filtered from anything real users can see. +One concern when running anything automated against the production system – potentially many times per day – is the amount of test data that is being produced in the process and that could potentially interfere with analytics or show up for real users. One way to address that (in the case of web applications) is to set a custom header that identifies the client as a test client so that the server can schedule the generated data to be deleted later on or otherwise be filtered from anything real users can see. ## Efficient development workflows based on effective infrastructure -An efficient workflow based on effective infrastructure as described in this -post undoubtedly raises teams to new levels of productivity. Admittedly, it -takes time and effort to set it all up but the productivity gains easily -outweigh the cost. In particular, when considered early on in a project, that -cost isn't even as substantial as it might seem. The cost however of **not** -having infrastructure like this once it's absolutely needed, which is when -trying to scale a team up without scaling down its relative velocity at the same -time, is certainly much higher. +An efficient workflow based on effective infrastructure as described in this post undoubtedly raises teams to new levels of productivity. Admittedly, it takes time and effort to set it all up but the productivity gains easily outweigh the cost. In particular, when considered early on in a project, that cost isn't even as substantial as it might seem. The cost however of **not** having infrastructure like this once it's absolutely needed, which is when trying to scale a team up without scaling down its relative velocity at the same time, is certainly much higher. -_Mainmatter is a digital product development consultancy that helps teams ship -better software faster, more predictably, and with higher quality. If you're -interested in how we could help improve your infrastructure and workflow, -[schedule a call with us](/contact/)._ +_Mainmatter is a digital product development consultancy that helps teams ship better software faster, more predictably, and with higher quality. If you're interested in how we could help improve your infrastructure and workflow, [schedule a call with us](/contact/)._ diff --git a/src/posts/2021-08-26-managing-modals-in-ember.md b/src/posts/2021-08-26-managing-modals-in-ember.md index 2665ce4449..ea9f4875a5 100644 --- a/src/posts/2021-08-26-managing-modals-in-ember.md +++ b/src/posts/2021-08-26-managing-modals-in-ember.md @@ -3,26 +3,20 @@ title: "Managing modal dialogs in Ember.js with Promises" authorHandle: pichfl tags: ember bio: "Consultant for Technology and Design at Mainmatter" -description: - "Exploring better and easier handling of modal dialogs in Ember.js - applications" +description: "Exploring better and easier handling of modal dialogs in Ember.js applications" og: image: /assets/images/posts/2021-08-26-managing-modals-in-ember/og-image.jpg tagline: |

    Modal dialogs are about as widespread as they are missunderstood. No matter if you call them modal windows, popups, popovers, overlays, or dialogs: A thing that asks a question or presents a subordinate task; a general annoyance to developers and accessibility experts alike.

    Even if you use them rarely, most applications will need modal dialogs at some point to ask existential questions. The app asks your user and waits to resolve its uncertainty by their answer.

    --- -Waiting, resolving. JavaScript promises provide an excellent pattern for -managing modals. A rough concept could work like this: +Waiting, resolving. JavaScript promises provide an excellent pattern for managing modals. A rough concept could work like this: 1. Call a method which creates a promise 2. Render a modal into the DOM, pass in a callback to resolve the promise 3. Resolve the promise to unrender the modal and pass back a result -[Tobias](https://github.com/Turbo87) made -[Ember Promise Modals](https://mainmatter.github.io/ember-promise-modals/) so we -don't have to implement this on our own. With this addon, can launch any -component as a modal, wait for a result, and continue with our apps workflow. +[Tobias](https://github.com/Turbo87) made [Ember Promise Modals](https://mainmatter.github.io/ember-promise-modals/) so we don't have to implement this on our own. With this addon, can launch any component as a modal, wait for a result, and continue with our apps workflow. ![Video showing a basic Ember Promise Modals dialog in action](/assets/images/posts/2021-08-26-managing-modals-in-ember/epm.mp4#video) @@ -35,18 +29,9 @@ let result = await this.modals.open('name-of-your-component', { {% endraw %} ``` -This will trigger a modal dialog, which automatically gains focus for its first -focussable element and keyboard accessibility including support for closing the -dialog with ESC as required by -[WAI ARIA best practices](https://www.w3.org/TR/wai-aria-practices-1.1/#dialog_modal) -thanks to the included [focus-trap](https://github.com/davidtheclark/focus-trap) -integration. It will dim the underlying content for you with a customizable -backdrop also. +This will trigger a modal dialog, which automatically gains focus for its first focussable element and keyboard accessibility including support for closing the dialog with ESC as required by [WAI ARIA best practices](https://www.w3.org/TR/wai-aria-practices-1.1/#dialog_modal) thanks to the included [focus-trap](https://github.com/davidtheclark/focus-trap) integration. It will dim the underlying content for you with a customizable backdrop also. -The passed component recieve optional data as `@data` and a `@close` action, -which will close the modal and resolve the promise. Anything passed to the -action will become the value the promise resolves with, making it easy to -communicate data in the preferred Data-Down-Actions-Up pattern of Ember.js. +The passed component recieve optional data as `@data` and a `@close` action, which will close the modal and resolve the promise. Anything passed to the action will become the value the promise resolves with, making it easy to communicate data in the preferred Data-Down-Actions-Up pattern of Ember.js. ```hbs {% raw %} @@ -62,11 +47,7 @@ communicate data in the preferred Data-Down-Actions-Up pattern of Ember.js. ### CSS based animations -For the first stable release, [Nick](https://github.com/nickschot) and -[myself](https://github.com/pichfl) added native CSS animations using -`CSS @keyframes`, which allow for full control over how dialogs and the dimming -backdrop appear and disappear on the screen without hogging render performance. -A nice and swift default animation is provided out of the box. +For the first stable release, [Nick](https://github.com/nickschot) and [myself](https://github.com/pichfl) added native CSS animations using `CSS @keyframes`, which allow for full control over how dialogs and the dimming backdrop appear and disappear on the screen without hogging render performance. A nice and swift default animation is provided out of the box. If you don't like the default, how about something a little more menacing? @@ -87,10 +68,8 @@ If you don't like the default, how about something a little more menacing? } :root { - --epm-animation-modal-in: var(--epm-animation-modal-in-duration) ease-out var( - --epm-animation-modal-in-delay - ) - forwards spiral-in; + --epm-animation-modal-in: var(--epm-animation-modal-in-duration) ease-out + var(--epm-animation-modal-in-delay) forwards spiral-in; --epm-animation-modal-in-duration: 0.7s; } ``` diff --git a/src/posts/2021-11-09-automating-ember-learning-releases-with-rust.md b/src/posts/2021-11-09-automating-ember-learning-releases-with-rust.md index e3ed5adc46..ed5f852698 100644 --- a/src/posts/2021-11-09-automating-ember-learning-releases-with-rust.md +++ b/src/posts/2021-11-09-automating-ember-learning-releases-with-rust.md @@ -3,9 +3,7 @@ title: "Automating Ember releases with Rust" authorHandle: locks tags: "ember" bio: "Senior Frontend Engineer, Ember Framework and Learning Core teams member" -description: - "Ricardo Mendes discusses a command-line tool built in Rust that automates the - releases process for the Ember Core Learning Team" +description: "Ricardo Mendes discusses a command-line tool built in Rust that automates the releases process for the Ember Core Learning Team" og: image: /assets/images/posts/2021-11-09-automating-ember-learning-releases-with-rust/og-image.jpg tagline: | @@ -14,50 +12,18 @@ tagline: | ## Release process for the Ember project -An Ember project release involves 4 different Core teams: Framework, Data, CLI -and Learning. The release is usually done over the period of a week, because -some steps of the release depend on previous steps being completed. The steps -are as follows: - -- The Framework team releases the new version of the Ember npm package, - [ember-source](https://www.npmjs.com/package/ember-source). This package - contains the Ember framework code that is bundled with the app, and provides - the `@ember` module imports that developers use when developing. -- The Data team updates their dependency on `ember-source`, tests that - everything is working as expected and releases a new version of - [ember-data](https://www.npmjs.com/package/ember-data). This package contains - the code for the Ember Data library, which is Ember's default data management - solution. You can read more in the - [Ember Data guides](https://guides.emberjs.com/release/models/). -- The CLI team updates the `ember-source` and `ember-data` dependencies in the - [application](https://github.com/ember-cli/ember-cli/tree/master/blueprints/app) - and - [addon](https://github.com/ember-cli/ember-cli/tree/master/blueprints/addon) - blueprints, tests that everything works as expected and releases a new version - of [ember-cli](https://www.npmjs.com/package/ember-cli). `ember-cli` is a - command-line application that makes it easy to create, build, test and serve - applications locally, as well as generating code such as components, routes - and controllers. You can read more in the - [Ember CLI guides](https://cli.emberjs.com/release/). -- The Learning team releases the relevant versions of the - [Guides](https://guides.emberjs.com/) and the - [API documentation](https://api.emberjs.com/ember/release), updates the - [Releases page](https://emberjs.com/releases/), releases any relevant - [Deprecations](https://deprecations.emberjs.com/), and finally coordinates and - releases the [release blog post](https://blog.emberjs.com/tag/releases). - -The [release blog post](https://blog.emberjs.com/tag/releases) marks the -official release of a new project version, since it means that all of the -sub-projects and relevant documentation is ready and tested for developers to -use and consult. +An Ember project release involves 4 different Core teams: Framework, Data, CLI and Learning. The release is usually done over the period of a week, because some steps of the release depend on previous steps being completed. The steps are as follows: + +- The Framework team releases the new version of the Ember npm package, [ember-source](https://www.npmjs.com/package/ember-source). This package contains the Ember framework code that is bundled with the app, and provides the `@ember` module imports that developers use when developing. +- The Data team updates their dependency on `ember-source`, tests that everything is working as expected and releases a new version of [ember-data](https://www.npmjs.com/package/ember-data). This package contains the code for the Ember Data library, which is Ember's default data management solution. You can read more in the [Ember Data guides](https://guides.emberjs.com/release/models/). +- The CLI team updates the `ember-source` and `ember-data` dependencies in the [application](https://github.com/ember-cli/ember-cli/tree/master/blueprints/app) and [addon](https://github.com/ember-cli/ember-cli/tree/master/blueprints/addon) blueprints, tests that everything works as expected and releases a new version of [ember-cli](https://www.npmjs.com/package/ember-cli). `ember-cli` is a command-line application that makes it easy to create, build, test and serve applications locally, as well as generating code such as components, routes and controllers. You can read more in the [Ember CLI guides](https://cli.emberjs.com/release/). +- The Learning team releases the relevant versions of the [Guides](https://guides.emberjs.com/) and the [API documentation](https://api.emberjs.com/ember/release), updates the [Releases page](https://emberjs.com/releases/), releases any relevant [Deprecations](https://deprecations.emberjs.com/), and finally coordinates and releases the [release blog post](https://blog.emberjs.com/tag/releases). + +The [release blog post](https://blog.emberjs.com/tag/releases) marks the official release of a new project version, since it means that all of the sub-projects and relevant documentation is ready and tested for developers to use and consult. ### The Learning team process -As you might have noticed in the list above, the Learning team touches on -several projects during the course of the release process. The team maintains a -handbook with all the steps of the -[Ember release process](https://github.com/ember-learn/handbook/blob/main/ember-releases.md). -At the time of writing, they are: +As you might have noticed in the list above, the Learning team touches on several projects during the course of the release process. The team maintains a handbook with all the steps of the [Ember release process](https://github.com/ember-learn/handbook/blob/main/ember-releases.md). At the time of writing, they are: 1. Guides 2. API documentation @@ -69,54 +35,27 @@ At the time of writing, they are: 8. Ember Wikipedia 9. Release bot -The steps are a mix of easily automated tasks and tasks that necessitate manual -intervention. +The steps are a mix of easily automated tasks and tasks that necessitate manual intervention. -I started automating this process by creating bash scripts for the Guides -project. The bash scripts turn the manual steps into a guided process with -minimal interface and error handling around them. The scripts assume that you -have the project cloned and does some housekeeping to make sure you don't -accidentally lose any work you were doing when you trigger the release script. -This will be relevant later on. +I started automating this process by creating bash scripts for the Guides project. The bash scripts turn the manual steps into a guided process with minimal interface and error handling around them. The scripts assume that you have the project cloned and does some housekeeping to make sure you don't accidentally lose any work you were doing when you trigger the release script. This will be relevant later on. -Codifying the steps in bash was a big improvement, but we ran into some minor -issues. The first of which is that bash is not a language the developer in the -team are deeply familiar with. This is fine for small scripts, but as soon as -you try to introduce error handling and better ergonomics for the caller of the -script, it becomes considerably harder to write the necessary bash code. +Codifying the steps in bash was a big improvement, but we ran into some minor issues. The first of which is that bash is not a language the developer in the team are deeply familiar with. This is fine for small scripts, but as soon as you try to introduce error handling and better ergonomics for the caller of the script, it becomes considerably harder to write the necessary bash code. -The other reason is that bash is not natively supported on Windows. There are -ways to run bash on Windows systems, but we wanted to reduce incidental -dependencies in order to make releases portable and easier for the user. +The other reason is that bash is not natively supported on Windows. There are ways to run bash on Windows systems, but we wanted to reduce incidental dependencies in order to make releases portable and easier for the user. -So to run all of the steps you would need to clone the relevant repositories and -follow the release handbook line by line to make sure you get the order correct. +So to run all of the steps you would need to clone the relevant repositories and follow the release handbook line by line to make sure you get the order correct. ## Creating tool-new-release -There was still a lot of automation left on the table, so I got to work figuring -out how to improve the situation. When picking what technology I would use for -the tool I had two main concerns: portability, and ease of packaging as a -binary. +There was still a lot of automation left on the table, so I got to work figuring out how to improve the situation. When picking what technology I would use for the tool I had two main concerns: portability, and ease of packaging as a binary. -At the time I was dabbling in Rust and had already made a couple of tools for -myself using that language, so I decided to give Rust a go. Picking Rust also -had the benefit of giving me a single binary that a maintainer can download and -run, not having to deal with runtime and dependencies versions. And so, work -started on [tool-new-release](https://github.com/ember-learn/tool-new-release/). +At the time I was dabbling in Rust and had already made a couple of tools for myself using that language, so I decided to give Rust a go. Picking Rust also had the benefit of giving me a single binary that a maintainer can download and run, not having to deal with runtime and dependencies versions. And so, work started on [tool-new-release](https://github.com/ember-learn/tool-new-release/). ### First steps #### Handling Git -The first things I needed were a library to handle `git` operations, and a -library to generate temporary folders that I could clone the repositories into. -The decision to clone the relevant repositories into temporary folders was -twofold: ensure the tool is working with the most recent commits of the -repository, and clean up the repositories after the tool was done running. I -decided to go with [`git2-rs`](https://docs.rs/git2/0.13.22/git2/) and -[`tempfile`](https://docs.rs/tempfile/3.2.0/tempfile/), which looks something -like this: +The first things I needed were a library to handle `git` operations, and a library to generate temporary folders that I could clone the repositories into. The decision to clone the relevant repositories into temporary folders was twofold: ensure the tool is working with the most recent commits of the repository, and clean up the repositories after the tool was done running. I decided to go with [`git2-rs`](https://docs.rs/git2/0.13.22/git2/) and [`tempfile`](https://docs.rs/tempfile/3.2.0/tempfile/), which looks something like this: ```rust use tempfile::tempdir; @@ -127,18 +66,11 @@ folder.push("guides-source"); let repo = Repository::clone("https://github.com/ember-learn/guides-source.git", &folder)?; ``` -In the actual tool a temporary folder is created at the top that is then fed to -the different steps so they can manage the cloning they need to do. +In the actual tool a temporary folder is created at the top that is then fed to the different steps so they can manage the cloning they need to do. #### Shelling out -Determined to have a viable release tool as quickly as possible and afterwards -iterate for improvements, I decided to call the `Bash` scripts already present -in the -[`guides-source` repository](https://github.com/ember-learn/guides-source/tree/5ec89c42179aa41cbb00a25ef9244e14977a0e72/scripts) -using -[`std::process::Command`](https://doc.rust-lang.org/std/process/struct.Command.html) -from Rust's standard library: +Determined to have a viable release tool as quickly as possible and afterwards iterate for improvements, I decided to call the `Bash` scripts already present in the [`guides-source` repository](https://github.com/ember-learn/guides-source/tree/5ec89c42179aa41cbb00a25ef9244e14977a0e72/scripts) using [`std::process::Command`](https://doc.rust-lang.org/std/process/struct.Command.html) from Rust's standard library: ```rust use std::process::Command; @@ -153,17 +85,11 @@ Command::new("npm") .expect("Failed to release guides."); ``` -While shelling out did not improve on the portability problem, making the tool -do something useful was a motivator to keep developing it. +While shelling out did not improve on the portability problem, making the tool do something useful was a motivator to keep developing it. #### Providing command-line arguments -Next I added [`structopt`](https://docs.rs/structopt/0.3.23/structopt/) to -provide command-line argument parsing. This would be useful to allow the user to -select which project they want to run the release steps for, to provide the -target version, and more. `structopt` makes it really straightforward to -implement interfaces using native Rust structures. Here's an example of a -`--project` flag that accepts either `Guides` or `Api` as values: +Next I added [`structopt`](https://docs.rs/structopt/0.3.23/structopt/) to provide command-line argument parsing. This would be useful to allow the user to select which project they want to run the release steps for, to provide the target version, and more. `structopt` makes it really straightforward to implement interfaces using native Rust structures. Here's an example of a `--project` flag that accepts either `Guides` or `Api` as values: ```rust #[derive(Debug, StructOpt)] @@ -181,8 +107,7 @@ struct Opts { } ``` -I want to note that this also gives us documentation via the `--help` flag out -of the box: +I want to note that this also gives us documentation via the `--help` flag out of the box: ```bash $ tool-new-release --help @@ -199,30 +124,16 @@ OPTIONS: -p, --project Pick which project to run the deploy pipeline for [possible values: Guides, Api] ``` -Now that I had the basics of the tool working for Guides and API documentation, -it was time to make it available for other people. +Now that I had the basics of the tool working for Guides and API documentation, it was time to make it available for other people. ### Releasing the tool -I wanted the tool to be useable from Linux, Windows and macOS so I had to figure -out a way to build the Rust project to those targets. Since the project is -hosted on GitHub, I could use GitHub Actions to build the project for me, and -then make a release. +I wanted the tool to be useable from Linux, Windows and macOS so I had to figure out a way to build the Rust project to those targets. Since the project is hosted on GitHub, I could use GitHub Actions to build the project for me, and then make a release. -After some research I was able to put together a GitHub Action workflow. You can -see it currently look like in the repository's -[`workflows` directory](https://github.com/ember-learn/tool-new-release/tree/main/.github/workflows) -and if you have any suggestions, please -[let me know](https://twitter.com/locks)! The project is still a work in -progress so you might find things that are not done optimally. +After some research I was able to put together a GitHub Action workflow. You can see it currently look like in the repository's [`workflows` directory](https://github.com/ember-learn/tool-new-release/tree/main/.github/workflows) and if you have any suggestions, please [let me know](https://twitter.com/locks)! The project is still a work in progress so you might find things that are not done optimally. -There's two things I'd like to point out in the workflow. One is that I ended up -using [`musl`](https://musl.libc.org/) through `rustup` in order to build the -Linux binary. The other is that I'm currently publishing the binary as a -_draft_, so it will not show up on the homepage of the repository. +There's two things I'd like to point out in the workflow. One is that I ended up using [`musl`](https://musl.libc.org/) through `rustup` in order to build the Linux binary. The other is that I'm currently publishing the binary as a _draft_, so it will not show up on the homepage of the repository. ## Next steps -Now that the Core Learning team had a working tool, it was time to codify the -rest of the steps and apply some improvements to make the tool easier to use and -to maintain. I will cover that and more in future posts, so keep an eye out! +Now that the Core Learning team had a working tool, it was time to codify the rest of the steps and apply some improvements to make the tool easier to use and to maintain. I will cover that and more in future posts, so keep an eye out! diff --git a/src/posts/2021-11-26-publish-on-npm.md b/src/posts/2021-11-26-publish-on-npm.md index 0b856b5a3f..4b0879fb37 100644 --- a/src/posts/2021-11-26-publish-on-npm.md +++ b/src/posts/2021-11-26-publish-on-npm.md @@ -3,9 +3,7 @@ title: "3 ways you can improve your npm publish" authorHandle: tobiasbieniek tags: javascript bio: "Senior Software Engineer" -description: - "Tobias Bieniek explains mechanisms for automating npm releases for reduced - effort and improved reliability with lerna-changelog and release-it." +description: "Tobias Bieniek explains mechanisms for automating npm releases for reduced effort and improved reliability with lerna-changelog and release-it." og: image: /assets/images/posts/2021-11-26-publish-on-npm/og-image.jpg tagline: | @@ -16,25 +14,13 @@ imageAlt: "Woman reading code documentation at her laptop" ## Let CI do the work -While you can run `npm publish` locally, it can cause issues. I'm personally -using [JetBrains IntelliJ](https://www.jetbrains.com/idea/) to develop software -and it puts an `.idea` folder in each project. I've stopped counting how many -times I've accidentally published this folder to npm in the past… +While you can run `npm publish` locally, it can cause issues. I'm personally using [JetBrains IntelliJ](https://www.jetbrains.com/idea/) to develop software and it puts an `.idea` folder in each project. I've stopped counting how many times I've accidentally published this folder to npm in the past… -I've managed to not commit this folder to any of our git repositories because -I've set up a -[global `.gitignore` file](https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files#configuring-ignored-files-for-all-repositories-on-your-computer), -but unfortunately no such thing exists for `.npmignore` files. 😢 +I've managed to not commit this folder to any of our git repositories because I've set up a [global `.gitignore` file](https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files#configuring-ignored-files-for-all-repositories-on-your-computer), but unfortunately no such thing exists for `.npmignore` files. 😢 -There are obviously other ways to avoid this issue, but we've found that one of -the easiest ways is to just not publish from your local machine, and instead -have your CI workflow publish the package whenever you push a tag to the -repository. As an added benefit: you'll never forget to push the tag to the -repository because it's now required to actually publish the package! 🥳 +There are obviously other ways to avoid this issue, but we've found that one of the easiest ways is to just not publish from your local machine, and instead have your CI workflow publish the package whenever you push a tag to the repository. As an added benefit: you'll never forget to push the tag to the repository because it's now required to actually publish the package! 🥳 -How to set this up largely depends on what CI system you are using. For our -open-source projects we use GitHub Actions these days, and a typical `release` -workflow file looks like this: +How to set this up largely depends on what CI system you are using. For our open-source projects we use GitHub Actions these days, and a typical `release` workflow file looks like this: ```yaml name: Release @@ -63,26 +49,15 @@ jobs: Let's go through this file step by step… -The `name` field describes what this workflow will be called in the GitHub -Actions user interface. +The `name` field describes what this workflow will be called in the GitHub Actions user interface. -The `on` object specifies when this workflow should run. In this case we are -configuring it to run whenever a tag is pushed to the repository, and the `*` -wildcard means that we don't care about what the exact tag name is. +The `on` object specifies when this workflow should run. In this case we are configuring it to run whenever a tag is pushed to the repository, and the `*` wildcard means that we don't care about what the exact tag name is. -`jobs` is a bit misleading, because in this workflow we only have a single job: -`release`. In this job we will first copy the code onto the CI machine -(`checkout`), and then setup Node.js. It is important here to explicitly specify -the `registry-url` because otherwise the following `npm publish` command won't -work. Here, we just use the official npm registry, but it is equally possible to -publish packages to a company-internal private registry, if needed. +`jobs` is a bit misleading, because in this workflow we only have a single job: `release`. In this job we will first copy the code onto the CI machine (`checkout`), and then setup Node.js. It is important here to explicitly specify the `registry-url` because otherwise the following `npm publish` command won't work. Here, we just use the official npm registry, but it is equally possible to publish packages to a company-internal private registry, if needed. -Lastly, we call `npm publish`. For this to succeed we need to be logged in… -which we are not 🙈 +Lastly, we call `npm publish`. For this to succeed we need to be logged in… which we are not 🙈 -An alternative to using `npm login` on CI is providing an "access token" through -e.g. the `NODE_AUTH_TOKEN` environment variable. But where do you get such a -token? The answer is: on the npm website: +An alternative to using `npm login` on CI is providing an "access token" through e.g. the `NODE_AUTH_TOKEN` environment variable. But where do you get such a token? The answer is: on the npm website: - Go to - Log in, if you haven't already @@ -92,54 +67,29 @@ token? The answer is: on the npm website: - Select the "Automation" token type - Click the "Generate Token" button -Now you can copy the newly generated token and save it as a `NPM_TOKEN` secret -in the settings of your GitHub repository. +Now you can copy the newly generated token and save it as a `NPM_TOKEN` secret in the settings of your GitHub repository. -While this generally works great for us, there are currently at least two -downsides of this approach that you should be aware of: +While this generally works great for us, there are currently at least two downsides of this approach that you should be aware of: -- There is no difference anymore between commit/push access and publish access. - This means that anyone that can push to your repository can now also publish - new releases on npm. This is usually not a big problem, but you should be - aware that it removes one of the security layers from the publishing process - in favor of the CI publishing convenience. +- There is no difference anymore between commit/push access and publish access. This means that anyone that can push to your repository can now also publish new releases on npm. This is usually not a big problem, but you should be aware that it removes one of the security layers from the publishing process in favor of the CI publishing convenience. -- The generated npm token currently provides publish access to **all** npm - packages that the account has access to. Fixing this is on the roadmap of the - npm team, and at some point you will be able to generate tokens that can only - access a subset of your projects. +- The generated npm token currently provides publish access to **all** npm packages that the account has access to. Fixing this is on the roadmap of the npm team, and at some point you will be able to generate tokens that can only access a subset of your projects. -For us, the convenience of only having to push a tag currently outweighs the -disadvantages mentioned above, but it is still valuable to know what the -tradeoffs are. +For us, the convenience of only having to push a tag currently outweighs the disadvantages mentioned above, but it is still valuable to know what the tradeoffs are. ## Keep a change log -When you see that one of your dependencies has an update available, how do you -figure out what changed between your current version and the update? +When you see that one of your dependencies has an update available, how do you figure out what changed between your current version and the update? -You can look at the diff of the two versions, but that usually requires somewhat -deep knowledge of how the dependency works internally. In an ideal world every -project would have a `CHANGELOG.md` file, that describes what has changed -between the individual versions. Unfortunately, not all projects keep such a -file because maintaining such a file is often perceived as a significant -workload. +You can look at the diff of the two versions, but that usually requires somewhat deep knowledge of how the dependency works internally. In an ideal world every project would have a `CHANGELOG.md` file, that describes what has changed between the individual versions. Unfortunately, not all projects keep such a file because maintaining such a file is often perceived as a significant workload. -To reduce the work that is needed to maintain a changelog file we can use -changelog generators. These tools usually look at the git commits between the -current version and the last release and output an overview of what the relevant -changes were. +To reduce the work that is needed to maintain a changelog file we can use changelog generators. These tools usually look at the git commits between the current version and the last release and output an overview of what the relevant changes were. The changelog generator that we like to use at Mainmatter is: [lerna-changelog]. [lerna-changelog]: https://github.com/lerna/lerna-changelog -We don't want to go into too much detail here, but this is essentially how it -works: lerna-changelog looks at the commits and searches for commit messages -that look like pull-request merge commits. It then requests more information -about the corresponding pull-requests from the GitHub API, including the labels -of that pull-request. Next, it groups the PRs by their labels and outputs them -based on that grouping. +We don't want to go into too much detail here, but this is essentially how it works: lerna-changelog looks at the commits and searches for commit messages that look like pull-request merge commits. It then requests more information about the corresponding pull-requests from the GitHub API, including the labels of that pull-request. Next, it groups the PRs by their labels and outputs them based on that grouping. Here is an example of the lerna-changelog changelog itself: @@ -148,18 +98,13 @@ Here is an example of the lerna-changelog changelog itself: #### :bug: Bug Fix -- [#296](https://github.com/lerna/lerna-changelog/pull/296) Omit commiters line - when all are filtered out ([@petrch87](https://github.com/petrch87)) -- [#398](https://github.com/lerna/lerna-changelog/pull/398) Fix handling of - --next-version-from-metadata option - ([@contolini](https://github.com/contolini)) +- [#296](https://github.com/lerna/lerna-changelog/pull/296) Omit commiters line when all are filtered out ([@petrch87](https://github.com/petrch87)) +- [#398](https://github.com/lerna/lerna-changelog/pull/398) Fix handling of --next-version-from-metadata option ([@contolini](https://github.com/contolini)) #### :house: Internal -- [#494](https://github.com/lerna/lerna-changelog/pull/494) Update yargs to - v17.x ([@Turbo87](https://github.com/Turbo87)) -- [#493](https://github.com/lerna/lerna-changelog/pull/493) CI: Run - `pnpm install` before `npm publish` ([@Turbo87](https://github.com/Turbo87)) +- [#494](https://github.com/lerna/lerna-changelog/pull/494) Update yargs to v17.x ([@Turbo87](https://github.com/Turbo87)) +- [#493](https://github.com/lerna/lerna-changelog/pull/493) CI: Run `pnpm install` before `npm publish` ([@Turbo87](https://github.com/Turbo87)) #### Committers: 3 @@ -168,8 +113,7 @@ Here is an example of the lerna-changelog changelog itself: - Tobias Bieniek ([@Turbo87](https://github.com/Turbo87)) ``` -One thing to be aware of is that lerna-changelog will only include PRs in the -changelog that have one of these supported labels: +One thing to be aware of is that lerna-changelog will only include PRs in the changelog that have one of these supported labels: - `breaking` (💥 Breaking Change) - `enhancement` (🚀 Enhancement) @@ -177,31 +121,21 @@ changelog that have one of these supported labels: - `documentation` (📝 Documentation) - `internal` (🏠 Internal) -These labels are configurable, but using a label that is not configured might -cause the PR to not show up in the listing. This behavior is an ongoing -discussion and might change in the future, but this is currently how it works. +These labels are configurable, but using a label that is not configured might cause the PR to not show up in the listing. This behavior is an ongoing discussion and might change in the future, but this is currently how it works. -The way to use lerna-changelog is: when you bump the `version` in your -`package.json` file, commit that change, and tag the commit, but you should also -update the `CHANGELOG.md` with the latest changes for that particular version: +The way to use lerna-changelog is: when you bump the `version` in your `package.json` file, commit that change, and tag the commit, but you should also update the `CHANGELOG.md` with the latest changes for that particular version: ```bash npx lerna-changelog ``` -lerna-changelog usually figures out automatically what the last published -version was, but if that does not work you can help by providing the `--from` -CLI option. Similarly, if it can't figure out the GitHub URL of the project, you -can help by setting it manually via `--repo`. +lerna-changelog usually figures out automatically what the last published version was, but if that does not work you can help by providing the `--from` CLI option. Similarly, if it can't figure out the GitHub URL of the project, you can help by setting it manually via `--repo`. ## Automate everything -Now that we've made our publishing process more complicated again by needing to -update the changelog, let's simplify it by automating everything. 🤖 +Now that we've made our publishing process more complicated again by needing to update the changelog, let's simplify it by automating everything. 🤖 -There is a CLI tool on npm called -[`release-it`](https://github.com/release-it/release-it), which describes itself -as: +There is a CLI tool on npm called [`release-it`](https://github.com/release-it/release-it), which describes itself as: > Generic CLI tool to automate versioning and package publishing related tasks @@ -233,51 +167,26 @@ module.exports = { {% endraw %} ``` -In the `plugins` section we specify that we want to use the -[`release-it-lerna-changelog`](https://github.com/rwjblue/release-it-lerna-changelog) -plugin to integrate lerna-changelog in our release process. +In the `plugins` section we specify that we want to use the [`release-it-lerna-changelog`](https://github.com/rwjblue/release-it-lerna-changelog) plugin to integrate lerna-changelog in our release process. -The `git` section configures what the commit message and tag names are supposed -to look like, and in the `github` section we specify that we would also like to -automatically create a "Release" on GitHub with the corresponding changelog -attached. +The `git` section configures what the commit message and tag names are supposed to look like, and in the `github` section we specify that we would also like to automatically create a "Release" on GitHub with the corresponding changelog attached. -Finally, we want to take advantage of our automatic CI publishing process, so we -tell `release-it` to not run `npm publish` for us. +Finally, we want to take advantage of our automatic CI publishing process, so we tell `release-it` to not run `npm publish` for us. -After adding `release-it` and `release-it-lerna-changelog` as dev dependencies, -and putting the configuration above in a `.release-it.js` file we can run the -tool to see how it works: +After adding `release-it` and `release-it-lerna-changelog` as dev dependencies, and putting the configuration above in a `.release-it.js` file we can run the tool to see how it works: ```bash npx release-it ``` -The first thing that `release-it` does is assembling the changelog, so that you -can better judge whether this should be a major, minor or patch release. -Conveniently, it asks you this exact question right after showing you the -changelog preview. - -Once you have chosen the version number, it will update the `version` field in -the `package.json` file and update the `CHANGELOG.md`. Afterwards it will ask -you to confirm that the files should be committed like this, and if you confirm, -it will ask you whether the new commit should now be tagged. The cool part is -that you can abort at any time and `release-it` will automatically clean up and -revert you to the same state as before. - -The final two confirmations are for pushing the commit and tag to GitHub and -then creating the Release on GitHub. Once all of this is confirmed you can sit -back and watch the CI machines take over. - -To summarize, releasing a new version is now only a matter of running -`release-it`, choosing a version number and then confirming a few actions, which -usually shouldn't take more than a few seconds. As a bonus, this updated release -process will automatically maintain the `CHANGELOG.md` file for you! - -The instructions in this blog post were primarily aimed at JavaScript projects -that are hosted on GitHub, but we've also set up similar processes, tools and -automations for projects on private GitLab instances, Rust projects, and also -with different changelog generators. If you need any help setting this up, don't -hesitate to [contact] us. +The first thing that `release-it` does is assembling the changelog, so that you can better judge whether this should be a major, minor or patch release. Conveniently, it asks you this exact question right after showing you the changelog preview. + +Once you have chosen the version number, it will update the `version` field in the `package.json` file and update the `CHANGELOG.md`. Afterwards it will ask you to confirm that the files should be committed like this, and if you confirm, it will ask you whether the new commit should now be tagged. The cool part is that you can abort at any time and `release-it` will automatically clean up and revert you to the same state as before. + +The final two confirmations are for pushing the commit and tag to GitHub and then creating the Release on GitHub. Once all of this is confirmed you can sit back and watch the CI machines take over. + +To summarize, releasing a new version is now only a matter of running `release-it`, choosing a version number and then confirming a few actions, which usually shouldn't take more than a few seconds. As a bonus, this updated release process will automatically maintain the `CHANGELOG.md` file for you! + +The instructions in this blog post were primarily aimed at JavaScript projects that are hosted on GitHub, but we've also set up similar processes, tools and automations for projects on private GitLab instances, Rust projects, and also with different changelog generators. If you need any help setting this up, don't hesitate to [contact] us. [contact]: https://mainmatter.com/contact/ diff --git a/src/posts/2021-12-08-validations-in-ember-apps.md b/src/posts/2021-12-08-validations-in-ember-apps.md index 7b3ce956f7..b4263ebf1d 100644 --- a/src/posts/2021-12-08-validations-in-ember-apps.md +++ b/src/posts/2021-12-08-validations-in-ember-apps.md @@ -3,9 +3,7 @@ title: "Data validation in Ember with Yup" authorHandle: BobrImperator tags: ember bio: "Software Developer" -description: - "Bartlomiej Dudzik shows how you can easily create validations wrapper based - on a library of your liking." +description: "Bartlomiej Dudzik shows how you can easily create validations wrapper based on a library of your liking." og: image: /assets/images/posts/2021-12-08-validations-in-ember-apps/og-image.jpg tagline: | @@ -15,11 +13,7 @@ imageAlt: Data validation in Ember with Yup illustration ### Quick look at Yup -Yup provides factory methods for different data types that you can use to -construct schemas and their constraints for your data. The following code -imports the `string` schema, and calls the `required` and `email` methods to -describe what type of data is allowed. The returned schema `emailRequired` -validates values to be "a valid non-empty string that matches an email pattern". +Yup provides factory methods for different data types that you can use to construct schemas and their constraints for your data. The following code imports the `string` schema, and calls the `required` and `email` methods to describe what type of data is allowed. The returned schema `emailRequired` validates values to be "a valid non-empty string that matches an email pattern". ```javascript import { string } from "yup"; @@ -33,8 +27,7 @@ emailRequired.isValid("wrong.email.com").then(function (valid) { #### Describing objects with Yup -Let's see how we can create a schema that describes some complex data. Here's -some example found in the Yup docs: +Let's see how we can create a schema that describes some complex data. Here's some example found in the Yup docs: ```javascript import { object, string, number, date } from "yup"; @@ -50,8 +43,7 @@ const schema = object().shape({ }); ``` -`object().shape()` takes an object as an argument whose key values are other Yup -schemas, then it returns a schema that we can cast or validate against i.e +`object().shape()` takes an object as an argument whose key values are other Yup schemas, then it returns a schema that we can cast or validate against i.e ```javascript schema @@ -121,32 +113,18 @@ export default class YupValidations { That's it :) Let's go through it real quick. -There are 4 properties defined `context`, `schema`, `shape` and `error` which is -`@tracked`. +There are 4 properties defined `context`, `schema`, `shape` and `error` which is `@tracked`. -- `context` is either the data or the whole instance of the object we're - validating. +- `context` is either the data or the whole instance of the object we're validating. - `shape` the expected shape of the data; this is used to create `schema` - `schema` is a Yup schema created from `shape` -- `error` is a `ValidationError` thrown by `schema.validate()` when the data - doesn't match the `schema`. - -The constructor takes 2 arguments `context` and `shape`, we set those on the -instance as well as create `schema` off of `shape`. - -- `fieldErrors` is a computed property that returns an object which keys are - paths to the schemas that failed validations. The object is created by - reducing a list of errors read from `ValidationError`. - -- `validate` is an asynchronous method that calls `validate` on our `schema`, - awaits the result, resets errors if validations pass, otherwise catches an - error and sets it on the class instance. It's important that the - `abortEarly: false` option is passed to `schema.validate()` as otherwise if - any field would throw an error, it would stop validating the rest of the data, - which is not desired. Furthermore `validate` receives data returned from - `#validationProperties`, the reason for that being Ember Proxies. In order to - correctly support proxies, e.g Ember-Data models, we need to grab data from - `context` with the help of `getProperties`. +- `error` is a `ValidationError` thrown by `schema.validate()` when the data doesn't match the `schema`. + +The constructor takes 2 arguments `context` and `shape`, we set those on the instance as well as create `schema` off of `shape`. + +- `fieldErrors` is a computed property that returns an object which keys are paths to the schemas that failed validations. The object is created by reducing a list of errors read from `ValidationError`. + +- `validate` is an asynchronous method that calls `validate` on our `schema`, awaits the result, resets errors if validations pass, otherwise catches an error and sets it on the class instance. It's important that the `abortEarly: false` option is passed to `schema.validate()` as otherwise if any field would throw an error, it would stop validating the rest of the data, which is not desired. Furthermore `validate` receives data returned from `#validationProperties`, the reason for that being Ember Proxies. In order to correctly support proxies, e.g Ember-Data models, we need to grab data from `context` with the help of `getProperties`. #### Usage @@ -167,12 +145,9 @@ export default class UserModel extends Model { } ``` -We instantiate YupValidations and pass it some arguments, a User model instance, -and Yup **shape**. +We instantiate YupValidations and pass it some arguments, a User model instance, and Yup **shape**. -Later, inside a form component I'd like to be able to just call -`YupValidations#validate` method which returns a Promise that resolves to a -Boolean. +Later, inside a form component I'd like to be able to just call `YupValidations#validate` method which returns a Promise that resolves to a Boolean. ```javascript import Component from "@glimmer/component"; @@ -195,10 +170,7 @@ export default class UserFormComponent extends Component { } ``` -Further on, there's an `ErrorMessage` component that receives a **list** of -error messages and handles them in some way. Normally we'd show -internationalized messages with the help of `ember-intl`, but in our case we'll -just show their keys directly like so: +Further on, there's an `ErrorMessage` component that receives a **list** of error messages and handles them in some way. Normally we'd show internationalized messages with the help of `ember-intl`, but in our case we'll just show their keys directly like so: ```hbs {% raw %} @@ -222,13 +194,9 @@ Finally the component invocation: #### Internationalization -Yup by default returns messages in plain text based on some built-in templates -and some way of concatenation. That's not an option for us though because in -Ember apps we normally use `ember-intl` for translating text. Luckily Yup allows -to use functions that will produce messages. +Yup by default returns messages in plain text based on some built-in templates and some way of concatenation. That's not an option for us though because in Ember apps we normally use `ember-intl` for translating text. Luckily Yup allows to use functions that will produce messages. -The full list of messages can be found in -[Yup's source code](https://github.com/jquense/yup/blob/master/src/locale.ts) +The full list of messages can be found in [Yup's source code](https://github.com/jquense/yup/blob/master/src/locale.ts) ```javascript import { setLocale } from ‘yup’; @@ -256,12 +224,7 @@ setLocale({ }) ``` -`locale` is a higher order function that returns a function that is later used -by Yup to produce our messages. The first argument it takes is a translation key -of our liking that would then be consumed by `ember-intl` e.g `field.invalid`. -The second argument is a list of fields it should get from `validationParams` -that we receive from Yup, the parameters could have values like `min` and `max` -that would be passed to `ember-intl` `t` helper. +`locale` is a higher order function that returns a function that is later used by Yup to produce our messages. The first argument it takes is a translation key of our liking that would then be consumed by `ember-intl` e.g `field.invalid`. The second argument is a list of fields it should get from `validationParams` that we receive from Yup, the parameters could have values like `min` and `max` that would be passed to `ember-intl` `t` helper. At the end of the day the produced messages will look like this: @@ -281,15 +244,13 @@ At the end of the day the produced messages will look like this: } ``` -Let's see what messages are returned after the `User` model is validated when -the form is submitted: +Let's see what messages are returned after the `User` model is validated when the form is submitted: ![Internationalized user fields demo](/assets/images/posts/2021-12-08-validations-in-ember-apps/form-user-1.gif) ### Validating related schemas -As you could see before, pets aren't being validated yet. There are 2 things -that need to be done first: +As you could see before, pets aren't being validated yet. There are 2 things that need to be done first: - Create validations for the `Pet` model. - Validate pets when the user is validated. @@ -312,18 +273,12 @@ export default class PetModel extends Model { } ``` -Now let's take a look at the code for connecting the validations for `User` and -`Pet`. This will validate pets when a `User` is validated. +Now let's take a look at the code for connecting the validations for `User` and `Pet`. This will validate pets when a `User` is validated. -Yup has a public API for extending schemas as well as creating custom tests, -both can be used to create the connection we want. +Yup has a public API for extending schemas as well as creating custom tests, both can be used to create the connection we want. -- `addMethod` accepts a schema, a name of a method that is to be added on the - target schema, as well as a function. -- `mixed#test` is a method that exists on all schemas, it can be used in - multiple ways, but in this case the only thing we need to know is that it's a - method that receives a function as an argument, and the function it receives - has to return a promise that returns `true` or `false`. +- `addMethod` accepts a schema, a name of a method that is to be added on the target schema, as well as a function. +- `mixed#test` is a method that exists on all schemas, it can be used in multiple ways, but in this case the only thing we need to know is that it's a method that receives a function as an argument, and the function it receives has to return a promise that returns `true` or `false`. #### belongsTo @@ -337,10 +292,7 @@ addMethod(object, "relationship", function () { }); ``` -This bit is fairly straightforward, we add a `relationship` method to the -`object` schema. When `relationship` is called, it adds a custom test that -receives `value` which is an instance of a model. After that it's just a matter -of accessing the validaitons wrapper and running it's `validate` method. +This bit is fairly straightforward, we add a `relationship` method to the `object` schema. When `relationship` is called, it adds a custom test that receives `value` which is an instance of a model. After that it's just a matter of accessing the validaitons wrapper and running it's `validate` method. #### hasMany @@ -362,14 +314,9 @@ addMethod(array, "relationship", function () { }); ``` -`hasMany` relationships are pretty much the same as `belongsTo`. The only -difference is that the `hasMany` promise-proxy needs to be transformed into an -array that Yup will be able to handle which is done by calling `toArray`. Then -the test validates all object in the array and check whether all validations -return `true`. +`hasMany` relationships are pretty much the same as `belongsTo`. The only difference is that the `hasMany` promise-proxy needs to be transformed into an array that Yup will be able to handle which is done by calling `toArray`. Then the test validates all object in the array and check whether all validations return `true`. -That's it – now we need to modify the `User` model by adding `pets` to its -validations. +That's it – now we need to modify the `User` model by adding `pets` to its validations. ```javascript import Model, { attr, hasMany } from "@ember-data/model"; @@ -394,9 +341,7 @@ export default class UserModel extends Model { ### Conditional validations -There are times when you need to do some conditional validations based on some -different state. Here we'll have a really weird requirement where `pet.name` is -only required when the user is not allergic. +There are times when you need to do some conditional validations based on some different state. Here we'll have a really weird requirement where `pet.name` is only required when the user is not allergic. ```javascript import Model, { attr, hasMany } from "@ember-data/model"; @@ -446,19 +391,12 @@ export default class PetModel extends Model { } ``` -`Pet` now implements the conditional `name` validation by calling the `when` -method of the `string` schema. The `when` method accepts a list of names of -dependent properties, then we pass an object which specifies that the `name` -attribute is not required when `isUserAllergic` is `true`. +`Pet` now implements the conditional `name` validation by calling the `when` method of the `string` schema. The `when` method accepts a list of names of dependent properties, then we pass an object which specifies that the `name` attribute is not required when `isUserAllergic` is `true`. ![Internationalized user and pet fields demo](/assets/images/posts/2021-12-08-validations-in-ember-apps/conditional-form-user-3.gif) ### Summary -We've taken a look at an alternative approach to validating data in our apps. -Now it's easier than ever to integrate with 3rd party libraries with mostly just -Ember proxies standing on our way. I also find it beneficial to be able to use -something like Yup for teams that work in many environments. +We've taken a look at an alternative approach to validating data in our apps. Now it's easier than ever to integrate with 3rd party libraries with mostly just Ember proxies standing on our way. I also find it beneficial to be able to use something like Yup for teams that work in many environments. -The complete source code used in this blog post can be found here: -https://github.com/BobrImperator/emberfest-validations +The complete source code used in this blog post can be found here: https://github.com/BobrImperator/emberfest-validations diff --git a/src/posts/2022-03-07-better-code-with-lint-to-the-future.md b/src/posts/2022-03-07-better-code-with-lint-to-the-future.md index a8aadb5bb4..d266478c5b 100644 --- a/src/posts/2022-03-07-better-code-with-lint-to-the-future.md +++ b/src/posts/2022-03-07-better-code-with-lint-to-the-future.md @@ -3,10 +3,7 @@ title: "Better code with lint-to-the-future" authorHandle: real_ate tags: misc bio: "Senior Software Engineer, Ember Learning Core Team member" -description: - 'Chris Manson walks you through his new project "lint-to-the-future", - demonstrating how to easily add and update lint rules with the help of the - tool.' +description: 'Chris Manson walks you through his new project "lint-to-the-future", demonstrating how to easily add and update lint rules with the help of the tool.' og: image: /assets/images/posts/2022-03-07-better-code-with-lint-to-the-future/og-image.jpg tagline: | @@ -16,16 +13,8 @@ tagline: | going to make that process a breeze.

    --- -Having lint rules implemented from the beginning of your project is a great way -to make sure that your codebase stays neat. However, adding a new lint rule or -even updating your framework-specific lint rules can be quite challenging: this -is exactly what lint-to-the-future is designed to help you with. It is not a -tool to replace eslint or any of your linting tools, but rather a handy helper -that integrates with your existing workflow to help you progressively update -large codebases. +Having lint rules implemented from the beginning of your project is a great way to make sure that your codebase stays neat. However, adding a new lint rule or even updating your framework-specific lint rules can be quite challenging: this is exactly what lint-to-the-future is designed to help you with. It is not a tool to replace eslint or any of your linting tools, but rather a handy helper that integrates with your existing workflow to help you progressively update large codebases. -In the following video, I'll demonstrate how to make use of lint-to-the-future’s -command-line tool to help you enable a new lint rule while overcoming the -problem of "lint rule explosion". +In the following video, I'll demonstrate how to make use of lint-to-the-future’s command-line tool to help you enable a new lint rule while overcoming the problem of "lint rule explosion". diff --git a/src/posts/2022-03-17-dynamic-components-embroider.md b/src/posts/2022-03-17-dynamic-components-embroider.md index 994b7eb0e2..519ea08a95 100644 --- a/src/posts/2022-03-17-dynamic-components-embroider.md +++ b/src/posts/2022-03-17-dynamic-components-embroider.md @@ -5,9 +5,7 @@ tags: ember bio: "Senior Software Engineer" og: image: /assets/images/posts/2022-03-17-dynamic-components-embroider/og-image.jpg -description: - "Nick Schot explains how to make dynamic component invocation work with - Embroider's static analysis." +description: "Nick Schot explains how to make dynamic component invocation work with Embroider's static analysis." tagline: |

    Embroider is the future for building Ember apps. It unlocks features like splitting code per route by statically analyzing your codebase and dependencies. @@ -19,12 +17,7 @@ tagline: | ## What are dynamic components? -{% raw %} Dynamic components are components resolved at run-time rather than -hardcoding the component to use. Ember provides a component helper which takes -an argument that is the dasherized string representation of the component path: -`{{component "my-component"}}` or `{{component "folder/another-component"}}`. -This is great for addons like ember-promise-modals as in this case it allows us -to open a modal from javascript. {% endraw %} +{% raw %} Dynamic components are components resolved at run-time rather than hardcoding the component to use. Ember provides a component helper which takes an argument that is the dasherized string representation of the component path: `{{component "my-component"}}` or `{{component "folder/another-component"}}`. This is great for addons like ember-promise-modals as in this case it allows us to open a modal from javascript. {% endraw %} ```javascript @service modals; @@ -35,34 +28,21 @@ confirm() { } ``` -Internally ember-promise-modals uses the component helper to render these -modals. +Internally ember-promise-modals uses the component helper to render these modals. ## Then what is the problem? -In order to make Embroider's route-splitting feature, which enables per-route -optimized bundles with ideally only the components required for that route, -Embroider needs to be able to statically resolve components at build time. This -is not guaranteed with the component helper syntax. Hypothetically one could -receive the component name from an API call, meaning there is no way to know -this at build time. +In order to make Embroider's route-splitting feature, which enables per-route optimized bundles with ideally only the components required for that route, Embroider needs to be able to statically resolve components at build time. This is not guaranteed with the component helper syntax. Hypothetically one could receive the component name from an API call, meaning there is no way to know this at build time. Fortunately, Embroider provides a few tools for us to make this work. ## Making old addons work in your Embroider Optimized app using `packageRules` -`packageRules` are more of a compatability feature rather than being the ideal -solution. They provide a way to tell Embroider what it needs to do. The main use -case is for addons out of your control and/or addons that have not been updated -yet to be fully Embroider optimized. By default Embroider currently ships -`packageRules` for a few widely used addons so that they'll work out of the box. +`packageRules` are more of a compatability feature rather than being the ideal solution. They provide a way to tell Embroider what it needs to do. The main use case is for addons out of your control and/or addons that have not been updated yet to be fully Embroider optimized. By default Embroider currently ships `packageRules` for a few widely used addons so that they'll work out of the box. -Now let's see if we can make ember-promise-modals <= 2 work with Embroider -through `packageRules`. +Now let's see if we can make ember-promise-modals <= 2 work with Embroider through `packageRules`. -If you have created an Embroider enabled app (for example through -`ember new my-app --embroider`) your `ember-cli-build.js` file will contain a -section that looks like this: +If you have created an Embroider enabled app (for example through `ember new my-app --embroider`) your `ember-cli-build.js` file will contain a section that looks like this: ```javascript const { Webpack } = require("@embroider/webpack"); @@ -75,9 +55,7 @@ return require("@embroider/compat").compatBuild(app, Webpack, { }); ``` -In order to be able to use route-splitting, we'll first have to enable all of -Embroider's flags. Normally you would do this one by one, but in this case the -only problem we're going to run into is with the `staticComponents` flag. +In order to be able to use route-splitting, we'll first have to enable all of Embroider's flags. Normally you would do this one by one, but in this case the only problem we're going to run into is with the `staticComponents` flag. ```javascript const { Webpack } = require("@embroider/webpack"); @@ -94,19 +72,13 @@ return require("@embroider/compat").compatBuild(app, Webpack, { }); ``` -When now trying to run the app with ember-promise-modals, we'll run into a -compilation error. +When now trying to run the app with ember-promise-modals, we'll run into a compilation error. ```shell Unsafe dynamic component: @modal._name in node_modules/ember-promise-modals/templates/components/modal.hbs ``` -This means Embroider detected a call to the component helper with a variable -`@modal._name`. To try and resolve this, let's add a `packageRules` section for -the `EpmModal` component. This component takes a `@modal` argument which is an -object that also contains the `_name` property as shown in the error that -Embroider threw. We can tell Embroider that this argument represents a component -name. The layout of the component also needs to be explicitly passed. +This means Embroider detected a call to the component helper with a variable `@modal._name`. To try and resolve this, let's add a `packageRules` section for the `EpmModal` component. This component takes a `@modal` argument which is an object that also contains the `_name` property as shown in the error that Embroider threw. We can tell Embroider that this argument represents a component name. The layout of the component also needs to be explicitly passed. ```javascript const { Webpack } = require('@embroider/webpack'); @@ -128,27 +100,13 @@ return require('@embroider/compat').compatBuild(app, Webpack, { }); ``` -If we now run the app Embroider will no longer throw build-time errors and our -modal will work. An unfortunate side-effect of this setup is that it will not -result in the `` component being split from the main bundle if -you enable route-splitting. In order to get that working we'll have to dig a -little deeper, but the `packageRules` approach is a good way to unblock a -project from using a fully enabled Embroider with addons that do not have full -Embroider support. +If we now run the app Embroider will no longer throw build-time errors and our modal will work. An unfortunate side-effect of this setup is that it will not result in the `` component being split from the main bundle if you enable route-splitting. In order to get that working we'll have to dig a little deeper, but the `packageRules` approach is a good way to unblock a project from using a fully enabled Embroider with addons that do not have full Embroider support. ## Updating your addon or dynamically invoked components to be Embroider Optimized -In order to let Embroider know how to handle our dynamic modal component, we -need to use the `ensure-safe-component` helper that Embroider provides. This -helper will turn a component class into a component definition that can be -invoked in the template. If just the name of a component is passed, it will use -the old curly component resolver to get the component definition, but also throw -a deprecation warning that you'll need to pass the component class when using -Embroider. For comprehensive documentation see: -[Replacing the Component Helper](https://github.com/embroider-build/embroider/blob/5fd49b50dd82bf7ceb6adeefa12efc2b85f92cd2/REPLACING-COMPONENT-HELPER.md) +In order to let Embroider know how to handle our dynamic modal component, we need to use the `ensure-safe-component` helper that Embroider provides. This helper will turn a component class into a component definition that can be invoked in the template. If just the name of a component is passed, it will use the old curly component resolver to get the component definition, but also throw a deprecation warning that you'll need to pass the component class when using Embroider. For comprehensive documentation see: [Replacing the Component Helper](https://github.com/embroider-build/embroider/blob/5fd49b50dd82bf7ceb6adeefa12efc2b85f92cd2/REPLACING-COMPONENT-HELPER.md) -In ember-promise-modals dynamic modal components are internally invoked with the -component helper as follows: +In ember-promise-modals dynamic modal components are internally invoked with the component helper as follows: ```handlebars {% raw %} @@ -156,9 +114,7 @@ component helper as follows: {% endraw %} ``` -The relevant bit for us here is the first argument `@modal._name` which is the -name of the modal component, say `example-modal`. We can wrap this with the -`ensure-safe-component` helper that Embroider provides like this: +The relevant bit for us here is the first argument `@modal._name` which is the name of the modal component, say `example-modal`. We can wrap this with the `ensure-safe-component` helper that Embroider provides like this: ```handlebars {% raw %} @@ -180,9 +136,7 @@ Or if we want to use angle bracket syntax: {% endraw %} ``` -The other thing we need to change is the way we pass the component to -ember-promise-modals in our app. We are currently still passing the -`` component as a dynamic string. +The other thing we need to change is the way we pass the component to ember-promise-modals in our app. We are currently still passing the `` component as a dynamic string. ```javascript @service modals; @@ -193,8 +147,7 @@ confirm() { } ``` -If we were to start our app now (with `staticComponents: false`), we would get -the following deprecation message: +If we were to start our app now (with `staticComponents: false`), we would get the following deprecation message: ``` DEPRECATION: You're trying to invoke the component "example-modal" @@ -202,11 +155,7 @@ DEPRECATION: You're trying to invoke the component "example-modal" [deprecation id: ensure-safe-component.string] See https://github.com/embroider-build/embroider/blob/master/ADDON-AUTHOR-GUIDE.md#when-youre-passing-a-component-to-someone-else for more details. ``` -We can update our app code to actually import the component class so that -Embroider can statically resolve this component. This will also make the -deprecation message disappear. Note that this will _only_ work for co-located -components or classic components that explicitly have their template definition -set on the component class using `layout`. +We can update our app code to actually import the component class so that Embroider can statically resolve this component. This will also make the deprecation message disappear. Note that this will _only_ work for co-located components or classic components that explicitly have their template definition set on the component class using `layout`. ```javascript import ExampleModal from '../components/example-modal'; @@ -221,9 +170,7 @@ confirm() { } ``` -After re-enabling `staticComponents: true`, the last thing we need to do is -enable route-splitting in our app. This can be done by modifying the `router.js` -file to use `@embroider/router`... +After re-enabling `staticComponents: true`, the last thing we need to do is enable route-splitting in our app. This can be done by modifying the `router.js` file to use `@embroider/router`... ```javascript // app/router.js @@ -239,9 +186,7 @@ export default class Router extends EmberRouter { Router.map(function () {}); ``` -...and by configuring the `splitAtRoutes` feature in `ember-cli-build.js`. We -can do this by adding the route names we want to split or by providing a regex. -Our full configuration will now look like this: +...and by configuring the `splitAtRoutes` feature in `ember-cli-build.js`. We can do this by adding the route names we want to split or by providing a regex. Our full configuration will now look like this: ```javascript const { Webpack } = require("@embroider/webpack"); @@ -259,16 +204,10 @@ return require("@embroider/compat").compatBuild(app, Webpack, { }); ``` -If we now start our Embroider enabled app, we will see that our -`` component is in a separate javascript chunk which is -dynamically loaded when the route where it is invoked is opened by the user. +If we now start our Embroider enabled app, we will see that our `` component is in a separate javascript chunk which is dynamically loaded when the route where it is invoked is opened by the user. ## Conclusion -Even if you're still using addons that are not fully Embroider compatible, you -might still be able to make them work by utilizing the `packageRules` -configuration option. For properly updating an addon that requires dynamic -components we can use `ensureSafeComponent` to make them compatible with -Embroider and unlock the route-splitting feature. +Even if you're still using addons that are not fully Embroider compatible, you might still be able to make them work by utilizing the `packageRules` configuration option. For properly updating an addon that requires dynamic components we can use `ensureSafeComponent` to make them compatible with Embroider and unlock the route-splitting feature. [contact]: /contact/ diff --git a/src/posts/2022-03-30-getting-started-wth-code-mods.md b/src/posts/2022-03-30-getting-started-wth-code-mods.md index 38c48a2845..16a78c4055 100644 --- a/src/posts/2022-03-30-getting-started-wth-code-mods.md +++ b/src/posts/2022-03-30-getting-started-wth-code-mods.md @@ -3,9 +3,7 @@ title: "Code mods in JavaScript and how to get started creating your own" authorHandle: Mikek2252 tags: javascript bio: "Senior Software Engineer" -description: - "Michael Kerr gives a quick introduction into code mods in JavaScript and how - to create your own." +description: "Michael Kerr gives a quick introduction into code mods in JavaScript and how to create your own." og: image: /assets/images/posts/2022-03-30-getting-started-with-code-mods/og-image.jpg tagline: | @@ -19,8 +17,7 @@ tagline: | one.

    --- -For example updating the following code sample from concatenating with the `+` -operator to using a template literal. +For example updating the following code sample from concatenating with the `+` operator to using a template literal. ```javascript // Before @@ -29,22 +26,13 @@ let message = "Hello, " + name; let message = `Hello, ${name}`; ``` -In the Ember community we love code mods: when deprecations in the framework are -added, there is a good chance that a code mod is created in order to help -everyone migrate their code. The Ember community even has an entire github -organization dedicated to code mods which you can check out here: -[https://github.com/ember-codemods](https://github.com/ember-codemods). +In the Ember community we love code mods: when deprecations in the framework are added, there is a good chance that a code mod is created in order to help everyone migrate their code. The Ember community even has an entire github organization dedicated to code mods which you can check out here: [https://github.com/ember-codemods](https://github.com/ember-codemods). -Despite the already great array of code mods available, there may not be one -that covers your needs or fixes your problem. Fear not: making your own isn’t as -complicated as it may seem. +Despite the already great array of code mods available, there may not be one that covers your needs or fixes your problem. Fear not: making your own isn’t as complicated as it may seem. ## Setting up your code mod project -Creating the initial project for a JavaScript or Handlebars code mod could not -be simpler thanks to [Robert Jackson's](https://github.com/rwjblue) -[codemod-cli tool](https://github.com/rwjblue/codemod-cli). What is left for you -to do is run the following command and you will have all your prerequisites. +Creating the initial project for a JavaScript or Handlebars code mod could not be simpler thanks to [Robert Jackson's](https://github.com/rwjblue) [codemod-cli tool](https://github.com/rwjblue/codemod-cli). What is left for you to do is run the following command and you will have all your prerequisites. ``` npx codemod-cli new <project-name> @@ -53,14 +41,11 @@ npx codemod-cli new <project-name> // you can have multiple code mods in this project!. ``` -Once your project has been created, make sure to `cd ` and install -your dependencies via your chosen package manager. +Once your project has been created, make sure to `cd ` and install your dependencies via your chosen package manager. ## Creating your code mod -Now that the project has been setup and our dependences have been installed it's -time to create our code mod. For the purpose of this post, we will create a rule -for the string concatenation with the plus operator to a template literal. +Now that the project has been setup and our dependences have been installed it's time to create our code mod. For the purpose of this post, we will create a rule for the string concatenation with the plus operator to a template literal. To create the rule boiler plate, all we need to do is run the following command: @@ -68,18 +53,11 @@ To create the rule boiler plate, all we need to do is run the following command: npx codemod-cli generate codemod <name of codemod> ``` -Once the command has finished, you should see a new folder with the name of your -code mod. Inside of it, you should find a folder for your test fixtures along -with an `index.js` and `test.js` file. +Once the command has finished, you should see a new folder with the name of your code mod. Inside of it, you should find a folder for your test fixtures along with an `index.js` and `test.js` file. ## Setting up your test fixtures -Before I start writing the code mod itself, I like to set up the test fixtures. -Inside your `__testfixtures__`, you should already have an `*.input.js` file and -an `*.output,js`. The `input.js` file should contain the 'input' code, or in -other words the code to be changed and the `*.output.js` should contain what you -expect the code to be after the code mod has ran. This is what it would look -like for my example: +Before I start writing the code mod itself, I like to set up the test fixtures. Inside your `__testfixtures__`, you should already have an `*.input.js` file and an `*.output,js`. The `input.js` file should contain the 'input' code, or in other words the code to be changed and the `*.output.js` should contain what you expect the code to be after the code mod has ran. This is what it would look like for my example: `basic.input.js` @@ -99,13 +77,11 @@ If you need to add any more text fixtures you can run the following command: npx codemod-cli generate fixture <name of codemod> <name of fixture> ``` -Or simply just create your own `fixture-name.input.js` and -`fixture-name.output.js` in the same folder. +Or simply just create your own `fixture-name.input.js` and `fixture-name.output.js` in the same folder. ## Creating the code mod -Once everything has been set up and you have your test fixtures, it is time to -start writing. +Once everything has been set up and you have your test fixtures, it is time to start writing. If you open up your `index.js` file you should find an example code mod: @@ -126,19 +102,13 @@ module.exports = function transformer(file, api) { module.exports.type = "js"; ``` -This example finds all `identifiers`(the name for a variable) and reverses the -name. +This example finds all `identifiers`(the name for a variable) and reverses the name. -Our first step is to add the correct identifier parameter for the find function. -The easiest way to do this is to use [astexplorer.net](https://astexplorer.net/) -which can show you code broken down into an abstract syntax tree or AST. +Our first step is to add the correct identifier parameter for the find function. The easiest way to do this is to use [astexplorer.net](https://astexplorer.net/) which can show you code broken down into an abstract syntax tree or AST. ![AST Explorer](/assets/images/posts/2022-03-30-getting-started-with-code-mods/astExplorer.png) -With the autofocus check box enabled, it will highlight the tree and the code to -help show you what node is what. Using this we can see that `'Hello, ' + name;` -is a `BinaryExpression`. So let's update our code with the correct Identifier -and instead of using the `.forEach` we will add `.replaceWith`. +With the autofocus check box enabled, it will highlight the tree and the code to help show you what node is what. Using this we can see that `'Hello, ' + name;` is a `BinaryExpression`. So let's update our code with the correct Identifier and instead of using the `.forEach` we will add `.replaceWith`. ```javascript const { getParser } = require("codemod-cli").jscodeshift; @@ -157,16 +127,11 @@ module.exports = function transformer(file, api) { module.exports.type = "js"; ``` -To convert from a `BinaryExpression` to a `TemplateLiteral` we will need to -return a `TemplateLiteral` node from the `replaceWith` function. As we are using -the babel parser, we can use https://babeljs.io/docs/en/babel-types to help us -work out what we need to create a `TemplateLiteral`. +To convert from a `BinaryExpression` to a `TemplateLiteral` we will need to return a `TemplateLiteral` node from the `replaceWith` function. As we are using the babel parser, we can use https://babeljs.io/docs/en/babel-types to help us work out what we need to create a `TemplateLiteral`. ![TemplateLiteral Documentation](/assets/images/posts/2022-03-30-getting-started-with-code-mods/templateLiteral.png) -`TemplateLiteral`s require an array of `TemplateElement`s, which will be the -strings and an array of expressions being the variables. So for now we can -update our code to look like this: +`TemplateLiteral`s require an array of `TemplateElement`s, which will be the strings and an array of expressions being the variables. So for now we can update our code to look like this: ```javascript module.exports = function transformer(file, api) { @@ -187,8 +152,7 @@ module.exports = function transformer(file, api) { module.exports.type = "js"; ``` -If we were to run the tests now with this transformation you will see that it -now replaces all `BinaryExpression`s with an empty `TemplateLiteral`; +If we were to run the tests now with this transformation you will see that it now replaces all `BinaryExpression`s with an empty `TemplateLiteral`; ```javascript let message = "hello " + name; @@ -196,13 +160,7 @@ let message = "hello " + name; let message = ``; ``` -Now we have a `TemplateLiteral` we need to extract the information from our -`BinaryExpression` to add to our `TemplateLiteral`. A `BinaryExpression` has -three attributes: `operator`, `left` and `right`. We need to check both `left` -and `right` nodes to see if either is a `StringLiteral` or whether it is an -`Identifier`/variable. If the node is a `StringLiteral`, it needs to be -converted to a `TemplateElement`. If the node is an `Identifier`, we need to add -it to the expressions array. +Now we have a `TemplateLiteral` we need to extract the information from our `BinaryExpression` to add to our `TemplateLiteral`. A `BinaryExpression` has three attributes: `operator`, `left` and `right`. We need to check both `left` and `right` nodes to see if either is a `StringLiteral` or whether it is an `Identifier`/variable. If the node is a `StringLiteral`, it needs to be converted to a `TemplateElement`. If the node is an `Identifier`, we need to add it to the expressions array. That leaves us with this code: @@ -241,14 +199,8 @@ Now let's run our test case to see if it passes. ![Test success screenshot](/assets/images/posts/2022-03-30-getting-started-with-code-mods/test-success-screenshot.png) -_Note: `is idempotent` is a test added by codemod-cli to check that rerunning -the code mod will always give the same result_ +_Note: `is idempotent` is a test added by codemod-cli to check that rerunning the code mod will always give the same result_ -That test case has passed, but as you may have noticed by now, this -implementation has many limitations: what happens if we use a number instead of -a string or have multiple `BinaryExpression`s, or a minus is used instead of a -plus? Well that is where I will leave you to try and add some of your own test -cases and see if you can tackle some of the limitations within this code mod. +That test case has passed, but as you may have noticed by now, this implementation has many limitations: what happens if we use a number instead of a string or have multiple `BinaryExpression`s, or a minus is used instead of a plus? Well that is where I will leave you to try and add some of your own test cases and see if you can tackle some of the limitations within this code mod. -If you would like to learn more about code mods and AST's check out -[our AST workshop](https://github.com/mainmatter/ast-workshop). +If you would like to learn more about code mods and AST's check out [our AST workshop](https://github.com/mainmatter/ast-workshop). diff --git a/src/posts/2022-05-11-what-to-do-if-you-dont-feel-heard-at-work.md b/src/posts/2022-05-11-what-to-do-if-you-dont-feel-heard-at-work.md index 120f15781c..c00d82e161 100644 --- a/src/posts/2022-05-11-what-to-do-if-you-dont-feel-heard-at-work.md +++ b/src/posts/2022-05-11-what-to-do-if-you-dont-feel-heard-at-work.md @@ -5,10 +5,7 @@ tags: company-culture bio: "Software Engineer" og: image: /assets/images/posts/2022-05-11-what-to-do-if-you-dont-feel-heard-at-work/og-image.jpg -description: - Oscar Dominguez writes to himself of the past and tries to make him realize - that a better world is possible. There are companies where employees are - listened to and their opinions are taken into consideration. +description: Oscar Dominguez writes to himself of the past and tries to make him realize that a better world is possible. There are companies where employees are listened to and their opinions are taken into consideration. tagline: |

    86%

    That is the number of people who don't feel heard **fairly or equally** at their @@ -30,39 +27,27 @@ How **connected** do you feel to: If your answer is -> 😔 "_I feel_ _disconnected. I tried to share my ideas but all of them got -> discarded so I got tired of bringing suggestions.”_ +> 😔 "_I feel_ _disconnected. I tried to share my ideas but all of them got discarded so I got tired of bringing suggestions.”_ -> 😩 “Oh my God, it’s Monday again. I hate this project. I don’t like the -> direction in which this is going.” +> 😩 “Oh my God, it’s Monday again. I hate this project. I don’t like the direction in which this is going.” > 🙁 “Hmm, _I don’t know... It is what it is..."_ keep reading because you are not alone. -According to -[a global research](https://www.forbes.com/sites/carolinecenizalevine/2021/06/23/new-survey-shows-the-business-benefit-of-feeling-heard--5-ways-to-build-inclusive-teams/?sh=1ccf117d5f0c) -carried out across 11 countries by -[The Workforce Institute](https://www.workforceinstitute.org/) at -[UKG](https://www.ukg.com/), the vast majority (86%) of employees feel people at -their organisation are not heard fairly or equally — and nearly half (47%) say -that underrepresented voices remain undervalued by employers. +According to [a global research](https://www.forbes.com/sites/carolinecenizalevine/2021/06/23/new-survey-shows-the-business-benefit-of-feeling-heard--5-ways-to-build-inclusive-teams/?sh=1ccf117d5f0c) carried out across 11 countries by [The Workforce Institute](https://www.workforceinstitute.org/) at [UKG](https://www.ukg.com/), the vast majority (86%) of employees feel people at their organisation are not heard fairly or equally — and nearly half (47%) say that underrepresented voices remain undervalued by employers. It happened to me in the past and, worry not, there is a solution for it! 😀 🥳 ## The art of listening -As professionals, we **want to feel we are being heard.** When that does not -happen, a feeling of **disconnection** arises. +As professionals, we **want to feel we are being heard.** When that does not happen, a feeling of **disconnection** arises. -This happened to me in the past and the following questions came to my mind by -then: +This happened to me in the past and the following questions came to my mind by then: - Is this feeling **normal**? -- Am I being **selfish**? I should be focusing on the company’s mission instead, - right? They are paying me for that. -- Is there something I can do on my end? The others are the ones not listening - to me, there’s nothing I can do. +- Am I being **selfish**? I should be focusing on the company’s mission instead, right? They are paying me for that. +- Is there something I can do on my end? The others are the ones not listening to me, there’s nothing I can do. Let’s answer question by question: @@ -77,69 +62,48 @@ As professionals we want: - to help others - to grow -When this does not happen we feel frustrated and this frustration **ends up -impacting the relationship** with our **team**, the **project** in which we are -participating, or even our relationship with our **company**. +When this does not happen we feel frustrated and this frustration **ends up impacting the relationship** with our **team**, the **project** in which we are participating, or even our relationship with our **company**. -> Am I being selfish? I should be focusing on the company’s mission instead, -> right? They are paying me for that. +> Am I being selfish? I should be focusing on the company’s mission instead, right? They are paying me for that. -No, you are not being selfish. Your company needs you to be happy and enjoy your -job. +No, you are not being selfish. Your company needs you to be happy and enjoy your job. -When this happens, you show all your potential as a professional. Your team, the -product and your company benefit from it. Your company is paying you for that, -for your maximum potential. It’s a win-win! +When this happens, you show all your potential as a professional. Your team, the product and your company benefit from it. Your company is paying you for that, for your maximum potential. It’s a win-win! If this is not happening, there is something wrong that needs to be fixed: 1. **Are you aligned with your company and team values?** -2. Is your vision of your **career path aligned with** the idea **your company** - has in mind? +2. Is your vision of your **career path aligned with** the idea **your company** has in mind? -If the answer is yes, keep reading because there’s probably something you can do -about it. +If the answer is yes, keep reading because there’s probably something you can do about it. If the answer is no, this probably means you need a change. -> Is there something I can do on my end? The problem is others not listening to -> me, there’s nothing I can control. +> Is there something I can do on my end? The problem is others not listening to me, there’s nothing I can control. -Yes, you can. You can’t control what others do unless you have very good -hypnosis skills but you can decide to perceive this as a problem or not. What if -you try to take the initiative? Let’s show the rest how _The Art of Listening_ -is and spread it to the world. +Yes, you can. You can’t control what others do unless you have very good hypnosis skills but you can decide to perceive this as a problem or not. What if you try to take the initiative? Let’s show the rest how _The Art of Listening_ is and spread it to the world. ## Take initiative with empathy -I’m pretty sure you have already tried to give your opinion to improve a -feature, a process, a team ceremony... but nothing happened. No feedback, or -automatically rejected. +I’m pretty sure you have already tried to give your opinion to improve a feature, a process, a team ceremony... but nothing happened. No feedback, or automatically rejected. -I know, it’s very frustrating and you got tired of it. Maybe you stopped trying. -The key question here is: Do you know why? Why did you not get feedback or why -did it get rejected? +I know, it’s very frustrating and you got tired of it. Maybe you stopped trying. The key question here is: Do you know why? Why did you not get feedback or why did it get rejected? ### Identify the problem/s -Let’s assume the best of the intentions from your teammates, the stakeholders, -the company or whoever should be the one listening to you. Why would they ignore -you? Or automatically reject you? +Let’s assume the best of the intentions from your teammates, the stakeholders, the company or whoever should be the one listening to you. Why would they ignore you? Or automatically reject you? The list of possibilities is long: - There is no time to attend my petition or suggestion - It is not a priority for them - There is not a clear process for me to share my thoughts -- I’m not involved when decisions are discussed and taken and when I discover - them it’s late. +- I’m not involved when decisions are discussed and taken and when I discover them it’s late. - etc. -The list is long and it varies depending on the week, a moment of the day or a -topic. +The list is long and it varies depending on the week, a moment of the day or a topic. -The very first step is to **identify the problem/s that are making your message -go unheard by the rest.** +The very first step is to **identify the problem/s that are making your message go unheard by the rest.** Once that is clear, we can come up with solutions. @@ -153,76 +117,50 @@ Especially at the beginning, if the list is long, choose the topics which are: - more significant for your team - more significant for your company -Don’t worry, there will be time for the rest. Or maybe they were not that -important in the end 🙂 +Don’t worry, there will be time for the rest. Or maybe they were not that important in the end 🙂 ### Propose solutions with empathy -I’m sure you already tried to use the processes in place to communicate your -opinion, but this is not working so we need to come up with solutions. +I’m sure you already tried to use the processes in place to communicate your opinion, but this is not working so we need to come up with solutions. -To be effective, these solutions need to be empathetic with all parts. If they -look good to you but they are not taking into consideration other parts involved -in the conversation, it means they won’t get traction. +To be effective, these solutions need to be empathetic with all parts. If they look good to you but they are not taking into consideration other parts involved in the conversation, it means they won’t get traction. -Is the process in place being empathetic with all parts? No? Let’s change it! -Maybe it needs to change the channel, to use a meeting instead of being -asynchronous to make it happen. Or the other way around, to be asynchronous -because there is no time for meetings. Think about the proposal you want to talk -about, think about the receptors and what could work for them. +Is the process in place being empathetic with all parts? No? Let’s change it! Maybe it needs to change the channel, to use a meeting instead of being asynchronous to make it happen. Or the other way around, to be asynchronous because there is no time for meetings. Think about the proposal you want to talk about, think about the receptors and what could work for them. ### Lead by example -You want to feel listened but, are you a good listener? If you make your -colleagues feel heard maybe they replicate it. Don’t you think? 😜 +You want to feel listened but, are you a good listener? If you make your colleagues feel heard maybe they replicate it. Don’t you think? 😜 Check these tips: - **Pay attention**. Make sure the other feels heard, not only listened to. -- Show that you are **engaged with what’s been told**. Use your body language - and gestures to give feedback to the other. +- Show that you are **engaged with what’s been told**. Use your body language and gestures to give feedback to the other. - Ask with **curiosity, not judgement** - **Don’t interrupt** ## Conclusion -Not feeling heard at your company -[is a global problem lots of employees suffer worldwide](https://www.forbes.com/sites/carolinecenizalevine/2021/06/23/new-survey-shows-the-business-benefit-of-feeling-heard--5-ways-to-build-inclusive-teams/?sh=1ccf117d5f0c). -You are not alone. +Not feeling heard at your company [is a global problem lots of employees suffer worldwide](https://www.forbes.com/sites/carolinecenizalevine/2021/06/23/new-survey-shows-the-business-benefit-of-feeling-heard--5-ways-to-build-inclusive-teams/?sh=1ccf117d5f0c). You are not alone. -The first exercise you need to do is to assure you are aligned with your company -and team values. Some questions from a book I just read may help you: +The first exercise you need to do is to assure you are aligned with your company and team values. Some questions from a book I just read may help you: -> _Should we not evaluate our jobs according to how much they help us find -> meaning and love in life? Do our jobs help us learn more about the purpose of -> our lives? Do they develop our level of self-insight and self-awareness? How -> good are we at creating meaningfulness for our colleagues?_ +> _Should we not evaluate our jobs according to how much they help us find meaning and love in life? Do our jobs help us learn more about the purpose of our lives? Do they develop our level of self-insight and self-awareness? How good are we at creating meaningfulness for our colleagues?_ -_One Life: How we forgot to live meaningful lives_ by -**[Morten Albæk](https://en.wikipedia.org/wiki/Morten_Alb%C3%A6k)** +_One Life: How we forgot to live meaningful lives_ by **[Morten Albæk](https://en.wikipedia.org/wiki/Morten_Alb%C3%A6k)** -This article tries to recollect some ideas and positive actions you can take to -try to make you feel heard at work through the art of being a good listener. -Take the initiative to dominate this art while being empathetic with the others: +This article tries to recollect some ideas and positive actions you can take to try to make you feel heard at work through the art of being a good listener. Take the initiative to dominate this art while being empathetic with the others: - [Identify the problem/s](/blog/2022/05/11/what-to-do-if-you-dont-feel-heard-at-work/#identify-the-problems) - [Choose your battles](/blog/2022/05/11/what-to-do-if-you-dont-feel-heard-at-work/#choose-your-battles) - [Propose solutions with empathy](/blog/2022/05/11/what-to-do-if-you-dont-feel-heard-at-work/#propose-solutions-with-empathy) - [Lead by example](/blog/2022/05/11/what-to-do-if-you-dont-feel-heard-at-work/#lead-by-example) -We would love to hear your personal experience on this topic. Do you have any -tip or story you would like to share with us and the rest of the readers? Feel -free to comment on our [Twitter](https://twitter.com/mainmatter) or -[LinkedIn](https://www.linkedin.com/company/mainmatter/). +We would love to hear your personal experience on this topic. Do you have any tip or story you would like to share with us and the rest of the readers? Feel free to comment on our [Twitter](https://twitter.com/mainmatter) or [LinkedIn](https://www.linkedin.com/company/mainmatter/). --- ## Resources -- [The Art of Listening](https://www.youtube.com/watch?v=qpnNsSyDw-g&ab_channel=SimonSinek) - by [Simon Sinek](https://simonsinek.com/) -- [New Survey Shows The Business Benefit Of Feeling Heard – 5 Ways To Build Inclusive Teams](https://www.forbes.com/sites/carolinecenizalevine/2021/06/23/new-survey-shows-the-business-benefit-of-feeling-heard--5-ways-to-build-inclusive-teams/?sh=1ccf117d5f0c) - by - [Caroline Ceniza-Levine](https://www.forbes.com/sites/carolinecenizalevine/) -- [One Life: How we forgot to live meaningful lives](https://www.goodreads.com/book/show/48725742-one-life?from_search=true&from_srp=true&qid=Dq8fa2WmC6&rank=1) - by [Morten Albæk](https://en.wikipedia.org/wiki/Morten_Alb%C3%A6k) +- [The Art of Listening](https://www.youtube.com/watch?v=qpnNsSyDw-g&ab_channel=SimonSinek) by [Simon Sinek](https://simonsinek.com/) +- [New Survey Shows The Business Benefit Of Feeling Heard – 5 Ways To Build Inclusive Teams](https://www.forbes.com/sites/carolinecenizalevine/2021/06/23/new-survey-shows-the-business-benefit-of-feeling-heard--5-ways-to-build-inclusive-teams/?sh=1ccf117d5f0c) by [Caroline Ceniza-Levine](https://www.forbes.com/sites/carolinecenizalevine/) +- [One Life: How we forgot to live meaningful lives](https://www.goodreads.com/book/show/48725742-one-life?from_search=true&from_srp=true&qid=Dq8fa2WmC6&rank=1) by [Morten Albæk](https://en.wikipedia.org/wiki/Morten_Alb%C3%A6k) diff --git a/src/posts/2022-05-19-journey-of-a-junior-software-engineer.md b/src/posts/2022-05-19-journey-of-a-junior-software-engineer.md index 728c0aa050..61b7d8dbfe 100644 --- a/src/posts/2022-05-19-journey-of-a-junior-software-engineer.md +++ b/src/posts/2022-05-19-journey-of-a-junior-software-engineer.md @@ -5,11 +5,7 @@ tags: process bio: "Junior Software-Engineer" og: image: /assets/images/posts/2022-05-19-journey-of-a-junior-software-engineer/og-image.jpg -description: - "Inês Silva is currently the only junior software-engineer at Mainmatter. She - shares how it is to onboard into your 1st software engineer job, and how her - week at Mainmatter looks like. Also, she gives 5 main tips for other junior - software engineers." +description: "Inês Silva is currently the only junior software-engineer at Mainmatter. She shares how it is to onboard into your 1st software engineer job, and how her week at Mainmatter looks like. Also, she gives 5 main tips for other junior software engineers." tagline: |

    When do we look for our first job as software engineers some questions might pop up like - How will my week look like? What will be the most @@ -21,59 +17,39 @@ tagline: | some tips on the way based on the challenges I faced 💪

    --- -My journey at Mainmatter started in July of 2021: soon it will be 11 months that -I’m here. +My journey at Mainmatter started in July of 2021: soon it will be 11 months that I’m here. -Before landing here, I did a 4 months internship as a Ruby backend engineer 💎 I -wanted to continue to improve my backend knowledge and discover the frontend -world (that I had so little insight into before) +Before landing here, I did a 4 months internship as a Ruby backend engineer 💎 I wanted to continue to improve my backend knowledge and discover the frontend world (that I had so little insight into before) -I can stop here for the **#1 Tip** - **If you don’t know,** **start as -full-stack.** +I can stop here for the **#1 Tip** - **If you don’t know,** **start as full-stack.** -This way, you can get a better picture of both frontend and backend parts of a -project and then find what fits you better or just stay in both worlds. +This way, you can get a better picture of both frontend and backend parts of a project and then find what fits you better or just stay in both worlds. After the internship, I landed at Mainmatter for my 1st job 🙌 -Here, I immediately started working on a web app for an IT security company. The -stack was Next.js & Typescript. +Here, I immediately started working on a web app for an IT security company. The stack was Next.js & Typescript. -As I said before I had very little experience with the frontend world, and -apparently with git. 😅 +As I said before I had very little experience with the frontend world, and apparently with git. 😅 -My first struggles were git-related problems - I feel this is the thing that -developers tend to be overconfident about. +My first struggles were git-related problems - I feel this is the thing that developers tend to be overconfident about. -In university, every time we started a project using git we would drop it at -some point and we would go to the archaic system of copy-pasting code between -us. 🥲 +In university, every time we started a project using git we would drop it at some point and we would go to the archaic system of copy-pasting code between us. 🥲 This was no proper way of working so my **#2 Tip - Get git rolling** -You will never be alone in a project, so force yourself to learn tools that will -make you more efficient at working as a team. +You will never be alone in a project, so force yourself to learn tools that will make you more efficient at working as a team. -Most of my colleagues always use the terminal so I found it easier to go along -with this method (plus it gives you that hacker look 😎) but there is an -interface option [Github Desktop](https://desktop.github.com/). +Most of my colleagues always use the terminal so I found it easier to go along with this method (plus it gives you that hacker look 😎) but there is an interface option [Github Desktop](https://desktop.github.com/). Time to jump to **#3 tip - Keep a learning journal.** -Since I was documenting all of my git struggles, I will give you a glimpse at -what my notion notes were looking like in my second week here 😂: +Since I was documenting all of my git struggles, I will give you a glimpse at what my notion notes were looking like in my second week here 😂: ![My note taking with notion](/assets/images/posts/2022-05-19-journey-of-a-junior-software-engineer/my-notion-notes-eg1.png) ![](/assets/images/posts/2022-05-19-journey-of-a-junior-software-engineer/my-notion-notes-eg2.png) -Git merge vs Git rebase was a frequent debate, and according to my notes, I -found this enlightening video on the -[topic](https://www.youtube.com/watch?v=CRlGDDprdOQ&ab_channel=Academind). Then, -when I was finally becoming more comfortable with which commands I should use, -they told me to tidy my git history 🧹 - -[this post](https://mainmatter.com/blog/2021/05/26/keeping-a-clean-git-history/) -done by Chris came in handy. +Git merge vs Git rebase was a frequent debate, and according to my notes, I found this enlightening video on the [topic](https://www.youtube.com/watch?v=CRlGDDprdOQ&ab_channel=Academind). Then, when I was finally becoming more comfortable with which commands I should use, they told me to tidy my git history 🧹 - [this post](https://mainmatter.com/blog/2021/05/26/keeping-a-clean-git-history/) done by Chris came in handy. As I showed above, I keep a journal where I note down: @@ -81,48 +57,29 @@ As I showed above, I keep a journal where I note down: - key ideas on topics I researched - things I should search more about -I believe the junior phase can be the most overwhelming one: your learning curve -is in skyrocket mode 🚀! With all this new info coming all the time, I find it -helpful to write everything down as a way to organize the new content in my -head. Also, since a lot of errors I was seeing would show up again, I could find -what I did & re-apply it. +I believe the junior phase can be the most overwhelming one: your learning curve is in skyrocket mode 🚀! With all this new info coming all the time, I find it helpful to write everything down as a way to organize the new content in my head. Also, since a lot of errors I was seeing would show up again, I could find what I did & re-apply it. -Nowadays, I need to take notes less and less and even the pace slowed down from -week logs to month logs 😆 as you can see by my notion pages: +Nowadays, I need to take notes less and less and even the pace slowed down from week logs to month logs 😆 as you can see by my notion pages: ![My pages organization in notion](/assets/images/posts/2022-05-19-journey-of-a-junior-software-engineer/my-notion-pages.png) -After git problems, the second position on the podium of challenges goes to -testing 🏆 +After git problems, the second position on the podium of challenges goes to testing 🏆 That being said we go for the **#4 Tip - Get your hands-on testing** -I don’t know how it works in other degrees, but I didn’t write a single test for -my programs until I enter the professional world. +I don’t know how it works in other degrees, but I didn’t write a single test for my programs until I enter the professional world. -Since I’m working here, I’ve been using a JS testing framework, -_[Jest](https://jestjs.io/)_ and a -[\*react testing library](https://testing-library.com/docs/react-testing-library/intro/).\* +Since I’m working here, I’ve been using a JS testing framework, _[Jest](https://jestjs.io/)_ and a [\*react testing library](https://testing-library.com/docs/react-testing-library/intro/).\* -Until recently, I have wondered: ‘My code is done, why am I wasting my time with -this?’ - especially when a lot of times I was losing more time in writing tests -than actual code. 😅 However, a few weeks ago, the moment came when I thanked -myself for having tests. 💡 I have been working on a project since September so -at this point it is getting pretty big. +Until recently, I have wondered: ‘My code is done, why am I wasting my time with this?’ - especially when a lot of times I was losing more time in writing tests than actual code. 😅 However, a few weeks ago, the moment came when I thanked myself for having tests. 💡 I have been working on a project since September so at this point it is getting pretty big. -We are in the process of adding validations in user forms, and the tests are -functioning like a bulletproof jacket. 🛡️ +We are in the process of adding validations in user forms, and the tests are functioning like a bulletproof jacket. 🛡️ -Multiple times I thought that my code was working well but then I ran the tests -and realized I was breaking the code of other features. 🥲 +Multiple times I thought that my code was working well but then I ran the tests and realized I was breaking the code of other features. 🥲 -My previous mentor once told me that he prefers to write the tests before his -code as a way of breaking down the steps of the problem and building confidence -in his code. +My previous mentor once told me that he prefers to write the tests before his code as a way of breaking down the steps of the problem and building confidence in his code. -This style of programming is called TDD - test-driven development. In my head it -looked weird - “how can I write a test before having the code?”, but I have -started to do it now: +This style of programming is called TDD - test-driven development. In my head it looked weird - “how can I write a test before having the code?”, but I have started to do it now: ```jsx describe("professional info is", () => { @@ -146,75 +103,41 @@ describe("professional info is", () => { ``` -I needed to add a validation for an input and I started with the code above, -after which I would go to my validation function and change it until I made sure -I was throwing an invalid response for null values. +I needed to add a validation for an input and I started with the code above, after which I would go to my validation function and change it until I made sure I was throwing an invalid response for null values. -Testing, it’s still not my cup of tea. I want to invest more in learning about -it and it will probably be more enjoyable once I get better at it, so I will try -to get my colleagues to pair program with me about this. +Testing, it’s still not my cup of tea. I want to invest more in learning about it and it will probably be more enjoyable once I get better at it, so I will try to get my colleagues to pair program with me about this. -Speaking of mentors, I’m going to my last tip **#5 tip - get a mentor and jump -into pair programming sessions**. +Speaking of mentors, I’m going to my last tip **#5 tip - get a mentor and jump into pair programming sessions**. -The way this goes depends on the environment within your company. Unfortunately, -I see a lot of juniors that tell me that they never did pair programming with a -colleague or that they get judged by the amount of time they need to accomplish -their tasks. +The way this goes depends on the environment within your company. Unfortunately, I see a lot of juniors that tell me that they never did pair programming with a colleague or that they get judged by the amount of time they need to accomplish their tasks. -If you land in a new job where nobody is showing availability to help you out - -you are in the wrong place. +If you land in a new job where nobody is showing availability to help you out - you are in the wrong place. -During my first 3 months at Mainmatter, I was probably pair programming at least -once a week, sometimes more. Right now I'm doing it less often, which is -natural - the more you progress the more independent you become. +During my first 3 months at Mainmatter, I was probably pair programming at least once a week, sometimes more. Right now I'm doing it less often, which is natural - the more you progress the more independent you become. -However, I do want to go back to more regular pair programming sessions - not -only is it a great way of learning, but it also makes you understand your -colleagues' thinking flow better, which makes reviewing each other's code -easier. +However, I do want to go back to more regular pair programming sessions - not only is it a great way of learning, but it also makes you understand your colleagues' thinking flow better, which makes reviewing each other's code easier. ### So, how is my week as a junior dev looking now? -- I keep working with React: it has some tricky concepts that I’m still trying - to fully understand, like dealing with the state of components. -- We have 1 day per week to work on open source/learning. I’m using mine to - create a personal website in Ember which has been a great way of learning - while doing a project that I like. -- I’m part of the culture team - we discuss topics that aim for a continuous - good team environment. I’m organizing the Lunch & Learn event once a month - which was born from these meetings. -- I’m having 🇫🇷 lessons, I'm happy that Mainmatter allows me to grow in other - fields! +- I keep working with React: it has some tricky concepts that I’m still trying to fully understand, like dealing with the state of components. +- We have 1 day per week to work on open source/learning. I’m using mine to create a personal website in Ember which has been a great way of learning while doing a project that I like. +- I’m part of the culture team - we discuss topics that aim for a continuous good team environment. I’m organizing the Lunch & Learn event once a month which was born from these meetings. +- I’m having 🇫🇷 lessons, I'm happy that Mainmatter allows me to grow in other fields! ## Conclusion - As (junior) software engineers, you probably have been googling and reading - from websites the whole day already, so we love tldr part don't we? + As (junior) software engineers, you probably have been googling and reading from websites the whole day already, so we love tldr part don't we? Let me sum up my **tips** for you: -- **#1 If you don't know, apply for full-stack jobs.** The software development - world is a wide place, if you don't know where you fit the best. -- **#2 Get git rolling.** You will never work alone, so invest a lot of learning - time in tools that will make you work efficiently in a team like Git. -- **#3 Keep a learning journal** As juniors, our learning curve is on skyrocket - mode, even tho we deal with computers we don't operate like them, note down - your daily challenges and how you overcame them, maybe you will not read it - later but it will help you tidy in your mind all the new information. -- **#4 Get your hands-on testing** I think if, before your 1st job, you were - only doing personal and academic projects you were probably not introduced to - testing, it may look like a waste of time at the beginning of a project but - you will be thankfull when it will act like a bug-proof shield later on 🛡 -- **#5 Get a mentor and jump into pair programming sessions**. Nothing speeds up - our learning than having a mentor. You get to understand each other's ways of - thinking, making code reviews easier. Also, being a remote software engineer - can become pretty lonely, and this can counterbalance that. - -Et voilá! I hope the Inês from the future will look back at this and see how -much she progressed! +- **#1 If you don't know, apply for full-stack jobs.** The software development world is a wide place, if you don't know where you fit the best. +- **#2 Get git rolling.** You will never work alone, so invest a lot of learning time in tools that will make you work efficiently in a team like Git. +- **#3 Keep a learning journal** As juniors, our learning curve is on skyrocket mode, even tho we deal with computers we don't operate like them, note down your daily challenges and how you overcame them, maybe you will not read it later but it will help you tidy in your mind all the new information. +- **#4 Get your hands-on testing** I think if, before your 1st job, you were only doing personal and academic projects you were probably not introduced to testing, it may look like a waste of time at the beginning of a project but you will be thankfull when it will act like a bug-proof shield later on 🛡 +- **#5 Get a mentor and jump into pair programming sessions**. Nothing speeds up our learning than having a mentor. You get to understand each other's ways of thinking, making code reviews easier. Also, being a remote software engineer can become pretty lonely, and this can counterbalance that. + +Et voilá! I hope the Inês from the future will look back at this and see how much she progressed! As for my fellow, junior software engineers, I hope this helped you in some way. -Feel free to share your challenges and progress with me. 🙂 Keep learning & stay -curious! +Feel free to share your challenges and progress with me. 🙂 Keep learning & stay curious! diff --git a/src/posts/2022-06-23-the-perfect-hash-function.md b/src/posts/2022-06-23-the-perfect-hash-function.md index 73a0d95fc5..9d55a0fda8 100644 --- a/src/posts/2022-06-23-the-perfect-hash-function.md +++ b/src/posts/2022-06-23-the-perfect-hash-function.md @@ -3,10 +3,7 @@ title: "rust-phf: the perfect hash function" authorHandle: tobiasbieniek tags: rust bio: "Senior Software Engineer" -description: - "Tobias Bieniek made MIME type handling in the crates.io server infinitely - faster by using perfect hash functions with the rust-phf crate and moving work - from runtime to compile time." +description: "Tobias Bieniek made MIME type handling in the crates.io server infinitely faster by using perfect hash functions with the rust-phf crate and moving work from runtime to compile time." og: image: /assets/images/posts/2022-06-23-the-perfect-hash-function/og-image.jpg tagline: | @@ -15,29 +12,18 @@ tagline: | generation.

    --- -Let's start at the beginning. [crates.io] is the package registry of the [Rust] -programming language, or in simpler terms: the place where you can download all -the dependencies of your apps. The crates.io server itself is also built with -Rust, and specifically with an HTTP framework called `conduit`. +Let's start at the beginning. [crates.io] is the package registry of the [Rust] programming language, or in simpler terms: the place where you can download all the dependencies of your apps. The crates.io server itself is also built with Rust, and specifically with an HTTP framework called `conduit`. [crates.io]: https://crates.io/ [rust]: https://www.rust-lang.org/ -`conduit` has a component called `conduit-static`, which is responsible for -efficiently serving static files to the users. `conduit-static` is itself -relying on a package called `conduit-mime-types`, which is the main focus of -this story. The purpose of this package is to map filename extensions to [MIME -types] and vice-versa. +`conduit` has a component called `conduit-static`, which is responsible for efficiently serving static files to the users. `conduit-static` is itself relying on a package called `conduit-mime-types`, which is the main focus of this story. The purpose of this package is to map filename extensions to [MIME types] and vice-versa. -[mime types]: - https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types +[mime types]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types -In other words: if you call `get_mime_type("xls")` the function should return -`Some("application/vnd.ms-excel")` and if you call -`get_extension("application/vnd.ms-excel")` it should return `Some("xls")`. +In other words: if you call `get_mime_type("xls")` the function should return `Some("application/vnd.ms-excel")` and if you call `get_extension("application/vnd.ms-excel")` it should return `Some("xls")`. -The most naive implementation would use a list of filename extension and MIME -type records: +The most naive implementation would use a list of filename extension and MIME type records: ``` ... @@ -47,57 +33,29 @@ xps = application/vnd.ms-xpsdocument ... ``` -and it would then search through the list to find a matching filename extension -or MIME type. While this works fine if you only have few entries in that list, -it slows down significantly the more records you add to that list. +and it would then search through the list to find a matching filename extension or MIME type. While this works fine if you only have few entries in that list, it slows down significantly the more records you add to that list. -One way of improving the situation is to use hashmaps. These data structures -calculate a hash of the thing you pass in, and then efficiently look-up the -other thing that might be associated with this hash. These hashmaps also become -slower the more records you put into them, but their performance is still much, -much better compared to linear lists. +One way of improving the situation is to use hashmaps. These data structures calculate a hash of the thing you pass in, and then efficiently look-up the other thing that might be associated with this hash. These hashmaps also become slower the more records you put into them, but their performance is still much, much better compared to linear lists. ## How it started -The original implementation of `conduit-mime-types` was already using two -hashmaps, one for extension to MIME type mapping, and a second one for MIME type -to extension mapping. Both of these hashmaps were filled by an `initialize()` -function, which read a JSON file and then transformed the data into these -mappings. +The original implementation of `conduit-mime-types` was already using two hashmaps, one for extension to MIME type mapping, and a second one for MIME type to extension mapping. Both of these hashmaps were filled by an `initialize()` function, which read a JSON file and then transformed the data into these mappings. -While this initialization step wasn't particularly slow, it still took quite a -few unnecessary milliseconds. In fact, it used to be slow enough that we even -found a benchmark in the project which measured the initialization speed. -Needless to say that we got -[nerd sniped](https://en.wikipedia.org/wiki/Nerd_sniping) by this benchmark to -improve the initialization speed. +While this initialization step wasn't particularly slow, it still took quite a few unnecessary milliseconds. In fact, it used to be slow enough that we even found a benchmark in the project which measured the initialization speed. Needless to say that we got [nerd sniped](https://en.wikipedia.org/wiki/Nerd_sniping) by this benchmark to improve the initialization speed. ## Step 1: Code generation -While JSON can be parsed at -[blazing speed](https://github.com/simdjson/simdjson) these days, it is still -slower than not having to parse it at all. Our first step towards a more -efficient implementation was to get rid of the JSON parsing step. +While JSON can be parsed at [blazing speed](https://github.com/simdjson/simdjson) these days, it is still slower than not having to parse it at all. Our first step towards a more efficient implementation was to get rid of the JSON parsing step. -How did we get rid of the parsing step? Well, we didn't, but we did move it from -run time to development time. We wrote a small script that parsed the JSON file -and generated Rust code based on the content of the JSON file. The only thing -that was left in the initialization code was transforming the statically bundled -MIME type data into the hashmap records. This step resulted in a roughly 80% -performance improvement. +How did we get rid of the parsing step? Well, we didn't, but we did move it from run time to development time. We wrote a small script that parsed the JSON file and generated Rust code based on the content of the JSON file. The only thing that was left in the initialization code was transforming the statically bundled MIME type data into the hashmap records. This step resulted in a roughly 80% performance improvement. -You can find the corresponding pull request -[here](https://github.com/conduit-rust/conduit-mime-types/pull/17) +You can find the corresponding pull request [here](https://github.com/conduit-rust/conduit-mime-types/pull/17) ## Step 2: Automatic code generation -While this approach was working quite well, it resulted is a small maintenance -overhead because the code generation script would have to be run each time the -raw JSON data was edited. +While this approach was working quite well, it resulted is a small maintenance overhead because the code generation script would have to be run each time the raw JSON data was edited. -One alternative is to automatically generate the code at compile-time. This can -be achieved by creating a `build.rs` file next to the `Cargo.toml` file of your -library: +One alternative is to automatically generate the code at compile-time. This can be achieved by creating a `build.rs` file next to the `Cargo.toml` file of your library: ```rust use std::env; @@ -112,59 +70,30 @@ fn main() { } ``` -The `main()` function of this file will be executed automatically before your -library is compiled, and you can use it to generate arbitrary code files that -the rest of your code can then import, or rather `include!(...)`. +The `main()` function of this file will be executed automatically before your library is compiled, and you can use it to generate arbitrary code files that the rest of your code can then import, or rather `include!(...)`. -While this admittedly decreased our build speed, it also meant that the raw JSON -data and the generated code file could no longer diverge and cause subtle bugs. -In practice the build speed degradation was barely measurable though, since the -compilation of the code itself already took a significant amount of time. +While this admittedly decreased our build speed, it also meant that the raw JSON data and the generated code file could no longer diverge and cause subtle bugs. In practice the build speed degradation was barely measurable though, since the compilation of the code itself already took a significant amount of time. ## Step 3: Perfect hash functions -As we mentioned earlier, we still had an initialization step which transformed -that raw data in the generated code file to the hashmap records. This was -necessary because Rust currently does not support `static` hashmaps, which would -be necessary to have them generated at compile time. Luckily, there are -alternatives. +As we mentioned earlier, we still had an initialization step which transformed that raw data in the generated code file to the hashmap records. This was necessary because Rust currently does not support `static` hashmaps, which would be necessary to have them generated at compile time. Luckily, there are alternatives. -While looking for a solution to the problem we stumbled upon the [rust-phf] -crate, which has the tagline: "Compile time static maps for Rust". Exactly what -we needed! +While looking for a solution to the problem we stumbled upon the [rust-phf] crate, which has the tagline: "Compile time static maps for Rust". Exactly what we needed! [rust-phf]: https://github.com/rust-phf/rust-phf -It was relatively straight-forward to modify our `build.rs` file and take -advantage of the `phf_codegen` crate to generate the necessary two maps at -compile time for us. The resulting maps have an API that is roughly similar to -the regular hashmaps in Rust, but all we really needed was the `.get()` method -anyway. +It was relatively straight-forward to modify our `build.rs` file and take advantage of the `phf_codegen` crate to generate the necessary two maps at compile time for us. The resulting maps have an API that is roughly similar to the regular hashmaps in Rust, but all we really needed was the `.get()` method anyway. -We now had gotten rid of all the content of the initialization step, reducing -the time to run that step to essentially zero. Through some clever math we -determined that by removing the step we had made it infinitely faster, and we -could now get rid of the corresponding benchmark too. +We now had gotten rid of all the content of the initialization step, reducing the time to run that step to essentially zero. Through some clever math we determined that by removing the step we had made it infinitely faster, and we could now get rid of the corresponding benchmark too. -Not only that, we also improved the lookup speed. `rust-phf` is using "perfect -hash functions", as the name suggests. This means that it generates hash maps -that don't have any collisions, which makes the lookup code much more efficient. -The downside of these maps is that they have to recalculate the whole map if you -insert any records, but since we were dealing with read-only data this downside -was irrelevant to us. +Not only that, we also improved the lookup speed. `rust-phf` is using "perfect hash functions", as the name suggests. This means that it generates hash maps that don't have any collisions, which makes the lookup code much more efficient. The downside of these maps is that they have to recalculate the whole map if you insert any records, but since we were dealing with read-only data this downside was irrelevant to us. -You can take a look at the pull request that introduced `rust-phf` in -`conduit-mime-types` -[here](https://github.com/conduit-rust/conduit-mime-types/pull/18). +You can take a look at the pull request that introduced `rust-phf` in `conduit-mime-types` [here](https://github.com/conduit-rust/conduit-mime-types/pull/18). ## Conclusion -If you have read-only mappings that you want to use in your Rust code, then the -`rust-phf` project can give you significant speed improvements by moving some of -the work to compile time. +If you have read-only mappings that you want to use in your Rust code, then the `rust-phf` project can give you significant speed improvements by moving some of the work to compile time. -We hope that this short story about our work on `conduit-mime-types` was helpful -to you. If you have any questions do not hesitate to [contact] us. We're happy -to help! +We hope that this short story about our work on `conduit-mime-types` was helpful to you. If you have any questions do not hesitate to [contact] us. We're happy to help! [contact]: /contact/ diff --git a/src/posts/2022-08-09-scaling-tech-teams.md b/src/posts/2022-08-09-scaling-tech-teams.md index 2244e01b90..b0bb4fb249 100644 --- a/src/posts/2022-08-09-scaling-tech-teams.md +++ b/src/posts/2022-08-09-scaling-tech-teams.md @@ -3,9 +3,7 @@ title: "Scaling Tech Teams" authorHandle: marcoow tags: process bio: "Founder and Managing Director of Mainmatter" -description: - "Marco Otte-Witte shares learnings around growing tech teams and how to avoid - typical mistakes." +description: "Marco Otte-Witte shares learnings around growing tech teams and how to avoid typical mistakes." og: image: /assets/images/posts/2022-08-09-scaling-tech-teams/og-image.jpg tagline: | @@ -22,222 +20,61 @@ tagline: | ## Mentoring and Growth -While many teams start out with a small number of experienced experts, growth -beyond a certain threshold requires opening up to less experienced people as -well. And with the changing composition of a team also come changing needs – -less experienced engineers won't be able to contribute to the codebase to the -same extent that more senior people would. They need additional guidance and -mentoring and will get frustrated and burned out without it. At the same time, -given support, they will more often than not excel and become senior engineers -themselves. That said, a common mistake we see many teams make is to just add -beginners to their teams without putting any real thought into what kind of -guidance they will need, only to be surprised a few months later when the people -leave again. That's not only a bad experience for the less experienced engineer -who probably was eager to learn and motivated when they started but also a -missed opportunity for the company that could have added a valuable member to -their team. - -Ines from the Mainmatter team wrote about -[her journey as a beginner engineer](/blog/2022/05/19/journey-of-a-junior-software-engineer/) -– it's a great post I recommend beginners as well as experienced engineers read. -One of Inês' main points is: - -> If you land in a new job where nobody is showing availability to help you -> out - you are in the wrong place. - -Supporting less experienced engineers in making impactful contributions to -codebase can (and should) happen in many ways. First, remove any accidental -complexity from the process and infrastructure that would impose an extra wall -to climb over for any engineer at the beginning of their career. For example, -while experienced engineers might be able to set up a bunch of dependant -services and run a variety of micro-services directly on their machine, that -might be a blocker for a beginner – containerizing the complete development -environment before introducing beginners to the team can likely prevent a lot of -frustration and wasted time and is beneficial to the rest of the team as well. - -Preparing work thoroughly can go a long way in supporting less experienced -engineers as well. Instead of assigning underspecified tasks where lots is still -left to be figured out, analyze the status quo and plan what steps need to be -taken to get to the desired goal before starting to write code. That way, -beginners have a trail to follow and blockers or uncertainties can be uncovered -and resolved before they hit a wall mid-way through their work. For more -guidance on efficient preparation of work, check our [playbook](/playbook) as -well. +While many teams start out with a small number of experienced experts, growth beyond a certain threshold requires opening up to less experienced people as well. And with the changing composition of a team also come changing needs – less experienced engineers won't be able to contribute to the codebase to the same extent that more senior people would. They need additional guidance and mentoring and will get frustrated and burned out without it. At the same time, given support, they will more often than not excel and become senior engineers themselves. That said, a common mistake we see many teams make is to just add beginners to their teams without putting any real thought into what kind of guidance they will need, only to be surprised a few months later when the people leave again. That's not only a bad experience for the less experienced engineer who probably was eager to learn and motivated when they started but also a missed opportunity for the company that could have added a valuable member to their team. + +Ines from the Mainmatter team wrote about [her journey as a beginner engineer](/blog/2022/05/19/journey-of-a-junior-software-engineer/) – it's a great post I recommend beginners as well as experienced engineers read. One of Inês' main points is: + +> If you land in a new job where nobody is showing availability to help you out - you are in the wrong place. + +Supporting less experienced engineers in making impactful contributions to codebase can (and should) happen in many ways. First, remove any accidental complexity from the process and infrastructure that would impose an extra wall to climb over for any engineer at the beginning of their career. For example, while experienced engineers might be able to set up a bunch of dependant services and run a variety of micro-services directly on their machine, that might be a blocker for a beginner – containerizing the complete development environment before introducing beginners to the team can likely prevent a lot of frustration and wasted time and is beneficial to the rest of the team as well. + +Preparing work thoroughly can go a long way in supporting less experienced engineers as well. Instead of assigning underspecified tasks where lots is still left to be figured out, analyze the status quo and plan what steps need to be taken to get to the desired goal before starting to write code. That way, beginners have a trail to follow and blockers or uncertainties can be uncovered and resolved before they hit a wall mid-way through their work. For more guidance on efficient preparation of work, check our [playbook](/playbook) as well. ![A well prepared issue provides beginners with a trail to follow](/assets/images/posts/2022-08-09-scaling-tech-teams/issue.svg#plain) -Analyzing and preparing work is also a nice exercise for a beginner and an -experienced engineer to do together. Generally, closely collaborating with and -observing more experienced people is a great way to learn – whether it's pair -programming or working on other tasks like figuring out what needs to be done -for a particular issue. Additionally, there are other ways of teaching of course -like giving deep explanations for why a particular change might be brought up -during a code review or running workshops on particular topics that people are -struggling with. We have worked with a number of fast-growing teams over the -years and seen many beginners excel and turn into experienced senior engineers -given the right support over the years – find out about our -[Team reinforcement](/services/team-reinforcement/) offering to learn more. +Analyzing and preparing work is also a nice exercise for a beginner and an experienced engineer to do together. Generally, closely collaborating with and observing more experienced people is a great way to learn – whether it's pair programming or working on other tasks like figuring out what needs to be done for a particular issue. Additionally, there are other ways of teaching of course like giving deep explanations for why a particular change might be brought up during a code review or running workshops on particular topics that people are struggling with. We have worked with a number of fast-growing teams over the years and seen many beginners excel and turn into experienced senior engineers given the right support over the years – find out about our [Team reinforcement](/services/team-reinforcement/) offering to learn more. ## Code Health and Tech Debt -The negative impacts of low code health and technical debt are widely understood -in our industry by now. When it comes to scaling teams though, the topic becomes -even more relevant – whether bad code affects the productivity of a team of 5 or -a team of 50 just makes a huge difference. The bigger a team gets, the higher -the price tag is on unaddressed tech debt, in particular with more beginners on -a team that might not be as comfortable working around it. Accepting tech debt -as an impediment not only to the productivity but to the scalability of a team -as such is crucial (one of our client calls this Scaling work instead of tech -debt). **Plan time for working on code health and prioritize it together with -feature work – it will have equal relevance for the sustainability of your -product**! +The negative impacts of low code health and technical debt are widely understood in our industry by now. When it comes to scaling teams though, the topic becomes even more relevant – whether bad code affects the productivity of a team of 5 or a team of 50 just makes a huge difference. The bigger a team gets, the higher the price tag is on unaddressed tech debt, in particular with more beginners on a team that might not be as comfortable working around it. Accepting tech debt as an impediment not only to the productivity but to the scalability of a team as such is crucial (one of our client calls this Scaling work instead of tech debt). **Plan time for working on code health and prioritize it together with feature work – it will have equal relevance for the sustainability of your product**! ## Developer Infrastructure -Related to tech debt is developer infrastructure – the bigger a team gets, the -bigger the negative impact of subpar infrastructure is going to be. A flaky test -server, slow deployment processes or unavailable tools will slow down or in the -worst case block a large and growing number of people. For the same reason, -there's also no room for any manual elements in the infrastructure or processes -– manual QA or deployment for example will quickly turn into bottlenecks and -impede the productivity of the entire team. Instead, in order to let teams focus -on their work and enable them to ship constantly, **double down on highly -integrated and automated pipelines – all time invested on these will pay off -manyfold later on**. I wrote more about the elements of such infrastructure in -an -[earlier post](/blog/2021/07/13/effective-infrastructure-for-efficient-development-workflows/). +Related to tech debt is developer infrastructure – the bigger a team gets, the bigger the negative impact of subpar infrastructure is going to be. A flaky test server, slow deployment processes or unavailable tools will slow down or in the worst case block a large and growing number of people. For the same reason, there's also no room for any manual elements in the infrastructure or processes – manual QA or deployment for example will quickly turn into bottlenecks and impede the productivity of the entire team. Instead, in order to let teams focus on their work and enable them to ship constantly, **double down on highly integrated and automated pipelines – all time invested on these will pay off manyfold later on**. I wrote more about the elements of such infrastructure in an [earlier post](/blog/2021/07/13/effective-infrastructure-for-efficient-development-workflows/). ### Invest in Developer Enablement -Once past a certain size, it often even makes sense to task a smaller number of -engineers exclusively with making everyone else more productive. That team would -focus on building, maintaining, and optimizing the internal developer platform -that all of the other engineers base their work on (a team like that would often -be referred to as a -[Platform Engineering](https://platformengineering.org/blog/what-is-platform-engineering) -or Platform Development team). Since this kind of work has increasing leverage -with a growing number of total people on the team, the cost-benefit analysis is -often obvious and makes a decision for such a team trivial. A Platform -Engineering team can e.g. build abstractions to make working with particular -aspects of the codebase easier, automate checks for particular patterns to avoid -rework, optimize tooling to shorten compile or testing times. While all of these -things might only result in relatively small productivity improvements per -individual engineer, as these changes affect every single engineer on the team, -they have a big impact overall. +Once past a certain size, it often even makes sense to task a smaller number of engineers exclusively with making everyone else more productive. That team would focus on building, maintaining, and optimizing the internal developer platform that all of the other engineers base their work on (a team like that would often be referred to as a [Platform Engineering](https://platformengineering.org/blog/what-is-platform-engineering) or Platform Development team). Since this kind of work has increasing leverage with a growing number of total people on the team, the cost-benefit analysis is often obvious and makes a decision for such a team trivial. A Platform Engineering team can e.g. build abstractions to make working with particular aspects of the codebase easier, automate checks for particular patterns to avoid rework, optimize tooling to shorten compile or testing times. While all of these things might only result in relatively small productivity improvements per individual engineer, as these changes affect every single engineer on the team, they have a big impact overall. ## The Limits of Scope -While a small team of engineers might be able collaborate on a single codebase -efficiently, that becomes ever harder the bigger the team and the codebase with -it grows. At a certain point, nobody will be able to capture the system in its -entirety anymore which will lead to inconsistency and thus inefficiency – people -will solve the same problem over and over as they're not aware of existing -solutions that might be reusable, different parts of the codebase might actually -be conflicting with each other, etc. - -The only option there is to address this problem is often to split things up -into smaller chunks – decomposing the large system and the team that maintains -it into smaller subsystems that are each maintained by their own teams (kind of -[Conway's law](https://en.wikipedia.org/wiki/Conway%27s_law) but in reverse). -Each of these subsystems will be limited to a reduced scope which enables teams -to actually be on top of all of that. Also subsystems only need to be consistent -within themselves and there is new freedom for teams to make different -technology choices for their subsystems which can also be a great driver for -motivation. - -Where the boundaries between the individual subsystems are of course depends on -the respective project. There are also many ways of splitting up a big system -into subsystems – from keeping a central codebase but enforcing boundaries -between subsystems via architecture and tooling, to splitting into completely -separate products or going the micro-service/frontends route. There's no one -strategy that will work in all cases as different approaches will have pros and -cons in different situations. The one rule to keep in mind is that the less -interaction and fewer dependencies there are between the subsystems, the easier -things are going to be. - -Splitting systems into subsystems comes at a substantial cost though and should -generally not be something that's decided for lightly. While limiting -cross-dependencies between subsystems and the teams managing them is a good -goal, it's rarely possible in reality to completely achieve. So while many -things get easier after the split, some things also get significantly harder -(e.g. code reuse across subsystems or synchronization between the teams -maintaining different subsystems). One mistake I've seen a few times over the -years is making this split too early or even building systems like this from the -beginning. Teams doing that end up paying a high cost for virtually no benefit -as they are not yet feeling the pain that this kind of architecture would solve. -**Decompose systems when you feel real pain but not before**. +While a small team of engineers might be able collaborate on a single codebase efficiently, that becomes ever harder the bigger the team and the codebase with it grows. At a certain point, nobody will be able to capture the system in its entirety anymore which will lead to inconsistency and thus inefficiency – people will solve the same problem over and over as they're not aware of existing solutions that might be reusable, different parts of the codebase might actually be conflicting with each other, etc. + +The only option there is to address this problem is often to split things up into smaller chunks – decomposing the large system and the team that maintains it into smaller subsystems that are each maintained by their own teams (kind of [Conway's law](https://en.wikipedia.org/wiki/Conway%27s_law) but in reverse). Each of these subsystems will be limited to a reduced scope which enables teams to actually be on top of all of that. Also subsystems only need to be consistent within themselves and there is new freedom for teams to make different technology choices for their subsystems which can also be a great driver for motivation. + +Where the boundaries between the individual subsystems are of course depends on the respective project. There are also many ways of splitting up a big system into subsystems – from keeping a central codebase but enforcing boundaries between subsystems via architecture and tooling, to splitting into completely separate products or going the micro-service/frontends route. There's no one strategy that will work in all cases as different approaches will have pros and cons in different situations. The one rule to keep in mind is that the less interaction and fewer dependencies there are between the subsystems, the easier things are going to be. + +Splitting systems into subsystems comes at a substantial cost though and should generally not be something that's decided for lightly. While limiting cross-dependencies between subsystems and the teams managing them is a good goal, it's rarely possible in reality to completely achieve. So while many things get easier after the split, some things also get significantly harder (e.g. code reuse across subsystems or synchronization between the teams maintaining different subsystems). One mistake I've seen a few times over the years is making this split too early or even building systems like this from the beginning. Teams doing that end up paying a high cost for virtually no benefit as they are not yet feeling the pain that this kind of architecture would solve. **Decompose systems when you feel real pain but not before**. ## Process -Another critical requirement for being able to scale tech teams is establishing -a process that enables that. The main aspect of such a process is early and -close collaboration between stakeholders. While classic agile processes are -often driven exclusively by product needs, they result in a lot of inefficiency -when engineering figures out how to make a plan set by product a reality. Often, -there would have been easier and more efficient alternatives to reach the same -or an equal goal. The larger a team becomes, the more expensive the consequences -of these inefficiencies are. +Another critical requirement for being able to scale tech teams is establishing a process that enables that. The main aspect of such a process is early and close collaboration between stakeholders. While classic agile processes are often driven exclusively by product needs, they result in a lot of inefficiency when engineering figures out how to make a plan set by product a reality. Often, there would have been easier and more efficient alternatives to reach the same or an equal goal. The larger a team becomes, the more expensive the consequences of these inefficiencies are. ![Source and shape work collaborating with all stakeholders from the get-to](/assets/images/posts/2022-08-09-scaling-tech-teams/work-sourcing.svg#plain) -So instead of a linear process where product sets a plan based purely on their -perspective that engineering then tries to convert into code, the two work -together from the beginning. Based on the high level product strategy, they work -out the most efficient way to reach a goal, considering both the user needs as -well as technical complexities and feasibility. That way, the team reaches goals -more efficiently instead spending valuable time working against each other or -trying to realize plans that were flawed from the get-go. +So instead of a linear process where product sets a plan based purely on their perspective that engineering then tries to convert into code, the two work together from the beginning. Based on the high level product strategy, they work out the most efficient way to reach a goal, considering both the user needs as well as technical complexities and feasibility. That way, the team reaches goals more efficiently instead spending valuable time working against each other or trying to realize plans that were flawed from the get-go. ## Remotely international -Everyone knows that remote work is here to stay, in the tech industry at least. -Even though the pandemic situation would allow for it in many places, only few -teams go back to working from the office full-time. When it comes to scaling -tech teams, hiring remotely is often a prerequisite to even finding people to -hire and thus being able to scale at all. Even if a team is located in one of -the hotspots where there are lots of developers in the place in theory, demand -is likely high as well so that hiring locally would be no feasible option. So in -the end, everyone ends up hiring people remotely which usually also means -internationally. - -While I have written about making -[remote work work](/blog/2020/11/16/the-guide-to-making-remote-work-work/) -before, there are two points to consider in particular when starting to -internationalize the team. As obvious as it might be, the first point is still -something teams forget and pay a high price for later: everything you do you -need to do in English. Hiring internationally means people will not speak the -local language and everyone will end up doing everything in English. If that -fact hasn't been taken into account from the get-go and there's essential -material (documentation, users stories, issues, etc.) that are only available in -german or french or whatever, all of these materials are inaccessible to people -that don't understand those languages and will have to be translated or -recreated eventually. **Keeping everything in English from the beginning is easy -to forget but absolutely essential to be able to internationalize a team later -on**. - -The second point when it comes to scaling internationally is timezones. While -it's not important that everyone is around during the exact same times (after -all, people would start and end work at different times in an office as well), -it does make a difference whether there's a few hours of overlap or none at all. -While both setups can work and there are a lot of companies that have teams -distributed between the US West Coast and Asia where there's virtually no -overlap ever in people's working hours, it definitely is easier if there's at -least a few hours of overlap. So based on our experience at Mainmatter, I'd say -**if you can, try and limit your team to be across 3-4 timezones max** – that -not only makes communication easier but it also means people will still be -relatively close together which makes it easier (and more environmentally -friendly) to bring everyone together every once in a while to keep up team -spirit. +Everyone knows that remote work is here to stay, in the tech industry at least. Even though the pandemic situation would allow for it in many places, only few teams go back to working from the office full-time. When it comes to scaling tech teams, hiring remotely is often a prerequisite to even finding people to hire and thus being able to scale at all. Even if a team is located in one of the hotspots where there are lots of developers in the place in theory, demand is likely high as well so that hiring locally would be no feasible option. So in the end, everyone ends up hiring people remotely which usually also means internationally. + +While I have written about making [remote work work](/blog/2020/11/16/the-guide-to-making-remote-work-work/) before, there are two points to consider in particular when starting to internationalize the team. As obvious as it might be, the first point is still something teams forget and pay a high price for later: everything you do you need to do in English. Hiring internationally means people will not speak the local language and everyone will end up doing everything in English. If that fact hasn't been taken into account from the get-go and there's essential material (documentation, users stories, issues, etc.) that are only available in german or french or whatever, all of these materials are inaccessible to people that don't understand those languages and will have to be translated or recreated eventually. **Keeping everything in English from the beginning is easy to forget but absolutely essential to be able to internationalize a team later on**. + +The second point when it comes to scaling internationally is timezones. While it's not important that everyone is around during the exact same times (after all, people would start and end work at different times in an office as well), it does make a difference whether there's a few hours of overlap or none at all. While both setups can work and there are a lot of companies that have teams distributed between the US West Coast and Asia where there's virtually no overlap ever in people's working hours, it definitely is easier if there's at least a few hours of overlap. So based on our experience at Mainmatter, I'd say **if you can, try and limit your team to be across 3-4 timezones max** – that not only makes communication easier but it also means people will still be relatively close together which makes it easier (and more environmentally friendly) to bring everyone together every once in a while to keep up team spirit. ## You're not alone -After all, scaling tech teams is a human effort as well and like all efforts -that involve a group of people, can and will be challenging. However, keeping a -few things in mind and ensuring a solid foundation that support the scalability -of a team is helpful. +After all, scaling tech teams is a human effort as well and like all efforts that involve a group of people, can and will be challenging. However, keeping a few things in mind and ensuring a solid foundation that support the scalability of a team is helpful. -If you're experiencing growing pains you'd like to get some help with, please -contact us and we'd be happy to chat. We've worked with a number of growing -teams and companies over the years including Qonto, Trainline, and Sage and are -happy to share our learnings! +If you're experiencing growing pains you'd like to get some help with, please contact us and we'd be happy to chat. We've worked with a number of growing teams and companies over the years including Qonto, Trainline, and Sage and are happy to share our learnings! diff --git a/src/posts/2022-08-24-cookbook-ember-app-to-css-modules.md b/src/posts/2022-08-24-cookbook-ember-app-to-css-modules.md index 1f95ce7b7e..2b66dbac8f 100644 --- a/src/posts/2022-08-24-cookbook-ember-app-to-css-modules.md +++ b/src/posts/2022-08-24-cookbook-ember-app-to-css-modules.md @@ -3,10 +3,7 @@ title: "Cookbook: migrate an existing Ember app to CSS modules" authorHandle: academierenards tags: open-source bio: "Senior software engineer" -description: - "Tutorial to start with ember-css-modules in an existing Ember app. It aims at - discovering ember-css-module from a practical perspective to get a different - view on the doc." +description: "Tutorial to start with ember-css-modules in an existing Ember app. It aims at discovering ember-css-module from a practical perspective to get a different view on the doc." og: image: /assets/images/posts/2022-08-24-cookbook-ember-app-to-css-modules/og-image.jpg tagline: | @@ -21,98 +18,59 @@ tagline: | This article is exactly what you are looking for if: - You are already comfortable with Ember. -- You know a bit of theory about what CSS modules are but you have never worked - with them before. -- It is the first time you set up - [`ember-css-modules`](https://github.com/salsify/ember-css-modules) in an - existing Ember app that already contains a global CSS setup. +- You know a bit of theory about what CSS modules are but you have never worked with them before. +- It is the first time you set up [`ember-css-modules`](https://github.com/salsify/ember-css-modules) in an existing Ember app that already contains a global CSS setup. This article might get your interest if: - You don't know a thing about CSS modules. -- After we've solved the previous point, you want to discover how CSS modules - can be used in an Ember context. +- After we've solved the previous point, you want to discover how CSS modules can be used in an Ember context. ### A word about CSS modules -To style an application with CSS, the minimum you need is one CSS file included -on the page. Even when split into different files, having one CSS scope that -applies globally on the whole page has some downsides in big and complex -applications. For instance, managing the styles of reusable components is -sometimes challenging. Also, the life of an application is made of turnover, -it's never easy for newcomers to identify dead code, resulting in overly heavy -and hard-to-clean CSS rules. +To style an application with CSS, the minimum you need is one CSS file included on the page. Even when split into different files, having one CSS scope that applies globally on the whole page has some downsides in big and complex applications. For instance, managing the styles of reusable components is sometimes challenging. Also, the life of an application is made of turnover, it's never easy for newcomers to identify dead code, resulting in overly heavy and hard-to-clean CSS rules. -CSS modules aim to overcome these challenges as a technique to scope CSS classes -locally, for instance to individual components. To read more about the general -concept, have a look at the -[documentation on Github](https://github.com/css-modules/css-modules). +CSS modules aim to overcome these challenges as a technique to scope CSS classes locally, for instance to individual components. To read more about the general concept, have a look at the [documentation on Github](https://github.com/css-modules/css-modules). ### A word about `ember-css-modules` -[`ember-css-modules`](https://github.com/salsify/ember-css-modules) is a nice -addon that lets developers easily integrate the CSS modules approach to the -implementation of their Ember apps and addons. +[`ember-css-modules`](https://github.com/salsify/ember-css-modules) is a nice addon that lets developers easily integrate the CSS modules approach to the implementation of their Ember apps and addons. -Installing `ember-css-modules` in an existing Ember app triggers some breaking -changes in the way the developer should handle the app styles. If the developer -is not familiar with CSS modules in the first place, they might have a hard time -figuring out how to set up and start the migration at their own pace. The -present tutorial is intended to be used as a quick start cookbook to achieve -this. +Installing `ember-css-modules` in an existing Ember app triggers some breaking changes in the way the developer should handle the app styles. If the developer is not familiar with CSS modules in the first place, they might have a hard time figuring out how to set up and start the migration at their own pace. The present tutorial is intended to be used as a quick start cookbook to achieve this. ### A word about `less` and `sass` -The usage of [less](https://lesscss.org/) and -[sass](https://sass-lang.com/guide) will not be mentioned in this tutorial, -though they are -[compatible with `ember-css-modules`](https://github.com/salsify/ember-css-modules/blob/master/docs/PREPROCESSORS.md). +The usage of [less](https://lesscss.org/) and [sass](https://sass-lang.com/guide) will not be mentioned in this tutorial, though they are [compatible with `ember-css-modules`](https://github.com/salsify/ember-css-modules/blob/master/docs/PREPROCESSORS.md). ## Migration tutorial -Let's start working. We'll take the -[SuperRentals app](https://guides.emberjs.com/release/tutorial/part-1/) as an -example. SuperRentals is the great tutorial part of the Ember guides to -introduce the main Ember features. As the purpose of the SuperRentals app is to -teach Ember and writing CSS is irrelevant to the matter, the CSS to style the -app is provided as a single `app.css` free to download (linked somewhere in the -first pages of Part 1), so newcomers don't have to write it themselves as they -walk through the tutorial. +Let's start working. We'll take the [SuperRentals app](https://guides.emberjs.com/release/tutorial/part-1/) as an example. SuperRentals is the great tutorial part of the Ember guides to introduce the main Ember features. As the purpose of the SuperRentals app is to teach Ember and writing CSS is irrelevant to the matter, the CSS to style the app is provided as a single `app.css` free to download (linked somewhere in the first pages of Part 1), so newcomers don't have to write it themselves as they walk through the tutorial. So let's make the SuperRentals app ready for migration to CSS modules. ### Install `ember-css-modules` (and break your app) -Let's suppose we have finished implementing the SuperRentals app. The following -screenshot shows the page as it should be in your browser, with the nice styling -provided in the tutorial: +Let's suppose we have finished implementing the SuperRentals app. The following screenshot shows the page as it should be in your browser, with the nice styling provided in the tutorial: ![SuperRentals with global CSS](/assets/images/posts/2022-08-24-cookbook-ember-app-to-css-modules/screen-1.png) -To use CSS modules, let's install -[`ember-css-modules`](https://github.com/salsify/ember-css-modules): +To use CSS modules, let's install [`ember-css-modules`](https://github.com/salsify/ember-css-modules): ``` ember install ember-css-modules ``` -The addon does not contain any blueprints, the installation command simply adds -the dependency to `package.json` and modifies the lock file. +The addon does not contain any blueprints, the installation command simply adds the dependency to `package.json` and modifies the lock file. Let's run the local server again and see how our app is doing: ![SuperRentals styles are broken](/assets/images/posts/2022-08-24-cookbook-ember-app-to-css-modules/screen-2.png) -Ouch, all the styles are broken. What we see now in the browser is very similar -to a page with no CSS at all. To understand what is going on let's use the -inspector tab of the browser's debugger. +Ouch, all the styles are broken. What we see now in the browser is very similar to a page with no CSS at all. To understand what is going on let's use the inspector tab of the browser's debugger. ### Understanding CSS classes isolation -If we compare the previously styled app and the version we have now, we notice -that Tomster (the Ember hamster mascot) is missing at the top right of the -screen. Let's find the element that should display Tomster in the DOM. The image -shows using the following approach: +If we compare the previously styled app and the version we have now, we notice that Tomster (the Ember hamster mascot) is missing at the top right of the screen. Let's find the element that should display Tomster in the DOM. The image shows using the following approach: ```html @@ -143,19 +101,9 @@ Now, let's have a look at the CSS applied on the `
    ` element: ![Tomster div highlighted in the DOM](/assets/images/posts/2022-08-24-cookbook-ember-app-to-css-modules/screen-3.png) -Only two CSS rules apply on the Tomster `
    `. The first one is a global rule -to reset margins. The second one defines the font family and line height set on -elements such as `body`, `h` titles, `p`, `div`, etc... The CSS classes -responsible for showing Tomster are `.right` and `.tomster`, but the rules -corresponding to these classes are no longer there! that's why the Tomster image -is no longer visible on screen. +Only two CSS rules apply on the Tomster `
    `. The first one is a global rule to reset margins. The second one defines the font family and line height set on elements such as `body`, `h` titles, `p`, `div`, etc... The CSS classes responsible for showing Tomster are `.right` and `.tomster`, but the rules corresponding to these classes are no longer there! that's why the Tomster image is no longer visible on screen. -In the section of the inspector dedicated to CSS description, when a style -applies to the selected element, we can see the name of the CSS file this style -comes from. On the screenshot above, it comes from `super-rental-typescript`, -which is the name of this demo application (the final "s" on "rentals" was -forgotten ^^' and it was first implemented as a migration test to TypeScript). -The file name is clickable and lets you see the content of the whole CSS file. +In the section of the inspector dedicated to CSS description, when a style applies to the selected element, we can see the name of the CSS file this style comes from. On the screenshot above, it comes from `super-rental-typescript`, which is the name of this demo application (the final "s" on "rentals" was forgotten ^^' and it was first implemented as a migration test to TypeScript). The file name is clickable and lets you see the content of the whole CSS file. At the top of the file, we read: @@ -202,23 +150,13 @@ At the bottom of the file, we read: } ``` -And here is the explanation about our missing Tomster. With `ember-css-modules` -installed, all the class selectors present in `app.css` end with a custom id. -However, this custom id is not present in our component's template: we still -have `class="right tomster"`. As a result, no CSS class is found for `.right` -and `.tomster` and no style applies. On the contrary, the rules defined for main -elements like `div` match by the element itself and thus keep applying. +And here is the explanation about our missing Tomster. With `ember-css-modules` installed, all the class selectors present in `app.css` end with a custom id. However, this custom id is not present in our component's template: we still have `class="right tomster"`. As a result, no CSS class is found for `.right` and `.tomster` and no style applies. On the contrary, the rules defined for main elements like `div` match by the element itself and thus keep applying. -`ember-css-modules` relies on class selectors to isolate the CSS and prevent it -from applying globally. The isolation system applies to every CSS file, -including those located in the main `styles` folder rather than alongside a -component. +`ember-css-modules` relies on class selectors to isolate the CSS and prevent it from applying globally. The isolation system applies to every CSS file, including those located in the main `styles` folder rather than alongside a component. ### Fix the setup with `:global` -Before starting to actively use CSS modules across the app, we should fix the -styles and allow `app.css` to apply globally as it did before. To do so, we can -use the `:global` pseudoselector: +Before starting to actively use CSS modules across the app, we should fix the styles and allow `app.css` to apply globally as it did before. To do so, we can use the `:global` pseudoselector: ```css /* app/styles/app.css */ @@ -243,27 +181,13 @@ And let's see what happens in the browser: ![Tomster shows again](/assets/images/posts/2022-08-24-cookbook-ember-app-to-css-modules/screen-4.png) -Tomster is back! If we take a new look at the generated CSS file in the -browser's inspector, we can see this time the classes `.right` and `.tomster` -don't have custom ids. The `:global` pseudoselector indicates these classes are -global classes that should apply to the whole page. So we are back to classic -CSS, with rules defined in `app.css` which apply to the page elements through -`class` attributes. By using the `:global` pseudoselector on the whole existing -CSS, we can style the whole app exactly as it was before installing -`ember-css-modules`, and from there we can serenely start to use some CSS -modules. +Tomster is back! If we take a new look at the generated CSS file in the browser's inspector, we can see this time the classes `.right` and `.tomster` don't have custom ids. The `:global` pseudoselector indicates these classes are global classes that should apply to the whole page. So we are back to classic CSS, with rules defined in `app.css` which apply to the page elements through `class` attributes. By using the `:global` pseudoselector on the whole existing CSS, we can style the whole app exactly as it was before installing `ember-css-modules`, and from there we can serenely start to use some CSS modules. ### Start using CSS modules -In the SuperRentals app, the Tomster `
    ` element is written in the `` -component's template (this component is instantiated at the top of each page). -So let's create the CSS file alongside the template. In the present example, the -file is `app/components/jumbo.css` as the app has a classic structure with -co-location. +In the SuperRentals app, the Tomster `
    ` element is written in the `` component's template (this component is instantiated at the top of each page). So let's create the CSS file alongside the template. In the present example, the file is `app/components/jumbo.css` as the app has a classic structure with co-location. -It would probably make sense if the `.right` class remains a global class that -can be assigned to different elements of the page. But let's make the `.tomster` -class local: +It would probably make sense if the `.right` class remains a global class that can be assigned to different elements of the page. But let's make the `.tomster` class local: ```css /* app/styles/app.css */ @@ -298,27 +222,12 @@ Everything should show as before: ![Tomster still shows as expected](/assets/images/posts/2022-08-24-cookbook-ember-app-to-css-modules/screen-5.png) -If we look one more time at the CSS classes in the inspector, we'll see that -class `.right` is still applied globally, but `.tomster` selector now owns a -custom id used to isolate the CSS. The syntax -`
    ` we used in the template -resulted in `
    ` in the browser so the -class attributes and the generated CSS rules match. +If we look one more time at the CSS classes in the inspector, we'll see that class `.right` is still applied globally, but `.tomster` selector now owns a custom id used to isolate the CSS. The syntax `
    ` we used in the template resulted in `
    ` in the browser so the class attributes and the generated CSS rules match. ## Conclusion -We have drawn the big picture about how `ember-css-modules` isolates CSS. The -way custom ids are assigned to selectors in a given CSS file is key to -understanding and starting to work with `ember-css-modules`. With this in mind, -it is up to you to continue digging and deduce the best way to organize CSS in -your specific project. - -As a next step, why don't you have a look at the -[composition feature](https://github.com/salsify/ember-css-modules#styling-reuse)? -At first glance and without reading the docs carefully enough, it might look -like "importing a CSS rule content", but that's not it. It is rather about -adding to an element with a `local-class` an additional `local-class` coming -from another file. So by using `composes` once, many different rules can -suddenly apply to the element. +We have drawn the big picture about how `ember-css-modules` isolates CSS. The way custom ids are assigned to selectors in a given CSS file is key to understanding and starting to work with `ember-css-modules`. With this in mind, it is up to you to continue digging and deduce the best way to organize CSS in your specific project. + +As a next step, why don't you have a look at the [composition feature](https://github.com/salsify/ember-css-modules#styling-reuse)? At first glance and without reading the docs carefully enough, it might look like "importing a CSS rule content", but that's not it. It is rather about adding to an element with a `local-class` an additional `local-class` coming from another file. So by using `composes` once, many different rules can suddenly apply to the element. I hope you enjoyed this tutorial :) diff --git a/src/posts/2022-09-18-simplabs-becomes-mainmatter.md b/src/posts/2022-09-18-simplabs-becomes-mainmatter.md index cdcc87765b..1dd31184b8 100644 --- a/src/posts/2022-09-18-simplabs-becomes-mainmatter.md +++ b/src/posts/2022-09-18-simplabs-becomes-mainmatter.md @@ -3,9 +3,7 @@ title: "simplabs becomes Mainmatter" authorHandle: marcoow tags: mainmatter bio: "Marco Otte-Witte" -description: - "Marco Otte-Witte shares some background on the rebranding from simplabs to - Mainmatter." +description: "Marco Otte-Witte shares some background on the rebranding from simplabs to Mainmatter." og: image: /assets/images/posts/2022-09-18-simplabs-becomes-mainmatter/og-image.jpg tagline: | @@ -14,20 +12,9 @@ image: "/assets/images/posts/2022-09-18-simplabs-becomes-mainmatter/mainmatter.s imageAlt: "The Mainmatter logo" --- -Mainmatter – or simplabs before this day – is 7.5 years old now. It was founded -in March 2015 and has since grown into a team of 20+ people across 11 countries. -Over the years we have completed 30+ project with more than 20 different clients -from small startups to big corporates. Engineers from our team have given -countless talks at international conferences and we're even running some of our -own events (check out our [events page](/events/)). - -Yet, we never had a professionally thought through and worked out brand in all -these years. I had started using simplabs.com as my personal website ca. 15 -years ago and when founding the company built a brand around that domain I -already had. I got the blue ball logo (which reminds some of the Scottish flag, -others of a cake diagram with missing labels but doesn't really **mean** -anything to anyone) from [99designs](https://99designs.de), picked a font that I -liked, combined the 2, and done was the brand. +Mainmatter – or simplabs before this day – is 7.5 years old now. It was founded in March 2015 and has since grown into a team of 20+ people across 11 countries. Over the years we have completed 30+ project with more than 20 different clients from small startups to big corporates. Engineers from our team have given countless talks at international conferences and we're even running some of our own events (check out our [events page](/events/)). + +Yet, we never had a professionally thought through and worked out brand in all these years. I had started using simplabs.com as my personal website ca. 15 years ago and when founding the company built a brand around that domain I already had. I got the blue ball logo (which reminds some of the Scottish flag, others of a cake diagram with missing labels but doesn't really **mean** anything to anyone) from [99designs](https://99designs.de), picked a font that I liked, combined the 2, and done was the brand. The very first version of the logo looked like this: @@ -39,99 +26,42 @@ and over time evolved into this: ## simplabs as in simplicity -The idea behind the name simplabs was that simplicity is key in software -projects, a realization that every engineer will have in some form or another -during their career. The _"labs"_ suffix didn't really mean much at all and I -picked it mostly because it was kind of fashionable at the time (like leaving -out vowels was a few years before – anyone remember -[twttr.com](http://twttr.com)?) There were always problems with the name -however, the main one being that a lot of people misunderstood the name as -"simple labs" which is the opposite of what I wanted to express – achieving -simplicity is very much not simple after all! Another problem was that while -simplicity is worth striving for, it's just a means to achieve other values but -not a value on its own. Simplicity in code makes it easier to build great -products, deliver business value and follow through on goals which is what's -actually relevant. Thus, overall our brand was never really aligned with what we -stand for and deliver to the teams we work with. +The idea behind the name simplabs was that simplicity is key in software projects, a realization that every engineer will have in some form or another during their career. The _"labs"_ suffix didn't really mean much at all and I picked it mostly because it was kind of fashionable at the time (like leaving out vowels was a few years before – anyone remember [twttr.com](http://twttr.com)?) There were always problems with the name however, the main one being that a lot of people misunderstood the name as "simple labs" which is the opposite of what I wanted to express – achieving simplicity is very much not simple after all! Another problem was that while simplicity is worth striving for, it's just a means to achieve other values but not a value on its own. Simplicity in code makes it easier to build great products, deliver business value and follow through on goals which is what's actually relevant. Thus, overall our brand was never really aligned with what we stand for and deliver to the teams we work with. ## What we stand for -The first thing we had to do to come up with a new brand that sent a clearer -message with better focus was to figure out what that message should be. Like -many other teams before us, we had to look at what we were already doing and -find out what the core of that was – what the main value proposition of our -services is. Also like many other teams before us, we did so by writing down an -elevator pitch: - -> We teach, cross-pollinate, and collaborate with our clients to develop digital -> products and practices they can build on. We don’t care for trends or theory -> if the results are impractical, so we strive for effective and pragmatic -> solutions for complex problems. +The first thing we had to do to come up with a new brand that sent a clearer message with better focus was to figure out what that message should be. Like many other teams before us, we had to look at what we were already doing and find out what the core of that was – what the main value proposition of our services is. Also like many other teams before us, we did so by writing down an elevator pitch: + +> We teach, cross-pollinate, and collaborate with our clients to develop digital products and practices they can build on. We don’t care for trends or theory if the results are impractical, so we strive for effective and pragmatic solutions for complex problems. > -> Through guidance and knowledge transfer, we take a long-term view, rather than -> chasing a short-term high, enabling our clients to shape the future of their -> digital products. the Mainmatter Team - -The core of our work has always been to build foundations that enable teams to -be successful and deliver value. Doing so we focus on results and real value -delivered as opposed to following trends or theories blindly (for example, in a -world that's crazy in love with React, we still see a lot of value in -[Ember.js](/ember-consulting/) for many use cases). While we deliver real -products and most of our team writes code most of the time, we also spend a lot -of time guiding and supporting others, enabling their long term success – even -beyond the time they work with us. Overall, what we strive for is long-term, -sustainable value as opposed to short-term highs. - -Our next step was to define some key brand personality traits that capture the -essence of the above. We ended up with: - -- **Wisdom**: We strive for mastery in what we do and will share what we know - with others to enable them get better as well. -- **Simplicity**: We turn complexity into simplicity to remain focused on what - matters instead of solving non-essential problems. -- **Engagement**: We care about what we do and the communities we are a part of - – whether that's a project team or an open source community. +> Through guidance and knowledge transfer, we take a long-term view, rather than chasing a short-term high, enabling our clients to shape the future of their digital products. the Mainmatter Team + +The core of our work has always been to build foundations that enable teams to be successful and deliver value. Doing so we focus on results and real value delivered as opposed to following trends or theories blindly (for example, in a world that's crazy in love with React, we still see a lot of value in [Ember.js](/ember-consulting/) for many use cases). While we deliver real products and most of our team writes code most of the time, we also spend a lot of time guiding and supporting others, enabling their long term success – even beyond the time they work with us. Overall, what we strive for is long-term, sustainable value as opposed to short-term highs. + +Our next step was to define some key brand personality traits that capture the essence of the above. We ended up with: + +- **Wisdom**: We strive for mastery in what we do and will share what we know with others to enable them get better as well. +- **Simplicity**: We turn complexity into simplicity to remain focused on what matters instead of solving non-essential problems. +- **Engagement**: We care about what we do and the communities we are a part of – whether that's a project team or an open source community. ## Mainmatter -All this eventually lead to the name "Mainmatter" we're releasing today. Our -main value proposition is supporting clients in having a stronger focus on -whatever is their main matter, the core of their business – whether that's +All this eventually lead to the name "Mainmatter" we're releasing today. Our main value proposition is supporting clients in having a stronger focus on whatever is their main matter, the core of their business – whether that's - by augmenting tech teams and helping them deliver results in time and quality -- by helping companies ship products while building the foundation to support - their future evolution and maintenance -- or by mentoring teams to be more efficient in the long terms (and beyond the - time they work with us) +- by helping companies ship products while building the foundation to support their future evolution and maintenance +- or by mentoring teams to be more efficient in the long terms (and beyond the time they work with us) -To go with the name we created a completely new visual identity. While that's -still relatively simple and on point overall, it's significantly bolder and more -vivid than what we had before: +To go with the name we created a completely new visual identity. While that's still relatively simple and on point overall, it's significantly bolder and more vivid than what we had before: ![The Mainmatter visual identity](/assets/images/posts/2022-09-18-simplabs-becomes-mainmatter/visual-identity.jpg#full) -If you're interested in more details around the Mainmatter brand, check out our -[brand styleguide](/assets/images/posts/2022-09-18-simplabs-becomes-mainmatter/Mainmatter-styleguide.pdf). +If you're interested in more details around the Mainmatter brand, check out our [brand styleguide](/assets/images/posts/2022-09-18-simplabs-becomes-mainmatter/Mainmatter-styleguide.pdf). ## What else does this mean? -It's important to us to be very clear that this rebranding does not have any -other implications – **we remain the same company and same team doing the same -work as before, just under a new name**. We're not taking funding, haven't sold -the company and aren't making any similar changes that would influence -Mainmatter's path forward. We remain committed to delivering great work for the -teams we work with as well as to our engagement in open source – be it as a -[sponsor of the Ember.js project](https://emberjs.com/sponsors/), a -[Silver member of the Rust Foundation](https://foundation.rust-lang.org/members/), -or a -[Founding Sponsor of the Erlang Ecosystem Foundation](https://erlef.org/sponsors). -Of course we will also continue running and supporting conferences and other -events like [EuroRust](http://eurorust.eu), [EmberFest](http://emberfest.eu), -and [Ember Europe](http://embereurope.org). +It's important to us to be very clear that this rebranding does not have any other implications – **we remain the same company and same team doing the same work as before, just under a new name**. We're not taking funding, haven't sold the company and aren't making any similar changes that would influence Mainmatter's path forward. We remain committed to delivering great work for the teams we work with as well as to our engagement in open source – be it as a [sponsor of the Ember.js project](https://emberjs.com/sponsors/), a [Silver member of the Rust Foundation](https://foundation.rust-lang.org/members/), or a [Founding Sponsor of the Erlang Ecosystem Foundation](https://erlef.org/sponsors). Of course we will also continue running and supporting conferences and other events like [EuroRust](http://eurorust.eu), [EmberFest](http://emberfest.eu), and [Ember Europe](http://embereurope.org). ## A bright future ahead -We are looking forward to a bright future as Mainmatter and are excited about -future projects and clients to come! If you want to be one of them, please don't -hesitate to [contact us](/contact) to talk about **how Mainmatter can help -you**. +We are looking forward to a bright future as Mainmatter and are excited about future projects and clients to come! If you want to be one of them, please don't hesitate to [contact us](/contact) to talk about **how Mainmatter can help you**. diff --git a/src/posts/2022-09-22-selfsigned-certificates-for-development.md b/src/posts/2022-09-22-selfsigned-certificates-for-development.md index adb68194ad..a21bb03fc8 100644 --- a/src/posts/2022-09-22-selfsigned-certificates-for-development.md +++ b/src/posts/2022-09-22-selfsigned-certificates-for-development.md @@ -14,54 +14,35 @@ image: "/assets/images/posts/2022-09-22-selfsigned-certificates-for-development/ imageAlt: "A grid of lockets representing a safe connection in your browser" --- -While working on a recent client project I had to test for secure cookies and to -do so needed to test on an HTTPS connection. +While working on a recent client project I had to test for secure cookies and to do so needed to test on an HTTPS connection. -Serving HTTPS locally is a function built into most web servers and frameworks, -but the tricky part is to get the necessary certificates. You can generate these -by hand, but there is a better way. +Serving HTTPS locally is a function built into most web servers and frameworks, but the tricky part is to get the necessary certificates. You can generate these by hand, but there is a better way. -Instead of getting your hands dirty with `openssl` and such, meet a little -helper called [mkcert][mkcert]. +Instead of getting your hands dirty with `openssl` and such, meet a little helper called [mkcert][mkcert]. [mkcert]: https://github.com/FiloSottile/mkcert/ -Not only does it streamline the process of creating self-signed certificates -that are great for development, but it also does away with the warning about -said certificates by automatically installing a locally-trusted root certificate -to your machine and integrating it with your browsers, giving you that nice -little green lock for confident client presentations. +Not only does it streamline the process of creating self-signed certificates that are great for development, but it also does away with the warning about said certificates by automatically installing a locally-trusted root certificate to your machine and integrating it with your browsers, giving you that nice little green lock for confident client presentations. -It's nice because it just works and even more so, it works on macOS, Linux, and -even Windows. Follow the instructions in the projects [README.md][readme] and -you're ready. +It's nice because it just works and even more so, it works on macOS, Linux, and even Windows. Follow the instructions in the projects [README.md][readme] and you're ready. ## Use `mkcert` with [ember-cli][ember-cli] -Since the project I was working on happens to be built with Ember.js, here is -how you use it together with its CLI. +Since the project I was working on happens to be built with Ember.js, here is how you use it together with its CLI. ### Step 1: Enable SSL in ember-cli -`ember serve` supports `--ssl`, `--ssl-key` and `--ssl-cert` to set all -necessary input through the command line, but I would recommend generating the -keys in the place it expects them to reduce clutter. +`ember serve` supports `--ssl`, `--ssl-key` and `--ssl-cert` to set all necessary input through the command line, but I would recommend generating the keys in the place it expects them to reduce clutter. -If you generate the necessary files in `./ssl` where ember-cli expects them by -default, you only need to add the `--ssl` flag. +If you generate the necessary files in `./ssl` where ember-cli expects them by default, you only need to add the `--ssl` flag. -If you want to serve your project with SSL all the time, you can even put -`"ssl": true` inside your `.ember-cli` configuration file, removing the need for -the flag. +If you want to serve your project with SSL all the time, you can even put `"ssl": true` inside your `.ember-cli` configuration file, removing the need for the flag. -Adding the `ssl-key` and `ssl-cert` paths there would work as well, but I think -the default location is fine, so we will continue with that. +Adding the `ssl-key` and `ssl-cert` paths there would work as well, but I think the default location is fine, so we will continue with that. ### Step 2: Generate all necessary files -We need to generate the `.crt` and `.key` files, as well as make sure that their -location will be created when cloning the repository whilst ensuring that the -actual files are never committed. +We need to generate the `.crt` and `.key` files, as well as make sure that their location will be created when cloning the repository whilst ensuring that the actual files are never committed. ```bash # ember-cli looks for key files in ./ssl relative to the project root @@ -74,11 +55,7 @@ touch ./ssl/.gitkeep echo -en '# Ignore self-signed certificates created by mkcert\n /ssl/server.crt\n/ssl/server.key\n' >> .gitignore ``` -Now you can run `mkcert` to create your certificate. Consider making this -command a run script by adding it to the `scripts` section in your -`package.json`, or creating a shell script file from it that can be added to -your repository. If you don't want to do either, you should consider documenting -it in your `README.md` at least. +Now you can run `mkcert` to create your certificate. Consider making this command a run script by adding it to the `scripts` section in your `package.json`, or creating a shell script file from it that can be added to your repository. If you don't want to do either, you should consider documenting it in your `README.md` at least. ```bash # Add additional hosts separated by spaces after localhost if necessary @@ -87,23 +64,15 @@ mkcert -install -cert-file ./ssl/server.crt -key-file ./ssl/server.key localhost ### Step 3: Profit -Your frontend application is served on `https://localhost:4200` now, allowing -all the things you would expect from a properly SSL encrypted server connection -and in turn, allowing you to replicate and debug real-world situations with -ease. +Your frontend application is served on `https://localhost:4200` now, allowing all the things you would expect from a properly SSL encrypted server connection and in turn, allowing you to replicate and debug real-world situations with ease. ## Use `mkcert` with [fastify][fastify] -When I need to create a quick API and don’t want to use [Rust with -Actix][actix], I often find myself reaching for fastify. It's a lot like the -Express.js used by ember-cli internally, but has a few nice extras and I -happened to have used it recently. +When I need to create a quick API and don’t want to use [Rust with Actix][actix], I often find myself reaching for fastify. It's a lot like the Express.js used by ember-cli internally, but has a few nice extras and I happened to have used it recently. -If you want to serve HTTP/2 over HTTPS for your fastify API, you will also need -certificates. +If you want to serve HTTP/2 over HTTPS for your fastify API, you will also need certificates. -[The documentation for this][fastify-https] is quite straightforward. The -example there expects `fastify.key` and `fastify.cert` in a `https` folder. +[The documentation for this][fastify-https] is quite straightforward. The example there expects `fastify.key` and `fastify.cert` in a `https` folder. Consider the following structure in your project: @@ -141,36 +110,23 @@ Generate the mentioned files like this: mkcert -install -cert-file ./https/fastify.cert -key-file ./https/fastify.key localhost ``` -You can now run `node ./src/main.js` and visit `https://localhost:3000` with SSL -encryption and your local browser will show a green checkmark as well! +You can now run `node ./src/main.js` and visit `https://localhost:3000` with SSL encryption and your local browser will show a green checkmark as well! ## Caveats -First, you must never share the `rootCA-key.pem` file created by `mkcert` with -anyone. It must not leave your computer as it would give an attacker power to -intercept any secure request to your machine. Handle with care. +First, you must never share the `rootCA-key.pem` file created by `mkcert` with anyone. It must not leave your computer as it would give an attacker power to intercept any secure request to your machine. Handle with care. -Second, the root certificate is what makes your browsers accept the self-signed -certificates created by `mkcert` as valid. That means, only _you_ alone get the -benefit of the green lock in _your_ browser. Sharing your development server -with someone else on your network or even trying to use them in a public -scenario would lead to browsers warning visitors about invalid certificates. +Second, the root certificate is what makes your browsers accept the self-signed certificates created by `mkcert` as valid. That means, only _you_ alone get the benefit of the green lock in _your_ browser. Sharing your development server with someone else on your network or even trying to use them in a public scenario would lead to browsers warning visitors about invalid certificates. -Do not use this in production. It's a neat thing that helps you get your job as -a developer done, but once you move to production, you should look for other -options. +Do not use this in production. It's a neat thing that helps you get your job as a developer done, but once you move to production, you should look for other options. One of those options would of course be [Let's Encrypt][letsencrypt]. -Yes, you could also use that locally, but from my experience, if you are looking -for a quick way to run a local development server with SSL, [mkcert][mkcert] -really works like a charm. +Yes, you could also use that locally, but from my experience, if you are looking for a quick way to run a local development server with SSL, [mkcert][mkcert] really works like a charm. [actix]: https://actix.rs/docs/http2/ [ember-cli]: https://cli.emberjs.com/ -[fastify-https]: - https://www.fastify.io/docs/latest/Reference/HTTP2/#secure-https +[fastify-https]: https://www.fastify.io/docs/latest/Reference/HTTP2/#secure-https [fastify]: https://www.fastify.io [letsencrypt]: https://letsencrypt.org -[readme]: - https://github.com/FiloSottile/mkcert/blob/master/README.md#installation +[readme]: https://github.com/FiloSottile/mkcert/blob/master/README.md#installation diff --git a/src/posts/2022-09-29-pnpm.md b/src/posts/2022-09-29-pnpm.md index c0c59ca47c..9126125cac 100644 --- a/src/posts/2022-09-29-pnpm.md +++ b/src/posts/2022-09-29-pnpm.md @@ -4,9 +4,7 @@ authorHandle: tobiasbieniek twitter: tobiasbieniek tags: javascript bio: "Senior Software Engineer" -description: - "Tobias Bieniek reveals his secret to saving many GB of disk space when - working with JavaScript projects." +description: "Tobias Bieniek reveals his secret to saving many GB of disk space when working with JavaScript projects." og: image: /assets/images/posts/2022-09-29-pnpm/og-image.jpg tagline: | @@ -21,42 +19,19 @@ tagline: | ## The status quo -Let's start by getting an understanding of why things are the way they are. -[Chesterton] would be proud… - -Back in the days when computers were first created there were no package -managers. There weren't even packages. Things were just being copied around and -nobody had heard of "versions" yet. - -At some point a few clever developers thought that it might be nice to share -reusable pieces of code across applications and thus "packages" were born. One -major downside of the early package infrastructure was that packages were shared -across the operating system. That means, if you have two applications and both -need a particular, but different, version of a package, you're essentially -screwed. - -Believe it or not, this is basically how everything in the Python and Ruby -worlds work. These days there are ways to work around this and have an -"environment" (with its packages) per project, but it is still quite hard to -have multiple versions of the same package within such an environment. - -When [npm] came around, they realized that this sort of thing wasn't very -scalable and set out to fix this issue. Their main idea: instead of putting -packages in some operating system folder the packages would be kept directly in -the folder of each project. But also, each of the packages could also have other -packages as dependencies within it. This is how the `node_modules` folder was -born. - -They formalized a rather simple [algorithm] to find the packages in the nearest -`node_modules` folder: if you call `require('chesterton')` in a file, then it -will look for a `node_modules` folder in the same folder as the file, and, if -found, it will look for a `chesterton` folder inside it. If neither exists, it -will look in the _parent_ folder of the file for a `node_modules/chesterton` -folder. And if that does not exist, it will look in the _parent parent_ folder, -and so on, and so on… - -The beauty of this algorithm is that it allows us to have complicated dependency -graphs: +Let's start by getting an understanding of why things are the way they are. [Chesterton] would be proud… + +Back in the days when computers were first created there were no package managers. There weren't even packages. Things were just being copied around and nobody had heard of "versions" yet. + +At some point a few clever developers thought that it might be nice to share reusable pieces of code across applications and thus "packages" were born. One major downside of the early package infrastructure was that packages were shared across the operating system. That means, if you have two applications and both need a particular, but different, version of a package, you're essentially screwed. + +Believe it or not, this is basically how everything in the Python and Ruby worlds work. These days there are ways to work around this and have an "environment" (with its packages) per project, but it is still quite hard to have multiple versions of the same package within such an environment. + +When [npm] came around, they realized that this sort of thing wasn't very scalable and set out to fix this issue. Their main idea: instead of putting packages in some operating system folder the packages would be kept directly in the folder of each project. But also, each of the packages could also have other packages as dependencies within it. This is how the `node_modules` folder was born. + +They formalized a rather simple [algorithm] to find the packages in the nearest `node_modules` folder: if you call `require('chesterton')` in a file, then it will look for a `node_modules` folder in the same folder as the file, and, if found, it will look for a `chesterton` folder inside it. If neither exists, it will look in the _parent_ folder of the file for a `node_modules/chesterton` folder. And if that does not exist, it will look in the _parent parent_ folder, and so on, and so on… + +The beauty of this algorithm is that it allows us to have complicated dependency graphs: ``` our-app @@ -65,113 +40,65 @@ our-app └─ one-dependency@0.4.2 ``` -Don't get me wrong, I'm not saying complicated dependency graphs are necessarily -a good thing, but in some cases they are hard to avoid. If necessary, I'd rather -have two versions of the same dependency in a project, than not be able to use -the dependency at all. +Don't get me wrong, I'm not saying complicated dependency graphs are necessarily a good thing, but in some cases they are hard to avoid. If necessary, I'd rather have two versions of the same dependency in a project, than not be able to use the dependency at all. -Anyway, that's how we got into this mess… Now let's see how we can get back out -of it! +Anyway, that's how we got into this mess… Now let's see how we can get back out of it! ## Plug and maybe Play… sometimes -For years, the way npm did things was the established practice and any attempts -of changing the status quo failed. With [yarn], a new package manager was born -that challenged a lot of things in the npm ecosystem… except for the -`node_modules` structure. 😢 +For years, the way npm did things was the established practice and any attempts of changing the status quo failed. With [yarn], a new package manager was born that challenged a lot of things in the npm ecosystem… except for the `node_modules` structure. 😢 -Well, that's not entirely correct. After years of development the yarn team -finally came up with what they called "Plug'n'Play mode" (or "PnP" for short). -This new mode promised us to share the dependencies across the whole machine -while still allowing us to have multiple versions of the same package installed. -😍 +Well, that's not entirely correct. After years of development the yarn team finally came up with what they called "Plug'n'Play mode" (or "PnP" for short). This new mode promised us to share the dependencies across the whole machine while still allowing us to have multiple versions of the same package installed. 😍 -Unfortunately, this new mode had one major downside: It monkey patched the -`require()` function in Node.js, because it needed to essentially override the -`node_modules` lookup algorithm. 😫 +Unfortunately, this new mode had one major downside: It monkey patched the `require()` function in Node.js, because it needed to essentially override the `node_modules` lookup algorithm. 😫 -While this worked well in small, controlled environments, it eventually became -clear that this was not a good long-term solution. There are still plenty of -tools in the npm ecosystem that don't support this mode well, or even at all. +While this worked well in small, controlled environments, it eventually became clear that this was not a good long-term solution. There are still plenty of tools in the npm ecosystem that don't support this mode well, or even at all. We need a different solution! ## The shiny future -Remember the title of the blog post? One character to rule them all, one -character to find them, … No, wait that was something different. +Remember the title of the blog post? One character to rule them all, one character to find them, … No, wait that was something different. Ah, right, "one character saved 50 GB of disk space". That one character is… P. -It is the (first) P in [pnpm]. The simple solution: use `pnpm install` instead -of `npm install`. Done! +It is the (first) P in [pnpm]. The simple solution: use `pnpm install` instead of `npm install`. Done! -If you're wondering "why P?", well, the P stands for -[**performance**](https://pnpm.io/faq#what-does-pnpm-stand-for). +If you're wondering "why P?", well, the P stands for [**performance**](https://pnpm.io/faq#what-does-pnpm-stand-for). -But let me explain… `pnpm` managed to fulfil the promise that `yarn` made with -its PnP mode, but without having to monkey patch anything. Instead, it is using -[hard links] in a clever way, allowing the regular `node_modules` algorithm to -work as intended, but still only having a single copy of each package version on -the disk. +But let me explain… `pnpm` managed to fulfil the promise that `yarn` made with its PnP mode, but without having to monkey patch anything. Instead, it is using [hard links] in a clever way, allowing the regular `node_modules` algorithm to work as intended, but still only having a single copy of each package version on the disk. Fun fact: Did you notice how "PnP mode" starts with the letters `pnpm`? 😄 -Twitter user `xiaokedada` has created a nice -[overview image](https://twitter.com/xiaokedada/status/1471691763102679041) on -how pnpm creates its folder structure: +Twitter user `xiaokedada` has created a nice [overview image](https://twitter.com/xiaokedada/status/1471691763102679041) on how pnpm creates its folder structure: ![Overview of pnpm folder structure](/assets/images/posts/2022-09-29-pnpm/pnpm-folder-structure.jpeg) -This might seem complicated at first, but it is relatively straight forward. On -the right hand side, we have the global pnpm store, that contains all the -packages and package versions that pnpm has downloaded to your machine. Each -package version only exists exactly once in this store, and the `node_modules` -folder in your projects are linking to this global store (dark red lines). +This might seem complicated at first, but it is relatively straight forward. On the right hand side, we have the global pnpm store, that contains all the packages and package versions that pnpm has downloaded to your machine. Each package version only exists exactly once in this store, and the `node_modules` folder in your projects are linking to this global store (dark red lines). -In the `node_modules` folder of our project we have a `bar` folder which points -to the `bar` dependency of our project. However, there is also a hidden `.pnpm` -folder which contains the real magic. Inside this folder are folders for every -single package/version combination that is being used in your project. +In the `node_modules` folder of our project we have a `bar` folder which points to the `bar` dependency of our project. However, there is also a hidden `.pnpm` folder which contains the real magic. Inside this folder are folders for every single package/version combination that is being used in your project. -This includes our own dependency `bar` in the `bar@1.0.0` folder, but inside -this `node_module/.pnpm/bar@1.0.0` folder is not the dependency itself, but -instead just another `node_modules` folder, with another `bar` folder inside of -it, linking to the global pnpm store. +This includes our own dependency `bar` in the `bar@1.0.0` folder, but inside this `node_module/.pnpm/bar@1.0.0` folder is not the dependency itself, but instead just another `node_modules` folder, with another `bar` folder inside of it, linking to the global pnpm store. Whoa… that's complicated! -But there is a reason for this complicated folder layout. From the perspective -of the `bar` package we will need access to the `foo` dependency, and we will -need to access the correct version of it. That's why the -`node_modules/.pnpm/bar@1.0.0/node_modules/foo` folder is just a link to the -`node_modules/.pnpm/foo@1.0.0/node_modules/foo` folder, which itself links to -the global pnpm store again. +But there is a reason for this complicated folder layout. From the perspective of the `bar` package we will need access to the `foo` dependency, and we will need to access the correct version of it. That's why the `node_modules/.pnpm/bar@1.0.0/node_modules/foo` folder is just a link to the `node_modules/.pnpm/foo@1.0.0/node_modules/foo` folder, which itself links to the global pnpm store again. -**tl;dr** the complicated folder layout ensures that every package has access to -its dependencies in the right version, but not anything else. +**tl;dr** the complicated folder layout ensures that every package has access to its dependencies in the right version, but not anything else. ## Conclusion -While pnpm has been around for quite a while, it has lately started to gain more -momentum, with quite a few high profile projects migrating to it. +While pnpm has been around for quite a while, it has lately started to gain more momentum, with quite a few high profile projects migrating to it. -At Mainmatter we have started to convert a few of our own projects to it, and -let me tell you that the 50 GB of saved disk space are not a joke. Some of us -had dozens of individual Ember.js apps and addons installed, all using a roughly -similar dependency tree. When you get to reduce all of these duplicated -dependencies to just one copy per machine it quickly adds up. +At Mainmatter we have started to convert a few of our own projects to it, and let me tell you that the 50 GB of saved disk space are not a joke. Some of us had dozens of individual Ember.js apps and addons installed, all using a roughly similar dependency tree. When you get to reduce all of these duplicated dependencies to just one copy per machine it quickly adds up. -While pnpm is certainly not without its issues either, it currently appears to -be the least bad solution in the JavaScript ecosystem. We encourage you to try -it out and message us if you hit any issues. +While pnpm is certainly not without its issues either, it currently appears to be the least bad solution in the JavaScript ecosystem. We encourage you to try it out and message us if you hit any issues. Finally, a huge **thank you** to the lead pnpm maintainer, [Zoltan Kochan]! [chesterton]: https://en.wikipedia.org/wiki/G._K._Chesterton#Chesterton's_fence [npm]: https://www.npmjs.com/package/npm -[algorithm]: - https://nodejs.org/api/modules.html#loading-from-node_modules-folders +[algorithm]: https://nodejs.org/api/modules.html#loading-from-node_modules-folders [yarn]: https://yarnpkg.com [pnpm]: https://pnpm.io [hard links]: https://en.wikipedia.org/wiki/Hard_link diff --git a/src/posts/2022-10-12-making-a-strategic-bet-on-rust.md b/src/posts/2022-10-12-making-a-strategic-bet-on-rust.md index 8ed3fa8620..e3a92ca6c3 100644 --- a/src/posts/2022-10-12-making-a-strategic-bet-on-rust.md +++ b/src/posts/2022-10-12-making-a-strategic-bet-on-rust.md @@ -3,9 +3,7 @@ title: "Making a strategic bet on Rust" authorHandle: marcoow tags: rust bio: "Marco Otte-Witte" -description: - "Mainmatter is making a strategic bet on Rust to become the leading - consultancy to help teams adopt Rust for web projects." +description: "Mainmatter is making a strategic bet on Rust to become the leading consultancy to help teams adopt Rust for web projects." og: image: /assets/images/posts/2022-10-12-making-a-strategic-bet-on-rust/og-image.jpg tagline: | @@ -20,111 +18,41 @@ image: "/assets/images/posts/2022-10-12-making-a-strategic-bet-on-rust/mainmatte imageAlt: "Mainmatter loves Rust" --- -Rust makes a level of efficiency and performance accessible to a wider audience -of engineering teams that was previously out of reach. While C and C++ have -allowed building highly efficient systems for decades, they come with so many -footguns that only extremely skilled and experienced teams can dare to build -anything substantial with them – and -[even those end up with systems that have plenty of problems](https://www.memorysafety.org/about/). -Now, with Rust, everyone can build systems with the same level of efficiency and -performance without having to worry about most of said footguns. Building on -Rust, systems will not only be just as fast as an equivalent system written in C -but also more stable and robust. In addition to ensuring memory safety, Rust's -rich type system and concepts like the `Option` and `Result` types further -increase confidence by encouraging solid error handling through concepts built -into the language itself. - -Yet, Rust enables all that without sacrificing expressiveness of the language, -productivity, and developer experience. Modern language concepts like pattern -matching and generics, the integrated -[package manager](https://doc.rust-lang.org/cargo/) and solid development tools, -all make working with Rust a breeze. +Rust makes a level of efficiency and performance accessible to a wider audience of engineering teams that was previously out of reach. While C and C++ have allowed building highly efficient systems for decades, they come with so many footguns that only extremely skilled and experienced teams can dare to build anything substantial with them – and [even those end up with systems that have plenty of problems](https://www.memorysafety.org/about/). Now, with Rust, everyone can build systems with the same level of efficiency and performance without having to worry about most of said footguns. Building on Rust, systems will not only be just as fast as an equivalent system written in C but also more stable and robust. In addition to ensuring memory safety, Rust's rich type system and concepts like the `Option` and `Result` types further increase confidence by encouraging solid error handling through concepts built into the language itself. + +Yet, Rust enables all that without sacrificing expressiveness of the language, productivity, and developer experience. Modern language concepts like pattern matching and generics, the integrated [package manager](https://doc.rust-lang.org/cargo/) and solid development tools, all make working with Rust a breeze. ## Rust on the Web -So where do we see Rust fitting in for web projects? Around 12 years after the -language's creation, the ecosystem is still relatively young, yet mature enough -for a variety of use cases already: - -- **Native extensions** written in Rust (via FFI/NIF mechanisms) can be used to - speed up parts of existing systems written in Ruby, Elixir, Node, and many - other languages, by orders of magnitude and provide an easy onramp to - introducing Rust into a team's tech stack. -- **Isolated subsystems** of larger server systems with very specific - requirements in terms of performance and robustness are great candidates to - build in Rust – whether those are individual services in a microservices - architecture or layers in multi-layered systems. -- Similar to subsystems, **downstream systems** for e.g. data processing and - similar tasks with relatively limited scope but hard requirements regarding - efficiency will often benefit hugely from being implemented in Rust. - -While all these are relatively isolated use cases with limited scope, we believe -that **eventually Rust will be a reasonable choice for building complete API -servers** as well although as of yet that problem space still requires some -exploration to develop and establish best practices and architectures. We're -excited to bring in our years-long experience building web apps of all kinds and -be a part of this exploration – for the benefit of the clients we work with as -well as the ecosystem overall. Establishing these patterns and building -consensus across the community will eventually drive adoption of Rust on the web -even further as it makes Rust more accessible for more teams. - -And of course there's also WASM – while that sees quite some adoption outside of -the browser (e.g. via the -[WebAssembly Micro Runtime](https://github.com/bytecodealliance/wasm-micro-runtime)) -recently, it was originally built to enable an entirely new category of apps to -run in browsers. Except for some high visibility examples -([Figma](https://www.figma.com/) likely being the most well known), it remains -slightly unclear how the average team would leverage WASM and what real world -use cases are. Yet, we're excited to explore this space more and support the -teams we work with experimenting what potential WASM can have for them. +So where do we see Rust fitting in for web projects? Around 12 years after the language's creation, the ecosystem is still relatively young, yet mature enough for a variety of use cases already: + +- **Native extensions** written in Rust (via FFI/NIF mechanisms) can be used to speed up parts of existing systems written in Ruby, Elixir, Node, and many other languages, by orders of magnitude and provide an easy onramp to introducing Rust into a team's tech stack. +- **Isolated subsystems** of larger server systems with very specific requirements in terms of performance and robustness are great candidates to build in Rust – whether those are individual services in a microservices architecture or layers in multi-layered systems. +- Similar to subsystems, **downstream systems** for e.g. data processing and similar tasks with relatively limited scope but hard requirements regarding efficiency will often benefit hugely from being implemented in Rust. + +While all these are relatively isolated use cases with limited scope, we believe that **eventually Rust will be a reasonable choice for building complete API servers** as well although as of yet that problem space still requires some exploration to develop and establish best practices and architectures. We're excited to bring in our years-long experience building web apps of all kinds and be a part of this exploration – for the benefit of the clients we work with as well as the ecosystem overall. Establishing these patterns and building consensus across the community will eventually drive adoption of Rust on the web even further as it makes Rust more accessible for more teams. + +And of course there's also WASM – while that sees quite some adoption outside of the browser (e.g. via the [WebAssembly Micro Runtime](https://github.com/bytecodealliance/wasm-micro-runtime)) recently, it was originally built to enable an entirely new category of apps to run in browsers. Except for some high visibility examples ([Figma](https://www.figma.com/) likely being the most well known), it remains slightly unclear how the average team would leverage WASM and what real world use cases are. Yet, we're excited to explore this space more and support the teams we work with experimenting what potential WASM can have for them. ![Mainmatter + Rust = 🚀🔥🚀](/assets/images/posts/2022-10-12-making-a-strategic-bet-on-rust/mainmatter-rust-rocket.png) ## Rust is a competitive advantage -Rust gives teams access to a level of efficiency, performance, and robustness -that's far beyond that of most other technologies commonly used for web apps. -Web apps written in Rust will have **better response times while requiring fewer -resources** which saves money and energy (Shane Miller and Carl Lerche gave a -[talk about how using Rust helps minimizing the environmental impact](https://www.youtube.com/watch?v=yQZaBtUjQ1w) -of the systems we all build every day at AWS re:Invent 2021). - -At the same time, **teams working with Rust can have more confidence in their -code** because of Rust's rich type system and modern language concepts that -eliminate entire classes of errors. That does not only make code more stable at -runtime and less likely to run into unforeseen errors in production, but also -makes it easier to make changes to systems and maintain them over time compared -to dynamically typed languages (going back to strongly typed languages appears -to be a general trend in the industry, most prominently to be observed by the -huge success that TypeScript had over the past few years). - -Finally, building systems in Rust is a competitive advantage in an industry that -continues to fight for the best talents like no other. As mentioned above, Rust -has been -[voted the most loved language](https://survey.stackoverflow.co/2022/#section-most-loved-dreaded-and-wanted-programming-scripting-and-markup-languages) -seven years in a row and literally *every engineer in the world*™ is eager to -work with it. Companies that can hire for Rust (and are willing to up-level -people that are new to the language), will have no problems finding people for -years to come. +Rust gives teams access to a level of efficiency, performance, and robustness that's far beyond that of most other technologies commonly used for web apps. Web apps written in Rust will have **better response times while requiring fewer resources** which saves money and energy (Shane Miller and Carl Lerche gave a [talk about how using Rust helps minimizing the environmental impact](https://www.youtube.com/watch?v=yQZaBtUjQ1w) of the systems we all build every day at AWS re:Invent 2021). + +At the same time, **teams working with Rust can have more confidence in their code** because of Rust's rich type system and modern language concepts that eliminate entire classes of errors. That does not only make code more stable at runtime and less likely to run into unforeseen errors in production, but also makes it easier to make changes to systems and maintain them over time compared to dynamically typed languages (going back to strongly typed languages appears to be a general trend in the industry, most prominently to be observed by the huge success that TypeScript had over the past few years). + +Finally, building systems in Rust is a competitive advantage in an industry that continues to fight for the best talents like no other. As mentioned above, Rust has been [voted the most loved language](https://survey.stackoverflow.co/2022/#section-most-loved-dreaded-and-wanted-programming-scripting-and-markup-languages) seven years in a row and literally *every engineer in the world*™ is eager to work with it. Companies that can hire for Rust (and are willing to up-level people that are new to the language), will have no problems finding people for years to come. ## Mainmatter ❤️ Rust -We believe betting on Rust will benefit the teams we work with and enable a -bright future for Mainmatter at the same time. We're looking forward to -helping our clients adopt Rust for their web projects through -[Team reinforcement](/services/team-reinforcement/) +We believe betting on Rust will benefit the teams we work with and enable a bright future for Mainmatter at the same time. We're looking forward to helping our clients adopt Rust for their web projects through [Team reinforcement](/services/team-reinforcement/) We've invested in Rust quite significantly already by -- joining the Rust Foundation as a - [Silver member](https://foundation.rust-lang.org/members/) -- having several people on the team help maintain [crates.io](https://crates.io) - on company time for several years now +- joining the Rust Foundation as a [Silver member](https://foundation.rust-lang.org/members/) +- having several people on the team help maintain [crates.io](https://crates.io) on company time for several years now - running Rust workshops to help teams get started with the language -- creating [EuroRust](https://eurorust.eu), the conference for the European Rust - community +- creating [EuroRust](https://eurorust.eu), the conference for the European Rust community -We're looking forward to continue these investments, extending our involvement -with Rust even more over the next years and helping teams find their path -towards Rust. If you're **interested in Rust and want to adopt it in your -organization**, [reach out](/contact/)! +We're looking forward to continue these investments, extending our involvement with Rust even more over the next years and helping teams find their path towards Rust. If you're **interested in Rust and want to adopt it in your organization**, [reach out](/contact/)! diff --git a/src/posts/2022-12-09-sending-emails-from-the-edge-with-rust.md b/src/posts/2022-12-09-sending-emails-from-the-edge-with-rust.md index a65a036e3e..13021e37db 100644 --- a/src/posts/2022-12-09-sending-emails-from-the-edge-with-rust.md +++ b/src/posts/2022-12-09-sending-emails-from-the-edge-with-rust.md @@ -3,9 +3,7 @@ title: "Sending Emails from the Edge with Rust" authorHandle: marcoow tags: rust bio: "Marco Otte-Witte" -description: - "Marco Otte-Witte explains how to send emails via the Sendgrid API from a WASM - edge function written in Rust." +description: "Marco Otte-Witte explains how to send emails via the Sendgrid API from a WASM edge function written in Rust." og: image: /assets/images/posts/2022-12-09-sending-emails-from-the-edge-with-rust/og-image.jpg tagline: | @@ -15,11 +13,7 @@ image: "/assets/images/posts/2022-12-09-sending-emails-from-the-edge-with-rust/r imageAlt: "A pattern of the Rust logo, a letter icon and a server icon" --- -If you want to send emails, you'll typically use a third party service for that. -There are many options that all have their pros and cons – we chose -[Sendgrid](http://sendgrid.com). Whatever service you end up choosing, they'll -provide some kind of HTTP API for sending emails. In the case of Sendgrid that -looks roughly like this: +If you want to send emails, you'll typically use a third party service for that. There are many options that all have their pros and cons – we chose [Sendgrid](http://sendgrid.com). Whatever service you end up choosing, they'll provide some kind of HTTP API for sending emails. In the case of Sendgrid that looks roughly like this: ```bash curl --request POST \ @@ -29,19 +23,9 @@ curl --request POST \ --data '{"personalizations":[{"to":[{"email":"john.doe@example.com"}],"subject":"Hello, World!"}],"content": [{"type": "text/plain", "value": "Heya!"}],"from":{"email":"sam.smith@example.com"}}' ``` -You send a `POST` request to `https://api.sendgrid.com/v3/mail/send` with a JSON -body that contains the recipient's and sender's email addresses, the subject and -the actual message. The API key that Sendgrid provides and uses to ensure the -request comes from a subscribed user – and which one – is sent as a bearer token -in the `Authorization` header. That key is also the only real reason why we -can't just call the Sendgrid API directly from the browser – if we included the -key in the website's source, we'd be making it publicly available and everyone -could use it to send emails via our Sendgrid account. So we need to keep the -code that calls the Sendgrid API on a server (the edge function we're writing) -and then call that from the browser. +You send a `POST` request to `https://api.sendgrid.com/v3/mail/send` with a JSON body that contains the recipient's and sender's email addresses, the subject and the actual message. The API key that Sendgrid provides and uses to ensure the request comes from a subscribed user – and which one – is sent as a bearer token in the `Authorization` header. That key is also the only real reason why we can't just call the Sendgrid API directly from the browser – if we included the key in the website's source, we'd be making it publicly available and everyone could use it to send emails via our Sendgrid account. So we need to keep the code that calls the Sendgrid API on a server (the edge function we're writing) and then call that from the browser. -The JavaScript code that handles submission of our contact form (the `
    `'s -`submit` event) in the browser looks roughly like this: +The JavaScript code that handles submission of our contact form (the ``'s `submit` event) in the browser looks roughly like this: ```js fetch("https://contact.mainmatter.dev/send", { @@ -53,33 +37,17 @@ fetch("https://contact.mainmatter.dev/send", { }); ``` -We're making a POST request to our edge function with the data the user put in -the contact form's fields sent as JSON in the request body. So in essence, the -edge function acts as a proxy – it translates requests that users' browsers make -to the edge function into requests from the edge function to the Sendgrid API. +We're making a POST request to our edge function with the data the user put in the contact form's fields sent as JSON in the request body. So in essence, the edge function acts as a proxy – it translates requests that users' browsers make to the edge function into requests from the edge function to the Sendgrid API. ## Cloudflare Workers -As mentioned above, there are quite a few providers to pick from when you want -to run WASM on the edge these days – among others, -[Vercel](https://vercel.com/docs/concepts/functions/edge-functions/wasm), -[Netlify](https://docs.netlify.com/edge-functions/overview/), -[Fastly](https://developer.fastly.com/learning/compute/), and -[Cloudflare](https://developers.cloudflare.com/workers/tutorials/hello-world-rust/) -all have offerings. For our mailer, we chose Cloudflare – their CLI tool -[Wrangler](https://github.com/cloudflare/wrangler2) makes it easy to develop and -deploy your code and hides all of the JavaScript wrapper code that's necessary -to run WASM in V8. - -Wrangler can be used to create a new project and will set up the necessary -structure and build configuration. Cloudflare also wrote the -[`worker` crate](https://crates.io/crates/worker) which provides some handy APIs -that make writing your worker in Rust easier. +As mentioned above, there are quite a few providers to pick from when you want to run WASM on the edge these days – among others, [Vercel](https://vercel.com/docs/concepts/functions/edge-functions/wasm), [Netlify](https://docs.netlify.com/edge-functions/overview/), [Fastly](https://developer.fastly.com/learning/compute/), and [Cloudflare](https://developers.cloudflare.com/workers/tutorials/hello-world-rust/) all have offerings. For our mailer, we chose Cloudflare – their CLI tool [Wrangler](https://github.com/cloudflare/wrangler2) makes it easy to develop and deploy your code and hides all of the JavaScript wrapper code that's necessary to run WASM in V8. + +Wrangler can be used to create a new project and will set up the necessary structure and build configuration. Cloudflare also wrote the [`worker` crate](https://crates.io/crates/worker) which provides some handy APIs that make writing your worker in Rust easier. ## Implementing the Mailer -_The complete code of our website mailer is -[available on GitHub](https://github.com/mainmatter/mainmatter-website-mailer)._ +_The complete code of our website mailer is [available on GitHub](https://github.com/mainmatter/mainmatter-website-mailer)._ The basic structure for our mailer worker looks like this: @@ -101,17 +69,9 @@ pub async fn main(req: Request, env: Env, _ctx: worker::Context) -> WorkerResult } ``` -We're importing the structs and attributes we need from the `worker` crate and -define a `main` function that responds to `fetch` events (i.e. incoming -requests). Inside of that function, we use the `Router` provided by the `worker` -package to handle requests based on the path and method – in this case we're -only interested in `POST` requests to the `/send` path. +We're importing the structs and attributes we need from the `worker` crate and define a `main` function that responds to `fetch` events (i.e. incoming requests). Inside of that function, we use the `Router` provided by the `worker` package to handle requests based on the path and method – in this case we're only interested in `POST` requests to the `/send` path. -Since we'll get the message details like the sender's name, email address and -the message text in the request body as JSON, we need to convert that JSON -string into something we can work with. We can use the -[`serde` crate](https://crates.io/crates/serde) to deserialize the string into a -struct: +Since we'll get the message details like the sender's name, email address and the message text in the request body as JSON, we need to convert that JSON string into something we can work with. We can use the [`serde` crate](https://crates.io/crates/serde) to deserialize the string into a struct: ```rust use serde::Deserialize; @@ -142,9 +102,7 @@ pub async fn main(req: Request, env: Env, _ctx: worker::Context) -> WorkerResult } ``` -If deserializing the request body into a `Payload` fails, we simply respond with -status 422. Otherwise we can go on to send the message. Let's look at how that -works: +If deserializing the request body into a `Payload` fails, we simply respond with status 422. Otherwise we can go on to send the message. Let's look at how that works: ```rust use reqwest::Client; @@ -216,35 +174,15 @@ pub async fn send_message(payload: Payload, api_key: &str) -> WorkerResult Result ``` -And when we serve the app we are greeted by the friendly face of Tomster but it -doesn’t do much yet. +And when we serve the app we are greeted by the friendly face of Tomster but it doesn’t do much yet. ![Screenshot of the state of the app after 'orientation'](/assets/images/posts/2023-01-24-sveltekit-super-rentals/end-of-orientation.png) -Before we get into adding pages and components, I wanted a point out a couple of -small “quality of life” adaptations to make the workflow easier going forward. +Before we get into adding pages and components, I wanted a point out a couple of small “quality of life” adaptations to make the workflow easier going forward. -I updated the playwright config to use a fixed port so that if we are running -the app (either through `npm run dev` or `npm run test`) we know which port we -will be on; I then updated the vite config to reflect that same port. +I updated the playwright config to use a fixed port so that if we are running the app (either through `npm run dev` or `npm run test`) we know which port we will be on; I then updated the vite config to reflect that same port. ```js // playwright.config.js @@ -240,9 +201,7 @@ const config = { export default config; ``` -I also added the global styles sheet to the `app.html` so that the styles are -automatically applied to all pages and components, and I can use the global -classes from wherever needed. +I also added the global styles sheet to the `app.html` so that the styles are automatically applied to all pages and components, and I can use the global classes from wherever needed. ```html @@ -268,29 +227,15 @@ classes from wherever needed. --- -Please do not try to send messages to the email on the contact page, I randomly -assigned the email address so your email won’t be seen by anyone and will most -likely just bounce back to you. +Please do not try to send messages to the email on the contact page, I randomly assigned the email address so your email won’t be seen by anyone and will most likely just bounce back to you. --- -When it comes to creating routes, there isn’t the same extensive CLI that Ember -has, so instead we need to manually add the routes that we want in a folder -structure. So for this example we will be creating `+page.svelte`, -`about/+page.svelte` & `getting-in-touch/+page.svelte` inside the `routes` -folder. Although this isn’t a big pain, it would be nice to have something -similar to the `ember generate route` command that comes with Ember-CLI. I did -notice the -[VS Code plugin](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode) -offers a way to generate SvelteKit files, though I didn’t find this all that -useful. +When it comes to creating routes, there isn’t the same extensive CLI that Ember has, so instead we need to manually add the routes that we want in a folder structure. So for this example we will be creating `+page.svelte`, `about/+page.svelte` & `getting-in-touch/+page.svelte` inside the `routes` folder. Although this isn’t a big pain, it would be nice to have something similar to the `ember generate route` command that comes with Ember-CLI. I did notice the [VS Code plugin](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode) offers a way to generate SvelteKit files, though I didn’t find this all that useful. ![Screenshot of the sveltekit plugin for VS Code](/assets/images/posts/2023-01-24-sveltekit-super-rentals/sveltekit-plugin-vs-code.png) -In SvelteKit we are missing the ability to create a route and give it a -different name, so we need to be thoughtful about what we want the name of the -route to be when creating it, as it is a very manual process to adapt a route -name after it’s created. +In SvelteKit we are missing the ability to create a route and give it a different name, so we need to be thoughtful about what we want the name of the route to be when creating it, as it is a very manual process to adapt a route name after it’s created. ```html @@ -335,18 +280,7 @@ name after it’s created.
    ``` -SvelteKit has an interesting naming convention for routes; we can still have -nested routes and dynamic routes, but now that they have embraced the folder -based routing system, it means that each route has its own `+page.svelte` file; -so instead of having `index` and `about` route files, we have folders - -`+page.svelte` and `about/+page.svelte`. This has been discussed quite -thoroughly [here](https://github.com/sveltejs/kit/discussions/5748) and while -some people weren’t too happy with the decision to move so far from a standard -web routing structure, it does allow us to store server-side logic in the -conveniently named `+page.server.js` file (note: this is only run on the -server), as well as the `+page.js` file which is run both on the client during -browser navigation, and on the server during SSR. So you end up with a file -structure like this: +SvelteKit has an interesting naming convention for routes; we can still have nested routes and dynamic routes, but now that they have embraced the folder based routing system, it means that each route has its own `+page.svelte` file; so instead of having `index` and `about` route files, we have folders - `+page.svelte` and `about/+page.svelte`. This has been discussed quite thoroughly [here](https://github.com/sveltejs/kit/discussions/5748) and while some people weren’t too happy with the decision to move so far from a standard web routing structure, it does allow us to store server-side logic in the conveniently named `+page.server.js` file (note: this is only run on the server), as well as the `+page.js` file which is run both on the client during browser navigation, and on the server during SSR. So you end up with a file structure like this: ```bash routes/ @@ -360,19 +294,15 @@ Which can get a little annoying when you end up with tabs like this in your IDE: ![screenshot of pages in VS Code](/assets/images/posts/2023-01-24-sveltekit-super-rentals/pages-in-vs-code.png) -But hopefully the trade-off is worth it in exchange for the more concise file -structure +But hopefully the trade-off is worth it in exchange for the more concise file structure ### Automated testing: [Repo](https://github.com/mainmatter/sveltekit-super-rentals/tree/1.3-automated-testing) -[Playwright](https://playwright.dev/docs/intro) was added automatically when we -created our SvelteKit app and they seem to work great together. +[Playwright](https://playwright.dev/docs/intro) was added automatically when we created our SvelteKit app and they seem to work great together. -There is already a single test for Playwright that was created when we set up -the app called `tests/test.js`; we will replace the content of this soon, but -for now let’s see what happens when we run this test: +There is already a single test for Playwright that was created when we set up the app called `tests/test.js`; we will replace the content of this soon, but for now let’s see what happens when we run this test: ```bash svelte-super-rentals % npm run test @@ -416,10 +346,7 @@ Running 1 test using 1 worker tests/test.ts:2:1 › about page has expected h1 ================================================= ``` -As we would expect, this test is failing (after a while) because we are -expecting to find an `h1` on the page with the text “About this app”, which we -no longer have since we replaced the default content of the file with the HTML -for the Super Rentals app. +As we would expect, this test is failing (after a while) because we are expecting to find an `h1` on the page with the text “About this app”, which we no longer have since we replaced the default content of the file with the HTML for the Super Rentals app. Now let’s update the test so that is passes. @@ -523,37 +450,27 @@ Running 3 tests using 1 worker 3 passed (4s) ``` -Playwright also gives us the ability to pause our tests by adding this line into -our tests when we want to pause. +Playwright also gives us the ability to pause our tests by adding this line into our tests when we want to pause. ```js await page.pause(); ``` -To resume the tests, open up the devTools console in the browser and run this -command: +To resume the tests, open up the devTools console in the browser and run this command: ```js playwright.resume(); ``` -Otherwise you can use the -[Playwright inspector](https://playwright.dev/docs/inspector) to open a browser -along with a more in-depth console that will give you the ability to step -through your tests and see more detail about the current state of the DOM and -test. +Otherwise you can use the [Playwright inspector](https://playwright.dev/docs/inspector) to open a browser along with a more in-depth console that will give you the ability to step through your tests and see more detail about the current state of the DOM and test. --- -This confused me at first as Playwright will stop at each `await` so you will -need to manually step through the test until you find the part that you want to -stop it. It is quite intuitive once you realise it might not have paused where -you expected to begin with. +This confused me at first as Playwright will stop at each `await` so you will need to manually step through the test until you find the part that you want to stop it. It is quite intuitive once you realise it might not have paused where you expected to begin with. --- -To open the inspector when running the tests, be sure to specify the `PWDEBUG=1` -flag when running the tests: +To open the inspector when running the tests, be sure to specify the `PWDEBUG=1` flag when running the tests: ```bash PWDEBUG=1 npm run test @@ -563,10 +480,7 @@ PWDEBUG=1 npm run test [Repo](https://github.com/mainmatter/sveltekit-super-rentals/tree/1.4-component-basics) -Similar to the routes, there is no command to generate components for us, so we -will create the `src/components` folder along with the -`src/components/jumbo.svelte` and `src/components/nav-bar.svelte` component -files +Similar to the routes, there is no command to generate components for us, so we will create the `src/components` folder along with the `src/components/jumbo.svelte` and `src/components/nav-bar.svelte` component files ```html @@ -577,8 +491,7 @@ files
    ``` -The `` here is similar to the `{{yield}}` in Ember, it allows us to use -this component as a wrapper for more HTML to be passed in from the parent. +The `` here is similar to the `{{yield}}` in Ember, it allows us to use this component as a wrapper for more HTML to be passed in from the parent. ```html @@ -594,9 +507,7 @@ this component as a wrapper for more HTML to be passed in from the parent. ``` -I then added the alias to the svelte config to make importing files easier - -this means instead of having a mess of `../../../..` in the module imports, we -can use `@components` when importing a component into another file +I then added the alias to the svelte config to make importing files easier - this means instead of having a mess of `../../../..` in the module imports, we can use `@components` when importing a component into another file ```js // svelte.config.js @@ -669,31 +580,11 @@ Then we will update our usage of these components in our routes ``` -As you can see, another difference between SvelteKit and Ember is that Ember has -chosen to separate the template from the component logic, whereas Svelte has -opted for the single file approach (although this will be added to Ember soon: -the -[RFC](https://github.com/emberjs/rfcs/blob/master/text/0779-first-class-component-templates.md#sfcs) -has already been approved and merged and we are just waiting for it to be -released now). - -In terms of component usage, both Ember and Svelte have a similar approach but -slightly differing syntax. Both have opted for more native-looking HTML - Ember -using HBS, while Svelte has opted to extend native HTML and allow us to write -pure JavaScript in the template. Coming from Ember I found this aspect of Svelte -to be quite easy to get to grips with, though the naming of component attributes -can get a little confusing as there is no `@` syntax that Ember uses, so instead -of `@image` you would have `image`. I’ll discuss this more in the next section -“More about components”. - -Another big difference between the two is that components are always available -in Ember and you can simply invoke them in the template, whereas in SvelteKit -you need to import the component in the script tag before you can use it in the -template. I like the simplicity of Ember’s approach, but it does mean you can -end up with quite long component names if your app has a lot of component -nesting - i.e. `` - whereas -you likely don’t have this problem in Svelte because you can simply change the -name of the component when you import it - i.e. +As you can see, another difference between SvelteKit and Ember is that Ember has chosen to separate the template from the component logic, whereas Svelte has opted for the single file approach (although this will be added to Ember soon: the [RFC](https://github.com/emberjs/rfcs/blob/master/text/0779-first-class-component-templates.md#sfcs) has already been approved and merged and we are just waiting for it to be released now). + +In terms of component usage, both Ember and Svelte have a similar approach but slightly differing syntax. Both have opted for more native-looking HTML - Ember using HBS, while Svelte has opted to extend native HTML and allow us to write pure JavaScript in the template. Coming from Ember I found this aspect of Svelte to be quite easy to get to grips with, though the naming of component attributes can get a little confusing as there is no `@` syntax that Ember uses, so instead of `@image` you would have `image`. I’ll discuss this more in the next section “More about components”. + +Another big difference between the two is that components are always available in Ember and you can simply invoke them in the template, whereas in SvelteKit you need to import the component in the script tag before you can use it in the template. I like the simplicity of Ember’s approach, but it does mean you can end up with quite long component names if your app has a lot of component nesting - i.e. `` - whereas you likely don’t have this problem in Svelte because you can simply change the name of the component when you import it - i.e. ```html + + + searchTask.perform(event.target.value) + } +/> + +{#if $searchTask.isRunning} + Loading... +{:else if $searchTask.lastSuccessful} + Value: {$searchTask.lastSuccessful.value} +{/if} +{% endraw %} +``` + +And immediately you have a debounced task that informs the user when the results are loading. To try it for yourself, head over to [https://sheepdog.run/](https://sheepdog.run/) and check out the interactive example. + +### Easily get derived state for your tasks + +When a user is interacting with your app, it’s vital that they understand what is currently happening, whether they are waiting for something to load or waiting for a response from an input. Using a Sheepdog task gives you several derived properties out of the box so you can hook it into your UI with ease. Properties like `isRunning` can be used to show the current state of the task, while properties like `lastCanceled`, `lastSuccessful` and `lastErrored` help to give a concise view of exactly what has been returned from previous executions of your task. + +You can read more about Tasks [here](https://sheepdog.run/getting-started/usage/). + +### Different tasks for different needs + +With the default task, you unlock the simplicity I mentioned above, but Sheepdog exposes several task types for all different use-cases. Whether you want to debounce your input using a [Restart task](https://sheepdog.run/reference/restart/) or make sure your polling is always up-to-date with a [KeepLatest task](https://sheepdog.run/reference/keep-latest/); Sheepdog has you covered. + +You can read about the 5 different types of task [here](https://sheepdog.run/explainers/task-modifiers/). + +### Mid-run cancellation + +One of the biggest issues with Promises is that they require a lot of boilerplate to have any kind of mid-run cancellation. With Sheepdog, you immediately get that out of the box (when using the [Async Transform](https://sheepdog.run/explainers/async-transform/), without the Async Transform you will need to use generator functions). + +For instance, imagine you have a task that makes multiple API calls based on the return value of each previous API call. Then imagine for some reason you want to cancel that task after it’s started, with standard Promises you would have to set and check a bunch of values between each API call to have some semblance of cancellation. And even then, you can’t be sure which API calls have been initiated. With Sheepdog, we do all the heavy lifting for you, so if you cancel a task mid-run, then it’s cancelled - as soon as the current API call is completed, the task will stop executing. + +You can read more about Mid-run cancellation [here](https://sheepdog.run/explainers/mid-run-cancellation/). + +### No need to clean up after yourself + +Sheepdog automatically binds the task to the component it was created in, meaning that it will automatically be cancelled if the component it was instantiated in is unmounted. No more pending code executing after their place in the DOM has been unmounted. + +### Bind tasks together + +Sometimes you want one task to be entirely dependant on another, meaning that the child task is cancelled when the parent task is cancelled. Using the [Link function](https://sheepdog.run/explainers/linking-tasks/), binding tasks together is as easy as counting sheep. + +```js +// Child.svelte + +``` + +As you can see, we are receiving a task as a prop and then binding the new task to it. This means that if the child or parent component is unmount, both tasks will be cancelled. If they were not linked and the Child component was unmounted after `childTask` was triggered, `parentTask` would still run to completion. + +### Write what you know + +Under the hood, Sheepdog will turn all of your tasks into a generator function but with the [Async Transform](https://sheepdog.run/explainers/async-transform/), you can keep your async functions and Sheepdog will convert it to a generator function at build time, meaning you don’t have to know how generator functions work to benefit from them. But don't worry, we only ever touch the code that is wrapped in a `task` that is imported from `@sheepdog/svelte`. + +So if you wrote the following code: + +```js + +``` + +The output of the Async Transform would be: + +```js + +``` + +As you can see, the Async Transform has only touched the single property that was wrapped in the imported `task`, and even then, we touch your code the minimum amount possible to give you all the benefits of Sheepdog. + +You can read more about the Async Transform [here](https://sheepdog.run/explainers/async-transform/). + +## Branching out + +At the moment, we have created this package to work with Svelte, but we have plans to make the core of the package framework-agnostic. If you’re interested in helping maintain the package or fancy porting it to your favourite framework, please reach out! diff --git a/src/posts/2024-12-02-trash-in-treasure-out.md b/src/posts/2024-12-02-trash-in-treasure-out.md new file mode 100644 index 0000000000..8082241526 --- /dev/null +++ b/src/posts/2024-12-02-trash-in-treasure-out.md @@ -0,0 +1,585 @@ +--- +title: "Trash in, treasure out" +authorHandle: hdoordt +tags: ["rust"] +bio: "Henk Oordt, Senior Software Engineering Consultant" +description: "Making your API clear and robust with Rust's type system" +og: + image: "/assets/images/posts/2024-12-02-trash-in-treasure-out/og-image.png" +tagline: | +

    + Using Rust, you can encode a large part of the constraints and semantics of your API using the type system. In this article, we'll discuss how to do it, and how you can use it to your benefit. +

    +--- + +## Intro + +By now, you're probably aware that at Mainmatter, we like Rust a lot. If you aren't: [have a look at our Rust page](https://mainmatter.com/rust-consulting/). In this blog post, I'd like to highlight one of my favorite traits of Rust (yes pun intended): its focus on _correctness_. Rust has a very expressive type system that lets you offload many checks to the compiler: it supports generics, data-carrying enums, closures, visibility specifiers, _explicit_ conversions, and much more. These are neat features that make performant, low-level programming feel as ergonomic as high-level languages. Sure, Rust has a learning curve, and that learning curve is a result of Rust's tendency to make complexity really _in your face_. + +Make no mistake, every piece of software is complex: it has to run on computers, which, especially nowadays are complex beasts. And writing software with highly optimized languages with manual memory management like C, C++, or Rust requires knowledge of all kinds of subtleties. Rust makes these subtleties _explicit_, forcing you to fix all kinds of things you may never have thought of before even compiling your code. + +But that's not all: as projects grow and age and more people work on the same piece of software, communication becomes very important. And by communication I mean ensuring the original writer of some piece of code, the code reviewer, the user of the code's API, the colleague refactoring the codebase, and new developers are on the same page about the _intent_ and _invariants_ of that code. What is this code doing? How am I supposed to use it correctly? What happens if I mess up? How do I protect this API from input it might choke on? Because 'Garbage in, garbage out' is not a great philosophy when setting up critical and robust systems. Traditionally, one would write in documentation and code comments the answers to these and many other questions. Writing documentation is a very valuable job, but sadly, developers are human. And humans make mistakes. And if the humans think they _themselves_ don't make mistakes, they will surely agree that their colleagues _do_. + +Documentation written in human language needs to be clear, specific, and up-to- date. And even if it's written well, for it to do its job, documentation needs to be _read_ in the first place. And even if it _is_ read, it needs to be interpreted and acted upon correctly. I don't know about you, but I'm way too pedantic to see that go flawlessly. + +Now, this is why I like Rust's expressive type system: it lets me encode a great deal of the semantics I'd otherwise have to describe in the documentation. You can craft your APIs and types such that using your library or module becomes very hard or even impossible. You can encode the _intent_ and _invariants_ regarding your code using the type system. This way you get the Rust compiler on _your_ side. It will be able to pick up subtle errors caused by your API users holding it wrong. And it will do so _at compile time_, greatly shortening the feedback loop. It makes adding features, refactoring, and reviewing much less error-prone. And it's great for security as well. It's where coding meets art, really. + +In this article, I'd like to give three main pieces of advice: + +1. Encode the semantics/states of your application in the type system and your API. +2. Ensure input gets parsed into rigid structs before acceptance. +3. Ensure output gets encoded in the correct format and doesn’t leak (sensitive) information. + +## Ticket to heaven + +We'll need a case to show how all this works, and since Mainmatter [loves the travel industry](/travel/), let's write up an API for booking train tickets. + +Looking at different train ticket services, in general, the steps towards booking are pretty similar: first, you enter the location you want to depart from and where you want to go, then you enter either your preferred moment of departure or when you want to arrive. Next, you select one of several suggested trips and enter your personal information. With all the information complete, you're all set to book the ticket and pay. Here's what that looks like as a flowchart: + +
    + +![State diagam](/assets/images/posts/2024-12-02-trash-in-treasure-out/state-diagram.svg) + +
    + +Pretty straightforward, right? Let's code one up. + +## Setting up + +Let's set up a simple [`axum`]-based server to implement before flow. I'm only going to post the code relevant to the story here, but if you're interested in the whole shebang: check out the code for [step 0]. Here's what the app setup looks like: + +```rust +// src/lib.rs + +pub async fn run() -> Result<()> { + // Setup router + let router = axum::Router::new() + .route("/origin", post(set_origin)) + .route("/destination", post(set_destination)) + .route("/departure", post(set_departure)) + .route("/arrival", post(set_arrival)) + .route("/trips", get(list_trips)) + .route("/trip", post(set_trip)) + .route("/class", post(set_class)) + .route("/name", post(set_name)) + .route("/email", post(set_email)) + .route("/phone_number", post(set_phone_number)) + .route("/book_trip", post(book_trip)); + + // Create in-memory session store + let session_store: SessionNullSessionStore = SessionStore::new(None, SessionConfig::default()) + .await + .unwrap(); + + // Stitch them together + let app = router + .layer(SessionLayer::new(session_store)) + .into_make_service(); + + // Aand serve! + let listener = TcpListener::bind("0.0.0.0:3000").await?; + axum::serve(listener, app).await?; + + Ok(()) +} +``` + +As you can see, we've got routes for each step, as well as a basic in-memory session store. For now, the handlers are pretty similar. Here's `set_origin`: + +```rust +// src/lib.rs + +async fn set_origin(session: Session, origin: String) -> Result> { + Ok(session.get_or_init_state(|s| { + s.origin = Some(origin); + })) + .map(Json) +} +``` + +If you're not familiar with [`axum`]: this handler extracts the session out of the session layer, and gives us the request body as a `String`. `Session::get_or_init_state` fetches the current state from the session store, and updates it with the closure passed to it. If there's no session yet, it creates a default one, that it passes to the closure. + +So what's this `TicketMachine` in the route handler example? Well, it's the representation of the state of the booking flow. Here's the definition: + +```rust +// src/ticket_machine.rs + +#[derive(Debug, Default, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +pub struct TicketMachine { + pub origin: Option, + pub destination: Option, + pub departure: Option, + pub arrival: Option, + pub trip: Option, + pub class: Option, + pub name: Option, + pub email: Option, + pub phone_number: Option, + pub payment_info: Option, +} +``` + +Pretty much a bunch of optional strings. Does it work, though? Well, let's also create a little integration test: + +```rust +// tests/main.rs + +#[tokio::test] +async fn test_set_origin() { + let body: TicketMachine = send_post_request(&http_client(), "/origin", "Amsterdam").await; + assert_eq!( + body, + TicketMachine { + origin: Some("Amsterdam".to_owned()), + ..Default::default() + } + ) +} +``` + +Nothing too surprising. `http_client` sets up a [`reqwest`] HTTP client, and the `send_post_request` helper function sends a POST request to our server, given the path (`"/origin"`) and the body (`"Amsterdam"`). Now, let's give it a spin. In one terminal window, we start the server, and we'll run the tests in a separate terminal window: + +```bash +// start server +$ cargo run +[..] +``` + +I'm using [`cargo-nextest`] because it gives me pretty and concise reports. + +```bash +// Run tests +$ cargo nextest run + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.06s +------------ + Nextest run ID 2b617168-9190-4619-ba1d-27a3e6cdc815 with nextest profile: default + Starting 1 test across 3 binaries + PASS [ 0.016s] takeoff::main test_set_origin +------------ + Summary [ 0.017s] 1 test run: 1 passed, 0 skipped +``` + +> 1 test run: 1 passed + +I like that! + +## Looking back + +Our route handler doesn't do a lot. It will accept any `String` for a body, meaning that as far as our app is concerned `"🚂-🛒-🛒-🛒"` is totally a valid origin. It's nice that given a string [must be valid UTF-8][String], at least our handler won't accept random byte sequences, but we can do better. For the curious among you: the following code is in the [step 1] commit. Let's add some validation: + +```rust +// src/lib.rs + +pub fn is_valid_location(location: &str) -> bool { + const VALID_LOCATIONS: &[&str] = &[ + "Amsterdam Centraal", + "Paris Nord", + "Berlin Hbf", + "London Waterloo", + ]; + + VALID_LOCATIONS.contains(&location) +} + +// ✂️ + +async fn set_origin(session: Session, origin: String) -> Result> { + if !is_valid_location(&origin) { + return Err(Error::BadRequest("Invalid origin!")); + } + + Ok(session.get_or_init_state(|s| { + s.origin = Some(origin); + })) + .map(Json) +} +``` + +And test some more: + +```bash +$ cargo nextest run +Finished `test` profile [unoptimized + debuginfo] target(s) in 0.06s +------------ +Nextest run ID 3437f17c-6fed-4b9b-8fad-27b324e45602 with nextest profile: default +Starting 1 test across 3 binaries + FAIL [ 0.014s] takeoff::main test_set_origin + +--- STDOUT: takeoff::main test_set_origin --- + + + +--- STDERR: takeoff::main test_set_origin --- +thread 'test_set_origin' panicked at tests/main.rs:34:9: +Received error response (reqwest::Error { kind: Status(400), url: "http://localhost:3000/origin" }): 'Bad Request: Invalid origin!' +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + +Cancelling due to test failure +------------ + Summary [ 0.015s] 1 test run: 0 passed, 1 failed, 0 skipped + FAIL [ 0.014s] takeoff::main test_set_origin +error: test run failed +``` + +Yay! It fails! Surprise: turns out there's no station called "Amsterdam". We should update the test again: + +```rust +// tests/main.rs + +#[test_case(b"Amsterdam" => panics ""; "Non-existent station")] +#[test_case("🚂-🛒-🛒-🛒".as_bytes() => panics ""; "Emojional roller coaster")] +#[test_case(&[0xE0, 0x80, 0x80] => panics "" ; "Non-UTF-8 sequence")] +#[test_case(b"Amsterdam Centraal"; "Valid station")] +#[tokio::test] +async fn test_set_bad_origin(origin: &'static [u8]) { + let body: TicketMachine = send_post_request("/origin", origin).await; + assert_eq!( + body, + TicketMachine { + origin: Some(String::from_utf8(origin.to_vec()).unwrap()), + ..Default::default() + } + ) +} +``` + +And those, believe me, totally pass! Now what? + +## Even better validation + +We can do better still. Here's the thing: for our server to validate locations _everywhere_, we'd need to add loads of calls to `is_valid_location`. What happens if I forget, though? This is where Rust's expressive type system comes in. With Rust, you can create types that are valid _by construction_. The mere fact that such an instance of such type exists, proves that it is valid. And this is truly an amazing power. How do you do it? Well, by using the [newtype] pattern: + +```rust +// src/types/location.rs + +pub struct Location(String); +``` + +The code for this section can be found in the repo state as of the [step 2] commit. + +Now, wrapping a struct in and of itself is not too useful. But we already did something very important: give the type a good name, adding semantics! Now, of course, you'd add some doc comments describing the type some more, but already it's clear what this type is meant to represent. There's no way to instantiate it from outside the `types::location` module, though. On the one hand, that's great: right now there's no way to instantiate an invalid `Location`. However, it'd be a huge improvement if we could create _valid_ `Location`s. So let's add some methods and trait implementations: + +```rust +// src/types/location.rs + +#[derive(Debug, Clone, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +#[serde(try_from = "String")] +pub struct Location(String); + +impl Location { + pub fn is_valid_location(location: &str) -> bool { + const VALID_LOCATIONS: &[&str] = &[ + "Amsterdam Centraal", + "Paris Nord", + "Berlin Hbf", + "London Waterloo", + ]; + + VALID_LOCATIONS.contains(&location) + } +} + +impl TryFrom for Location { + type Error = ParseLocationError; + + fn try_from(s: String) -> Result { + if !Self::is_valid_location(&s) { + return Err(ParseLocationError(s)); + } + Ok(Self(s)) + } +} + +#[derive(Debug, thiserror::Error)] +#[error("Error parsing location: {0}")] +pub struct ParseLocationError(String); +``` + +Much better! Using the `#[serde(try_from = "String")]` attribute, we've instructed `serde` to call the `Location::try_from` implementation upon deserialization. Now, the _only_ way to instantiate a `Location` is through it's `TryFrom` implementation, which does the validation. Barring any unsafe magic tricks, that is. Getting the value _out_ is a matter of adding more functionality, which I won't bore you with right now. But you can imagine adding an implementation for `std::fmt::Display`, or a method `fn as_str(&self) -> &str`. Don't go implement `std::ops::Deref` though, that'd [defeat the purpose][deref_polymorphism]. + +With that set up, let's update our model, as well as the relevant method handlers. Here's our freshly updated `TicketMachine`, which got moved to the `crate::types::ticket_machine` module: + +```rust +// src/types/ticket_machine.rs +use crate::types::location::Location; + +#[derive(Debug, Default, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +pub struct TicketMachine { + pub origin: Option, + pub destination: Option, + // ✂️ ..other fields +} +``` + +Here's `set_origin`: + +```rust +// src/lib.rs + +async fn set_origin(session: Session, Json(origin): Json) -> Result> { + Ok(session.get_or_init_state(|s| { + s.origin = Some(origin); + })) + .map(Json) +} +``` + +As you can see, instead of taking a `String` body, this time we're taking a `Json`. Axum will attempt to deserialize the request body into a `Location`, and the `Json<_>` extractor tells it that it should use `serde_json` to do so. And as `serde_json` is going to use the `serde::Deserialize` implementation we derived on `Location` before, `Location::try_from` gets run even the _before_ code within the route handler is run. So within the route handler, we're _certain_ that the `origin` parameter represents a valid `Location`! + +Now, of course, our test is just sending plain, unquoted strings, and unquoted strings are not valid JSON. So let's update our test: + +```rust +// tests/main.rs + +fn json_string_bytes(s: &str) -> Cow<'static, [u8]> { + serde_json::to_vec(s).unwrap().into() +} + +#[test_case(json_string_bytes("Amsterdam") => panics ""; "Non-existent station")] +#[test_case(json_string_bytes("🚂-🛒-🛒-🛒") => panics ""; "Emojional roller coaster")] +#[test_case([0xE0, 0x80, 0x80].as_slice().into() => panics "" ; "Non-UTF-8 sequence")] +#[test_case(b"Amsterdam Centraal".into() => panics ""; "Invalid JSON")] +#[test_case(json_string_bytes("Amsterdam Centraal"); "Valid station")] +#[tokio::test] +async fn test_set_bad_origin(origin: Cow<'static, [u8]>) { + let origin = origin.to_vec(); + let body: TicketMachine = send_post_request("/origin", origin.clone()).await; + + let origin: String = serde_json::from_slice(&origin).expect( + "The request should have failed at this point as `origin` was not valid JSON anyway", + ); + let origin: Location = origin.try_into().unwrap(); + + assert_eq!( + body, + TicketMachine { + origin: Some(origin), + ..Default::default() + } + ) +} +``` + +We're now sending JSON! The signature changed a bit: instead of a `&'static [u8]`, it now takes a `Cow<'static, [u8]>`, which helps with our JSON serialization stuff, but let's not focus on that. Instead, I'm gonna distract you with the test results: + +```bash +$ cargo nextest run + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.10s +------------ + Nextest run ID a7be105d-a24b-44e9-baba-c5a560608792 with nextest profile: default + Starting 5 tests across 3 binaries + PASS [ 0.045s] takeoff::main test_set_bad_origin::valid_station + PASS [ 0.046s] takeoff::main test_set_bad_origin::non_existent_station + PASS [ 0.046s] takeoff::main test_set_bad_origin::non_utf_8_sequence + PASS [ 0.046s] takeoff::main test_set_bad_origin::invalid_json + PASS [ 0.046s] takeoff::main test_set_bad_origin::emojional_roller_coaster +------------ + Summary [ 0.047s] 5 tests run: 5 passed, 0 skipped +``` + +There we go! With that set up, we have the following guarantees within the `set_origin` method handler regarding the request body: + +- It's valid UTF-8; +- It's valid JSON; +- It represents a valid `Location`, as defined in its `TryFrom` implementation. + +And it's all checked by Rust's type system! We might as well throw out the cases that pass in non-UTF-8 sequences or invalid JSON: the only really sensible part to test is the implementation of `TryFrom`. But let's keep them anyway because tests are great to have when doing big code refactors. + +## Output sanitization + +So far, Rust's type system has been working for us very well to give us guarantees about input. How about output though? Using the [`newtype`] pattern from the previous section again, we can ensure sensitive data gets hidden in responses and logs. Furthermore, we can make the output encoding format part of our type zoo. Let me remind you what our `TicketOffice` model looks like so far: + +```rust +// src/types/ticket_machine.rs + +#[derive(Debug, Default, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +pub struct TicketMachine { + pub origin: Option, + pub destination: Option, + pub departure: Option, + pub arrival: Option, + pub trip: Option, + pub class: Option, + pub name: Option, + pub email: Option, + pub phone_number: Option, + pub payment_info: Option, +} +``` + +The first thing you'll notice is that we aren't doing any input validation for the fields other than `origin` and `destination`. But other than that, our struct holds some sensitive personal data: `name`, `email`, `phone_number`, and `payment_info`. Let's focus on that last field, `payment_info`, though. We haven't specified yet what `payment_info` _is_, but let's assume for now that it may contain credit card details. Now, credit card details are things you don't want ending up in your logs or API responses. Using the [`newtype`] pattern, we can make it _hard_ to leak such data into the logs. The following examples can be found in the repo state as of the [step 3] commit. Let's conjure up a `PaymentInfo` type: + +```rust +// src/types/payment_info.rs + +#[derive(Clone, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +#[serde(into = "String")] +pub struct PaymentInfo(String); + +impl std::fmt::Display for PaymentInfo { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "") + } +} + +impl std::fmt::Debug for PaymentInfo { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_tuple(stringify!(PaymentInfo)) + .field(&"") + .finish() + } +} + +impl From for String { + fn from(p: PaymentInfo) -> Self { + p.to_string() + } +} +``` + +This time, we've ensured the ways to convert `PaymentInfo` to a `String` are watertight. Using the `#[serde(into = "String")]` attribute on the struct definition, we've ensured that Serde uses the `Into` implementation on `PaymentInfo` to serialize the struct, which gets forwarded to its `Display` implementation. And that implementation hides our secrets. Nice! Accidentally logging payment info is covered as well by the custom implementation of `Debug`. Obviously, `PaymentInfo` requires input validation, too, but let's keep focus on the output right now. + +Let's update our `TicketMachine` and the `book_trip` route handler: + +```rust +// src/types/ticket_machine.rs + +#[derive(Debug, Default, PartialEq, Eq, serde::Deserialize, serde::Serialize)] +pub struct TicketMachine { + // ✂️ ..other fields + pub payment_info: Option, +} + +// src/lib.rs + +async fn book_trip( + session: Session, + Json(payment_info): Json, +) -> Result> { + session + .update_state(|s| { + s.payment_info = Some(payment_info); + println!("🚂 Trip booked! Choo choo!"); + }) + .ok_or(Error::BadRequest("Set phone_number first")) + .map(Json) +} +``` + +Great. We were already wrapping our output in a `Json`, ensuring the data gets encoded in the right format before sending it out. Now we'll add some tests to validate that this works: + +```rust +// tests/main.rs + +#[tokio::test] +async fn test_hiding_payment_details() { + let client = http_client(); + let origin = json!("Amsterdam Centraal"); + // Set up the session + let _: TicketMachine = + send_post_request(&client, "/origin", serde_json::to_vec(&origin).unwrap()).await; + + // Totally not _my_ credit card + let payment_info = json!({ + "card_number": "1234 5678 9012 3456", + "cvc": "123", + "exp": "12/34", + }) + .to_string(); + // Deserialize into a Value, so that we can skip any input validation on + // the test side. + let state: serde_json::Value = send_post_request( + &client, + "/book_trip", + serde_json::to_vec(dbg!(&payment_info)).unwrap(), + ) + .await; + + assert_eq!(state["payment_info"], ""); +} + +// src/types/payment_info.rs + +#[tokio::test] +async fn test_payment_details_debug_impl() { + use crate::types::ticket_machine::TicketMachine; + use std::fmt::Write; + + let ticket_machine = TicketMachine { + origin: None, + destination: None, + departure: None, + arrival: None, + trip: None, + class: None, + name: None, + email: None, + phone_number: None, + payment_info: Some("💰💰💰".to_owned().try_into().unwrap()), + }; + let mut dbg_output = String::new(); + write!(&mut dbg_output, "{ticket_machine:?}").unwrap(); + + assert_eq!( + dbg_output, + r#"TicketMachine { origin: None, destination: None, departure: None, arrival: None, trip: None, class: None, name: None, email: None, phone_number: None, payment_info: Some(PaymentInfo("")) }"# + ) +} +``` + +And test: + +```bash +$ cargo nextest run + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.38s +------------ + Nextest run ID 1ba4afd2-c85c-4817-8f6d-5d66090fb3a1 with nextest profile: default + Starting 7 tests across 3 binaries + PASS [ 0.015s] takeoff types::payment_info::test_payment_details_debug_impl + PASS [ 0.051s] takeoff::main test_set_bad_origin::valid_station + PASS [ 0.051s] takeoff::main test_set_bad_origin::invalid_json + PASS [ 0.051s] takeoff::main test_set_bad_origin::non_existent_station + PASS [ 0.051s] takeoff::main test_set_bad_origin::emojional_roller_coaster + PASS [ 0.051s] takeoff::main test_set_bad_origin::non_utf_8_sequence + PASS [ 0.052s] takeoff::main test_hiding_payment_details +------------ + Summary [ 0.052s] 7 tests run: 7 passed, 0 skipped +``` + +There you go! With that, we've ensured that once our `PaymentInfo` is instantiated, it'll be quite hard to accidentally leak its contents. Completely hiding the payment info from everything would make it rather unuseful, but at least we can't accidentally log them or send them in a response, preventing a very likely cause of leaking information. + +## Wrapping up + +We've reached a lot already! We've created meaningful types for handling the data in our model, ensured they're valid by construction, and that they don't leak sensitive information. With that, our API has become much more robust than the version we started out with. Let's summarize what we've achieved with that. + +In the [introduction](#trash-in-treasure-out), I listed three pieces of advice: + +> 1. Encode the semantics/states of your application in the type system and your API. +> 2. Ensure input gets parsed into rigid structs before acceptance. +> 3. Ensure output gets encoded in the correct format and doesn’t leak (sensitive) information. + +In [step 2](#even-better-validation), we've covered the first two points. We started out creating an explicit `Location` type, with a name that clearly indicates what it conveys. We've skipped adding documentation on that type, but if we hadn't, it could describe the semantics and invariants of `Location` some more. That documentation would be easily findable anywhere `Location` is used. + +Furthermore, we ensured `Location`s are valid by construction: by implementing the validation in the `TryFrom` implementation for `Location`, and ensuring the `Location` can only be created and deserialized via that validation, we've ensured that a `Location` _always_ represents a valid location, _as long as our validation logic is correct_. And by accepting `Json` in our Axum request handlers directly, those handlers don't need to do any further validation. + +In [step 3](#output-sanitization), we've ensured the `PaymentDetails` can't leak sensitive information in logs or responses by implementing `Debug` and `Display` such that they don't actually use the wrapped `String`, and ensured the `From` implementation for `String` uses our `Display` implementation. We can add dedicated methods to get the data out in case we need to store the payment details in our database, for instance. With that, _accidentally_ leaking such info has become much harder. + +Are there any downsides? As always: yes, this is no silver bullet. One thing you probably have noticed so far is that the patterns described in this post introduce a bunch of boilerplate. There are crates (e.g. [`nutype`]) out there that aim to reduce this, but they come with their own trade-offs. Furthermore, sometimes not all invariants can be expressed in Rust code. In such cases, one still has to rely on documentation to be thorough and correct. + +Other than that, rigidity may not always be what you want. Sometimes your invariants and requirements are not all that clear, and are very subject to change. In such cases, it's not great to update loads of boilerplate all the time. This, I think, is a bit of a matter of taste: I myself like to force myself to clarify the requirements and invariants before implementation, and with the validation being implemented in a single place, updating that is not such a big hassle. And what you get back is huge: correct, robust, clear, and maintainable code! + +_In [step 4], I've updated the rest of the method handlers, and demonstrate the [`validator`] and [`nutype`] crates briefly. Be sure to have a look!_ + +[step 0]: https://github.com/mainmatter/trash-in-treasure-out/tree/abaa132a4250c71846ddf9a4540129af9952c9e8 +[step 1]: https://github.com/mainmatter/trash-in-treasure-out/tree/5c03b284bc0b1c932ec1c09b6abfef13f5cdfa4e +[step 2]: https://github.com/mainmatter/trash-in-treasure-out/tree/305b8088b5155aeb13a473ca398fd1d522405b7d +[step 3]: https://github.com/mainmatter/trash-in-treasure-out/tree/1dc8400afff4a31bcc1586e577a4af39124b8dfa +[step 4]: https://github.com/mainmatter/trash-in-treasure-out/tree/305b8088b5155aeb13a473ca398fd1d522405b7d +[`axum`]: https://crates.io/crates/axum/ +[`reqwest`]: https://crates.io/crates/reqwest/ +[`cargo-nextest`]: https://nexte.st/ +[String]: https://doc.rust-lang.org/stable/std/string/struct.String.html +[newtype]: https://rust-unofficial.github.io/patterns/patterns/behavioural/newtype.html?highlight=newtype#newtype +[deref_polymorphism]: https://rust-unofficial.github.io/patterns/anti_patterns/deref.html +[`nutype`]: https://crates.io/crates/nutype/ +[`validator`]: https://crates.io/crates/validator/ diff --git a/src/ruby-rails-consulting.njk b/src/ruby-rails-consulting.njk index 2e8cccba59..945f7ce5e1 100644 --- a/src/ruby-rails-consulting.njk +++ b/src/ruby-rails-consulting.njk @@ -1,10 +1,10 @@ --- layout: base -title: We're veteran Ruby and Ruby on Rails consultants +title: "Team Up With Us for Ruby on Rails! | Ruby on Rails consulting" description: Mainmatter works with teams that build on Ruby and Ruby on Rails. We help pushing through bottlenecks, provide a fresh perspective, and modernize tech stacks. permalink: /ruby-rails-consulting/ og: - image: /assets/images/ruby/lp-ruby-consulting-og-image.jpg + image: /assets/images/ruby/og-image.png --- {% from "image-banner-with-text.njk" import imageBannerWithText %} @@ -22,7 +22,7 @@ og: {% set 'content' = { "eyebrow": "Our Expertise: Ruby and Ruby on Rails", - "title": "We're veteran Ruby and Ruby on Rails experts", + "title": "Team Up With Us for Ruby on Rails!", "text": "The Mainmatter team has been an active part of the Ruby and Rails communities since the early days – from the first 'whoops' to the latest release.", "image": "/assets/images/hero/ruby.jpg", "alt": "A couple of diamonds", @@ -158,8 +158,8 @@ og: {{ caseCards('', '', '', clients) }} {% set 'content' = { - "title": "Grow your business with us", - "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", + "title": "Team up with us for Ruby on Rails!", + "text": "Our seasoned Ruby and Ruby on Rails experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" } diff --git a/src/rust-application-telemetry-workshop.njk b/src/rust-application-telemetry-workshop.njk index 6938f48829..e74099b41f 100644 --- a/src/rust-application-telemetry-workshop.njk +++ b/src/rust-application-telemetry-workshop.njk @@ -86,7 +86,7 @@ og: {{ ctaBanner('aqua', 'default', content) }} {% set 'content' = { - "title": "Grow your business with us", + "title": "Team up with us to go further!", "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" diff --git a/src/rust-consulting.njk b/src/rust-consulting.njk index a0ef8a04e1..8dc080c033 100644 --- a/src/rust-consulting.njk +++ b/src/rust-consulting.njk @@ -1,10 +1,10 @@ --- layout: base -title: Enable your team to leverage Rust +title: "Team Up With Us for Rust! | Rust consulting" description: Mainmatter enables teams to adopt Rust in their web projects and increase performance, efficiency, and maintainability. permalink: /rust-consulting/ og: - image: /assets/images/rust/lp-rust-consulting-og-image.jpg + image: /assets/images/rust/og-image.png --- {% from "image-banner-with-text.njk" import imageBannerWithText %} @@ -21,8 +21,8 @@ og: {% set 'content' = { "eyebrow": "Our Expertise: Rust", - "title": "Rust is a competitive advantage", - "text": "Rust checks all the boxes – performance, efficiency, maintainability, and great developer experience. Mainmatter is here to empower your team to fully realize those benefits in your web and backend projects.", + "title": "Team Up With Us for Rust!", + "text": "Rust checks all the boxes – performance, efficiency, maintainability, and great developer experience. Mainmatter is here to empower your team to fully realize those benefits in your projects.", "image": "/assets/images/hero/rust.jpg", "alt": "Crabs climbing a rock on a beach", "loading": "eager" @@ -42,9 +42,9 @@ og: crates.io project.

    - But we don't stop at Rust – we have developed big web apps and mentored teams on backend, - frontend, design, as well as process and developer infrastructure for years. We know what it - takes to connect everything together and deliver a delightful end-to-end experience. + But we don't stop at Rust – we have developed big systems and mentored teams on technology, + as well as process and developer infrastructure for years. We know what it takes to connect + everything together and develop performant, solid, and maintainable systems.

    @@ -72,11 +72,10 @@ og:
    EuroRust

    We run EuroRust

    - In 2024, EuroRust will be back on October 10th and 11th in Vienna, Austria as well as - online. We'll have 2 days of talks with a main track as well as a side track for the first - time this year. Plus, there'll be workshops on the day before the main conference, room for - people to get together and hack on their favorite projects during the conference, as well as - an after party on Friday night. + In 2024, EuroRust took place on October 10th and 11th in Vienna, Austria as well as online. + We had 2 days of talks with a main track as well as a new side track and impl rooms. Plus, + there were workshops on the day before the main conference, several side activities around + the event, as well as an after party on Friday night.

    @@ -84,10 +83,10 @@ og:
    -

    Join us in Vienna for 2 days of celebrating the European Rust community

    +

    Join us in Paris in 2025 for 2 days of celebrating the European Rust community

    {% set link = { - "label": 'Get your ticket now!', + "label": 'Stay up to date!', "url": 'https://eurorust.eu' } %} @@ -111,7 +110,10 @@ og: 'Aleph Alpha', 'Google', 'Realm', - 'Astral' + 'Astral', + 'Helsing', + 'CrabNebula', + 'Oreilly' ] %} {% set title = 'Our EuroRust partners are betting on Rust' %} @@ -120,8 +122,8 @@ og:
    {% set imageData = { - "imgPath": "/assets/images/rust/eurorust.jpeg", - "alt": "Server room", + "imgPath": "/assets/images/rust/eurorust-2024.jpg", + "alt": "Photo of EuroRust 2024's speakers, organizers, moderators and the audience in the background, all with theirs hands in the air", "sizes": "100vw", "loading": "lazy", "sizesArray": [760, 1440, 1920] @@ -137,16 +139,15 @@ og:
    Book a free call

    Is Rust the right choice for us?

    - Every new technology brings its own risks - Rust is no exception. Luca Palmieri, the - author of Zero to Production in Rust and our in-house - Rust expert, is here to help your team. You walk him through your company's usecase and - your requirements and he’ll do his best to suggest the best course of action. Sometimes - Rust is not the answer, but if it is, he’ll make sure you are on the right track. + Every new technology brings its own risks - Rust is no exception. Our team of Rust experts + is here to help you. You walk us through your company's usecase and your requirements and + we'll do our best to suggest the best course of action. Sometimes Rust is not the answer, + but if it is, we'll make sure you are on the right track.

    {% set link = { - "label": 'Book a 1:1 call with Luca', - "url": 'https://calendly.com/luca-palmieri/is-rust-the-right-choice-for-us' + "label": 'Book a 1:1 call with us', + "url": 'https://mainmatter.com/contact/' } %} {{ btnSecondary( link, 'mt-2' ) }} @@ -226,8 +227,8 @@ og:
    {% set imageData = { - "imgPath": "/assets/images/rust/eurorust-2.jpeg", - "alt": "Server room", + "imgPath": "/assets/images/rust/eurorust-crab.jpg", + "alt": "People standing together in groups at EuroRust in conversations, a big, ca. 3min tall, inflatable Ferris in the background", "sizes": "100vw", "loading": "lazy", "sizesArray": [760, 1440, 1920] @@ -293,12 +294,68 @@ og:
    +
    +
    +

    We love Open Source

    +
      +
    • +
      + Gerust +
      +
      +

      Gerust

      +

      Generator for Rust backend projects

      + {% + set link = { + "label": 'View on GitHub', + "url": 'https://github.com/mainmatter/gerust' + } + %} + {{ btnSecondary( link, 'mt-2' ) }} +
      +
    • +
    • +
      + 100 Exercises to Learn Rust +
      +
      +

      100 Exercises To Learn Rust

      +

      Learn Rust by solving 100 exercises

      + {% + set link = { + "label": 'View on GitHub', + "url": 'https://github.com/mainmatter/100-exercises-to-learn-rust' + } + %} + {{ btnSecondary( link, 'mt-2' ) }} +
      +
    • +
    • +
      + cargo-autoinherit +
      +
      +

      cargo-autoinherit

      +

      Dry up your Cargo.toml manifests

      + {% + set link = { + "label": 'View on GitHub', + "url": 'https://github.com/mainmatter/cargo-autoinherit' + } + %} + {{ btnSecondary( link, 'mt-2' ) }} +
      +
    • +
    +
    +
    + {{ recentPosts("Latest from our blog on the topic", collections.rustPosts) }} {% include "global/rust-newsletter-cta.njk" %} {% set 'content' = { - "title": "Grow your business with us", - "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", + "title": "Team up with us for Rust!", + "text": "Our Rust experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" } diff --git a/src/services/launch-your-idea.njk b/src/services/launch-your-idea.njk index 71a88807c5..d1556d6b44 100644 --- a/src/services/launch-your-idea.njk +++ b/src/services/launch-your-idea.njk @@ -145,7 +145,7 @@ og: {{ featuredServices(services['launch-your-idea'], content) }} {% set 'content' = { - "title": "Grow your business with us", + "title": "Team up with us to go further!", "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" diff --git a/src/services/strategic-advice.njk b/src/services/strategic-advice.njk index 1079f18a6c..88c4bafee9 100644 --- a/src/services/strategic-advice.njk +++ b/src/services/strategic-advice.njk @@ -88,7 +88,7 @@ og: {% set 'content' = { - "title": "Grow your business with us", + "title": "Team up with us to go further!", "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" diff --git a/src/services/team-reinforcement.njk b/src/services/team-reinforcement.njk index 63f29d5981..ea0ad27af1 100644 --- a/src/services/team-reinforcement.njk +++ b/src/services/team-reinforcement.njk @@ -1,7 +1,7 @@ --- layout: "base" title: Team reinforcement | Our Services -description: "Mainmatter supports clients with experienced people who are ready to build products, mentor people and support your goals, bringing in a fresh perspective along the way." +description: "Mainmatter's experts are seasoned engineers who are ready to build products, mentor people and support your goals, bringing in a fresh perspective along the way." og: image: "/assets/images/services/team-reinforcement-og-image.jpg" --- @@ -173,7 +173,7 @@ og: {{ featuredServices(services['team-reinforcement'], content) }} {% set 'content' = { - "title": "Grow your business with us", + "title": "Team up with us to go further!", "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" diff --git a/src/services/tech-modernization.njk b/src/services/tech-modernization.njk index bd9dde128f..ea8c6fc0d1 100644 --- a/src/services/tech-modernization.njk +++ b/src/services/tech-modernization.njk @@ -131,7 +131,7 @@ og: {{ featuredServices(services['tech-modernization'], content) }} {% set 'content' = { - "title": "Grow your business with us", + "title": "Team up with us to go further!", "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" diff --git a/src/services/workshops.njk b/src/services/workshops.njk index 640d5e440e..e91ff20cf7 100644 --- a/src/services/workshops.njk +++ b/src/services/workshops.njk @@ -97,7 +97,7 @@ og: "eyebrow": "Bookable for teams", "title": "Testing in Rust: an introduction", "logo": "rust", - "link": "services/workshops/introduction-to-rust-for-web-developers/" + "link": "services/workshops/an-introduction-to-testing-in-rust/" } %} {% @@ -108,6 +108,46 @@ og: "link": "services/workshops/advanced-testing-in-rust/" } %} +{% + set 'workshop_12' = { + "eyebrow": "Bookable for teams", + "title": "Progressive Enhancement with SvelteKit", + "logo": "svelte", + "link": "services/workshops/progressive-enhancement-with-sveltekit/" + } +%} +{% + set 'workshop_13' = { + "eyebrow": "Bookable for teams", + "title": "Testing Svelte & SvelteKit applications", + "logo": "svelte", + "link": "services/workshops/testing-svelte-sveltekit-applications/" + } +%} +{% + set 'workshop_14' = { + "eyebrow": "Bookable for teams", + "title": "Svelte 5 & Runes", + "logo": "svelte", + "link": "services/workshops/svelte-5-runes/" + } +%} +{% + set 'workshop_15' = { + "eyebrow": "Bookable for teams", + "title": "Authentication for Svelte & SvelteKit", + "logo": "svelte", + "link": "services/workshops/authentication-for-svelte-sveltekit/" + } +%} +{% + set 'workshop_16' = { + "eyebrow": "Bookable for teams", + "title": "Rust-Python Interoperability", + "logo": "rust", + "link": "services/workshops/rust-python-interoperability/" + } +%} {% set workshops = [ workshop_1, @@ -120,26 +160,33 @@ og: workshop_8, workshop_9, workshop_10, - workshop_11 + workshop_11, + workshop_12, + workshop_13, + workshop_14, + workshop_15, + workshop_16 ] %} -{{ techCards('workshops', 'Workshops Catalog', 'We offer a range of workshops bookable for teams that want to grow – on-site or remote. We\'re also happy to prepare custom workshops – get in touch with us to talk about what curriculum fits your team best!', workshops) }} -{% - set 'content' = { - "title": "Not the right workshop for you?", - "text": "If you decide to organise a workshop at your company, we are happy to tailor the curriculum to your needs. We can combine multiple workshops, pick and choose modules, as well as develop new content if desired.", - "linkUrl": "/contact", - "linkText": "Get in touch" - } -%} -{{ ctaBanner('purple', 'default', content) }} -{% include "global/default-newsletter-cta.njk" %} -{% - set 'content' = { - "title": "Grow your business with us", - "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", - "linkUrl": "/contact", - "linkText": "Get in touch" - } -%} -{{ ctaBanner('purple', 'full', content) }} +{{ + techCards('workshops', 'Workshops Catalog', 'We offer a range of workshops bookable for teams that want to grow – on-site or remote. We\'re also happy to prepare custom workshops – get in touch with us to talk about what curriculum fits your team best!', workshops) }} + {% + set 'content' = { + "title": "Can't find the right workshops for your team?", + "text": "We are happy to tailor the curriculum to your needs. We can combine multiple workshops, pick and choose modules, as well as develop new content if desired.", + "linkUrl": "/contact", + "linkText": "Get in touch" + } + %} + {{ ctaBanner('purple', 'default', content) }} + {% include "global/default-newsletter-cta.njk" %} + {% + set 'content' = { + "title": "Team up with us to go further!", + "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", + "linkUrl": "/contact", + "linkText": "Get in touch" + } + %} + {{ ctaBanner('purple', 'full', content) +}} diff --git a/src/services/workshops/rust.njk b/src/services/workshops/rust.njk index 23f102bd9e..f02e48f24c 100644 --- a/src/services/workshops/rust.njk +++ b/src/services/workshops/rust.njk @@ -1,7 +1,9 @@ --- layout: "base" title: Rust Workshops | Our Services -description: "We provide a number of workshops to enable teams to succeed with Rust – onsite or remote" +description: "We offer workshops to enable teams to succeed with Rust – covering a wide range from basics to advanced topics, onsite or remote." +og: +image: "/assets/images/workshops/rust-og-image.jpg" --- {% from "color-hero.njk" import colorHero %} @@ -59,7 +61,7 @@ description: "We provide a number of workshops to enable teams to succeed with R "eyebrow": "Bookable for teams", "title": "Testing in Rust: an introduction", "logo": "rust", - "link": "services/workshops/introduction-to-rust-for-web-developers/" + "link": "services/workshops/an-introduction-to-testing-in-rust/" } %} {% @@ -70,7 +72,15 @@ description: "We provide a number of workshops to enable teams to succeed with R "link": "services/workshops/advanced-testing-in-rust/" } %} -{% set workshops = [workshop_1, workshop_2, workshop_3, workshop_4, workshop_5, workshop_6] %} +{% + set 'workshop_7' = { + "eyebrow": "Bookable for teams", + "title": "Rust-Python Interoperability", + "logo": "rust", + "link": "services/workshops/rust-python-interoperability/" + } +%} +{% set workshops = [workshop_1, workshop_2, workshop_3, workshop_4, workshop_5, workshop_6, workshop_7] %} {{ workshopsList('Our training offering', 'We specialize on Rust on the backend: API services, workers, data pipelines. That focus shapes our training offering. We can walk alongside you on a journey from zero to hero, diff --git a/src/services/workshops/svelte.njk b/src/services/workshops/svelte.njk new file mode 100644 index 0000000000..5b4311e458 --- /dev/null +++ b/src/services/workshops/svelte.njk @@ -0,0 +1,149 @@ +--- +layout: "base" +title: Svelte Workshops | Our Services +description: "We offer workshops to enable teams to succeed with Svelte & SvelteKit – covering a wide range from basics to advanced topics, onsite or remote." +og: + image: "/assets/images/workshops/svelte-workshops-og-image.jpg" +--- + +{% from "color-hero.njk" import colorHero %} +{% from "tech-cards.njk" import techCards %} +{% from "cta-banner.njk" import ctaBanner %} +{% from "image-aspect-ratio.njk" import imageAspectRatio %} +{% from "public-workshops.njk" import publicWorkshops %} +{% from "btn-secondary.njk" import btnSecondary %} +{% from "featured-services.njk" import featuredServices %} +{% from "logo-list.njk" import logoList %} +{% from "workshops-list.njk" import workshopsList %} +{% from "secondary-feature.njk" import secondaryFeature %} +{% + set 'content' = { + "title": "We teach teams like yours how to succeed with Svelte and SvelteKit", + "image": "/assets/images/hero/table-soccer.jpg", + "alt": "A close-up photo of the figures on a table soccer table", + "loading": "eager" + } +%} +{{ colorHero('purple', content) }} +{% + set 'workshop_1' = { + "eyebrow": "Bookable for teams", + "title": "Svelte & SvelteKit", + "logo": "svelte", + "link": "services/workshops/svelte-and-sveltekit/" + } +%} +{% + set 'workshop_2' = { + "eyebrow": "Bookable for teams", + "title": "Progressive Enhancement with SvelteKit", + "logo": "svelte", + "link": "services/workshops/progressive-enhancement-with-sveltekit/" + } +%} +{% + set 'workshop_3' = { + "eyebrow": "Bookable for teams", + "title": "Testing Svelte & SvelteKit applications", + "logo": "svelte", + "link": "services/workshops/testing-svelte-sveltekit-applications/" + } +%} +{% + set 'workshop_4' = { + "eyebrow": "Bookable for teams", + "title": "Svelte 5 & Runes", + "logo": "svelte", + "link": "services/workshops/svelte-5-runes/" + } +%} +{% + set 'workshop_5' = { + "eyebrow": "Bookable for teams", + "title": "Authentication for Svelte & SvelteKit", + "logo": "svelte", + "link": "services/workshops/authentication-for-svelte-sveltekit/" + } +%} +{% set workshops = [workshop_1, workshop_2, workshop_3, workshop_4, workshop_5] %} +{{ + workshopsList('Our training offering', "We are Svelte experts and want others to get the most of it as well. That's why we provide a range of trainings on Svelte and SvelteKit. + We can get teams up to speed with Svelte from scratch, + or help them tackle a range of specific topics.", workshops) +}} +{% set futurePublicWorkshops = publicSvelteWorkshops.workshops | future %} +{{ publicWorkshops(futurePublicWorkshops) }} + +
    +
    +
    +

    Our methodology

    +

    + All our workshops are hands-on. We believe that the best way to learn is by doing. Our + trainers introduce concepts and patterns but attendees spend the majority of their time + during the workshops writing code, and applying those concepts in practical examples. This + structure allows our trainers to spend most of their time in 1:1 conversations with + attendees, providing tailored feedback and guidance. +

    +
    +
    +

    Logistics

    +

    + All our workshops can be held in-person or remotely. If you decide to organise a workshop at + your company, we are happy to tailor the curriculum to your needs. We can combine multiple + workshops, pick and choose modules, as well as develop new content if desired.
    + Get in touch with us + to discuss further! +

    +
    +
    +
    + +
    +
    +
    +
    Svelte & Mainmatter
    +

    A unique skillset

    +

    + We’re frontend experts – our team speaks at international events, is + actively contributing to a number of open source projects + and our Svelte expert Paolo Ricciuti is a Svelte maintainer and the co-author of + SvelteLab. +

    +

    + Mainmatter has been developing big web apps and mentored international teams around backend, + frontend, design, as well as process and developer infrastructure for years. We know what it + takes to connect everything together and deliver a delightful end-to-end experience. +

    +
    +
    +
    + +
    + +
    + +{% include "global/svelte-cta.njk" %} +{% include "global/svelte-newsletter-cta.njk" %} diff --git a/src/startups.njk b/src/startups.njk index 80daef2331..d111316fe0 100644 --- a/src/startups.njk +++ b/src/startups.njk @@ -153,7 +153,7 @@ description: "Discover effective strategies to scale up your business, and achie {{ featuredCaseStudies(clients, 'Browse our work') }} {% set 'content' = { - "title": "Grow your business with us", + "title": "Team up with us to go further!", "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" diff --git a/src/svelte-consulting.njk b/src/svelte-consulting.njk index 00c3984d33..3bf0333ef3 100644 --- a/src/svelte-consulting.njk +++ b/src/svelte-consulting.njk @@ -1,10 +1,10 @@ --- layout: base -title: Enable your team to succeed with Svelte +title: "Team Up With Us for Svelte! | Svelte consulting" description: Mainmatter enables teams to succedd with Svelte and build ambitious web apps that are fast and maintainable. permalink: /svelte-consulting/ og: - image: /assets/images/svelte/lp-svelte-consulting-og-image.jpg + image: /assets/images/svelte/og-image.png --- {% from "image-banner-with-text.njk" import imageBannerWithText %} @@ -20,7 +20,7 @@ og: {% set 'content' = { "eyebrow": "Our Expertise: Svelte & SvelteKit", - "title": "Svelte is the future of frontend development", + "title": "Team Up With Us for Svelte!", "text": "Svelte combines a leading developer experience with performance and maintainability. With SvelteKit and its progressive enhancement capabilities, it's a fit for a wide range of use cases. Mainmatter is here to empower your team to fully realize those benefits in your web and backend projects.", "image": "/assets/images/hero/svelte.jpg", "alt": "A metal chain", @@ -39,7 +39,7 @@ og: actively contributing to a number of open source projects - and our Svelte expert Paolo Ricciuti is a Svelte ambassador and the co-author of + and our Svelte expert Paolo Ricciuti is a Svelte maintainer and the co-author of SvelteLab.

    @@ -49,14 +49,35 @@ og:

    + + +
    +
    +
    +
    Svelte Summit & This Week in Svelte
    +

    Fostering the Community

    +

    + Mainmatter believes open source communities are valuable and we strive for being active + community members. Our team regularly speaks at all of the relevant Svelte conferences but + also other conferences. We also co-organize Svelte Summit together with our friends at + Svelte Society and our Svelte lead, Paolo Riccuiti is the host of the + This Week in Svelte video series. +

    +
    +
    - +
    -

    Mainmatter is a Gold Sponsor of Svelte Summit Fall 2023

    +

    We co-organize Svelte Summit together with our friends at Svelte Society.

    {% set link = { - "label": 'Learn more', + "label": 'Join us in Barcelona in May 2025!', "url": 'https://www.sveltesummit.com/' } %} @@ -136,7 +157,7 @@ og: {% set link = { "label": 'Check out our workshops!', - "url": '/services/workshops/svelte-and-sveltekit/' + "url": '/services/workshops/svelte/' } %} {{ btnSecondary( link, 'mt-2 plausible-event-name=Svelte+Workshops' ) }} @@ -199,6 +220,22 @@ og: {{ btnSecondary( link, 'mt-2' ) }}
    +
  • +
    + Sheepdog +
    +
    +

    @sheepdog/svelte

    +

    Herd your async tasks!

    + {% + set link = { + "label": 'View on GitHub', + "url": 'https://github.com/mainmatter/sheepdog' + } + %} + {{ btnSecondary( link, 'mt-2' ) }} +
    +
  • @@ -207,8 +244,8 @@ og: {% include "global/svelte-newsletter-cta.njk" %} {% set 'content' = { - "title": "Grow your business with us", - "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", + "title": "Team up with us for Svelte", + "text": "Our Svelte experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" } diff --git a/src/tag.njk b/src/tag.njk index efe6e1f4ae..8455c198db 100644 --- a/src/tag.njk +++ b/src/tag.njk @@ -46,7 +46,7 @@ permalink: "/blog/tag/{{ paged.tag | slug }}/{% if paged.number > 1 %}/page/{{ p {% set 'content' = { - "title": "Grow your business with us", + "title": "Team up with us to go further!", "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" diff --git a/src/talks.njk b/src/talks.njk index f4cdab7c0d..e7bfaee226 100644 --- a/src/talks.njk +++ b/src/talks.njk @@ -35,7 +35,7 @@ eleventyNavigation: {% set 'content' = { - "title": "Grow your business with us", + "title": "Team up with us to go further!", "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" diff --git a/src/travel.njk b/src/travel.njk new file mode 100644 index 0000000000..349800cfb6 --- /dev/null +++ b/src/travel.njk @@ -0,0 +1,338 @@ +--- +layout: "base" +title: "We Modernize the Travel Industry" +description: "We transform travel companies holistically, building modern organizations along with industry-leading products." +og: + image: /assets/images/travel/lp-travel-og-image.jpg +--- + +{% from "color-hero.njk" import colorHero %} +{% from "strategy-list.njk" import strategyList %} +{% from "quote.njk" import quote %} +{% from "featured-case-studies.njk" import featuredCaseStudies %} +{% from "recent-posts.njk" import recentPosts %} +{% from "featured-services.njk" import featuredServices %} +{% from "secondary-feature.njk" import secondaryFeature %} +{% from "cta-banner.njk" import ctaBanner %} +{% from "btn-secondary.njk" import btnSecondary %} +{% + set 'content' = { + "title": "We Modernize the Travel Industry", + "text": "We transform companies in the digital travel, transport and mobility industries holistically, building modern organizations along with industry-leading products.", + "image": "/assets/images/photos/travel-hero.jpg", + "alt": "Lego city scape", + "loading": "eager" + } +%} +{{ colorHero('purple', content) }} + +
    +
    +
    +

    + We know the products and practices of the leading tech teams in the world - in fact, we’ve + been involved with shaping them. We can transform your company to match these standards. We + will assess the status quo, create a roadmap towards your future shape, and guide you + throughout the journey. +

    +
    +
    +
    + +{% + set list = [{ + "title": "Assess the status quo via a thorough analysis of code, architecture, infrastructure, and processes, as well as interviews with stakeholders." + },{ + "title": "Prepare a roadmap for transforming the product as well as the development organization behind it." + },{ + "title": "Guide your team through the transformation phase." + }] +%} + +{{ strategyList('launch-your-idea', 'We’ll work with you to:', list) }} + +
    +
    +
    +

    The Travel Transformation Whitepaper

    +
    + Download our whitepaper for an in-depth analysis of the challenges the digital travel, + transport, and mobility industries are facing. Discover what there is to learn from leading + tech teams to modernize your company and boost competitiveness. +
    +
    + +
    + + + +
    +
    + + +
    +
    + + + +
    +
    + +
    + +
    + +
    + Your message is being sent… + +
    +
    +
    +

    Unable to send message.

    +

    + Please try again later or contact us at + travel@mainmatter.com +

    +
    +
    +
    +
    +

    Thank you!

    +

    We will be in touch soon.

    +

    You will receive an email with the whitepaper shortly.

    +
    +
    +
    + +
    +
    + {% image '/assets/images/photos/travel-whitepaper-cover.jpg', "Title page of Mainmatter's Travel Transformation whitepaper", '(min-width: 48em) 40rem, 90vw', 'lazy', '', [400, 800, 1200] %} +
    +
    +
    +
    +
    +
    + +
    +
    +
    +

    Team up with Mainmatter to overcome challenges together

    +

    + The travel industry is under rising pressure as user expectations grow, entry barriers + decrease, gatekeepers like Booking become ever more powerful, and disruptive newcomers enter + the market. To maintain or expand their market share, established companies must innovate + quickly, deliver impressive results, and adapt flexibly to a changing landscape. We partner + with companies in the travel industry to overcome those challenges. +

    +
    +
    +
    + +
    + +
    + +{% set clients = ['rail-europe'] %} +{{ featuredCaseStudies(clients) }} + +
    + {% + set 'content' = { + "text": "Mainmatter enabled us to take our Product Development Organization to the next level. They work closely with our team and help us establish new practices while simultaneously delivering on our day to day product initiatives. Their technical and organizational expertise and fresh views allow us to set up the foundation for future success.", + "source": "Jürgen Witte, CPO @ Rail Europe", + "image": "/assets/images/photos/juergen-witte.png", + "alt": "Jürgen Witte", + "loading": "lazy" + } + %} + {{ quote(content) }} +
    + +{% set clients = ['trainline', 'hop-skip-drive', 'terminal49', 'aleph-alpha'] %} +{{ featuredCaseStudies(clients) }} + +{{ recentPosts("Latest from our blog", collections.travelPosts) }} +{% + set 'content' = { + "subtitle": "Discover our services" + } +%} + +
    +
    +
    +

    Team up with us!

    +
    + We are your partner to modernize your company and boost competitiveness. +
    +
    + + +
    + + + +
    +
    + + +
    +
    + + + +
    + +
    + +
    + Your message is being sent… + +
    +
    +
    +

    Unable to send message.

    +

    + Please try again later or contact us at + travel@mainmatter.com +

    +
    +
    +
    +
    +

    Thank you!

    +

    We will be in touch soon.

    +

    One of our experts will get back to you shortly.

    +

    + In the meantime, have a look at our work + to learn more about how we helped other companies in the past. +

    +
    +
    +
    +
    +
    +
    +
    diff --git a/src/twios/2021-12-10.md b/src/twios/2021-12-10.md index a0eb711f97..09e9f1e571 100644 --- a/src/twios/2021-12-10.md +++ b/src/twios/2021-12-10.md @@ -1,9 +1,6 @@ ## Highlight -This week our senior software engineer [Tobias Bieniek] did a little bit of -design work on [crates.io], the [Rust] package registry. The website now has a -[new page footer](https://github.com/rust-lang/crates.io/pull/4158) and a -[cute little 404 page](https://github.com/rust-lang/crates.io/pull/4154): +This week our senior software engineer [Tobias Bieniek] did a little bit of design work on [crates.io], the [Rust] package registry. The website now has a [new page footer](https://github.com/rust-lang/crates.io/pull/4158) and a [cute little 404 page](https://github.com/rust-lang/crates.io/pull/4154): ![](https://user-images.githubusercontent.com/141300/141307167-e3fd2914-064f-4076-b415-fc12a8f8bcbe.png) @@ -11,131 +8,65 @@ design work on [crates.io], the [Rust] package registry. The website now has a ## Rust -- [hyperium/http] [#513](https://github.com/hyperium/http/pull/513) Cargo: Add - `rust-version` field ([@Turbo87]) -- [hyperium/http] [#512](https://github.com/hyperium/http/pull/512) README: - Remove obsolete extern crate http instructions ([@Turbo87]) +- [hyperium/http] [#513](https://github.com/hyperium/http/pull/513) Cargo: Add `rust-version` field ([@Turbo87]) +- [hyperium/http] [#512](https://github.com/hyperium/http/pull/512) README: Remove obsolete extern crate http instructions ([@Turbo87]) ## crates.io -- [rust-lang/crates.io] - [#4175](https://github.com/rust-lang/crates.io/pull/4175) worker::git: Read - `yanked` status from database ([@Turbo87]) -- [rust-lang/crates.io] - [#4173](https://github.com/rust-lang/crates.io/pull/4173) TestApp: Simplify - `crates_from_index_head()` method ([@Turbo87]) -- [rust-lang/crates.io] - [#4171](https://github.com/rust-lang/crates.io/pull/4171) Improve Avatar - styling ([@Turbo87]) -- [rust-lang/crates.io] - [#4170](https://github.com/rust-lang/crates.io/pull/4170) Header: Add drop - shadows to main elements ([@Turbo87]) -- [rust-lang/crates.io] - [#4166](https://github.com/rust-lang/crates.io/pull/4166) bin/server: Print - HTTP server URL on startup ([@Turbo87]) -- [rust-lang/crates.io] - [#4165](https://github.com/rust-lang/crates.io/pull/4165) bin/server: Simplify - assignments via `match` ([@Turbo87]) -- [rust-lang/crates.io] - [#4162](https://github.com/rust-lang/crates.io/pull/4162) OwnersList: Fall - back to login if name is not filled ([@Turbo87]) -- [rust-lang/crates.io] - [#4158](https://github.com/rust-lang/crates.io/pull/4158) Redesign Footer - component ([@Turbo87]) -- [rust-lang/crates.io] - [#4156](https://github.com/rust-lang/crates.io/pull/4156) Show 404 pages for - unknown crates/versions ([@Turbo87]) -- [rust-lang/crates.io] - [#4154](https://github.com/rust-lang/crates.io/pull/4154) Redesign 404 page - ([@Turbo87]) -- [rust-lang/crates.io] - [#4152](https://github.com/rust-lang/crates.io/pull/4152) CrateSidebar: Show - detailed list for small number of owners ([@Turbo87]) -- [rust-lang/crates.io] - [#4151](https://github.com/rust-lang/crates.io/pull/4151) renovate: Adjust - `node` package grouping ([@Turbo87]) -- [rust-lang/crates.io] - [#4150](https://github.com/rust-lang/crates.io/pull/4150) renovate: Convert to - JSON5 file ([@Turbo87]) -- [rust-lang/crates.io] - [#4148](https://github.com/rust-lang/crates.io/pull/4148) Pin Node.js version - ([@Turbo87]) - -- [conduit-rust/conduit-hyper] - [#34](https://github.com/conduit-rust/conduit-hyper/pull/34) ConduitRequest: - Inline `parts()` method ([@Turbo87]) -- [conduit-rust/conduit-hyper] - [#33](https://github.com/conduit-rust/conduit-hyper/pull/33) RequestInfo: - Replace custom struct with `Request` ([@Turbo87]) +- [rust-lang/crates.io] [#4175](https://github.com/rust-lang/crates.io/pull/4175) worker::git: Read `yanked` status from database ([@Turbo87]) +- [rust-lang/crates.io] [#4173](https://github.com/rust-lang/crates.io/pull/4173) TestApp: Simplify `crates_from_index_head()` method ([@Turbo87]) +- [rust-lang/crates.io] [#4171](https://github.com/rust-lang/crates.io/pull/4171) Improve Avatar styling ([@Turbo87]) +- [rust-lang/crates.io] [#4170](https://github.com/rust-lang/crates.io/pull/4170) Header: Add drop shadows to main elements ([@Turbo87]) +- [rust-lang/crates.io] [#4166](https://github.com/rust-lang/crates.io/pull/4166) bin/server: Print HTTP server URL on startup ([@Turbo87]) +- [rust-lang/crates.io] [#4165](https://github.com/rust-lang/crates.io/pull/4165) bin/server: Simplify assignments via `match` ([@Turbo87]) +- [rust-lang/crates.io] [#4162](https://github.com/rust-lang/crates.io/pull/4162) OwnersList: Fall back to login if name is not filled ([@Turbo87]) +- [rust-lang/crates.io] [#4158](https://github.com/rust-lang/crates.io/pull/4158) Redesign Footer component ([@Turbo87]) +- [rust-lang/crates.io] [#4156](https://github.com/rust-lang/crates.io/pull/4156) Show 404 pages for unknown crates/versions ([@Turbo87]) +- [rust-lang/crates.io] [#4154](https://github.com/rust-lang/crates.io/pull/4154) Redesign 404 page ([@Turbo87]) +- [rust-lang/crates.io] [#4152](https://github.com/rust-lang/crates.io/pull/4152) CrateSidebar: Show detailed list for small number of owners ([@Turbo87]) +- [rust-lang/crates.io] [#4151](https://github.com/rust-lang/crates.io/pull/4151) renovate: Adjust `node` package grouping ([@Turbo87]) +- [rust-lang/crates.io] [#4150](https://github.com/rust-lang/crates.io/pull/4150) renovate: Convert to JSON5 file ([@Turbo87]) +- [rust-lang/crates.io] [#4148](https://github.com/rust-lang/crates.io/pull/4148) Pin Node.js version ([@Turbo87]) + +- [conduit-rust/conduit-hyper] [#34](https://github.com/conduit-rust/conduit-hyper/pull/34) ConduitRequest: Inline `parts()` method ([@Turbo87]) +- [conduit-rust/conduit-hyper] [#33](https://github.com/conduit-rust/conduit-hyper/pull/33) RequestInfo: Replace custom struct with `Request` ([@Turbo87]) ## Ember.js -- [emberjs/data] [#7750](https://github.com/emberjs/data/pull/7750) reference: - Fix broken `meta()` snippet ([@Turbo87]) - -- [ember-cli/ember-cli] - [#9696](https://github.com/ember-cli/ember-cli/pull/9696) commands/init: Fix - `--yarn` usage ([@Turbo87]) - -- [buschtoens/ember-link] - [#678](https://github.com/buschtoens/ember-link/pull/678) Adjust - @glimmer/tracking dependency to use semver ([@Turbo87]) -- [buschtoens/ember-link] - [#675](https://github.com/buschtoens/ember-link/pull/675) Use pnpm package - manager ([@Turbo87]) -- [buschtoens/ember-link] - [#674](https://github.com/buschtoens/ember-link/pull/674) Release via CI - ([@Turbo87]) -- [buschtoens/ember-link] - [#672](https://github.com/buschtoens/ember-link/pull/672) chore(deps): update - @types dependencies ([@Turbo87]) - -ESA 4.0: Refactored internals of the addon to use Ember’s dependency injection, -making things simpler and easier to test. Successfully removed a lot of code, -and simplified tests setup. - -- [mainmatter/ember-simple-auth] - [#2315](https://github.com/mainmatter/ember-simple-auth/pull/2315) put - internal-session into DI system ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2312](https://github.com/mainmatter/ember-simple-auth/pull/2312) Refactor - Adaptive store to use DI ([@BobrImperator]) - -ESA 4.1: implemented a session #setup method. The methos represents a first step -to migrating from custom initializers, it excludes the application route that -ESA adds automatically and that is causing build issues for embroider and -typescript users. - -- [mainmatter/ember-simple-auth] - [#2314](https://github.com/mainmatter/ember-simple-auth/issues/2314) Add - #setup method to session service ([@BobrImperator]) +- [emberjs/data] [#7750](https://github.com/emberjs/data/pull/7750) reference: Fix broken `meta()` snippet ([@Turbo87]) + +- [ember-cli/ember-cli] [#9696](https://github.com/ember-cli/ember-cli/pull/9696) commands/init: Fix `--yarn` usage ([@Turbo87]) + +- [buschtoens/ember-link] [#678](https://github.com/buschtoens/ember-link/pull/678) Adjust @glimmer/tracking dependency to use semver ([@Turbo87]) +- [buschtoens/ember-link] [#675](https://github.com/buschtoens/ember-link/pull/675) Use pnpm package manager ([@Turbo87]) +- [buschtoens/ember-link] [#674](https://github.com/buschtoens/ember-link/pull/674) Release via CI ([@Turbo87]) +- [buschtoens/ember-link] [#672](https://github.com/buschtoens/ember-link/pull/672) chore(deps): update @types dependencies ([@Turbo87]) + +ESA 4.0: Refactored internals of the addon to use Ember’s dependency injection, making things simpler and easier to test. Successfully removed a lot of code, and simplified tests setup. + +- [mainmatter/ember-simple-auth] [#2315](https://github.com/mainmatter/ember-simple-auth/pull/2315) put internal-session into DI system ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2312](https://github.com/mainmatter/ember-simple-auth/pull/2312) Refactor Adaptive store to use DI ([@BobrImperator]) + +ESA 4.1: implemented a session #setup method. The methos represents a first step to migrating from custom initializers, it excludes the application route that ESA adds automatically and that is causing build issues for embroider and typescript users. + +- [mainmatter/ember-simple-auth] [#2314](https://github.com/mainmatter/ember-simple-auth/issues/2314) Add #setup method to session service ([@BobrImperator]) ## JavaScript -- [remy/nodemon] [#1934](https://github.com/remy/nodemon/pull/1934) ci(node.js): - workflow uses 'npm' cache ([@oscard0m]) -- [remy/nodemon] [#1933](https://github.com/remy/nodemon/pull/1933) ci(release): - workflow uses 'npm' cache ([@oscard0m]) +- [remy/nodemon] [#1934](https://github.com/remy/nodemon/pull/1934) ci(node.js): workflow uses 'npm' cache ([@oscard0m]) +- [remy/nodemon] [#1933](https://github.com/remy/nodemon/pull/1933) ci(release): workflow uses 'npm' cache ([@oscard0m]) -- [strapi/strapi] [#11531](https://github.com/strapi/strapi/pull/11531) Add - cache to node workflows ([@oscard0m]) +- [strapi/strapi] [#11531](https://github.com/strapi/strapi/pull/11531) Add cache to node workflows ([@oscard0m]) -- [storybookjs/storybook] - [#15969](https://github.com/storybookjs/storybook/pull/15969) Core: Add - 'staticDirs' config option ([@oscard0m]) -- [storybookjs/eslint-plugin-storybook] - [#5](https://github.com/storybookjs/eslint-plugin-storybook/issues/5) ESLint - error: TypeError: Cannot read property 'properties' of undefined ([@oscard0m]) -- [storybookjs/eslint-plugin-storybook] - [#7](https://github.com/storybookjs/eslint-plugin-storybook/issues/7) ESLint - error: TypeError: Cannot read property 'name' of undefined ([@oscard0m]) +- [storybookjs/storybook] [#15969](https://github.com/storybookjs/storybook/pull/15969) Core: Add 'staticDirs' config option ([@oscard0m]) +- [storybookjs/eslint-plugin-storybook] [#5](https://github.com/storybookjs/eslint-plugin-storybook/issues/5) ESLint error: TypeError: Cannot read property 'properties' of undefined ([@oscard0m]) +- [storybookjs/eslint-plugin-storybook] [#7](https://github.com/storybookjs/eslint-plugin-storybook/issues/7) ESLint error: TypeError: Cannot read property 'name' of undefined ([@oscard0m]) ## Mainmatter's playbook Added more detailed information regarding issue preparation. -- [mainmatter/playbook] [#171](https://github.com/mainmatter/playbook/pull/171) - Add more information about issue preparation ([@marcoow]) +- [mainmatter/playbook] [#171](https://github.com/mainmatter/playbook/pull/171) Add more information about issue preparation ([@marcoow]) [hyperium/http]: https://github.com/hyperium/http/ [rust-lang/crates.io]: https://github.com/rust-lang/crates.io/ @@ -152,8 +83,7 @@ Added more detailed information regarding issue preparation. [remy/nodemon]: https://github.com/remy/nodemon/ [strapi/strapi]: https://github.com/strapi/strapi/ [storybookjs/storybook]: https://github.com/storybookjs/storybook/ -[storybookjs/eslint-plugin-storybook]: - https://github.com/storybookjs/eslint-plugin-storybook/ +[storybookjs/eslint-plugin-storybook]: https://github.com/storybookjs/eslint-plugin-storybook/ [@marcoow]: https://github.com/marcoow/ [@bobrimperator]: https://github.com/BobrImperator/ [@oscard0m]: https://github.com/oscard0m/ diff --git a/src/twios/2022-01-11.md b/src/twios/2022-01-11.md index 3621135b94..2c85277217 100644 --- a/src/twios/2022-01-11.md +++ b/src/twios/2022-01-11.md @@ -1,201 +1,84 @@ ## JavaScript -- [commitizen/cz-conventional-changelog] - [#181](https://github.com/commitizen/cz-conventional-changelog/pull/181) - feat(config): add 'extends' configuration option ([@oscard0m]) -- [oscard0m/npm-snapshot] - [#12](https://github.com/oscard0m/npm-snapshot/pull/12) fix(npm-snapshot): - exit execution if stringified semver 'version' is undefined ([@oscard0m]) -- [oscard0m/npm-snapshot] - [#11](https://github.com/oscard0m/npm-snapshot/pull/11) docs(readme): format - README.md ([@oscard0m]) -- [oscard0m/npm-snapshot] - [#10](https://github.com/oscard0m/npm-snapshot/pull/10) style(npm-snapshot): - applied style (prettier) changes ([@oscard0m]) -- [oscard0m/npm-snapshot] [#9](https://github.com/oscard0m/npm-snapshot/pull/9) - ci(release): remove non-existing 'npm run build' step from release workflow - ([@oscard0m]) -- [oscard0m/npm-snapshot] [#8](https://github.com/oscard0m/npm-snapshot/pull/8) - ci(package-lock): add missing package-lock ([@oscard0m]) -- [oscard0m/npm-snapshot] [#7](https://github.com/oscard0m/npm-snapshot/pull/7) - ci(release): add Release workflow via Github Action with Semantic Release - ([@oscard0m]) -- [oscard0m/npm-snapshot] [#6](https://github.com/oscard0m/npm-snapshot/pull/6) - chore(package.json): update author of the project ([@oscard0m]) -- [oscard0m/npm-snapshot] [#5](https://github.com/oscard0m/npm-snapshot/pull/5) - chore(.gitignore): ignore .vscode folder ([@oscard0m]) +- [commitizen/cz-conventional-changelog] [#181](https://github.com/commitizen/cz-conventional-changelog/pull/181) feat(config): add 'extends' configuration option ([@oscard0m]) +- [oscard0m/npm-snapshot] [#12](https://github.com/oscard0m/npm-snapshot/pull/12) fix(npm-snapshot): exit execution if stringified semver 'version' is undefined ([@oscard0m]) +- [oscard0m/npm-snapshot] [#11](https://github.com/oscard0m/npm-snapshot/pull/11) docs(readme): format README.md ([@oscard0m]) +- [oscard0m/npm-snapshot] [#10](https://github.com/oscard0m/npm-snapshot/pull/10) style(npm-snapshot): applied style (prettier) changes ([@oscard0m]) +- [oscard0m/npm-snapshot] [#9](https://github.com/oscard0m/npm-snapshot/pull/9) ci(release): remove non-existing 'npm run build' step from release workflow ([@oscard0m]) +- [oscard0m/npm-snapshot] [#8](https://github.com/oscard0m/npm-snapshot/pull/8) ci(package-lock): add missing package-lock ([@oscard0m]) +- [oscard0m/npm-snapshot] [#7](https://github.com/oscard0m/npm-snapshot/pull/7) ci(release): add Release workflow via Github Action with Semantic Release ([@oscard0m]) +- [oscard0m/npm-snapshot] [#6](https://github.com/oscard0m/npm-snapshot/pull/6) chore(package.json): update author of the project ([@oscard0m]) +- [oscard0m/npm-snapshot] [#5](https://github.com/oscard0m/npm-snapshot/pull/5) chore(.gitignore): ignore .vscode folder ([@oscard0m]) ## Ember.js -- [mainmatter/ember-promise-modals] - [#500](https://github.com/mainmatter/ember-promise-modals/pull/500) Specify - octane edition in package.json & add missing optional features ([@nickschot]) -- [mainmatter/ember-promise-modals] - [#499](https://github.com/mainmatter/ember-promise-modals/pull/499) Update - ember-release scenario to use auto-import v2 ([@nickschot]) - -- [nickschot/ember-mobile-menu] - [#216](https://github.com/nickschot/ember-mobile-menu/pull/216) add - ember-keyboard v7 resolution to fix ember 4+ CI ([@nickschot]) - -- [mainmatter/ember-intl-analyzer] - [#447](https://github.com/mainmatter/ember-intl-analyzer/pull/447) Add - additional guard to check if at the top of the parent tree and tests - ([@mikek2252]) - -- [mansona/ember-cli-notifications] - [#328](https://github.com/mansona/ember-cli-notifications/pull/328) Breaking: - Update container component ([@pichfl]) -- [mansona/ember-cli-notifications] - [#326](https://github.com/mansona/ember-cli-notifications/pull/326) BREAKING: - Remove obsolete equals helper ([@pichfl]) -- [mansona/ember-cli-notifications] - [#325](https://github.com/mansona/ember-cli-notifications/pull/325) Breaking: - Modernize and improve notification message component ([@pichfl]) -- [mansona/ember-cli-notifications] - [#324](https://github.com/mansona/ember-cli-notifications/pull/324) Replace - overridable icon paths with overridable icon components ([@pichfl]) -- [mansona/ember-cli-notifications] - [#327](https://github.com/mansona/ember-cli-notifications/pull/327) move to - field-guide ([@mansona]) - -- [empress/ember-cli-showdown] - [#109](https://github.com/empress/ember-cli-showdown/pull/109) Add some basic - Fastboot testing ([@mansona]) -- [empress/ember-cli-showdown] - [#108](https://github.com/empress/ember-cli-showdown/pull/108) feat: Import - htmlSafe from @ember/template, not @ember/string. ([@mansona]) - -- [mainmatter/ember-simple-auth] - [#2350](https://github.com/mainmatter/ember-simple-auth/pull/2350) Upgrade to - qunit 5 ([@candunaj]) -- [mainmatter/ember-simple-auth] - [#2349](https://github.com/mainmatter/ember-simple-auth/pull/2349) Fixed - failing unit test - invalidate call revoke endpoint twice. Unit test did not - validate it correctly. ([@candunaj]) -- [mainmatter/ember-simple-auth] - [#2348](https://github.com/mainmatter/ember-simple-auth/pull/2348) Fixed - quietly failing unit test because server returned nothing ([@candunaj]) -- [mainmatter/ember-simple-auth] - [#2345](https://github.com/mainmatter/ember-simple-auth/pull/2345) Fixed - failing unit test - ember/object get function was removed from source code so - I have changed unit test accordingly ([@candunaj]) -- [mainmatter/ember-simple-auth] - [#2344](https://github.com/mainmatter/ember-simple-auth/pull/2344) In some - tests was thrown undefined. ([@candunaj]) -- [mainmatter/ember-simple-auth] - [#2343](https://github.com/mainmatter/ember-simple-auth/pull/2343) Allow - ember-release to fail ([@candunaj]) -- [mainmatter/ember-simple-auth] - [#2342](https://github.com/mainmatter/ember-simple-auth/pull/2342) Fixed 3 - readonly tests. ([@candunaj]) -- [mainmatter/ember-simple-auth] - [#2353](https://github.com/mainmatter/ember-simple-auth/pull/2353) Fix - ember-release + ember-beta build ([@marcoow]) - -- [empress/empress-blog-casper-template] - [#50](https://github.com/empress/empress-blog-casper-template/pull/50) remove - {{link-to}} calls using positional arguments ([@mansona]) -- [empress/empress-blog] - [#150](https://github.com/empress/empress-blog/pull/150) update - ember-body-class ([@mansona]) -- [empress/broccoli-static-site-json] - [#64](https://github.com/empress/broccoli-static-site-json/pull/64) Support - toc yaml ([@mansona]) - -- [mansona/ember-body-class] - [#45](https://github.com/mansona/ember-body-class/pull/45) fix - ember-body-class for fastboot initial render ([@mansona]) - -- [ember-learn/guides-source] - [#1758](https://github.com/ember-learn/guides-source/pull/1758) Replaces - EmberArray with tracked property in "Looping through lists" ([@locks]) -- [ember-learn/guides-source] - [#1753](https://github.com/ember-learn/guides-source/pull/1753) Ember 4.0 - preparation ([@locks]) - -- [emberjs/ember-string] - [#309](https://github.com/emberjs/ember-string/pull/309) Fix deprecated import - path ([@turbo87]) -- [emberjs/ember-string] - [#308](https://github.com/emberjs/ember-string/pull/308) Backport TravisCI to - GitHub Actions migration ([@turbo87]) -- [emberjs/ember-string] - [#310](https://github.com/emberjs/ember-string/pull/310) Backport release-it - integration ([@turbo87]) - -- [mainmatter/ember-error-route] - [#27](https://github.com/mainmatter/ember-error-route/pull/27) Add support for - custom rootURL values ([@turbo87]) -- [mainmatter/ember-error-route] - [#26](https://github.com/mainmatter/ember-error-route/pull/26) CI: Add deploy - job ([@turbo87]) -- [mainmatter/ember-error-route] - [#29](https://github.com/mainmatter/ember-error-route/pull/29) package.json: - Declare demoURL for EmberObserver ([@turbo87]) -- [mainmatter/ember-error-route] - [#28](https://github.com/mainmatter/ember-error-route/pull/29) GitHub Pages: - Migrate to locationType: history ([@turbo87]) - -- [ember-cli/ember-exam] - [#787](https://github.com/ember-cli/ember-exam/pull/787) ember-try: Fix mocha - scenarios ([@turbo87]) -- [ember-cli/ember-exam] - [#775](https://github.com/ember-cli/ember-exam/pull/775) Delete unused - herp-derp component ([@turbo87]) -- [ember-cli/ember-exam] - [#774](https://github.com/ember-cli/ember-exam/pull/774) Migrate dummy app - templates to use angle bracket invocation syntax ([@turbo87]) -- [ember-cli/ember-exam] - [#769](https://github.com/ember-cli/ember-exam/pull/769) Drop support for - Ember 3.19 and below ([@turbo87]) -- [ember-cli/ember-exam] - [#768](https://github.com/ember-cli/ember-exam/pull/768) Upgrade - ember-cli-addon-docs dependency ([@turbo87]) -- [ember-cli/ember-exam] - [#766](https://github.com/ember-cli/ember-exam/pull/766) CI: Disable failing - ember-release scenario ([@turbo87]) -- [ember-cli/ember-exam] - [#813](https://github.com/ember-cli/ember-exam/pull/813) Use - assert.strictEqual() instead of assert.equal() ([@turbo87]) +- [mainmatter/ember-promise-modals] [#500](https://github.com/mainmatter/ember-promise-modals/pull/500) Specify octane edition in package.json & add missing optional features ([@nickschot]) +- [mainmatter/ember-promise-modals] [#499](https://github.com/mainmatter/ember-promise-modals/pull/499) Update ember-release scenario to use auto-import v2 ([@nickschot]) + +- [nickschot/ember-mobile-menu] [#216](https://github.com/nickschot/ember-mobile-menu/pull/216) add ember-keyboard v7 resolution to fix ember 4+ CI ([@nickschot]) + +- [mainmatter/ember-intl-analyzer] [#447](https://github.com/mainmatter/ember-intl-analyzer/pull/447) Add additional guard to check if at the top of the parent tree and tests ([@mikek2252]) + +- [mansona/ember-cli-notifications] [#328](https://github.com/mansona/ember-cli-notifications/pull/328) Breaking: Update container component ([@pichfl]) +- [mansona/ember-cli-notifications] [#326](https://github.com/mansona/ember-cli-notifications/pull/326) BREAKING: Remove obsolete equals helper ([@pichfl]) +- [mansona/ember-cli-notifications] [#325](https://github.com/mansona/ember-cli-notifications/pull/325) Breaking: Modernize and improve notification message component ([@pichfl]) +- [mansona/ember-cli-notifications] [#324](https://github.com/mansona/ember-cli-notifications/pull/324) Replace overridable icon paths with overridable icon components ([@pichfl]) +- [mansona/ember-cli-notifications] [#327](https://github.com/mansona/ember-cli-notifications/pull/327) move to field-guide ([@mansona]) + +- [empress/ember-cli-showdown] [#109](https://github.com/empress/ember-cli-showdown/pull/109) Add some basic Fastboot testing ([@mansona]) +- [empress/ember-cli-showdown] [#108](https://github.com/empress/ember-cli-showdown/pull/108) feat: Import htmlSafe from @ember/template, not @ember/string. ([@mansona]) + +- [mainmatter/ember-simple-auth] [#2350](https://github.com/mainmatter/ember-simple-auth/pull/2350) Upgrade to qunit 5 ([@candunaj]) +- [mainmatter/ember-simple-auth] [#2349](https://github.com/mainmatter/ember-simple-auth/pull/2349) Fixed failing unit test - invalidate call revoke endpoint twice. Unit test did not validate it correctly. ([@candunaj]) +- [mainmatter/ember-simple-auth] [#2348](https://github.com/mainmatter/ember-simple-auth/pull/2348) Fixed quietly failing unit test because server returned nothing ([@candunaj]) +- [mainmatter/ember-simple-auth] [#2345](https://github.com/mainmatter/ember-simple-auth/pull/2345) Fixed failing unit test - ember/object get function was removed from source code so I have changed unit test accordingly ([@candunaj]) +- [mainmatter/ember-simple-auth] [#2344](https://github.com/mainmatter/ember-simple-auth/pull/2344) In some tests was thrown undefined. ([@candunaj]) +- [mainmatter/ember-simple-auth] [#2343](https://github.com/mainmatter/ember-simple-auth/pull/2343) Allow ember-release to fail ([@candunaj]) +- [mainmatter/ember-simple-auth] [#2342](https://github.com/mainmatter/ember-simple-auth/pull/2342) Fixed 3 readonly tests. ([@candunaj]) +- [mainmatter/ember-simple-auth] [#2353](https://github.com/mainmatter/ember-simple-auth/pull/2353) Fix ember-release + ember-beta build ([@marcoow]) + +- [empress/empress-blog-casper-template] [#50](https://github.com/empress/empress-blog-casper-template/pull/50) remove {{link-to}} calls using positional arguments ([@mansona]) +- [empress/empress-blog] [#150](https://github.com/empress/empress-blog/pull/150) update ember-body-class ([@mansona]) +- [empress/broccoli-static-site-json] [#64](https://github.com/empress/broccoli-static-site-json/pull/64) Support toc yaml ([@mansona]) + +- [mansona/ember-body-class] [#45](https://github.com/mansona/ember-body-class/pull/45) fix ember-body-class for fastboot initial render ([@mansona]) + +- [ember-learn/guides-source] [#1758](https://github.com/ember-learn/guides-source/pull/1758) Replaces EmberArray with tracked property in "Looping through lists" ([@locks]) +- [ember-learn/guides-source] [#1753](https://github.com/ember-learn/guides-source/pull/1753) Ember 4.0 preparation ([@locks]) + +- [emberjs/ember-string] [#309](https://github.com/emberjs/ember-string/pull/309) Fix deprecated import path ([@turbo87]) +- [emberjs/ember-string] [#308](https://github.com/emberjs/ember-string/pull/308) Backport TravisCI to GitHub Actions migration ([@turbo87]) +- [emberjs/ember-string] [#310](https://github.com/emberjs/ember-string/pull/310) Backport release-it integration ([@turbo87]) + +- [mainmatter/ember-error-route] [#27](https://github.com/mainmatter/ember-error-route/pull/27) Add support for custom rootURL values ([@turbo87]) +- [mainmatter/ember-error-route] [#26](https://github.com/mainmatter/ember-error-route/pull/26) CI: Add deploy job ([@turbo87]) +- [mainmatter/ember-error-route] [#29](https://github.com/mainmatter/ember-error-route/pull/29) package.json: Declare demoURL for EmberObserver ([@turbo87]) +- [mainmatter/ember-error-route] [#28](https://github.com/mainmatter/ember-error-route/pull/29) GitHub Pages: Migrate to locationType: history ([@turbo87]) + +- [ember-cli/ember-exam] [#787](https://github.com/ember-cli/ember-exam/pull/787) ember-try: Fix mocha scenarios ([@turbo87]) +- [ember-cli/ember-exam] [#775](https://github.com/ember-cli/ember-exam/pull/775) Delete unused herp-derp component ([@turbo87]) +- [ember-cli/ember-exam] [#774](https://github.com/ember-cli/ember-exam/pull/774) Migrate dummy app templates to use angle bracket invocation syntax ([@turbo87]) +- [ember-cli/ember-exam] [#769](https://github.com/ember-cli/ember-exam/pull/769) Drop support for Ember 3.19 and below ([@turbo87]) +- [ember-cli/ember-exam] [#768](https://github.com/ember-cli/ember-exam/pull/768) Upgrade ember-cli-addon-docs dependency ([@turbo87]) +- [ember-cli/ember-exam] [#766](https://github.com/ember-cli/ember-exam/pull/766) CI: Disable failing ember-release scenario ([@turbo87]) +- [ember-cli/ember-exam] [#813](https://github.com/ember-cli/ember-exam/pull/813) Use assert.strictEqual() instead of assert.equal() ([@turbo87]) ## crates.io -- [rust-lang/crates.io] - [#4284](https://github.com/rust-lang/crates.io/pull/4284) crate.version: Fix - downloads alias ([@turbo87]) -- [rust-lang/crates.io] - [#4276](https://github.com/rust-lang/crates.io/pull/4276) renovate: Adjust - node package handling config ([@turbo87]) -- [rust-lang/crates.io] - [#4268](https://github.com/rust-lang/crates.io/pull/4268) Update - ember-cli-fastboot to v3.2.0-beta.5 ([@turbo87]) -- [rust-lang/crates.io] - [#4267](https://github.com/rust-lang/crates.io/pull/4267) Update Node.js to - v16.13.1 ([@turbo87]) -- [rust-lang/crates.io] - [#4266](https://github.com/rust-lang/crates.io/pull/4266) CrateSidebar: Fix - class name ([@turbo87]) -- [rust-lang/crates.io] - [#4265](https://github.com/rust-lang/crates.io/pull/4265) models/version: Add - missing fetch import ([@turbo87]) -- [rust-lang/crates.io] - [#4264](https://github.com/rust-lang/crates.io/pull/4264) controllers/index: - Fix fetchData() return value ([@turbo87]) -- [rust-lang/crates.io] - [#4261](https://github.com/rust-lang/crates.io/pull/4261) Unpin and update - transitive @ember/string dependency ([@turbo87]) -- [rust-lang/crates.io] - [#4257](https://github.com/rust-lang/crates.io/pull/4257) utils/license: Add - support for parentheses ([@turbo87]) -- [rust-lang/crates.io] - [#4256](https://github.com/rust-lang/crates.io/pull/4256) Pin @ember/string - dependency to v3.0.0 ([@turbo87]) +- [rust-lang/crates.io] [#4284](https://github.com/rust-lang/crates.io/pull/4284) crate.version: Fix downloads alias ([@turbo87]) +- [rust-lang/crates.io] [#4276](https://github.com/rust-lang/crates.io/pull/4276) renovate: Adjust node package handling config ([@turbo87]) +- [rust-lang/crates.io] [#4268](https://github.com/rust-lang/crates.io/pull/4268) Update ember-cli-fastboot to v3.2.0-beta.5 ([@turbo87]) +- [rust-lang/crates.io] [#4267](https://github.com/rust-lang/crates.io/pull/4267) Update Node.js to v16.13.1 ([@turbo87]) +- [rust-lang/crates.io] [#4266](https://github.com/rust-lang/crates.io/pull/4266) CrateSidebar: Fix class name ([@turbo87]) +- [rust-lang/crates.io] [#4265](https://github.com/rust-lang/crates.io/pull/4265) models/version: Add missing fetch import ([@turbo87]) +- [rust-lang/crates.io] [#4264](https://github.com/rust-lang/crates.io/pull/4264) controllers/index: Fix fetchData() return value ([@turbo87]) +- [rust-lang/crates.io] [#4261](https://github.com/rust-lang/crates.io/pull/4261) Unpin and update transitive @ember/string dependency ([@turbo87]) +- [rust-lang/crates.io] [#4257](https://github.com/rust-lang/crates.io/pull/4257) utils/license: Add support for parentheses ([@turbo87]) +- [rust-lang/crates.io] [#4256](https://github.com/rust-lang/crates.io/pull/4256) Pin @ember/string dependency to v3.0.0 ([@turbo87]) ## Mainmatter playbook -- [mainmatter/playbook] [#173](https://github.com/mainmatter/playbook/pull/173) - add metric systems to the list of engineering tools ([@oscard0m]) +- [mainmatter/playbook] [#173](https://github.com/mainmatter/playbook/pull/173) add metric systems to the list of engineering tools ([@oscard0m]) [rust-lang/crates.io]: https://github.com/rust-lang/crates.io/ [ember-cli/ember-cli]: https://github.com/ember-cli/ember-cli/ @@ -206,22 +89,16 @@ [emberjs/ember-string]: https://github.com/emberjs/ember-string/ [ember-learn/guides-source]: https://github.com/ember-learn/guides-source/ [mansona/ember-body-class]: https://github.com/mansona/ember-body-class/ -[empress/broccoli-static-site-json]: - https://github.com/empress/broccoli-static-site-json/ +[empress/broccoli-static-site-json]: https://github.com/empress/broccoli-static-site-json/ [empress/empress-blog]: https://github.com/empress/empress-blog/ -[empress/empress-blog-casper-template]: - https://github.com/empress/empress-blog-casper-template/ +[empress/empress-blog-casper-template]: https://github.com/empress/empress-blog-casper-template/ [empress/ember-cli-showdown]: https://github.com/empress/ember-cli-showdown -[mansona/ember-cli-notifications]: - https://github.com/mansona/ember-cli-notifications -[mainmatter/ember-intl-analyzer]: - https://github.com/mainmatter/ember-intl-analyzer +[mansona/ember-cli-notifications]: https://github.com/mansona/ember-cli-notifications +[mainmatter/ember-intl-analyzer]: https://github.com/mainmatter/ember-intl-analyzer [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals [oscard0m/npm-snapshot]: https://github.com/oscard0m/npm-snapshot -[commitizen/cz-conventional-changelog]: - https://github.com/commitizen/cz-conventional-changelog +[commitizen/cz-conventional-changelog]: https://github.com/commitizen/cz-conventional-changelog [mansona/chris.manson.ie]: https://github.com/mansona/chris.manson.ie [@turbo87]: https://github.com/Turbo87/ [@pichfl]: https://github.com/pichfl/ diff --git a/src/twios/2022-01-24.md b/src/twios/2022-01-24.md index f2ec8c2bfc..41a3225267 100644 --- a/src/twios/2022-01-24.md +++ b/src/twios/2022-01-24.md @@ -1,255 +1,119 @@ ## Rust -- [aprs-parser-rs] [#21](https://github.com/Turbo87/aprs-parser-rs/pull/21) CI: - Enable colored cargo output ([@turbo87]) -- [aprs-parser-rs] [#20](https://github.com/Turbo87/aprs-parser-rs/pull/20) - lonlat: Extract Latitude and Longitude structs ([@turbo87]) -- [aprs-parser-rs] [#15](https://github.com/Turbo87/aprs-parser-rs/pull/15) Add - Cargo.lock file ([@turbo87]) -- [aprs-parser-rs] [#14](https://github.com/Turbo87/aprs-parser-rs/pull/14) - Decrease MSRV to v1.38.0 ([@turbo87]) -- [aprs-parser-rs] [#13](https://github.com/Turbo87/aprs-parser-rs/pull/13) - Replace failure with thiserror ([@turbo87]) -- [aprs-parser-rs] [#12](https://github.com/Turbo87/aprs-parser-rs/pull/12) - cargo clippy ([@turbo87]) -- [aprs-parser-rs] [#11](https://github.com/Turbo87/aprs-parser-rs/pull/11) - cargo fmt ([@turbo87]) -- [aprs-parser-rs] [#10](https://github.com/Turbo87/aprs-parser-rs/pull/10) - Improve CI config ([@turbo87]) -- [aprs-parser-rs] [#9](https://github.com/Turbo87/aprs-parser-rs/pull/9) - Migrate from TravisCI to GitHub Actions ([@turbo87]) - -- [rust-lang/cargo] [#10239](https://github.com/rust-lang/cargo/pull/10239) - timings: Fix tick mark alignment ([@turbo87]) +- [aprs-parser-rs] [#21](https://github.com/Turbo87/aprs-parser-rs/pull/21) CI: Enable colored cargo output ([@turbo87]) +- [aprs-parser-rs] [#20](https://github.com/Turbo87/aprs-parser-rs/pull/20) lonlat: Extract Latitude and Longitude structs ([@turbo87]) +- [aprs-parser-rs] [#15](https://github.com/Turbo87/aprs-parser-rs/pull/15) Add Cargo.lock file ([@turbo87]) +- [aprs-parser-rs] [#14](https://github.com/Turbo87/aprs-parser-rs/pull/14) Decrease MSRV to v1.38.0 ([@turbo87]) +- [aprs-parser-rs] [#13](https://github.com/Turbo87/aprs-parser-rs/pull/13) Replace failure with thiserror ([@turbo87]) +- [aprs-parser-rs] [#12](https://github.com/Turbo87/aprs-parser-rs/pull/12) cargo clippy ([@turbo87]) +- [aprs-parser-rs] [#11](https://github.com/Turbo87/aprs-parser-rs/pull/11) cargo fmt ([@turbo87]) +- [aprs-parser-rs] [#10](https://github.com/Turbo87/aprs-parser-rs/pull/10) Improve CI config ([@turbo87]) +- [aprs-parser-rs] [#9](https://github.com/Turbo87/aprs-parser-rs/pull/9) Migrate from TravisCI to GitHub Actions ([@turbo87]) + +- [rust-lang/cargo] [#10239](https://github.com/rust-lang/cargo/pull/10239) timings: Fix tick mark alignment ([@turbo87]) ## crates.io -- [rust-lang/crates.io] - [#4465](https://github.com/rust-lang/crates.io/pull/4465) Use embroider build - system by default ([@turbo87]) -- [rust-lang/crates.io] - [#4464](https://github.com/rust-lang/crates.io/pull/4464) embroider: Remove - obsolete ember-get-config workaround ([@turbo87]) -- [rust-lang/crates.io] - [#4460](https://github.com/rust-lang/crates.io/pull/4460) Use Volta to pin - Node.js and yarn versions ([@turbo87]) -- [rust-lang/crates.io] - [#4440](https://github.com/rust-lang/crates.io/pull/4440) Use format arguments - capture feature ([@turbo87]) -- [rust-lang/crates.io] - [#4398](https://github.com/rust-lang/crates.io/pull/4398) Replace timekeeper - with @sinonjs/fake-timers ([@turbo87]) -- [rust-lang/crates.io] - [#4397](https://github.com/rust-lang/crates.io/pull/4397) Remove obsolete - /authorize/github route ([@turbo87]) -- [rust-lang/crates.io] - [#4396](https://github.com/rust-lang/crates.io/pull/4396) Extract - cargo-registry-index package ([@turbo87]) -- [rust-lang/crates.io] - [#4384](https://github.com/rust-lang/crates.io/pull/4384) tests: Extract - UpstreamIndex struct ([@turbo87]) -- [rust-lang/crates.io] - [#4382](https://github.com/rust-lang/crates.io/pull/4382) Add support for - keyword:cli and category:no-std search filters ([@turbo87]) -- [rust-lang/crates.io] - [#4381](https://github.com/rust-lang/crates.io/pull/4381) tests/search: Add - test case for query parameter forwarding ([@turbo87]) -- [rust-lang/crates.io] - [#4380](https://github.com/rust-lang/crates.io/pull/4380) mirage: Replace - withMeta() utility function with object spread operator ([@turbo87]) -- [rust-lang/crates.io] - [#4379](https://github.com/rust-lang/crates.io/pull/4379) search: Show "Exact - Match" as regular search result ([@turbo87]) -- [rust-lang/crates.io] - [#4377](https://github.com/rust-lang/crates.io/pull/4377) DownloadGraph: Fix - extra property access ([@turbo87]) -- [rust-lang/crates.io] - [#4368](https://github.com/rust-lang/crates.io/pull/4368) Replace "Toggle - Design" button with new /settings/appearance route ([@turbo87]) -- [rust-lang/crates.io] - [#4367](https://github.com/rust-lang/crates.io/pull/4367) Replace - ember-set-body-class addon ([@turbo87]) -- [rust-lang/crates.io] - [#4366](https://github.com/rust-lang/crates.io/pull/4366) Repository: Use - anyhow errors as return types ([@turbo87]) -- [rust-lang/crates.io] - [#4365](https://github.com/rust-lang/crates.io/pull/4365) Repository: Extract - run_command() function ([@turbo87]) -- [rust-lang/crates.io] - [#4364](https://github.com/rust-lang/crates.io/pull/4364) Repository: Add doc - comments ([@turbo87]) -- [rust-lang/crates.io] - [#4363](https://github.com/rust-lang/crates.io/pull/4363) Repository: Extract - write_temporary_ssh_key() function ([@turbo87]) -- [rust-lang/crates.io] - [#4362](https://github.com/rust-lang/crates.io/pull/4362) Header: Remove - obsolete "Docs" dropdown ([@turbo87]) -- [rust-lang/crates.io] - [#4361](https://github.com/rust-lang/crates.io/pull/4361) Use - postcss-custom-media plugin for breakpoints ([@turbo87]) -- [rust-lang/crates.io] - [#4360](https://github.com/rust-lang/crates.io/pull/4360) Remove "Filter by - letter" feature ([@turbo87]) -- [rust-lang/crates.io] - [#4359](https://github.com/rust-lang/crates.io/pull/4359) Improve search bar - styling ([@turbo87]) -- [rust-lang/crates.io] - [#4357](https://github.com/rust-lang/crates.io/pull/4357) Improve "API Tokens" - settings page ([@turbo87]) -- [rust-lang/crates.io] - [#4356](https://github.com/rust-lang/crates.io/pull/4356) Remove duplicate - GitHub logo SVG ([@turbo87]) -- [rust-lang/crates.io] - [#4351](https://github.com/rust-lang/crates.io/pull/4351) renovate: Disable - dependencyDashboardApproval option ([@turbo87]) -- [rust-lang/crates.io] - [#4316](https://github.com/rust-lang/crates.io/pull/4316) Improve database - fallbacks ([@turbo87]) -- [rust-lang/crates.io] - [#4315](https://github.com/rust-lang/crates.io/pull/4315) Show "This page - requires authentication" page for protected routes if unauthenticated - ([@turbo87]) -- [rust-lang/crates.io] - [#4314](https://github.com/rust-lang/crates.io/pull/4314) catch-all: Fix - broken "Go back" and "Reload" links ([@turbo87]) -- [rust-lang/crates.io] - [#4311](https://github.com/rust-lang/crates.io/pull/4311) Adjust /me - redirection to /settings/tokens ([@turbo87]) +- [rust-lang/crates.io] [#4465](https://github.com/rust-lang/crates.io/pull/4465) Use embroider build system by default ([@turbo87]) +- [rust-lang/crates.io] [#4464](https://github.com/rust-lang/crates.io/pull/4464) embroider: Remove obsolete ember-get-config workaround ([@turbo87]) +- [rust-lang/crates.io] [#4460](https://github.com/rust-lang/crates.io/pull/4460) Use Volta to pin Node.js and yarn versions ([@turbo87]) +- [rust-lang/crates.io] [#4440](https://github.com/rust-lang/crates.io/pull/4440) Use format arguments capture feature ([@turbo87]) +- [rust-lang/crates.io] [#4398](https://github.com/rust-lang/crates.io/pull/4398) Replace timekeeper with @sinonjs/fake-timers ([@turbo87]) +- [rust-lang/crates.io] [#4397](https://github.com/rust-lang/crates.io/pull/4397) Remove obsolete /authorize/github route ([@turbo87]) +- [rust-lang/crates.io] [#4396](https://github.com/rust-lang/crates.io/pull/4396) Extract cargo-registry-index package ([@turbo87]) +- [rust-lang/crates.io] [#4384](https://github.com/rust-lang/crates.io/pull/4384) tests: Extract UpstreamIndex struct ([@turbo87]) +- [rust-lang/crates.io] [#4382](https://github.com/rust-lang/crates.io/pull/4382) Add support for keyword:cli and category:no-std search filters ([@turbo87]) +- [rust-lang/crates.io] [#4381](https://github.com/rust-lang/crates.io/pull/4381) tests/search: Add test case for query parameter forwarding ([@turbo87]) +- [rust-lang/crates.io] [#4380](https://github.com/rust-lang/crates.io/pull/4380) mirage: Replace withMeta() utility function with object spread operator ([@turbo87]) +- [rust-lang/crates.io] [#4379](https://github.com/rust-lang/crates.io/pull/4379) search: Show "Exact Match" as regular search result ([@turbo87]) +- [rust-lang/crates.io] [#4377](https://github.com/rust-lang/crates.io/pull/4377) DownloadGraph: Fix extra property access ([@turbo87]) +- [rust-lang/crates.io] [#4368](https://github.com/rust-lang/crates.io/pull/4368) Replace "Toggle Design" button with new /settings/appearance route ([@turbo87]) +- [rust-lang/crates.io] [#4367](https://github.com/rust-lang/crates.io/pull/4367) Replace ember-set-body-class addon ([@turbo87]) +- [rust-lang/crates.io] [#4366](https://github.com/rust-lang/crates.io/pull/4366) Repository: Use anyhow errors as return types ([@turbo87]) +- [rust-lang/crates.io] [#4365](https://github.com/rust-lang/crates.io/pull/4365) Repository: Extract run_command() function ([@turbo87]) +- [rust-lang/crates.io] [#4364](https://github.com/rust-lang/crates.io/pull/4364) Repository: Add doc comments ([@turbo87]) +- [rust-lang/crates.io] [#4363](https://github.com/rust-lang/crates.io/pull/4363) Repository: Extract write_temporary_ssh_key() function ([@turbo87]) +- [rust-lang/crates.io] [#4362](https://github.com/rust-lang/crates.io/pull/4362) Header: Remove obsolete "Docs" dropdown ([@turbo87]) +- [rust-lang/crates.io] [#4361](https://github.com/rust-lang/crates.io/pull/4361) Use postcss-custom-media plugin for breakpoints ([@turbo87]) +- [rust-lang/crates.io] [#4360](https://github.com/rust-lang/crates.io/pull/4360) Remove "Filter by letter" feature ([@turbo87]) +- [rust-lang/crates.io] [#4359](https://github.com/rust-lang/crates.io/pull/4359) Improve search bar styling ([@turbo87]) +- [rust-lang/crates.io] [#4357](https://github.com/rust-lang/crates.io/pull/4357) Improve "API Tokens" settings page ([@turbo87]) +- [rust-lang/crates.io] [#4356](https://github.com/rust-lang/crates.io/pull/4356) Remove duplicate GitHub logo SVG ([@turbo87]) +- [rust-lang/crates.io] [#4351](https://github.com/rust-lang/crates.io/pull/4351) renovate: Disable dependencyDashboardApproval option ([@turbo87]) +- [rust-lang/crates.io] [#4316](https://github.com/rust-lang/crates.io/pull/4316) Improve database fallbacks ([@turbo87]) +- [rust-lang/crates.io] [#4315](https://github.com/rust-lang/crates.io/pull/4315) Show "This page requires authentication" page for protected routes if unauthenticated ([@turbo87]) +- [rust-lang/crates.io] [#4314](https://github.com/rust-lang/crates.io/pull/4314) catch-all: Fix broken "Go back" and "Reload" links ([@turbo87]) +- [rust-lang/crates.io] [#4311](https://github.com/rust-lang/crates.io/pull/4311) Adjust /me redirection to /settings/tokens ([@turbo87]) ## Ruby -- [rubyforgood/Flaredown] - [#571](https://github.com/rubyforgood/Flaredown/pull/571) fix race condition - on android with google recapcha ([@mansona]) +- [rubyforgood/Flaredown] [#571](https://github.com/rubyforgood/Flaredown/pull/571) fix race condition on android with google recapcha ([@mansona]) ## Ember.js -- [main/ember-error-route] - [#66](https://github.com/mainmatter/ember-error-route/pull/66) Add GitHub - project links ([@turbo87]) -- [mainmatter/ember-error-route] - [#65](https://github.com/mainmatter/ember-error-route/pull/65) README: Add - basic documentation ([@turbo87]) -- [mainmatter/ember-error-route] - [#64](https://github.com/mainmatter/ember-error-route/pull/64) Improved - styling ([@turbo87]) -- [mainmatter/ember-error-route] - [#62](https://github.com/mainmatter/ember-error-route/pull/62) Remove broken - colors@1.4.2 subdependency ([@turbo87]) +- [main/ember-error-route] [#66](https://github.com/mainmatter/ember-error-route/pull/66) Add GitHub project links ([@turbo87]) +- [mainmatter/ember-error-route] [#65](https://github.com/mainmatter/ember-error-route/pull/65) README: Add basic documentation ([@turbo87]) +- [mainmatter/ember-error-route] [#64](https://github.com/mainmatter/ember-error-route/pull/64) Improved styling ([@turbo87]) +- [mainmatter/ember-error-route] [#62](https://github.com/mainmatter/ember-error-route/pull/62) Remove broken colors@1.4.2 subdependency ([@turbo87]) -- [ember-learn/ember-website] - [#887](https://github.com/ember-learn/ember-website/pull/887) Add Ember Europe - Tomster ([@marcoow]) -- [ember-learn/ember-website] - [#886](https://github.com/ember-learn/ember-website/pull/886) v4.1.0 release - ([@locks]) +- [ember-learn/ember-website] [#887](https://github.com/ember-learn/ember-website/pull/887) Add Ember Europe Tomster ([@marcoow]) +- [ember-learn/ember-website] [#886](https://github.com/ember-learn/ember-website/pull/886) v4.1.0 release ([@locks]) -- [emberjs/core-notes] [#437](https://github.com/emberjs/core-notes/pull/437) - [Learning] January 27th, 2022 ([@locks]) -- [emberjs/core-notes] [#432](https://github.com/emberjs/core-notes/pull/432) - [Learning] December 23 meeting ([@locks]) +- [emberjs/core-notes] [#437](https://github.com/emberjs/core-notes/pull/437) [Learning] January 27th, 2022 ([@locks]) +- [emberjs/core-notes] [#432](https://github.com/emberjs/core-notes/pull/432) [Learning] December 23 meeting ([@locks]) -- [emberjs/ember-ordered-set] - [#46](https://github.com/emberjs/ember-ordered-set/pull/46) Update license - file with copyright holders ([@locks]) +- [emberjs/ember-ordered-set] [#46](https://github.com/emberjs/ember-ordered-set/pull/46) Update license file with copyright holders ([@locks]) -- [ember-learn/guides-source] - [#1766](https://github.com/ember-learn/guides-source/pull/1766) Use service - named import instead of inject ([@locks]) -- [ember-learn/guides-source] - [#1764](https://github.com/ember-learn/guides-source/pull/1764) v4.1.0 - ([@locks]) +- [ember-learn/guides-source] [#1766](https://github.com/ember-learn/guides-source/pull/1766) Use service named import instead of inject ([@locks]) +- [ember-learn/guides-source] [#1764](https://github.com/ember-learn/guides-source/pull/1764) v4.1.0 ([@locks]) -- [ember-learn/ember-blog] - [#1084](https://github.com/ember-learn/ember-blog/pull/1084) Delete - .node-version ([@mansona]) -- [ember-learn/ember-blog] - [#1082](https://github.com/ember-learn/ember-blog/pull/1082) Update - empress-blog template to fix build ([@mansona]) -- [ember-learn/ember-blog] - [#1081](https://github.com/ember-learn/ember-blog/pull/1081) Update Github CI - ([@mansona]) +- [ember-learn/ember-blog] [#1084](https://github.com/ember-learn/ember-blog/pull/1084) Delete .node-version ([@mansona]) +- [ember-learn/ember-blog] [#1082](https://github.com/ember-learn/ember-blog/pull/1082) Update empress-blog template to fix build ([@mansona]) +- [ember-learn/ember-blog] [#1081](https://github.com/ember-learn/ember-blog/pull/1081) Update Github CI ([@mansona]) -- [ember-learn/empress-blog-ember-template] - [#118](https://github.com/ember-learn/empress-blog-ember-template/pull/118) - simplify github ci ([@mansona]) -- [ember-learn/empress-blog-ember-template] - [#117](https://github.com/ember-learn/empress-blog-ember-template/pull/117) - Breaking: Drop Node 10 and upgrade Ember ([@mansona]) +- [ember-learn/empress-blog-ember-template] [#118](https://github.com/ember-learn/empress-blog-ember-template/pull/118) simplify github ci ([@mansona]) +- [ember-learn/empress-blog-ember-template] [#117](https://github.com/ember-learn/empress-blog-ember-template/pull/117) Breaking: Drop Node 10 and upgrade Ember ([@mansona]) -- [ember-learn/ember-styleguide] - [#412](https://github.com/ember-learn/ember-styleguide/pull/412) Breaking: - drop support for Node 10, update ember to 3.28, and remove deprecations - ([@mansona]) +- [ember-learn/ember-styleguide] [#412](https://github.com/ember-learn/ember-styleguide/pull/412) Breaking: drop support for Node 10, update ember to 3.28, and remove deprecations ([@mansona]) -- [empress/field-guide] [#53](https://github.com/empress/field-guide/pull/53) - Support Embroider ([@mansona]) -- [empress/field-guide] [#52](https://github.com/empress/field-guide/pull/52) - Support Ember 4 ([@mansona]) -- [empress/field-guide] [#51](https://github.com/empress/field-guide/pull/51) - bring github ci workflow in line with blueprint and update some dependencies - ([@mansona]) +- [empress/field-guide] [#53](https://github.com/empress/field-guide/pull/53) Support Embroider ([@mansona]) +- [empress/field-guide] [#52](https://github.com/empress/field-guide/pull/52) Support Ember 4 ([@mansona]) +- [empress/field-guide] [#51](https://github.com/empress/field-guide/pull/51) bring github ci workflow in line with blueprint and update some dependencies ([@mansona]) -- [empress/ember-showdown-prism] - [#20](https://github.com/empress/ember-showdown-prism/pull/20) update with - ember-cli-update to 3.28 ([@mansona]) -- [empress/ember-showdown-prism] - [#19](https://github.com/empress/ember-showdown-prism/pull/19) add a basic - test ([@mansona]) -- [empress/ember-showdown-prism] - [#18](https://github.com/empress/ember-showdown-prism/pull/18) Breaking: drop - Node 10 and unify github ci workflow with blueprint ([@mansona]) +- [empress/ember-showdown-prism] [#20](https://github.com/empress/ember-showdown-prism/pull/20) update with ember-cli-update to 3.28 ([@mansona]) +- [empress/ember-showdown-prism] [#19](https://github.com/empress/ember-showdown-prism/pull/19) add a basic test ([@mansona]) +- [empress/ember-showdown-prism] [#18](https://github.com/empress/ember-showdown-prism/pull/18) Breaking: drop Node 10 and unify github ci workflow with blueprint ([@mansona]) -- [emberjs/ember.js] [#19883](https://github.com/emberjs/ember.js/pull/19883) - [BUGFIX beta] Fix URL for deprecation deprecate-auto-location ([@locks]) +- [emberjs/ember.js] [#19883](https://github.com/emberjs/ember.js/pull/19883) [BUGFIX beta] Fix URL for deprecation deprecate-auto-location ([@locks]) -- [Authmaker/authmaker-ember-simple-auth] - [#33](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/33) Update - Ember to 3.20 ([@mansona]) -- [Authmaker/authmaker-ember-simple-auth] - [#32](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/32) - Breaking: drop support for Node < 12 and move from Travis to Github CI - ([@mansona]) -- [Authmaker/authmaker-ember-simple-auth] - [#31](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/31) Add - tests ([@mansona]) +- [Authmaker/authmaker-ember-simple-auth] [#33](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/33) Update Ember to 3.20 ([@mansona]) +- [Authmaker/authmaker-ember-simple-auth] [#32](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/32) Breaking: drop support for Node < 12 and move from Travis to Github CI ([@mansona]) +- [Authmaker/authmaker-ember-simple-auth] [#31](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/31) Add tests ([@mansona]) -- [ember-cli/ember-cli] - [#9760](https://github.com/ember-cli/ember-cli/pull/9760) Add timeout-minutes - to github CI jobs ([@mansona]) +- [ember-cli/ember-cli] [#9760](https://github.com/ember-cli/ember-cli/pull/9760) Add timeout-minutes to github CI jobs ([@mansona]) ## JavaScript -- [mansona/lint-to-the-future-eslint] - [#3](https://github.com/mansona/lint-to-the-future-eslint/pull/3) Fix issue - with caret dependency of eslint and add a test to verify ignore works - ([@mansona]) -- [TelemetryDeck/JavaScriptSDK] - [#2](https://github.com/TelemetryDeck/JavaScriptSDK/pull/2) Allow loading of - script to be deferred ([@pichfl]) -- [TelemetryDeck/JavaScriptSDK] - [#1](https://github.com/TelemetryDeck/JavaScriptSDK/pull/1) Initial release - ([@pichfl]) +- [mansona/lint-to-the-future-eslint] [#3](https://github.com/mansona/lint-to-the-future-eslint/pull/3) Fix issue with caret dependency of eslint and add a test to verify ignore works ([@mansona]) +- [TelemetryDeck/JavaScriptSDK] [#2](https://github.com/TelemetryDeck/JavaScriptSDK/pull/2) Allow loading of script to be deferred ([@pichfl]) +- [TelemetryDeck/JavaScriptSDK] [#1](https://github.com/TelemetryDeck/JavaScriptSDK/pull/1) Initial release ([@pichfl]) [rust-lang/crates.io]: https://github.com/rust-lang/crates.io/ [rust-lang/crates.io]: https://github.com/rust-lang/crates.io/ [rubyforgood/flaredown]: https://github.com/rubyforgood/Flaredown/ -[mansona/lint-to-the-future-eslint]: - https://github.com/mansona/lint-to-the-future-eslint/ +[mansona/lint-to-the-future-eslint]: https://github.com/mansona/lint-to-the-future-eslint/ [telemetrydeck/javascriptsdk]: https://github.com/TelemetryDeck/JavaScriptSDK/ [rust-lang/cargo]: https://github.com/rust-lang/cargo/ [ember-learn/ember-website]: https://github.com/ember-learn/ember-website/ [emberjs/core-notes]: https://github.com/emberjs/core-notes/ [emberjs/ember-ordered-set]: https://github.com/emberjs/ember-ordered-set/ [ember-learn/ember-blog]: https://github.com/ember-learn/ember-blog/ -[ember-learn/empress-blog-ember-template]: - https://github.com/ember-learn/empress-blog-ember-template/ +[ember-learn/empress-blog-ember-template]: https://github.com/ember-learn/empress-blog-ember-template/ [ember-learn/ember-styleguide]: https://github.com/ember-learn/ember-styleguide/ [empress/ember-showdown-prism]: https://github.com/empress/ember-showdown-prism/ [empress/field-guide]: https://github.com/empress/field-guide/ [emberjs/ember.js]: https://github.com/emberjs/ember.js/ -[authmaker/authmaker-ember-simple-auth]: - https://github.com/Authmaker/authmaker-ember-simple-auth/ +[authmaker/authmaker-ember-simple-auth]: https://github.com/Authmaker/authmaker-ember-simple-auth/ [aprs-parser-rs]: https://github.com/aprs-parser-rs/ [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth/ [mainmatter/playbook]: https://github.com/mainmatter/playbook/ @@ -258,22 +122,16 @@ [emberjs/ember-string]: https://github.com/emberjs/ember-string/ [ember-learn/guides-source]: https://github.com/ember-learn/guides-source/ [mansona/ember-body-class]: https://github.com/mansona/ember-body-class/ -[empress/broccoli-static-site-json]: - https://github.com/empress/broccoli-static-site-json/ +[empress/broccoli-static-site-json]: https://github.com/empress/broccoli-static-site-json/ [empress/empress-blog]: https://github.com/empress/empress-blog/ -[empress/empress-blog-casper-template]: - https://github.com/empress/empress-blog-casper-template/ +[empress/empress-blog-casper-template]: https://github.com/empress/empress-blog-casper-template/ [empress/ember-cli-showdown]: https://github.com/empress/ember-cli-showdown -[mansona/ember-cli-notifications]: - https://github.com/mansona/ember-cli-notifications -[mainmatter/ember-intl-analyzer]: - https://github.com/mainmatter/ember-intl-analyzer +[mansona/ember-cli-notifications]: https://github.com/mansona/ember-cli-notifications +[mainmatter/ember-intl-analyzer]: https://github.com/mainmatter/ember-intl-analyzer [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals [oscard0m/npm-snapshot]: https://github.com/oscard0m/npm-snapshot -[commitizen/cz-conventional-changelog]: - https://github.com/commitizen/cz-conventional-changelog +[commitizen/cz-conventional-changelog]: https://github.com/commitizen/cz-conventional-changelog [mansona/chris.manson.ie]: https://github.com/mansona/chris.manson.ie [@turbo87]: https://github.com/Turbo87/ [@pichfl]: https://github.com/pichfl/ diff --git a/src/twios/2022-02-07.md b/src/twios/2022-02-07.md index a93ee17746..ec421eab2c 100644 --- a/src/twios/2022-02-07.md +++ b/src/twios/2022-02-07.md @@ -1,162 +1,72 @@ ## Atom -- [atom/atom] [#23540](https://github.com/atom/atom/pull/23540) Bump Electron - Version ([@mansona]) -- [atom/keyboard-layout] [#63](https://github.com/atom/keyboard-layout/pull/63) - Update nan ([@mansona]) -- [mansona/fuzzy-native] [#1](https://github.com/mansona/fuzzy-native/pull/1) - move from travis to github ci ([@mansona]) -- [mansona/keyboard-layout] - [#1](https://github.com/mansona/keyboard-layout/pull/1) Gyp test ([@mansona]) -- [mansona/node-pathwatcher] - [#1](https://github.com/mansona/node-pathwatcher/pull/1) Configure - node-pre-gyp ([@mansona]) +- [atom/atom] [#23540](https://github.com/atom/atom/pull/23540) Bump Electron Version ([@mansona]) +- [atom/keyboard-layout] [#63](https://github.com/atom/keyboard-layout/pull/63) Update nan ([@mansona]) +- [mansona/fuzzy-native] [#1](https://github.com/mansona/fuzzy-native/pull/1) move from travis to github ci ([@mansona]) +- [mansona/keyboard-layout] [#1](https://github.com/mansona/keyboard-layout/pull/1) Gyp test ([@mansona]) +- [mansona/node-pathwatcher] [#1](https://github.com/mansona/node-pathwatcher/pull/1) Configure node-pre-gyp ([@mansona]) ## Ember.js -- [Authmaker/authmaker-ember-simple-auth] - [#35](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/35) Fix - deprecations and support Ember 4.0 ([@mansona]) -- [Authmaker/authmaker-ember-simple-auth] - [#34](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/34) - Breaking: drop support for Ember < 3.16 and update with ember-cli-update - ([@mansona]) -- [ember-cli/ember-cli] - [#9778](https://github.com/ember-cli/ember-cli/pull/9778) Prune lodash - dependencies ([@locks]) -- [ember-cli/ember-cli] - [#9769](https://github.com/ember-cli/ember-cli/pull/9769) Update markdown-it - to v12.3.2 to address vulnerabiliity ([@locks]) -- [ember-engines/ember-engines] - [#798](https://github.com/ember-engines/ember-engines/pull/798) Ember 4 - compatibility ([@BobrImperator]) -- [ember-engines/ember-engines] - [#797](https://github.com/ember-engines/ember-engines/pull/797) Update to - ember qunit 5 ([@BobrImperator]) -- [ember-learn/deprecation-app] - [#1074](https://github.com/ember-learn/deprecation-app/pull/1074) Fix broken - markdown links due to formatting ([@locks]) -- [ember-learn/deprecation-app] - [#1069](https://github.com/ember-learn/deprecation-app/pull/1069) Improving - doc for deprecation "deprecated-run-loop-and-computed-dot-a… ([@locks]) -- [ember-learn/ember-api-docs] - [#791](https://github.com/ember-learn/ember-api-docs/pull/791) Fix search - ([@mansona]) -- [ember-learn/ember-blog] - [#1096](https://github.com/ember-learn/ember-blog/pull/1096) Update - the-ember-times-issue-195.md ([@locks]) -- [ember-learn/ember-cli-addon-docs] - [#1108](https://github.com/ember-learn/ember-cli-addon-docs/pull/1108) Fix no - implicit this deprecation in docs-demo component ([@nickschot]) -- [ember-learn/ember-website] - [#891](https://github.com/ember-learn/ember-website/pull/891) Fix team name - ([@locks]) -- [ember-learn/handbook] [#60](https://github.com/ember-learn/handbook/pull/60) - Update team leadership as agreed during meeting ([@locks]) -- [emberjs/core-notes] [#438](https://github.com/emberjs/core-notes/pull/438) - [learning] February 3rd, 2022 ([@locks]) -- [emberjs/data] [#7855](https://github.com/emberjs/data/pull/7855) wip RFC - 332 - implement Record Links & Meta ([@mansona]) -- [nickschot/ember-mobile-menu] - [#239](https://github.com/nickschot/ember-mobile-menu/pull/239) Upgrade to - ember-cli 4.1 ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#238](https://github.com/nickschot/ember-mobile-menu/pull/238) Revert - "Prevent open/close from being triggered a huge amount of times when - unnecessary" ([@nickschot]) -- [mainmatter/ember-hbs-minifier] - [#419](https://github.com/mainmatter/ember-hbs-minifier/pull/419) ember-try: - Disable Ember.js 4.x scenarios ([@Turbo87]) -- [mainmatter/ember-hbs-minifier] - [#418](https://github.com/mainmatter/ember-hbs-minifier/pull/418) CI: Remove - schedule trigger ([@Turbo87]) -- [mainmatter/ember-promise-modals] - [#526](https://github.com/mainmatter/ember-promise-modals/pull/526) Expose - `focusTrapOptions` ([@zeppelin]) -- [mainmatter/ember-promise-modals] - [#533](https://github.com/mainmatter/ember-promise-modals/pull/533) Legacy: - Downgrade native class to Ember.Object ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#531](https://github.com/mainmatter/ember-promise-modals/pull/531) Update - dependencies ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#530](https://github.com/mainmatter/ember-promise-modals/pull/530) Internal: - Extend and apply prettier configuration ([@pichfl]) -- [mainmatter/qunit-dom] - [#1434](https://github.com/mainmatter/qunit-dom/pull/1434) Revert "Update - embroider monorepo to v0.50.2 (minor)" ([@Turbo87]) -- [sir-dunxalot/ember-tooltips] - [#439](https://github.com/sir-dunxalot/ember-tooltips/pull/439) Remove - `assign()` usage ([@Turbo87]) +- [Authmaker/authmaker-ember-simple-auth] [#35](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/35) Fix deprecations and support Ember 4.0 ([@mansona]) +- [Authmaker/authmaker-ember-simple-auth] [#34](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/34) Breaking: drop support for Ember < 3.16 and update with ember-cli-update ([@mansona]) +- [ember-cli/ember-cli] [#9778](https://github.com/ember-cli/ember-cli/pull/9778) Prune lodash dependencies ([@locks]) +- [ember-cli/ember-cli] [#9769](https://github.com/ember-cli/ember-cli/pull/9769) Update markdown-it to v12.3.2 to address vulnerabiliity ([@locks]) +- [ember-engines/ember-engines] [#798](https://github.com/ember-engines/ember-engines/pull/798) Ember 4 compatibility ([@BobrImperator]) +- [ember-engines/ember-engines] [#797](https://github.com/ember-engines/ember-engines/pull/797) Update to ember qunit 5 ([@BobrImperator]) +- [ember-learn/deprecation-app] [#1074](https://github.com/ember-learn/deprecation-app/pull/1074) Fix broken markdown links due to formatting ([@locks]) +- [ember-learn/deprecation-app] [#1069](https://github.com/ember-learn/deprecation-app/pull/1069) Improving doc for deprecation "deprecated-run-loop-and-computed-dot-a… ([@locks]) +- [ember-learn/ember-api-docs] [#791](https://github.com/ember-learn/ember-api-docs/pull/791) Fix search ([@mansona]) +- [ember-learn/ember-blog] [#1096](https://github.com/ember-learn/ember-blog/pull/1096) Update the-ember-times-issue-195.md ([@locks]) +- [ember-learn/ember-cli-addon-docs] [#1108](https://github.com/ember-learn/ember-cli-addon-docs/pull/1108) Fix no implicit this deprecation in docs-demo component ([@nickschot]) +- [ember-learn/ember-website] [#891](https://github.com/ember-learn/ember-website/pull/891) Fix team name ([@locks]) +- [ember-learn/handbook] [#60](https://github.com/ember-learn/handbook/pull/60) Update team leadership as agreed during meeting ([@locks]) +- [emberjs/core-notes] [#438](https://github.com/emberjs/core-notes/pull/438) [learning] February 3rd, 2022 ([@locks]) +- [emberjs/data] [#7855](https://github.com/emberjs/data/pull/7855) wip RFC 332 - implement Record Links & Meta ([@mansona]) +- [nickschot/ember-mobile-menu] [#239](https://github.com/nickschot/ember-mobile-menu/pull/239) Upgrade to ember-cli 4.1 ([@nickschot]) +- [nickschot/ember-mobile-menu] [#238](https://github.com/nickschot/ember-mobile-menu/pull/238) Revert "Prevent open/close from being triggered a huge amount of times when unnecessary" ([@nickschot]) +- [mainmatter/ember-hbs-minifier] [#419](https://github.com/mainmatter/ember-hbs-minifier/pull/419) ember-try: Disable Ember.js 4.x scenarios ([@Turbo87]) +- [mainmatter/ember-hbs-minifier] [#418](https://github.com/mainmatter/ember-hbs-minifier/pull/418) CI: Remove schedule trigger ([@Turbo87]) +- [mainmatter/ember-promise-modals] [#526](https://github.com/mainmatter/ember-promise-modals/pull/526) Expose `focusTrapOptions` ([@zeppelin]) +- [mainmatter/ember-promise-modals] [#533](https://github.com/mainmatter/ember-promise-modals/pull/533) Legacy: Downgrade native class to Ember.Object ([@pichfl]) +- [mainmatter/ember-promise-modals] [#531](https://github.com/mainmatter/ember-promise-modals/pull/531) Update dependencies ([@pichfl]) +- [mainmatter/ember-promise-modals] [#530](https://github.com/mainmatter/ember-promise-modals/pull/530) Internal: Extend and apply prettier configuration ([@pichfl]) +- [mainmatter/qunit-dom] [#1434](https://github.com/mainmatter/qunit-dom/pull/1434) Revert "Update embroider monorepo to v0.50.2 (minor)" ([@Turbo87]) +- [sir-dunxalot/ember-tooltips] [#439](https://github.com/sir-dunxalot/ember-tooltips/pull/439) Remove `assign()` usage ([@Turbo87]) ## JavaScript -- [mansona/lint-to-the-future] - [#18](https://github.com/mansona/lint-to-the-future/pull/18) Update README.md - ([@locks]) -- [mansona/lint-to-the-future] - [#19](https://github.com/mansona/lint-to-the-future/pull/19) Add tests & fix - bug with view files route ([@mansona]) +- [mansona/lint-to-the-future] [#18](https://github.com/mansona/lint-to-the-future/pull/18) Update README.md ([@locks]) +- [mansona/lint-to-the-future] [#19](https://github.com/mansona/lint-to-the-future/pull/19) Add tests & fix bug with view files route ([@mansona]) ## Ruby -- [HaughtCodeworks/cfp-app] - [#238](https://github.com/HaughtCodeworks/cfp-app/pull/238) Update - dependencies ([@locks]) -- [Project-NISEI/cobra] [#47](https://github.com/Project-NISEI/cobra/pull/47) - Improve CI ([@locks]) -- [Project-NISEI/cobra] [#46](https://github.com/Project-NISEI/cobra/pull/46) - Remove support for importing from TOME ([@locks]) -- [Project-NISEI/cobra] [#43](https://github.com/Project-NISEI/cobra/pull/43) - [WIP] Set up CI workflow ([@locks]) -- [Project-NISEI/cobra] [#38](https://github.com/Project-NISEI/cobra/pull/38) - Upgrade ruby 3 rails 7 ([@locks]) -- [tildeio/cfp-app] [#83](https://github.com/tildeio/cfp-app/pull/83) Set up - rack-attack ([@locks]) -- [tildeio/cfp-app] [#82](https://github.com/tildeio/cfp-app/pull/82) adjusted - bundle frozen configuration per deprecation warning ([@locks]) -- [tildeio/cfp-app] [#71](https://github.com/tildeio/cfp-app/pull/71) Update - omniauth-github ([@locks]) -- [tildeio/cfp-app] [#68](https://github.com/tildeio/cfp-app/pull/68) - Update-dependencies ([@locks]) +- [HaughtCodeworks/cfp-app] [#238](https://github.com/HaughtCodeworks/cfp-app/pull/238) Update dependencies ([@locks]) +- [Project-NISEI/cobra] [#47](https://github.com/Project-NISEI/cobra/pull/47) Improve CI ([@locks]) +- [Project-NISEI/cobra] [#46](https://github.com/Project-NISEI/cobra/pull/46) Remove support for importing from TOME ([@locks]) +- [Project-NISEI/cobra] [#43](https://github.com/Project-NISEI/cobra/pull/43) [WIP] Set up CI workflow ([@locks]) +- [Project-NISEI/cobra] [#38](https://github.com/Project-NISEI/cobra/pull/38) Upgrade ruby 3 rails 7 ([@locks]) +- [tildeio/cfp-app] [#83](https://github.com/tildeio/cfp-app/pull/83) Set up rack-attack ([@locks]) +- [tildeio/cfp-app] [#82](https://github.com/tildeio/cfp-app/pull/82) adjusted bundle frozen configuration per deprecation warning ([@locks]) +- [tildeio/cfp-app] [#71](https://github.com/tildeio/cfp-app/pull/71) Update omniauth-github ([@locks]) +- [tildeio/cfp-app] [#68](https://github.com/tildeio/cfp-app/pull/68) Update-dependencies ([@locks]) ## Rust -- [exercism/rust] [#1443](https://github.com/exercism/rust/pull/1443) - chore(rust): use capital letters for 'API' exercise ([@oscard0m]) +- [exercism/rust] [#1443](https://github.com/exercism/rust/pull/1443) chore(rust): use capital letters for 'API' exercise ([@oscard0m]) ## crates.io -- [rust-lang/crates.io] - [#4514](https://github.com/rust-lang/crates.io/pull/4514) Ember: Use `history` - location API ([@Turbo87]) -- [rust-lang/crates.io] - [#4507](https://github.com/rust-lang/crates.io/pull/4507) Fix `keyword` route - links ([@Turbo87]) -- [rust-lang/crates.io] - [#4496](https://github.com/rust-lang/crates.io/pull/4496) EncodableCrate: - Simplify `from_minimal()` method ([@Turbo87]) -- [rust-lang/crates.io] - [#4481](https://github.com/rust-lang/crates.io/pull/4481) keyword: Show error - page if data loading fails ([@Turbo87]) -- [rust-lang/crates.io] - [#4480](https://github.com/rust-lang/crates.io/pull/4480) category: Show error - page if data loading fails ([@Turbo87]) -- [rust-lang/crates.io] - [#4479](https://github.com/rust-lang/crates.io/pull/4479) - crate.version-dependencies: Show error page if data loading fails ([@Turbo87]) -- [rust-lang/crates.io] - [#4477](https://github.com/rust-lang/crates.io/pull/4477) Adjust error page - titles ([@Turbo87]) -- [rust-lang/crates.io] - [#4476](https://github.com/rust-lang/crates.io/pull/4476) crate.range: Show - error page if data fails to load ([@Turbo87]) -- [rust-lang/crates.io] - [#4475](https://github.com/rust-lang/crates.io/pull/4475) Disable `crypto` - import warning in `axe-core` ([@Turbo87]) -- [rust-lang/crates.io] - [#4474](https://github.com/rust-lang/crates.io/pull/4474) Remove obsolete - `ember-keyboard` options ([@Turbo87]) +- [rust-lang/crates.io] [#4514](https://github.com/rust-lang/crates.io/pull/4514) Ember: Use `history` location API ([@Turbo87]) +- [rust-lang/crates.io] [#4507](https://github.com/rust-lang/crates.io/pull/4507) Fix `keyword` route links ([@Turbo87]) +- [rust-lang/crates.io] [#4496](https://github.com/rust-lang/crates.io/pull/4496) EncodableCrate: Simplify `from_minimal()` method ([@Turbo87]) +- [rust-lang/crates.io] [#4481](https://github.com/rust-lang/crates.io/pull/4481) keyword: Show error page if data loading fails ([@Turbo87]) +- [rust-lang/crates.io] [#4480](https://github.com/rust-lang/crates.io/pull/4480) category: Show error page if data loading fails ([@Turbo87]) +- [rust-lang/crates.io] [#4479](https://github.com/rust-lang/crates.io/pull/4479) crate.version-dependencies: Show error page if data loading fails ([@Turbo87]) +- [rust-lang/crates.io] [#4477](https://github.com/rust-lang/crates.io/pull/4477) Adjust error page titles ([@Turbo87]) +- [rust-lang/crates.io] [#4476](https://github.com/rust-lang/crates.io/pull/4476) crate.range: Show error page if data fails to load ([@Turbo87]) +- [rust-lang/crates.io] [#4475](https://github.com/rust-lang/crates.io/pull/4475) Disable `crypto` import warning in `axe-core` ([@Turbo87]) +- [rust-lang/crates.io] [#4474](https://github.com/rust-lang/crates.io/pull/4474) Remove obsolete `ember-keyboard` options ([@Turbo87]) [@bobrimperator]: https://github.com/BobrImperator [@turbo87]: https://github.com/Turbo87 @@ -166,8 +76,7 @@ [@oscard0m]: https://github.com/oscard0m [@pichfl]: https://github.com/pichfl [@zeppelin]: https://github.com/zeppelin -[authmaker/authmaker-ember-simple-auth]: - https://github.com/Authmaker/authmaker-ember-simple-auth +[authmaker/authmaker-ember-simple-auth]: https://github.com/Authmaker/authmaker-ember-simple-auth [haughtcodeworks/cfp-app]: https://github.com/HaughtCodeworks/cfp-app [project-nisei/cobra]: https://github.com/Project-NISEI/cobra [atom/atom]: https://github.com/atom/atom @@ -177,8 +86,7 @@ [ember-learn/deprecation-app]: https://github.com/ember-learn/deprecation-app [ember-learn/ember-api-docs]: https://github.com/ember-learn/ember-api-docs [ember-learn/ember-blog]: https://github.com/ember-learn/ember-blog -[ember-learn/ember-cli-addon-docs]: - https://github.com/ember-learn/ember-cli-addon-docs +[ember-learn/ember-cli-addon-docs]: https://github.com/ember-learn/ember-cli-addon-docs [ember-learn/ember-website]: https://github.com/ember-learn/ember-website [ember-learn/handbook]: https://github.com/ember-learn/handbook [emberjs/core-notes]: https://github.com/emberjs/core-notes @@ -191,13 +99,10 @@ [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu [oscard0m/web]: https://github.com/oscard0m/web [rust-lang/crates.io]: https://github.com/rust-lang/crates.io -[mainmatter/ember-hbs-minifier]: - https://github.com/mainmatter/ember-hbs-minifier -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals +[mainmatter/ember-hbs-minifier]: https://github.com/mainmatter/ember-hbs-minifier +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals [mainmatter/qunit-dom]: https://github.com/mainmatter/qunit-dom -[mainmatter/mainmatter.github.io]: - https://github.com/mainmatter/mainmatter.github.io +[mainmatter/mainmatter.github.io]: https://github.com/mainmatter/mainmatter.github.io [sir-dunxalot/ember-tooltips]: https://github.com/sir-dunxalot/ember-tooltips [tildeio/cfp-app]: https://github.com/tildeio/cfp-app [contact]: /contact/ diff --git a/src/twios/2022-02-22.md b/src/twios/2022-02-22.md index 56cc7d1836..6edc48fd9f 100644 --- a/src/twios/2022-02-22.md +++ b/src/twios/2022-02-22.md @@ -1,83 +1,35 @@ ## Ember.js -- [ember-cli/ember-cli] - [#9790](https://github.com/ember-cli/ember-cli/pull/9790) Upgrade - broccoli-merge-trees ([@locks]) -- [ember-cli/ember-cli] - [#9784](https://github.com/ember-cli/ember-cli/pull/9784) Unskip tests - ([@locks]) -- [ember-learn/deprecation-app] - [#1078](https://github.com/ember-learn/deprecation-app/pull/1078) Update - dependencies ([@locks]) -- [ember-learn/ember-website] - [#896](https://github.com/ember-learn/ember-website/pull/896) Adding IE11 to - compilation targets ([@locks]) -- [mainmatter/ember-hbs-minifier] - [#460](https://github.com/mainmatter/ember-hbs-minifier/pull/460) Replace - deprecated class-based AST transform plugin ([@Turbo87]) -- [mainmatter/ember-hbs-minifier] - [#459](https://github.com/mainmatter/ember-hbs-minifier/pull/459) Enable Ember - Octane features ([@Turbo87]) -- [mainmatter/ember-hbs-minifier] - [#458](https://github.com/mainmatter/ember-hbs-minifier/pull/458) Add - `ember-auto-import` dev dependency ([@Turbo87]) -- [mainmatter/ember-hbs-minifier] - [#457](https://github.com/mainmatter/ember-hbs-minifier/pull/457) Remove - unused `ember-cli-htmlbars-inline-precompile` dependency ([@Turbo87]) -- [mainmatter/ember-hbs-minifier] - [#451](https://github.com/mainmatter/ember-hbs-minifier/pull/451) renovate: - Update `pnpm` version automatically ([@Turbo87]) -- [mainmatter/ember-hbs-minifier] - [#447](https://github.com/mainmatter/ember-hbs-minifier/pull/447) Replace - Mocha with QUnit ([@Turbo87]) -- [mainmatter/ember-hbs-minifier] - [#446](https://github.com/mainmatter/ember-hbs-minifier/pull/446) renovate: - Disable for `@glimmer/syntax-*` dependencies ([@Turbo87]) -- [mainmatter/ember-hbs-minifier] - [#425](https://github.com/mainmatter/ember-hbs-minifier/pull/425) Update - `ember-try` to v2 ([@Turbo87]) -- [mainmatter/ember-hbs-minifier] - [#424](https://github.com/mainmatter/ember-hbs-minifier/pull/424) Use `pnpm` - package manager ([@Turbo87]) -- [mainmatter/ember-hbs-minifier] - [#423](https://github.com/mainmatter/ember-hbs-minifier/pull/423) Remove - unmaintained `multidep` dependency ([@Turbo87]) -- [mainmatter/ember-promise-modals] - [#549](https://github.com/mainmatter/ember-promise-modals/pull/549) Enhance - focus trap configuration ([@zeppelin]) -- [mainmatter/ember-promise-modals] - [#550](https://github.com/mainmatter/ember-promise-modals/pull/550) Modal - template helper ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#543](https://github.com/mainmatter/ember-promise-modals/pull/543) Revert - #533 ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#548](https://github.com/mainmatter/ember-promise-modals/pull/548) WIP: - Enable Ember 2.18 CI scenario ([@nickschot]) -- [mainmatter/ember-test-selectors] - [#889](https://github.com/mainmatter/ember-test-selectors/pull/889) renovate: - Update `pnpm` version automatically ([@Turbo87]) +- [ember-cli/ember-cli] [#9790](https://github.com/ember-cli/ember-cli/pull/9790) Upgrade broccoli-merge-trees ([@locks]) +- [ember-cli/ember-cli] [#9784](https://github.com/ember-cli/ember-cli/pull/9784) Unskip tests ([@locks]) +- [ember-learn/deprecation-app] [#1078](https://github.com/ember-learn/deprecation-app/pull/1078) Update dependencies ([@locks]) +- [ember-learn/ember-website] [#896](https://github.com/ember-learn/ember-website/pull/896) Adding IE11 to compilation targets ([@locks]) +- [mainmatter/ember-hbs-minifier] [#460](https://github.com/mainmatter/ember-hbs-minifier/pull/460) Replace deprecated class-based AST transform plugin ([@Turbo87]) +- [mainmatter/ember-hbs-minifier] [#459](https://github.com/mainmatter/ember-hbs-minifier/pull/459) Enable Ember Octane features ([@Turbo87]) +- [mainmatter/ember-hbs-minifier] [#458](https://github.com/mainmatter/ember-hbs-minifier/pull/458) Add `ember-auto-import` dev dependency ([@Turbo87]) +- [mainmatter/ember-hbs-minifier] [#457](https://github.com/mainmatter/ember-hbs-minifier/pull/457) Remove unused `ember-cli-htmlbars-inline-precompile` dependency ([@Turbo87]) +- [mainmatter/ember-hbs-minifier] [#451](https://github.com/mainmatter/ember-hbs-minifier/pull/451) renovate: Update `pnpm` version automatically ([@Turbo87]) +- [mainmatter/ember-hbs-minifier] [#447](https://github.com/mainmatter/ember-hbs-minifier/pull/447) Replace Mocha with QUnit ([@Turbo87]) +- [mainmatter/ember-hbs-minifier] [#446](https://github.com/mainmatter/ember-hbs-minifier/pull/446) renovate: Disable for `@glimmer/syntax-*` dependencies ([@Turbo87]) +- [mainmatter/ember-hbs-minifier] [#425](https://github.com/mainmatter/ember-hbs-minifier/pull/425) Update `ember-try` to v2 ([@Turbo87]) +- [mainmatter/ember-hbs-minifier] [#424](https://github.com/mainmatter/ember-hbs-minifier/pull/424) Use `pnpm` package manager ([@Turbo87]) +- [mainmatter/ember-hbs-minifier] [#423](https://github.com/mainmatter/ember-hbs-minifier/pull/423) Remove unmaintained `multidep` dependency ([@Turbo87]) +- [mainmatter/ember-promise-modals] [#549](https://github.com/mainmatter/ember-promise-modals/pull/549) Enhance focus trap configuration ([@zeppelin]) +- [mainmatter/ember-promise-modals] [#550](https://github.com/mainmatter/ember-promise-modals/pull/550) Modal template helper ([@pichfl]) +- [mainmatter/ember-promise-modals] [#543](https://github.com/mainmatter/ember-promise-modals/pull/543) Revert #533 ([@pichfl]) +- [mainmatter/ember-promise-modals] [#548](https://github.com/mainmatter/ember-promise-modals/pull/548) WIP: Enable Ember 2.18 CI scenario ([@nickschot]) +- [mainmatter/ember-test-selectors] [#889](https://github.com/mainmatter/ember-test-selectors/pull/889) renovate: Update `pnpm` version automatically ([@Turbo87]) ## JavaScript -- [mansona/express-autoroute-json] - [#42](https://github.com/mansona/express-autoroute-json/pull/42) Move from - Travis to GitHub actions ([@mansona]) -- [octokit/plugin-throttling.js] - [#457](https://github.com/octokit/plugin-throttling.js/pull/457) Improve types - for `ThrottlingOctokitOptions` ([@oscard0m]) -- [octokit/plugin-throttling.js] - [#456](https://github.com/octokit/plugin-throttling.js/pull/456) - test(coverage): adding 100% coverage ([@oscard0m]) -- [octokit/plugin-throttling.js] - [#455](https://github.com/octokit/plugin-throttling.js/pull/455) Replace - 'abuse limit' with 'secondary limit' ([@oscard0m]) +- [mansona/express-autoroute-json] [#42](https://github.com/mansona/express-autoroute-json/pull/42) Move from Travis to GitHub actions ([@mansona]) +- [octokit/plugin-throttling.js] [#457](https://github.com/octokit/plugin-throttling.js/pull/457) Improve types for `ThrottlingOctokitOptions` ([@oscard0m]) +- [octokit/plugin-throttling.js] [#456](https://github.com/octokit/plugin-throttling.js/pull/456) test(coverage): adding 100% coverage ([@oscard0m]) +- [octokit/plugin-throttling.js] [#455](https://github.com/octokit/plugin-throttling.js/pull/455) Replace 'abuse limit' with 'secondary limit' ([@oscard0m]) ## crates.io -- [rust-lang/crates.io] - [#4554](https://github.com/rust-lang/crates.io/pull/4554) controllers::krate: - Protect against null bytes in query string ([@Turbo87]) +- [rust-lang/crates.io] [#4554](https://github.com/rust-lang/crates.io/pull/4554) controllers::krate: Protect against null bytes in query string ([@Turbo87]) [@turbo87]: https://github.com/Turbo87 [@locks]: https://github.com/locks @@ -89,13 +41,9 @@ [ember-cli/ember-cli]: https://github.com/ember-cli/ember-cli [ember-learn/deprecation-app]: https://github.com/ember-learn/deprecation-app [ember-learn/ember-website]: https://github.com/ember-learn/ember-website -[mansona/express-autoroute-json]: - https://github.com/mansona/express-autoroute-json +[mansona/express-autoroute-json]: https://github.com/mansona/express-autoroute-json [octokit/plugin-throttling.js]: https://github.com/octokit/plugin-throttling.js [rust-lang/crates.io]: https://github.com/rust-lang/crates.io -[mainmatter/ember-hbs-minifier]: - https://github.com/mainmatter/ember-hbs-minifier -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals -[mainmatter/ember-test-selectors]: - https://github.com/mainmatter/ember-test-selectors +[mainmatter/ember-hbs-minifier]: https://github.com/mainmatter/ember-hbs-minifier +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals +[mainmatter/ember-test-selectors]: https://github.com/mainmatter/ember-test-selectors diff --git a/src/twios/2022-03-09.md b/src/twios/2022-03-09.md index fd6a2c0a28..4d74ea1bdc 100644 --- a/src/twios/2022-03-09.md +++ b/src/twios/2022-03-09.md @@ -1,87 +1,37 @@ ## Ember.js -- [ember-learn/deprecation-app] - [#1095](https://github.com/ember-learn/deprecation-app/pull/1095) Update npm - lockfile ([@locks]) -- [ember-learn/ember-website] - [#920](https://github.com/ember-learn/ember-website/pull/920) Update child - navigation items for Community ([@locks]) -- [ember-learn/ember-website] - [#918](https://github.com/ember-learn/ember-website/pull/918) Pin npm 8 - ([@locks]) -- [ember-learn/ember-website] - [#915](https://github.com/ember-learn/ember-website/pull/915) Set up 2022 - survey ([@locks]) -- [ember-learn/ember-website] - [#913](https://github.com/ember-learn/ember-website/pull/913) Formally - alumnize Igor ([@locks]) -- [ember-learn/ember-website] - [#919](https://github.com/ember-learn/ember-website/pull/919) add logo for - 2022 survey ([@mansona]) -- [ember-learn/guides-source] - [#1795](https://github.com/ember-learn/guides-source/pull/1795) v4.2.0 - ([@locks]) -- [empress/rfc-process] [#6](https://github.com/empress/rfc-process/pull/6) make - ember-scroll a dependency of rfc-process ([@mansona]) -- [empress/rfc-process] [#5](https://github.com/empress/rfc-process/pull/5) make - markdown tables work in showdown ([@mansona]) -- [empress/rfc-process] [#4](https://github.com/empress/rfc-process/pull/4) add - auto-changelog system ([@mansona]) -- [empress/rfc-process] [#3](https://github.com/empress/rfc-process/pull/3) fix - location of htmlSafe import ([@mansona]) -- [empress/rfc-process] [#2](https://github.com/empress/rfc-process/pull/2) add - ability to import the data for rfcs from a custom directory ([@mansona]) -- [empress/rfc-process] [#1](https://github.com/empress/rfc-process/pull/1) get - project ready for local development ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#6](https://github.com/empress/rfc-process-mdbook-template/pull/6) use Lint - to the future ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#5](https://github.com/empress/rfc-process-mdbook-template/pull/5) add - auto-changelog system ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#4](https://github.com/empress/rfc-process-mdbook-template/pull/4) remove - ember-a11y-refocus ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#3](https://github.com/empress/rfc-process-mdbook-template/pull/3) Fix code - samples in RFC content ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#2](https://github.com/empress/rfc-process-mdbook-template/pull/2) Fix - forward back buttons ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#1](https://github.com/empress/rfc-process-mdbook-template/pull/1) get the - repo ready for local-dev ([@mansona]) -- [jelhan/ember-cli-browser-navigation-button-test-helpers] - [#33](https://github.com/jelhan/ember-cli-browser-navigation-button-test-helpers/pull/33) - Remove ember-router-service-polyfill ([@zeppelin]) -- [miguelcobain/ember-paper] - [#1217](https://github.com/miguelcobain/ember-paper/pull/1217) remove Ember - 3.28 from ember-try scenarios ([@mansona]) -- [miguelcobain/ember-paper] - [#1215](https://github.com/miguelcobain/ember-paper/pull/1215) Setting up the - lint-to-the-future dashboard ([@mansona]) -- [miguelcobain/ember-paper] - [#1212](https://github.com/miguelcobain/ember-paper/pull/1212) Move from - travis to github actions ([@mansona]) +- [ember-learn/deprecation-app] [#1095](https://github.com/ember-learn/deprecation-app/pull/1095) Update npm lockfile ([@locks]) +- [ember-learn/ember-website] [#920](https://github.com/ember-learn/ember-website/pull/920) Update child navigation items for Community ([@locks]) +- [ember-learn/ember-website] [#918](https://github.com/ember-learn/ember-website/pull/918) Pin npm 8 ([@locks]) +- [ember-learn/ember-website] [#915](https://github.com/ember-learn/ember-website/pull/915) Set up 2022 survey ([@locks]) +- [ember-learn/ember-website] [#913](https://github.com/ember-learn/ember-website/pull/913) Formally alumnize Igor ([@locks]) +- [ember-learn/ember-website] [#919](https://github.com/ember-learn/ember-website/pull/919) add logo for 2022 survey ([@mansona]) +- [ember-learn/guides-source] [#1795](https://github.com/ember-learn/guides-source/pull/1795) v4.2.0 ([@locks]) +- [empress/rfc-process] [#6](https://github.com/empress/rfc-process/pull/6) make ember-scroll a dependency of rfc-process ([@mansona]) +- [empress/rfc-process] [#5](https://github.com/empress/rfc-process/pull/5) make markdown tables work in showdown ([@mansona]) +- [empress/rfc-process] [#4](https://github.com/empress/rfc-process/pull/4) add auto-changelog system ([@mansona]) +- [empress/rfc-process] [#3](https://github.com/empress/rfc-process/pull/3) fix location of htmlSafe import ([@mansona]) +- [empress/rfc-process] [#2](https://github.com/empress/rfc-process/pull/2) add ability to import the data for rfcs from a custom directory ([@mansona]) +- [empress/rfc-process] [#1](https://github.com/empress/rfc-process/pull/1) get project ready for local development ([@mansona]) +- [empress/rfc-process-mdbook-template] [#6](https://github.com/empress/rfc-process-mdbook-template/pull/6) use Lint to the future ([@mansona]) +- [empress/rfc-process-mdbook-template] [#5](https://github.com/empress/rfc-process-mdbook-template/pull/5) add auto-changelog system ([@mansona]) +- [empress/rfc-process-mdbook-template] [#4](https://github.com/empress/rfc-process-mdbook-template/pull/4) remove ember-a11y-refocus ([@mansona]) +- [empress/rfc-process-mdbook-template] [#3](https://github.com/empress/rfc-process-mdbook-template/pull/3) Fix code samples in RFC content ([@mansona]) +- [empress/rfc-process-mdbook-template] [#2](https://github.com/empress/rfc-process-mdbook-template/pull/2) Fix forward back buttons ([@mansona]) +- [empress/rfc-process-mdbook-template] [#1](https://github.com/empress/rfc-process-mdbook-template/pull/1) get the repo ready for local-dev ([@mansona]) +- [jelhan/ember-cli-browser-navigation-button-test-helpers] [#33](https://github.com/jelhan/ember-cli-browser-navigation-button-test-helpers/pull/33) Remove ember-router-service-polyfill ([@zeppelin]) +- [miguelcobain/ember-paper] [#1217](https://github.com/miguelcobain/ember-paper/pull/1217) remove Ember 3.28 from ember-try scenarios ([@mansona]) +- [miguelcobain/ember-paper] [#1215](https://github.com/miguelcobain/ember-paper/pull/1215) Setting up the lint-to-the-future dashboard ([@mansona]) +- [miguelcobain/ember-paper] [#1212](https://github.com/miguelcobain/ember-paper/pull/1212) Move from travis to github actions ([@mansona]) ## Octokit -- [octokit/core.js] [#450](https://github.com/octokit/core.js/pull/450) - feat(types): convert type 'OctokitOptions' to interface ([@oscard0m]) -- [octokit/octokit.js] [#2206](https://github.com/octokit/octokit.js/pull/2206) - docs(contributing): add explanation on how to manage a merged PR non - semantic-release compliant ([@oscard0m]) -- [octokit/octokit.js] [#2205](https://github.com/octokit/octokit.js/pull/2205) - docs(contributing): refer to all octokit projects ([@oscard0m]) -- [octokit/webhooks.js] [#673](https://github.com/octokit/webhooks.js/pull/673) - docs(README): update PR ([@oscard0m]) -- [octokit/plugin-throttling.js] - [#459](https://github.com/octokit/plugin-throttling.js/pull/459) feat(log): - use 'octokit.log.warn' instead of 'console.warn' ([@oscard0m]) -- [octokit/plugin-throttling.js] - [#458](https://github.com/octokit/plugin-throttling.js/pull/458) - feat(secondary-limit): replace 'abuse-limit' logic with 'secondary-limit' - ([@oscard0m]) +- [octokit/core.js] [#450](https://github.com/octokit/core.js/pull/450) feat(types): convert type 'OctokitOptions' to interface ([@oscard0m]) +- [octokit/octokit.js] [#2206](https://github.com/octokit/octokit.js/pull/2206) docs(contributing): add explanation on how to manage a merged PR non semantic-release compliant ([@oscard0m]) +- [octokit/octokit.js] [#2205](https://github.com/octokit/octokit.js/pull/2205) docs(contributing): refer to all octokit projects ([@oscard0m]) +- [octokit/webhooks.js] [#673](https://github.com/octokit/webhooks.js/pull/673) docs(README): update PR ([@oscard0m]) +- [octokit/plugin-throttling.js] [#459](https://github.com/octokit/plugin-throttling.js/pull/459) feat(log): use 'octokit.log.warn' instead of 'console.warn' ([@oscard0m]) +- [octokit/plugin-throttling.js] [#458](https://github.com/octokit/plugin-throttling.js/pull/458) feat(secondary-limit): replace 'abuse-limit' logic with 'secondary-limit' ([@oscard0m]) [@locks]: https://github.com/locks [@mansona]: https://github.com/mansona @@ -90,11 +40,9 @@ [ember-learn/deprecation-app]: https://github.com/ember-learn/deprecation-app [ember-learn/ember-website]: https://github.com/ember-learn/ember-website [ember-learn/guides-source]: https://github.com/ember-learn/guides-source -[empress/rfc-process-mdbook-template]: - https://github.com/empress/rfc-process-mdbook-template +[empress/rfc-process-mdbook-template]: https://github.com/empress/rfc-process-mdbook-template [empress/rfc-process]: https://github.com/empress/rfc-process -[jelhan/ember-cli-browser-navigation-button-test-helpers]: - https://github.com/jelhan/ember-cli-browser-navigation-button-test-helpers +[jelhan/ember-cli-browser-navigation-button-test-helpers]: https://github.com/jelhan/ember-cli-browser-navigation-button-test-helpers [miguelcobain/ember-paper]: https://github.com/miguelcobain/ember-paper [octokit/core.js]: https://github.com/octokit/core.js [octokit/octokit.js]: https://github.com/octokit/octokit.js diff --git a/src/twios/2022-03-22.md b/src/twios/2022-03-22.md index 0cc1482f8d..b9a8aa7d39 100644 --- a/src/twios/2022-03-22.md +++ b/src/twios/2022-03-22.md @@ -1,36 +1,20 @@ ## Ember.js -- [mainmatter/qunit-dom] - [#1491](https://github.com/mainmatter/qunit-dom/pull/1491) Fix `documentation` - integration ([@Turbo87]) -- [zeppelin/ember-click-outside] - [#241](https://github.com/zeppelin/ember-click-outside/pull/241) Add forgotten - release command ([@zeppelin]) -- [zeppelin/ember-click-outside] - [#240](https://github.com/zeppelin/ember-click-outside/pull/240) Remove - deprecated component properties ([@zeppelin]) -- [zeppelin/ember-click-outside] - [#239](https://github.com/zeppelin/ember-click-outside/pull/239) Remove - deprecated exports ([@zeppelin]) -- [zeppelin/ember-click-outside] - [#238](https://github.com/zeppelin/ember-click-outside/pull/238) Deprecate - `ClickOutsideMixin` ([@zeppelin]) -- [zeppelin/ember-click-outside] - [#237](https://github.com/zeppelin/ember-click-outside/pull/237) Set up - release-it ([@zeppelin]) +- [mainmatter/qunit-dom] [#1491](https://github.com/mainmatter/qunit-dom/pull/1491) Fix `documentation` integration ([@Turbo87]) +- [zeppelin/ember-click-outside] [#241](https://github.com/zeppelin/ember-click-outside/pull/241) Add forgotten release command ([@zeppelin]) +- [zeppelin/ember-click-outside] [#240](https://github.com/zeppelin/ember-click-outside/pull/240) Remove deprecated component properties ([@zeppelin]) +- [zeppelin/ember-click-outside] [#239](https://github.com/zeppelin/ember-click-outside/pull/239) Remove deprecated exports ([@zeppelin]) +- [zeppelin/ember-click-outside] [#238](https://github.com/zeppelin/ember-click-outside/pull/238) Deprecate `ClickOutsideMixin` ([@zeppelin]) +- [zeppelin/ember-click-outside] [#237](https://github.com/zeppelin/ember-click-outside/pull/237) Set up release-it ([@zeppelin]) ## Octokit -- [octokit/core.js] [#454](https://github.com/octokit/core.js/pull/454) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/plugin-retry.js] - [#303](https://github.com/octokit/plugin-retry.js/pull/303) - build(package.json): add @octokit/core as peerDependency ([@oscard0m]) +- [octokit/core.js] [#454](https://github.com/octokit/core.js/pull/454) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/plugin-retry.js] [#303](https://github.com/octokit/plugin-retry.js/pull/303) build(package.json): add @octokit/core as peerDependency ([@oscard0m]) ## TypeScript -- [mswjs/msw] [#1170](https://github.com/mswjs/msw/pull/1170) ci(workflows): - upgrade actions/checkout and actions/setup-node to v3 ([@oscard0m]) +- [mswjs/msw] [#1170](https://github.com/mswjs/msw/pull/1170) ci(workflows): upgrade actions/checkout and actions/setup-node to v3 ([@oscard0m]) [@turbo87]: https://github.com/Turbo87 [@marcoow]: https://github.com/marcoow diff --git a/src/twios/2022-04-08.md b/src/twios/2022-04-08.md index 7fd7972770..9bb1f688db 100644 --- a/src/twios/2022-04-08.md +++ b/src/twios/2022-04-08.md @@ -1,79 +1,34 @@ ## Ember.js -- [GavinJoyce/ember-headlessui] - [#136](https://github.com/GavinJoyce/ember-headlessui/pull/136) Add Fallback - Focus to Dialog ([@mansona]) -- [ember-learn/ember-blog] - [#1140](https://github.com/ember-learn/ember-blog/pull/1140) Ember v4.3 - release ([@locks]) -- [ember-learn/ember-blog] - [#1139](https://github.com/ember-learn/ember-blog/pull/1139) Add custom - blueprint for generating release blog posts ([@locks]) -- [emberjs/core-notes] [#445](https://github.com/emberjs/core-notes/pull/445) - Learning | March 31st ([@locks]) -- [emberjs/core-notes] [#444](https://github.com/emberjs/core-notes/pull/444) - Learning | March 24th ([@locks]) -- [nickschot/ember-mobile-menu] - [#261](https://github.com/nickschot/ember-mobile-menu/pull/261) Move npmignore - to addon package ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#260](https://github.com/nickschot/ember-mobile-menu/pull/260) Add missing - @ember/test-waiters dependency ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#259](https://github.com/nickschot/ember-mobile-menu/pull/259) Setup - release-it ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#258](https://github.com/nickschot/ember-mobile-menu/pull/258) Cleanup some - dependencies between the packages ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#256](https://github.com/nickschot/ember-mobile-menu/pull/256) Convert addon - to monorepo ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#255](https://github.com/nickschot/ember-mobile-menu/pull/255) Switch to pnpm - ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#254](https://github.com/nickschot/ember-mobile-menu/pull/254) Re-enable - embroider test-support on CI ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#243](https://github.com/nickschot/ember-mobile-menu/pull/243) Drop Ember - 3.23 support ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#242](https://github.com/nickschot/ember-mobile-menu/pull/242) Temporarily - disable Embroider tests in CI ([@nickschot]) -- [mainmatter/ember-intl-analyzer] - [#493](https://github.com/mainmatter/ember-intl-analyzer/pull/493) Revert - pkg-dir upgrade to v6 ([@Mikek2252]) -- [mainmatter/ember-intl-analyzer] - [#491](https://github.com/mainmatter/ember-intl-analyzer/pull/491) Add - release-it configuration to simplify releases ([@Mikek2252]) -- [mainmatter/ember-intl-analyzer] - [#489](https://github.com/mainmatter/ember-intl-analyzer/pull/489) Update Node - test scenarios in ci ([@Mikek2252]) -- [mainmatter/ember-simple-auth] - [#2367](https://github.com/mainmatter/ember-simple-auth/pull/2367) Implement a - popup authenticator ([@pichfl]) -- [mainmatter/ember-simple-auth] - [#2366](https://github.com/mainmatter/ember-simple-auth/pull/2366) [2365] - internal-session to call \_initialize on session-store during init - ([@BobrImperator]) +- [GavinJoyce/ember-headlessui] [#136](https://github.com/GavinJoyce/ember-headlessui/pull/136) Add Fallback Focus to Dialog ([@mansona]) +- [ember-learn/ember-blog] [#1140](https://github.com/ember-learn/ember-blog/pull/1140) Ember v4.3 release ([@locks]) +- [ember-learn/ember-blog] [#1139](https://github.com/ember-learn/ember-blog/pull/1139) Add custom blueprint for generating release blog posts ([@locks]) +- [emberjs/core-notes] [#445](https://github.com/emberjs/core-notes/pull/445) Learning | March 31st ([@locks]) +- [emberjs/core-notes] [#444](https://github.com/emberjs/core-notes/pull/444) Learning | March 24th ([@locks]) +- [nickschot/ember-mobile-menu] [#261](https://github.com/nickschot/ember-mobile-menu/pull/261) Move npmignore to addon package ([@nickschot]) +- [nickschot/ember-mobile-menu] [#260](https://github.com/nickschot/ember-mobile-menu/pull/260) Add missing @ember/test-waiters dependency ([@nickschot]) +- [nickschot/ember-mobile-menu] [#259](https://github.com/nickschot/ember-mobile-menu/pull/259) Setup release-it ([@nickschot]) +- [nickschot/ember-mobile-menu] [#258](https://github.com/nickschot/ember-mobile-menu/pull/258) Cleanup some dependencies between the packages ([@nickschot]) +- [nickschot/ember-mobile-menu] [#256](https://github.com/nickschot/ember-mobile-menu/pull/256) Convert addon to monorepo ([@nickschot]) +- [nickschot/ember-mobile-menu] [#255](https://github.com/nickschot/ember-mobile-menu/pull/255) Switch to pnpm ([@nickschot]) +- [nickschot/ember-mobile-menu] [#254](https://github.com/nickschot/ember-mobile-menu/pull/254) Re-enable embroider test-support on CI ([@nickschot]) +- [nickschot/ember-mobile-menu] [#243](https://github.com/nickschot/ember-mobile-menu/pull/243) Drop Ember 3.23 support ([@nickschot]) +- [nickschot/ember-mobile-menu] [#242](https://github.com/nickschot/ember-mobile-menu/pull/242) Temporarily disable Embroider tests in CI ([@nickschot]) +- [mainmatter/ember-intl-analyzer] [#493](https://github.com/mainmatter/ember-intl-analyzer/pull/493) Revert pkg-dir upgrade to v6 ([@Mikek2252]) +- [mainmatter/ember-intl-analyzer] [#491](https://github.com/mainmatter/ember-intl-analyzer/pull/491) Add release-it configuration to simplify releases ([@Mikek2252]) +- [mainmatter/ember-intl-analyzer] [#489](https://github.com/mainmatter/ember-intl-analyzer/pull/489) Update Node test scenarios in ci ([@Mikek2252]) +- [mainmatter/ember-simple-auth] [#2367](https://github.com/mainmatter/ember-simple-auth/pull/2367) Implement a popup authenticator ([@pichfl]) +- [mainmatter/ember-simple-auth] [#2366](https://github.com/mainmatter/ember-simple-auth/pull/2366) [2365] internal-session to call \_initialize on session-store during init ([@BobrImperator]) ## JavaScript -- [TelemetryDeck/JavaScriptSDK] - [#8](https://github.com/TelemetryDeck/JavaScriptSDK/pull/8) Always attach a - TelemetryDeck SDK instance to window ([@pichfl]) -- [yaacov/node-modbus-serial] - [#450](https://github.com/yaacov/node-modbus-serial/pull/450) Implement - Bluetooth LE port ([@Turbo87]) +- [TelemetryDeck/JavaScriptSDK] [#8](https://github.com/TelemetryDeck/JavaScriptSDK/pull/8) Always attach a TelemetryDeck SDK instance to window ([@pichfl]) +- [yaacov/node-modbus-serial] [#450](https://github.com/yaacov/node-modbus-serial/pull/450) Implement Bluetooth LE port ([@Turbo87]) ## Octokit -- [octokit/plugin-rest-endpoint-methods.js] - [#479](https://github.com/octokit/plugin-rest-endpoint-methods.js/pull/479) - ci(codeql): ignore 'push' events for dependabot branches ([@oscard0m]) -- [octokit/plugin-rest-endpoint-methods.js] - [#478](https://github.com/octokit/plugin-rest-endpoint-methods.js/pull/478) - ci(codeql): remove unnecessary step to checkout HEAD~2 from PRs ([@oscard0m]) +- [octokit/plugin-rest-endpoint-methods.js] [#479](https://github.com/octokit/plugin-rest-endpoint-methods.js/pull/479) ci(codeql): ignore 'push' events for dependabot branches ([@oscard0m]) +- [octokit/plugin-rest-endpoint-methods.js] [#478](https://github.com/octokit/plugin-rest-endpoint-methods.js/pull/478) ci(codeql): remove unnecessary step to checkout HEAD~2 from PRs ([@oscard0m]) [@bobrimperator]: https://github.com/BobrImperator [@mikek2252]: https://github.com/Mikek2252 @@ -87,16 +42,12 @@ [telemetrydeck/javascriptsdk]: https://github.com/TelemetryDeck/JavaScriptSDK [ember-learn/ember-blog]: https://github.com/ember-learn/ember-blog [emberjs/core-notes]: https://github.com/emberjs/core-notes -[fireship-io/10-javascript-frameworks]: - https://github.com/fireship-io/10-javascript-frameworks -[locks/10-javascript-frameworks]: - https://github.com/locks/10-javascript-frameworks +[fireship-io/10-javascript-frameworks]: https://github.com/fireship-io/10-javascript-frameworks +[locks/10-javascript-frameworks]: https://github.com/locks/10-javascript-frameworks [nickschot/ember-europe-demo]: https://github.com/nickschot/ember-europe-demo [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu -[octokit/plugin-rest-endpoint-methods.js]: - https://github.com/octokit/plugin-rest-endpoint-methods.js +[octokit/plugin-rest-endpoint-methods.js]: https://github.com/octokit/plugin-rest-endpoint-methods.js [semantic-release/github]: https://github.com/semantic-release/github -[mainmatter/ember-intl-analyzer]: - https://github.com/mainmatter/ember-intl-analyzer +[mainmatter/ember-intl-analyzer]: https://github.com/mainmatter/ember-intl-analyzer [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth [yaacov/node-modbus-serial]: https://github.com/yaacov/node-modbus-serial diff --git a/src/twios/2022-04-19.md b/src/twios/2022-04-19.md index 706cbe9902..affe5c37be 100644 --- a/src/twios/2022-04-19.md +++ b/src/twios/2022-04-19.md @@ -1,100 +1,44 @@ ## Ember.js -- [GavinJoyce/ember-headlessui] - [#140](https://github.com/GavinJoyce/ember-headlessui/pull/140) add floating - test from addon blueprint ([@mansona]) -- [GavinJoyce/ember-headlessui] - [#139](https://github.com/GavinJoyce/ember-headlessui/pull/139) fix - rootElement when running in /tests ([@mansona]) -- [buschtoens/ember-link] - [#711](https://github.com/buschtoens/ember-link/pull/711) Update `.npmignore` - file ([@Turbo87]) -- [ember-learn/ember-blog] - [#1148](https://github.com/ember-learn/ember-blog/pull/1148) Release v4.3 - ([@locks]) -- [ember-learn/guides-source] - [#1806](https://github.com/ember-learn/guides-source/pull/1806) v4.3.0 - ([@locks]) -- [ember-learn/guides-source] - [#1802](https://github.com/ember-learn/guides-source/pull/1802) Fix Ember Data - call out regarding store ([@locks]) -- [emberjs/ember.js] [#20060](https://github.com/emberjs/ember.js/pull/20060) - Improve named block-related API documentation ([@locks]) -- [emberjs/ember.js] [#20059](https://github.com/emberjs/ember.js/pull/20059) - use Math.sign for spaceship function implementation ([@locks]) -- [empress/rfc-process] [#7](https://github.com/empress/rfc-process/pull/7) add - frontmatter attributes to rfcs ([@mansona]) -- [mansona/ember-get-config] - [#38](https://github.com/mansona/ember-get-config/pull/38) add type - declaration file ([@mansona]) -- [mansona/ember-get-config] - [#35](https://github.com/mansona/ember-get-config/pull/35) make sure that - config is from the test environment when running /tests ([@mansona]) -- [nickschot/ember-mobile-menu] - [#271](https://github.com/nickschot/ember-mobile-menu/pull/271) Update - renovate configuration ([@nickschot]) -- [qonto/ember-cp-validations] - [#15](https://github.com/qonto/ember-cp-validations/pull/15) Fix all - deprecations except `computed-property.volatile` ([@zeppelin]) -- [qonto/ember-cp-validations] - [#14](https://github.com/qonto/ember-cp-validations/pull/14) Set up - deprecation workflow ([@zeppelin]) -- [qonto/ember-cp-validations] - [#12](https://github.com/qonto/ember-cp-validations/pull/12) Lint HBS files - ([@zeppelin]) -- [mainmatter/ember-hbs-minifier] - [#501](https://github.com/mainmatter/ember-hbs-minifier/pull/501) Enable - parallel file processing for `ember-cli-babel` ([@Turbo87]) -- [mainmatter/ember-hbs-minifier] - [#496](https://github.com/mainmatter/ember-hbs-minifier/pull/496) Update peer - requirements ([@Turbo87]) -- [mainmatter/ember-hbs-minifier] - [#495](https://github.com/mainmatter/ember-hbs-minifier/pull/495) tests: Add - `this.` prefix to templates ([@Turbo87]) -- [mainmatter/ember-promise-modals] - [#598](https://github.com/mainmatter/ember-promise-modals/pull/598) Refactor - handling of `focusTrap.onDeactivate` method ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#597](https://github.com/mainmatter/ember-promise-modals/pull/597) Remove - deprecated `clickOutsideDeactivates` option ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#596](https://github.com/mainmatter/ember-promise-modals/pull/596) Ensure - calls to `@close` run before the focus-out deactivation ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#594](https://github.com/mainmatter/ember-promise-modals/pull/594) Configure - release-it ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#588](https://github.com/mainmatter/ember-promise-modals/pull/588) Use - ember-auto-import@2 ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#570](https://github.com/mainmatter/ember-promise-modals/pull/570) Setup - Renovatebot ([@nickschot]) -- [mainmatter/ember-workshop] - [#618](https://github.com/mainmatter/ember-workshop/pull/618) Migrate to - Embroider + pNPM ([@zeppelin]) +- [GavinJoyce/ember-headlessui] [#140](https://github.com/GavinJoyce/ember-headlessui/pull/140) add floating test from addon blueprint ([@mansona]) +- [GavinJoyce/ember-headlessui] [#139](https://github.com/GavinJoyce/ember-headlessui/pull/139) fix rootElement when running in /tests ([@mansona]) +- [buschtoens/ember-link] [#711](https://github.com/buschtoens/ember-link/pull/711) Update `.npmignore` file ([@Turbo87]) +- [ember-learn/ember-blog] [#1148](https://github.com/ember-learn/ember-blog/pull/1148) Release v4.3 ([@locks]) +- [ember-learn/guides-source] [#1806](https://github.com/ember-learn/guides-source/pull/1806) v4.3.0 ([@locks]) +- [ember-learn/guides-source] [#1802](https://github.com/ember-learn/guides-source/pull/1802) Fix Ember Data call out regarding store ([@locks]) +- [emberjs/ember.js] [#20060](https://github.com/emberjs/ember.js/pull/20060) Improve named block-related API documentation ([@locks]) +- [emberjs/ember.js] [#20059](https://github.com/emberjs/ember.js/pull/20059) use Math.sign for spaceship function implementation ([@locks]) +- [empress/rfc-process] [#7](https://github.com/empress/rfc-process/pull/7) add frontmatter attributes to rfcs ([@mansona]) +- [mansona/ember-get-config] [#38](https://github.com/mansona/ember-get-config/pull/38) add type declaration file ([@mansona]) +- [mansona/ember-get-config] [#35](https://github.com/mansona/ember-get-config/pull/35) make sure that config is from the test environment when running /tests ([@mansona]) +- [nickschot/ember-mobile-menu] [#271](https://github.com/nickschot/ember-mobile-menu/pull/271) Update renovate configuration ([@nickschot]) +- [qonto/ember-cp-validations] [#15](https://github.com/qonto/ember-cp-validations/pull/15) Fix all deprecations except `computed-property.volatile` ([@zeppelin]) +- [qonto/ember-cp-validations] [#14](https://github.com/qonto/ember-cp-validations/pull/14) Set up deprecation workflow ([@zeppelin]) +- [qonto/ember-cp-validations] [#12](https://github.com/qonto/ember-cp-validations/pull/12) Lint HBS files ([@zeppelin]) +- [mainmatter/ember-hbs-minifier] [#501](https://github.com/mainmatter/ember-hbs-minifier/pull/501) Enable parallel file processing for `ember-cli-babel` ([@Turbo87]) +- [mainmatter/ember-hbs-minifier] [#496](https://github.com/mainmatter/ember-hbs-minifier/pull/496) Update peer requirements ([@Turbo87]) +- [mainmatter/ember-hbs-minifier] [#495](https://github.com/mainmatter/ember-hbs-minifier/pull/495) tests: Add `this.` prefix to templates ([@Turbo87]) +- [mainmatter/ember-promise-modals] [#598](https://github.com/mainmatter/ember-promise-modals/pull/598) Refactor handling of `focusTrap.onDeactivate` method ([@pichfl]) +- [mainmatter/ember-promise-modals] [#597](https://github.com/mainmatter/ember-promise-modals/pull/597) Remove deprecated `clickOutsideDeactivates` option ([@pichfl]) +- [mainmatter/ember-promise-modals] [#596](https://github.com/mainmatter/ember-promise-modals/pull/596) Ensure calls to `@close` run before the focus-out deactivation ([@pichfl]) +- [mainmatter/ember-promise-modals] [#594](https://github.com/mainmatter/ember-promise-modals/pull/594) Configure release-it ([@pichfl]) +- [mainmatter/ember-promise-modals] [#588](https://github.com/mainmatter/ember-promise-modals/pull/588) Use ember-auto-import@2 ([@pichfl]) +- [mainmatter/ember-promise-modals] [#570](https://github.com/mainmatter/ember-promise-modals/pull/570) Setup Renovatebot ([@nickschot]) +- [mainmatter/ember-workshop] [#618](https://github.com/mainmatter/ember-workshop/pull/618) Migrate to Embroider + pNPM ([@zeppelin]) ## JavaScript -- [yaacov/node-modbus-serial] - [#453](https://github.com/yaacov/node-modbus-serial/pull/453) Use let/const - instead of var ([@Turbo87]) -- [actions/setup-python] - [#379](https://github.com/actions/setup-python/pull/379) ci(workflow): add - cache to workflows using actions/setup-node ([@oscard0m]) +- [yaacov/node-modbus-serial] [#453](https://github.com/yaacov/node-modbus-serial/pull/453) Use let/const instead of var ([@Turbo87]) +- [actions/setup-python] [#379](https://github.com/actions/setup-python/pull/379) ci(workflow): add cache to workflows using actions/setup-node ([@oscard0m]) ## Octokit -- [octokit/auth-token.js] - [#219](https://github.com/octokit/auth-token.js/pull/219) ci(codeql): remove - unnecessary step to checkout HEAD~2 from PRs ([@oscard0m]) -- [octokit/auth-token.js] - [#217](https://github.com/octokit/auth-token.js/pull/217) ci(codeql): ignore - on push events for dependabot branches ([@oscard0m]) +- [octokit/auth-token.js] [#219](https://github.com/octokit/auth-token.js/pull/219) ci(codeql): remove unnecessary step to checkout HEAD~2 from PRs ([@oscard0m]) +- [octokit/auth-token.js] [#217](https://github.com/octokit/auth-token.js/pull/217) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) ## Miscellaneous -- [netlify/build-image] [#778](https://github.com/netlify/build-image/pull/778) - add webm to the default fetchinclude ([@mansona]) +- [netlify/build-image] [#778](https://github.com/netlify/build-image/pull/778) add webm to the default fetchinclude ([@mansona]) [@turbo87]: https://github.com/Turbo87 [@locks]: https://github.com/locks @@ -114,12 +58,9 @@ [netlify/build-image]: https://github.com/netlify/build-image [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu [octokit/auth-token.js]: https://github.com/octokit/auth-token.js -[offirgolan/ember-cp-validations]: - https://github.com/offirgolan/ember-cp-validations +[offirgolan/ember-cp-validations]: https://github.com/offirgolan/ember-cp-validations [qonto/ember-cp-validations]: https://github.com/qonto/ember-cp-validations -[mainmatter/ember-hbs-minifier]: - https://github.com/mainmatter/ember-hbs-minifier -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals +[mainmatter/ember-hbs-minifier]: https://github.com/mainmatter/ember-hbs-minifier +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals [mainmatter/ember-workshop]: https://github.com/mainmatter/ember-workshop [yaacov/node-modbus-serial]: https://github.com/yaacov/node-modbus-serial diff --git a/src/twios/2022-05-09.md b/src/twios/2022-05-09.md index 9c91f0b6c8..63907d6f6f 100644 --- a/src/twios/2022-05-09.md +++ b/src/twios/2022-05-09.md @@ -1,194 +1,81 @@ ## Highlight -Tobias Bieniek has been contributing to -[RenovateBot](https://github.com/renovatebot/renovate), a bot for automated -dependency updates. +Tobias Bieniek has been contributing to [RenovateBot](https://github.com/renovatebot/renovate), a bot for automated dependency updates. -His PR [15214](https://github.com/renovatebot/renovate/pull/15214) added -changelogs to Rust crate update PRs by downloading #crate metadata -from [crates.io](http://crates.io/). It also uses a fast path on -the [crates.io](http://crates.io/) server to avoid unnecessary database -requests. +His PR [15214](https://github.com/renovatebot/renovate/pull/15214) added changelogs to Rust crate update PRs by downloading #crate metadata from [crates.io](http://crates.io/). It also uses a fast path on the [crates.io](http://crates.io/) server to avoid unnecessary database requests. ## Ember.js -- [Turbo87/intellij-emberjs] - [#440](https://github.com/Turbo87/intellij-emberjs/pull/440) Fix - `LineMarkerInfo` deprecation error ([@Turbo87]) -- [ember-learn/ember-styleguide] - [#418](https://github.com/ember-learn/ember-styleguide/pull/418) update - lint-to-the-future dashboard workflow ([@mansona]) -- [ember-learn/guides-source] - [#1814](https://github.com/ember-learn/guides-source/pull/1814) Fix typo in - linking-between-routes.md ([@locks]) -- [empress/ember-showdown-prism] - [#25](https://github.com/empress/ember-showdown-prism/pull/25) add typescript - and diff components ([@mansona]) -- [empress/empress-blog] - [#159](https://github.com/empress/empress-blog/pull/159) update lttf dashboard - workflow ([@mansona]) -- [empress/rfc-process] [#10](https://github.com/empress/rfc-process/pull/10) - Update to 3.28 with ember-cli-update ([@mansona]) -- [empress/rfc-process] [#9](https://github.com/empress/rfc-process/pull/9) fix - prember urls ([@mansona]) -- [empress/rfc-process] [#8](https://github.com/empress/rfc-process/pull/8) Add - stages and teams models and data processing ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#7](https://github.com/empress/rfc-process-mdbook-template/pull/7) Add - frontmatter implementation ([@mansona]) -- [mansona/ember-get-config] - [#41](https://github.com/mansona/ember-get-config/pull/41) breaking: re-export - configModule to reduce duplication and fix dynamic config ([@mansona]) -- [offirgolan/ember-cp-validations] - [#705](https://github.com/offirgolan/ember-cp-validations/pull/705) Add - missing changelog entries ([@zeppelin]) -- [qonto/ember-cp-validations] - [#18](https://github.com/qonto/ember-cp-validations/pull/18) Remove volatile - support & enable Ember 4 tests ([@zeppelin]) -- [qonto/ember-cp-validations] - [#17](https://github.com/qonto/ember-cp-validations/pull/17) Remove support - for Ember < 3.28 ([@zeppelin]) -- [qonto/ember-cp-validations] - [#16](https://github.com/qonto/ember-cp-validations/pull/16) Add missing - changelog entries ([@zeppelin]) -- [mainmatter/ember-cookies] - [#742](https://github.com/mainmatter/ember-cookies/pull/742) ci(renovate): use - renovate's json5 preset ([@oscard0m]) -- [mainmatter/ember-cookies] - [#739](https://github.com/mainmatter/ember-cookies/pull/739) ci(renovate): add - renovate config ([@oscard0m]) -- [mainmatter/ember-hotspots] - [#27](https://github.com/mainmatter/ember-hotspots/pull/27) Bring back - `ember-get-config` ([@pichfl]) -- [mainmatter/ember-hotspots] - [#26](https://github.com/mainmatter/ember-hotspots/pull/26) Remove - ember-get-config ([@pichfl]) -- [mainmatter/ember-hotspots] - [#24](https://github.com/mainmatter/ember-hotspots/pull/24) Ensure hostspots - are loaded from the right URL ([@pichfl]) -- [mainmatter/ember-hotspots] - [#23](https://github.com/mainmatter/ember-hotspots/pull/23) Remove duplicated - `ember-fetch` dependency ([@pichfl]) -- [mainmatter/ember-hotspots] - [#17](https://github.com/mainmatter/ember-hotspots/pull/17) Update addon - blueprint and dependencies ([@pichfl]) -- [mainmatter/ember-hotspots] - [#11](https://github.com/mainmatter/ember-hotspots/pull/11) Setup Renovatebot - ([@pichfl]) -- [mainmatter/ember-hotspots] - [#10](https://github.com/mainmatter/ember-hotspots/pull/10) Replace Yarn with - pnpm ([@pichfl]) -- [mainmatter/ember-simple-auth] - [#2379](https://github.com/mainmatter/ember-simple-auth/pull/2379) disable - dependabot ([@marcoow]) -- [mainmatter/ember-simple-auth] - [#2369](https://github.com/mainmatter/ember-simple-auth/pull/2369) Add cache - to node workflows ([@marcoow]) -- [mainmatter/ember-simple-auth] - [#2368](https://github.com/mainmatter/ember-simple-auth/pull/2368) Upgrade - ESLint configuration ([@pichfl]) -- [mainmatter/ember-simple-auth] - [#2409](https://github.com/mainmatter/ember-simple-auth/pull/2409) - ci(renovate): use renovate's json5 preset ([@oscard0m]) -- [mainmatter/ember-simple-auth] - [#2370](https://github.com/mainmatter/ember-simple-auth/pull/2370) - ci(renovate): add renovate configuration ([@oscard0m]) +- [Turbo87/intellij-emberjs] [#440](https://github.com/Turbo87/intellij-emberjs/pull/440) Fix `LineMarkerInfo` deprecation error ([@Turbo87]) +- [ember-learn/ember-styleguide] [#418](https://github.com/ember-learn/ember-styleguide/pull/418) update lint-to-the-future dashboard workflow ([@mansona]) +- [ember-learn/guides-source] [#1814](https://github.com/ember-learn/guides-source/pull/1814) Fix typo in linking-between-routes.md ([@locks]) +- [empress/ember-showdown-prism] [#25](https://github.com/empress/ember-showdown-prism/pull/25) add typescript and diff components ([@mansona]) +- [empress/empress-blog] [#159](https://github.com/empress/empress-blog/pull/159) update lttf dashboard workflow ([@mansona]) +- [empress/rfc-process] [#10](https://github.com/empress/rfc-process/pull/10) Update to 3.28 with ember-cli-update ([@mansona]) +- [empress/rfc-process] [#9](https://github.com/empress/rfc-process/pull/9) fix prember urls ([@mansona]) +- [empress/rfc-process] [#8](https://github.com/empress/rfc-process/pull/8) Add stages and teams models and data processing ([@mansona]) +- [empress/rfc-process-mdbook-template] [#7](https://github.com/empress/rfc-process-mdbook-template/pull/7) Add frontmatter implementation ([@mansona]) +- [mansona/ember-get-config] [#41](https://github.com/mansona/ember-get-config/pull/41) breaking: re-export configModule to reduce duplication and fix dynamic config ([@mansona]) +- [offirgolan/ember-cp-validations] [#705](https://github.com/offirgolan/ember-cp-validations/pull/705) Add missing changelog entries ([@zeppelin]) +- [qonto/ember-cp-validations] [#18](https://github.com/qonto/ember-cp-validations/pull/18) Remove volatile support & enable Ember 4 tests ([@zeppelin]) +- [qonto/ember-cp-validations] [#17](https://github.com/qonto/ember-cp-validations/pull/17) Remove support for Ember < 3.28 ([@zeppelin]) +- [qonto/ember-cp-validations] [#16](https://github.com/qonto/ember-cp-validations/pull/16) Add missing changelog entries ([@zeppelin]) +- [mainmatter/ember-cookies] [#742](https://github.com/mainmatter/ember-cookies/pull/742) ci(renovate): use renovate's json5 preset ([@oscard0m]) +- [mainmatter/ember-cookies] [#739](https://github.com/mainmatter/ember-cookies/pull/739) ci(renovate): add renovate config ([@oscard0m]) +- [mainmatter/ember-hotspots] [#27](https://github.com/mainmatter/ember-hotspots/pull/27) Bring back `ember-get-config` ([@pichfl]) +- [mainmatter/ember-hotspots] [#26](https://github.com/mainmatter/ember-hotspots/pull/26) Remove ember-get-config ([@pichfl]) +- [mainmatter/ember-hotspots] [#24](https://github.com/mainmatter/ember-hotspots/pull/24) Ensure hostspots are loaded from the right URL ([@pichfl]) +- [mainmatter/ember-hotspots] [#23](https://github.com/mainmatter/ember-hotspots/pull/23) Remove duplicated `ember-fetch` dependency ([@pichfl]) +- [mainmatter/ember-hotspots] [#17](https://github.com/mainmatter/ember-hotspots/pull/17) Update addon blueprint and dependencies ([@pichfl]) +- [mainmatter/ember-hotspots] [#11](https://github.com/mainmatter/ember-hotspots/pull/11) Setup Renovatebot ([@pichfl]) +- [mainmatter/ember-hotspots] [#10](https://github.com/mainmatter/ember-hotspots/pull/10) Replace Yarn with pnpm ([@pichfl]) +- [mainmatter/ember-simple-auth] [#2379](https://github.com/mainmatter/ember-simple-auth/pull/2379) disable dependabot ([@marcoow]) +- [mainmatter/ember-simple-auth] [#2369](https://github.com/mainmatter/ember-simple-auth/pull/2369) Add cache to node workflows ([@marcoow]) +- [mainmatter/ember-simple-auth] [#2368](https://github.com/mainmatter/ember-simple-auth/pull/2368) Upgrade ESLint configuration ([@pichfl]) +- [mainmatter/ember-simple-auth] [#2409](https://github.com/mainmatter/ember-simple-auth/pull/2409) ci(renovate): use renovate's json5 preset ([@oscard0m]) +- [mainmatter/ember-simple-auth] [#2370](https://github.com/mainmatter/ember-simple-auth/pull/2370) ci(renovate): add renovate configuration ([@oscard0m]) ## Internal -- [mainmatter/renovate-config] - [#8](https://github.com/mainmatter/renovate-config/pull/8) - chore(default.json): remove default.json ([@oscard0m]) -- [mainmatter/renovate-config] - [#4](https://github.com/mainmatter/renovate-config/pull/4) refactor(renovate): - restore .json5 configuration ([@oscard0m]) -- [mainmatter/renovate-config] - [#3](https://github.com/mainmatter/renovate-config/pull/3) feat(renovate): add - ':preserveSemverRanges' ([@oscard0m]) -- [mainmatter/renovate-config] - [#2](https://github.com/mainmatter/renovate-config/pull/2) refactor(renovate): - use .json instead of .json5 format for config ([@oscard0m]) +- [mainmatter/renovate-config] [#8](https://github.com/mainmatter/renovate-config/pull/8) chore(default.json): remove default.json ([@oscard0m]) +- [mainmatter/renovate-config] [#4](https://github.com/mainmatter/renovate-config/pull/4) refactor(renovate): restore .json5 configuration ([@oscard0m]) +- [mainmatter/renovate-config] [#3](https://github.com/mainmatter/renovate-config/pull/3) feat(renovate): add ':preserveSemverRanges' ([@oscard0m]) +- [mainmatter/renovate-config] [#2](https://github.com/mainmatter/renovate-config/pull/2) refactor(renovate): use .json instead of .json5 format for config ([@oscard0m]) ## JavaScript -- [showdownjs/showdown] [#918](https://github.com/showdownjs/showdown/pull/918) - Add updated CommonMark Tests ([@mansona]) +- [showdownjs/showdown] [#918](https://github.com/showdownjs/showdown/pull/918) Add updated CommonMark Tests ([@mansona]) ## Rust -- [Turbo87/united-flarmnet] - [#78](https://github.com/Turbo87/united-flarmnet/pull/78) Inline unnecessary - functions ([@Turbo87]) -- [Turbo87/united-flarmnet] - [#76](https://github.com/Turbo87/united-flarmnet/pull/76) Extract `merge()` - function ([@Turbo87]) -- [Turbo87/united-flarmnet] - [#75](https://github.com/Turbo87/united-flarmnet/pull/75) Run HTTP requests in - parallel ([@Turbo87]) -- [Turbo87/united-flarmnet] - [#74](https://github.com/Turbo87/united-flarmnet/pull/74) Use `reqwest_retry` - to retry failed requests ([@Turbo87]) -- [Turbo87/united-flarmnet] - [#73](https://github.com/Turbo87/united-flarmnet/pull/73) Replace custom cache - with `http_cache_reqwest` middleware ([@Turbo87]) -- [Turbo87/united-flarmnet] - [#72](https://github.com/Turbo87/united-flarmnet/pull/72) Use - `reqwest-tracing` for additional debug output ([@Turbo87]) -- [Turbo87/united-flarmnet] - [#71](https://github.com/Turbo87/united-flarmnet/pull/71) Use async/await for - HTTP reqwests ([@Turbo87]) -- [Turbo87/united-flarmnet] - [#70](https://github.com/Turbo87/united-flarmnet/pull/70) Migrate from `ureq` - to `reqwest` ([@Turbo87]) -- [Turbo87/united-flarmnet] - [#69](https://github.com/Turbo87/united-flarmnet/pull/69) Use WeGlide devices - API ([@Turbo87]) -- [Turbo87/united-flarmnet] - [#68](https://github.com/Turbo87/united-flarmnet/pull/68) Deploy built binary - to GitHub Pages ([@Turbo87]) -- [Turbo87/united-flarmnet] - [#67](https://github.com/Turbo87/united-flarmnet/pull/67) Simplify unnecessary - closure functions ([@Turbo87]) -- [Turbo87/united-flarmnet] - [#66](https://github.com/Turbo87/united-flarmnet/pull/66) clippy: Adjust - deprecated rule name ([@Turbo87]) -- [Turbo87/united-flarmnet] - [#65](https://github.com/Turbo87/united-flarmnet/pull/65) sanitize: Use `char` - instead of `&str` for single character search strings ([@Turbo87]) -- [Turbo87/united-flarmnet] - [#62](https://github.com/Turbo87/united-flarmnet/pull/62) Add - `rust-toolchain.toml` file ([@Turbo87]) -- [ferrous-systems/teaching-material] - [#106](https://github.com/ferrous-systems/teaching-material/pull/106) - installation: Adjust `IntelliJ` link ([@Turbo87]) -- [ferrous-systems/teaching-material] - [#103](https://github.com/ferrous-systems/teaching-material/pull/103) - Partially revert "remove `extern crate`" ([@Turbo87]) -- [ferrous-systems/teaching-material] - [#102](https://github.com/ferrous-systems/teaching-material/pull/102) - presentations/imports-modules-and-visibility: Add missing `struct` keyword - ([@Turbo87]) -- [ferrous-systems/teaching-material] - [#101](https://github.com/ferrous-systems/teaching-material/pull/101) - presentations/cargo: Fix dependency category name ([@Turbo87]) +- [Turbo87/united-flarmnet] [#78](https://github.com/Turbo87/united-flarmnet/pull/78) Inline unnecessary functions ([@Turbo87]) +- [Turbo87/united-flarmnet] [#76](https://github.com/Turbo87/united-flarmnet/pull/76) Extract `merge()` function ([@Turbo87]) +- [Turbo87/united-flarmnet] [#75](https://github.com/Turbo87/united-flarmnet/pull/75) Run HTTP requests in parallel ([@Turbo87]) +- [Turbo87/united-flarmnet] [#74](https://github.com/Turbo87/united-flarmnet/pull/74) Use `reqwest_retry` to retry failed requests ([@Turbo87]) +- [Turbo87/united-flarmnet] [#73](https://github.com/Turbo87/united-flarmnet/pull/73) Replace custom cache with `http_cache_reqwest` middleware ([@Turbo87]) +- [Turbo87/united-flarmnet] [#72](https://github.com/Turbo87/united-flarmnet/pull/72) Use `reqwest-tracing` for additional debug output ([@Turbo87]) +- [Turbo87/united-flarmnet] [#71](https://github.com/Turbo87/united-flarmnet/pull/71) Use async/await for HTTP reqwests ([@Turbo87]) +- [Turbo87/united-flarmnet] [#70](https://github.com/Turbo87/united-flarmnet/pull/70) Migrate from `ureq` to `reqwest` ([@Turbo87]) +- [Turbo87/united-flarmnet] [#69](https://github.com/Turbo87/united-flarmnet/pull/69) Use WeGlide devices API ([@Turbo87]) +- [Turbo87/united-flarmnet] [#68](https://github.com/Turbo87/united-flarmnet/pull/68) Deploy built binary to GitHub Pages ([@Turbo87]) +- [Turbo87/united-flarmnet] [#67](https://github.com/Turbo87/united-flarmnet/pull/67) Simplify unnecessary closure functions ([@Turbo87]) +- [Turbo87/united-flarmnet] [#66](https://github.com/Turbo87/united-flarmnet/pull/66) clippy: Adjust deprecated rule name ([@Turbo87]) +- [Turbo87/united-flarmnet] [#65](https://github.com/Turbo87/united-flarmnet/pull/65) sanitize: Use `char` instead of `&str` for single character search strings ([@Turbo87]) +- [Turbo87/united-flarmnet] [#62](https://github.com/Turbo87/united-flarmnet/pull/62) Add `rust-toolchain.toml` file ([@Turbo87]) +- [ferrous-systems/teaching-material] [#106](https://github.com/ferrous-systems/teaching-material/pull/106) installation: Adjust `IntelliJ` link ([@Turbo87]) +- [ferrous-systems/teaching-material] [#103](https://github.com/ferrous-systems/teaching-material/pull/103) Partially revert "remove `extern crate`" ([@Turbo87]) +- [ferrous-systems/teaching-material] [#102](https://github.com/ferrous-systems/teaching-material/pull/102) presentations/imports-modules-and-visibility: Add missing `struct` keyword ([@Turbo87]) +- [ferrous-systems/teaching-material] [#101](https://github.com/ferrous-systems/teaching-material/pull/101) presentations/cargo: Fix dependency category name ([@Turbo87]) ## TypeScript -- [renovatebot/renovate] - [#15214](https://github.com/renovatebot/renovate/pull/15214) - feat(datasource/crate): fetch crate metadata from crates.io ([@Turbo87]) -- [renovatebot/renovate] - [#15377](https://github.com/renovatebot/renovate/pull/15377) feat(presets): - add support to presets ending with `.json5` or `.json` ([@oscard0m]) +- [renovatebot/renovate] [#15214](https://github.com/renovatebot/renovate/pull/15214) feat(datasource/crate): fetch crate metadata from crates.io ([@Turbo87]) +- [renovatebot/renovate] [#15377](https://github.com/renovatebot/renovate/pull/15377) feat(presets): add support to presets ending with `.json5` or `.json` ([@oscard0m]) ## crates.io -- [rust-lang/crates.io] - [#4788](https://github.com/rust-lang/crates.io/pull/4788) Sentry: Set - transaction name instead of custom `routeName` tag ([@Turbo87]) -- [rust-lang/crates.io] - [#4781](https://github.com/rust-lang/crates.io/pull/4781) Disable in-browser - translation ([@Turbo87]) +- [rust-lang/crates.io] [#4788](https://github.com/rust-lang/crates.io/pull/4788) Sentry: Set transaction name instead of custom `routeName` tag ([@Turbo87]) +- [rust-lang/crates.io] [#4781](https://github.com/rust-lang/crates.io/pull/4781) Disable in-browser translation ([@Turbo87]) [@turbo87]: https://github.com/Turbo87 [@locks]: https://github.com/locks @@ -203,14 +90,11 @@ requests. [ember-learn/guides-source]: https://github.com/ember-learn/guides-source [empress/ember-showdown-prism]: https://github.com/empress/ember-showdown-prism [empress/empress-blog]: https://github.com/empress/empress-blog -[empress/rfc-process-mdbook-template]: - https://github.com/empress/rfc-process-mdbook-template +[empress/rfc-process-mdbook-template]: https://github.com/empress/rfc-process-mdbook-template [empress/rfc-process]: https://github.com/empress/rfc-process -[ferrous-systems/teaching-material]: - https://github.com/ferrous-systems/teaching-material +[ferrous-systems/teaching-material]: https://github.com/ferrous-systems/teaching-material [mansona/ember-get-config]: https://github.com/mansona/ember-get-config -[offirgolan/ember-cp-validations]: - https://github.com/offirgolan/ember-cp-validations +[offirgolan/ember-cp-validations]: https://github.com/offirgolan/ember-cp-validations [qonto/ember-cp-validations]: https://github.com/qonto/ember-cp-validations [renovatebot/renovate]: https://github.com/renovatebot/renovate [rust-lang/crates.io]: https://github.com/rust-lang/crates.io diff --git a/src/twios/2022-06-08.md b/src/twios/2022-06-08.md index e12164085e..688069ceab 100644 --- a/src/twios/2022-06-08.md +++ b/src/twios/2022-06-08.md @@ -1,242 +1,100 @@ ## Ember.js -- [ember-cli/ember-try] [#850](https://github.com/ember-cli/ember-try/pull/850) - Add support for npm overrides ([@mansona]) -- [ember-learn/ember-blog] - [#1154](https://github.com/ember-learn/ember-blog/pull/1154) Release v4.4 - ([@locks]) -- [ember-learn/ember-blog] - [#1157](https://github.com/ember-learn/ember-blog/pull/1157) fix the canonical - declaration of re-posted content ([@mansona]) -- [ember-learn/ember-styleguide] - [#422](https://github.com/ember-learn/ember-styleguide/pull/422) Fix CI - ([@mansona]) -- [ember-learn/ember-styleguide] - [#420](https://github.com/ember-learn/ember-styleguide/pull/420) Update some - dependencies ([@mansona]) -- [ember-learn/guides-source] - [#1821](https://github.com/ember-learn/guides-source/pull/1821) Backport code - sample diff ([@locks]) -- [ember-learn/guides-source] - [#1820](https://github.com/ember-learn/guides-source/pull/1820) v4.4.0 - ([@locks]) -- [ember-learn/handbook] [#68](https://github.com/ember-learn/handbook/pull/68) - Update ember-releases.md ([@locks]) -- [emberjs/core-notes] [#453](https://github.com/emberjs/core-notes/pull/453) - add learning meeting notes for 2022-05-30 ([@mansona]) -- [emberjs/core-notes] [#450](https://github.com/emberjs/core-notes/pull/450) - Learning team Meeting - 9th May ([@mansona]) -- [emberjs/data] [#8000](https://github.com/emberjs/data/pull/8000) - promise-proxies: Fix "Cannot read properties of undefined (reading 'bind')" - error ([@Turbo87]) -- [emberjs/rfcs] [#818](https://github.com/emberjs/rfcs/pull/818) Fix stage for - accepted RFCs ([@locks]) -- [empress/field-guide] [#58](https://github.com/empress/field-guide/pull/58) - WIP fix dynamic component to support embroider-optimised ([@mansona]) -- [empress/rfc-process] [#17](https://github.com/empress/rfc-process/pull/17) - update mdbook-template for testing ([@mansona]) -- [empress/rfc-process] [#16](https://github.com/empress/rfc-process/pull/16) - fix prettier lints ([@mansona]) -- [empress/rfc-process] [#15](https://github.com/empress/rfc-process/pull/15) - add order to stages model ([@mansona]) -- [empress/rfc-process] [#14](https://github.com/empress/rfc-process/pull/14) - Fix some lints from Lint to the Future dashboard ([@mansona]) -- [empress/rfc-process] [#13](https://github.com/empress/rfc-process/pull/13) - navigate to all pages in a test ([@mansona]) -- [empress/rfc-process] [#12](https://github.com/empress/rfc-process/pull/12) - Add grouped Table of Contents file ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#13](https://github.com/empress/rfc-process-mdbook-template/pull/13) UI - tweaks ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#12](https://github.com/empress/rfc-process-mdbook-template/pull/12) Group - the Table of Contents by Stage ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#11](https://github.com/empress/rfc-process-mdbook-template/pull/11) Fix last - two lints from Lint to the Future dashboard ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#10](https://github.com/empress/rfc-process-mdbook-template/pull/10) Add a - tests that visits all routes ([@mansona]) -- [mansona/ember-get-config] - [#44](https://github.com/mansona/ember-get-config/pull/44) Fix fastboot double - wrapping default export/import ([@mansona]) -- [mansona/ember-html-excerpt] - [#5](https://github.com/mansona/ember-html-excerpt/pull/5) update downsize-cjs - to allow it to support esm directly ([@mansona]) -- [mansona/ember-html-excerpt] - [#4](https://github.com/mansona/ember-html-excerpt/pull/4) add deprecation - checks with ember-try ([@mansona]) -- [mansona/ember-html-excerpt] - [#3](https://github.com/mansona/ember-html-excerpt/pull/3) Support Ember 4.x - ([@mansona]) -- [mansona/ember-html-excerpt] - [#2](https://github.com/mansona/ember-html-excerpt/pull/2) update to 3.28 with - ember-cli-update ([@mansona]) -- [mansona/ember-html-excerpt] - [#1](https://github.com/mansona/ember-html-excerpt/pull/1) Fix CI ([@mansona]) -- [miguelcobain/ember-paper] - [#1220](https://github.com/miguelcobain/ember-paper/pull/1220) Convert - PaperGridList to native class syntax ([@mansona]) -- [miguelcobain/ember-paper] - [#1219](https://github.com/miguelcobain/ember-paper/pull/1219) upgrade - angular-material-styles to remove sass deprecation ([@mansona]) -- [miguelcobain/ember-paper] - [#1218](https://github.com/miguelcobain/ember-paper/pull/1218) Remove - ember-cp-validations from demo application ([@mansona]) -- [mainmatter/ember-promise-modals] - [#688](https://github.com/mainmatter/ember-promise-modals/pull/688) Prefer - "happy path" code style for `_resolve()` ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#687](https://github.com/mainmatter/ember-promise-modals/pull/687) Extract - destruction of the modals effects into a method and apply them ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#686](https://github.com/mainmatter/ember-promise-modals/pull/686) Closing - the modal should inform the modals service ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#685](https://github.com/mainmatter/ember-promise-modals/pull/685) Move - attaching/detaching `animationend` event handler into methods and generalize - related names ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#684](https://github.com/mainmatter/ember-promise-modals/pull/684) Move - focusTrap setup/teardown to methods ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#683](https://github.com/mainmatter/ember-promise-modals/pull/683) Replace - retained element reference with a method ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#682](https://github.com/mainmatter/ember-promise-modals/pull/682) Improve - test helper ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#672](https://github.com/mainmatter/ember-promise-modals/pull/672) Enable - `onAnimationModalInEnd` callback ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#671](https://github.com/mainmatter/ember-promise-modals/pull/671) Pin - dependencies ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#670](https://github.com/mainmatter/ember-promise-modals/pull/670) Version - updates ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#669](https://github.com/mainmatter/ember-promise-modals/pull/669) Ensure - modal gets removed even when animationend fails ([@pichfl]) -- [mainmatter/ember-promise-modals] - [#681](https://github.com/mainmatter/ember-promise-modals/pull/681) remove - dependabot configuration ([@nickschot]) -- [mainmatter/ember-simple-auth] - [#2420](https://github.com/mainmatter/ember-simple-auth/pull/2420) Drop - support for Ember <= 3.12 ([@marcoow]) -- [mainmatter/ember-simple-auth] - [#2419](https://github.com/mainmatter/ember-simple-auth/pull/2419) Run CI on - Node 14 ([@marcoow]) -- [mainmatter/ember-simple-auth] - [#2418](https://github.com/mainmatter/ember-simple-auth/pull/2418) Use Volta - ([@marcoow]) -- [mainmatter/qunit-dom] - [#1600](https://github.com/mainmatter/qunit-dom/pull/1600) package.json: - Specify `packageManager` field ([@Turbo87]) -- [mainmatter/qunit-dom] - [#1598](https://github.com/mainmatter/qunit-dom/pull/1598) tests: Remove - `global` usage ([@Turbo87]) -- [mainmatter/qunit-dom] - [#1574](https://github.com/mainmatter/qunit-dom/pull/1574) Remove - `.pnpm-debug.log` file ([@Turbo87]) -- [mainmatter/qunit-dom] - [#1573](https://github.com/mainmatter/qunit-dom/pull/1573) CI: Update Node.js - versions ([@Turbo87]) -- [mainmatter/qunit-dom] - [#1572](https://github.com/mainmatter/qunit-dom/pull/1572) Remove `engines` - declaration from `package.json` ([@Turbo87]) +- [ember-cli/ember-try] [#850](https://github.com/ember-cli/ember-try/pull/850) Add support for npm overrides ([@mansona]) +- [ember-learn/ember-blog] [#1154](https://github.com/ember-learn/ember-blog/pull/1154) Release v4.4 ([@locks]) +- [ember-learn/ember-blog] [#1157](https://github.com/ember-learn/ember-blog/pull/1157) fix the canonical declaration of re-posted content ([@mansona]) +- [ember-learn/ember-styleguide] [#422](https://github.com/ember-learn/ember-styleguide/pull/422) Fix CI ([@mansona]) +- [ember-learn/ember-styleguide] [#420](https://github.com/ember-learn/ember-styleguide/pull/420) Update some dependencies ([@mansona]) +- [ember-learn/guides-source] [#1821](https://github.com/ember-learn/guides-source/pull/1821) Backport code sample diff ([@locks]) +- [ember-learn/guides-source] [#1820](https://github.com/ember-learn/guides-source/pull/1820) v4.4.0 ([@locks]) +- [ember-learn/handbook] [#68](https://github.com/ember-learn/handbook/pull/68) Update ember-releases.md ([@locks]) +- [emberjs/core-notes] [#453](https://github.com/emberjs/core-notes/pull/453) add learning meeting notes for 2022-05-30 ([@mansona]) +- [emberjs/core-notes] [#450](https://github.com/emberjs/core-notes/pull/450) Learning team Meeting - 9th May ([@mansona]) +- [emberjs/data] [#8000](https://github.com/emberjs/data/pull/8000) promise-proxies: Fix "Cannot read properties of undefined (reading 'bind')" error ([@Turbo87]) +- [emberjs/rfcs] [#818](https://github.com/emberjs/rfcs/pull/818) Fix stage for accepted RFCs ([@locks]) +- [empress/field-guide] [#58](https://github.com/empress/field-guide/pull/58) WIP fix dynamic component to support embroider-optimised ([@mansona]) +- [empress/rfc-process] [#17](https://github.com/empress/rfc-process/pull/17) update mdbook-template for testing ([@mansona]) +- [empress/rfc-process] [#16](https://github.com/empress/rfc-process/pull/16) fix prettier lints ([@mansona]) +- [empress/rfc-process] [#15](https://github.com/empress/rfc-process/pull/15) add order to stages model ([@mansona]) +- [empress/rfc-process] [#14](https://github.com/empress/rfc-process/pull/14) Fix some lints from Lint to the Future dashboard ([@mansona]) +- [empress/rfc-process] [#13](https://github.com/empress/rfc-process/pull/13) navigate to all pages in a test ([@mansona]) +- [empress/rfc-process] [#12](https://github.com/empress/rfc-process/pull/12) Add grouped Table of Contents file ([@mansona]) +- [empress/rfc-process-mdbook-template] [#13](https://github.com/empress/rfc-process-mdbook-template/pull/13) UI tweaks ([@mansona]) +- [empress/rfc-process-mdbook-template] [#12](https://github.com/empress/rfc-process-mdbook-template/pull/12) Group the Table of Contents by Stage ([@mansona]) +- [empress/rfc-process-mdbook-template] [#11](https://github.com/empress/rfc-process-mdbook-template/pull/11) Fix last two lints from Lint to the Future dashboard ([@mansona]) +- [empress/rfc-process-mdbook-template] [#10](https://github.com/empress/rfc-process-mdbook-template/pull/10) Add a tests that visits all routes ([@mansona]) +- [mansona/ember-get-config] [#44](https://github.com/mansona/ember-get-config/pull/44) Fix fastboot double wrapping default export/import ([@mansona]) +- [mansona/ember-html-excerpt] [#5](https://github.com/mansona/ember-html-excerpt/pull/5) update downsize-cjs to allow it to support esm directly ([@mansona]) +- [mansona/ember-html-excerpt] [#4](https://github.com/mansona/ember-html-excerpt/pull/4) add deprecation checks with ember-try ([@mansona]) +- [mansona/ember-html-excerpt] [#3](https://github.com/mansona/ember-html-excerpt/pull/3) Support Ember 4.x ([@mansona]) +- [mansona/ember-html-excerpt] [#2](https://github.com/mansona/ember-html-excerpt/pull/2) update to 3.28 with ember-cli-update ([@mansona]) +- [mansona/ember-html-excerpt] [#1](https://github.com/mansona/ember-html-excerpt/pull/1) Fix CI ([@mansona]) +- [miguelcobain/ember-paper] [#1220](https://github.com/miguelcobain/ember-paper/pull/1220) Convert PaperGridList to native class syntax ([@mansona]) +- [miguelcobain/ember-paper] [#1219](https://github.com/miguelcobain/ember-paper/pull/1219) upgrade angular-material-styles to remove sass deprecation ([@mansona]) +- [miguelcobain/ember-paper] [#1218](https://github.com/miguelcobain/ember-paper/pull/1218) Remove ember-cp-validations from demo application ([@mansona]) +- [mainmatter/ember-promise-modals] [#688](https://github.com/mainmatter/ember-promise-modals/pull/688) Prefer "happy path" code style for `_resolve()` ([@pichfl]) +- [mainmatter/ember-promise-modals] [#687](https://github.com/mainmatter/ember-promise-modals/pull/687) Extract destruction of the modals effects into a method and apply them ([@pichfl]) +- [mainmatter/ember-promise-modals] [#686](https://github.com/mainmatter/ember-promise-modals/pull/686) Closing the modal should inform the modals service ([@pichfl]) +- [mainmatter/ember-promise-modals] [#685](https://github.com/mainmatter/ember-promise-modals/pull/685) Move attaching/detaching `animationend` event handler into methods and generalize related names ([@pichfl]) +- [mainmatter/ember-promise-modals] [#684](https://github.com/mainmatter/ember-promise-modals/pull/684) Move focusTrap setup/teardown to methods ([@pichfl]) +- [mainmatter/ember-promise-modals] [#683](https://github.com/mainmatter/ember-promise-modals/pull/683) Replace retained element reference with a method ([@pichfl]) +- [mainmatter/ember-promise-modals] [#682](https://github.com/mainmatter/ember-promise-modals/pull/682) Improve test helper ([@pichfl]) +- [mainmatter/ember-promise-modals] [#672](https://github.com/mainmatter/ember-promise-modals/pull/672) Enable `onAnimationModalInEnd` callback ([@pichfl]) +- [mainmatter/ember-promise-modals] [#671](https://github.com/mainmatter/ember-promise-modals/pull/671) Pin dependencies ([@pichfl]) +- [mainmatter/ember-promise-modals] [#670](https://github.com/mainmatter/ember-promise-modals/pull/670) Version updates ([@pichfl]) +- [mainmatter/ember-promise-modals] [#669](https://github.com/mainmatter/ember-promise-modals/pull/669) Ensure modal gets removed even when animationend fails ([@pichfl]) +- [mainmatter/ember-promise-modals] [#681](https://github.com/mainmatter/ember-promise-modals/pull/681) remove dependabot configuration ([@nickschot]) +- [mainmatter/ember-simple-auth] [#2420](https://github.com/mainmatter/ember-simple-auth/pull/2420) Drop support for Ember <= 3.12 ([@marcoow]) +- [mainmatter/ember-simple-auth] [#2419](https://github.com/mainmatter/ember-simple-auth/pull/2419) Run CI on Node 14 ([@marcoow]) +- [mainmatter/ember-simple-auth] [#2418](https://github.com/mainmatter/ember-simple-auth/pull/2418) Use Volta ([@marcoow]) +- [mainmatter/qunit-dom] [#1600](https://github.com/mainmatter/qunit-dom/pull/1600) package.json: Specify `packageManager` field ([@Turbo87]) +- [mainmatter/qunit-dom] [#1598](https://github.com/mainmatter/qunit-dom/pull/1598) tests: Remove `global` usage ([@Turbo87]) +- [mainmatter/qunit-dom] [#1574](https://github.com/mainmatter/qunit-dom/pull/1574) Remove `.pnpm-debug.log` file ([@Turbo87]) +- [mainmatter/qunit-dom] [#1573](https://github.com/mainmatter/qunit-dom/pull/1573) CI: Update Node.js versions ([@Turbo87]) +- [mainmatter/qunit-dom] [#1572](https://github.com/mainmatter/qunit-dom/pull/1572) Remove `engines` declaration from `package.json` ([@Turbo87]) ## JavaScript -- [Turbo87/lva-camo-status] - [#651](https://github.com/Turbo87/lva-camo-status/pull/651) CI: Update Node.js - to v16 ([@Turbo87]) -- [mansona/Downsize] [#6](https://github.com/mansona/Downsize/pull/6) fix module - definition for esm (.mjs instead of .js) ([@mansona]) -- [mansona/Downsize] [#5](https://github.com/mansona/Downsize/pull/5) Add - auto-changelog ([@mansona]) -- [mansona/Downsize] [#4](https://github.com/mansona/Downsize/pull/4) breaking: - drop support for EOL Node versions and fix Unicode for modern JS ([@mansona]) -- [mansona/Downsize] [#3](https://github.com/mansona/Downsize/pull/3) move from - travis to GitHub Actions ([@mansona]) -- [mansona/Downsize] [#2](https://github.com/mansona/Downsize/pull/2) Support - esm ([@mansona]) -- [mansona/Downsize] [#1](https://github.com/mansona/Downsize/pull/1) - Feature/cjs ([@mansona]) -- [platinumazure/eslint-plugin-qunit] - [#233](https://github.com/platinumazure/eslint-plugin-qunit/pull/233) add - `allowFunctions` as an allow-list for require-expect function calls - ([@mansona]) +- [Turbo87/lva-camo-status] [#651](https://github.com/Turbo87/lva-camo-status/pull/651) CI: Update Node.js to v16 ([@Turbo87]) +- [mansona/Downsize] [#6](https://github.com/mansona/Downsize/pull/6) fix module definition for esm (.mjs instead of .js) ([@mansona]) +- [mansona/Downsize] [#5](https://github.com/mansona/Downsize/pull/5) Add auto-changelog ([@mansona]) +- [mansona/Downsize] [#4](https://github.com/mansona/Downsize/pull/4) breaking: drop support for EOL Node versions and fix Unicode for modern JS ([@mansona]) +- [mansona/Downsize] [#3](https://github.com/mansona/Downsize/pull/3) move from travis to GitHub Actions ([@mansona]) +- [mansona/Downsize] [#2](https://github.com/mansona/Downsize/pull/2) Support esm ([@mansona]) +- [mansona/Downsize] [#1](https://github.com/mansona/Downsize/pull/1) Feature/cjs ([@mansona]) +- [platinumazure/eslint-plugin-qunit] [#233](https://github.com/platinumazure/eslint-plugin-qunit/pull/233) add `allowFunctions` as an allow-list for require-expect function calls ([@mansona]) ## Lint to the future -- [mansona/lint-to-the-future] - [#24](https://github.com/mansona/lint-to-the-future/pull/24) try importing an - esm module before reverting to `importCwd` ([@mansona]) -- [mansona/lint-to-the-future] - [#23](https://github.com/mansona/lint-to-the-future/pull/23) add documentation - for plugin developers ([@mansona]) -- [mansona/lint-to-the-future-ember-template] - [#14](https://github.com/mansona/lint-to-the-future-ember-template/pull/14) - Add lib to discovery folders ([@locks]) -- [mansona/lint-to-the-future-ember-template] - [#11](https://github.com/mansona/lint-to-the-future-ember-template/pull/11) - add matrix test for all ember-template-lint versions and fix ESM issue with - ember-template-lint@4 ([@mansona]) -- [mansona/lint-to-the-future-ember-template] - [#10](https://github.com/mansona/lint-to-the-future-ember-template/pull/10) - breaking: drop support for node < 14 and fix CI ([@mansona]) +- [mansona/lint-to-the-future] [#24](https://github.com/mansona/lint-to-the-future/pull/24) try importing an esm module before reverting to `importCwd` ([@mansona]) +- [mansona/lint-to-the-future] [#23](https://github.com/mansona/lint-to-the-future/pull/23) add documentation for plugin developers ([@mansona]) +- [mansona/lint-to-the-future-ember-template] [#14](https://github.com/mansona/lint-to-the-future-ember-template/pull/14) Add lib to discovery folders ([@locks]) +- [mansona/lint-to-the-future-ember-template] [#11](https://github.com/mansona/lint-to-the-future-ember-template/pull/11) add matrix test for all ember-template-lint versions and fix ESM issue with ember-template-lint@4 ([@mansona]) +- [mansona/lint-to-the-future-ember-template] [#10](https://github.com/mansona/lint-to-the-future-ember-template/pull/10) breaking: drop support for node < 14 and fix CI ([@mansona]) ## Octokit -- [octokit/plugin-paginate-rest.js] - [#376](https://github.com/octokit/plugin-paginate-rest.js/pull/376) - ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) -- [octokit/types.ts] [#389](https://github.com/octokit/types.ts/pull/389) - ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) +- [octokit/plugin-paginate-rest.js] [#376](https://github.com/octokit/plugin-paginate-rest.js/pull/376) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) +- [octokit/types.ts] [#389](https://github.com/octokit/types.ts/pull/389) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) ## Rust -- [Turbo87/united-flarmnet] - [#90](https://github.com/Turbo87/united-flarmnet/pull/90) ogn: Simplify JSON - parsing ([@Turbo87]) -- [ferrous-systems/teaching-material] - [#110](https://github.com/ferrous-systems/teaching-material/pull/110) - presentations/macros: Fix typo ([@Turbo87]) -- [ferrous-systems/teaching-material] - [#109](https://github.com/ferrous-systems/teaching-material/pull/109) - presentations/macros: Adjust `write!()` signature ([@Turbo87]) -- [svartalf/rust-claim] [#10](https://github.com/svartalf/rust-claim/pull/10) - autocfg: Allow all v1.x releases ([@Turbo87]) +- [Turbo87/united-flarmnet] [#90](https://github.com/Turbo87/united-flarmnet/pull/90) ogn: Simplify JSON parsing ([@Turbo87]) +- [ferrous-systems/teaching-material] [#110](https://github.com/ferrous-systems/teaching-material/pull/110) presentations/macros: Fix typo ([@Turbo87]) +- [ferrous-systems/teaching-material] [#109](https://github.com/ferrous-systems/teaching-material/pull/109) presentations/macros: Adjust `write!()` signature ([@Turbo87]) +- [svartalf/rust-claim] [#10](https://github.com/svartalf/rust-claim/pull/10) autocfg: Allow all v1.x releases ([@Turbo87]) ## crates.io -- [rust-lang/crates.io] - [#4861](https://github.com/rust-lang/crates.io/pull/4861) router: Remove - `/api/v1/` subrouter ([@Turbo87]) -- [rust-lang/crates.io] - [#4859](https://github.com/rust-lang/crates.io/pull/4859) sentry: Replace - `Ember` import from `@sentry/integrations` ([@Turbo87]) -- [rust-lang/crates.io] - [#4858](https://github.com/rust-lang/crates.io/pull/4858) Remove unused - `docs.rs` metadata ([@Turbo87]) -- [rust-lang/crates.io] - [#4857](https://github.com/rust-lang/crates.io/pull/4857) claim: Use git - dependency ([@Turbo87]) -- [rust-lang/crates.io] - [#4836](https://github.com/rust-lang/crates.io/pull/4836) admin/upload_index: - Use `indicatif` for progress reporting ([@Turbo87]) -- [rust-lang/crates.io] - [#4825](https://github.com/rust-lang/crates.io/pull/4825) Simplify CIDR - parsing code ([@Turbo87]) -- [rust-lang/crates.io] - [#4814](https://github.com/rust-lang/crates.io/pull/4814) search: Fix app - crash without given `q` query parameter ([@Turbo87]) -- [rust-lang/crates.io] - [#4813](https://github.com/rust-lang/crates.io/pull/4813) catch-all: Fix - `reload()` action ([@Turbo87]) -- [rust-lang/crates.io] - [#4794](https://github.com/rust-lang/crates.io/pull/4794) renovate: - Automatically merge linting and testing dependency updates ([@Turbo87]) +- [rust-lang/crates.io] [#4861](https://github.com/rust-lang/crates.io/pull/4861) router: Remove `/api/v1/` subrouter ([@Turbo87]) +- [rust-lang/crates.io] [#4859](https://github.com/rust-lang/crates.io/pull/4859) sentry: Replace `Ember` import from `@sentry/integrations` ([@Turbo87]) +- [rust-lang/crates.io] [#4858](https://github.com/rust-lang/crates.io/pull/4858) Remove unused `docs.rs` metadata ([@Turbo87]) +- [rust-lang/crates.io] [#4857](https://github.com/rust-lang/crates.io/pull/4857) claim: Use git dependency ([@Turbo87]) +- [rust-lang/crates.io] [#4836](https://github.com/rust-lang/crates.io/pull/4836) admin/upload_index: Use `indicatif` for progress reporting ([@Turbo87]) +- [rust-lang/crates.io] [#4825](https://github.com/rust-lang/crates.io/pull/4825) Simplify CIDR parsing code ([@Turbo87]) +- [rust-lang/crates.io] [#4814](https://github.com/rust-lang/crates.io/pull/4814) search: Fix app crash without given `q` query parameter ([@Turbo87]) +- [rust-lang/crates.io] [#4813](https://github.com/rust-lang/crates.io/pull/4813) catch-all: Fix `reload()` action ([@Turbo87]) +- [rust-lang/crates.io] [#4794](https://github.com/rust-lang/crates.io/pull/4794) renovate: Automatically merge linting and testing dependency updates ([@Turbo87]) [@bobrimperator]: https://github.com/BobrImperator [@turbo87]: https://github.com/Turbo87 @@ -257,26 +115,20 @@ [emberjs/data]: https://github.com/emberjs/data [emberjs/rfcs]: https://github.com/emberjs/rfcs [empress/field-guide]: https://github.com/empress/field-guide -[empress/rfc-process-mdbook-template]: - https://github.com/empress/rfc-process-mdbook-template +[empress/rfc-process-mdbook-template]: https://github.com/empress/rfc-process-mdbook-template [empress/rfc-process]: https://github.com/empress/rfc-process -[ferrous-systems/teaching-material]: - https://github.com/ferrous-systems/teaching-material +[ferrous-systems/teaching-material]: https://github.com/ferrous-systems/teaching-material [mansona/downsize]: https://github.com/mansona/Downsize [mansona/ember-get-config]: https://github.com/mansona/ember-get-config [mansona/ember-html-excerpt]: https://github.com/mansona/ember-html-excerpt -[mansona/lint-to-the-future-ember-template]: - https://github.com/mansona/lint-to-the-future-ember-template +[mansona/lint-to-the-future-ember-template]: https://github.com/mansona/lint-to-the-future-ember-template [mansona/lint-to-the-future]: https://github.com/mansona/lint-to-the-future [miguelcobain/ember-paper]: https://github.com/miguelcobain/ember-paper -[octokit/plugin-paginate-rest.js]: - https://github.com/octokit/plugin-paginate-rest.js +[octokit/plugin-paginate-rest.js]: https://github.com/octokit/plugin-paginate-rest.js [octokit/types.ts]: https://github.com/octokit/types.ts -[platinumazure/eslint-plugin-qunit]: - https://github.com/platinumazure/eslint-plugin-qunit +[platinumazure/eslint-plugin-qunit]: https://github.com/platinumazure/eslint-plugin-qunit [rust-lang/crates.io]: https://github.com/rust-lang/crates.io -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth [mainmatter/qunit-dom]: https://github.com/mainmatter/qunit-dom [svartalf/rust-claim]: https://github.com/svartalf/rust-claim diff --git a/src/twios/2022-07-11.md b/src/twios/2022-07-11.md index 614c6b113d..6eeca2f47a 100644 --- a/src/twios/2022-07-11.md +++ b/src/twios/2022-07-11.md @@ -1,296 +1,130 @@ ## Rust -- [Turbo87/sentry-conduit] - [#80](https://github.com/Turbo87/sentry-conduit/pull/80) Update minimum Rust - version to v1.57.0 ([@Turbo87]) -- [Turbo87/sentry-conduit] - [#79](https://github.com/Turbo87/sentry-conduit/pull/79) Improve HTTP status - code mapping ([@Turbo87]) -- [Turbo87/sentry-conduit] - [#76](https://github.com/Turbo87/sentry-conduit/pull/76) Implement performance - tracing support ([@Turbo87]) -- [Turbo87/sentry-conduit] - [#75](https://github.com/Turbo87/sentry-conduit/pull/75) examples: Add two - more routes ([@Turbo87]) +- [Turbo87/sentry-conduit] [#80](https://github.com/Turbo87/sentry-conduit/pull/80) Update minimum Rust version to v1.57.0 ([@Turbo87]) +- [Turbo87/sentry-conduit] [#79](https://github.com/Turbo87/sentry-conduit/pull/79) Improve HTTP status code mapping ([@Turbo87]) +- [Turbo87/sentry-conduit] [#76](https://github.com/Turbo87/sentry-conduit/pull/76) Implement performance tracing support ([@Turbo87]) +- [Turbo87/sentry-conduit] [#75](https://github.com/Turbo87/sentry-conduit/pull/75) examples: Add two more routes ([@Turbo87]) ## crates.io -- [rust-lang/crates.io] - [#4921](https://github.com/rust-lang/crates.io/pull/4921) version::downloads: - Simplify `add_custom_metadata()` usage ([@Turbo87]) -- [rust-lang/crates.io] - [#4884](https://github.com/rust-lang/crates.io/pull/4884) sentry: Enable - performance tracing via `SENTRY_TRACES_SAMPLE_RATE` env var ([@Turbo87]) +- [rust-lang/crates.io] [#4921](https://github.com/rust-lang/crates.io/pull/4921) version::downloads: Simplify `add_custom_metadata()` usage ([@Turbo87]) +- [rust-lang/crates.io] [#4884](https://github.com/rust-lang/crates.io/pull/4884) sentry: Enable performance tracing via `SENTRY_TRACES_SAMPLE_RATE` env var ([@Turbo87]) ## Mock Service Worker -- [mswjs/cookies] [#22](https://github.com/mswjs/cookies/pull/22) ci(ci.yml): - remove unused matrix of versions ([@oscard0m]) -- [mswjs/cookies] [#21](https://github.com/mswjs/cookies/pull/21) ci(release): - use node-version 16 ([@oscard0m]) -- [mswjs/cookies] [#20](https://github.com/mswjs/cookies/pull/20) ci(ci.yml): - use node-version 16 ([@oscard0m]) -- [mswjs/gh-issue-forms] [#3](https://github.com/mswjs/gh-issue-forms/pull/3) - chore(push.sh): remove 'push.sh' file ([@oscard0m]) -- [mswjs/interceptors] [#271](https://github.com/mswjs/interceptors/pull/271) - ci(release): use node-version 16 ([@oscard0m]) -- [mswjs/msw-storybook-addon] - [#86](https://github.com/mswjs/msw-storybook-addon/pull/86) ci(release): use - node-version 16 ([@oscard0m]) -- [mswjs/msw] [#1303](https://github.com/mswjs/msw/pull/1303) ci(smoke): use - node-version 16 ([@oscard0m]) +- [mswjs/cookies] [#22](https://github.com/mswjs/cookies/pull/22) ci(ci.yml): remove unused matrix of versions ([@oscard0m]) +- [mswjs/cookies] [#21](https://github.com/mswjs/cookies/pull/21) ci(release): use node-version 16 ([@oscard0m]) +- [mswjs/cookies] [#20](https://github.com/mswjs/cookies/pull/20) ci(ci.yml): use node-version 16 ([@oscard0m]) +- [mswjs/gh-issue-forms] [#3](https://github.com/mswjs/gh-issue-forms/pull/3) chore(push.sh): remove 'push.sh' file ([@oscard0m]) +- [mswjs/interceptors] [#271](https://github.com/mswjs/interceptors/pull/271) ci(release): use node-version 16 ([@oscard0m]) +- [mswjs/msw-storybook-addon] [#86](https://github.com/mswjs/msw-storybook-addon/pull/86) ci(release): use node-version 16 ([@oscard0m]) +- [mswjs/msw] [#1303](https://github.com/mswjs/msw/pull/1303) ci(smoke): use node-version 16 ([@oscard0m]) ## Octoherd -- [octoherd/.github] [#4](https://github.com/octoherd/.github/pull/4) - ci(renovate): configure renovate to pin GitHub Actions digests ([@oscard0m]) -- [octoherd/.github] [#3](https://github.com/octoherd/.github/pull/3) - ci(renovate): rename the config file to default.json ([@oscard0m]) +- [octoherd/.github] [#4](https://github.com/octoherd/.github/pull/4) ci(renovate): configure renovate to pin GitHub Actions digests ([@oscard0m]) +- [octoherd/.github] [#3](https://github.com/octoherd/.github/pull/3) ci(renovate): rename the config file to default.json ([@oscard0m]) ## Ember.js -- [babel/ember-cli-babel] - [#451](https://github.com/babel/ember-cli-babel/pull/451) unpin @babel/runtime - to see what tests fail ([@mansona]) -- [ef4/ember-auto-import] - [#528](https://github.com/ef4/ember-auto-import/pull/528) WIP trying to turn a - build error into a runtime error ([@mansona]) -- [ember-learn/ember-blog] - [#1163](https://github.com/ember-learn/ember-blog/pull/1163) add a blurb for - Lint to the Future ([@mansona]) -- [ember-learn/ember-help-wanted-server] - [#50](https://github.com/ember-learn/ember-help-wanted-server/pull/50) update - stack used for preview apps ([@mansona]) -- [ember-learn/ember-styleguide] - [#424](https://github.com/ember-learn/ember-styleguide/pull/424) update - lint-to-the-future dependencies ([@mansona]) -- [ember-learn/empress-blog-ember-template] - [#122](https://github.com/ember-learn/empress-blog-ember-template/pull/122) - Replace custom TagPostList styles with Styleguide ([@mansona]) -- [ember-learn/rfcs-app] [#7](https://github.com/ember-learn/rfcs-app/pull/7) - update mdbook template ([@mansona]) -- [ember-learn/rfcs-app] [#6](https://github.com/ember-learn/rfcs-app/pull/6) - use github compatible header ids ([@mansona]) -- [ember-learn/rfcs-app] [#4](https://github.com/ember-learn/rfcs-app/pull/4) - Include images in the output build ([@mansona]) -- [emberjs/ember.js] [#20120](https://github.com/emberjs/ember.js/pull/20120) - [BUGFIX LTS] unique-id: Ensure return value starts with a letter to avoid - invalid selectors starting with numeric digits ([@Turbo87]) -- [emberjs/rfcs] [#828](https://github.com/emberjs/rfcs/pull/828) fix image urls - in embedded images ([@mansona]) -- [emberjs/rfcs] [#826](https://github.com/emberjs/rfcs/pull/826) disable mdbook - builds ([@mansona]) -- [emberjs/rfcs] [#825](https://github.com/emberjs/rfcs/pull/825) Add redirects - for all the github.io links to the new RFCs app ([@mansona]) -- [empress/field-guide] [#59](https://github.com/empress/field-guide/pull/59) - Implement indexes ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#14](https://github.com/empress/rfc-process-mdbook-template/pull/14) remove - index number from table of contents ([@mansona]) -- [mansona/ember-body-class] - [#59](https://github.com/mansona/ember-body-class/pull/59) update - ember-auto-import to support Ember 4.x ([@mansona]) -- [mansona/ember-body-class] - [#58](https://github.com/mansona/ember-body-class/pull/58) Breaking: drop - support for Ember < 3.8 ([@mansona]) -- [mansona/ember-body-class] - [#57](https://github.com/mansona/ember-body-class/pull/57) remove router - deprecation ([@mansona]) -- [mansona/ember-body-class] - [#52](https://github.com/mansona/ember-body-class/pull/52) Breaking: drop - support for node < 14 ([@mansona]) -- [mansona/ember-body-class] - [#51](https://github.com/mansona/ember-body-class/pull/51) Update Ember to - 3.28 with ember-cli-update ([@mansona]) -- [mansona/ember-cli-babel] - [#1](https://github.com/mansona/ember-cli-babel/pull/1) Unpin babel runtime - ([@mansona]) -- [mansona/ember-cli-notifications] - [#342](https://github.com/mansona/ember-cli-notifications/pull/342) Refactor: - Handle notification htmlContent in backing class ([@pichfl]) -- [mansona/ember-cli-notifications] - [#341](https://github.com/mansona/ember-cli-notifications/pull/341) Fix - ember-try scenarios ([@mansona]) -- [mansona/ember-get-config] - [#46](https://github.com/mansona/ember-get-config/pull/46) Fix ember-try - issues ([@mansona]) -- [mainmatter/ember-intl-analyzer] - [#528](https://github.com/mainmatter/ember-intl-analyzer/pull/528) Add custom - plugin/extension support ([@Mikek2252]) -- [zeppelin/ember-click-outside] - [#246](https://github.com/zeppelin/ember-click-outside/pull/246) Prettify + - replace ancient syntax in tests & dummy app ([@zeppelin]) -- [zeppelin/ember-click-outside] - [#245](https://github.com/zeppelin/ember-click-outside/pull/245) Deprecate - ClickOutside component ([@zeppelin]) -- [zeppelin/ember-click-outside] - [#244](https://github.com/zeppelin/ember-click-outside/pull/244) Remove - deprecated ClickOutsideMixin ([@zeppelin]) -- [zeppelin/ember-click-outside] - [#243](https://github.com/zeppelin/ember-click-outside/pull/243) Remove - component template containing a single yield ([@zeppelin]) -- [zeppelin/ember-click-outside] - [#242](https://github.com/zeppelin/ember-click-outside/pull/242) Drop - ember-modifier < 3.2.0 & resolve deprecations ([@nickschot]) +- [babel/ember-cli-babel] [#451](https://github.com/babel/ember-cli-babel/pull/451) unpin @babel/runtime to see what tests fail ([@mansona]) +- [ef4/ember-auto-import] [#528](https://github.com/ef4/ember-auto-import/pull/528) WIP trying to turn a build error into a runtime error ([@mansona]) +- [ember-learn/ember-blog] [#1163](https://github.com/ember-learn/ember-blog/pull/1163) add a blurb for Lint to the Future ([@mansona]) +- [ember-learn/ember-help-wanted-server] [#50](https://github.com/ember-learn/ember-help-wanted-server/pull/50) update stack used for preview apps ([@mansona]) +- [ember-learn/ember-styleguide] [#424](https://github.com/ember-learn/ember-styleguide/pull/424) update lint-to-the-future dependencies ([@mansona]) +- [ember-learn/empress-blog-ember-template] [#122](https://github.com/ember-learn/empress-blog-ember-template/pull/122) Replace custom TagPostList styles with Styleguide ([@mansona]) +- [ember-learn/rfcs-app] [#7](https://github.com/ember-learn/rfcs-app/pull/7) update mdbook template ([@mansona]) +- [ember-learn/rfcs-app] [#6](https://github.com/ember-learn/rfcs-app/pull/6) use github compatible header ids ([@mansona]) +- [ember-learn/rfcs-app] [#4](https://github.com/ember-learn/rfcs-app/pull/4) Include images in the output build ([@mansona]) +- [emberjs/ember.js] [#20120](https://github.com/emberjs/ember.js/pull/20120) [BUGFIX LTS] unique-id: Ensure return value starts with a letter to avoid invalid selectors starting with numeric digits ([@Turbo87]) +- [emberjs/rfcs] [#828](https://github.com/emberjs/rfcs/pull/828) fix image urls in embedded images ([@mansona]) +- [emberjs/rfcs] [#826](https://github.com/emberjs/rfcs/pull/826) disable mdbook builds ([@mansona]) +- [emberjs/rfcs] [#825](https://github.com/emberjs/rfcs/pull/825) Add redirects for all the github.io links to the new RFCs app ([@mansona]) +- [empress/field-guide] [#59](https://github.com/empress/field-guide/pull/59) Implement indexes ([@mansona]) +- [empress/rfc-process-mdbook-template] [#14](https://github.com/empress/rfc-process-mdbook-template/pull/14) remove index number from table of contents ([@mansona]) +- [mansona/ember-body-class] [#59](https://github.com/mansona/ember-body-class/pull/59) update ember-auto-import to support Ember 4.x ([@mansona]) +- [mansona/ember-body-class] [#58](https://github.com/mansona/ember-body-class/pull/58) Breaking: drop support for Ember < 3.8 ([@mansona]) +- [mansona/ember-body-class] [#57](https://github.com/mansona/ember-body-class/pull/57) remove router deprecation ([@mansona]) +- [mansona/ember-body-class] [#52](https://github.com/mansona/ember-body-class/pull/52) Breaking: drop support for node < 14 ([@mansona]) +- [mansona/ember-body-class] [#51](https://github.com/mansona/ember-body-class/pull/51) Update Ember to 3.28 with ember-cli-update ([@mansona]) +- [mansona/ember-cli-babel] [#1](https://github.com/mansona/ember-cli-babel/pull/1) Unpin babel runtime ([@mansona]) +- [mansona/ember-cli-notifications] [#342](https://github.com/mansona/ember-cli-notifications/pull/342) Refactor: Handle notification htmlContent in backing class ([@pichfl]) +- [mansona/ember-cli-notifications] [#341](https://github.com/mansona/ember-cli-notifications/pull/341) Fix ember-try scenarios ([@mansona]) +- [mansona/ember-get-config] [#46](https://github.com/mansona/ember-get-config/pull/46) Fix ember-try issues ([@mansona]) +- [mainmatter/ember-intl-analyzer] [#528](https://github.com/mainmatter/ember-intl-analyzer/pull/528) Add custom plugin/extension support ([@Mikek2252]) +- [zeppelin/ember-click-outside] [#246](https://github.com/zeppelin/ember-click-outside/pull/246) Prettify + replace ancient syntax in tests & dummy app ([@zeppelin]) +- [zeppelin/ember-click-outside] [#245](https://github.com/zeppelin/ember-click-outside/pull/245) Deprecate ClickOutside component ([@zeppelin]) +- [zeppelin/ember-click-outside] [#244](https://github.com/zeppelin/ember-click-outside/pull/244) Remove deprecated ClickOutsideMixin ([@zeppelin]) +- [zeppelin/ember-click-outside] [#243](https://github.com/zeppelin/ember-click-outside/pull/243) Remove component template containing a single yield ([@zeppelin]) +- [zeppelin/ember-click-outside] [#242](https://github.com/zeppelin/ember-click-outside/pull/242) Drop ember-modifier < 3.2.0 & resolve deprecations ([@nickschot]) ## Lint to the future -- [mansona/lint-to-the-future-eslint] - [#8](https://github.com/mansona/lint-to-the-future-eslint/pull/8) fix typo in - README.md ([@locks]) -- [mansona/lint-to-the-future-eslint] - [#6](https://github.com/mansona/lint-to-the-future-eslint/pull/6) Make regular - expression resilient to // eslint-disable-next-line declarations ([@locks]) -- [mansona/lint-to-the-future-eslint] - [#7](https://github.com/mansona/lint-to-the-future-eslint/pull/7) add a test - for list function ([@mansona]) -- [mansona/lint-to-the-future-stylelint] - [#3](https://github.com/mansona/lint-to-the-future-stylelint/pull/3) update - stylelint peerDependency to accept stylelint 13 and 14 ([@Mikek2252]) +- [mansona/lint-to-the-future-eslint] [#8](https://github.com/mansona/lint-to-the-future-eslint/pull/8) fix typo in README.md ([@locks]) +- [mansona/lint-to-the-future-eslint] [#6](https://github.com/mansona/lint-to-the-future-eslint/pull/6) Make regular expression resilient to // eslint-disable-next-line declarations ([@locks]) +- [mansona/lint-to-the-future-eslint] [#7](https://github.com/mansona/lint-to-the-future-eslint/pull/7) add a test for list function ([@mansona]) +- [mansona/lint-to-the-future-stylelint] [#3](https://github.com/mansona/lint-to-the-future-stylelint/pull/3) update stylelint peerDependency to accept stylelint 13 and 14 ([@Mikek2252]) ## JavaScript -- [cookpete/auto-changelog] - [#237](https://github.com/cookpete/auto-changelog/pull/237) Add a Plugin - system ([@mansona]) -- [sinonjs/fake-timers] [#433](https://github.com/sinonjs/fake-timers/pull/433) - add failing test for issue 432 ([@mansona]) -- [sinonjs/fake-timers] [#431](https://github.com/sinonjs/fake-timers/pull/431) - Add a bit more structure to the tests ([@mansona]) -- [squash-commit-app/squash-commit-app] - [#19](https://github.com/squash-commit-app/squash-commit-app/pull/19) - fix(release): use node-version 14 ([@oscard0m]) -- [squash-commit-app/squash-commit-app] - [#18](https://github.com/squash-commit-app/squash-commit-app/pull/18) - docs(README): add context and news about this GitHub App ([@oscard0m]) +- [cookpete/auto-changelog] [#237](https://github.com/cookpete/auto-changelog/pull/237) Add a Plugin system ([@mansona]) +- [sinonjs/fake-timers] [#433](https://github.com/sinonjs/fake-timers/pull/433) add failing test for issue 432 ([@mansona]) +- [sinonjs/fake-timers] [#431](https://github.com/sinonjs/fake-timers/pull/431) Add a bit more structure to the tests ([@mansona]) +- [squash-commit-app/squash-commit-app] [#19](https://github.com/squash-commit-app/squash-commit-app/pull/19) fix(release): use node-version 14 ([@oscard0m]) +- [squash-commit-app/squash-commit-app] [#18](https://github.com/squash-commit-app/squash-commit-app/pull/18) docs(README): add context and news about this GitHub App ([@oscard0m]) ## Octokit -- [octokit/.github] [#8](https://github.com/octokit/.github/pull/8) - feat(default.json): use 'chore' as default semantic commit type ([@oscard0m]) -- [octokit/action.js] [#394](https://github.com/octokit/action.js/pull/394) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/app.js] [#291](https://github.com/octokit/app.js/pull/291) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/auth-action.js] - [#217](https://github.com/octokit/auth-action.js/pull/217) build(npm): replace - 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/auth-app.js] [#352](https://github.com/octokit/auth-app.js/pull/352) - ci(test): downgrade sinonjs/faker-timers to v8 to 'test' checkrun - ([@oscard0m]) -- [octokit/auth-app.js] [#350](https://github.com/octokit/auth-app.js/pull/350) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/auth-callback.js] - [#57](https://github.com/octokit/auth-callback.js/pull/57) build(npm): replace - 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/auth-oauth-app.js] - [#234](https://github.com/octokit/auth-oauth-app.js/pull/234) build(npm): - replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/auth-oauth-device.js] - [#57](https://github.com/octokit/auth-oauth-device.js/pull/57) build(npm): - replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/auth-oauth-user.js] - [#55](https://github.com/octokit/auth-oauth-user.js/pull/55) build(npm): - replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/auth-token.js] - [#230](https://github.com/octokit/auth-token.js/pull/230) build(npm): replace - 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/auth-unauthenticated.js] - [#126](https://github.com/octokit/auth-unauthenticated.js/pull/126) - ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) -- [octokit/auth-unauthenticated.js] - [#125](https://github.com/octokit/auth-unauthenticated.js/pull/125) - ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) -- [octokit/auth-unauthenticated.js] - [#124](https://github.com/octokit/auth-unauthenticated.js/pull/124) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/core.js] [#484](https://github.com/octokit/core.js/pull/484) - ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) -- [octokit/endpoint.js] [#322](https://github.com/octokit/endpoint.js/pull/322) - ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) -- [octokit/endpoint.js] [#321](https://github.com/octokit/endpoint.js/pull/321) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/graphql.js] [#363](https://github.com/octokit/graphql.js/pull/363) - ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) -- [octokit/graphql.js] [#362](https://github.com/octokit/graphql.js/pull/362) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/oauth-app.js] - [#298](https://github.com/octokit/oauth-app.js/pull/298) build(npm): replace - 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/oauth-authorization-url.js] - [#182](https://github.com/octokit/oauth-authorization-url.js/pull/182) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/oauth-methods.js] - [#59](https://github.com/octokit/oauth-methods.js/pull/59) build(npm): replace - 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/octokit.js] [#2248](https://github.com/octokit/octokit.js/pull/2248) - fix(deps): update dependency @octokit/core to v4 ([@oscard0m]) -- [octokit/octokit.js] [#2235](https://github.com/octokit/octokit.js/pull/2235) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/plugin-create-or-update-text-file.js] - [#59](https://github.com/octokit/plugin-create-or-update-text-file.js/pull/59) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/plugin-enterprise-cloud.js] - [#351](https://github.com/octokit/plugin-enterprise-cloud.js/pull/351) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/plugin-enterprise-compatibility.js] - [#290](https://github.com/octokit/plugin-enterprise-compatibility.js/pull/290) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/plugin-enterprise-server.js] - [#438](https://github.com/octokit/plugin-enterprise-server.js/pull/438) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/plugin-paginate-rest.js] - [#396](https://github.com/octokit/plugin-paginate-rest.js/pull/396) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/plugin-request-log.js] - [#231](https://github.com/octokit/plugin-request-log.js/pull/231) ci(codeql): - ignore on push events for dependabot branches ([@oscard0m]) -- [octokit/plugin-request-log.js] - [#230](https://github.com/octokit/plugin-request-log.js/pull/230) ci(codeql): - ignore on push events for dependabot branches ([@oscard0m]) -- [octokit/plugin-request-log.js] - [#229](https://github.com/octokit/plugin-request-log.js/pull/229) build(npm): - replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/plugin-rest-endpoint-methods.js] - [#490](https://github.com/octokit/plugin-rest-endpoint-methods.js/pull/490) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/plugin-retry.js] - [#322](https://github.com/octokit/plugin-retry.js/pull/322) build(npm): - replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/plugin-throttling.js] - [#468](https://github.com/octokit/plugin-throttling.js/pull/468) build(npm): - replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/request-error.js] - [#233](https://github.com/octokit/request-error.js/pull/233) ci(codeql): - ignore on push events for dependabot branches ([@oscard0m]) -- [octokit/request-error.js] - [#232](https://github.com/octokit/request-error.js/pull/232) build(npm): - replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/request.js] [#473](https://github.com/octokit/request.js/pull/473) - ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) -- [octokit/request.js] [#472](https://github.com/octokit/request.js/pull/472) - ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) -- [octokit/request.js] [#471](https://github.com/octokit/request.js/pull/471) - ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) -- [octokit/request.js] [#466](https://github.com/octokit/request.js/pull/466) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/rest.js] [#154](https://github.com/octokit/rest.js/pull/154) - ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) -- [octokit/rest.js] [#153](https://github.com/octokit/rest.js/pull/153) - ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) -- [octokit/rest.js] [#152](https://github.com/octokit/rest.js/pull/152) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/webhooks-methods.js] - [#55](https://github.com/octokit/webhooks-methods.js/pull/55) build(npm): - replace 'pika' command with 'pika-pack' ([@oscard0m]) -- [octokit/webhooks.js] [#692](https://github.com/octokit/webhooks.js/pull/692) - build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/.github] [#8](https://github.com/octokit/.github/pull/8) feat(default.json): use 'chore' as default semantic commit type ([@oscard0m]) +- [octokit/action.js] [#394](https://github.com/octokit/action.js/pull/394) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/app.js] [#291](https://github.com/octokit/app.js/pull/291) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/auth-action.js] [#217](https://github.com/octokit/auth-action.js/pull/217) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/auth-app.js] [#352](https://github.com/octokit/auth-app.js/pull/352) ci(test): downgrade sinonjs/faker-timers to v8 to 'test' checkrun ([@oscard0m]) +- [octokit/auth-app.js] [#350](https://github.com/octokit/auth-app.js/pull/350) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/auth-callback.js] [#57](https://github.com/octokit/auth-callback.js/pull/57) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/auth-oauth-app.js] [#234](https://github.com/octokit/auth-oauth-app.js/pull/234) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/auth-oauth-device.js] [#57](https://github.com/octokit/auth-oauth-device.js/pull/57) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/auth-oauth-user.js] [#55](https://github.com/octokit/auth-oauth-user.js/pull/55) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/auth-token.js] [#230](https://github.com/octokit/auth-token.js/pull/230) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/auth-unauthenticated.js] [#126](https://github.com/octokit/auth-unauthenticated.js/pull/126) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) +- [octokit/auth-unauthenticated.js] [#125](https://github.com/octokit/auth-unauthenticated.js/pull/125) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) +- [octokit/auth-unauthenticated.js] [#124](https://github.com/octokit/auth-unauthenticated.js/pull/124) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/core.js] [#484](https://github.com/octokit/core.js/pull/484) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) +- [octokit/endpoint.js] [#322](https://github.com/octokit/endpoint.js/pull/322) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) +- [octokit/endpoint.js] [#321](https://github.com/octokit/endpoint.js/pull/321) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/graphql.js] [#363](https://github.com/octokit/graphql.js/pull/363) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) +- [octokit/graphql.js] [#362](https://github.com/octokit/graphql.js/pull/362) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/oauth-app.js] [#298](https://github.com/octokit/oauth-app.js/pull/298) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/oauth-authorization-url.js] [#182](https://github.com/octokit/oauth-authorization-url.js/pull/182) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/oauth-methods.js] [#59](https://github.com/octokit/oauth-methods.js/pull/59) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/octokit.js] [#2248](https://github.com/octokit/octokit.js/pull/2248) fix(deps): update dependency @octokit/core to v4 ([@oscard0m]) +- [octokit/octokit.js] [#2235](https://github.com/octokit/octokit.js/pull/2235) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/plugin-create-or-update-text-file.js] [#59](https://github.com/octokit/plugin-create-or-update-text-file.js/pull/59) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/plugin-enterprise-cloud.js] [#351](https://github.com/octokit/plugin-enterprise-cloud.js/pull/351) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/plugin-enterprise-compatibility.js] [#290](https://github.com/octokit/plugin-enterprise-compatibility.js/pull/290) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/plugin-enterprise-server.js] [#438](https://github.com/octokit/plugin-enterprise-server.js/pull/438) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/plugin-paginate-rest.js] [#396](https://github.com/octokit/plugin-paginate-rest.js/pull/396) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/plugin-request-log.js] [#231](https://github.com/octokit/plugin-request-log.js/pull/231) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) +- [octokit/plugin-request-log.js] [#230](https://github.com/octokit/plugin-request-log.js/pull/230) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) +- [octokit/plugin-request-log.js] [#229](https://github.com/octokit/plugin-request-log.js/pull/229) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/plugin-rest-endpoint-methods.js] [#490](https://github.com/octokit/plugin-rest-endpoint-methods.js/pull/490) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/plugin-retry.js] [#322](https://github.com/octokit/plugin-retry.js/pull/322) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/plugin-throttling.js] [#468](https://github.com/octokit/plugin-throttling.js/pull/468) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/request-error.js] [#233](https://github.com/octokit/request-error.js/pull/233) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) +- [octokit/request-error.js] [#232](https://github.com/octokit/request-error.js/pull/232) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/request.js] [#473](https://github.com/octokit/request.js/pull/473) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) +- [octokit/request.js] [#472](https://github.com/octokit/request.js/pull/472) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) +- [octokit/request.js] [#471](https://github.com/octokit/request.js/pull/471) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) +- [octokit/request.js] [#466](https://github.com/octokit/request.js/pull/466) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/rest.js] [#154](https://github.com/octokit/rest.js/pull/154) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) +- [octokit/rest.js] [#153](https://github.com/octokit/rest.js/pull/153) ci(codeql): ignore on push events for dependabot branches ([@oscard0m]) +- [octokit/rest.js] [#152](https://github.com/octokit/rest.js/pull/152) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/webhooks-methods.js] [#55](https://github.com/octokit/webhooks-methods.js/pull/55) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) +- [octokit/webhooks.js] [#692](https://github.com/octokit/webhooks.js/pull/692) build(npm): replace 'pika' command with 'pika-pack' ([@oscard0m]) ## Internal -- [mainmatter/renovate-config] - [#10](https://github.com/mainmatter/renovate-config/pull/10) feat(renovate): - configure renovate to pin GitHub Actions digests ([@oscard0m]) +- [mainmatter/renovate-config] [#10](https://github.com/mainmatter/renovate-config/pull/10) feat(renovate): configure renovate to pin GitHub Actions digests ([@oscard0m]) [@mikek2252]: https://github.com/Mikek2252 [@turbo87]: https://github.com/Turbo87 @@ -305,28 +139,21 @@ [cookpete/auto-changelog]: https://github.com/cookpete/auto-changelog [ef4/ember-auto-import]: https://github.com/ef4/ember-auto-import [ember-learn/ember-blog]: https://github.com/ember-learn/ember-blog -[ember-learn/ember-help-wanted-server]: - https://github.com/ember-learn/ember-help-wanted-server +[ember-learn/ember-help-wanted-server]: https://github.com/ember-learn/ember-help-wanted-server [ember-learn/ember-styleguide]: https://github.com/ember-learn/ember-styleguide -[ember-learn/empress-blog-ember-template]: - https://github.com/ember-learn/empress-blog-ember-template +[ember-learn/empress-blog-ember-template]: https://github.com/ember-learn/empress-blog-ember-template [ember-learn/rfcs-app]: https://github.com/ember-learn/rfcs-app [emberjs/ember.js]: https://github.com/emberjs/ember.js [emberjs/rfcs]: https://github.com/emberjs/rfcs -[empress/field-guide-addon-docs-template]: - https://github.com/empress/field-guide-addon-docs-template +[empress/field-guide-addon-docs-template]: https://github.com/empress/field-guide-addon-docs-template [empress/field-guide]: https://github.com/empress/field-guide -[empress/rfc-process-mdbook-template]: - https://github.com/empress/rfc-process-mdbook-template +[empress/rfc-process-mdbook-template]: https://github.com/empress/rfc-process-mdbook-template [mansona/ember-body-class]: https://github.com/mansona/ember-body-class [mansona/ember-cli-babel]: https://github.com/mansona/ember-cli-babel -[mansona/ember-cli-notifications]: - https://github.com/mansona/ember-cli-notifications +[mansona/ember-cli-notifications]: https://github.com/mansona/ember-cli-notifications [mansona/ember-get-config]: https://github.com/mansona/ember-get-config -[mansona/lint-to-the-future-eslint]: - https://github.com/mansona/lint-to-the-future-eslint -[mansona/lint-to-the-future-stylelint]: - https://github.com/mansona/lint-to-the-future-stylelint +[mansona/lint-to-the-future-eslint]: https://github.com/mansona/lint-to-the-future-eslint +[mansona/lint-to-the-future-stylelint]: https://github.com/mansona/lint-to-the-future-stylelint [mswjs/cookies]: https://github.com/mswjs/cookies [mswjs/gh-issue-forms]: https://github.com/mswjs/gh-issue-forms [mswjs/interceptors]: https://github.com/mswjs/interceptors @@ -343,30 +170,21 @@ [octokit/auth-oauth-device.js]: https://github.com/octokit/auth-oauth-device.js [octokit/auth-oauth-user.js]: https://github.com/octokit/auth-oauth-user.js [octokit/auth-token.js]: https://github.com/octokit/auth-token.js -[octokit/auth-unauthenticated.js]: - https://github.com/octokit/auth-unauthenticated.js +[octokit/auth-unauthenticated.js]: https://github.com/octokit/auth-unauthenticated.js [octokit/core.js]: https://github.com/octokit/core.js [octokit/endpoint.js]: https://github.com/octokit/endpoint.js [octokit/graphql.js]: https://github.com/octokit/graphql.js [octokit/oauth-app.js]: https://github.com/octokit/oauth-app.js -[octokit/oauth-authorization-url.js]: - https://github.com/octokit/oauth-authorization-url.js +[octokit/oauth-authorization-url.js]: https://github.com/octokit/oauth-authorization-url.js [octokit/oauth-methods.js]: https://github.com/octokit/oauth-methods.js [octokit/octokit.js]: https://github.com/octokit/octokit.js -[octokit/plugin-create-or-update-text-file.js]: - https://github.com/octokit/plugin-create-or-update-text-file.js -[octokit/plugin-enterprise-cloud.js]: - https://github.com/octokit/plugin-enterprise-cloud.js -[octokit/plugin-enterprise-compatibility.js]: - https://github.com/octokit/plugin-enterprise-compatibility.js -[octokit/plugin-enterprise-server.js]: - https://github.com/octokit/plugin-enterprise-server.js -[octokit/plugin-paginate-rest.js]: - https://github.com/octokit/plugin-paginate-rest.js -[octokit/plugin-request-log.js]: - https://github.com/octokit/plugin-request-log.js -[octokit/plugin-rest-endpoint-methods.js]: - https://github.com/octokit/plugin-rest-endpoint-methods.js +[octokit/plugin-create-or-update-text-file.js]: https://github.com/octokit/plugin-create-or-update-text-file.js +[octokit/plugin-enterprise-cloud.js]: https://github.com/octokit/plugin-enterprise-cloud.js +[octokit/plugin-enterprise-compatibility.js]: https://github.com/octokit/plugin-enterprise-compatibility.js +[octokit/plugin-enterprise-server.js]: https://github.com/octokit/plugin-enterprise-server.js +[octokit/plugin-paginate-rest.js]: https://github.com/octokit/plugin-paginate-rest.js +[octokit/plugin-request-log.js]: https://github.com/octokit/plugin-request-log.js +[octokit/plugin-rest-endpoint-methods.js]: https://github.com/octokit/plugin-rest-endpoint-methods.js [octokit/plugin-retry.js]: https://github.com/octokit/plugin-retry.js [octokit/plugin-throttling.js]: https://github.com/octokit/plugin-throttling.js [octokit/request-error.js]: https://github.com/octokit/request-error.js @@ -375,10 +193,8 @@ [octokit/webhooks-methods.js]: https://github.com/octokit/webhooks-methods.js [octokit/webhooks.js]: https://github.com/octokit/webhooks.js [rust-lang/crates.io]: https://github.com/rust-lang/crates.io -[mainmatter/ember-intl-analyzer]: - https://github.com/mainmatter/ember-intl-analyzer +[mainmatter/ember-intl-analyzer]: https://github.com/mainmatter/ember-intl-analyzer [mainmatter/renovate-config]: https://github.com/mainmatter/renovate-config [sinonjs/fake-timers]: https://github.com/sinonjs/fake-timers -[squash-commit-app/squash-commit-app]: - https://github.com/squash-commit-app/squash-commit-app +[squash-commit-app/squash-commit-app]: https://github.com/squash-commit-app/squash-commit-app [zeppelin/ember-click-outside]: https://github.com/zeppelin/ember-click-outside diff --git a/src/twios/2022-08-02.md b/src/twios/2022-08-02.md index 67928a0b23..072d0f166d 100644 --- a/src/twios/2022-08-02.md +++ b/src/twios/2022-08-02.md @@ -1,233 +1,96 @@ ## Rust -- [Turbo87/segelflug-classifieds] - [#314](https://github.com/Turbo87/segelflug-classifieds/pull/314) clippy: - Adjust CLI arguments ([@Turbo87]) +- [Turbo87/segelflug-classifieds] [#314](https://github.com/Turbo87/segelflug-classifieds/pull/314) clippy: Adjust CLI arguments ([@Turbo87]) ## crates.io -- [rust-lang/crates.io] - [#4967](https://github.com/rust-lang/crates.io/pull/4967) worker::git: Adjust - `update_crate_index()` to handle deleted files ([@Turbo87]) +- [rust-lang/crates.io] [#4967](https://github.com/rust-lang/crates.io/pull/4967) worker::git: Adjust `update_crate_index()` to handle deleted files ([@Turbo87]) ## Mock Service Worker -- [mswjs/cookies] [#23](https://github.com/mswjs/cookies/pull/23) ci(ci.yml): - run CI with multiple versions of Node ([@oscard0m]) +- [mswjs/cookies] [#23](https://github.com/mswjs/cookies/pull/23) ci(ci.yml): run CI with multiple versions of Node ([@oscard0m]) ## Ember.js -- [cibernox/ember-power-select] - [#1524](https://github.com/cibernox/ember-power-select/pull/1524) Update - ember-basic-dropdown ([@mansona]) -- [ef4/ember-auto-import] - [#530](https://github.com/ef4/ember-auto-import/pull/530) Move Dynamic - Template Import error to runtime instead of a build error ([@mansona]) -- [ember-codemods/ember-codemods-telemetry-helpers] - [#47](https://github.com/ember-codemods/ember-codemods-telemetry-helpers/pull/47) - breaking: drop support for EOL Node versions ([@mansona]) -- [ember-codemods/ember-codemods-telemetry-helpers] - [#46](https://github.com/ember-codemods/ember-codemods-telemetry-helpers/pull/46) - update puppeteer to support M1 macs ([@mansona]) -- [ember-codemods/ember-native-class-codemod] - [#490](https://github.com/ember-codemods/ember-native-class-codemod/pull/490) - Drop support for EOL Node versions ([@mansona]) -- [ember-codemods/ember-native-class-codemod] - [#487](https://github.com/ember-codemods/ember-native-class-codemod/pull/487) - move from travis to github actions ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#102](https://github.com/ember-learn/guidemaker-ember-template/pull/102) - Update ember to 3.28 using ember-cli-update ([@mansona]) -- [ember-learn/rfcs-app] [#9](https://github.com/ember-learn/rfcs-app/pull/9) - update rfc-process dependencies ([@mansona]) -- [empress/guidemaker] [#72](https://github.com/empress/guidemaker/pull/72) turn - a build deprecation into an error ([@mansona]) -- [empress/guidemaker] [#71](https://github.com/empress/guidemaker/pull/71) Fix - deprecations ([@mansona]) -- [empress/guidemaker] [#68](https://github.com/empress/guidemaker/pull/68) - breaking: drop support for Ember < 3.16 - Update ember to 3.28 using - ember-cli-update ([@mansona]) -- [empress/guidemaker] [#64](https://github.com/empress/guidemaker/pull/64) - breaking: drop support for Node < 14 ([@mansona]) -- [empress/guidemaker] [#63](https://github.com/empress/guidemaker/pull/63) - Update ember-get-config ([@mansona]) -- [empress/guidemaker-default-template] - [#21](https://github.com/empress/guidemaker-default-template/pull/21) Support - Embroider ([@mansona]) -- [empress/guidemaker-default-template] - [#20](https://github.com/empress/guidemaker-default-template/pull/20) add no - deprecations ember-try config ([@mansona]) -- [empress/guidemaker-default-template] - [#19](https://github.com/empress/guidemaker-default-template/pull/19) Update - to Ember 3.28 with ember-cli-update ([@mansona]) -- [empress/guidemaker-default-template] - [#17](https://github.com/empress/guidemaker-default-template/pull/17) - breaking: drop support for Node < 14 ([@mansona]) -- [empress/rfc-process] [#18](https://github.com/empress/rfc-process/pull/18) - Add ember-meta implementation ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#17](https://github.com/empress/rfc-process-mdbook-template/pull/17) fix - rfc-process peer dependency ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#16](https://github.com/empress/rfc-process-mdbook-template/pull/16) - Supporting rfc-process v1.0 and head-data ([@mansona]) -- [miguelcobain/ember-paper] - [#1228](https://github.com/miguelcobain/ember-paper/pull/1228) update - paper-tabs to class syntax ([@mansona]) -- [miguelcobain/ember-paper] - [#1227](https://github.com/miguelcobain/ember-paper/pull/1227) update - paper-tab to use native class syntax ([@mansona]) -- [miguelcobain/ember-paper] - [#1226](https://github.com/miguelcobain/ember-paper/pull/1226) update - paper-radio to use native class syntax ([@mansona]) -- [miguelcobain/ember-paper] - [#1225](https://github.com/miguelcobain/ember-paper/pull/1225) update - paper-item to use native class syntax ([@mansona]) -- [miguelcobain/ember-paper] - [#1224](https://github.com/miguelcobain/ember-paper/pull/1224) update - paper-grid-tile to use native class syntax ([@mansona]) -- [miguelcobain/ember-paper] - [#1223](https://github.com/miguelcobain/ember-paper/pull/1223) Convert - paper-form to class syntax ([@mansona]) -- [nickschot/ember-mobile-menu] - [#367](https://github.com/nickschot/ember-mobile-menu/pull/367) don't run CI - against 4.x+, add all 3.x LTS releases to matrix, use node 12 on CI - ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#366](https://github.com/nickschot/ember-mobile-menu/pull/366) fix import - path for htmlSafe ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#365](https://github.com/nickschot/ember-mobile-menu/pull/365) Move README, - CONTRIBUTING and LICENSE.md to addon folder ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#361](https://github.com/nickschot/ember-mobile-menu/pull/361) remove - ember-cli-htmlbars override now that 6.1.0 has been released ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#359](https://github.com/nickschot/ember-mobile-menu/pull/359) Revert "Update - dependency release-it to v15" ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#358](https://github.com/nickschot/ember-mobile-menu/pull/358) Upgrade to - pnpm v7 ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#357](https://github.com/nickschot/ember-mobile-menu/pull/357) declare - ember-source peer dependency for addon ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#356](https://github.com/nickschot/ember-mobile-menu/pull/356) Drop node 12 - support ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#372](https://github.com/nickschot/ember-mobile-menu/pull/372) protect - against using window apis in Fastboot ([@mansona]) -- [nickschot/ember-mobile-menu] - [#371](https://github.com/nickschot/ember-mobile-menu/pull/371) protect - against using window apis in Fastboot ([@mansona]) -- [mainmatter/ember-simple-auth] - [#2435](https://github.com/mainmatter/ember-simple-auth/pull/2435) - fix(renovate.json): use proper path for .json5 preset ([@oscard0m]) -- [mainmatter/ember-simple-auth] - [#2442](https://github.com/mainmatter/ember-simple-auth/pull/2442) Upgrade to - qunit 5 2 ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2440](https://github.com/mainmatter/ember-simple-auth/pull/2440) docs: add - information about v4 release for embroider and typescript users - ([@BobrImperator]) -- [zeppelin/ember-click-outside] - [#250](https://github.com/zeppelin/ember-click-outside/pull/250) Sync test - matrix with GitHub Actions ([@zeppelin]) -- [zeppelin/ember-click-outside] - [#249](https://github.com/zeppelin/ember-click-outside/pull/249) Fix component - deprecation message ([@zeppelin]) -- [zeppelin/ember-click-outside] - [#248](https://github.com/zeppelin/ember-click-outside/pull/248) Add early - Ember to test matrix ([@zeppelin]) +- [cibernox/ember-power-select] [#1524](https://github.com/cibernox/ember-power-select/pull/1524) Update ember-basic-dropdown ([@mansona]) +- [ef4/ember-auto-import] [#530](https://github.com/ef4/ember-auto-import/pull/530) Move Dynamic Template Import error to runtime instead of a build error ([@mansona]) +- [ember-codemods/ember-codemods-telemetry-helpers] [#47](https://github.com/ember-codemods/ember-codemods-telemetry-helpers/pull/47) breaking: drop support for EOL Node versions ([@mansona]) +- [ember-codemods/ember-codemods-telemetry-helpers] [#46](https://github.com/ember-codemods/ember-codemods-telemetry-helpers/pull/46) update puppeteer to support M1 macs ([@mansona]) +- [ember-codemods/ember-native-class-codemod] [#490](https://github.com/ember-codemods/ember-native-class-codemod/pull/490) Drop support for EOL Node versions ([@mansona]) +- [ember-codemods/ember-native-class-codemod] [#487](https://github.com/ember-codemods/ember-native-class-codemod/pull/487) move from travis to github actions ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#102](https://github.com/ember-learn/guidemaker-ember-template/pull/102) Update ember to 3.28 using ember-cli-update ([@mansona]) +- [ember-learn/rfcs-app] [#9](https://github.com/ember-learn/rfcs-app/pull/9) update rfc-process dependencies ([@mansona]) +- [empress/guidemaker] [#72](https://github.com/empress/guidemaker/pull/72) turn a build deprecation into an error ([@mansona]) +- [empress/guidemaker] [#71](https://github.com/empress/guidemaker/pull/71) Fix deprecations ([@mansona]) +- [empress/guidemaker] [#68](https://github.com/empress/guidemaker/pull/68) breaking: drop support for Ember < 3.16 - Update ember to 3.28 using ember-cli-update ([@mansona]) +- [empress/guidemaker] [#64](https://github.com/empress/guidemaker/pull/64) breaking: drop support for Node < 14 ([@mansona]) +- [empress/guidemaker] [#63](https://github.com/empress/guidemaker/pull/63) Update ember-get-config ([@mansona]) +- [empress/guidemaker-default-template] [#21](https://github.com/empress/guidemaker-default-template/pull/21) Support Embroider ([@mansona]) +- [empress/guidemaker-default-template] [#20](https://github.com/empress/guidemaker-default-template/pull/20) add no deprecations ember-try config ([@mansona]) +- [empress/guidemaker-default-template] [#19](https://github.com/empress/guidemaker-default-template/pull/19) Update to Ember 3.28 with ember-cli-update ([@mansona]) +- [empress/guidemaker-default-template] [#17](https://github.com/empress/guidemaker-default-template/pull/17) breaking: drop support for Node < 14 ([@mansona]) +- [empress/rfc-process] [#18](https://github.com/empress/rfc-process/pull/18) Add ember-meta implementation ([@mansona]) +- [empress/rfc-process-mdbook-template] [#17](https://github.com/empress/rfc-process-mdbook-template/pull/17) fix rfc-process peer dependency ([@mansona]) +- [empress/rfc-process-mdbook-template] [#16](https://github.com/empress/rfc-process-mdbook-template/pull/16) Supporting rfc-process v1.0 and head-data ([@mansona]) +- [miguelcobain/ember-paper] [#1228](https://github.com/miguelcobain/ember-paper/pull/1228) update paper-tabs to class syntax ([@mansona]) +- [miguelcobain/ember-paper] [#1227](https://github.com/miguelcobain/ember-paper/pull/1227) update paper-tab to use native class syntax ([@mansona]) +- [miguelcobain/ember-paper] [#1226](https://github.com/miguelcobain/ember-paper/pull/1226) update paper-radio to use native class syntax ([@mansona]) +- [miguelcobain/ember-paper] [#1225](https://github.com/miguelcobain/ember-paper/pull/1225) update paper-item to use native class syntax ([@mansona]) +- [miguelcobain/ember-paper] [#1224](https://github.com/miguelcobain/ember-paper/pull/1224) update paper-grid-tile to use native class syntax ([@mansona]) +- [miguelcobain/ember-paper] [#1223](https://github.com/miguelcobain/ember-paper/pull/1223) Convert paper-form to class syntax ([@mansona]) +- [nickschot/ember-mobile-menu] [#367](https://github.com/nickschot/ember-mobile-menu/pull/367) don't run CI against 4.x+, add all 3.x LTS releases to matrix, use node 12 on CI ([@nickschot]) +- [nickschot/ember-mobile-menu] [#366](https://github.com/nickschot/ember-mobile-menu/pull/366) fix import path for htmlSafe ([@nickschot]) +- [nickschot/ember-mobile-menu] [#365](https://github.com/nickschot/ember-mobile-menu/pull/365) Move README, CONTRIBUTING and LICENSE.md to addon folder ([@nickschot]) +- [nickschot/ember-mobile-menu] [#361](https://github.com/nickschot/ember-mobile-menu/pull/361) remove ember-cli-htmlbars override now that 6.1.0 has been released ([@nickschot]) +- [nickschot/ember-mobile-menu] [#359](https://github.com/nickschot/ember-mobile-menu/pull/359) Revert "Update dependency release-it to v15" ([@nickschot]) +- [nickschot/ember-mobile-menu] [#358](https://github.com/nickschot/ember-mobile-menu/pull/358) Upgrade to pnpm v7 ([@nickschot]) +- [nickschot/ember-mobile-menu] [#357](https://github.com/nickschot/ember-mobile-menu/pull/357) declare ember-source peer dependency for addon ([@nickschot]) +- [nickschot/ember-mobile-menu] [#356](https://github.com/nickschot/ember-mobile-menu/pull/356) Drop node 12 support ([@nickschot]) +- [nickschot/ember-mobile-menu] [#372](https://github.com/nickschot/ember-mobile-menu/pull/372) protect against using window apis in Fastboot ([@mansona]) +- [nickschot/ember-mobile-menu] [#371](https://github.com/nickschot/ember-mobile-menu/pull/371) protect against using window apis in Fastboot ([@mansona]) +- [mainmatter/ember-simple-auth] [#2435](https://github.com/mainmatter/ember-simple-auth/pull/2435) fix(renovate.json): use proper path for .json5 preset ([@oscard0m]) +- [mainmatter/ember-simple-auth] [#2442](https://github.com/mainmatter/ember-simple-auth/pull/2442) Upgrade to qunit 5 2 ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2440](https://github.com/mainmatter/ember-simple-auth/pull/2440) docs: add information about v4 release for embroider and typescript users ([@BobrImperator]) +- [zeppelin/ember-click-outside] [#250](https://github.com/zeppelin/ember-click-outside/pull/250) Sync test matrix with GitHub Actions ([@zeppelin]) +- [zeppelin/ember-click-outside] [#249](https://github.com/zeppelin/ember-click-outside/pull/249) Fix component deprecation message ([@zeppelin]) +- [zeppelin/ember-click-outside] [#248](https://github.com/zeppelin/ember-click-outside/pull/248) Add early Ember to test matrix ([@zeppelin]) ## Lint to the future -- [mansona/lint-to-the-future] - [#25](https://github.com/mansona/lint-to-the-future/pull/25) Add support for - --previousResults to point at a local file instead of a link ([@Mikek2252]) +- [mansona/lint-to-the-future] [#25](https://github.com/mansona/lint-to-the-future/pull/25) Add support for --previousResults to point at a local file instead of a link ([@Mikek2252]) ## JavaScript -- [axmccx/proxynexus] [#32](https://github.com/axmccx/proxynexus/pull/32) Fixes - #31 - Add support for new NRDB URLs ([@locks]) +- [axmccx/proxynexus] [#32](https://github.com/axmccx/proxynexus/pull/32) Fixes #31 - Add support for new NRDB URLs ([@locks]) ## Octokit -- [gamberrys/octokit-request-action] - [#4](https://github.com/gamberrys/octokit-request-action/pull/4) Update - index.js ([@oscard0m]) -- [gamberrys/octokit-request-action] - [#3](https://github.com/gamberrys/octokit-request-action/pull/3) Update - README.md ([@oscard0m]) -- [gamberrys/octokit-request-action-copy] - [#13](https://github.com/gamberrys/octokit-request-action-copy/pull/13) add - random dependency and package-lock ([@oscard0m]) -- [octokit/.github] [#14](https://github.com/octokit/.github/pull/14) - ci(renovate): configure renovate to unpin GitHub Actions digests ([@oscard0m]) -- [octokit/.github] [#13](https://github.com/octokit/.github/pull/13) - feat(workflows): feat(workflows): create 'test.yml' reusable workflow - ([@oscard0m]) -- [octokit/app-permissions] - [#111](https://github.com/octokit/app-permissions/pull/111) build(deps): - remove semantic release as dependency ([@oscard0m]) -- [octokit/auth-action.js] - [#226](https://github.com/octokit/auth-action.js/pull/226) ci(test): use - text_matrix and test jobs ([@oscard0m]) -- [octokit/auth-callback.js] - [#65](https://github.com/octokit/auth-callback.js/pull/65) ci(test): use - test_matrix and test jobs ([@oscard0m]) -- [octokit/auth-oauth-app.js] - [#247](https://github.com/octokit/auth-oauth-app.js/pull/247) ci(test): use - test_matrix and test jobs ([@oscard0m]) -- [octokit/auth-oauth-device.js] - [#65](https://github.com/octokit/auth-oauth-device.js/pull/65) ci(test): use - test_matrix and test jobs ([@oscard0m]) -- [octokit/auth-unauthenticated.js] - [#133](https://github.com/octokit/auth-unauthenticated.js/pull/133) ci(test): - add 'npm run lint' as pretest script in package.json ([@oscard0m]) -- [octokit/create-octokit-project.js] - [#166](https://github.com/octokit/create-octokit-project.js/pull/166) - feat(create-test-action): scaffold test action to run lint only once - ([@oscard0m]) -- [octokit/graphql-action] - [#136](https://github.com/octokit/graphql-action/pull/136) ci(lint): add - 'lint' step to the project ([@oscard0m]) -- [octokit/graphql.js] [#369](https://github.com/octokit/graphql.js/pull/369) - ci(test): use test_matrix and test jobs ([@oscard0m]) -- [octokit/oauth-authorization-url.js] - [#189](https://github.com/octokit/oauth-authorization-url.js/pull/189) Add - prettier to project ([@oscard0m]) -- [octokit/oauth-authorization-url.js] - [#188](https://github.com/octokit/oauth-authorization-url.js/pull/188) - ci(test): use test_matrix and test jobs ([@oscard0m]) -- [octokit/openapi] [#235](https://github.com/octokit/openapi/pull/235) - feat(build): improve summary for GitHub Enterprise Server removed endpoints - ([@oscard0m]) -- [octokit/plugin-paginate-rest.js] - [#407](https://github.com/octokit/plugin-paginate-rest.js/pull/407) ci(test): - use test_matrix and test jobs ([@oscard0m]) -- [octokit/plugin-retry.js] - [#329](https://github.com/octokit/plugin-retry.js/pull/329) ci(test): use - test_matrix and test jobs ([@oscard0m]) -- [octokit/request-action] - [#165](https://github.com/octokit/request-action/pull/165) ci(lint): add - 'lint' step to the project ([@oscard0m]) -- [octokit/request-action] - [#159](https://github.com/octokit/request-action/pull/159) ci(release): use - OCTOKITBOT_PAT as GITHUB_TOKEN ([@oscard0m]) -- [octokit/request-error.js] - [#238](https://github.com/octokit/request-error.js/pull/238) ci(test): use - test_matrix and test jobs ([@oscard0m]) -- [octokit/request.js] [#483](https://github.com/octokit/request.js/pull/483) - ci(test): use test_matrix and test jobs ([@oscard0m]) -- [octokit/webhooks] [#678](https://github.com/octokit/webhooks/pull/678) - fix(schemas): remove 'email' format for 'email' property in - committer.schema.json ([@oscard0m]) -- [octokit/webhooks] [#677](https://github.com/octokit/webhooks/pull/677) - fix(payload-schemas): add custom RegEx validation for 'email' ([@oscard0m]) -- [oscard0m/octokit-request-action] - [#1](https://github.com/oscard0m/octokit-request-action/pull/1) Update - test.yml ([@oscard0m]) +- [gamberrys/octokit-request-action] [#4](https://github.com/gamberrys/octokit-request-action/pull/4) Update index.js ([@oscard0m]) +- [gamberrys/octokit-request-action] [#3](https://github.com/gamberrys/octokit-request-action/pull/3) Update README.md ([@oscard0m]) +- [gamberrys/octokit-request-action-copy] [#13](https://github.com/gamberrys/octokit-request-action-copy/pull/13) add random dependency and package-lock ([@oscard0m]) +- [octokit/.github] [#14](https://github.com/octokit/.github/pull/14) ci(renovate): configure renovate to unpin GitHub Actions digests ([@oscard0m]) +- [octokit/.github] [#13](https://github.com/octokit/.github/pull/13) feat(workflows): feat(workflows): create 'test.yml' reusable workflow ([@oscard0m]) +- [octokit/app-permissions] [#111](https://github.com/octokit/app-permissions/pull/111) build(deps): remove semantic release as dependency ([@oscard0m]) +- [octokit/auth-action.js] [#226](https://github.com/octokit/auth-action.js/pull/226) ci(test): use text_matrix and test jobs ([@oscard0m]) +- [octokit/auth-callback.js] [#65](https://github.com/octokit/auth-callback.js/pull/65) ci(test): use test_matrix and test jobs ([@oscard0m]) +- [octokit/auth-oauth-app.js] [#247](https://github.com/octokit/auth-oauth-app.js/pull/247) ci(test): use test_matrix and test jobs ([@oscard0m]) +- [octokit/auth-oauth-device.js] [#65](https://github.com/octokit/auth-oauth-device.js/pull/65) ci(test): use test_matrix and test jobs ([@oscard0m]) +- [octokit/auth-unauthenticated.js] [#133](https://github.com/octokit/auth-unauthenticated.js/pull/133) ci(test): add 'npm run lint' as pretest script in package.json ([@oscard0m]) +- [octokit/create-octokit-project.js] [#166](https://github.com/octokit/create-octokit-project.js/pull/166) feat(create-test-action): scaffold test action to run lint only once ([@oscard0m]) +- [octokit/graphql-action] [#136](https://github.com/octokit/graphql-action/pull/136) ci(lint): add 'lint' step to the project ([@oscard0m]) +- [octokit/graphql.js] [#369](https://github.com/octokit/graphql.js/pull/369) ci(test): use test_matrix and test jobs ([@oscard0m]) +- [octokit/oauth-authorization-url.js] [#189](https://github.com/octokit/oauth-authorization-url.js/pull/189) Add prettier to project ([@oscard0m]) +- [octokit/oauth-authorization-url.js] [#188](https://github.com/octokit/oauth-authorization-url.js/pull/188) ci(test): use test_matrix and test jobs ([@oscard0m]) +- [octokit/openapi] [#235](https://github.com/octokit/openapi/pull/235) feat(build): improve summary for GitHub Enterprise Server removed endpoints ([@oscard0m]) +- [octokit/plugin-paginate-rest.js] [#407](https://github.com/octokit/plugin-paginate-rest.js/pull/407) ci(test): use test_matrix and test jobs ([@oscard0m]) +- [octokit/plugin-retry.js] [#329](https://github.com/octokit/plugin-retry.js/pull/329) ci(test): use test_matrix and test jobs ([@oscard0m]) +- [octokit/request-action] [#165](https://github.com/octokit/request-action/pull/165) ci(lint): add 'lint' step to the project ([@oscard0m]) +- [octokit/request-action] [#159](https://github.com/octokit/request-action/pull/159) ci(release): use OCTOKITBOT_PAT as GITHUB_TOKEN ([@oscard0m]) +- [octokit/request-error.js] [#238](https://github.com/octokit/request-error.js/pull/238) ci(test): use test_matrix and test jobs ([@oscard0m]) +- [octokit/request.js] [#483](https://github.com/octokit/request.js/pull/483) ci(test): use test_matrix and test jobs ([@oscard0m]) +- [octokit/webhooks] [#678](https://github.com/octokit/webhooks/pull/678) fix(schemas): remove 'email' format for 'email' property in committer.schema.json ([@oscard0m]) +- [octokit/webhooks] [#677](https://github.com/octokit/webhooks/pull/677) fix(payload-schemas): add custom RegEx validation for 'email' ([@oscard0m]) +- [oscard0m/octokit-request-action] [#1](https://github.com/oscard0m/octokit-request-action/pull/1) Update test.yml ([@oscard0m]) [@bobrimperator]: https://github.com/BobrImperator [@mikek2252]: https://github.com/Mikek2252 @@ -238,28 +101,20 @@ [@nickschot]: https://github.com/nickschot [@oscard0m]: https://github.com/oscard0m [@zeppelin]: https://github.com/zeppelin -[turbo87/segelflug-classifieds]: - https://github.com/Turbo87/segelflug-classifieds +[turbo87/segelflug-classifieds]: https://github.com/Turbo87/segelflug-classifieds [axmccx/proxynexus]: https://github.com/axmccx/proxynexus [cibernox/ember-power-select]: https://github.com/cibernox/ember-power-select [ef4/ember-auto-import]: https://github.com/ef4/ember-auto-import -[ember-codemods/ember-codemods-telemetry-helpers]: - https://github.com/ember-codemods/ember-codemods-telemetry-helpers -[ember-codemods/ember-native-class-codemod]: - https://github.com/ember-codemods/ember-native-class-codemod -[ember-learn/guidemaker-ember-template]: - https://github.com/ember-learn/guidemaker-ember-template +[ember-codemods/ember-codemods-telemetry-helpers]: https://github.com/ember-codemods/ember-codemods-telemetry-helpers +[ember-codemods/ember-native-class-codemod]: https://github.com/ember-codemods/ember-native-class-codemod +[ember-learn/guidemaker-ember-template]: https://github.com/ember-learn/guidemaker-ember-template [ember-learn/rfcs-app]: https://github.com/ember-learn/rfcs-app -[empress/guidemaker-default-template]: - https://github.com/empress/guidemaker-default-template +[empress/guidemaker-default-template]: https://github.com/empress/guidemaker-default-template [empress/guidemaker]: https://github.com/empress/guidemaker -[empress/rfc-process-mdbook-template]: - https://github.com/empress/rfc-process-mdbook-template +[empress/rfc-process-mdbook-template]: https://github.com/empress/rfc-process-mdbook-template [empress/rfc-process]: https://github.com/empress/rfc-process -[gamberrys/octokit-request-action-copy]: - https://github.com/gamberrys/octokit-request-action-copy -[gamberrys/octokit-request-action]: - https://github.com/gamberrys/octokit-request-action +[gamberrys/octokit-request-action-copy]: https://github.com/gamberrys/octokit-request-action-copy +[gamberrys/octokit-request-action]: https://github.com/gamberrys/octokit-request-action [mansona/lint-to-the-future]: https://github.com/mansona/lint-to-the-future [miguelcobain/ember-paper]: https://github.com/miguelcobain/ember-paper [mswjs/cookies]: https://github.com/mswjs/cookies @@ -270,24 +125,19 @@ [octokit/auth-callback.js]: https://github.com/octokit/auth-callback.js [octokit/auth-oauth-app.js]: https://github.com/octokit/auth-oauth-app.js [octokit/auth-oauth-device.js]: https://github.com/octokit/auth-oauth-device.js -[octokit/auth-unauthenticated.js]: - https://github.com/octokit/auth-unauthenticated.js -[octokit/create-octokit-project.js]: - https://github.com/octokit/create-octokit-project.js +[octokit/auth-unauthenticated.js]: https://github.com/octokit/auth-unauthenticated.js +[octokit/create-octokit-project.js]: https://github.com/octokit/create-octokit-project.js [octokit/graphql-action]: https://github.com/octokit/graphql-action [octokit/graphql.js]: https://github.com/octokit/graphql.js -[octokit/oauth-authorization-url.js]: - https://github.com/octokit/oauth-authorization-url.js +[octokit/oauth-authorization-url.js]: https://github.com/octokit/oauth-authorization-url.js [octokit/openapi]: https://github.com/octokit/openapi -[octokit/plugin-paginate-rest.js]: - https://github.com/octokit/plugin-paginate-rest.js +[octokit/plugin-paginate-rest.js]: https://github.com/octokit/plugin-paginate-rest.js [octokit/plugin-retry.js]: https://github.com/octokit/plugin-retry.js [octokit/request-action]: https://github.com/octokit/request-action [octokit/request-error.js]: https://github.com/octokit/request-error.js [octokit/request.js]: https://github.com/octokit/request.js [octokit/webhooks]: https://github.com/octokit/webhooks -[oscard0m/octokit-request-action]: - https://github.com/oscard0m/octokit-request-action +[oscard0m/octokit-request-action]: https://github.com/oscard0m/octokit-request-action [rust-lang/crates.io]: https://github.com/rust-lang/crates.io [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth [zeppelin/ember-click-outside]: https://github.com/zeppelin/ember-click-outside diff --git a/src/twios/2022-08-16.md b/src/twios/2022-08-16.md index 8e4fd25c2a..8eb590f555 100644 --- a/src/twios/2022-08-16.md +++ b/src/twios/2022-08-16.md @@ -1,130 +1,59 @@ ## Rust -- [Turbo87/aprs-parser-rs] - [#43](https://github.com/Turbo87/aprs-parser-rs/pull/43) Add APRS protocol - reference ([@Turbo87]) -- [Turbo87/aprs-parser-rs] - [#42](https://github.com/Turbo87/aprs-parser-rs/pull/42) Raise minimum Rust - version to v1.52.0 ([@Turbo87]) -- [kivikakk/comrak] [#238](https://github.com/kivikakk/comrak/pull/238) Replace - `lazy_static` dependency with `once_cell` ([@Turbo87]) +- [Turbo87/aprs-parser-rs] [#43](https://github.com/Turbo87/aprs-parser-rs/pull/43) Add APRS protocol reference ([@Turbo87]) +- [Turbo87/aprs-parser-rs] [#42](https://github.com/Turbo87/aprs-parser-rs/pull/42) Raise minimum Rust version to v1.52.0 ([@Turbo87]) +- [kivikakk/comrak] [#238](https://github.com/kivikakk/comrak/pull/238) Replace `lazy_static` dependency with `once_cell` ([@Turbo87]) ## crates.io -- [rust-lang/crates.io] - [#5060](https://github.com/rust-lang/crates.io/pull/5060) admin/upload-index: - Restore "skipping file" output ([@Turbo87]) -- [rust-lang/crates.io] - [#5044](https://github.com/rust-lang/crates.io/pull/5044) Replace - `lazy_static` with `once_cell` ([@Turbo87]) -- [rust-lang/crates.io] - [#5042](https://github.com/rust-lang/crates.io/pull/5042) Always run - background jobs after a test publish ([@Turbo87]) -- [rust-lang/crates.io] - [#5041](https://github.com/rust-lang/crates.io/pull/5041) Sort headers of - http-data files ([@Turbo87]) -- [rust-lang/crates.io] - [#5040](https://github.com/rust-lang/crates.io/pull/5040) Add an option to - easily regenerate http-data files ([@Turbo87]) -- [rust-lang/crates.io] - [#5039](https://github.com/rust-lang/crates.io/pull/5039) Don't auto-generate - empty http-data files ([@Turbo87]) -- [rust-lang/crates.io] - [#5038](https://github.com/rust-lang/crates.io/pull/5038) Remove unnecessary - request proxy headers ([@Turbo87]) -- [rust-lang/crates.io] - [#5037](https://github.com/rust-lang/crates.io/pull/5037) Fail tests if there - are remaining exchanges in the request proxy queue ([@Turbo87]) +- [rust-lang/crates.io] [#5060](https://github.com/rust-lang/crates.io/pull/5060) admin/upload-index: Restore "skipping file" output ([@Turbo87]) +- [rust-lang/crates.io] [#5044](https://github.com/rust-lang/crates.io/pull/5044) Replace `lazy_static` with `once_cell` ([@Turbo87]) +- [rust-lang/crates.io] [#5042](https://github.com/rust-lang/crates.io/pull/5042) Always run background jobs after a test publish ([@Turbo87]) +- [rust-lang/crates.io] [#5041](https://github.com/rust-lang/crates.io/pull/5041) Sort headers of http-data files ([@Turbo87]) +- [rust-lang/crates.io] [#5040](https://github.com/rust-lang/crates.io/pull/5040) Add an option to easily regenerate http-data files ([@Turbo87]) +- [rust-lang/crates.io] [#5039](https://github.com/rust-lang/crates.io/pull/5039) Don't auto-generate empty http-data files ([@Turbo87]) +- [rust-lang/crates.io] [#5038](https://github.com/rust-lang/crates.io/pull/5038) Remove unnecessary request proxy headers ([@Turbo87]) +- [rust-lang/crates.io] [#5037](https://github.com/rust-lang/crates.io/pull/5037) Fail tests if there are remaining exchanges in the request proxy queue ([@Turbo87]) ## Ember.js -- [cibernox/ember-power-select] - [#1534](https://github.com/cibernox/ember-power-select/pull/1534) add back - ember-try scenarios that were removed with ember-cli-update ([@mansona]) -- [ember-cli/watch-detector] - [#35](https://github.com/ember-cli/watch-detector/pull/35) Update URLs in - package.json ([@locks]) -- [ember-engines/ember-engines] - [#810](https://github.com/ember-engines/ember-engines/pull/810) Refactor - LinkToExternal to use LinkTo directly ([@BobrImperator]) -- [ember-learn/guides-source] - [#1833](https://github.com/ember-learn/guides-source/pull/1833) v4.6.0 - ([@locks]) -- [ember-learn/rfcs-app] [#11](https://github.com/ember-learn/rfcs-app/pull/11) - remove process-rfcs step ([@mansona]) -- [ember-learn/tool-new-release] - [#35](https://github.com/ember-learn/tool-new-release/pull/35) Use 1Password - CLI for any configuration or secret ([@locks]) -- [ember-template-lint/ember-template-lint] - [#2569](https://github.com/ember-template-lint/ember-template-lint/pull/2569) - Add autofixer to `require-valid-named-block-naming-format` rule ([@locks]) -- [ember-template-lint/ember-template-lint] - [#2568](https://github.com/ember-template-lint/ember-template-lint/pull/2568) - Add autofixer to `no-unnecessary-concat` rule ([@locks]) -- [emberjs/core-notes] [#461](https://github.com/emberjs/core-notes/pull/461) - Learning - August 4th ([@locks]) -- [emberjs/ember.js] [#20151](https://github.com/emberjs/ember.js/pull/20151) - feat: add isExternal argument to simplify ember-engines ([@BobrImperator]) -- [emberjs/rfcs] [#840](https://github.com/emberjs/rfcs/pull/840) fix invalid - data issues with FIXMEs ([@mansona]) -- [emberjs/rfcs] [#833](https://github.com/emberjs/rfcs/pull/833) [RFCs App - Rendering] Reformat frontmatter ([@mansona]) -- [emberjs/rfcs-tooling] [#4](https://github.com/emberjs/rfcs-tooling/pull/4) - update to the new frontmatter format ([@mansona]) -- [empress/ember-showdown-prism] - [#31](https://github.com/empress/ember-showdown-prism/pull/31) update - ember-prism ([@mansona]) -- [empress/ember-showdown-prism] - [#27](https://github.com/empress/ember-showdown-prism/pull/27) fix ember-try - npm overrides ([@mansona]) -- [empress/guidemaker] [#73](https://github.com/empress/guidemaker/pull/73) - update to ember-auto-import@2 ([@mansona]) -- [empress/guidemaker-default-template] - [#24](https://github.com/empress/guidemaker-default-template/pull/24) update - algolia ([@mansona]) -- [empress/guidemaker-default-template] - [#23](https://github.com/empress/guidemaker-default-template/pull/23) update - algolia ([@mansona]) -- [mainmatter/ember-simple-auth] - [#2445](https://github.com/mainmatter/ember-simple-auth/pull/2445) chore: pin - @ember/test-helpers ~2.7.0 ([@BobrImperator]) +- [cibernox/ember-power-select] [#1534](https://github.com/cibernox/ember-power-select/pull/1534) add back ember-try scenarios that were removed with ember-cli-update ([@mansona]) +- [ember-cli/watch-detector] [#35](https://github.com/ember-cli/watch-detector/pull/35) Update URLs in package.json ([@locks]) +- [ember-engines/ember-engines] [#810](https://github.com/ember-engines/ember-engines/pull/810) Refactor LinkToExternal to use LinkTo directly ([@BobrImperator]) +- [ember-learn/guides-source] [#1833](https://github.com/ember-learn/guides-source/pull/1833) v4.6.0 ([@locks]) +- [ember-learn/rfcs-app] [#11](https://github.com/ember-learn/rfcs-app/pull/11) remove process-rfcs step ([@mansona]) +- [ember-learn/tool-new-release] [#35](https://github.com/ember-learn/tool-new-release/pull/35) Use 1Password CLI for any configuration or secret ([@locks]) +- [ember-template-lint/ember-template-lint] [#2569](https://github.com/ember-template-lint/ember-template-lint/pull/2569) Add autofixer to `require-valid-named-block-naming-format` rule ([@locks]) +- [ember-template-lint/ember-template-lint] [#2568](https://github.com/ember-template-lint/ember-template-lint/pull/2568) Add autofixer to `no-unnecessary-concat` rule ([@locks]) +- [emberjs/core-notes] [#461](https://github.com/emberjs/core-notes/pull/461) Learning - August 4th ([@locks]) +- [emberjs/ember.js] [#20151](https://github.com/emberjs/ember.js/pull/20151) feat: add isExternal argument to simplify ember-engines ([@BobrImperator]) +- [emberjs/rfcs] [#840](https://github.com/emberjs/rfcs/pull/840) fix invalid data issues with FIXMEs ([@mansona]) +- [emberjs/rfcs] [#833](https://github.com/emberjs/rfcs/pull/833) [RFCs App Rendering] Reformat frontmatter ([@mansona]) +- [emberjs/rfcs-tooling] [#4](https://github.com/emberjs/rfcs-tooling/pull/4) update to the new frontmatter format ([@mansona]) +- [empress/ember-showdown-prism] [#31](https://github.com/empress/ember-showdown-prism/pull/31) update ember-prism ([@mansona]) +- [empress/ember-showdown-prism] [#27](https://github.com/empress/ember-showdown-prism/pull/27) fix ember-try npm overrides ([@mansona]) +- [empress/guidemaker] [#73](https://github.com/empress/guidemaker/pull/73) update to ember-auto-import@2 ([@mansona]) +- [empress/guidemaker-default-template] [#24](https://github.com/empress/guidemaker-default-template/pull/24) update algolia ([@mansona]) +- [empress/guidemaker-default-template] [#23](https://github.com/empress/guidemaker-default-template/pull/23) update algolia ([@mansona]) +- [mainmatter/ember-simple-auth] [#2445](https://github.com/mainmatter/ember-simple-auth/pull/2445) chore: pin @ember/test-helpers ~2.7.0 ([@BobrImperator]) ## Lint to the future -- [mansona/lint-to-the-future] - [#26](https://github.com/mansona/lint-to-the-future/pull/26) Update README.md - ([@Mikek2252]) -- [mansona/lint-to-the-future-dashboard-action] - [#1](https://github.com/mansona/lint-to-the-future-dashboard-action/pull/1) - Update README.md ([@Mikek2252]) +- [mansona/lint-to-the-future] [#26](https://github.com/mansona/lint-to-the-future/pull/26) Update README.md ([@Mikek2252]) +- [mansona/lint-to-the-future-dashboard-action] [#1](https://github.com/mansona/lint-to-the-future-dashboard-action/pull/1) Update README.md ([@Mikek2252]) ## JavaScript -- [mansona/showdown-section-groups] - [#4](https://github.com/mansona/showdown-section-groups/pull/4) drop babel and - just use modules ([@mansona]) -- [mansona/showdown-section-groups] - [#3](https://github.com/mansona/showdown-section-groups/pull/3) Fix the repo - metadata and add a more useful readme ([@mansona]) -- [mansona/showdown-section-groups] - [#2](https://github.com/mansona/showdown-section-groups/pull/2) breaking: drop - support for Node < 14 (EOL) ([@mansona]) -- [mansona/showdown-section-groups] - [#1](https://github.com/mansona/showdown-section-groups/pull/1) move to GitHub - actions ([@mansona]) -- [calibreapp/image-actions] - [#126](https://github.com/calibreapp/image-actions/pull/126) fix(entrypoint): - exit(0) when pull_request.<event> is not 'synchronize' or 'opened' - ([@oscard0m]) +- [mansona/showdown-section-groups] [#4](https://github.com/mansona/showdown-section-groups/pull/4) drop babel and just use modules ([@mansona]) +- [mansona/showdown-section-groups] [#3](https://github.com/mansona/showdown-section-groups/pull/3) Fix the repo metadata and add a more useful readme ([@mansona]) +- [mansona/showdown-section-groups] [#2](https://github.com/mansona/showdown-section-groups/pull/2) breaking: drop support for Node < 14 (EOL) ([@mansona]) +- [mansona/showdown-section-groups] [#1](https://github.com/mansona/showdown-section-groups/pull/1) move to GitHub actions ([@mansona]) +- [calibreapp/image-actions] [#126](https://github.com/calibreapp/image-actions/pull/126) fix(entrypoint): exit(0) when pull_request.<event> is not 'synchronize' or 'opened' ([@oscard0m]) ## Octokit -- [octokit/auth-oauth-user.js] - [#71](https://github.com/octokit/auth-oauth-user.js/pull/71) ci(test): use - Octokit's 'test' Workflow ([@oscard0m]) -- [octokit/webhooks-methods.js] - [#66](https://github.com/octokit/webhooks-methods.js/pull/66) ci(test): re-use - Octokit's test.yml action ([@oscard0m]) +- [octokit/auth-oauth-user.js] [#71](https://github.com/octokit/auth-oauth-user.js/pull/71) ci(test): use Octokit's 'test' Workflow ([@oscard0m]) +- [octokit/webhooks-methods.js] [#66](https://github.com/octokit/webhooks-methods.js/pull/66) ci(test): re-use Octokit's test.yml action ([@oscard0m]) [@bobrimperator]: https://github.com/BobrImperator [@mikek2252]: https://github.com/Mikek2252 @@ -140,22 +69,18 @@ [ember-learn/guides-source]: https://github.com/ember-learn/guides-source [ember-learn/rfcs-app]: https://github.com/ember-learn/rfcs-app [ember-learn/tool-new-release]: https://github.com/ember-learn/tool-new-release -[ember-template-lint/ember-template-lint]: - https://github.com/ember-template-lint/ember-template-lint +[ember-template-lint/ember-template-lint]: https://github.com/ember-template-lint/ember-template-lint [emberjs/core-notes]: https://github.com/emberjs/core-notes [emberjs/ember.js]: https://github.com/emberjs/ember.js [emberjs/rfcs-tooling]: https://github.com/emberjs/rfcs-tooling [emberjs/rfcs]: https://github.com/emberjs/rfcs [empress/ember-showdown-prism]: https://github.com/empress/ember-showdown-prism -[empress/guidemaker-default-template]: - https://github.com/empress/guidemaker-default-template +[empress/guidemaker-default-template]: https://github.com/empress/guidemaker-default-template [empress/guidemaker]: https://github.com/empress/guidemaker [kivikakk/comrak]: https://github.com/kivikakk/comrak -[mansona/lint-to-the-future-dashboard-action]: - https://github.com/mansona/lint-to-the-future-dashboard-action +[mansona/lint-to-the-future-dashboard-action]: https://github.com/mansona/lint-to-the-future-dashboard-action [mansona/lint-to-the-future]: https://github.com/mansona/lint-to-the-future -[mansona/showdown-section-groups]: - https://github.com/mansona/showdown-section-groups +[mansona/showdown-section-groups]: https://github.com/mansona/showdown-section-groups [octokit/auth-oauth-user.js]: https://github.com/octokit/auth-oauth-user.js [octokit/webhooks-methods.js]: https://github.com/octokit/webhooks-methods.js [rust-lang/crates.io]: https://github.com/rust-lang/crates.io diff --git a/src/twios/2022-09-07.md b/src/twios/2022-09-07.md index 0a3adf5040..a8ba8c53dc 100644 --- a/src/twios/2022-09-07.md +++ b/src/twios/2022-09-07.md @@ -1,252 +1,117 @@ ## Rust -- [LukeMathWalker/tracing-bunyan-formatter] - [#20](https://github.com/LukeMathWalker/tracing-bunyan-formatter/pull/20) - Migrate from `claim` to `claims` ([@Turbo87]) -- [Turbo87/segelflug-classifieds] - [#350](https://github.com/Turbo87/segelflug-classifieds/pull/350) Fix "byte - index is not a char boundary" crash ([@Turbo87]) +- [LukeMathWalker/tracing-bunyan-formatter] [#20](https://github.com/LukeMathWalker/tracing-bunyan-formatter/pull/20) Migrate from `claim` to `claims` ([@Turbo87]) +- [Turbo87/segelflug-classifieds] [#350](https://github.com/Turbo87/segelflug-classifieds/pull/350) Fix "byte index is not a char boundary" crash ([@Turbo87]) ## crates.io -- [rust-lang/crates.io] - [#5170](https://github.com/rust-lang/crates.io/pull/5170) Remove icons from - page headers ([@Turbo87]) -- [rust-lang/crates.io] - [#5167](https://github.com/rust-lang/crates.io/pull/5167) PageHeader: Remove - margins on `.heading` element ([@Turbo87]) -- [rust-lang/crates.io] - [#5166](https://github.com/rust-lang/crates.io/pull/5166) tests/record: Fix - server bind IP address ([@Turbo87]) -- [rust-lang/crates.io] - [#5165](https://github.com/rust-lang/crates.io/pull/5165) Migrate from `claim` - to `claims` ([@Turbo87]) -- [rust-lang/crates.io] - [#5164](https://github.com/rust-lang/crates.io/pull/5164) accept-invite: Use - `` instead of raw `` ([@Turbo87]) -- [rust-lang/crates.io] - [#5155](https://github.com/rust-lang/crates.io/pull/5155) Use slightly darker - background color for header and footer ([@Turbo87]) -- [rust-lang/crates.io] - [#5150](https://github.com/rust-lang/crates.io/pull/5150) renovate: Group - `diesel` packages in one pull request ([@Turbo87]) -- [rust-lang/crates.io] - [#5149](https://github.com/rust-lang/crates.io/pull/5149) Adjust header - foreground colors ([@Turbo87]) -- [rust-lang/crates.io] - [#5148](https://github.com/rust-lang/crates.io/pull/5148) RenderedHtml: Fix - inline code styling in lists ([@Turbo87]) -- [rust-lang/crates.io] - [#5146](https://github.com/rust-lang/crates.io/pull/5146) Use snapshot testing - for `category` API tests ([@Turbo87]) -- [rust-lang/crates.io] - [#5145](https://github.com/rust-lang/crates.io/pull/5145) EncodableVersion: - Expose new `checksum` field on the API ([@Turbo87]) -- [rust-lang/crates.io] - [#5144](https://github.com/rust-lang/crates.io/pull/5144) Fix rustdoc link - rendering in READMEs ([@Turbo87]) -- [rust-lang/crates.io] - [#5135](https://github.com/rust-lang/crates.io/pull/5135) versions: Adjust - `checksum` column to be `NOT NULL` ([@Turbo87]) -- [rust-lang/crates.io] - [#5134](https://github.com/rust-lang/crates.io/pull/5134) Docker: Fix pnpm - usage ([@Turbo87]) -- [rust-lang/crates.io] - [#5133](https://github.com/rust-lang/crates.io/pull/5133) tests: Use `insta` - to assert on full version API responses ([@Turbo87]) -- [rust-lang/crates.io] - [#5132](https://github.com/rust-lang/crates.io/pull/5132) CI: Run `percy exec` - with `pnpm` instead of `pnpx` ([@Turbo87]) -- [rust-lang/crates.io] - [#5126](https://github.com/rust-lang/crates.io/pull/5126) Replace - `ember-api-actions` dependency with `customAction()` function ([@Turbo87]) -- [rust-lang/crates.io] - [#5125](https://github.com/rust-lang/crates.io/pull/5125) ember-data: Silence - `model-save-promise` deprecation ([@Turbo87]) -- [rust-lang/crates.io] - [#5123](https://github.com/rust-lang/crates.io/pull/5123) ember-data: Replace - `store.find()` calls with `store.findRecord()` ([@Turbo87]) -- [rust-lang/crates.io] - [#5122](https://github.com/rust-lang/crates.io/pull/5122) admin::git_import: - Improve error reporting ([@Turbo87]) -- [rust-lang/crates.io] - [#5118](https://github.com/rust-lang/crates.io/pull/5118) ESLint: Add missing - `@babel/plugin-proposal-decorators` dependency ([@Turbo87]) -- [rust-lang/crates.io] - [#5115](https://github.com/rust-lang/crates.io/pull/5115) ember-concurrency: - Migrate to new task syntax API ([@Turbo87]) -- [rust-lang/crates.io] - [#5101](https://github.com/rust-lang/crates.io/pull/5101) pnpm: Fix more peer - dependency issues ([@Turbo87]) -- [rust-lang/crates.io] - [#5100](https://github.com/rust-lang/crates.io/pull/5100) pnpm: Ignore - `postcss` peer dependency warnings ([@Turbo87]) -- [rust-lang/crates.io] - [#5091](https://github.com/rust-lang/crates.io/pull/5091) database: Add - `explicit_name` column to `dependencies` table ([@Turbo87]) -- [rust-lang/crates.io] - [#5089](https://github.com/rust-lang/crates.io/pull/5089) index: Use/Allow - alphabetic ordering of features and dependencies ([@Turbo87]) -- [rust-lang/crates.io] - [#5084](https://github.com/rust-lang/crates.io/pull/5084) Migrate from yarn - 1.x to pnpm ([@Turbo87]) -- [rust-lang/crates.io] - [#5077](https://github.com/rust-lang/crates.io/pull/5077) database: Add - `checksum` field ([@Turbo87]) -- [rust-lang/crates.io] - [#5074](https://github.com/rust-lang/crates.io/pull/5074) Stop saving badges - in the database ([@Turbo87]) -- [rust-lang/crates.io] - [#5071](https://github.com/rust-lang/crates.io/pull/5071) Stop returning - deprecated badges from API ([@Turbo87]) -- [rust-lang/crates.io] - [#5070](https://github.com/rust-lang/crates.io/pull/5070) Remove unnecessary - derefs ([@Turbo87]) +- [rust-lang/crates.io] [#5170](https://github.com/rust-lang/crates.io/pull/5170) Remove icons from page headers ([@Turbo87]) +- [rust-lang/crates.io] [#5167](https://github.com/rust-lang/crates.io/pull/5167) PageHeader: Remove margins on `.heading` element ([@Turbo87]) +- [rust-lang/crates.io] [#5166](https://github.com/rust-lang/crates.io/pull/5166) tests/record: Fix server bind IP address ([@Turbo87]) +- [rust-lang/crates.io] [#5165](https://github.com/rust-lang/crates.io/pull/5165) Migrate from `claim` to `claims` ([@Turbo87]) +- [rust-lang/crates.io] [#5164](https://github.com/rust-lang/crates.io/pull/5164) accept-invite: Use `` instead of raw `` ([@Turbo87]) +- [rust-lang/crates.io] [#5155](https://github.com/rust-lang/crates.io/pull/5155) Use slightly darker background color for header and footer ([@Turbo87]) +- [rust-lang/crates.io] [#5150](https://github.com/rust-lang/crates.io/pull/5150) renovate: Group `diesel` packages in one pull request ([@Turbo87]) +- [rust-lang/crates.io] [#5149](https://github.com/rust-lang/crates.io/pull/5149) Adjust header foreground colors ([@Turbo87]) +- [rust-lang/crates.io] [#5148](https://github.com/rust-lang/crates.io/pull/5148) RenderedHtml: Fix inline code styling in lists ([@Turbo87]) +- [rust-lang/crates.io] [#5146](https://github.com/rust-lang/crates.io/pull/5146) Use snapshot testing for `category` API tests ([@Turbo87]) +- [rust-lang/crates.io] [#5145](https://github.com/rust-lang/crates.io/pull/5145) EncodableVersion: Expose new `checksum` field on the API ([@Turbo87]) +- [rust-lang/crates.io] [#5144](https://github.com/rust-lang/crates.io/pull/5144) Fix rustdoc link rendering in READMEs ([@Turbo87]) +- [rust-lang/crates.io] [#5135](https://github.com/rust-lang/crates.io/pull/5135) versions: Adjust `checksum` column to be `NOT NULL` ([@Turbo87]) +- [rust-lang/crates.io] [#5134](https://github.com/rust-lang/crates.io/pull/5134) Docker: Fix pnpm usage ([@Turbo87]) +- [rust-lang/crates.io] [#5133](https://github.com/rust-lang/crates.io/pull/5133) tests: Use `insta` to assert on full version API responses ([@Turbo87]) +- [rust-lang/crates.io] [#5132](https://github.com/rust-lang/crates.io/pull/5132) CI: Run `percy exec` with `pnpm` instead of `pnpx` ([@Turbo87]) +- [rust-lang/crates.io] [#5126](https://github.com/rust-lang/crates.io/pull/5126) Replace `ember-api-actions` dependency with `customAction()` function ([@Turbo87]) +- [rust-lang/crates.io] [#5125](https://github.com/rust-lang/crates.io/pull/5125) ember-data: Silence `model-save-promise` deprecation ([@Turbo87]) +- [rust-lang/crates.io] [#5123](https://github.com/rust-lang/crates.io/pull/5123) ember-data: Replace `store.find()` calls with `store.findRecord()` ([@Turbo87]) +- [rust-lang/crates.io] [#5122](https://github.com/rust-lang/crates.io/pull/5122) admin::git_import: Improve error reporting ([@Turbo87]) +- [rust-lang/crates.io] [#5118](https://github.com/rust-lang/crates.io/pull/5118) ESLint: Add missing `@babel/plugin-proposal-decorators` dependency ([@Turbo87]) +- [rust-lang/crates.io] [#5115](https://github.com/rust-lang/crates.io/pull/5115) ember-concurrency: Migrate to new task syntax API ([@Turbo87]) +- [rust-lang/crates.io] [#5101](https://github.com/rust-lang/crates.io/pull/5101) pnpm: Fix more peer dependency issues ([@Turbo87]) +- [rust-lang/crates.io] [#5100](https://github.com/rust-lang/crates.io/pull/5100) pnpm: Ignore `postcss` peer dependency warnings ([@Turbo87]) +- [rust-lang/crates.io] [#5091](https://github.com/rust-lang/crates.io/pull/5091) database: Add `explicit_name` column to `dependencies` table ([@Turbo87]) +- [rust-lang/crates.io] [#5089](https://github.com/rust-lang/crates.io/pull/5089) index: Use/Allow alphabetic ordering of features and dependencies ([@Turbo87]) +- [rust-lang/crates.io] [#5084](https://github.com/rust-lang/crates.io/pull/5084) Migrate from yarn 1.x to pnpm ([@Turbo87]) +- [rust-lang/crates.io] [#5077](https://github.com/rust-lang/crates.io/pull/5077) database: Add `checksum` field ([@Turbo87]) +- [rust-lang/crates.io] [#5074](https://github.com/rust-lang/crates.io/pull/5074) Stop saving badges in the database ([@Turbo87]) +- [rust-lang/crates.io] [#5071](https://github.com/rust-lang/crates.io/pull/5071) Stop returning deprecated badges from API ([@Turbo87]) +- [rust-lang/crates.io] [#5070](https://github.com/rust-lang/crates.io/pull/5070) Remove unnecessary derefs ([@Turbo87]) ## Octoherd -- [octoherd/.github] [#5](https://github.com/octoherd/.github/pull/5) - feat(default.json): remove 'helpers:pinGitHubActionDigests' ([@oscard0m]) +- [octoherd/.github] [#5](https://github.com/octoherd/.github/pull/5) feat(default.json): remove 'helpers:pinGitHubActionDigests' ([@oscard0m]) ## Ember.js -- [ef4/ember-auto-import] - [#533](https://github.com/ef4/ember-auto-import/pull/533) update - package-lock.json version of htmlbars ([@mansona]) -- [ember-learn/ember-blog] - [#1201](https://github.com/ember-learn/ember-blog/pull/1201) update - empress-blog ([@mansona]) -- [ember-learn/ember-styleguide] - [#431](https://github.com/ember-learn/ember-styleguide/pull/431) fix issues - with ember-try release scenarios ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#115](https://github.com/ember-learn/guidemaker-ember-template/pull/115) add - website-redesign branch to builds ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#114](https://github.com/ember-learn/guidemaker-ember-template/pull/114) add - deprecations scenarios to ember-try ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#113](https://github.com/ember-learn/guidemaker-ember-template/pull/113) run - angle-brackets-codemod ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#112](https://github.com/ember-learn/guidemaker-ember-template/pull/112) - remove the use of implicit-this ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#111](https://github.com/ember-learn/guidemaker-ember-template/pull/111) fix - ember-try for Ember release, beta, and alpha ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#110](https://github.com/ember-learn/guidemaker-ember-template/pull/110) - Update dependencies to fix CI ([@mansona]) -- [ember-template-lint/ember-template-lint] - [#2584](https://github.com/ember-template-lint/ember-template-lint/pull/2584) - Add autofixer to `linebreak-style` rule ([@locks]) -- [ember-template-lint/ember-template-lint] - [#2583](https://github.com/ember-template-lint/ember-template-lint/pull/2583) - Add autofixer to `self-closing-void-elements` rule ([@locks]) -- [ember-template-lint/ember-template-lint] - [#2582](https://github.com/ember-template-lint/ember-template-lint/pull/2582) - Add autofixer to `no-quoteless-attributes` rule ([@locks]) -- [ember-template-lint/ember-template-lint] - [#2581](https://github.com/ember-template-lint/ember-template-lint/pull/2581) - Add autofixer to `no-html-comments` rule ([@locks]) -- [ember-template-lint/ember-template-lint] - [#2580](https://github.com/ember-template-lint/ember-template-lint/pull/2580) - Add autofixer to `no-unused-block-params` rule ([@locks]) -- [empress/guidemaker] [#76](https://github.com/empress/guidemaker/pull/76) fix - transitionTo deprecations ([@mansona]) -- [empress/guidemaker] [#75](https://github.com/empress/guidemaker/pull/75) fix - ember-try for pre-releases ([@mansona]) -- [empress/guidemaker] [#74](https://github.com/empress/guidemaker/pull/74) - update dependencies to fix CI ([@mansona]) -- [empress/guidemaker-default-template] - [#28](https://github.com/empress/guidemaker-default-template/pull/28) remove - link-to override ([@mansona]) -- [empress/guidemaker-default-template] - [#27](https://github.com/empress/guidemaker-default-template/pull/27) fix - no-implicit-this and template deprecations ([@mansona]) -- [empress/guidemaker-default-template] - [#26](https://github.com/empress/guidemaker-default-template/pull/26) remove - ember-cli-google-fonts ([@mansona]) -- [empress/guidemaker-default-template] - [#25](https://github.com/empress/guidemaker-default-template/pull/25) fix the - contains helper that never worked ([@mansona]) +- [ef4/ember-auto-import] [#533](https://github.com/ef4/ember-auto-import/pull/533) update package-lock.json version of htmlbars ([@mansona]) +- [ember-learn/ember-blog] [#1201](https://github.com/ember-learn/ember-blog/pull/1201) update empress-blog ([@mansona]) +- [ember-learn/ember-styleguide] [#431](https://github.com/ember-learn/ember-styleguide/pull/431) fix issues with ember-try release scenarios ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#115](https://github.com/ember-learn/guidemaker-ember-template/pull/115) add website-redesign branch to builds ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#114](https://github.com/ember-learn/guidemaker-ember-template/pull/114) add deprecations scenarios to ember-try ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#113](https://github.com/ember-learn/guidemaker-ember-template/pull/113) run angle-brackets-codemod ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#112](https://github.com/ember-learn/guidemaker-ember-template/pull/112) remove the use of implicit-this ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#111](https://github.com/ember-learn/guidemaker-ember-template/pull/111) fix ember-try for Ember release, beta, and alpha ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#110](https://github.com/ember-learn/guidemaker-ember-template/pull/110) Update dependencies to fix CI ([@mansona]) +- [ember-template-lint/ember-template-lint] [#2584](https://github.com/ember-template-lint/ember-template-lint/pull/2584) Add autofixer to `linebreak-style` rule ([@locks]) +- [ember-template-lint/ember-template-lint] [#2583](https://github.com/ember-template-lint/ember-template-lint/pull/2583) Add autofixer to `self-closing-void-elements` rule ([@locks]) +- [ember-template-lint/ember-template-lint] [#2582](https://github.com/ember-template-lint/ember-template-lint/pull/2582) Add autofixer to `no-quoteless-attributes` rule ([@locks]) +- [ember-template-lint/ember-template-lint] [#2581](https://github.com/ember-template-lint/ember-template-lint/pull/2581) Add autofixer to `no-html-comments` rule ([@locks]) +- [ember-template-lint/ember-template-lint] [#2580](https://github.com/ember-template-lint/ember-template-lint/pull/2580) Add autofixer to `no-unused-block-params` rule ([@locks]) +- [empress/guidemaker] [#76](https://github.com/empress/guidemaker/pull/76) fix transitionTo deprecations ([@mansona]) +- [empress/guidemaker] [#75](https://github.com/empress/guidemaker/pull/75) fix ember-try for pre-releases ([@mansona]) +- [empress/guidemaker] [#74](https://github.com/empress/guidemaker/pull/74) update dependencies to fix CI ([@mansona]) +- [empress/guidemaker-default-template] [#28](https://github.com/empress/guidemaker-default-template/pull/28) remove link-to override ([@mansona]) +- [empress/guidemaker-default-template] [#27](https://github.com/empress/guidemaker-default-template/pull/27) fix no-implicit-this and template deprecations ([@mansona]) +- [empress/guidemaker-default-template] [#26](https://github.com/empress/guidemaker-default-template/pull/26) remove ember-cli-google-fonts ([@mansona]) +- [empress/guidemaker-default-template] [#25](https://github.com/empress/guidemaker-default-template/pull/25) fix the contains helper that never worked ([@mansona]) ## Lint to the future -- [mansona/lint-to-the-future-stylelint] - [#6](https://github.com/mansona/lint-to-the-future-stylelint/pull/6) Add a - basic testing system ([@mansona]) +- [mansona/lint-to-the-future-stylelint] [#6](https://github.com/mansona/lint-to-the-future-stylelint/pull/6) Add a basic testing system ([@mansona]) ## JavaScript -- [volta-cli/action] [#100](https://github.com/volta-cli/action/pull/100) Fix - changelog heading ([@Turbo87]) +- [volta-cli/action] [#100](https://github.com/volta-cli/action/pull/100) Fix changelog heading ([@Turbo87]) ## Octokit -- [octokit/auth-oauth-device.js] - [#74](https://github.com/octokit/auth-oauth-device.js/pull/74) fix(test): - force test failure ([@oscard0m]) -- [octokit/auth-oauth-device.js] - [#72](https://github.com/octokit/auth-oauth-device.js/pull/72) revert(deps): - lock file maintenance ([@oscard0m]) -- [octokit/oauth-app.js] - [#331](https://github.com/octokit/oauth-app.js/pull/331) fix(bundlesize): move - 'aws-lambda' as devDependency ([@oscard0m]) -- [oscard0m/octoherd-script-fix-test-workflow-octokit] - [#1](https://github.com/oscard0m/octoherd-script-fix-test-workflow-octokit/pull/1) - feat: Initial version ([@oscard0m]) -- [oscard0m/octoherd-script-remove-renovate-package.json] - [#1](https://github.com/oscard0m/octoherd-script-remove-renovate-package.json/pull/1) - feat: Initial version ([@oscard0m]) +- [octokit/auth-oauth-device.js] [#74](https://github.com/octokit/auth-oauth-device.js/pull/74) fix(test): force test failure ([@oscard0m]) +- [octokit/auth-oauth-device.js] [#72](https://github.com/octokit/auth-oauth-device.js/pull/72) revert(deps): lock file maintenance ([@oscard0m]) +- [octokit/oauth-app.js] [#331](https://github.com/octokit/oauth-app.js/pull/331) fix(bundlesize): move 'aws-lambda' as devDependency ([@oscard0m]) +- [oscard0m/octoherd-script-fix-test-workflow-octokit] [#1](https://github.com/oscard0m/octoherd-script-fix-test-workflow-octokit/pull/1) feat: Initial version ([@oscard0m]) +- [oscard0m/octoherd-script-remove-renovate-package.json] [#1](https://github.com/oscard0m/octoherd-script-remove-renovate-package.json/pull/1) feat: Initial version ([@oscard0m]) ## Probot -- [probot/example-vercel] - [#50](https://github.com/probot/example-vercel/pull/50) docs(README): add - section for 'Other examples' ([@oscard0m]) -- [probot/example-vercel] - [#49](https://github.com/probot/example-vercel/pull/49) docs(readme): add - considerations for deploying with vercel ([@oscard0m]) -- [probot/probot] [#1724](https://github.com/probot/probot/pull/1724) - build(deps): upgrade octokit/types to v7.1.1 ([@oscard0m]) +- [probot/example-vercel] [#50](https://github.com/probot/example-vercel/pull/50) docs(README): add section for 'Other examples' ([@oscard0m]) +- [probot/example-vercel] [#49](https://github.com/probot/example-vercel/pull/49) docs(readme): add considerations for deploying with vercel ([@oscard0m]) +- [probot/probot] [#1724](https://github.com/probot/probot/pull/1724) build(deps): upgrade octokit/types to v7.1.1 ([@oscard0m]) [@turbo87]: https://github.com/Turbo87 [@candunaj]: https://github.com/candunaj [@locks]: https://github.com/locks [@mansona]: https://github.com/mansona [@oscard0m]: https://github.com/oscard0m -[lukemathwalker/tracing-bunyan-formatter]: - https://github.com/LukeMathWalker/tracing-bunyan-formatter -[turbo87/segelflug-classifieds]: - https://github.com/Turbo87/segelflug-classifieds +[lukemathwalker/tracing-bunyan-formatter]: https://github.com/LukeMathWalker/tracing-bunyan-formatter +[turbo87/segelflug-classifieds]: https://github.com/Turbo87/segelflug-classifieds [ef4/ember-auto-import]: https://github.com/ef4/ember-auto-import -[ember-codemods/ember-angle-brackets-codemod]: - https://github.com/ember-codemods/ember-angle-brackets-codemod +[ember-codemods/ember-angle-brackets-codemod]: https://github.com/ember-codemods/ember-angle-brackets-codemod [ember-learn/ember-blog]: https://github.com/ember-learn/ember-blog [ember-learn/ember-styleguide]: https://github.com/ember-learn/ember-styleguide -[ember-learn/guidemaker-ember-template]: - https://github.com/ember-learn/guidemaker-ember-template -[ember-template-lint/ember-template-lint]: - https://github.com/ember-template-lint/ember-template-lint -[empress/guidemaker-default-template]: - https://github.com/empress/guidemaker-default-template +[ember-learn/guidemaker-ember-template]: https://github.com/ember-learn/guidemaker-ember-template +[ember-template-lint/ember-template-lint]: https://github.com/ember-template-lint/ember-template-lint +[empress/guidemaker-default-template]: https://github.com/empress/guidemaker-default-template [empress/guidemaker]: https://github.com/empress/guidemaker -[mansona/lint-to-the-future-stylelint]: - https://github.com/mansona/lint-to-the-future-stylelint +[mansona/lint-to-the-future-stylelint]: https://github.com/mansona/lint-to-the-future-stylelint [octoherd/.github]: https://github.com/octoherd/.github -[octoherd/create-octoherd-script]: - https://github.com/octoherd/create-octoherd-script -[octoherd/script-setup-renovate]: - https://github.com/octoherd/script-setup-renovate +[octoherd/create-octoherd-script]: https://github.com/octoherd/create-octoherd-script +[octoherd/script-setup-renovate]: https://github.com/octoherd/script-setup-renovate [octokit/auth-oauth-device.js]: https://github.com/octokit/auth-oauth-device.js [octokit/oauth-app.js]: https://github.com/octokit/oauth-app.js [oscard0m/example-vercel-ts]: https://github.com/oscard0m/example-vercel-ts [oscard0m/gravity_dummy]: https://github.com/oscard0m/gravity_dummy -[oscard0m/octoherd-script-fix-test-workflow-octokit]: - https://github.com/oscard0m/octoherd-script-fix-test-workflow-octokit -[oscard0m/octoherd-script-remove-renovate-package.json]: - https://github.com/oscard0m/octoherd-script-remove-renovate-package.json +[oscard0m/octoherd-script-fix-test-workflow-octokit]: https://github.com/oscard0m/octoherd-script-fix-test-workflow-octokit +[oscard0m/octoherd-script-remove-renovate-package.json]: https://github.com/oscard0m/octoherd-script-remove-renovate-package.json [probot/example-vercel]: https://github.com/probot/example-vercel [probot/probot]: https://github.com/probot/probot [rust-lang/crates.io]: https://github.com/rust-lang/crates.io diff --git a/src/twios/2022-10-03.md b/src/twios/2022-10-03.md index 358e4d22ff..45a94efa80 100644 --- a/src/twios/2022-10-03.md +++ b/src/twios/2022-10-03.md @@ -1,194 +1,97 @@ ## Rust -- [Turbo87/united-flarmnet] - [#162](https://github.com/Turbo87/united-flarmnet/pull/162) workflows/run: - Deploy to GitHub Pages directly ([@Turbo87]) -- [Turbo87/united-flarmnet] - [#157](https://github.com/Turbo87/united-flarmnet/pull/157) CI: Simplify `CI` - workflow ([@Turbo87]) -- [Turbo87/united-flarmnet] - [#156](https://github.com/Turbo87/united-flarmnet/pull/156) CI: Simplify and - improve `Run` workflow ([@Turbo87]) +- [Turbo87/united-flarmnet] [#162](https://github.com/Turbo87/united-flarmnet/pull/162) workflows/run: Deploy to GitHub Pages directly ([@Turbo87]) +- [Turbo87/united-flarmnet] [#157](https://github.com/Turbo87/united-flarmnet/pull/157) CI: Simplify `CI` workflow ([@Turbo87]) +- [Turbo87/united-flarmnet] [#156](https://github.com/Turbo87/united-flarmnet/pull/156) CI: Simplify and improve `Run` workflow ([@Turbo87]) ## crates.io -- [rust-lang/crates.io] - [#5262](https://github.com/rust-lang/crates.io/pull/5262) CI: Replace - `volta-cli/action` with builtin functionality from `actions/setup-node` - ([@Turbo87]) -- [rust-lang/crates.io] - [#5244](https://github.com/rust-lang/crates.io/pull/5244) Use slightly darker - background color for header and footer ([@Turbo87]) -- [rust-lang/crates.io] - [#5243](https://github.com/rust-lang/crates.io/pull/5243) CrateHeader: Fix - narrow screen layout ([@Turbo87]) -- [rust-lang/crates.io] - [#5238](https://github.com/rust-lang/crates.io/pull/5238) ember-get-config: - Use override to update to v2.1.1 ([@Turbo87]) -- [rust-lang/crates.io] - [#5233](https://github.com/rust-lang/crates.io/pull/5233) ember-data: Enable - `crypto.randomUUID()` polyfill ([@Turbo87]) -- [rust-lang/crates.io] - [#5180](https://github.com/rust-lang/crates.io/pull/5180) services/session: - Clear in-memory data when logging out ([@Turbo87]) +- [rust-lang/crates.io] [#5262](https://github.com/rust-lang/crates.io/pull/5262) CI: Replace `volta-cli/action` with builtin functionality from `actions/setup-node` ([@Turbo87]) +- [rust-lang/crates.io] [#5244](https://github.com/rust-lang/crates.io/pull/5244) Use slightly darker background color for header and footer ([@Turbo87]) +- [rust-lang/crates.io] [#5243](https://github.com/rust-lang/crates.io/pull/5243) CrateHeader: Fix narrow screen layout ([@Turbo87]) +- [rust-lang/crates.io] [#5238](https://github.com/rust-lang/crates.io/pull/5238) ember-get-config: Use override to update to v2.1.1 ([@Turbo87]) +- [rust-lang/crates.io] [#5233](https://github.com/rust-lang/crates.io/pull/5233) ember-data: Enable `crypto.randomUUID()` polyfill ([@Turbo87]) +- [rust-lang/crates.io] [#5180](https://github.com/rust-lang/crates.io/pull/5180) services/session: Clear in-memory data when logging out ([@Turbo87]) ## Octoherd -- [octoherd/.github] [#7](https://github.com/octoherd/.github/pull/7) - feat(renovate): extend octokit/.github preset ([@oscard0m]) -- [octoherd/create-octoherd-script] - [#72](https://github.com/octoherd/create-octoherd-script/pull/72) - ci(release.yml): revert delition v3 to actions/setup-node by octoherd script - ([@oscard0m]) -- [octoherd/create-octoherd-script] - [#68](https://github.com/octoherd/create-octoherd-script/pull/68) build(deps): - remove semantic-release dependencies ([@oscard0m]) -- [octoherd/create-octoherd-script] - [#66](https://github.com/octoherd/create-octoherd-script/pull/66) - feat(script): scaffold renovate config for octoherd repos ([@oscard0m]) -- [octoherd/create-octoherd-script] - [#65](https://github.com/octoherd/create-octoherd-script/pull/65) - style(renovate): apply Prettier indentation ([@oscard0m]) -- [octoherd/script-setup-renovate] - [#35](https://github.com/octoherd/script-setup-renovate/pull/35) feat(script): - skip repositories named '.github' ([@oscard0m]) +- [octoherd/.github] [#7](https://github.com/octoherd/.github/pull/7) feat(renovate): extend octokit/.github preset ([@oscard0m]) +- [octoherd/create-octoherd-script] [#72](https://github.com/octoherd/create-octoherd-script/pull/72) ci(release.yml): revert delition v3 to actions/setup-node by octoherd script ([@oscard0m]) +- [octoherd/create-octoherd-script] [#68](https://github.com/octoherd/create-octoherd-script/pull/68) build(deps): remove semantic-release dependencies ([@oscard0m]) +- [octoherd/create-octoherd-script] [#66](https://github.com/octoherd/create-octoherd-script/pull/66) feat(script): scaffold renovate config for octoherd repos ([@oscard0m]) +- [octoherd/create-octoherd-script] [#65](https://github.com/octoherd/create-octoherd-script/pull/65) style(renovate): apply Prettier indentation ([@oscard0m]) +- [octoherd/script-setup-renovate] [#35](https://github.com/octoherd/script-setup-renovate/pull/35) feat(script): skip repositories named '.github' ([@oscard0m]) ## Ember.js -- [ember-cli/ember-cli-htmlbars] - [#755](https://github.com/ember-cli/ember-cli-htmlbars/pull/755) Add a test - that covers addon templates and fix ember-try to include correct ember-cli - versions ([@mansona]) -- [ember-learn/ember-release-bot] - [#25](https://github.com/ember-learn/ember-release-bot/pull/25) Update - postgres keyv dependencies ([@mansona]) -- [ember-learn/guides-source] - [#1846](https://github.com/ember-learn/guides-source/pull/1846) v4.7.0 - ([@locks]) -- [emberjs/rfcs-tooling] [#12](https://github.com/emberjs/rfcs-tooling/pull/12) - lint releaseDate properly ([@mansona]) -- [mainmatter/ember-workshop] - [#646](https://github.com/mainmatter/ember-workshop/pull/646) Ignore all - node_modules, not just direct child ([@locks]) +- [ember-cli/ember-cli-htmlbars] [#755](https://github.com/ember-cli/ember-cli-htmlbars/pull/755) Add a test that covers addon templates and fix ember-try to include correct ember-cli versions ([@mansona]) +- [ember-learn/ember-release-bot] [#25](https://github.com/ember-learn/ember-release-bot/pull/25) Update postgres keyv dependencies ([@mansona]) +- [ember-learn/guides-source] [#1846](https://github.com/ember-learn/guides-source/pull/1846) v4.7.0 ([@locks]) +- [emberjs/rfcs-tooling] [#12](https://github.com/emberjs/rfcs-tooling/pull/12) lint releaseDate properly ([@mansona]) +- [mainmatter/ember-workshop] [#646](https://github.com/mainmatter/ember-workshop/pull/646) Ignore all node_modules, not just direct child ([@locks]) +- [mainmatter/ember2-x-codemods] [#5](https://github.com/mainmatter/ember2-x-codemods/pull/5) update ci workflow to publish on tag creation ([@Mikek2252]) +- [mainmatter/ember2-x-codemods] [#4](https://github.com/mainmatter/ember2-x-codemods/pull/4) add lerna-changelog and release it ([@Mikek2252]) +- [mainmatter/ember2-x-codemods] [#3](https://github.com/mainmatter/ember2-x-codemods/pull/3) add remove-binding codemod with tests and documentation ([@Mikek2252]) +- [mainmatter/ember2-x-codemods] [#2](https://github.com/mainmatter/ember2-x-codemods/pull/2) Add the codemod contains to includes. ([@Mikek2252]) - [mainmatter/ember2-x-codemods] - [#5](https://github.com/mainmatter/ember2-x-codemods/pull/5) update ci - workflow to publish on tag creation ([@Mikek2252]) -- [mainmatter/ember2-x-codemods] - [#4](https://github.com/mainmatter/ember2-x-codemods/pull/4) add - lerna-changelog and release it ([@Mikek2252]) -- [mainmatter/ember2-x-codemods] - [#3](https://github.com/mainmatter/ember2-x-codemods/pull/3) add - remove-binding codemod with tests and documentation ([@Mikek2252]) -- [mainmatter/ember2-x-codemods] - [#2](https://github.com/mainmatter/ember2-x-codemods/pull/2) Add the codemod - contains to includes. ([@Mikek2252]) -- [mainmatter/ember2-x-codemods] -- [mainmatter/qunit-dom] - [#1696](https://github.com/mainmatter/qunit-dom/pull/1696) chore: downgrade - documentation@13.2.5 to 13.2.4 ([@BobrImperator]) +- [mainmatter/qunit-dom] [#1696](https://github.com/mainmatter/qunit-dom/pull/1696) chore: downgrade documentation@13.2.5 to 13.2.4 ([@BobrImperator]) - [mainmatter/qunit-dom] -- [nickschot/ember-gesture-modifiers] - [#325](https://github.com/nickschot/ember-gesture-modifiers/pull/325) Require - ember-modifier v3.2.0+ to make sure the new modifier syntax is available - ([@nickschot]) -- [nickschot/ember-gesture-modifiers] - [#323](https://github.com/nickschot/ember-gesture-modifiers/pull/323) Upgrade - to new ember-modifiers syntax ([@nickschot]) -- [nickschot/ember-gesture-modifiers] - [#322](https://github.com/nickschot/ember-gesture-modifiers/pull/322) Update - to ember-cli 4.7.0 blueprint ([@nickschot]) -- [nickschot/ember-gesture-modifiers] - [#321](https://github.com/nickschot/ember-gesture-modifiers/pull/321) Pin yarn - version with Volta ([@nickschot]) -- [nickschot/ember-gesture-modifiers] - [#320](https://github.com/nickschot/ember-gesture-modifiers/pull/320) Drop - node v12 ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#429](https://github.com/nickschot/ember-mobile-menu/pull/429) Fix fastboot - compatibility and add smoke test ([@nickschot]) +- [nickschot/ember-gesture-modifiers] [#325](https://github.com/nickschot/ember-gesture-modifiers/pull/325) Require ember-modifier v3.2.0+ to make sure the new modifier syntax is available ([@nickschot]) +- [nickschot/ember-gesture-modifiers] [#323](https://github.com/nickschot/ember-gesture-modifiers/pull/323) Upgrade to new ember-modifiers syntax ([@nickschot]) +- [nickschot/ember-gesture-modifiers] [#322](https://github.com/nickschot/ember-gesture-modifiers/pull/322) Update to ember-cli 4.7.0 blueprint ([@nickschot]) +- [nickschot/ember-gesture-modifiers] [#321](https://github.com/nickschot/ember-gesture-modifiers/pull/321) Pin yarn version with Volta ([@nickschot]) +- [nickschot/ember-gesture-modifiers] [#320](https://github.com/nickschot/ember-gesture-modifiers/pull/320) Drop node v12 ([@nickschot]) +- [nickschot/ember-mobile-menu] [#429](https://github.com/nickschot/ember-mobile-menu/pull/429) Fix fastboot compatibility and add smoke test ([@nickschot]) ## Empress -- [empress/bottled-ember] [#3](https://github.com/empress/bottled-ember/pull/3) - add a way to override ember-cli-build config ([@mansona]) -- [empress/bottled-ember] [#2](https://github.com/empress/bottled-ember/pull/2) - pass --environment on to ember exec ([@mansona]) -- [empress/bottled-ember] [#1](https://github.com/empress/bottled-ember/pull/1) - Implement basic cach-folder version of bottled ember ([@mansona]) +- [empress/bottled-ember] [#3](https://github.com/empress/bottled-ember/pull/3) add a way to override ember-cli-build config ([@mansona]) +- [empress/bottled-ember] [#2](https://github.com/empress/bottled-ember/pull/2) pass --environment on to ember exec ([@mansona]) +- [empress/bottled-ember] [#1](https://github.com/empress/bottled-ember/pull/1) Implement basic cach-folder version of bottled ember ([@mansona]) ## Lint to the future -- [mansona/lint-to-the-future-eslint] - [#11](https://github.com/mansona/lint-to-the-future-eslint/pull/11) stop - ignoring eslint warnings ([@mansona]) -- [mansona/lint-to-the-future-eslint] - [#10](https://github.com/mansona/lint-to-the-future-eslint/pull/10) Add eslint - versions to a test matrix ([@mansona]) +- [mansona/lint-to-the-future-eslint] [#11](https://github.com/mansona/lint-to-the-future-eslint/pull/11) stop ignoring eslint warnings ([@mansona]) +- [mansona/lint-to-the-future-eslint] [#10](https://github.com/mansona/lint-to-the-future-eslint/pull/10) Add eslint versions to a test matrix ([@mansona]) ## Octokit -- [octoherd/cli] [#83](https://github.com/octoherd/cli/pull/83) ci(release): fix - dependency name ([@oscard0m]) -- [octoherd/cli] [#82](https://github.com/octoherd/cli/pull/82) build(deps): - remove semantic-release dependencies ([@oscard0m]) -- [octoherd/octokit] [#25](https://github.com/octoherd/octokit/pull/25) - ci(release.yml): fix dependency name ([@oscard0m]) -- [octoherd/octokit] [#24](https://github.com/octoherd/octokit/pull/24) - build(deps): remove semantic-release dependencies ([@oscard0m]) -- [octokit/auth-oauth-user.js] - [#90](https://github.com/octokit/auth-oauth-user.js/pull/90) WIP feat(auth): - add onTokenCreated option ([@oscard0m]) -- [octokit/create-octokit-project.js] - [#193](https://github.com/octokit/create-octokit-project.js/pull/193) - feat(renovate): add Renovate configuration if owner is 'octokit' ([@oscard0m]) -- [oscard0m/octoherd-script-remove-renovate-package.json] - [#4](https://github.com/oscard0m/octoherd-script-remove-renovate-package.json/pull/4) - fix(deps): move @octokit/plugin-create-or-update-text-file as production - 'dependency' ([@oscard0m]) -- [oscard0m/octoherd-script-update-action-version-in-workflows] - [#4](https://github.com/oscard0m/octoherd-script-update-action-version-in-workflows/pull/4) - feat(script): use RegEx instead of js-yaml ([@oscard0m]) -- [oscard0m/octoherd-script-update-action-version-in-workflows] - [#1](https://github.com/oscard0m/octoherd-script-update-action-version-in-workflows/pull/1) - feat: Initial version ([@oscard0m]) +- [octoherd/cli] [#83](https://github.com/octoherd/cli/pull/83) ci(release): fix dependency name ([@oscard0m]) +- [octoherd/cli] [#82](https://github.com/octoherd/cli/pull/82) build(deps): remove semantic-release dependencies ([@oscard0m]) +- [octoherd/octokit] [#25](https://github.com/octoherd/octokit/pull/25) ci(release.yml): fix dependency name ([@oscard0m]) +- [octoherd/octokit] [#24](https://github.com/octoherd/octokit/pull/24) build(deps): remove semantic-release dependencies ([@oscard0m]) +- [octokit/auth-oauth-user.js] [#90](https://github.com/octokit/auth-oauth-user.js/pull/90) WIP feat(auth): add onTokenCreated option ([@oscard0m]) +- [octokit/create-octokit-project.js] [#193](https://github.com/octokit/create-octokit-project.js/pull/193) feat(renovate): add Renovate configuration if owner is 'octokit' ([@oscard0m]) +- [oscard0m/octoherd-script-remove-renovate-package.json] [#4](https://github.com/oscard0m/octoherd-script-remove-renovate-package.json/pull/4) fix(deps): move @octokit/plugin-create-or-update-text-file as production 'dependency' ([@oscard0m]) +- [oscard0m/octoherd-script-update-action-version-in-workflows] [#4](https://github.com/oscard0m/octoherd-script-update-action-version-in-workflows/pull/4) feat(script): use RegEx instead of js-yaml ([@oscard0m]) +- [oscard0m/octoherd-script-update-action-version-in-workflows] [#1](https://github.com/oscard0m/octoherd-script-update-action-version-in-workflows/pull/1) feat: Initial version ([@oscard0m]) ## Rollup -- [ezolenko/rollup-plugin-typescript2] - [#420](https://github.com/ezolenko/rollup-plugin-typescript2/pull/420) - fix(cache): default `clean: true` when necessary, add `extraCacheKeys` option - ([@oscard0m]) +- [ezolenko/rollup-plugin-typescript2] [#420](https://github.com/ezolenko/rollup-plugin-typescript2/pull/420) fix(cache): default `clean: true` when necessary, add `extraCacheKeys` option ([@oscard0m]) ## Elixir -- [rrrene/credo] [#996](https://github.com/rrrene/credo/pull/996) feat: Add - Ignore option for Credo.Check.Readability.ModuleNames ([@BobrImperator]) +- [rrrene/credo] [#996](https://github.com/rrrene/credo/pull/996) feat: Add Ignore option for Credo.Check.Readability.ModuleNames ([@BobrImperator]) ## Clojure -- [mtgred/netrunner] [#6605](https://github.com/mtgred/netrunner/pull/6605) - Implement default game format account setting ([@locks]) -- [mtgred/netrunner] [#6592](https://github.com/mtgred/netrunner/pull/6592) - Rename brain damage to core damage, Part I ([@locks]) +- [mtgred/netrunner] [#6605](https://github.com/mtgred/netrunner/pull/6605) Implement default game format account setting ([@locks]) +- [mtgred/netrunner] [#6592](https://github.com/mtgred/netrunner/pull/6592) Rename brain damage to core damage, Part I ([@locks]) ## Probot -- [probot/.github] [#4](https://github.com/probot/.github/pull/4) - chore(renovate): remove .github/renovate.json ([@oscard0m]) -- [probot/talks] [#2](https://github.com/probot/talks/pull/2) chore(.github): - remove unused Renovate configuration ([@oscard0m]) -- [probot/twitter] [#27](https://github.com/probot/twitter/pull/27) - chore(.github): remove unused Renovate configuration ([@oscard0m]) +- [probot/.github] [#4](https://github.com/probot/.github/pull/4) chore(renovate): remove .github/renovate.json ([@oscard0m]) +- [probot/talks] [#2](https://github.com/probot/talks/pull/2) chore(.github): remove unused Renovate configuration ([@oscard0m]) +- [probot/twitter] [#27](https://github.com/probot/twitter/pull/27) chore(.github): remove unused Renovate configuration ([@oscard0m]) ## Mainmatter's playbook -- [mainmatter/playbook] [#180](https://github.com/mainmatter/playbook/pull/180) - Mainmatter ([@marcoow]) +- [mainmatter/playbook] [#180](https://github.com/mainmatter/playbook/pull/180) Mainmatter ([@marcoow]) ## Gliding -- [weglide/GliderList] [#42](https://github.com/weglide/GliderList/pull/42) Add - 2023 handicaps ([@Turbo87]) +- [weglide/GliderList] [#42](https://github.com/weglide/GliderList/pull/42) Add 2023 handicaps ([@Turbo87]) [@bobrimperator]: https://github.com/BobrImperator [@mikek2252]: https://github.com/Mikek2252 @@ -201,63 +104,47 @@ [@pichfl]: https://github.com/pichfl [turbo87/united-flarmnet]: https://github.com/Turbo87/united-flarmnet [ember-cli/ember-cli-htmlbars]: https://github.com/ember-cli/ember-cli-htmlbars -[ember-learn/ember-release-bot]: - https://github.com/ember-learn/ember-release-bot +[ember-learn/ember-release-bot]: https://github.com/ember-learn/ember-release-bot [ember-learn/ember-website]: https://github.com/ember-learn/ember-website [ember-learn/guides-source]: https://github.com/ember-learn/guides-source [emberjs/rfcs-tooling]: https://github.com/emberjs/rfcs-tooling [empress/bottled-ember]: https://github.com/empress/bottled-ember [erlef/website]: https://github.com/erlef/website -[ezolenko/rollup-plugin-typescript2]: - https://github.com/ezolenko/rollup-plugin-typescript2 +[ezolenko/rollup-plugin-typescript2]: https://github.com/ezolenko/rollup-plugin-typescript2 [mainmatter/ast-workshop]: https://github.com/mainmatter/ast-workshop [mainmatter/breethe-client]: https://github.com/mainmatter/breethe-client [mainmatter/breethe-server]: https://github.com/mainmatter/breethe-server [mainmatter/ember-error-route]: https://github.com/mainmatter/ember-error-route -[mainmatter/ember-hbs-minifier]: - https://github.com/mainmatter/ember-hbs-minifier +[mainmatter/ember-hbs-minifier]: https://github.com/mainmatter/ember-hbs-minifier [mainmatter/ember-hotspots]: https://github.com/mainmatter/ember-hotspots -[mainmatter/ember-intl-analyzer]: - https://github.com/mainmatter/ember-intl-analyzer -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals +[mainmatter/ember-intl-analyzer]: https://github.com/mainmatter/ember-intl-analyzer +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth -[mainmatter/ember-test-selectors]: - https://github.com/mainmatter/ember-test-selectors +[mainmatter/ember-test-selectors]: https://github.com/mainmatter/ember-test-selectors [mainmatter/ember-workshop]: https://github.com/mainmatter/ember-workshop [mainmatter/ember2-x-codemods]: https://github.com/mainmatter/ember2-x-codemods -[mainmatter/eslint-plugin-ember-concurrency]: - https://github.com/mainmatter/eslint-plugin-ember-concurrency -[mainmatter/eslint-plugin-qunit-dom]: - https://github.com/mainmatter/eslint-plugin-qunit-dom +[mainmatter/eslint-plugin-ember-concurrency]: https://github.com/mainmatter/eslint-plugin-ember-concurrency +[mainmatter/eslint-plugin-qunit-dom]: https://github.com/mainmatter/eslint-plugin-qunit-dom [mainmatter/playbook]: https://github.com/mainmatter/playbook [mainmatter/qunit-dom-codemod]: https://github.com/mainmatter/qunit-dom-codemod [mainmatter/qunit-dom]: https://github.com/mainmatter/qunit-dom [mainmatter/renovate-config]: https://github.com/mainmatter/renovate-config -[mainmatter/testem-gitlab-reporter]: - https://github.com/mainmatter/testem-gitlab-reporter +[mainmatter/testem-gitlab-reporter]: https://github.com/mainmatter/testem-gitlab-reporter [mainmatter/who-ran-me]: https://github.com/mainmatter/who-ran-me [mansona/chris.manson.ie]: https://github.com/mansona/chris.manson.ie -[mansona/lint-to-the-future-eslint]: - https://github.com/mansona/lint-to-the-future-eslint +[mansona/lint-to-the-future-eslint]: https://github.com/mansona/lint-to-the-future-eslint [mtgred/netrunner]: https://github.com/mtgred/netrunner -[nickschot/ember-gesture-modifiers]: - https://github.com/nickschot/ember-gesture-modifiers +[nickschot/ember-gesture-modifiers]: https://github.com/nickschot/ember-gesture-modifiers [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu [octoherd/.github]: https://github.com/octoherd/.github [octoherd/cli]: https://github.com/octoherd/cli -[octoherd/create-octoherd-script]: - https://github.com/octoherd/create-octoherd-script +[octoherd/create-octoherd-script]: https://github.com/octoherd/create-octoherd-script [octoherd/octokit]: https://github.com/octoherd/octokit -[octoherd/script-setup-renovate]: - https://github.com/octoherd/script-setup-renovate +[octoherd/script-setup-renovate]: https://github.com/octoherd/script-setup-renovate [octokit/auth-oauth-user.js]: https://github.com/octokit/auth-oauth-user.js -[octokit/create-octokit-project.js]: - https://github.com/octokit/create-octokit-project.js -[oscard0m/octoherd-script-remove-renovate-package.json]: - https://github.com/oscard0m/octoherd-script-remove-renovate-package.json -[oscard0m/octoherd-script-update-action-version-in-workflows]: - https://github.com/oscard0m/octoherd-script-update-action-version-in-workflows +[octokit/create-octokit-project.js]: https://github.com/octokit/create-octokit-project.js +[oscard0m/octoherd-script-remove-renovate-package.json]: https://github.com/oscard0m/octoherd-script-remove-renovate-package.json +[oscard0m/octoherd-script-update-action-version-in-workflows]: https://github.com/oscard0m/octoherd-script-update-action-version-in-workflows [probot/.github]: https://github.com/probot/.github [probot/talks]: https://github.com/probot/talks [probot/twitter]: https://github.com/probot/twitter diff --git a/src/twios/2022-10-19.md b/src/twios/2022-10-19.md index 8fca5081fd..a34c6ec060 100644 --- a/src/twios/2022-10-19.md +++ b/src/twios/2022-10-19.md @@ -1,59 +1,36 @@ ## Rust -- [AeroRust/nmea] [#59](https://github.com/AeroRust/nmea/pull/59) Implement - `PGRMZ` support ([@Turbo87]) -- [AeroRust/nmea] [#57](https://github.com/AeroRust/nmea/pull/57) Update/Fix - `RMC` docs ([@Turbo87]) -- [Swatinem/rust-cache] [#83](https://github.com/Swatinem/rust-cache/pull/83) - Update `@actions/cors` to v1.10.0 ([@Turbo87]) +- [AeroRust/nmea] [#59](https://github.com/AeroRust/nmea/pull/59) Implement `PGRMZ` support ([@Turbo87]) +- [AeroRust/nmea] [#57](https://github.com/AeroRust/nmea/pull/57) Update/Fix `RMC` docs ([@Turbo87]) +- [Swatinem/rust-cache] [#83](https://github.com/Swatinem/rust-cache/pull/83) Update `@actions/cors` to v1.10.0 ([@Turbo87]) ## crates.io -- [rust-lang/crates.io] - [#5325](https://github.com/rust-lang/crates.io/pull/5325) CI: Remove obsolete - `bors` CI jobs ([@Turbo87]) -- [rust-lang/crates.io] - [#5324](https://github.com/rust-lang/crates.io/pull/5324) Remove outdated - "Deploying & using a mirror" instructions ([@Turbo87]) -- [rust-lang/crates.io] - [#5298](https://github.com/rust-lang/crates.io/pull/5298) clap: Resolve - deprecation warnings ([@Turbo87]) -- [rust-lang/crates.io] - [#5297](https://github.com/rust-lang/crates.io/pull/5297) clap: Add new - `wrap_help` feature flag ([@Turbo87]) -- [rust-lang/crates.io] - [#5295](https://github.com/rust-lang/crates.io/pull/5295) clap: Derive - possible values for `EventType` argument ([@Turbo87]) +- [rust-lang/crates.io] [#5325](https://github.com/rust-lang/crates.io/pull/5325) CI: Remove obsolete `bors` CI jobs ([@Turbo87]) +- [rust-lang/crates.io] [#5324](https://github.com/rust-lang/crates.io/pull/5324) Remove outdated "Deploying & using a mirror" instructions ([@Turbo87]) +- [rust-lang/crates.io] [#5298](https://github.com/rust-lang/crates.io/pull/5298) clap: Resolve deprecation warnings ([@Turbo87]) +- [rust-lang/crates.io] [#5297](https://github.com/rust-lang/crates.io/pull/5297) clap: Add new `wrap_help` feature flag ([@Turbo87]) +- [rust-lang/crates.io] [#5295](https://github.com/rust-lang/crates.io/pull/5295) clap: Derive possible values for `EventType` argument ([@Turbo87]) ## Astro -- [withastro/docs] [#1662](https://github.com/withastro/docs/pull/1662) - i18n(es): Update sharing-state.md translation ([@oscard0m]) +- [withastro/docs] [#1662](https://github.com/withastro/docs/pull/1662) i18n(es): Update sharing-state.md translation ([@oscard0m]) ## Embedded -- [jomjol/AI-on-the-edge-device] - [#1158](https://github.com/jomjol/AI-on-the-edge-device/pull/1158) - FlowPostProcessing::GetJSON: Add `pre` field to the `/json` response - ([@Turbo87]) +- [jomjol/AI-on-the-edge-device] [#1158](https://github.com/jomjol/AI-on-the-edge-device/pull/1158) FlowPostProcessing::GetJSON: Add `pre` field to the `/json` response ([@Turbo87]) ## Ember.js -- [mainmatter/ember2-x-codemods] - [#7](https://github.com/mainmatter/ember2-x-codemods/pull/7) computed - property - Property to computed syntax transform. ([@Mikek2252]) +- [mainmatter/ember2-x-codemods] [#7](https://github.com/mainmatter/ember2-x-codemods/pull/7) computed property - Property to computed syntax transform. ([@Mikek2252]) ## Empress -- [empress/empress-blog] - [#163](https://github.com/empress/empress-blog/pull/163) update ember-scroll - to 1.0.3 ([@nickschot]) +- [empress/empress-blog] [#163](https://github.com/empress/empress-blog/pull/163) update ember-scroll to 1.0.3 ([@nickschot]) ## Lint to the future -- [mansona/lint-to-the-future] - [#28](https://github.com/mansona/lint-to-the-future/pull/28) Move from - minimist to commander ([@Mikek2252]) +- [mansona/lint-to-the-future] [#28](https://github.com/mansona/lint-to-the-future/pull/28) Move from minimist to commander ([@Mikek2252]) [@mikek2252]: https://github.com/Mikek2252 [@turbo87]: https://github.com/Turbo87 diff --git a/src/twios/2022-11-03.md b/src/twios/2022-11-03.md index 8f0e72596b..76ff628661 100644 --- a/src/twios/2022-11-03.md +++ b/src/twios/2022-11-03.md @@ -1,108 +1,50 @@ ## Rust -- [Turbo87/segelflug-classifieds] - [#401](https://github.com/Turbo87/segelflug-classifieds/pull/401) CI: Add - "Build and Deploy" workflow ([@Turbo87]) -- [pietroalbini/rfcs] [#2](https://github.com/pietroalbini/rfcs/pull/2) Improve - token scopes proposal ([@Turbo87]) +- [Turbo87/segelflug-classifieds] [#401](https://github.com/Turbo87/segelflug-classifieds/pull/401) CI: Add "Build and Deploy" workflow ([@Turbo87]) +- [pietroalbini/rfcs] [#2](https://github.com/pietroalbini/rfcs/pull/2) Improve token scopes proposal ([@Turbo87]) ## crates.io -- [rust-lang/crates.io] - [#5375](https://github.com/rust-lang/crates.io/pull/5375) Remove unused CSS - classes ([@Turbo87]) -- [rust-lang/crates.io] - [#5370](https://github.com/rust-lang/crates.io/pull/5370) Use a fluid space - scale ([@Turbo87]) -- [rust-lang/crates.io] - [#5369](https://github.com/rust-lang/crates.io/pull/5369) Remove unused CSS - classes ([@Turbo87]) -- [rust-lang/crates.io] - [#5366](https://github.com/rust-lang/crates.io/pull/5366) styles: Extract - `font-body/heading` font family design tokens ([@Turbo87]) -- [rust-lang/crates.io] - [#5355](https://github.com/rust-lang/crates.io/pull/5355) Revert "Netlify: Add - `_redirects` file" ([@Turbo87]) -- [rust-lang/crates.io] - [#5354](https://github.com/rust-lang/crates.io/pull/5354) footer: Add Zulip - channel to "Social" link list ([@Turbo87]) -- [rust-lang/crates.io] - [#5353](https://github.com/rust-lang/crates.io/pull/5353) styles: Extract - `transition` design tokens ([@Turbo87]) -- [rust-lang/crates.io] - [#5333](https://github.com/rust-lang/crates.io/pull/5333) Heroku: Remove - unused `app.json` file ([@Turbo87]) -- [rust-lang/crates.io] - [#5330](https://github.com/rust-lang/crates.io/pull/5330) docs: Reintroduce - `MIRROR.md` to keep third party links to the document working ([@Turbo87]) -- [rust-lang/crates.io] - [#5329](https://github.com/rust-lang/crates.io/pull/5329) Remove deprecated - `MIRROR` mode ([@Turbo87]) +- [rust-lang/crates.io] [#5375](https://github.com/rust-lang/crates.io/pull/5375) Remove unused CSS classes ([@Turbo87]) +- [rust-lang/crates.io] [#5370](https://github.com/rust-lang/crates.io/pull/5370) Use a fluid space scale ([@Turbo87]) +- [rust-lang/crates.io] [#5369](https://github.com/rust-lang/crates.io/pull/5369) Remove unused CSS classes ([@Turbo87]) +- [rust-lang/crates.io] [#5366](https://github.com/rust-lang/crates.io/pull/5366) styles: Extract `font-body/heading` font family design tokens ([@Turbo87]) +- [rust-lang/crates.io] [#5355](https://github.com/rust-lang/crates.io/pull/5355) Revert "Netlify: Add `_redirects` file" ([@Turbo87]) +- [rust-lang/crates.io] [#5354](https://github.com/rust-lang/crates.io/pull/5354) footer: Add Zulip channel to "Social" link list ([@Turbo87]) +- [rust-lang/crates.io] [#5353](https://github.com/rust-lang/crates.io/pull/5353) styles: Extract `transition` design tokens ([@Turbo87]) +- [rust-lang/crates.io] [#5333](https://github.com/rust-lang/crates.io/pull/5333) Heroku: Remove unused `app.json` file ([@Turbo87]) +- [rust-lang/crates.io] [#5330](https://github.com/rust-lang/crates.io/pull/5330) docs: Reintroduce `MIRROR.md` to keep third party links to the document working ([@Turbo87]) +- [rust-lang/crates.io] [#5329](https://github.com/rust-lang/crates.io/pull/5329) Remove deprecated `MIRROR` mode ([@Turbo87]) ## Ember.js -- [ember-learn/ember-website] - [#969](https://github.com/ember-learn/ember-website/pull/969) Release Pages - v4.8.0 ([@locks]) -- [mainmatter/ember-promise-modals] - [#775](https://github.com/mainmatter/ember-promise-modals/pull/775) Deprecate - opening modals from paths ([@pichfl]) -- [qonto/ember-cp-validations] - [#22](https://github.com/qonto/ember-cp-validations/pull/22) Bump Node version - to 16 ([@zeppelin]) -- [qonto/ember-cp-validations] - [#20](https://github.com/qonto/ember-cp-validations/pull/20) Use `require` - instead of `import` to make Embroider happy ([@zeppelin]) +- [ember-learn/ember-website] [#969](https://github.com/ember-learn/ember-website/pull/969) Release Pages v4.8.0 ([@locks]) +- [mainmatter/ember-promise-modals] [#775](https://github.com/mainmatter/ember-promise-modals/pull/775) Deprecate opening modals from paths ([@pichfl]) +- [qonto/ember-cp-validations] [#22](https://github.com/qonto/ember-cp-validations/pull/22) Bump Node version to 16 ([@zeppelin]) +- [qonto/ember-cp-validations] [#20](https://github.com/qonto/ember-cp-validations/pull/20) Use `require` instead of `import` to make Embroider happy ([@zeppelin]) ## Lint to the future -- [mansona/lint-to-the-future] - [#30](https://github.com/mansona/lint-to-the-future/pull/30) add a basic tests - for rootUrl on output command ([@mansona]) +- [mansona/lint-to-the-future] [#30](https://github.com/mansona/lint-to-the-future/pull/30) add a basic tests for rootUrl on output command ([@mansona]) ## JavaScript -- [Turbo87/auto-dist-tag] - [#298](https://github.com/Turbo87/auto-dist-tag/pull/298) CI: Extract - `PNPM_VERSION` variable ([@Turbo87]) -- [Turbo87/auto-dist-tag] - [#296](https://github.com/Turbo87/auto-dist-tag/pull/296) fetch-dist-tags: - Convert to async function ([@Turbo87]) -- [Turbo87/auto-dist-tag] - [#295](https://github.com/Turbo87/auto-dist-tag/pull/295) Drop support for - Node.js 10 and 12 ([@Turbo87]) -- [Turbo87/auto-dist-tag] - [#294](https://github.com/Turbo87/auto-dist-tag/pull/294) renovate: Keep pnpm - up-to-date ([@Turbo87]) -- [Turbo87/auto-dist-tag] - [#293](https://github.com/Turbo87/auto-dist-tag/pull/293) CI: Pin action - versions ([@Turbo87]) -- [Turbo87/auto-dist-tag] - [#292](https://github.com/Turbo87/auto-dist-tag/pull/292) renovate: Simplify - config by using shared config repo ([@Turbo87]) -- [miragejs/miragejs] [#1064](https://github.com/miragejs/miragejs/pull/1064) - Fix includes query params ([@mansona]) -- [hakimel/reveal.js] [#3305](https://github.com/hakimel/reveal.js/pull/3305) - Gulp livereload: include subfolders to watch for changes in html and md - ([@lolmaus]) +- [Turbo87/auto-dist-tag] [#298](https://github.com/Turbo87/auto-dist-tag/pull/298) CI: Extract `PNPM_VERSION` variable ([@Turbo87]) +- [Turbo87/auto-dist-tag] [#296](https://github.com/Turbo87/auto-dist-tag/pull/296) fetch-dist-tags: Convert to async function ([@Turbo87]) +- [Turbo87/auto-dist-tag] [#295](https://github.com/Turbo87/auto-dist-tag/pull/295) Drop support for Node.js 10 and 12 ([@Turbo87]) +- [Turbo87/auto-dist-tag] [#294](https://github.com/Turbo87/auto-dist-tag/pull/294) renovate: Keep pnpm up-to-date ([@Turbo87]) +- [Turbo87/auto-dist-tag] [#293](https://github.com/Turbo87/auto-dist-tag/pull/293) CI: Pin action versions ([@Turbo87]) +- [Turbo87/auto-dist-tag] [#292](https://github.com/Turbo87/auto-dist-tag/pull/292) renovate: Simplify config by using shared config repo ([@Turbo87]) +- [miragejs/miragejs] [#1064](https://github.com/miragejs/miragejs/pull/1064) Fix includes query params ([@mansona]) +- [hakimel/reveal.js] [#3305](https://github.com/hakimel/reveal.js/pull/3305) Gulp livereload: include subfolders to watch for changes in html and md ([@lolmaus]) ## Internal -- [mainmatter/mainmatter-website-mailer] - [#5](https://github.com/mainmatter/mainmatter-website-mailer/pull/5) User - better subject, sender and recipient name ([@marcoow]) -- [mainmatter/mainmatter-website-mailer] - [#4](https://github.com/mainmatter/mainmatter-website-mailer/pull/4) use - default message in case it's empty ([@marcoow]) -- [mainmatter/mainmatter-website-mailer] - [#3](https://github.com/mainmatter/mainmatter-website-mailer/pull/3) add CORS - headers ([@marcoow]) -- [mainmatter/mainmatter-website-mailer] - [#2](https://github.com/mainmatter/mainmatter-website-mailer/pull/2) - Auto-release from Actions ([@marcoow]) -- [mainmatter/mainmatter-website-mailer] - [#1](https://github.com/mainmatter/mainmatter-website-mailer/pull/1) Add CI - setup ([@marcoow]) +- [mainmatter/mainmatter-website-mailer] [#5](https://github.com/mainmatter/mainmatter-website-mailer/pull/5) User better subject, sender and recipient name ([@marcoow]) +- [mainmatter/mainmatter-website-mailer] [#4](https://github.com/mainmatter/mainmatter-website-mailer/pull/4) use default message in case it's empty ([@marcoow]) +- [mainmatter/mainmatter-website-mailer] [#3](https://github.com/mainmatter/mainmatter-website-mailer/pull/3) add CORS headers ([@marcoow]) +- [mainmatter/mainmatter-website-mailer] [#2](https://github.com/mainmatter/mainmatter-website-mailer/pull/2) Auto-release from Actions ([@marcoow]) +- [mainmatter/mainmatter-website-mailer] [#1](https://github.com/mainmatter/mainmatter-website-mailer/pull/1) Add CI setup ([@marcoow]) [@turbo87]: https://github.com/Turbo87 [@locks]: https://github.com/locks @@ -112,14 +54,11 @@ [@pichfl]: https://github.com/pichfl [@zeppelin]: https://github.com/zeppelin [turbo87/auto-dist-tag]: https://github.com/Turbo87/auto-dist-tag -[turbo87/segelflug-classifieds]: - https://github.com/Turbo87/segelflug-classifieds +[turbo87/segelflug-classifieds]: https://github.com/Turbo87/segelflug-classifieds [ember-learn/ember-website]: https://github.com/ember-learn/ember-website [hakimel/reveal.js]: https://github.com/hakimel/reveal.js -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals -[mainmatter/mainmatter-website-mailer]: - https://github.com/mainmatter/mainmatter-website-mailer +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals +[mainmatter/mainmatter-website-mailer]: https://github.com/mainmatter/mainmatter-website-mailer [mansona/lint-to-the-future]: https://github.com/mansona/lint-to-the-future [mansona/test-allow-failure]: https://github.com/mansona/test-allow-failure [miragejs/miragejs]: https://github.com/miragejs/miragejs diff --git a/src/twios/2022-11-24.md b/src/twios/2022-11-24.md index b47530acbd..66f4da100f 100644 --- a/src/twios/2022-11-24.md +++ b/src/twios/2022-11-24.md @@ -1,186 +1,74 @@ ## Rust -- [Turbo87/segelflug-classifieds] - [#402](https://github.com/Turbo87/segelflug-classifieds/pull/402) tracing: Add - timestamps to log output ([@Turbo87]) -- [Turbo87/sentry-conduit] - [#101](https://github.com/Turbo87/sentry-conduit/pull/101) Bump "Minimum - Supported Rust Version" to v1.60.0 ([@Turbo87]) -- [rust-lang/hashbrown] [#373](https://github.com/rust-lang/hashbrown/pull/373) - changelog: Fix heading levels ([@Turbo87]) +- [Turbo87/segelflug-classifieds] [#402](https://github.com/Turbo87/segelflug-classifieds/pull/402) tracing: Add timestamps to log output ([@Turbo87]) +- [Turbo87/sentry-conduit] [#101](https://github.com/Turbo87/sentry-conduit/pull/101) Bump "Minimum Supported Rust Version" to v1.60.0 ([@Turbo87]) +- [rust-lang/hashbrown] [#373](https://github.com/rust-lang/hashbrown/pull/373) changelog: Fix heading levels ([@Turbo87]) ## crates.io -- [rust-lang/crates.io] - [#5479](https://github.com/rust-lang/crates.io/pull/5479) cloudfront: Retry - requests on server or network error ([@Turbo87]) -- [rust-lang/crates.io] - [#5467](https://github.com/rust-lang/crates.io/pull/5467) CI: Remove `beta` - backend scenario ([@Turbo87]) -- [rust-lang/crates.io] - [#5459](https://github.com/rust-lang/crates.io/pull/5459) downloads_counter: - Remove `hashbrown` reference ([@Turbo87]) -- [rust-lang/crates.io] - [#5456](https://github.com/rust-lang/crates.io/pull/5456) Partially revert - "Lock file maintenance (Rust) (#5436)" ([@Turbo87]) -- [rust-lang/crates.io] - [#5432](https://github.com/rust-lang/crates.io/pull/5432) views: Move `mod` - and `use` lines to the top of the file ([@Turbo87]) -- [rust-lang/crates.io] - [#5431](https://github.com/rust-lang/crates.io/pull/5431) - EncodableCrateUpload: Remove obsolete `badges` field ([@Turbo87]) -- [rust-lang/crates.io] - [#5430](https://github.com/rust-lang/crates.io/pull/5430) mirage: Remove - `badges` from fixtures ([@Turbo87]) -- [rust-lang/crates.io] - [#5429](https://github.com/rust-lang/crates.io/pull/5429) badges: Remove - obsolete data structures ([@Turbo87]) -- [rust-lang/crates.io] - [#5428](https://github.com/rust-lang/crates.io/pull/5428) badges: Remove - obsolete database calls ([@Turbo87]) -- [rust-lang/crates.io] - [#5427](https://github.com/rust-lang/crates.io/pull/5427) models::Crate: - Remove unused `badges()` function ([@Turbo87]) -- [rust-lang/crates.io] - [#5426](https://github.com/rust-lang/crates.io/pull/5426) downloads: Use - `recent_downloads` as `downloads` if it is higher ([@Turbo87]) -- [rust-lang/crates.io] - [#5423](https://github.com/rust-lang/crates.io/pull/5423) sentry: Reduce trace - sample rate for download endpoint ([@Turbo87]) -- [rust-lang/crates.io] - [#5413](https://github.com/rust-lang/crates.io/pull/5413) Remove unnecessary - borrows ([@Turbo87]) -- [rust-lang/crates.io] - [#5411](https://github.com/rust-lang/crates.io/pull/5411) s3: Fix - `base64::encode()` call ([@Turbo87]) -- [rust-lang/crates.io] - [#5391](https://github.com/rust-lang/crates.io/pull/5391) Use - `@mainmatter/ember-api-actions` instead of custom implementation ([@Turbo87]) +- [rust-lang/crates.io] [#5479](https://github.com/rust-lang/crates.io/pull/5479) cloudfront: Retry requests on server or network error ([@Turbo87]) +- [rust-lang/crates.io] [#5467](https://github.com/rust-lang/crates.io/pull/5467) CI: Remove `beta` backend scenario ([@Turbo87]) +- [rust-lang/crates.io] [#5459](https://github.com/rust-lang/crates.io/pull/5459) downloads_counter: Remove `hashbrown` reference ([@Turbo87]) +- [rust-lang/crates.io] [#5456](https://github.com/rust-lang/crates.io/pull/5456) Partially revert "Lock file maintenance (Rust) (#5436)" ([@Turbo87]) +- [rust-lang/crates.io] [#5432](https://github.com/rust-lang/crates.io/pull/5432) views: Move `mod` and `use` lines to the top of the file ([@Turbo87]) +- [rust-lang/crates.io] [#5431](https://github.com/rust-lang/crates.io/pull/5431) EncodableCrateUpload: Remove obsolete `badges` field ([@Turbo87]) +- [rust-lang/crates.io] [#5430](https://github.com/rust-lang/crates.io/pull/5430) mirage: Remove `badges` from fixtures ([@Turbo87]) +- [rust-lang/crates.io] [#5429](https://github.com/rust-lang/crates.io/pull/5429) badges: Remove obsolete data structures ([@Turbo87]) +- [rust-lang/crates.io] [#5428](https://github.com/rust-lang/crates.io/pull/5428) badges: Remove obsolete database calls ([@Turbo87]) +- [rust-lang/crates.io] [#5427](https://github.com/rust-lang/crates.io/pull/5427) models::Crate: Remove unused `badges()` function ([@Turbo87]) +- [rust-lang/crates.io] [#5426](https://github.com/rust-lang/crates.io/pull/5426) downloads: Use `recent_downloads` as `downloads` if it is higher ([@Turbo87]) +- [rust-lang/crates.io] [#5423](https://github.com/rust-lang/crates.io/pull/5423) sentry: Reduce trace sample rate for download endpoint ([@Turbo87]) +- [rust-lang/crates.io] [#5413](https://github.com/rust-lang/crates.io/pull/5413) Remove unnecessary borrows ([@Turbo87]) +- [rust-lang/crates.io] [#5411](https://github.com/rust-lang/crates.io/pull/5411) s3: Fix `base64::encode()` call ([@Turbo87]) +- [rust-lang/crates.io] [#5391](https://github.com/rust-lang/crates.io/pull/5391) Use `@mainmatter/ember-api-actions` instead of custom implementation ([@Turbo87]) ## Ember.js -- [ember-cli/ember-try] [#893](https://github.com/ember-cli/ember-try/pull/893) - breaking: drop EOL node versions < v14 and update smoke-test-app to fix CI - ([@mansona]) -- [ember-cli/ember-try] [#896](https://github.com/ember-cli/ember-try/pull/896) - Fixed version of ember-try-test-suite-helper ([@candunaj]) -- [ember-cli/ember-try-config] - [#187](https://github.com/ember-cli/ember-try-config/pull/187) Added - onlyVersionCompatibility to generateConfig ([@candunaj]) -- [ember-codemods/ember-native-class-codemod] - [#491](https://github.com/ember-codemods/ember-native-class-codemod/pull/491) - update codemods-telemetry-helpers ([@mansona]) -- [ember-learn/ember-blog] - [#1234](https://github.com/ember-learn/ember-blog/pull/1234) always serve the - index.html on netlify ([@mansona]) -- [ember-learn/ember-styleguide] - [#435](https://github.com/ember-learn/ember-styleguide/pull/435) Breaking: - drop support for EOL Node - minimum supported now v14 ([@mansona]) -- [ember-learn/ember-styleguide] - [#434](https://github.com/ember-learn/ember-styleguide/pull/434) Update percy - ([@mansona]) -- [ember-learn/guides-source] - [#1870](https://github.com/ember-learn/guides-source/pull/1870) stop - outputting `no issues found` on every file during markdown lint ([@mansona]) -- [mainmatter/ember-simple-auth] - [#2480](https://github.com/mainmatter/ember-simple-auth/pull/2480) Remove - deprecated mixins in favor of session service ([@BobrImperator]) -- [qonto/ember-cp-validations] - [#24](https://github.com/qonto/ember-cp-validations/pull/24) Fix tests for - ember-data@^4.5 ([@zeppelin]) -- [qonto/ember-cp-validations] - [#23](https://github.com/qonto/ember-cp-validations/pull/23) Ensure Ember Data - 4.4 compatibility ([@zeppelin]) -- [mainmatter/ember-api-actions] - [#37](https://github.com/mainmatter/ember-api-actions/pull/37) Implement - experimental `adapterAction()` function ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#32](https://github.com/mainmatter/ember-api-actions/pull/32) ember-try: - Replace ember-source with ember-data scenarios ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#31](https://github.com/mainmatter/ember-api-actions/pull/31) Pass record - snapshots to `buildURL()` method ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#26](https://github.com/mainmatter/ember-api-actions/pull/26) Add - `requestType` option ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#25](https://github.com/mainmatter/ember-api-actions/pull/25) Add `method` - validity assertions ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#20](https://github.com/mainmatter/ember-api-actions/pull/20) README: Add - basic documentation ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#19](https://github.com/mainmatter/ember-api-actions/pull/19) npmignore: Add - more unnecessary files ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#18](https://github.com/mainmatter/ember-api-actions/pull/18) - ember-cli-htmlbars: Move to `devDependencies` ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#17](https://github.com/mainmatter/ember-api-actions/pull/17) ESLint: Declare - `release-it` config as CommonJS file ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#16](https://github.com/mainmatter/ember-api-actions/pull/16) Add missing - `access: public` publish config ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#15](https://github.com/mainmatter/ember-api-actions/pull/15) Rename to - `@mainmatter/ember-api-actions` ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#14](https://github.com/mainmatter/ember-api-actions/pull/14) Import - `customAction()` function from crates.io ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#13](https://github.com/mainmatter/ember-api-actions/pull/13) CI: Run - `npm publish` for pushed tags ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#12](https://github.com/mainmatter/ember-api-actions/pull/12) scripts: Set - `test` script to only run `ember test` ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#8](https://github.com/mainmatter/ember-api-actions/pull/8) CI: Pin action - versions ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#4](https://github.com/mainmatter/ember-api-actions/pull/4) Adjust Renovate - setup ([@Turbo87]) -- [mainmatter/ember-api-actions] - [#2](https://github.com/mainmatter/ember-api-actions/pull/2) CI: Migrate to - pnpm ([@Turbo87]) -- [MinThaMie/more-confetti-addon] - [#1](https://github.com/MinThaMie/more-confetti-addon/pull/1) protect fire() - function from being run in fastboot ([@mansona]) -- [cardstack/boxel-motion] - [#137](https://github.com/cardstack/boxel-motion/pull/137) Only register a - sprite modifier once, instead of whenever arguments change ([@nickschot]) -- [cardstack/boxel-motion] - [#134](https://github.com/cardstack/boxel-motion/pull/134) Fix location - deprecation by setting locationType to history ([@nickschot]) -- [cardstack/boxel-motion] - [#133](https://github.com/cardstack/boxel-motion/pull/133) Modernize - sprite-modifier to be compatible with the future ember-modifier v4 - ([@nickschot]) -- [cardstack/boxel-motion] - [#129](https://github.com/cardstack/boxel-motion/pull/129) Remove - dependenciesMeta as it breaks things during development ([@nickschot]) -- [cardstack/boxel-motion] - [#128](https://github.com/cardstack/boxel-motion/pull/128) Remove unnecessary - re-exports ([@nickschot]) -- [mainmatter/ember-cli-list-addons] - [#1](https://github.com/mainmatter/ember-cli-list-addons/pull/1) Initial - implementation ([@mansona]) -- [mainmatter/eslint-plugin-emberobserver] - [#3](https://github.com/mainmatter/eslint-plugin-emberobserver/pull/3) Fix - blocker preventing ember-observer from tracking an addon's embroider - compatibility ([@candunaj]) -- [mansona/ember-try] [#1](https://github.com/mansona/ember-try/pull/1) - onlyVersionCompatibility to generateConfig ([@candunaj]) +- [ember-cli/ember-try] [#893](https://github.com/ember-cli/ember-try/pull/893) breaking: drop EOL node versions < v14 and update smoke-test-app to fix CI ([@mansona]) +- [ember-cli/ember-try] [#896](https://github.com/ember-cli/ember-try/pull/896) Fixed version of ember-try-test-suite-helper ([@candunaj]) +- [ember-cli/ember-try-config] [#187](https://github.com/ember-cli/ember-try-config/pull/187) Added onlyVersionCompatibility to generateConfig ([@candunaj]) +- [ember-codemods/ember-native-class-codemod] [#491](https://github.com/ember-codemods/ember-native-class-codemod/pull/491) update codemods-telemetry-helpers ([@mansona]) +- [ember-learn/ember-blog] [#1234](https://github.com/ember-learn/ember-blog/pull/1234) always serve the index.html on netlify ([@mansona]) +- [ember-learn/ember-styleguide] [#435](https://github.com/ember-learn/ember-styleguide/pull/435) Breaking: drop support for EOL Node - minimum supported now v14 ([@mansona]) +- [ember-learn/ember-styleguide] [#434](https://github.com/ember-learn/ember-styleguide/pull/434) Update percy ([@mansona]) +- [ember-learn/guides-source] [#1870](https://github.com/ember-learn/guides-source/pull/1870) stop outputting `no issues found` on every file during markdown lint ([@mansona]) +- [mainmatter/ember-simple-auth] [#2480](https://github.com/mainmatter/ember-simple-auth/pull/2480) Remove deprecated mixins in favor of session service ([@BobrImperator]) +- [qonto/ember-cp-validations] [#24](https://github.com/qonto/ember-cp-validations/pull/24) Fix tests for ember-data@^4.5 ([@zeppelin]) +- [qonto/ember-cp-validations] [#23](https://github.com/qonto/ember-cp-validations/pull/23) Ensure Ember Data 4.4 compatibility ([@zeppelin]) +- [mainmatter/ember-api-actions] [#37](https://github.com/mainmatter/ember-api-actions/pull/37) Implement experimental `adapterAction()` function ([@Turbo87]) +- [mainmatter/ember-api-actions] [#32](https://github.com/mainmatter/ember-api-actions/pull/32) ember-try: Replace ember-source with ember-data scenarios ([@Turbo87]) +- [mainmatter/ember-api-actions] [#31](https://github.com/mainmatter/ember-api-actions/pull/31) Pass record snapshots to `buildURL()` method ([@Turbo87]) +- [mainmatter/ember-api-actions] [#26](https://github.com/mainmatter/ember-api-actions/pull/26) Add `requestType` option ([@Turbo87]) +- [mainmatter/ember-api-actions] [#25](https://github.com/mainmatter/ember-api-actions/pull/25) Add `method` validity assertions ([@Turbo87]) +- [mainmatter/ember-api-actions] [#20](https://github.com/mainmatter/ember-api-actions/pull/20) README: Add basic documentation ([@Turbo87]) +- [mainmatter/ember-api-actions] [#19](https://github.com/mainmatter/ember-api-actions/pull/19) npmignore: Add more unnecessary files ([@Turbo87]) +- [mainmatter/ember-api-actions] [#18](https://github.com/mainmatter/ember-api-actions/pull/18) ember-cli-htmlbars: Move to `devDependencies` ([@Turbo87]) +- [mainmatter/ember-api-actions] [#17](https://github.com/mainmatter/ember-api-actions/pull/17) ESLint: Declare `release-it` config as CommonJS file ([@Turbo87]) +- [mainmatter/ember-api-actions] [#16](https://github.com/mainmatter/ember-api-actions/pull/16) Add missing `access: public` publish config ([@Turbo87]) +- [mainmatter/ember-api-actions] [#15](https://github.com/mainmatter/ember-api-actions/pull/15) Rename to `@mainmatter/ember-api-actions` ([@Turbo87]) +- [mainmatter/ember-api-actions] [#14](https://github.com/mainmatter/ember-api-actions/pull/14) Import `customAction()` function from crates.io ([@Turbo87]) +- [mainmatter/ember-api-actions] [#13](https://github.com/mainmatter/ember-api-actions/pull/13) CI: Run `npm publish` for pushed tags ([@Turbo87]) +- [mainmatter/ember-api-actions] [#12](https://github.com/mainmatter/ember-api-actions/pull/12) scripts: Set `test` script to only run `ember test` ([@Turbo87]) +- [mainmatter/ember-api-actions] [#8](https://github.com/mainmatter/ember-api-actions/pull/8) CI: Pin action versions ([@Turbo87]) +- [mainmatter/ember-api-actions] [#4](https://github.com/mainmatter/ember-api-actions/pull/4) Adjust Renovate setup ([@Turbo87]) +- [mainmatter/ember-api-actions] [#2](https://github.com/mainmatter/ember-api-actions/pull/2) CI: Migrate to pnpm ([@Turbo87]) +- [MinThaMie/more-confetti-addon] [#1](https://github.com/MinThaMie/more-confetti-addon/pull/1) protect fire() function from being run in fastboot ([@mansona]) +- [cardstack/boxel-motion] [#137](https://github.com/cardstack/boxel-motion/pull/137) Only register a sprite modifier once, instead of whenever arguments change ([@nickschot]) +- [cardstack/boxel-motion] [#134](https://github.com/cardstack/boxel-motion/pull/134) Fix location deprecation by setting locationType to history ([@nickschot]) +- [cardstack/boxel-motion] [#133](https://github.com/cardstack/boxel-motion/pull/133) Modernize sprite-modifier to be compatible with the future ember-modifier v4 ([@nickschot]) +- [cardstack/boxel-motion] [#129](https://github.com/cardstack/boxel-motion/pull/129) Remove dependenciesMeta as it breaks things during development ([@nickschot]) +- [cardstack/boxel-motion] [#128](https://github.com/cardstack/boxel-motion/pull/128) Remove unnecessary re-exports ([@nickschot]) +- [mainmatter/ember-cli-list-addons] [#1](https://github.com/mainmatter/ember-cli-list-addons/pull/1) Initial implementation ([@mansona]) +- [mainmatter/eslint-plugin-emberobserver] [#3](https://github.com/mainmatter/eslint-plugin-emberobserver/pull/3) Fix blocker preventing ember-observer from tracking an addon's embroider compatibility ([@candunaj]) +- [mansona/ember-try] [#1](https://github.com/mansona/ember-try/pull/1) onlyVersionCompatibility to generateConfig ([@candunaj]) ## Probot -- [probot/probot] [#1763](https://github.com/probot/probot/pull/1763) - build(deps): upgrade @octokit/types to v8 ([@oscard0m]) +- [probot/probot] [#1763](https://github.com/probot/probot/pull/1763) build(deps): upgrade @octokit/types to v8 ([@oscard0m]) ## Internal -- [mainmatter/mainmatter-website-mailer] - [#7](https://github.com/mainmatter/mainmatter-website-mailer/pull/7) Add tests - ([@marcoow]) +- [mainmatter/mainmatter-website-mailer] [#7](https://github.com/mainmatter/mainmatter-website-mailer/pull/7) Add tests ([@marcoow]) [@bobrimperator]: https://github.com/BobrImperator [@turbo87]: https://github.com/Turbo87 @@ -190,28 +78,22 @@ [@nickschot]: https://github.com/nickschot [@oscard0m]: https://github.com/oscard0m [@zeppelin]: https://github.com/zeppelin -[minthamie/more-confetti-addon]: - https://github.com/MinThaMie/more-confetti-addon +[minthamie/more-confetti-addon]: https://github.com/MinThaMie/more-confetti-addon [turbo87/renovate-config]: https://github.com/Turbo87/renovate-config -[turbo87/segelflug-classifieds]: - https://github.com/Turbo87/segelflug-classifieds +[turbo87/segelflug-classifieds]: https://github.com/Turbo87/segelflug-classifieds [turbo87/sentry-conduit]: https://github.com/Turbo87/sentry-conduit [cardstack/boxel-motion]: https://github.com/cardstack/boxel-motion [ember-cli/ember-try-config]: https://github.com/ember-cli/ember-try-config [ember-cli/ember-try]: https://github.com/ember-cli/ember-try -[ember-codemods/ember-native-class-codemod]: - https://github.com/ember-codemods/ember-native-class-codemod +[ember-codemods/ember-native-class-codemod]: https://github.com/ember-codemods/ember-native-class-codemod [ember-learn/ember-blog]: https://github.com/ember-learn/ember-blog [ember-learn/ember-styleguide]: https://github.com/ember-learn/ember-styleguide [ember-learn/guides-source]: https://github.com/ember-learn/guides-source [mainmatter/ember-api-actions]: https://github.com/mainmatter/ember-api-actions -[mainmatter/ember-cli-list-addons]: - https://github.com/mainmatter/ember-cli-list-addons +[mainmatter/ember-cli-list-addons]: https://github.com/mainmatter/ember-cli-list-addons [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth -[mainmatter/eslint-plugin-emberobserver]: - https://github.com/mainmatter/eslint-plugin-emberobserver -[mainmatter/mainmatter-website-mailer]: - https://github.com/mainmatter/mainmatter-website-mailer +[mainmatter/eslint-plugin-emberobserver]: https://github.com/mainmatter/eslint-plugin-emberobserver +[mainmatter/mainmatter-website-mailer]: https://github.com/mainmatter/mainmatter-website-mailer [mansona/ember-try]: https://github.com/mansona/ember-try [probot/probot]: https://github.com/probot/probot [qonto/ember-cp-validations]: https://github.com/qonto/ember-cp-validations diff --git a/src/twios/2023-03-06.md b/src/twios/2023-03-06.md index 5d5d3db5d5..675f1a846c 100644 --- a/src/twios/2023-03-06.md +++ b/src/twios/2023-03-06.md @@ -1,164 +1,76 @@ ## Rust -- [marcoow/rust_rest] [#5](https://github.com/marcoow/rust_rest/pull/5) move - test helpers into their own module ([@marcoow]) -- [marcoow/rust_rest] [#4](https://github.com/marcoow/rust_rest/pull/4) Improve - migrations command ([@marcoow]) -- [marcoow/rust_rest] [#3](https://github.com/marcoow/rust_rest/pull/3) use - dedicated database for tests ([@marcoow]) -- [marcoow/rust_rest] [#2](https://github.com/marcoow/rust_rest/pull/2) use - dotenvy instead of dotenv ([@marcoow]) -- [rust-lang/www.rust-lang.org] - [#1776](https://github.com/rust-lang/www.rust-lang.org/pull/1776) governance: - Remove outdated "Roadmap" section ([@Turbo87]) +- [marcoow/rust_rest] [#5](https://github.com/marcoow/rust_rest/pull/5) move test helpers into their own module ([@marcoow]) +- [marcoow/rust_rest] [#4](https://github.com/marcoow/rust_rest/pull/4) Improve migrations command ([@marcoow]) +- [marcoow/rust_rest] [#3](https://github.com/marcoow/rust_rest/pull/3) use dedicated database for tests ([@marcoow]) +- [marcoow/rust_rest] [#2](https://github.com/marcoow/rust_rest/pull/2) use dotenvy instead of dotenv ([@marcoow]) +- [rust-lang/www.rust-lang.org] [#1776](https://github.com/rust-lang/www.rust-lang.org/pull/1776) governance: Remove outdated "Roadmap" section ([@Turbo87]) ## crates.io -- [rust-lang/crates.io] - [#6104](https://github.com/rust-lang/crates.io/pull/6104) email: Add - `Content-Type` header ([@Turbo87]) -- [rust-lang/crates.io] - [#6071](https://github.com/rust-lang/crates.io/pull/6071) middleware: Use new - `option_layer()` from `axum-extra` crate ([@Turbo87]) -- [rust-lang/crates.io] - [#6070](https://github.com/rust-lang/crates.io/pull/6070) Use Renovatebot - regex managers for Docker files ([@Turbo87]) -- [rust-lang/crates.io] - [#6050](https://github.com/rust-lang/crates.io/pull/6050) Remove deprecated - `ember-export-application-global` dependency ([@Turbo87]) -- [rust-lang/crates.io] - [#6043](https://github.com/rust-lang/crates.io/pull/6043) background-worker: - Speed up index cloning by 3x ([@Turbo87]) -- [rust-lang/crates.io] - [#6039](https://github.com/rust-lang/crates.io/pull/6039) Replace custom - `certificate_check()` impl with regular `known_hosts` file ([@Turbo87]) -- [rust-lang/crates.io] - [#6033](https://github.com/rust-lang/crates.io/pull/6033) Fix SSH hostkey - checks for `push()` ([@Turbo87]) -- [rust-lang/crates.io] - [#6032](https://github.com/rust-lang/crates.io/pull/6032) Implement GitHub SSH - certificate checks ([@Turbo87]) +- [rust-lang/crates.io] [#6104](https://github.com/rust-lang/crates.io/pull/6104) email: Add `Content-Type` header ([@Turbo87]) +- [rust-lang/crates.io] [#6071](https://github.com/rust-lang/crates.io/pull/6071) middleware: Use new `option_layer()` from `axum-extra` crate ([@Turbo87]) +- [rust-lang/crates.io] [#6070](https://github.com/rust-lang/crates.io/pull/6070) Use Renovatebot regex managers for Docker files ([@Turbo87]) +- [rust-lang/crates.io] [#6050](https://github.com/rust-lang/crates.io/pull/6050) Remove deprecated `ember-export-application-global` dependency ([@Turbo87]) +- [rust-lang/crates.io] [#6043](https://github.com/rust-lang/crates.io/pull/6043) background-worker: Speed up index cloning by 3x ([@Turbo87]) +- [rust-lang/crates.io] [#6039](https://github.com/rust-lang/crates.io/pull/6039) Replace custom `certificate_check()` impl with regular `known_hosts` file ([@Turbo87]) +- [rust-lang/crates.io] [#6033](https://github.com/rust-lang/crates.io/pull/6033) Fix SSH hostkey checks for `push()` ([@Turbo87]) +- [rust-lang/crates.io] [#6032](https://github.com/rust-lang/crates.io/pull/6032) Implement GitHub SSH certificate checks ([@Turbo87]) ## Octoherd -- [oscard0m/octoherd-script-review-pull-requests] - [#1](https://github.com/oscard0m/octoherd-script-review-pull-requests/pull/1) - feat: Initial version ([@oscard0m]) +- [oscard0m/octoherd-script-review-pull-requests] [#1](https://github.com/oscard0m/octoherd-script-review-pull-requests/pull/1) feat: Initial version ([@oscard0m]) ## BEM -- [getbem/getbem.github.io] - [#303](https://github.com/getbem/getbem.github.io/pull/303) add anchor links - to headings ([@oscard0m]) +- [getbem/getbem.github.io] [#303](https://github.com/getbem/getbem.github.io/pull/303) add anchor links to headings ([@oscard0m]) ## Cal.com -- [calcom/cal.com] [#7212](https://github.com/calcom/cal.com/pull/7212) improve - typing by removing as html element ([@oscard0m]) +- [calcom/cal.com] [#7212](https://github.com/calcom/cal.com/pull/7212) improve typing by removing as html element ([@oscard0m]) ## Ember.js -- [emberjs/core-notes] [#485](https://github.com/emberjs/core-notes/pull/485) - add embroider notes for feb 14th ([@mansona]) -- [emberjs/core-notes] [#483](https://github.com/emberjs/core-notes/pull/483) - embroider notes for Feb 7th ([@mansona]) -- [mainmatter/ember-api-actions] - [#151](https://github.com/mainmatter/ember-api-actions/pull/151) Allow - `buildURL()` overrides to return query parameters ([@Turbo87]) -- [mainmatter/ember-simple-auth] - [#2515](https://github.com/mainmatter/ember-simple-auth/pull/2515) chore: - enable ember-default in ci ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2513](https://github.com/mainmatter/ember-simple-auth/pull/2513) - refactor(cleanup): remove ember-data from ESA addon ([@BobrImperator]) -- [mainmatter/ember-template-assert] - [#4](https://github.com/mainmatter/ember-template-assert/pull/4) Cleanup - unnecessary auto-import dep and config ([@nickschot]) -- [mainmatter/ember-template-assert] - [#3](https://github.com/mainmatter/ember-template-assert/pull/3) Fix AST - transform not detecting production env correctly when used in an app - ([@nickschot]) -- [mainmatter/ember-template-assert] - [#2](https://github.com/mainmatter/ember-template-assert/pull/2) Update - ember-cli blueprint to 4.10 ([@nickschot]) -- [mainmatter/ember-workshop] - [#754](https://github.com/mainmatter/ember-workshop/pull/754) Dependabot → - Renovatebot ([@zeppelin]) -- [mainmatter/ember-workshop] - [#753](https://github.com/mainmatter/ember-workshop/pull/753) Bump - PNPM_VERSION for GH ([@zeppelin]) -- [nickschot/ember-gesture-modifiers] - [#411](https://github.com/nickschot/ember-gesture-modifiers/pull/411) Upgrade - to eslint 8 ([@nickschot]) -- [nickschot/ember-gesture-modifiers] - [#410](https://github.com/nickschot/ember-gesture-modifiers/pull/410) Update - to ember-cli 4.10 blueprint ([@nickschot]) -- [nickschot/ember-gesture-modifiers] - [#408](https://github.com/nickschot/ember-gesture-modifiers/pull/408) Drop - support for ember 3.24 ([@nickschot]) -- [nickschot/ember-gesture-modifiers] - [#407](https://github.com/nickschot/ember-gesture-modifiers/pull/407) Add - ember-auto-import to dependencies to support v2 addons ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#575](https://github.com/nickschot/ember-mobile-menu/pull/575) Add missing - peerDeps ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#574](https://github.com/nickschot/ember-mobile-menu/pull/574) Upgrade to - eslint v8 ([@nickschot]) -- [zeppelin/ember-click-outside] - [#262](https://github.com/zeppelin/ember-click-outside/pull/262) Fix - ember-canary tests by updating ember-qunit ([@zeppelin]) -- [zeppelin/ember-click-outside] - [#261](https://github.com/zeppelin/ember-click-outside/pull/261) Widen - ember-modifier dependency range ([@zeppelin]) -- [zeppelin/ember-click-outside] - [#260](https://github.com/zeppelin/ember-click-outside/pull/260) Remove - deprecated `` component ([@zeppelin]) -- [zeppelin/ember-click-outside] - [#259](https://github.com/zeppelin/ember-click-outside/pull/259) Convert to V2 - addon format ([@zeppelin]) -- [zeppelin/ember-click-outside] - [#258](https://github.com/zeppelin/ember-click-outside/pull/258) Remove unused - `printConsoleMessage` function ([@zeppelin]) -- [DazzlingFugu/ember-slugify] - [#258](https://github.com/DazzlingFugu/ember-slugify/pull/258) BREAKING - Migrate to V2 Addon ([@BlueCutOfficial]) -- [DazzlingFugu/ember-slugify] - [#257](https://github.com/DazzlingFugu/ember-slugify/pull/257) Ember 4.8 - ([@BlueCutOfficial]) -- [DazzlingFugu/ember-slugify] - [#256](https://github.com/DazzlingFugu/ember-slugify/pull/256) release version - 4.0 ([@BlueCutOfficial]) -- [DazzlingFugu/ember-slugify] - [#254](https://github.com/DazzlingFugu/ember-slugify/pull/254) BREAKING - tests(CI): drop support for ember < 3.28, not compatible wit… - ([@BlueCutOfficial]) +- [emberjs/core-notes] [#485](https://github.com/emberjs/core-notes/pull/485) add embroider notes for feb 14th ([@mansona]) +- [emberjs/core-notes] [#483](https://github.com/emberjs/core-notes/pull/483) embroider notes for Feb 7th ([@mansona]) +- [mainmatter/ember-api-actions] [#151](https://github.com/mainmatter/ember-api-actions/pull/151) Allow `buildURL()` overrides to return query parameters ([@Turbo87]) +- [mainmatter/ember-simple-auth] [#2515](https://github.com/mainmatter/ember-simple-auth/pull/2515) chore: enable ember-default in ci ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2513](https://github.com/mainmatter/ember-simple-auth/pull/2513) refactor(cleanup): remove ember-data from ESA addon ([@BobrImperator]) +- [mainmatter/ember-template-assert] [#4](https://github.com/mainmatter/ember-template-assert/pull/4) Cleanup unnecessary auto-import dep and config ([@nickschot]) +- [mainmatter/ember-template-assert] [#3](https://github.com/mainmatter/ember-template-assert/pull/3) Fix AST transform not detecting production env correctly when used in an app ([@nickschot]) +- [mainmatter/ember-template-assert] [#2](https://github.com/mainmatter/ember-template-assert/pull/2) Update ember-cli blueprint to 4.10 ([@nickschot]) +- [mainmatter/ember-workshop] [#754](https://github.com/mainmatter/ember-workshop/pull/754) Dependabot → Renovatebot ([@zeppelin]) +- [mainmatter/ember-workshop] [#753](https://github.com/mainmatter/ember-workshop/pull/753) Bump PNPM_VERSION for GH ([@zeppelin]) +- [nickschot/ember-gesture-modifiers] [#411](https://github.com/nickschot/ember-gesture-modifiers/pull/411) Upgrade to eslint 8 ([@nickschot]) +- [nickschot/ember-gesture-modifiers] [#410](https://github.com/nickschot/ember-gesture-modifiers/pull/410) Update to ember-cli 4.10 blueprint ([@nickschot]) +- [nickschot/ember-gesture-modifiers] [#408](https://github.com/nickschot/ember-gesture-modifiers/pull/408) Drop support for ember 3.24 ([@nickschot]) +- [nickschot/ember-gesture-modifiers] [#407](https://github.com/nickschot/ember-gesture-modifiers/pull/407) Add ember-auto-import to dependencies to support v2 addons ([@nickschot]) +- [nickschot/ember-mobile-menu] [#575](https://github.com/nickschot/ember-mobile-menu/pull/575) Add missing peerDeps ([@nickschot]) +- [nickschot/ember-mobile-menu] [#574](https://github.com/nickschot/ember-mobile-menu/pull/574) Upgrade to eslint v8 ([@nickschot]) +- [zeppelin/ember-click-outside] [#262](https://github.com/zeppelin/ember-click-outside/pull/262) Fix ember-canary tests by updating ember-qunit ([@zeppelin]) +- [zeppelin/ember-click-outside] [#261](https://github.com/zeppelin/ember-click-outside/pull/261) Widen ember-modifier dependency range ([@zeppelin]) +- [zeppelin/ember-click-outside] [#260](https://github.com/zeppelin/ember-click-outside/pull/260) Remove deprecated `` component ([@zeppelin]) +- [zeppelin/ember-click-outside] [#259](https://github.com/zeppelin/ember-click-outside/pull/259) Convert to V2 addon format ([@zeppelin]) +- [zeppelin/ember-click-outside] [#258](https://github.com/zeppelin/ember-click-outside/pull/258) Remove unused `printConsoleMessage` function ([@zeppelin]) +- [DazzlingFugu/ember-slugify] [#258](https://github.com/DazzlingFugu/ember-slugify/pull/258) BREAKING Migrate to V2 Addon ([@BlueCutOfficial]) +- [DazzlingFugu/ember-slugify] [#257](https://github.com/DazzlingFugu/ember-slugify/pull/257) Ember 4.8 ([@BlueCutOfficial]) +- [DazzlingFugu/ember-slugify] [#256](https://github.com/DazzlingFugu/ember-slugify/pull/256) release version 4.0 ([@BlueCutOfficial]) +- [DazzlingFugu/ember-slugify] [#254](https://github.com/DazzlingFugu/ember-slugify/pull/254) BREAKING tests(CI): drop support for ember < 3.28, not compatible wit… ([@BlueCutOfficial]) ## Embroider -- [embroider-build/embroider] - [#1359](https://github.com/embroider-build/embroider/pull/1359) Ignore resolve - requests that start with ! ([@mansona]) +- [embroider-build/embroider] [#1359](https://github.com/embroider-build/embroider/pull/1359) Ignore resolve requests that start with ! ([@mansona]) ## Octokit -- [octokit/.github] [#38](https://github.com/octokit/.github/pull/38) - feat(renovate-config): automerge lockFileMaintenance changes ([@oscard0m]) -- [octokit/plugin-retry.js] - [#410](https://github.com/octokit/plugin-retry.js/pull/410) Add script to fix - package json from build step ([@oscard0m]) +- [octokit/.github] [#38](https://github.com/octokit/.github/pull/38) feat(renovate-config): automerge lockFileMaintenance changes ([@oscard0m]) +- [octokit/plugin-retry.js] [#410](https://github.com/octokit/plugin-retry.js/pull/410) Add script to fix package json from build step ([@oscard0m]) ## Renovate -- [renovatebot/renovate] - [#20357](https://github.com/renovatebot/renovate/pull/20357) - fix(versioning/cargo): Disable support for `rangeStrategy: widen` ([@Turbo87]) -- [renovatebot/renovate] - [#20355](https://github.com/renovatebot/renovate/pull/20355) fix(cargo): fix - pinning for wildcard constraints ([@Turbo87]) -- [renovatebot/renovate] - [#20333](https://github.com/renovatebot/renovate/pull/20333) - chore(VersioningApi): add doc comments ([@Turbo87]) +- [renovatebot/renovate] [#20357](https://github.com/renovatebot/renovate/pull/20357) fix(versioning/cargo): Disable support for `rangeStrategy: widen` ([@Turbo87]) +- [renovatebot/renovate] [#20355](https://github.com/renovatebot/renovate/pull/20355) fix(cargo): fix pinning for wildcard constraints ([@Turbo87]) +- [renovatebot/renovate] [#20333](https://github.com/renovatebot/renovate/pull/20333) chore(VersioningApi): add doc comments ([@Turbo87]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@bobrimperator]: https://github.com/BobrImperator @@ -175,17 +87,14 @@ [getbem/getbem.github.io]: https://github.com/getbem/getbem.github.io [mainmatter/ember-api-actions]: https://github.com/mainmatter/ember-api-actions [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth -[mainmatter/ember-template-assert]: - https://github.com/mainmatter/ember-template-assert +[mainmatter/ember-template-assert]: https://github.com/mainmatter/ember-template-assert [mainmatter/ember-workshop]: https://github.com/mainmatter/ember-workshop [marcoow/rust_rest]: https://github.com/marcoow/rust_rest -[nickschot/ember-gesture-modifiers]: - https://github.com/nickschot/ember-gesture-modifiers +[nickschot/ember-gesture-modifiers]: https://github.com/nickschot/ember-gesture-modifiers [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu [octokit/.github]: https://github.com/octokit/.github [octokit/plugin-retry.js]: https://github.com/octokit/plugin-retry.js -[oscard0m/octoherd-script-review-pull-requests]: - https://github.com/oscard0m/octoherd-script-review-pull-requests +[oscard0m/octoherd-script-review-pull-requests]: https://github.com/oscard0m/octoherd-script-review-pull-requests [renovatebot/renovate]: https://github.com/renovatebot/renovate [rust-lang/crates.io]: https://github.com/rust-lang/crates.io [rust-lang/www.rust-lang.org]: https://github.com/rust-lang/www.rust-lang.org diff --git a/src/twios/2023-03-29.md b/src/twios/2023-03-29.md index 8803b015f1..61fdfb1e0b 100644 --- a/src/twios/2023-03-29.md +++ b/src/twios/2023-03-29.md @@ -1,179 +1,77 @@ ## Rust -- [dimforge/rapier.rs] [#61](https://github.com/dimforge/rapier.rs/pull/61) - Update "Getting Started page" for bevy_rapier to bevy 0.10 ([@BobrImperator]) -- [marcoow/rust_rest] [#8](https://github.com/marcoow/rust_rest/pull/8) use - `clap` for parsing CLI arguments in `db` binary ([@marcoow]) -- [marcoow/rust_rest] [#7](https://github.com/marcoow/rust_rest/pull/7) Remove - `dotenv!` macro ([@marcoow]) -- [marcoow/rust_rest] [#6](https://github.com/marcoow/rust_rest/pull/6) fail - clippy for all warnings on CI ([@marcoow]) +- [dimforge/rapier.rs] [#61](https://github.com/dimforge/rapier.rs/pull/61) Update "Getting Started page" for bevy_rapier to bevy 0.10 ([@BobrImperator]) +- [marcoow/rust_rest] [#8](https://github.com/marcoow/rust_rest/pull/8) use `clap` for parsing CLI arguments in `db` binary ([@marcoow]) +- [marcoow/rust_rest] [#7](https://github.com/marcoow/rust_rest/pull/7) Remove `dotenv!` macro ([@marcoow]) +- [marcoow/rust_rest] [#6](https://github.com/marcoow/rust_rest/pull/6) fail clippy for all warnings on CI ([@marcoow]) ## Ember.js -- [DazzlingFugu/ember-fr-guides-source] - [#167](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/167) - Translate guides/release/getting-started/quick-start.md ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#165](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/165) - Translate guides/release/addons-and-dependencies/index.md ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#164](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/164) - Translate .../getting-started/anatomy-of-an-ember-app.md ([@BlueCutOfficial]) -- [ef4/ember-auto-import] - [#573](https://github.com/ef4/ember-auto-import/pull/573) added - babel-plugin-ember-template-compilation ([@candunaj]) -- [ember-cli/babel-plugin-htmlbars-inline-precompile] - [#486](https://github.com/ember-cli/babel-plugin-htmlbars-inline-precompile/pull/486) - [WIP] precompileTemplate with scope that has properties with different key and - value ([@candunaj]) -- [ember-cli/ember-try] [#934](https://github.com/ember-cli/ember-try/pull/934) - Update github CI yaml ([@mansona]) -- [ember-cli/ember-try] [#933](https://github.com/ember-cli/ember-try/pull/933) - Update smoke test to fix CI ([@mansona]) -- [ember-learn/ember-styleguide] - [#451](https://github.com/ember-learn/ember-styleguide/pull/451) update - percy-cli ([@mansona]) -- [ember-learn/ember-styleguide] - [#449](https://github.com/ember-learn/ember-styleguide/pull/449) add - permissions for continue-on-error ([@mansona]) -- [ember-learn/empress-blog-ember-template] - [#138](https://github.com/ember-learn/empress-blog-ember-template/pull/138) - fix ember-try scenarios for canary beta release ([@mansona]) -- [ember-learn/empress-blog-ember-template] - [#137](https://github.com/ember-learn/empress-blog-ember-template/pull/137) - Update Percy ([@mansona]) -- [emberjs/babel-plugin-ember-template-compilation] - [#17](https://github.com/emberjs/babel-plugin-ember-template-compilation/pull/17) - [WIP] precompileTemplate with scope that has properties with different key and - value ([@candunaj]) -- [emberjs/core-notes] [#490](https://github.com/emberjs/core-notes/pull/490) - add notes for embroider meeting Mar 21st ([@mansona]) -- [emberjs/core-notes] [#489](https://github.com/emberjs/core-notes/pull/489) - add notes for embroider mar 14th ([@mansona]) -- [emberjs/core-notes] [#487](https://github.com/emberjs/core-notes/pull/487) - add notes for embroider meeting Mar 7th ([@mansona]) -- [kategengler/ember-cli-code-coverage] - [#379](https://github.com/kategengler/ember-cli-code-coverage/pull/379) allow - for a wider range of embroider dependencies ([@mansona]) -- [mainmatter/ember-asset-size-action] - [#69](https://github.com/mainmatter/ember-asset-size-action/pull/69) Add - support for specifying a custom npm build command (npm run ) - ([@mansona]) -- [mainmatter/ember-asset-size-action] - [#68](https://github.com/mainmatter/ember-asset-size-action/pull/68) add - support for pnpm ([@mansona]) -- [mainmatter/ember-asset-size-action] - [#67](https://github.com/mainmatter/ember-asset-size-action/pull/67) add - support to specify a working-directory ([@mansona]) -- [mainmatter/ember-asset-size-action] - [#66](https://github.com/mainmatter/ember-asset-size-action/pull/66) Fix npm 7 - check with semver ([@mansona]) -- [mainmatter/ember-asset-size-action] - [#64](https://github.com/mainmatter/ember-asset-size-action/pull/64) Optinally - show total diff size of all assets ([@mansona]) -- [mainmatter/ember-asset-size-action] - [#62](https://github.com/mainmatter/ember-asset-size-action/pull/62) Use - native esm and remove esm dependency ([@mansona]) -- [mainmatter/ember-asset-size-action] - [#61](https://github.com/mainmatter/ember-asset-size-action/pull/61) remove - unused yn dependency ([@mansona]) -- [mainmatter/ember-asset-size-action] - [#51](https://github.com/mainmatter/ember-asset-size-action/pull/51) add - renovatebot configuration ([@mansona]) -- [mainmatter/ember-asset-size-action] - [#50](https://github.com/mainmatter/ember-asset-size-action/pull/50) Update - all Mainmatter references ([@mansona]) -- [mainmatter/ember-asset-size-action] - [#49](https://github.com/mainmatter/ember-asset-size-action/pull/49) Set a - "minimum change" of 10 bytes to avoid jitter in reporting ([@mansona]) -- [mainmatter/ember-asset-size-action] - [#48](https://github.com/mainmatter/ember-asset-size-action/pull/48) Wrap the - file tables in a `
    ` ([@mansona]) -- [mainmatter/ember-asset-size-action] - [#47](https://github.com/mainmatter/ember-asset-size-action/pull/47) Handle - ember-auto-import chunks ([@mansona]) -- [mainmatter/ember-asset-size-action] - [#43](https://github.com/mainmatter/ember-asset-size-action/pull/43) switching - to @vercel/ncc ([@mansona]) -- [mainmatter/ember-simple-auth] - [#2531](https://github.com/mainmatter/ember-simple-auth/pull/2531) chore(doc): - generate documentation for v5.0.0 ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2530](https://github.com/mainmatter/ember-simple-auth/pull/2530) - chore(deps): remove typescript-transform resolution ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2529](https://github.com/mainmatter/ember-simple-auth/pull/2529) - chore(deps): remove cssstyle resolutions ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2528](https://github.com/mainmatter/ember-simple-auth/pull/2528) - chore(deps): remove jsdom resolutions ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2527](https://github.com/mainmatter/ember-simple-auth/pull/2527) chore: - prolong Torri authenticator deprecation period until v6 ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2526](https://github.com/mainmatter/ember-simple-auth/pull/2526) feat: - remove deprecated Evented API usage from the public session service - ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2525](https://github.com/mainmatter/ember-simple-auth/pull/2525) chore: Drop - node - set minimal node version to >=16 ([@BobrImperator]) +- [DazzlingFugu/ember-fr-guides-source] [#167](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/167) Translate guides/release/getting-started/quick-start.md ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#165](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/165) Translate guides/release/addons-and-dependencies/index.md ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#164](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/164) Translate .../getting-started/anatomy-of-an-ember-app.md ([@BlueCutOfficial]) +- [ef4/ember-auto-import] [#573](https://github.com/ef4/ember-auto-import/pull/573) added babel-plugin-ember-template-compilation ([@candunaj]) +- [ember-cli/babel-plugin-htmlbars-inline-precompile] [#486](https://github.com/ember-cli/babel-plugin-htmlbars-inline-precompile/pull/486) [WIP] precompileTemplate with scope that has properties with different key and value ([@candunaj]) +- [ember-cli/ember-try] [#934](https://github.com/ember-cli/ember-try/pull/934) Update github CI yaml ([@mansona]) +- [ember-cli/ember-try] [#933](https://github.com/ember-cli/ember-try/pull/933) Update smoke test to fix CI ([@mansona]) +- [ember-learn/ember-styleguide] [#451](https://github.com/ember-learn/ember-styleguide/pull/451) update percy-cli ([@mansona]) +- [ember-learn/ember-styleguide] [#449](https://github.com/ember-learn/ember-styleguide/pull/449) add permissions for continue-on-error ([@mansona]) +- [ember-learn/empress-blog-ember-template] [#138](https://github.com/ember-learn/empress-blog-ember-template/pull/138) fix ember-try scenarios for canary beta release ([@mansona]) +- [ember-learn/empress-blog-ember-template] [#137](https://github.com/ember-learn/empress-blog-ember-template/pull/137) Update Percy ([@mansona]) +- [emberjs/babel-plugin-ember-template-compilation] [#17](https://github.com/emberjs/babel-plugin-ember-template-compilation/pull/17) [WIP] precompileTemplate with scope that has properties with different key and value ([@candunaj]) +- [emberjs/core-notes] [#490](https://github.com/emberjs/core-notes/pull/490) add notes for embroider meeting Mar 21st ([@mansona]) +- [emberjs/core-notes] [#489](https://github.com/emberjs/core-notes/pull/489) add notes for embroider mar 14th ([@mansona]) +- [emberjs/core-notes] [#487](https://github.com/emberjs/core-notes/pull/487) add notes for embroider meeting Mar 7th ([@mansona]) +- [kategengler/ember-cli-code-coverage] [#379](https://github.com/kategengler/ember-cli-code-coverage/pull/379) allow for a wider range of embroider dependencies ([@mansona]) +- [mainmatter/ember-asset-size-action] [#69](https://github.com/mainmatter/ember-asset-size-action/pull/69) Add support for specifying a custom npm build command (npm run ) ([@mansona]) +- [mainmatter/ember-asset-size-action] [#68](https://github.com/mainmatter/ember-asset-size-action/pull/68) add support for pnpm ([@mansona]) +- [mainmatter/ember-asset-size-action] [#67](https://github.com/mainmatter/ember-asset-size-action/pull/67) add support to specify a working-directory ([@mansona]) +- [mainmatter/ember-asset-size-action] [#66](https://github.com/mainmatter/ember-asset-size-action/pull/66) Fix npm 7 check with semver ([@mansona]) +- [mainmatter/ember-asset-size-action] [#64](https://github.com/mainmatter/ember-asset-size-action/pull/64) Optinally show total diff size of all assets ([@mansona]) +- [mainmatter/ember-asset-size-action] [#62](https://github.com/mainmatter/ember-asset-size-action/pull/62) Use native esm and remove esm dependency ([@mansona]) +- [mainmatter/ember-asset-size-action] [#61](https://github.com/mainmatter/ember-asset-size-action/pull/61) remove unused yn dependency ([@mansona]) +- [mainmatter/ember-asset-size-action] [#51](https://github.com/mainmatter/ember-asset-size-action/pull/51) add renovatebot configuration ([@mansona]) +- [mainmatter/ember-asset-size-action] [#50](https://github.com/mainmatter/ember-asset-size-action/pull/50) Update all Mainmatter references ([@mansona]) +- [mainmatter/ember-asset-size-action] [#49](https://github.com/mainmatter/ember-asset-size-action/pull/49) Set a "minimum change" of 10 bytes to avoid jitter in reporting ([@mansona]) +- [mainmatter/ember-asset-size-action] [#48](https://github.com/mainmatter/ember-asset-size-action/pull/48) Wrap the file tables in a `
    ` ([@mansona]) +- [mainmatter/ember-asset-size-action] [#47](https://github.com/mainmatter/ember-asset-size-action/pull/47) Handle ember-auto-import chunks ([@mansona]) +- [mainmatter/ember-asset-size-action] [#43](https://github.com/mainmatter/ember-asset-size-action/pull/43) switching to @vercel/ncc ([@mansona]) +- [mainmatter/ember-simple-auth] [#2531](https://github.com/mainmatter/ember-simple-auth/pull/2531) chore(doc): generate documentation for v5.0.0 ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2530](https://github.com/mainmatter/ember-simple-auth/pull/2530) chore(deps): remove typescript-transform resolution ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2529](https://github.com/mainmatter/ember-simple-auth/pull/2529) chore(deps): remove cssstyle resolutions ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2528](https://github.com/mainmatter/ember-simple-auth/pull/2528) chore(deps): remove jsdom resolutions ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2527](https://github.com/mainmatter/ember-simple-auth/pull/2527) chore: prolong Torri authenticator deprecation period until v6 ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2526](https://github.com/mainmatter/ember-simple-auth/pull/2526) feat: remove deprecated Evented API usage from the public session service ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2525](https://github.com/mainmatter/ember-simple-auth/pull/2525) chore: Drop node - set minimal node version to >=16 ([@BobrImperator]) ## Empress -- [empress/bottled-ember] - [#18](https://github.com/empress/bottled-ember/pull/18) Really fix terminal - colour implementation ([@mansona]) -- [empress/bottled-ember] - [#17](https://github.com/empress/bottled-ember/pull/17) fix issues with ansi - colours ([@mansona]) -- [empress/bottled-ember] - [#16](https://github.com/empress/bottled-ember/pull/16) breaking: Add some - tests and fix --no-overlay command line option and move from minimist to - commander ([@mansona]) +- [empress/bottled-ember] [#18](https://github.com/empress/bottled-ember/pull/18) Really fix terminal colour implementation ([@mansona]) +- [empress/bottled-ember] [#17](https://github.com/empress/bottled-ember/pull/17) fix issues with ansi colours ([@mansona]) +- [empress/bottled-ember] [#16](https://github.com/empress/bottled-ember/pull/16) breaking: Add some tests and fix --no-overlay command line option and move from minimist to commander ([@mansona]) ## JavaScript -- [mainmatter/compare-fixture] - [#3](https://github.com/mainmatter/compare-fixture/pull/3) Make sure the - exitCode is 1 when diffs are detected ([@mansona]) -- [mainmatter/compare-fixture] - [#2](https://github.com/mainmatter/compare-fixture/pull/2) add initial - implementation ([@mansona]) -- [mainmatter/mocha-diff] [#3](https://github.com/mainmatter/mocha-diff/pull/3) - Add Example Output ([@mansona]) -- [mainmatter/mocha-diff] [#2](https://github.com/mainmatter/mocha-diff/pull/2) - Fix CI ([@mansona]) +- [mainmatter/compare-fixture] [#3](https://github.com/mainmatter/compare-fixture/pull/3) Make sure the exitCode is 1 when diffs are detected ([@mansona]) +- [mainmatter/compare-fixture] [#2](https://github.com/mainmatter/compare-fixture/pull/2) add initial implementation ([@mansona]) +- [mainmatter/mocha-diff] [#3](https://github.com/mainmatter/mocha-diff/pull/3) Add Example Output ([@mansona]) +- [mainmatter/mocha-diff] [#2](https://github.com/mainmatter/mocha-diff/pull/2) Fix CI ([@mansona]) ## Octokit -- [oscard0m/octoherd-script-release-workflow-patch] - [#1](https://github.com/oscard0m/octoherd-script-release-workflow-patch/pull/1) - feat: Initial version ([@oscard0m]) +- [oscard0m/octoherd-script-release-workflow-patch] [#1](https://github.com/oscard0m/octoherd-script-release-workflow-patch/pull/1) feat: Initial version ([@oscard0m]) ## Internal -- [mainmatter/mainmatter-website-mailer] - [#20](https://github.com/mainmatter/mainmatter-website-mailer/pull/20) enable - Zapier automation via email ([@marcoow]) -- [mainmatter/mainmatter-website-mailer] - [#19](https://github.com/mainmatter/mainmatter-website-mailer/pull/19) make - the service optional ([@marcoow]) -- [mainmatter/mainmatter-website-mailer] - [#18](https://github.com/mainmatter/mainmatter-website-mailer/pull/18) send - service in subject ([@marcoow]) -- [mainmatter/mainmatter-website-mailer] - [#9](https://github.com/mainmatter/mainmatter-website-mailer/pull/9) include - selected service in message ([@marcoow]) -- [mainmatter/renovate-config] - [#14](https://github.com/mainmatter/renovate-config/pull/14) remove - helpers:pinGitHubActionDigests ([@mansona]) +- [mainmatter/mainmatter-website-mailer] [#20](https://github.com/mainmatter/mainmatter-website-mailer/pull/20) enable Zapier automation via email ([@marcoow]) +- [mainmatter/mainmatter-website-mailer] [#19](https://github.com/mainmatter/mainmatter-website-mailer/pull/19) make the service optional ([@marcoow]) +- [mainmatter/mainmatter-website-mailer] [#18](https://github.com/mainmatter/mainmatter-website-mailer/pull/18) send service in subject ([@marcoow]) +- [mainmatter/mainmatter-website-mailer] [#9](https://github.com/mainmatter/mainmatter-website-mailer/pull/9) include selected service in message ([@marcoow]) +- [mainmatter/renovate-config] [#14](https://github.com/mainmatter/renovate-config/pull/14) remove helpers:pinGitHubActionDigests ([@mansona]) ## Miscellaneous -- [freeCodeCamp/learn-bash-by-building-a-boilerplate] - [#24](https://github.com/freeCodeCamp/learn-bash-by-building-a-boilerplate/pull/24) - fix: typo withing -> within ([@inesilva]) +- [freeCodeCamp/learn-bash-by-building-a-boilerplate] [#24](https://github.com/freeCodeCamp/learn-bash-by-building-a-boilerplate/pull/24) fix: typo withing -> within ([@inesilva]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@bobrimperator]: https://github.com/BobrImperator @@ -182,32 +80,23 @@ [@mansona]: https://github.com/mansona [@marcoow]: https://github.com/marcoow [@oscard0m]: https://github.com/oscard0m -[dazzlingfugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source +[dazzlingfugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source [dimforge/rapier.rs]: https://github.com/dimforge/rapier.rs [ef4/ember-auto-import]: https://github.com/ef4/ember-auto-import -[ember-cli/babel-plugin-htmlbars-inline-precompile]: - https://github.com/ember-cli/babel-plugin-htmlbars-inline-precompile +[ember-cli/babel-plugin-htmlbars-inline-precompile]: https://github.com/ember-cli/babel-plugin-htmlbars-inline-precompile [ember-cli/ember-try]: https://github.com/ember-cli/ember-try [ember-learn/ember-styleguide]: https://github.com/ember-learn/ember-styleguide -[ember-learn/empress-blog-ember-template]: - https://github.com/ember-learn/empress-blog-ember-template -[emberjs/babel-plugin-ember-template-compilation]: - https://github.com/emberjs/babel-plugin-ember-template-compilation +[ember-learn/empress-blog-ember-template]: https://github.com/ember-learn/empress-blog-ember-template +[emberjs/babel-plugin-ember-template-compilation]: https://github.com/emberjs/babel-plugin-ember-template-compilation [emberjs/core-notes]: https://github.com/emberjs/core-notes [empress/bottled-ember]: https://github.com/empress/bottled-ember -[freecodecamp/learn-bash-by-building-a-boilerplate]: - https://github.com/freeCodeCamp/learn-bash-by-building-a-boilerplate -[kategengler/ember-cli-code-coverage]: - https://github.com/kategengler/ember-cli-code-coverage +[freecodecamp/learn-bash-by-building-a-boilerplate]: https://github.com/freeCodeCamp/learn-bash-by-building-a-boilerplate +[kategengler/ember-cli-code-coverage]: https://github.com/kategengler/ember-cli-code-coverage [mainmatter/compare-fixture]: https://github.com/mainmatter/compare-fixture -[mainmatter/ember-asset-size-action]: - https://github.com/mainmatter/ember-asset-size-action +[mainmatter/ember-asset-size-action]: https://github.com/mainmatter/ember-asset-size-action [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth -[mainmatter/mainmatter-website-mailer]: - https://github.com/mainmatter/mainmatter-website-mailer +[mainmatter/mainmatter-website-mailer]: https://github.com/mainmatter/mainmatter-website-mailer [mainmatter/mocha-diff]: https://github.com/mainmatter/mocha-diff [mainmatter/renovate-config]: https://github.com/mainmatter/renovate-config [marcoow/rust_rest]: https://github.com/marcoow/rust_rest -[oscard0m/octoherd-script-release-workflow-patch]: - https://github.com/oscard0m/octoherd-script-release-workflow-patch +[oscard0m/octoherd-script-release-workflow-patch]: https://github.com/oscard0m/octoherd-script-release-workflow-patch diff --git a/src/twios/2023-04-18.md b/src/twios/2023-04-18.md index 01f02619df..554a5ead7f 100644 --- a/src/twios/2023-04-18.md +++ b/src/twios/2023-04-18.md @@ -1,117 +1,53 @@ ## Octoherd -- [octoherd/.github] [#8](https://github.com/octoherd/.github/pull/8) - feat(renovate-config): automerge lockFileMaintenance changes ([@oscard0m]) +- [octoherd/.github] [#8](https://github.com/octoherd/.github/pull/8) feat(renovate-config): automerge lockFileMaintenance changes ([@oscard0m]) ## Ember.js -- [DazzlingFugu/ember-fr-guides-source] - [#168](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/168) Fix - build ([@mansona]) -- [DazzlingFugu/ember-fr-guides-source] - [#174](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/174) Update - remark/retext packages ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#173](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/173) Spell - linter ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#171](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/171) Apply - modifications for 4.11 guides ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#170](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/170) - Translate guides/release/applications/index.md ([@BlueCutOfficial]) -- [ember-learn/ember-styleguide] - [#458](https://github.com/ember-learn/ember-styleguide/pull/458) add - @ember/string to ember-try beta and canary ([@mansona]) -- [ember-learn/ember-styleguide] - [#453](https://github.com/ember-learn/ember-styleguide/pull/453) fix - progress-bar transition aborted ([@mansona]) -- [ember-learn/guides-source] - [#1909](https://github.com/ember-learn/guides-source/pull/1909) update percy - and update to Node 14 ([@mansona]) -- [ember-learn/super-rentals-tutorial] - [#226](https://github.com/ember-learn/super-rentals-tutorial/pull/226) update - node version to 16 for ember-beta ([@mansona]) -- [emberjs/babel-plugin-ember-template-compilation] - [#19](https://github.com/emberjs/babel-plugin-ember-template-compilation/pull/19) - Replace Identifier only if key and value are different in the scope - ([@candunaj]) -- [emberjs/core-notes] [#494](https://github.com/emberjs/core-notes/pull/494) - add notes for embroider meeting 11th April ([@mansona]) -- [emberjs/core-notes] [#493](https://github.com/emberjs/core-notes/pull/493) - add embroider notes for 4th April ([@mansona]) -- [emberjs/core-notes] [#492](https://github.com/emberjs/core-notes/pull/492) - add notes for learning meeting Apr 3rd ([@mansona]) -- [emberjs/core-notes] [#491](https://github.com/emberjs/core-notes/pull/491) - add notes for embroider 28th March ([@mansona]) -- [emberobserver/eslint-plugin-ember-observer] - [#2](https://github.com/emberobserver/eslint-plugin-ember-observer/pull/2) Add - has-maybe-embroider rule ([@mansona]) -- [emberobserver/eslint-plugin-ember-observer] - [#1](https://github.com/emberobserver/eslint-plugin-ember-observer/pull/1) - Copy rules from eslint-plugin-ember fork ([@mansona]) -- [emberobserver/server] - [#123](https://github.com/emberobserver/server/pull/123) add - has-maybe-embroider lint ([@mansona]) -- [emberobserver/server] - [#122](https://github.com/emberobserver/server/pull/122) move ember-observer - lint rules to new plugin ([@mansona]) -- [emberobserver/server] - [#121](https://github.com/emberobserver/server/pull/121) Update ruby and ffi - gem to support M1 macs ([@mansona]) -- [mainmatter/ember-cookies] - [#783](https://github.com/mainmatter/ember-cookies/pull/783) chore: remove - .bowerrc ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#782](https://github.com/mainmatter/ember-cookies/pull/782) feat: import - @ember/polyfills assign conditionally ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2538](https://github.com/mainmatter/ember-simple-auth/pull/2538) feat: - import @ember/polyfills assign conditionally ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2537](https://github.com/mainmatter/ember-simple-auth/pull/2537) - chore(deps): remove ember-export-application-global ([@BobrImperator]) -- [nickschot/ember-gesture-modifiers] - [#432](https://github.com/nickschot/ember-gesture-modifiers/pull/432) Add - ember v5 support ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#647](https://github.com/nickschot/ember-mobile-menu/pull/647) Allow - ember-beta and ember-canary to fail ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#633](https://github.com/nickschot/ember-mobile-menu/pull/633) Set correct - supported ember-source as peerDependency ([@nickschot]) -- [qonto/ember-lottie] [#63](https://github.com/qonto/ember-lottie/pull/63) - Convert to v2 addon format ([@nickschot]) +- [DazzlingFugu/ember-fr-guides-source] [#168](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/168) Fix build ([@mansona]) +- [DazzlingFugu/ember-fr-guides-source] [#174](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/174) Update remark/retext packages ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#173](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/173) Spell linter ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#171](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/171) Apply modifications for 4.11 guides ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#170](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/170) Translate guides/release/applications/index.md ([@BlueCutOfficial]) +- [ember-learn/ember-styleguide] [#458](https://github.com/ember-learn/ember-styleguide/pull/458) add @ember/string to ember-try beta and canary ([@mansona]) +- [ember-learn/ember-styleguide] [#453](https://github.com/ember-learn/ember-styleguide/pull/453) fix progress-bar transition aborted ([@mansona]) +- [ember-learn/guides-source] [#1909](https://github.com/ember-learn/guides-source/pull/1909) update percy and update to Node 14 ([@mansona]) +- [ember-learn/super-rentals-tutorial] [#226](https://github.com/ember-learn/super-rentals-tutorial/pull/226) update node version to 16 for ember-beta ([@mansona]) +- [emberjs/babel-plugin-ember-template-compilation] [#19](https://github.com/emberjs/babel-plugin-ember-template-compilation/pull/19) Replace Identifier only if key and value are different in the scope ([@candunaj]) +- [emberjs/core-notes] [#494](https://github.com/emberjs/core-notes/pull/494) add notes for embroider meeting 11th April ([@mansona]) +- [emberjs/core-notes] [#493](https://github.com/emberjs/core-notes/pull/493) add embroider notes for 4th April ([@mansona]) +- [emberjs/core-notes] [#492](https://github.com/emberjs/core-notes/pull/492) add notes for learning meeting Apr 3rd ([@mansona]) +- [emberjs/core-notes] [#491](https://github.com/emberjs/core-notes/pull/491) add notes for embroider 28th March ([@mansona]) +- [emberobserver/eslint-plugin-ember-observer] [#2](https://github.com/emberobserver/eslint-plugin-ember-observer/pull/2) Add has-maybe-embroider rule ([@mansona]) +- [emberobserver/eslint-plugin-ember-observer] [#1](https://github.com/emberobserver/eslint-plugin-ember-observer/pull/1) Copy rules from eslint-plugin-ember fork ([@mansona]) +- [emberobserver/server] [#123](https://github.com/emberobserver/server/pull/123) add has-maybe-embroider lint ([@mansona]) +- [emberobserver/server] [#122](https://github.com/emberobserver/server/pull/122) move ember-observer lint rules to new plugin ([@mansona]) +- [emberobserver/server] [#121](https://github.com/emberobserver/server/pull/121) Update ruby and ffi gem to support M1 macs ([@mansona]) +- [mainmatter/ember-cookies] [#783](https://github.com/mainmatter/ember-cookies/pull/783) chore: remove .bowerrc ([@BobrImperator]) +- [mainmatter/ember-cookies] [#782](https://github.com/mainmatter/ember-cookies/pull/782) feat: import @ember/polyfills assign conditionally ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2538](https://github.com/mainmatter/ember-simple-auth/pull/2538) feat: import @ember/polyfills assign conditionally ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2537](https://github.com/mainmatter/ember-simple-auth/pull/2537) chore(deps): remove ember-export-application-global ([@BobrImperator]) +- [nickschot/ember-gesture-modifiers] [#432](https://github.com/nickschot/ember-gesture-modifiers/pull/432) Add ember v5 support ([@nickschot]) +- [nickschot/ember-mobile-menu] [#647](https://github.com/nickschot/ember-mobile-menu/pull/647) Allow ember-beta and ember-canary to fail ([@nickschot]) +- [nickschot/ember-mobile-menu] [#633](https://github.com/nickschot/ember-mobile-menu/pull/633) Set correct supported ember-source as peerDependency ([@nickschot]) +- [qonto/ember-lottie] [#63](https://github.com/qonto/ember-lottie/pull/63) Convert to v2 addon format ([@nickschot]) ## Embroider -- [embroider-build/embroider] - [#1393](https://github.com/embroider-build/embroider/pull/1393) continue - deploying unstable packages even with an error ([@mansona]) -- [embroider-build/embroider] - [#1389](https://github.com/embroider-build/embroider/pull/1389) bump unstable - versions by at least a patch ([@mansona]) +- [embroider-build/embroider] [#1393](https://github.com/embroider-build/embroider/pull/1393) continue deploying unstable packages even with an error ([@mansona]) +- [embroider-build/embroider] [#1389](https://github.com/embroider-build/embroider/pull/1389) bump unstable versions by at least a patch ([@mansona]) ## JavaScript -- [mainmatter/compare-fixture] - [#4](https://github.com/mainmatter/compare-fixture/pull/4) make it possible to - import this library ([@mansona]) -- [mansona/layer-gen] [#1](https://github.com/mansona/layer-gen/pull/1) Copy - basic implementation from ember-cli ([@mansona]) +- [mainmatter/compare-fixture] [#4](https://github.com/mainmatter/compare-fixture/pull/4) make it possible to import this library ([@mansona]) +- [mansona/layer-gen] [#1](https://github.com/mansona/layer-gen/pull/1) Copy basic implementation from ember-cli ([@mansona]) ## Octokit -- [octokit/app.js] [#405](https://github.com/octokit/app.js/pull/405) WIP - build(deps): upgrade @octokit/webhooks to 10.7.1 (next) ([@oscard0m]) -- [octokit/graphql-action] - [#207](https://github.com/octokit/graphql-action/pull/207) migrate zeit ncc to - vercel ncc ([@oscard0m]) -- [octokit/webhooks.js] [#833](https://github.com/octokit/webhooks.js/pull/833) - revert(typescript): new `pull_request.milestoned` and - `pull_request.demilestoned` events (#830)" ([@oscard0m]) -- [octokit/webhooks.js] [#829](https://github.com/octokit/webhooks.js/pull/829) - refactor(esbuild): wrap all the logic inside a plugin ([@oscard0m]) +- [octokit/app.js] [#405](https://github.com/octokit/app.js/pull/405) WIP build(deps): upgrade @octokit/webhooks to 10.7.1 (next) ([@oscard0m]) +- [octokit/graphql-action] [#207](https://github.com/octokit/graphql-action/pull/207) migrate zeit ncc to vercel ncc ([@oscard0m]) +- [octokit/webhooks.js] [#833](https://github.com/octokit/webhooks.js/pull/833) revert(typescript): new `pull_request.milestoned` and `pull_request.demilestoned` events (#830)" ([@oscard0m]) +- [octokit/webhooks.js] [#829](https://github.com/octokit/webhooks.js/pull/829) refactor(esbuild): wrap all the logic inside a plugin ([@oscard0m]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@bobrimperator]: https://github.com/BobrImperator @@ -119,25 +55,20 @@ [@mansona]: https://github.com/mansona [@nickschot]: https://github.com/nickschot [@oscard0m]: https://github.com/oscard0m -[dazzlingfugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source +[dazzlingfugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source [ember-learn/ember-styleguide]: https://github.com/ember-learn/ember-styleguide [ember-learn/guides-source]: https://github.com/ember-learn/guides-source -[ember-learn/super-rentals-tutorial]: - https://github.com/ember-learn/super-rentals-tutorial -[emberjs/babel-plugin-ember-template-compilation]: - https://github.com/emberjs/babel-plugin-ember-template-compilation +[ember-learn/super-rentals-tutorial]: https://github.com/ember-learn/super-rentals-tutorial +[emberjs/babel-plugin-ember-template-compilation]: https://github.com/emberjs/babel-plugin-ember-template-compilation [emberjs/core-notes]: https://github.com/emberjs/core-notes -[emberobserver/eslint-plugin-ember-observer]: - https://github.com/emberobserver/eslint-plugin-ember-observer +[emberobserver/eslint-plugin-ember-observer]: https://github.com/emberobserver/eslint-plugin-ember-observer [emberobserver/server]: https://github.com/emberobserver/server [embroider-build/embroider]: https://github.com/embroider-build/embroider [mainmatter/compare-fixture]: https://github.com/mainmatter/compare-fixture [mainmatter/ember-cookies]: https://github.com/mainmatter/ember-cookies [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth [mansona/layer-gen]: https://github.com/mansona/layer-gen -[nickschot/ember-gesture-modifiers]: - https://github.com/nickschot/ember-gesture-modifiers +[nickschot/ember-gesture-modifiers]: https://github.com/nickschot/ember-gesture-modifiers [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu [octoherd/.github]: https://github.com/octoherd/.github [octokit/app.js]: https://github.com/octokit/app.js diff --git a/src/twios/2023-05-05.md b/src/twios/2023-05-05.md index caf0efa398..c88399d675 100644 --- a/src/twios/2023-05-05.md +++ b/src/twios/2023-05-05.md @@ -1,103 +1,50 @@ ## Ember.js -- [BlueCutOfficial/ember-is-component] - [#2](https://github.com/BlueCutOfficial/ember-is-component/pull/2) build: - release version 1.0.0 ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#189](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/189) Footer - customization ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#188](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/188) Fix a - typo in guides/index.md ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#187](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/187) - Configure pencil ([@BlueCutOfficial]) -- [DazzlingFugu/ember-reading-time] - [#118](https://github.com/DazzlingFugu/ember-reading-time/pull/118) Release - version 3.0.0 ([@BlueCutOfficial]) -- [DazzlingFugu/ember-slugify] - [#278](https://github.com/DazzlingFugu/ember-slugify/pull/278) Release version - 5.0.0 ([@BlueCutOfficial]) -- [DazzlingFugu/guidemaker-ember-locale-template] - [#2](https://github.com/DazzlingFugu/guidemaker-ember-locale-template/pull/2) - Footer customization ([@BlueCutOfficial]) -- [DockYard/ember-in-viewport] - [#323](https://github.com/DockYard/ember-in-viewport/pull/323) Upgrade - ember-in-viewport to V2 addon ([@candunaj]) -- [ember-fastboot/ember-cli-fastboot] - [#918](https://github.com/ember-fastboot/ember-cli-fastboot/pull/918) add - fail-fast: false to all CI sections ([@mansona]) -- [ember-fastboot/ember-cli-fastboot] - [#917](https://github.com/ember-fastboot/ember-cli-fastboot/pull/917) move to - pnpm ([@mansona]) -- [ember-fastboot/ember-cli-fastboot] - [#915](https://github.com/ember-fastboot/ember-cli-fastboot/pull/915) Update - ember to 3.28 with ember-cli-update ([@mansona]) -- [ember-learn/ember-api-docs-data] - [#7](https://github.com/ember-learn/ember-api-docs-data/pull/7) Add a CI - workflow and fix files ([@mansona]) -- [ember-learn/ember-api-docs-data] - [#6](https://github.com/ember-learn/ember-api-docs-data/pull/6) remove upload - to S3 workflow ([@mansona]) -- [ember-learn/ember-website] - [#1025](https://github.com/ember-learn/ember-website/pull/1025) add embroider - team to the teams page ([@mansona]) -- [mainmatter/ember-promise-modals] - [#857](https://github.com/mainmatter/ember-promise-modals/pull/857) Set - production rootURL to / ([@zeppelin]) -- [mainmatter/ember-simple-auth] - [#2557](https://github.com/mainmatter/ember-simple-auth/pull/2557) - chore(tests): remove fastboot setup from classic-test-app ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2556](https://github.com/mainmatter/ember-simple-auth/pull/2556) chore(ci): - fix removed tests step from workflow ([@BobrImperator]) +- [BlueCutOfficial/ember-is-component] [#2](https://github.com/BlueCutOfficial/ember-is-component/pull/2) build: release version 1.0.0 ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#189](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/189) Footer customization ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#188](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/188) Fix a typo in guides/index.md ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#187](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/187) Configure pencil ([@BlueCutOfficial]) +- [DazzlingFugu/ember-reading-time] [#118](https://github.com/DazzlingFugu/ember-reading-time/pull/118) Release version 3.0.0 ([@BlueCutOfficial]) +- [DazzlingFugu/ember-slugify] [#278](https://github.com/DazzlingFugu/ember-slugify/pull/278) Release version 5.0.0 ([@BlueCutOfficial]) +- [DazzlingFugu/guidemaker-ember-locale-template] [#2](https://github.com/DazzlingFugu/guidemaker-ember-locale-template/pull/2) Footer customization ([@BlueCutOfficial]) +- [DockYard/ember-in-viewport] [#323](https://github.com/DockYard/ember-in-viewport/pull/323) Upgrade ember-in-viewport to V2 addon ([@candunaj]) +- [ember-fastboot/ember-cli-fastboot] [#918](https://github.com/ember-fastboot/ember-cli-fastboot/pull/918) add fail-fast: false to all CI sections ([@mansona]) +- [ember-fastboot/ember-cli-fastboot] [#917](https://github.com/ember-fastboot/ember-cli-fastboot/pull/917) move to pnpm ([@mansona]) +- [ember-fastboot/ember-cli-fastboot] [#915](https://github.com/ember-fastboot/ember-cli-fastboot/pull/915) Update ember to 3.28 with ember-cli-update ([@mansona]) +- [ember-learn/ember-api-docs-data] [#7](https://github.com/ember-learn/ember-api-docs-data/pull/7) Add a CI workflow and fix files ([@mansona]) +- [ember-learn/ember-api-docs-data] [#6](https://github.com/ember-learn/ember-api-docs-data/pull/6) remove upload to S3 workflow ([@mansona]) +- [ember-learn/ember-website] [#1025](https://github.com/ember-learn/ember-website/pull/1025) add embroider team to the teams page ([@mansona]) +- [mainmatter/ember-promise-modals] [#857](https://github.com/mainmatter/ember-promise-modals/pull/857) Set production rootURL to / ([@zeppelin]) +- [mainmatter/ember-simple-auth] [#2557](https://github.com/mainmatter/ember-simple-auth/pull/2557) chore(tests): remove fastboot setup from classic-test-app ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2556](https://github.com/mainmatter/ember-simple-auth/pull/2556) chore(ci): fix removed tests step from workflow ([@BobrImperator]) ## Embroider -- [embroider-build/embroider] - [#1448](https://github.com/embroider-build/embroider/pull/1448) Add the - ability to customise rollup-plugin-clean's config ([@mansona]) -- [embroider-build/embroider] - [#1447](https://github.com/embroider-build/embroider/pull/1447) fix keepAssets - corrupting image files ([@mansona]) -- [embroider-build/embroider] - [#1446](https://github.com/embroider-build/embroider/pull/1446) Revert "Run - the clean plugin of addon-dev as late as possible" ([@mansona]) -- [embroider-build/embroider] - [#1436](https://github.com/embroider-build/embroider/pull/1436) prevent double - ^ when using embroider test-setup ([@mansona]) -- [embroider-build/embroider] - [#1415](https://github.com/embroider-build/embroider/pull/1415) fix casing in - docs links ([@mansona]) +- [embroider-build/embroider] [#1448](https://github.com/embroider-build/embroider/pull/1448) Add the ability to customise rollup-plugin-clean's config ([@mansona]) +- [embroider-build/embroider] [#1447](https://github.com/embroider-build/embroider/pull/1447) fix keepAssets corrupting image files ([@mansona]) +- [embroider-build/embroider] [#1446](https://github.com/embroider-build/embroider/pull/1446) Revert "Run the clean plugin of addon-dev as late as possible" ([@mansona]) +- [embroider-build/embroider] [#1436](https://github.com/embroider-build/embroider/pull/1436) prevent double ^ when using embroider test-setup ([@mansona]) +- [embroider-build/embroider] [#1415](https://github.com/embroider-build/embroider/pull/1415) fix casing in docs links ([@mansona]) ## JavaScript -- [timdp/rollup-timer] [#39](https://github.com/timdp/rollup-timer/pull/39) The - rollup plugin hook can be specified as an object instead of a function - ([@candunaj]) +- [timdp/rollup-timer] [#39](https://github.com/timdp/rollup-timer/pull/39) The rollup plugin hook can be specified as an object instead of a function ([@candunaj]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@bobrimperator]: https://github.com/BobrImperator [@candunaj]: https://github.com/candunaj [@mansona]: https://github.com/mansona [@zeppelin]: https://github.com/zeppelin -[bluecutofficial/ember-is-component]: - https://github.com/BlueCutOfficial/ember-is-component -[dazzlingfugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source -[dazzlingfugu/ember-reading-time]: - https://github.com/DazzlingFugu/ember-reading-time +[bluecutofficial/ember-is-component]: https://github.com/BlueCutOfficial/ember-is-component +[dazzlingfugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source +[dazzlingfugu/ember-reading-time]: https://github.com/DazzlingFugu/ember-reading-time [dazzlingfugu/ember-slugify]: https://github.com/DazzlingFugu/ember-slugify -[dazzlingfugu/guidemaker-ember-locale-template]: - https://github.com/DazzlingFugu/guidemaker-ember-locale-template +[dazzlingfugu/guidemaker-ember-locale-template]: https://github.com/DazzlingFugu/guidemaker-ember-locale-template [dockyard/ember-in-viewport]: https://github.com/DockYard/ember-in-viewport -[ember-fastboot/ember-cli-fastboot]: - https://github.com/ember-fastboot/ember-cli-fastboot -[ember-learn/ember-api-docs-data]: - https://github.com/ember-learn/ember-api-docs-data +[ember-fastboot/ember-cli-fastboot]: https://github.com/ember-fastboot/ember-cli-fastboot +[ember-learn/ember-api-docs-data]: https://github.com/ember-learn/ember-api-docs-data [ember-learn/ember-website]: https://github.com/ember-learn/ember-website [embroider-build/embroider]: https://github.com/embroider-build/embroider -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth [timdp/rollup-timer]: https://github.com/timdp/rollup-timer diff --git a/src/twios/2023-05-09.md b/src/twios/2023-05-09.md index 3748e22ea7..cfdf5ee007 100644 --- a/src/twios/2023-05-09.md +++ b/src/twios/2023-05-09.md @@ -1,135 +1,55 @@ ## Ember.js -- [DazzlingFugu/ember-cli-embedded] - [#257](https://github.com/DazzlingFugu/ember-cli-embedded/pull/257) BREAKING - Build/ Drop support for Ember 3.20 and 3.24 ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#184](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/184) Lint - forgotten files ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#183](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/183) - Translate/ guides/release/getting-started/working-with-html-css-js - ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#178](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/178) Share - pre-commit hook warning about missing file to lint ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#176](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/176) - Translate guides/release/getting-started/index.md ([@BlueCutOfficial]) -- [adopted-ember-addons/ember-collapsible-panel] - [#126](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/126) - Update Ember using ember-cli-update ([@mansona]) -- [adopted-ember-addons/ember-collapsible-panel] - [#123](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/123) - Update embroider dependencies ([@mansona]) -- [adopted-ember-addons/ember-collapsible-panel] - [#122](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/122) - breaking: drop support for node 12 ([@mansona]) -- [adopted-ember-addons/ember-collapsible-panel] - [#121](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/121) - remove ember-cli-sass from dummy app ([@mansona]) -- [ember-learn/ember-api-docs] - [#861](https://github.com/ember-learn/ember-api-docs/pull/861) skip tests that - are broken because of invalid data in production ([@mansona]) -- [ember-learn/ember-api-docs] - [#860](https://github.com/ember-learn/ember-api-docs/pull/860) update to 3.28 - with ember-cli-update ([@mansona]) -- [ember-learn/ember-api-docs-data] - [#5](https://github.com/ember-learn/ember-api-docs-data/pull/5) Fix files - ([@mansona]) -- [ember-learn/ember-help-wanted-server] - [#53](https://github.com/ember-learn/ember-help-wanted-server/pull/53) swap to - npm and update node ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#138](https://github.com/ember-learn/guidemaker-ember-template/pull/138) move - ember-beta to allow-to-fail group ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#133](https://github.com/ember-learn/guidemaker-ember-template/pull/133) - Update Ember ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#132](https://github.com/ember-learn/guidemaker-ember-template/pull/132) - Update styleguide ([@mansona]) -- [ember-learn/guides-source] - [#1914](https://github.com/ember-learn/guides-source/pull/1914) update to - v3.28 with ember-cli-update ([@mansona]) -- [ember-learn/guides-source] - [#1913](https://github.com/ember-learn/guides-source/pull/1913) Update - working-with-html-css-and-javascript.md ([@BlueCutOfficial]) -- [ember-learn/upgrade-guide] - [#116](https://github.com/ember-learn/upgrade-guide/pull/116) Update - Upgrade-guide to give info up to 4.12 ([@Mikek2252]) -- [embroider-build/addon-blueprint] - [#113](https://github.com/embroider-build/addon-blueprint/pull/113) Include - @babel/runtime in addon devDependencies to fix babel decorator helper - transpilation ([@nickschot]) -- [mainmatter/ember-cookies] - [#798](https://github.com/mainmatter/ember-cookies/pull/798) chore(release): - ember-cookies v1.0.0 ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#797](https://github.com/mainmatter/ember-cookies/pull/797) feat(breaking): - drop Ember v3 versions ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#796](https://github.com/mainmatter/ember-cookies/pull/796) chore(ci): don't - halt jobs on failure ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#795](https://github.com/mainmatter/ember-cookies/pull/795) feat(breaking): - replace polyfills assign with Object.assign ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#793](https://github.com/mainmatter/ember-cookies/pull/793) chore: remove - dead chai dependencies ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#790](https://github.com/mainmatter/ember-cookies/pull/790) chore: remove - ember-export-application-global ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#788](https://github.com/mainmatter/ember-cookies/pull/788) chore: add - @ember/string to the test-app ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#787](https://github.com/mainmatter/ember-cookies/pull/787) chore: run - ember-default scenario in CI ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#786](https://github.com/mainmatter/ember-cookies/pull/786) chore: add crypto - and node-fetch to fastbootDependencies ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#785](https://github.com/mainmatter/ember-cookies/pull/785) chore: Drop - node - set minimal node version to >=16 ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2552](https://github.com/mainmatter/ember-simple-auth/pull/2552) chore(ci): - setup mainmatter/continue-on-error-comment action ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2548](https://github.com/mainmatter/ember-simple-auth/pull/2548) - refactor(deprecation): use findRecord instead of find ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2546](https://github.com/mainmatter/ember-simple-auth/pull/2546) - chore(deps): bump ember-cookies to v1.0.0 ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2545](https://github.com/mainmatter/ember-simple-auth/pull/2545) chore: - install @ember/string in packages directly ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2544](https://github.com/mainmatter/ember-simple-auth/pull/2544) - feat(breaking): drop ember < v3.28 and IE11 support ([@BobrImperator]) +- [DazzlingFugu/ember-cli-embedded] [#257](https://github.com/DazzlingFugu/ember-cli-embedded/pull/257) BREAKING Build/ Drop support for Ember 3.20 and 3.24 ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#184](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/184) Lint forgotten files ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#183](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/183) Translate/ guides/release/getting-started/working-with-html-css-js ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#178](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/178) Share pre-commit hook warning about missing file to lint ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#176](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/176) Translate guides/release/getting-started/index.md ([@BlueCutOfficial]) +- [adopted-ember-addons/ember-collapsible-panel] [#126](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/126) Update Ember using ember-cli-update ([@mansona]) +- [adopted-ember-addons/ember-collapsible-panel] [#123](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/123) Update embroider dependencies ([@mansona]) +- [adopted-ember-addons/ember-collapsible-panel] [#122](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/122) breaking: drop support for node 12 ([@mansona]) +- [adopted-ember-addons/ember-collapsible-panel] [#121](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/121) remove ember-cli-sass from dummy app ([@mansona]) +- [ember-learn/ember-api-docs] [#861](https://github.com/ember-learn/ember-api-docs/pull/861) skip tests that are broken because of invalid data in production ([@mansona]) +- [ember-learn/ember-api-docs] [#860](https://github.com/ember-learn/ember-api-docs/pull/860) update to 3.28 with ember-cli-update ([@mansona]) +- [ember-learn/ember-api-docs-data] [#5](https://github.com/ember-learn/ember-api-docs-data/pull/5) Fix files ([@mansona]) +- [ember-learn/ember-help-wanted-server] [#53](https://github.com/ember-learn/ember-help-wanted-server/pull/53) swap to npm and update node ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#138](https://github.com/ember-learn/guidemaker-ember-template/pull/138) move ember-beta to allow-to-fail group ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#133](https://github.com/ember-learn/guidemaker-ember-template/pull/133) Update Ember ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#132](https://github.com/ember-learn/guidemaker-ember-template/pull/132) Update styleguide ([@mansona]) +- [ember-learn/guides-source] [#1914](https://github.com/ember-learn/guides-source/pull/1914) update to v3.28 with ember-cli-update ([@mansona]) +- [ember-learn/guides-source] [#1913](https://github.com/ember-learn/guides-source/pull/1913) Update working-with-html-css-and-javascript.md ([@BlueCutOfficial]) +- [ember-learn/upgrade-guide] [#116](https://github.com/ember-learn/upgrade-guide/pull/116) Update Upgrade-guide to give info up to 4.12 ([@Mikek2252]) +- [embroider-build/addon-blueprint] [#113](https://github.com/embroider-build/addon-blueprint/pull/113) Include @babel/runtime in addon devDependencies to fix babel decorator helper transpilation ([@nickschot]) +- [mainmatter/ember-cookies] [#798](https://github.com/mainmatter/ember-cookies/pull/798) chore(release): ember-cookies v1.0.0 ([@BobrImperator]) +- [mainmatter/ember-cookies] [#797](https://github.com/mainmatter/ember-cookies/pull/797) feat(breaking): drop Ember v3 versions ([@BobrImperator]) +- [mainmatter/ember-cookies] [#796](https://github.com/mainmatter/ember-cookies/pull/796) chore(ci): don't halt jobs on failure ([@BobrImperator]) +- [mainmatter/ember-cookies] [#795](https://github.com/mainmatter/ember-cookies/pull/795) feat(breaking): replace polyfills assign with Object.assign ([@BobrImperator]) +- [mainmatter/ember-cookies] [#793](https://github.com/mainmatter/ember-cookies/pull/793) chore: remove dead chai dependencies ([@BobrImperator]) +- [mainmatter/ember-cookies] [#790](https://github.com/mainmatter/ember-cookies/pull/790) chore: remove ember-export-application-global ([@BobrImperator]) +- [mainmatter/ember-cookies] [#788](https://github.com/mainmatter/ember-cookies/pull/788) chore: add @ember/string to the test-app ([@BobrImperator]) +- [mainmatter/ember-cookies] [#787](https://github.com/mainmatter/ember-cookies/pull/787) chore: run ember-default scenario in CI ([@BobrImperator]) +- [mainmatter/ember-cookies] [#786](https://github.com/mainmatter/ember-cookies/pull/786) chore: add crypto and node-fetch to fastbootDependencies ([@BobrImperator]) +- [mainmatter/ember-cookies] [#785](https://github.com/mainmatter/ember-cookies/pull/785) chore: Drop node - set minimal node version to >=16 ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2552](https://github.com/mainmatter/ember-simple-auth/pull/2552) chore(ci): setup mainmatter/continue-on-error-comment action ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2548](https://github.com/mainmatter/ember-simple-auth/pull/2548) refactor(deprecation): use findRecord instead of find ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2546](https://github.com/mainmatter/ember-simple-auth/pull/2546) chore(deps): bump ember-cookies to v1.0.0 ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2545](https://github.com/mainmatter/ember-simple-auth/pull/2545) chore: install @ember/string in packages directly ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2544](https://github.com/mainmatter/ember-simple-auth/pull/2544) feat(breaking): drop ember < v3.28 and IE11 support ([@BobrImperator]) ## Empress -- [empress/guidemaker] [#88](https://github.com/empress/guidemaker/pull/88) Add - ToC for each page ([@mansona]) -- [empress/guidemaker-default-template] - [#39](https://github.com/empress/guidemaker-default-template/pull/39) - Implement "on this page" ([@mansona]) +- [empress/guidemaker] [#88](https://github.com/empress/guidemaker/pull/88) Add ToC for each page ([@mansona]) +- [empress/guidemaker-default-template] [#39](https://github.com/empress/guidemaker-default-template/pull/39) Implement "on this page" ([@mansona]) ## JavaScript -- [mansona/layer-gen] [#2](https://github.com/mansona/layer-gen/pull/2) Extract - blueprints ([@mansona]) +- [mansona/layer-gen] [#2](https://github.com/mansona/layer-gen/pull/2) Extract blueprints ([@mansona]) ## Octokit -- [octokit/app.js] [#418](https://github.com/octokit/app.js/pull/418) - fix(build): add script to fix package json from build step ([@oscard0m]) -- [octokit/app.js] [#417](https://github.com/octokit/app.js/pull/417) add script - to fix package json from build step ([@oscard0m]) -- [octokit/oauth-app.js] - [#411](https://github.com/octokit/oauth-app.js/pull/411) fix(build): add - script to fix package json from build step ([@oscard0m]) +- [octokit/app.js] [#418](https://github.com/octokit/app.js/pull/418) fix(build): add script to fix package json from build step ([@oscard0m]) +- [octokit/app.js] [#417](https://github.com/octokit/app.js/pull/417) add script to fix package json from build step ([@oscard0m]) +- [octokit/oauth-app.js] [#411](https://github.com/octokit/oauth-app.js/pull/411) fix(build): add script to fix package json from build step ([@oscard0m]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@bobrimperator]: https://github.com/BobrImperator @@ -137,25 +57,17 @@ [@mansona]: https://github.com/mansona [@nickschot]: https://github.com/nickschot [@oscard0m]: https://github.com/oscard0m -[dazzlingfugu/ember-cli-embedded]: - https://github.com/DazzlingFugu/ember-cli-embedded -[dazzlingfugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source -[adopted-ember-addons/ember-collapsible-panel]: - https://github.com/adopted-ember-addons/ember-collapsible-panel -[ember-learn/ember-api-docs-data]: - https://github.com/ember-learn/ember-api-docs-data +[dazzlingfugu/ember-cli-embedded]: https://github.com/DazzlingFugu/ember-cli-embedded +[dazzlingfugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source +[adopted-ember-addons/ember-collapsible-panel]: https://github.com/adopted-ember-addons/ember-collapsible-panel +[ember-learn/ember-api-docs-data]: https://github.com/ember-learn/ember-api-docs-data [ember-learn/ember-api-docs]: https://github.com/ember-learn/ember-api-docs -[ember-learn/ember-help-wanted-server]: - https://github.com/ember-learn/ember-help-wanted-server -[ember-learn/guidemaker-ember-template]: - https://github.com/ember-learn/guidemaker-ember-template +[ember-learn/ember-help-wanted-server]: https://github.com/ember-learn/ember-help-wanted-server +[ember-learn/guidemaker-ember-template]: https://github.com/ember-learn/guidemaker-ember-template [ember-learn/guides-source]: https://github.com/ember-learn/guides-source [ember-learn/upgrade-guide]: https://github.com/ember-learn/upgrade-guide -[embroider-build/addon-blueprint]: - https://github.com/embroider-build/addon-blueprint -[empress/guidemaker-default-template]: - https://github.com/empress/guidemaker-default-template +[embroider-build/addon-blueprint]: https://github.com/embroider-build/addon-blueprint +[empress/guidemaker-default-template]: https://github.com/empress/guidemaker-default-template [empress/guidemaker]: https://github.com/empress/guidemaker [mainmatter/ember-cookies]: https://github.com/mainmatter/ember-cookies [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth diff --git a/src/twios/2023-05-29.md b/src/twios/2023-05-29.md index ec83c8f340..8a68799760 100644 --- a/src/twios/2023-05-29.md +++ b/src/twios/2023-05-29.md @@ -1,130 +1,64 @@ ## Ember.js -- [DazzlingFugu/ember-fr-guides-source] - [#191](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/191) feat: - translate guides/services/index.md ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#190](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/190) Setup - header ([@BlueCutOfficial]) -- [DazzlingFugu/guidemaker-ember-locale-template] - [#4](https://github.com/DazzlingFugu/guidemaker-ember-locale-template/pull/4) - Fix/ Header padding ([@BlueCutOfficial]) -- [DazzlingFugu/guidemaker-ember-locale-template] - [#3](https://github.com/DazzlingFugu/guidemaker-ember-locale-template/pull/3) - Header customization ([@BlueCutOfficial]) -- [ember-fastboot/ember-cli-fastboot] - [#920](https://github.com/ember-fastboot/ember-cli-fastboot/pull/920) Add - Linting to CI ([@mansona]) -- [ember-learn/deprecation-app] - [#1328](https://github.com/ember-learn/deprecation-app/pull/1328) update percy - ([@mansona]) -- [ember-learn/ember-website] - [#1034](https://github.com/ember-learn/ember-website/pull/1034) WIP Initiative - ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#148](https://github.com/ember-learn/guidemaker-ember-template/pull/148) - clean up the info-banner component ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#147](https://github.com/ember-learn/guidemaker-ember-template/pull/147) - clean up search dropdown-header component ([@mansona]) -- [ember-learn/guides-source] - [#1927](https://github.com/ember-learn/guides-source/pull/1927) 5.0 Release - ([@mansona]) -- [emberjs/ember.js] [#20466](https://github.com/emberjs/ember.js/pull/20466) - Backport "Fix cyclic module crash" to 4.8 LTS ([@mansona]) -- [mainmatter/ember-promise-modals] - [#859](https://github.com/mainmatter/ember-promise-modals/pull/859) Fix - lerna-changelog plugin name ([@zeppelin]) -- [mainmatter/ember-promise-modals] - [#858](https://github.com/mainmatter/ember-promise-modals/pull/858) Fix CI - tests for beta/canary channels ([@zeppelin]) -- [miguelcobain/ember-paper] - [#1246](https://github.com/miguelcobain/ember-paper/pull/1246) add - ember-cli-deprecation-workflow ([@mansona]) -- [miguelcobain/ember-paper] - [#1245](https://github.com/miguelcobain/ember-paper/pull/1245) add - continue-on-error-comment ([@mansona]) -- [ember-fastboot/ember-cli-head] - [#107](https://github.com/ember-fastboot/ember-cli-head/pull/107) update to - v4.12 with ember-cli-update ([@mansona]) -- [ember-fastboot/ember-cli-head] - [#105](https://github.com/ember-fastboot/ember-cli-head/pull/105) update - ember-auto-import devDependency to v2 ([@mansona]) -- [ember-fastboot/ember-cli-head] - [#100](https://github.com/ember-fastboot/ember-cli-head/pull/100) unify CI - with the default output of ember addon ([@mansona]) -- [ember-learn/cli-guides] - [#287](https://github.com/ember-learn/cli-guides/pull/287) update to v3.28 - with ember-cli-update and update to latest template ([@mansona]) +- [DazzlingFugu/ember-fr-guides-source] [#191](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/191) feat: translate guides/services/index.md ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#190](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/190) Setup header ([@BlueCutOfficial]) +- [DazzlingFugu/guidemaker-ember-locale-template] [#4](https://github.com/DazzlingFugu/guidemaker-ember-locale-template/pull/4) Fix/ Header padding ([@BlueCutOfficial]) +- [DazzlingFugu/guidemaker-ember-locale-template] [#3](https://github.com/DazzlingFugu/guidemaker-ember-locale-template/pull/3) Header customization ([@BlueCutOfficial]) +- [ember-fastboot/ember-cli-fastboot] [#920](https://github.com/ember-fastboot/ember-cli-fastboot/pull/920) Add Linting to CI ([@mansona]) +- [ember-learn/deprecation-app] [#1328](https://github.com/ember-learn/deprecation-app/pull/1328) update percy ([@mansona]) +- [ember-learn/ember-website] [#1034](https://github.com/ember-learn/ember-website/pull/1034) WIP Initiative ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#148](https://github.com/ember-learn/guidemaker-ember-template/pull/148) clean up the info-banner component ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#147](https://github.com/ember-learn/guidemaker-ember-template/pull/147) clean up search dropdown-header component ([@mansona]) +- [ember-learn/guides-source] [#1927](https://github.com/ember-learn/guides-source/pull/1927) 5.0 Release ([@mansona]) +- [emberjs/ember.js] [#20466](https://github.com/emberjs/ember.js/pull/20466) Backport "Fix cyclic module crash" to 4.8 LTS ([@mansona]) +- [mainmatter/ember-promise-modals] [#859](https://github.com/mainmatter/ember-promise-modals/pull/859) Fix lerna-changelog plugin name ([@zeppelin]) +- [mainmatter/ember-promise-modals] [#858](https://github.com/mainmatter/ember-promise-modals/pull/858) Fix CI tests for beta/canary channels ([@zeppelin]) +- [miguelcobain/ember-paper] [#1246](https://github.com/miguelcobain/ember-paper/pull/1246) add ember-cli-deprecation-workflow ([@mansona]) +- [miguelcobain/ember-paper] [#1245](https://github.com/miguelcobain/ember-paper/pull/1245) add continue-on-error-comment ([@mansona]) +- [ember-fastboot/ember-cli-head] [#107](https://github.com/ember-fastboot/ember-cli-head/pull/107) update to v4.12 with ember-cli-update ([@mansona]) +- [ember-fastboot/ember-cli-head] [#105](https://github.com/ember-fastboot/ember-cli-head/pull/105) update ember-auto-import devDependency to v2 ([@mansona]) +- [ember-fastboot/ember-cli-head] [#100](https://github.com/ember-fastboot/ember-cli-head/pull/100) unify CI with the default output of ember addon ([@mansona]) +- [ember-learn/cli-guides] [#287](https://github.com/ember-learn/cli-guides/pull/287) update to v3.28 with ember-cli-update and update to latest template ([@mansona]) ## Embroider -- [embroider-build/embroider] - [#1471](https://github.com/embroider-build/embroider/pull/1471) use - @swc/register instead of ts-node for tests ([@mansona]) -- [embroider-build/embroider] - [#1469](https://github.com/embroider-build/embroider/pull/1469) update - deprecated (and removed) blacklist config in test app ([@mansona]) -- [embroider-build/embroider] - [#1467](https://github.com/embroider-build/embroider/pull/1467) WIP do - ember-release tests on latest node version ([@mansona]) -- [embroider-build/embroider] - [#1453](https://github.com/embroider-build/embroider/pull/1453) WIP use ESM - only scenario-tester version ([@mansona]) +- [embroider-build/embroider] [#1471](https://github.com/embroider-build/embroider/pull/1471) use @swc/register instead of ts-node for tests ([@mansona]) +- [embroider-build/embroider] [#1469](https://github.com/embroider-build/embroider/pull/1469) update deprecated (and removed) blacklist config in test app ([@mansona]) +- [embroider-build/embroider] [#1467](https://github.com/embroider-build/embroider/pull/1467) WIP do ember-release tests on latest node version ([@mansona]) +- [embroider-build/embroider] [#1453](https://github.com/embroider-build/embroider/pull/1453) WIP use ESM only scenario-tester version ([@mansona]) ## Empress -- [empress/guidemaker] [#91](https://github.com/empress/guidemaker/pull/91) - update to v4.4 with ember-cli-update ([@mansona]) -- [empress/guidemaker] [#90](https://github.com/empress/guidemaker/pull/90) - Refactor guidemaker service to accept any config field ([@BlueCutOfficial]) -- [empress/guidemaker-default-template] - [#46](https://github.com/empress/guidemaker-default-template/pull/46) stop - embroider tests being "allowed to fail" ([@mansona]) -- [empress/guidemaker-default-template] - [#45](https://github.com/empress/guidemaker-default-template/pull/45) fix - ember-source peer ([@mansona]) -- [empress/guidemaker-default-template] - [#44](https://github.com/empress/guidemaker-default-template/pull/44) - breaking: drop support for node 14 ([@mansona]) -- [empress/guidemaker-default-template] - [#43](https://github.com/empress/guidemaker-default-template/pull/43) update - to v4.12 with ember-cli-update ([@mansona]) -- [empress/guidemaker-default-template] - [#42](https://github.com/empress/guidemaker-default-template/pull/42) update - ember-collapsible-panel ([@mansona]) +- [empress/guidemaker] [#91](https://github.com/empress/guidemaker/pull/91) update to v4.4 with ember-cli-update ([@mansona]) +- [empress/guidemaker] [#90](https://github.com/empress/guidemaker/pull/90) Refactor guidemaker service to accept any config field ([@BlueCutOfficial]) +- [empress/guidemaker-default-template] [#46](https://github.com/empress/guidemaker-default-template/pull/46) stop embroider tests being "allowed to fail" ([@mansona]) +- [empress/guidemaker-default-template] [#45](https://github.com/empress/guidemaker-default-template/pull/45) fix ember-source peer ([@mansona]) +- [empress/guidemaker-default-template] [#44](https://github.com/empress/guidemaker-default-template/pull/44) breaking: drop support for node 14 ([@mansona]) +- [empress/guidemaker-default-template] [#43](https://github.com/empress/guidemaker-default-template/pull/43) update to v4.12 with ember-cli-update ([@mansona]) +- [empress/guidemaker-default-template] [#42](https://github.com/empress/guidemaker-default-template/pull/42) update ember-collapsible-panel ([@mansona]) ## Octokit -- [octokit/openapi] [#365](https://github.com/octokit/openapi/pull/365) - refactor(scripts): migrate scripts to ESM ([@oscard0m]) -- [octokit/openapi] [#364](https://github.com/octokit/openapi/pull/364) - feat(git-lfs): use Git LFS for /cache and /generated folders ([@oscard0m]) +- [octokit/openapi] [#365](https://github.com/octokit/openapi/pull/365) refactor(scripts): migrate scripts to ESM ([@oscard0m]) +- [octokit/openapi] [#364](https://github.com/octokit/openapi/pull/364) feat(git-lfs): use Git LFS for /cache and /generated folders ([@oscard0m]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@mansona]: https://github.com/mansona [@oscard0m]: https://github.com/oscard0m [@zeppelin]: https://github.com/zeppelin -[dazzlingfugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source -[dazzlingfugu/guidemaker-ember-locale-template]: - https://github.com/DazzlingFugu/guidemaker-ember-locale-template -[ember-fastboot/ember-cli-fastboot]: - https://github.com/ember-fastboot/ember-cli-fastboot -[ember-fastboot/ember-cli-head]: - https://github.com/ember-fastboot/ember-cli-head +[dazzlingfugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source +[dazzlingfugu/guidemaker-ember-locale-template]: https://github.com/DazzlingFugu/guidemaker-ember-locale-template +[ember-fastboot/ember-cli-fastboot]: https://github.com/ember-fastboot/ember-cli-fastboot +[ember-fastboot/ember-cli-head]: https://github.com/ember-fastboot/ember-cli-head [ember-learn/cli-guides]: https://github.com/ember-learn/cli-guides [ember-learn/deprecation-app]: https://github.com/ember-learn/deprecation-app [ember-learn/ember-website]: https://github.com/ember-learn/ember-website -[ember-learn/guidemaker-ember-template]: - https://github.com/ember-learn/guidemaker-ember-template +[ember-learn/guidemaker-ember-template]: https://github.com/ember-learn/guidemaker-ember-template [ember-learn/guides-source]: https://github.com/ember-learn/guides-source [emberjs/ember.js]: https://github.com/emberjs/ember.js [embroider-build/embroider]: https://github.com/embroider-build/embroider -[empress/guidemaker-default-template]: - https://github.com/empress/guidemaker-default-template +[empress/guidemaker-default-template]: https://github.com/empress/guidemaker-default-template [empress/guidemaker]: https://github.com/empress/guidemaker -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals [miguelcobain/ember-paper]: https://github.com/miguelcobain/ember-paper [octokit/openapi]: https://github.com/octokit/openapi diff --git a/src/twios/2023-06-16.md b/src/twios/2023-06-16.md index 478428c1c1..a3ddb00a1a 100644 --- a/src/twios/2023-06-16.md +++ b/src/twios/2023-06-16.md @@ -1,289 +1,133 @@ ## Svelte -- [sveltejs/v2.svelte.dev] - [#452](https://github.com/sveltejs/v2.svelte.dev/pull/452) docs: fix link to - /sites folder in svelte repo ([@oscard0m]) +- [sveltejs/v2.svelte.dev] [#452](https://github.com/sveltejs/v2.svelte.dev/pull/452) docs: fix link to /sites folder in svelte repo ([@oscard0m]) ## Ember.js -- [DazzlingFugu/ember-fr-guides-source] - [#193](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/193) - Translate guides/accessibility/page-template-considerations.md - ([@BlueCutOfficial]) -- [babel/ember-cli-babel] - [#489](https://github.com/babel/ember-cli-babel/pull/489) remove proposal - plugins and replace with their corresponding transform ([@mansona]) -- [ember-cli/ember-try-config] - [#191](https://github.com/ember-cli/ember-try-config/pull/191) add default - overrides for generated configs ([@mansona]) -- [ember-learn/cli-guides] - [#293](https://github.com/ember-learn/cli-guides/pull/293) update - guidemaker-ember-template ([@mansona]) -- [ember-learn/ember-api-docs] - [#868](https://github.com/ember-learn/ember-api-docs/pull/868) WIP: tracking - branch for the website redesign RFC ([@mansona]) -- [ember-learn/ember-api-docs-data] - [#8](https://github.com/ember-learn/ember-api-docs-data/pull/8) Sync data from - S3 ([@mansona]) -- [ember-learn/ember-website] - [#1038](https://github.com/ember-learn/ember-website/pull/1038) Remove mirage - ([@mansona]) -- [ember-learn/ember-website] - [#1037](https://github.com/ember-learn/ember-website/pull/1037) Sponsor - updates ([@mansona]) -- [ember-learn/ember-website] - [#1035](https://github.com/ember-learn/ember-website/pull/1035) Release - versions ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#160](https://github.com/ember-learn/guidemaker-ember-template/pull/160) - update ember-showdown-prism ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#155](https://github.com/ember-learn/guidemaker-ember-template/pull/155) - Revert "add prefixHeaderId to on-this-page links" ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#154](https://github.com/ember-learn/guidemaker-ember-template/pull/154) add - prefixHeaderId to on-this-page links ([@mansona]) -- [ember-learn/guides-source] - [#1941](https://github.com/ember-learn/guides-source/pull/1941) update - guidemaker-ember-template ([@mansona]) -- [ember-learn/guides-source] - [#1935](https://github.com/ember-learn/guides-source/pull/1935) Update - prebuilt guides ([@mansona]) -- [ember-learn/guides-source] - [#1933](https://github.com/ember-learn/guides-source/pull/1933) Add more - versions to prebuilt ([@mansona]) -- [ember-learn/guides-source] - [#1932](https://github.com/ember-learn/guides-source/pull/1932) Update - prebuilt versions ([@mansona]) -- [ember-learn/guides-source] - [#1931](https://github.com/ember-learn/guides-source/pull/1931) update - pre-built guides ([@mansona]) -- [ember-learn/guides-source] - [#1929](https://github.com/ember-learn/guides-source/pull/1929) update minor - details in the search index deployment script ([@mansona]) -- [ember-learn/tool-new-release] - [#42](https://github.com/ember-learn/tool-new-release/pull/42) add m1 support - to release CI ([@mansona]) -- [ember-learn/upgrade-guide] - [#118](https://github.com/ember-learn/upgrade-guide/pull/118) add version 5.0 - ([@mansona]) -- [embroider-build/addon-blueprint] - [#157](https://github.com/embroider-build/addon-blueprint/pull/157) show test - logs in CI ([@mansona]) -- [mainmatter/ember-simple-auth] - [#2604](https://github.com/mainmatter/ember-simple-auth/pull/2604) V2 addon - ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2600](https://github.com/mainmatter/ember-simple-auth/pull/2600) - chore(test-app): enable embroider build ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2599](https://github.com/mainmatter/ember-simple-auth/pull/2599) - refactor(test-app): use LinkTo and this. ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2595](https://github.com/mainmatter/ember-simple-auth/pull/2595) feat: - Remove Torii from ember 5 scenarios ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2591](https://github.com/mainmatter/ember-simple-auth/pull/2591) [Chore] use - 4.12.1 ember-data for ember-lts-4.12 scenario ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2580](https://github.com/mainmatter/ember-simple-auth/pull/2580) chore: - specify ember-qunit, @ember/test-helpers for ember-try scenario - ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2578](https://github.com/mainmatter/ember-simple-auth/pull/2578) Configure - Renovate to update testing and fastboot stacks in the same PR - ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2576](https://github.com/mainmatter/ember-simple-auth/pull/2576) chore: add - ember-lts-4.12 scenario ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2575](https://github.com/mainmatter/ember-simple-auth/pull/2575) chore: fix - fastboot testing environment for ember-data >= 4.12 ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2574](https://github.com/mainmatter/ember-simple-auth/pull/2574) - chore(deps): bump fastboot dependencies ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2573](https://github.com/mainmatter/ember-simple-auth/pull/2573) - chore(deps): bump ember-try to 3.0.0 beta ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2572](https://github.com/mainmatter/ember-simple-auth/pull/2572) - chore(deps): bump ember-cli-dependency-checker to 3.3.1 ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2571](https://github.com/mainmatter/ember-simple-auth/pull/2571) - chore(deps): bump ember-fetch to 8.1.2 ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2570](https://github.com/mainmatter/ember-simple-auth/pull/2570) Move to - pnpm ([@BobrImperator]) +- [DazzlingFugu/ember-fr-guides-source] [#193](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/193) Translate guides/accessibility/page-template-considerations.md ([@BlueCutOfficial]) +- [babel/ember-cli-babel] [#489](https://github.com/babel/ember-cli-babel/pull/489) remove proposal plugins and replace with their corresponding transform ([@mansona]) +- [ember-cli/ember-try-config] [#191](https://github.com/ember-cli/ember-try-config/pull/191) add default overrides for generated configs ([@mansona]) +- [ember-learn/cli-guides] [#293](https://github.com/ember-learn/cli-guides/pull/293) update guidemaker-ember-template ([@mansona]) +- [ember-learn/ember-api-docs] [#868](https://github.com/ember-learn/ember-api-docs/pull/868) WIP: tracking branch for the website redesign RFC ([@mansona]) +- [ember-learn/ember-api-docs-data] [#8](https://github.com/ember-learn/ember-api-docs-data/pull/8) Sync data from S3 ([@mansona]) +- [ember-learn/ember-website] [#1038](https://github.com/ember-learn/ember-website/pull/1038) Remove mirage ([@mansona]) +- [ember-learn/ember-website] [#1037](https://github.com/ember-learn/ember-website/pull/1037) Sponsor updates ([@mansona]) +- [ember-learn/ember-website] [#1035](https://github.com/ember-learn/ember-website/pull/1035) Release versions ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#160](https://github.com/ember-learn/guidemaker-ember-template/pull/160) update ember-showdown-prism ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#155](https://github.com/ember-learn/guidemaker-ember-template/pull/155) Revert "add prefixHeaderId to on-this-page links" ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#154](https://github.com/ember-learn/guidemaker-ember-template/pull/154) add prefixHeaderId to on-this-page links ([@mansona]) +- [ember-learn/guides-source] [#1941](https://github.com/ember-learn/guides-source/pull/1941) update guidemaker-ember-template ([@mansona]) +- [ember-learn/guides-source] [#1935](https://github.com/ember-learn/guides-source/pull/1935) Update prebuilt guides ([@mansona]) +- [ember-learn/guides-source] [#1933](https://github.com/ember-learn/guides-source/pull/1933) Add more versions to prebuilt ([@mansona]) +- [ember-learn/guides-source] [#1932](https://github.com/ember-learn/guides-source/pull/1932) Update prebuilt versions ([@mansona]) +- [ember-learn/guides-source] [#1931](https://github.com/ember-learn/guides-source/pull/1931) update pre-built guides ([@mansona]) +- [ember-learn/guides-source] [#1929](https://github.com/ember-learn/guides-source/pull/1929) update minor details in the search index deployment script ([@mansona]) +- [ember-learn/tool-new-release] [#42](https://github.com/ember-learn/tool-new-release/pull/42) add m1 support to release CI ([@mansona]) +- [ember-learn/upgrade-guide] [#118](https://github.com/ember-learn/upgrade-guide/pull/118) add version 5.0 ([@mansona]) +- [embroider-build/addon-blueprint] [#157](https://github.com/embroider-build/addon-blueprint/pull/157) show test logs in CI ([@mansona]) +- [mainmatter/ember-simple-auth] [#2604](https://github.com/mainmatter/ember-simple-auth/pull/2604) V2 addon ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2600](https://github.com/mainmatter/ember-simple-auth/pull/2600) chore(test-app): enable embroider build ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2599](https://github.com/mainmatter/ember-simple-auth/pull/2599) refactor(test-app): use LinkTo and this. ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2595](https://github.com/mainmatter/ember-simple-auth/pull/2595) feat: Remove Torii from ember 5 scenarios ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2591](https://github.com/mainmatter/ember-simple-auth/pull/2591) [Chore] use 4.12.1 ember-data for ember-lts-4.12 scenario ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2580](https://github.com/mainmatter/ember-simple-auth/pull/2580) chore: specify ember-qunit, @ember/test-helpers for ember-try scenario ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2578](https://github.com/mainmatter/ember-simple-auth/pull/2578) Configure Renovate to update testing and fastboot stacks in the same PR ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2576](https://github.com/mainmatter/ember-simple-auth/pull/2576) chore: add ember-lts-4.12 scenario ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2575](https://github.com/mainmatter/ember-simple-auth/pull/2575) chore: fix fastboot testing environment for ember-data >= 4.12 ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2574](https://github.com/mainmatter/ember-simple-auth/pull/2574) chore(deps): bump fastboot dependencies ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2573](https://github.com/mainmatter/ember-simple-auth/pull/2573) chore(deps): bump ember-try to 3.0.0 beta ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2572](https://github.com/mainmatter/ember-simple-auth/pull/2572) chore(deps): bump ember-cli-dependency-checker to 3.3.1 ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2571](https://github.com/mainmatter/ember-simple-auth/pull/2571) chore(deps): bump ember-fetch to 8.1.2 ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2570](https://github.com/mainmatter/ember-simple-auth/pull/2570) Move to pnpm ([@BobrImperator]) ## Embroider -- [embroider-build/embroider] - [#1520](https://github.com/embroider-build/embroider/pull/1520) use transform - babel plugins instead of proposal ([@mansona]) -- [embroider-build/embroider] - [#1518](https://github.com/embroider-build/embroider/pull/1518) add a basic - implementation of the gjs rollup plugin ([@mansona]) -- [embroider-build/embroider] - [#1489](https://github.com/embroider-build/embroider/pull/1489) prepare to - release patch of embroider/compat ([@mansona]) -- [embroider-build/embroider] - [#1488](https://github.com/embroider-build/embroider/pull/1488) fix - this.import from node_modules in v1 addons ([@mansona]) -- [embroider-build/embroider] - [#1479](https://github.com/embroider-build/embroider/pull/1479) ember data - compat adapter ([@mansona]) -- [embroider-build/embroider] - [#1475](https://github.com/embroider-build/embroider/pull/1475) WIP: add a - basic implementation for fastboot app file resolving ([@mansona]) -- [embroider-build/content-tag] - [#10](https://github.com/embroider-build/content-tag/pull/10) Pass a better - message back to JS ([@mansona]) -- [embroider-build/content-tag] - [#9](https://github.com/embroider-build/content-tag/pull/9) fix installation - instructions in README ([@mansona]) -- [embroider-build/content-tag] - [#8](https://github.com/embroider-build/content-tag/pull/8) Setup release on - CI when tag is pushed ([@mansona]) -- [embroider-build/content-tag] - [#7](https://github.com/embroider-build/content-tag/pull/7) Move component - `this` reference into first argument ([@mansona]) -- [embroider-build/content-tag] - [#6](https://github.com/embroider-build/content-tag/pull/6) use git - dependencies for swc ([@mansona]) -- [embroider-build/ember-auto-import] - [#587](https://github.com/embroider-build/ember-auto-import/pull/587) Feature: - allowAppImports ([@mansona]) +- [embroider-build/embroider] [#1520](https://github.com/embroider-build/embroider/pull/1520) use transform babel plugins instead of proposal ([@mansona]) +- [embroider-build/embroider] [#1518](https://github.com/embroider-build/embroider/pull/1518) add a basic implementation of the gjs rollup plugin ([@mansona]) +- [embroider-build/embroider] [#1489](https://github.com/embroider-build/embroider/pull/1489) prepare to release patch of embroider/compat ([@mansona]) +- [embroider-build/embroider] [#1488](https://github.com/embroider-build/embroider/pull/1488) fix this.import from node_modules in v1 addons ([@mansona]) +- [embroider-build/embroider] [#1479](https://github.com/embroider-build/embroider/pull/1479) ember data compat adapter ([@mansona]) +- [embroider-build/embroider] [#1475](https://github.com/embroider-build/embroider/pull/1475) WIP: add a basic implementation for fastboot app file resolving ([@mansona]) +- [embroider-build/content-tag] [#10](https://github.com/embroider-build/content-tag/pull/10) Pass a better message back to JS ([@mansona]) +- [embroider-build/content-tag] [#9](https://github.com/embroider-build/content-tag/pull/9) fix installation instructions in README ([@mansona]) +- [embroider-build/content-tag] [#8](https://github.com/embroider-build/content-tag/pull/8) Setup release on CI when tag is pushed ([@mansona]) +- [embroider-build/content-tag] [#7](https://github.com/embroider-build/content-tag/pull/7) Move component `this` reference into first argument ([@mansona]) +- [embroider-build/content-tag] [#6](https://github.com/embroider-build/content-tag/pull/6) use git dependencies for swc ([@mansona]) +- [embroider-build/ember-auto-import] [#587](https://github.com/embroider-build/ember-auto-import/pull/587) Feature: allowAppImports ([@mansona]) ## Empress -- [empress/broccoli-static-site-json] - [#72](https://github.com/empress/broccoli-static-site-json/pull/72) allow you - to pass showdownConfig for internal toc builder ([@mansona]) -- [empress/broccoli-static-site-json] - [#71](https://github.com/empress/broccoli-static-site-json/pull/71) don't find - headers in code blocks for the on-this-page ([@mansona]) -- [empress/ember-cli-showdown] - [#128](https://github.com/empress/ember-cli-showdown/pull/128) update to v4.12 - with ember-cli-update ([@mansona]) -- [empress/ember-cli-showdown] - [#127](https://github.com/empress/ember-cli-showdown/pull/127) breaking: drop - support for node < 16 ([@mansona]) -- [empress/ember-cli-showdown] - [#126](https://github.com/empress/ember-cli-showdown/pull/126) use - ember-auto-import to import showdown ([@mansona]) -- [empress/ember-showdown-prism] - [#53](https://github.com/empress/ember-showdown-prism/pull/53) add support for - data-diff usage in code block ([@mansona]) -- [empress/ember-showdown-prism] - [#49](https://github.com/empress/ember-showdown-prism/pull/49) move - ember-prism to dependencies ([@mansona]) -- [empress/ember-showdown-prism] - [#47](https://github.com/empress/ember-showdown-prism/pull/47) update to v5.0 - with ember-cli-update ([@mansona]) -- [empress/ember-showdown-prism] - [#46](https://github.com/empress/ember-showdown-prism/pull/46) breaking: drop - support for node < 16 ([@mansona]) -- [empress/ember-showdown-prism] - [#45](https://github.com/empress/ember-showdown-prism/pull/45) move showdown - to a peer dependency ([@mansona]) -- [empress/guidemaker] [#92](https://github.com/empress/guidemaker/pull/92) Load - the showdown config from environment and pass it to broccoli-static-site-json - ([@mansona]) -- [empress/open-slide] [#17](https://github.com/empress/open-slide/pull/17) - update to v5.1 with ember-cli-update ([@mansona]) -- [empress/open-slide-reveal-template] - [#2](https://github.com/empress/open-slide-reveal-template/pull/2) Update - ember and reveal.js ([@mansona]) +- [empress/broccoli-static-site-json] [#72](https://github.com/empress/broccoli-static-site-json/pull/72) allow you to pass showdownConfig for internal toc builder ([@mansona]) +- [empress/broccoli-static-site-json] [#71](https://github.com/empress/broccoli-static-site-json/pull/71) don't find headers in code blocks for the on-this-page ([@mansona]) +- [empress/ember-cli-showdown] [#128](https://github.com/empress/ember-cli-showdown/pull/128) update to v4.12 with ember-cli-update ([@mansona]) +- [empress/ember-cli-showdown] [#127](https://github.com/empress/ember-cli-showdown/pull/127) breaking: drop support for node < 16 ([@mansona]) +- [empress/ember-cli-showdown] [#126](https://github.com/empress/ember-cli-showdown/pull/126) use ember-auto-import to import showdown ([@mansona]) +- [empress/ember-showdown-prism] [#53](https://github.com/empress/ember-showdown-prism/pull/53) add support for data-diff usage in code block ([@mansona]) +- [empress/ember-showdown-prism] [#49](https://github.com/empress/ember-showdown-prism/pull/49) move ember-prism to dependencies ([@mansona]) +- [empress/ember-showdown-prism] [#47](https://github.com/empress/ember-showdown-prism/pull/47) update to v5.0 with ember-cli-update ([@mansona]) +- [empress/ember-showdown-prism] [#46](https://github.com/empress/ember-showdown-prism/pull/46) breaking: drop support for node < 16 ([@mansona]) +- [empress/ember-showdown-prism] [#45](https://github.com/empress/ember-showdown-prism/pull/45) move showdown to a peer dependency ([@mansona]) +- [empress/guidemaker] [#92](https://github.com/empress/guidemaker/pull/92) Load the showdown config from environment and pass it to broccoli-static-site-json ([@mansona]) +- [empress/open-slide] [#17](https://github.com/empress/open-slide/pull/17) update to v5.1 with ember-cli-update ([@mansona]) +- [empress/open-slide-reveal-template] [#2](https://github.com/empress/open-slide-reveal-template/pull/2) Update ember and reveal.js ([@mansona]) ## JavaScript -- [TelemetryDeck/JavaScriptSDK] - [#23](https://github.com/TelemetryDeck/JavaScriptSDK/pull/23) Standalone SDK: - Package for Browser and Node.js ([@pichfl]) -- [mansona/layer-gen] [#4](https://github.com/mansona/layer-gen/pull/4) Move app - to a monorepo ([@mansona]) -- [mansona/layer-gen] [#3](https://github.com/mansona/layer-gen/pull/3) Remove - Core Object ([@mansona]) -- [TelemetryDeck/WebSDK] [#3](https://github.com/TelemetryDeck/WebSDK/pull/3) - Create WebSDK ([@pichfl]) -- [ef4/code-equality-assertions] - [#1](https://github.com/ef4/code-equality-assertions/pull/1) Add support for - chai ([@mansona]) +- [TelemetryDeck/JavaScriptSDK] [#23](https://github.com/TelemetryDeck/JavaScriptSDK/pull/23) Standalone SDK: Package for Browser and Node.js ([@pichfl]) +- [mansona/layer-gen] [#4](https://github.com/mansona/layer-gen/pull/4) Move app to a monorepo ([@mansona]) +- [mansona/layer-gen] [#3](https://github.com/mansona/layer-gen/pull/3) Remove Core Object ([@mansona]) +- [TelemetryDeck/WebSDK] [#3](https://github.com/TelemetryDeck/WebSDK/pull/3) Create WebSDK ([@pichfl]) +- [ef4/code-equality-assertions] [#1](https://github.com/ef4/code-equality-assertions/pull/1) Add support for chai ([@mansona]) ## Octokit -- [octokit/action.js] [#516](https://github.com/octokit/action.js/pull/516) - test(refactor): use 'toEqual' instead of 'toStrictEqual' for Responses - ([@oscard0m]) -- [octokit/core.js] [#589](https://github.com/octokit/core.js/pull/589) - test(refactor): use 'toEqual' instead of 'toStrictEqual' with JSON.stringify - in Response assertions ([@oscard0m]) -- [octokit/core.js] [#587](https://github.com/octokit/core.js/pull/587) WIP - test(agent-proxy): restore test coverage with `undici` ([@oscard0m]) -- [octokit/octokit.js] [#2502](https://github.com/octokit/octokit.js/pull/2502) - docs(readme): add 'Fetch missing' section ([@oscard0m]) -- [octokit/octokit.js] [#2501](https://github.com/octokit/octokit.js/pull/2501) - docs(readme): update Proxy Servers information ([@oscard0m]) -- [octokit/request.js] [#617](https://github.com/octokit/request.js/pull/617) - fix(fetch-wrapper): improve error message when 'fetch' implementation is not - present ([@oscard0m]) -- [octokit/request.js] [#614](https://github.com/octokit/request.js/pull/614) - docs(readme): add example for using a custom Agent ([@oscard0m]) -- [octokit/request.js] [#609](https://github.com/octokit/request.js/pull/609) - docs(readme): examples use ESM ([@oscard0m]) -- [octokit/request.js] [#608](https://github.com/octokit/request.js/pull/608) - docs(readme): use 'user-agent' instead of 'agent' as 'header' option in - 'Sentible defauls' section ([@oscard0m]) -- [octokit/rest.js] [#329](https://github.com/octokit/rest.js/pull/329) - test(refactor): use 'toEqual' instead of 'toStrictEqual' for Responses - ([@oscard0m]) +- [octokit/action.js] [#516](https://github.com/octokit/action.js/pull/516) test(refactor): use 'toEqual' instead of 'toStrictEqual' for Responses ([@oscard0m]) +- [octokit/core.js] [#589](https://github.com/octokit/core.js/pull/589) test(refactor): use 'toEqual' instead of 'toStrictEqual' with JSON.stringify in Response assertions ([@oscard0m]) +- [octokit/core.js] [#587](https://github.com/octokit/core.js/pull/587) WIP test(agent-proxy): restore test coverage with `undici` ([@oscard0m]) +- [octokit/octokit.js] [#2502](https://github.com/octokit/octokit.js/pull/2502) docs(readme): add 'Fetch missing' section ([@oscard0m]) +- [octokit/octokit.js] [#2501](https://github.com/octokit/octokit.js/pull/2501) docs(readme): update Proxy Servers information ([@oscard0m]) +- [octokit/request.js] [#617](https://github.com/octokit/request.js/pull/617) fix(fetch-wrapper): improve error message when 'fetch' implementation is not present ([@oscard0m]) +- [octokit/request.js] [#614](https://github.com/octokit/request.js/pull/614) docs(readme): add example for using a custom Agent ([@oscard0m]) +- [octokit/request.js] [#609](https://github.com/octokit/request.js/pull/609) docs(readme): examples use ESM ([@oscard0m]) +- [octokit/request.js] [#608](https://github.com/octokit/request.js/pull/608) docs(readme): use 'user-agent' instead of 'agent' as 'header' option in 'Sentible defauls' section ([@oscard0m]) +- [octokit/rest.js] [#329](https://github.com/octokit/rest.js/pull/329) test(refactor): use 'toEqual' instead of 'toStrictEqual' for Responses ([@oscard0m]) ## Renovate -- [renovatebot/renovate] - [#23069](https://github.com/renovatebot/renovate/pull/23069) - feat(manager/npm): add support for Volta's pnpm ([@oscard0m]) +- [renovatebot/renovate] [#23069](https://github.com/renovatebot/renovate/pull/23069) feat(manager/npm): add support for Volta's pnpm ([@oscard0m]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@bobrimperator]: https://github.com/BobrImperator [@mansona]: https://github.com/mansona [@oscard0m]: https://github.com/oscard0m [@pichfl]: https://github.com/pichfl -[dazzlingfugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source +[dazzlingfugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source [telemetrydeck/javascriptsdk]: https://github.com/TelemetryDeck/JavaScriptSDK [telemetrydeck/websdk]: https://github.com/TelemetryDeck/WebSDK [babel/ember-cli-babel]: https://github.com/babel/ember-cli-babel [ef4/code-equality-assertions]: https://github.com/ef4/code-equality-assertions [ember-cli/ember-try-config]: https://github.com/ember-cli/ember-try-config [ember-learn/cli-guides]: https://github.com/ember-learn/cli-guides -[ember-learn/ember-api-docs-data]: - https://github.com/ember-learn/ember-api-docs-data +[ember-learn/ember-api-docs-data]: https://github.com/ember-learn/ember-api-docs-data [ember-learn/ember-api-docs]: https://github.com/ember-learn/ember-api-docs [ember-learn/ember-website]: https://github.com/ember-learn/ember-website -[ember-learn/guidemaker-ember-template]: - https://github.com/ember-learn/guidemaker-ember-template +[ember-learn/guidemaker-ember-template]: https://github.com/ember-learn/guidemaker-ember-template [ember-learn/guides-source]: https://github.com/ember-learn/guides-source [ember-learn/tool-new-release]: https://github.com/ember-learn/tool-new-release [ember-learn/upgrade-guide]: https://github.com/ember-learn/upgrade-guide -[embroider-build/addon-blueprint]: - https://github.com/embroider-build/addon-blueprint +[embroider-build/addon-blueprint]: https://github.com/embroider-build/addon-blueprint [embroider-build/content-tag]: https://github.com/embroider-build/content-tag -[embroider-build/ember-auto-import]: - https://github.com/embroider-build/ember-auto-import +[embroider-build/ember-auto-import]: https://github.com/embroider-build/ember-auto-import [embroider-build/embroider]: https://github.com/embroider-build/embroider -[empress/broccoli-static-site-json]: - https://github.com/empress/broccoli-static-site-json +[empress/broccoli-static-site-json]: https://github.com/empress/broccoli-static-site-json [empress/ember-cli-showdown]: https://github.com/empress/ember-cli-showdown [empress/ember-showdown-prism]: https://github.com/empress/ember-showdown-prism [empress/guidemaker]: https://github.com/empress/guidemaker -[empress/open-slide-reveal-template]: - https://github.com/empress/open-slide-reveal-template +[empress/open-slide-reveal-template]: https://github.com/empress/open-slide-reveal-template [empress/open-slide]: https://github.com/empress/open-slide [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth [mansona/layer-gen]: https://github.com/mansona/layer-gen -[mansona/open-slide-mainmatter-template]: - https://github.com/mansona/open-slide-mainmatter-template +[mansona/open-slide-mainmatter-template]: https://github.com/mansona/open-slide-mainmatter-template [octokit/action.js]: https://github.com/octokit/action.js [octokit/core.js]: https://github.com/octokit/core.js [octokit/octokit.js]: https://github.com/octokit/octokit.js diff --git a/src/twios/2023-07-19.md b/src/twios/2023-07-19.md index 2e4ff92e9f..4a7c79a913 100644 --- a/src/twios/2023-07-19.md +++ b/src/twios/2023-07-19.md @@ -1,270 +1,109 @@ ## Svelte -- [SvelteLab/SvelteLab] [#274](https://github.com/SvelteLab/SvelteLab/pull/274) - feat: share with open files ([@paoloricciuti]) -- [SvelteLab/SvelteLab] [#270](https://github.com/SvelteLab/SvelteLab/pull/270) - chore: upgrade deps, svelte 4 and others ([@paoloricciuti]) -- [SvelteLab/SvelteLab] [#269](https://github.com/SvelteLab/SvelteLab/pull/269) - Add search also for svelte documentation ([@paoloricciuti]) -- [SvelteLab/SvelteLab] [#268](https://github.com/SvelteLab/SvelteLab/pull/268) - fix: login styles, name not saving, wrap sort button ([@paoloricciuti]) -- [SvelteLab/SvelteLab] [#266](https://github.com/SvelteLab/SvelteLab/pull/266) - feat: Add animotion template ([@paoloricciuti]) -- [SvelteLab/SvelteLab] [#262](https://github.com/SvelteLab/SvelteLab/pull/262) - (feat) Make cli login work ([@paoloricciuti]) -- [paoloricciuti/sveltekit-search-params] - [#33](https://github.com/paoloricciuti/sveltekit-search-params/pull/33) Update - release pnpm ([@paoloricciuti]) -- [poppa/sveltekit-svg] [#42](https://github.com/poppa/sveltekit-svg/pull/42) - feat: Add `transformComponent` hook to allow for smarter components import - ([@paoloricciuti]) -- [pstanoev/simple-svelte-autocomplete] - [#212](https://github.com/pstanoev/simple-svelte-autocomplete/pull/212) - feat(labelonselectfunction): add 'labelOnSelectFunction' prop ([@oscard0m]) -- [sveltejs/svelte] [#9036](https://github.com/sveltejs/svelte/pull/9036) fix: - Add data-\* to svg attributes ([@paoloricciuti]) -- [melt-ui/melt-ui] [#370](https://github.com/melt-ui/melt-ui/pull/370) fix: tag - being created/updated even if not valid ([@paoloricciuti]) -- [melt-ui/melt-ui] [#324](https://github.com/melt-ui/melt-ui/pull/324) fix: - various bug slider ([@paoloricciuti]) -- [melt-ui/melt-ui] [#310](https://github.com/melt-ui/melt-ui/pull/310) feat: - store usingPreprocessor in localStorage ([@paoloricciuti]) -- [melt-ui/melt-ui] [#306](https://github.com/melt-ui/melt-ui/pull/306) chore: - add eslint rule to prevent imports from lib/builders ([@paoloricciuti]) -- [melt-ui/melt-ui] [#305](https://github.com/melt-ui/melt-ui/pull/305) fix: - Remove `@melt-ui/svelte` alias, add text transform ([@paoloricciuti]) -- [storybookjs/addon-svelte-csf] - [#115](https://github.com/storybookjs/addon-svelte-csf/pull/115) fix: swap - order of types to avoid module not found ([@paoloricciuti]) +- [SvelteLab/SvelteLab] [#274](https://github.com/SvelteLab/SvelteLab/pull/274) feat: share with open files ([@paoloricciuti]) +- [SvelteLab/SvelteLab] [#270](https://github.com/SvelteLab/SvelteLab/pull/270) chore: upgrade deps, svelte 4 and others ([@paoloricciuti]) +- [SvelteLab/SvelteLab] [#269](https://github.com/SvelteLab/SvelteLab/pull/269) Add search also for svelte documentation ([@paoloricciuti]) +- [SvelteLab/SvelteLab] [#268](https://github.com/SvelteLab/SvelteLab/pull/268) fix: login styles, name not saving, wrap sort button ([@paoloricciuti]) +- [SvelteLab/SvelteLab] [#266](https://github.com/SvelteLab/SvelteLab/pull/266) feat: Add animotion template ([@paoloricciuti]) +- [SvelteLab/SvelteLab] [#262](https://github.com/SvelteLab/SvelteLab/pull/262) (feat) Make cli login work ([@paoloricciuti]) +- [paoloricciuti/sveltekit-search-params] [#33](https://github.com/paoloricciuti/sveltekit-search-params/pull/33) Update release pnpm ([@paoloricciuti]) +- [poppa/sveltekit-svg] [#42](https://github.com/poppa/sveltekit-svg/pull/42) feat: Add `transformComponent` hook to allow for smarter components import ([@paoloricciuti]) +- [pstanoev/simple-svelte-autocomplete] [#212](https://github.com/pstanoev/simple-svelte-autocomplete/pull/212) feat(labelonselectfunction): add 'labelOnSelectFunction' prop ([@oscard0m]) +- [sveltejs/svelte] [#9036](https://github.com/sveltejs/svelte/pull/9036) fix: Add data-\* to svg attributes ([@paoloricciuti]) +- [melt-ui/melt-ui] [#370](https://github.com/melt-ui/melt-ui/pull/370) fix: tag being created/updated even if not valid ([@paoloricciuti]) +- [melt-ui/melt-ui] [#324](https://github.com/melt-ui/melt-ui/pull/324) fix: various bug slider ([@paoloricciuti]) +- [melt-ui/melt-ui] [#310](https://github.com/melt-ui/melt-ui/pull/310) feat: store usingPreprocessor in localStorage ([@paoloricciuti]) +- [melt-ui/melt-ui] [#306](https://github.com/melt-ui/melt-ui/pull/306) chore: add eslint rule to prevent imports from lib/builders ([@paoloricciuti]) +- [melt-ui/melt-ui] [#305](https://github.com/melt-ui/melt-ui/pull/305) fix: Remove `@melt-ui/svelte` alias, add text transform ([@paoloricciuti]) +- [storybookjs/addon-svelte-csf] [#115](https://github.com/storybookjs/addon-svelte-csf/pull/115) fix: swap order of types to avoid module not found ([@paoloricciuti]) ## Ember.js -- [DazzlingFugu/ember-fr-guides-source] - [#196](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/196) - Translate guides/tutorial/part-1/orientation.md ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#195](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/195) - Catchup 5.1.0 ([@BlueCutOfficial]) -- [ember-cli/ember-cli-update] - [#1241](https://github.com/ember-cli/ember-cli-update/pull/1241) Revert "add - code to support node 8" ([@mansona]) -- [ember-cli/ember-cli-update] - [#1240](https://github.com/ember-cli/ember-cli-update/pull/1240) Fix custom - blueprints ([@mansona]) -- [ember-cli/ember-try] [#961](https://github.com/ember-cli/ember-try/pull/961) - use --no-package-lock in npm ([@mansona]) -- [ember-cli/ember-try-config] - [#192](https://github.com/ember-cli/ember-try-config/pull/192) Downgrade - ember-cli if ember-source <= 3.28 is gonna be used with ember-cli 5+ - ([@lolmaus]) -- [ember-learn/cli-guides] - [#298](https://github.com/ember-learn/cli-guides/pull/298) update - guidemaker-ember-template ([@mansona]) -- [ember-learn/ember-blog] - [#1290](https://github.com/ember-learn/ember-blog/pull/1290) Update .alexrc - ([@mansona]) -- [ember-learn/ember-styleguide] - [#474](https://github.com/ember-learn/ember-styleguide/pull/474) Add - @ember/string to ember-release dependencies ([@nickschot]) -- [ember-learn/ember-styleguide] - [#473](https://github.com/ember-learn/ember-styleguide/pull/473) Sync menu - content from ember-website to styleguide ([@nickschot]) -- [ember-learn/ember-website] - [#1047](https://github.com/ember-learn/ember-website/pull/1047) Use - headerLinks directly from ember-styleguide ([@nickschot]) -- [ember-learn/ember-website] - [#1046](https://github.com/ember-learn/ember-website/pull/1046) Update - ember-styleguide to v8.4.0 ([@nickschot]) -- [ember-learn/guides-source] - [#1955](https://github.com/ember-learn/guides-source/pull/1955) update - guidemaker-ember-template ([@mansona]) -- [ember-learn/guides-source] - [#1952](https://github.com/ember-learn/guides-source/pull/1952) Add SPA - fallback ([@mansona]) -- [embroider-build/addon-blueprint] - [#166](https://github.com/embroider-build/addon-blueprint/pull/166) update - concurrently version in top-level monorepo ([@mansona]) -- [embroider-build/addon-blueprint] - [#164](https://github.com/embroider-build/addon-blueprint/pull/164) Separate - lint tests ([@mansona]) -- [embroider-build/addon-blueprint] - [#163](https://github.com/embroider-build/addon-blueprint/pull/163) bump - addon-dev version ([@mansona]) -- [embroider-build/addon-blueprint] - [#159](https://github.com/embroider-build/addon-blueprint/pull/159) Add GJS to - the default addon blueprint ([@mansona]) -- [mainmatter/ember-cookies] - [#842](https://github.com/mainmatter/ember-cookies/pull/842) chore(release): - use volta setup for release workflow ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#841](https://github.com/mainmatter/ember-cookies/pull/841) chore(ci): add - Mainmatter/continue-on-error action ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#835](https://github.com/mainmatter/ember-cookies/pull/835) chore(deps): use - common Mainmatter config for addons ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#834](https://github.com/mainmatter/ember-cookies/pull/834) Migrate to pnpm - ([@BobrImperator]) -- [mainmatter/ember-error-route] - [#431](https://github.com/mainmatter/ember-error-route/pull/431) - feat(breaking): drop Ember < 3.28 support ([@BobrImperator]) -- [mainmatter/ember-error-route] - [#430](https://github.com/mainmatter/ember-error-route/pull/430) chore(deps): - upgrade ember-qunit and ember-test-helpers ([@BobrImperator]) -- [mainmatter/ember-error-route] - [#429](https://github.com/mainmatter/ember-error-route/pull/429) - chore(release): use volta setup ([@BobrImperator]) -- [mainmatter/ember-error-route] - [#428](https://github.com/mainmatter/ember-error-route/pull/428) - chore(deploy): use volta setup for deploy workflow ([@BobrImperator]) -- [mainmatter/ember-error-route] - [#427](https://github.com/mainmatter/ember-error-route/pull/427) Setup volta, - make CI green again. ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2640](https://github.com/mainmatter/ember-simple-auth/pull/2640) - chore(deps): fix lockfile ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2637](https://github.com/mainmatter/ember-simple-auth/pull/2637) - chore(release): rename script to release ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2636](https://github.com/mainmatter/ember-simple-auth/pull/2636) - chore(deps): use common Mainmatter config for addons ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2633](https://github.com/mainmatter/ember-simple-auth/pull/2633) - test(embroider): allow test-app embroider-optimizied to fail (should work for - regular apps just fine, but not fastboot) ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2632](https://github.com/mainmatter/ember-simple-auth/pull/2632) chore(ci): - remove build artifact uploading ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2631](https://github.com/mainmatter/ember-simple-auth/pull/2631) chore(ci): - install dependencies before building ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2630](https://github.com/mainmatter/ember-simple-auth/pull/2630) - chore(deps): bump ember-try to 3.0.0 ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2615](https://github.com/mainmatter/ember-simple-auth/pull/2615) - feat(ember-simple-auth): remove ember-fetch dependency ([@BobrImperator]) -- [nickschot/ember-mobile-menu] - [#688](https://github.com/nickschot/ember-mobile-menu/pull/688) Allow - ember-concurrency v3 ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#687](https://github.com/nickschot/ember-mobile-menu/pull/687) Drop support - for node v14 ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#686](https://github.com/nickschot/ember-mobile-menu/pull/686) Add LTS 4.4, - 4.8 and 4.12 to test-matrix ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#685](https://github.com/nickschot/ember-mobile-menu/pull/685) Drop support - for Ember 3.24 ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#682](https://github.com/nickschot/ember-mobile-menu/pull/682) Fix - ember-cli-sass check not working under ember-cli 5/embroider ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#681](https://github.com/nickschot/ember-mobile-menu/pull/681) Update - test-app to ember v5, CI node to 16 ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#679](https://github.com/nickschot/ember-mobile-menu/pull/679) Update to - stable lerna-changelog package ([@nickschot]) -- [DockYard/ember-composable-helpers] - [#449](https://github.com/DockYard/ember-composable-helpers/pull/449) add - configFile: false to babel transform ([@mansona]) -- [shipshapecode/swach] - [#1736](https://github.com/shipshapecode/swach/pull/1736) Ember 5 typescript - fix ([@BobrImperator]) +- [DazzlingFugu/ember-fr-guides-source] [#196](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/196) Translate guides/tutorial/part-1/orientation.md ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#195](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/195) Catchup 5.1.0 ([@BlueCutOfficial]) +- [ember-cli/ember-cli-update] [#1241](https://github.com/ember-cli/ember-cli-update/pull/1241) Revert "add code to support node 8" ([@mansona]) +- [ember-cli/ember-cli-update] [#1240](https://github.com/ember-cli/ember-cli-update/pull/1240) Fix custom blueprints ([@mansona]) +- [ember-cli/ember-try] [#961](https://github.com/ember-cli/ember-try/pull/961) use --no-package-lock in npm ([@mansona]) +- [ember-cli/ember-try-config] [#192](https://github.com/ember-cli/ember-try-config/pull/192) Downgrade ember-cli if ember-source <= 3.28 is gonna be used with ember-cli 5+ ([@lolmaus]) +- [ember-learn/cli-guides] [#298](https://github.com/ember-learn/cli-guides/pull/298) update guidemaker-ember-template ([@mansona]) +- [ember-learn/ember-blog] [#1290](https://github.com/ember-learn/ember-blog/pull/1290) Update .alexrc ([@mansona]) +- [ember-learn/ember-styleguide] [#474](https://github.com/ember-learn/ember-styleguide/pull/474) Add @ember/string to ember-release dependencies ([@nickschot]) +- [ember-learn/ember-styleguide] [#473](https://github.com/ember-learn/ember-styleguide/pull/473) Sync menu content from ember-website to styleguide ([@nickschot]) +- [ember-learn/ember-website] [#1047](https://github.com/ember-learn/ember-website/pull/1047) Use headerLinks directly from ember-styleguide ([@nickschot]) +- [ember-learn/ember-website] [#1046](https://github.com/ember-learn/ember-website/pull/1046) Update ember-styleguide to v8.4.0 ([@nickschot]) +- [ember-learn/guides-source] [#1955](https://github.com/ember-learn/guides-source/pull/1955) update guidemaker-ember-template ([@mansona]) +- [ember-learn/guides-source] [#1952](https://github.com/ember-learn/guides-source/pull/1952) Add SPA fallback ([@mansona]) +- [embroider-build/addon-blueprint] [#166](https://github.com/embroider-build/addon-blueprint/pull/166) update concurrently version in top-level monorepo ([@mansona]) +- [embroider-build/addon-blueprint] [#164](https://github.com/embroider-build/addon-blueprint/pull/164) Separate lint tests ([@mansona]) +- [embroider-build/addon-blueprint] [#163](https://github.com/embroider-build/addon-blueprint/pull/163) bump addon-dev version ([@mansona]) +- [embroider-build/addon-blueprint] [#159](https://github.com/embroider-build/addon-blueprint/pull/159) Add GJS to the default addon blueprint ([@mansona]) +- [mainmatter/ember-cookies] [#842](https://github.com/mainmatter/ember-cookies/pull/842) chore(release): use volta setup for release workflow ([@BobrImperator]) +- [mainmatter/ember-cookies] [#841](https://github.com/mainmatter/ember-cookies/pull/841) chore(ci): add Mainmatter/continue-on-error action ([@BobrImperator]) +- [mainmatter/ember-cookies] [#835](https://github.com/mainmatter/ember-cookies/pull/835) chore(deps): use common Mainmatter config for addons ([@BobrImperator]) +- [mainmatter/ember-cookies] [#834](https://github.com/mainmatter/ember-cookies/pull/834) Migrate to pnpm ([@BobrImperator]) +- [mainmatter/ember-error-route] [#431](https://github.com/mainmatter/ember-error-route/pull/431) feat(breaking): drop Ember < 3.28 support ([@BobrImperator]) +- [mainmatter/ember-error-route] [#430](https://github.com/mainmatter/ember-error-route/pull/430) chore(deps): upgrade ember-qunit and ember-test-helpers ([@BobrImperator]) +- [mainmatter/ember-error-route] [#429](https://github.com/mainmatter/ember-error-route/pull/429) chore(release): use volta setup ([@BobrImperator]) +- [mainmatter/ember-error-route] [#428](https://github.com/mainmatter/ember-error-route/pull/428) chore(deploy): use volta setup for deploy workflow ([@BobrImperator]) +- [mainmatter/ember-error-route] [#427](https://github.com/mainmatter/ember-error-route/pull/427) Setup volta, make CI green again. ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2640](https://github.com/mainmatter/ember-simple-auth/pull/2640) chore(deps): fix lockfile ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2637](https://github.com/mainmatter/ember-simple-auth/pull/2637) chore(release): rename script to release ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2636](https://github.com/mainmatter/ember-simple-auth/pull/2636) chore(deps): use common Mainmatter config for addons ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2633](https://github.com/mainmatter/ember-simple-auth/pull/2633) test(embroider): allow test-app embroider-optimizied to fail (should work for regular apps just fine, but not fastboot) ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2632](https://github.com/mainmatter/ember-simple-auth/pull/2632) chore(ci): remove build artifact uploading ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2631](https://github.com/mainmatter/ember-simple-auth/pull/2631) chore(ci): install dependencies before building ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2630](https://github.com/mainmatter/ember-simple-auth/pull/2630) chore(deps): bump ember-try to 3.0.0 ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2615](https://github.com/mainmatter/ember-simple-auth/pull/2615) feat(ember-simple-auth): remove ember-fetch dependency ([@BobrImperator]) +- [nickschot/ember-mobile-menu] [#688](https://github.com/nickschot/ember-mobile-menu/pull/688) Allow ember-concurrency v3 ([@nickschot]) +- [nickschot/ember-mobile-menu] [#687](https://github.com/nickschot/ember-mobile-menu/pull/687) Drop support for node v14 ([@nickschot]) +- [nickschot/ember-mobile-menu] [#686](https://github.com/nickschot/ember-mobile-menu/pull/686) Add LTS 4.4, 4.8 and 4.12 to test-matrix ([@nickschot]) +- [nickschot/ember-mobile-menu] [#685](https://github.com/nickschot/ember-mobile-menu/pull/685) Drop support for Ember 3.24 ([@nickschot]) +- [nickschot/ember-mobile-menu] [#682](https://github.com/nickschot/ember-mobile-menu/pull/682) Fix ember-cli-sass check not working under ember-cli 5/embroider ([@nickschot]) +- [nickschot/ember-mobile-menu] [#681](https://github.com/nickschot/ember-mobile-menu/pull/681) Update test-app to ember v5, CI node to 16 ([@nickschot]) +- [nickschot/ember-mobile-menu] [#679](https://github.com/nickschot/ember-mobile-menu/pull/679) Update to stable lerna-changelog package ([@nickschot]) +- [DockYard/ember-composable-helpers] [#449](https://github.com/DockYard/ember-composable-helpers/pull/449) add configFile: false to babel transform ([@mansona]) +- [shipshapecode/swach] [#1736](https://github.com/shipshapecode/swach/pull/1736) Ember 5 typescript fix ([@BobrImperator]) ## Embroider -- [embroider-build/embroider] - [#1580](https://github.com/embroider-build/embroider/pull/1580) stop - ember-composable-helpers searching for babel configs ([@mansona]) -- [embroider-build/embroider] - [#1577](https://github.com/embroider-build/embroider/pull/1577) Add Embroider - Initiative sponsors to the readme ([@mansona]) -- [embroider-build/embroider] - [#1568](https://github.com/embroider-build/embroider/pull/1568) plan release - ([@mansona]) -- [embroider-build/embroider] - [#1567](https://github.com/embroider-build/embroider/pull/1567) add files - block to the vite package ([@mansona]) -- [embroider-build/embroider] - [#1566](https://github.com/embroider-build/embroider/pull/1566) preparing a - release ([@mansona]) -- [embroider-build/embroider] - [#1565](https://github.com/embroider-build/embroider/pull/1565) add an - auto-deploy action for stable releases ([@mansona]) -- [embroider-build/embroider] - [#1555](https://github.com/embroider-build/embroider/pull/1555) Fix release - script ([@mansona]) -- [embroider-build/embroider] - [#1554](https://github.com/embroider-build/embroider/pull/1554) preparing a - release ([@mansona]) -- [embroider-build/embroider] - [#1552](https://github.com/embroider-build/embroider/pull/1552) add - --access=public to npm publish unstable ([@mansona]) -- [embroider-build/scenario-tester] - [#17](https://github.com/embroider-build/scenario-tester/pull/17) TypeDoc: - document the Scenarios class ([@lolmaus]) -- [embroider-build/scenario-tester] - [#16](https://github.com/embroider-build/scenario-tester/pull/16) Rename types - in preparation for TypeDoc ([@lolmaus]) -- [embroider-build/scenario-tester] - [#15](https://github.com/embroider-build/scenario-tester/pull/15) Install - TypeDoc ([@lolmaus]) -- [embroider-build/scenario-tester] - [#14](https://github.com/embroider-build/scenario-tester/pull/14) Drop support - for Node 14 and update TypeScript ([@lolmaus]) -- [embroider-build/scenario-tester] - [#13](https://github.com/embroider-build/scenario-tester/pull/13) Docs: add - introduction and guide to readme ([@lolmaus]) -- [embroider-build/scenario-tester] - [#12](https://github.com/embroider-build/scenario-tester/pull/12) Tests: use a - TestContext type for DRY ([@lolmaus]) +- [embroider-build/embroider] [#1580](https://github.com/embroider-build/embroider/pull/1580) stop ember-composable-helpers searching for babel configs ([@mansona]) +- [embroider-build/embroider] [#1577](https://github.com/embroider-build/embroider/pull/1577) Add Embroider Initiative sponsors to the readme ([@mansona]) +- [embroider-build/embroider] [#1568](https://github.com/embroider-build/embroider/pull/1568) plan release ([@mansona]) +- [embroider-build/embroider] [#1567](https://github.com/embroider-build/embroider/pull/1567) add files block to the vite package ([@mansona]) +- [embroider-build/embroider] [#1566](https://github.com/embroider-build/embroider/pull/1566) preparing a release ([@mansona]) +- [embroider-build/embroider] [#1565](https://github.com/embroider-build/embroider/pull/1565) add an auto-deploy action for stable releases ([@mansona]) +- [embroider-build/embroider] [#1555](https://github.com/embroider-build/embroider/pull/1555) Fix release script ([@mansona]) +- [embroider-build/embroider] [#1554](https://github.com/embroider-build/embroider/pull/1554) preparing a release ([@mansona]) +- [embroider-build/embroider] [#1552](https://github.com/embroider-build/embroider/pull/1552) add --access=public to npm publish unstable ([@mansona]) +- [embroider-build/scenario-tester] [#17](https://github.com/embroider-build/scenario-tester/pull/17) TypeDoc: document the Scenarios class ([@lolmaus]) +- [embroider-build/scenario-tester] [#16](https://github.com/embroider-build/scenario-tester/pull/16) Rename types in preparation for TypeDoc ([@lolmaus]) +- [embroider-build/scenario-tester] [#15](https://github.com/embroider-build/scenario-tester/pull/15) Install TypeDoc ([@lolmaus]) +- [embroider-build/scenario-tester] [#14](https://github.com/embroider-build/scenario-tester/pull/14) Drop support for Node 14 and update TypeScript ([@lolmaus]) +- [embroider-build/scenario-tester] [#13](https://github.com/embroider-build/scenario-tester/pull/13) Docs: add introduction and guide to readme ([@lolmaus]) +- [embroider-build/scenario-tester] [#12](https://github.com/embroider-build/scenario-tester/pull/12) Tests: use a TestContext type for DRY ([@lolmaus]) ## Empress -- [empress/empress-blog] - [#180](https://github.com/empress/empress-blog/pull/180) update all - dependencies ([@mansona]) -- [empress/empress-blog] - [#179](https://github.com/empress/empress-blog/pull/179) update to v4.12 with - ember-cli-update ([@mansona]) -- [empress/empress-blog] - [#178](https://github.com/empress/empress-blog/pull/178) Update to 4.8 with - ember-cli-update ([@mansona]) -- [empress/empress-blog] - [#177](https://github.com/empress/empress-blog/pull/177) Breaking: drop - support for Node < 16 ([@mansona]) -- [empress/empress-blog] - [#176](https://github.com/empress/empress-blog/pull/176) Update ember to v4.4 - with ember-cli-update ([@mansona]) +- [empress/empress-blog] [#180](https://github.com/empress/empress-blog/pull/180) update all dependencies ([@mansona]) +- [empress/empress-blog] [#179](https://github.com/empress/empress-blog/pull/179) update to v4.12 with ember-cli-update ([@mansona]) +- [empress/empress-blog] [#178](https://github.com/empress/empress-blog/pull/178) Update to 4.8 with ember-cli-update ([@mansona]) +- [empress/empress-blog] [#177](https://github.com/empress/empress-blog/pull/177) Breaking: drop support for Node < 16 ([@mansona]) +- [empress/empress-blog] [#176](https://github.com/empress/empress-blog/pull/176) Update ember to v4.4 with ember-cli-update ([@mansona]) ## JavaScript -- [kellyselden/boilerplate-update] - [#404](https://github.com/kellyselden/boilerplate-update/pull/404) Breaking: - Drop support for node 12 and fix CI ([@mansona]) -- [stefanpenner/node-fixturify-project] - [#85](https://github.com/stefanpenner/node-fixturify-project/pull/85) Bump - Node to 16, drop deprecated methods ([@lolmaus]) -- [stefanpenner/node-fixturify-project] - [#83](https://github.com/stefanpenner/node-fixturify-project/pull/83) - Maintenance: bump Node, typescript and type-fest ([@lolmaus]) +- [kellyselden/boilerplate-update] [#404](https://github.com/kellyselden/boilerplate-update/pull/404) Breaking: Drop support for node 12 and fix CI ([@mansona]) +- [stefanpenner/node-fixturify-project] [#85](https://github.com/stefanpenner/node-fixturify-project/pull/85) Bump Node to 16, drop deprecated methods ([@lolmaus]) +- [stefanpenner/node-fixturify-project] [#83](https://github.com/stefanpenner/node-fixturify-project/pull/83) Maintenance: bump Node, typescript and type-fest ([@lolmaus]) ## Internal -- [mainmatter/renovate-config] - [#17](https://github.com/mainmatter/renovate-config/pull/17) chore(deps): move - renovate config from ESA ([@BobrImperator]) +- [mainmatter/renovate-config] [#17](https://github.com/mainmatter/renovate-config/pull/17) chore(deps): move renovate config from ESA ([@BobrImperator]) ## typesafe-i18n -- [ivanhofer/typesafe-i18n] - [#724](https://github.com/ivanhofer/typesafe-i18n/pull/724) docs: add example - for JS + JSDocs for SvelteKit ([@oscard0m]) -- [ivanhofer/typesafe-i18n-demo-sveltekit] - [#39](https://github.com/ivanhofer/typesafe-i18n-demo-sveltekit/pull/39) docs: - add disclaimer for adapting app.d.ts for full TS type inference ([@oscard0m]) +- [ivanhofer/typesafe-i18n] [#724](https://github.com/ivanhofer/typesafe-i18n/pull/724) docs: add example for JS + JSDocs for SvelteKit ([@oscard0m]) +- [ivanhofer/typesafe-i18n-demo-sveltekit] [#39](https://github.com/ivanhofer/typesafe-i18n-demo-sveltekit/pull/39) docs: add disclaimer for adapting app.d.ts for full TS type inference ([@oscard0m]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@bobrimperator]: https://github.com/BobrImperator @@ -274,10 +113,8 @@ [@nickschot]: https://github.com/nickschot [@oscard0m]: https://github.com/oscard0m [@paoloricciuti]: https://github.com/paoloricciuti -[dazzlingfugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source -[dockyard/ember-composable-helpers]: - https://github.com/DockYard/ember-composable-helpers +[dazzlingfugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source +[dockyard/ember-composable-helpers]: https://github.com/DockYard/ember-composable-helpers [sveltelab/sveltelab]: https://github.com/SvelteLab/SvelteLab [ember-cli/ember-cli-update]: https://github.com/ember-cli/ember-cli-update [ember-cli/ember-try-config]: https://github.com/ember-cli/ember-try-config @@ -287,17 +124,13 @@ [ember-learn/ember-styleguide]: https://github.com/ember-learn/ember-styleguide [ember-learn/ember-website]: https://github.com/ember-learn/ember-website [ember-learn/guides-source]: https://github.com/ember-learn/guides-source -[embroider-build/addon-blueprint]: - https://github.com/embroider-build/addon-blueprint +[embroider-build/addon-blueprint]: https://github.com/embroider-build/addon-blueprint [embroider-build/embroider]: https://github.com/embroider-build/embroider -[embroider-build/scenario-tester]: - https://github.com/embroider-build/scenario-tester +[embroider-build/scenario-tester]: https://github.com/embroider-build/scenario-tester [empress/empress-blog]: https://github.com/empress/empress-blog -[ivanhofer/typesafe-i18n-demo-sveltekit]: - https://github.com/ivanhofer/typesafe-i18n-demo-sveltekit +[ivanhofer/typesafe-i18n-demo-sveltekit]: https://github.com/ivanhofer/typesafe-i18n-demo-sveltekit [ivanhofer/typesafe-i18n]: https://github.com/ivanhofer/typesafe-i18n -[kellyselden/boilerplate-update]: - https://github.com/kellyselden/boilerplate-update +[kellyselden/boilerplate-update]: https://github.com/kellyselden/boilerplate-update [mainmatter/ember-cookies]: https://github.com/mainmatter/ember-cookies [mainmatter/ember-error-route]: https://github.com/mainmatter/ember-error-route [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth @@ -307,16 +140,12 @@ [oscard0m/kit]: https://github.com/oscard0m/kit [oscard0m/storybook-i18n]: https://github.com/oscard0m/storybook-i18n [oscard0m/test-sveltekit]: https://github.com/oscard0m/test-sveltekit -[oscard0m/typesafe-i18n-demo-sveltekit]: - https://github.com/oscard0m/typesafe-i18n-demo-sveltekit -[paoloricciuti/sveltekit-search-params]: - https://github.com/paoloricciuti/sveltekit-search-params +[oscard0m/typesafe-i18n-demo-sveltekit]: https://github.com/oscard0m/typesafe-i18n-demo-sveltekit +[paoloricciuti/sveltekit-search-params]: https://github.com/paoloricciuti/sveltekit-search-params [poppa/sveltekit-svg]: https://github.com/poppa/sveltekit-svg -[pstanoev/simple-svelte-autocomplete]: - https://github.com/pstanoev/simple-svelte-autocomplete +[pstanoev/simple-svelte-autocomplete]: https://github.com/pstanoev/simple-svelte-autocomplete [rust-lang/this-week-in-rust]: https://github.com/rust-lang/this-week-in-rust [shipshapecode/swach]: https://github.com/shipshapecode/swach -[stefanpenner/node-fixturify-project]: - https://github.com/stefanpenner/node-fixturify-project +[stefanpenner/node-fixturify-project]: https://github.com/stefanpenner/node-fixturify-project [storybookjs/addon-svelte-csf]: https://github.com/storybookjs/addon-svelte-csf [sveltejs/svelte]: https://github.com/sveltejs/svelte diff --git a/src/twios/2023-08-22.md b/src/twios/2023-08-22.md index 757ed707e1..403c49c0ae 100644 --- a/src/twios/2023-08-22.md +++ b/src/twios/2023-08-22.md @@ -1,82 +1,46 @@ ## Astro -- [natemoo-re/astro-capo] [#2](https://github.com/natemoo-re/astro-capo/pull/2) - docs: add link to capo.js in README.md ([@oscard0m]) +- [natemoo-re/astro-capo] [#2](https://github.com/natemoo-re/astro-capo/pull/2) docs: add link to capo.js in README.md ([@oscard0m]) ## Svelte -- [SvelteLab/SvelteLab] [#279](https://github.com/SvelteLab/SvelteLab/pull/279) - feat: hack sveltekit client to show correct url over the iframe - ([@paoloricciuti]) -- [SvelteLab/SvelteLab] [#278](https://github.com/SvelteLab/SvelteLab/pull/278) - fix: ssr rewrite crashing server ([@paoloricciuti]) -- [sveltejs/kit] [#10638](https://github.com/sveltejs/kit/pull/10638) fix: - ensure ssrRewriteStacktrace doesn't throw ([@paoloricciuti]) +- [SvelteLab/SvelteLab] [#279](https://github.com/SvelteLab/SvelteLab/pull/279) feat: hack sveltekit client to show correct url over the iframe ([@paoloricciuti]) +- [SvelteLab/SvelteLab] [#278](https://github.com/SvelteLab/SvelteLab/pull/278) fix: ssr rewrite crashing server ([@paoloricciuti]) +- [sveltejs/kit] [#10638](https://github.com/sveltejs/kit/pull/10638) fix: ensure ssrRewriteStacktrace doesn't throw ([@paoloricciuti]) ## Ember.js -- [ember-cli/ember-cli-update] - [#1246](https://github.com/ember-cli/ember-cli-update/pull/1246) Drop support - for Node 14 ([@mansona]) -- [ember-cli/ember-cli-update] - [#1245](https://github.com/ember-cli/ember-cli-update/pull/1245) Setup - release-it ([@mansona]) -- [ember-cli/ember-cli-update] - [#1243](https://github.com/ember-cli/ember-cli-update/pull/1243) Fix CI - ([@mansona]) -- [ember-fastboot/ember-cli-fastboot] - [#926](https://github.com/ember-fastboot/ember-cli-fastboot/pull/926) make - sure that we lint (relevant) test-packages ([@mansona]) -- [ember-learn/ember-styleguide] - [#483](https://github.com/ember-learn/ember-styleguide/pull/483) Update - bottled ember and remove hack for ember-cli css ([@mansona]) -- [minutebase/ember-inline-svg] - [#128](https://github.com/minutebase/ember-inline-svg/pull/128) update - @embroider/test-setup ([@mansona]) +- [ember-cli/ember-cli-update] [#1246](https://github.com/ember-cli/ember-cli-update/pull/1246) Drop support for Node 14 ([@mansona]) +- [ember-cli/ember-cli-update] [#1245](https://github.com/ember-cli/ember-cli-update/pull/1245) Setup release-it ([@mansona]) +- [ember-cli/ember-cli-update] [#1243](https://github.com/ember-cli/ember-cli-update/pull/1243) Fix CI ([@mansona]) +- [ember-fastboot/ember-cli-fastboot] [#926](https://github.com/ember-fastboot/ember-cli-fastboot/pull/926) make sure that we lint (relevant) test-packages ([@mansona]) +- [ember-learn/ember-styleguide] [#483](https://github.com/ember-learn/ember-styleguide/pull/483) Update bottled ember and remove hack for ember-cli css ([@mansona]) +- [minutebase/ember-inline-svg] [#128](https://github.com/minutebase/ember-inline-svg/pull/128) update @embroider/test-setup ([@mansona]) ## Embroider -- [embroider-build/embroider] - [#1594](https://github.com/embroider-build/embroider/pull/1594) remove volta - from CI ([@mansona]) -- [embroider-build/embroider] - [#1591](https://github.com/embroider-build/embroider/pull/1591) Lay groundwork - for esm/cjs multi build from TS ([@mansona]) -- [embroider-build/embroider] - [#1593](https://github.com/embroider-build/embroider/pull/1593) [draft] Add - strict mode to app scenarios ([@lolmaus]) -- [embroider-build/scenario-tester] - [#18](https://github.com/embroider-build/scenario-tester/pull/18) Move to ESM - ([@mansona]) +- [embroider-build/embroider] [#1594](https://github.com/embroider-build/embroider/pull/1594) remove volta from CI ([@mansona]) +- [embroider-build/embroider] [#1591](https://github.com/embroider-build/embroider/pull/1591) Lay groundwork for esm/cjs multi build from TS ([@mansona]) +- [embroider-build/embroider] [#1593](https://github.com/embroider-build/embroider/pull/1593) [draft] Add strict mode to app scenarios ([@lolmaus]) +- [embroider-build/scenario-tester] [#18](https://github.com/embroider-build/scenario-tester/pull/18) Move to ESM ([@mansona]) ## Empress -- [empress/bottled-ember] - [#21](https://github.com/empress/bottled-ember/pull/21) drop support for node - 14 ([@mansona]) -- [empress/bottled-ember] - [#20](https://github.com/empress/bottled-ember/pull/20) setup release-it - ([@mansona]) -- [empress/bottled-ember] - [#19](https://github.com/empress/bottled-ember/pull/19) Fix generation when - inside a package that has ember-cli as a dependency ([@mansona]) +- [empress/bottled-ember] [#21](https://github.com/empress/bottled-ember/pull/21) drop support for node 14 ([@mansona]) +- [empress/bottled-ember] [#20](https://github.com/empress/bottled-ember/pull/20) setup release-it ([@mansona]) +- [empress/bottled-ember] [#19](https://github.com/empress/bottled-ember/pull/19) Fix generation when inside a package that has ember-cli as a dependency ([@mansona]) ## JavaScript -- [ef4/code-equality-assertions] - [#2](https://github.com/ef4/code-equality-assertions/pull/2) turn off type: - module ([@mansona]) +- [ef4/code-equality-assertions] [#2](https://github.com/ef4/code-equality-assertions/pull/2) turn off type: module ([@mansona]) ## typesafe-i18n -- [ivanhofer/typesafe-i18n-demo-sveltekit] - [#40](https://github.com/ivanhofer/typesafe-i18n-demo-sveltekit/pull/40) docs: - fix Warning box in README.md ([@oscard0m]) +- [ivanhofer/typesafe-i18n-demo-sveltekit] [#40](https://github.com/ivanhofer/typesafe-i18n-demo-sveltekit/pull/40) docs: fix Warning box in README.md ([@oscard0m]) ## zola -- [getzola/zola] [#2289](https://github.com/getzola/zola/pull/2289) docs: update - links to new Tera docs URL ([@oscard0m]) +- [getzola/zola] [#2289](https://github.com/getzola/zola/pull/2289) docs: update links to new Tera docs URL ([@oscard0m]) [@lolmaus]: https://github.com/lolmaus [@mansona]: https://github.com/mansona @@ -85,16 +49,13 @@ [sveltelab/sveltelab]: https://github.com/SvelteLab/SvelteLab [ef4/code-equality-assertions]: https://github.com/ef4/code-equality-assertions [ember-cli/ember-cli-update]: https://github.com/ember-cli/ember-cli-update -[ember-fastboot/ember-cli-fastboot]: - https://github.com/ember-fastboot/ember-cli-fastboot +[ember-fastboot/ember-cli-fastboot]: https://github.com/ember-fastboot/ember-cli-fastboot [ember-learn/ember-styleguide]: https://github.com/ember-learn/ember-styleguide [embroider-build/embroider]: https://github.com/embroider-build/embroider -[embroider-build/scenario-tester]: - https://github.com/embroider-build/scenario-tester +[embroider-build/scenario-tester]: https://github.com/embroider-build/scenario-tester [empress/bottled-ember]: https://github.com/empress/bottled-ember [getzola/zola]: https://github.com/getzola/zola -[ivanhofer/typesafe-i18n-demo-sveltekit]: - https://github.com/ivanhofer/typesafe-i18n-demo-sveltekit +[ivanhofer/typesafe-i18n-demo-sveltekit]: https://github.com/ivanhofer/typesafe-i18n-demo-sveltekit [minutebase/ember-inline-svg]: https://github.com/minutebase/ember-inline-svg [natemoo-re/astro-capo]: https://github.com/natemoo-re/astro-capo [sveltejs/kit]: https://github.com/sveltejs/kit diff --git a/src/twios/2023-09-21.md b/src/twios/2023-09-21.md index f1daf8de03..cde06a1136 100644 --- a/src/twios/2023-09-21.md +++ b/src/twios/2023-09-21.md @@ -1,56 +1,34 @@ ## Svelte -- [paoloricciuti/sveltekit-view-transition] - [#29](https://github.com/paoloricciuti/sveltekit-view-transition/pull/29) - Update README.md ([@paoloricciuti]) +- [paoloricciuti/sveltekit-view-transition] [#29](https://github.com/paoloricciuti/sveltekit-view-transition/pull/29) Update README.md ([@paoloricciuti]) ## Ember.js -- [DazzlingFugu/ember-fr-guides-source] - [#204](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/204) Start - translating guides/applications/initializers.md ([@BlueCutOfficial]) -- [ember-cli/ember-cli] - [#10382](https://github.com/ember-cli/ember-cli/pull/10382) Move to pnpm - ([@mansona]) -- [ember-cli/ember-try] [#966](https://github.com/ember-cli/ember-try/pull/966) - Enforce resolution-mode=highest for pnpm versions 8.0.0 to 8.6.\* ([@lolmaus]) -- [ember-learn/ember-api-docs-data] - [#10](https://github.com/ember-learn/ember-api-docs-data/pull/10) Add 5.2 - ([@mansona]) +- [DazzlingFugu/ember-fr-guides-source] [#204](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/204) Start translating guides/applications/initializers.md ([@BlueCutOfficial]) +- [ember-cli/ember-cli] [#10382](https://github.com/ember-cli/ember-cli/pull/10382) Move to pnpm ([@mansona]) +- [ember-cli/ember-try] [#966](https://github.com/ember-cli/ember-try/pull/966) Enforce resolution-mode=highest for pnpm versions 8.0.0 to 8.6.\* ([@lolmaus]) +- [ember-learn/ember-api-docs-data] [#10](https://github.com/ember-learn/ember-api-docs-data/pull/10) Add 5.2 ([@mansona]) ## Embroider -- [embroider-build/embroider] - [#1604](https://github.com/embroider-build/embroider/pull/1604) add - staticEmberSource to the readme example ([@mansona]) +- [embroider-build/embroider] [#1604](https://github.com/embroider-build/embroider/pull/1604) add staticEmberSource to the readme example ([@mansona]) ## Empress -- [empress/bottled-ember] - [#22](https://github.com/empress/bottled-ember/pull/22) use copy instead of - rename ([@mansona]) +- [empress/bottled-ember] [#22](https://github.com/empress/bottled-ember/pull/22) use copy instead of rename ([@mansona]) ## JavaScript -- [broccolijs/broccoli-filter] - [#53](https://github.com/broccolijs/broccoli-filter/pull/53) move from travis - to github actions ([@mansona]) +- [broccolijs/broccoli-filter] [#53](https://github.com/broccolijs/broccoli-filter/pull/53) move from travis to github actions ([@mansona]) ## Internal -- [mainmatter/renovate-config] - [#19](https://github.com/mainmatter/renovate-config/pull/19) - chore(ember-addon): fix and change schedule to automerge daily - ([@BobrImperator]) -- [mainmatter/renovate-config] - [#18](https://github.com/mainmatter/renovate-config/pull/18) - chore(ember-addon): add devDependencies automerging ([@BobrImperator]) +- [mainmatter/renovate-config] [#19](https://github.com/mainmatter/renovate-config/pull/19) chore(ember-addon): fix and change schedule to automerge daily ([@BobrImperator]) +- [mainmatter/renovate-config] [#18](https://github.com/mainmatter/renovate-config/pull/18) chore(ember-addon): add devDependencies automerging ([@BobrImperator]) ## Ember -- [ember-learn/ember-jsonapi-docs] - [#125](https://github.com/ember-learn/ember-jsonapi-docs/pull/125) Use volta - and corepack to run yarn and pnpm ([@mansona]) +- [ember-learn/ember-jsonapi-docs] [#125](https://github.com/ember-learn/ember-jsonapi-docs/pull/125) Use volta and corepack to run yarn and pnpm ([@mansona]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@bobrimperator]: https://github.com/BobrImperator @@ -59,17 +37,13 @@ [@marcoow]: https://github.com/marcoow [@paoloricciuti]: https://github.com/paoloricciuti [@pichfl]: https://github.com/pichfl -[dazzlingfugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source +[dazzlingfugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source [broccolijs/broccoli-filter]: https://github.com/broccolijs/broccoli-filter [ember-cli/ember-cli]: https://github.com/ember-cli/ember-cli [ember-cli/ember-try]: https://github.com/ember-cli/ember-try -[ember-learn/ember-api-docs-data]: - https://github.com/ember-learn/ember-api-docs-data -[ember-learn/ember-jsonapi-docs]: - https://github.com/ember-learn/ember-jsonapi-docs +[ember-learn/ember-api-docs-data]: https://github.com/ember-learn/ember-api-docs-data +[ember-learn/ember-jsonapi-docs]: https://github.com/ember-learn/ember-jsonapi-docs [embroider-build/embroider]: https://github.com/embroider-build/embroider [empress/bottled-ember]: https://github.com/empress/bottled-ember [mainmatter/renovate-config]: https://github.com/mainmatter/renovate-config -[paoloricciuti/sveltekit-view-transition]: - https://github.com/paoloricciuti/sveltekit-view-transition +[paoloricciuti/sveltekit-view-transition]: https://github.com/paoloricciuti/sveltekit-view-transition diff --git a/src/twios/2023-10-01.md b/src/twios/2023-10-01.md index 859823a830..14b95dd2c8 100644 --- a/src/twios/2023-10-01.md +++ b/src/twios/2023-10-01.md @@ -1,63 +1,35 @@ ## Svelte -- [paoloricciuti/sveltekit-view-transition] - [#34](https://github.com/paoloricciuti/sveltekit-view-transition/pull/34) - feat: add node and isInViewport to props of action functions - ([@paoloricciuti]) -- [theetrain/this-week-in-svelte] - [#3](https://github.com/theetrain/this-week-in-svelte/pull/3) Simple mocks - ([@paoloricciuti]) +- [paoloricciuti/sveltekit-view-transition] [#34](https://github.com/paoloricciuti/sveltekit-view-transition/pull/34) feat: add node and isInViewport to props of action functions ([@paoloricciuti]) +- [theetrain/this-week-in-svelte] [#3](https://github.com/theetrain/this-week-in-svelte/pull/3) Simple mocks ([@paoloricciuti]) ## Ember.js -- [ember-cli/ember-cli-update] - [#1249](https://github.com/ember-cli/ember-cli-update/pull/1249) fix - projectName if there is no package.json name ([@mansona]) -- [ember-learn/cli-guides] - [#304](https://github.com/ember-learn/cli-guides/pull/304) remove mention of - official support for Mocha ([@mansona]) -- [ember-learn/ember-api-docs-data] - [#18](https://github.com/ember-learn/ember-api-docs-data/pull/18) Fix missing - entries for Ember ([@mansona]) -- [ember-learn/ember-api-docs-data] - [#17](https://github.com/ember-learn/ember-api-docs-data/pull/17) re-generate - ember-data 2.18 ([@mansona]) -- [ember-learn/ember-api-docs-data] - [#16](https://github.com/ember-learn/ember-api-docs-data/pull/16) Fix ember - data ([@mansona]) -- [ember-learn/ember-api-docs-data] - [#15](https://github.com/ember-learn/ember-api-docs-data/pull/15) add missing - entries for ember-data 3.28 ([@mansona]) -- [ember-learn/guides-source] - [#1964](https://github.com/ember-learn/guides-source/pull/1964) remove - references to mocha in the guides ([@mansona]) +- [ember-cli/ember-cli-update] [#1249](https://github.com/ember-cli/ember-cli-update/pull/1249) fix projectName if there is no package.json name ([@mansona]) +- [ember-learn/cli-guides] [#304](https://github.com/ember-learn/cli-guides/pull/304) remove mention of official support for Mocha ([@mansona]) +- [ember-learn/ember-api-docs-data] [#18](https://github.com/ember-learn/ember-api-docs-data/pull/18) Fix missing entries for Ember ([@mansona]) +- [ember-learn/ember-api-docs-data] [#17](https://github.com/ember-learn/ember-api-docs-data/pull/17) re-generate ember-data 2.18 ([@mansona]) +- [ember-learn/ember-api-docs-data] [#16](https://github.com/ember-learn/ember-api-docs-data/pull/16) Fix ember data ([@mansona]) +- [ember-learn/ember-api-docs-data] [#15](https://github.com/ember-learn/ember-api-docs-data/pull/15) add missing entries for ember-data 3.28 ([@mansona]) +- [ember-learn/guides-source] [#1964](https://github.com/ember-learn/guides-source/pull/1964) remove references to mocha in the guides ([@mansona]) ## Embroider -- [embroider-build/embroider] - [#1616](https://github.com/embroider-build/embroider/pull/1616) prepare - release ([@mansona]) -- [embroider-build/embroider] - [#1614](https://github.com/embroider-build/embroider/pull/1614) esbuild - resolver for Vite dependency optimization ([@lolmaus]) +- [embroider-build/embroider] [#1616](https://github.com/embroider-build/embroider/pull/1616) prepare release ([@mansona]) +- [embroider-build/embroider] [#1614](https://github.com/embroider-build/embroider/pull/1614) esbuild resolver for Vite dependency optimization ([@lolmaus]) ## Empress -- [empress/ember-showdown-prism] - [#59](https://github.com/empress/ember-showdown-prism/pull/59) remove - ember-fetch to fix embroider tests ([@mansona]) +- [empress/ember-showdown-prism] [#59](https://github.com/empress/ember-showdown-prism/pull/59) remove ember-fetch to fix embroider tests ([@mansona]) [@lolmaus]: https://github.com/lolmaus [@mansona]: https://github.com/mansona [@paoloricciuti]: https://github.com/paoloricciuti [ember-cli/ember-cli-update]: https://github.com/ember-cli/ember-cli-update [ember-learn/cli-guides]: https://github.com/ember-learn/cli-guides -[ember-learn/ember-api-docs-data]: - https://github.com/ember-learn/ember-api-docs-data +[ember-learn/ember-api-docs-data]: https://github.com/ember-learn/ember-api-docs-data [ember-learn/guides-source]: https://github.com/ember-learn/guides-source [embroider-build/embroider]: https://github.com/embroider-build/embroider [empress/ember-showdown-prism]: https://github.com/empress/ember-showdown-prism -[paoloricciuti/sveltekit-view-transition]: - https://github.com/paoloricciuti/sveltekit-view-transition -[theetrain/this-week-in-svelte]: - https://github.com/theetrain/this-week-in-svelte +[paoloricciuti/sveltekit-view-transition]: https://github.com/paoloricciuti/sveltekit-view-transition +[theetrain/this-week-in-svelte]: https://github.com/theetrain/this-week-in-svelte diff --git a/src/twios/2023-10-09.md b/src/twios/2023-10-09.md index ba8b69c967..81ce696430 100644 --- a/src/twios/2023-10-09.md +++ b/src/twios/2023-10-09.md @@ -1,65 +1,31 @@ ## Embroider -- [embroider-build/content-tag] - [#34](https://github.com/embroider-build/content-tag/pull/34) Prepare Release - 1.1.1 ([@mansona]) -- [embroider-build/content-tag] - [#33](https://github.com/embroider-build/content-tag/pull/33) Add release-it - ([@mansona]) -- [embroider-build/content-tag] - [#32](https://github.com/embroider-build/content-tag/pull/32) setup npm - credentials for auto-publish ([@mansona]) -- [embroider-build/embroider] - [#1628](https://github.com/embroider-build/embroider/pull/1628) prepare a - release ([@mansona]) -- [embroider-build/embroider] - [#1627](https://github.com/embroider-build/embroider/pull/1627) WIP Resolver - refactor ([@mansona]) -- [embroider-build/embroider] - [#1622](https://github.com/embroider-build/embroider/pull/1622) use realpath - of engine's route when building resolver.json ([@mansona]) -- [embroider-build/embroider] - [#1623](https://github.com/embroider-build/embroider/pull/1623) Implement the - optimizeDeps() helper ([@lolmaus]) +- [embroider-build/content-tag] [#34](https://github.com/embroider-build/content-tag/pull/34) Prepare Release 1.1.1 ([@mansona]) +- [embroider-build/content-tag] [#33](https://github.com/embroider-build/content-tag/pull/33) Add release-it ([@mansona]) +- [embroider-build/content-tag] [#32](https://github.com/embroider-build/content-tag/pull/32) setup npm credentials for auto-publish ([@mansona]) +- [embroider-build/embroider] [#1628](https://github.com/embroider-build/embroider/pull/1628) prepare a release ([@mansona]) +- [embroider-build/embroider] [#1627](https://github.com/embroider-build/embroider/pull/1627) WIP Resolver refactor ([@mansona]) +- [embroider-build/embroider] [#1622](https://github.com/embroider-build/embroider/pull/1622) use realpath of engine's route when building resolver.json ([@mansona]) +- [embroider-build/embroider] [#1623](https://github.com/embroider-build/embroider/pull/1623) Implement the optimizeDeps() helper ([@lolmaus]) ## Ember -- [DazzlingFugu/guidemaker-ember-locale-template] - [#5](https://github.com/DazzlingFugu/guidemaker-ember-locale-template/pull/5) - [DO NOT MERGE] Configure the search bar ([@BlueCutOfficial]) -- [ember-cli/ember-cli] - [#10389](https://github.com/ember-cli/ember-cli/pull/10389) Merge beta into - master ([@mansona]) -- [emberobserver/client] - [#240](https://github.com/emberobserver/client/pull/240) Update Ember to 3.28 - ([@lolmaus]) -- [mainmatter/ember-cookies] - [#862](https://github.com/mainmatter/ember-cookies/pull/862) chore(deps): bump - prettier and eslint-plugin-prettier ([@BobrImperator]) -- [mainmatter/qunit-dom] - [#2062](https://github.com/mainmatter/qunit-dom/pull/2062) chore(ci): specify - job timeouts ([@BobrImperator]) -- [mainmatter/qunit-dom] - [#2061](https://github.com/mainmatter/qunit-dom/pull/2061) chore(ci): use - volta-cli github action for node and pnpm setup ([@BobrImperator]) -- [mainmatter/qunit-dom] - [#2060](https://github.com/mainmatter/qunit-dom/pull/2060) chore(deps): bump - prettier and eslint-plugin-prettier ([@BobrImperator]) -- [mainmatter/qunit-dom] - [#2055](https://github.com/mainmatter/qunit-dom/pull/2055) chore(release): - copy static LICENSE and README into the package during build - ([@BobrImperator]) -- [zeppelin/ember-click-outside] - [#265](https://github.com/zeppelin/ember-click-outside/pull/265) Node 14→16, - pnpm 7→8.8.x ([@zeppelin]) +- [DazzlingFugu/guidemaker-ember-locale-template] [#5](https://github.com/DazzlingFugu/guidemaker-ember-locale-template/pull/5) [DO NOT MERGE] Configure the search bar ([@BlueCutOfficial]) +- [ember-cli/ember-cli] [#10389](https://github.com/ember-cli/ember-cli/pull/10389) Merge beta into master ([@mansona]) +- [emberobserver/client] [#240](https://github.com/emberobserver/client/pull/240) Update Ember to 3.28 ([@lolmaus]) +- [mainmatter/ember-cookies] [#862](https://github.com/mainmatter/ember-cookies/pull/862) chore(deps): bump prettier and eslint-plugin-prettier ([@BobrImperator]) +- [mainmatter/qunit-dom] [#2062](https://github.com/mainmatter/qunit-dom/pull/2062) chore(ci): specify job timeouts ([@BobrImperator]) +- [mainmatter/qunit-dom] [#2061](https://github.com/mainmatter/qunit-dom/pull/2061) chore(ci): use volta-cli github action for node and pnpm setup ([@BobrImperator]) +- [mainmatter/qunit-dom] [#2060](https://github.com/mainmatter/qunit-dom/pull/2060) chore(deps): bump prettier and eslint-plugin-prettier ([@BobrImperator]) +- [mainmatter/qunit-dom] [#2055](https://github.com/mainmatter/qunit-dom/pull/2055) chore(release): copy static LICENSE and README into the package during build ([@BobrImperator]) +- [zeppelin/ember-click-outside] [#265](https://github.com/zeppelin/ember-click-outside/pull/265) Node 14→16, pnpm 7→8.8.x ([@zeppelin]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@bobrimperator]: https://github.com/BobrImperator [@lolmaus]: https://github.com/lolmaus [@mansona]: https://github.com/mansona [@zeppelin]: https://github.com/zeppelin -[dazzlingfugu/guidemaker-ember-locale-template]: - https://github.com/DazzlingFugu/guidemaker-ember-locale-template +[dazzlingfugu/guidemaker-ember-locale-template]: https://github.com/DazzlingFugu/guidemaker-ember-locale-template [ember-cli/ember-cli]: https://github.com/ember-cli/ember-cli [emberobserver/client]: https://github.com/emberobserver/client [embroider-build/content-tag]: https://github.com/embroider-build/content-tag diff --git a/src/twios/2023-10-15.md b/src/twios/2023-10-15.md index dce997d6ed..3626421ce8 100644 --- a/src/twios/2023-10-15.md +++ b/src/twios/2023-10-15.md @@ -1,43 +1,25 @@ ## Embroider -- [embroider-build/embroider] - [#1637](https://github.com/embroider-build/embroider/pull/1637) Update node to - 20 to test CI ([@mansona]) +- [embroider-build/embroider] [#1637](https://github.com/embroider-build/embroider/pull/1637) Update node to 20 to test CI ([@mansona]) ## JavaScript -- [mainmatter/continue-on-error-comment] - [#11](https://github.com/mainmatter/continue-on-error-comment/pull/11) Allow - action to work on pull_request_target and update documentation ([@mansona]) -- [miragejs/miragejs] [#1091](https://github.com/miragejs/miragejs/pull/1091) - Simplify lodash dependencies ([@mansona]) +- [mainmatter/continue-on-error-comment] [#11](https://github.com/mainmatter/continue-on-error-comment/pull/11) Allow action to work on pull_request_target and update documentation ([@mansona]) +- [miragejs/miragejs] [#1091](https://github.com/miragejs/miragejs/pull/1091) Simplify lodash dependencies ([@mansona]) ## Ember -- [mainmatter/ember-cookies] - [#862](https://github.com/mainmatter/ember-cookies/pull/862) chore(deps): bump - prettier and eslint-plugin-prettier ([@BobrImperator]) -- [mainmatter/qunit-dom] - [#2062](https://github.com/mainmatter/qunit-dom/pull/2062) chore(ci): specify - job timeouts ([@BobrImperator]) -- [mainmatter/qunit-dom] - [#2061](https://github.com/mainmatter/qunit-dom/pull/2061) chore(ci): use - volta-cli github action for node and pnpm setup ([@BobrImperator]) -- [mainmatter/qunit-dom] - [#2060](https://github.com/mainmatter/qunit-dom/pull/2060) chore(deps): bump - prettier and eslint-plugin-prettier ([@BobrImperator]) -- [miguelcobain/ember-paper] - [#1249](https://github.com/miguelcobain/ember-paper/pull/1249) update - ember-auto-import to v2 ([@mansona]) -- [miguelcobain/ember-paper] - [#1248](https://github.com/miguelcobain/ember-paper/pull/1248) apply fix to - allow continue-on-error-comment to work ([@mansona]) +- [mainmatter/ember-cookies] [#862](https://github.com/mainmatter/ember-cookies/pull/862) chore(deps): bump prettier and eslint-plugin-prettier ([@BobrImperator]) +- [mainmatter/qunit-dom] [#2062](https://github.com/mainmatter/qunit-dom/pull/2062) chore(ci): specify job timeouts ([@BobrImperator]) +- [mainmatter/qunit-dom] [#2061](https://github.com/mainmatter/qunit-dom/pull/2061) chore(ci): use volta-cli github action for node and pnpm setup ([@BobrImperator]) +- [mainmatter/qunit-dom] [#2060](https://github.com/mainmatter/qunit-dom/pull/2060) chore(deps): bump prettier and eslint-plugin-prettier ([@BobrImperator]) +- [miguelcobain/ember-paper] [#1249](https://github.com/miguelcobain/ember-paper/pull/1249) update ember-auto-import to v2 ([@mansona]) +- [miguelcobain/ember-paper] [#1248](https://github.com/miguelcobain/ember-paper/pull/1248) apply fix to allow continue-on-error-comment to work ([@mansona]) [@bobrimperator]: https://github.com/BobrImperator [@mansona]: https://github.com/mansona [embroider-build/embroider]: https://github.com/embroider-build/embroider -[mainmatter/continue-on-error-comment]: - https://github.com/mainmatter/continue-on-error-comment +[mainmatter/continue-on-error-comment]: https://github.com/mainmatter/continue-on-error-comment [mainmatter/ember-cookies]: https://github.com/mainmatter/ember-cookies [mainmatter/qunit-dom]: https://github.com/mainmatter/qunit-dom [miguelcobain/ember-paper]: https://github.com/miguelcobain/ember-paper diff --git a/src/twios/2023-10-22.md b/src/twios/2023-10-22.md index bb292d6fa5..f1c4fd44e4 100644 --- a/src/twios/2023-10-22.md +++ b/src/twios/2023-10-22.md @@ -1,65 +1,31 @@ ## Rust -- [marcoow/rust_rest] [#9](https://github.com/marcoow/rust_rest/pull/9) don't - depend on exact patch versions ([@marcoow]) +- [marcoow/rust_rest] [#9](https://github.com/marcoow/rust_rest/pull/9) don't depend on exact patch versions ([@marcoow]) ## Embroider -- [embroider-build/embroider] - [#1648](https://github.com/embroider-build/embroider/pull/1648) use package - paths instead of relative paths for app tree resolving ([@mansona]) +- [embroider-build/embroider] [#1648](https://github.com/embroider-build/embroider/pull/1648) use package paths instead of relative paths for app tree resolving ([@mansona]) ## Empress -- [empress/bottled-ember] - [#23](https://github.com/empress/bottled-ember/pull/23) Allow you to configure - Fastboot dependencies ([@mansona]) +- [empress/bottled-ember] [#23](https://github.com/empress/bottled-ember/pull/23) Allow you to configure Fastboot dependencies ([@mansona]) ## Ember -- [DazzlingFugu/guidemaker-ember-locale-template] - [#6](https://github.com/DazzlingFugu/guidemaker-ember-locale-template/pull/6) - [DRAFT] Use native classes ([@BlueCutOfficial]) -- [ember-learn/ember-styleguide] - [#491](https://github.com/ember-learn/ember-styleguide/pull/491) Drop support - for Ember < 3.28 ([@mansona]) -- [ember-learn/ember-styleguide] - [#490](https://github.com/ember-learn/ember-styleguide/pull/490) update to - v4.8 with ember-cli-update ([@mansona]) -- [ember-learn/ember-styleguide] - [#489](https://github.com/ember-learn/ember-styleguide/pull/489) move to - release-it for deploys ([@mansona]) -- [ember-learn/ember-styleguide] - [#488](https://github.com/ember-learn/ember-styleguide/pull/488) drop support - for EOL node < 18 ([@mansona]) -- [emberjs/ember-test-helpers] - [#1441](https://github.com/emberjs/ember-test-helpers/pull/1441) Don't swallow - deprecations and warnings when there is no test context: backport to v2 - ([@lolmaus]) -- [lan0/ember-power-time-picker] - [#8](https://github.com/lan0/ember-power-time-picker/pull/8) Upgrade to ember - 3.16 ([@Mikek2252]) -- [mixonic/ember-cli-deprecation-workflow] - [#158](https://github.com/mixonic/ember-cli-deprecation-workflow/pull/158) - Upgrade Ember to 3.28 ([@lolmaus]) -- [nickschot/ember-mobile-menu] - [#745](https://github.com/nickschot/ember-mobile-menu/pull/745) Remove - reliance on sinon ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#744](https://github.com/nickschot/ember-mobile-menu/pull/744) Replace - tracked-maps-and-sets with tracked-built-ins ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#743](https://github.com/nickschot/ember-mobile-menu/pull/743) Add missing - tracked-storage-polyfill to docs app ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#742](https://github.com/nickschot/ember-mobile-menu/pull/742) Drop - ember-source 3.28 ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#741](https://github.com/nickschot/ember-mobile-menu/pull/741) Upgrade - ember-qunit to v7, @ember/test-helpers to v3 ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#734](https://github.com/nickschot/ember-mobile-menu/pull/734) Drop Node 16 - support ([@nickschot]) +- [DazzlingFugu/guidemaker-ember-locale-template] [#6](https://github.com/DazzlingFugu/guidemaker-ember-locale-template/pull/6) [DRAFT] Use native classes ([@BlueCutOfficial]) +- [ember-learn/ember-styleguide] [#491](https://github.com/ember-learn/ember-styleguide/pull/491) Drop support for Ember < 3.28 ([@mansona]) +- [ember-learn/ember-styleguide] [#490](https://github.com/ember-learn/ember-styleguide/pull/490) update to v4.8 with ember-cli-update ([@mansona]) +- [ember-learn/ember-styleguide] [#489](https://github.com/ember-learn/ember-styleguide/pull/489) move to release-it for deploys ([@mansona]) +- [ember-learn/ember-styleguide] [#488](https://github.com/ember-learn/ember-styleguide/pull/488) drop support for EOL node < 18 ([@mansona]) +- [emberjs/ember-test-helpers] [#1441](https://github.com/emberjs/ember-test-helpers/pull/1441) Don't swallow deprecations and warnings when there is no test context: backport to v2 ([@lolmaus]) +- [lan0/ember-power-time-picker] [#8](https://github.com/lan0/ember-power-time-picker/pull/8) Upgrade to ember 3.16 ([@Mikek2252]) +- [mixonic/ember-cli-deprecation-workflow] [#158](https://github.com/mixonic/ember-cli-deprecation-workflow/pull/158) Upgrade Ember to 3.28 ([@lolmaus]) +- [nickschot/ember-mobile-menu] [#745](https://github.com/nickschot/ember-mobile-menu/pull/745) Remove reliance on sinon ([@nickschot]) +- [nickschot/ember-mobile-menu] [#744](https://github.com/nickschot/ember-mobile-menu/pull/744) Replace tracked-maps-and-sets with tracked-built-ins ([@nickschot]) +- [nickschot/ember-mobile-menu] [#743](https://github.com/nickschot/ember-mobile-menu/pull/743) Add missing tracked-storage-polyfill to docs app ([@nickschot]) +- [nickschot/ember-mobile-menu] [#742](https://github.com/nickschot/ember-mobile-menu/pull/742) Drop ember-source 3.28 ([@nickschot]) +- [nickschot/ember-mobile-menu] [#741](https://github.com/nickschot/ember-mobile-menu/pull/741) Upgrade ember-qunit to v7, @ember/test-helpers to v3 ([@nickschot]) +- [nickschot/ember-mobile-menu] [#734](https://github.com/nickschot/ember-mobile-menu/pull/734) Drop Node 16 support ([@nickschot]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@mikek2252]: https://github.com/Mikek2252 @@ -67,14 +33,12 @@ [@mansona]: https://github.com/mansona [@marcoow]: https://github.com/marcoow [@nickschot]: https://github.com/nickschot -[dazzlingfugu/guidemaker-ember-locale-template]: - https://github.com/DazzlingFugu/guidemaker-ember-locale-template +[dazzlingfugu/guidemaker-ember-locale-template]: https://github.com/DazzlingFugu/guidemaker-ember-locale-template [ember-learn/ember-styleguide]: https://github.com/ember-learn/ember-styleguide [emberjs/ember-test-helpers]: https://github.com/emberjs/ember-test-helpers [embroider-build/embroider]: https://github.com/embroider-build/embroider [empress/bottled-ember]: https://github.com/empress/bottled-ember [lan0/ember-power-time-picker]: https://github.com/lan0/ember-power-time-picker [marcoow/rust_rest]: https://github.com/marcoow/rust_rest -[mixonic/ember-cli-deprecation-workflow]: - https://github.com/mixonic/ember-cli-deprecation-workflow +[mixonic/ember-cli-deprecation-workflow]: https://github.com/mixonic/ember-cli-deprecation-workflow [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu diff --git a/src/twios/2023-10-29.md b/src/twios/2023-10-29.md index 4d813ee8ab..c187f87e72 100644 --- a/src/twios/2023-10-29.md +++ b/src/twios/2023-10-29.md @@ -1,42 +1,25 @@ ## Rust -- [marcoow/rust_rest] [#12](https://github.com/marcoow/rust_rest/pull/12) fix - command for running test migrations ([@marcoow]) -- [marcoow/rust_rest] [#11](https://github.com/marcoow/rust_rest/pull/11) rename - users to tasks ([@marcoow]) -- [marcoow/rust_rest] [#10](https://github.com/marcoow/rust_rest/pull/10) - Require authorization for user creation ([@marcoow]) +- [marcoow/rust_rest] [#12](https://github.com/marcoow/rust_rest/pull/12) fix command for running test migrations ([@marcoow]) +- [marcoow/rust_rest] [#11](https://github.com/marcoow/rust_rest/pull/11) rename users to tasks ([@marcoow]) +- [marcoow/rust_rest] [#10](https://github.com/marcoow/rust_rest/pull/10) Require authorization for user creation ([@marcoow]) ## Embroider -- [embroider-build/embroider] - [#1650](https://github.com/embroider-build/embroider/pull/1650) [WIP] Esbuild - resolver ([@mansona]) -- [embroider-build/embroider] - [#1649](https://github.com/embroider-build/embroider/pull/1649) update pnpm - ([@mansona]) -- [embroider-build/scenario-tester] - [#22](https://github.com/embroider-build/scenario-tester/pull/22) fix CI to - remove volta ([@mansona]) +- [embroider-build/embroider] [#1650](https://github.com/embroider-build/embroider/pull/1650) [WIP] Esbuild resolver ([@mansona]) +- [embroider-build/embroider] [#1649](https://github.com/embroider-build/embroider/pull/1649) update pnpm ([@mansona]) +- [embroider-build/scenario-tester] [#22](https://github.com/embroider-build/scenario-tester/pull/22) fix CI to remove volta ([@mansona]) ## Ember -- [ember-learn/ember-api-docs-data] - [#19](https://github.com/ember-learn/ember-api-docs-data/pull/19) fix issue - with ember 4.12 pointing at the wrong patch version ([@mansona]) -- [mixonic/ember-cli-deprecation-workflow] - [#159](https://github.com/mixonic/ember-cli-deprecation-workflow/pull/159) - [BREAKING] Convert to a module. Drops support for Ember < 3.28, requires - manual initialization ([@lolmaus]) +- [ember-learn/ember-api-docs-data] [#19](https://github.com/ember-learn/ember-api-docs-data/pull/19) fix issue with ember 4.12 pointing at the wrong patch version ([@mansona]) +- [mixonic/ember-cli-deprecation-workflow] [#159](https://github.com/mixonic/ember-cli-deprecation-workflow/pull/159) [BREAKING] Convert to a module. Drops support for Ember < 3.28, requires manual initialization ([@lolmaus]) [@lolmaus]: https://github.com/lolmaus [@mansona]: https://github.com/mansona [@marcoow]: https://github.com/marcoow -[ember-learn/ember-api-docs-data]: - https://github.com/ember-learn/ember-api-docs-data +[ember-learn/ember-api-docs-data]: https://github.com/ember-learn/ember-api-docs-data [embroider-build/embroider]: https://github.com/embroider-build/embroider -[embroider-build/scenario-tester]: - https://github.com/embroider-build/scenario-tester +[embroider-build/scenario-tester]: https://github.com/embroider-build/scenario-tester [marcoow/rust_rest]: https://github.com/marcoow/rust_rest -[mixonic/ember-cli-deprecation-workflow]: - https://github.com/mixonic/ember-cli-deprecation-workflow +[mixonic/ember-cli-deprecation-workflow]: https://github.com/mixonic/ember-cli-deprecation-workflow diff --git a/src/twios/2023-11-05.md b/src/twios/2023-11-05.md index c16a5b4448..1f6c9cf294 100644 --- a/src/twios/2023-11-05.md +++ b/src/twios/2023-11-05.md @@ -1,101 +1,53 @@ ## Rust -- [marcoow/rust_rest] [#26](https://github.com/marcoow/rust_rest/pull/26) Db - cleanup ([@marcoow]) -- [marcoow/rust_rest] [#25](https://github.com/marcoow/rust_rest/pull/25) - simplify test helper ([@marcoow]) -- [marcoow/rust_rest] [#24](https://github.com/marcoow/rust_rest/pull/24) Task - for resetting db ([@marcoow]) -- [marcoow/rust_rest] [#20](https://github.com/marcoow/rust_rest/pull/20) DB - Seeding ([@marcoow]) -- [marcoow/rust_rest] [#19](https://github.com/marcoow/rust_rest/pull/19) - Introduce auth & users ([@marcoow]) -- [marcoow/rust_rest] [#18](https://github.com/marcoow/rust_rest/pull/18) Fix DB - isolation for tests ([@marcoow]) -- [marcoow/rust_rest] [#16](https://github.com/marcoow/rust_rest/pull/16) use - correct db methods ([@marcoow]) -- [marcoow/rust_rest] [#15](https://github.com/marcoow/rust_rest/pull/15) - improve CLI ([@marcoow]) +- [marcoow/rust_rest] [#26](https://github.com/marcoow/rust_rest/pull/26) Db cleanup ([@marcoow]) +- [marcoow/rust_rest] [#25](https://github.com/marcoow/rust_rest/pull/25) simplify test helper ([@marcoow]) +- [marcoow/rust_rest] [#24](https://github.com/marcoow/rust_rest/pull/24) Task for resetting db ([@marcoow]) +- [marcoow/rust_rest] [#20](https://github.com/marcoow/rust_rest/pull/20) DB Seeding ([@marcoow]) +- [marcoow/rust_rest] [#19](https://github.com/marcoow/rust_rest/pull/19) Introduce auth & users ([@marcoow]) +- [marcoow/rust_rest] [#18](https://github.com/marcoow/rust_rest/pull/18) Fix DB isolation for tests ([@marcoow]) +- [marcoow/rust_rest] [#16](https://github.com/marcoow/rust_rest/pull/16) use correct db methods ([@marcoow]) +- [marcoow/rust_rest] [#15](https://github.com/marcoow/rust_rest/pull/15) improve CLI ([@marcoow]) ## Embroider -- [embroider-build/ember-auto-import] - [#597](https://github.com/embroider-build/ember-auto-import/pull/597) update - package-lock.json ([@mansona]) -- [embroider-build/embroider] - [#1652](https://github.com/embroider-build/embroider/pull/1652) - reverse-exports package ([@lolmaus]) -- [embroider-build/scenario-tester] - [#24](https://github.com/embroider-build/scenario-tester/pull/24) Set up - release-it ([@mansona]) -- [embroider-build/scenario-tester] - [#23](https://github.com/embroider-build/scenario-tester/pull/23) use the - right tsconfig for typedoc ([@mansona]) +- [embroider-build/ember-auto-import] [#597](https://github.com/embroider-build/ember-auto-import/pull/597) update package-lock.json ([@mansona]) +- [embroider-build/embroider] [#1652](https://github.com/embroider-build/embroider/pull/1652) reverse-exports package ([@lolmaus]) +- [embroider-build/scenario-tester] [#24](https://github.com/embroider-build/scenario-tester/pull/24) Set up release-it ([@mansona]) +- [embroider-build/scenario-tester] [#23](https://github.com/embroider-build/scenario-tester/pull/23) use the right tsconfig for typedoc ([@mansona]) ## Empress -- [empress/empress-blog] - [#182](https://github.com/empress/empress-blog/pull/182) update to v5.0 with - ember-cli-update ([@mansona]) -- [empress/empress-blog] - [#181](https://github.com/empress/empress-blog/pull/181) update js-yaml - ([@mansona]) +- [empress/empress-blog] [#182](https://github.com/empress/empress-blog/pull/182) update to v5.0 with ember-cli-update ([@mansona]) +- [empress/empress-blog] [#181](https://github.com/empress/empress-blog/pull/181) update js-yaml ([@mansona]) ## JavaScript -- [ember-learn/algolia-index-update-scripts] - [#19](https://github.com/ember-learn/algolia-index-update-scripts/pull/19) add - script for deleting tags ([@mansona]) -- [ember-learn/algolia-index-update-scripts] - [#18](https://github.com/ember-learn/algolia-index-update-scripts/pull/18) Run - search update scripts against ember-api-docs-data ([@mansona]) -- [ember-learn/ember-jsonapi-docs] - [#132](https://github.com/ember-learn/ember-jsonapi-docs/pull/132) use esm - properly with node ([@mansona]) -- [ember-learn/ember-jsonapi-docs] - [#131](https://github.com/ember-learn/ember-jsonapi-docs/pull/131) add semis - back ([@mansona]) -- [ember-learn/ember-jsonapi-docs] - [#130](https://github.com/ember-learn/ember-jsonapi-docs/pull/130) unify - indent style to space ([@mansona]) -- [ember-learn/ember-jsonapi-docs] - [#129](https://github.com/ember-learn/ember-jsonapi-docs/pull/129) Update - eslint and prettier ([@mansona]) -- [ember-learn/ember-jsonapi-docs] - [#127](https://github.com/ember-learn/ember-jsonapi-docs/pull/127) move to npm - and setup CI ([@mansona]) -- [kellyselden/boilerplate-update] - [#432](https://github.com/kellyselden/boilerplate-update/pull/432) run one npx - command at once on windows ([@mansona]) +- [ember-learn/algolia-index-update-scripts] [#19](https://github.com/ember-learn/algolia-index-update-scripts/pull/19) add script for deleting tags ([@mansona]) +- [ember-learn/algolia-index-update-scripts] [#18](https://github.com/ember-learn/algolia-index-update-scripts/pull/18) Run search update scripts against ember-api-docs-data ([@mansona]) +- [ember-learn/ember-jsonapi-docs] [#132](https://github.com/ember-learn/ember-jsonapi-docs/pull/132) use esm properly with node ([@mansona]) +- [ember-learn/ember-jsonapi-docs] [#131](https://github.com/ember-learn/ember-jsonapi-docs/pull/131) add semis back ([@mansona]) +- [ember-learn/ember-jsonapi-docs] [#130](https://github.com/ember-learn/ember-jsonapi-docs/pull/130) unify indent style to space ([@mansona]) +- [ember-learn/ember-jsonapi-docs] [#129](https://github.com/ember-learn/ember-jsonapi-docs/pull/129) Update eslint and prettier ([@mansona]) +- [ember-learn/ember-jsonapi-docs] [#127](https://github.com/ember-learn/ember-jsonapi-docs/pull/127) move to npm and setup CI ([@mansona]) +- [kellyselden/boilerplate-update] [#432](https://github.com/kellyselden/boilerplate-update/pull/432) run one npx command at once on windows ([@mansona]) ## Ember -- [DazzlingFugu/ember-fr-guides-source] - [#208](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/208) Update - guidemaker-elt, remove what was moved in the addon ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#207](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/207) - Improve the contributing guide ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#206](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/206) - Translate guides/tutorial/part-1 ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#208](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/208) Update guidemaker-elt, remove what was moved in the addon ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#207](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/207) Improve the contributing guide ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#206](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/206) Translate guides/tutorial/part-1 ([@BlueCutOfficial]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@lolmaus]: https://github.com/lolmaus [@mansona]: https://github.com/mansona [@marcoow]: https://github.com/marcoow -[dazzlingfugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source -[ember-learn/algolia-index-update-scripts]: - https://github.com/ember-learn/algolia-index-update-scripts -[ember-learn/ember-jsonapi-docs]: - https://github.com/ember-learn/ember-jsonapi-docs -[embroider-build/ember-auto-import]: - https://github.com/embroider-build/ember-auto-import +[dazzlingfugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source +[ember-learn/algolia-index-update-scripts]: https://github.com/ember-learn/algolia-index-update-scripts +[ember-learn/ember-jsonapi-docs]: https://github.com/ember-learn/ember-jsonapi-docs +[embroider-build/ember-auto-import]: https://github.com/embroider-build/ember-auto-import [embroider-build/embroider]: https://github.com/embroider-build/embroider -[embroider-build/scenario-tester]: - https://github.com/embroider-build/scenario-tester +[embroider-build/scenario-tester]: https://github.com/embroider-build/scenario-tester [empress/empress-blog]: https://github.com/empress/empress-blog -[kellyselden/boilerplate-update]: - https://github.com/kellyselden/boilerplate-update +[kellyselden/boilerplate-update]: https://github.com/kellyselden/boilerplate-update [marcoow/rust_rest]: https://github.com/marcoow/rust_rest diff --git a/src/twios/2023-11-19.md b/src/twios/2023-11-19.md index 3c227ce06a..7d0dabbc82 100644 --- a/src/twios/2023-11-19.md +++ b/src/twios/2023-11-19.md @@ -1,105 +1,56 @@ ## Rust -- [marcoow/rust_rest] [#36](https://github.com/marcoow/rust_rest/pull/36) Use - Sqlx instead of tokio-postres ([@marcoow]) -- [marcoow/rust_rest] [#35](https://github.com/marcoow/rust_rest/pull/35) Handle - panics ([@marcoow]) -- [marcoow/rust_rest] [#33](https://github.com/marcoow/rust_rest/pull/33) - Cleanup ([@marcoow]) -- [marcoow/rust_rest] [#32](https://github.com/marcoow/rust_rest/pull/32) Move - support code to support crate ([@marcoow]) -- [marcoow/rust_rest] [#31](https://github.com/marcoow/rust_rest/pull/31) Better - bin org ([@marcoow]) -- [marcoow/rust_rest] [#29](https://github.com/marcoow/rust_rest/pull/29) add - task for creating migration ([@marcoow]) -- [marcoow/rust_rest] [#28](https://github.com/marcoow/rust_rest/pull/28) Reuse - code in db bin ([@marcoow]) -- [marcoow/rust_rest] [#27](https://github.com/marcoow/rust_rest/pull/27) use - reset task on ci ([@marcoow]) +- [marcoow/rust_rest] [#36](https://github.com/marcoow/rust_rest/pull/36) Use Sqlx instead of tokio-postres ([@marcoow]) +- [marcoow/rust_rest] [#35](https://github.com/marcoow/rust_rest/pull/35) Handle panics ([@marcoow]) +- [marcoow/rust_rest] [#33](https://github.com/marcoow/rust_rest/pull/33) Cleanup ([@marcoow]) +- [marcoow/rust_rest] [#32](https://github.com/marcoow/rust_rest/pull/32) Move support code to support crate ([@marcoow]) +- [marcoow/rust_rest] [#31](https://github.com/marcoow/rust_rest/pull/31) Better bin org ([@marcoow]) +- [marcoow/rust_rest] [#29](https://github.com/marcoow/rust_rest/pull/29) add task for creating migration ([@marcoow]) +- [marcoow/rust_rest] [#28](https://github.com/marcoow/rust_rest/pull/28) Reuse code in db bin ([@marcoow]) +- [marcoow/rust_rest] [#27](https://github.com/marcoow/rust_rest/pull/27) use reset task on ci ([@marcoow]) ## Svelte -- [mainmatter/svelte-promise-modals] - [#38](https://github.com/mainmatter/svelte-promise-modals/pull/38) Add docs - ([@zeppelin]) -- [mainmatter/svelte-promise-modals] - [#37](https://github.com/mainmatter/svelte-promise-modals/pull/37) Fix - `clickOutsideDeactivates` option ([@zeppelin]) -- [mainmatter/svelte-promise-modals] - [#33](https://github.com/mainmatter/svelte-promise-modals/pull/33) Kitchen - sink ([@zeppelin]) -- [mainmatter/svelte-promise-modals] - [#32](https://github.com/mainmatter/svelte-promise-modals/pull/32) Upgrade - Svelte packages ([@zeppelin]) -- [mainmatter/svelte-promise-modals] - [#31](https://github.com/mainmatter/svelte-promise-modals/pull/31) Rename - output dir \_app → app ([@zeppelin]) -- [mainmatter/svelte-promise-modals] - [#30](https://github.com/mainmatter/svelte-promise-modals/pull/30) Deploy to - GitHub pages ([@zeppelin]) -- [sveltejs/kit] [#11066](https://github.com/sveltejs/kit/pull/11066) feat: - allow for fine grained invalidation of search params ([@paoloricciuti]) -- [sveltejs/svelte] [#9462](https://github.com/sveltejs/svelte/pull/9462) fix: - allow member access on directives ([@paoloricciuti]) -- [sveltejs/svelte] [#9439](https://github.com/sveltejs/svelte/pull/9439) fix: - allow svelte:self in snippets ([@paoloricciuti]) +- [mainmatter/svelte-promise-modals] [#38](https://github.com/mainmatter/svelte-promise-modals/pull/38) Add docs ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#37](https://github.com/mainmatter/svelte-promise-modals/pull/37) Fix `clickOutsideDeactivates` option ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#33](https://github.com/mainmatter/svelte-promise-modals/pull/33) Kitchen sink ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#32](https://github.com/mainmatter/svelte-promise-modals/pull/32) Upgrade Svelte packages ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#31](https://github.com/mainmatter/svelte-promise-modals/pull/31) Rename output dir \_app → app ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#30](https://github.com/mainmatter/svelte-promise-modals/pull/30) Deploy to GitHub pages ([@zeppelin]) +- [sveltejs/kit] [#11066](https://github.com/sveltejs/kit/pull/11066) feat: allow for fine grained invalidation of search params ([@paoloricciuti]) +- [sveltejs/svelte] [#9462](https://github.com/sveltejs/svelte/pull/9462) fix: allow member access on directives ([@paoloricciuti]) +- [sveltejs/svelte] [#9439](https://github.com/sveltejs/svelte/pull/9439) fix: allow svelte:self in snippets ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#1671](https://github.com/embroider-build/embroider/pull/1671) Prepare a - release ([@mansona]) -- [embroider-build/embroider] - [#1670](https://github.com/embroider-build/embroider/pull/1670) Fix looping - for unchanged files ([@mansona]) -- [embroider-build/embroider] - [#1668](https://github.com/embroider-build/embroider/pull/1668) prepare - release ([@mansona]) -- [embroider-build/embroider] - [#1666](https://github.com/embroider-build/embroider/pull/1666) unpin - json-stable-stringify ([@mansona]) -- [embroider-build/embroider] - [#1658](https://github.com/embroider-build/embroider/pull/1658) change - release-plan to get publish-stable to run ([@mansona]) +- [embroider-build/embroider] [#1671](https://github.com/embroider-build/embroider/pull/1671) Prepare a release ([@mansona]) +- [embroider-build/embroider] [#1670](https://github.com/embroider-build/embroider/pull/1670) Fix looping for unchanged files ([@mansona]) +- [embroider-build/embroider] [#1668](https://github.com/embroider-build/embroider/pull/1668) prepare release ([@mansona]) +- [embroider-build/embroider] [#1666](https://github.com/embroider-build/embroider/pull/1666) unpin json-stable-stringify ([@mansona]) +- [embroider-build/embroider] [#1658](https://github.com/embroider-build/embroider/pull/1658) change release-plan to get publish-stable to run ([@mansona]) ## JavaScript -- [embroider-build/release-plan] - [#1](https://github.com/embroider-build/release-plan/pull/1) use tsup - ([@mansona]) +- [embroider-build/release-plan] [#1](https://github.com/embroider-build/release-plan/pull/1) use tsup ([@mansona]) ## Ember -- [ember-fastboot/ember-cli-fastboot] - [#931](https://github.com/ember-fastboot/ember-cli-fastboot/pull/931) update - release-it ([@mansona]) -- [ember-fastboot/ember-cli-fastboot] - [#930](https://github.com/ember-fastboot/ember-cli-fastboot/pull/930) update - pnpm to v8 ([@mansona]) -- [ember-fastboot/ember-cli-fastboot] - [#929](https://github.com/ember-fastboot/ember-cli-fastboot/pull/929) fix json - stringify in fastboot-config ([@mansona]) -- [nickschot/ember-mobile-menu] - [#791](https://github.com/nickschot/ember-mobile-menu/pull/791) Enable - readme/license copying to published addon ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#790](https://github.com/nickschot/ember-mobile-menu/pull/790) Remove Travis - CI badge ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#789](https://github.com/nickschot/ember-mobile-menu/pull/789) Remove v1 - addon/cleanup ([@nickschot]) +- [ember-fastboot/ember-cli-fastboot] [#931](https://github.com/ember-fastboot/ember-cli-fastboot/pull/931) update release-it ([@mansona]) +- [ember-fastboot/ember-cli-fastboot] [#930](https://github.com/ember-fastboot/ember-cli-fastboot/pull/930) update pnpm to v8 ([@mansona]) +- [ember-fastboot/ember-cli-fastboot] [#929](https://github.com/ember-fastboot/ember-cli-fastboot/pull/929) fix json stringify in fastboot-config ([@mansona]) +- [nickschot/ember-mobile-menu] [#791](https://github.com/nickschot/ember-mobile-menu/pull/791) Enable readme/license copying to published addon ([@nickschot]) +- [nickschot/ember-mobile-menu] [#790](https://github.com/nickschot/ember-mobile-menu/pull/790) Remove Travis CI badge ([@nickschot]) +- [nickschot/ember-mobile-menu] [#789](https://github.com/nickschot/ember-mobile-menu/pull/789) Remove v1 addon/cleanup ([@nickschot]) [@mansona]: https://github.com/mansona [@marcoow]: https://github.com/marcoow [@nickschot]: https://github.com/nickschot [@paoloricciuti]: https://github.com/paoloricciuti [@zeppelin]: https://github.com/zeppelin -[ember-fastboot/ember-cli-fastboot]: - https://github.com/ember-fastboot/ember-cli-fastboot +[ember-fastboot/ember-cli-fastboot]: https://github.com/ember-fastboot/ember-cli-fastboot [embroider-build/embroider]: https://github.com/embroider-build/embroider [embroider-build/release-plan]: https://github.com/embroider-build/release-plan -[mainmatter/svelte-promise-modals]: - https://github.com/mainmatter/svelte-promise-modals +[mainmatter/svelte-promise-modals]: https://github.com/mainmatter/svelte-promise-modals [marcoow/rust_rest]: https://github.com/marcoow/rust_rest [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu [sveltejs/kit]: https://github.com/sveltejs/kit diff --git a/src/twios/2023-11-26.md b/src/twios/2023-11-26.md index c70b467062..50561acc9d 100644 --- a/src/twios/2023-11-26.md +++ b/src/twios/2023-11-26.md @@ -1,164 +1,67 @@ ## Rust -- [marcoow/rust_rest] [#42](https://github.com/marcoow/rust_rest/pull/42) allow - setting bind addr via env vars ([@marcoow]) -- [marcoow/rust_rest] [#41](https://github.com/marcoow/rust_rest/pull/41) move - determination of log level into support crate ([@marcoow]) -- [marcoow/rust_rest] [#40](https://github.com/marcoow/rust_rest/pull/40) Add - environment-specific content handling ([@marcoow]) -- [marcoow/rust_rest] [#39](https://github.com/marcoow/rust_rest/pull/39) - Allowing setting log level via env var ([@marcoow]) -- [marcoow/rust_rest] [#37](https://github.com/marcoow/rust_rest/pull/37) - Improve migrations CLI ([@marcoow]) +- [marcoow/rust_rest] [#42](https://github.com/marcoow/rust_rest/pull/42) allow setting bind addr via env vars ([@marcoow]) +- [marcoow/rust_rest] [#41](https://github.com/marcoow/rust_rest/pull/41) move determination of log level into support crate ([@marcoow]) +- [marcoow/rust_rest] [#40](https://github.com/marcoow/rust_rest/pull/40) Add environment-specific content handling ([@marcoow]) +- [marcoow/rust_rest] [#39](https://github.com/marcoow/rust_rest/pull/39) Allowing setting log level via env var ([@marcoow]) +- [marcoow/rust_rest] [#37](https://github.com/marcoow/rust_rest/pull/37) Improve migrations CLI ([@marcoow]) ## Svelte -- [mainmatter/svelte-promise-modals] - [#42](https://github.com/mainmatter/svelte-promise-modals/pull/42) Enable - analytics via Plausible ([@marcoow]) -- [mainmatter/svelte-promise-modals] - [#41](https://github.com/mainmatter/svelte-promise-modals/pull/41) Fix typos - in the README ([@marcoow]) -- [mainmatter/svelte-promise-modals] - [#39](https://github.com/mainmatter/svelte-promise-modals/pull/39) add - standard Mainmatter copyright ([@marcoow]) -- [mainmatter/svelte-promise-modals] - [#43](https://github.com/mainmatter/svelte-promise-modals/pull/43) Add - user-facing, fix internal types ([@zeppelin]) -- [mainmatter/svelte-promise-modals] - [#40](https://github.com/mainmatter/svelte-promise-modals/pull/40) API change: - spread modal data as props instead of a concrete data object ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#42](https://github.com/mainmatter/svelte-promise-modals/pull/42) Enable analytics via Plausible ([@marcoow]) +- [mainmatter/svelte-promise-modals] [#41](https://github.com/mainmatter/svelte-promise-modals/pull/41) Fix typos in the README ([@marcoow]) +- [mainmatter/svelte-promise-modals] [#39](https://github.com/mainmatter/svelte-promise-modals/pull/39) add standard Mainmatter copyright ([@marcoow]) +- [mainmatter/svelte-promise-modals] [#43](https://github.com/mainmatter/svelte-promise-modals/pull/43) Add user-facing, fix internal types ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#40](https://github.com/mainmatter/svelte-promise-modals/pull/40) API change: spread modal data as props instead of a concrete data object ([@zeppelin]) ## Embroider -- [embroider-build/ember-auto-import] - [#598](https://github.com/embroider-build/ember-auto-import/pull/598) Add - release-plan for automating releases ([@mansona]) -- [embroider-build/embroider] - [#1676](https://github.com/embroider-build/embroider/pull/1676) fix single - asterisk replacement in reverse-exports ([@mansona]) +- [embroider-build/ember-auto-import] [#598](https://github.com/embroider-build/ember-auto-import/pull/598) Add release-plan for automating releases ([@mansona]) +- [embroider-build/embroider] [#1676](https://github.com/embroider-build/embroider/pull/1676) fix single asterisk replacement in reverse-exports ([@mansona]) ## JavaScript -- [embroider-build/release-plan] - [#25](https://github.com/embroider-build/release-plan/pull/25) remove - reference to @embroider ([@mansona]) -- [embroider-build/release-plan] - [#24](https://github.com/embroider-build/release-plan/pull/24) add support for - npm workspaces ([@mansona]) -- [embroider-build/release-plan] - [#23](https://github.com/embroider-build/release-plan/pull/23) use - require.resolve to find lerna-changelog ([@mansona]) -- [embroider-build/release-plan] - [#22](https://github.com/embroider-build/release-plan/pull/22) remove unused - package.json ([@mansona]) -- [embroider-build/release-plan] - [#21](https://github.com/embroider-build/release-plan/pull/21) don't throw - when we encounter an unknown package ([@mansona]) -- [embroider-build/release-plan] - [#20](https://github.com/embroider-build/release-plan/pull/20) fix updating - changelog ([@mansona]) -- [embroider-build/release-plan] - [#17](https://github.com/embroider-build/release-plan/pull/17) add a basic - readme ([@mansona]) -- [embroider-build/release-plan] - [#15](https://github.com/embroider-build/release-plan/pull/15) actually use - otp when it's provided ([@mansona]) -- [embroider-build/release-plan] - [#13](https://github.com/embroider-build/release-plan/pull/13) Fix npm publish - ([@mansona]) -- [embroider-build/release-plan] - [#11](https://github.com/embroider-build/release-plan/pull/11) Fix publish - step ([@mansona]) -- [embroider-build/release-plan] - [#7](https://github.com/embroider-build/release-plan/pull/7) use dist/cli.js - directly in workflows ([@mansona]) -- [embroider-build/release-plan] - [#6](https://github.com/embroider-build/release-plan/pull/6) add workflows for - review and release ([@mansona]) -- [embroider-build/release-plan] - [#5](https://github.com/embroider-build/release-plan/pull/5) add - --single-package option ([@mansona]) -- [embroider-build/release-plan] - [#4](https://github.com/embroider-build/release-plan/pull/4) reset version so - release-plan will work on itself ([@mansona]) -- [embroider-build/release-plan] - [#3](https://github.com/embroider-build/release-plan/pull/3) convert - everything to work correctly with ESM ([@mansona]) -- [embroider-build/release-plan] - [#2](https://github.com/embroider-build/release-plan/pull/2) revert back from - tsup to tsc ([@mansona]) -- [mansona/create-release-plan-setup] - [#19](https://github.com/mansona/create-release-plan-setup/pull/19) update - plan when a PR is labeled ([@mansona]) -- [mansona/create-release-plan-setup] - [#18](https://github.com/mansona/create-release-plan-setup/pull/18) add - --singlePackage for CI ([@mansona]) -- [mansona/create-release-plan-setup] - [#17](https://github.com/mansona/create-release-plan-setup/pull/17) Update - more deps ([@mansona]) -- [mansona/create-release-plan-setup] - [#16](https://github.com/mansona/create-release-plan-setup/pull/16) update all - dependencies ([@mansona]) -- [mansona/create-release-plan-setup] - [#15](https://github.com/mansona/create-release-plan-setup/pull/15) Update - preview description ([@mansona]) -- [mansona/create-release-plan-setup] - [#13](https://github.com/mansona/create-release-plan-setup/pull/13) setup - release-plan ([@mansona]) -- [storybookjs/storybook] - [#24955](https://github.com/storybookjs/storybook/pull/24955) SvelteKit: - Default to log an action for `goto`, `invalidate` and `invalidateAll` - ([@paoloricciuti]) -- [storybookjs/storybook] - [#24921](https://github.com/storybookjs/storybook/pull/24921) Svelte: Fix - decorators always running twice ([@paoloricciuti]) +- [embroider-build/release-plan] [#25](https://github.com/embroider-build/release-plan/pull/25) remove reference to @embroider ([@mansona]) +- [embroider-build/release-plan] [#24](https://github.com/embroider-build/release-plan/pull/24) add support for npm workspaces ([@mansona]) +- [embroider-build/release-plan] [#23](https://github.com/embroider-build/release-plan/pull/23) use require.resolve to find lerna-changelog ([@mansona]) +- [embroider-build/release-plan] [#22](https://github.com/embroider-build/release-plan/pull/22) remove unused package.json ([@mansona]) +- [embroider-build/release-plan] [#21](https://github.com/embroider-build/release-plan/pull/21) don't throw when we encounter an unknown package ([@mansona]) +- [embroider-build/release-plan] [#20](https://github.com/embroider-build/release-plan/pull/20) fix updating changelog ([@mansona]) +- [embroider-build/release-plan] [#17](https://github.com/embroider-build/release-plan/pull/17) add a basic readme ([@mansona]) +- [embroider-build/release-plan] [#15](https://github.com/embroider-build/release-plan/pull/15) actually use otp when it's provided ([@mansona]) +- [embroider-build/release-plan] [#13](https://github.com/embroider-build/release-plan/pull/13) Fix npm publish ([@mansona]) +- [embroider-build/release-plan] [#11](https://github.com/embroider-build/release-plan/pull/11) Fix publish step ([@mansona]) +- [embroider-build/release-plan] [#7](https://github.com/embroider-build/release-plan/pull/7) use dist/cli.js directly in workflows ([@mansona]) +- [embroider-build/release-plan] [#6](https://github.com/embroider-build/release-plan/pull/6) add workflows for review and release ([@mansona]) +- [embroider-build/release-plan] [#5](https://github.com/embroider-build/release-plan/pull/5) add --single-package option ([@mansona]) +- [embroider-build/release-plan] [#4](https://github.com/embroider-build/release-plan/pull/4) reset version so release-plan will work on itself ([@mansona]) +- [embroider-build/release-plan] [#3](https://github.com/embroider-build/release-plan/pull/3) convert everything to work correctly with ESM ([@mansona]) +- [embroider-build/release-plan] [#2](https://github.com/embroider-build/release-plan/pull/2) revert back from tsup to tsc ([@mansona]) +- [mansona/create-release-plan-setup] [#19](https://github.com/mansona/create-release-plan-setup/pull/19) update plan when a PR is labeled ([@mansona]) +- [mansona/create-release-plan-setup] [#18](https://github.com/mansona/create-release-plan-setup/pull/18) add --singlePackage for CI ([@mansona]) +- [mansona/create-release-plan-setup] [#17](https://github.com/mansona/create-release-plan-setup/pull/17) Update more deps ([@mansona]) +- [mansona/create-release-plan-setup] [#16](https://github.com/mansona/create-release-plan-setup/pull/16) update all dependencies ([@mansona]) +- [mansona/create-release-plan-setup] [#15](https://github.com/mansona/create-release-plan-setup/pull/15) Update preview description ([@mansona]) +- [mansona/create-release-plan-setup] [#13](https://github.com/mansona/create-release-plan-setup/pull/13) setup release-plan ([@mansona]) +- [storybookjs/storybook] [#24955](https://github.com/storybookjs/storybook/pull/24955) SvelteKit: Default to log an action for `goto`, `invalidate` and `invalidateAll` ([@paoloricciuti]) +- [storybookjs/storybook] [#24921](https://github.com/storybookjs/storybook/pull/24921) Svelte: Fix decorators always running twice ([@paoloricciuti]) ## Ember -- [ember-learn/ember-blog] - [#1318](https://github.com/ember-learn/ember-blog/pull/1318) add the embroider - initiative guest post ([@mansona]) -- [embroider-build/addon-blueprint] - [#230](https://github.com/embroider-build/addon-blueprint/pull/230) Add - missing files to --addon-only output ([@lolmaus]) -- [mainmatter/ember-promise-modals] - [#863](https://github.com/mainmatter/ember-promise-modals/pull/863) Enable - analytics via Plausible ([@marcoow]) -- [mainmatter/ember-promise-modals] - [#862](https://github.com/mainmatter/ember-promise-modals/pull/862) add proper - copyright message ([@marcoow]) -- [mainmatter/ember-promise-modals] - [#864](https://github.com/mainmatter/ember-promise-modals/pull/864) WIP Fix ci - ([@nickschot]) -- [mansona/ember-cli-notifications] - [#367](https://github.com/mansona/ember-cli-notifications/pull/367) setup - release-plan ([@mansona]) -- [mansona/ember-cli-notifications] - [#366](https://github.com/mansona/ember-cli-notifications/pull/366) fix - lint-to-the-future CI job ([@mansona]) -- [mansona/ember-cli-notifications] - [#365](https://github.com/mansona/ember-cli-notifications/pull/365) move to a - v2 addon ([@mansona]) -- [mixonic/ember-cli-deprecation-workflow] - [#178](https://github.com/mixonic/ember-cli-deprecation-workflow/pull/178) - Upgrade Ember CLI to 5.4 ([@lolmaus]) -- [nickschot/ember-mobile-menu] - [#804](https://github.com/nickschot/ember-mobile-menu/pull/804) WIP re-add - support for ember-source v3.28.0 ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#802](https://github.com/nickschot/ember-mobile-menu/pull/802) Make - tracked-built-ins a peerDependency ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#801](https://github.com/nickschot/ember-mobile-menu/pull/801) Remove - node/ember-cli-babel requirements from README.md, fix ember-concurrency - requirement. ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#800](https://github.com/nickschot/ember-mobile-menu/pull/800) Specify - ember-source >=v4 as a peer dependency ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#798](https://github.com/nickschot/ember-mobile-menu/pull/798) Replace - ember-could-get-used-to-this with ember-resources ([@nickschot]) +- [ember-learn/ember-blog] [#1318](https://github.com/ember-learn/ember-blog/pull/1318) add the embroider initiative guest post ([@mansona]) +- [embroider-build/addon-blueprint] [#230](https://github.com/embroider-build/addon-blueprint/pull/230) Add missing files to --addon-only output ([@lolmaus]) +- [mainmatter/ember-promise-modals] [#863](https://github.com/mainmatter/ember-promise-modals/pull/863) Enable analytics via Plausible ([@marcoow]) +- [mainmatter/ember-promise-modals] [#862](https://github.com/mainmatter/ember-promise-modals/pull/862) add proper copyright message ([@marcoow]) +- [mainmatter/ember-promise-modals] [#864](https://github.com/mainmatter/ember-promise-modals/pull/864) WIP Fix ci ([@nickschot]) +- [mansona/ember-cli-notifications] [#367](https://github.com/mansona/ember-cli-notifications/pull/367) setup release-plan ([@mansona]) +- [mansona/ember-cli-notifications] [#366](https://github.com/mansona/ember-cli-notifications/pull/366) fix lint-to-the-future CI job ([@mansona]) +- [mansona/ember-cli-notifications] [#365](https://github.com/mansona/ember-cli-notifications/pull/365) move to a v2 addon ([@mansona]) +- [mixonic/ember-cli-deprecation-workflow] [#178](https://github.com/mixonic/ember-cli-deprecation-workflow/pull/178) Upgrade Ember CLI to 5.4 ([@lolmaus]) +- [nickschot/ember-mobile-menu] [#804](https://github.com/nickschot/ember-mobile-menu/pull/804) WIP re-add support for ember-source v3.28.0 ([@nickschot]) +- [nickschot/ember-mobile-menu] [#802](https://github.com/nickschot/ember-mobile-menu/pull/802) Make tracked-built-ins a peerDependency ([@nickschot]) +- [nickschot/ember-mobile-menu] [#801](https://github.com/nickschot/ember-mobile-menu/pull/801) Remove node/ember-cli-babel requirements from README.md, fix ember-concurrency requirement. ([@nickschot]) +- [nickschot/ember-mobile-menu] [#800](https://github.com/nickschot/ember-mobile-menu/pull/800) Specify ember-source >=v4 as a peer dependency ([@nickschot]) +- [nickschot/ember-mobile-menu] [#798](https://github.com/nickschot/ember-mobile-menu/pull/798) Replace ember-could-get-used-to-this with ember-resources ([@nickschot]) [@lolmaus]: https://github.com/lolmaus [@mansona]: https://github.com/mansona @@ -167,22 +70,15 @@ [@paoloricciuti]: https://github.com/paoloricciuti [@zeppelin]: https://github.com/zeppelin [ember-learn/ember-blog]: https://github.com/ember-learn/ember-blog -[embroider-build/addon-blueprint]: - https://github.com/embroider-build/addon-blueprint -[embroider-build/ember-auto-import]: - https://github.com/embroider-build/ember-auto-import +[embroider-build/addon-blueprint]: https://github.com/embroider-build/addon-blueprint +[embroider-build/ember-auto-import]: https://github.com/embroider-build/ember-auto-import [embroider-build/embroider]: https://github.com/embroider-build/embroider [embroider-build/release-plan]: https://github.com/embroider-build/release-plan -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals -[mainmatter/svelte-promise-modals]: - https://github.com/mainmatter/svelte-promise-modals -[mansona/create-release-plan-setup]: - https://github.com/mansona/create-release-plan-setup -[mansona/ember-cli-notifications]: - https://github.com/mansona/ember-cli-notifications +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals +[mainmatter/svelte-promise-modals]: https://github.com/mainmatter/svelte-promise-modals +[mansona/create-release-plan-setup]: https://github.com/mansona/create-release-plan-setup +[mansona/ember-cli-notifications]: https://github.com/mansona/ember-cli-notifications [marcoow/rust_rest]: https://github.com/marcoow/rust_rest -[mixonic/ember-cli-deprecation-workflow]: - https://github.com/mixonic/ember-cli-deprecation-workflow +[mixonic/ember-cli-deprecation-workflow]: https://github.com/mixonic/ember-cli-deprecation-workflow [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu [storybookjs/storybook]: https://github.com/storybookjs/storybook diff --git a/src/twios/2023-12-10.md b/src/twios/2023-12-10.md index 031e730327..df198aa70a 100644 --- a/src/twios/2023-12-10.md +++ b/src/twios/2023-12-10.md @@ -1,216 +1,92 @@ ## Rust -- [marcoow/pacesetter] [#12](https://github.com/marcoow/pacesetter/pull/12) - Cleanup ([@marcoow]) -- [marcoow/pacesetter] [#11](https://github.com/marcoow/pacesetter/pull/11) - rename templates folder to blueprints ([@marcoow]) -- [marcoow/pacesetter] [#10](https://github.com/marcoow/pacesetter/pull/10) add - minimal example without db ([@marcoow]) -- [marcoow/pacesetter] [#9](https://github.com/marcoow/pacesetter/pull/9) Add - empty default blueprint ([@marcoow]) -- [marcoow/pacesetter] [#8](https://github.com/marcoow/pacesetter/pull/8) Add - full example ([@marcoow]) -- [marcoow/pacesetter] [#7](https://github.com/marcoow/pacesetter/pull/7) add - .gitignore to template ([@marcoow]) -- [marcoow/pacesetter] [#6](https://github.com/marcoow/pacesetter/pull/6) Better - template dev experience ([@marcoow]) -- [marcoow/pacesetter] [#5](https://github.com/marcoow/pacesetter/pull/5) - Improve example test ([@marcoow]) -- [marcoow/pacesetter] [#4](https://github.com/marcoow/pacesetter/pull/4) update - all dependencies ([@marcoow]) -- [marcoow/pacesetter] [#3](https://github.com/marcoow/pacesetter/pull/3) update - axum to 0.7 ([@marcoow]) -- [marcoow/pacesetter] [#2](https://github.com/marcoow/pacesetter/pull/2) Cli - ([@marcoow]) -- [marcoow/pacesetter] [#1](https://github.com/marcoow/pacesetter/pull/1) Set up - CI ([@marcoow]) -- [marcoow/rust_rest] [#55](https://github.com/marcoow/rust_rest/pull/55) fix - config loading in tests ([@marcoow]) -- [marcoow/rust_rest] [#54](https://github.com/marcoow/rust_rest/pull/54) remove - unused elements from app state ([@marcoow]) +- [marcoow/pacesetter] [#12](https://github.com/marcoow/pacesetter/pull/12) Cleanup ([@marcoow]) +- [marcoow/pacesetter] [#11](https://github.com/marcoow/pacesetter/pull/11) rename templates folder to blueprints ([@marcoow]) +- [marcoow/pacesetter] [#10](https://github.com/marcoow/pacesetter/pull/10) add minimal example without db ([@marcoow]) +- [marcoow/pacesetter] [#9](https://github.com/marcoow/pacesetter/pull/9) Add empty default blueprint ([@marcoow]) +- [marcoow/pacesetter] [#8](https://github.com/marcoow/pacesetter/pull/8) Add full example ([@marcoow]) +- [marcoow/pacesetter] [#7](https://github.com/marcoow/pacesetter/pull/7) add .gitignore to template ([@marcoow]) +- [marcoow/pacesetter] [#6](https://github.com/marcoow/pacesetter/pull/6) Better template dev experience ([@marcoow]) +- [marcoow/pacesetter] [#5](https://github.com/marcoow/pacesetter/pull/5) Improve example test ([@marcoow]) +- [marcoow/pacesetter] [#4](https://github.com/marcoow/pacesetter/pull/4) update all dependencies ([@marcoow]) +- [marcoow/pacesetter] [#3](https://github.com/marcoow/pacesetter/pull/3) update axum to 0.7 ([@marcoow]) +- [marcoow/pacesetter] [#2](https://github.com/marcoow/pacesetter/pull/2) Cli ([@marcoow]) +- [marcoow/pacesetter] [#1](https://github.com/marcoow/pacesetter/pull/1) Set up CI ([@marcoow]) +- [marcoow/rust_rest] [#55](https://github.com/marcoow/rust_rest/pull/55) fix config loading in tests ([@marcoow]) +- [marcoow/rust_rest] [#54](https://github.com/marcoow/rust_rest/pull/54) remove unused elements from app state ([@marcoow]) ## Svelte -- [SvelteLab/SvelteLab] [#291](https://github.com/SvelteLab/SvelteLab/pull/291) - feat: add advent of code templates ([@paoloricciuti]) -- [mainmatter/svelte-promise-modals] - [#50](https://github.com/mainmatter/svelte-promise-modals/pull/50) Add support - for custom `className` ([@zeppelin]) -- [mainmatter/svelte-promise-modals] - [#49](https://github.com/mainmatter/svelte-promise-modals/pull/49) Destroy - modal when parent component gets destroyed ([@zeppelin]) -- [paoloricciuti/sveltekit-search-params] - [#47](https://github.com/paoloricciuti/sveltekit-search-params/pull/47) fix: - type ssp array ([@paoloricciuti]) +- [SvelteLab/SvelteLab] [#291](https://github.com/SvelteLab/SvelteLab/pull/291) feat: add advent of code templates ([@paoloricciuti]) +- [mainmatter/svelte-promise-modals] [#50](https://github.com/mainmatter/svelte-promise-modals/pull/50) Add support for custom `className` ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#49](https://github.com/mainmatter/svelte-promise-modals/pull/49) Destroy modal when parent component gets destroyed ([@zeppelin]) +- [paoloricciuti/sveltekit-search-params] [#47](https://github.com/paoloricciuti/sveltekit-search-params/pull/47) fix: type ssp array ([@paoloricciuti]) ## Embroider -- [embroider-build/ember-auto-import] - [#604](https://github.com/embroider-build/ember-auto-import/pull/604) update - release-plan ([@mansona]) -- [embroider-build/embroider] - [#1714](https://github.com/embroider-build/embroider/pull/1714) update - scenario-tester ([@mansona]) -- [embroider-build/embroider] - [#1713](https://github.com/embroider-build/embroider/pull/1713) esbuild: fix - babel config location ([@mansona]) -- [embroider-build/embroider] - [#1704](https://github.com/embroider-build/embroider/pull/1704) add correct - extensions to optimizeDeps() config ([@mansona]) -- [embroider-build/embroider] - [#1700](https://github.com/embroider-build/embroider/pull/1700) Merge stable - into main ([@mansona]) -- [embroider-build/embroider] - [#1698](https://github.com/embroider-build/embroider/pull/1698) Use release - plan ([@mansona]) -- [embroider-build/scenario-tester] - [#26](https://github.com/embroider-build/scenario-tester/pull/26) setup - release-plan ([@mansona]) -- [embroider-build/scenario-tester] - [#25](https://github.com/embroider-build/scenario-tester/pull/25) fix types - discovery for node10 projects ([@mansona]) +- [embroider-build/ember-auto-import] [#604](https://github.com/embroider-build/ember-auto-import/pull/604) update release-plan ([@mansona]) +- [embroider-build/embroider] [#1714](https://github.com/embroider-build/embroider/pull/1714) update scenario-tester ([@mansona]) +- [embroider-build/embroider] [#1713](https://github.com/embroider-build/embroider/pull/1713) esbuild: fix babel config location ([@mansona]) +- [embroider-build/embroider] [#1704](https://github.com/embroider-build/embroider/pull/1704) add correct extensions to optimizeDeps() config ([@mansona]) +- [embroider-build/embroider] [#1700](https://github.com/embroider-build/embroider/pull/1700) Merge stable into main ([@mansona]) +- [embroider-build/embroider] [#1698](https://github.com/embroider-build/embroider/pull/1698) Use release plan ([@mansona]) +- [embroider-build/scenario-tester] [#26](https://github.com/embroider-build/scenario-tester/pull/26) setup release-plan ([@mansona]) +- [embroider-build/scenario-tester] [#25](https://github.com/embroider-build/scenario-tester/pull/25) fix types discovery for node10 projects ([@mansona]) ## Empress -- [empress/guidemaker] [#98](https://github.com/empress/guidemaker/pull/98) - update and fix release-plan ([@mansona]) -- [empress/guidemaker] [#97](https://github.com/empress/guidemaker/pull/97) - Setup release-plan ([@mansona]) +- [empress/guidemaker] [#98](https://github.com/empress/guidemaker/pull/98) update and fix release-plan ([@mansona]) +- [empress/guidemaker] [#97](https://github.com/empress/guidemaker/pull/97) Setup release-plan ([@mansona]) ## JavaScript -- [ef4/lerna-changelog] [#6](https://github.com/ef4/lerna-changelog/pull/6) drop - support for node < 16 ([@mansona]) -- [ef4/lerna-changelog] [#4](https://github.com/ef4/lerna-changelog/pull/4) - Update release-plan workflows ([@mansona]) -- [ef4/lerna-changelog] [#3](https://github.com/ef4/lerna-changelog/pull/3) - running npm init release-plan-setup ([@mansona]) -- [ef4/lerna-changelog] [#2](https://github.com/ef4/lerna-changelog/pull/2) - Update changelog and readme badges ([@mansona]) -- [embroider-build/release-plan] - [#35](https://github.com/embroider-build/release-plan/pull/35) fix pnpm - package discovery bug ([@mansona]) -- [embroider-build/release-plan] - [#34](https://github.com/embroider-build/release-plan/pull/34) Fix pnpm - package discovery ([@mansona]) -- [embroider-build/release-plan] - [#32](https://github.com/embroider-build/release-plan/pull/32) update - lerna-changelog ([@mansona]) -- [embroider-build/release-plan] - [#30](https://github.com/embroider-build/release-plan/pull/30) add shebang - back and fix linting config ([@mansona]) -- [embroider-build/release-plan] - [#29](https://github.com/embroider-build/release-plan/pull/29) Add linting and - check it in CI ([@mansona]) -- [embroider-build/release-plan] - [#28](https://github.com/embroider-build/release-plan/pull/28) pick the - correct package manager to do npm publish ([@mansona]) -- [embroider-build/release-plan] - [#27](https://github.com/embroider-build/release-plan/pull/27) run npm init - release-plan-setup --update ([@mansona]) -- [mansona/create-release-plan-setup] - [#40](https://github.com/mansona/create-release-plan-setup/pull/40) update - release-plan ([@mansona]) -- [mansona/create-release-plan-setup] - [#39](https://github.com/mansona/create-release-plan-setup/pull/39) update - release-plan ([@mansona]) -- [mansona/create-release-plan-setup] - [#36](https://github.com/mansona/create-release-plan-setup/pull/36) batch - dependabot updates for minor or patch dev deps ([@mansona]) -- [mansona/create-release-plan-setup] - [#34](https://github.com/mansona/create-release-plan-setup/pull/34) add - discovered default branch to plan-release CI ([@mansona]) -- [mansona/create-release-plan-setup] - [#31](https://github.com/mansona/create-release-plan-setup/pull/31) don't - create a new release plan PR when releasing ([@mansona]) -- [mansona/create-release-plan-setup] - [#30](https://github.com/mansona/create-release-plan-setup/pull/30) read the - default branch from remote ([@mansona]) -- [stefanpenner/node-fixturify-project] - [#87](https://github.com/stefanpenner/node-fixturify-project/pull/87) Fix #86 - Files leak across instances of Project ([@lolmaus]) -- [storybookjs/storybook] - [#25132](https://github.com/storybookjs/storybook/pull/25132) SvelteKit: Fix - missing `$app` modules ([@paoloricciuti]) +- [ef4/lerna-changelog] [#6](https://github.com/ef4/lerna-changelog/pull/6) drop support for node < 16 ([@mansona]) +- [ef4/lerna-changelog] [#4](https://github.com/ef4/lerna-changelog/pull/4) Update release-plan workflows ([@mansona]) +- [ef4/lerna-changelog] [#3](https://github.com/ef4/lerna-changelog/pull/3) running npm init release-plan-setup ([@mansona]) +- [ef4/lerna-changelog] [#2](https://github.com/ef4/lerna-changelog/pull/2) Update changelog and readme badges ([@mansona]) +- [embroider-build/release-plan] [#35](https://github.com/embroider-build/release-plan/pull/35) fix pnpm package discovery bug ([@mansona]) +- [embroider-build/release-plan] [#34](https://github.com/embroider-build/release-plan/pull/34) Fix pnpm package discovery ([@mansona]) +- [embroider-build/release-plan] [#32](https://github.com/embroider-build/release-plan/pull/32) update lerna-changelog ([@mansona]) +- [embroider-build/release-plan] [#30](https://github.com/embroider-build/release-plan/pull/30) add shebang back and fix linting config ([@mansona]) +- [embroider-build/release-plan] [#29](https://github.com/embroider-build/release-plan/pull/29) Add linting and check it in CI ([@mansona]) +- [embroider-build/release-plan] [#28](https://github.com/embroider-build/release-plan/pull/28) pick the correct package manager to do npm publish ([@mansona]) +- [embroider-build/release-plan] [#27](https://github.com/embroider-build/release-plan/pull/27) run npm init release-plan-setup --update ([@mansona]) +- [mansona/create-release-plan-setup] [#40](https://github.com/mansona/create-release-plan-setup/pull/40) update release-plan ([@mansona]) +- [mansona/create-release-plan-setup] [#39](https://github.com/mansona/create-release-plan-setup/pull/39) update release-plan ([@mansona]) +- [mansona/create-release-plan-setup] [#36](https://github.com/mansona/create-release-plan-setup/pull/36) batch dependabot updates for minor or patch dev deps ([@mansona]) +- [mansona/create-release-plan-setup] [#34](https://github.com/mansona/create-release-plan-setup/pull/34) add discovered default branch to plan-release CI ([@mansona]) +- [mansona/create-release-plan-setup] [#31](https://github.com/mansona/create-release-plan-setup/pull/31) don't create a new release plan PR when releasing ([@mansona]) +- [mansona/create-release-plan-setup] [#30](https://github.com/mansona/create-release-plan-setup/pull/30) read the default branch from remote ([@mansona]) +- [stefanpenner/node-fixturify-project] [#87](https://github.com/stefanpenner/node-fixturify-project/pull/87) Fix #86 Files leak across instances of Project ([@lolmaus]) +- [storybookjs/storybook] [#25132](https://github.com/storybookjs/storybook/pull/25132) SvelteKit: Fix missing `$app` modules ([@paoloricciuti]) ## Ember -- [DazzlingFugu/ember-fr-guides-source] - [#219](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/219) - Grammalecte install guide, improve and fix contributing guide - ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#218](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/218) Align - tutorial/part-2 titles with index and recap ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#217](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/217) - Translate guides/tutorial/part-2/recap.md ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#216](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/216) - Translate guides/tutorial/part-2/index.md ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#215](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/215) Catch - up latest docs: from 5.1 to 5.4 ([@BlueCutOfficial]) -- [ember-codemods/ember-angle-brackets-codemod] - [#512](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/512) - move to pnpm ([@mansona]) -- [ember-codemods/ember-angle-brackets-codemod] - [#511](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/511) - drop support for node < 16 ([@mansona]) -- [ember-codemods/ember-angle-brackets-codemod] - [#510](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/510) - setup release-plan ([@mansona]) -- [ember-codemods/ember-angle-brackets-codemod] - [#508](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/508) - Update fixtures using ember-cli-update ([@mansona]) -- [ember-codemods/ember-angle-brackets-codemod] - [#509](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/509) - Make helpers unambiguious with parens aka subexpressions ([@lolmaus]) -- [ember-codemods/ember-native-class-codemod] - [#546](https://github.com/ember-codemods/ember-native-class-codemod/pull/546) - start using release-plan ([@mansona]) -- [ember-codemods/ember-native-class-codemod] - [#545](https://github.com/ember-codemods/ember-native-class-codemod/pull/545) - convert to pnpm ([@mansona]) -- [ember-codemods/ember-native-class-codemod] - [#544](https://github.com/ember-codemods/ember-native-class-codemod/pull/544) - drop support for node 14 ([@mansona]) -- [ember-learn/ember-api-docs] - [#900](https://github.com/ember-learn/ember-api-docs/pull/900) update - node-sass and ember-auto-import ([@mansona]) -- [ember-learn/ember-api-docs] - [#899](https://github.com/ember-learn/ember-api-docs/pull/899) fix extra < on - ember-data-landing-page ([@mansona]) -- [ember-learn/ember-api-docs] - [#898](https://github.com/ember-learn/ember-api-docs/pull/898) update - lint-to-the-future ([@mansona]) -- [emberjs/rfcs] [#993](https://github.com/emberjs/rfcs/pull/993) Let the app - define Testem middleware in testem.js rather than implicitly import middleware - only from v1 addons ([@lolmaus]) -- [embroider-build/addon-blueprint] - [#236](https://github.com/embroider-build/addon-blueprint/pull/236) remove - release-it & upgrade release-plan ([@mansona]) -- [embroider-build/addon-blueprint] - [#232](https://github.com/embroider-build/addon-blueprint/pull/232) Readme: - minor formatting fix ([@lolmaus]) -- [nickschot/ember-gesture-modifiers] - [#556](https://github.com/nickschot/ember-gesture-modifiers/pull/556) Convert - to V2 addon ([@nickschot]) -- [nickschot/ember-gesture-modifiers] - [#555](https://github.com/nickschot/ember-gesture-modifiers/pull/555) Update - prettier to v3 ([@nickschot]) -- [nickschot/ember-gesture-modifiers] - [#554](https://github.com/nickschot/ember-gesture-modifiers/pull/554) Replace - yarn with pnpm ([@nickschot]) -- [nickschot/ember-gesture-modifiers] - [#541](https://github.com/nickschot/ember-gesture-modifiers/pull/541) Drop - Node 16 support ([@nickschot]) -- [nickschot/ember-gesture-modifiers] - [#540](https://github.com/nickschot/ember-gesture-modifiers/pull/540) Drop - Node 14 support ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#827](https://github.com/nickschot/ember-mobile-menu/pull/827) Add - ember-gesture-modifiers v6 to allowed range ([@nickschot]) +- [DazzlingFugu/ember-fr-guides-source] [#219](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/219) Grammalecte install guide, improve and fix contributing guide ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#218](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/218) Align tutorial/part-2 titles with index and recap ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#217](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/217) Translate guides/tutorial/part-2/recap.md ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#216](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/216) Translate guides/tutorial/part-2/index.md ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#215](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/215) Catch up latest docs: from 5.1 to 5.4 ([@BlueCutOfficial]) +- [ember-codemods/ember-angle-brackets-codemod] [#512](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/512) move to pnpm ([@mansona]) +- [ember-codemods/ember-angle-brackets-codemod] [#511](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/511) drop support for node < 16 ([@mansona]) +- [ember-codemods/ember-angle-brackets-codemod] [#510](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/510) setup release-plan ([@mansona]) +- [ember-codemods/ember-angle-brackets-codemod] [#508](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/508) Update fixtures using ember-cli-update ([@mansona]) +- [ember-codemods/ember-angle-brackets-codemod] [#509](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/509) Make helpers unambiguious with parens aka subexpressions ([@lolmaus]) +- [ember-codemods/ember-native-class-codemod] [#546](https://github.com/ember-codemods/ember-native-class-codemod/pull/546) start using release-plan ([@mansona]) +- [ember-codemods/ember-native-class-codemod] [#545](https://github.com/ember-codemods/ember-native-class-codemod/pull/545) convert to pnpm ([@mansona]) +- [ember-codemods/ember-native-class-codemod] [#544](https://github.com/ember-codemods/ember-native-class-codemod/pull/544) drop support for node 14 ([@mansona]) +- [ember-learn/ember-api-docs] [#900](https://github.com/ember-learn/ember-api-docs/pull/900) update node-sass and ember-auto-import ([@mansona]) +- [ember-learn/ember-api-docs] [#899](https://github.com/ember-learn/ember-api-docs/pull/899) fix extra < on ember-data-landing-page ([@mansona]) +- [ember-learn/ember-api-docs] [#898](https://github.com/ember-learn/ember-api-docs/pull/898) update lint-to-the-future ([@mansona]) +- [emberjs/rfcs] [#993](https://github.com/emberjs/rfcs/pull/993) Let the app define Testem middleware in testem.js rather than implicitly import middleware only from v1 addons ([@lolmaus]) +- [embroider-build/addon-blueprint] [#236](https://github.com/embroider-build/addon-blueprint/pull/236) remove release-it & upgrade release-plan ([@mansona]) +- [embroider-build/addon-blueprint] [#232](https://github.com/embroider-build/addon-blueprint/pull/232) Readme: minor formatting fix ([@lolmaus]) +- [nickschot/ember-gesture-modifiers] [#556](https://github.com/nickschot/ember-gesture-modifiers/pull/556) Convert to V2 addon ([@nickschot]) +- [nickschot/ember-gesture-modifiers] [#555](https://github.com/nickschot/ember-gesture-modifiers/pull/555) Update prettier to v3 ([@nickschot]) +- [nickschot/ember-gesture-modifiers] [#554](https://github.com/nickschot/ember-gesture-modifiers/pull/554) Replace yarn with pnpm ([@nickschot]) +- [nickschot/ember-gesture-modifiers] [#541](https://github.com/nickschot/ember-gesture-modifiers/pull/541) Drop Node 16 support ([@nickschot]) +- [nickschot/ember-gesture-modifiers] [#540](https://github.com/nickschot/ember-gesture-modifiers/pull/540) Drop Node 14 support ([@nickschot]) +- [nickschot/ember-mobile-menu] [#827](https://github.com/nickschot/ember-mobile-menu/pull/827) Add ember-gesture-modifiers v6 to allowed range ([@nickschot]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@lolmaus]: https://github.com/lolmaus @@ -219,36 +95,25 @@ [@nickschot]: https://github.com/nickschot [@paoloricciuti]: https://github.com/paoloricciuti [@zeppelin]: https://github.com/zeppelin -[dazzlingfugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source +[dazzlingfugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source [sveltelab/sveltelab]: https://github.com/SvelteLab/SvelteLab [ef4/lerna-changelog]: https://github.com/ef4/lerna-changelog -[ember-codemods/ember-angle-brackets-codemod]: - https://github.com/ember-codemods/ember-angle-brackets-codemod -[ember-codemods/ember-native-class-codemod]: - https://github.com/ember-codemods/ember-native-class-codemod +[ember-codemods/ember-angle-brackets-codemod]: https://github.com/ember-codemods/ember-angle-brackets-codemod +[ember-codemods/ember-native-class-codemod]: https://github.com/ember-codemods/ember-native-class-codemod [ember-learn/ember-api-docs]: https://github.com/ember-learn/ember-api-docs [emberjs/rfcs]: https://github.com/emberjs/rfcs -[embroider-build/addon-blueprint]: - https://github.com/embroider-build/addon-blueprint -[embroider-build/ember-auto-import]: - https://github.com/embroider-build/ember-auto-import +[embroider-build/addon-blueprint]: https://github.com/embroider-build/addon-blueprint +[embroider-build/ember-auto-import]: https://github.com/embroider-build/ember-auto-import [embroider-build/embroider]: https://github.com/embroider-build/embroider [embroider-build/release-plan]: https://github.com/embroider-build/release-plan -[embroider-build/scenario-tester]: - https://github.com/embroider-build/scenario-tester +[embroider-build/scenario-tester]: https://github.com/embroider-build/scenario-tester [empress/guidemaker]: https://github.com/empress/guidemaker -[mainmatter/svelte-promise-modals]: - https://github.com/mainmatter/svelte-promise-modals -[mansona/create-release-plan-setup]: - https://github.com/mansona/create-release-plan-setup +[mainmatter/svelte-promise-modals]: https://github.com/mainmatter/svelte-promise-modals +[mansona/create-release-plan-setup]: https://github.com/mansona/create-release-plan-setup [marcoow/pacesetter]: https://github.com/marcoow/pacesetter [marcoow/rust_rest]: https://github.com/marcoow/rust_rest -[nickschot/ember-gesture-modifiers]: - https://github.com/nickschot/ember-gesture-modifiers +[nickschot/ember-gesture-modifiers]: https://github.com/nickschot/ember-gesture-modifiers [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu -[paoloricciuti/sveltekit-search-params]: - https://github.com/paoloricciuti/sveltekit-search-params -[stefanpenner/node-fixturify-project]: - https://github.com/stefanpenner/node-fixturify-project +[paoloricciuti/sveltekit-search-params]: https://github.com/paoloricciuti/sveltekit-search-params +[stefanpenner/node-fixturify-project]: https://github.com/stefanpenner/node-fixturify-project [storybookjs/storybook]: https://github.com/storybookjs/storybook diff --git a/src/twios/2024-01-07.md b/src/twios/2024-01-07.md index c1a88ee717..659447f778 100644 --- a/src/twios/2024-01-07.md +++ b/src/twios/2024-01-07.md @@ -1,57 +1,31 @@ ## Rust -- [marcoow/pacesetter] [#26](https://github.com/marcoow/pacesetter/pull/26) - Generators for entities, entity-test-helpers, controllers, controller-tests - ([@marcoow]) -- [marcoow/pacesetter] [#25](https://github.com/marcoow/pacesetter/pull/25) add - update example ([@marcoow]) -- [marcoow/pacesetter] [#24](https://github.com/marcoow/pacesetter/pull/24) add - deletion example ([@marcoow]) +- [marcoow/pacesetter] [#26](https://github.com/marcoow/pacesetter/pull/26) Generators for entities, entity-test-helpers, controllers, controller-tests ([@marcoow]) +- [marcoow/pacesetter] [#25](https://github.com/marcoow/pacesetter/pull/25) add update example ([@marcoow]) +- [marcoow/pacesetter] [#24](https://github.com/marcoow/pacesetter/pull/24) add deletion example ([@marcoow]) ## Svelte -- [mainmatter/svelte-promise-modals] - [#55](https://github.com/mainmatter/svelte-promise-modals/pull/55) Update - license year ([@zeppelin]) -- [paoloricciuti/svelte-client-components] - [#3](https://github.com/paoloricciuti/svelte-client-components/pull/3) Create - CONTRIBUTING.md ([@paoloricciuti]) +- [mainmatter/svelte-promise-modals] [#55](https://github.com/mainmatter/svelte-promise-modals/pull/55) Update license year ([@zeppelin]) +- [paoloricciuti/svelte-client-components] [#3](https://github.com/paoloricciuti/svelte-client-components/pull/3) Create CONTRIBUTING.md ([@paoloricciuti]) ## Embroider -- [embroider-build/scenario-tester] - [#30](https://github.com/embroider-build/scenario-tester/pull/30) Allow you to - call skip twice with the same name ([@mansona]) -- [embroider-build/scenario-tester] - [#28](https://github.com/embroider-build/scenario-tester/pull/28) fix - changelog header ([@mansona]) -- [embroider-build/scenario-tester] - [#27](https://github.com/embroider-build/scenario-tester/pull/27) convert to - pnpm ([@mansona]) +- [embroider-build/scenario-tester] [#30](https://github.com/embroider-build/scenario-tester/pull/30) Allow you to call skip twice with the same name ([@mansona]) +- [embroider-build/scenario-tester] [#28](https://github.com/embroider-build/scenario-tester/pull/28) fix changelog header ([@mansona]) +- [embroider-build/scenario-tester] [#27](https://github.com/embroider-build/scenario-tester/pull/27) convert to pnpm ([@mansona]) ## JavaScript -- [mansona/create-release-plan-setup] - [#56](https://github.com/mansona/create-release-plan-setup/pull/56) always - update existing files ([@mansona]) +- [mansona/create-release-plan-setup] [#56](https://github.com/mansona/create-release-plan-setup/pull/56) always update existing files ([@mansona]) ## Ember -- [DazzlingFugu/ember-fr-guides-source] - [#236](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/236) - Improve catchup script ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#234](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/234) Set - HTML page main language to fr ([@BlueCutOfficial]) -- [ember-learn/deprecation-app] - [#1366](https://github.com/ember-learn/deprecation-app/pull/1366) update - ember-showdown-prism ([@mansona]) -- [mainmatter/ember-asset-size-action] - [#79](https://github.com/mainmatter/ember-asset-size-action/pull/79) Update - license year ([@zeppelin]) -- [nickschot/ember-mobile-pane] - [#48](https://github.com/nickschot/ember-mobile-pane/pull/48) Import htmlSafe - from @ember/template instead of @ember/string ([@nickschot]) +- [DazzlingFugu/ember-fr-guides-source] [#236](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/236) Improve catchup script ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#234](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/234) Set HTML page main language to fr ([@BlueCutOfficial]) +- [ember-learn/deprecation-app] [#1366](https://github.com/ember-learn/deprecation-app/pull/1366) update ember-showdown-prism ([@mansona]) +- [mainmatter/ember-asset-size-action] [#79](https://github.com/mainmatter/ember-asset-size-action/pull/79) Update license year ([@zeppelin]) +- [nickschot/ember-mobile-pane] [#48](https://github.com/nickschot/ember-mobile-pane/pull/48) Import htmlSafe from @ember/template instead of @ember/string ([@nickschot]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@mansona]: https://github.com/mansona @@ -59,18 +33,12 @@ [@nickschot]: https://github.com/nickschot [@paoloricciuti]: https://github.com/paoloricciuti [@zeppelin]: https://github.com/zeppelin -[dazzlingfugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source +[dazzlingfugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source [ember-learn/deprecation-app]: https://github.com/ember-learn/deprecation-app -[embroider-build/scenario-tester]: - https://github.com/embroider-build/scenario-tester -[mainmatter/ember-asset-size-action]: - https://github.com/mainmatter/ember-asset-size-action -[mainmatter/svelte-promise-modals]: - https://github.com/mainmatter/svelte-promise-modals -[mansona/create-release-plan-setup]: - https://github.com/mansona/create-release-plan-setup +[embroider-build/scenario-tester]: https://github.com/embroider-build/scenario-tester +[mainmatter/ember-asset-size-action]: https://github.com/mainmatter/ember-asset-size-action +[mainmatter/svelte-promise-modals]: https://github.com/mainmatter/svelte-promise-modals +[mansona/create-release-plan-setup]: https://github.com/mansona/create-release-plan-setup [marcoow/pacesetter]: https://github.com/marcoow/pacesetter [nickschot/ember-mobile-pane]: https://github.com/nickschot/ember-mobile-pane -[paoloricciuti/svelte-client-components]: - https://github.com/paoloricciuti/svelte-client-components +[paoloricciuti/svelte-client-components]: https://github.com/paoloricciuti/svelte-client-components diff --git a/src/twios/2024-01-14.md b/src/twios/2024-01-14.md index 5408e54093..3c1461bf01 100644 --- a/src/twios/2024-01-14.md +++ b/src/twios/2024-01-14.md @@ -1,68 +1,39 @@ ## Raycast -- [raycast/extensions] - [#10050](https://github.com/raycast/extensions/pull/10050) Add svelte-docs - extension ([@paoloricciuti]) +- [raycast/extensions] [#10050](https://github.com/raycast/extensions/pull/10050) Add svelte-docs extension ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#1753](https://github.com/embroider-build/embroider/pull/1753) Use - fixturify-project version with leaks fixed ([@lolmaus]) -- [embroider-build/github-changelog] - [#10](https://github.com/embroider-build/github-changelog/pull/10) update - release-plan setup ([@mansona]) -- [embroider-build/scenario-tester] - [#32](https://github.com/embroider-build/scenario-tester/pull/32) fix docs - build ([@mansona]) +- [embroider-build/embroider] [#1753](https://github.com/embroider-build/embroider/pull/1753) Use fixturify-project version with leaks fixed ([@lolmaus]) +- [embroider-build/github-changelog] [#10](https://github.com/embroider-build/github-changelog/pull/10) update release-plan setup ([@mansona]) +- [embroider-build/scenario-tester] [#32](https://github.com/embroider-build/scenario-tester/pull/32) fix docs build ([@mansona]) ## JavaScript -- [ember-learn/ember-jsonapi-docs] - [#137](https://github.com/ember-learn/ember-jsonapi-docs/pull/137) emit - markdown for descriptions ([@mansona]) -- [lifeart/glimmer-next] [#22](https://github.com/lifeart/glimmer-next/pull/22) - Add tests for each loop ([@lolmaus]) +- [ember-learn/ember-jsonapi-docs] [#137](https://github.com/ember-learn/ember-jsonapi-docs/pull/137) emit markdown for descriptions ([@mansona]) +- [lifeart/glimmer-next] [#22](https://github.com/lifeart/glimmer-next/pull/22) Add tests for each loop ([@lolmaus]) ## Ember -- [DazzlingFugu/ember-fr-guides-source] - [#237](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/237) - Improve catchup script 2 ([@BlueCutOfficial]) -- [ember-learn/ember-api-docs] - [#902](https://github.com/ember-learn/ember-api-docs/pull/902) use - ember-showdown-prism ([@mansona]) -- [ember-learn/ember-api-docs-data] - [#25](https://github.com/ember-learn/ember-api-docs-data/pull/25) Use Markdown - for all descriptions ([@mansona]) -- [mainmatter/ember-cookies] - [#901](https://github.com/mainmatter/ember-cookies/pull/901) chore(ci): use - pull_request_target event to allow continue-on-error-comment to work for forks - ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2712](https://github.com/mainmatter/ember-simple-auth/pull/2712) - chore(docs): begin migrating docs to jsdoc ([@BobrImperator]) -- [mainmatter/qunit-dom] - [#2090](https://github.com/mainmatter/qunit-dom/pull/2090) Support ShadowRoot, - add tests for rootElement, fixes #2089 ([@lolmaus]) +- [DazzlingFugu/ember-fr-guides-source] [#237](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/237) Improve catchup script 2 ([@BlueCutOfficial]) +- [ember-learn/ember-api-docs] [#902](https://github.com/ember-learn/ember-api-docs/pull/902) use ember-showdown-prism ([@mansona]) +- [ember-learn/ember-api-docs-data] [#25](https://github.com/ember-learn/ember-api-docs-data/pull/25) Use Markdown for all descriptions ([@mansona]) +- [mainmatter/ember-cookies] [#901](https://github.com/mainmatter/ember-cookies/pull/901) chore(ci): use pull_request_target event to allow continue-on-error-comment to work for forks ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2712](https://github.com/mainmatter/ember-simple-auth/pull/2712) chore(docs): begin migrating docs to jsdoc ([@BobrImperator]) +- [mainmatter/qunit-dom] [#2090](https://github.com/mainmatter/qunit-dom/pull/2090) Support ShadowRoot, add tests for rootElement, fixes #2089 ([@lolmaus]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@bobrimperator]: https://github.com/BobrImperator [@lolmaus]: https://github.com/lolmaus [@mansona]: https://github.com/mansona [@paoloricciuti]: https://github.com/paoloricciuti -[dazzlingfugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source -[ember-learn/ember-api-docs-data]: - https://github.com/ember-learn/ember-api-docs-data +[dazzlingfugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source +[ember-learn/ember-api-docs-data]: https://github.com/ember-learn/ember-api-docs-data [ember-learn/ember-api-docs]: https://github.com/ember-learn/ember-api-docs -[ember-learn/ember-jsonapi-docs]: - https://github.com/ember-learn/ember-jsonapi-docs +[ember-learn/ember-jsonapi-docs]: https://github.com/ember-learn/ember-jsonapi-docs [embroider-build/embroider]: https://github.com/embroider-build/embroider -[embroider-build/github-changelog]: - https://github.com/embroider-build/github-changelog -[embroider-build/scenario-tester]: - https://github.com/embroider-build/scenario-tester +[embroider-build/github-changelog]: https://github.com/embroider-build/github-changelog +[embroider-build/scenario-tester]: https://github.com/embroider-build/scenario-tester [lifeart/glimmer-next]: https://github.com/lifeart/glimmer-next [mainmatter/ember-cookies]: https://github.com/mainmatter/ember-cookies [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth diff --git a/src/twios/2024-01-21.md b/src/twios/2024-01-21.md index 41026bd854..0483d1e284 100644 --- a/src/twios/2024-01-21.md +++ b/src/twios/2024-01-21.md @@ -1,91 +1,46 @@ ## Rust -- [marcoow/pacesetter] [#27](https://github.com/marcoow/pacesetter/pull/27) fix - controller and controller tests in full blueprint ([@marcoow]) +- [marcoow/pacesetter] [#27](https://github.com/marcoow/pacesetter/pull/27) fix controller and controller tests in full blueprint ([@marcoow]) ## Svelte -- [paoloricciuti/sveltekit-search-params] - [#64](https://github.com/paoloricciuti/sveltekit-search-params/pull/64) feat: - add equalityFn option for complex objects and array ([@paoloricciuti]) -- [storybookjs/addon-svelte-csf] - [#163](https://github.com/storybookjs/addon-svelte-csf/pull/163) fix: keep - track of arguments from a separate map to have the last instance of the - component ([@paoloricciuti]) +- [paoloricciuti/sveltekit-search-params] [#64](https://github.com/paoloricciuti/sveltekit-search-params/pull/64) feat: add equalityFn option for complex objects and array ([@paoloricciuti]) +- [storybookjs/addon-svelte-csf] [#163](https://github.com/storybookjs/addon-svelte-csf/pull/163) fix: keep track of arguments from a separate map to have the last instance of the component ([@paoloricciuti]) ## Raycast -- [raycast/extensions] - [#10267](https://github.com/raycast/extensions/pull/10267) Add mite extension - ([@paoloricciuti]) +- [raycast/extensions] [#10267](https://github.com/raycast/extensions/pull/10267) Add mite extension ([@paoloricciuti]) ## Empress -- [empress/ember-cli-showdown] - [#136](https://github.com/empress/ember-cli-showdown/pull/136) drop support - for Ember < 3.16 ([@mansona]) -- [empress/ember-cli-showdown] - [#135](https://github.com/empress/ember-cli-showdown/pull/135) update - lint-to-the-future dashboard action ([@mansona]) -- [empress/ember-cli-showdown] - [#133](https://github.com/empress/ember-cli-showdown/pull/133) add header to - changelog file ([@mansona]) -- [empress/ember-cli-showdown] - [#132](https://github.com/empress/ember-cli-showdown/pull/132) setup - release-plan ([@mansona]) -- [empress/ember-cli-showdown] - [#130](https://github.com/empress/ember-cli-showdown/pull/130) convert to pnpm - ([@mansona]) -- [empress/ember-cli-showdown] - [#129](https://github.com/empress/ember-cli-showdown/pull/129) add - lint-to-the-future dashboard ([@mansona]) +- [empress/ember-cli-showdown] [#136](https://github.com/empress/ember-cli-showdown/pull/136) drop support for Ember < 3.16 ([@mansona]) +- [empress/ember-cli-showdown] [#135](https://github.com/empress/ember-cli-showdown/pull/135) update lint-to-the-future dashboard action ([@mansona]) +- [empress/ember-cli-showdown] [#133](https://github.com/empress/ember-cli-showdown/pull/133) add header to changelog file ([@mansona]) +- [empress/ember-cli-showdown] [#132](https://github.com/empress/ember-cli-showdown/pull/132) setup release-plan ([@mansona]) +- [empress/ember-cli-showdown] [#130](https://github.com/empress/ember-cli-showdown/pull/130) convert to pnpm ([@mansona]) +- [empress/ember-cli-showdown] [#129](https://github.com/empress/ember-cli-showdown/pull/129) add lint-to-the-future dashboard ([@mansona]) ## JavaScript -- [mansona/lttf-dashboard] - [#6](https://github.com/mansona/lttf-dashboard/pull/6) fix version number in - README ([@mansona]) -- [mansona/lttf-dashboard] - [#5](https://github.com/mansona/lttf-dashboard/pull/5) Restructure - ([@mansona]) -- [mansona/lttf-dashboard] - [#4](https://github.com/mansona/lttf-dashboard/pull/4) update node version - ([@mansona]) -- [opral/monorepo] [#2047](https://github.com/opral/monorepo/pull/2047) - chore(paraglide-js): add `repository` entry in `package.json` ([@oscard0m]) -- [thefrontside/effection] - [#886](https://github.com/thefrontside/effection/pull/886) Docs: add `ensure` - import to Resources code snippet ([@lolmaus]) +- [mansona/lttf-dashboard] [#6](https://github.com/mansona/lttf-dashboard/pull/6) fix version number in README ([@mansona]) +- [mansona/lttf-dashboard] [#5](https://github.com/mansona/lttf-dashboard/pull/5) Restructure ([@mansona]) +- [mansona/lttf-dashboard] [#4](https://github.com/mansona/lttf-dashboard/pull/4) update node version ([@mansona]) +- [opral/monorepo] [#2047](https://github.com/opral/monorepo/pull/2047) chore(paraglide-js): add `repository` entry in `package.json` ([@oscard0m]) +- [thefrontside/effection] [#886](https://github.com/thefrontside/effection/pull/886) Docs: add `ensure` import to Resources code snippet ([@lolmaus]) ## Ember -- [ember-codemods/ember-no-implicit-this-codemod] - [#418](https://github.com/ember-codemods/ember-no-implicit-this-codemod/pull/418) - Typescript ([@mansona]) -- [ember-codemods/ember-no-implicit-this-codemod] - [#416](https://github.com/ember-codemods/ember-no-implicit-this-codemod/pull/416) - setup release-plan ([@mansona]) -- [ember-codemods/ember-no-implicit-this-codemod] - [#409](https://github.com/ember-codemods/ember-no-implicit-this-codemod/pull/409) - add grouping to dependabot config ([@mansona]) -- [ember-codemods/ember-no-implicit-this-codemod] - [#405](https://github.com/ember-codemods/ember-no-implicit-this-codemod/pull/405) - drop support for Node < 16 ([@mansona]) -- [ember-codemods/ember-no-implicit-this-codemod] - [#401](https://github.com/ember-codemods/ember-no-implicit-this-codemod/pull/401) - swap to pnpm ([@mansona]) -- [ember-codemods/ember-no-implicit-this-codemod] - [#400](https://github.com/ember-codemods/ember-no-implicit-this-codemod/pull/400) - Update ember-codemods-telemetry-helpers for Mac M support ([@Mikek2252]) +- [ember-codemods/ember-no-implicit-this-codemod] [#418](https://github.com/ember-codemods/ember-no-implicit-this-codemod/pull/418) Typescript ([@mansona]) +- [ember-codemods/ember-no-implicit-this-codemod] [#416](https://github.com/ember-codemods/ember-no-implicit-this-codemod/pull/416) setup release-plan ([@mansona]) +- [ember-codemods/ember-no-implicit-this-codemod] [#409](https://github.com/ember-codemods/ember-no-implicit-this-codemod/pull/409) add grouping to dependabot config ([@mansona]) +- [ember-codemods/ember-no-implicit-this-codemod] [#405](https://github.com/ember-codemods/ember-no-implicit-this-codemod/pull/405) drop support for Node < 16 ([@mansona]) +- [ember-codemods/ember-no-implicit-this-codemod] [#401](https://github.com/ember-codemods/ember-no-implicit-this-codemod/pull/401) swap to pnpm ([@mansona]) +- [ember-codemods/ember-no-implicit-this-codemod] [#400](https://github.com/ember-codemods/ember-no-implicit-this-codemod/pull/400) Update ember-codemods-telemetry-helpers for Mac M support ([@Mikek2252]) ## Project Forms -- [project-forms/project-forms.github.io] - [#30](https://github.com/project-forms/project-forms.github.io/pull/30) test: - initial E2E test ([@oscard0m]) -- [project-forms/project-forms.github.io] - [#29](https://github.com/project-forms/project-forms.github.io/pull/29) - test(integration): initial version ([@oscard0m]) +- [project-forms/project-forms.github.io] [#30](https://github.com/project-forms/project-forms.github.io/pull/30) test: initial E2E test ([@oscard0m]) +- [project-forms/project-forms.github.io] [#29](https://github.com/project-forms/project-forms.github.io/pull/29) test(integration): initial version ([@oscard0m]) [@mikek2252]: https://github.com/Mikek2252 [@lolmaus]: https://github.com/lolmaus @@ -93,16 +48,13 @@ [@marcoow]: https://github.com/marcoow [@oscard0m]: https://github.com/oscard0m [@paoloricciuti]: https://github.com/paoloricciuti -[ember-codemods/ember-no-implicit-this-codemod]: - https://github.com/ember-codemods/ember-no-implicit-this-codemod +[ember-codemods/ember-no-implicit-this-codemod]: https://github.com/ember-codemods/ember-no-implicit-this-codemod [empress/ember-cli-showdown]: https://github.com/empress/ember-cli-showdown [mansona/lttf-dashboard]: https://github.com/mansona/lttf-dashboard [marcoow/pacesetter]: https://github.com/marcoow/pacesetter [opral/monorepo]: https://github.com/opral/monorepo -[paoloricciuti/sveltekit-search-params]: - https://github.com/paoloricciuti/sveltekit-search-params -[project-forms/project-forms.github.io]: - https://github.com/project-forms/project-forms.github.io +[paoloricciuti/sveltekit-search-params]: https://github.com/paoloricciuti/sveltekit-search-params +[project-forms/project-forms.github.io]: https://github.com/project-forms/project-forms.github.io [raycast/extensions]: https://github.com/raycast/extensions [storybookjs/addon-svelte-csf]: https://github.com/storybookjs/addon-svelte-csf [thefrontside/effection]: https://github.com/thefrontside/effection diff --git a/src/twios/2024-01-28.md b/src/twios/2024-01-28.md index ec4be55aa4..4f2032b03d 100644 --- a/src/twios/2024-01-28.md +++ b/src/twios/2024-01-28.md @@ -1,112 +1,55 @@ ## Rust -- [marcoow/pacesetter] [#28](https://github.com/marcoow/pacesetter/pull/28) - Improve CLI output ([@marcoow]) +- [marcoow/pacesetter] [#28](https://github.com/marcoow/pacesetter/pull/28) Improve CLI output ([@marcoow]) ## Svelte -- [mainmatter/svelte-promise-modals] - [#65](https://github.com/mainmatter/svelte-promise-modals/pull/65) Make readme - nicer ([@zeppelin]) -- [mainmatter/svelte-promise-modals] - [#64](https://github.com/mainmatter/svelte-promise-modals/pull/64) Fix pnpm - release → npm publish ([@zeppelin]) -- [mainmatter/svelte-promise-modals] - [#63](https://github.com/mainmatter/svelte-promise-modals/pull/63) Muscle - memory 🐹 😅 ([@zeppelin]) -- [mainmatter/svelte-promise-modals] - [#61](https://github.com/mainmatter/svelte-promise-modals/pull/61) Setup - release script ([@zeppelin]) -- [mainmatter/svelte-promise-modals] - [#59](https://github.com/mainmatter/svelte-promise-modals/pull/59) Fix return - data example ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#65](https://github.com/mainmatter/svelte-promise-modals/pull/65) Make readme nicer ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#64](https://github.com/mainmatter/svelte-promise-modals/pull/64) Fix pnpm release → npm publish ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#63](https://github.com/mainmatter/svelte-promise-modals/pull/63) Muscle memory 🐹 😅 ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#61](https://github.com/mainmatter/svelte-promise-modals/pull/61) Setup release script ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#59](https://github.com/mainmatter/svelte-promise-modals/pull/59) Fix return data example ([@zeppelin]) ## Raycast -- [raycast/extensions] - [#10267](https://github.com/raycast/extensions/pull/10267) Add mite extension - ([@paoloricciuti]) +- [raycast/extensions] [#10267](https://github.com/raycast/extensions/pull/10267) Add mite extension ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#1768](https://github.com/embroider-build/embroider/pull/1768) docs(porting - addons to v2): change the recommended package manager to pnpm - ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1765](https://github.com/embroider-build/embroider/pull/1765) - Docs(addon-author-guide)/ remove the out-of-date part about alternative to - monorepos ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1768](https://github.com/embroider-build/embroider/pull/1768) docs(porting addons to v2): change the recommended package manager to pnpm ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1765](https://github.com/embroider-build/embroider/pull/1765) Docs(addon-author-guide)/ remove the out-of-date part about alternative to monorepos ([@BlueCutOfficial]) ## Empress -- [empress/guidemaker] [#103](https://github.com/empress/guidemaker/pull/103) - drop support for node < 18 ([@mansona]) -- [empress/guidemaker] [#102](https://github.com/empress/guidemaker/pull/102) - swap to pnpm ([@mansona]) +- [empress/guidemaker] [#103](https://github.com/empress/guidemaker/pull/103) drop support for node < 18 ([@mansona]) +- [empress/guidemaker] [#102](https://github.com/empress/guidemaker/pull/102) swap to pnpm ([@mansona]) ## JavaScript -- [embroider-build/release-plan] - [#52](https://github.com/embroider-build/release-plan/pull/52) add ability to - pass tag to publish command ([@mansona]) -- [embroider-build/release-plan] - [#51](https://github.com/embroider-build/release-plan/pull/51) Make changelog - header discovery more forgiving (case-insensitive) ([@mansona]) -- [embroider-build/release-plan] - [#49](https://github.com/embroider-build/release-plan/pull/49) add a basic - test for updateChangelog ([@mansona]) -- [mansona/create-release-plan-setup] - [#60](https://github.com/mansona/create-release-plan-setup/pull/60) match - release-plan test for Changelog header ([@mansona]) +- [embroider-build/release-plan] [#52](https://github.com/embroider-build/release-plan/pull/52) add ability to pass tag to publish command ([@mansona]) +- [embroider-build/release-plan] [#51](https://github.com/embroider-build/release-plan/pull/51) Make changelog header discovery more forgiving (case-insensitive) ([@mansona]) +- [embroider-build/release-plan] [#49](https://github.com/embroider-build/release-plan/pull/49) add a basic test for updateChangelog ([@mansona]) +- [mansona/create-release-plan-setup] [#60](https://github.com/mansona/create-release-plan-setup/pull/60) match release-plan test for Changelog header ([@mansona]) ## Ember -- [adopted-ember-addons/ember-pikaday] - [#578](https://github.com/adopted-ember-addons/ember-pikaday/pull/578) setup - release-plan ([@mansona]) -- [adopted-ember-addons/ember-pikaday] - [#576](https://github.com/adopted-ember-addons/ember-pikaday/pull/576) use - pnpm ([@mansona]) -- [ember-learn/ember-api-docs] - [#903](https://github.com/ember-learn/ember-api-docs/pull/903) Start using - Embroider ([@mansona]) -- [ember-learn/ember-styleguide] - [#505](https://github.com/ember-learn/ember-styleguide/pull/505) fix - publish-branch for release-plan ([@mansona]) -- [ember-learn/ember-styleguide] - [#503](https://github.com/ember-learn/ember-styleguide/pull/503) use - release-plan for legacy release ([@mansona]) -- [ember-learn/ember-styleguide] - [#501](https://github.com/ember-learn/ember-styleguide/pull/501) [lts-v3] get - legacy release embroider compatible ([@mansona]) -- [ember-learn/ember-styleguide] - [#500](https://github.com/ember-learn/ember-styleguide/pull/500) use new - lint-to-the-future dashboard action ([@mansona]) -- [ember-learn/ember-styleguide] - [#498](https://github.com/ember-learn/ember-styleguide/pull/498) use - release-plan ([@mansona]) -- [ember-learn/ember-styleguide] - [#497](https://github.com/ember-learn/ember-styleguide/pull/497) update percy - widths ([@mansona]) -- [ember-learn/ember-styleguide] - [#496](https://github.com/ember-learn/ember-styleguide/pull/496) update - fastboot and ember-try to fix CI ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#169](https://github.com/ember-learn/guidemaker-ember-template/pull/169) - switch to pnpm ([@mansona]) -- [ember-learn/guides-source] - [#1998](https://github.com/ember-learn/guides-source/pull/1998) update all - `ember server` to `npm start` ([@mansona]) -- [nickschot/ember-mobile-menu] - [#854](https://github.com/nickschot/ember-mobile-menu/pull/854) WIP Fix - fastboot compatibility ([@nickschot]) +- [adopted-ember-addons/ember-pikaday] [#578](https://github.com/adopted-ember-addons/ember-pikaday/pull/578) setup release-plan ([@mansona]) +- [adopted-ember-addons/ember-pikaday] [#576](https://github.com/adopted-ember-addons/ember-pikaday/pull/576) use pnpm ([@mansona]) +- [ember-learn/ember-api-docs] [#903](https://github.com/ember-learn/ember-api-docs/pull/903) Start using Embroider ([@mansona]) +- [ember-learn/ember-styleguide] [#505](https://github.com/ember-learn/ember-styleguide/pull/505) fix publish-branch for release-plan ([@mansona]) +- [ember-learn/ember-styleguide] [#503](https://github.com/ember-learn/ember-styleguide/pull/503) use release-plan for legacy release ([@mansona]) +- [ember-learn/ember-styleguide] [#501](https://github.com/ember-learn/ember-styleguide/pull/501) [lts-v3] get legacy release embroider compatible ([@mansona]) +- [ember-learn/ember-styleguide] [#500](https://github.com/ember-learn/ember-styleguide/pull/500) use new lint-to-the-future dashboard action ([@mansona]) +- [ember-learn/ember-styleguide] [#498](https://github.com/ember-learn/ember-styleguide/pull/498) use release-plan ([@mansona]) +- [ember-learn/ember-styleguide] [#497](https://github.com/ember-learn/ember-styleguide/pull/497) update percy widths ([@mansona]) +- [ember-learn/ember-styleguide] [#496](https://github.com/ember-learn/ember-styleguide/pull/496) update fastboot and ember-try to fix CI ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#169](https://github.com/ember-learn/guidemaker-ember-template/pull/169) switch to pnpm ([@mansona]) +- [ember-learn/guides-source] [#1998](https://github.com/ember-learn/guides-source/pull/1998) update all `ember server` to `npm start` ([@mansona]) +- [nickschot/ember-mobile-menu] [#854](https://github.com/nickschot/ember-mobile-menu/pull/854) WIP Fix fastboot compatibility ([@nickschot]) ## Project Forms -- [project-forms/project-forms.github.io] - [#31](https://github.com/project-forms/project-forms.github.io/pull/31) PoC: - react router ([@oscard0m]) +- [project-forms/project-forms.github.io] [#31](https://github.com/project-forms/project-forms.github.io/pull/31) PoC: react router ([@oscard0m]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@mansona]: https://github.com/mansona @@ -115,22 +58,17 @@ [@oscard0m]: https://github.com/oscard0m [@paoloricciuti]: https://github.com/paoloricciuti [@zeppelin]: https://github.com/zeppelin -[adopted-ember-addons/ember-pikaday]: - https://github.com/adopted-ember-addons/ember-pikaday +[adopted-ember-addons/ember-pikaday]: https://github.com/adopted-ember-addons/ember-pikaday [ember-learn/ember-api-docs]: https://github.com/ember-learn/ember-api-docs [ember-learn/ember-styleguide]: https://github.com/ember-learn/ember-styleguide -[ember-learn/guidemaker-ember-template]: - https://github.com/ember-learn/guidemaker-ember-template +[ember-learn/guidemaker-ember-template]: https://github.com/ember-learn/guidemaker-ember-template [ember-learn/guides-source]: https://github.com/ember-learn/guides-source [embroider-build/embroider]: https://github.com/embroider-build/embroider [embroider-build/release-plan]: https://github.com/embroider-build/release-plan [empress/guidemaker]: https://github.com/empress/guidemaker -[mainmatter/svelte-promise-modals]: - https://github.com/mainmatter/svelte-promise-modals -[mansona/create-release-plan-setup]: - https://github.com/mansona/create-release-plan-setup +[mainmatter/svelte-promise-modals]: https://github.com/mainmatter/svelte-promise-modals +[mansona/create-release-plan-setup]: https://github.com/mansona/create-release-plan-setup [marcoow/pacesetter]: https://github.com/marcoow/pacesetter [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu -[project-forms/project-forms.github.io]: - https://github.com/project-forms/project-forms.github.io +[project-forms/project-forms.github.io]: https://github.com/project-forms/project-forms.github.io [raycast/extensions]: https://github.com/raycast/extensions diff --git a/src/twios/2024-02-04.md b/src/twios/2024-02-04.md index 2f25f31384..199f7a9f60 100644 --- a/src/twios/2024-02-04.md +++ b/src/twios/2024-02-04.md @@ -1,81 +1,36 @@ ## Svelte -- [melt-ui/melt-ui] [#937](https://github.com/melt-ui/melt-ui/pull/937) fix: - type of `type` in tabs builder ([@paoloricciuti]) +- [melt-ui/melt-ui] [#937](https://github.com/melt-ui/melt-ui/pull/937) fix: type of `type` in tabs builder ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#1782](https://github.com/embroider-build/embroider/pull/1782) Merge stable - into main ([@mansona]) -- [embroider-build/embroider] - [#1779](https://github.com/embroider-build/embroider/pull/1779) Virtual entry - point ([@mansona]) -- [embroider-build/embroider] - [#1775](https://github.com/embroider-build/embroider/pull/1775) Docs(peer deps - resolution issues): mentions pnpm-dedupe and add links ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1772](https://github.com/embroider-build/embroider/pull/1772) Docs porting - addons to v2 co location ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1782](https://github.com/embroider-build/embroider/pull/1782) Merge stable into main ([@mansona]) +- [embroider-build/embroider] [#1779](https://github.com/embroider-build/embroider/pull/1779) Virtual entry point ([@mansona]) +- [embroider-build/embroider] [#1775](https://github.com/embroider-build/embroider/pull/1775) Docs(peer deps resolution issues): mentions pnpm-dedupe and add links ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1772](https://github.com/embroider-build/embroider/pull/1772) Docs porting addons to v2 co location ([@BlueCutOfficial]) ## Ember -- [ember-learn/ember-website] - [#1081](https://github.com/ember-learn/ember-website/pull/1081) add Teamtailor - to the Embroider Initiative sponsors ([@mansona]) -- [ember-learn/guides-source] - [#2000](https://github.com/ember-learn/guides-source/pull/2000) Fix tutorial - ([@mansona]) -- [funkensturm/ember-local-storage] - [#377](https://github.com/funkensturm/ember-local-storage/pull/377) Ensure - storage objects are destroyed on application teardown in tests ([@Mikek2252]) -- [lan0/ember-power-time-picker] - [#17](https://github.com/lan0/ember-power-time-picker/pull/17) Upgrade to - Ember 3.24 ([@Mikek2252]) -- [mainmatter/ember-intl-analyzer] - [#655](https://github.com/mainmatter/ember-intl-analyzer/pull/655) Add custom - t helper support ([@Mikek2252]) -- [mainmatter/ember-intl-analyzer] - [#650](https://github.com/mainmatter/ember-intl-analyzer/pull/650) Add back - uses of async and await ([@Mikek2252]) -- [mainmatter/ember-promise-modals] - [#913](https://github.com/mainmatter/ember-promise-modals/pull/913) Remove - support for deprecated `modal-from-string` ([@BlueCutOfficial]) -- [mainmatter/ember-promise-modals] - [#910](https://github.com/mainmatter/ember-promise-modals/pull/910) Drop Ember - < 3.28 and node < 16 ([@BlueCutOfficial]) -- [mainmatter/ember-promise-modals] - [#909](https://github.com/mainmatter/ember-promise-modals/pull/909) Remove the - PostCSS process ([@BlueCutOfficial]) -- [mainmatter/ember-promise-modals] - [#908](https://github.com/mainmatter/ember-promise-modals/pull/908) - docs(DEPRECATIONS)/ Adjust the line about deprecated node ([@BlueCutOfficial]) -- [mainmatter/ember-promise-modals] - [#907](https://github.com/mainmatter/ember-promise-modals/pull/907) Internal - fix/ re-add node 14 to the list of supported engines ([@BlueCutOfficial]) -- [mainmatter/ember-promise-modals] - [#897](https://github.com/mainmatter/ember-promise-modals/pull/897) - Communicate about all the major changes planned for the v2 addon - ([@BlueCutOfficial]) -- [mainmatter/ember-promise-modals] - [#894](https://github.com/mainmatter/ember-promise-modals/pull/894) Deprecate - opening a modal from string ([@BlueCutOfficial]) -- [mainmatter/ember-test-selectors] - [#1215](https://github.com/mainmatter/ember-test-selectors/pull/1215) start - using release-plan ([@mansona]) -- [nickschot/ember-mobile-menu] - [#855](https://github.com/nickschot/ember-mobile-menu/pull/855) Implement - basic scale correction for gestures ([@nickschot]) +- [ember-learn/ember-website] [#1081](https://github.com/ember-learn/ember-website/pull/1081) add Teamtailor to the Embroider Initiative sponsors ([@mansona]) +- [ember-learn/guides-source] [#2000](https://github.com/ember-learn/guides-source/pull/2000) Fix tutorial ([@mansona]) +- [funkensturm/ember-local-storage] [#377](https://github.com/funkensturm/ember-local-storage/pull/377) Ensure storage objects are destroyed on application teardown in tests ([@Mikek2252]) +- [lan0/ember-power-time-picker] [#17](https://github.com/lan0/ember-power-time-picker/pull/17) Upgrade to Ember 3.24 ([@Mikek2252]) +- [mainmatter/ember-intl-analyzer] [#655](https://github.com/mainmatter/ember-intl-analyzer/pull/655) Add custom t helper support ([@Mikek2252]) +- [mainmatter/ember-intl-analyzer] [#650](https://github.com/mainmatter/ember-intl-analyzer/pull/650) Add back uses of async and await ([@Mikek2252]) +- [mainmatter/ember-promise-modals] [#913](https://github.com/mainmatter/ember-promise-modals/pull/913) Remove support for deprecated `modal-from-string` ([@BlueCutOfficial]) +- [mainmatter/ember-promise-modals] [#910](https://github.com/mainmatter/ember-promise-modals/pull/910) Drop Ember < 3.28 and node < 16 ([@BlueCutOfficial]) +- [mainmatter/ember-promise-modals] [#909](https://github.com/mainmatter/ember-promise-modals/pull/909) Remove the PostCSS process ([@BlueCutOfficial]) +- [mainmatter/ember-promise-modals] [#908](https://github.com/mainmatter/ember-promise-modals/pull/908) docs(DEPRECATIONS)/ Adjust the line about deprecated node ([@BlueCutOfficial]) +- [mainmatter/ember-promise-modals] [#907](https://github.com/mainmatter/ember-promise-modals/pull/907) Internal fix/ re-add node 14 to the list of supported engines ([@BlueCutOfficial]) +- [mainmatter/ember-promise-modals] [#897](https://github.com/mainmatter/ember-promise-modals/pull/897) Communicate about all the major changes planned for the v2 addon ([@BlueCutOfficial]) +- [mainmatter/ember-promise-modals] [#894](https://github.com/mainmatter/ember-promise-modals/pull/894) Deprecate opening a modal from string ([@BlueCutOfficial]) +- [mainmatter/ember-test-selectors] [#1215](https://github.com/mainmatter/ember-test-selectors/pull/1215) start using release-plan ([@mansona]) +- [nickschot/ember-mobile-menu] [#855](https://github.com/nickschot/ember-mobile-menu/pull/855) Implement basic scale correction for gestures ([@nickschot]) ## Project Forms -- [project-forms/project-forms.github.io] - [#36](https://github.com/project-forms/project-forms.github.io/pull/36) - refactor(routes): `/new` route uses React Router's 'params' instead of a RegEx - on window.location ([@oscard0m]) -- [project-forms/project-forms.github.io] - [#33](https://github.com/project-forms/project-forms.github.io/pull/33) fix - github oauth login redirect url in production ([@oscard0m]) +- [project-forms/project-forms.github.io] [#36](https://github.com/project-forms/project-forms.github.io/pull/36) refactor(routes): `/new` route uses React Router's 'params' instead of a RegEx on window.location ([@oscard0m]) +- [project-forms/project-forms.github.io] [#33](https://github.com/project-forms/project-forms.github.io/pull/33) fix github oauth login redirect url in production ([@oscard0m]) [@bluecutofficial]: https://github.com/BlueCutOfficial [@mikek2252]: https://github.com/Mikek2252 @@ -87,16 +42,11 @@ [ember-learn/ember-website]: https://github.com/ember-learn/ember-website [ember-learn/guides-source]: https://github.com/ember-learn/guides-source [embroider-build/embroider]: https://github.com/embroider-build/embroider -[funkensturm/ember-local-storage]: - https://github.com/funkensturm/ember-local-storage +[funkensturm/ember-local-storage]: https://github.com/funkensturm/ember-local-storage [lan0/ember-power-time-picker]: https://github.com/lan0/ember-power-time-picker -[mainmatter/ember-intl-analyzer]: - https://github.com/mainmatter/ember-intl-analyzer -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals -[mainmatter/ember-test-selectors]: - https://github.com/mainmatter/ember-test-selectors +[mainmatter/ember-intl-analyzer]: https://github.com/mainmatter/ember-intl-analyzer +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals +[mainmatter/ember-test-selectors]: https://github.com/mainmatter/ember-test-selectors [melt-ui/melt-ui]: https://github.com/melt-ui/melt-ui [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu -[project-forms/project-forms.github.io]: - https://github.com/project-forms/project-forms.github.io +[project-forms/project-forms.github.io]: https://github.com/project-forms/project-forms.github.io diff --git a/src/twios/2024-02-11.md b/src/twios/2024-02-11.md index 22ceae2bea..3fda08c363 100644 --- a/src/twios/2024-02-11.md +++ b/src/twios/2024-02-11.md @@ -1,128 +1,59 @@ ## Rust -- [marcoow/pacesetter] [#32](https://github.com/marcoow/pacesetter/pull/32) add - API docs ([@marcoow]) -- [marcoow/pacesetter] [#31](https://github.com/marcoow/pacesetter/pull/31) test - parse_env, not get_env ([@marcoow]) -- [marcoow/pacesetter] [#30](https://github.com/marcoow/pacesetter/pull/30) Add - tests ([@marcoow]) -- [marcoow/pacesetter] [#29](https://github.com/marcoow/pacesetter/pull/29) - cleanup tests ([@marcoow]) +- [marcoow/pacesetter] [#32](https://github.com/marcoow/pacesetter/pull/32) add API docs ([@marcoow]) +- [marcoow/pacesetter] [#31](https://github.com/marcoow/pacesetter/pull/31) test parse_env, not get_env ([@marcoow]) +- [marcoow/pacesetter] [#30](https://github.com/marcoow/pacesetter/pull/30) Add tests ([@marcoow]) +- [marcoow/pacesetter] [#29](https://github.com/marcoow/pacesetter/pull/29) cleanup tests ([@marcoow]) ## Svelte -- [CodingGarden/listd] [#157](https://github.com/CodingGarden/listd/pull/157) - fix: use proper transition with objects for avatars ([@paoloricciuti]) +- [CodingGarden/listd] [#157](https://github.com/CodingGarden/listd/pull/157) fix: use proper transition with objects for avatars ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#1794](https://github.com/embroider-build/embroider/pull/1794) Refactor the - resolve function to be the only public api to module-resolver ([@mansona]) -- [embroider-build/embroider] - [#1791](https://github.com/embroider-build/embroider/pull/1791) - docs(porting-addons-to-v2): Explain no-unpublished-required issue - ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1794](https://github.com/embroider-build/embroider/pull/1794) Refactor the resolve function to be the only public api to module-resolver ([@mansona]) +- [embroider-build/embroider] [#1791](https://github.com/embroider-build/embroider/pull/1791) docs(porting-addons-to-v2): Explain no-unpublished-required issue ([@BlueCutOfficial]) ## Empress -- [empress/broccoli-static-site-json] - [#76](https://github.com/empress/broccoli-static-site-json/pull/76) update - showdown and jsdom ([@mansona]) -- [empress/broccoli-static-site-json] - [#75](https://github.com/empress/broccoli-static-site-json/pull/75) drop - support for node < 16 ([@mansona]) -- [empress/broccoli-static-site-json] - [#73](https://github.com/empress/broccoli-static-site-json/pull/73) start - using release-plan ([@mansona]) -- [empress/ember-cli-showdown] - [#144](https://github.com/empress/ember-cli-showdown/pull/144) drop support - for node 16 ([@mansona]) -- [empress/ember-cli-showdown] - [#143](https://github.com/empress/ember-cli-showdown/pull/143) update showdown - to v2 ([@mansona]) -- [empress/ember-cli-showdown] - [#141](https://github.com/empress/ember-cli-showdown/pull/141) update to v5.4 - with ember-cli-update ([@mansona]) +- [empress/broccoli-static-site-json] [#76](https://github.com/empress/broccoli-static-site-json/pull/76) update showdown and jsdom ([@mansona]) +- [empress/broccoli-static-site-json] [#75](https://github.com/empress/broccoli-static-site-json/pull/75) drop support for node < 16 ([@mansona]) +- [empress/broccoli-static-site-json] [#73](https://github.com/empress/broccoli-static-site-json/pull/73) start using release-plan ([@mansona]) +- [empress/ember-cli-showdown] [#144](https://github.com/empress/ember-cli-showdown/pull/144) drop support for node 16 ([@mansona]) +- [empress/ember-cli-showdown] [#143](https://github.com/empress/ember-cli-showdown/pull/143) update showdown to v2 ([@mansona]) +- [empress/ember-cli-showdown] [#141](https://github.com/empress/ember-cli-showdown/pull/141) update to v5.4 with ember-cli-update ([@mansona]) ## JavaScript -- [mainmatter/compare-fixture] - [#10](https://github.com/mainmatter/compare-fixture/pull/10) fix npx usage - ([@mansona]) -- [mainmatter/compare-fixture] - [#8](https://github.com/mainmatter/compare-fixture/pull/8) only update npm on - CI if using older node versions ([@mansona]) -- [mainmatter/compare-fixture] - [#7](https://github.com/mainmatter/compare-fixture/pull/7) setup release-plan - ([@mansona]) -- [mansona/create-release-plan-setup] - [#71](https://github.com/mansona/create-release-plan-setup/pull/71) run - create-release-plan-setup ([@mansona]) -- [mansona/create-release-plan-setup] - [#69](https://github.com/mansona/create-release-plan-setup/pull/69) update - release-plan ([@mansona]) -- [mansona/create-release-plan-setup] - [#68](https://github.com/mansona/create-release-plan-setup/pull/68) Update - peter-evans/create-pull-request ([@mansona]) -- [mansona/create-release-plan-setup] - [#67](https://github.com/mansona/create-release-plan-setup/pull/67) add an - editorconfig file ([@mansona]) +- [mainmatter/compare-fixture] [#10](https://github.com/mainmatter/compare-fixture/pull/10) fix npx usage ([@mansona]) +- [mainmatter/compare-fixture] [#8](https://github.com/mainmatter/compare-fixture/pull/8) only update npm on CI if using older node versions ([@mansona]) +- [mainmatter/compare-fixture] [#7](https://github.com/mainmatter/compare-fixture/pull/7) setup release-plan ([@mansona]) +- [mansona/create-release-plan-setup] [#71](https://github.com/mansona/create-release-plan-setup/pull/71) run create-release-plan-setup ([@mansona]) +- [mansona/create-release-plan-setup] [#69](https://github.com/mansona/create-release-plan-setup/pull/69) update release-plan ([@mansona]) +- [mansona/create-release-plan-setup] [#68](https://github.com/mansona/create-release-plan-setup/pull/68) Update peter-evans/create-pull-request ([@mansona]) +- [mansona/create-release-plan-setup] [#67](https://github.com/mansona/create-release-plan-setup/pull/67) add an editorconfig file ([@mansona]) ## Ember -- [DazzlingFugu/ember-fr-guides-source] - [#239](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/239) Update - algolia public key ([@BlueCutOfficial]) -- [DazzlingFugu/ember-fr-guides-source] - [#238](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/238) - Translate guides/applications/initializers.md ([@BlueCutOfficial]) -- [ember-cli/ember-cli] - [#10436](https://github.com/ember-cli/ember-cli/pull/10436) stop using - wyvox/action-setup-pnpm ([@mansona]) -- [ember-codemods/ember-angle-brackets-codemod] - [#515](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/515) - Move helper disambiguation to a flag that is off by default ([@lolmaus]) -- [ember-fastboot/ember-cli-fastboot] - [#932](https://github.com/ember-fastboot/ember-cli-fastboot/pull/932) update - CI action versions ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#175](https://github.com/ember-learn/guidemaker-ember-template/pull/175) - start using release-plan ([@mansona]) -- [lan0/ember-power-time-picker] - [#19](https://github.com/lan0/ember-power-time-picker/pull/19) Remove - `ember-moment` in favour of just using `moment` ([@Mikek2252]) -- [lan0/ember-power-time-picker] - [#18](https://github.com/lan0/ember-power-time-picker/pull/18) Upgrade - `ember-power-select` ([@Mikek2252]) -- [mainmatter/ember-promise-modals] - [#916](https://github.com/mainmatter/ember-promise-modals/pull/916) Create a - monorepo to separate v1 addon from test-app ([@BlueCutOfficial]) -- [mainmatter/ember-promise-modals] - [#915](https://github.com/mainmatter/ember-promise-modals/pull/915) Replace - eslint-plugin-node with latest eslint-plugin-n ([@BlueCutOfficial]) -- [mansona/ember-cli-notifications] - [#374](https://github.com/mansona/ember-cli-notifications/pull/374) update - release-plan ([@mansona]) -- [nickschot/ember-mobile-menu] - [#878](https://github.com/nickschot/ember-mobile-menu/pull/878) Allow - ember-concurrency v4 ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#877](https://github.com/nickschot/ember-mobile-menu/pull/877) Require - ember-resources >=v6.4.0 (inc. v7) ([@nickschot]) +- [DazzlingFugu/ember-fr-guides-source] [#239](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/239) Update algolia public key ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#238](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/238) Translate guides/applications/initializers.md ([@BlueCutOfficial]) +- [ember-cli/ember-cli] [#10436](https://github.com/ember-cli/ember-cli/pull/10436) stop using wyvox/action-setup-pnpm ([@mansona]) +- [ember-codemods/ember-angle-brackets-codemod] [#515](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/515) Move helper disambiguation to a flag that is off by default ([@lolmaus]) +- [ember-fastboot/ember-cli-fastboot] [#932](https://github.com/ember-fastboot/ember-cli-fastboot/pull/932) update CI action versions ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#175](https://github.com/ember-learn/guidemaker-ember-template/pull/175) start using release-plan ([@mansona]) +- [lan0/ember-power-time-picker] [#19](https://github.com/lan0/ember-power-time-picker/pull/19) Remove `ember-moment` in favour of just using `moment` ([@Mikek2252]) +- [lan0/ember-power-time-picker] [#18](https://github.com/lan0/ember-power-time-picker/pull/18) Upgrade `ember-power-select` ([@Mikek2252]) +- [mainmatter/ember-promise-modals] [#916](https://github.com/mainmatter/ember-promise-modals/pull/916) Create a monorepo to separate v1 addon from test-app ([@BlueCutOfficial]) +- [mainmatter/ember-promise-modals] [#915](https://github.com/mainmatter/ember-promise-modals/pull/915) Replace eslint-plugin-node with latest eslint-plugin-n ([@BlueCutOfficial]) +- [mansona/ember-cli-notifications] [#374](https://github.com/mansona/ember-cli-notifications/pull/374) update release-plan ([@mansona]) +- [nickschot/ember-mobile-menu] [#878](https://github.com/nickschot/ember-mobile-menu/pull/878) Allow ember-concurrency v4 ([@nickschot]) +- [nickschot/ember-mobile-menu] [#877](https://github.com/nickschot/ember-mobile-menu/pull/877) Require ember-resources >=v6.4.0 (inc. v7) ([@nickschot]) ## Project Forms -- [project-forms/project-forms.github.io] - [#44](https://github.com/project-forms/project-forms.github.io/pull/44) - test(integration): add a snapshot to capture the Loading UI in `/new` - ([@oscard0m]) -- [project-forms/project-forms.github.io] - [#43](https://github.com/project-forms/project-forms.github.io/pull/43) add - vitest watch mode to package.json ([@oscard0m]) -- [project-forms/project-forms.github.io] - [#42](https://github.com/project-forms/project-forms.github.io/pull/42) - fix(routes): `/new` renders `Access Error` UI correctly ([@oscard0m]) +- [project-forms/project-forms.github.io] [#44](https://github.com/project-forms/project-forms.github.io/pull/44) test(integration): add a snapshot to capture the Loading UI in `/new` ([@oscard0m]) +- [project-forms/project-forms.github.io] [#43](https://github.com/project-forms/project-forms.github.io/pull/43) add vitest watch mode to package.json ([@oscard0m]) +- [project-forms/project-forms.github.io] [#42](https://github.com/project-forms/project-forms.github.io/pull/42) fix(routes): `/new` renders `Access Error` UI correctly ([@oscard0m]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@Mikek2252]: https://github.com/Mikek2252 @@ -134,28 +65,19 @@ [@paoloricciuti]: https://github.com/paoloricciuti [@pichfl]: https://github.com/pichfl [CodingGarden/listd]: https://github.com/CodingGarden/listd -[DazzlingFugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source +[DazzlingFugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source [ember-cli/ember-cli]: https://github.com/ember-cli/ember-cli -[ember-codemods/ember-angle-brackets-codemod]: - https://github.com/ember-codemods/ember-angle-brackets-codemod -[ember-fastboot/ember-cli-fastboot]: - https://github.com/ember-fastboot/ember-cli-fastboot -[ember-learn/guidemaker-ember-template]: - https://github.com/ember-learn/guidemaker-ember-template +[ember-codemods/ember-angle-brackets-codemod]: https://github.com/ember-codemods/ember-angle-brackets-codemod +[ember-fastboot/ember-cli-fastboot]: https://github.com/ember-fastboot/ember-cli-fastboot +[ember-learn/guidemaker-ember-template]: https://github.com/ember-learn/guidemaker-ember-template [embroider-build/embroider]: https://github.com/embroider-build/embroider -[empress/broccoli-static-site-json]: - https://github.com/empress/broccoli-static-site-json +[empress/broccoli-static-site-json]: https://github.com/empress/broccoli-static-site-json [empress/ember-cli-showdown]: https://github.com/empress/ember-cli-showdown [lan0/ember-power-time-picker]: https://github.com/lan0/ember-power-time-picker [mainmatter/compare-fixture]: https://github.com/mainmatter/compare-fixture -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals -[mansona/create-release-plan-setup]: - https://github.com/mansona/create-release-plan-setup -[mansona/ember-cli-notifications]: - https://github.com/mansona/ember-cli-notifications +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals +[mansona/create-release-plan-setup]: https://github.com/mansona/create-release-plan-setup +[mansona/ember-cli-notifications]: https://github.com/mansona/ember-cli-notifications [marcoow/pacesetter]: https://github.com/marcoow/pacesetter [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu -[project-forms/project-forms.github.io]: - https://github.com/project-forms/project-forms.github.io +[project-forms/project-forms.github.io]: https://github.com/project-forms/project-forms.github.io diff --git a/src/twios/2024-02-18.md b/src/twios/2024-02-18.md index 65676aa007..d560c1506c 100644 --- a/src/twios/2024-02-18.md +++ b/src/twios/2024-02-18.md @@ -1,192 +1,77 @@ ## Rust -- [marcoow/pacesetter] [#32](https://github.com/marcoow/pacesetter/pull/32) add - API docs ([@marcoow]) -- [marcoow/pacesetter] [#31](https://github.com/marcoow/pacesetter/pull/31) test - parse_env, not get_env ([@marcoow]) +- [marcoow/pacesetter] [#32](https://github.com/marcoow/pacesetter/pull/32) add API docs ([@marcoow]) +- [marcoow/pacesetter] [#31](https://github.com/marcoow/pacesetter/pull/31) test parse_env, not get_env ([@marcoow]) ## Svelte -- [mainmatter/svelte-promise-modals] - [#76](https://github.com/mainmatter/svelte-promise-modals/pull/76) Add missing - `useModalContext` export ([@zeppelin]) -- [mainmatter/svelte-promise-modals] - [#74](https://github.com/mainmatter/svelte-promise-modals/pull/74) Prefix - og:image path with base URL ([@zeppelin]) -- [mainmatter/svelte-promise-modals] - [#71](https://github.com/mainmatter/svelte-promise-modals/pull/71) Set up SSG - ([@zeppelin]) -- [mainmatter/svelte-promise-modals] - [#75](https://github.com/mainmatter/svelte-promise-modals/pull/75) fix: remove - declare module (kit will generate that with the dev server) ([@paoloricciuti]) -- [mainmatter/svelte-promise-modals] - [#72](https://github.com/mainmatter/svelte-promise-modals/pull/72) fix: - prerendering and small errors in +page.svelte ([@paoloricciuti]) -- [paoloricciuti/sveltekit-search-params] - [#68](https://github.com/paoloricciuti/sveltekit-search-params/pull/68) fix: - allow building the app in prerendering by faking the page store during - building ([@paoloricciuti]) +- [mainmatter/svelte-promise-modals] [#76](https://github.com/mainmatter/svelte-promise-modals/pull/76) Add missing `useModalContext` export ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#74](https://github.com/mainmatter/svelte-promise-modals/pull/74) Prefix og:image path with base URL ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#71](https://github.com/mainmatter/svelte-promise-modals/pull/71) Set up SSG ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#75](https://github.com/mainmatter/svelte-promise-modals/pull/75) fix: remove declare module (kit will generate that with the dev server) ([@paoloricciuti]) +- [mainmatter/svelte-promise-modals] [#72](https://github.com/mainmatter/svelte-promise-modals/pull/72) fix: prerendering and small errors in +page.svelte ([@paoloricciuti]) +- [paoloricciuti/sveltekit-search-params] [#68](https://github.com/paoloricciuti/sveltekit-search-params/pull/68) fix: allow building the app in prerendering by faking the page store during building ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#1805](https://github.com/embroider-build/embroider/pull/1805) Module - resolver: virtualize vendor.css ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1801](https://github.com/embroider-build/embroider/pull/1801) Module - resolver: virtualize vendor.js ([@BlueCutOfficial]) -- [embroider-build/github-changelog] - [#14](https://github.com/embroider-build/github-changelog/pull/14) remove - invisible character in unlabelled text ([@mansona]) -- [embroider-build/github-changelog] - [#11](https://github.com/embroider-build/github-changelog/pull/11) Add a - default implementation for unlabelled ([@mansona]) +- [embroider-build/embroider] [#1805](https://github.com/embroider-build/embroider/pull/1805) Module resolver: virtualize vendor.css ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1801](https://github.com/embroider-build/embroider/pull/1801) Module resolver: virtualize vendor.js ([@BlueCutOfficial]) +- [embroider-build/github-changelog] [#14](https://github.com/embroider-build/github-changelog/pull/14) remove invisible character in unlabelled text ([@mansona]) +- [embroider-build/github-changelog] [#11](https://github.com/embroider-build/github-changelog/pull/11) Add a default implementation for unlabelled ([@mansona]) ## JavaScript -- [embroider-build/release-plan] - [#56](https://github.com/embroider-build/release-plan/pull/56) add the default - github-changelog unlabelled section name to parser ([@mansona]) -- [embroider-build/release-plan] - [#54](https://github.com/embroider-build/release-plan/pull/54) fix import of - semver ([@mansona]) -- [mansona/create-release-plan-setup] - [#82](https://github.com/mansona/create-release-plan-setup/pull/82) run npm - init release-plan-setup on this repo ([@mansona]) -- [mansona/create-release-plan-setup] - [#81](https://github.com/mansona/create-release-plan-setup/pull/81) update - pnpm/action-setup in template ([@mansona]) -- [mansona/create-release-plan-setup] - [#80](https://github.com/mansona/create-release-plan-setup/pull/80) update - release-plan ([@mansona]) -- [mansona/create-release-plan-setup] - [#78](https://github.com/mansona/create-release-plan-setup/pull/78) Show - unlabelled ([@mansona]) -- [mansona/create-release-plan-setup] - [#77](https://github.com/mansona/create-release-plan-setup/pull/77) fix the - branch used when a PR is labelled ([@mansona]) -- [mansona/create-release-plan-setup] - [#76](https://github.com/mansona/create-release-plan-setup/pull/76) update - setup docs in the readme ([@mansona]) +- [embroider-build/release-plan] [#56](https://github.com/embroider-build/release-plan/pull/56) add the default github-changelog unlabelled section name to parser ([@mansona]) +- [embroider-build/release-plan] [#54](https://github.com/embroider-build/release-plan/pull/54) fix import of semver ([@mansona]) +- [mansona/create-release-plan-setup] [#82](https://github.com/mansona/create-release-plan-setup/pull/82) run npm init release-plan-setup on this repo ([@mansona]) +- [mansona/create-release-plan-setup] [#81](https://github.com/mansona/create-release-plan-setup/pull/81) update pnpm/action-setup in template ([@mansona]) +- [mansona/create-release-plan-setup] [#80](https://github.com/mansona/create-release-plan-setup/pull/80) update release-plan ([@mansona]) +- [mansona/create-release-plan-setup] [#78](https://github.com/mansona/create-release-plan-setup/pull/78) Show unlabelled ([@mansona]) +- [mansona/create-release-plan-setup] [#77](https://github.com/mansona/create-release-plan-setup/pull/77) fix the branch used when a PR is labelled ([@mansona]) +- [mansona/create-release-plan-setup] [#76](https://github.com/mansona/create-release-plan-setup/pull/76) update setup docs in the readme ([@mansona]) ## Ember -- [adopted-ember-addons/ember-collapsible-panel] - [#162](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/162) - fix workflow file format ([@mansona]) -- [adopted-ember-addons/ember-collapsible-panel] - [#161](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/161) - fix release-plan label dispatch ([@mansona]) -- [adopted-ember-addons/ember-collapsible-panel] - [#159](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/159) - don't remove stderr.log if release-plan fails ([@mansona]) -- [adopted-ember-addons/ember-collapsible-panel] - [#158](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/158) - fix error-handling for release-plan ([@mansona]) -- [adopted-ember-addons/ember-collapsible-panel] - [#157](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/157) - fix exit code for release-plan ([@mansona]) -- [adopted-ember-addons/ember-collapsible-panel] - [#156](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/156) - testing error-handling in release-plan ([@mansona]) -- [adopted-ember-addons/ember-collapsible-panel] - [#155](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/155) - update release-plan ([@mansona]) -- [adopted-ember-addons/ember-collapsible-panel] - [#151](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/151) - try to setup renovate to batch updates ([@mansona]) -- [adopted-ember-addons/ember-collapsible-panel] - [#149](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/149) - start using release-plan ([@mansona]) -- [adopted-ember-addons/ember-collapsible-panel] - [#145](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/145) - update to v5.4 with ember-cli-update and add Ember 5 support ([@mansona]) -- [adopted-ember-addons/ember-collapsible-panel] - [#142](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/142) - switch to pnpm ([@mansona]) -- [ember-codemods/ember-angle-brackets-codemod] - [#525](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/525) - update release-plan ([@mansona]) -- [ember-codemods/ember-angle-brackets-codemod] - [#517](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/517) - create dependabot config with batching for minor changes ([@mansona]) -- [ember-fastboot/ember-cli-fastboot] - [#932](https://github.com/ember-fastboot/ember-cli-fastboot/pull/932) update - CI action versions ([@mansona]) -- [ember-learn/ember-styleguide] - [#507](https://github.com/ember-learn/ember-styleguide/pull/507) make sidebar - content slightly wider and add background colour ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#178](https://github.com/ember-learn/guidemaker-ember-template/pull/178) - Update Ember to v5.4 and drop support for Ember < 3.28 ([@mansona]) -- [ember-learn/guidemaker-ember-template] - [#177](https://github.com/ember-learn/guidemaker-ember-template/pull/177) use - sidebar styles from ember-styleguide ([@mansona]) -- [emberjs/ember-optional-features] - [#339](https://github.com/emberjs/ember-optional-features/pull/339) update - release-plan ([@mansona]) -- [emberjs/ember-optional-features] - [#338](https://github.com/emberjs/ember-optional-features/pull/338) switch to - npm ([@mansona]) -- [embroider-build/addon-blueprint] - [#262](https://github.com/embroider-build/addon-blueprint/pull/262) fix - workspace definition ([@mansona]) -- [embroider-build/addon-blueprint] - [#260](https://github.com/embroider-build/addon-blueprint/pull/260) update - release-plan ([@mansona]) -- [embroider-build/addon-blueprint] - [#259](https://github.com/embroider-build/addon-blueprint/pull/259) remove - wyvox/action-setup-pnpm to realign with ember-cli ([@mansona]) -- [lan0/ember-power-time-picker] - [#20](https://github.com/lan0/ember-power-time-picker/pull/20) Upgrade to - ember 3.28 ([@Mikek2252]) -- [mainmatter/ember-promise-modals] - [#920](https://github.com/mainmatter/ember-promise-modals/pull/920) Convert - the addon to v2 ([@BlueCutOfficial]) -- [mainmatter/ember-promise-modals] - [#919](https://github.com/mainmatter/ember-promise-modals/pull/919) Use - co-location in the addon package ([@BlueCutOfficial]) -- [mainmatter/ember-promise-modals] - [#918](https://github.com/mainmatter/ember-promise-modals/pull/918) Realign - internal components names to use the default convention ([@BlueCutOfficial]) -- [mainmatter/ember-promise-modals] - [#917](https://github.com/mainmatter/ember-promise-modals/pull/917) Fix the - deployment workflow of the test-app ([@BlueCutOfficial]) -- [miragejs/ember-cli-mirage] - [#2575](https://github.com/miragejs/ember-cli-mirage/pull/2575) use pnpm node - version selection instead of volta ([@mansona]) -- [miragejs/ember-cli-mirage] - [#2574](https://github.com/miragejs/ember-cli-mirage/pull/2574) Fix - initialiser location ([@mansona]) -- [nickschot/ember-gesture-modifiers] - [#648](https://github.com/nickschot/ember-gesture-modifiers/pull/648) Setup - release-plan ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#897](https://github.com/nickschot/ember-mobile-menu/pull/897) Fix docs - deploy ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#892](https://github.com/nickschot/ember-mobile-menu/pull/892) Setup - release-plan ([@nickschot]) -- [nickschot/ember-mobile-menu] - [#891](https://github.com/nickschot/ember-mobile-menu/pull/891) Inline body - scroll lock library, apply small fixes & (unofficial) fastboot support - ([@nickschot]) +- [adopted-ember-addons/ember-collapsible-panel] [#162](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/162) fix workflow file format ([@mansona]) +- [adopted-ember-addons/ember-collapsible-panel] [#161](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/161) fix release-plan label dispatch ([@mansona]) +- [adopted-ember-addons/ember-collapsible-panel] [#159](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/159) don't remove stderr.log if release-plan fails ([@mansona]) +- [adopted-ember-addons/ember-collapsible-panel] [#158](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/158) fix error-handling for release-plan ([@mansona]) +- [adopted-ember-addons/ember-collapsible-panel] [#157](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/157) fix exit code for release-plan ([@mansona]) +- [adopted-ember-addons/ember-collapsible-panel] [#156](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/156) testing error-handling in release-plan ([@mansona]) +- [adopted-ember-addons/ember-collapsible-panel] [#155](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/155) update release-plan ([@mansona]) +- [adopted-ember-addons/ember-collapsible-panel] [#151](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/151) try to setup renovate to batch updates ([@mansona]) +- [adopted-ember-addons/ember-collapsible-panel] [#149](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/149) start using release-plan ([@mansona]) +- [adopted-ember-addons/ember-collapsible-panel] [#145](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/145) update to v5.4 with ember-cli-update and add Ember 5 support ([@mansona]) +- [adopted-ember-addons/ember-collapsible-panel] [#142](https://github.com/adopted-ember-addons/ember-collapsible-panel/pull/142) switch to pnpm ([@mansona]) +- [ember-codemods/ember-angle-brackets-codemod] [#525](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/525) update release-plan ([@mansona]) +- [ember-codemods/ember-angle-brackets-codemod] [#517](https://github.com/ember-codemods/ember-angle-brackets-codemod/pull/517) create dependabot config with batching for minor changes ([@mansona]) +- [ember-fastboot/ember-cli-fastboot] [#932](https://github.com/ember-fastboot/ember-cli-fastboot/pull/932) update CI action versions ([@mansona]) +- [ember-learn/ember-styleguide] [#507](https://github.com/ember-learn/ember-styleguide/pull/507) make sidebar content slightly wider and add background colour ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#178](https://github.com/ember-learn/guidemaker-ember-template/pull/178) Update Ember to v5.4 and drop support for Ember < 3.28 ([@mansona]) +- [ember-learn/guidemaker-ember-template] [#177](https://github.com/ember-learn/guidemaker-ember-template/pull/177) use sidebar styles from ember-styleguide ([@mansona]) +- [emberjs/ember-optional-features] [#339](https://github.com/emberjs/ember-optional-features/pull/339) update release-plan ([@mansona]) +- [emberjs/ember-optional-features] [#338](https://github.com/emberjs/ember-optional-features/pull/338) switch to npm ([@mansona]) +- [embroider-build/addon-blueprint] [#262](https://github.com/embroider-build/addon-blueprint/pull/262) fix workspace definition ([@mansona]) +- [embroider-build/addon-blueprint] [#260](https://github.com/embroider-build/addon-blueprint/pull/260) update release-plan ([@mansona]) +- [embroider-build/addon-blueprint] [#259](https://github.com/embroider-build/addon-blueprint/pull/259) remove wyvox/action-setup-pnpm to realign with ember-cli ([@mansona]) +- [lan0/ember-power-time-picker] [#20](https://github.com/lan0/ember-power-time-picker/pull/20) Upgrade to ember 3.28 ([@Mikek2252]) +- [mainmatter/ember-promise-modals] [#920](https://github.com/mainmatter/ember-promise-modals/pull/920) Convert the addon to v2 ([@BlueCutOfficial]) +- [mainmatter/ember-promise-modals] [#919](https://github.com/mainmatter/ember-promise-modals/pull/919) Use co-location in the addon package ([@BlueCutOfficial]) +- [mainmatter/ember-promise-modals] [#918](https://github.com/mainmatter/ember-promise-modals/pull/918) Realign internal components names to use the default convention ([@BlueCutOfficial]) +- [mainmatter/ember-promise-modals] [#917](https://github.com/mainmatter/ember-promise-modals/pull/917) Fix the deployment workflow of the test-app ([@BlueCutOfficial]) +- [miragejs/ember-cli-mirage] [#2575](https://github.com/miragejs/ember-cli-mirage/pull/2575) use pnpm node version selection instead of volta ([@mansona]) +- [miragejs/ember-cli-mirage] [#2574](https://github.com/miragejs/ember-cli-mirage/pull/2574) Fix initialiser location ([@mansona]) +- [nickschot/ember-gesture-modifiers] [#648](https://github.com/nickschot/ember-gesture-modifiers/pull/648) Setup release-plan ([@nickschot]) +- [nickschot/ember-mobile-menu] [#897](https://github.com/nickschot/ember-mobile-menu/pull/897) Fix docs deploy ([@nickschot]) +- [nickschot/ember-mobile-menu] [#892](https://github.com/nickschot/ember-mobile-menu/pull/892) Setup release-plan ([@nickschot]) +- [nickschot/ember-mobile-menu] [#891](https://github.com/nickschot/ember-mobile-menu/pull/891) Inline body scroll lock library, apply small fixes & (unofficial) fastboot support ([@nickschot]) ## Project Forms -- [project-forms/project-forms.github.io] - [#46](https://github.com/project-forms/project-forms.github.io/pull/46) WIP - migrate loaders and actions ([@oscard0m]) -- [project-forms/project-forms.github.io] - [#45](https://github.com/project-forms/project-forms.github.io/pull/45) - build(jsconfig): check types in `*.js` files by default ([@oscard0m]) -- [project-forms/project-forms.github.io] - [#44](https://github.com/project-forms/project-forms.github.io/pull/44) - test(integration): add a snapshot to capture the Loading UI in `/new` - ([@oscard0m]) -- [project-forms/project-forms.github.io] - [#43](https://github.com/project-forms/project-forms.github.io/pull/43) add - vitest watch mode to package.json ([@oscard0m]) +- [project-forms/project-forms.github.io] [#46](https://github.com/project-forms/project-forms.github.io/pull/46) WIP migrate loaders and actions ([@oscard0m]) +- [project-forms/project-forms.github.io] [#45](https://github.com/project-forms/project-forms.github.io/pull/45) build(jsconfig): check types in `*.js` files by default ([@oscard0m]) +- [project-forms/project-forms.github.io] [#44](https://github.com/project-forms/project-forms.github.io/pull/44) test(integration): add a snapshot to capture the Loading UI in `/new` ([@oscard0m]) +- [project-forms/project-forms.github.io] [#43](https://github.com/project-forms/project-forms.github.io/pull/43) add vitest watch mode to package.json ([@oscard0m]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@Mikek2252]: https://github.com/Mikek2252 @@ -196,36 +81,23 @@ [@oscard0m]: https://github.com/oscard0m [@paoloricciuti]: https://github.com/paoloricciuti [@zeppelin]: https://github.com/zeppelin -[adopted-ember-addons/ember-collapsible-panel]: - https://github.com/adopted-ember-addons/ember-collapsible-panel -[ember-codemods/ember-angle-brackets-codemod]: - https://github.com/ember-codemods/ember-angle-brackets-codemod -[ember-fastboot/ember-cli-fastboot]: - https://github.com/ember-fastboot/ember-cli-fastboot +[adopted-ember-addons/ember-collapsible-panel]: https://github.com/adopted-ember-addons/ember-collapsible-panel +[ember-codemods/ember-angle-brackets-codemod]: https://github.com/ember-codemods/ember-angle-brackets-codemod +[ember-fastboot/ember-cli-fastboot]: https://github.com/ember-fastboot/ember-cli-fastboot [ember-learn/ember-styleguide]: https://github.com/ember-learn/ember-styleguide -[ember-learn/guidemaker-ember-template]: - https://github.com/ember-learn/guidemaker-ember-template -[emberjs/ember-optional-features]: - https://github.com/emberjs/ember-optional-features -[embroider-build/addon-blueprint]: - https://github.com/embroider-build/addon-blueprint +[ember-learn/guidemaker-ember-template]: https://github.com/ember-learn/guidemaker-ember-template +[emberjs/ember-optional-features]: https://github.com/emberjs/ember-optional-features +[embroider-build/addon-blueprint]: https://github.com/embroider-build/addon-blueprint [embroider-build/embroider]: https://github.com/embroider-build/embroider -[embroider-build/github-changelog]: - https://github.com/embroider-build/github-changelog +[embroider-build/github-changelog]: https://github.com/embroider-build/github-changelog [embroider-build/release-plan]: https://github.com/embroider-build/release-plan [lan0/ember-power-time-picker]: https://github.com/lan0/ember-power-time-picker -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals -[mainmatter/svelte-promise-modals]: - https://github.com/mainmatter/svelte-promise-modals -[mansona/create-release-plan-setup]: - https://github.com/mansona/create-release-plan-setup +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals +[mainmatter/svelte-promise-modals]: https://github.com/mainmatter/svelte-promise-modals +[mansona/create-release-plan-setup]: https://github.com/mansona/create-release-plan-setup [marcoow/pacesetter]: https://github.com/marcoow/pacesetter [miragejs/ember-cli-mirage]: https://github.com/miragejs/ember-cli-mirage -[nickschot/ember-gesture-modifiers]: - https://github.com/nickschot/ember-gesture-modifiers +[nickschot/ember-gesture-modifiers]: https://github.com/nickschot/ember-gesture-modifiers [nickschot/ember-mobile-menu]: https://github.com/nickschot/ember-mobile-menu -[paoloricciuti/sveltekit-search-params]: - https://github.com/paoloricciuti/sveltekit-search-params -[project-forms/project-forms.github.io]: - https://github.com/project-forms/project-forms.github.io +[paoloricciuti/sveltekit-search-params]: https://github.com/paoloricciuti/sveltekit-search-params +[project-forms/project-forms.github.io]: https://github.com/project-forms/project-forms.github.io diff --git a/src/twios/2024-02-25.md b/src/twios/2024-02-25.md index 314aec5259..544afbd926 100644 --- a/src/twios/2024-02-25.md +++ b/src/twios/2024-02-25.md @@ -1,56 +1,33 @@ ## Svelte -- [mainmatter/svelte-promise-modals] - [#77](https://github.com/mainmatter/svelte-promise-modals/pull/77) Throw on - invalid instance count ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#77](https://github.com/mainmatter/svelte-promise-modals/pull/77) Throw on invalid instance count ([@zeppelin]) ## Embroider -- [embroider-build/embroider] - [#1811](https://github.com/embroider-build/embroider/pull/1811) Module - Resolver: Virtual test-support.css ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1807](https://github.com/embroider-build/embroider/pull/1807) Module - resolver: virtualize test-support.js ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1811](https://github.com/embroider-build/embroider/pull/1811) Module Resolver: Virtual test-support.css ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1807](https://github.com/embroider-build/embroider/pull/1807) Module resolver: virtualize test-support.js ([@BlueCutOfficial]) ## Empress -- [empress/empress-blog] - [#184](https://github.com/empress/empress-blog/pull/184) setup release-plan - ([@mansona]) +- [empress/empress-blog] [#184](https://github.com/empress/empress-blog/pull/184) setup release-plan ([@mansona]) ## Ember -- [DazzlingFugu/ember-fr-guides-source] - [#242](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/242) - Translate guides/tutorial/part-2/ember-data.md ([@BlueCutOfficial]) -- [bgantzler/ember-mirage] - [#26](https://github.com/bgantzler/ember-mirage/pull/26) Reset blueprint to - latest v2 ([@mansona]) -- [embroider-build/addon-blueprint] - [#262](https://github.com/embroider-build/addon-blueprint/pull/262) fix - workspace definition ([@mansona]) -- [nickschot/ember-mobile-pane] - [#54](https://github.com/nickschot/ember-mobile-pane/pull/54) Upgrade to - ember-cli 4.12.0 blueprint ([@nickschot]) -- [nickschot/ember-mobile-pane] - [#50](https://github.com/nickschot/ember-mobile-pane/pull/50) Add - renovate.json ([@nickschot]) -- [nickschot/ember-mobile-pane] - [#49](https://github.com/nickschot/ember-mobile-pane/pull/49) drop ember < - 3.28, update CI config, switch to pnpm ([@nickschot]) +- [DazzlingFugu/ember-fr-guides-source] [#242](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/242) Translate guides/tutorial/part-2/ember-data.md ([@BlueCutOfficial]) +- [bgantzler/ember-mirage] [#26](https://github.com/bgantzler/ember-mirage/pull/26) Reset blueprint to latest v2 ([@mansona]) +- [embroider-build/addon-blueprint] [#262](https://github.com/embroider-build/addon-blueprint/pull/262) fix workspace definition ([@mansona]) +- [nickschot/ember-mobile-pane] [#54](https://github.com/nickschot/ember-mobile-pane/pull/54) Upgrade to ember-cli 4.12.0 blueprint ([@nickschot]) +- [nickschot/ember-mobile-pane] [#50](https://github.com/nickschot/ember-mobile-pane/pull/50) Add renovate.json ([@nickschot]) +- [nickschot/ember-mobile-pane] [#49](https://github.com/nickschot/ember-mobile-pane/pull/49) drop ember < 3.28, update CI config, switch to pnpm ([@nickschot]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@mansona]: https://github.com/mansona [@nickschot]: https://github.com/nickschot [@zeppelin]: https://github.com/zeppelin -[DazzlingFugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source +[DazzlingFugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source [bgantzler/ember-mirage]: https://github.com/bgantzler/ember-mirage -[embroider-build/addon-blueprint]: - https://github.com/embroider-build/addon-blueprint +[embroider-build/addon-blueprint]: https://github.com/embroider-build/addon-blueprint [embroider-build/embroider]: https://github.com/embroider-build/embroider [empress/empress-blog]: https://github.com/empress/empress-blog -[mainmatter/svelte-promise-modals]: - https://github.com/mainmatter/svelte-promise-modals +[mainmatter/svelte-promise-modals]: https://github.com/mainmatter/svelte-promise-modals [nickschot/ember-mobile-pane]: https://github.com/nickschot/ember-mobile-pane diff --git a/src/twios/2024-03-03.md b/src/twios/2024-03-03.md index 4e42f1d26c..6bb11c3457 100644 --- a/src/twios/2024-03-03.md +++ b/src/twios/2024-03-03.md @@ -1,70 +1,34 @@ ## Svelte -- [oscard0m/test-sveltekit] - [#47](https://github.com/oscard0m/test-sveltekit/pull/47) Delete - static/favicon.png ([@oscard0m]) +- [oscard0m/test-sveltekit] [#47](https://github.com/oscard0m/test-sveltekit/pull/47) Delete static/favicon.png ([@oscard0m]) ## Embroider -- [embroider-build/embroider] - [#1825](https://github.com/embroider-build/embroider/pull/1825) Merge stable - into main ([@mansona]) -- [embroider-build/embroider] - [#1824](https://github.com/embroider-build/embroider/pull/1824) update - release-plan ([@mansona]) -- [embroider-build/embroider] - [#1817](https://github.com/embroider-build/embroider/pull/1817) pin ember-data - to fix issue in CI ([@mansona]) -- [embroider-build/embroider] - [#1794](https://github.com/embroider-build/embroider/pull/1794) Refactor the - resolve function to be the only public api to module-resolver ([@mansona]) -- [embroider-build/embroider] - [#1819](https://github.com/embroider-build/embroider/pull/1819) Add a new - prebuild function with strict defaults ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1825](https://github.com/embroider-build/embroider/pull/1825) Merge stable into main ([@mansona]) +- [embroider-build/embroider] [#1824](https://github.com/embroider-build/embroider/pull/1824) update release-plan ([@mansona]) +- [embroider-build/embroider] [#1817](https://github.com/embroider-build/embroider/pull/1817) pin ember-data to fix issue in CI ([@mansona]) +- [embroider-build/embroider] [#1794](https://github.com/embroider-build/embroider/pull/1794) Refactor the resolve function to be the only public api to module-resolver ([@mansona]) +- [embroider-build/embroider] [#1819](https://github.com/embroider-build/embroider/pull/1819) Add a new prebuild function with strict defaults ([@BlueCutOfficial]) ## Ember -- [adopted-ember-addons/ember-cp-validations] - [#752](https://github.com/adopted-ember-addons/ember-cp-validations/pull/752) - start using release-plan ([@mansona]) -- [adopted-ember-addons/ember-cp-validations] - [#751](https://github.com/adopted-ember-addons/ember-cp-validations/pull/751) - switch to pnpm ([@mansona]) -- [adopted-ember-addons/ember-cp-validations] - [#749](https://github.com/adopted-ember-addons/ember-cp-validations/pull/749) - update @embroider/test-setup to fix CI ([@mansona]) -- [bgantzler/ember-mirage] - [#28](https://github.com/bgantzler/ember-mirage/pull/28) start using - release-plan for deployment ([@mansona]) -- [bgantzler/ember-mirage] - [#27](https://github.com/bgantzler/ember-mirage/pull/27) Update readme and - migration guide ([@mansona]) -- [bgantzler/ember-mirage] - [#26](https://github.com/bgantzler/ember-mirage/pull/26) Reset blueprint to - latest v2 ([@mansona]) -- [ember-learn/guides-source] - [#2000](https://github.com/ember-learn/guides-source/pull/2000) Fix tutorial - ([@mansona]) -- [mainmatter/ember-promise-modals] - [#925](https://github.com/mainmatter/ember-promise-modals/pull/925) ci (fix): - in the deploy workflow, move the install before the addon build - ([@BlueCutOfficial]) -- [mainmatter/ember-promise-modals] - [#924](https://github.com/mainmatter/ember-promise-modals/pull/924) CI (fix): - Build the addon before building and deploying the test app - ([@BlueCutOfficial]) -- [mainmatter/ember-promise-modals] - [#920](https://github.com/mainmatter/ember-promise-modals/pull/920) Convert - the addon to v2 ([@BlueCutOfficial]) +- [adopted-ember-addons/ember-cp-validations] [#752](https://github.com/adopted-ember-addons/ember-cp-validations/pull/752) start using release-plan ([@mansona]) +- [adopted-ember-addons/ember-cp-validations] [#751](https://github.com/adopted-ember-addons/ember-cp-validations/pull/751) switch to pnpm ([@mansona]) +- [adopted-ember-addons/ember-cp-validations] [#749](https://github.com/adopted-ember-addons/ember-cp-validations/pull/749) update @embroider/test-setup to fix CI ([@mansona]) +- [bgantzler/ember-mirage] [#28](https://github.com/bgantzler/ember-mirage/pull/28) start using release-plan for deployment ([@mansona]) +- [bgantzler/ember-mirage] [#27](https://github.com/bgantzler/ember-mirage/pull/27) Update readme and migration guide ([@mansona]) +- [bgantzler/ember-mirage] [#26](https://github.com/bgantzler/ember-mirage/pull/26) Reset blueprint to latest v2 ([@mansona]) +- [ember-learn/guides-source] [#2000](https://github.com/ember-learn/guides-source/pull/2000) Fix tutorial ([@mansona]) +- [mainmatter/ember-promise-modals] [#925](https://github.com/mainmatter/ember-promise-modals/pull/925) ci (fix): in the deploy workflow, move the install before the addon build ([@BlueCutOfficial]) +- [mainmatter/ember-promise-modals] [#924](https://github.com/mainmatter/ember-promise-modals/pull/924) CI (fix): Build the addon before building and deploying the test app ([@BlueCutOfficial]) +- [mainmatter/ember-promise-modals] [#920](https://github.com/mainmatter/ember-promise-modals/pull/920) Convert the addon to v2 ([@BlueCutOfficial]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@mansona]: https://github.com/mansona [@oscard0m]: https://github.com/oscard0m -[adopted-ember-addons/ember-cp-validations]: - https://github.com/adopted-ember-addons/ember-cp-validations +[adopted-ember-addons/ember-cp-validations]: https://github.com/adopted-ember-addons/ember-cp-validations [bgantzler/ember-mirage]: https://github.com/bgantzler/ember-mirage [ember-learn/guides-source]: https://github.com/ember-learn/guides-source [embroider-build/embroider]: https://github.com/embroider-build/embroider -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals [oscard0m/test-sveltekit]: https://github.com/oscard0m/test-sveltekit diff --git a/src/twios/2024-03-10.md b/src/twios/2024-03-10.md index 02080bdfb5..ed6497f744 100644 --- a/src/twios/2024-03-10.md +++ b/src/twios/2024-03-10.md @@ -1,75 +1,40 @@ ## Rust -- [marcoow/pacesetter] [#32](https://github.com/marcoow/pacesetter/pull/32) add - API docs ([@marcoow]) +- [marcoow/pacesetter] [#32](https://github.com/marcoow/pacesetter/pull/32) add API docs ([@marcoow]) ## Svelte -- [melt-ui/melt-ui] [#1076](https://github.com/melt-ui/melt-ui/pull/1076) fix: - datepicker not syncing with calendar ([@paoloricciuti]) -- [melt-ui/melt-ui] [#1072](https://github.com/melt-ui/melt-ui/pull/1072) fix: - months not updating when changing options (range calendar) ([@paoloricciuti]) -- [melt-ui/melt-ui] [#1070](https://github.com/melt-ui/melt-ui/pull/1070) fix: - months not updating when changing options ([@paoloricciuti]) +- [melt-ui/melt-ui] [#1076](https://github.com/melt-ui/melt-ui/pull/1076) fix: datepicker not syncing with calendar ([@paoloricciuti]) +- [melt-ui/melt-ui] [#1072](https://github.com/melt-ui/melt-ui/pull/1072) fix: months not updating when changing options (range calendar) ([@paoloricciuti]) +- [melt-ui/melt-ui] [#1070](https://github.com/melt-ui/melt-ui/pull/1070) fix: months not updating when changing options ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#1838](https://github.com/embroider-build/embroider/pull/1838) make sure - @embroider/macros doesn't try to load a babel config ([@mansona]) -- [embroider-build/embroider] - [#1834](https://github.com/embroider-build/embroider/pull/1834) add vite@5 to - the peer deps of @embroider/vite ([@mansona]) -- [embroider-build/embroider] - [#1827](https://github.com/embroider-build/embroider/pull/1827) fix extension - resolving for esbuild ([@mansona]) -- [embroider-build/embroider] - [#1837](https://github.com/embroider-build/embroider/pull/1837) merge default - options and the prebuild options provided in ember-cli-build - ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1838](https://github.com/embroider-build/embroider/pull/1838) make sure @embroider/macros doesn't try to load a babel config ([@mansona]) +- [embroider-build/embroider] [#1834](https://github.com/embroider-build/embroider/pull/1834) add vite@5 to the peer deps of @embroider/vite ([@mansona]) +- [embroider-build/embroider] [#1827](https://github.com/embroider-build/embroider/pull/1827) fix extension resolving for esbuild ([@mansona]) +- [embroider-build/embroider] [#1837](https://github.com/embroider-build/embroider/pull/1837) merge default options and the prebuild options provided in ember-cli-build ([@BlueCutOfficial]) ## Empress -- [empress/ember-cli-showdown] - [#147](https://github.com/empress/ember-cli-showdown/pull/147) fix peer - dependency ([@mansona]) -- [empress/guidemaker] [#105](https://github.com/empress/guidemaker/pull/105) - fix the location of the shorten-version helper ([@mansona]) -- [empress/guidemaker] [#102](https://github.com/empress/guidemaker/pull/102) - swap to pnpm ([@mansona]) -- [empress/guidemaker] [#91](https://github.com/empress/guidemaker/pull/91) - update to v5.4 with ember-cli-update and drop support for Ember < 3.28 - ([@mansona]) -- [empress/guidemaker-default-template] - [#50](https://github.com/empress/guidemaker-default-template/pull/50) start - using release-plan ([@mansona]) -- [empress/guidemaker-default-template] - [#49](https://github.com/empress/guidemaker-default-template/pull/49) convert - to a v2 addon ([@mansona]) +- [empress/ember-cli-showdown] [#147](https://github.com/empress/ember-cli-showdown/pull/147) fix peer dependency ([@mansona]) +- [empress/guidemaker] [#105](https://github.com/empress/guidemaker/pull/105) fix the location of the shorten-version helper ([@mansona]) +- [empress/guidemaker] [#102](https://github.com/empress/guidemaker/pull/102) swap to pnpm ([@mansona]) +- [empress/guidemaker] [#91](https://github.com/empress/guidemaker/pull/91) update to v5.4 with ember-cli-update and drop support for Ember < 3.28 ([@mansona]) +- [empress/guidemaker-default-template] [#50](https://github.com/empress/guidemaker-default-template/pull/50) start using release-plan ([@mansona]) +- [empress/guidemaker-default-template] [#49](https://github.com/empress/guidemaker-default-template/pull/49) convert to a v2 addon ([@mansona]) ## Octokit -- [octoherd/octokit] [#79](https://github.com/octoherd/octokit/pull/79) - chore(.gitignore): fix typo in filename ([@oscard0m]) +- [octoherd/octokit] [#79](https://github.com/octoherd/octokit/pull/79) chore(.gitignore): fix typo in filename ([@oscard0m]) ## Ember -- [bgantzler/ember-mirage] - [#32](https://github.com/bgantzler/ember-mirage/pull/32) reset addon version - to what is deployed on npm ([@mansona]) -- [bgantzler/ember-mirage] - [#31](https://github.com/bgantzler/ember-mirage/pull/31) update addon - blueprint to v2.14 with ember-cli-update ([@mansona]) -- [bgantzler/ember-mirage] - [#30](https://github.com/bgantzler/ember-mirage/pull/30) swap from - ember-inflector to active-inflector ([@mansona]) -- [embroider-build/addon-blueprint] - [#268](https://github.com/embroider-build/addon-blueprint/pull/268) use our - own version of ember-cli so the test app is always generated with the latest - blueprint ([@mansona]) -- [embroider-build/addon-blueprint] - [#266](https://github.com/embroider-build/addon-blueprint/pull/266) add a - timeout minutes to the CI jobs ([@mansona]) +- [bgantzler/ember-mirage] [#32](https://github.com/bgantzler/ember-mirage/pull/32) reset addon version to what is deployed on npm ([@mansona]) +- [bgantzler/ember-mirage] [#31](https://github.com/bgantzler/ember-mirage/pull/31) update addon blueprint to v2.14 with ember-cli-update ([@mansona]) +- [bgantzler/ember-mirage] [#30](https://github.com/bgantzler/ember-mirage/pull/30) swap from ember-inflector to active-inflector ([@mansona]) +- [embroider-build/addon-blueprint] [#268](https://github.com/embroider-build/addon-blueprint/pull/268) use our own version of ember-cli so the test app is always generated with the latest blueprint ([@mansona]) +- [embroider-build/addon-blueprint] [#266](https://github.com/embroider-build/addon-blueprint/pull/266) add a timeout minutes to the CI jobs ([@mansona]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@mansona]: https://github.com/mansona @@ -77,12 +42,10 @@ [@oscard0m]: https://github.com/oscard0m [@paoloricciuti]: https://github.com/paoloricciuti [bgantzler/ember-mirage]: https://github.com/bgantzler/ember-mirage -[embroider-build/addon-blueprint]: - https://github.com/embroider-build/addon-blueprint +[embroider-build/addon-blueprint]: https://github.com/embroider-build/addon-blueprint [embroider-build/embroider]: https://github.com/embroider-build/embroider [empress/ember-cli-showdown]: https://github.com/empress/ember-cli-showdown -[empress/guidemaker-default-template]: - https://github.com/empress/guidemaker-default-template +[empress/guidemaker-default-template]: https://github.com/empress/guidemaker-default-template [empress/guidemaker]: https://github.com/empress/guidemaker [marcoow/pacesetter]: https://github.com/marcoow/pacesetter [melt-ui/melt-ui]: https://github.com/melt-ui/melt-ui diff --git a/src/twios/2024-03-17.md b/src/twios/2024-03-17.md index 0239c64534..f300464448 100644 --- a/src/twios/2024-03-17.md +++ b/src/twios/2024-03-17.md @@ -1,59 +1,35 @@ ## Svelte -- [melt-ui/melt-ui] [#1076](https://github.com/melt-ui/melt-ui/pull/1076) fix: - datepicker not syncing with calendar ([@paoloricciuti]) +- [melt-ui/melt-ui] [#1076](https://github.com/melt-ui/melt-ui/pull/1076) fix: datepicker not syncing with calendar ([@paoloricciuti]) ## Embroider -- [embroider-build/github-changelog] - [#19](https://github.com/embroider-build/github-changelog/pull/19) fix npm - badge to point at the right package ([@mansona]) -- [embroider-build/github-changelog] - [#17](https://github.com/embroider-build/github-changelog/pull/17) swap - everything to be github-changelog ([@mansona]) +- [embroider-build/github-changelog] [#19](https://github.com/embroider-build/github-changelog/pull/19) fix npm badge to point at the right package ([@mansona]) +- [embroider-build/github-changelog] [#17](https://github.com/embroider-build/github-changelog/pull/17) swap everything to be github-changelog ([@mansona]) ## JavaScript -- [embroider-build/release-plan] - [#67](https://github.com/embroider-build/release-plan/pull/67) fix typo in - release-plan setup ([@mansona]) -- [embroider-build/release-plan] - [#66](https://github.com/embroider-build/release-plan/pull/66) start using - github-changelog ([@mansona]) -- [embroider-build/release-plan] - [#64](https://github.com/embroider-build/release-plan/pull/64) update - release-plan-setup ([@mansona]) -- [pichfl/auto-reveal] [#6](https://github.com/pichfl/auto-reveal/pull/6) Add - README, Run Formatter ([@pichfl]) +- [embroider-build/release-plan] [#67](https://github.com/embroider-build/release-plan/pull/67) fix typo in release-plan setup ([@mansona]) +- [embroider-build/release-plan] [#66](https://github.com/embroider-build/release-plan/pull/66) start using github-changelog ([@mansona]) +- [embroider-build/release-plan] [#64](https://github.com/embroider-build/release-plan/pull/64) update release-plan-setup ([@mansona]) +- [pichfl/auto-reveal] [#6](https://github.com/pichfl/auto-reveal/pull/6) Add README, Run Formatter ([@pichfl]) ## Ember -- [bgantzler/ember-mirage] - [#38](https://github.com/bgantzler/ember-mirage/pull/38) put the repository - reference in the right package ([@mansona]) -- [bgantzler/ember-mirage] - [#36](https://github.com/bgantzler/ember-mirage/pull/36) fix github backlink - from npm ([@mansona]) -- [mainmatter/ember-promise-modals] - [#927](https://github.com/mainmatter/ember-promise-modals/pull/927) Prepare - the release process ([@BlueCutOfficial]) -- [yapplabs/ember-tether] - [#129](https://github.com/yapplabs/ember-tether/pull/129) Update to Ember v5.4 - with ember-cli-update ([@mansona]) -- [yapplabs/ember-tether] - [#128](https://github.com/yapplabs/ember-tether/pull/128) use pnpm - ([@mansona]) +- [bgantzler/ember-mirage] [#38](https://github.com/bgantzler/ember-mirage/pull/38) put the repository reference in the right package ([@mansona]) +- [bgantzler/ember-mirage] [#36](https://github.com/bgantzler/ember-mirage/pull/36) fix github backlink from npm ([@mansona]) +- [mainmatter/ember-promise-modals] [#927](https://github.com/mainmatter/ember-promise-modals/pull/927) Prepare the release process ([@BlueCutOfficial]) +- [yapplabs/ember-tether] [#129](https://github.com/yapplabs/ember-tether/pull/129) Update to Ember v5.4 with ember-cli-update ([@mansona]) +- [yapplabs/ember-tether] [#128](https://github.com/yapplabs/ember-tether/pull/128) use pnpm ([@mansona]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@mansona]: https://github.com/mansona [@paoloricciuti]: https://github.com/paoloricciuti [@pichfl]: https://github.com/pichfl [bgantzler/ember-mirage]: https://github.com/bgantzler/ember-mirage -[embroider-build/github-changelog]: - https://github.com/embroider-build/github-changelog +[embroider-build/github-changelog]: https://github.com/embroider-build/github-changelog [embroider-build/release-plan]: https://github.com/embroider-build/release-plan -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals [melt-ui/melt-ui]: https://github.com/melt-ui/melt-ui [pichfl/auto-reveal]: https://github.com/pichfl/auto-reveal [yapplabs/ember-tether]: https://github.com/yapplabs/ember-tether diff --git a/src/twios/2024-03-24.md b/src/twios/2024-03-24.md index ea15f1cd39..d4ce5cd09f 100644 --- a/src/twios/2024-03-24.md +++ b/src/twios/2024-03-24.md @@ -1,24 +1,14 @@ ## Svelte -- [mainmatter/svelte-concurrency] - [#10](https://github.com/mainmatter/svelte-concurrency/pull/10) feat: handlers - abstraction + queue ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#10](https://github.com/mainmatter/svelte-concurrency/pull/10) feat: handlers abstraction + queue ([@paoloricciuti]) ## Ember -- [Authmaker/authmaker-ember-simple-auth] - [#50](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/50) Update - to 5.7 with ember-cli-update ([@mansona]) -- [Authmaker/authmaker-ember-simple-auth] - [#48](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/48) start - using release-plan ([@mansona]) -- [Authmaker/authmaker-ember-simple-auth] - [#47](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/47) update - ember-simple-auth, move to pnpm, and drop support for Node < 18 ([@mansona]) +- [Authmaker/authmaker-ember-simple-auth] [#50](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/50) Update to 5.7 with ember-cli-update ([@mansona]) +- [Authmaker/authmaker-ember-simple-auth] [#48](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/48) start using release-plan ([@mansona]) +- [Authmaker/authmaker-ember-simple-auth] [#47](https://github.com/Authmaker/authmaker-ember-simple-auth/pull/47) update ember-simple-auth, move to pnpm, and drop support for Node < 18 ([@mansona]) [@mansona]: https://github.com/mansona [@paoloricciuti]: https://github.com/paoloricciuti -[Authmaker/authmaker-ember-simple-auth]: - https://github.com/Authmaker/authmaker-ember-simple-auth -[mainmatter/svelte-concurrency]: - https://github.com/mainmatter/svelte-concurrency +[Authmaker/authmaker-ember-simple-auth]: https://github.com/Authmaker/authmaker-ember-simple-auth +[mainmatter/svelte-concurrency]: https://github.com/mainmatter/svelte-concurrency diff --git a/src/twios/2024-03-31.md b/src/twios/2024-03-31.md index a4037a2e26..ce144d276d 100644 --- a/src/twios/2024-03-31.md +++ b/src/twios/2024-03-31.md @@ -1,36 +1,21 @@ ## Rust -- [mainmatter/cargo-autoinherit] - [#13](https://github.com/mainmatter/cargo-autoinherit/pull/13) fix: don't - overwrite a dependency that already exists in root Cargo.toml - ([@BobrImperator]) -- [marcoow/pacesetter] [#43](https://github.com/marcoow/pacesetter/pull/43) Fix - generators ([@marcoow]) -- [marcoow/pacesetter] [#42](https://github.com/marcoow/pacesetter/pull/42) use - new test APIs in generated files consistently ([@marcoow]) -- [marcoow/pacesetter] [#41](https://github.com/marcoow/pacesetter/pull/41) - switch to googletest for better assertions ([@marcoow]) -- [marcoow/pacesetter] [#40](https://github.com/marcoow/pacesetter/pull/40) - replace body parsing helpers with extensions on Body ([@marcoow]) -- [marcoow/pacesetter] [#39](https://github.com/marcoow/pacesetter/pull/39) use - better request API in tests ([@marcoow]) -- [marcoow/pacesetter] [#38](https://github.com/marcoow/pacesetter/pull/38) - inline pacesetter code into generated project ([@marcoow]) +- [mainmatter/cargo-autoinherit] [#13](https://github.com/mainmatter/cargo-autoinherit/pull/13) fix: don't overwrite a dependency that already exists in root Cargo.toml ([@BobrImperator]) +- [marcoow/pacesetter] [#43](https://github.com/marcoow/pacesetter/pull/43) Fix generators ([@marcoow]) +- [marcoow/pacesetter] [#42](https://github.com/marcoow/pacesetter/pull/42) use new test APIs in generated files consistently ([@marcoow]) +- [marcoow/pacesetter] [#41](https://github.com/marcoow/pacesetter/pull/41) switch to googletest for better assertions ([@marcoow]) +- [marcoow/pacesetter] [#40](https://github.com/marcoow/pacesetter/pull/40) replace body parsing helpers with extensions on Body ([@marcoow]) +- [marcoow/pacesetter] [#39](https://github.com/marcoow/pacesetter/pull/39) use better request API in tests ([@marcoow]) +- [marcoow/pacesetter] [#38](https://github.com/marcoow/pacesetter/pull/38) inline pacesetter code into generated project ([@marcoow]) ## Svelte -- [mainmatter/svelte-concurrency] - [#40](https://github.com/mainmatter/svelte-concurrency/pull/40) chore: add - basic testing setup ([@paoloricciuti]) -- [mainmatter/svelte-concurrency] - [#39](https://github.com/mainmatter/svelte-concurrency/pull/39) chore: format - after prepare release ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#40](https://github.com/mainmatter/svelte-concurrency/pull/40) chore: add basic testing setup ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#39](https://github.com/mainmatter/svelte-concurrency/pull/39) chore: format after prepare release ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#1846](https://github.com/embroider-build/embroider/pull/1846) Prevent - query-params added by vite to be passed to core logic ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1846](https://github.com/embroider-build/embroider/pull/1846) Prevent query-params added by vite to be passed to core logic ([@BlueCutOfficial]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@BobrImperator]: https://github.com/BobrImperator @@ -38,6 +23,5 @@ [@paoloricciuti]: https://github.com/paoloricciuti [embroider-build/embroider]: https://github.com/embroider-build/embroider [mainmatter/cargo-autoinherit]: https://github.com/mainmatter/cargo-autoinherit -[mainmatter/svelte-concurrency]: - https://github.com/mainmatter/svelte-concurrency +[mainmatter/svelte-concurrency]: https://github.com/mainmatter/svelte-concurrency [marcoow/pacesetter]: https://github.com/marcoow/pacesetter diff --git a/src/twios/2024-04-07.md b/src/twios/2024-04-07.md index 9f5c8f04a3..363eb4f29b 100644 --- a/src/twios/2024-04-07.md +++ b/src/twios/2024-04-07.md @@ -1,56 +1,31 @@ ## Svelte -- [mainmatter/svelte-concurrency] - [#45](https://github.com/mainmatter/svelte-concurrency/pull/45) feat: add max - to restartable ([@paoloricciuti]) -- [mainmatter/svelte-concurrency] - [#43](https://github.com/mainmatter/svelte-concurrency/pull/43) chore: - restructure testing and add tests for enqueue ([@paoloricciuti]) -- [mainmatter/svelte-concurrency] - [#41](https://github.com/mainmatter/svelte-concurrency/pull/41) fix: abort - when dropping ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#45](https://github.com/mainmatter/svelte-concurrency/pull/45) feat: add max to restartable ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#43](https://github.com/mainmatter/svelte-concurrency/pull/43) chore: restructure testing and add tests for enqueue ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#41](https://github.com/mainmatter/svelte-concurrency/pull/41) fix: abort when dropping ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#1863](https://github.com/embroider-build/embroider/pull/1863) add isLazy to - resolver config and streamline Engine interface ([@mansona]) -- [embroider-build/embroider] - [#1840](https://github.com/embroider-build/embroider/pull/1840) Use Vite for - all tests ([@mansona]) -- [embroider-build/embroider] - [#1864](https://github.com/embroider-build/embroider/pull/1864) Make the - addon-template use vite ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1807](https://github.com/embroider-build/embroider/pull/1807) Module - resolver: virtualize test-support.js ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1863](https://github.com/embroider-build/embroider/pull/1863) add isLazy to resolver config and streamline Engine interface ([@mansona]) +- [embroider-build/embroider] [#1840](https://github.com/embroider-build/embroider/pull/1840) Use Vite for all tests ([@mansona]) +- [embroider-build/embroider] [#1864](https://github.com/embroider-build/embroider/pull/1864) Make the addon-template use vite ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1807](https://github.com/embroider-build/embroider/pull/1807) Module resolver: virtualize test-support.js ([@BlueCutOfficial]) ## JavaScript -- [embroider-build/create-release-plan-setup] - [#97](https://github.com/embroider-build/create-release-plan-setup/pull/97) - Fix repo url ([@mansona]) -- [embroider-build/create-release-plan-setup] - [#95](https://github.com/embroider-build/create-release-plan-setup/pull/95) - update to release-plan 0.9.0 ([@mansona]) +- [embroider-build/create-release-plan-setup] [#97](https://github.com/embroider-build/create-release-plan-setup/pull/97) Fix repo url ([@mansona]) +- [embroider-build/create-release-plan-setup] [#95](https://github.com/embroider-build/create-release-plan-setup/pull/95) update to release-plan 0.9.0 ([@mansona]) ## Ember -- [ember-engines/ember-engines] - [#873](https://github.com/ember-engines/ember-engines/pull/873) run npm init - release-plan-setup@latest ([@mansona]) -- [mainmatter/ember-promise-modals] - [#943](https://github.com/mainmatter/ember-promise-modals/pull/943) Remove - version numbers on private packages ([@BlueCutOfficial]) +- [ember-engines/ember-engines] [#873](https://github.com/ember-engines/ember-engines/pull/873) run npm init release-plan-setup@latest ([@mansona]) +- [mainmatter/ember-promise-modals] [#943](https://github.com/mainmatter/ember-promise-modals/pull/943) Remove version numbers on private packages ([@BlueCutOfficial]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@mansona]: https://github.com/mansona [@paoloricciuti]: https://github.com/paoloricciuti [ember-engines/ember-engines]: https://github.com/ember-engines/ember-engines -[embroider-build/create-release-plan-setup]: - https://github.com/embroider-build/create-release-plan-setup +[embroider-build/create-release-plan-setup]: https://github.com/embroider-build/create-release-plan-setup [embroider-build/embroider]: https://github.com/embroider-build/embroider -[mainmatter/ember-promise-modals]: - https://github.com/mainmatter/ember-promise-modals -[mainmatter/svelte-concurrency]: - https://github.com/mainmatter/svelte-concurrency +[mainmatter/ember-promise-modals]: https://github.com/mainmatter/ember-promise-modals +[mainmatter/svelte-concurrency]: https://github.com/mainmatter/svelte-concurrency diff --git a/src/twios/2024-04-14.md b/src/twios/2024-04-14.md index a5e600edf4..4caff80087 100644 --- a/src/twios/2024-04-14.md +++ b/src/twios/2024-04-14.md @@ -1,64 +1,33 @@ ## Rust -- [marcoow/pacesetter] [#45](https://github.com/marcoow/pacesetter/pull/45) add - API docs for pacesetter itself ([@marcoow]) +- [marcoow/pacesetter] [#45](https://github.com/marcoow/pacesetter/pull/45) add API docs for pacesetter itself ([@marcoow]) ## Svelte -- [mainmatter/svelte-promise-modals] - [#84](https://github.com/mainmatter/svelte-promise-modals/pull/84) Add - component import to example ([@zeppelin]) -- [mainmatter/svelte-promise-modals] - [#83](https://github.com/mainmatter/svelte-promise-modals/pull/83) Fix type - import path in README ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#84](https://github.com/mainmatter/svelte-promise-modals/pull/84) Add component import to example ([@zeppelin]) +- [mainmatter/svelte-promise-modals] [#83](https://github.com/mainmatter/svelte-promise-modals/pull/83) Fix type import path in README ([@zeppelin]) ## Embroider -- [embroider-build/embroider] - [#1874](https://github.com/embroider-build/embroider/pull/1874) with namespace - in publicAssets don't include path ([@mansona]) -- [embroider-build/embroider] - [#1872](https://github.com/embroider-build/embroider/pull/1872) Merge stable - ([@mansona]) -- [embroider-build/embroider] - [#1871](https://github.com/embroider-build/embroider/pull/1871) fix - release-plan unlabelled changes PR ([@mansona]) -- [embroider-build/embroider] - [#1869](https://github.com/embroider-build/embroider/pull/1869) update release - plan ([@mansona]) -- [embroider-build/embroider] - [#1867](https://github.com/embroider-build/embroider/pull/1867) add a - namespace option for public-assets plugin ([@mansona]) -- [embroider-build/embroider] - [#1856](https://github.com/embroider-build/embroider/pull/1856) Compile Hbs - route templates correctly ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1811](https://github.com/embroider-build/embroider/pull/1811) Module - Resolver: Virtual test-support.css ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1805](https://github.com/embroider-build/embroider/pull/1805) Module - resolver: virtualize vendor.css ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1874](https://github.com/embroider-build/embroider/pull/1874) with namespace in publicAssets don't include path ([@mansona]) +- [embroider-build/embroider] [#1872](https://github.com/embroider-build/embroider/pull/1872) Merge stable ([@mansona]) +- [embroider-build/embroider] [#1871](https://github.com/embroider-build/embroider/pull/1871) fix release-plan unlabelled changes PR ([@mansona]) +- [embroider-build/embroider] [#1869](https://github.com/embroider-build/embroider/pull/1869) update release plan ([@mansona]) +- [embroider-build/embroider] [#1867](https://github.com/embroider-build/embroider/pull/1867) add a namespace option for public-assets plugin ([@mansona]) +- [embroider-build/embroider] [#1856](https://github.com/embroider-build/embroider/pull/1856) Compile Hbs route templates correctly ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1811](https://github.com/embroider-build/embroider/pull/1811) Module Resolver: Virtual test-support.css ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1805](https://github.com/embroider-build/embroider/pull/1805) Module resolver: virtualize vendor.css ([@BlueCutOfficial]) ## JavaScript -- [shikijs/shiki-magic-move] - [#9](https://github.com/shikijs/shiki-magic-move/pull/9) fix: containerStyle - true blocks render promise from resolving ([@paoloricciuti]) -- [stefanpenner/node-fixturify-project] - [#89](https://github.com/stefanpenner/node-fixturify-project/pull/89) swap to - pnpm ([@mansona]) +- [shikijs/shiki-magic-move] [#9](https://github.com/shikijs/shiki-magic-move/pull/9) fix: containerStyle true blocks render promise from resolving ([@paoloricciuti]) +- [stefanpenner/node-fixturify-project] [#89](https://github.com/stefanpenner/node-fixturify-project/pull/89) swap to pnpm ([@mansona]) ## Ember -- [cibernox/ember-power-calendar] - [#466](https://github.com/cibernox/ember-power-calendar/pull/466) Fix use of - dataset API in findCalendarGuid test-helper ([@nickschot]) -- [ember-learn/guides-source] - [#1998](https://github.com/ember-learn/guides-source/pull/1998) update all - `ember server` to `npm start` ([@mansona]) -- [mainmatter/qunit-dom] - [#2100](https://github.com/mainmatter/qunit-dom/pull/2100) chore(deps): bump - release-it-changelog to 6.1.0 ([@BobrImperator]) +- [cibernox/ember-power-calendar] [#466](https://github.com/cibernox/ember-power-calendar/pull/466) Fix use of dataset API in findCalendarGuid test-helper ([@nickschot]) +- [ember-learn/guides-source] [#1998](https://github.com/ember-learn/guides-source/pull/1998) update all `ember server` to `npm start` ([@mansona]) +- [mainmatter/qunit-dom] [#2100](https://github.com/mainmatter/qunit-dom/pull/2100) chore(deps): bump release-it-changelog to 6.1.0 ([@BobrImperator]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@BobrImperator]: https://github.com/BobrImperator @@ -67,14 +36,11 @@ [@nickschot]: https://github.com/nickschot [@paoloricciuti]: https://github.com/paoloricciuti [@zeppelin]: https://github.com/zeppelin -[cibernox/ember-power-calendar]: - https://github.com/cibernox/ember-power-calendar +[cibernox/ember-power-calendar]: https://github.com/cibernox/ember-power-calendar [ember-learn/guides-source]: https://github.com/ember-learn/guides-source [embroider-build/embroider]: https://github.com/embroider-build/embroider [mainmatter/qunit-dom]: https://github.com/mainmatter/qunit-dom -[mainmatter/svelte-promise-modals]: - https://github.com/mainmatter/svelte-promise-modals +[mainmatter/svelte-promise-modals]: https://github.com/mainmatter/svelte-promise-modals [marcoow/pacesetter]: https://github.com/marcoow/pacesetter [shikijs/shiki-magic-move]: https://github.com/shikijs/shiki-magic-move -[stefanpenner/node-fixturify-project]: - https://github.com/stefanpenner/node-fixturify-project +[stefanpenner/node-fixturify-project]: https://github.com/stefanpenner/node-fixturify-project diff --git a/src/twios/2024-04-21.md b/src/twios/2024-04-21.md index 6d45aabf21..861b7d73d0 100644 --- a/src/twios/2024-04-21.md +++ b/src/twios/2024-04-21.md @@ -1,72 +1,39 @@ ## Svelte -- [mainmatter/svelte-concurrency] - [#50](https://github.com/mainmatter/svelte-concurrency/pull/50) chore: fix - lockfile ([@paoloricciuti]) -- [mainmatter/svelte-concurrency] - [#46](https://github.com/mainmatter/svelte-concurrency/pull/46) chore: async - transform tests ([@paoloricciuti]) -- [sveltejs/svelte] [#11237](https://github.com/sveltejs/svelte/pull/11237) fix: - possible name clash in hoisted functions ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#50](https://github.com/mainmatter/svelte-concurrency/pull/50) chore: fix lockfile ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#46](https://github.com/mainmatter/svelte-concurrency/pull/46) chore: async transform tests ([@paoloricciuti]) +- [sveltejs/svelte] [#11237](https://github.com/sveltejs/svelte/pull/11237) fix: possible name clash in hoisted functions ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#1884](https://github.com/embroider-build/embroider/pull/1884) don't use - babel-plugin-module-resolver@5.0.1 ([@mansona]) -- [embroider-build/embroider] - [#1879](https://github.com/embroider-build/embroider/pull/1879) Delete vite - app from test scenarios ([@mansona]) -- [embroider-build/embroider] - [#1877](https://github.com/embroider-build/embroider/pull/1877) Command - Watcher ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1859](https://github.com/embroider-build/embroider/pull/1859) Public assets - handling/ clean up stage 2 ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1836](https://github.com/embroider-build/embroider/pull/1836) Replace - content-for using a Vite plugin ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1884](https://github.com/embroider-build/embroider/pull/1884) don't use babel-plugin-module-resolver@5.0.1 ([@mansona]) +- [embroider-build/embroider] [#1879](https://github.com/embroider-build/embroider/pull/1879) Delete vite app from test scenarios ([@mansona]) +- [embroider-build/embroider] [#1877](https://github.com/embroider-build/embroider/pull/1877) Command Watcher ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1859](https://github.com/embroider-build/embroider/pull/1859) Public assets handling/ clean up stage 2 ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1836](https://github.com/embroider-build/embroider/pull/1836) Replace content-for using a Vite plugin ([@BlueCutOfficial]) ## JavaScript -- [adopted-ember-addons/ember-drag-drop] - [#2](https://github.com/adopted-ember-addons/ember-drag-drop/pull/2) setup - release-plan ([@mansona]) -- [adopted-ember-addons/ember-drag-drop] - [#1](https://github.com/adopted-ember-addons/ember-drag-drop/pull/1) Convert - to a v2 addon and drop support for Ember < 3.16 ([@mansona]) -- [tleunen/babel-plugin-module-resolver] - [#446](https://github.com/tleunen/babel-plugin-module-resolver/pull/446) - revert breaking change of reselect dependency update ([@mansona]) +- [adopted-ember-addons/ember-drag-drop] [#2](https://github.com/adopted-ember-addons/ember-drag-drop/pull/2) setup release-plan ([@mansona]) +- [adopted-ember-addons/ember-drag-drop] [#1](https://github.com/adopted-ember-addons/ember-drag-drop/pull/1) Convert to a v2 addon and drop support for Ember < 3.16 ([@mansona]) +- [tleunen/babel-plugin-module-resolver] [#446](https://github.com/tleunen/babel-plugin-module-resolver/pull/446) revert breaking change of reselect dependency update ([@mansona]) ## Ember -- [ef4/decorator-transforms] - [#24](https://github.com/ef4/decorator-transforms/pull/24) add a prepare - script to make sure it builds ([@mansona]) -- [ef4/decorator-transforms] - [#22](https://github.com/ef4/decorator-transforms/pull/22) add release-plan - ([@mansona]) -- [ember-learn/ember-website] - [#1100](https://github.com/ember-learn/ember-website/pull/1100) use the - updated crowdstrike logo for the sponsors ([@mansona]) -- [ember-learn/ember-website] - [#1094](https://github.com/ember-learn/ember-website/pull/1094) add - crowdstrike to Embroider Initiative sponsors ([@mansona]) -- [ember-learn/handbook] [#75](https://github.com/ember-learn/handbook/pull/75) - Add section about the tutorial updates to the release docs ([@mansona]) +- [ef4/decorator-transforms] [#24](https://github.com/ef4/decorator-transforms/pull/24) add a prepare script to make sure it builds ([@mansona]) +- [ef4/decorator-transforms] [#22](https://github.com/ef4/decorator-transforms/pull/22) add release-plan ([@mansona]) +- [ember-learn/ember-website] [#1100](https://github.com/ember-learn/ember-website/pull/1100) use the updated crowdstrike logo for the sponsors ([@mansona]) +- [ember-learn/ember-website] [#1094](https://github.com/ember-learn/ember-website/pull/1094) add crowdstrike to Embroider Initiative sponsors ([@mansona]) +- [ember-learn/handbook] [#75](https://github.com/ember-learn/handbook/pull/75) Add section about the tutorial updates to the release docs ([@mansona]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@mansona]: https://github.com/mansona [@paoloricciuti]: https://github.com/paoloricciuti -[adopted-ember-addons/ember-drag-drop]: - https://github.com/adopted-ember-addons/ember-drag-drop +[adopted-ember-addons/ember-drag-drop]: https://github.com/adopted-ember-addons/ember-drag-drop [ef4/decorator-transforms]: https://github.com/ef4/decorator-transforms [ember-learn/ember-website]: https://github.com/ember-learn/ember-website [ember-learn/handbook]: https://github.com/ember-learn/handbook [embroider-build/embroider]: https://github.com/embroider-build/embroider -[mainmatter/svelte-concurrency]: - https://github.com/mainmatter/svelte-concurrency +[mainmatter/svelte-concurrency]: https://github.com/mainmatter/svelte-concurrency [sveltejs/svelte]: https://github.com/sveltejs/svelte -[tleunen/babel-plugin-module-resolver]: - https://github.com/tleunen/babel-plugin-module-resolver +[tleunen/babel-plugin-module-resolver]: https://github.com/tleunen/babel-plugin-module-resolver diff --git a/src/twios/2024-04-28.md b/src/twios/2024-04-28.md index 0efd1207b1..7b7f3b41d1 100644 --- a/src/twios/2024-04-28.md +++ b/src/twios/2024-04-28.md @@ -1,35 +1,22 @@ ## Rust -- [mainmatter/cargo-autoinherit] - [#19](https://github.com/mainmatter/cargo-autoinherit/pull/19) add MM Rust - info ([@marcoow]) -- [marcoow/pacesetter] [#47](https://github.com/marcoow/pacesetter/pull/47) Fix - cli and config crate tests ([@marcoow]) -- [marcoow/pacesetter] [#46](https://github.com/marcoow/pacesetter/pull/46) - Fixes ([@marcoow]) +- [mainmatter/cargo-autoinherit] [#19](https://github.com/mainmatter/cargo-autoinherit/pull/19) add MM Rust info ([@marcoow]) +- [marcoow/pacesetter] [#47](https://github.com/marcoow/pacesetter/pull/47) Fix cli and config crate tests ([@marcoow]) +- [marcoow/pacesetter] [#46](https://github.com/marcoow/pacesetter/pull/46) Fixes ([@marcoow]) ## Svelte -- [sveltejs/svelte] [#11344](https://github.com/sveltejs/svelte/pull/11344) fix: - hr, script and template as valid select children ([@paoloricciuti]) +- [sveltejs/svelte] [#11344](https://github.com/sveltejs/svelte/pull/11344) fix: hr, script and template as valid select children ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#1886](https://github.com/embroider-build/embroider/pull/1886) Merge stable - into main ([@mansona]) -- [embroider-build/embroider] - [#1890](https://github.com/embroider-build/embroider/pull/1890) Add more tests - virtual files ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1801](https://github.com/embroider-build/embroider/pull/1801) Module - resolver: virtualize vendor.js ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1886](https://github.com/embroider-build/embroider/pull/1886) Merge stable into main ([@mansona]) +- [embroider-build/embroider] [#1890](https://github.com/embroider-build/embroider/pull/1890) Add more tests virtual files ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1801](https://github.com/embroider-build/embroider/pull/1801) Module resolver: virtualize vendor.js ([@BlueCutOfficial]) ## Ember -- [mainmatter/qunit-dom] - [#2105](https://github.com/mainmatter/qunit-dom/pull/2105) fix(hasStyle): - allow using camelCase properties inside assertion object ([@BobrImperator]) +- [mainmatter/qunit-dom] [#2105](https://github.com/mainmatter/qunit-dom/pull/2105) fix(hasStyle): allow using camelCase properties inside assertion object ([@BobrImperator]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@BobrImperator]: https://github.com/BobrImperator diff --git a/src/twios/2024-05-12.md b/src/twios/2024-05-12.md index c6fd962d6c..8f5c35638b 100644 --- a/src/twios/2024-05-12.md +++ b/src/twios/2024-05-12.md @@ -1,67 +1,40 @@ ## Svelte -- [mainmatter/svelte-concurrency] - [#68](https://github.com/mainmatter/svelte-concurrency/pull/68) chore: use - pnpm 9 in workflows ([@paoloricciuti]) -- [mainmatter/svelte-concurrency] - [#66](https://github.com/mainmatter/svelte-concurrency/pull/66) feat: more - exhaustive async transform ([@paoloricciuti]) -- [mainmatter/svelte-concurrency] - [#62](https://github.com/mainmatter/svelte-concurrency/pull/62) chore: add - svelte exports to avoid warning ([@paoloricciuti]) -- [mainmatter/svelte-concurrency] - [#61](https://github.com/mainmatter/svelte-concurrency/pull/61) feat: link - only cancel the instance of the task that was linked ([@paoloricciuti]) -- [sveltejs/svelte] [#11506](https://github.com/sveltejs/svelte/pull/11506) fix: - increment and decrement edge case ([@paoloricciuti]) -- [sveltejs/svelte] [#11487](https://github.com/sveltejs/svelte/pull/11487) fix: - allow to access private fields after `this` reassignment ([@paoloricciuti]) -- [sveltejs/svelte] [#11465](https://github.com/sveltejs/svelte/pull/11465) fix: - restore value after attribute removal during hydration ([@paoloricciuti]) -- [sveltejs/svelte] [#11463](https://github.com/sveltejs/svelte/pull/11463) fix: - use snippet as parent element of snippets childrens in validator - ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#68](https://github.com/mainmatter/svelte-concurrency/pull/68) chore: use pnpm 9 in workflows ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#66](https://github.com/mainmatter/svelte-concurrency/pull/66) feat: more exhaustive async transform ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#62](https://github.com/mainmatter/svelte-concurrency/pull/62) chore: add svelte exports to avoid warning ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#61](https://github.com/mainmatter/svelte-concurrency/pull/61) feat: link only cancel the instance of the task that was linked ([@paoloricciuti]) +- [sveltejs/svelte] [#11506](https://github.com/sveltejs/svelte/pull/11506) fix: increment and decrement edge case ([@paoloricciuti]) +- [sveltejs/svelte] [#11487](https://github.com/sveltejs/svelte/pull/11487) fix: allow to access private fields after `this` reassignment ([@paoloricciuti]) +- [sveltejs/svelte] [#11465](https://github.com/sveltejs/svelte/pull/11465) fix: restore value after attribute removal during hydration ([@paoloricciuti]) +- [sveltejs/svelte] [#11463](https://github.com/sveltejs/svelte/pull/11463) fix: use snippet as parent element of snippets childrens in validator ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#1912](https://github.com/embroider-build/embroider/pull/1912) update all - github actions to remove warnings about node version ([@mansona]) -- [embroider-build/embroider] - [#1911](https://github.com/embroider-build/embroider/pull/1911) Fix CI because - of recent babel-plugin-template-compiler update ([@mansona]) +- [embroider-build/embroider] [#1912](https://github.com/embroider-build/embroider/pull/1912) update all github actions to remove warnings about node version ([@mansona]) +- [embroider-build/embroider] [#1911](https://github.com/embroider-build/embroider/pull/1911) Fix CI because of recent babel-plugin-template-compiler update ([@mansona]) ## JavaScript -- [shikijs/shiki-magic-move] - [#14](https://github.com/shikijs/shiki-magic-move/pull/14) fix: svelte types - generation during build ([@paoloricciuti]) -- [stefanpenner/node-fixturify-project] - [#88](https://github.com/stefanpenner/node-fixturify-project/pull/88) fix - prettier check script ([@mansona]) +- [shikijs/shiki-magic-move] [#14](https://github.com/shikijs/shiki-magic-move/pull/14) fix: svelte types generation during build ([@paoloricciuti]) +- [stefanpenner/node-fixturify-project] [#88](https://github.com/stefanpenner/node-fixturify-project/pull/88) fix prettier check script ([@mansona]) ## Octokit -- [octokit/auth-app.js] [#606](https://github.com/octokit/auth-app.js/pull/606) - feat: `appId` argument can be set to Client ID string ([@oscard0m]) +- [octokit/auth-app.js] [#606](https://github.com/octokit/auth-app.js/pull/606) feat: `appId` argument can be set to Client ID string ([@oscard0m]) ## Ember -- [DazzlingFugu/ember-fr-guides-source] - [#242](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/242) - Translate guides/tutorial/part-2/ember-data.md ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#242](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/242) Translate guides/tutorial/part-2/ember-data.md ([@BlueCutOfficial]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@mansona]: https://github.com/mansona [@oscard0m]: https://github.com/oscard0m [@paoloricciuti]: https://github.com/paoloricciuti -[DazzlingFugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source +[DazzlingFugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source [embroider-build/embroider]: https://github.com/embroider-build/embroider -[mainmatter/svelte-concurrency]: - https://github.com/mainmatter/svelte-concurrency +[mainmatter/svelte-concurrency]: https://github.com/mainmatter/svelte-concurrency [octokit/auth-app.js]: https://github.com/octokit/auth-app.js [shikijs/shiki-magic-move]: https://github.com/shikijs/shiki-magic-move -[stefanpenner/node-fixturify-project]: - https://github.com/stefanpenner/node-fixturify-project +[stefanpenner/node-fixturify-project]: https://github.com/stefanpenner/node-fixturify-project [sveltejs/svelte]: https://github.com/sveltejs/svelte diff --git a/src/twios/2024-05-19.md b/src/twios/2024-05-19.md index 67cbd81ec2..f57757bb15 100644 --- a/src/twios/2024-05-19.md +++ b/src/twios/2024-05-19.md @@ -1,117 +1,58 @@ ## Svelte -- [bmdavis419/sveltekit-pgvector-supabase] - [#1](https://github.com/bmdavis419/sveltekit-pgvector-supabase/pull/1) fix: - autosubmit search ([@paoloricciuti]) -- [mainmatter/svelte-concurrency] - [#76](https://github.com/mainmatter/svelte-concurrency/pull/76) feat: setup - starlight for documentation ([@paoloricciuti]) -- [mainmatter/svelte-concurrency] - [#72](https://github.com/mainmatter/svelte-concurrency/pull/72) chore: upgrade - eslint to v9 and flat config ([@paoloricciuti]) -- [mainmatter/svelte-concurrency] - [#67](https://github.com/mainmatter/svelte-concurrency/pull/67) chore: test - for errors thrown in perform ([@paoloricciuti]) -- [sveltejs/language-tools] - [#2372](https://github.com/sveltejs/language-tools/pull/2372) feat: allow `as` - expressions for bindable props ([@paoloricciuti]) -- [sveltejs/language-tools] - [#2366](https://github.com/sveltejs/language-tools/pull/2366) fix: allow for - whitespace in snippets declaration ([@paoloricciuti]) -- [sveltejs/svelte] [#11631](https://github.com/sveltejs/svelte/pull/11631) - feat: error when snippet shadow a prop ([@paoloricciuti]) -- [sveltejs/svelte] [#11578](https://github.com/sveltejs/svelte/pull/11578) fix: - allow for non optional chain call expression in render ([@paoloricciuti]) +- [bmdavis419/sveltekit-pgvector-supabase] [#1](https://github.com/bmdavis419/sveltekit-pgvector-supabase/pull/1) fix: autosubmit search ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#76](https://github.com/mainmatter/svelte-concurrency/pull/76) feat: setup starlight for documentation ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#72](https://github.com/mainmatter/svelte-concurrency/pull/72) chore: upgrade eslint to v9 and flat config ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#67](https://github.com/mainmatter/svelte-concurrency/pull/67) chore: test for errors thrown in perform ([@paoloricciuti]) +- [sveltejs/language-tools] [#2372](https://github.com/sveltejs/language-tools/pull/2372) feat: allow `as` expressions for bindable props ([@paoloricciuti]) +- [sveltejs/language-tools] [#2366](https://github.com/sveltejs/language-tools/pull/2366) fix: allow for whitespace in snippets declaration ([@paoloricciuti]) +- [sveltejs/svelte] [#11631](https://github.com/sveltejs/svelte/pull/11631) feat: error when snippet shadow a prop ([@paoloricciuti]) +- [sveltejs/svelte] [#11578](https://github.com/sveltejs/svelte/pull/11578) fix: allow for non optional chain call expression in render ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#1927](https://github.com/embroider-build/embroider/pull/1927) simplify - virtual entrypoint ([@mansona]) -- [embroider-build/embroider] - [#1924](https://github.com/embroider-build/embroider/pull/1924) virtualise - test entrypoint ([@mansona]) -- [embroider-build/embroider] - [#1917](https://github.com/embroider-build/embroider/pull/1917) Merge stable - into main ([@mansona]) -- [embroider-build/embroider] - [#1913](https://github.com/embroider-build/embroider/pull/1913) virtualise - engine styles with their vendor styles ([@mansona]) -- [embroider-build/embroider] - [#1779](https://github.com/embroider-build/embroider/pull/1779) Virtual entry - point ([@mansona]) -- [embroider-build/embroider] - [#1922](https://github.com/embroider-build/embroider/pull/1922) New - `index.html` format - entrypoint ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1921](https://github.com/embroider-build/embroider/pull/1921) New - `index.html` format - `test-support.css`, `vendor.css` ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1920](https://github.com/embroider-build/embroider/pull/1920) New - `index.html` format - `test-support.js` ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1918](https://github.com/embroider-build/embroider/pull/1918) New index.html - format - vendor js ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1927](https://github.com/embroider-build/embroider/pull/1927) simplify virtual entrypoint ([@mansona]) +- [embroider-build/embroider] [#1924](https://github.com/embroider-build/embroider/pull/1924) virtualise test entrypoint ([@mansona]) +- [embroider-build/embroider] [#1917](https://github.com/embroider-build/embroider/pull/1917) Merge stable into main ([@mansona]) +- [embroider-build/embroider] [#1913](https://github.com/embroider-build/embroider/pull/1913) virtualise engine styles with their vendor styles ([@mansona]) +- [embroider-build/embroider] [#1779](https://github.com/embroider-build/embroider/pull/1779) Virtual entry point ([@mansona]) +- [embroider-build/embroider] [#1922](https://github.com/embroider-build/embroider/pull/1922) New `index.html` format - entrypoint ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1921](https://github.com/embroider-build/embroider/pull/1921) New `index.html` format - `test-support.css`, `vendor.css` ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1920](https://github.com/embroider-build/embroider/pull/1920) New `index.html` format - `test-support.js` ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1918](https://github.com/embroider-build/embroider/pull/1918) New index.html format - vendor js ([@BlueCutOfficial]) ## JavaScript -- [mansona/lttf-dashboard] - [#8](https://github.com/mansona/lttf-dashboard/pull/8) Fix multiline bash - command ([@Mikek2252]) -- [mansona/lttf-dashboard] - [#7](https://github.com/mansona/lttf-dashboard/pull/7) Add check for package - manager ([@Mikek2252]) -- [stefanpenner/node-fixturify-project] - [#97](https://github.com/stefanpenner/node-fixturify-project/pull/97) don't - error about missing optional peer deps ([@mansona]) +- [mansona/lttf-dashboard] [#8](https://github.com/mansona/lttf-dashboard/pull/8) Fix multiline bash command ([@Mikek2252]) +- [mansona/lttf-dashboard] [#7](https://github.com/mansona/lttf-dashboard/pull/7) Add check for package manager ([@Mikek2252]) +- [stefanpenner/node-fixturify-project] [#97](https://github.com/stefanpenner/node-fixturify-project/pull/97) don't error about missing optional peer deps ([@mansona]) ## Octokit -- [octokit/auth-app.js] [#609](https://github.com/octokit/auth-app.js/pull/609) - ci(release): use `semantic-release@latest` instead of `beta` ([@oscard0m]) +- [octokit/auth-app.js] [#609](https://github.com/octokit/auth-app.js/pull/609) ci(release): use `semantic-release@latest` instead of `beta` ([@oscard0m]) ## Ember -- [adopted-ember-addons/ember-infinity] - [#484](https://github.com/adopted-ember-addons/ember-infinity/pull/484) swap - override for patched package ([@mansona]) -- [adopted-ember-addons/ember-infinity] - [#483](https://github.com/adopted-ember-addons/ember-infinity/pull/483) fix - issue with github-changelog ([@mansona]) -- [adopted-ember-addons/ember-infinity] - [#482](https://github.com/adopted-ember-addons/ember-infinity/pull/482) turn - on mirage for production deploy of demo app ([@mansona]) -- [adopted-ember-addons/ember-infinity] - [#481](https://github.com/adopted-ember-addons/ember-infinity/pull/481) fix - root-url for github pages ([@mansona]) -- [adopted-ember-addons/ember-infinity] - [#479](https://github.com/adopted-ember-addons/ember-infinity/pull/479) fix - pnpm version for release-plan ([@mansona]) -- [adopted-ember-addons/ember-infinity] - [#478](https://github.com/adopted-ember-addons/ember-infinity/pull/478) add an - action to release demo site ([@mansona]) -- [adopted-ember-addons/ember-infinity] - [#476](https://github.com/adopted-ember-addons/ember-infinity/pull/476) setup - release-plan ([@mansona]) -- [adopted-ember-addons/ember-infinity] - [#475](https://github.com/adopted-ember-addons/ember-infinity/pull/475) remove - engine reference for Node 18 ([@mansona]) +- [adopted-ember-addons/ember-infinity] [#484](https://github.com/adopted-ember-addons/ember-infinity/pull/484) swap override for patched package ([@mansona]) +- [adopted-ember-addons/ember-infinity] [#483](https://github.com/adopted-ember-addons/ember-infinity/pull/483) fix issue with github-changelog ([@mansona]) +- [adopted-ember-addons/ember-infinity] [#482](https://github.com/adopted-ember-addons/ember-infinity/pull/482) turn on mirage for production deploy of demo app ([@mansona]) +- [adopted-ember-addons/ember-infinity] [#481](https://github.com/adopted-ember-addons/ember-infinity/pull/481) fix root-url for github pages ([@mansona]) +- [adopted-ember-addons/ember-infinity] [#479](https://github.com/adopted-ember-addons/ember-infinity/pull/479) fix pnpm version for release-plan ([@mansona]) +- [adopted-ember-addons/ember-infinity] [#478](https://github.com/adopted-ember-addons/ember-infinity/pull/478) add an action to release demo site ([@mansona]) +- [adopted-ember-addons/ember-infinity] [#476](https://github.com/adopted-ember-addons/ember-infinity/pull/476) setup release-plan ([@mansona]) +- [adopted-ember-addons/ember-infinity] [#475](https://github.com/adopted-ember-addons/ember-infinity/pull/475) remove engine reference for Node 18 ([@mansona]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@Mikek2252]: https://github.com/Mikek2252 [@mansona]: https://github.com/mansona [@oscard0m]: https://github.com/oscard0m [@paoloricciuti]: https://github.com/paoloricciuti -[adopted-ember-addons/ember-infinity]: - https://github.com/adopted-ember-addons/ember-infinity -[bmdavis419/sveltekit-pgvector-supabase]: - https://github.com/bmdavis419/sveltekit-pgvector-supabase +[adopted-ember-addons/ember-infinity]: https://github.com/adopted-ember-addons/ember-infinity +[bmdavis419/sveltekit-pgvector-supabase]: https://github.com/bmdavis419/sveltekit-pgvector-supabase [embroider-build/embroider]: https://github.com/embroider-build/embroider -[mainmatter/svelte-concurrency]: - https://github.com/mainmatter/svelte-concurrency +[mainmatter/svelte-concurrency]: https://github.com/mainmatter/svelte-concurrency [mansona/lttf-dashboard]: https://github.com/mansona/lttf-dashboard [octokit/auth-app.js]: https://github.com/octokit/auth-app.js -[stefanpenner/node-fixturify-project]: - https://github.com/stefanpenner/node-fixturify-project +[stefanpenner/node-fixturify-project]: https://github.com/stefanpenner/node-fixturify-project [sveltejs/language-tools]: https://github.com/sveltejs/language-tools [sveltejs/svelte]: https://github.com/sveltejs/svelte diff --git a/src/twios/2024-05-26.md b/src/twios/2024-05-26.md index b06e36df1b..3256b2c89f 100644 --- a/src/twios/2024-05-26.md +++ b/src/twios/2024-05-26.md @@ -1,117 +1,52 @@ ## Svelte -- [mainmatter/svelte-concurrency] - [#88](https://github.com/mainmatter/svelte-concurrency/pull/88) feat: add - performCount to derived state ([@paoloricciuti]) -- [oscard0m/test-sveltekit] - [#52](https://github.com/oscard0m/test-sveltekit/pull/52) Update README.md - ([@oscard0m]) -- [oscard0m/test-sveltekit] - [#53](https://github.com/oscard0m/test-sveltekit/pull/53) Update README.md - ([@oscard0m]) -- [oscard0m/test-sveltekit] - [#50](https://github.com/oscard0m/test-sveltekit/pull/50) Update README.md - ([@oscard0m]) -- [oscard0m/test-sveltekit] - [#51](https://github.com/oscard0m/test-sveltekit/pull/51) Update README.md - ([@oscard0m]) -- [oscard0m/test-sveltekit] - [#49](https://github.com/oscard0m/test-sveltekit/pull/49) Update README.md - ([@oscard0m]) -- [oscard0m/test-sveltekit] - [#45](https://github.com/oscard0m/test-sveltekit/pull/45) add newline - ([@oscard0m]) -- [sveltejs/language-tools] - [#2379](https://github.com/sveltejs/language-tools/pull/2379) fix: use correct - semantic tokens for `$props` types ([@paoloricciuti]) -- [sveltejs/svelte] [#11768](https://github.com/sveltejs/svelte/pull/11768) fix: - allow runelike writable as prop ([@paoloricciuti]) -- [sveltejs/svelte] [#11766](https://github.com/sveltejs/svelte/pull/11766) fix: - `array.lastIndexOf` without second argument ([@paoloricciuti]) -- [sveltejs/svelte] [#11755](https://github.com/sveltejs/svelte/pull/11755) fix: - use svg methods for updating svg attributes too ([@paoloricciuti]) -- [sveltejs/svelte] [#11737](https://github.com/sveltejs/svelte/pull/11737) fix: - don't warn on link without href if aria-disabled ([@paoloricciuti]) -- [sveltejs/svelte] [#11736](https://github.com/sveltejs/svelte/pull/11736) fix: - throw on invalid attribute expressions ([@paoloricciuti]) -- [sveltejs/svelte] [#11723](https://github.com/sveltejs/svelte/pull/11723) fix: - allow comments after last selector in css ([@paoloricciuti]) -- [sveltejs/svelte] [#11720](https://github.com/sveltejs/svelte/pull/11720) fix: - update value like attributes in a separate template_effect ([@paoloricciuti]) -- [sveltejs/svelte] [#11704](https://github.com/sveltejs/svelte/pull/11704) fix: - migrate derivations without semicolons ([@paoloricciuti]) -- [sveltejs/svelte] [#11676](https://github.com/sveltejs/svelte/pull/11676) fix: - check for invalid bindings on window and document ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#88](https://github.com/mainmatter/svelte-concurrency/pull/88) feat: add performCount to derived state ([@paoloricciuti]) +- [oscard0m/test-sveltekit] [#52](https://github.com/oscard0m/test-sveltekit/pull/52) Update README.md ([@oscard0m]) +- [oscard0m/test-sveltekit] [#53](https://github.com/oscard0m/test-sveltekit/pull/53) Update README.md ([@oscard0m]) +- [oscard0m/test-sveltekit] [#50](https://github.com/oscard0m/test-sveltekit/pull/50) Update README.md ([@oscard0m]) +- [oscard0m/test-sveltekit] [#51](https://github.com/oscard0m/test-sveltekit/pull/51) Update README.md ([@oscard0m]) +- [oscard0m/test-sveltekit] [#49](https://github.com/oscard0m/test-sveltekit/pull/49) Update README.md ([@oscard0m]) +- [oscard0m/test-sveltekit] [#45](https://github.com/oscard0m/test-sveltekit/pull/45) add newline ([@oscard0m]) +- [sveltejs/language-tools] [#2379](https://github.com/sveltejs/language-tools/pull/2379) fix: use correct semantic tokens for `$props` types ([@paoloricciuti]) +- [sveltejs/svelte] [#11768](https://github.com/sveltejs/svelte/pull/11768) fix: allow runelike writable as prop ([@paoloricciuti]) +- [sveltejs/svelte] [#11766](https://github.com/sveltejs/svelte/pull/11766) fix: `array.lastIndexOf` without second argument ([@paoloricciuti]) +- [sveltejs/svelte] [#11755](https://github.com/sveltejs/svelte/pull/11755) fix: use svg methods for updating svg attributes too ([@paoloricciuti]) +- [sveltejs/svelte] [#11737](https://github.com/sveltejs/svelte/pull/11737) fix: don't warn on link without href if aria-disabled ([@paoloricciuti]) +- [sveltejs/svelte] [#11736](https://github.com/sveltejs/svelte/pull/11736) fix: throw on invalid attribute expressions ([@paoloricciuti]) +- [sveltejs/svelte] [#11723](https://github.com/sveltejs/svelte/pull/11723) fix: allow comments after last selector in css ([@paoloricciuti]) +- [sveltejs/svelte] [#11720](https://github.com/sveltejs/svelte/pull/11720) fix: update value like attributes in a separate template_effect ([@paoloricciuti]) +- [sveltejs/svelte] [#11704](https://github.com/sveltejs/svelte/pull/11704) fix: migrate derivations without semicolons ([@paoloricciuti]) +- [sveltejs/svelte] [#11676](https://github.com/sveltejs/svelte/pull/11676) fix: check for invalid bindings on window and document ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#1943](https://github.com/embroider-build/embroider/pull/1943) Merge stable - into main ([@mansona]) -- [embroider-build/embroider] - [#1940](https://github.com/embroider-build/embroider/pull/1940) only register - v2 addons with parent addons ([@mansona]) -- [embroider-build/embroider] - [#1938](https://github.com/embroider-build/embroider/pull/1938) remove v\* - prefix GitHub Actions builds ([@mansona]) -- [embroider-build/embroider] - [#1937](https://github.com/embroider-build/embroider/pull/1937) only register - v2 addons with parent addons ([@mansona]) -- [embroider-build/embroider] - [#1939](https://github.com/embroider-build/embroider/pull/1939) Output - `_babel_filter_.js` in the `.embroider` folder ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1935](https://github.com/embroider-build/embroider/pull/1935) output - macros-config.json and _babel_config_ in the .embroider folder - ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1933](https://github.com/embroider-build/embroider/pull/1933) Clean up - compat app builder ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1926](https://github.com/embroider-build/embroider/pull/1926) New - `index.html`- format test-entrypoint ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1925](https://github.com/embroider-build/embroider/pull/1925) New - `index.html` format - app css ([@BlueCutOfficial]) -- [embroider-build/github-changelog] - [#23](https://github.com/embroider-build/github-changelog/pull/23) only - process commits on the current branch ([@mansona]) -- [embroider-build/app-blueprint] - [#15](https://github.com/embroider-build/app-blueprint/pull/15) schedule CI to - run once a day ([@mansona]) -- [embroider-build/app-blueprint] - [#14](https://github.com/embroider-build/app-blueprint/pull/14) add a - dependabot config to keep ember-cli up to date ([@mansona]) -- [embroider-build/app-blueprint] - [#10](https://github.com/embroider-build/app-blueprint/pull/10) add a basic - smoke test ([@mansona]) -- [embroider-build/app-blueprint] - [#9](https://github.com/embroider-build/app-blueprint/pull/9) make sure - ember-cli-update config is correct ([@mansona]) -- [embroider-build/app-blueprint] - [#7](https://github.com/embroider-build/app-blueprint/pull/7) Add prettier - ([@mansona]) -- [embroider-build/app-blueprint] - [#4](https://github.com/embroider-build/app-blueprint/pull/4) add - ember-blueprint to keywords ([@mansona]) -- [embroider-build/app-blueprint] - [#2](https://github.com/embroider-build/app-blueprint/pull/2) setup - release-plan ([@mansona]) -- [embroider-build/app-blueprint] - [#1](https://github.com/embroider-build/app-blueprint/pull/1) Initial working - version ([@mansona]) +- [embroider-build/embroider] [#1943](https://github.com/embroider-build/embroider/pull/1943) Merge stable into main ([@mansona]) +- [embroider-build/embroider] [#1940](https://github.com/embroider-build/embroider/pull/1940) only register v2 addons with parent addons ([@mansona]) +- [embroider-build/embroider] [#1938](https://github.com/embroider-build/embroider/pull/1938) remove v\* prefix GitHub Actions builds ([@mansona]) +- [embroider-build/embroider] [#1937](https://github.com/embroider-build/embroider/pull/1937) only register v2 addons with parent addons ([@mansona]) +- [embroider-build/embroider] [#1939](https://github.com/embroider-build/embroider/pull/1939) Output `_babel_filter_.js` in the `.embroider` folder ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1935](https://github.com/embroider-build/embroider/pull/1935) output macros-config.json and _babel_config_ in the .embroider folder ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1933](https://github.com/embroider-build/embroider/pull/1933) Clean up compat app builder ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1926](https://github.com/embroider-build/embroider/pull/1926) New `index.html`- format test-entrypoint ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1925](https://github.com/embroider-build/embroider/pull/1925) New `index.html` format - app css ([@BlueCutOfficial]) +- [embroider-build/github-changelog] [#23](https://github.com/embroider-build/github-changelog/pull/23) only process commits on the current branch ([@mansona]) +- [embroider-build/app-blueprint] [#15](https://github.com/embroider-build/app-blueprint/pull/15) schedule CI to run once a day ([@mansona]) +- [embroider-build/app-blueprint] [#14](https://github.com/embroider-build/app-blueprint/pull/14) add a dependabot config to keep ember-cli up to date ([@mansona]) +- [embroider-build/app-blueprint] [#10](https://github.com/embroider-build/app-blueprint/pull/10) add a basic smoke test ([@mansona]) +- [embroider-build/app-blueprint] [#9](https://github.com/embroider-build/app-blueprint/pull/9) make sure ember-cli-update config is correct ([@mansona]) +- [embroider-build/app-blueprint] [#7](https://github.com/embroider-build/app-blueprint/pull/7) Add prettier ([@mansona]) +- [embroider-build/app-blueprint] [#4](https://github.com/embroider-build/app-blueprint/pull/4) add ember-blueprint to keywords ([@mansona]) +- [embroider-build/app-blueprint] [#2](https://github.com/embroider-build/app-blueprint/pull/2) setup release-plan ([@mansona]) +- [embroider-build/app-blueprint] [#1](https://github.com/embroider-build/app-blueprint/pull/1) Initial working version ([@mansona]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@mansona]: https://github.com/mansona [@oscard0m]: https://github.com/oscard0m [@paoloricciuti]: https://github.com/paoloricciuti -[embroider-build/app-blueprint]: - https://github.com/embroider-build/app-blueprint +[embroider-build/app-blueprint]: https://github.com/embroider-build/app-blueprint [embroider-build/embroider]: https://github.com/embroider-build/embroider -[embroider-build/github-changelog]: - https://github.com/embroider-build/github-changelog -[mainmatter/svelte-concurrency]: - https://github.com/mainmatter/svelte-concurrency +[embroider-build/github-changelog]: https://github.com/embroider-build/github-changelog +[mainmatter/svelte-concurrency]: https://github.com/mainmatter/svelte-concurrency [oscard0m/test-sveltekit]: https://github.com/oscard0m/test-sveltekit [sveltejs/language-tools]: https://github.com/sveltejs/language-tools [sveltejs/svelte]: https://github.com/sveltejs/svelte diff --git a/src/twios/2024-06-02.md b/src/twios/2024-06-02.md index 118af53c41..cc4461a2c8 100644 --- a/src/twios/2024-06-02.md +++ b/src/twios/2024-06-02.md @@ -1,74 +1,36 @@ ## Svelte -- [mainmatter/svelte-concurrency] - [#92](https://github.com/mainmatter/svelte-concurrency/pull/92) breaking: add - instance id and derive is loading ([@paoloricciuti]) -- [mainmatter/svelte-concurrency] - [#89](https://github.com/mainmatter/svelte-concurrency/pull/89) feat: abstract - task logic to core ([@paoloricciuti]) -- [svecosystem/runed] [#63](https://github.com/svecosystem/runed/pull/63) feat: - add MediaQuery utility ([@paoloricciuti]) -- [sveltejs/svelte] [#11849](https://github.com/sveltejs/svelte/pull/11849) fix: - reevaluate namespace in slots ([@paoloricciuti]) -- [sveltejs/svelte] [#11835](https://github.com/sveltejs/svelte/pull/11835) fix: - `$state.is` missing second argument on the server ([@paoloricciuti]) -- [sveltejs/svelte] [#11833](https://github.com/sveltejs/svelte/pull/11833) fix: - allow for more svelte-ignore to work ([@paoloricciuti]) -- [sveltejs/svelte] [#11815](https://github.com/sveltejs/svelte/pull/11815) fix: - coherent infinite loop guard ([@paoloricciuti]) -- [sveltejs/svelte] [#11784](https://github.com/sveltejs/svelte/pull/11784) fix: - allow global next to `&` for nesting ([@paoloricciuti]) -- [sveltejs/svelte] [#11637](https://github.com/sveltejs/svelte/pull/11637) - chore: upgrade pnpm to version 9 ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#92](https://github.com/mainmatter/svelte-concurrency/pull/92) breaking: add instance id and derive is loading ([@paoloricciuti]) +- [mainmatter/svelte-concurrency] [#89](https://github.com/mainmatter/svelte-concurrency/pull/89) feat: abstract task logic to core ([@paoloricciuti]) +- [svecosystem/runed] [#63](https://github.com/svecosystem/runed/pull/63) feat: add MediaQuery utility ([@paoloricciuti]) +- [sveltejs/svelte] [#11849](https://github.com/sveltejs/svelte/pull/11849) fix: reevaluate namespace in slots ([@paoloricciuti]) +- [sveltejs/svelte] [#11835](https://github.com/sveltejs/svelte/pull/11835) fix: `$state.is` missing second argument on the server ([@paoloricciuti]) +- [sveltejs/svelte] [#11833](https://github.com/sveltejs/svelte/pull/11833) fix: allow for more svelte-ignore to work ([@paoloricciuti]) +- [sveltejs/svelte] [#11815](https://github.com/sveltejs/svelte/pull/11815) fix: coherent infinite loop guard ([@paoloricciuti]) +- [sveltejs/svelte] [#11784](https://github.com/sveltejs/svelte/pull/11784) fix: allow global next to `&` for nesting ([@paoloricciuti]) +- [sveltejs/svelte] [#11637](https://github.com/sveltejs/svelte/pull/11637) chore: upgrade pnpm to version 9 ([@paoloricciuti]) ## Embroider -- [embroider-build/app-blueprint] - [#18](https://github.com/embroider-build/app-blueprint/pull/18) add new config - structure ([@mansona]) -- [embroider-build/app-blueprint] - [#17](https://github.com/embroider-build/app-blueprint/pull/17) Add smoke - tests and fix the app-name.css link in index.html ([@mansona]) -- [embroider-build/app-blueprint] - [#15](https://github.com/embroider-build/app-blueprint/pull/15) schedule CI to - run once a day ([@mansona]) -- [embroider-build/app-blueprint] - [#14](https://github.com/embroider-build/app-blueprint/pull/14) add a - dependabot config to keep ember-cli up to date ([@mansona]) -- [embroider-build/ember-auto-import] - [#626](https://github.com/embroider-build/ember-auto-import/pull/626) setup - windows tests ([@mansona]) -- [embroider-build/ember-auto-import] - [#625](https://github.com/embroider-build/ember-auto-import/pull/625) update - release-plan ([@mansona]) -- [embroider-build/ember-auto-import] - [#622](https://github.com/embroider-build/ember-auto-import/pull/622) fix glob - version on lts tests ([@mansona]) -- [embroider-build/ember-auto-import] - [#620](https://github.com/embroider-build/ember-auto-import/pull/620) Improved - layering between app and tests bundles ([@mansona]) -- [embroider-build/embroider] - [#1954](https://github.com/embroider-build/embroider/pull/1954) reset version - of config-meta-loader to 0.0.0 ([@mansona]) -- [embroider-build/embroider] - [#1952](https://github.com/embroider-build/embroider/pull/1952) Merge stable - into Main ([@mansona]) -- [embroider-build/embroider] - [#1947](https://github.com/embroider-build/embroider/pull/1947) fix babel - config location in resolver tests ([@mansona]) -- [embroider-build/embroider] - [#1953](https://github.com/embroider-build/embroider/pull/1953) New config - module - `storeConfigInMeta` ([@BlueCutOfficial]) +- [embroider-build/app-blueprint] [#18](https://github.com/embroider-build/app-blueprint/pull/18) add new config structure ([@mansona]) +- [embroider-build/app-blueprint] [#17](https://github.com/embroider-build/app-blueprint/pull/17) Add smoke tests and fix the app-name.css link in index.html ([@mansona]) +- [embroider-build/app-blueprint] [#15](https://github.com/embroider-build/app-blueprint/pull/15) schedule CI to run once a day ([@mansona]) +- [embroider-build/app-blueprint] [#14](https://github.com/embroider-build/app-blueprint/pull/14) add a dependabot config to keep ember-cli up to date ([@mansona]) +- [embroider-build/ember-auto-import] [#626](https://github.com/embroider-build/ember-auto-import/pull/626) setup windows tests ([@mansona]) +- [embroider-build/ember-auto-import] [#625](https://github.com/embroider-build/ember-auto-import/pull/625) update release-plan ([@mansona]) +- [embroider-build/ember-auto-import] [#622](https://github.com/embroider-build/ember-auto-import/pull/622) fix glob version on lts tests ([@mansona]) +- [embroider-build/ember-auto-import] [#620](https://github.com/embroider-build/ember-auto-import/pull/620) Improved layering between app and tests bundles ([@mansona]) +- [embroider-build/embroider] [#1954](https://github.com/embroider-build/embroider/pull/1954) reset version of config-meta-loader to 0.0.0 ([@mansona]) +- [embroider-build/embroider] [#1952](https://github.com/embroider-build/embroider/pull/1952) Merge stable into Main ([@mansona]) +- [embroider-build/embroider] [#1947](https://github.com/embroider-build/embroider/pull/1947) fix babel config location in resolver tests ([@mansona]) +- [embroider-build/embroider] [#1953](https://github.com/embroider-build/embroider/pull/1953) New config module - `storeConfigInMeta` ([@BlueCutOfficial]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@mansona]: https://github.com/mansona [@paoloricciuti]: https://github.com/paoloricciuti -[embroider-build/app-blueprint]: - https://github.com/embroider-build/app-blueprint -[embroider-build/ember-auto-import]: - https://github.com/embroider-build/ember-auto-import +[embroider-build/app-blueprint]: https://github.com/embroider-build/app-blueprint +[embroider-build/ember-auto-import]: https://github.com/embroider-build/ember-auto-import [embroider-build/embroider]: https://github.com/embroider-build/embroider -[mainmatter/svelte-concurrency]: - https://github.com/mainmatter/svelte-concurrency +[mainmatter/svelte-concurrency]: https://github.com/mainmatter/svelte-concurrency [svecosystem/runed]: https://github.com/svecosystem/runed [sveltejs/svelte]: https://github.com/sveltejs/svelte diff --git a/src/twios/2024-06-09.md b/src/twios/2024-06-09.md index d6ab179161..646de78ffb 100644 --- a/src/twios/2024-06-09.md +++ b/src/twios/2024-06-09.md @@ -1,57 +1,36 @@ ## Rust -- [marcoow/pacesetter] [#61](https://github.com/marcoow/pacesetter/pull/61) - Renovate for templates ([@marcoow]) -- [marcoow/pacesetter] [#59](https://github.com/marcoow/pacesetter/pull/59) - enable Renovate for `Cargo.toml.liquid` files in blueprints ([@marcoow]) -- [marcoow/pacesetter] [#52](https://github.com/marcoow/pacesetter/pull/52) - don't fail if into_json of TestResponse is never used ([@marcoow]) -- [marcoow/pacesetter] [#51](https://github.com/marcoow/pacesetter/pull/51) add - renovate config ([@marcoow]) +- [marcoow/pacesetter] [#61](https://github.com/marcoow/pacesetter/pull/61) Renovate for templates ([@marcoow]) +- [marcoow/pacesetter] [#59](https://github.com/marcoow/pacesetter/pull/59) enable Renovate for `Cargo.toml.liquid` files in blueprints ([@marcoow]) +- [marcoow/pacesetter] [#52](https://github.com/marcoow/pacesetter/pull/52) don't fail if into_json of TestResponse is never used ([@marcoow]) +- [marcoow/pacesetter] [#51](https://github.com/marcoow/pacesetter/pull/51) add renovate config ([@marcoow]) ## Svelte -- [svecosystem/runed] [#68](https://github.com/svecosystem/runed/pull/68) feat: - allow media query to be initialized in a module ([@paoloricciuti]) -- [sveltejs/svelte] [#11947](https://github.com/sveltejs/svelte/pull/11947) fix: - validate form inside a form ([@paoloricciuti]) -- [sveltejs/svelte] [#11946](https://github.com/sveltejs/svelte/pull/11946) fix: - lazily create sources for Set ([@paoloricciuti]) -- [sveltejs/svelte] [#11913](https://github.com/sveltejs/svelte/pull/11913) fix: - increment version when creating new source in Map.get or Map.has - ([@paoloricciuti]) -- [sveltejs/svelte] [#11905](https://github.com/sveltejs/svelte/pull/11905) fix: - silence `state_referenced_locally` when state is exported ([@paoloricciuti]) -- [sveltejs/svelte] [#11860](https://github.com/sveltejs/svelte/pull/11860) fix: - keep default values of props a proxy after reassignment ([@paoloricciuti]) -- [sveltejs/svelte] [#11792](https://github.com/sveltejs/svelte/pull/11792) - feat: better dynamic component css props ([@paoloricciuti]) +- [svecosystem/runed] [#68](https://github.com/svecosystem/runed/pull/68) feat: allow media query to be initialized in a module ([@paoloricciuti]) +- [sveltejs/svelte] [#11947](https://github.com/sveltejs/svelte/pull/11947) fix: validate form inside a form ([@paoloricciuti]) +- [sveltejs/svelte] [#11946](https://github.com/sveltejs/svelte/pull/11946) fix: lazily create sources for Set ([@paoloricciuti]) +- [sveltejs/svelte] [#11913](https://github.com/sveltejs/svelte/pull/11913) fix: increment version when creating new source in Map.get or Map.has ([@paoloricciuti]) +- [sveltejs/svelte] [#11905](https://github.com/sveltejs/svelte/pull/11905) fix: silence `state_referenced_locally` when state is exported ([@paoloricciuti]) +- [sveltejs/svelte] [#11860](https://github.com/sveltejs/svelte/pull/11860) fix: keep default values of props a proxy after reassignment ([@paoloricciuti]) +- [sveltejs/svelte] [#11792](https://github.com/sveltejs/svelte/pull/11792) feat: better dynamic component css props ([@paoloricciuti]) ## Embroider -- [embroider-build/app-blueprint] - [#21](https://github.com/embroider-build/app-blueprint/pull/21) add docs for - updating an existing app ([@mansona]) -- [embroider-build/embroider] - [#1946](https://github.com/embroider-build/embroider/pull/1946) remove the - ember-addon keyword from rewritten app ([@mansona]) +- [embroider-build/app-blueprint] [#21](https://github.com/embroider-build/app-blueprint/pull/21) add docs for updating an existing app ([@mansona]) +- [embroider-build/embroider] [#1946](https://github.com/embroider-build/embroider/pull/1946) remove the ember-addon keyword from rewritten app ([@mansona]) ## Ember -- [ember-learn/deprecation-app] - [#1384](https://github.com/ember-learn/deprecation-app/pull/1384) make the - deprecation anchor § link directly to the id route ([@mansona]) -- [ember-learn/ember-api-docs] - [#908](https://github.com/ember-learn/ember-api-docs/pull/908) switch to pnpm - ([@mansona]) +- [ember-learn/deprecation-app] [#1384](https://github.com/ember-learn/deprecation-app/pull/1384) make the deprecation anchor § link directly to the id route ([@mansona]) +- [ember-learn/ember-api-docs] [#908](https://github.com/ember-learn/ember-api-docs/pull/908) switch to pnpm ([@mansona]) [@mansona]: https://github.com/mansona [@marcoow]: https://github.com/marcoow [@paoloricciuti]: https://github.com/paoloricciuti [ember-learn/deprecation-app]: https://github.com/ember-learn/deprecation-app [ember-learn/ember-api-docs]: https://github.com/ember-learn/ember-api-docs -[embroider-build/app-blueprint]: - https://github.com/embroider-build/app-blueprint +[embroider-build/app-blueprint]: https://github.com/embroider-build/app-blueprint [embroider-build/embroider]: https://github.com/embroider-build/embroider [marcoow/pacesetter]: https://github.com/marcoow/pacesetter [svecosystem/runed]: https://github.com/svecosystem/runed diff --git a/src/twios/2024-06-16.md b/src/twios/2024-06-16.md index 2c6cb1d2be..99b4eb042c 100644 --- a/src/twios/2024-06-16.md +++ b/src/twios/2024-06-16.md @@ -1,74 +1,40 @@ ## Svelte -- [sveltejs/svelte] [#11997](https://github.com/sveltejs/svelte/pull/11997) fix: - better `render` type ([@paoloricciuti]) +- [sveltejs/svelte] [#11997](https://github.com/sveltejs/svelte/pull/11997) fix: better `render` type ([@paoloricciuti]) ## Embroider -- [embroider-build/app-blueprint] - [#31](https://github.com/embroider-build/app-blueprint/pull/31) fix the - location of the rewritten app ([@mansona]) -- [embroider-build/embroider] - [#1983](https://github.com/embroider-build/embroider/pull/1983) Merge stable - into Main ([@mansona]) -- [embroider-build/embroider] - [#1970](https://github.com/embroider-build/embroider/pull/1970) Use html-audit - instead of stage-2 build ([@mansona]) -- [embroider-build/embroider] - [#1955](https://github.com/embroider-build/embroider/pull/1955) Remove - template-only components compilation from Stage 2 ([@BlueCutOfficial]) +- [embroider-build/app-blueprint] [#31](https://github.com/embroider-build/app-blueprint/pull/31) fix the location of the rewritten app ([@mansona]) +- [embroider-build/embroider] [#1983](https://github.com/embroider-build/embroider/pull/1983) Merge stable into Main ([@mansona]) +- [embroider-build/embroider] [#1970](https://github.com/embroider-build/embroider/pull/1970) Use html-audit instead of stage-2 build ([@mansona]) +- [embroider-build/embroider] [#1955](https://github.com/embroider-build/embroider/pull/1955) Remove template-only components compilation from Stage 2 ([@BlueCutOfficial]) ## JavaScript -- [oscard0m/npm-snapshot] - [#19](https://github.com/oscard0m/npm-snapshot/pull/19) ci(release) use node - LTS and unpin semantic-release ([@oscard0m]) +- [oscard0m/npm-snapshot] [#19](https://github.com/oscard0m/npm-snapshot/pull/19) ci(release) use node LTS and unpin semantic-release ([@oscard0m]) ## Octokit -- [oscard0m/octoherd-script-add-cache-to-node-github-action] - [#37](https://github.com/oscard0m/octoherd-script-add-cache-to-node-github-action/pull/37) - ci(release) use node LTS and unpin semantic-release ([@oscard0m]) -- [oscard0m/octoherd-script-add-or-delete-issue-label] - [#23](https://github.com/oscard0m/octoherd-script-add-or-delete-issue-label/pull/23) - ci(release) use node LTS and unpin semantic-release ([@oscard0m]) -- [oscard0m/octoherd-script-fix-test-workflow-octokit] - [#17](https://github.com/oscard0m/octoherd-script-fix-test-workflow-octokit/pull/17) - ci(release): use node LTS ([@oscard0m]) -- [oscard0m/octoherd-script-remove-renovate-package.json] - [#18](https://github.com/oscard0m/octoherd-script-remove-renovate-package.json/pull/18) - migrate to node test and esm ([@oscard0m]) -- [oscard0m/octoherd-script-remove-renovate-package.json] - [#17](https://github.com/oscard0m/octoherd-script-remove-renovate-package.json/pull/17) - ci(release) use node LTS and unpin semantic-release ([@oscard0m]) -- [oscard0m/octoherd-script-sync-repo-settings] - [#28](https://github.com/oscard0m/octoherd-script-sync-repo-settings/pull/28) - ci(release): use node LTS ([@oscard0m]) -- [oscard0m/octoherd-script-sync-repo-settings] - [#27](https://github.com/oscard0m/octoherd-script-sync-repo-settings/pull/27) - ci(semantic-release): unpin version of semantic-release in CI ([@oscard0m]) -- [oscard0m/octoherd-script-update-action-version-in-workflows] - [#19](https://github.com/oscard0m/octoherd-script-update-action-version-in-workflows/pull/19) - ci(release) use node LTS and unpin semantic-release ([@oscard0m]) +- [oscard0m/octoherd-script-add-cache-to-node-github-action] [#37](https://github.com/oscard0m/octoherd-script-add-cache-to-node-github-action/pull/37) ci(release) use node LTS and unpin semantic-release ([@oscard0m]) +- [oscard0m/octoherd-script-add-or-delete-issue-label] [#23](https://github.com/oscard0m/octoherd-script-add-or-delete-issue-label/pull/23) ci(release) use node LTS and unpin semantic-release ([@oscard0m]) +- [oscard0m/octoherd-script-fix-test-workflow-octokit] [#17](https://github.com/oscard0m/octoherd-script-fix-test-workflow-octokit/pull/17) ci(release): use node LTS ([@oscard0m]) +- [oscard0m/octoherd-script-remove-renovate-package.json] [#18](https://github.com/oscard0m/octoherd-script-remove-renovate-package.json/pull/18) migrate to node test and esm ([@oscard0m]) +- [oscard0m/octoherd-script-remove-renovate-package.json] [#17](https://github.com/oscard0m/octoherd-script-remove-renovate-package.json/pull/17) ci(release) use node LTS and unpin semantic-release ([@oscard0m]) +- [oscard0m/octoherd-script-sync-repo-settings] [#28](https://github.com/oscard0m/octoherd-script-sync-repo-settings/pull/28) ci(release): use node LTS ([@oscard0m]) +- [oscard0m/octoherd-script-sync-repo-settings] [#27](https://github.com/oscard0m/octoherd-script-sync-repo-settings/pull/27) ci(semantic-release): unpin version of semantic-release in CI ([@oscard0m]) +- [oscard0m/octoherd-script-update-action-version-in-workflows] [#19](https://github.com/oscard0m/octoherd-script-update-action-version-in-workflows/pull/19) ci(release) use node LTS and unpin semantic-release ([@oscard0m]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@mansona]: https://github.com/mansona [@oscard0m]: https://github.com/oscard0m [@paoloricciuti]: https://github.com/paoloricciuti -[embroider-build/app-blueprint]: - https://github.com/embroider-build/app-blueprint +[embroider-build/app-blueprint]: https://github.com/embroider-build/app-blueprint [embroider-build/embroider]: https://github.com/embroider-build/embroider [oscard0m/npm-snapshot]: https://github.com/oscard0m/npm-snapshot -[oscard0m/octoherd-script-add-cache-to-node-github-action]: - https://github.com/oscard0m/octoherd-script-add-cache-to-node-github-action -[oscard0m/octoherd-script-add-or-delete-issue-label]: - https://github.com/oscard0m/octoherd-script-add-or-delete-issue-label -[oscard0m/octoherd-script-fix-test-workflow-octokit]: - https://github.com/oscard0m/octoherd-script-fix-test-workflow-octokit -[oscard0m/octoherd-script-remove-renovate-package.json]: - https://github.com/oscard0m/octoherd-script-remove-renovate-package.json -[oscard0m/octoherd-script-sync-repo-settings]: - https://github.com/oscard0m/octoherd-script-sync-repo-settings -[oscard0m/octoherd-script-update-action-version-in-workflows]: - https://github.com/oscard0m/octoherd-script-update-action-version-in-workflows +[oscard0m/octoherd-script-add-cache-to-node-github-action]: https://github.com/oscard0m/octoherd-script-add-cache-to-node-github-action +[oscard0m/octoherd-script-add-or-delete-issue-label]: https://github.com/oscard0m/octoherd-script-add-or-delete-issue-label +[oscard0m/octoherd-script-fix-test-workflow-octokit]: https://github.com/oscard0m/octoherd-script-fix-test-workflow-octokit +[oscard0m/octoherd-script-remove-renovate-package.json]: https://github.com/oscard0m/octoherd-script-remove-renovate-package.json +[oscard0m/octoherd-script-sync-repo-settings]: https://github.com/oscard0m/octoherd-script-sync-repo-settings +[oscard0m/octoherd-script-update-action-version-in-workflows]: https://github.com/oscard0m/octoherd-script-update-action-version-in-workflows [sveltejs/svelte]: https://github.com/sveltejs/svelte diff --git a/src/twios/2024-06-23.md b/src/twios/2024-06-23.md index b2f4bf3803..c2f46e4a41 100644 --- a/src/twios/2024-06-23.md +++ b/src/twios/2024-06-23.md @@ -1,97 +1,48 @@ ## Rust -- [marcoow/pacesetter] [#66](https://github.com/marcoow/pacesetter/pull/66) Fix - CI ([@marcoow]) +- [marcoow/pacesetter] [#66](https://github.com/marcoow/pacesetter/pull/66) Fix CI ([@marcoow]) ## Svelte -- [mainmatter/sheepdog] [#106](https://github.com/mainmatter/sheepdog/pull/106) - chore: delete tgz ([@paoloricciuti]) -- [mainmatter/sheepdog] [#104](https://github.com/mainmatter/sheepdog/pull/104) - chore: change website and repo in docs ([@paoloricciuti]) -- [mainmatter/sheepdog] [#98](https://github.com/mainmatter/sheepdog/pull/98) - fix: cancelled instances hanging indefinitely ([@paoloricciuti]) -- [sveltejs/svelte] [#12144](https://github.com/sveltejs/svelte/pull/12144) fix: - throw compilation error for malformed snippets ([@paoloricciuti]) -- [sveltejs/svelte] [#12098](https://github.com/sveltejs/svelte/pull/12098) fix: - repair each block length even without an else ([@paoloricciuti]) -- [sveltejs/svelte] [#12070](https://github.com/sveltejs/svelte/pull/12070) fix: - allow multiple optional parameters with defaults ([@paoloricciuti]) +- [mainmatter/sheepdog] [#106](https://github.com/mainmatter/sheepdog/pull/106) chore: delete tgz ([@paoloricciuti]) +- [mainmatter/sheepdog] [#104](https://github.com/mainmatter/sheepdog/pull/104) chore: change website and repo in docs ([@paoloricciuti]) +- [mainmatter/sheepdog] [#98](https://github.com/mainmatter/sheepdog/pull/98) fix: cancelled instances hanging indefinitely ([@paoloricciuti]) +- [sveltejs/svelte] [#12144](https://github.com/sveltejs/svelte/pull/12144) fix: throw compilation error for malformed snippets ([@paoloricciuti]) +- [sveltejs/svelte] [#12098](https://github.com/sveltejs/svelte/pull/12098) fix: repair each block length even without an else ([@paoloricciuti]) +- [sveltejs/svelte] [#12070](https://github.com/sveltejs/svelte/pull/12070) fix: allow multiple optional parameters with defaults ([@paoloricciuti]) ## Embroider -- [embroider-build/app-blueprint] - [#35](https://github.com/embroider-build/app-blueprint/pull/35) add - notification for failed github action ([@mansona]) -- [embroider-build/app-blueprint] - [#33](https://github.com/embroider-build/app-blueprint/pull/33) Add a bigger - warning for this repo ([@mansona]) -- [embroider-build/embroider] - [#2000](https://github.com/embroider-build/embroider/pull/2000) Update - typescript and fix issues with Typescript 5.5 ([@mansona]) -- [embroider-build/embroider] - [#1996](https://github.com/embroider-build/embroider/pull/1996) Merge stable - into main ([@mansona]) -- [embroider-build/embroider] - [#1993](https://github.com/embroider-build/embroider/pull/1993) update node to - latest LTS for CI ([@mansona]) -- [embroider-build/embroider] - [#1992](https://github.com/embroider-build/embroider/pull/1992) add missing - initiative sponsors to the Readme ([@mansona]) +- [embroider-build/app-blueprint] [#35](https://github.com/embroider-build/app-blueprint/pull/35) add notification for failed github action ([@mansona]) +- [embroider-build/app-blueprint] [#33](https://github.com/embroider-build/app-blueprint/pull/33) Add a bigger warning for this repo ([@mansona]) +- [embroider-build/embroider] [#2000](https://github.com/embroider-build/embroider/pull/2000) Update typescript and fix issues with Typescript 5.5 ([@mansona]) +- [embroider-build/embroider] [#1996](https://github.com/embroider-build/embroider/pull/1996) Merge stable into main ([@mansona]) +- [embroider-build/embroider] [#1993](https://github.com/embroider-build/embroider/pull/1993) update node to latest LTS for CI ([@mansona]) +- [embroider-build/embroider] [#1992](https://github.com/embroider-build/embroider/pull/1992) add missing initiative sponsors to the Readme ([@mansona]) ## JavaScript -- [oscard0m/npm-snapshot] - [#19](https://github.com/oscard0m/npm-snapshot/pull/19) ci(release) use node - LTS and unpin semantic-release ([@oscard0m]) +- [oscard0m/npm-snapshot] [#19](https://github.com/oscard0m/npm-snapshot/pull/19) ci(release) use node LTS and unpin semantic-release ([@oscard0m]) ## Octokit -- [oscard0m/octoherd-script-add-cache-to-node-github-action] - [#37](https://github.com/oscard0m/octoherd-script-add-cache-to-node-github-action/pull/37) - ci(release) use node LTS and unpin semantic-release ([@oscard0m]) -- [oscard0m/octoherd-script-add-or-delete-issue-label] - [#23](https://github.com/oscard0m/octoherd-script-add-or-delete-issue-label/pull/23) - ci(release) use node LTS and unpin semantic-release ([@oscard0m]) -- [oscard0m/octoherd-script-fix-test-workflow-octokit] - [#17](https://github.com/oscard0m/octoherd-script-fix-test-workflow-octokit/pull/17) - ci(release): use node LTS ([@oscard0m]) -- [oscard0m/octoherd-script-remove-branches-config-semantic-release] - [#2](https://github.com/oscard0m/octoherd-script-remove-branches-config-semantic-release/pull/2) - ci(release): use node LTS for releases ([@oscard0m]) -- [oscard0m/octoherd-script-remove-branches-config-semantic-release] - [#1](https://github.com/oscard0m/octoherd-script-remove-branches-config-semantic-release/pull/1) - feat: Initial version ([@oscard0m]) -- [oscard0m/octoherd-script-remove-renovate-package.json] - [#18](https://github.com/oscard0m/octoherd-script-remove-renovate-package.json/pull/18) - migrate to node test and esm ([@oscard0m]) -- [oscard0m/octoherd-script-remove-renovate-package.json] - [#17](https://github.com/oscard0m/octoherd-script-remove-renovate-package.json/pull/17) - ci(release) use node LTS and unpin semantic-release ([@oscard0m]) -- [oscard0m/octoherd-script-sync-repo-settings] - [#28](https://github.com/oscard0m/octoherd-script-sync-repo-settings/pull/28) - ci(release): use node LTS ([@oscard0m]) -- [oscard0m/octoherd-script-sync-repo-settings] - [#27](https://github.com/oscard0m/octoherd-script-sync-repo-settings/pull/27) - ci(semantic-release): unpin version of semantic-release in CI ([@oscard0m]) -- [oscard0m/octoherd-script-update-action-version-in-workflows] - [#19](https://github.com/oscard0m/octoherd-script-update-action-version-in-workflows/pull/19) - ci(release) use node LTS and unpin semantic-release ([@oscard0m]) +- [oscard0m/octoherd-script-add-cache-to-node-github-action] [#37](https://github.com/oscard0m/octoherd-script-add-cache-to-node-github-action/pull/37) ci(release) use node LTS and unpin semantic-release ([@oscard0m]) +- [oscard0m/octoherd-script-add-or-delete-issue-label] [#23](https://github.com/oscard0m/octoherd-script-add-or-delete-issue-label/pull/23) ci(release) use node LTS and unpin semantic-release ([@oscard0m]) +- [oscard0m/octoherd-script-fix-test-workflow-octokit] [#17](https://github.com/oscard0m/octoherd-script-fix-test-workflow-octokit/pull/17) ci(release): use node LTS ([@oscard0m]) +- [oscard0m/octoherd-script-remove-branches-config-semantic-release] [#2](https://github.com/oscard0m/octoherd-script-remove-branches-config-semantic-release/pull/2) ci(release): use node LTS for releases ([@oscard0m]) +- [oscard0m/octoherd-script-remove-branches-config-semantic-release] [#1](https://github.com/oscard0m/octoherd-script-remove-branches-config-semantic-release/pull/1) feat: Initial version ([@oscard0m]) +- [oscard0m/octoherd-script-remove-renovate-package.json] [#18](https://github.com/oscard0m/octoherd-script-remove-renovate-package.json/pull/18) migrate to node test and esm ([@oscard0m]) +- [oscard0m/octoherd-script-remove-renovate-package.json] [#17](https://github.com/oscard0m/octoherd-script-remove-renovate-package.json/pull/17) ci(release) use node LTS and unpin semantic-release ([@oscard0m]) +- [oscard0m/octoherd-script-sync-repo-settings] [#28](https://github.com/oscard0m/octoherd-script-sync-repo-settings/pull/28) ci(release): use node LTS ([@oscard0m]) +- [oscard0m/octoherd-script-sync-repo-settings] [#27](https://github.com/oscard0m/octoherd-script-sync-repo-settings/pull/27) ci(semantic-release): unpin version of semantic-release in CI ([@oscard0m]) +- [oscard0m/octoherd-script-update-action-version-in-workflows] [#19](https://github.com/oscard0m/octoherd-script-update-action-version-in-workflows/pull/19) ci(release) use node LTS and unpin semantic-release ([@oscard0m]) ## Ember -- [ember-learn/ember-api-docs] - [#912](https://github.com/ember-learn/ember-api-docs/pull/912) add new percy - snapshots ([@mansona]) -- [ember-learn/ember-api-docs] - [#911](https://github.com/ember-learn/ember-api-docs/pull/911) update percy - ([@mansona]) -- [ember-learn/ember-api-docs] - [#910](https://github.com/ember-learn/ember-api-docs/pull/910) Merge master - into redesign ([@mansona]) -- [ember-learn/ember-website] - [#1115](https://github.com/ember-learn/ember-website/pull/1115) add auditboard - as an initiative sponsor ([@mansona]) +- [ember-learn/ember-api-docs] [#912](https://github.com/ember-learn/ember-api-docs/pull/912) add new percy snapshots ([@mansona]) +- [ember-learn/ember-api-docs] [#911](https://github.com/ember-learn/ember-api-docs/pull/911) update percy ([@mansona]) +- [ember-learn/ember-api-docs] [#910](https://github.com/ember-learn/ember-api-docs/pull/910) Merge master into redesign ([@mansona]) +- [ember-learn/ember-website] [#1115](https://github.com/ember-learn/ember-website/pull/1115) add auditboard as an initiative sponsor ([@mansona]) [@mansona]: https://github.com/mansona [@marcoow]: https://github.com/marcoow @@ -99,24 +50,16 @@ [@paoloricciuti]: https://github.com/paoloricciuti [ember-learn/ember-api-docs]: https://github.com/ember-learn/ember-api-docs [ember-learn/ember-website]: https://github.com/ember-learn/ember-website -[embroider-build/app-blueprint]: - https://github.com/embroider-build/app-blueprint +[embroider-build/app-blueprint]: https://github.com/embroider-build/app-blueprint [embroider-build/embroider]: https://github.com/embroider-build/embroider [mainmatter/sheepdog]: https://github.com/mainmatter/sheepdog [marcoow/pacesetter]: https://github.com/marcoow/pacesetter [oscard0m/npm-snapshot]: https://github.com/oscard0m/npm-snapshot -[oscard0m/octoherd-script-add-cache-to-node-github-action]: - https://github.com/oscard0m/octoherd-script-add-cache-to-node-github-action -[oscard0m/octoherd-script-add-or-delete-issue-label]: - https://github.com/oscard0m/octoherd-script-add-or-delete-issue-label -[oscard0m/octoherd-script-fix-test-workflow-octokit]: - https://github.com/oscard0m/octoherd-script-fix-test-workflow-octokit -[oscard0m/octoherd-script-remove-branches-config-semantic-release]: - https://github.com/oscard0m/octoherd-script-remove-branches-config-semantic-release -[oscard0m/octoherd-script-remove-renovate-package.json]: - https://github.com/oscard0m/octoherd-script-remove-renovate-package.json -[oscard0m/octoherd-script-sync-repo-settings]: - https://github.com/oscard0m/octoherd-script-sync-repo-settings -[oscard0m/octoherd-script-update-action-version-in-workflows]: - https://github.com/oscard0m/octoherd-script-update-action-version-in-workflows +[oscard0m/octoherd-script-add-cache-to-node-github-action]: https://github.com/oscard0m/octoherd-script-add-cache-to-node-github-action +[oscard0m/octoherd-script-add-or-delete-issue-label]: https://github.com/oscard0m/octoherd-script-add-or-delete-issue-label +[oscard0m/octoherd-script-fix-test-workflow-octokit]: https://github.com/oscard0m/octoherd-script-fix-test-workflow-octokit +[oscard0m/octoherd-script-remove-branches-config-semantic-release]: https://github.com/oscard0m/octoherd-script-remove-branches-config-semantic-release +[oscard0m/octoherd-script-remove-renovate-package.json]: https://github.com/oscard0m/octoherd-script-remove-renovate-package.json +[oscard0m/octoherd-script-sync-repo-settings]: https://github.com/oscard0m/octoherd-script-sync-repo-settings +[oscard0m/octoherd-script-update-action-version-in-workflows]: https://github.com/oscard0m/octoherd-script-update-action-version-in-workflows [sveltejs/svelte]: https://github.com/sveltejs/svelte diff --git a/src/twios/2024-06-30.md b/src/twios/2024-06-30.md index 240e022cb0..c371a7153b 100644 --- a/src/twios/2024-06-30.md +++ b/src/twios/2024-06-30.md @@ -1,105 +1,58 @@ ## Rust -- [marcoow/pacesetter] [#72](https://github.com/marcoow/pacesetter/pull/72) Add - READMEs to blueprint ([@marcoow]) -- [marcoow/pacesetter] [#71](https://github.com/marcoow/pacesetter/pull/71) - don't create db_test macro for minimal project type ([@marcoow]) -- [marcoow/pacesetter] [#70](https://github.com/marcoow/pacesetter/pull/70) run - CI daily ([@marcoow]) -- [marcoow/pacesetter] [#48](https://github.com/marcoow/pacesetter/pull/48) add - README and LICENSE ([@marcoow]) +- [marcoow/pacesetter] [#72](https://github.com/marcoow/pacesetter/pull/72) Add READMEs to blueprint ([@marcoow]) +- [marcoow/pacesetter] [#71](https://github.com/marcoow/pacesetter/pull/71) don't create db_test macro for minimal project type ([@marcoow]) +- [marcoow/pacesetter] [#70](https://github.com/marcoow/pacesetter/pull/70) run CI daily ([@marcoow]) +- [marcoow/pacesetter] [#48](https://github.com/marcoow/pacesetter/pull/48) add README and LICENSE ([@marcoow]) ## Svelte -- [sveltejs/language-tools] - [#2412](https://github.com/sveltejs/language-tools/pull/2412) fix: snippets - with TS incorrect transformation ([@paoloricciuti]) -- [sveltejs/svelte] [#12144](https://github.com/sveltejs/svelte/pull/12144) fix: - throw compilation error for malformed snippets ([@paoloricciuti]) +- [sveltejs/language-tools] [#2412](https://github.com/sveltejs/language-tools/pull/2412) fix: snippets with TS incorrect transformation ([@paoloricciuti]) +- [sveltejs/svelte] [#12144](https://github.com/sveltejs/svelte/pull/12144) fix: throw compilation error for malformed snippets ([@paoloricciuti]) ## Embroider -- [embroider-build/app-blueprint] - [#37](https://github.com/embroider-build/app-blueprint/pull/37) add new app.js - structure ([@mansona]) -- [embroider-build/app-blueprint] - [#28](https://github.com/embroider-build/app-blueprint/pull/28) add regression - tests for initialisers ([@mansona]) -- [embroider-build/ember-auto-import] - [#629](https://github.com/embroider-build/ember-auto-import/pull/629) only - check devDependencies when checking requested range of an app package - ([@mansona]) -- [embroider-build/embroider] - [#2008](https://github.com/embroider-build/embroider/pull/2008) Merge stable - into main ([@mansona]) -- [embroider-build/embroider] - [#2004](https://github.com/embroider-build/embroider/pull/2004) use pnpm to - publish unstable ([@mansona]) -- [embroider-build/embroider] - [#2006](https://github.com/embroider-build/embroider/pull/2006) Virtual - entrypoint export modules ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1957](https://github.com/embroider-build/embroider/pull/1957) Move - responsibility of booting the app from Embroider internals to the Ember app - ([@BlueCutOfficial]) +- [embroider-build/app-blueprint] [#37](https://github.com/embroider-build/app-blueprint/pull/37) add new app.js structure ([@mansona]) +- [embroider-build/app-blueprint] [#28](https://github.com/embroider-build/app-blueprint/pull/28) add regression tests for initialisers ([@mansona]) +- [embroider-build/ember-auto-import] [#629](https://github.com/embroider-build/ember-auto-import/pull/629) only check devDependencies when checking requested range of an app package ([@mansona]) +- [embroider-build/embroider] [#2008](https://github.com/embroider-build/embroider/pull/2008) Merge stable into main ([@mansona]) +- [embroider-build/embroider] [#2004](https://github.com/embroider-build/embroider/pull/2004) use pnpm to publish unstable ([@mansona]) +- [embroider-build/embroider] [#2006](https://github.com/embroider-build/embroider/pull/2006) Virtual entrypoint export modules ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1957](https://github.com/embroider-build/embroider/pull/1957) Move responsibility of booting the app from Embroider internals to the Ember app ([@BlueCutOfficial]) ## Empress -- [empress/guidemaker] [#115](https://github.com/empress/guidemaker/pull/115) - fix ember-data dependencies ([@mansona]) -- [empress/guidemaker] [#114](https://github.com/empress/guidemaker/pull/114) - fix version dropdown and add a test ([@mansona]) +- [empress/guidemaker] [#115](https://github.com/empress/guidemaker/pull/115) fix ember-data dependencies ([@mansona]) +- [empress/guidemaker] [#114](https://github.com/empress/guidemaker/pull/114) fix version dropdown and add a test ([@mansona]) ## JavaScript -- [snewcomer/intersection-observer-admin] - [#55](https://github.com/snewcomer/intersection-observer-admin/pull/55) - feat(memory-leaks): remove elements from registries when unobserve is called - ([@BobrImperator]) +- [snewcomer/intersection-observer-admin] [#55](https://github.com/snewcomer/intersection-observer-admin/pull/55) feat(memory-leaks): remove elements from registries when unobserve is called ([@BobrImperator]) ## Ember -- [ember-cli/ember-cli-deprecation-workflow] - [#189](https://github.com/ember-cli/ember-cli-deprecation-workflow/pull/189) - start using release-plan ([@mansona]) -- [ember-cli/ember-cli-deprecation-workflow] - [#188](https://github.com/ember-cli/ember-cli-deprecation-workflow/pull/188) - start using pnpm ([@mansona]) -- [ember-learn/ember-api-docs] - [#903](https://github.com/ember-learn/ember-api-docs/pull/903) Start using - Embroider ([@mansona]) -- [ember-learn/ember-styleguide] - [#513](https://github.com/ember-learn/ember-styleguide/pull/513) update - release-plan ([@mansona]) -- [mainmatter/ember-simple-auth] - [#2800](https://github.com/mainmatter/ember-simple-auth/pull/2800) Revert - "chore(ci): allow mainmatter/continue-on-error-comment to work on forks" - ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2798](https://github.com/mainmatter/ember-simple-auth/pull/2798) - feat(classic-test-app): change locationType to 'history' ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2797](https://github.com/mainmatter/ember-simple-auth/pull/2797) chore(ci): - allow mainmatter/continue-on-error-comment to work on forks ([@BobrImperator]) +- [ember-cli/ember-cli-deprecation-workflow] [#189](https://github.com/ember-cli/ember-cli-deprecation-workflow/pull/189) start using release-plan ([@mansona]) +- [ember-cli/ember-cli-deprecation-workflow] [#188](https://github.com/ember-cli/ember-cli-deprecation-workflow/pull/188) start using pnpm ([@mansona]) +- [ember-learn/ember-api-docs] [#903](https://github.com/ember-learn/ember-api-docs/pull/903) Start using Embroider ([@mansona]) +- [ember-learn/ember-styleguide] [#513](https://github.com/ember-learn/ember-styleguide/pull/513) update release-plan ([@mansona]) +- [mainmatter/ember-simple-auth] [#2800](https://github.com/mainmatter/ember-simple-auth/pull/2800) Revert "chore(ci): allow mainmatter/continue-on-error-comment to work on forks" ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2798](https://github.com/mainmatter/ember-simple-auth/pull/2798) feat(classic-test-app): change locationType to 'history' ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2797](https://github.com/mainmatter/ember-simple-auth/pull/2797) chore(ci): allow mainmatter/continue-on-error-comment to work on forks ([@BobrImperator]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@BobrImperator]: https://github.com/BobrImperator [@mansona]: https://github.com/mansona [@marcoow]: https://github.com/marcoow [@paoloricciuti]: https://github.com/paoloricciuti -[ember-cli/ember-cli-deprecation-workflow]: - https://github.com/ember-cli/ember-cli-deprecation-workflow +[ember-cli/ember-cli-deprecation-workflow]: https://github.com/ember-cli/ember-cli-deprecation-workflow [ember-learn/ember-api-docs]: https://github.com/ember-learn/ember-api-docs [ember-learn/ember-styleguide]: https://github.com/ember-learn/ember-styleguide -[embroider-build/app-blueprint]: - https://github.com/embroider-build/app-blueprint -[embroider-build/ember-auto-import]: - https://github.com/embroider-build/ember-auto-import +[embroider-build/app-blueprint]: https://github.com/embroider-build/app-blueprint +[embroider-build/ember-auto-import]: https://github.com/embroider-build/ember-auto-import [embroider-build/embroider]: https://github.com/embroider-build/embroider [empress/guidemaker]: https://github.com/empress/guidemaker [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth [marcoow/pacesetter]: https://github.com/marcoow/pacesetter -[snewcomer/intersection-observer-admin]: - https://github.com/snewcomer/intersection-observer-admin +[snewcomer/intersection-observer-admin]: https://github.com/snewcomer/intersection-observer-admin [sveltejs/language-tools]: https://github.com/sveltejs/language-tools [sveltejs/svelte]: https://github.com/sveltejs/svelte diff --git a/src/twios/2024-07-07.md b/src/twios/2024-07-07.md index e69f977e66..74d1393655 100644 --- a/src/twios/2024-07-07.md +++ b/src/twios/2024-07-07.md @@ -1,74 +1,37 @@ ## Rust -- [marcoow/pacesetter] [#72](https://github.com/marcoow/pacesetter/pull/72) Add - READMEs to blueprint ([@marcoow]) -- [marcoow/pacesetter] [#71](https://github.com/marcoow/pacesetter/pull/71) - don't create db_test macro for minimal project type ([@marcoow]) -- [marcoow/pacesetter] [#70](https://github.com/marcoow/pacesetter/pull/70) run - CI daily ([@marcoow]) -- [marcoow/pacesetter] [#48](https://github.com/marcoow/pacesetter/pull/48) add - README and LICENSE ([@marcoow]) +- [marcoow/pacesetter] [#72](https://github.com/marcoow/pacesetter/pull/72) Add READMEs to blueprint ([@marcoow]) +- [marcoow/pacesetter] [#71](https://github.com/marcoow/pacesetter/pull/71) don't create db_test macro for minimal project type ([@marcoow]) +- [marcoow/pacesetter] [#70](https://github.com/marcoow/pacesetter/pull/70) run CI daily ([@marcoow]) +- [marcoow/pacesetter] [#48](https://github.com/marcoow/pacesetter/pull/48) add README and LICENSE ([@marcoow]) ## Svelte -- [mainmatter/sheepdog] [#114](https://github.com/mainmatter/sheepdog/pull/114) - Add timeout utility function ([@nickschot]) -- [sveltejs/svelte] [#12290](https://github.com/sveltejs/svelte/pull/12290) fix: - correctly teardown `bind:this` with `$state.frozen` ([@paoloricciuti]) +- [mainmatter/sheepdog] [#114](https://github.com/mainmatter/sheepdog/pull/114) Add timeout utility function ([@nickschot]) +- [sveltejs/svelte] [#12290](https://github.com/sveltejs/svelte/pull/12290) fix: correctly teardown `bind:this` with `$state.frozen` ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#2017](https://github.com/embroider-build/embroider/pull/2017) update vite to - have a minimum version of 5.2 ([@mansona]) -- [embroider-build/embroider] - [#2015](https://github.com/embroider-build/embroider/pull/2015) update github - actions ([@mansona]) -- [embroider-build/embroider] - [#1931](https://github.com/embroider-build/embroider/pull/1931) update - scenario-tester ([@mansona]) -- [embroider-build/embroider] - [#1930](https://github.com/embroider-build/embroider/pull/1930) create a smoke - test for the widest possible matrix ([@mansona]) -- [embroider-build/embroider] - [#2012](https://github.com/embroider-build/embroider/pull/2012) Empty packages - as valid v2 addons ([@BlueCutOfficial]) +- [embroider-build/embroider] [#2017](https://github.com/embroider-build/embroider/pull/2017) update vite to have a minimum version of 5.2 ([@mansona]) +- [embroider-build/embroider] [#2015](https://github.com/embroider-build/embroider/pull/2015) update github actions ([@mansona]) +- [embroider-build/embroider] [#1931](https://github.com/embroider-build/embroider/pull/1931) update scenario-tester ([@mansona]) +- [embroider-build/embroider] [#1930](https://github.com/embroider-build/embroider/pull/1930) create a smoke test for the widest possible matrix ([@mansona]) +- [embroider-build/embroider] [#2012](https://github.com/embroider-build/embroider/pull/2012) Empty packages as valid v2 addons ([@BlueCutOfficial]) ## Ember -- [ef4/prember] [#84](https://github.com/ef4/prember/pull/84) add release-plan - ([@mansona]) -- [ef4/prember] [#83](https://github.com/ef4/prember/pull/83) switch to pnpm and - fix tests ([@mansona]) -- [ef4/prember] [#82](https://github.com/ef4/prember/pull/82) recycle the - fastboot instance after 1k requests ([@mansona]) -- [ember-learn/ember-api-docs] - [#914](https://github.com/ember-learn/ember-api-docs/pull/914) fix - require-expect lint ([@mansona]) -- [ember-learn/ember-api-docs-data] - [#30](https://github.com/ember-learn/ember-api-docs-data/pull/30) Fix names in - source s3 files ([@mansona]) -- [ember-learn/ember-data-request-service-cheat-sheet] - [#15](https://github.com/ember-learn/ember-data-request-service-cheat-sheet/pull/15) - stop deploying to gh-pages since we're using netlify ([@mansona]) -- [ember-learn/ember-data-request-service-cheat-sheet] - [#14](https://github.com/ember-learn/ember-data-request-service-cheat-sheet/pull/14) - stop using rootUrl to fix netlify previews and deployments ([@mansona]) -- [mainmatter/ember-cookies] - [#946](https://github.com/mainmatter/ember-cookies/pull/946) chore(ci): - strategy.fail-fast=false ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#945](https://github.com/mainmatter/ember-cookies/pull/945) chore: ci fixes - ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#944](https://github.com/mainmatter/ember-cookies/pull/944) chore(deps): - migrate eslint to new configuration syntax ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2802](https://github.com/mainmatter/ember-simple-auth/pull/2802) chore(ci): - add scenario against ember-lts-5.8 ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2801](https://github.com/mainmatter/ember-simple-auth/pull/2801) feat(deps): - update to ember-engines 0.11.0 ([@BobrImperator]) +- [ef4/prember] [#84](https://github.com/ef4/prember/pull/84) add release-plan ([@mansona]) +- [ef4/prember] [#83](https://github.com/ef4/prember/pull/83) switch to pnpm and fix tests ([@mansona]) +- [ef4/prember] [#82](https://github.com/ef4/prember/pull/82) recycle the fastboot instance after 1k requests ([@mansona]) +- [ember-learn/ember-api-docs] [#914](https://github.com/ember-learn/ember-api-docs/pull/914) fix require-expect lint ([@mansona]) +- [ember-learn/ember-api-docs-data] [#30](https://github.com/ember-learn/ember-api-docs-data/pull/30) Fix names in source s3 files ([@mansona]) +- [ember-learn/ember-data-request-service-cheat-sheet] [#15](https://github.com/ember-learn/ember-data-request-service-cheat-sheet/pull/15) stop deploying to gh-pages since we're using netlify ([@mansona]) +- [ember-learn/ember-data-request-service-cheat-sheet] [#14](https://github.com/ember-learn/ember-data-request-service-cheat-sheet/pull/14) stop using rootUrl to fix netlify previews and deployments ([@mansona]) +- [mainmatter/ember-cookies] [#946](https://github.com/mainmatter/ember-cookies/pull/946) chore(ci): strategy.fail-fast=false ([@BobrImperator]) +- [mainmatter/ember-cookies] [#945](https://github.com/mainmatter/ember-cookies/pull/945) chore: ci fixes ([@BobrImperator]) +- [mainmatter/ember-cookies] [#944](https://github.com/mainmatter/ember-cookies/pull/944) chore(deps): migrate eslint to new configuration syntax ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2802](https://github.com/mainmatter/ember-simple-auth/pull/2802) chore(ci): add scenario against ember-lts-5.8 ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2801](https://github.com/mainmatter/ember-simple-auth/pull/2801) feat(deps): update to ember-engines 0.11.0 ([@BobrImperator]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@BobrImperator]: https://github.com/BobrImperator @@ -77,11 +40,9 @@ [@nickschot]: https://github.com/nickschot [@paoloricciuti]: https://github.com/paoloricciuti [ef4/prember]: https://github.com/ef4/prember -[ember-learn/ember-api-docs-data]: - https://github.com/ember-learn/ember-api-docs-data +[ember-learn/ember-api-docs-data]: https://github.com/ember-learn/ember-api-docs-data [ember-learn/ember-api-docs]: https://github.com/ember-learn/ember-api-docs -[ember-learn/ember-data-request-service-cheat-sheet]: - https://github.com/ember-learn/ember-data-request-service-cheat-sheet +[ember-learn/ember-data-request-service-cheat-sheet]: https://github.com/ember-learn/ember-data-request-service-cheat-sheet [embroider-build/embroider]: https://github.com/embroider-build/embroider [mainmatter/ember-cookies]: https://github.com/mainmatter/ember-cookies [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth diff --git a/src/twios/2024-07-14.md b/src/twios/2024-07-14.md index 5c60731e4e..b1952b449b 100644 --- a/src/twios/2024-07-14.md +++ b/src/twios/2024-07-14.md @@ -1,116 +1,56 @@ ## Svelte -- [SvelteLab/SvelteLab] [#305](https://github.com/SvelteLab/SvelteLab/pull/305) - fix: og images using new svelte server api ([@paoloricciuti]) -- [mainmatter/sheepdog] [#116](https://github.com/mainmatter/sheepdog/pull/116) - feat: add installation, usage and start docs ([@paoloricciuti]) -- [sveltejs/svelte] [#12396](https://github.com/sveltejs/svelte/pull/12396) - feat: runtime dev warn for mismatched `@html` ([@paoloricciuti]) -- [sveltejs/svelte] [#12394](https://github.com/sveltejs/svelte/pull/12394) fix: - playground warnings ([@paoloricciuti]) -- [sveltejs/svelte] [#12392](https://github.com/sveltejs/svelte/pull/12392) fix: - style shorthand not referencing variables ([@paoloricciuti]) +- [SvelteLab/SvelteLab] [#305](https://github.com/SvelteLab/SvelteLab/pull/305) fix: og images using new svelte server api ([@paoloricciuti]) +- [mainmatter/sheepdog] [#116](https://github.com/mainmatter/sheepdog/pull/116) feat: add installation, usage and start docs ([@paoloricciuti]) +- [sveltejs/svelte] [#12396](https://github.com/sveltejs/svelte/pull/12396) feat: runtime dev warn for mismatched `@html` ([@paoloricciuti]) +- [sveltejs/svelte] [#12394](https://github.com/sveltejs/svelte/pull/12394) fix: playground warnings ([@paoloricciuti]) +- [sveltejs/svelte] [#12392](https://github.com/sveltejs/svelte/pull/12392) fix: style shorthand not referencing variables ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#2045](https://github.com/embroider-build/embroider/pull/2045) add missing - resolve extension config to other vite.config files ([@mansona]) -- [embroider-build/embroider] - [#2044](https://github.com/embroider-build/embroider/pull/2044) fix - template-only-components in virtual entrypoint ([@mansona]) -- [embroider-build/embroider] - [#2043](https://github.com/embroider-build/embroider/pull/2043) Fix/ - static-app-test shoudn't use an `isClassic` macro ([@BlueCutOfficial]) -- [embroider-build/embroider] - [#1966](https://github.com/embroider-build/embroider/pull/1966) New config - module, warning message ([@BlueCutOfficial]) +- [embroider-build/embroider] [#2045](https://github.com/embroider-build/embroider/pull/2045) add missing resolve extension config to other vite.config files ([@mansona]) +- [embroider-build/embroider] [#2044](https://github.com/embroider-build/embroider/pull/2044) fix template-only-components in virtual entrypoint ([@mansona]) +- [embroider-build/embroider] [#2043](https://github.com/embroider-build/embroider/pull/2043) Fix/ static-app-test shoudn't use an `isClassic` macro ([@BlueCutOfficial]) +- [embroider-build/embroider] [#1966](https://github.com/embroider-build/embroider/pull/1966) New config module, warning message ([@BlueCutOfficial]) ## JavaScript -- [ember-learn/ember-jsonapi-docs] - [#137](https://github.com/ember-learn/ember-jsonapi-docs/pull/137) emit - markdown for descriptions ([@mansona]) -- [embroider-build/release-plan] - [#72](https://github.com/embroider-build/release-plan/pull/72) add a test to - exercise latest-version dependency and update it ([@mansona]) -- [snewcomer/intersection-observer-admin] - [#57](https://github.com/snewcomer/intersection-observer-admin/pull/57) add - release-plan ([@mansona]) +- [ember-learn/ember-jsonapi-docs] [#137](https://github.com/ember-learn/ember-jsonapi-docs/pull/137) emit markdown for descriptions ([@mansona]) +- [embroider-build/release-plan] [#72](https://github.com/embroider-build/release-plan/pull/72) add a test to exercise latest-version dependency and update it ([@mansona]) +- [snewcomer/intersection-observer-admin] [#57](https://github.com/snewcomer/intersection-observer-admin/pull/57) add release-plan ([@mansona]) ## Ember -- [DazzlingFugu/ember-fr-guides-source] - [#245](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/245) - Translate `guides/accessibility/components` to 5.5 ([@BlueCutOfficial]) -- [ember-cli/babel-plugin-debug-macros] - [#101](https://github.com/ember-cli/babel-plugin-debug-macros/pull/101) fix - repo link ([@mansona]) -- [ember-cli/babel-plugin-debug-macros] - [#100](https://github.com/ember-cli/babel-plugin-debug-macros/pull/100) remove - security warnings from github ([@mansona]) -- [ember-cli/babel-plugin-debug-macros] - [#98](https://github.com/ember-cli/babel-plugin-debug-macros/pull/98) start - using release-plan ([@mansona]) -- [ember-cli/babel-plugin-debug-macros] - [#97](https://github.com/ember-cli/babel-plugin-debug-macros/pull/97) - docs(README.md)/ Fix a typo in the name of the plugin ([@BlueCutOfficial]) -- [ember-cli/ember-cli-deprecation-workflow] - [#192](https://github.com/ember-cli/ember-cli-deprecation-workflow/pull/192) - fix repository link in package.json ([@mansona]) -- [ember-cli/ember-cli-deprecation-workflow] - [#191](https://github.com/ember-cli/ember-cli-deprecation-workflow/pull/191) - update release plan workflow ([@mansona]) -- [ember-learn/ember-api-docs] - [#919](https://github.com/ember-learn/ember-api-docs/pull/919) Merge main - ([@mansona]) -- [ember-learn/ember-api-docs] - [#918](https://github.com/ember-learn/ember-api-docs/pull/918) go back to - using main branch for data ([@mansona]) -- [ember-learn/ember-api-docs] - [#902](https://github.com/ember-learn/ember-api-docs/pull/902) use - ember-showdown-shiki ([@mansona]) -- [ember-learn/ember-api-docs-data] - [#25](https://github.com/ember-learn/ember-api-docs-data/pull/25) Use Markdown - for all descriptions ([@mansona]) -- [ember-learn/ember-website] - [#1116](https://github.com/ember-learn/ember-website/pull/1116) merge cli, - typescript, and embroider teams ([@mansona]) -- [emberjs/ember-inflector] - [#503](https://github.com/emberjs/ember-inflector/pull/503) start using - release-plan ([@mansona]) -- [emberjs/ember-inflector] - [#502](https://github.com/emberjs/ember-inflector/pull/502) Remove yarn and - upgrade ember blueprint with ember-cli-update ([@mansona]) -- [mainmatter/ember-cookies] - [#949](https://github.com/mainmatter/ember-cookies/pull/949) chore(deps): - remove ember-data ([@BobrImperator]) -- [mainmatter/ember-cookies] - [#947](https://github.com/mainmatter/ember-cookies/pull/947) chore(ci): add - ember-lts-5.8 scenario ([@BobrImperator]) -- [mainmatter/ember-simple-auth] - [#2804](https://github.com/mainmatter/ember-simple-auth/pull/2804) - chore(lint): Migrate eslint config ([@BobrImperator]) -- [mansona/ember-cli-notifications] - [#376](https://github.com/mansona/ember-cli-notifications/pull/376) update - release-plan (again) ([@mansona]) +- [DazzlingFugu/ember-fr-guides-source] [#245](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/245) Translate `guides/accessibility/components` to 5.5 ([@BlueCutOfficial]) +- [ember-cli/babel-plugin-debug-macros] [#101](https://github.com/ember-cli/babel-plugin-debug-macros/pull/101) fix repo link ([@mansona]) +- [ember-cli/babel-plugin-debug-macros] [#100](https://github.com/ember-cli/babel-plugin-debug-macros/pull/100) remove security warnings from github ([@mansona]) +- [ember-cli/babel-plugin-debug-macros] [#98](https://github.com/ember-cli/babel-plugin-debug-macros/pull/98) start using release-plan ([@mansona]) +- [ember-cli/babel-plugin-debug-macros] [#97](https://github.com/ember-cli/babel-plugin-debug-macros/pull/97) docs(README.md)/ Fix a typo in the name of the plugin ([@BlueCutOfficial]) +- [ember-cli/ember-cli-deprecation-workflow] [#192](https://github.com/ember-cli/ember-cli-deprecation-workflow/pull/192) fix repository link in package.json ([@mansona]) +- [ember-cli/ember-cli-deprecation-workflow] [#191](https://github.com/ember-cli/ember-cli-deprecation-workflow/pull/191) update release plan workflow ([@mansona]) +- [ember-learn/ember-api-docs] [#919](https://github.com/ember-learn/ember-api-docs/pull/919) Merge main ([@mansona]) +- [ember-learn/ember-api-docs] [#918](https://github.com/ember-learn/ember-api-docs/pull/918) go back to using main branch for data ([@mansona]) +- [ember-learn/ember-api-docs] [#902](https://github.com/ember-learn/ember-api-docs/pull/902) use ember-showdown-shiki ([@mansona]) +- [ember-learn/ember-api-docs-data] [#25](https://github.com/ember-learn/ember-api-docs-data/pull/25) Use Markdown for all descriptions ([@mansona]) +- [ember-learn/ember-website] [#1116](https://github.com/ember-learn/ember-website/pull/1116) merge cli, typescript, and embroider teams ([@mansona]) +- [emberjs/ember-inflector] [#503](https://github.com/emberjs/ember-inflector/pull/503) start using release-plan ([@mansona]) +- [emberjs/ember-inflector] [#502](https://github.com/emberjs/ember-inflector/pull/502) Remove yarn and upgrade ember blueprint with ember-cli-update ([@mansona]) +- [mainmatter/ember-cookies] [#949](https://github.com/mainmatter/ember-cookies/pull/949) chore(deps): remove ember-data ([@BobrImperator]) +- [mainmatter/ember-cookies] [#947](https://github.com/mainmatter/ember-cookies/pull/947) chore(ci): add ember-lts-5.8 scenario ([@BobrImperator]) +- [mainmatter/ember-simple-auth] [#2804](https://github.com/mainmatter/ember-simple-auth/pull/2804) chore(lint): Migrate eslint config ([@BobrImperator]) +- [mansona/ember-cli-notifications] [#376](https://github.com/mansona/ember-cli-notifications/pull/376) update release-plan (again) ([@mansona]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@BobrImperator]: https://github.com/BobrImperator [@mansona]: https://github.com/mansona [@paoloricciuti]: https://github.com/paoloricciuti -[DazzlingFugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source +[DazzlingFugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source [SvelteLab/SvelteLab]: https://github.com/SvelteLab/SvelteLab -[ember-cli/babel-plugin-debug-macros]: - https://github.com/ember-cli/babel-plugin-debug-macros -[ember-cli/ember-cli-deprecation-workflow]: - https://github.com/ember-cli/ember-cli-deprecation-workflow -[ember-learn/ember-api-docs-data]: - https://github.com/ember-learn/ember-api-docs-data +[ember-cli/babel-plugin-debug-macros]: https://github.com/ember-cli/babel-plugin-debug-macros +[ember-cli/ember-cli-deprecation-workflow]: https://github.com/ember-cli/ember-cli-deprecation-workflow +[ember-learn/ember-api-docs-data]: https://github.com/ember-learn/ember-api-docs-data [ember-learn/ember-api-docs]: https://github.com/ember-learn/ember-api-docs -[ember-learn/ember-jsonapi-docs]: - https://github.com/ember-learn/ember-jsonapi-docs +[ember-learn/ember-jsonapi-docs]: https://github.com/ember-learn/ember-jsonapi-docs [ember-learn/ember-website]: https://github.com/ember-learn/ember-website [emberjs/ember-inflector]: https://github.com/emberjs/ember-inflector [embroider-build/embroider]: https://github.com/embroider-build/embroider @@ -118,8 +58,6 @@ [mainmatter/ember-cookies]: https://github.com/mainmatter/ember-cookies [mainmatter/ember-simple-auth]: https://github.com/mainmatter/ember-simple-auth [mainmatter/sheepdog]: https://github.com/mainmatter/sheepdog -[mansona/ember-cli-notifications]: - https://github.com/mansona/ember-cli-notifications -[snewcomer/intersection-observer-admin]: - https://github.com/snewcomer/intersection-observer-admin +[mansona/ember-cli-notifications]: https://github.com/mansona/ember-cli-notifications +[snewcomer/intersection-observer-admin]: https://github.com/snewcomer/intersection-observer-admin [sveltejs/svelte]: https://github.com/sveltejs/svelte diff --git a/src/twios/2024-07-21.md b/src/twios/2024-07-21.md index 77e6e0a76e..aedcc3b77b 100644 --- a/src/twios/2024-07-21.md +++ b/src/twios/2024-07-21.md @@ -1,133 +1,71 @@ ## Svelte -- [SvelteLab/SvelteLab] [#305](https://github.com/SvelteLab/SvelteLab/pull/305) - fix: og images using new svelte server api ([@paoloricciuti]) -- [mainmatter/sheepdog] [#129](https://github.com/mainmatter/sheepdog/pull/129) - chore: setup netlify deploy ([@paoloricciuti]) -- [mainmatter/sheepdog] [#124](https://github.com/mainmatter/sheepdog/pull/124) - feat: add Mid run cancellation guide ([@paoloricciuti]) +- [SvelteLab/SvelteLab] [#305](https://github.com/SvelteLab/SvelteLab/pull/305) fix: og images using new svelte server api ([@paoloricciuti]) +- [mainmatter/sheepdog] [#129](https://github.com/mainmatter/sheepdog/pull/129) chore: setup netlify deploy ([@paoloricciuti]) +- [mainmatter/sheepdog] [#124](https://github.com/mainmatter/sheepdog/pull/124) feat: add Mid run cancellation guide ([@paoloricciuti]) ## Embroider -- [embroider-build/app-blueprint] - [#38](https://github.com/embroider-build/app-blueprint/pull/38) add a test - that verifies that the esbuild step was successful ([@mansona]) -- [embroider-build/embroider] - [#2053](https://github.com/embroider-build/embroider/pull/2053) fix for - esbuild finding helpers and components from app-tree-merging in templates - ([@mansona]) -- [embroider-build/embroider] - [#2051](https://github.com/embroider-build/embroider/pull/2051) fix template - only components in esbuild on windows ([@mansona]) -- [embroider-build/embroider] - [#2050](https://github.com/embroider-build/embroider/pull/2050) make sure to - use a js file in a js app scenario ([@mansona]) -- [embroider-build/embroider] - [#2048](https://github.com/embroider-build/embroider/pull/2048) Fix windows - tests ([@mansona]) +- [embroider-build/app-blueprint] [#38](https://github.com/embroider-build/app-blueprint/pull/38) add a test that verifies that the esbuild step was successful ([@mansona]) +- [embroider-build/embroider] [#2053](https://github.com/embroider-build/embroider/pull/2053) fix for esbuild finding helpers and components from app-tree-merging in templates ([@mansona]) +- [embroider-build/embroider] [#2051](https://github.com/embroider-build/embroider/pull/2051) fix template only components in esbuild on windows ([@mansona]) +- [embroider-build/embroider] [#2050](https://github.com/embroider-build/embroider/pull/2050) make sure to use a js file in a js app scenario ([@mansona]) +- [embroider-build/embroider] [#2048](https://github.com/embroider-build/embroider/pull/2048) Fix windows tests ([@mansona]) ## Empress -- [empress/rfc-process-mdbook-template] - [#22](https://github.com/empress/rfc-process-mdbook-template/pull/22) use - pnpm/action-setup@v4 everywhere ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#21](https://github.com/empress/rfc-process-mdbook-template/pull/21) fix Lint - to the Future dashboard ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#20](https://github.com/empress/rfc-process-mdbook-template/pull/20) start - using release-plan ([@mansona]) -- [empress/rfc-process-mdbook-template] - [#19](https://github.com/empress/rfc-process-mdbook-template/pull/19) update - font awesome and switch to pnpm ([@mansona]) +- [empress/rfc-process-mdbook-template] [#22](https://github.com/empress/rfc-process-mdbook-template/pull/22) use pnpm/action-setup@v4 everywhere ([@mansona]) +- [empress/rfc-process-mdbook-template] [#21](https://github.com/empress/rfc-process-mdbook-template/pull/21) fix Lint to the Future dashboard ([@mansona]) +- [empress/rfc-process-mdbook-template] [#20](https://github.com/empress/rfc-process-mdbook-template/pull/20) start using release-plan ([@mansona]) +- [empress/rfc-process-mdbook-template] [#19](https://github.com/empress/rfc-process-mdbook-template/pull/19) update font awesome and switch to pnpm ([@mansona]) ## JavaScript -- [embroider-build/create-release-plan-setup] - [#127](https://github.com/embroider-build/create-release-plan-setup/pull/127) - use the latest pnpm/action-setup and don't define pnpm version if - packageManager is defined ([@mansona]) -- [embroider-build/release-plan] - [#74](https://github.com/embroider-build/release-plan/pull/74) move @types - packages to dev-dependencies ([@mansona]) -- [mansona/auto-reveal-theme-mainmatter] - [#4](https://github.com/mansona/auto-reveal-theme-mainmatter/pull/4) fix - sidebar ([@mansona]) -- [mansona/auto-reveal-theme-mainmatter] - [#2](https://github.com/mansona/auto-reveal-theme-mainmatter/pull/2) setup - release-plan ([@mansona]) -- [mansona/auto-reveal-theme-mainmatter] - [#1](https://github.com/mansona/auto-reveal-theme-mainmatter/pull/1) provide a - default highlight theme ([@mansona]) -- [mansona/layer-gen] [#7](https://github.com/mansona/layer-gen/pull/7) use - release-plan ([@mansona]) -- [mansona/layer-gen] [#6](https://github.com/mansona/layer-gen/pull/6) add - missing resolve dependency ([@mansona]) -- [pichfl/auto-reveal] [#9](https://github.com/pichfl/auto-reveal/pull/9) allow - themes to be able to provide config for initialize ([@mansona]) -- [pichfl/auto-reveal] [#8](https://github.com/pichfl/auto-reveal/pull/8) import - theme after default reveal css ([@mansona]) -- [shikijs/shiki-magic-move] - [#18](https://github.com/shikijs/shiki-magic-move/pull/18) fix: fake - transition blocking events ([@paoloricciuti]) -- [snewcomer/intersection-observer-admin] - [#58](https://github.com/snewcomer/intersection-observer-admin/pull/58) - feat(memory-leaks): remove elements from the window root ([@BobrImperator]) +- [embroider-build/create-release-plan-setup] [#127](https://github.com/embroider-build/create-release-plan-setup/pull/127) use the latest pnpm/action-setup and don't define pnpm version if packageManager is defined ([@mansona]) +- [embroider-build/release-plan] [#74](https://github.com/embroider-build/release-plan/pull/74) move @types packages to dev-dependencies ([@mansona]) +- [mansona/auto-reveal-theme-mainmatter] [#4](https://github.com/mansona/auto-reveal-theme-mainmatter/pull/4) fix sidebar ([@mansona]) +- [mansona/auto-reveal-theme-mainmatter] [#2](https://github.com/mansona/auto-reveal-theme-mainmatter/pull/2) setup release-plan ([@mansona]) +- [mansona/auto-reveal-theme-mainmatter] [#1](https://github.com/mansona/auto-reveal-theme-mainmatter/pull/1) provide a default highlight theme ([@mansona]) +- [mansona/layer-gen] [#7](https://github.com/mansona/layer-gen/pull/7) use release-plan ([@mansona]) +- [mansona/layer-gen] [#6](https://github.com/mansona/layer-gen/pull/6) add missing resolve dependency ([@mansona]) +- [pichfl/auto-reveal] [#9](https://github.com/pichfl/auto-reveal/pull/9) allow themes to be able to provide config for initialize ([@mansona]) +- [pichfl/auto-reveal] [#8](https://github.com/pichfl/auto-reveal/pull/8) import theme after default reveal css ([@mansona]) +- [shikijs/shiki-magic-move] [#18](https://github.com/shikijs/shiki-magic-move/pull/18) fix: fake transition blocking events ([@paoloricciuti]) +- [snewcomer/intersection-observer-admin] [#58](https://github.com/snewcomer/intersection-observer-admin/pull/58) feat(memory-leaks): remove elements from the window root ([@BobrImperator]) ## Mainmatter's playbook -- [mainmatter/playbook] [#207](https://github.com/mainmatter/playbook/pull/207) - Redesign ([@marcoow]) -- [mainmatter/playbook] [#181](https://github.com/mainmatter/playbook/pull/181) - Add some notes on pairing sessions ([@marcoow]) +- [mainmatter/playbook] [#207](https://github.com/mainmatter/playbook/pull/207) Redesign ([@marcoow]) +- [mainmatter/playbook] [#181](https://github.com/mainmatter/playbook/pull/181) Add some notes on pairing sessions ([@marcoow]) ## Ember -- [adopted-ember-addons/ember-sortable] - [#571](https://github.com/adopted-ember-addons/ember-sortable/pull/571) fix - demo links and turn of github pages deploy ([@mansona]) -- [bgantzler/ember-mirage] - [#41](https://github.com/bgantzler/ember-mirage/pull/41) update release-plan - ([@mansona]) -- [elwayman02/ember-resize-modifier] - [#967](https://github.com/elwayman02/ember-resize-modifier/pull/967) convert - addon to v2 ([@mansona]) -- [ember-learn/ember-api-docs] - [#922](https://github.com/ember-learn/ember-api-docs/pull/922) start using - pnpm@9 ([@mansona]) -- [ember-learn/ember-api-docs] - [#921](https://github.com/ember-learn/ember-api-docs/pull/921) update to - latest styleguide to fix the footer ([@mansona]) -- [ember-learn/ember-styleguide] - [#516](https://github.com/ember-learn/ember-styleguide/pull/516) use more - standard postcss process ([@mansona]) +- [adopted-ember-addons/ember-sortable] [#571](https://github.com/adopted-ember-addons/ember-sortable/pull/571) fix demo links and turn of github pages deploy ([@mansona]) +- [bgantzler/ember-mirage] [#41](https://github.com/bgantzler/ember-mirage/pull/41) update release-plan ([@mansona]) +- [elwayman02/ember-resize-modifier] [#967](https://github.com/elwayman02/ember-resize-modifier/pull/967) convert addon to v2 ([@mansona]) +- [ember-learn/ember-api-docs] [#922](https://github.com/ember-learn/ember-api-docs/pull/922) start using pnpm@9 ([@mansona]) +- [ember-learn/ember-api-docs] [#921](https://github.com/ember-learn/ember-api-docs/pull/921) update to latest styleguide to fix the footer ([@mansona]) +- [ember-learn/ember-styleguide] [#516](https://github.com/ember-learn/ember-styleguide/pull/516) use more standard postcss process ([@mansona]) [@BobrImperator]: https://github.com/BobrImperator [@mansona]: https://github.com/mansona [@marcoow]: https://github.com/marcoow [@paoloricciuti]: https://github.com/paoloricciuti [SvelteLab/SvelteLab]: https://github.com/SvelteLab/SvelteLab -[adopted-ember-addons/ember-sortable]: - https://github.com/adopted-ember-addons/ember-sortable +[adopted-ember-addons/ember-sortable]: https://github.com/adopted-ember-addons/ember-sortable [bgantzler/ember-mirage]: https://github.com/bgantzler/ember-mirage -[elwayman02/ember-resize-modifier]: - https://github.com/elwayman02/ember-resize-modifier +[elwayman02/ember-resize-modifier]: https://github.com/elwayman02/ember-resize-modifier [ember-learn/ember-api-docs]: https://github.com/ember-learn/ember-api-docs [ember-learn/ember-styleguide]: https://github.com/ember-learn/ember-styleguide -[embroider-build/app-blueprint]: - https://github.com/embroider-build/app-blueprint -[embroider-build/create-release-plan-setup]: - https://github.com/embroider-build/create-release-plan-setup +[embroider-build/app-blueprint]: https://github.com/embroider-build/app-blueprint +[embroider-build/create-release-plan-setup]: https://github.com/embroider-build/create-release-plan-setup [embroider-build/embroider]: https://github.com/embroider-build/embroider [embroider-build/release-plan]: https://github.com/embroider-build/release-plan -[empress/rfc-process-mdbook-template]: - https://github.com/empress/rfc-process-mdbook-template +[empress/rfc-process-mdbook-template]: https://github.com/empress/rfc-process-mdbook-template [mainmatter/playbook]: https://github.com/mainmatter/playbook [mainmatter/sheepdog]: https://github.com/mainmatter/sheepdog -[mansona/auto-reveal-theme-mainmatter]: - https://github.com/mansona/auto-reveal-theme-mainmatter +[mansona/auto-reveal-theme-mainmatter]: https://github.com/mansona/auto-reveal-theme-mainmatter [mansona/layer-gen]: https://github.com/mansona/layer-gen [pichfl/auto-reveal]: https://github.com/pichfl/auto-reveal [shikijs/shiki-magic-move]: https://github.com/shikijs/shiki-magic-move -[snewcomer/intersection-observer-admin]: - https://github.com/snewcomer/intersection-observer-admin +[snewcomer/intersection-observer-admin]: https://github.com/snewcomer/intersection-observer-admin diff --git a/src/twios/2024-07-28.md b/src/twios/2024-07-28.md index cfbc49b936..b6a873ec3b 100644 --- a/src/twios/2024-07-28.md +++ b/src/twios/2024-07-28.md @@ -1,91 +1,44 @@ ## Svelte -- [mainmatter/sheepdog] [#141](https://github.com/mainmatter/sheepdog/pull/141) - fix: avoid changing state of successful task to cancelled ([@paoloricciuti]) -- [mainmatter/sheepdog] [#137](https://github.com/mainmatter/sheepdog/pull/137) - fix: make async transform with dot notation too ([@paoloricciuti]) -- [mainmatter/sheepdog] [#132](https://github.com/mainmatter/sheepdog/pull/132) - feat: return derived state to `perform` return value ([@paoloricciuti]) -- [paoloricciuti/optimistikit] - [#19](https://github.com/paoloricciuti/optimistikit/pull/19) fix: use - `$effect.pre` instead of `$effect` in optimistikit ([@paoloricciuti]) -- [paoloricciuti/optimistikit] - [#17](https://github.com/paoloricciuti/optimistikit/pull/17) breaking: switch - main publishing line to svelte 5 ([@paoloricciuti]) -- [paoloricciuti/sveltekit-search-params] - [#98](https://github.com/paoloricciuti/sveltekit-search-params/pull/98) Update - poor-birds-dance.md ([@paoloricciuti]) -- [paoloricciuti/sveltekit-search-params] - [#89](https://github.com/paoloricciuti/sveltekit-search-params/pull/89) fix: - avoid complex values default being overriden on write ([@paoloricciuti]) -- [svecosystem/runed] [#122](https://github.com/svecosystem/runed/pull/122) fix: - avoid writing to state in media-query getter ([@paoloricciuti]) +- [mainmatter/sheepdog] [#141](https://github.com/mainmatter/sheepdog/pull/141) fix: avoid changing state of successful task to cancelled ([@paoloricciuti]) +- [mainmatter/sheepdog] [#137](https://github.com/mainmatter/sheepdog/pull/137) fix: make async transform with dot notation too ([@paoloricciuti]) +- [mainmatter/sheepdog] [#132](https://github.com/mainmatter/sheepdog/pull/132) feat: return derived state to `perform` return value ([@paoloricciuti]) +- [paoloricciuti/optimistikit] [#19](https://github.com/paoloricciuti/optimistikit/pull/19) fix: use `$effect.pre` instead of `$effect` in optimistikit ([@paoloricciuti]) +- [paoloricciuti/optimistikit] [#17](https://github.com/paoloricciuti/optimistikit/pull/17) breaking: switch main publishing line to svelte 5 ([@paoloricciuti]) +- [paoloricciuti/sveltekit-search-params] [#98](https://github.com/paoloricciuti/sveltekit-search-params/pull/98) Update poor-birds-dance.md ([@paoloricciuti]) +- [paoloricciuti/sveltekit-search-params] [#89](https://github.com/paoloricciuti/sveltekit-search-params/pull/89) fix: avoid complex values default being overriden on write ([@paoloricciuti]) +- [svecosystem/runed] [#122](https://github.com/svecosystem/runed/pull/122) fix: avoid writing to state in media-query getter ([@paoloricciuti]) ## Embroider -- [embroider-build/app-blueprint] - [#44](https://github.com/embroider-build/app-blueprint/pull/44) change - dependabot versioning strategy to increase ([@mansona]) -- [embroider-build/app-blueprint] - [#43](https://github.com/embroider-build/app-blueprint/pull/43) set - packageManager in package.json and rely on that in CI ([@mansona]) -- [embroider-build/embroider] - [#2039](https://github.com/embroider-build/embroider/pull/2039) Fix/ - static-app-test shouldn't trigger a build error - `@babel/helper-modules-imports` not found ([@BlueCutOfficial]) +- [embroider-build/app-blueprint] [#44](https://github.com/embroider-build/app-blueprint/pull/44) change dependabot versioning strategy to increase ([@mansona]) +- [embroider-build/app-blueprint] [#43](https://github.com/embroider-build/app-blueprint/pull/43) set packageManager in package.json and rely on that in CI ([@mansona]) +- [embroider-build/embroider] [#2039](https://github.com/embroider-build/embroider/pull/2039) Fix/ static-app-test shouldn't trigger a build error `@babel/helper-modules-imports` not found ([@BlueCutOfficial]) ## Empress -- [empress/field-guide] [#102](https://github.com/empress/field-guide/pull/102) - setup release-plan ([@mansona]) -- [empress/field-guide] [#101](https://github.com/empress/field-guide/pull/101) - Update dependencies, start using pnpm, and drop support for - ember-auto-import@1 ([@mansona]) +- [empress/field-guide] [#102](https://github.com/empress/field-guide/pull/102) setup release-plan ([@mansona]) +- [empress/field-guide] [#101](https://github.com/empress/field-guide/pull/101) Update dependencies, start using pnpm, and drop support for ember-auto-import@1 ([@mansona]) ## JavaScript -- [mansona/Downsize] [#9](https://github.com/mansona/Downsize/pull/9) setup - release-plan ([@mansona]) -- [mansona/Downsize] [#8](https://github.com/mansona/Downsize/pull/8) improve - esm-cjs co-deploy ([@mansona]) -- [mansona/auto-reveal-theme-mainmatter] - [#6](https://github.com/mansona/auto-reveal-theme-mainmatter/pull/6) go back - to having a smaller sidebar ([@mansona]) -- [pichfl/auto-reveal] [#12](https://github.com/pichfl/auto-reveal/pull/12) - Remove deprecation from import.meta.glob ([@pichfl]) +- [mansona/Downsize] [#9](https://github.com/mansona/Downsize/pull/9) setup release-plan ([@mansona]) +- [mansona/Downsize] [#8](https://github.com/mansona/Downsize/pull/8) improve esm-cjs co-deploy ([@mansona]) +- [mansona/auto-reveal-theme-mainmatter] [#6](https://github.com/mansona/auto-reveal-theme-mainmatter/pull/6) go back to having a smaller sidebar ([@mansona]) +- [pichfl/auto-reveal] [#12](https://github.com/pichfl/auto-reveal/pull/12) Remove deprecation from import.meta.glob ([@pichfl]) ## Ember -- [ember-learn/deprecation-app] - [#1390](https://github.com/ember-learn/deprecation-app/pull/1390) update node - version and use pnpm ([@mansona]) -- [ember-learn/ember-api-docs] - [#926](https://github.com/ember-learn/ember-api-docs/pull/926) Merge main into - website redesign ([@mansona]) -- [ember-learn/ember-api-docs] - [#924](https://github.com/ember-learn/ember-api-docs/pull/924) Update ember - globals ([@mansona]) -- [ember-learn/ember-api-docs] - [#923](https://github.com/ember-learn/ember-api-docs/pull/923) stop requesting - mappings over the network and fix shoebox usage ([@mansona]) -- [ember-learn/ember-website] - [#1120](https://github.com/ember-learn/ember-website/pull/1120) add - ember-data-fastboot to enable the shoebox across the site ([@mansona]) -- [ember-learn/ember-website] - [#805](https://github.com/ember-learn/ember-website/pull/805) add ability to - link to a particular mascot ([@mansona]) -- [emberjs/ember-inflector] - [#499](https://github.com/emberjs/ember-inflector/pull/499) convert to a v2 - addon using ember init ([@mansona]) -- [mansona/ember-html-excerpt] - [#9](https://github.com/mansona/ember-html-excerpt/pull/9) move test to tests - folder ([@mansona]) -- [mansona/ember-html-excerpt] - [#7](https://github.com/mansona/ember-html-excerpt/pull/7) setup release-plan - ([@mansona]) -- [mansona/ember-html-excerpt] - [#6](https://github.com/mansona/ember-html-excerpt/pull/6) upgrade to v2 - ([@mansona]) +- [ember-learn/deprecation-app] [#1390](https://github.com/ember-learn/deprecation-app/pull/1390) update node version and use pnpm ([@mansona]) +- [ember-learn/ember-api-docs] [#926](https://github.com/ember-learn/ember-api-docs/pull/926) Merge main into website redesign ([@mansona]) +- [ember-learn/ember-api-docs] [#924](https://github.com/ember-learn/ember-api-docs/pull/924) Update ember globals ([@mansona]) +- [ember-learn/ember-api-docs] [#923](https://github.com/ember-learn/ember-api-docs/pull/923) stop requesting mappings over the network and fix shoebox usage ([@mansona]) +- [ember-learn/ember-website] [#1120](https://github.com/ember-learn/ember-website/pull/1120) add ember-data-fastboot to enable the shoebox across the site ([@mansona]) +- [ember-learn/ember-website] [#805](https://github.com/ember-learn/ember-website/pull/805) add ability to link to a particular mascot ([@mansona]) +- [emberjs/ember-inflector] [#499](https://github.com/emberjs/ember-inflector/pull/499) convert to a v2 addon using ember init ([@mansona]) +- [mansona/ember-html-excerpt] [#9](https://github.com/mansona/ember-html-excerpt/pull/9) move test to tests folder ([@mansona]) +- [mansona/ember-html-excerpt] [#7](https://github.com/mansona/ember-html-excerpt/pull/7) setup release-plan ([@mansona]) +- [mansona/ember-html-excerpt] [#6](https://github.com/mansona/ember-html-excerpt/pull/6) upgrade to v2 ([@mansona]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@BobrImperator]: https://github.com/BobrImperator @@ -97,20 +50,16 @@ [ember-learn/ember-api-docs]: https://github.com/ember-learn/ember-api-docs [ember-learn/ember-website]: https://github.com/ember-learn/ember-website [emberjs/ember-inflector]: https://github.com/emberjs/ember-inflector -[embroider-build/app-blueprint]: - https://github.com/embroider-build/app-blueprint +[embroider-build/app-blueprint]: https://github.com/embroider-build/app-blueprint [embroider-build/embroider]: https://github.com/embroider-build/embroider [empress/field-guide]: https://github.com/empress/field-guide [mainmatter/sheepdog]: https://github.com/mainmatter/sheepdog -[mainmatter/weplan-ember-workshop]: - https://github.com/mainmatter/weplan-ember-workshop +[mainmatter/weplan-ember-workshop]: https://github.com/mainmatter/weplan-ember-workshop [mainmatter/whirlwind-chat]: https://github.com/mainmatter/whirlwind-chat [mansona/Downsize]: https://github.com/mansona/Downsize -[mansona/auto-reveal-theme-mainmatter]: - https://github.com/mansona/auto-reveal-theme-mainmatter +[mansona/auto-reveal-theme-mainmatter]: https://github.com/mansona/auto-reveal-theme-mainmatter [mansona/ember-html-excerpt]: https://github.com/mansona/ember-html-excerpt [paoloricciuti/optimistikit]: https://github.com/paoloricciuti/optimistikit -[paoloricciuti/sveltekit-search-params]: - https://github.com/paoloricciuti/sveltekit-search-params +[paoloricciuti/sveltekit-search-params]: https://github.com/paoloricciuti/sveltekit-search-params [pichfl/auto-reveal]: https://github.com/pichfl/auto-reveal [svecosystem/runed]: https://github.com/svecosystem/runed diff --git a/src/twios/2024-08-04.md b/src/twios/2024-08-04.md index cf049b3e57..097753b10c 100644 --- a/src/twios/2024-08-04.md +++ b/src/twios/2024-08-04.md @@ -1,62 +1,34 @@ ## Svelte -- [mainmatter/sheepdog] [#151](https://github.com/mainmatter/sheepdog/pull/151) - fix: monorepo settings ([@paoloricciuti]) -- [mainmatter/sheepdog] [#147](https://github.com/mainmatter/sheepdog/pull/147) - chore: upgrade `typescript-eslint` ([@paoloricciuti]) -- [paoloricciuti/optimistikit] - [#22](https://github.com/paoloricciuti/optimistikit/pull/22) chore: less flaky - tests ([@paoloricciuti]) -- [paoloricciuti/optimistikit] - [#19](https://github.com/paoloricciuti/optimistikit/pull/19) fix: use - `$effect.pre` instead of `$effect` in optimistikit ([@paoloricciuti]) -- [paoloricciuti/optimistikit] - [#17](https://github.com/paoloricciuti/optimistikit/pull/17) breaking: switch - main publishing line to svelte 5 ([@paoloricciuti]) -- [paoloricciuti/sveltekit-search-params] - [#98](https://github.com/paoloricciuti/sveltekit-search-params/pull/98) Update - poor-birds-dance.md ([@paoloricciuti]) -- [paoloricciuti/sveltekit-search-params] - [#89](https://github.com/paoloricciuti/sveltekit-search-params/pull/89) fix: - avoid complex values default being overriden on write ([@paoloricciuti]) -- [sveltejs/kit] [#12524](https://github.com/sveltejs/kit/pull/12524) fix: - ignore warning binding non reactive ([@paoloricciuti]) -- [sveltejs/svelte] [#12715](https://github.com/sveltejs/svelte/pull/12715) fix: - add css hash to custom element rendered with `svelte:element` - ([@paoloricciuti]) -- [sveltejs/svelte] [#12704](https://github.com/sveltejs/svelte/pull/12704) fix: - maintain imports in modules ([@paoloricciuti]) -- [sveltejs/svelte] [#12692](https://github.com/sveltejs/svelte/pull/12692) - feat: function called as tagged template literal is reactively called - ([@paoloricciuti]) -- [sveltejs/svelte] [#12660](https://github.com/sveltejs/svelte/pull/12660) - feat: allow for `svelte:options` css injected ([@paoloricciuti]) -- [sveltejs/svelte] [#12649](https://github.com/sveltejs/svelte/pull/12649) fix: - always set draggable through `setAttribute` to avoid weird behavior - ([@paoloricciuti]) -- [sveltejs/svelte] [#12608](https://github.com/sveltejs/svelte/pull/12608) - feat: allow ignoring runtime warnings ([@paoloricciuti]) +- [mainmatter/sheepdog] [#151](https://github.com/mainmatter/sheepdog/pull/151) fix: monorepo settings ([@paoloricciuti]) +- [mainmatter/sheepdog] [#147](https://github.com/mainmatter/sheepdog/pull/147) chore: upgrade `typescript-eslint` ([@paoloricciuti]) +- [paoloricciuti/optimistikit] [#22](https://github.com/paoloricciuti/optimistikit/pull/22) chore: less flaky tests ([@paoloricciuti]) +- [paoloricciuti/optimistikit] [#19](https://github.com/paoloricciuti/optimistikit/pull/19) fix: use `$effect.pre` instead of `$effect` in optimistikit ([@paoloricciuti]) +- [paoloricciuti/optimistikit] [#17](https://github.com/paoloricciuti/optimistikit/pull/17) breaking: switch main publishing line to svelte 5 ([@paoloricciuti]) +- [paoloricciuti/sveltekit-search-params] [#98](https://github.com/paoloricciuti/sveltekit-search-params/pull/98) Update poor-birds-dance.md ([@paoloricciuti]) +- [paoloricciuti/sveltekit-search-params] [#89](https://github.com/paoloricciuti/sveltekit-search-params/pull/89) fix: avoid complex values default being overriden on write ([@paoloricciuti]) +- [sveltejs/kit] [#12524](https://github.com/sveltejs/kit/pull/12524) fix: ignore warning binding non reactive ([@paoloricciuti]) +- [sveltejs/svelte] [#12715](https://github.com/sveltejs/svelte/pull/12715) fix: add css hash to custom element rendered with `svelte:element` ([@paoloricciuti]) +- [sveltejs/svelte] [#12704](https://github.com/sveltejs/svelte/pull/12704) fix: maintain imports in modules ([@paoloricciuti]) +- [sveltejs/svelte] [#12692](https://github.com/sveltejs/svelte/pull/12692) feat: function called as tagged template literal is reactively called ([@paoloricciuti]) +- [sveltejs/svelte] [#12660](https://github.com/sveltejs/svelte/pull/12660) feat: allow for `svelte:options` css injected ([@paoloricciuti]) +- [sveltejs/svelte] [#12649](https://github.com/sveltejs/svelte/pull/12649) fix: always set draggable through `setAttribute` to avoid weird behavior ([@paoloricciuti]) +- [sveltejs/svelte] [#12608](https://github.com/sveltejs/svelte/pull/12608) feat: allow ignoring runtime warnings ([@paoloricciuti]) ## Embroider -- [embroider-build/embroider] - [#2028](https://github.com/embroider-build/embroider/pull/2028) Rename - #embroider_compat/_ to @embroider/virtual/_ ([@BlueCutOfficial]) +- [embroider-build/embroider] [#2028](https://github.com/embroider-build/embroider/pull/2028) Rename `#embroider_compat/*` to `@embroider/virtual/*` ([@BlueCutOfficial]) ## Ember -- [DazzlingFugu/ember-fr-guides-source] - [#246](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/246) - Translate `guides/upgrading/index.md` ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#246](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/246) Translate `guides/upgrading/index.md` ([@BlueCutOfficial]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@paoloricciuti]: https://github.com/paoloricciuti -[DazzlingFugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source +[DazzlingFugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source [embroider-build/embroider]: https://github.com/embroider-build/embroider [mainmatter/sheepdog]: https://github.com/mainmatter/sheepdog [paoloricciuti/optimistikit]: https://github.com/paoloricciuti/optimistikit -[paoloricciuti/sveltekit-search-params]: - https://github.com/paoloricciuti/sveltekit-search-params +[paoloricciuti/sveltekit-search-params]: https://github.com/paoloricciuti/sveltekit-search-params [sveltejs/kit]: https://github.com/sveltejs/kit [sveltejs/svelte]: https://github.com/sveltejs/svelte diff --git a/src/twios/2024-08-11.md b/src/twios/2024-08-11.md index 107ec1f95b..0cb018487b 100644 --- a/src/twios/2024-08-11.md +++ b/src/twios/2024-08-11.md @@ -1,84 +1,47 @@ ## Svelte -- [mainmatter/sheepdog] [#142](https://github.com/mainmatter/sheepdog/pull/142) - docs: async transform explainer ([@paoloricciuti]) -- [paoloricciuti/optimistikit] - [#36](https://github.com/paoloricciuti/optimistikit/pull/36) fix: correct peer - dependencies ([@paoloricciuti]) -- [sveltejs/svelte] [#12763](https://github.com/sveltejs/svelte/pull/12763) fix: - order of arguments for `push_element` in `svelte:element` ([@paoloricciuti]) +- [mainmatter/sheepdog] [#142](https://github.com/mainmatter/sheepdog/pull/142) docs: async transform explainer ([@paoloricciuti]) +- [paoloricciuti/optimistikit] [#36](https://github.com/paoloricciuti/optimistikit/pull/36) fix: correct peer dependencies ([@paoloricciuti]) +- [sveltejs/svelte] [#12763](https://github.com/sveltejs/svelte/pull/12763) fix: order of arguments for `push_element` in `svelte:element` ([@paoloricciuti]) ## Embroider -- [embroider-build/app-blueprint] - [#50](https://github.com/embroider-build/app-blueprint/pull/50) add git ignore - for tmp file ([@mansona]) -- [embroider-build/embroider] - [#1936](https://github.com/embroider-build/embroider/pull/1936) remove - auto-upgraded from app package.json and add a basic exports block ([@mansona]) +- [embroider-build/app-blueprint] [#50](https://github.com/embroider-build/app-blueprint/pull/50) add git ignore for tmp file ([@mansona]) +- [embroider-build/embroider] [#1936](https://github.com/embroider-build/embroider/pull/1936) remove auto-upgraded from app package.json and add a basic exports block ([@mansona]) ## Internal -- [mainmatter/mainmatter-website-mailer] - [#38](https://github.com/mainmatter/mainmatter-website-mailer/pull/38) fix - handling of company name ([@marcoow]) -- [mainmatter/mainmatter-website-mailer] - [#37](https://github.com/mainmatter/mainmatter-website-mailer/pull/37) send - company name in sender name if present ([@marcoow]) -- [mainmatter/mainmatter-website-mailer] - [#36](https://github.com/mainmatter/mainmatter-website-mailer/pull/36) accept - optional company ([@marcoow]) +- [mainmatter/mainmatter-website-mailer] [#38](https://github.com/mainmatter/mainmatter-website-mailer/pull/38) fix handling of company name ([@marcoow]) +- [mainmatter/mainmatter-website-mailer] [#37](https://github.com/mainmatter/mainmatter-website-mailer/pull/37) send company name in sender name if present ([@marcoow]) +- [mainmatter/mainmatter-website-mailer] [#36](https://github.com/mainmatter/mainmatter-website-mailer/pull/36) accept optional company ([@marcoow]) ## Ember -- [DazzlingFugu/ember-fr-guides-source] - [#246](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/246) - Translate `guides/upgrading/index.md` ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#246](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/246) Translate `guides/upgrading/index.md` ([@BlueCutOfficial]) ## Unknown -- [mainmatter/auto-reveal] - [#33](https://github.com/mainmatter/auto-reveal/pull/33) Use relative base - root for Vite ([@pichfl]) -- [mainmatter/auto-reveal] - [#32](https://github.com/mainmatter/auto-reveal/pull/32) Add argument for - output directory ([@pichfl]) -- [mainmatter/auto-reveal] - [#29](https://github.com/mainmatter/auto-reveal/pull/29) Update dependencies - ([@pichfl]) -- [mainmatter/auto-reveal] - [#28](https://github.com/mainmatter/auto-reveal/pull/28) Internal: Add Lint - action ([@pichfl]) -- [mainmatter/auto-reveal] - [#25](https://github.com/mainmatter/auto-reveal/pull/25) Update README with - License and Copyright ([@pichfl]) -- [mainmatter/auto-reveal] - [#30](https://github.com/mainmatter/auto-reveal/pull/30) fix the trigger for - the lint CI job ([@mansona]) -- [mainmatter/auto-reveal] - [#18](https://github.com/mainmatter/auto-reveal/pull/18) update release-plan - ([@mansona]) -- [mainmatter/auto-reveal-theme-mainmatter] - [#8](https://github.com/mainmatter/auto-reveal-theme-mainmatter/pull/8) update - release-plan ([@mansona]) -- [web-and-wine/talks] [#229](https://github.com/web-and-wine/talks/pull/229) - Add Juli 2024 talks ([@pichfl]) +- [mainmatter/auto-reveal] [#33](https://github.com/mainmatter/auto-reveal/pull/33) Use relative base root for Vite ([@pichfl]) +- [mainmatter/auto-reveal] [#32](https://github.com/mainmatter/auto-reveal/pull/32) Add argument for output directory ([@pichfl]) +- [mainmatter/auto-reveal] [#29](https://github.com/mainmatter/auto-reveal/pull/29) Update dependencies ([@pichfl]) +- [mainmatter/auto-reveal] [#28](https://github.com/mainmatter/auto-reveal/pull/28) Internal: Add Lint action ([@pichfl]) +- [mainmatter/auto-reveal] [#25](https://github.com/mainmatter/auto-reveal/pull/25) Update README with License and Copyright ([@pichfl]) +- [mainmatter/auto-reveal] [#30](https://github.com/mainmatter/auto-reveal/pull/30) fix the trigger for the lint CI job ([@mansona]) +- [mainmatter/auto-reveal] [#18](https://github.com/mainmatter/auto-reveal/pull/18) update release-plan ([@mansona]) +- [mainmatter/auto-reveal-theme-mainmatter] [#8](https://github.com/mainmatter/auto-reveal-theme-mainmatter/pull/8) update release-plan ([@mansona]) +- [web-and-wine/talks] [#229](https://github.com/web-and-wine/talks/pull/229) Add Juli 2024 talks ([@pichfl]) [@BlueCutOfficial]: https://github.com/BlueCutOfficial [@mansona]: https://github.com/mansona [@marcoow]: https://github.com/marcoow [@paoloricciuti]: https://github.com/paoloricciuti [@pichfl]: https://github.com/pichfl -[DazzlingFugu/ember-fr-guides-source]: - https://github.com/DazzlingFugu/ember-fr-guides-source -[embroider-build/app-blueprint]: - https://github.com/embroider-build/app-blueprint +[DazzlingFugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source +[embroider-build/app-blueprint]: https://github.com/embroider-build/app-blueprint [embroider-build/embroider]: https://github.com/embroider-build/embroider -[mainmatter/auto-reveal-theme-mainmatter]: - https://github.com/mainmatter/auto-reveal-theme-mainmatter +[mainmatter/auto-reveal-theme-mainmatter]: https://github.com/mainmatter/auto-reveal-theme-mainmatter [mainmatter/auto-reveal]: https://github.com/mainmatter/auto-reveal -[mainmatter/mainmatter-website-mailer]: - https://github.com/mainmatter/mainmatter-website-mailer +[mainmatter/mainmatter-website-mailer]: https://github.com/mainmatter/mainmatter-website-mailer [mainmatter/sheepdog]: https://github.com/mainmatter/sheepdog [paoloricciuti/optimistikit]: https://github.com/paoloricciuti/optimistikit [sveltejs/svelte]: https://github.com/sveltejs/svelte diff --git a/src/twios/2024-09-01.md b/src/twios/2024-09-01.md new file mode 100644 index 0000000000..40a3af8560 --- /dev/null +++ b/src/twios/2024-09-01.md @@ -0,0 +1,24 @@ +## Svelte + +- [mainmatter/sheepdog] [#167](https://github.com/mainmatter/sheepdog/pull/167) update gravity cli to v0.0.2 ([@oscard0m]) + +## Embroider + +- [embroider-build/app-blueprint] [#57](https://github.com/embroider-build/app-blueprint/pull/57) add fixes for new test structure ([@mansona]) +- [embroider-build/embroider] [#2089](https://github.com/embroider-build/embroider/pull/2089) add required fixes to keep-app-dir PR ([@mansona]) +- [embroider-build/embroider] [#2079](https://github.com/embroider-build/embroider/pull/2079) add test fixes for no-test-entrypoint branch ([@mansona]) + +## Ember + +- [DazzlingFugu/ember-fr-guides-source] [#250](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/250) Translate `guides/components/looping-through-lists.md` ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#249](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/249) Translate `guides/components/components-arguments-and-html-attributes.md` ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#248](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/248) Translate `guides/code-editors/index.md` ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#247](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/247) Translate `guides/applications/run-loop.md` ([@BlueCutOfficial]) + +[@BlueCutOfficial]: https://github.com/BlueCutOfficial +[@mansona]: https://github.com/mansona +[@oscard0m]: https://github.com/oscard0m +[DazzlingFugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source +[embroider-build/app-blueprint]: https://github.com/embroider-build/app-blueprint +[embroider-build/embroider]: https://github.com/embroider-build/embroider +[mainmatter/sheepdog]: https://github.com/mainmatter/sheepdog diff --git a/src/twios/2024-09-08.md b/src/twios/2024-09-08.md new file mode 100644 index 0000000000..99d6acb73b --- /dev/null +++ b/src/twios/2024-09-08.md @@ -0,0 +1,28 @@ +## Svelte + +- [mainmatter/sheepdog] [#171](https://github.com/mainmatter/sheepdog/pull/171) chore: prepare script + renovate config ([@paoloricciuti]) +- [mainmatter/sheepdog] [#156](https://github.com/mainmatter/sheepdog/pull/156) docs: start building the reference docs ([@paoloricciuti]) +- [sveltejs/svelte] [#13151](https://github.com/sveltejs/svelte/pull/13151) fix: visit expression for `svelte:component` references ([@paoloricciuti]) +- [sveltejs/svelte] [#13113](https://github.com/sveltejs/svelte/pull/13113) fix: remove unnecessary update assignments ([@paoloricciuti]) +- [sveltejs/svelte] [#13097](https://github.com/sveltejs/svelte/pull/13097) fix: error on duplicate style and class directive ([@paoloricciuti]) +- [sveltejs/svelte] [#13082](https://github.com/sveltejs/svelte/pull/13082) fix: hoist imports on top ([@paoloricciuti]) + +## Embroider + +- [embroider-build/app-blueprint] [#65](https://github.com/embroider-build/app-blueprint/pull/65) update to work without app rewriting ([@mansona]) +- [embroider-build/app-blueprint] [#62](https://github.com/embroider-build/app-blueprint/pull/62) move the index.html into the root of the blueprint ([@mansona]) +- [embroider-build/embroider] [#2089](https://github.com/embroider-build/embroider/pull/2089) add required fixes to keep-app-dir PR ([@mansona]) + +## Ember + +- [DazzlingFugu/ember-fr-guides-source] [#252](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/252) Translate `guides/components/index.md` ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#244](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/244) Translate `guides/tutorial/part-2/route-params` ([@BlueCutOfficial]) + +[@BlueCutOfficial]: https://github.com/BlueCutOfficial +[@mansona]: https://github.com/mansona +[@paoloricciuti]: https://github.com/paoloricciuti +[DazzlingFugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source +[embroider-build/app-blueprint]: https://github.com/embroider-build/app-blueprint +[embroider-build/embroider]: https://github.com/embroider-build/embroider +[mainmatter/sheepdog]: https://github.com/mainmatter/sheepdog +[sveltejs/svelte]: https://github.com/sveltejs/svelte diff --git a/src/twios/2024-10-06.md b/src/twios/2024-10-06.md new file mode 100644 index 0000000000..e50350775a --- /dev/null +++ b/src/twios/2024-10-06.md @@ -0,0 +1,101 @@ +## Rust + +- [mainmatter/100-exercises-to-learn-rust] [#159](https://github.com/mainmatter/100-exercises-to-learn-rust/pull/159) simplify ebook styling ([@marcoow]) +- [mainmatter/gerust] [#99](https://github.com/mainmatter/gerust/pull/99) rename pacesetter to gerust ([@marcoow]) +- [mainmatter/gerust] [#49](https://github.com/mainmatter/gerust/pull/49) Add code docs ([@marcoow]) + +## Svelte + +- [animotionjs/animotion] [#44](https://github.com/animotionjs/animotion/pull/44) fix: import `defineProps` separately to allow import in module ([@paoloricciuti]) +- [mainmatter/sheepdog] [#184](https://github.com/mainmatter/sheepdog/pull/184) Landing page demo integration ([@nickschot]) +- [mainmatter/sheepdog] [#158](https://github.com/mainmatter/sheepdog/pull/158) docs: add task modifier explainer ([@paoloricciuti]) +- [sveltejs/kit] [#12749](https://github.com/sveltejs/kit/pull/12749) feat: pass filename to `migrate` ([@paoloricciuti]) +- [sveltejs/svelte] [#13504](https://github.com/sveltejs/svelte/pull/13504) feat: migrate `svelte:self` ([@paoloricciuti]) +- [sveltejs/svelte] [#13484](https://github.com/sveltejs/svelte/pull/13484) fix: migrate `$$Props` without creating non existent props ([@paoloricciuti]) +- [sveltejs/svelte] [#13480](https://github.com/sveltejs/svelte/pull/13480) fix: move labeled statements that need reordering after props insertion point ([@paoloricciuti]) +- [sveltejs/svelte] [#13479](https://github.com/sveltejs/svelte/pull/13479) feat: support migration of self closing tags ([@paoloricciuti]) +- [sveltejs/svelte] [#13473](https://github.com/sveltejs/svelte/pull/13473) fix: various `svelte:component` migration bugs ([@paoloricciuti]) +- [sveltejs/svelte] [#13468](https://github.com/sveltejs/svelte/pull/13468) fix: correctly migrate `$$slots` with bracket member expressions & slots with static props ([@paoloricciuti]) +- [sveltejs/svelte] [#13461](https://github.com/sveltejs/svelte/pull/13461) feat: support migration of single assignment labeled statements ([@paoloricciuti]) +- [sveltejs/svelte] [#13456](https://github.com/sveltejs/svelte/pull/13456) feat: fix accessors and support migration of accessors ([@paoloricciuti]) +- [sveltejs/svelte] [#13437](https://github.com/sveltejs/svelte/pull/13437) feat: support migration of `svelte:component` ([@paoloricciuti]) +- [sveltejs/svelte] [#13424](https://github.com/sveltejs/svelte/pull/13424) chore: refactor migration composition logic ([@paoloricciuti]) + +## Embroider + +- [embroider-build/app-blueprint] [#96](https://github.com/embroider-build/app-blueprint/pull/96) fix all @embroider/virtual renames ([@mansona]) + +## Lint to the future + +- [mansona/lint-to-the-future] [#44](https://github.com/mansona/lint-to-the-future/pull/44) add lttf alias ([@mansona]) +- [mansona/lint-to-the-future] [#43](https://github.com/mansona/lint-to-the-future/pull/43) Add prettier setup ([@mansona]) +- [mansona/lint-to-the-future] [#41](https://github.com/mansona/lint-to-the-future/pull/41) move output command test to its own file ([@mansona]) +- [mansona/lint-to-the-future] [#40](https://github.com/mansona/lint-to-the-future/pull/40) setup release-plan ([@mansona]) +- [mansona/lint-to-the-future] [#39](https://github.com/mansona/lint-to-the-future/pull/39) switch to pnpm ([@mansona]) +- [mansona/lint-to-the-future] [#48](https://github.com/mansona/lint-to-the-future/pull/48) Accept rule names with colon. ([@Mikek2252]) +- [mansona/lint-to-the-future] [#47](https://github.com/mansona/lint-to-the-future/pull/47) Hide completed rules ([@Mikek2252]) +- [mansona/lint-to-the-future] [#45](https://github.com/mansona/lint-to-the-future/pull/45) Upgrade LTTF Dashboard app to ember 5 ([@Mikek2252]) +- [mansona/lint-to-the-future] [#36](https://github.com/mansona/lint-to-the-future/pull/36) Add remove command to lint-to-the-future ([@Mikek2252]) +- [mansona/lint-to-the-future-eslint] [#30](https://github.com/mansona/lint-to-the-future-eslint/pull/30) Support shebang files ([@mansona]) +- [mansona/lint-to-the-future-eslint] [#28](https://github.com/mansona/lint-to-the-future-eslint/pull/28) use the right name for filter ([@mansona]) +- [mansona/lint-to-the-future-eslint] [#26](https://github.com/mansona/lint-to-the-future-eslint/pull/26) remove npmrc ([@mansona]) +- [mansona/lint-to-the-future-eslint] [#24](https://github.com/mansona/lint-to-the-future-eslint/pull/24) use release-plan ([@mansona]) +- [mansona/lint-to-the-future-eslint] [#23](https://github.com/mansona/lint-to-the-future-eslint/pull/23) move list test to fixturify-project ([@mansona]) +- [mansona/lint-to-the-future-eslint] [#22](https://github.com/mansona/lint-to-the-future-eslint/pull/22) swap to eslint recommended ([@mansona]) +- [mansona/lint-to-the-future-eslint] [#21](https://github.com/mansona/lint-to-the-future-eslint/pull/21) add remove api ([@mansona]) +- [mansona/lint-to-the-future-eslint] [#20](https://github.com/mansona/lint-to-the-future-eslint/pull/20) swap to fixturify project ([@mansona]) +- [mansona/lint-to-the-future-eslint] [#19](https://github.com/mansona/lint-to-the-future-eslint/pull/19) add prettier ([@mansona]) +- [mansona/lint-to-the-future-eslint] [#18](https://github.com/mansona/lint-to-the-future-eslint/pull/18) swap to pnpm ([@mansona]) + +## JavaScript + +- [formatjs/formatjs] [#4543](https://github.com/formatjs/formatjs/pull/4543) Fix(@formatjs/cli-lib): add newline to compiled file, fix #4539 ([@BlueCutOfficial]) +- [vitejs/vite] [#18269](https://github.com/vitejs/vite/pull/18269) docs: add Ember logo to the frameworks ([@mansona]) + +## Octokit + +- [octokit/action.js] [#648](https://github.com/octokit/action.js/pull/648) build: switch to vitest ([@oscard0m]) +- [octokit/auth-app.js] [#648](https://github.com/octokit/auth-app.js/pull/648) build: switch to vitest and fetch-mock v11 ([@oscard0m]) +- [octokit/plugin-create-or-update-text-file.js] [#293](https://github.com/octokit/plugin-create-or-update-text-file.js/pull/293) build: switch to vitest ([@oscard0m]) + +## Ember + +- [DazzlingFugu/ember-fr-guides-source] [#276](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/276) Automatic catch up from 5.4 to 5.11 ([@BlueCutOfficial]) +- [DazzlingFugu/ember-fr-guides-source] [#253](https://github.com/DazzlingFugu/ember-fr-guides-source/pull/253) New nicer version of the catchup script ([@BlueCutOfficial]) +- [adopted-ember-addons/ember-paper] [#1255](https://github.com/adopted-ember-addons/ember-paper/pull/1255) update lint-to-the-future ([@mansona]) +- [adopted-ember-addons/ember-paper] [#1253](https://github.com/adopted-ember-addons/ember-paper/pull/1253) update lttf dashbaord ([@mansona]) +- [adopted-ember-addons/ember-paper] [#1252](https://github.com/adopted-ember-addons/ember-paper/pull/1252) run ember-component-template-colocation-migrator ([@mansona]) +- [adopted-ember-addons/ember-paper] [#1250](https://github.com/adopted-ember-addons/ember-paper/pull/1250) Re-enable the Prettier eslint plugin ([@mansona]) +- [ember-codemods/tagless-ember-components-codemod] [#199](https://github.com/ember-codemods/tagless-ember-components-codemod/pull/199) start using release-plan ([@mansona]) +- [ember-codemods/tagless-ember-components-codemod] [#198](https://github.com/ember-codemods/tagless-ember-components-codemod/pull/198) add basic support for mixins on native classes ([@mansona]) +- [ember-codemods/tagless-ember-components-codemod] [#197](https://github.com/ember-codemods/tagless-ember-components-codemod/pull/197) swap to pnpm ([@mansona]) +- [ember-codemods/tagless-ember-components-codemod] [#196](https://github.com/ember-codemods/tagless-ember-components-codemod/pull/196) drop support for node < 18 ([@mansona]) +- [zeppelin/ember-click-outside] [#268](https://github.com/zeppelin/ember-click-outside/pull/268) Fix package description ([@zeppelin]) +- [zeppelin/ember-click-outside] [#267](https://github.com/zeppelin/ember-click-outside/pull/267) Remove usage of deprecated `action` helper in tests ([@zeppelin]) + +[@BlueCutOfficial]: https://github.com/BlueCutOfficial +[@Mikek2252]: https://github.com/Mikek2252 +[@mansona]: https://github.com/mansona +[@marcoow]: https://github.com/marcoow +[@nickschot]: https://github.com/nickschot +[@oscard0m]: https://github.com/oscard0m +[@paoloricciuti]: https://github.com/paoloricciuti +[@zeppelin]: https://github.com/zeppelin +[DazzlingFugu/ember-fr-guides-source]: https://github.com/DazzlingFugu/ember-fr-guides-source +[adopted-ember-addons/ember-paper]: https://github.com/adopted-ember-addons/ember-paper +[animotionjs/animotion]: https://github.com/animotionjs/animotion +[ember-codemods/tagless-ember-components-codemod]: https://github.com/ember-codemods/tagless-ember-components-codemod +[embroider-build/app-blueprint]: https://github.com/embroider-build/app-blueprint +[formatjs/formatjs]: https://github.com/formatjs/formatjs +[mainmatter/100-exercises-to-learn-rust]: https://github.com/mainmatter/100-exercises-to-learn-rust +[mainmatter/gerust]: https://github.com/mainmatter/gerust +[mainmatter/sheepdog]: https://github.com/mainmatter/sheepdog +[mansona/lint-to-the-future-eslint]: https://github.com/mansona/lint-to-the-future-eslint +[mansona/lint-to-the-future]: https://github.com/mansona/lint-to-the-future +[octokit/action.js]: https://github.com/octokit/action.js +[octokit/auth-app.js]: https://github.com/octokit/auth-app.js +[octokit/plugin-create-or-update-text-file.js]: https://github.com/octokit/plugin-create-or-update-text-file.js +[sveltejs/kit]: https://github.com/sveltejs/kit +[sveltejs/svelte]: https://github.com/sveltejs/svelte +[vitejs/vite]: https://github.com/vitejs/vite +[zeppelin/ember-click-outside]: https://github.com/zeppelin/ember-click-outside diff --git a/src/web-based-services-in-rust-workshop.njk b/src/web-based-services-in-rust-workshop.njk deleted file mode 100644 index 9abb532569..0000000000 --- a/src/web-based-services-in-rust-workshop.njk +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: "Workshop: Web-based Services in Rust" -description: "Three half-days workshop with Stefan Baumgartner that teaches developing web applications and web services in Rust." -layout: false -og: - image: /assets/images/web-based-services-in-rust-workshop/og-image.jpg ---- - -{% from "author-socials.njk" import authorSocials %} -{% from "image-aspect-ratio.njk" import imageAspectRatio %} -{% from "scroll-slides.njk" import scrollSlides %} -{% from "quote.njk" import quote %} -{% from "color-hero.njk" import colorHero %} -{% from "strategy-list.njk" import strategyList %} -{% from "cta-banner.njk" import ctaBanner %} -{% from "btn-tito.njk" import btnTito %} - - - - - - - {{ title }} - {% include "global/fonts.njk" %} - - - - {% block head %}{{ head | safe }}{% endblock %} - {% include "global/meta.njk" %} - {% include "global/icons.njk" %} - - - - - - - - - - -
    - {% - set 'hero' = { - "eyebrow": 'Remote Workshop', - "title": 'Web-based Services in Rust', - "text": '
    11.-13. (14:00 - 18:00 CEST) July 2023
    -
    11.-13. (14:00 - 18:00 CEST) July 2023 -
    ' - } - %} - {{ colorHero('purple', hero) }} - {% - set 'content' = { - "title": "This workshop has already taken place", - "text": "Take a look at our wide range of workshops to take your team to the next level", - "linkUrl": "/services/workshops/", - "linkText": "Our workshops" - } - %} - {{ ctaBanner('aqua', 'default', content) }} - {% - set 'content' = { - "title": "Grow your business with us", - "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", - "linkUrl": "/contact", - "linkText": "Get in touch" - } - %} - {{ ctaBanner('purple', 'full', content) }} -
    - {% include "global/footer.njk" %} -
    - - - - diff --git a/src/work.njk b/src/work.njk index 2a31133ccb..3c92137118 100644 --- a/src/work.njk +++ b/src/work.njk @@ -1,12 +1,14 @@ --- layout: "base" title: Our Work -description: A proven track record of building mobile and web apps for Europe's fastest growing start-ups and big enterprises – covering everything from design to code. +description: Mainmatter has a proven track record of solving the toughest tech challenges of Europe's fastest growing start-ups and big enterprises. eleventyNavigation: key: Work order: 20 eleventyImport: collections: ["caseStudies", "caseStudiesFeatured"] +og: + image: "/assets/images/work/og-image.jpg" --- {% from "color-hero.njk" import colorHero %} @@ -58,7 +60,7 @@ eleventyImport: {% set 'content' = { - "title": "Grow your business with us", + "title": "Team up with us to go further!", "text": "Our experts are ready to guide you through your next big move. Let us know how we can help.", "linkUrl": "/contact", "linkText": "Get in touch" diff --git a/src/workshops/a-taste-of-rust.md b/src/workshops/a-taste-of-rust.md deleted file mode 100644 index 5a4f1b296b..0000000000 --- a/src/workshops/a-taste-of-rust.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: "A taste of Rust" -tags: "rust" -format: "Workshop: 1 day" -subtext: "Bookable for teams – on-site or remote" -description: | -

    Rust has been the most loved programming language on StackOverflow for 7 years in a row. What's it all about?

    -

    Join this workshop to get a taste of Rust! We'll cover the core concepts of the language: structs, enums, traits, - testing, key data structures.

    -

    The workshop is organised as a series of exercises. You'll be learning by - doing! Each concept will be introduced with a short presentation, followed - by a hands-on exercise with tests to make sure you've wrapped your head - around it.
    - By the end of the workshop, you'll have built a small command-line - application in Rust: a simple JIRA clone that can be used to manage a - backlog of tasks.

    -

    The workshop is designed for developers who have experience using other programming languages - and are just getting started with Rust.

    -hero: - color: purple - image: "/assets/images/workshops/an-introduction-to-testing-in-rust/header-background.jpg" - imageAlt: "A drawing of a giant crab standing in a village." - -og: - image: /assets/images/workshops/a-taste-of-rust/a-taste-of-rust-og-image.jpeg -topics: - - title: Structs - text: > - Structs are the building blocks of Rust programs. We'll cover how to - define structs, how to implement methods on them, and how to manage their - visibility across modules. - - title: Enums - text: > - Rust's enums are extremely powerful: each variant can have its own data! - They're an excellent tool for modelling state machines, such as our tasks. - We'll cover how to define enums, how to implement methods on them, and - how to leverage pattern matching when working with them. - - title: Ownership - text: > - Ownership is Rust's most distinctive feature. It's what makes Rust code - safe and performant. We'll cover how ownership works, how it impacts the - way we write code, and how to leverage it to avoid unnecessary memory - allocations. - - title: Traits - text: > - Traits are Rust's way of defining interfaces. We'll cover how to define - traits, how to implement them for structs and enums, and how to use traits - to write generic code. We'll also cover common traits from the standard - library (e.g. `Debug`, `Display`, `Clone`, `PartialEq`) and how to derive - them automatically. - - title: Data structures - text: > - The Rust standard library provides a few key data structures that are used - everywhere. We'll zoom in on `Vec` and `HashMap` as our reference - examples. We'll review where they fit and how to leverage them in our - code. - - title: CLI applications - text: > - As a capstone exercise, we'll build a small command-line application to - expose our task management functionality. - You'll learn how to parse command-line arguments and the difference - between library and binary crates. -leads: - - name: Luca Palmieri - title: Principal Engineering Consultant - handle: algo_luca - image: /assets/images/authors/algo_luca.jpg - bio: > - Luca Palmieri builds technology products for a living. His current focus - is on backend development, software architecture and the Rust programming - language. He is the author of "Zero to Production in Rust". ---- - - diff --git a/src/workshops/advanced-testing-in-rust.md b/src/workshops/advanced-testing-in-rust.md index 012fda07d2..78e148d5fc 100644 --- a/src/workshops/advanced-testing-in-rust.md +++ b/src/workshops/advanced-testing-in-rust.md @@ -3,86 +3,68 @@ title: "Testing in Rust: going beyond the basics" tags: "rust" format: "Workshop: 1 day" subtext: "Bookable for teams – on-site or remote" -description: | +description: A 1-day workshop designed for software developers who have a good understanding of Rust's basic concepts and want to move beyond the built-in testing toolkit. +introduction: |

    No application is an island: you need to interact with third-party APIs, databases and who knows what else. Testing those interactions is tricky, to say the least! This workshop will focus on expanding your Rust testing toolkit, going beyond the basic techniques you're already familiar with. At the end of the session, you'll have a strategy to test most of the scenarios that are relevant for a complex Rust application.

    The workshop is designed for software developers who have a good understanding of Rust's basic - concepts and want to move beyond the built-in testing toolkit.
    - If you are new to Rust instead, you might be interested instead in our + concepts and want to move beyond the built-in testing toolkit.

    +

    If you are new to Rust instead, you might be interested instead in our introductory testing workshop.

    hero: color: purple image: "/assets/images/workshops/advanced-testing-in-rust/header-background.jpg" - imageAlt: - "A schematic drawing of a grid with files on top and connecting lines - between the files." + imageAlt: "A schematic drawing of a grid with files on top and connecting lines between the files." og: image: /assets/images/workshops/advanced-testing-in-rust/og-image.jpg topics: - title: "Expanding your toolbox: better assertions" text: > - The Rust standard library provides a few macros to perform assertions in - your tests: assert!, assert_eq!, etc. They are - good enough to get started, but the error messages they produce will often - fail to keep up with the complexity of your assertions: we'll explore - different libraries to boost the clarity of your test failures. + The Rust standard library provides a few macros to perform assertions in your tests: assert!, assert_eq!, etc. They are good enough to get started, but the error messages they produce will often fail to keep up with the complexity of your assertions: we'll explore different libraries to boost the clarity of your test failures. + + - title: "Expanding your toolbox: snapshot testing" text: > - Snapshot testing is a technique that allows us to capture the output of a - system under test and compare it with a previously saved version. It is - quite useful when working with complex data that might change frequently, - such as HTML or error messages. We will explore how to use the - insta crate to implement snapshot testing and manage the - snapshots lifecycle. + Snapshot testing is a technique that allows us to capture the output of a system under test and compare it with a previously saved version. It is quite useful when working with complex data that might change frequently, such as HTML or error messages. We will explore how to use the insta crate to implement snapshot testing and manage the snapshots lifecycle. + + - title: "Isolating your tests: the filesystem" text: > - All tests in Rust share the same filesystem as the underlying host, a - problematic situation when multiple tests want to interact with the "same" - files or touch directories that could affect the behaviour of the system - they are being executed from. We will explore various techniques to - manage this scenario, including the tempfile crate. + All tests in Rust share the same filesystem as the underlying host, a problematic situation when multiple tests want to interact with the "same" files or touch directories that could affect the behaviour of the system they are being executed from. We will explore various techniques to manage this scenario, including the tempfile crate. + + - title: "Isolating your tests: the database" text: > - The database is another shared resource that can cause problems when - running tests in parallel. We will explore how to use Docker to run an - isolated database instance for each test, and how to use the - sqlx crate to manage the database lifecycle. + The database is another shared resource that can cause problems when running tests in parallel. We will explore how to use Docker to run an isolated database instance for each test, and how to use the sqlx crate to manage the database lifecycle. + + - title: "Isolating your tests: HTTP mocking" text: > - It is undesirable to have tests that hit real HTTP endpoints from - third-party APIs, for a variety of reasons. We will explore how to use the - wiremock crate to shield our tests from the outside world and - make assertions on the HTTP requests that are being sent. + It is undesirable to have tests that hit real HTTP endpoints from third-party APIs, for a variety of reasons. We will explore how to use the wiremock crate to shield our tests from the outside world and make assertions on the HTTP requests that are being sent. + + - title: "Isolating your tests: mocks, stubs and fakes" text: > - In order to isolate the behaviour of a system under test, it is not - unusual to replace some of its dependencies with "fake" implementations. - We will explore the different types of fakes and how to use them in Rust. - We will review, in particular, the mockall crate and the - testing implications of using generics and dynamic dispatch for - polymorphism. + In order to isolate the behaviour of a system under test, it is not unusual to replace some of its dependencies with "fake" implementations. We will explore the different types of fakes and how to use them in Rust. We will review, in particular, the mockall crate and the testing implications of using generics and dynamic dispatch for polymorphism. + + - title: "Custom test runners: what is a test?" text: > - We will take a look under the hood to understand how the Rust built-in - testing framework works. Armed with this knowledge, we will explore the - runtime implications of different approaches for test organisation. We - will also cover alternative test runners, such as - cargo-nextest. + We will take a look under the hood to understand how the Rust built-in testing framework works. Armed with this knowledge, we will explore the runtime implications of different approaches for test organisation. We will also cover alternative test runners, such as cargo-nextest. + + - title: "Custom test runners: executing logic before and after a test run" text: > - It is often desirable to execute the same logic before and after each test - in our suite. We will explore a variety of techniques to achieve this, - from a bespoke #[test_case] procedural macro to a custom test - harness (via libtest_mimic). + It is often desirable to execute the same logic before and after each test in our suite. We will explore a variety of techniques to achieve this, from a bespoke #[test_case] procedural macro to a custom test harness (via libtest_mimic). + + - title: "Custom test runners: capstone project" text: > - We will combine everything we have learned so far into an easy-to-use - setup that allows you to run black-box tests against a real database and a - real HTTP server, without having to orchestrate multiple commands—just - cargo test and you are good to go! + We will combine everything we have learned so far into an easy-to-use setup that allows you to run black-box tests against a real database and a real HTTP server, without having to orchestrate multiple commands—just cargo test and you are good to go! + leads: - name: Luca Palmieri @@ -90,9 +72,7 @@ leads: handle: algo_luca image: /assets/images/authors/algo_luca.jpg bio: > - Luca Palmieri builds technology products for a living. His current focus - is on backend development, software architecture and the Rust programming - language. He is the author of "Zero to Production in Rust". + Luca Palmieri builds technology products for a living. His current focus is on backend development, software architecture and the Rust programming language. He is the author of "Zero to Production in Rust". --- diff --git a/src/workshops/an-introduction-to-testing-in-rust.md b/src/workshops/an-introduction-to-testing-in-rust.md index aee9bab0cb..564c348e13 100644 --- a/src/workshops/an-introduction-to-testing-in-rust.md +++ b/src/workshops/an-introduction-to-testing-in-rust.md @@ -3,15 +3,16 @@ title: "Testing in Rust: an introduction" tags: "rust" format: "Workshop: 4 hours" subtext: "Bookable for teams – on-site or remote" -description: | +description: This half-day workshop will build up your Rust's testing toolkit. We will start from scratch, with your first unit test. By the end, you will have a comprehensive understanding of the available test types, the best practices in terms of test organization as well as their runtime implications. +introduction: |

    Rust's type system is great, but it's not enough on its own to ensure correctness: a solid testing strategy is a requirement for any serious Rust application.

    The workshop will build up your Rust's testing toolkit. We will start from scratch, with your first unit test. By the end, you will have a comprehensive understanding of the available test types, the best practices in terms of test organization as well as their runtime implications. You will be well equipped for the testing challenges ahead of you!

    -

    The workshop is designed for software developers who are just starting their Rust journey.
    - If you've been working with Rust for a while, you might be interested instead in our +

    The workshop is designed for software developers who are just starting their Rust journey.

    +

    If you've been working with Rust for a while, you might be interested instead in our advanced testing workshop.

    hero: color: purple @@ -23,49 +24,44 @@ og: topics: - title: Writing your first unit test text: > - Straight into the action: the #[test] annotation and basic - assertions! + Straight into the action: the #[test] annotation and basic assertions! We will wire everything up and get our feedback loop going. + + - title: Testing failures text: > Unhappy scenarios are often more important than the happy ones! - We will discuss the #[should_panic] annotation as well - as the tradeoffs of returning a Result from your tests. + We will discuss the #[should_panic] annotation as well as the tradeoffs of returning a Result from your tests. + + - title: The Rust testing zoo text: > - Unit tests are just of the test approaches offered by Rust's built-in - testing framework—we have integration and doc tests too. - We will look at each category and build a mental framework for - choosing the correct testing technique in each context. + Unit tests are just of the test approaches offered by Rust's built-in testing framework—we have integration and doc tests too. + We will look at each category and build a mental framework for choosing the correct testing technique in each context. + + - title: Running your tests text: > - What is a test? We will take a look under the hood to understand how the - Rust built-in testing framework is actually implemented. Armed with this - knowledge, we will explore the runtime implications of different - approaches for test organisation. We will also cover alternative - test runners, such as cargo-nextest. + What is a test? We will take a look under the hood to understand how the Rust built-in testing framework is actually implemented. Armed with this knowledge, we will explore the runtime implications of different approaches for test organisation. We will also cover alternative test runners, such as cargo-nextest. + + - title: "Test helpers: where do they go?" text: > - Test code is just as important as production code: you want it to be terse - and clearly communicate what is being tested. If you follow this - philosophy, you'll soon be trying to extract common logic into test - helpers: where should they be located? We will cover the different - strategies available (test modules, feature gate, helper crate) and their - trade-offs. + Test code is just as important as production code: you want it to be terse and clearly communicate what is being tested. If you follow this philosophy, you'll soon be trying to extract common logic into test helpers: where should they be located? We will cover the different strategies available (test modules, feature gate, helper crate) and their trade-offs. + + - title: Beyond assertions text: > - In closing, we will have a look at a few advanced techniques beyond - the standard toolkit: snapshot testing (insta) and - property-based testing (quickcheck). + In closing, we will have a look at a few advanced techniques beyond the standard toolkit: snapshot testing (insta) and property-based testing (quickcheck). + + leads: - name: Luca Palmieri title: Principal Engineering Consultant handle: algo_luca image: /assets/images/authors/algo_luca.jpg bio: > - Luca Palmieri builds technology products for a living. His current focus - is on backend development, software architecture and the Rust programming - language. He is the author of "Zero to Production in Rust". + Luca Palmieri builds technology products for a living. His current focus is on backend development, software architecture and the Rust programming language. He is the author of "Zero to Production in Rust". --- diff --git a/src/workshops/authentication-for-svelte-sveltekit.md b/src/workshops/authentication-for-svelte-sveltekit.md new file mode 100644 index 0000000000..4c5d9cf0af --- /dev/null +++ b/src/workshops/authentication-for-svelte-sveltekit.md @@ -0,0 +1,49 @@ +--- +title: "Authentication for Svelte & SvelteKit" +tags: "svelte" +format: "Workshop: 1 day" +subtext: "Bookable for teams – on-site or remote" +description: In this 1-day workshop, we cover everything one needs to know to implement authentication in Svelte and SvelteKit so that it's functional, secure, and maintainable. +introduction: "

    Most real-world applications provide some means for users to authenticate – either to get access to the application at all, or to get access to specific functionality or data within the application. Since authentication is a critical topic though, it's important to get it right. In this workshop, we cover everything one needs to know to implement authentication in Svelte and SvelteKit so that it's functional, secure, and maintainable.

    " +hero: + color: aqua + image: "/assets/images/workshops/authentication-for-svelte-sveltekit/lock.jpg" + imageAlt: "Close-up photo of a lock attached to a metal fence" +og: + image: /assets/images/workshops/authentication-for-svelte-sveltekit/og-image.jpg +topics: + - title: The Basics of Authentication + text: > + We'll start with a bit of theory, looking into what authentication is, what the options are to implement authentication in web apps and what the relevant security aspects are to keep in mind. + + + - title: The Demo Project + text: > + We continue by setting up a demo project we'll be using throughout the workshop to set up a full authentication system. + + + - title: Username & Password + text: > + We'll build basic authentiation via a username and password first as a simple and straight forward means for users to login. + + + - title: OAuth + text: > + Next, we'll move to OAuth, which most real-world applications are likely to use. We'll look into the theory behind the approach and implement authentication via an OAuth provider in the demo project. + + + - title: Application Concerns + text: > + We end by looking into application concerns around authentication like deciding whether a user is currently logged in, and rendering the according UI, seamlessly moving the authentication state between the browser and the server side of a SvelteKit application, or persisting the authentication state beyond refreshs. + + +leads: + - name: Paolo Ricciuti + title: Senior Frontend Engineer + handle: paoloricciuti + image: /assets/images/authors/paoloricciuti.jpg + bio: > + Paolo is a huge nerd and Svelte maintainer. He's also one of the creators of sveltelab.dev - a REPL for SvelteKit. +--- + + diff --git a/src/workshops/build-production-ready-apis-in-rust.md b/src/workshops/build-production-ready-apis-in-rust.md index cda8d11212..c78673ca23 100644 --- a/src/workshops/build-production-ready-apis-in-rust.md +++ b/src/workshops/build-production-ready-apis-in-rust.md @@ -2,95 +2,83 @@ title: "Build production-ready API services in Rust" tags: "rust" format: "Workshop: 3 days, on-site or remote" -description:

    Rust is an excellent programming language for developing API - services. You can build applications that are fast, reliable, and - cost-effective. In fact, using Rust to write services can tremendously reduce - your operating costs. However, the main challenge is knowing where to start. - This workshop guides you through the process. At the end of the journey, - you'll know enough to set up a production-ready HTTP API using the Axum - framework.


    - -

    This workshop is designed for developers who know the basics of Rust and - want to learn more about backend development using Rust. Having written Rust - in a production environment is not a requirement.

    +description: This 3-day workshop is designed for developers who know the basics of Rust and want to learn more about backend development using Rust. Having written Rust in a production environment is not a requirement. +introduction: +

    Rust is an excellent programming language for developing API services. You can build applications that are fast, reliable, and cost-effective. In fact, using Rust to write services can tremendously reduce your operating costs. However, the main challenge is knowing where to start. This workshop guides you through the process. At the end of the journey, you'll know enough to set up a production-ready HTTP API using the Axum framework.

    + +

    This workshop is designed for developers who know the basics of Rust and want to learn more about backend development using Rust. Having written Rust in a production environment is not a requirement.

    hero: color: purple - image: "/assets/images/workshops/web-based-services-in-rust/header-background.jpg" + image: "/assets/images/workshops/production-ready-api-services-in-rust/header-background.jpg" imageAlt: "Several cogs and mechanical elements in purple." og: - image: /assets/images/workshops/production-ready-api-services-in-rust/og-image.jpeg + image: /assets/images/workshops/production-ready-api-services-in-rust/og-image.jpg topics: - title: Hello Axum! text: > Axum is the web framework we will be using throughout the workshop. - We'll go over its architecture and where it fits in the broader Rust - ecosystem. + We'll go over its architecture and where it fits in the broader Rust ecosystem. + + - title: Your first endpoint text: > - We'll learn enough about Axum to write an API with a single endpoint that - returns a static "Hello World" response. - It'll be an opportunity to learn about the key components of an Axum - application (the HTTP server, the router, the handler) and how to connect - them together. - We'll also wire up our first integration test. No matter how simple the - endpoint, we want to make sure it works! + We'll learn enough about Axum to write an API with a single endpoint that returns a static "Hello World" response. + It'll be an opportunity to learn about the key components of an Axum application (the HTTP server, the router, the handler) and how to connect them together. + We'll also wire up our first integration test. No matter how simple the endpoint, we want to make sure it works! + + - title: Extracting data from the request text: > - We'll expand our API with new endpoints that leverage route parameters, - query parameters and JSON bodies. - It'll be your introduction to the `FromRequest` trait and how to use it to - write extractors, the key mechanism to inject data from the incoming - request into your handlers. + We'll expand our API with new endpoints that leverage route parameters, query parameters and JSON bodies. + It'll be your introduction to the FromRequest trait and how to use it to write extractors, the key mechanism to inject data from the incoming request into your handlers. + + - title: Telemetry text: > - At this point, the API is starting to get complex and you're likely to run - into issues: how do you debug them? We'll learn how to use the `tracing` - and the `tower-http` crates to instrument our code and capture structured - logs. It'll be the first middleware you'll mount in your application. + At this point, the API is starting to get complex and you're likely to run into issues: how do you debug them? We'll learn how to use the tracing and the tower-http crates to instrument our code and capture structured logs. It'll be the first middleware you'll mount in your application. + + - title: Shared application state text: > - Some data outlives the lifetime of a single request—e.g. a database - connection pool, or a cache client. - We'll learn how to model this data as the state of our application and how - to access it from our handlers. + Some data outlives the lifetime of a single request—e.g. a database connection pool, or a cache client. + We'll learn how to model this data as the state of our application and how to access it from our handlers. + + - title: Hierarchical configuration text: > - As soon as you start doing something non-trivial, you'll need to configure - your application with parameters that are specific to the environment it's - running in. - We'll learn how to use the `config` crate to load configuration from - environment variables and configuration files, using a layered approach. + As soon as you start doing something non-trivial, you'll need to configure your application with parameters that are specific to the environment it's running in. + We'll learn how to use the config crate to load configuration from environment variables and configuration files, using a layered approach. + + - title: External state, working with databases text: > - We'll learn how to use the `sqlx` crate to connect to a PostgreSQL - database and execute queries. - We'll cover connection pooling and transactions, as well as how to test - endpoints that interact with the database. + We'll learn how to use the sqlx crate to connect to a PostgreSQL database and execute queries. + We'll cover connection pooling and transactions, as well as how to test endpoints that interact with the database. + + - title: External state, working with third-party APIs text: > - We'll learn how to use the `reqwest` crate to call third-party APIs. - We'll cover connection management, retries and timeouts, as well as how to - test endpoints that interact with third-party services via `wiremock`. + We'll learn how to use the reqwest crate to call third-party APIs. + We'll cover connection management, retries and timeouts, as well as how to test endpoints that interact with third-party services via wiremock. + + - title: Sharing logic between endpoints via middlewares text: > - When you have multiple endpoints, you'll often find yourself repeating the - same logic in each of them. We'll learn how to extract this logic into - middlewares and mount them in our application. + When you have multiple endpoints, you'll often find yourself repeating the same logic in each of them. We'll learn how to extract this logic into middlewares and mount them in our application. + + - title: Preparing to deploy text: > - Most platforms require you to package your application as a Docker image - for deployment. We'll cover how to write a Dockerfile to package our API, - with a focus on effective caching (via `cargo-chef`) and techniques to - minimise the size of the final image. + Most platforms require you to package your application as a Docker image for deployment. We'll cover how to write a Dockerfile to package our API, with a focus on effective caching (via cargo-chef) and techniques to minimise the size of the final image. + + leads: - name: Luca Palmieri title: Principal Engineering Consultant handle: algo_luca image: /assets/images/authors/algo_luca.jpg bio: > - Luca Palmieri builds technology products for a living. His current focus - is on backend development, software architecture and the Rust programming - language. He is the author of "Zero to Production in Rust". + Luca Palmieri builds technology products for a living. His current focus is on backend development, software architecture and the Rust programming language. He is the author of "Zero to Production in Rust". --- diff --git a/src/workshops/design-system-kickoff-interface-inventory.md b/src/workshops/design-system-kickoff-interface-inventory.md index 3d5b8ec4f0..dba1bd104f 100644 --- a/src/workshops/design-system-kickoff-interface-inventory.md +++ b/src/workshops/design-system-kickoff-interface-inventory.md @@ -1,11 +1,10 @@ --- -title: Design system kickoff (interface inventory) +title: "Design system kickoff (interface inventory)" tags: "design" format: "Workshop: 2-3 days" subtext: Bookable on request – onsite or remote -description: - Create an interface inventory of your digital product, and align with your - team on how to prioritize refactoring using a design systems methodology. +description: A 2-3 day workshop during which we create an interface inventory of your digital product, and align with your team on how to prioritize refactoring using a design systems methodology. +introduction:

    Create an interface inventory of your digital product, and align with your team on how to prioritize refactoring using a design systems methodology.

    hero: color: purple image: "/assets/images/workshops/design-system-kickoff-interface-inventory/design-system-kickoff-interface-inventory-hero.jpg" @@ -15,29 +14,34 @@ og: topics: - title: People, process, and tools text: > - Establish which core features in the user journey should be prioritized, - clarify ownership and team communication, agree on criteria and a toolset. + Establish which core features in the user journey should be prioritized, clarify ownership and team communication, agree on criteria and a toolset. + + - title: UI patterns text: > - Go over different user interface pattern types: functional, perceptual, - platform-specific, domain-specific, persuasive. + Go over different user interface pattern types: functional, perceptual, platform-specific, domain-specific, persuasive. + + - title: Hands-on work text: > - Divide and categorize screenshots of core features of your web interface - by functional categories (e.g. buttons, forms, navigation, typography, - lists) and intended use. + Divide and categorize screenshots of core features of your web interface by functional categories (e.g. buttons, forms, navigation, typography, lists) and intended use. + + - title: Naming convention text: > - Discuss naming as a shared language and mental model. We will go over - naming conventions and practice naming interface components. + Discuss naming as a shared language and mental model. We will go over naming conventions and practice naming interface components. + + - title: Share and learn text: > - Share and discuss our findings and rationale, as well as which patterns we - would keep, merge, and discard. + Share and discuss our findings and rationale, as well as which patterns we would keep, merge, and discard. + + - title: Next steps text: > - We'll share crucial steps that help us succeed when transitioning an - organization to a design system. + We'll share crucial steps that help us succeed when transitioning an organization to a design system. + + leads: - name: Florian Pichler title: Consultant for Technology and Design @@ -45,23 +49,15 @@ leads: authorHandle: pichfl image: /assets/images/authors/pichfl.jpg bio: > - Florian bridges the gap between development and design, mentoring clients - along the way. He created user experiences and design systems for - established brands like Audi, BASF, BMW, and Zurich Insurance. + Florian bridges the gap between development and design, mentoring clients along the way. He created user experiences and design systems for established brands like Audi, BASF, BMW, and Zurich Insurance. --- -Interface inventories are a key first step to create alignment and advocate -transitioning to using design patterns in an organization. To get the most out -of this workshop, bring in a cross-disciplinary team – we encourage people from -every department that builds your product to join. Designers, developers, -project managers, business owners, QA – are all welcome. These are the benefits -of having an interface inventory: +Interface inventories are a key first step to create alignment and advocate transitioning to using design patterns in an organization. To get the most out of this workshop, bring in a cross-disciplinary team – we encourage people from every department that builds your product to join. Designers, developers, project managers, business owners, QA – are all welcome. These are the benefits of having an interface inventory: - Gain clarity regarding which design components make up a digital product - Help us analyze inconsistencies between them - Gain buy-in from stakeholders to establish a design system -- Start a conversation with your team on how to refactor design with a - pattern-based approach +- Start a conversation with your team on how to refactor design with a pattern-based approach - Use it as a blueprint for a pattern library diff --git a/src/workshops/digital-product-strategy.md b/src/workshops/digital-product-strategy.md index 09b0358d85..1462cbc1c6 100644 --- a/src/workshops/digital-product-strategy.md +++ b/src/workshops/digital-product-strategy.md @@ -1,15 +1,10 @@ --- -title: Digital product strategy workshop +title: "Digital product strategy workshop" tags: "strategy" format: "Collaborative Workshop: 1–2 days" subtext: "Bookable on request – on-site or remote" -description: - In this workshop we will collaborate to formulate a clear product vision, - establishing a blueprint for your digital product's development process. This - workshop is a great kickoff for an MVP project. Before starting out, we will - gain an overview of your business. Understanding the fundamentals such as your - business model, competitor analysis, and users is an essential first step for - this strategy workshop. +description: A 1-2 days workshop in which we will collaborate to formulate a clear product vision, establishing a blueprint for your digital product's development process. This workshop is a great kickoff for an MVP project. +introduction:

    In this workshop we will collaborate to formulate a clear product vision, establishing a blueprint for your digital product's development process. This workshop is a great kickoff for an MVP project. Before starting out, we will gain an overview of your business. Understanding the fundamentals such as your business model, competitor analysis, and users is an essential first step for this strategy workshop.

    hero: color: purple image: "/assets/images/workshops/digital-product-strategy/digital-product-strategy-workshop-hero.jpg" @@ -19,34 +14,34 @@ og: topics: - title: Understanding the product text: > - Go over your goals, desired features, mission statement, and possible key - performance indicators (KPIs). We also develop personas to gain a better - understanding of who we are building this product for + Go over your goals, desired features, mission statement, and possible key performance indicators (KPIs). We also develop personas to gain a better understanding of who we are building this product for + + - title: Minimum Viable Product (MVP) text: > - Collaboratively strip down features and develop an understanding of the - product's core functionality. The MVP is the sole focus for the rest of - the exercises in the workshop + Collaboratively strip down features and develop an understanding of the product's core functionality. The MVP is the sole focus for the rest of the exercises in the workshop + + - title: User-flow diagram text: > - Create a visualization of every step of the journey the user takes from - the entry point to the final interaction + Create a visualization of every step of the journey the user takes from the entry point to the final interaction + + - title: Low-fidelity wireframes text: > - A two-dimensional skeletal outline of key moments of the user flow - diagram. Also called a fat marker sketch because it is made with such - broad strokes that adding detail is difficult or impossible. The goal is - to focus on communicating the concept rather than creating a detailed - solution. + A two-dimensional skeletal outline of key moments of the user flow diagram. Also called a fat marker sketch because it is made with such broad strokes that adding detail is difficult or impossible. The goal is to focus on communicating the concept rather than creating a detailed solution. + + - title: Product architecture text: > Create a diagram to overview the web application's architecture. + + - title: Next steps text: > - To wrap up, we hold a presentation going over our results from the - workshop. We include a report with a digital version of the user flow - diagram, wireframes for MVP, the product architecture diagram, and our 40-page Playbook + To wrap up, we hold a presentation going over our results from the workshop. We include a report with a digital version of the user flow diagram, wireframes for MVP, the product architecture diagram, and our 40-page Playbook + + leads: - name: Florian Pichler title: Consultant for Technology and Design @@ -54,18 +49,16 @@ leads: authorHandle: pichfl image: /assets/images/authors/pichfl.jpg bio: > - Florian bridges the gap between development and design, mentoring clients - along the way. He created user experiences and design systems for - established brands like Audi, BASF, BMW, and Zurich Insurance. + Florian bridges the gap between development and design, mentoring clients along the way. He created user experiences and design systems for established brands like Audi, BASF, BMW, and Zurich Insurance. + + - name: Marco Otte-Witte title: Founder and Managing Director at Mainmatter handle: marcoow authorHandle: marcoow image: /assets/images/authors/marcoow.jpg bio: > - Marco has been working in tech with startups and enterprises for 2 - decades. He's helped companies bring relevant products to market in - various industries – among them Blackberry, Generali and Experteer. + Marco has been working in tech with startups and enterprises for 2 decades. He's helped companies bring relevant products to market in various industries – among them Blackberry, Generali and Experteer. --- diff --git a/src/workshops/effective-git.md b/src/workshops/effective-git.md index 6bdd53f390..b33af286a1 100644 --- a/src/workshops/effective-git.md +++ b/src/workshops/effective-git.md @@ -1,16 +1,10 @@ --- -title: Effective Git +title: "Effective Git" tags: "git" format: "Workshop: 1 day" subtext: "Bookable for teams – on-site or remote" -description: -

    Git is at the center of modern pull request-based development workflows. - Mastering it makes teams more productive and developers' jobs more - enjoyable.


    The goal of the workshop is to provide just enough detail - for practical daily use without getting too academic or deep in the weeds. We - focus on real challenges developers face when working with Git, arming them - with an understanding of the foundational concepts along with practical - guidance for overcoming those challenges.

    +description: 1-day workshop – Git is at the center of modern pull request-based development workflows. Mastering it makes teams more productive and developers' jobs more enjoyable. +introduction:

    Git is at the center of modern pull request-based development workflows. Mastering it makes teams more productive and developers' jobs more enjoyable.

    The goal of the workshop is to provide just enough detail for practical daily use without getting too academic or deep in the weeds. We focus on real challenges developers face when working with Git, arming them with an understanding of the foundational concepts along with practical guidance for overcoming those challenges.

    hero: color: purple image: "/assets/images/workshops/effective-git/effective-git-workshop-hero.jpg" @@ -20,38 +14,34 @@ og: topics: - title: Delivery pipelines text: > - Highly integrated and automated infrastructure and workflows are the - foundation that successful engineering teams excel on and Git is what - drives them at their core. We look at branching models, Pull Request based - workflows, and reviewing. + Highly integrated and automated infrastructure and workflows are the foundation that successful engineering teams excel on and Git is what drives them at their core. We look at branching models, Pull Request based workflows, and reviewing. + + - title: Git fundamentals text: > - Once we understand how Git fits in to the bigger picture, we'll look into - how it works at its core and the building blocks it consists of. We cover - what blobs, trees and snapshots are to better understand how they - represent a repo's history over time. + Once we understand how Git fits in to the bigger picture, we'll look into how it works at its core and the building blocks it consists of. We cover what blobs, trees and snapshots are to better understand how they represent a repo's history over time. + + - title: Branching and merging text: > - Git makes branching easy and cheap, and working with Git means constantly - switching between branches and merging them back together. We look at - common branching and merging scenarios to understand what fast-forward - merges and 3-way merges are. + Git makes branching easy and cheap, and working with Git means constantly switching between branches and merging them back together. We look at common branching and merging scenarios to understand what fast-forward merges and 3-way merges are. + + - title: Rewriting history text: > - Keeping a clean history and organizing commits in meaningful ways is - essential for efficient collaboration on code bases. We cover - (interactive) rebasing and rewriting history including squashing, editing - and dropping commits. + Keeping a clean history and organizing commits in meaningful ways is essential for efficient collaboration on code bases. We cover (interactive) rebasing and rewriting history including squashing, editing and dropping commits. + + - title: Bisecting text: > - Sometimes it's hard to find the change that introduced a particular - defect. Git Bisect can be of great help in identifying the respective - commit. We look at how bisecting works and how it can be used to save a - lot of time in common scenarios. + Sometimes it's hard to find the change that introduced a particular defect. Git Bisect can be of great help in identifying the respective commit. We look at how bisecting works and how it can be used to save a lot of time in common scenarios. + + - title: Open Q&A text: > - We reserve some time in the end to discuss your team's specific questions - relating to Git or infrastructure, tooling and automation around it. + We reserve some time in the end to discuss your team's specific questions relating to Git or infrastructure, tooling and automation around it. + + leads: - name: Chris Manson title: Senior Engineering Consultant @@ -59,30 +49,22 @@ leads: authorHandle: real_ate image: /assets/images/authors/real_ate.jpg bio: > - Chris has had a long history with version control systems, with his very - first Open Source experience being involved in the transition of the - massive KDE codebase from CVS to Git. These days Chris is deeply involved - in the JAM Stack movement, giving him a new outlet for his love for Git. + Chris has had a long history with version control systems, with his very first Open Source experience being involved in the transition of the massive KDE codebase from CVS to Git. These days Chris is deeply involved in the JAM Stack movement, giving him a new outlet for his love for Git. + + - name: Marco Otte-Witte title: Founder and Managing Director at Mainmatter handle: marcoow authorHandle: marcoow image: /assets/images/authors/marcoow.jpg bio: > - Marco has been working in tech with startups and enterprises for 2 - decades. He's helped companies bring relevant products to market in - various industries – among them Blackberry, Generali and Experteer. + Marco has been working in tech with startups and enterprises for 2 decades. He's helped companies bring relevant products to market in various industries – among them Blackberry, Generali and Experteer. --- ## Customised to your team’s needs -We're happy to customize the workshop to precisely fit your team's specific -needs or challenges. If you have a very specific branching model or -infrastructure or your team frequently struggles with particular aspects of Git, -we can adapt the focus of the workshop more towards these aspects or cover -additional topics as necessary. +We're happy to customize the workshop to precisely fit your team's specific needs or challenges. If you have a very specific branching model or infrastructure or your team frequently struggles with particular aspects of Git, we can adapt the focus of the workshop more towards these aspects or cover additional topics as necessary. -All content and examples of the workshop are available publicly on -[GitHub](https://github.com/mainmatter/git-workshop). +All content and examples of the workshop are available publicly on [GitHub](https://github.com/mainmatter/git-workshop). diff --git a/src/workshops/hands-on-ember.md b/src/workshops/hands-on-ember.md index b0189014e3..4904b3375e 100644 --- a/src/workshops/hands-on-ember.md +++ b/src/workshops/hands-on-ember.md @@ -1,21 +1,13 @@ --- -title: Hands-on Ember.js +title: "Hands-on Ember.js" tags: "ember" format: "Workshop: 2-3 days" subtext: "Bookable for teams – on-site or remote" -description:

    We go through a series of stages that each build on one another. - Each topic is introduced via an in-depth presentation as well as a small, - focussed demo application that illustrates the respective concept in practice. - Over the course of the workshop we take participants through building a full - Ember application step by step so each topic can be applied hands-on with the - support of our tutors. Depending on each team's needs and previous experience, - we will cover each topic in varying depth. We are also happy to customize - workshops for the specific needs of a team and cover topics like performance, - debugging, upgrading from older versions of Ember, or any topics particular to - a team's application.


    - -

    All examples and practical assignments from the workshop are available - publicly on GitHub.

    +description: A 2-3 days workshop in which we go through a series of stages that each build on one another. Each topic is introduced via an in-depth presentation as well as a small, focussed demo application that illustrates the respective concept in practice. +introduction: +

    We go through a series of stages that each build on one another. Each topic is introduced via an in-depth presentation as well as a small, focussed demo application that illustrates the respective concept in practice. Over the course of the workshop we take participants through building a full Ember application step by step so each topic can be applied hands-on with the support of our tutors. Depending on each team's needs and previous experience, we will cover each topic in varying depth. We are also happy to customize workshops for the specific needs of a team and cover topics like performance, debugging, upgrading from older versions of Ember, or any topics particular to a team's application.

    + +

    All examples and practical assignments from the workshop are available publicly on GitHub.

    hero: color: purple image: "/assets/images/workshops/hands-on-ember/hands-on-ember-workshop-hero.jpg" @@ -26,71 +18,66 @@ og: topics: - title: Ember.js basics text: > - We look at the basic building blocks of an Ember application and how they - play together. We also take a look at the CLI and development tooling like - the Ember Inspector. + We look at the basic building blocks of an Ember application and how they play together. We also take a look at the CLI and development tooling like the Ember Inspector. + + - title: Templates and components text: > - Rendering DOM elements is the most essential task of every Ember app. We - dive deep into Handlebars, Ember's component model, tracked properties as - well as actions and modifiers and more advanced topics like complex - component architectures, component reusability concerns, and architectural - approaches. + Rendering DOM elements is the most essential task of every Ember app. We dive deep into Handlebars, Ember's component model, tracked properties as well as actions and modifiers and more advanced topics like complex component architectures, component reusability concerns, and architectural approaches. + + - title: Routing text: > - Ember pioneered the idea of driving the application state through the URL. - In this stage, we explore Ember's routing, the template hierarchy, and - advanced concepts like loading and error states. + Ember pioneered the idea of driving the application state through the URL. In this stage, we explore Ember's routing, the template hierarchy, and advanced concepts like loading and error states. + + - title: Ember Data text: > - This stage covers all aspects of Ember Data, from the basics like working - with models and the store, to advanced topics like adapters and - serializers, the json:api spec, and data loading patterns. + This stage covers all aspects of Ember Data, from the basics like working with models and the store, to advanced topics like adapters and serializers, the json:api spec, and data loading patterns. + + - title: Services text: > - Ember's services are a simple yet powerful mechanism for sharing state - throughout the application as well as encapsulating specific - functionality. We cover how services work and look at typical use cases - and patterns. + Ember's services are a simple yet powerful mechanism for sharing state throughout the application as well as encapsulating specific functionality. We cover how services work and look at typical use cases and patterns. + + - title: Testing text: > - We cover fundamental authentication and authorization concepts, discussing - different mechanisms and related security aspects. + We cover fundamental authentication and authorization concepts, discussing different mechanisms and related security aspects. + + optional_topics: - title: Auth (optional) text: > - We cover fundamental authentication and authorization concepts, discussing - different mechanisms and related security aspects. + We cover fundamental authentication and authorization concepts, discussing different mechanisms and related security aspects. + + - title: Deployment, performance, SSR and SSG (optional) text: > - In this stage, we look into serving Ember applications in the most - performant way. We cover topics like CDNs, caching and service workers, as - well as server-side rendering and pre-rendering with FastBoot. + In this stage, we look into serving Ember applications in the most performant way. We cover topics like CDNs, caching and service workers, as well as server-side rendering and pre-rendering with FastBoot. + + - title: Ember’s object model (optional) text: > - Ember applications building on versions older than the Octane edition are - still using Ember's legacy object model with patterns like computed - properties and mixins. In this stage, we cover those concepts in-depth as - well as explore approaches for migrating to native classes. + Ember applications building on versions older than the Octane edition are still using Ember's legacy object model with patterns like computed properties and mixins. In this stage, we cover those concepts in-depth as well as explore approaches for migrating to native classes. + + leads: - name: Gabor Babicz title: Senior Frontend Engineer handle: zeppelin image: /assets/images/authors/zeppelin.jpg bio: > - Gabor was a very early adopter of Ember in the pre-1.0 years of the - framework and has since successfully completed numerous projects with it. - He helps teams build applications and teaches best practices along the - way. + Gabor was a very early adopter of Ember in the pre-1.0 years of the framework and has since successfully completed numerous projects with it. He helps teams build applications and teaches best practices along the way. + + - name: Marco Otte-Witte title: Founder and Managing Director at Mainmatter handle: marcoow authorHandle: marcoow image: /assets/images/authors/marcoow.jpg bio: > - Marco has been working in tech with startups and enterprises for 2 - decades. He's helped companies bring relevant products to market in - various industries – among them Blackberry, Generali and Experteer. + Marco has been working in tech with startups and enterprises for 2 decades. He's helped companies bring relevant products to market in various industries – among them Blackberry, Generali and Experteer. --- diff --git a/src/workshops/introduction-to-rust-for-web-developers.md b/src/workshops/introduction-to-rust-for-web-developers.md index 8ac8b7f531..8623acc0c7 100644 --- a/src/workshops/introduction-to-rust-for-web-developers.md +++ b/src/workshops/introduction-to-rust-for-web-developers.md @@ -1,21 +1,13 @@ --- -title: Introduction to Rust for Web Developers +title: "Introduction to Rust for Web Developers" tags: "rust" format: "Workshop: 2-3 days" subtext: "Bookable for teams – on-site or remote" -description:

    According to the Stack Overflow survey, Rust is one of the most - beloved programming languages. In recent years, it has also gained popularity. - There has never been a better time to become familiar with Rust! Learning a - new programming language is always easier when you start with topics within - your comfort zone. In this workshop, we will explore the main concepts of Rust - by developing web applications. We will cover topics such as ownership and - borrowing, concurrency, types and structs, all while building a real-world web - app together. If you have a basic understanding of creating web back-ends and - APIs, this workshop will get you up to speed with Rust.


    - -

    This workshop is designed for software developers with little to no - experience in Rust. We recommend having prior experience in writing web - applications.

    +description: In this 2-3 days workshop, we will explore the main concepts of Rust by developing web applications. We will cover topics such as ownership and borrowing, concurrency, types and structs, all while building a real-world web app together. +introduction: +

    According to the Stack Overflow survey, Rust is one of the most beloved programming languages. In recent years, it has also gained popularity. There has never been a better time to become familiar with Rust! Learning a new programming language is always easier when you start with topics within your comfort zone. In this workshop, we will explore the main concepts of Rust by developing web applications. We will cover topics such as ownership and borrowing, concurrency, types and structs, all while building a real-world web app together. If you have a basic understanding of creating web back-ends and APIs, this workshop will get you up to speed with Rust.

    + +

    This workshop is designed for software developers with little to no experience in Rust. We recommend having prior experience in writing web applications.

    hero: color: purple image: "/assets/images/workshops/introduction-to-rust-for-web-developers/header-background.jpg" @@ -25,38 +17,31 @@ og: topics: - title: Getting Started text: > - We will begin by creating a new project and writing our first lines of - Rust code. You will become familiar with new syntax primitives, basic - types, expressions, function signatures, and the async/await syntax. - Additionally, you will learn how to work with Rust's tooling, such as - Cargo and Rust Analyzer. + We will begin by creating a new project and writing our first lines of Rust code. You will become familiar with new syntax primitives, basic types, expressions, function signatures, and the async/await syntax. Additionally, you will learn how to work with Rust's tooling, such as Cargo and Rust Analyzer. + + - title: Ownership and Borrowing text: > - As we add more functionality to our application, we will explore Rust's - unique approach to memory management: Ownership and Borrowing. We will - delve into the intricacies of this system by examining common situations - and understanding how it requires us to rethink application development. + As we add more functionality to our application, we will explore Rust's unique approach to memory management: Ownership and Borrowing. We will delve into the intricacies of this system by examining common situations and understanding how it requires us to rethink application development. + + - title: Shared Access in Concurrent Applications text: > - Rust's memory management system is ideal for shared access to data in - multi-threaded applications, as it forces us to reconsider how we handle - shared memory. In this section, we will learn how to share state across - threads, how synchronization primitives function, and the significant role - ownership plays. + Rust's memory management system is ideal for shared access to data in multi-threaded applications, as it forces us to reconsider how we handle shared memory. In this section, we will learn how to share state across threads, how synchronization primitives function, and the significant role ownership plays. + + - title: Structs, Traits, Serialization and Deserialization of Data text: > - In the final part, we will gain insight into Rust's type system by - exploring traits and their applications in serializing and deserializing - requests and responses. + In the final part, we will gain insight into Rust's type system by exploring traits and their applications in serializing and deserializing requests and responses. + + leads: - name: Stefan Baumgartner title: Architect and Independent Trainer handle: ddprrt image: /assets/images/authors/ddprrt.jpg bio: > - Stefan Baumgartner is an architect and developer based in Austria who - specializes in serverless technologies. He has authored two books on - TypeScript and is also the organizer of the Rust Linz meetup. + Stefan Baumgartner is an architect and developer based in Austria who specializes in serverless technologies. He has authored two books on TypeScript and is also the organizer of the Rust Linz meetup. --- diff --git a/src/workshops/learn-rust-starting-from-scratch.md b/src/workshops/learn-rust-starting-from-scratch.md index a6c80587c6..062e144e1c 100644 --- a/src/workshops/learn-rust-starting-from-scratch.md +++ b/src/workshops/learn-rust-starting-from-scratch.md @@ -3,7 +3,8 @@ title: "Learn Rust, starting from scratch" tags: "rust" format: "Workshop: 4 days" subtext: "Bookable for teams – on-site or remote" -description: | +description: This 4-days workshop helps you get started with Rust, assuming no prior knowledge of the language. The workshop starts from the absolute basics and gradually builds up to more advanced topics. +introduction: |

    Rust is a general-purpose programming languages that's been growing in popularity over the past few years. It's known for its strong type system, its focus on safety and performance, and its modern tooling.

    We designed this workshop to help you get started with Rust, assuming no prior knowledge of the language.

    @@ -18,53 +19,40 @@ hero: image: "/assets/images/workshops/an-introduction-to-testing-in-rust/header-background.jpg" imageAlt: "A drawing of a giant crab standing in a village." og: - image: /assets/images/workshops/learn-rust-starting-from-scratch/og-image.jpeg + image: /assets/images/workshops/learn-rust-starting-from-scratch/og-image.jpg topics: - heading: The toolbox text: > - We will cover the tools that every Rust developer should have in their - toolbox: rustup (toolchain management), cargo - (build system and package manager), clippy (linter), - rustfmt (formatter), and rustdoc (documentation - generator). + We will cover the tools that every Rust developer should have in their toolbox: rustup (toolchain management), cargo (build system and package manager), clippy (linter), rustfmt (formatter), and rustdoc (documentation generator). + + - heading: The language text: > - We will cover in detail the core constructs of the Rust language: syntax, - control flow, pattern matching, type system (traits), ownership and - borrowing, polymorphism (generics and trait objects), closures and `Fn*` - traits, and panics. + We will cover in detail the core constructs of the Rust language: syntax, control flow, pattern matching, type system (traits), ownership and borrowing, polymorphism (generics and trait objects), closures and `Fn*` traits, and panics. + + - heading: The standard library text: > - Writing Rust programs is significantly easier if you have mastered the - standard library. We will cover the most important parts of the standard - library, including: primitive types, strings and string slices, - collections and iterators, conversion traits, smart pointers - (Box, Arc, Rc), nullability - handling (Option), error handling (Result), and - concurrency primitives (threads, channels, locks). + Writing Rust programs is significantly easier if you have mastered the standard library. We will cover the most important parts of the standard library, including: primitive types, strings and string slices, collections and iterators, conversion traits, smart pointers (Box, Arc, Rc), nullability handling (Option), error handling (Result), and concurrency primitives (threads, channels, locks). + + - heading: Testing text: > - We will build up your Rust's testing toolkit. We will start from scratch, - with your first unit test. By the end, you will have a comprehensive - understanding of the available test types, the best practices in terms of - test organization as well as their runtime implications. You will be well - equipped for the testing challenges ahead of you! + We will build up your Rust's testing toolkit. We will start from scratch, with your first unit test. By the end, you will have a comprehensive understanding of the available test types, the best practices in terms of test organization as well as their runtime implications. You will be well equipped for the testing challenges ahead of you! + + - heading: Async Rust text: > - We will cover the basics of asynchronous programming in Rust, - including: the Future trait, async functions, - the .await operator, spawning tasks, an overview of - tokio (the most popular async runtime in Rust), as well as - common pitfalls. + We will cover the basics of asynchronous programming in Rust, including: the Future trait, async functions, the .await operator, spawning tasks, an overview of tokio (the most popular async runtime in Rust), as well as common pitfalls. + + leads: - name: Luca Palmieri title: Principal Engineering Consultant handle: algo_luca image: /assets/images/authors/algo_luca.jpg bio: > - Luca Palmieri builds technology products for a living. His current focus - is on backend development, software architecture and the Rust programming - language. He is the author of "Zero to Production in Rust". + Luca Palmieri builds technology products for a living. His current focus is on backend development, software architecture and the Rust programming language. He is the author of "Zero to Production in Rust". --- diff --git a/src/workshops/progressive-enhancement-with-sveltekit.md b/src/workshops/progressive-enhancement-with-sveltekit.md new file mode 100644 index 0000000000..4320ade64c --- /dev/null +++ b/src/workshops/progressive-enhancement-with-sveltekit.md @@ -0,0 +1,59 @@ +--- +title: "Progressive Enhancement with SvelteKit" +tags: "svelte" +format: "Workshop: 1 day" +subtext: "Bookable for teams – on-site or remote" +description: This 1-day workshop gives a comprehensive introduction to building progressive enhanced applications with SvelteKit, covering the theory, as well as guiding participants through implementing real examples. +introduction: "

    Progressive enhancement is a technique for providing a baseline experience in terms of content and functionality to everyone and enhancing that to the optimal experience for everyone that's possible for. That allows, in particular for use cases like e-commerce where every lost visitor is potentially a missed sale, to serve each and everyone of your visitors – as opposed to with a classic SPA where people with a spotty network that doesn't load the JavaScript bundle, would only see a blank page.

    SvelteKit has built-in support for progressive enhancement, yet getting the most out of that requires understanding the underlying principles and applying the right techniques. This workshop gives a comprehensive introduction to building progressive enhanced applications with SvelteKit, covering the theory, as well as guiding participants through implementing real examples.

    " +hero: + color: purple + image: "/assets/images/workshops/progressive-enhancement-with-sveltekit/lego-superman.jpg" + imageAlt: "A Lego superman figure with their cape flying in a wind in front of a dramatic orange/pink sky" +og: + image: /assets/images/workshops/progressive-enhancement-with-sveltekit/og-image.jpg +topics: + - title: Progressive Enhancement + text: > + We'll start by looking into what progressive enhancement is and why it's relevant. We'll look at network speeds and typical latency numbers, as well as at JavaScript bundle sizes, and their impact on load times. + + + - title: Forms in SvelteKit + text: > + One of SvelteKit's main mechanisms for supporting progressive enhancment are forms and form actions that can run in Node on the server side. We'll look at data flows, how forms can be enhanced to be handled on the clients side, and a bit at the underlying magic that makes that process seamless for the developer. + + + - title: "Example: Autocomplete" + text: > + We'll build am input component that starts off as a simple text field without JavaScript and is progressively enhanced into an auto-complete input with JavaScript. + + + - title: "Example: Search" + text: > + Next, we'll build a search UI that works with and without JavaScript. + + + - title: "Testing" + text: > + Building progressively enhanced applications requires testing two scenarios for all flows: one with and one without JavaScript. We'll cover the topic by writing Playwright tests for the previously implemented examples. + + + - title: CSS & Progressive Enhancement + text: > + Some elements of user interfaces can be made functional with CSS alone. We'll look at typical scenarios where that approach works and how UI state can be kept in sync with our Svelte application. + + + - title: "Example: Dialog with inline JavaScript" + text: > + Finally, we'll build a dialog with a tiny snipped of inline JavaScript that works without the entirety of the Svelte application having started. + + +leads: + - name: Paolo Ricciuti + title: Senior Frontend Engineer + handle: paoloricciuti + image: /assets/images/authors/paoloricciuti.jpg + bio: > + Paolo is a huge nerd and Svelte maintainer. He's also one of the creators of sveltelab.dev - a REPL for SvelteKit. +--- + + diff --git a/src/workshops/rust-python-interoperability.md b/src/workshops/rust-python-interoperability.md new file mode 100644 index 0000000000..ac42be72b5 --- /dev/null +++ b/src/workshops/rust-python-interoperability.md @@ -0,0 +1,56 @@ +--- +title: "Rust-Python Interoperability" +tags: "rust" +format: "Workshop: 1 day" +subtext: "Bookable for teams – on-site or remote" +description: > +

    Python has served you well: you spun up a prototype and iterated quickly, keeping up with the evolving requirements of a successful product. Nonetheless, as time goes on, cracks are starting to show up: an endpoint is slower than it needs to be, a data processing job that took seconds now takes almost an hour, and your infrastructure bill is growing too fast compared to the size of your user base. Engineers are starting to whisper: is it time for a rewrite? Should we pause feature development to rebuild everything on more solid foundations? That's an option, but it's expensive.

    There's another path: rather than throwing away your entire Python codebase to start over, you analyse your application and isolate the performance-critical bits—the so-called "hot modules" where your application spends most of its time. You will rewrite those in Rust and package them as a Python native extension. This workshop will teach you how.

    We will cover the pyo3 crate, the subtleties of Python's Global interpreter lock, and typical examples that may arise in your daily Rust-Python interoperability work. By the end of the session, you will be well-equipped to seamlessly replace your slow Python modules with easy-to-use and blazingly fast Rust modules.

    We assume you are familiar with Rust and Python, but we don't assume any prior interoperability knowledge. We will provide a brief explanation and references whenever we rely on advanced features in either language.

    + + +hero: + color: purple + image: "/assets/images/workshops/rust-python-interoperability/header-background.jpg" + imageAlt: "Close-up photo of 3 snake bodies (or 3 parts of the same snake body) stacked on top of each other." +og: + image: /assets/images/workshops/rust-python-interoperability/og-image.jpg +topics: + - title: Introduction to Rust-Python Interoperability + text: > + We kick off with looking at the advantages of combining Rust and Python, understanding where each language shines and why interoperability is valuable. This module introduces tools like PyO3, which enables Rust code integration within Python environments, and maturin, a library for building, packaging and publishing Python extensions written in Rust. + + + - title: Building Python Extensions in Rust + text: > + We'll continue with the process of creating Python-callable Rust functions, setting up projects using PyO3, and configuring the development environment to handle Rust extensions in Python. + + + - title: Managing Data and Types + text: > + Next, participants will learn how to handle complex data structures shared between Rust and Python, with a focus on type conversions, data ownership, and ensuring memory safety across both languages. + + + - title: Concurrency and the GIL + text: > + The workshop covers Python’s Global Interpreter Lock (GIL) and strategies for concurrent programming, including async programming in Rust that can enhance Python’s parallel processing capabilities. + + + - title: Creating Python Classes with Rust + text: > + We move on to explore creating Python-accessible classes directly in Rust using PyO3's #[pyclass] attribute. This module teaches struct definition, implementing methods, and adding Rust-based functionality to Python classes. + + + - title: Static Methods and Inheritance + text: > + The final module details adding static methods to Rust-backed Python classes, along with managing inheritance and visibility in Python environments. + + +leads: + - name: Luca Palmieri + title: Principal Engineering Consultant + handle: algo_luca + image: /assets/images/authors/algo_luca.jpg + bio: > + Luca Palmieri builds technology products for a living. His current focus is on backend development, software architecture and the Rust programming language. He is the author of "Zero to Production in Rust". +--- + + diff --git a/src/workshops/svelte-5-runes.md b/src/workshops/svelte-5-runes.md new file mode 100644 index 0000000000..4d125930f6 --- /dev/null +++ b/src/workshops/svelte-5-runes.md @@ -0,0 +1,64 @@ +--- +title: "Svelte 5 & Runes" +tags: "svelte" +format: "Workshop: 1 day" +subtext: "Bookable for teams – on-site or remote" +description: This 1-day workshop is an introduction to Svelte 5's new concepts, as well as a hands-on guide to migrating from old patterns to Svelte 5 and runes. +introduction: "

    Svelte 5 is a major step forward from version 4 and simplifies how Svelte applications are written. Concepts like snippets and runes, Svelte 5's new set of primitives for controlling reactivity, will replace a number of current concepts that will no longer by required with runes. Yet, as these concept are newly introduced, developers need to learn and them before they can leverage them. This workshop serves as an introduction to Svelte 5's new concepts, as well as a hands-on guide to migrating from old patterns to Svelte 5 and runes.

    " +hero: + color: purple + image: "/assets/images/workshops/svelte-5-runes/runes.jpg" + imageAlt: "A bunch of white stones with yellow runes written on them lying on a grey surface" +og: + image: /assets/images/workshops/svelte-5-runes/og-image.jpg +topics: + - title: From Svelte 4 to 5 + text: > + We'll start with reviewing the differences between Svelte 4 and 5 before looking into the main changes in more detail. + + + - title: The $state rune + text: > + The $state rune is at the core of Svelte 5's runes system so we start with that. We'll cover it's core behavior and implement some examples together. + + + - title: The $derived rune + text: > + The $derived rune replaces Svelte's $: syntax. We'll look into how the rune works, subtle differences to $:, as well as how to migrate to it for typical scenarios. + + + - title: The $effect rune + text: > + Next, we move to the $effect rune. Like for the $state rune, we'll implement some examples and talk about typical use cases. + + + - title: The $props rune + text: > + The $props rune replaces a number of previous concepts around declaring, and receiving properties in components. We'll look into how the rune works as well as how to migrate to it for typical scenarios. + + + - title: Introduction to JavaScript signals + text: > + Once we covered runes, we'll briefly look into JavaScript's upcoming signals primitive which runes are based on. We'll cover the fundamentals of signals and how they might eventually establish a cross-framework reactivity primitive. + + + - title: From Slots to Snippets + text: > + Snippets are a new concept in Svelte 5 that replace slots which are less powerful and flexible. We'll look into how snippets work, what new patterns they enable, and how to migrate from slots to snippets. + + + - title: Automating the Migration + text: > + At least parts of the migration from Svelte 4 to 5 can be automated. We'll look into how that works, what to be aware of, and how to resolve situations where automatic migration fails. + + +leads: + - name: Paolo Ricciuti + title: Senior Frontend Engineer + handle: paoloricciuti + image: /assets/images/authors/paoloricciuti.jpg + bio: > + Paolo is a huge nerd and Svelte maintainer. He's also one of the creators of sveltelab.dev - a REPL for SvelteKit. +--- + + diff --git a/src/workshops/svelte-and-sveltekit.md b/src/workshops/svelte-and-sveltekit.md index c0226ac698..5278812005 100644 --- a/src/workshops/svelte-and-sveltekit.md +++ b/src/workshops/svelte-and-sveltekit.md @@ -1,101 +1,87 @@ --- -title: Svelte & SvelteKit +title: "Svelte & SvelteKit" tags: "svelte" format: "Workshop: 2-3 days" subtext: "Bookable for teams – on-site or remote" -description:

    Svelte is great choice for building fast and light-weight web - applications. Its unique approach of generating reactive code at compile time - instead of relying on a runtime, moves work out of the browser and results in - highly efficient code. Combined with SvelteKit, it enables engineers to build - large applications with ease while being able to choose among patterns like - SPA, MPA, SSR, SSG on a per-route basis.

    - -

    This workshops takes participants through the entire process of building a - complete, real-world application and teaches the theoretical concepts along - the way. Each topic is introduced via an in-depth presentation followed by a - practice exercise.

    - -

    All examples and practical assignments from the workshop are available - publicly on GitHub.

    +description: This 2-3days workshop takes participants through the entire process of building a complete, real-world application and teaches the theoretical concepts along the way. Each topic is introduced via an in-depth presentation followed by a practice exercise. +introduction: +

    Svelte is great choice for building fast and light-weight web applications. Its unique approach of generating reactive code at compile time instead of relying on a runtime, moves work out of the browser and results in highly efficient code. Combined with SvelteKit, it enables engineers to build large applications with ease while being able to choose among patterns like SPA, MPA, SSR, SSG on a per-route basis.

    + +

    This workshop takes participants through the entire process of building a complete, real-world application and teaches the theoretical concepts along the way. Each topic is introduced via an in-depth presentation followed by a practice exercise.

    + +

    All examples and practical assignments from the workshop are available publicly on GitHub.

    hero: color: purple image: "/assets/images/workshops/svelte-and-sveltekit/hero.jpg" - imageAlt: - "Photo of a computer screen showing an IDE with an open Svelte project" + imageAlt: "Photo of a computer screen showing an IDE with an open Svelte project" og: image: /assets/images/workshops/svelte-and-sveltekit/og-image.jpg topics: - title: Svelte Basics text: > - Rendering reactive UIs is the core functionality of Svelte. We cover - Svelte’s unique approach to reactivity, the $ syntax and its - template language. We then look into writing Svelte components, accepting - props, and its CSS scoping feature. + Rendering reactive UIs is the core functionality of Svelte. We cover Svelte’s unique approach to reactivity, the $ syntax and its template language. We then look into writing Svelte components, accepting props, and its CSS scoping feature. + + - title: SvelteKit Basics text: > - This stage introduces SvelteKit, the project framework built on Svelte. We - cover project creation and management, SvelteKit’s file system as well as - creating and managing pages. + This stage introduces SvelteKit, the project framework built on Svelte. We cover project creation and management, SvelteKit’s file system as well as creating and managing pages. + + - title: Routing text: > - We’ll dive deep into SvelteKit’s file based routing, loading and - displaying data as well as topics like route grouping, route params and - redirects. + We’ll dive deep into SvelteKit’s file based routing, loading and displaying data as well as topics like route grouping, route params and redirects. + + - title: Testing text: > - SvelteKit comes with two testing strategies: Vitest for testing components - in isolation and Playwright for end-to-end testing. We cover both in depth - and present approaches for testing real applications. + SvelteKit comes with two testing strategies: Vitest for testing components in isolation and Playwright for end-to-end testing. We cover both in depth and present approaches for testing real applications. + + - title: Stores text: > - This stage kicks off with an introduction of what stores are and how they - work. We continue with looking into implementing the three main stores: - writable, readable, and derived. + This stage kicks off with an introduction of what stores are and how they work. We continue with looking into implementing the three main stores: writable, readable, and derived. + + - title: SvelteKit and Progressive Enhancement text: > - The final stage of the workshop teaches how to implement progressive - enhancement with forms. We cover how to send data to an API, how to - validate forms, what server folders are, and give a brief introduction - into hooks. We close by looking into how to implement authentication. + The final stage of the workshop teaches how to implement progressive enhancement with forms. We cover how to send data to an API, how to validate forms, what server folders are, and give a brief introduction into hooks. We close by looking into how to implement authentication. + + leads: - name: Paolo Ricciuti title: Senior Frontend Engineer handle: paoloricciuti image: /assets/images/authors/paoloricciuti.jpg bio: > - Huge nerd, Svelte Ambassador and lover. He's one of the creators of sveltelab.dev - a REPL for SvelteKit - - built during the first Svelte hackathon that granted him and his - co-creator the first place for best integration. + Huge nerd, Svelte Ambassador and lover. He's one of the creators of sveltelab.dev - a REPL for SvelteKit - built during the first Svelte hackathon that granted him and his co-creator the first place for best integration. + + - name: Daniel Beer title: Senior Frontend Engineer handle: beerinho authorHandle: beerinho image: /assets/images/authors/beerinho.jpg bio: > - With experience in Angular and EmberJS, Daniel has as a varied background - in JS Frameworks and enjoys exploring new technologies. He has used - SvelteKit on multiple projects with great success. + With experience in Angular and EmberJS, Daniel has as a varied background in JS Frameworks and enjoys exploring new technologies. He has used SvelteKit on multiple projects with great success. + + - name: Gabor Babicz title: Senior Frontend Engineer handle: zeppelin image: /assets/images/authors/zeppelin.jpg bio: > - Gabor is a passionate frontend engineer who has spent the past two decades - designing interfaces, merging functionality and aesthetics to create - remarkable digital experiences. + Gabor is a passionate frontend engineer who has spent the past two decades designing interfaces, merging functionality and aesthetics to create remarkable digital experiences. + + - name: Florian Pichler title: Senior Frontend Engineer handle: pichfl authorHandle: pichfl image: /assets/images/authors/pichfl.jpg bio: > - Florian has been solving frontend challenges for over 15 years, with all - tools that became available. He has built and coached design and - development teams of all sizes. + Florian has been solving frontend challenges for over 15 years, with all tools that became available. He has built and coached design and development teams of all sizes. --- -The workshop can be customized for the specific needs of your team to cover -topics like performance, debugging, or others. +The workshop can be customized for the specific needs of your team to cover topics like performance, debugging, or others. diff --git a/src/workshops/telemetry-for-rust-apis.md b/src/workshops/telemetry-for-rust-apis.md index 969c4b8825..bf012f146d 100644 --- a/src/workshops/telemetry-for-rust-apis.md +++ b/src/workshops/telemetry-for-rust-apis.md @@ -3,52 +3,42 @@ title: "You can't fix what you can't see: telemetry for Rust APIs" tags: "rust" format: "Workshop: 1 day" subtext: "Bookable for teams – on-site or remote" -description: -

    Your Rust application has finally been deployed to production! Nice! But is - it working? This workshop will introduce you to a comprehensive toolkit to - detect, troubleshoot and resolve issues in your Rust APIs.

    This workshop - is designed for developers who are operating Rust services in production-like - environments, or are preparing to do so.

    +description: "This 1-day workshop will introduce you to a comprehensive toolkit to detect, troubleshoot and resolve issues in your Rust APIs. The workshop is designed for developers who are operating Rust services in production-like environments, or are preparing to do so." +introduction:

    Your Rust application has finally been deployed to production! Nice! But is it working? This workshop will introduce you to a comprehensive toolkit to detect, troubleshoot and resolve issues in your Rust APIs.

    This workshop is designed for developers who are operating Rust services in production-like environments, or are preparing to do so.

    hero: color: purple image: "/assets/images/workshops/telemetry-for-rust-apis/header-background.jpg" - imageAlt: - "2 people in front of a notebook with 3 charts on the screen, only their - arms visible, one points at the screen" + imageAlt: "2 people in front of a notebook with 3 charts on the screen, only their arms visible, one points at the screen" og: image: /assets/images/workshops/telemetry-for-rust-apis/og-image.jpg topics: - title: Structured logging (tracing) text: > - An introduction to the tracing instrumentation library, - covering both how to instrument your code (capturing fields, log levels, - macros) and how to process the resulting telemetry data in your - application (subscriber configuration, logging levels, log filtering). + An introduction to the tracing instrumentation library, covering both how to instrument your code (capturing fields, log levels, macros) and how to process the resulting telemetry data in your application (subscriber configuration, logging levels, log filtering). + + - title: Error handling text: > - We will cover Rust’s Error trait, with a focus on the - information that can be retrieved and recorded in your logs; we will also - spend some time on logging patterns (e.g. when should an error be - logged?). + We will cover Rust’s Error trait, with a focus on the information that can be retrieved and recorded in your logs; we will also spend some time on logging patterns (e.g. when should an error be logged?). + + - title: Panic handling text: > - You should always manage to capture details about what went wrong, even if - it’s due to an uncaught panic rather than an error. We will review panic - hooks and integrate them in our tracing setup. + You should always manage to capture details about what went wrong, even if it’s due to an uncaught panic rather than an error. We will review panic hooks and integrate them in our tracing setup. + + - title: Metrics text: > - Structured logs are important, but they don’t tell the full story. We will - look at how to capture metric data using the metrics library, - as a tool for designing alarms as well troubleshooting faulty behaviour. + Structured logs are important, but they don’t tell the full story. We will look at how to capture metric data using the metrics library, as a tool for designing alarms as well troubleshooting faulty behaviour. + + leads: - name: Luca Palmieri title: Principal Engineering Consultant handle: algo_luca image: /assets/images/authors/algo_luca.jpg bio: > - Luca Palmieri builds technology products for a living. His current focus - is on backend development, software architecture and the Rust programming - language. He is the author of "Zero to Production in Rust". + Luca Palmieri builds technology products for a living. His current focus is on backend development, software architecture and the Rust programming language. He is the author of "Zero to Production in Rust". --- diff --git a/src/workshops/testing-svelte-sveltekit-applications.md b/src/workshops/testing-svelte-sveltekit-applications.md new file mode 100644 index 0000000000..2a01c82150 --- /dev/null +++ b/src/workshops/testing-svelte-sveltekit-applications.md @@ -0,0 +1,49 @@ +--- +title: "Testing Svelte & SvelteKit applications" +tags: "svelte" +format: "Workshop: 1 day" +subtext: "Bookable for teams – on-site or remote" +description: "This 1-day workshop is a complete introduction to testing Svelte and SvelteKit applications. It covers both guidance on what to test and how, as well as concrete techniques for writing tests that are fast, stable, and easy to maintain." +introduction: "

    Testing is a critical part of building any non-trivial application – without automatic test coverage, you can't really know whether things work as expected or you're breaking things as you continue building out an application. This workshop covers both guidance on what to test and how, as well as concrete techniques for writing tests that are fast, stable, and easy to maintain.

    " +hero: + color: purple + image: "/assets/images/workshops/testing-svelte-sveltekit-applications/classroom.jpg" + imageAlt: "Photo of a classroom with benches facing a blackboard" +og: + image: /assets/images/workshops/testing-svelte-sveltekit-applications/og-image.jpg +topics: + - title: The Testing Pyramid + text: > + We'll start off with some basic theory, talking about the testing pyramid. The testing pyramid gives guidance on what kind of test to use for testing what aspect of a system as well as how much coverage is required at what level of the pyramid. + + + - title: Unit tests with Vitest + text: > + Unit tests are at the lowest level of the testing pyramid so we'll start with those. + + + - title: Component tests with Vitest, Testing Library and Storybook + text: > + Next, we progress to writing components tests with Vitest and testing library. We'll look into writing functional tests for Svelte components as well as explore techniques like snapshot testing and visual testing with Storybook. + + + - title: End-to-end tests with Playwright + text: > + End-to-end tests sit at the top of the testing pyramid and we'll end with those. We'll look into writing tests that cover the entirety of our isomorphic SvelteKit application with Playwright. + + + - title: Full-stack application testing and data + text: > + Tests require a well-known state that the test runs against so we can make assertions on the result. That can be challenging, in particular for end-to-end tests where the state might need to exist outside of the SvelteKit application. We'll look at typical challenges as well as techniques + + +leads: + - name: Paolo Ricciuti + title: Senior Frontend Engineer + handle: paoloricciuti + image: /assets/images/authors/paoloricciuti.jpg + bio: > + Paolo is a huge nerd and Svelte maintainer. He's also one of the creators of sveltelab.dev - a REPL for SvelteKit. +--- + + diff --git a/static/assets/images/authors/hdoordt.jpg b/static/assets/images/authors/hdoordt.jpg new file mode 100644 index 0000000000..a052659eed Binary files /dev/null and b/static/assets/images/authors/hdoordt.jpg differ diff --git a/static/assets/images/blog/og-image.jpg b/static/assets/images/blog/og-image.jpg index 8111fef79a..88a7f1a10f 100644 Binary files a/static/assets/images/blog/og-image.jpg and b/static/assets/images/blog/og-image.jpg differ diff --git a/static/assets/images/calendar/2024-10-03-viteconf-24/viteconf-logo.png b/static/assets/images/calendar/2024-10-03-viteconf-24/viteconf-logo.png new file mode 100644 index 0000000000..8de47e620c Binary files /dev/null and b/static/assets/images/calendar/2024-10-03-viteconf-24/viteconf-logo.png differ diff --git a/static/assets/images/calendar/2024-11-19-embereuropeq4-remote/embereurope.png b/static/assets/images/calendar/2024-11-19-embereuropeq4-remote/embereurope.png new file mode 100644 index 0000000000..4730a8dd9a Binary files /dev/null and b/static/assets/images/calendar/2024-11-19-embereuropeq4-remote/embereurope.png differ diff --git a/static/assets/images/calendar/2024-11-19-embereuropeq4-remote/logo.png b/static/assets/images/calendar/2024-11-19-embereuropeq4-remote/logo.png new file mode 100644 index 0000000000..7f4a5ced8a Binary files /dev/null and b/static/assets/images/calendar/2024-11-19-embereuropeq4-remote/logo.png differ diff --git a/static/assets/images/calendar/2024-11-27-weyweyweb/weyweyweb-logo.png b/static/assets/images/calendar/2024-11-27-weyweyweb/weyweyweb-logo.png new file mode 100644 index 0000000000..42ffbe3cba Binary files /dev/null and b/static/assets/images/calendar/2024-11-27-weyweyweb/weyweyweb-logo.png differ diff --git a/static/assets/images/calendar/2024-11-28-rust-hack-and-learn-with-mainmatter-and-otto/rust.png b/static/assets/images/calendar/2024-11-28-rust-hack-and-learn-with-mainmatter-and-otto/rust.png new file mode 100644 index 0000000000..ba88399e60 Binary files /dev/null and b/static/assets/images/calendar/2024-11-28-rust-hack-and-learn-with-mainmatter-and-otto/rust.png differ diff --git a/static/assets/images/calendar/2025-05-05-rust-workshop-adc/rust.png b/static/assets/images/calendar/2025-05-05-rust-workshop-adc/rust.png new file mode 100644 index 0000000000..ba88399e60 Binary files /dev/null and b/static/assets/images/calendar/2025-05-05-rust-workshop-adc/rust.png differ diff --git a/static/assets/images/calendar/2025-05-08-svelte-summit/svelte.png b/static/assets/images/calendar/2025-05-08-svelte-summit/svelte.png new file mode 100644 index 0000000000..3716f76317 Binary files /dev/null and b/static/assets/images/calendar/2025-05-08-svelte-summit/svelte.png differ diff --git a/static/assets/images/calendar/2025-05-08-svelte-summit/venue.jpg b/static/assets/images/calendar/2025-05-08-svelte-summit/venue.jpg new file mode 100644 index 0000000000..e2b75f8710 Binary files /dev/null and b/static/assets/images/calendar/2025-05-08-svelte-summit/venue.jpg differ diff --git a/static/assets/images/calendar/2025-10-09-eurorust/paris.jpg b/static/assets/images/calendar/2025-10-09-eurorust/paris.jpg new file mode 100644 index 0000000000..4aef7a2d66 Binary files /dev/null and b/static/assets/images/calendar/2025-10-09-eurorust/paris.jpg differ diff --git a/static/assets/images/calendar/2025-10-09-eurorust/rust.png b/static/assets/images/calendar/2025-10-09-eurorust/rust.png new file mode 100644 index 0000000000..ba88399e60 Binary files /dev/null and b/static/assets/images/calendar/2025-10-09-eurorust/rust.png differ diff --git a/static/assets/images/clutch/awards/arts-entertainment.png b/static/assets/images/clutch/awards/arts-entertainment.png new file mode 100644 index 0000000000..06b6e33d9f Binary files /dev/null and b/static/assets/images/clutch/awards/arts-entertainment.png differ diff --git a/static/assets/images/clutch/awards/ember.png b/static/assets/images/clutch/awards/ember.png new file mode 100644 index 0000000000..788c7c179c Binary files /dev/null and b/static/assets/images/clutch/awards/ember.png differ diff --git a/static/assets/images/clutch/awards/financial.png b/static/assets/images/clutch/awards/financial.png new file mode 100644 index 0000000000..824f86e9a8 Binary files /dev/null and b/static/assets/images/clutch/awards/financial.png differ diff --git a/static/assets/images/clutch/awards/logistics.png b/static/assets/images/clutch/awards/logistics.png new file mode 100644 index 0000000000..f288cf9ebc Binary files /dev/null and b/static/assets/images/clutch/awards/logistics.png differ diff --git a/static/assets/images/clutch/awards/node.png b/static/assets/images/clutch/awards/node.png new file mode 100644 index 0000000000..035aaff2eb Binary files /dev/null and b/static/assets/images/clutch/awards/node.png differ diff --git a/static/assets/images/clutch/awards/rust.png b/static/assets/images/clutch/awards/rust.png new file mode 100644 index 0000000000..4521c8fdae Binary files /dev/null and b/static/assets/images/clutch/awards/rust.png differ diff --git a/static/assets/images/clutch/awards/staff-aug.png b/static/assets/images/clutch/awards/staff-aug.png new file mode 100644 index 0000000000..43bcc28dca Binary files /dev/null and b/static/assets/images/clutch/awards/staff-aug.png differ diff --git a/static/assets/images/elixir/lp-elixir-phoenix-consulting-og-image.jpg b/static/assets/images/elixir/lp-elixir-phoenix-consulting-og-image.jpg deleted file mode 100644 index 86e70a4480..0000000000 Binary files a/static/assets/images/elixir/lp-elixir-phoenix-consulting-og-image.jpg and /dev/null differ diff --git a/static/assets/images/elixir/og-image.png b/static/assets/images/elixir/og-image.png new file mode 100644 index 0000000000..5bece6e441 Binary files /dev/null and b/static/assets/images/elixir/og-image.png differ diff --git a/static/assets/images/ember-initiative/embroider-vite-upgrade/og-image.png b/static/assets/images/ember-initiative/embroider-vite-upgrade/og-image.png index c20fad0506..6827497945 100644 Binary files a/static/assets/images/ember-initiative/embroider-vite-upgrade/og-image.png and b/static/assets/images/ember-initiative/embroider-vite-upgrade/og-image.png differ diff --git a/static/assets/images/ember/lp-ember-consulting-og-image.jpg b/static/assets/images/ember/lp-ember-consulting-og-image.jpg deleted file mode 100644 index 994bc4b789..0000000000 Binary files a/static/assets/images/ember/lp-ember-consulting-og-image.jpg and /dev/null differ diff --git a/static/assets/images/ember/og-image.png b/static/assets/images/ember/og-image.png new file mode 100644 index 0000000000..140c84f1a7 Binary files /dev/null and b/static/assets/images/ember/og-image.png differ diff --git a/static/assets/images/hero/Regensburg.png b/static/assets/images/hero/Regensburg.png new file mode 100644 index 0000000000..eb0818b97d Binary files /dev/null and b/static/assets/images/hero/Regensburg.png differ diff --git a/static/assets/images/hero/hamburg.png b/static/assets/images/hero/hamburg.png new file mode 100644 index 0000000000..4a444e602c Binary files /dev/null and b/static/assets/images/hero/hamburg.png differ diff --git a/static/assets/images/hero/kids.jpg b/static/assets/images/hero/kids.jpg new file mode 100644 index 0000000000..24476ad942 Binary files /dev/null and b/static/assets/images/hero/kids.jpg differ diff --git a/static/assets/images/hero/table-soccer.jpg b/static/assets/images/hero/table-soccer.jpg new file mode 100644 index 0000000000..7a0c38094a Binary files /dev/null and b/static/assets/images/hero/table-soccer.jpg differ diff --git a/static/assets/images/hero/viteconf-24.png b/static/assets/images/hero/viteconf-24.png new file mode 100644 index 0000000000..46a7036f8f Binary files /dev/null and b/static/assets/images/hero/viteconf-24.png differ diff --git a/static/assets/images/hero/weyweyweb-malaga-spain.jpg b/static/assets/images/hero/weyweyweb-malaga-spain.jpg new file mode 100644 index 0000000000..2607dcdb17 Binary files /dev/null and b/static/assets/images/hero/weyweyweb-malaga-spain.jpg differ diff --git a/static/assets/images/logos/monochrome/crabnebula.svg b/static/assets/images/logos/monochrome/crabnebula.svg new file mode 100644 index 0000000000..c22fafa8d8 --- /dev/null +++ b/static/assets/images/logos/monochrome/crabnebula.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/logos/monochrome/helsing.svg b/static/assets/images/logos/monochrome/helsing.svg new file mode 100644 index 0000000000..fa2c3e2109 --- /dev/null +++ b/static/assets/images/logos/monochrome/helsing.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/logos/monochrome/oreilly.svg b/static/assets/images/logos/monochrome/oreilly.svg new file mode 100644 index 0000000000..935f090569 --- /dev/null +++ b/static/assets/images/logos/monochrome/oreilly.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/logos/terminal49.svg b/static/assets/images/logos/terminal49.svg new file mode 100644 index 0000000000..76aeb9ade1 --- /dev/null +++ b/static/assets/images/logos/terminal49.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/images/og-image.jpg b/static/assets/images/og-image.jpg index e5499767d8..72544d8ee9 100644 Binary files a/static/assets/images/og-image.jpg and b/static/assets/images/og-image.jpg differ diff --git a/static/assets/images/photos/travel-hero.jpg b/static/assets/images/photos/travel-hero.jpg new file mode 100644 index 0000000000..0c2816c7b0 Binary files /dev/null and b/static/assets/images/photos/travel-hero.jpg differ diff --git a/static/assets/images/photos/travel-whitepaper-cover.jpg b/static/assets/images/photos/travel-whitepaper-cover.jpg new file mode 100644 index 0000000000..db3a388754 Binary files /dev/null and b/static/assets/images/photos/travel-whitepaper-cover.jpg differ diff --git a/static/assets/images/posts/2024-09-27-exploring-the-potential-of-rust-in-serverless-computing-with-luciano-mammino/header.jpg b/static/assets/images/posts/2024-09-27-exploring-the-potential-of-rust-in-serverless-computing-with-luciano-mammino/header.jpg new file mode 100644 index 0000000000..945739111f Binary files /dev/null and b/static/assets/images/posts/2024-09-27-exploring-the-potential-of-rust-in-serverless-computing-with-luciano-mammino/header.jpg differ diff --git a/static/assets/images/posts/2024-09-27-exploring-the-potential-of-rust-in-serverless-computing-with-luciano-mammino/og-image.png b/static/assets/images/posts/2024-09-27-exploring-the-potential-of-rust-in-serverless-computing-with-luciano-mammino/og-image.png new file mode 100644 index 0000000000..b26f479efc Binary files /dev/null and b/static/assets/images/posts/2024-09-27-exploring-the-potential-of-rust-in-serverless-computing-with-luciano-mammino/og-image.png differ diff --git a/static/assets/images/posts/2024-10-30-introducing-sheepdogjs/og-image.png b/static/assets/images/posts/2024-10-30-introducing-sheepdogjs/og-image.png new file mode 100644 index 0000000000..b71a35fd3d Binary files /dev/null and b/static/assets/images/posts/2024-10-30-introducing-sheepdogjs/og-image.png differ diff --git a/static/assets/images/posts/2024-12-02-trash-in-treasure-out/og-image.png b/static/assets/images/posts/2024-12-02-trash-in-treasure-out/og-image.png new file mode 100644 index 0000000000..b909eac15a Binary files /dev/null and b/static/assets/images/posts/2024-12-02-trash-in-treasure-out/og-image.png differ diff --git a/static/assets/images/posts/2024-12-02-trash-in-treasure-out/state-diagram.svg b/static/assets/images/posts/2024-12-02-trash-in-treasure-out/state-diagram.svg new file mode 100644 index 0000000000..33776bfd6e --- /dev/null +++ b/static/assets/images/posts/2024-12-02-trash-in-treasure-out/state-diagram.svg @@ -0,0 +1 @@ +

    Select origin

    Select destination

    Enter departure timestamp

    Select trip

    Enter arrival timestamp

    Select class

    Enter name

    Enter email

    Enter phone number

    Book and pay

    \ No newline at end of file diff --git a/static/assets/images/rebranding/cargo.svg b/static/assets/images/rebranding/cargo.svg new file mode 100644 index 0000000000..fecab30de5 --- /dev/null +++ b/static/assets/images/rebranding/cargo.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/ruby/lp-ruby-consulting-og-image.jpg b/static/assets/images/ruby/lp-ruby-consulting-og-image.jpg deleted file mode 100644 index d5e36d927b..0000000000 Binary files a/static/assets/images/ruby/lp-ruby-consulting-og-image.jpg and /dev/null differ diff --git a/static/assets/images/ruby/og-image.png b/static/assets/images/ruby/og-image.png new file mode 100644 index 0000000000..c7d3509e16 Binary files /dev/null and b/static/assets/images/ruby/og-image.png differ diff --git a/static/assets/images/rust/book.svg b/static/assets/images/rust/book.svg new file mode 100644 index 0000000000..ce4961b052 --- /dev/null +++ b/static/assets/images/rust/book.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/rust/cargo.svg b/static/assets/images/rust/cargo.svg new file mode 100644 index 0000000000..fecab30de5 --- /dev/null +++ b/static/assets/images/rust/cargo.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/rust/eurorust-2024.jpg b/static/assets/images/rust/eurorust-2024.jpg new file mode 100644 index 0000000000..d68d45ce28 Binary files /dev/null and b/static/assets/images/rust/eurorust-2024.jpg differ diff --git a/static/assets/images/rust/eurorust-crab.jpg b/static/assets/images/rust/eurorust-crab.jpg new file mode 100644 index 0000000000..9063cbbd84 Binary files /dev/null and b/static/assets/images/rust/eurorust-crab.jpg differ diff --git a/static/assets/images/rust/gerust-logo.svg b/static/assets/images/rust/gerust-logo.svg new file mode 100644 index 0000000000..cce9701e8a --- /dev/null +++ b/static/assets/images/rust/gerust-logo.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/images/rust/lp-rust-consulting-og-image.jpg b/static/assets/images/rust/lp-rust-consulting-og-image.jpg deleted file mode 100644 index 3c23d42394..0000000000 Binary files a/static/assets/images/rust/lp-rust-consulting-og-image.jpg and /dev/null differ diff --git a/static/assets/images/rust/og-image.png b/static/assets/images/rust/og-image.png new file mode 100644 index 0000000000..c7be3c4f60 Binary files /dev/null and b/static/assets/images/rust/og-image.png differ diff --git a/static/assets/images/svelte/lp-svelte-consulting-og-image.jpg b/static/assets/images/svelte/lp-svelte-consulting-og-image.jpg deleted file mode 100644 index c828391a54..0000000000 Binary files a/static/assets/images/svelte/lp-svelte-consulting-og-image.jpg and /dev/null differ diff --git a/static/assets/images/svelte/og-image.png b/static/assets/images/svelte/og-image.png new file mode 100644 index 0000000000..69e505cf26 Binary files /dev/null and b/static/assets/images/svelte/og-image.png differ diff --git a/static/assets/images/svelte/sheepdog.svg b/static/assets/images/svelte/sheepdog.svg new file mode 100644 index 0000000000..ed22985c54 --- /dev/null +++ b/static/assets/images/svelte/sheepdog.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/static/assets/images/svelte/svelte-summit.png b/static/assets/images/svelte/svelte-summit.png index 58d3402a9f..de91d31992 100644 Binary files a/static/assets/images/svelte/svelte-summit.png and b/static/assets/images/svelte/svelte-summit.png differ diff --git a/static/assets/images/talks/2024-02-07-rustweb-london/luca-new.png b/static/assets/images/talks/2024-02-07-rustweb-london/luca-new.png new file mode 100644 index 0000000000..3f432d2671 Binary files /dev/null and b/static/assets/images/talks/2024-02-07-rustweb-london/luca-new.png differ diff --git a/static/assets/images/talks/2024-02-07-rustweb-london/new-thumbnail-luca.png b/static/assets/images/talks/2024-02-07-rustweb-london/new-thumbnail-luca.png new file mode 100644 index 0000000000..2459dc11c1 Binary files /dev/null and b/static/assets/images/talks/2024-02-07-rustweb-london/new-thumbnail-luca.png differ diff --git a/static/assets/images/talks/2024-02-07-rustweb-london/new-thumbnail.png b/static/assets/images/talks/2024-02-07-rustweb-london/new-thumbnail.png new file mode 100644 index 0000000000..073cf0acf9 Binary files /dev/null and b/static/assets/images/talks/2024-02-07-rustweb-london/new-thumbnail.png differ diff --git a/static/assets/images/talks/2024-02-07-rustweb-london/panel-new.png b/static/assets/images/talks/2024-02-07-rustweb-london/panel-new.png new file mode 100644 index 0000000000..6e61a90b42 Binary files /dev/null and b/static/assets/images/talks/2024-02-07-rustweb-london/panel-new.png differ diff --git a/static/assets/images/talks/2024-03-21-embereurope-2024-q1/ember-logo.png b/static/assets/images/talks/2024-03-21-embereurope-2024-q1/ember-logo.png new file mode 100644 index 0000000000..c5ded6cc96 Binary files /dev/null and b/static/assets/images/talks/2024-03-21-embereurope-2024-q1/ember-logo.png differ diff --git a/static/assets/images/talks/2024-03-21-embereurope-2024-q1/new-thumbnail.png b/static/assets/images/talks/2024-03-21-embereurope-2024-q1/new-thumbnail.png new file mode 100644 index 0000000000..00a9f345a0 Binary files /dev/null and b/static/assets/images/talks/2024-03-21-embereurope-2024-q1/new-thumbnail.png differ diff --git a/static/assets/images/talks/2024-03-21-embereurope-2024-q1/new-thumbnails.png b/static/assets/images/talks/2024-03-21-embereurope-2024-q1/new-thumbnails.png new file mode 100644 index 0000000000..8ce1eb2440 Binary files /dev/null and b/static/assets/images/talks/2024-03-21-embereurope-2024-q1/new-thumbnails.png differ diff --git a/static/assets/images/talks/2024-03-26-rustnationuk-2024/new-logo.png b/static/assets/images/talks/2024-03-26-rustnationuk-2024/new-logo.png new file mode 100644 index 0000000000..290af85723 Binary files /dev/null and b/static/assets/images/talks/2024-03-26-rustnationuk-2024/new-logo.png differ diff --git a/static/assets/images/talks/2024-03-26-rustnationuk-2024/new-thumbnail.png b/static/assets/images/talks/2024-03-26-rustnationuk-2024/new-thumbnail.png new file mode 100644 index 0000000000..60565b1b08 Binary files /dev/null and b/static/assets/images/talks/2024-03-26-rustnationuk-2024/new-thumbnail.png differ diff --git a/static/assets/images/talks/2024-03-26-rustnationuk-2024/new-thumbnails.png b/static/assets/images/talks/2024-03-26-rustnationuk-2024/new-thumbnails.png new file mode 100644 index 0000000000..d82ec74c80 Binary files /dev/null and b/static/assets/images/talks/2024-03-26-rustnationuk-2024/new-thumbnails.png differ diff --git a/static/assets/images/talks/2024-04-23-rust-web-berlin/new-thumbnails.png b/static/assets/images/talks/2024-04-23-rust-web-berlin/new-thumbnails.png new file mode 100644 index 0000000000..74df54fe4b Binary files /dev/null and b/static/assets/images/talks/2024-04-23-rust-web-berlin/new-thumbnails.png differ diff --git a/static/assets/images/talks/2024-04-27-fullstack-testing/new-thumbnails.png b/static/assets/images/talks/2024-04-27-fullstack-testing/new-thumbnails.png new file mode 100644 index 0000000000..b5268801b4 Binary files /dev/null and b/static/assets/images/talks/2024-04-27-fullstack-testing/new-thumbnails.png differ diff --git a/static/assets/images/talks/2024-09-13-emberconf-2024/logo.svg b/static/assets/images/talks/2024-09-13-emberconf-2024/logo.svg new file mode 100644 index 0000000000..39a5037a1c --- /dev/null +++ b/static/assets/images/talks/2024-09-13-emberconf-2024/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/assets/images/talks/2024-09-13-emberconf-2024/new-logo.png b/static/assets/images/talks/2024-09-13-emberconf-2024/new-logo.png new file mode 100644 index 0000000000..2fbc9e063c Binary files /dev/null and b/static/assets/images/talks/2024-09-13-emberconf-2024/new-logo.png differ diff --git a/static/assets/images/talks/2024-09-13-emberconf-2024/new-thumbnail.png b/static/assets/images/talks/2024-09-13-emberconf-2024/new-thumbnail.png new file mode 100644 index 0000000000..dfc4a1ae1d Binary files /dev/null and b/static/assets/images/talks/2024-09-13-emberconf-2024/new-thumbnail.png differ diff --git a/static/assets/images/talks/2024-09-13-emberconf-2024/thumbnail.png b/static/assets/images/talks/2024-09-13-emberconf-2024/thumbnail.png new file mode 100644 index 0000000000..8e8b7cf34b Binary files /dev/null and b/static/assets/images/talks/2024-09-13-emberconf-2024/thumbnail.png differ diff --git a/static/assets/images/talks/2024-09-13-rust-linux-inlaws/logo.png b/static/assets/images/talks/2024-09-13-rust-linux-inlaws/logo.png new file mode 100644 index 0000000000..5d59229b51 Binary files /dev/null and b/static/assets/images/talks/2024-09-13-rust-linux-inlaws/logo.png differ diff --git a/static/assets/images/talks/2024-09-13-rust-linux-inlaws/new-thumbnail.png b/static/assets/images/talks/2024-09-13-rust-linux-inlaws/new-thumbnail.png new file mode 100644 index 0000000000..b42bc08c92 Binary files /dev/null and b/static/assets/images/talks/2024-09-13-rust-linux-inlaws/new-thumbnail.png differ diff --git a/static/assets/images/talks/2024-09-13-rust-linux-inlaws/thumbnail.png b/static/assets/images/talks/2024-09-13-rust-linux-inlaws/thumbnail.png new file mode 100644 index 0000000000..c03cadc444 Binary files /dev/null and b/static/assets/images/talks/2024-09-13-rust-linux-inlaws/thumbnail.png differ diff --git a/static/assets/images/talks/2024-09-13-rustweb-barcelona/logo.png b/static/assets/images/talks/2024-09-13-rustweb-barcelona/logo.png new file mode 100644 index 0000000000..5d59229b51 Binary files /dev/null and b/static/assets/images/talks/2024-09-13-rustweb-barcelona/logo.png differ diff --git a/static/assets/images/talks/2024-09-13-rustweb-barcelona/new-thumbnail.png b/static/assets/images/talks/2024-09-13-rustweb-barcelona/new-thumbnail.png new file mode 100644 index 0000000000..d45f18d286 Binary files /dev/null and b/static/assets/images/talks/2024-09-13-rustweb-barcelona/new-thumbnail.png differ diff --git a/static/assets/images/talks/2024-09-13-rustweb-barcelona/thumbnail.png b/static/assets/images/talks/2024-09-13-rustweb-barcelona/thumbnail.png new file mode 100644 index 0000000000..c8948018b5 Binary files /dev/null and b/static/assets/images/talks/2024-09-13-rustweb-barcelona/thumbnail.png differ diff --git a/static/assets/images/talks/2024-10-03-viteconf/logo.png b/static/assets/images/talks/2024-10-03-viteconf/logo.png new file mode 100644 index 0000000000..62618b5641 Binary files /dev/null and b/static/assets/images/talks/2024-10-03-viteconf/logo.png differ diff --git a/static/assets/images/talks/2024-10-03-viteconf/thumbnail.png b/static/assets/images/talks/2024-10-03-viteconf/thumbnail.png new file mode 100644 index 0000000000..f29944dcf6 Binary files /dev/null and b/static/assets/images/talks/2024-10-03-viteconf/thumbnail.png differ diff --git a/static/assets/images/team/celli.jpg b/static/assets/images/team/celli.jpg new file mode 100644 index 0000000000..6105e09467 Binary files /dev/null and b/static/assets/images/team/celli.jpg differ diff --git a/static/assets/images/travel/lp-travel-og-image.jpg b/static/assets/images/travel/lp-travel-og-image.jpg new file mode 100644 index 0000000000..3a3bcea8da Binary files /dev/null and b/static/assets/images/travel/lp-travel-og-image.jpg differ diff --git a/static/assets/images/work/og-image.jpg b/static/assets/images/work/og-image.jpg new file mode 100644 index 0000000000..7595fcc9e2 Binary files /dev/null and b/static/assets/images/work/og-image.jpg differ diff --git a/static/assets/images/workshops/a-taste-of-rust/a-taste-of-rust-og-image.jpeg b/static/assets/images/workshops/a-taste-of-rust/a-taste-of-rust-og-image.jpeg deleted file mode 100644 index eca6ad2e30..0000000000 Binary files a/static/assets/images/workshops/a-taste-of-rust/a-taste-of-rust-og-image.jpeg and /dev/null differ diff --git a/static/assets/images/workshops/authentication-for-svelte-sveltekit/lock.jpg b/static/assets/images/workshops/authentication-for-svelte-sveltekit/lock.jpg new file mode 100644 index 0000000000..47eb2c1f04 Binary files /dev/null and b/static/assets/images/workshops/authentication-for-svelte-sveltekit/lock.jpg differ diff --git a/static/assets/images/workshops/authentication-for-svelte-sveltekit/og-image.jpg b/static/assets/images/workshops/authentication-for-svelte-sveltekit/og-image.jpg new file mode 100644 index 0000000000..a7596c7a3b Binary files /dev/null and b/static/assets/images/workshops/authentication-for-svelte-sveltekit/og-image.jpg differ diff --git a/static/assets/images/workshops/introduction-to-rust-for-web-developers/og-image.jpg b/static/assets/images/workshops/introduction-to-rust-for-web-developers/og-image.jpg index 1edd1c007a..9ab8a1377b 100644 Binary files a/static/assets/images/workshops/introduction-to-rust-for-web-developers/og-image.jpg and b/static/assets/images/workshops/introduction-to-rust-for-web-developers/og-image.jpg differ diff --git a/static/assets/images/workshops/learn-rust-starting-from-scratch/og-image.jpeg b/static/assets/images/workshops/learn-rust-starting-from-scratch/og-image.jpeg deleted file mode 100644 index 0909c7ab7e..0000000000 Binary files a/static/assets/images/workshops/learn-rust-starting-from-scratch/og-image.jpeg and /dev/null differ diff --git a/static/assets/images/workshops/learn-rust-starting-from-scratch/og-image.jpg b/static/assets/images/workshops/learn-rust-starting-from-scratch/og-image.jpg new file mode 100644 index 0000000000..c7d3b767ad Binary files /dev/null and b/static/assets/images/workshops/learn-rust-starting-from-scratch/og-image.jpg differ diff --git a/static/assets/images/workshops/product-design-sprint/box.svg b/static/assets/images/workshops/product-design-sprint/box.svg deleted file mode 100644 index 7202521958..0000000000 --- a/static/assets/images/workshops/product-design-sprint/box.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/static/assets/images/workshops/product-design-sprint/check.svg b/static/assets/images/workshops/product-design-sprint/check.svg deleted file mode 100644 index 301f62f0ef..0000000000 --- a/static/assets/images/workshops/product-design-sprint/check.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/static/assets/images/workshops/product-design-sprint/edit.svg b/static/assets/images/workshops/product-design-sprint/edit.svg deleted file mode 100644 index 5dd601ee3a..0000000000 --- a/static/assets/images/workshops/product-design-sprint/edit.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/static/assets/images/workshops/product-design-sprint/fast-forward.svg b/static/assets/images/workshops/product-design-sprint/fast-forward.svg deleted file mode 100644 index a59010dc95..0000000000 --- a/static/assets/images/workshops/product-design-sprint/fast-forward.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/static/assets/images/workshops/product-design-sprint/mic.svg b/static/assets/images/workshops/product-design-sprint/mic.svg deleted file mode 100644 index 28a7399918..0000000000 --- a/static/assets/images/workshops/product-design-sprint/mic.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/static/assets/images/workshops/product-design-sprint/og-image.jpg b/static/assets/images/workshops/product-design-sprint/og-image.jpg deleted file mode 100644 index fff7945995..0000000000 Binary files a/static/assets/images/workshops/product-design-sprint/og-image.jpg and /dev/null differ diff --git a/static/assets/images/workshops/product-design-sprint/smartphone.svg b/static/assets/images/workshops/product-design-sprint/smartphone.svg deleted file mode 100644 index 08b234c703..0000000000 --- a/static/assets/images/workshops/product-design-sprint/smartphone.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/static/assets/images/workshops/web-based-services-in-rust/header-background.jpg b/static/assets/images/workshops/production-ready-api-services-in-rust/header-background.jpg similarity index 100% rename from static/assets/images/workshops/web-based-services-in-rust/header-background.jpg rename to static/assets/images/workshops/production-ready-api-services-in-rust/header-background.jpg diff --git a/static/assets/images/workshops/production-ready-api-services-in-rust/og-image.jpeg b/static/assets/images/workshops/production-ready-api-services-in-rust/og-image.jpeg deleted file mode 100644 index ef67d7a2f0..0000000000 Binary files a/static/assets/images/workshops/production-ready-api-services-in-rust/og-image.jpeg and /dev/null differ diff --git a/static/assets/images/workshops/production-ready-api-services-in-rust/og-image.jpg b/static/assets/images/workshops/production-ready-api-services-in-rust/og-image.jpg new file mode 100644 index 0000000000..8d189b0548 Binary files /dev/null and b/static/assets/images/workshops/production-ready-api-services-in-rust/og-image.jpg differ diff --git a/static/assets/images/workshops/progressive-enhancement-with-sveltekit/lego-superman.jpg b/static/assets/images/workshops/progressive-enhancement-with-sveltekit/lego-superman.jpg new file mode 100644 index 0000000000..7741ee8055 Binary files /dev/null and b/static/assets/images/workshops/progressive-enhancement-with-sveltekit/lego-superman.jpg differ diff --git a/static/assets/images/workshops/progressive-enhancement-with-sveltekit/og-image.jpg b/static/assets/images/workshops/progressive-enhancement-with-sveltekit/og-image.jpg new file mode 100644 index 0000000000..0dbd141f90 Binary files /dev/null and b/static/assets/images/workshops/progressive-enhancement-with-sveltekit/og-image.jpg differ diff --git a/static/assets/images/workshops/rust-og-image.jpg b/static/assets/images/workshops/rust-og-image.jpg new file mode 100644 index 0000000000..4331be8576 Binary files /dev/null and b/static/assets/images/workshops/rust-og-image.jpg differ diff --git a/static/assets/images/workshops/rust-python-interoperability/header-background.jpg b/static/assets/images/workshops/rust-python-interoperability/header-background.jpg new file mode 100644 index 0000000000..757bf54cad Binary files /dev/null and b/static/assets/images/workshops/rust-python-interoperability/header-background.jpg differ diff --git a/static/assets/images/workshops/rust-python-interoperability/og-image.jpg b/static/assets/images/workshops/rust-python-interoperability/og-image.jpg new file mode 100644 index 0000000000..2d6b33f866 Binary files /dev/null and b/static/assets/images/workshops/rust-python-interoperability/og-image.jpg differ diff --git a/static/assets/images/workshops/svelte-5-runes/og-image.jpg b/static/assets/images/workshops/svelte-5-runes/og-image.jpg new file mode 100644 index 0000000000..fcc23a60a8 Binary files /dev/null and b/static/assets/images/workshops/svelte-5-runes/og-image.jpg differ diff --git a/static/assets/images/workshops/svelte-5-runes/runes.jpg b/static/assets/images/workshops/svelte-5-runes/runes.jpg new file mode 100644 index 0000000000..e1b1a05aab Binary files /dev/null and b/static/assets/images/workshops/svelte-5-runes/runes.jpg differ diff --git a/static/assets/images/workshops/svelte-and-sveltekit/og-image.jpg b/static/assets/images/workshops/svelte-and-sveltekit/og-image.jpg index a3e0a1b0d2..1f4990ca2a 100644 Binary files a/static/assets/images/workshops/svelte-and-sveltekit/og-image.jpg and b/static/assets/images/workshops/svelte-and-sveltekit/og-image.jpg differ diff --git a/static/assets/images/workshops/svelte-workshops-og-image.jpg b/static/assets/images/workshops/svelte-workshops-og-image.jpg new file mode 100644 index 0000000000..53b61bd3ad Binary files /dev/null and b/static/assets/images/workshops/svelte-workshops-og-image.jpg differ diff --git a/static/assets/images/workshops/testing-svelte-sveltekit-applications/classroom.jpg b/static/assets/images/workshops/testing-svelte-sveltekit-applications/classroom.jpg new file mode 100644 index 0000000000..e624a83652 Binary files /dev/null and b/static/assets/images/workshops/testing-svelte-sveltekit-applications/classroom.jpg differ diff --git a/static/assets/images/workshops/testing-svelte-sveltekit-applications/og-image.jpg b/static/assets/images/workshops/testing-svelte-sveltekit-applications/og-image.jpg new file mode 100644 index 0000000000..434ee4d8d8 Binary files /dev/null and b/static/assets/images/workshops/testing-svelte-sveltekit-applications/og-image.jpg differ diff --git a/static/assets/images/workshops/web-based-services-in-rust/og-image.jpg b/static/assets/images/workshops/web-based-services-in-rust/og-image.jpg deleted file mode 100644 index 110ddbf6d0..0000000000 Binary files a/static/assets/images/workshops/web-based-services-in-rust/og-image.jpg and /dev/null differ diff --git a/twios/this-week-in-open-source b/twios/this-week-in-open-source index e6bead98e8..980fe39aea 100755 Binary files a/twios/this-week-in-open-source and b/twios/this-week-in-open-source differ diff --git a/utils/transforms/contentParser.js b/utils/transforms/contentParser.js index bdc0c0b45f..efab31cd09 100644 --- a/utils/transforms/contentParser.js +++ b/utils/transforms/contentParser.js @@ -70,7 +70,12 @@ module.exports = function (value, outputPath) { if (links.length) { links.forEach(link => { const href = link.getAttribute("href"); - if (href.charAt(0) !== "/" && href.charAt(0) !== "#" && href.indexOf(config.url) < 0) { + if ( + href && + href.charAt(0) !== "/" && + href.charAt(0) !== "#" && + href.indexOf(config.url) < 0 + ) { link.setAttribute("target", "_blank"); link.setAttribute("rel", "nofollow noopener"); link.setAttribute("aria-describedby", "external-new-window-message");