From d15897d5241602e3eb7585419b7921354f0a3901 Mon Sep 17 00:00:00 2001 From: Joe Heffernan Date: Fri, 20 Feb 2026 13:23:54 -0800 Subject: [PATCH 1/4] add formatting config and dependencies --- .prettierrc.json | 8 +++ package.json | 6 ++- yarn.lock | 124 +++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 131 insertions(+), 7 deletions(-) create mode 100644 .prettierrc.json diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..ee8e76b --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "plugins": ["@trivago/prettier-plugin-sort-imports"], + "printWidth": 80, + "tabWidth": 4, + "importOrder": ["^react", "^gatsby", "^[^./]", "^[./]"], + "importOrderSeparation": true, + "importOrderSortSpecifiers": true +} diff --git a/package.json b/package.json index df7204c..10efe46 100644 --- a/package.json +++ b/package.json @@ -48,11 +48,13 @@ "build": "npm run clean && gatsby build", "develop": "npm run clean && gatsby develop", "serve": "gatsby serve", - "format": "prettier --trailing-comma es5 --no-semi --single-quote --write \"{gatsby-*.js,src/**/*.js}\"", + "format": "prettier \"src/**/*.{tsx,ts}\" --write", + "formatCheck": "prettier \"src/**/*.{tsx,ts}\" --check", "test": "vitest", "dev": "npx concurrently \"npx netlify-cms-proxy-server\" \"npm start -- --progress\"" }, "devDependencies": { + "@trivago/prettier-plugin-sort-imports": "^6.0.2", "@types/antd": "^1.0.0", "@types/node": "^20.11.20", "@types/react": "^18.2.59", @@ -62,7 +64,7 @@ "gatsby-plugin-postcss": "^6.13.1", "netlify-cli": "^17.15.7", "postcss": "^8.4.35", - "prettier": "^2.0.5", + "prettier": "^3.8.1", "typescript": "^5.3.3", "typescript-plugin-css-modules": "^5.1.0" }, diff --git a/yarn.lock b/yarn.lock index 2e09a91..a039918 100644 --- a/yarn.lock +++ b/yarn.lock @@ -117,6 +117,15 @@ js-tokens "^4.0.0" picocolors "^1.1.1" +"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" + integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== + dependencies: + "@babel/helper-validator-identifier" "^7.28.5" + js-tokens "^4.0.0" + picocolors "^1.1.1" + "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.27.2": version "7.27.2" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.2.tgz#4183f9e642fd84e74e3eea7ffa93a412e3b102c9" @@ -163,6 +172,17 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" +"@babel/generator@^7.28.0", "@babel/generator@^7.29.0": + version "7.29.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" + integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== + dependencies: + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + "@babel/helper-annotate-as-pure@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz#4345d81a9a46a6486e24d069469f13e60445c05d" @@ -214,6 +234,11 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== + "@babel/helper-member-expression-to-functions@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz#ea1211276be93e798ce19037da6f06fbb994fa44" @@ -287,6 +312,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== +"@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + "@babel/helper-validator-option@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" @@ -326,6 +356,13 @@ dependencies: "@babel/types" "^7.27.1" +"@babel/parser@^7.28.0", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.0.tgz#669ef345add7d057e92b7ed15f0bac07611831b6" + integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww== + dependencies: + "@babel/types" "^7.29.0" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz#61dd8a8e61f7eb568268d1b5f129da3eee364bf9" @@ -1071,6 +1108,15 @@ "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" +"@babel/template@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" + integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== + dependencies: + "@babel/code-frame" "^7.28.6" + "@babel/parser" "^7.28.6" + "@babel/types" "^7.28.6" + "@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.20.13", "@babel/traverse@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.1.tgz#4db772902b133bbddd1c4f7a7ee47761c1b9f291" @@ -1084,6 +1130,19 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.28.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" + integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/types" "^7.29.0" + debug "^4.3.1" + "@babel/types@7.26.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" @@ -1100,6 +1159,14 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" +"@babel/types@^7.28.0", "@babel/types@^7.28.6", "@babel/types@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" + "@bugsnag/browser@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@bugsnag/browser/-/browser-7.25.0.tgz#aa56a8e138dfff268ac29c5fe374cfc3c9b42a76" @@ -2178,6 +2245,14 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@jridgewell/gen-mapping@^0.3.12": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/gen-mapping@^0.3.5": version "0.3.8" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" @@ -2210,7 +2285,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -"@jridgewell/sourcemap-codec@^1.5.5": +"@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": version "1.5.5" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== @@ -2231,6 +2306,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@^0.3.28": + version "0.3.31" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@juggle/resize-observer@^3.4.0": version "3.4.0" resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" @@ -3794,6 +3877,20 @@ resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== +"@trivago/prettier-plugin-sort-imports@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-6.0.2.tgz#b30948c4d22a84f00ae9133bcabd0603de3c0261" + integrity sha512-3DgfkukFyC/sE/VuYjaUUWoFfuVjPK55vOFDsxD56XXynFMCZDYFogH2l/hDfOsQAm1myoU/1xByJ3tWqtulXA== + dependencies: + "@babel/generator" "^7.28.0" + "@babel/parser" "^7.28.0" + "@babel/traverse" "^7.28.0" + "@babel/types" "^7.28.0" + javascript-natural-sort "^0.7.1" + lodash-es "^4.17.21" + minimatch "^9.0.0" + parse-imports-exports "^0.2.4" + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" @@ -12061,6 +12158,11 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +javascript-natural-sort@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" + integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== + javascript-stringify@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" @@ -14715,6 +14817,13 @@ parse-headers@^2.0.2: resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.6.tgz#7940f0abe5fe65df2dd25d4ce8800cb35b49d01c" integrity sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A== +parse-imports-exports@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz#e3fb3b5e264cfb55c25b5dfcbe7f410f8dc4e7af" + integrity sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ== + dependencies: + parse-statements "1.0.11" + parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -14758,6 +14867,11 @@ parse-srcset@^1.0.2: resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== +parse-statements@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/parse-statements/-/parse-statements-1.0.11.tgz#8787c5d383ae5746568571614be72b0689584344" + integrity sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA== + parse5-htmlparser2-tree-adapter@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz#b5a806548ed893a43e24ccb42fbb78069311e81b" @@ -15397,10 +15511,10 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@^2.0.5: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +prettier@^3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.1.tgz#edf48977cf991558f4fcbd8a3ba6015ba2a3a173" + integrity sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg== pretty-bytes@^5.6.0: version "5.6.0" From 5445511c050ac4c3824b5ac3baaa1b5b69bf34d8 Mon Sep 17 00:00:00 2001 From: Joe Heffernan Date: Fri, 20 Feb 2026 13:24:34 -0800 Subject: [PATCH 2/4] push formatting fixes --- src/components/FullWidthImage.tsx | 1 + src/components/IconText.tsx | 3 ++- src/components/IdeaRoll.tsx | 17 +++++++++++++---- src/components/Layout.tsx | 10 +++++++--- src/components/MaterialsAndMethods.tsx | 4 +++- src/components/PreviewCompatibleImage.tsx | 1 + src/components/SiteMetadata.tsx | 18 ++++++++---------- src/components/TagPopover.tsx | 8 +++++--- src/pages/ideas/index.tsx | 5 +++-- src/templates/about-page.tsx | 4 +++- src/templates/allenite.tsx | 4 +++- src/templates/dataset.tsx | 1 + src/templates/idea-post.tsx | 16 ++++++++++------ src/templates/index-page.tsx | 8 +++++--- src/templates/program.tsx | 4 +++- src/templates/tags.tsx | 7 +++---- src/types/index.ts | 7 +++++-- 17 files changed, 76 insertions(+), 42 deletions(-) diff --git a/src/components/FullWidthImage.tsx b/src/components/FullWidthImage.tsx index 15de1fe..50de2eb 100644 --- a/src/components/FullWidthImage.tsx +++ b/src/components/FullWidthImage.tsx @@ -1,4 +1,5 @@ import React from "react"; + import { GatsbyImage, IGatsbyImageData } from "gatsby-plugin-image"; interface FullWidthImageProps { diff --git a/src/components/IconText.tsx b/src/components/IconText.tsx index 53bee6b..3a07850 100644 --- a/src/components/IconText.tsx +++ b/src/components/IconText.tsx @@ -1,4 +1,5 @@ import React from "react"; + import { Space } from "antd"; export const IconText = ({ icon, text }: { icon: React.FC; text: string }) => ( @@ -8,4 +9,4 @@ export const IconText = ({ icon, text }: { icon: React.FC; text: string }) => ( ); -export default IconText; \ No newline at end of file +export default IconText; diff --git a/src/components/IdeaRoll.tsx b/src/components/IdeaRoll.tsx index 6fbd84f..5ba8143 100644 --- a/src/components/IdeaRoll.tsx +++ b/src/components/IdeaRoll.tsx @@ -1,8 +1,11 @@ import React from "react"; -import { Link, graphql, StaticQuery } from "gatsby"; -import { Avatar, List, Space, Tag } from "antd"; + +import { Link, StaticQuery, graphql } from "gatsby"; + import { MessageOutlined, StarOutlined } from "@ant-design/icons"; import { useLocation } from "@reach/router"; +import { Avatar, List, Space, Tag } from "antd"; + import { MaterialsAndMethods } from "../types"; import { IconText } from "./IconText"; import { TagPopover } from "./TagPopover"; @@ -47,7 +50,9 @@ const IdeaRollTemplate = (props: { type: post.frontmatter.type, authors: post.frontmatter.authors || [], concerns: post.frontmatter.concerns || "", - dataset: { ...post.frontmatter.materialsAndMethods?.dataset?.frontmatter }, + dataset: { + ...post.frontmatter.materialsAndMethods?.dataset?.frontmatter, + }, })); if (props.count) { data.splice(props.count); @@ -85,7 +90,11 @@ const IdeaRollTemplate = (props: { key="list-vertical-message" />, ...item.tags.map((tag) => ( - + )), ]} // extra={ diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index 5666287..719a253 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -1,12 +1,16 @@ import * as React from "react"; import { Helmet } from "react-helmet-async"; -import { ConfigProvider, Layout as AntLayout } from "antd"; + import { Script, withPrefix } from "gatsby"; -const { Content } = AntLayout; + +import { Layout as AntLayout, ConfigProvider } from "antd"; import "../style/index.sass"; -import useSiteMetadata from "./SiteMetadata"; import theme from "../style/theme"; +import useSiteMetadata from "./SiteMetadata"; + +const { Content } = AntLayout; + const { container } = require("../style/layout.module.css"); const TemplateWrapper = ({ children }: React.PropsWithChildren) => { diff --git a/src/components/MaterialsAndMethods.tsx b/src/components/MaterialsAndMethods.tsx index 8955e3e..4ea538a 100644 --- a/src/components/MaterialsAndMethods.tsx +++ b/src/components/MaterialsAndMethods.tsx @@ -1,6 +1,8 @@ import React from "react"; + import { Collapse } from "antd"; import type { CollapseProps } from "antd"; + import { CellLine, MaterialsAndMethods, SoftwareTool } from "../types"; const { section, sectionTitle } = require("../style/idea-post.module.css"); @@ -137,7 +139,7 @@ export const MaterialsAndMethodsComponent: React.FC = ({ children: (
{software.map((item, index) => - getSoftwareToolRender(item, index) + getSoftwareToolRender(item, index), )}
), diff --git a/src/components/PreviewCompatibleImage.tsx b/src/components/PreviewCompatibleImage.tsx index 87a2d13..56b92bc 100644 --- a/src/components/PreviewCompatibleImage.tsx +++ b/src/components/PreviewCompatibleImage.tsx @@ -1,4 +1,5 @@ import * as React from "react"; + import { GatsbyImage } from "gatsby-plugin-image"; interface PreviewCompatibleImageProps { diff --git a/src/components/SiteMetadata.tsx b/src/components/SiteMetadata.tsx index 88b3458..9a95b3a 100644 --- a/src/components/SiteMetadata.tsx +++ b/src/components/SiteMetadata.tsx @@ -1,18 +1,16 @@ import { graphql, useStaticQuery } from "gatsby"; const useSiteMetadata = () => { - const { site } = useStaticQuery( - graphql` - query SITE_METADATA_QUERY { - site { - siteMetadata { - title - description - } + const { site } = useStaticQuery(graphql` + query SITE_METADATA_QUERY { + site { + siteMetadata { + title + description } } - ` - ); + } + `); return site.siteMetadata; }; diff --git a/src/components/TagPopover.tsx b/src/components/TagPopover.tsx index 3d2db5c..37b976a 100644 --- a/src/components/TagPopover.tsx +++ b/src/components/TagPopover.tsx @@ -1,6 +1,8 @@ import React from "react"; -import { Tag, Popover } from "antd"; -import { Link, useStaticQuery, graphql } from "gatsby"; + +import { Link, graphql, useStaticQuery } from "gatsby"; + +import { Popover, Tag } from "antd"; import * as styles from "../style/tag-popover.module.css"; @@ -35,7 +37,7 @@ export const TagPopover: React.FC = ({ tag, currentSlug }) => { .filter( (edge) => edge.node.frontmatter.tags?.includes(tag) && - edge.node.fields.slug !== currentSlug + edge.node.fields.slug !== currentSlug, ) .map((post) => (
  • diff --git a/src/pages/ideas/index.tsx b/src/pages/ideas/index.tsx index c4a6cc5..6f1fa0f 100644 --- a/src/pages/ideas/index.tsx +++ b/src/pages/ideas/index.tsx @@ -1,8 +1,9 @@ import React from "react"; + import { Layout as AntdLayout, Flex } from "antd"; -import Layout from "../../components/Layout"; import IdeaRoll from "../../components/IdeaRoll"; +import Layout from "../../components/Layout"; const Header = AntdLayout.Header; @@ -14,7 +15,7 @@ export const IdeasIndexTemplate: React.FC = () => { Shared ideas - + ); }; diff --git a/src/templates/about-page.tsx b/src/templates/about-page.tsx index 6159589..767a660 100644 --- a/src/templates/about-page.tsx +++ b/src/templates/about-page.tsx @@ -1,7 +1,9 @@ import React from "react"; + import { graphql } from "gatsby"; -import Layout from "../components/Layout"; + import Content, { HTMLContent } from "../components/Content"; +import Layout from "../components/Layout"; interface QueryResult { data: { diff --git a/src/templates/allenite.tsx b/src/templates/allenite.tsx index 096ae31..1839f9b 100644 --- a/src/templates/allenite.tsx +++ b/src/templates/allenite.tsx @@ -1,5 +1,7 @@ import React from "react"; -import { graphql, StaticQuery } from "gatsby"; + +import { StaticQuery, graphql } from "gatsby"; + import Layout from "../components/Layout"; interface QueryResult { diff --git a/src/templates/dataset.tsx b/src/templates/dataset.tsx index b324cfc..c5f5a63 100644 --- a/src/templates/dataset.tsx +++ b/src/templates/dataset.tsx @@ -1,4 +1,5 @@ import React from "react"; + import { graphql } from "gatsby"; interface QueryResult { diff --git a/src/templates/idea-post.tsx b/src/templates/idea-post.tsx index 52f4a25..e7e0012 100644 --- a/src/templates/idea-post.tsx +++ b/src/templates/idea-post.tsx @@ -1,18 +1,20 @@ import React from "react"; import { Helmet } from "react-helmet-async"; -import { graphql, Link, PageProps } from "gatsby"; -import { Layout as AntdLayout, Card, Flex } from "antd"; + +import { Link, PageProps, graphql } from "gatsby"; + import { ArrowLeftOutlined, MessageOutlined, StarOutlined, } from "@ant-design/icons"; +import { Layout as AntdLayout, Card, Flex } from "antd"; -import Layout from "../components/Layout"; import IconText from "../components/IconText"; +import Layout from "../components/Layout"; import { MaterialsAndMethodsComponent } from "../components/MaterialsAndMethods"; -import { IdeaFields, IdeaFrontmatter, IdeaPostQuery } from "../types"; import { TagPopover } from "../components/TagPopover"; +import { IdeaFields, IdeaFrontmatter, IdeaPostQuery } from "../types"; const Header = AntdLayout.Header; @@ -31,7 +33,6 @@ export const IdeaPostTemplate: React.FC = ({ title, materialsAndMethods, }) => { - // TODO query the actual data const introduction = "PLACEHOLDER INTRODUCTION TEXT"; const nextSteps = "PLACEHOLDER NEXT STEPS TEXT"; @@ -113,7 +114,10 @@ const IdeaPost: React.FC> = ({ data }) => { - + ); }; diff --git a/src/templates/index-page.tsx b/src/templates/index-page.tsx index caabba6..d412a1e 100644 --- a/src/templates/index-page.tsx +++ b/src/templates/index-page.tsx @@ -1,12 +1,14 @@ import React from "react"; -import PropTypes from "prop-types"; + import { Link, graphql } from "gatsby"; import { getImage } from "gatsby-plugin-image"; + import { Layout as AntdLayout, Flex } from "antd"; +import PropTypes from "prop-types"; -import Layout from "../components/Layout"; -import IdeaRoll from "../components/IdeaRoll"; import FullWidthImage from "../components/FullWidthImage"; +import IdeaRoll from "../components/IdeaRoll"; +import Layout from "../components/Layout"; const { container, diff --git a/src/templates/program.tsx b/src/templates/program.tsx index 281126c..60ccb14 100644 --- a/src/templates/program.tsx +++ b/src/templates/program.tsx @@ -1,5 +1,7 @@ import React from "react"; -import { graphql, StaticQuery } from "gatsby"; + +import { StaticQuery, graphql } from "gatsby"; + import Layout from "../components/Layout"; interface QueryResult { diff --git a/src/templates/tags.tsx b/src/templates/tags.tsx index 7ee3a5a..16109b6 100644 --- a/src/templates/tags.tsx +++ b/src/templates/tags.tsx @@ -1,6 +1,8 @@ import * as React from "react"; import { Helmet } from "react-helmet-async"; + import { Link, graphql } from "gatsby"; + import Layout from "../components/Layout"; interface QueryResult { @@ -89,10 +91,7 @@ export const tagPageQuery = graphql` limit: 1000 sort: { frontmatter: { date: DESC } } filter: { - frontmatter: { - tags: { in: [$tag] } - draft: { ne: true } - } + frontmatter: { tags: { in: [$tag] }, draft: { ne: true } } } ) { totalCount diff --git a/src/types/index.ts b/src/types/index.ts index 492fa0f..3f91025 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -15,8 +15,11 @@ export type IdeaPostNode = NonNullable; export type IdeaFrontmatter = NonNullable; export type IdeaFields = NonNullable; -export type MaterialsAndMethods = NonNullable; +export type MaterialsAndMethods = NonNullable< + IdeaFrontmatter["materialsAndMethods"] +>; export type CellLine = MaterialsAndMethods["cellLines"][number]; export type SoftwareTool = MaterialsAndMethods["software"][number]; -export type IdeasForTags = Queries.AllIdeasForTagsQuery["allMarkdownRemark"]["edges"]; \ No newline at end of file +export type IdeasForTags = + Queries.AllIdeasForTagsQuery["allMarkdownRemark"]["edges"]; From 845a2ec4e4e215ec9dbdefe5aa560b97510fece2 Mon Sep 17 00:00:00 2001 From: Joe Heffernan Date: Fri, 20 Feb 2026 13:43:55 -0800 Subject: [PATCH 3/4] expand formatting glob to js files --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 10efe46..ab224ed 100644 --- a/package.json +++ b/package.json @@ -48,8 +48,8 @@ "build": "npm run clean && gatsby build", "develop": "npm run clean && gatsby develop", "serve": "gatsby serve", - "format": "prettier \"src/**/*.{tsx,ts}\" --write", - "formatCheck": "prettier \"src/**/*.{tsx,ts}\" --check", + "format": "prettier \"{src,gatsbyutils,netlify}/**/*.{ts,tsx,js,jsx}\" gatsby-*.js --write", + "formatCheck": "prettier \"{src,gatsbyutils,netlify}/**/*.{ts,tsx,js,jsx}\" gatsby-*.js --check", "test": "vitest", "dev": "npx concurrently \"npx netlify-cms-proxy-server\" \"npm start -- --progress\"" }, From e5a8cbcbdb99a66fb0f6b86de6e2822d25d170c4 Mon Sep 17 00:00:00 2001 From: Joe Heffernan Date: Fri, 20 Feb 2026 13:44:02 -0800 Subject: [PATCH 4/4] run format on js files --- gatsby-node.js | 16 ++-- gatsbyutils/constants.js | 2 +- gatsbyutils/gatsby-resolver-utils.js | 6 +- .../test/gatsby-resolver-utils.test.js | 87 ++++++++++--------- src/cms/preview-templates/AboutPagePreview.js | 30 ++++--- src/cms/preview-templates/IdeaPostPreview.js | 2 + src/cms/preview-templates/IndexPagePreview.js | 54 ++++++------ src/pages/tags/index.js | 7 +- 8 files changed, 107 insertions(+), 97 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index 10cc70f..c0bac71 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -15,12 +15,7 @@ const { DATASET_PATH } = require("./gatsbyutils/constants"); * They serve as single source of truth, can be added/edited via CMS, * and are referenced by other markdown files. */ -const DATA_ONLY_PAGES = [ - "software", - "dataset", - "allenite", - "program", -]; +const DATA_ONLY_PAGES = ["software", "dataset", "allenite", "program"]; exports.createSchemaCustomization = ({ actions, schema }) => { const { createTypes } = actions; @@ -95,7 +90,7 @@ exports.createResolvers = ({ createResolvers }) => { resolve: (source) => stringWithDefault( source.description, - "No description provided." + "No description provided.", ), }, title: { @@ -116,7 +111,10 @@ exports.createResolvers = ({ createResolvers }) => { return current; } - const resolvedDatasetSlug = resolveSlug(raw.dataset, DATASET_PATH); + const resolvedDatasetSlug = resolveSlug( + raw.dataset, + DATASET_PATH, + ); current.dataset = resolvedDatasetSlug; current.cellLines = resolveToArray(raw.cellLines); current.protocols = resolveToArray(raw.protocols); @@ -182,7 +180,7 @@ exports.createPages = ({ actions, graphql }) => { path: edge.node.fields.slug, tags: edge.node.frontmatter.tags, component: path.resolve( - `src/templates/${String(templateKey)}.tsx` + `src/templates/${String(templateKey)}.tsx`, ), // additional data can be passed via context context: { diff --git a/gatsbyutils/constants.js b/gatsbyutils/constants.js index b29e5d7..c1d8290 100644 --- a/gatsbyutils/constants.js +++ b/gatsbyutils/constants.js @@ -4,4 +4,4 @@ const SOFTWARE_PATH = `software`; module.exports = { DATASET_PATH, SOFTWARE_PATH, -}; \ No newline at end of file +}; diff --git a/gatsbyutils/gatsby-resolver-utils.js b/gatsbyutils/gatsby-resolver-utils.js index 440feb0..b8f8434 100644 --- a/gatsbyutils/gatsby-resolver-utils.js +++ b/gatsbyutils/gatsby-resolver-utils.js @@ -45,7 +45,7 @@ const resolveSoftwareTools = (rawSoftware) => { softwareTool: resolveSlug(item.softwareTool, SOFTWARE_PATH), customDescription: stringWithDefault( item.customDescription, - null + null, ), }; } @@ -66,7 +66,7 @@ const resolveSlug = (id, directory) => { if (!id) return null; const slugPart = slugify(id, { lower: true, strict: true }).replace( /^\/+|\/+$/g, - "" + "", ); // Slugify and remove leading/trailing slashes return `/${directory}/${slugPart}/`; }; @@ -76,4 +76,4 @@ module.exports = { resolveToArray, resolveSlug, resolveSoftwareTools, -}; \ No newline at end of file +}; diff --git a/gatsbyutils/test/gatsby-resolver-utils.test.js b/gatsbyutils/test/gatsby-resolver-utils.test.js index 12a7640..d725571 100644 --- a/gatsbyutils/test/gatsby-resolver-utils.test.js +++ b/gatsbyutils/test/gatsby-resolver-utils.test.js @@ -1,109 +1,112 @@ -import { describe, it, expect } from 'vitest'; -import { resolveSlug, resolveSoftwareTools } from '../gatsby-resolver-utils'; -import { DATASET_PATH, SOFTWARE_PATH } from '../constants'; +import { describe, expect, it } from "vitest"; -describe('resolveSlug', () => { - it('should return null when id is falsy', () => { - expect(resolveSlug(null, 'software')).toBe(null); - expect(resolveSlug(undefined, 'software')).toBe(null); - expect(resolveSlug('', 'software')).toBe(null); +import { DATASET_PATH, SOFTWARE_PATH } from "../constants"; +import { resolveSlug, resolveSoftwareTools } from "../gatsby-resolver-utils"; + +describe("resolveSlug", () => { + it("should return null when id is falsy", () => { + expect(resolveSlug(null, "software")).toBe(null); + expect(resolveSlug(undefined, "software")).toBe(null); + expect(resolveSlug("", "software")).toBe(null); }); - it('should build a slug from id and directory', () => { + it("should build a slug from id and directory", () => { expect(resolveSlug("released-emt-dataset", DATASET_PATH)).toBe( - "/dataset/released-emt-dataset/" + "/dataset/released-emt-dataset/", ); }); - it('should slugify the id to lowercase', () => { + it("should slugify the id to lowercase", () => { expect(resolveSlug("UPPERCASE", DATASET_PATH)).toBe( - "/dataset/uppercase/" + "/dataset/uppercase/", ); }); - it('should handle special characters in id', () => { + it("should handle special characters in id", () => { expect(resolveSlug("Tool & Library", SOFTWARE_PATH)).toBe( - "/software/tool-and-library/" + "/software/tool-and-library/", ); expect(resolveSlug("Some/Path/Name", SOFTWARE_PATH)).toBe( - "/software/somepathname/" + "/software/somepathname/", ); }); - it('should handle ids with leading/trailing spaces', () => { - expect(resolveSlug(' trimmed ', 'software')).toBe('/software/trimmed/'); + it("should handle ids with leading/trailing spaces", () => { + expect(resolveSlug(" trimmed ", "software")).toBe( + "/software/trimmed/", + ); }); }); -describe('resolveSoftwareTools', () => { - it('should return empty array for non-array inputs', () => { +describe("resolveSoftwareTools", () => { + it("should return empty array for non-array inputs", () => { expect(resolveSoftwareTools(null)).toEqual([]); expect(resolveSoftwareTools(undefined)).toEqual([]); - expect(resolveSoftwareTools('string')).toEqual([]); + expect(resolveSoftwareTools("string")).toEqual([]); expect(resolveSoftwareTools({})).toEqual([]); expect(resolveSoftwareTools(123)).toEqual([]); }); - it('should return empty array for empty array', () => { + it("should return empty array for empty array", () => { expect(resolveSoftwareTools([])).toEqual([]); }); - it('should filter out invalid items', () => { - const input = [null, undefined, 'string', {}, { other: 'prop' }]; + it("should filter out invalid items", () => { + const input = [null, undefined, "string", {}, { other: "prop" }]; expect(resolveSoftwareTools(input)).toEqual([]); }); - it('should transform valid items with softwareTool', () => { - const input = [{ softwareTool: 'Simularium' }]; + it("should transform valid items with softwareTool", () => { + const input = [{ softwareTool: "Simularium" }]; expect(resolveSoftwareTools(input)).toEqual([ { - softwareTool: '/software/simularium/', + softwareTool: "/software/simularium/", customDescription: null, }, ]); }); - it('should preserve customDescription when provided', () => { + it("should preserve customDescription when provided", () => { const input = [ { - softwareTool: 'Simularium', - customDescription: 'Custom description here', + softwareTool: "Simularium", + customDescription: "Custom description here", }, ]; expect(resolveSoftwareTools(input)).toEqual([ { - softwareTool: '/software/simularium/', - customDescription: 'Custom description here', + softwareTool: "/software/simularium/", + customDescription: "Custom description here", }, ]); }); - it('should return null for empty customDescription', () => { - const input = [{ softwareTool: 'Simularium', customDescription: '' }]; + it("should return null for empty customDescription", () => { + const input = [{ softwareTool: "Simularium", customDescription: "" }]; expect(resolveSoftwareTools(input)).toEqual([ { - softwareTool: '/software/simularium/', + softwareTool: "/software/simularium/", customDescription: null, }, ]); }); - it('should handle mixed valid and invalid items', () => { + it("should handle mixed valid and invalid items", () => { const input = [ null, - { softwareTool: 'Simularium' }, - { other: 'invalid' }, - { softwareTool: 'TFE', customDescription: 'Time explorer' }, + { softwareTool: "Simularium" }, + { other: "invalid" }, + { softwareTool: "TFE", customDescription: "Time explorer" }, ]; expect(resolveSoftwareTools(input)).toEqual([ { - softwareTool: '/software/simularium/', + softwareTool: "/software/simularium/", customDescription: null, }, { - softwareTool: '/software/tfe/', - customDescription: 'Time explorer', + softwareTool: "/software/tfe/", + customDescription: "Time explorer", }, ]); }); -}); \ No newline at end of file +}); diff --git a/src/cms/preview-templates/AboutPagePreview.js b/src/cms/preview-templates/AboutPagePreview.js index 413a6da..061ec90 100644 --- a/src/cms/preview-templates/AboutPagePreview.js +++ b/src/cms/preview-templates/AboutPagePreview.js @@ -1,19 +1,21 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { AboutPageTemplate } from '../../templates/about-page' +import React from "react"; + +import PropTypes from "prop-types"; + +import { AboutPageTemplate } from "../../templates/about-page"; const AboutPagePreview = ({ entry, widgetFor }) => ( - -) + +); AboutPagePreview.propTypes = { - entry: PropTypes.shape({ - getIn: PropTypes.func, - }), - widgetFor: PropTypes.func, -} + entry: PropTypes.shape({ + getIn: PropTypes.func, + }), + widgetFor: PropTypes.func, +}; -export default AboutPagePreview +export default AboutPagePreview; diff --git a/src/cms/preview-templates/IdeaPostPreview.js b/src/cms/preview-templates/IdeaPostPreview.js index fd0b293..d3d3517 100644 --- a/src/cms/preview-templates/IdeaPostPreview.js +++ b/src/cms/preview-templates/IdeaPostPreview.js @@ -1,5 +1,7 @@ import React from "react"; + import PropTypes from "prop-types"; + import { IdeaPostTemplate } from "../../templates/idea-post"; const IdeaPostPreview = ({ entry, widgetFor }) => { diff --git a/src/cms/preview-templates/IndexPagePreview.js b/src/cms/preview-templates/IndexPagePreview.js index 62211a3..eff66fc 100644 --- a/src/cms/preview-templates/IndexPagePreview.js +++ b/src/cms/preview-templates/IndexPagePreview.js @@ -1,32 +1,34 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { IndexPageTemplate } from '../../templates/index-page' +import React from "react"; + +import PropTypes from "prop-types"; + +import { IndexPageTemplate } from "../../templates/index-page"; const IndexPagePreview = ({ entry, getAsset }) => { - const data = entry.getIn(['data']).toJS() + const data = entry.getIn(["data"]).toJS(); - if (data) { - return ( - - ) - } else { - return
    Loading...
    - } -} + if (data) { + return ( + + ); + } else { + return
    Loading...
    ; + } +}; IndexPagePreview.propTypes = { - entry: PropTypes.shape({ - getIn: PropTypes.func, - }), - getAsset: PropTypes.func, -} + entry: PropTypes.shape({ + getIn: PropTypes.func, + }), + getAsset: PropTypes.func, +}; -export default IndexPagePreview +export default IndexPagePreview; diff --git a/src/pages/tags/index.js b/src/pages/tags/index.js index ebb45ca..4c71081 100644 --- a/src/pages/tags/index.js +++ b/src/pages/tags/index.js @@ -1,7 +1,10 @@ import * as React from "react"; -import { kebabCase } from "lodash"; import { Helmet } from "react-helmet-async"; + import { Link, graphql } from "gatsby"; + +import { kebabCase } from "lodash"; + import Layout from "../../components/Layout"; const TagsPage = ({ @@ -27,7 +30,7 @@ const TagsPage = ({
  • {tag.fieldValue} ({tag.totalCount})