Migrate to changesets from custom release tooling (#5840)

- Remove custom release tooling in favor of changesets
- Add changesets for all unreleased commits
This commit is contained in:
Merlijn Vos 2025-07-24 09:24:09 +02:00 committed by GitHub
parent 0525a2c91a
commit 0c24c5aeab
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
24 changed files with 576 additions and 949 deletions

8
.changeset/README.md Normal file
View file

@ -0,0 +1,8 @@
# Changesets
Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
with multi-package repos, or single-package repos to help you version and publish your code. You can
find the full documentation for it [in our repository](https://github.com/changesets/changesets)
We have a quick list of common questions to get you started engaging with this project in
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)

View file

@ -0,0 +1,5 @@
---
"@uppy/vue": patch
---
Fix uppy prop in UppyContextProvider

View file

@ -0,0 +1,5 @@
---
"@uppy/webcam": minor
---
Add image preview with accept/discard buttons

11
.changeset/config.json Normal file
View file

@ -0,0 +1,11 @@
{
"$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [],
"linked": [],
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": []
}

View file

@ -0,0 +1,5 @@
---
"@uppy/core": patch
---
Resolve stale state in checkAndUpdateFileState

View file

@ -0,0 +1,5 @@
---
"@uppy/companion": minor
---
Add provider name to metadata for observability

View file

@ -0,0 +1,5 @@
---
"@uppy/companion": patch
---
Make StreamableBlob spec compliant for Node.js 24+

View file

@ -0,0 +1,5 @@
---
"@uppy/locales": minor
---
Update Swedish translations

View file

@ -0,0 +1,50 @@
---
"@uppy/audio": minor
"@uppy/aws-s3": minor
"@uppy/aws-s3-multipart": minor
"@uppy/box": minor
"@uppy/companion-client": minor
"@uppy/components": minor
"@uppy/compressor": minor
"@uppy/core": minor
"@uppy/dashboard": minor
"@uppy/drag-drop": minor
"@uppy/drop-target": minor
"@uppy/dropbox": minor
"@uppy/facebook": minor
"@uppy/file-input": minor
"@uppy/form": minor
"@uppy/golden-retriever": minor
"@uppy/google-drive": minor
"@uppy/google-drive-picker": minor
"@uppy/google-photos-picker": minor
"@uppy/image-editor": minor
"@uppy/informer": minor
"@uppy/instagram": minor
"@uppy/locales": minor
"@uppy/onedrive": minor
"@uppy/progress-bar": minor
"@uppy/provider-views": minor
"@uppy/react": minor
"@uppy/redux-dev-tools": minor
"@uppy/remote-sources": minor
"@uppy/screen-capture": minor
"@uppy/status-bar": minor
"@uppy/store-default": minor
"@uppy/store-redux": minor
"@uppy/svelte": minor
"@uppy/thumbnail-generator": minor
"@uppy/transloadit": minor
"@uppy/tus": minor
"@uppy/unsplash": minor
"@uppy/url": minor
"@uppy/utils": minor
"@uppy/vue": minor
"@uppy/webcam": minor
"@uppy/webdav": minor
"@uppy/xhr-upload": minor
"@uppy/zoom": minor
"uppy": minor
---
Use TypeScript compiler instead of Babel

View file

@ -1,91 +0,0 @@
name: Release candidate
on:
push:
branches:
- release
env:
YARN_ENABLE_GLOBAL_CACHE: false
jobs:
prepare-release:
name: Prepare release candidate Pull Request
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
with:
ref: release
- name: Rebase
run: |
git fetch origin HEAD --depth=1
git config --global user.email "actions@github.com"
git config --global user.name "GitHub Actions"
git rebase FETCH_HEAD
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run:
echo "dir=$(corepack yarn config get cacheFolder)" >> $GITHUB_OUTPUT
- uses: actions/cache@v4
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Install dependencies
run: corepack yarn install --immutable
env:
# https://docs.cypress.io/guides/references/advanced-installation#Skipping-installation
CYPRESS_INSTALL_BINARY: 0
- name: Bump candidate packages version
run: corepack yarn version apply --all --json | jq -s > releases.json
- name: Prepare changelog
run:
corepack yarn workspace @uppy-dev/release update-changelogs
releases.json | xargs git add
- name: Update CDN URLs
run:
corepack yarn workspace @uppy-dev/release update-version-URLs | xargs
git add
- name: Stage changes and remove temp files
run: |
git rm -rf .yarn/versions
git rm CHANGELOG.next.md
jq -r 'map(.cwd) | join("\n")' < releases.json | awk '{ print "git add " $0 "/package.json" }' | sh
- name: Commit
run: |
echo "Release: uppy@$(jq -r 'map(select(.ident == "uppy"))[0].newVersion' < releases.json)" > commitMessage
echo >> commitMessage
echo "This is a release candidate for the following packages:" >> commitMessage
echo >> commitMessage
jq -r 'map("- `"+.ident+"`: "+.oldVersion+" -> "+.newVersion) | join("\n") ' < releases.json >> commitMessage
git commit -n --amend --file commitMessage
- name: Open Pull Request
id: pr_opening
run: |
git push origin HEAD:release-candidate
gh api repos/${{ github.repository }}/pulls \
-F base="$(gh api /repos/${{ github.repository }} | jq -r .default_branch)" \
-F head="release-candidate" \
-F title="$(head -1 commitMessage)" \
-F body="$(git --no-pager diff HEAD^ -- CHANGELOG.md | awk '{ if( substr($0,0,1) == "+" && $1 != "+##" && $1 != "+Released:" && $1 != "+++" ) { print substr($0,2) } }')" \
--jq '.number | tostring | "pr_number="+.' >> $GITHUB_OUTPUT
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Assign to the releaser
run:
echo '{"assignees":[${{ toJSON(github.actor) }}]}' | gh api repos/${{
github.repository }}/issues/${{ steps.pr_opening.outputs.pr_number
}}/assignees --input -
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Enable Release workflow
run: gh workflow enable 15329895 --repo ${{ github.repository }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View file

@ -1,172 +1,43 @@
name: Release
on:
pull_request_review:
types: [submitted]
name: release
env:
YARN_ENABLE_GLOBAL_CACHE: false
on:
push:
branches:
- main
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
release:
name: Publish releases
if:
${{ github.event.review.state == 'approved' && github.event.sender.login
== github.event.pull_request.assignee.login &&
github.event.pull_request.head.ref == 'release-candidate' }}
outputs:
companionWasReleased:
${{ steps.checkIfCompanionWasReleased.outputs.version }}
name: Release
runs-on: ubuntu-latest
steps:
- name: Checkout sources
- name: Checkout Repo
uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run:
echo "dir=$(corepack yarn config get cacheFolder)" >> $GITHUB_OUTPUT
- uses: actions/cache@v4
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Install Node.js
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: lts/*
# Allow yarn to make changes during release
- run: corepack yarn config set enableHardenedMode false
- run: corepack yarn --mode=update-lockfile
- name: Install dependencies
run: corepack yarn install --immutable
env:
# https://docs.cypress.io/guides/references/advanced-installation#Skipping-installation
CYPRESS_INSTALL_BINARY: 0
- name: Get CHANGELOG diff
run:
git --no-pager diff HEAD^ -- CHANGELOG.md | awk '{ if( substr($0,0,1)
== "+" && $1 != "+##" && $1 != "+Released:" && $1 != "+++" ) { print
substr($0,2) } }' > CHANGELOG.diff.md
- name: Copy README for `uppy` package
run: cp README.md packages/uppy/.
- name: Build before publishing
run: corepack yarn run build
- name: Hack to allow the publish of the Angular package
run: corepack yarn workspace @uppy/angular prepublishOnly
- name: Publish to the npm registry
run:
corepack yarn workspaces foreach --all --no-private npm publish
--access public --tolerate-republish
env:
YARN_NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Merge PR
id: merge
run: |
gh api -X PUT repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/merge \
-F merge_method="squash" \
-F commit_message="$(cat CHANGELOG.diff.md)" \
--jq 'if .merged then "sha="+.sha else error("not merged") end' >> $GITHUB_OUTPUT
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create tags
continue-on-error: true
run: |
git --no-pager diff --name-only HEAD^ | awk '$0 ~ /^packages\/.+\/package\.json$/ { print "jq -r '"'"'\"gh api /repos/{owner}/{repo}/git/refs -f ref=\\\"refs/tags/\"+.name+\"@\"+.version+\"\\\" -f sha=${{ steps.merge.outputs.sha }}\"'"'"' < " $0 }' > createTags.sh
cat createTags.sh
sh createTags.sh | sh
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Get Uppy version number
id: uppyVersion
run:
jq -r '"version="+.version' < packages/uppy/package.json >>
$GITHUB_OUTPUT
- name: Create GitHub release
run: |
if ! gh release view uppy@${{ steps.uppyVersion.outputs.version }} > /dev/null 2>&1; then
gh release create uppy@${{ steps.uppyVersion.outputs.version }} \
-t "Uppy ${{ steps.uppyVersion.outputs.version }}" \
-F CHANGELOG.diff.md
else
echo "Release ${{ steps.uppyVersion.outputs.version }} already exists. Skipping."
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload `uppy` to CDN
run: corepack yarn run uploadcdn uppy -- --force
env:
EDGLY_KEY: ${{secrets.EDGLY_KEY}}
EDGLY_SECRET: ${{secrets.EDGLY_SECRET}}
- name: Upload `@uppy/locales` to CDN if it was released
run: corepack yarn run uploadcdn @uppy/locales -- --force
env:
EDGLY_KEY: ${{secrets.EDGLY_KEY}}
EDGLY_SECRET: ${{secrets.EDGLY_SECRET}}
- name: Check if Companion was released
id: checkIfCompanionWasReleased
run:
git diff --exit-code --quiet HEAD^ --
packages/@uppy/companion/package.json || echo "version=$(jq -r
.version < packages/@uppy/companion/package.json)" >> $GITHUB_OUTPUT
- name: Remove release-candidate branch
run:
gh api -X DELETE repos/${{ github.repository
}}/git/refs/heads/release-candidate || echo "Already deleted"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Remove release branch
run:
gh api -X DELETE repos/${{ github.repository }}/git/refs/heads/release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Disable Release workflow
run: gh workflow disable 15329895 --repo ${{ github.repository }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: In case of failure
if: ${{ failure() }}
run:
gh pr comment ${{ github.event.pull_request.number }} --body "Release
job failed, please take action."
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# See also companion-deploy.yml
docker:
name: DockerHub
needs: release
if: ${{ needs.release.outputs.companionWasReleased }}
runs-on: ubuntu-latest
env:
DOCKER_BUILDKIT: 0
COMPOSE_DOCKER_CLI_BUILD: 0
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Docker meta
id: docker_meta
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0
- name: Build
run: corepack yarn build
- name: Create Release Pull Request or Publish
id: changesets
uses: changesets/action@v1
with:
images: transloadit/companion
tags: |
type=edge
type=semver,pattern={{version}},value=${{ needs.release.outputs.companionWasReleased }}
# set latest tag for default branch
type=raw,value=latest,enable=true
- uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
- uses: docker/setup-buildx-action@v3
- name: Log in to DockerHub
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
with:
username: ${{secrets.DOCKER_USERNAME}}
password: ${{secrets.DOCKER_PASSWORD}}
- name: Build and push
uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
with:
push: true
context: .
platforms: linux/amd64,linux/arm64
file: Dockerfile
tags: ${{ steps.docker_meta.outputs.tags }}
labels: ${{ steps.docker_meta.outputs.labels }}
version: corepack yarn run version
publish: corepack yarn run release
commit: '[ci] release'
title: '[ci] release'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

View file

@ -1,6 +1,7 @@
{
"name": "example-companion-custom-provider",
"version": "0.0.0",
"private": true,
"type": "module",
"dependencies": {
"@uppy/companion-client": "workspace:*",
@ -23,7 +24,6 @@
"npm-run-all": "^4.1.2",
"vite": "^5.4.17"
},
"private": true,
"scripts": {
"start": "npm-run-all --parallel start:server start:client",
"start:client": "vite",

View file

@ -28,7 +28,6 @@
"e2e:generate": "yarn workspace e2e generate-test",
"e2e:headless": "yarn workspace e2e cypress:headless",
"e2e": "npm-run-all --parallel build:watch e2e:client start:companion:with-loadbalancer e2e:cypress",
"release": "PACKAGES=$(yarn workspaces list --json) yarn workspace @uppy-dev/release interactive",
"size": "echo 'JS Bundle mingz:' && cat ./packages/uppy/dist/uppy.min.js | gzip | wc -c && echo 'CSS Bundle mingz:' && cat ./packages/uppy/dist/uppy.min.css | gzip | wc -c",
"start:companion": "yarn workspace @uppy/companion start:dev",
"start:companion:with-loadbalancer": "e2e/start-companion-with-load-balancer.mjs",
@ -36,7 +35,8 @@
"test:watch": "turbo watch test --filter='./packages/@uppy/*' --filter='./packages/uppy'",
"typecheck": "turbo run typecheck --filter='./packages/@uppy/*' --filter='./packages/uppy'",
"uploadcdn": "yarn workspace uppy exec -- node upload-to-cdn.js",
"version": "yarn node ./bin/after-version-bump.js"
"version": "changeset version && corepack yarn install --mode=update-lockfile",
"release": "changeset publish"
},
"resolutions": {
"@types/react": "^18",
@ -48,6 +48,8 @@
},
"devDependencies": {
"@biomejs/biome": "2.0.5",
"@changesets/changelog-github": "^0.5.1",
"@changesets/cli": "^2.29.5",
"npm-run-all": "^4.1.5",
"start-server-and-test": "^1.14.0",
"turbo": "^2.5.4",

View file

@ -1,84 +0,0 @@
#!/usr/bin/env node
import { readFileSync } from 'node:fs'
import { open } from 'node:fs/promises'
import { fileURLToPath } from 'node:url'
import { globby } from 'globby'
const ROOT = new URL('../../', import.meta.url)
const PACKAGES_FOLDER = new URL('./packages/', ROOT)
const VERSION_URL =
/(?<=https:\/\/\S+\/v)\d+\.\d+\.\d+(?:-(?:alpha|beta)(?:[.-]\d+)?)?(?=\/)/g
async function replaceInFile(filename, replacements) {
const file = await open(filename, 'r+')
let content = await file.readFile('utf8')
let hasBeenModified = false
let exec
exec = VERSION_URL.exec(content)
while (exec) {
const pkg = Object.keys(replacements).find(
(pkgName) =>
content.slice(exec.index - pkgName.length, exec.index) === pkgName,
)
if (pkg && exec[0] !== replacements[pkg]) {
hasBeenModified = true
content =
content.slice(0, exec.index) +
replacements[pkg] +
content.slice(VERSION_URL.lastIndex)
}
exec = VERSION_URL.exec(content)
}
if (hasBeenModified) {
const { bytesWritten } = await file.write(content, 0, 'utf8')
await file.truncate(bytesWritten)
console.log(filename)
}
await file.close()
}
async function updateVersions(files, packageNames) {
const replacements = Object.fromEntries(
packageNames.map((packageName) => {
const { version } = JSON.parse(
readFileSync(
new URL(`./${packageName}/package.json`, PACKAGES_FOLDER),
'utf8',
),
)
// uppy → /uppy/v
// @uppy/robodog → /uppy/robodog/v
const urlPart = `/${packageName.replace(/^@/, '')}/v`
return [urlPart, version]
}),
)
await Promise.all(files.map((f) => replaceInFile(f, replacements)))
}
const files = await globby(
[
'README.md',
'BUNDLE-README.md',
'examples/**/*.html',
'packages/*/README.md',
'packages/@uppy/*/README.md',
'website/src/docs/**',
'website/src/examples/**',
'website/themes/uppy/layout/**',
'!**/node_modules/**',
],
{
gitignore: true,
onlyFiles: true,
cwd: fileURLToPath(ROOT),
absolute: true,
},
)
await updateVersions(files, ['uppy', '@uppy/locales'])

