From 93fb3aec10154f80bf7ba7c302c3fbedd9d6b9f7 Mon Sep 17 00:00:00 2001 From: Rodrigo Pombo Date: Thu, 12 Sep 2024 10:45:34 +0200 Subject: [PATCH 1/2] New github workflow --- .github/scripts/git-utils.mjs | 46 ++ .github/scripts/md-utils.mjs | 55 +++ .github/scripts/params.mjs | 8 + .github/scripts/pr-merged.mjs | 51 +++ .github/scripts/pr-updated.mjs | 100 +++++ .github/scripts/prepare-release.mjs | 107 +++++ .github/scripts/readme.md | 64 +++ .github/scripts/release.mjs | 97 +++++ .github/workflows/ci.yml | 28 -- .github/workflows/pr-merged.yml | 41 ++ .github/workflows/pr-updated.yml | 45 ++ .github/workflows/push-to-next.yml | 45 ++ .github/workflows/release-pr-merged.yml | 45 ++ .gitignore | 1 + .../content/blog/content-presentation-gap.mdx | 124 +++++- .../content/blog/the-curse-of-markdown.mdx | 33 +- package.json | 14 +- pnpm-lock.yaml | 400 ++++++++++++++---- 18 files changed, 1179 insertions(+), 125 deletions(-) create mode 100644 .github/scripts/git-utils.mjs create mode 100644 .github/scripts/md-utils.mjs create mode 100644 .github/scripts/params.mjs create mode 100644 .github/scripts/pr-merged.mjs create mode 100644 .github/scripts/pr-updated.mjs create mode 100644 .github/scripts/prepare-release.mjs create mode 100644 .github/scripts/readme.md create mode 100644 .github/scripts/release.mjs delete mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/pr-merged.yml create mode 100644 .github/workflows/pr-updated.yml create mode 100644 .github/workflows/push-to-next.yml create mode 100644 .github/workflows/release-pr-merged.yml diff --git a/.github/scripts/git-utils.mjs b/.github/scripts/git-utils.mjs new file mode 100644 index 00000000..17618202 --- /dev/null +++ b/.github/scripts/git-utils.mjs @@ -0,0 +1,46 @@ +import { exec, getExecOutput } from "@actions/exec" +import github from "@actions/github" +import fs from "fs" + +export async function checkout(branch) { + let { stderr } = await getExecOutput("git", ["checkout", branch], { + ignoreReturnCode: true, + }) + let isCreatingBranch = !stderr + .toString() + .includes(`Switched to a new branch '${branch}'`) + if (isCreatingBranch) { + await exec("git", ["checkout", "-b", branch]) + } +} + +export async function resetBranch() { + // reset current branch to the commit that triggered the workflow + await exec("git", ["reset", `--hard`, github.context.sha]) +} + +export async function commitAll(message) { + await exec("git", ["add", "."]) + await exec("git", ["commit", "-m", message]) +} + +export async function forcePush(branch) { + await exec("git", ["push", "origin", `HEAD:${branch}`, "--force"]) +} + +export async function setupUser() { + await exec("git", ["config", "user.name", `"github-actions[bot]"`]) + await exec("git", [ + "config", + "user.email", + `"github-actions[bot]@users.noreply.github.com"`, + ]) + await fs.promises.writeFile( + `${process.env.HOME}/.netrc`, + `machine github.com\nlogin github-actions[bot]\npassword ${process.env.GITHUB_TOKEN}`, + ) +} + +export async function pushTags() { + await exec("git", ["push", "origin", "--tags"]) +} diff --git a/.github/scripts/md-utils.mjs b/.github/scripts/md-utils.mjs new file mode 100644 index 00000000..aa86c93a --- /dev/null +++ b/.github/scripts/md-utils.mjs @@ -0,0 +1,55 @@ +import { unified } from "unified" +import remarkParse from "remark-parse" +import remarkStringify from "remark-stringify" +import * as mdastToString from "mdast-util-to-string" + +const BumpLevels = { + dep: 0, + patch: 1, + minor: 2, + major: 3, +} + +export function getChangelogEntry(changelog, version) { + let ast = unified().use(remarkParse).parse(changelog) + + let highestLevel = BumpLevels.dep + + let nodes = ast.children + let headingStartInfo + let endIndex + + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + if (node.type === "heading") { + let stringified = mdastToString.toString(node) + let match = stringified.toLowerCase().match(/(major|minor|patch)/) + if (match !== null) { + let level = BumpLevels[match[0]] + highestLevel = Math.max(level, highestLevel) + } + if (headingStartInfo === undefined && stringified === version) { + headingStartInfo = { + index: i, + depth: node.depth, + } + continue + } + if ( + endIndex === undefined && + headingStartInfo !== undefined && + headingStartInfo.depth === node.depth + ) { + endIndex = i + break + } + } + } + if (headingStartInfo) { + ast.children = ast.children.slice(headingStartInfo.index + 1, endIndex) + } + return { + content: unified().use(remarkStringify).stringify(ast), + highestLevel: highestLevel, + } +} diff --git a/.github/scripts/params.mjs b/.github/scripts/params.mjs new file mode 100644 index 00000000..c0db446e --- /dev/null +++ b/.github/scripts/params.mjs @@ -0,0 +1,8 @@ +export const PACKAGE_NAME = "codehike" +export const VERSION_COMMAND = "pnpm version-packages" +export const PUBLISH_COMMAND = "pnpm release" +export const RELEASE_BRANCH = "release" +export const BASE_BRANCH = "next" +export const PACKAGE_DIR = `packages/${PACKAGE_NAME}` + +export const IDENTIFIER = "" diff --git a/.github/scripts/pr-merged.mjs b/.github/scripts/pr-merged.mjs new file mode 100644 index 00000000..e4cd5a1c --- /dev/null +++ b/.github/scripts/pr-merged.mjs @@ -0,0 +1,51 @@ +import { Octokit } from "@octokit/action" +import { IDENTIFIER, PACKAGE_NAME } from "./params.mjs" +import github from "@actions/github" + +const octokit = new Octokit({}) +const prNumber = github.context.payload.pull_request.number + +console.log("Querying closing issues") +const query = `query ($owner: String!, $repo: String!, $prNumber: Int!) { + repository(owner: $owner, name: $repo) { + pullRequest(number: $prNumber) { + title + state + closingIssuesReferences(first: 10) { + nodes { + number + } + } + } + } +}` +const result = await octokit.graphql(query, { + ...github.context.repo, + prNumber: Number(prNumber), +}) + +const body = `${IDENTIFIER} +This issue has been fixed but not yet released. + +Try it in your project before the release with: + +${"```"} +npm i https://pkg.pr.new/${PACKAGE_NAME}@${prNumber} +${"```"} + +Or wait for the next [release](https://github.com/${github.context.repo.owner}/${github.context.repo.repo}/pulls?q=is%3Aopen+is%3Apr+label%3Arelease). +` + +console.log("Commenting issues") +await Promise.all( + result.repository.pullRequest.closingIssuesReferences.nodes.map( + async ({ number }) => { + console.log("Commenting issue", number) + await octokit.issues.createComment({ + ...github.context.repo, + issue_number: number, + body, + }) + }, + ), +) diff --git a/.github/scripts/pr-updated.mjs b/.github/scripts/pr-updated.mjs new file mode 100644 index 00000000..f0d47c65 --- /dev/null +++ b/.github/scripts/pr-updated.mjs @@ -0,0 +1,100 @@ +import { Octokit } from "@octokit/action" +import { humanId } from "human-id" +import fs from "fs" +import { IDENTIFIER, PACKAGE_NAME } from "./params.mjs" +import github from "@actions/github" + +const octokit = new Octokit({}) +const prNumber = github.context.payload.pull_request.number + +async function createOrUpdateComment(prevComment, prNumber, body) { + if (prevComment) { + console.log("Updating comment") + await octokit.issues.updateComment({ + ...github.context.repo, + comment_id: prevComment.id, + body, + }) + } else { + console.log("Creating comment", prNumber) + await octokit.issues.createComment({ + ...github.context.repo, + issue_number: prNumber, + body, + }) + } +} + +console.log("Listing comments", prNumber) +const { data: comments } = await octokit.issues.listComments({ + ...github.context.repo, + issue_number: prNumber, +}) +const prevComment = comments.find((comment) => + comment.body.startsWith(IDENTIFIER), +) +console.log("prevComment", !!prevComment) + +console.log("Finding changeset") +let changedFiles = await octokit.pulls.listFiles({ + ...github.context.repo, + pull_number: prNumber, +}) +const changeset = changedFiles.data.find( + (file) => + file.status === "added" && + /^\.changeset\/.+\.md$/.test(file.filename) && + file.filename !== ".changeset/README.md", +) +const hasChangesets = !!changeset +console.log({ hasChangesets }) + +if (!hasChangesets) { + console.log("Getting PR") + const pr = await octokit.pulls.get({ + ...github.context.repo, + pull_number: prNumber, + }) + const filename = humanId({ + separator: "-", + capitalize: false, + }) + const value = encodeURIComponent(`--- +"${PACKAGE_NAME}": patch +--- + +${pr.data.title} +`) + const repoURL = pr.data.head.repo.html_url + const addChangesetURL = `${repoURL}/new/${pr.data.head.ref}?filename=.changeset/${filename}.md&value=${value}` + const body = `${IDENTIFIER} +No changeset detected. If you are changing ${ + "`" + PACKAGE_NAME + "`" + } [click here to add a changeset](${addChangesetURL}). +` + await createOrUpdateComment(prevComment, prNumber, body) + process.exit(0) +} + +// if has changesets + +console.log("Adding label") +await octokit.issues.addLabels({ + ...github.context.repo, + issue_number: prNumber, + labels: ["changeset"], +}) + +console.log("Reading canary.json") +const canary = await fs.promises.readFile("canary.json", "utf8") +console.log({ canary }) +const { packages } = JSON.parse(canary) +const { name, url } = packages[0] +const body = `${IDENTIFIER} +Try ${"`" + name + "`"} from this pull request in your project with: + +${"```"} +npm i https://pkg.pr.new/${name}@${prNumber} +${"```"} +` +await createOrUpdateComment(prevComment, prNumber, body) diff --git a/.github/scripts/prepare-release.mjs b/.github/scripts/prepare-release.mjs new file mode 100644 index 00000000..2ac63c19 --- /dev/null +++ b/.github/scripts/prepare-release.mjs @@ -0,0 +1,107 @@ +import { exec } from "@actions/exec" +import readChangesets from "@changesets/read" +import { + checkout, + commitAll, + forcePush, + resetBranch, + setupUser, +} from "./git-utils.mjs" +import fs from "fs" +import { getChangelogEntry } from "./md-utils.mjs" +import { Octokit } from "@octokit/action" +import github from "@actions/github" +import { + BASE_BRANCH, + PACKAGE_DIR, + PACKAGE_NAME, + RELEASE_BRANCH, + VERSION_COMMAND, +} from "./params.mjs" + +const cwd = process.cwd() +const octokit = new Octokit({}) + +console.log("Reading changesets") +const changesets = await readChangesets(cwd) +if (changesets.length === 0) { + console.log("No changesets found") + process.exit(0) +} + +console.log("Setting up user") +await setupUser() + +console.log("Checking out release branch") +await checkout(RELEASE_BRANCH) +await resetBranch() + +console.log("Running version command") +const [versionCommand, ...versionArgs] = VERSION_COMMAND.split(/\s+/) +await exec(versionCommand, versionArgs, { cwd }) + +console.log("Reading package files") +const pkg = JSON.parse( + await fs.promises.readFile(`${PACKAGE_DIR}/package.json`, "utf8"), +) +const changelog = await fs.promises.readFile( + `${PACKAGE_DIR}/CHANGELOG.md`, + "utf8", +) +const canary = JSON.parse(await fs.promises.readFile("canary.json", "utf8")) + +console.log("Committing changes") +await commitAll(`${PACKAGE_NAME}@${pkg.version}`) +console.log("Pushing changes") +await forcePush(RELEASE_BRANCH) + +console.log("Find existing release PR") +const { data: prs } = await octokit.pulls.list({ + ...github.context.repo, + state: "open", + base: BASE_BRANCH, + head: `${github.context.repo.owner}:${RELEASE_BRANCH}`, +}) +console.log("Existing PRs", prs) + +const entry = getChangelogEntry(changelog, pkg.version) +const title = `🚀 Release ${"`" + pkg.name}@${pkg.version + "`"} 🚀` +const canaryUrl = canary.packages[0].url +const body = `${entry.content} + +--- + +You can try ${ + "`" + PACKAGE_NAME + "@" + pkg.version + "`" +} in your project before it's released with: + +${"```"} +npm i ${canaryUrl} +${"```"} +` + +if (prs.length === 0) { + console.log("Creating new release PR") + const { data: pr } = await octokit.rest.pulls.create({ + ...github.context.repo, + base: BASE_BRANCH, + head: RELEASE_BRANCH, + title, + body, + }) + console.log("Adding `release` label") + await octokit.rest.issues.addLabels({ + ...github.context.repo, + issue_number: pr.number, + labels: ["release"], + }) +} else { + console.log("Updating existing release PR") + const { number } = prs[0] + await octokit.rest.pulls.update({ + ...github.context.repo, + pull_number: number, + title, + body, + }) +} diff --git a/.github/scripts/readme.md b/.github/scripts/readme.md new file mode 100644 index 00000000..dcdc9f44 --- /dev/null +++ b/.github/scripts/readme.md @@ -0,0 +1,64 @@ +First: + +- fill the right values in `.github/scripts/params.mjs` +- add `canary.json` to gitignore +- add `NPM_TOKEN` to secrets +- enable PR creation for Actions + - go to https://github.com/organizations/YOUR_ORG/settings/actions and check Allow GitHub Actions to create and approve pull requests + - then go to https://github.com/YOUR_ORG/YOUR_REPO/settings/actions and check the box that previously was grayed out + +--- + +## pr-updated + +For every new commit in a PR to `next`: + +``` +- build package +- if no new changeset + - (update) comment with a link to add a changeset in the PR +- if new changeset + - add `changeset` label to the PR + - (update) comment with the canary install in the PR +``` + +## pr-merged + +For every merged PR to `next` that contains the `changeset` label: + +``` +- find the issues closed by the PR +- for every issue + - add a comment with the canary install +``` + +## push-to-next + +For every push to `next`: + +``` +- build package +- if no changes, skip +- checkout and reset the `release` branch +- run `pnpm version-packages` +- push the `release` branch +- create or update release PR + - body: changelog + - labels: `release` +``` + +## release-pr-merged + +for every `release` pr merged to `next`: + +``` +- run build and `pnpm release` +- push tags +- create github release +- find all `changeset` PRs + - find related issues + - add comments in fixed issues + - remove `changeset` label +``` + +## sponsors diff --git a/.github/scripts/release.mjs b/.github/scripts/release.mjs new file mode 100644 index 00000000..dc479574 --- /dev/null +++ b/.github/scripts/release.mjs @@ -0,0 +1,97 @@ +import fs from "fs" +import { getExecOutput } from "@actions/exec" +import { pushTags } from "./git-utils.mjs" +import { PACKAGE_DIR, PUBLISH_COMMAND } from "./params.mjs" +import github from "@actions/github" +import { getChangelogEntry } from "./md-utils.mjs" +import { Octokit } from "@octokit/action" + +const cwd = process.cwd() +const octokit = new Octokit({}) + +console.log("Writing .npmrc") +await fs.promises.writeFile( + `${process.env.HOME}/.npmrc`, + `//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}\n`, +) + +console.log("Running publish command") +const [publishCommand, ...publishArgs] = PUBLISH_COMMAND.split(/\s+/) +const output = await getExecOutput(publishCommand, publishArgs, { cwd }) +if (output.exitCode !== 0) { + console.error(output.stderr) + process.exit(1) +} +const published = !output.stdout.includes("No unpublished projects to publish") +console.log(`Published: ${published}`) + +console.log("Pushing tags") +await pushTags() + +console.log("Creating GitHub release") +const pkg = JSON.parse( + await fs.promises.readFile(`${PACKAGE_DIR}/package.json`, "utf8"), +) +const changelog = await fs.promises.readFile( + `${PACKAGE_DIR}/CHANGELOG.md`, + "utf8", +) +const entry = getChangelogEntry(changelog, pkg.version) +const tag = `${pkg.name}@${pkg.version}` +await octokit.rest.repos.createRelease({ + ...github.context.repo, + name: tag, + tag_name: tag, + body: entry.content, +}) + +console.log("Getting all released issues") +const query = `query ($owner: String!, $repo: String!) { + repository(owner: $owner, name: $repo) { + pullRequests(first: 100, labels: ["changeset"], states: MERGED) { + edges { + node { + number + closingIssuesReferences(first: 10) { + nodes { + number + } + } + } + } + } + } +}` +const { repository } = await octokit.graphql(query, github.context.repo) +const prNumbers = repository.pullRequests.edges.map(({ node }) => node.number) +const issueNumbers = repository.pullRequests.edges.flatMap(({ node }) => + node.closingIssuesReferences.nodes.map(({ number }) => number), +) + +console.log("Commenting issues", issueNumbers) +await Promise.all( + issueNumbers.map(async (number) => { + const commentBody = `🚀 Released in ${"`" + tag + "`"} 🚀 + +If this was helpful, consider **[sponsoring Code Hike](https://github.com/sponsors/code-hike?metadata_source=Issue)**. Your contribution helps sustain open-source work. + +Thanks for using Code Hike!` + + await octokit.issues.createComment({ + ...github.context.repo, + issue_number: number, + body: commentBody, + }) + }), +) + +console.log("Updating PRs", prNumbers) +await Promise.all( + prNumbers.map(async (number) => { + await octokit.issues.removeLabel({ + ...github.context.repo, + issue_number: number, + name: "changeset", + }) + }), +) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 204f31df..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: CI - -on: - pull_request: - branches: - - next - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - run: corepack enable - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: "pnpm" - - - name: Install dependencies - run: pnpm install - - - name: Build - run: pnpm build - - - run: pnpm canary diff --git a/.github/workflows/pr-merged.yml b/.github/workflows/pr-merged.yml new file mode 100644 index 00000000..f0d31127 --- /dev/null +++ b/.github/workflows/pr-merged.yml @@ -0,0 +1,41 @@ +name: PR Merged + +on: + pull_request: + types: [closed] + branches: + - next + +jobs: + comment-issues: + name: Comment Issues + if: > + github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'changeset') + + runs-on: ubuntu-latest + + permissions: + issues: write + pull-requests: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + run_install: false + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + + - run: pnpm install + + - name: Add comment to issues + run: node .github/scripts/pr-merged.mjs + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/pr-updated.yml b/.github/workflows/pr-updated.yml new file mode 100644 index 00000000..d138acc5 --- /dev/null +++ b/.github/workflows/pr-updated.yml @@ -0,0 +1,45 @@ +name: PR Updated + +on: + pull_request: + branches: + - next + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number }} + cancel-in-progress: true + +jobs: + comment-pr: + name: Comment PR + runs-on: ubuntu-latest + + permissions: + issues: write + pull-requests: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + run_install: false + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + + - run: pnpm install + + - run: pnpm build + + - run: pnpm canary + + - name: Add or update PR comment + run: node .github/scripts/pr-updated.mjs ${{ github.event.pull_request.number }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/push-to-next.yml b/.github/workflows/push-to-next.yml new file mode 100644 index 00000000..39aef962 --- /dev/null +++ b/.github/workflows/push-to-next.yml @@ -0,0 +1,45 @@ +name: Push to next + +on: + push: + branches: + - next + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} # Ensures concurrency is handled per branch + cancel-in-progress: true # Cancels any in-progress workflows if a new one is triggered + +jobs: + prepare-release: + name: Prepare Release + runs-on: ubuntu-latest + + permissions: + pull-requests: write + contents: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + run_install: false + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + + - run: pnpm install + + - run: pnpm build + + - run: pnpm canary + + - name: Create release PR + run: node .github/scripts/prepare-release.mjs + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release-pr-merged.yml b/.github/workflows/release-pr-merged.yml new file mode 100644 index 00000000..e1f41268 --- /dev/null +++ b/.github/workflows/release-pr-merged.yml @@ -0,0 +1,45 @@ +name: Release PR Merged + +on: + pull_request: + types: [closed] + branches: + - next + +jobs: + release: + name: Release + if: > + github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'release') + + runs-on: ubuntu-latest + + permissions: + issues: write + pull-requests: write + contents: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + run_install: false + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + + - run: pnpm install + + - run: pnpm build + + - name: Release and update issues comments + run: node .github/scripts/release.mjs + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 783f97c0..3faad019 100644 --- a/.gitignore +++ b/.gitignore @@ -146,3 +146,4 @@ dist-ssr server/dist public/dist .turbo +canary.json diff --git a/apps/web/content/blog/content-presentation-gap.mdx b/apps/web/content/blog/content-presentation-gap.mdx index 5d4c573d..3825b88a 100644 --- a/apps/web/content/blog/content-presentation-gap.mdx +++ b/apps/web/content/blog/content-presentation-gap.mdx @@ -6,4 +6,126 @@ authors: [pomber] draft: true --- -test +Let's tart with an example. + +> demo (roman emperors) + +This is a UI pattern commonly referred as scrollytelling, where the content is presented in a way that is tightly coupled with the user's scroll position. + +You may have seen it in websites like [The Pudding](https://pudding.cool/), [The New York Times](https://www.nytimes.com/), or [The Washington Post](https://www.washingtonpost.com/). + +It's also used for technical content like [Stripe's API reference](https://stripe.com/docs/api) or. + +A component to implement this pattern is not super hard to build, usually it's a combination of an intersection observer and position sticky. + +```tsx +type Props = { + steps: { + content: React.ReactNode + sticker: React.ReactNode + }[] +} +function Scrollytelling({ steps }: Props) { + const [currentStep, setCurrentStep] = useState(0) + const ref = useRef(null) + + useEffect(() => { + const observer = new IntersectionObserver( + ([entry]) => { + if (entry.isIntersecting) { + setCurrentStep(parseInt(entry.target.id)) + } + }, + { threshold: 0.5 }, + ) + + steps.forEach((_, i) => { + observer.observe(document.getElementById(i.toString())!) + }) + + return () => observer.disconnect() + }, []) + + return ( +
+ {steps.map((step, i) => ( +
+ {step.content} +
+ ))} +
+ {steps[currentStep].sticker} +
+
+ ) +} +``` + +Using this component is as simple as passing an array of steps, each with a content and a sticker. + +```tsx page.tsx +export default function Page() { + return ( + +

Augustus

+

+ Augustus was the first Roman emperor, reigning from 27 BC until + his death in AD 14. +

+ + ), + sticker: Augustus, + }, + { + content: ( +
+

Nero

+

+ Nero was the last Roman emperor of the Julio-Claudian dynasty. +

+
+ ), + sticker: Nero, + }, + { + content: ( +
+

Trajan

+

Trajan was Roman emperor from 98 to 117.

+
+ ), + sticker: Trajan, + }, + ]} + /> + ) +} +``` + +Even with this simple example, you can see that writing content in this way isn't vert straightforward. + +Ideally, you would want to put the content in Markdown like this: + +```md +## Augustus + +Augustus was the first Roman emperor, reigning from 27 BC until his death in AD 14. + +![Augustus](/augustus.jpg) + +## Nero + +Nero was the last Roman emperor of the Julio-Claudian dynasty. + +![Nero](/nero.jpg) + +## Trajan + +Trajan was Roman emperor from 98 to 117. + +![Trajan](/trajan.jpg) +``` diff --git a/apps/web/content/blog/the-curse-of-markdown.mdx b/apps/web/content/blog/the-curse-of-markdown.mdx index 16bbcb23..93efe7f8 100644 --- a/apps/web/content/blog/the-curse-of-markdown.mdx +++ b/apps/web/content/blog/the-curse-of-markdown.mdx @@ -1,11 +1,40 @@ --- title: The Curse of Markdown -description: Lorem ipsum -date: 2024-06-20 +description: And how to break free from it +date: 2024-09-12 authors: [pomber] draft: true --- +Markdown is so good that it can hurt you. + +chapters: + +- introducing richness vs ax +- pre-markdown tradeoffs +- enter markdown +- the tradeoff wall +- enter mdx +- enter rsc +- the content presentation gap +- enter code hike + Tradeoffs: https://youtu.be/zqhE-CepH2g?si=7iYgDUjAhJNVmYJN&t=446 - technical cost vs product benefit + +examples of websites that mdx allow: + +- josh's blog +- react docs + +--- + +it doesnt mean that there aren't websites in this zone. but they pay a high price, either because they have resources to do so, or because they care a lot about the product. + +Examples are: + +- stripe +- swiftui +- nanda +- pudding diff --git a/package.json b/package.json index b7a48f68..6b674d44 100644 --- a/package.json +++ b/package.json @@ -9,14 +9,24 @@ "changeset": "changeset", "version-packages": "changeset version", "release": "changeset publish", - "canary": "pkg-pr-new publish --no-template --compact './packages/codehike'" + "canary": "pkg-pr-new publish --json=canary.json --comment=off --compact './packages/codehike'" }, "devDependencies": { + "@changesets/read": "0.6.1", "@changesets/cli": "2.27.1", "@changesets/changelog-github": "0.5.0", + "@octokit/action": "7.0.0", + "@octokit/rest": "21.0.2", + "@actions/exec": "1.1.1", + "@actions/github": "6.0.0", "prettier": "^3.1.1", "turbo": "^1.11.2", - "pkg-pr-new": "0.0.20" + "pkg-pr-new": "0.0.24", + "human-id": "4.1.1", + "unified": "11.0.5", + "remark-parse": "11.0.0", + "remark-stringify": "11.0.0", + "mdast-util-to-string": "4.0.0" }, "packageManager": "pnpm@9.7.1", "repository": "code-hike/codehike", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 18e9a442..ddc7a694 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,21 +8,51 @@ importers: .: devDependencies: + '@actions/exec': + specifier: 1.1.1 + version: 1.1.1 + '@actions/github': + specifier: 6.0.0 + version: 6.0.0 '@changesets/changelog-github': specifier: 0.5.0 version: 0.5.0 '@changesets/cli': specifier: 2.27.1 version: 2.27.1 + '@changesets/read': + specifier: 0.6.1 + version: 0.6.1 + '@octokit/action': + specifier: 7.0.0 + version: 7.0.0 + '@octokit/rest': + specifier: 21.0.2 + version: 21.0.2 + human-id: + specifier: 4.1.1 + version: 4.1.1 + mdast-util-to-string: + specifier: 4.0.0 + version: 4.0.0 pkg-pr-new: - specifier: 0.0.20 - version: 0.0.20 + specifier: 0.0.24 + version: 0.0.24 prettier: specifier: ^3.1.1 version: 3.1.1 + remark-parse: + specifier: 11.0.0 + version: 11.0.0 + remark-stringify: + specifier: 11.0.0 + version: 11.0.0 turbo: specifier: ^1.11.2 version: 1.11.2 + unified: + specifier: 11.0.5 + version: 11.0.5 apps/web: dependencies: @@ -223,6 +253,18 @@ importers: packages: + '@actions/exec@1.1.1': + resolution: {integrity: sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==} + + '@actions/github@6.0.0': + resolution: {integrity: sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==} + + '@actions/http-client@2.2.3': + resolution: {integrity: sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==} + + '@actions/io@1.1.3': + resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -296,17 +338,23 @@ packages: '@changesets/git@3.0.0': resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} + '@changesets/git@3.0.1': + resolution: {integrity: sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==} + '@changesets/logger@0.1.0': resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + '@changesets/parse@0.4.0': resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} '@changesets/pre@2.0.0': resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} - '@changesets/read@0.6.0': - resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + '@changesets/read@0.6.1': + resolution: {integrity: sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==} '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} @@ -468,6 +516,10 @@ packages: cpu: [x64] os: [win32] + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + '@floating-ui/core@1.5.2': resolution: {integrity: sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==} @@ -714,18 +766,38 @@ packages: resolution: {integrity: sha512-lo+nHx8kAV86bxvOVOI3vFjX3gXPd/L7guAUbvs3pUvnR2KC+R7yjBkA1uACt4gYhs4LcWP3AXSGQzsbeN2XXw==} engines: {node: '>= 18'} + '@octokit/action@7.0.0': + resolution: {integrity: sha512-YVstbUS7vbW0frVGAGtYpSqjbgCwQW1OO0WS+sc/fx0RnW0PP4kPgMCmkgkLAm51WyYTWOOQRA1HuaGTSFgyfQ==} + engines: {node: '>= 18'} + '@octokit/auth-action@4.1.0': resolution: {integrity: sha512-m+3t7K46IYyMk7Bl6/lF4Rv09GqDZjYmNg8IWycJ2Fa3YE3DE7vQcV6G2hUPmR9NDqenefNJwVtlisMjzymPiQ==} engines: {node: '>= 18'} + '@octokit/auth-action@5.1.1': + resolution: {integrity: sha512-JE2gbAZcwwVuww88YY7oB97P6eVAPgKZk2US9Uyz+ZUw5ubeRkZqog7G/gUEAjayIFt8s0UX3qNntP1agVcB0g==} + engines: {node: '>= 18'} + '@octokit/auth-token@4.0.0': resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} engines: {node: '>= 18'} + '@octokit/auth-token@5.1.1': + resolution: {integrity: sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==} + engines: {node: '>= 18'} + '@octokit/core@5.2.0': resolution: {integrity: sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==} engines: {node: '>= 18'} + '@octokit/core@6.1.2': + resolution: {integrity: sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==} + engines: {node: '>= 18'} + + '@octokit/endpoint@10.1.1': + resolution: {integrity: sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==} + engines: {node: '>= 18'} + '@octokit/endpoint@9.0.5': resolution: {integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==} engines: {node: '>= 18'} @@ -734,32 +806,66 @@ packages: resolution: {integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==} engines: {node: '>= 18'} + '@octokit/graphql@8.1.1': + resolution: {integrity: sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==} + engines: {node: '>= 18'} + '@octokit/openapi-types@20.0.0': resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} '@octokit/openapi-types@22.2.0': resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} + '@octokit/plugin-paginate-rest@11.3.3': + resolution: {integrity: sha512-o4WRoOJZlKqEEgj+i9CpcmnByvtzoUYC6I8PD2SA95M+BJ2x8h7oLcVOg9qcowWXBOdcTRsMZiwvM3EyLm9AfA==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + '@octokit/plugin-paginate-rest@9.2.1': resolution: {integrity: sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==} engines: {node: '>= 18'} peerDependencies: '@octokit/core': '5' + '@octokit/plugin-request-log@5.3.1': + resolution: {integrity: sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + '@octokit/plugin-rest-endpoint-methods@10.4.1': resolution: {integrity: sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==} engines: {node: '>= 18'} peerDependencies: '@octokit/core': '5' + '@octokit/plugin-rest-endpoint-methods@13.2.4': + resolution: {integrity: sha512-gusyAVgTrPiuXOdfqOySMDztQHv6928PQ3E4dqVGEtOvRXAKRbJR4b1zQyniIT9waqaWk/UDaoJ2dyPr7Bk7Iw==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + '@octokit/request-error@5.1.0': resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==} engines: {node: '>= 18'} + '@octokit/request-error@6.1.4': + resolution: {integrity: sha512-VpAhIUxwhWZQImo/dWAN/NpPqqojR6PSLgLYAituLM6U+ddx9hCioFGwBr5Mi+oi5CLeJkcAs3gJ0PYYzU6wUg==} + engines: {node: '>= 18'} + '@octokit/request@8.4.0': resolution: {integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==} engines: {node: '>= 18'} + '@octokit/request@9.1.3': + resolution: {integrity: sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==} + engines: {node: '>= 18'} + + '@octokit/rest@21.0.2': + resolution: {integrity: sha512-+CiLisCoyWmYicH25y1cDfCrv41kRSvTq6pPWtRroRJzhsCZWZyCqGyI8foJT5LmScADSwRAnr/xo+eewL04wQ==} + engines: {node: '>= 18'} + '@octokit/types@12.6.0': resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} @@ -1836,6 +1942,9 @@ packages: before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + before-after-hook@3.0.2: + resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -2176,10 +2285,6 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - detect-package-manager@3.0.2: - resolution: {integrity: sha512-8JFjJHutStYrfWwzfretQoyNGoZVW1Fsrp4JO9spa7h/fBfwgTMEIy4/LBzRDGsxwVPHU0q+T9YvwLDJoOApLQ==} - engines: {node: '>=12'} - devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -2332,10 +2437,6 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -2361,6 +2462,14 @@ packages: fastq@1.16.0: resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + fdir@6.3.0: + resolution: {integrity: sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} @@ -2440,10 +2549,6 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -2575,9 +2680,9 @@ packages: human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + human-id@4.1.1: + resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} + hasBin: true human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} @@ -2729,10 +2834,6 @@ packages: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3080,10 +3181,6 @@ packages: resolution: {integrity: sha512-ryBDp1Z/6X90UvjUK3RksH0IBPM137T7cmg4OgD5wQBojlAiUwuok0QeELkim/72EtcYuNlmbkrcGuxj3Kl0YQ==} engines: {node: '>= 0.6'} - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} @@ -3205,10 +3302,6 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - npm-run-path@5.2.0: resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3246,10 +3339,6 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} @@ -3289,6 +3378,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-manager-detector@0.1.2: + resolution: {integrity: sha512-iePyefLTOm2gEzbaZKSW+eBMjg+UYsQvUKxmvGXAQ987K16efBg10MxIjZs08iyX+DY2/owKY9DIdu193kX33w==} + parse-entities@4.0.1: resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} @@ -3347,10 +3439,17 @@ packages: picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + 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'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -3367,8 +3466,8 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - pkg-pr-new@0.0.20: - resolution: {integrity: sha512-nzTm/c1R5pXKwHW0mkN2FnkHrqW3D29LGAcAYkK28G9n/c8aJEIrb7TAieNV1HPrO9XEj0Z7IHAsKpcsSxO+Pw==} + pkg-pr-new@0.0.24: + resolution: {integrity: sha512-jzHuU0HLHEh3jNHQD7yZhxXM8CV8W+qdR0Ii5cxwm+t73kAvyZ9DkcDP4X1ZarX6DGnoibuuSOgWKYtQbjWsRQ==} hasBin: true pkg-types@1.2.0: @@ -3882,10 +3981,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -3977,6 +4072,10 @@ packages: tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinyglobby@0.2.6: + resolution: {integrity: sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==} + engines: {node: '>=12.0.0'} + tinypool@1.0.0: resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -4028,6 +4127,10 @@ packages: engines: {node: '>=8.0.0'} hasBin: true + tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + turbo-darwin-64@1.11.2: resolution: {integrity: sha512-toFmRG/adriZY3hOps7nYCfqHAS+Ci6xqgX3fbo82kkLpC6OBzcXnleSwuPqjHVAaRNhVoB83L5njcE9Qwi2og==} cpu: [x64] @@ -4131,6 +4234,10 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + undici@6.19.8: resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} engines: {node: '>=18.17'} @@ -4142,6 +4249,9 @@ packages: unified@11.0.4: resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unist-util-is@5.2.1: resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} @@ -4175,6 +4285,9 @@ packages: universal-user-agent@6.0.1: resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + universal-user-agent@7.0.2: + resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -4425,6 +4538,24 @@ packages: snapshots: + '@actions/exec@1.1.1': + dependencies: + '@actions/io': 1.1.3 + + '@actions/github@6.0.0': + dependencies: + '@actions/http-client': 2.2.3 + '@octokit/core': 5.2.0 + '@octokit/plugin-paginate-rest': 9.2.1(@octokit/core@5.2.0) + '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.0) + + '@actions/http-client@2.2.3': + dependencies: + tunnel: 0.0.6 + undici: 5.28.4 + + '@actions/io@1.1.3': {} + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -4520,7 +4651,7 @@ snapshots: '@changesets/git': 3.0.0 '@changesets/logger': 0.1.0 '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 + '@changesets/read': 0.6.1 '@changesets/types': 6.0.0 '@changesets/write': 0.3.0 '@manypkg/get-packages': 1.1.3 @@ -4577,7 +4708,7 @@ snapshots: '@changesets/assemble-release-plan': 6.0.0 '@changesets/config': 3.0.0 '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 + '@changesets/read': 0.6.1 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 @@ -4593,10 +4724,22 @@ snapshots: micromatch: 4.0.5 spawndamnit: 2.0.0 + '@changesets/git@3.0.1': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.5 + spawndamnit: 2.0.0 + '@changesets/logger@0.1.0': dependencies: chalk: 2.4.2 + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.0 + '@changesets/parse@0.4.0': dependencies: '@changesets/types': 6.0.0 @@ -4610,16 +4753,15 @@ snapshots: '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.0': + '@changesets/read@0.6.1': dependencies: - '@babel/runtime': 7.23.7 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 + '@changesets/git': 3.0.1 + '@changesets/logger': 0.1.1 '@changesets/parse': 0.4.0 '@changesets/types': 6.0.0 - chalk: 2.4.2 fs-extra: 7.0.1 p-filter: 2.1.0 + picocolors: 1.1.0 '@changesets/types@4.1.0': {} @@ -4718,6 +4860,8 @@ snapshots: '@esbuild/win32-x64@0.19.11': optional: true + '@fastify/busboy@2.1.1': {} + '@floating-ui/core@1.5.2': dependencies: '@floating-ui/utils': 0.1.6 @@ -4895,7 +5039,7 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.0.0 source-map: 0.7.4 - unified: 11.0.4 + unified: 11.0.5 unist-util-position-from-estree: 2.0.0 unist-util-stringify-position: 4.0.0 unist-util-visit: 5.0.0 @@ -4953,13 +5097,29 @@ snapshots: '@octokit/types': 12.6.0 undici: 6.19.8 + '@octokit/action@7.0.0': + dependencies: + '@octokit/auth-action': 5.1.1 + '@octokit/core': 6.1.2 + '@octokit/plugin-paginate-rest': 11.3.3(@octokit/core@6.1.2) + '@octokit/plugin-rest-endpoint-methods': 13.2.4(@octokit/core@6.1.2) + '@octokit/types': 13.5.0 + undici: 6.19.8 + '@octokit/auth-action@4.1.0': dependencies: '@octokit/auth-token': 4.0.0 '@octokit/types': 13.5.0 + '@octokit/auth-action@5.1.1': + dependencies: + '@octokit/auth-token': 5.1.1 + '@octokit/types': 13.5.0 + '@octokit/auth-token@4.0.0': {} + '@octokit/auth-token@5.1.1': {} + '@octokit/core@5.2.0': dependencies: '@octokit/auth-token': 4.0.0 @@ -4970,6 +5130,21 @@ snapshots: before-after-hook: 2.2.3 universal-user-agent: 6.0.1 + '@octokit/core@6.1.2': + dependencies: + '@octokit/auth-token': 5.1.1 + '@octokit/graphql': 8.1.1 + '@octokit/request': 9.1.3 + '@octokit/request-error': 6.1.4 + '@octokit/types': 13.5.0 + before-after-hook: 3.0.2 + universal-user-agent: 7.0.2 + + '@octokit/endpoint@10.1.1': + dependencies: + '@octokit/types': 13.5.0 + universal-user-agent: 7.0.2 + '@octokit/endpoint@9.0.5': dependencies: '@octokit/types': 13.5.0 @@ -4981,26 +5156,50 @@ snapshots: '@octokit/types': 13.5.0 universal-user-agent: 6.0.1 + '@octokit/graphql@8.1.1': + dependencies: + '@octokit/request': 9.1.3 + '@octokit/types': 13.5.0 + universal-user-agent: 7.0.2 + '@octokit/openapi-types@20.0.0': {} '@octokit/openapi-types@22.2.0': {} + '@octokit/plugin-paginate-rest@11.3.3(@octokit/core@6.1.2)': + dependencies: + '@octokit/core': 6.1.2 + '@octokit/types': 13.5.0 + '@octokit/plugin-paginate-rest@9.2.1(@octokit/core@5.2.0)': dependencies: '@octokit/core': 5.2.0 '@octokit/types': 12.6.0 + '@octokit/plugin-request-log@5.3.1(@octokit/core@6.1.2)': + dependencies: + '@octokit/core': 6.1.2 + '@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.2.0)': dependencies: '@octokit/core': 5.2.0 '@octokit/types': 12.6.0 + '@octokit/plugin-rest-endpoint-methods@13.2.4(@octokit/core@6.1.2)': + dependencies: + '@octokit/core': 6.1.2 + '@octokit/types': 13.5.0 + '@octokit/request-error@5.1.0': dependencies: '@octokit/types': 13.5.0 deprecation: 2.3.1 once: 1.4.0 + '@octokit/request-error@6.1.4': + dependencies: + '@octokit/types': 13.5.0 + '@octokit/request@8.4.0': dependencies: '@octokit/endpoint': 9.0.5 @@ -5008,6 +5207,20 @@ snapshots: '@octokit/types': 13.5.0 universal-user-agent: 6.0.1 + '@octokit/request@9.1.3': + dependencies: + '@octokit/endpoint': 10.1.1 + '@octokit/request-error': 6.1.4 + '@octokit/types': 13.5.0 + universal-user-agent: 7.0.2 + + '@octokit/rest@21.0.2': + dependencies: + '@octokit/core': 6.1.2 + '@octokit/plugin-paginate-rest': 11.3.3(@octokit/core@6.1.2) + '@octokit/plugin-request-log': 5.3.1(@octokit/core@6.1.2) + '@octokit/plugin-rest-endpoint-methods': 13.2.4(@octokit/core@6.1.2) + '@octokit/types@12.6.0': dependencies: '@octokit/openapi-types': 20.0.0 @@ -6127,6 +6340,8 @@ snapshots: before-after-hook@2.2.3: {} + before-after-hook@3.0.2: {} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 @@ -6466,10 +6681,6 @@ snapshots: detect-node-es@1.1.0: {} - detect-package-manager@3.0.2: - dependencies: - execa: 5.1.1 - devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -6719,18 +6930,6 @@ snapshots: dependencies: '@types/estree': 1.0.5 - execa@5.1.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - execa@8.0.1: dependencies: cross-spawn: 7.0.3 @@ -6769,6 +6968,10 @@ snapshots: dependencies: reusify: 1.0.4 + fdir@6.3.0(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + fflate@0.8.2: {} fill-range@7.0.1: @@ -6851,8 +7054,6 @@ snapshots: get-nonce@1.0.1: {} - get-stream@6.0.1: {} - get-stream@8.0.1: {} get-symbol-description@1.0.0: @@ -7037,7 +7238,7 @@ snapshots: human-id@1.0.2: {} - human-signals@2.1.0: {} + human-id@4.1.1: {} human-signals@5.0.0: {} @@ -7171,8 +7372,6 @@ snapshots: dependencies: call-bind: 1.0.7 - is-stream@2.0.1: {} - is-stream@3.0.0: {} is-string@1.0.7: @@ -7773,8 +7972,6 @@ snapshots: dependencies: mime-db: 1.25.0 - mimic-fn@2.1.0: {} - mimic-fn@4.0.0: {} min-indent@1.0.1: {} @@ -7943,10 +8140,6 @@ snapshots: normalize-range@0.1.2: {} - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - npm-run-path@5.2.0: dependencies: path-key: 4.0.0 @@ -7990,10 +8183,6 @@ snapshots: dependencies: wrappy: 1.0.2 - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - onetime@6.0.0: dependencies: mimic-fn: 4.0.0 @@ -8026,6 +8215,8 @@ snapshots: p-try@2.2.0: {} + package-manager-detector@0.1.2: {} + parse-entities@4.0.1: dependencies: '@types/unist': 2.0.10 @@ -8085,8 +8276,12 @@ snapshots: picocolors@1.0.0: {} + picocolors@1.1.0: {} + picomatch@2.3.1: {} + picomatch@4.0.2: {} + pify@2.3.0: {} pify@4.0.1: {} @@ -8097,16 +8292,16 @@ snapshots: dependencies: find-up: 4.1.0 - pkg-pr-new@0.0.20: + pkg-pr-new@0.0.24: dependencies: '@jsdevtools/ez-spawn': 3.0.4 '@octokit/action': 6.1.0 - detect-package-manager: 3.0.2 - fast-glob: 3.3.2 ignore: 5.3.2 isbinaryfile: 5.0.2 + package-manager-detector: 0.1.2 pkg-types: 1.2.0 query-registry: 3.0.1 + tinyglobby: 0.2.6 pkg-types@1.2.0: dependencies: @@ -8343,7 +8538,7 @@ snapshots: dependencies: '@types/hast': 3.0.3 hast-util-from-html: 2.0.1 - unified: 11.0.4 + unified: 11.0.5 rehype-pretty-code@0.12.5(shikiji@0.9.19): dependencies: @@ -8352,7 +8547,7 @@ snapshots: parse-numeric-range: 1.3.0 rehype-parse: 9.0.0 shikiji: 0.9.19 - unified: 11.0.4 + unified: 11.0.5 unist-util-visit: 5.0.0 remark-gfm@4.0.0: @@ -8362,7 +8557,7 @@ snapshots: micromark-extension-gfm: 3.0.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -8378,7 +8573,7 @@ snapshots: '@types/mdast': 4.0.3 mdast-util-from-markdown: 2.0.0 micromark-util-types: 2.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -8387,21 +8582,21 @@ snapshots: '@types/hast': 3.0.3 '@types/mdast': 4.0.3 mdast-util-to-hast: 13.0.2 - unified: 11.0.4 + unified: 11.0.5 vfile: 6.0.1 remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-to-markdown: 2.1.0 - unified: 11.0.4 + unified: 11.0.5 remark@15.0.1: dependencies: '@types/mdast': 4.0.3 remark-parse: 11.0.0 remark-stringify: 11.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -8720,8 +8915,6 @@ snapshots: strip-bom@3.0.0: {} - strip-final-newline@2.0.0: {} - strip-final-newline@3.0.0: {} strip-indent@3.0.0: @@ -8843,6 +9036,11 @@ snapshots: tinybench@2.8.0: {} + tinyglobby@0.2.6: + dependencies: + fdir: 6.3.0(picomatch@4.0.2) + picomatch: 4.0.2 + tinypool@1.0.0: {} tinyrainbow@1.2.0: {} @@ -8883,6 +9081,8 @@ snapshots: wcwidth: 1.0.1 yargs: 17.7.2 + tunnel@0.0.6: {} + turbo-darwin-64@1.11.2: optional: true @@ -9000,6 +9200,10 @@ snapshots: undici-types@5.26.5: {} + undici@5.28.4: + dependencies: + '@fastify/busboy': 2.1.1 + undici@6.19.8: {} unicode-emoji-modifier-base@1.0.0: {} @@ -9014,6 +9218,16 @@ snapshots: trough: 2.1.0 vfile: 6.0.1 + unified@11.0.5: + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 6.0.1 + unist-util-is@5.2.1: dependencies: '@types/unist': 2.0.10 @@ -9063,6 +9277,8 @@ snapshots: universal-user-agent@6.0.1: {} + universal-user-agent@7.0.2: {} + universalify@0.1.2: {} unquote@1.1.1: {} From d4bd878cf758fa1aaa843022ede9fa21f971c104 Mon Sep 17 00:00:00 2001 From: Rodrigo Pombo Date: Thu, 12 Sep 2024 11:07:48 +0200 Subject: [PATCH 2/2] Add website PR creation script --- .github/scripts/readme.md | 5 ++++ .github/scripts/website-pr.mjs | 37 ++++++++++++++++++++++++++++++ .github/workflows/push-to-next.yml | 29 +++++++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 .github/scripts/website-pr.mjs diff --git a/.github/scripts/readme.md b/.github/scripts/readme.md index dcdc9f44..f2477a3e 100644 --- a/.github/scripts/readme.md +++ b/.github/scripts/readme.md @@ -47,6 +47,11 @@ For every push to `next`: - labels: `release` ``` +``` +- create a PR from 'next' to 'main' if it doesn't exist + - title: Update website +``` + ## release-pr-merged for every `release` pr merged to `next`: diff --git a/.github/scripts/website-pr.mjs b/.github/scripts/website-pr.mjs new file mode 100644 index 00000000..eb5ec82a --- /dev/null +++ b/.github/scripts/website-pr.mjs @@ -0,0 +1,37 @@ +import { Octokit } from "@octokit/action" +import github from "@actions/github" +import { BASE_BRANCH } from "./params.mjs" + +const octokit = new Octokit({}) + +console.log("Find existing PR") +const { data: prs } = await octokit.pulls.list({ + ...github.context.repo, + state: "open", + base: "main", + head: `${github.context.repo.owner}:${BASE_BRANCH}`, +}) +console.log("Existing PRs", prs) + +const title = `✨ Update website ✨` +const body = "" + +if (prs.length === 0) { + console.log("Creating new PR") + await octokit.rest.pulls.create({ + ...github.context.repo, + base: "main", + head: BASE_BRANCH, + title, + body, + }) +} else { + // console.log("Updating existing PR") + // const { number } = prs[0] + // await octokit.rest.pulls.update({ + // ...github.context.repo, + // pull_number: number, + // title, + // body, + // }) +} diff --git a/.github/workflows/push-to-next.yml b/.github/workflows/push-to-next.yml index 39aef962..59fd57b1 100644 --- a/.github/workflows/push-to-next.yml +++ b/.github/workflows/push-to-next.yml @@ -43,3 +43,32 @@ jobs: run: node .github/scripts/prepare-release.mjs env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + website-pr: + name: Update website PR + runs-on: ubuntu-latest + + permissions: + pull-requests: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + run_install: false + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + + - run: pnpm install + + - name: Create or update website PR + run: node .github/scripts/website-pr.mjs + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}