View file

@ -1,51 +0,0 @@
#!/usr/bin/env node
// Usage: autoFixConflicts.js | sh
import { spawn } from 'node:child_process'
import { createInterface as readLines } from 'node:readline'
const VERSION_URL =
/(?<=https:\/\/\S+\/v)\d+\.\d+\.\d+(?:-(?:alpha|beta)(?:[.-]\d+)?)?(?=\/)/
const gitStatus = spawn('git', ['status', '--porcelain'])
for await (const line of readLines(gitStatus.stdout)) {
if (!line.startsWith('UU ')) continue
const file = line.slice(3)
if (file === 'yarn.lock') {
console.log('corepack yarn install')
console.log('git add yarn.lock')
continue
}
if (file.endsWith('/package.json')) {
console.log(`git checkout --ours ${file}`)
console.log(`git add ${file}`)
continue
}
const gitDiff = spawn('git', ['--no-pager', 'diff', '--', file])
let conflictHasStarted = false
let containsCDNChanges = true
let currentConflictContainsCDNChanges = false
for await (const line of readLines(gitDiff.stdout)) {
if (conflictHasStarted) {
if (line.startsWith('++>>>>>>>')) {
conflictHasStarted = false
containsCDNChanges &&= currentConflictContainsCDNChanges
currentConflictContainsCDNChanges = false
} else {
currentConflictContainsCDNChanges ||= VERSION_URL.test(line)
}
} else if (line === '++<<<<<<< HEAD') {
conflictHasStarted = true
}
}
if (containsCDNChanges) {
console.log(`git checkout --ours ${file}`)
console.log(`git add ${file}`)
}
}

View file

@ -1,89 +0,0 @@
import { spawnSync } from 'node:child_process'
import { createWriteStream, mkdirSync } from 'node:fs'
import prompts from 'prompts'
import { TARGET_BRANCH } from './config.js'
function maxSemverness(a, b) {
if (a === 'major' || b === 'major') return 'major'
if (a === 'premajor' || b === 'premajor') return 'premajor'
if (a === 'minor' || b === 'minor') return 'minor'
if (a === 'preminor' || b === 'preminor') return 'preminor'
if (a === 'prepatch' || b === 'prepatch') return 'prepatch'
if (a === 'prepatch' || b === 'prerelease') return 'prerelease'
return 'patch'
}
export default async function pickSemverness(
spawnOptions,
LAST_RELEASE_COMMIT,
releaseFileUrl,
packagesList,
) {
mkdirSync(new URL('.', releaseFileUrl), { recursive: true })
const releaseFile = createWriteStream(releaseFileUrl)
releaseFile.write('releases:\n')
let uppySemverness
for await (const workspaceInfo of packagesList) {
const { location, name } = JSON.parse(workspaceInfo)
if (!name.startsWith('@uppy/')) continue
const { stdout } = spawnSync(
'git',
[
'--no-pager',
'log',
'--format=- %s',
`${LAST_RELEASE_COMMIT}..`,
'--',
location,
],
spawnOptions,
)
if (stdout.length === 0) {
console.log(`No commits since last release for ${name}, skipping.`)
continue
}
console.log('\n')
console.log('-'.repeat(20))
console.log(name)
console.log(
`\nHere are the commits that landed on ${name} since previous release:\n${stdout}\n`,
)
console.log(
`Check the web UI at https://github.com/transloadit/uppy/tree/${TARGET_BRANCH}/${encodeURI(
location,
)}.`,
)
const response = await prompts({
type: 'select',
name: 'value',
message: `What should be the semverness of next ${name} release?`,
choices: [
{ title: 'Pre-release', value: 'prerelease' },
{ title: 'Skip this package', value: '' },
{ title: 'Patch', value: 'patch' },
{ title: 'Minor', value: 'minor' },
{ title: 'Major', value: 'major' },
],
initial: 2,
})
if (!response.value) {
console.log('Skipping.')
continue
}
releaseFile.write(` ${JSON.stringify(name)}: ${response.value}\n`)
uppySemverness = maxSemverness(uppySemverness, response.value)
}
if (uppySemverness == null)
throw new Error('No package to release, aborting.')
releaseFile.write(` "uppy": ${uppySemverness}\n`)
releaseFile.close()
}

View file

@ -1,42 +0,0 @@
import { spawnSync } from 'node:child_process'
import { fileURLToPath } from 'node:url'
import prompts from 'prompts'
import { REPO_NAME, REPO_OWNER } from './config.js'
export default async function commit(spawnOptions, ...files) {
console.log(`Now is the time to do manual edits to:`)
files.forEach((f) => console.log(f.toString()))
console.log()
await prompts({
type: 'toggle',
name: 'value',
message: 'Ready to commit?',
initial: true,
active: 'yes',
inactive: 'no',
})
spawnSync(
'git',
['add', ...files.map((url) => fileURLToPath(url))],
spawnOptions,
)
spawnSync('git', ['commit', '-n', '-m', 'Prepare next release'], {
...spawnOptions,
stdio: 'inherit',
})
const sha = spawnSync('git', ['rev-parse', 'HEAD'], spawnOptions)
.stdout.toString()
.trim()
const getRemoteCommamnd = `git remote -v | grep '${REPO_OWNER}/${REPO_NAME}' | awk '($3 == "(push)") { print $1; exit }'`
const remote =
spawnSync('/bin/sh', ['-c', getRemoteCommamnd]).stdout.toString().trim() ||
`git@github.com:${REPO_OWNER}/${REPO_NAME}.git`
console.log(`Please run \`git push ${remote} ${sha}:refs/heads/release\`.`)
console.log(`An automation will kick off and open a release candidate PR
on the GitHub repository. Do not merge it manually! Review the PR (you may need to close and
re-open so the CI and test will run on it). If everything looks good, approve the PR
this will publish updated packages to npm, then the PR will be merged.`)
}

View file

@ -1,3 +0,0 @@
export const REPO_OWNER = 'transloadit'
export const REPO_NAME = 'uppy'
export const TARGET_BRANCH = 'main'

View file

@ -1,107 +0,0 @@
import { spawn } from 'node:child_process'
import { createWriteStream } from 'node:fs'
import { createInterface } from 'node:readline'
import prompts from 'prompts'
const subsystem =
/((?<=^packages\/)@uppy\/[a-z0-9-]+|(?<=^)(?:docs|e2e|examples))\//
async function inferPackageForCommit(sha, spawnOptions) {
const cp = spawn(
'git',
['--no-pager', 'log', '-1', '--name-only', sha],
spawnOptions,
)
const candidates = {}
for await (const path of createInterface({ input: cp.stdout })) {
const match = subsystem.exec(path)
if (match != null) {
candidates[match[1]] ??= 0
candidates[match[1]]++
}
}
const maxVal = Math.max(...Object.values(candidates))
return {
inferredPackages: Number.isFinite(maxVal)
? Object.entries(candidates)
.flatMap(([pkg, nbOfFiles]) =>
nbOfFiles === maxVal || nbOfFiles === maxVal - 1 ? [pkg] : [],
)
.join(',')
: 'meta',
candidates,
}
}
export default async function formatChangeLog(
spawnOptions,
LAST_RELEASE_COMMIT,
changeLogUrl,
) {
const changeLogCommits = createWriteStream(changeLogUrl)
const gitLog = spawn(
'git',
[
'--no-pager',
'log',
'--format="%H::%s::%an"',
`${LAST_RELEASE_COMMIT}..HEAD`,
],
spawnOptions,
)
const expectedFormat =
/^"([a-f0-9]+)::(?:((?:@uppy\/[a-z0-9-]+(?:,@uppy\/[a-z0-9-]+)*)|meta|docs|e2e|examples):\s?)?(.+?)(\s\(#\d+\))?::(.+)"$/
for await (const log of createInterface({ input: gitLog.stdout })) {
const [, sha, packageName, title, PR, authorName] = expectedFormat.exec(log)
const formattedCommitTitle = {
packageName,
title,
authorInfo: PR ? `${authorName} / #${PR.slice(3, -1)}` : authorName,
}
if (!packageName) {
console.log(
`No package info found in commit title: ${sha} (https://github.com/transloadit/uppy/commit/${sha})`,
)
console.log(log)
const { inferredPackages, candidates } = await inferPackageForCommit(
sha,
spawnOptions,
)
const { useInferred } = await prompts({
type: 'confirm',
name: 'useInferred',
message: `Assign commit to ${inferredPackages} (inferred from the files it touches)?`,
initial: true,
})
if (useInferred) {
formattedCommitTitle.packageName = inferredPackages
} else {
const response = await prompts({
type: 'autocompleteMultiselect',
name: 'value',
message: 'Which package(s) does this commit belong to?',
min: 1,
choices: [
{ title: 'Docs', value: 'docs' },
{ title: 'Meta', value: 'meta' },
...Object.entries(candidates)
.sort((a, b) => a[1] > b[1])
.map(([value]) => ({ title: value, value })),
],
})
if (!Array.isArray(response.value)) throw new Error('Aborting release')
formattedCommitTitle.packageName = response.value.join(',')
}
}
changeLogCommits.write(
`- ${formattedCommitTitle.packageName}: ${formattedCommitTitle.title} (${formattedCommitTitle.authorInfo})\n`,
)
}
changeLogCommits.close()
}

View file

@ -1,117 +0,0 @@
import { spawnSync } from 'node:child_process'
import prompts from 'prompts'
import { REPO_NAME, REPO_OWNER, TARGET_BRANCH } from './config.js'
async function apiCall(endpoint, errorMessage) {
const response = await fetch(
`https://api.github.com/repos/${REPO_OWNER}/${REPO_NAME}${endpoint}`,
)
if (response.ok) {
return response.json()
}
console.warn(response)
throw new Error(errorMessage)
}
export async function getRemoteHEAD() {
return (
await apiCall(
`/git/ref/heads/${TARGET_BRANCH}`,
'Cannot get remote HEAD, check your internet connection.',
)
).object.sha
}
async function getLatestReleaseSHA() {
const response = await fetch(
`https://raw.githubusercontent.com/${REPO_OWNER}/${REPO_NAME}/${TARGET_BRANCH}/packages/uppy/package.json`,
)
if (!response.ok)
throw new Error(
`Network call failed: ${response.status} ${response.statusText}`,
)
const { version } = await response.json()
const tag_name = `uppy@${version}`
console.log(`Last release was ${tag_name}.`)
return (
await apiCall(
`/git/ref/tags/${encodeURIComponent(tag_name)}`,
`Failed to fetch information for release ${JSON.stringify(tag_name)}`,
)
).object.sha
}
async function getLocalHEAD() {
return spawnSync('git', ['rev-parse', 'HEAD']).stdout.toString().trim()
}
export function rewindGitHistory(spawnOptions, sha) {
return spawnSync('git', ['reset', sha, '--hard'], spawnOptions).status === 0
}
export async function validateGitStatus(spawnOptions) {
const latestRelease = getLatestReleaseSHA() // run in parallel to speed things up
const [REMOTE_HEAD, LOCAL_HEAD] = await Promise.all([
getRemoteHEAD(),
getLocalHEAD(),
])
const { status, stderr } = spawnSync(
'git',
['diff', '--exit-code', '--quiet', REMOTE_HEAD, '--', '.'],
spawnOptions,
)
if (status !== 0) {
console.error(stderr.toString())
console.log(
`git repository is not clean and/or not in sync with ${REPO_OWNER}/${REPO_NAME}`,
)
if (
spawnSync(
'git',
['diff', '--exit-code', '--quiet', LOCAL_HEAD, '--', '.'],
spawnOptions,
).status !== 0
) {
const { value } = await prompts({
type: 'confirm',
name: 'value',
message:
'Do you want to hard reset your local repository (all uncommitted changes will be lost)?',
})
if (!value) {
throw new Error(
'Please ensure manually that your local repository is clean and up to date.',
)
}
}
if (stderr.indexOf('bad object') !== -1) {
const { status, stdout, stderr } = spawnSync(
'git',
[
'fetch',
`https://github.com/${REPO_OWNER}/${REPO_NAME}.git`,
TARGET_BRANCH,
],
spawnOptions,
)
if (status) {
console.log(stdout.toString())
console.error(stderr.toString())
throw new Error(
'Failed to fetch, please ensure manually that your local repository is up to date',
)
}
}
if (!rewindGitHistory(spawnOptions, REMOTE_HEAD)) {
throw new Error(
'Failed to reset, please ensure manually that your local repository is clean and up to date.',
)
}
}
return [await latestRelease, LOCAL_HEAD]
}

View file

@ -1,36 +0,0 @@
#!/usr/bin/env node
import process from 'node:process'
import { fileURLToPath } from 'node:url'
import pickSemverness from './choose-semverness.js'
import commit from './commit-and-open-pr.js'
import formatChangeLog from './formatChangeLog.js'
import {
rewindGitHistory,
validateGitStatus,
} from './getUpToDateRefsFromGitHub.js'
const ROOT = new URL('../../', import.meta.url)
const spawnOptions = { cwd: fileURLToPath(ROOT) }
const deferredReleaseFile = new URL('./.yarn/versions/next.yml', ROOT)
const temporaryChangeLog = new URL('./CHANGELOG.next.md', ROOT)
console.log('Validating local repo status and get previous release info...')
const [LAST_RELEASE_COMMIT, LOCAL_HEAD] = await validateGitStatus(spawnOptions)
try {
console.log('Local git repository is ready, starting release process...')
await pickSemverness(
spawnOptions,
LAST_RELEASE_COMMIT,
deferredReleaseFile,
process.env.PACKAGES.split(' '),
)
console.log('Working on the changelog...')
await formatChangeLog(spawnOptions, LAST_RELEASE_COMMIT, temporaryChangeLog)
console.log('Final step...')
await commit(spawnOptions, deferredReleaseFile, temporaryChangeLog)
} finally {
console.log('Rewinding git history...')
await rewindGitHistory(spawnOptions, LOCAL_HEAD)
}

View file

@ -1,15 +0,0 @@
{
"name": "@uppy-dev/release",
"version": "0.0.0",
"private": true,
"type": "module",
"devDependencies": {
"globby": "^13.0.0",
"prompts": "^2.4.2"
},
"scripts": {
"interactive": "node ./interactive.js",
"update-changelogs": "node ./updateChangelogs.js",
"update-version-URLs": "node ./afterVersionBump.js"
}
}

View file

@ -1,134 +0,0 @@
#!/usr/bin/env node
import { Buffer } from 'node:buffer'
import { createReadStream, promises as fs } from 'node:fs'
import process from 'node:process'
import { createInterface } from 'node:readline'
const ROOT = new URL('../../', import.meta.url)
const PACKAGES_FOLDER = new URL('./packages/', ROOT)
const releasedDate = new Date().toISOString().slice(0, 10)
const releases = JSON.parse(
await fs.readFile(new URL(process.argv[2], ROOT), 'utf-8'),
)
const uppyRelease = releases.find(({ ident }) => ident === 'uppy')
const changelog = await fs.open(new URL('./CHANGELOG.md', ROOT), 'r+')
const changelogContent = await changelog.readFile()
const mostRecentReleaseHeading = changelogContent.indexOf('\n## ')
function* makeTable(versions) {
const pkgNameMaxLength = Math.max(
'Package'.length,
...versions.map((pkg) => pkg.ident.length),
)
const pkgVersionMaxLength = Math.max(
'Version'.length,
...versions.map((pkg) => pkg.newVersion.length),
)
const makeRow = (...cells) =>
`| ${cells.map((cell, i) => cell[i % 2 ? 'padStart' : 'padEnd'](i % 2 ? pkgVersionMaxLength : pkgNameMaxLength)).join(' | ')} |`
yield makeRow('Package', 'Version', 'Package', 'Version')
yield makeRow(
...Array.from({ length: 4 }, (_, i) =>
'-'.repeat(i % 2 ? pkgVersionMaxLength : pkgNameMaxLength),
),
)
const mid = Math.ceil(versions.length / 2)
for (let i = 0; i < mid; i++) {
const left = versions[i] || { ident: '', newVersion: '' }
const right = versions[i + mid] || { ident: '', newVersion: '' }
yield makeRow(left.ident, left.newVersion, right.ident, right.newVersion)
}
}
/**
* Opens the changelog of a given package, creating it if it doesn't exist.
*
* @param {string} pkg Package name
* @returns {Promise<fs.FileHandle>}
*/
async function updateSubPackageChangelog(pkg, lines, subsetOfLines) {
const packageReleaseInfo = releases.find(({ ident }) => ident === pkg)
if (packageReleaseInfo == null) {
console.warn(pkg, 'is not being released')
return null
}
const { newVersion } = packageReleaseInfo
const url = new URL(`./${pkg}/CHANGELOG.md`, PACKAGES_FOLDER)
const heading = Buffer.from(`# ${pkg}\n`)
let fh
let oldContent
try {
fh = await fs.open(url, 'r+') // this will throw if the file doesn't exist
oldContent = await fh.readFile()
} catch (e) {
if (e.code !== 'ENOENT') {
throw e
}
// Creates the file if it doesn't exist yet.
fh = await fs.open(url, 'wx')
await fh.writeFile(heading)
}
const { bytesWritten } = await fh.write(
`
## ${newVersion}
Released: ${releasedDate}
Included in: Uppy v${uppyRelease.newVersion}
${subsetOfLines.map((index) => lines[index]).join('\n')}
`,
heading.byteLength,
)
if (oldContent != null) {
await fh.write(
oldContent,
heading.byteLength,
undefined,
bytesWritten + heading.byteLength,
)
}
console.log(`packages/${pkg}/CHANGELOG.md`) // outputing the relative path of the file to git add it.
return fh.close()
}
const subPackagesChangelogs = {}
const lines = []
for await (const line of createInterface({
input: createReadStream(new URL('./CHANGELOG.next.md', ROOT)),
})) {
const index = lines.push(line) - 1
for (const pkg of line.slice(2, line.indexOf(':')).split(',')) {
subPackagesChangelogs[pkg] ??= []
subPackagesChangelogs[pkg].push(index)
}
}
await changelog.write(
`
## ${uppyRelease.newVersion}
Released: ${releasedDate}
${Array.from(makeTable(releases)).join('\n')}
${lines.join('\n')}
${changelogContent.slice(mostRecentReleaseHeading)}`,
mostRecentReleaseHeading,
)
console.log('CHANGELOG.md') // outputing the relative path of the file to git add it.
await changelog.close()
await Promise.all(
Object.entries(subPackagesChangelogs).map(([pkg, subsetOfLines]) =>
updateSubPackageChangelog(pkg, lines, subsetOfLines),
),
)

464
yarn.lock
View file

@ -4891,7 +4891,7 @@ __metadata:
languageName: node
linkType: hard
"@babel/runtime@npm:^7.20.0":
"@babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.5.5":
version: 7.27.6
resolution: "@babel/runtime@npm:7.27.6"
checksum: 10/cc957a12ba3781241b83d528eb69ddeb86ca5ac43179a825e83aa81263a6b3eb88c57bed8a937cdeacfc3192e07ec24c73acdfea4507d0c0428c8e23d6322bfe
@ -5122,6 +5122,261 @@ __metadata:
languageName: node
linkType: hard
"@changesets/apply-release-plan@npm:^7.0.12":
version: 7.0.12
resolution: "@changesets/apply-release-plan@npm:7.0.12"
dependencies:
"@changesets/config": "npm:^3.1.1"
"@changesets/get-version-range-type": "npm:^0.4.0"
"@changesets/git": "npm:^3.0.4"
"@changesets/should-skip-package": "npm:^0.1.2"
"@changesets/types": "npm:^6.1.0"
"@manypkg/get-packages": "npm:^1.1.3"
detect-indent: "npm:^6.0.0"
fs-extra: "npm:^7.0.1"
lodash.startcase: "npm:^4.4.0"
outdent: "npm:^0.5.0"
prettier: "npm:^2.7.1"
resolve-from: "npm:^5.0.0"
semver: "npm:^7.5.3"
checksum: 10/3ce05caa73b7b96a8a6be943507591925c44b22f209da001fb9d83df1d7a4569659e889373f5f7a208a121b3cf7bc17788969b8849bddaf13c27d6720e4e1c47
languageName: node
linkType: hard
"@changesets/assemble-release-plan@npm:^6.0.9":
version: 6.0.9
resolution: "@changesets/assemble-release-plan@npm:6.0.9"
dependencies:
"@changesets/errors": "npm:^0.2.0"
"@changesets/get-dependents-graph": "npm:^2.1.3"
"@changesets/should-skip-package": "npm:^0.1.2"
"@changesets/types": "npm:^6.1.0"
"@manypkg/get-packages": "npm:^1.1.3"
semver: "npm:^7.5.3"
checksum: 10/f84656eabb700ed77f97751b282e1701636ed45a44b443abd9af0291870495cc046fee301478010f39a1dc455799065ae007b9d7d2bb5ae8b793b65bbb8e052a
languageName: node
linkType: hard
"@changesets/changelog-git@npm:^0.2.1":
version: 0.2.1
resolution: "@changesets/changelog-git@npm:0.2.1"
dependencies:
"@changesets/types": "npm:^6.1.0"
checksum: 10/c22f3c0baf50c102a6890046351ee42f65ff6d58747ba4f75e5e40da1ed5fbcfd0dc2d11cdfb86acbb3262e58acb93f096c798827cac570c1e22e8f32f58a30f
languageName: node
linkType: hard
"@changesets/changelog-github@npm:^0.5.1":
version: 0.5.1
resolution: "@changesets/changelog-github@npm:0.5.1"
dependencies:
"@changesets/get-github-info": "npm:^0.6.0"
"@changesets/types": "npm:^6.1.0"
dotenv: "npm:^8.1.0"
checksum: 10/1284e7dc067652edfa14792196e6036849455d121afabe63e8d1a7dc0e8fb0310edb58d1130f2a5944819ae4011eeecc7e0c44c1cda43e6a581a3add187c3447
languageName: node
linkType: hard
"@changesets/cli@npm:^2.29.5":
version: 2.29.5
resolution: "@changesets/cli@npm:2.29.5"
dependencies:
"@changesets/apply-release-plan": "npm:^7.0.12"
"@changesets/assemble-release-plan": "npm:^6.0.9"
"@changesets/changelog-git": "npm:^0.2.1"
"@changesets/config": "npm:^3.1.1"
"@changesets/errors": "npm:^0.2.0"
"@changesets/get-dependents-graph": "npm:^2.1.3"
"@changesets/get-release-plan": "npm:^4.0.13"
"@changesets/git": "npm:^3.0.4"
"@changesets/logger": "npm:^0.1.1"
"@changesets/pre": "npm:^2.0.2"
"@changesets/read": "npm:^0.6.5"
"@changesets/should-skip-package": "npm:^0.1.2"
"@changesets/types": "npm:^6.1.0"
"@changesets/write": "npm:^0.4.0"
"@manypkg/get-packages": "npm:^1.1.3"
ansi-colors: "npm:^4.1.3"
ci-info: "npm:^3.7.0"
enquirer: "npm:^2.4.1"
external-editor: "npm:^3.1.0"
fs-extra: "npm:^7.0.1"
mri: "npm:^1.2.0"
p-limit: "npm:^2.2.0"
package-manager-detector: "npm:^0.2.0"
picocolors: "npm:^1.1.0"
resolve-from: "npm:^5.0.0"
semver: "npm:^7.5.3"
spawndamnit: "npm:^3.0.1"
term-size: "npm:^2.1.0"
bin:
changeset: bin.js
checksum: 10/f401da29025d7bcc07b732bb09a9627f785bfc21c7c2005861d11ffea732bc14d33394fc2fcae50cc5f2b710f6080c5babe2fa90d432de5fdb47ae6afc147936
languageName: node
linkType: hard
"@changesets/config@npm:^3.1.1":
version: 3.1.1
resolution: "@changesets/config@npm:3.1.1"
dependencies:
"@changesets/errors": "npm:^0.2.0"
"@changesets/get-dependents-graph": "npm:^2.1.3"
"@changesets/logger": "npm:^0.1.1"
"@changesets/types": "npm:^6.1.0"
"@manypkg/get-packages": "npm:^1.1.3"
fs-extra: "npm:^7.0.1"
micromatch: "npm:^4.0.8"
checksum: 10/9500e02b68801f052478b3e10523bd3a39b9e5e989e718832832537c9da965580f496262c2bc3f6e23a4e6fb4303f730a69dcbf2041f68d2fa7bd03dd1f82db0
languageName: node
linkType: hard
"@changesets/errors@npm:^0.2.0":
version: 0.2.0
resolution: "@changesets/errors@npm:0.2.0"
dependencies:
extendable-error: "npm:^0.1.5"
checksum: 10/4b79373f92287af4f723e8dbbccaf0299aa8735fc043243d0ad587f04a7614615ea50180be575d4438b9f00aa82d1cf85e902b77a55bdd3e0a8dd97e77b18c60
languageName: node
linkType: hard
"@changesets/get-dependents-graph@npm:^2.1.3":
version: 2.1.3
resolution: "@changesets/get-dependents-graph@npm:2.1.3"
dependencies:
"@changesets/types": "npm:^6.1.0"
"@manypkg/get-packages": "npm:^1.1.3"
picocolors: "npm:^1.1.0"
semver: "npm:^7.5.3"
checksum: 10/33f2bb5dc88443b68fd796fd3b019a553fb3e21cb957a8a117db2a6770ad81f7c156ebdc3b12cfa75169de918f11271a71f61034aec48a53bf1a936d6d783e3d
languageName: node
linkType: hard
"@changesets/get-github-info@npm:^0.6.0":
version: 0.6.0
resolution: "@changesets/get-github-info@npm:0.6.0"
dependencies:
dataloader: "npm:^1.4.0"
node-fetch: "npm:^2.5.0"
checksum: 10/4ba61eafb0a75fa7f741885b465d90559e63581e748527e060f90c37380a02f62810db3bc79a4e74d109754d7f72dc45249e1ac2be5fcaec6a7d0f99db1cee78
languageName: node
linkType: hard
"@changesets/get-release-plan@npm:^4.0.13":
version: 4.0.13
resolution: "@changesets/get-release-plan@npm:4.0.13"
dependencies:
"@changesets/assemble-release-plan": "npm:^6.0.9"
"@changesets/config": "npm:^3.1.1"
"@changesets/pre": "npm:^2.0.2"
"@changesets/read": "npm:^0.6.5"
"@changesets/types": "npm:^6.1.0"
"@manypkg/get-packages": "npm:^1.1.3"
checksum: 10/9983fae5a68012c4c418ddd62f2fb3d325363f21160252ff7b868503a1a2effb8fdd32e4a0289b72653afc3605ce19d163ff69205c942a0004efb571a5f78fd0
languageName: node
linkType: hard
"@changesets/get-version-range-type@npm:^0.4.0":
version: 0.4.0
resolution: "@changesets/get-version-range-type@npm:0.4.0"
checksum: 10/9868e99b31af652d3fa08fc33d55b9636f2feed1f4efdb318a6dbb4bb061281868de089b93041ce7f2775ab9cf454b92b1199767d0f4f228d8bbc483e61d2fd8
languageName: node
linkType: hard
"@changesets/git@npm:^3.0.4":
version: 3.0.4
resolution: "@changesets/git@npm:3.0.4"
dependencies:
"@changesets/errors": "npm:^0.2.0"
"@manypkg/get-packages": "npm:^1.1.3"
is-subdir: "npm:^1.1.1"
micromatch: "npm:^4.0.8"
spawndamnit: "npm:^3.0.1"
checksum: 10/4f5a1f3354ec39d530df78b198eaaf2a8ef6cca873dd18efb8706aae09cab04e0d985abd236288644fac5d10cc5cb6ba2538c3e0be023c4d80790ff841f39fa6
languageName: node
linkType: hard
"@changesets/logger@npm:^0.1.1":
version: 0.1.1
resolution: "@changesets/logger@npm:0.1.1"
dependencies:
picocolors: "npm:^1.1.0"
checksum: 10/bbfc050ddd0afdaa95bb790e81894b7548a2def059deeaed1685e22c10ede245ec2264df42bb2200cc0c8bd040e427bcd68a7afcca2633dc263a28e923d7c175
languageName: node
linkType: hard
"@changesets/parse@npm:^0.4.1":
version: 0.4.1
resolution: "@changesets/parse@npm:0.4.1"
dependencies:
"@changesets/types": "npm:^6.1.0"
js-yaml: "npm:^3.13.1"
checksum: 10/2973ab8f38592a80efea589e148e5bdfd6ed3af86aa9206f941b5b3955f68464bf70a5965349f642667c708ebae60e4266be538328cd27075cace3f7cc1022e3
languageName: node
linkType: hard
"@changesets/pre@npm:^2.0.2":
version: 2.0.2
resolution: "@changesets/pre@npm:2.0.2"
dependencies:
"@changesets/errors": "npm:^0.2.0"
"@changesets/types": "npm:^6.1.0"
"@manypkg/get-packages": "npm:^1.1.3"
fs-extra: "npm:^7.0.1"
checksum: 10/daaedd2747492ced61f107d38f90e535607bcb073b10ffac3d9e3bcad1a4cc082370884224fc6785af2d92d37f6b0a3bf853f9759b8fda294878d00d24344415
languageName: node
linkType: hard
"@changesets/read@npm:^0.6.5":
version: 0.6.5
resolution: "@changesets/read@npm:0.6.5"
dependencies:
"@changesets/git": "npm:^3.0.4"
"@changesets/logger": "npm:^0.1.1"
"@changesets/parse": "npm:^0.4.1"
"@changesets/types": "npm:^6.1.0"
fs-extra: "npm:^7.0.1"
p-filter: "npm:^2.1.0"
picocolors: "npm:^1.1.0"
checksum: 10/fec0ac28801e0560fae0eb1d21250dd2a48aaff67bddd1b446a960afd761690d5873dca6eff369d43763bec61f1023d38a38876d5824e316e6de622dc52a24f3
languageName: node
linkType: hard
"@changesets/should-skip-package@npm:^0.1.2":
version: 0.1.2
resolution: "@changesets/should-skip-package@npm:0.1.2"
dependencies:
"@changesets/types": "npm:^6.1.0"
"@manypkg/get-packages": "npm:^1.1.3"
checksum: 10/d09fcf1200ee201f0dd5b8049d90e8b5e0cfd34cc94f5c661c4cdab182a8263628733f9bc5886550a92f6f7857339d79fc77f12ffd53559b029a2bf9a2fa7ace
languageName: node
linkType: hard
"@changesets/types@npm:^4.0.1":
version: 4.1.0
resolution: "@changesets/types@npm:4.1.0"
checksum: 10/4d7c65a447400ac474b2dc2d79bc1a5341c305fbce4a648ef59d9939bc1bbbbd6852684c417a9a4ef0226468b9cb522b9ac2b5393f21fa5f20f1b12bee94eab5
languageName: node
linkType: hard
"@changesets/types@npm:^6.1.0":
version: 6.1.0
resolution: "@changesets/types@npm:6.1.0"
checksum: 10/2dcd00712cb85d0c53afdd8d0e856b4bf9c0ce8dc36c838c918d44799aacd9ba8659b9ff610ff92b94fc03c8fd2b52c5b05418fcf8a1bd138cd9182414ede373
languageName: node
linkType: hard
"@changesets/write@npm:^0.4.0":
version: 0.4.0
resolution: "@changesets/write@npm:0.4.0"
dependencies:
"@changesets/types": "npm:^6.1.0"
fs-extra: "npm:^7.0.1"
human-id: "npm:^4.1.1"
prettier: "npm:^2.7.1"
checksum: 10/bcea8431a09e282bdf66adbd8411d5d3cc19b4a2df519a42586c912b23a7b3ef18d1d0765e2d1a27ff175e2dfc9ef4c2df95cfa920dd4dd2972aaaf662afc6b9
languageName: node
linkType: hard
"@cnakazawa/watch@npm:^1.0.3":
version: 1.0.4
resolution: "@cnakazawa/watch@npm:1.0.4"
@ -7543,6 +7798,32 @@ __metadata:
languageName: node
linkType: hard
"@manypkg/find-root@npm:^1.1.0":
version: 1.1.0
resolution: "@manypkg/find-root@npm:1.1.0"
dependencies:
"@babel/runtime": "npm:^7.5.5"
"@types/node": "npm:^12.7.1"
find-up: "npm:^4.1.0"
fs-extra: "npm:^8.1.0"
checksum: 10/31e7dde82612a0e37ebb07876d76b1bf2aedc5b285b5e50d94cdf63edbf1fa3970349b84a5837a3c687e5b643e9a4f4588ae1f4b4ae9d412516d57bf977a08db
languageName: node
linkType: hard
"@manypkg/get-packages@npm:^1.1.3":
version: 1.1.3
resolution: "@manypkg/get-packages@npm:1.1.3"
dependencies:
"@babel/runtime": "npm:^7.5.5"
"@changesets/types": "npm:^4.0.1"
"@manypkg/find-root": "npm:^1.1.0"
fs-extra: "npm:^8.1.0"
globby: "npm:^11.0.0"
read-yaml-file: "npm:^1.1.0"
checksum: 10/4912e002199ff3974ec48586376a04c5f1815a4faa5f4d36b0698838eec143c9d4e3d42c41e0de009f48a1e2251802ed63c1311ab44de225b50102f85919a248
languageName: node
linkType: hard
"@mischnic/json-sourcemap@npm:^0.1.0":
version: 0.1.1
resolution: "@mischnic/json-sourcemap@npm:0.1.1"
@ -11942,6 +12223,13 @@ __metadata:
languageName: node
linkType: hard
"@types/node@npm:^12.7.1":
version: 12.20.55
resolution: "@types/node@npm:12.20.55"
checksum: 10/1f916a06fff02faadb09a16ed6e31820ce170798b202ef0b14fc244bfbd721938c54a3a99836e185e4414ca461fe96c5bb5c67c3d248f153555b7e6347f061dd
languageName: node
linkType: hard
"@types/prop-types@npm:*":
version: 15.7.12
resolution: "@types/prop-types@npm:15.7.12"
@ -12277,6 +12565,8 @@ __metadata:
resolution: "@uppy-dev/build@workspace:."
dependencies:
"@biomejs/biome": "npm:2.0.5"
"@changesets/changelog-github": "npm:^0.5.1"
"@changesets/cli": "npm:^2.29.5"
npm-run-all: "npm:^4.1.5"
start-server-and-test: "npm:^1.14.0"
turbo: "npm:^2.5.4"
@ -12294,15 +12584,6 @@ __metadata:
languageName: unknown
linkType: soft
"@uppy-dev/release@workspace:private/release":
version: 0.0.0-use.local
resolution: "@uppy-dev/release@workspace:private/release"
dependencies:
globby: "npm:^13.0.0"
prompts: "npm:^2.4.2"
languageName: unknown
linkType: soft
"@uppy/angular@workspace:*, @uppy/angular@workspace:packages/@uppy/angular/projects/uppy/angular":
version: 0.0.0-use.local
resolution: "@uppy/angular@workspace:packages/@uppy/angular/projects/uppy/angular"
@ -15063,6 +15344,15 @@ __metadata:
languageName: node
linkType: hard
"better-path-resolve@npm:1.0.0":
version: 1.0.0
resolution: "better-path-resolve@npm:1.0.0"
dependencies:
is-windows: "npm:^1.0.0"
checksum: 10/5392dbe04e7fe68b944eb37961d9dfa147aaac3ee9ee3f6e13d42e2c9fbe949e68d16e896c14ee9016fa5f8e6e53ec7fd8b5f01b50a32067a7d94ac9cfb9a050
languageName: node
linkType: hard
"big-integer@npm:1.6.x":
version: 1.6.52
resolution: "big-integer@npm:1.6.52"
@ -15829,7 +16119,7 @@ __metadata:
languageName: node
linkType: hard
"ci-info@npm:^3.2.0, ci-info@npm:^3.3.0":
"ci-info@npm:^3.2.0, ci-info@npm:^3.3.0, ci-info@npm:^3.7.0":
version: 3.9.0
resolution: "ci-info@npm:3.9.0"
checksum: 10/75bc67902b4d1c7b435497adeb91598f6d52a3389398e44294f6601b20cfef32cf2176f7be0eb961d9e085bb333a8a5cae121cb22f81cf238ae7f58eb80e9397
@ -16680,7 +16970,7 @@ __metadata:
languageName: node
linkType: hard
"cross-spawn@npm:^7.0.6":
"cross-spawn@npm:^7.0.5, cross-spawn@npm:^7.0.6":
version: 7.0.6
resolution: "cross-spawn@npm:7.0.6"
dependencies:
@ -17093,6 +17383,13 @@ __metadata:
languageName: node
linkType: hard
"dataloader@npm:^1.4.0":
version: 1.4.0
resolution: "dataloader@npm:1.4.0"
checksum: 10/8dc2181f7fc243f657aa97b5aa51b9e0da88dee9a59a689bab50d4bac826c27ae0457db8d9a5d59559d636f6b997f419303ccfde595cc26191f37ab9c792fe01
languageName: node
linkType: hard
"date-format@npm:^4.0.14":
version: 4.0.14
resolution: "date-format@npm:4.0.14"
@ -17473,6 +17770,13 @@ __metadata:
languageName: node
linkType: hard
"detect-indent@npm:^6.0.0":
version: 6.1.0
resolution: "detect-indent@npm:6.1.0"
checksum: 10/ab953a73c72dbd4e8fc68e4ed4bfd92c97eb6c43734af3900add963fd3a9316f3bc0578b018b24198d4c31a358571eff5f0656e81a1f3b9ad5c547d58b2d093d
languageName: node
linkType: hard
"detect-libc@npm:^1.0.3":
version: 1.0.3
resolution: "detect-libc@npm:1.0.3"
@ -17712,6 +18016,13 @@ __metadata:
languageName: node
linkType: hard
"dotenv@npm:^8.1.0":
version: 8.6.0
resolution: "dotenv@npm:8.6.0"
checksum: 10/31d7b5c010cebb80046ba6853d703f9573369b00b15129536494f04b0af4ea0060ce8646e3af58b455af2f6f1237879dd261a5831656410ec92561ae1ea44508
languageName: node
linkType: hard
"dotenv@npm:~16.4.5":
version: 16.4.7
resolution: "dotenv@npm:16.4.7"
@ -17954,7 +18265,7 @@ __metadata:
languageName: node
linkType: hard
"enquirer@npm:^2.3.6":
"enquirer@npm:^2.3.6, enquirer@npm:^2.4.1":
version: 2.4.1
resolution: "enquirer@npm:2.4.1"
dependencies:
@ -19996,6 +20307,13 @@ __metadata:
languageName: node
linkType: hard
"extendable-error@npm:^0.1.5":
version: 0.1.7
resolution: "extendable-error@npm:0.1.7"
checksum: 10/80478be7429a1675d2085f701239796bab3230ed6f2fb1b138fbabec24bea6516b7c5ceb6e9c209efcc9c089948d93715703845653535f8e8a49655066a9255e
languageName: node
linkType: hard
"external-editor@npm:^3.1.0":
version: 3.1.0
resolution: "external-editor@npm:3.1.0"
@ -20693,6 +21011,17 @@ __metadata:
languageName: node
linkType: hard
"fs-extra@npm:^7.0.1":
version: 7.0.1
resolution: "fs-extra@npm:7.0.1"
dependencies:
graceful-fs: "npm:^4.1.2"
jsonfile: "npm:^4.0.0"
universalify: "npm:^0.1.0"
checksum: 10/3fc6e56ba2f07c00d452163f27f21a7076b72ef7da8a50fef004336d59ef4c34deda11d10ecd73fd8fbcf20e4f575f52857293090b3c9f8741d4e0598be30fea
languageName: node
linkType: hard
"fs-extra@npm:^8.1.0":
version: 8.1.0
resolution: "fs-extra@npm:8.1.0"
@ -21098,7 +21427,7 @@ __metadata:
languageName: node
linkType: hard
"globby@npm:^11.1.0":
"globby@npm:^11.0.0, globby@npm:^11.1.0":
version: 11.1.0
resolution: "globby@npm:11.1.0"
dependencies:
@ -21112,7 +21441,7 @@ __metadata:
languageName: node
linkType: hard
"globby@npm:^13.0.0, globby@npm:^13.1.1":
"globby@npm:^13.1.1":
version: 13.2.2
resolution: "globby@npm:13.2.2"
dependencies:
@ -21178,7 +21507,7 @@ __metadata:
languageName: node
linkType: hard
"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.3, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9":
"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.3, graceful-fs@npm:^4.1.5, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9":
version: 4.2.11
resolution: "graceful-fs@npm:4.2.11"
checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2
@ -21744,6 +22073,15 @@ __metadata:
languageName: node
linkType: hard
"human-id@npm:^4.1.1":
version: 4.1.1
resolution: "human-id@npm:4.1.1"
bin:
human-id: dist/cli.js
checksum: 10/84fef1edd470fc155a34161107beed8baf77bafd20bf515c3fadfbce3690ecc9aa0bacf3fcf4cf9add3c274772ead3ef64aa6531374538ffebe8129fccfb0015
languageName: node
linkType: hard
"human-signals@npm:^1.1.1":
version: 1.1.1
resolution: "human-signals@npm:1.1.1"
@ -22635,6 +22973,15 @@ __metadata:
languageName: node
linkType: hard
"is-subdir@npm:^1.1.1":
version: 1.2.0
resolution: "is-subdir@npm:1.2.0"
dependencies:
better-path-resolve: "npm:1.0.0"
checksum: 10/31029a383972bff4cc4f1bd1463fd04dde017e0a04ae3a6f6e08124a90c6c4656312d593101b0f38805fa3f3c8f6bc4583524bbf72c50784fa5ca0d3e5a76279
languageName: node
linkType: hard
"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3":
version: 1.0.4
resolution: "is-symbol@npm:1.0.4"
@ -22707,7 +23054,7 @@ __metadata:
languageName: node
linkType: hard
"is-windows@npm:^1.0.2":
"is-windows@npm:^1.0.0, is-windows@npm:^1.0.2":
version: 1.0.2
resolution: "is-windows@npm:1.0.2"
checksum: 10/438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7
@ -23540,7 +23887,7 @@ __metadata:
languageName: node
linkType: hard
"js-yaml@npm:^3.13.1":
"js-yaml@npm:^3.13.1, js-yaml@npm:^3.6.1":
version: 3.14.1
resolution: "js-yaml@npm:3.14.1"
dependencies:
@ -25010,6 +25357,13 @@ __metadata:
languageName: node
linkType: hard
"lodash.startcase@npm:^4.4.0":
version: 4.4.0
resolution: "lodash.startcase@npm:4.4.0"
checksum: 10/3091048a54a2f92bcf2c6441d2bd9a706fb133d5f461ae7c310d6dca1530338a06c91e9e42a5b14b12e875ddae1814d448050dc02afe2cec09b3995d8e836837
languageName: node
linkType: hard
"lodash.template@npm:^4.5.0":
version: 4.5.0
resolution: "lodash.template@npm:4.5.0"
@ -26695,7 +27049,7 @@ __metadata:
languageName: node
linkType: hard
"node-fetch@npm:^2.2.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.12":
"node-fetch@npm:^2.2.0, node-fetch@npm:^2.5.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.12":
version: 2.7.0
resolution: "node-fetch@npm:2.7.0"
dependencies:
@ -27630,6 +27984,13 @@ __metadata:
languageName: node
linkType: hard
"outdent@npm:^0.5.0":
version: 0.5.0
resolution: "outdent@npm:0.5.0"
checksum: 10/7d94a7d93883afa32c99d84f33248b221f4eeeedbb571921fe0e5cf0bee32e64746c587e9606d98ec22762870c782d21dd4bc3a0edf442d347cb54aa107b198d
languageName: node
linkType: hard
"p-cancelable@npm:^3.0.0":
version: 3.0.0
resolution: "p-cancelable@npm:3.0.0"
@ -27637,6 +27998,15 @@ __metadata:
languageName: node
linkType: hard
"p-filter@npm:^2.1.0":
version: 2.1.0
resolution: "p-filter@npm:2.1.0"
dependencies:
p-map: "npm:^2.0.0"
checksum: 10/76e552ca624ce2233448d68b19eec9de42b695208121998f7e011edce71d1079a83096ee6a2078fb2a59cfa8a5c999f046edf00ebf16a8e780022010b4693234
languageName: node
linkType: hard
"p-finally@npm:^1.0.0":
version: 1.0.0
resolution: "p-finally@npm:1.0.0"
@ -27707,6 +28077,13 @@ __metadata:
languageName: node
linkType: hard
"p-map@npm:^2.0.0":
version: 2.1.0
resolution: "p-map@npm:2.1.0"
checksum: 10/9e3ad3c9f6d75a5b5661bcad78c91f3a63849189737cd75e4f1225bf9ac205194e5c44aac2ef6f09562b1facdb9bd1425584d7ac375bfaa17b3f1a142dab936d
languageName: node
linkType: hard
"p-map@npm:^4.0.0":
version: 4.0.0
resolution: "p-map@npm:4.0.0"
@ -27775,6 +28152,15 @@ __metadata:
languageName: node
linkType: hard
"package-manager-detector@npm:^0.2.0":
version: 0.2.11
resolution: "package-manager-detector@npm:0.2.11"
dependencies:
quansync: "npm:^0.2.7"
checksum: 10/2c1a8da0e5895f0be06a8e1f4b4336fb78a19167ca3932dbaeca7260f948e67cf53b32585a13f8108341e7a468b38b4f2a8afc7b11691cb2d856ecd759d570fb
languageName: node
linkType: hard
"pacote@npm:18.0.6":
version: 18.0.6
resolution: "pacote@npm:18.0.6"
@ -28919,6 +29305,15 @@ __metadata:
languageName: node
linkType: hard
"prettier@npm:^2.7.1":
version: 2.8.8
resolution: "prettier@npm:2.8.8"
bin:
prettier: bin-prettier.js
checksum: 10/00cdb6ab0281f98306cd1847425c24cbaaa48a5ff03633945ab4c701901b8e96ad558eb0777364ffc312f437af9b5a07d0f45346266e8245beaf6247b9c62b24
languageName: node
linkType: hard
"pretty-bytes@npm:^5.6.0":
version: 5.6.0
resolution: "pretty-bytes@npm:5.6.0"
@ -29262,6 +29657,13 @@ __metadata:
languageName: node
linkType: hard
"quansync@npm:^0.2.7":
version: 0.2.10
resolution: "quansync@npm:0.2.10"
checksum: 10/b54d955de867e104025f2666d52b2b67befe4e0f184a96acc9adcbdc572e46dce49c69d1e79f99413beae8a974a576383806a05f85f9a826865dc589ee1bcaf2
languageName: node
linkType: hard
"querystringify@npm:^2.1.1":
version: 2.2.0
resolution: "querystringify@npm:2.2.0"
@ -29645,6 +30047,18 @@ __metadata:
languageName: node
linkType: hard
"read-yaml-file@npm:^1.1.0":
version: 1.1.0
resolution: "read-yaml-file@npm:1.1.0"
dependencies:
graceful-fs: "npm:^4.1.5"
js-yaml: "npm:^3.6.1"
pify: "npm:^4.0.1"
strip-bom: "npm:^3.0.0"
checksum: 10/41ee5f075507ef0403328dd54e225a61c3149f915675ce7fd0fd791ddcce2e6c30a9fe0f76ffa7a465c1c157b9b4ad8ded1dcf47dc3b396103eeb013490bbc2e
languageName: node
linkType: hard
"readable-stream@npm:1.1.x":
version: 1.1.14
resolution: "readable-stream@npm:1.1.14"
@ -31760,6 +32174,16 @@ __metadata:
languageName: node
linkType: hard
"spawndamnit@npm:^3.0.1":
version: 3.0.1
resolution: "spawndamnit@npm:3.0.1"
dependencies:
cross-spawn: "npm:^7.0.5"
signal-exit: "npm:^4.0.1"
checksum: 10/47d88a7f1e5691e13e435eddc3d34123c2f7746e2853e91bfac5ea7c6e3bb4b1d1995223b25f7a8745871510d92f63ecd3c9fa02aa2896ac0c79fb618eb08bbe
languageName: node
linkType: hard
"spdx-correct@npm:^3.0.0":
version: 3.2.0
resolution: "spdx-correct@npm:3.2.0"
@ -32638,7 +33062,7 @@ __metadata:
languageName: node
linkType: hard
"term-size@npm:^2.2.1":
"term-size@npm:^2.1.0, term-size@npm:^2.2.1":
version: 2.2.1
resolution: "term-size@npm:2.2.1"
checksum: 10/f96aca2d4139c91e3359f5949ffb86f0a58f8c254ab7fe4a64b65126974939c782db6aaa91bf51a56d0344e505e22f9a0186f2f689e23ac9382b54606603c537