diff --git a/.changeset/slow-meteors-wait.md b/.changeset/slow-meteors-wait.md new file mode 100644 index 0000000..398d2d7 --- /dev/null +++ b/.changeset/slow-meteors-wait.md @@ -0,0 +1,5 @@ +--- +'@fingerprintjs/changesets-native-dependency-format': minor +--- + +Initial release diff --git a/.github/workflows/release-dx-packages.yml b/.github/workflows/release-dx-packages.yml index 3dbba6e..abdc389 100644 --- a/.github/workflows/release-dx-packages.yml +++ b/.github/workflows/release-dx-packages.yml @@ -54,3 +54,4 @@ jobs: title: 'Release packages [changeset]' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/packages/changesets-native-dependency-format/package.json b/packages/changesets-native-dependency-format/package.json new file mode 100644 index 0000000..96021a5 --- /dev/null +++ b/packages/changesets-native-dependency-format/package.json @@ -0,0 +1,27 @@ +{ + "name": "@fingerprintjs/changesets-native-dependency-format", + "description": "Changeset format that appends native dependencies note to the last changeset", + "version": "0.0.0", + "repository": { + "type": "git", + "url": "https://github.com/fingerprintjs/dx-team-toolkit" + }, + "author": "FingerprintJS, Inc (https://fingerprint.com)", + "license": "MIT", + "publishConfig": { + "access": "public", + "provenance": true + }, + "main": "dist/index.js", + "files": [ + "dist/index.js" + ], + "scripts": { + "build": "tsup src/index.ts --sourcemap" + }, + "dependencies": { + "@changesets/get-release-plan": "^4.0.16", + "@changesets/types": "^6.0.0", + "@fingerprintjs/changesets-changelog-format": "workspace:^" + } +} diff --git a/packages/changesets-native-dependency-format/src/index.ts b/packages/changesets-native-dependency-format/src/index.ts new file mode 100644 index 0000000..b7b6faf --- /dev/null +++ b/packages/changesets-native-dependency-format/src/index.ts @@ -0,0 +1,60 @@ +import type { ChangelogFunctions, GetDependencyReleaseLine, GetReleaseLine } from '@changesets/types' +import fpFormat from '@fingerprintjs/changesets-changelog-format' +import { generateNativeDepsNote } from './native-dependency/note' +import { getLastChangeset } from './native-dependency/changeset' + +export type Options = { + packageName?: string + androidPath?: string + iosPodspecPath?: string + repo?: string +} + +const getReleaseLine: GetReleaseLine = async (changeset, type, opts: Options | null) => { + if (!opts?.packageName) { + throw new Error('Missing `opts.packageName`') + } + + if (!opts?.androidPath) { + throw new Error('Missing `opts.androidPath`') + } + + if (!opts?.iosPodspecPath) { + throw new Error('Missing `opts.iosPodspecPath`') + } + + if (!opts?.repo) { + throw new Error('Missing `opts.repo`') + } + + const lastChangeset = await getLastChangeset(opts?.packageName) + const isLastChangeset = lastChangeset === changeset.id + + let line = await fpFormat.getReleaseLine(changeset, type, { repo: opts.repo }) + + if (isLastChangeset) { + try { + const nativeDepsNote = await generateNativeDepsNote(opts.androidPath, opts.iosPodspecPath) + line += `\n\n ${nativeDepsNote}` + } catch (e) { + console.error('Failed to generate native dependencies note', e) + } + } + + return line +} + +const getDependencyReleaseLine: GetDependencyReleaseLine = async (changesets, dependenciesUpdated, opts: Options) => { + if (!opts?.repo) { + throw new Error('Missing `opts.repo`') + } + + return fpFormat.getDependencyReleaseLine(changesets, dependenciesUpdated, { repo: opts.repo }) +} + +const defaultChangelogFunctions: ChangelogFunctions = { + getReleaseLine, + getDependencyReleaseLine, +} + +export default defaultChangelogFunctions diff --git a/packages/changesets-native-dependency-format/src/native-dependency/android.ts b/packages/changesets-native-dependency-format/src/native-dependency/android.ts new file mode 100644 index 0000000..e47efa4 --- /dev/null +++ b/packages/changesets-native-dependency-format/src/native-dependency/android.ts @@ -0,0 +1,65 @@ +import { humanizeMavenStyleVersionRange } from './utils' +import { join } from 'node:path' +import { getCommand } from './gradle' +import { spawn } from 'node:child_process' + +export interface AndroidPlatformConfiguration { + path: string + gradleTaskName: string + displayName: string | undefined +} + +async function runGradleTask(androidPath: string, androidGradleTaskName: string): Promise { + const androidFullPath = join(process.cwd(), androidPath) + const command = await getCommand(androidFullPath) + + return new Promise((resolve, reject) => { + const child = spawn(command, [androidGradleTaskName, '-q', '--console=plain'], { + cwd: androidFullPath, + detached: true, + stdio: ['inherit', 'pipe', 'pipe'], + }) + if (child.stdout === null) { + reject(new Error('Unexpected error: stdout of subprocess is null')) + return + } + if (child.stderr === null) { + reject(new Error('Unexpected error: stderr of subprocess is null')) + return + } + + let androidVersion: string | null = null + child.stdout.on('data', (line: Buffer) => { + if (!line || line.toString().trim() === '') { + return + } + + androidVersion = line.toString().trim() + }) + child.stderr.on('data', (line: Buffer) => { + console.error(line.toString().trim()) + }) + child.on('close', (code: number) => { + if (code !== 0) { + reject(new Error(`Unexpected error: Gradle failed with status code ${code}`)) + return + } + + if (androidVersion === null) { + reject(new Error(`Could not read output of \`${androidGradleTaskName}\` gradle task.`)) + return + } + + resolve(androidVersion) + }) + child.on('error', (err) => { + console.error(err) + reject(err) + }) + }) +} + +export async function resolveAndroidDependency({ path, gradleTaskName }: AndroidPlatformConfiguration) { + const androidVersion = await runGradleTask(path, gradleTaskName) + return humanizeMavenStyleVersionRange(androidVersion) +} diff --git a/packages/changesets-native-dependency-format/src/native-dependency/changeset.ts b/packages/changesets-native-dependency-format/src/native-dependency/changeset.ts new file mode 100644 index 0000000..e8d7d90 --- /dev/null +++ b/packages/changesets-native-dependency-format/src/native-dependency/changeset.ts @@ -0,0 +1,38 @@ +import getReleasePlan from '@changesets/get-release-plan' + +export function getChangesetStatus() { + return getReleasePlan(process.cwd()) +} + +// Order in which change types appear as last in the changelog +// We use it to find the changeset that appears last in the changelog and append native deps note to it, so that it always appears last +const changeTypesOrder = ['patch', 'minor', 'major'] + +export async function getPendingChangesets(packageName: string) { + const changesetStatus = await getChangesetStatus() + + const changesets = changesetStatus.releases.find((release) => release.name === packageName)?.changesets ?? [] + + return changesets.map((changesetName) => { + const changeset = changesetStatus.changesets.find((c) => c.id === changesetName) + + return { + id: changesetName, + type: changeset?.releases?.find((r) => r.name === packageName)?.type, + } + }) +} + +export function getLastChangeset(packageName: string) { + return getPendingChangesets(packageName).then((changesets) => { + for (const type of changeTypesOrder) { + const changeset = changesets.find((c) => c.type === type) + + if (changeset) { + return changeset.id + } + } + + return undefined + }) +} diff --git a/packages/changesets-native-dependency-format/src/native-dependency/gradle.ts b/packages/changesets-native-dependency-format/src/native-dependency/gradle.ts new file mode 100644 index 0000000..5d88009 --- /dev/null +++ b/packages/changesets-native-dependency-format/src/native-dependency/gradle.ts @@ -0,0 +1,53 @@ +import { join } from 'node:path' +import { access, constants } from 'node:fs' +import { exec } from 'node:child_process' +import { isNotFoundErrorCode } from './utils' + +/** + * Check if gradle is installed to system-wide. + * @return A promise that resolves with `true` if gradle is found, + * `false` if gradle is not found, + * and rejects with an error if there is an issue checking for Gradle. + */ +export function isGradleAvailable(): Promise { + return new Promise((resolve, reject) => { + exec('gradle --version', (err) => { + if (err) { + if (isNotFoundErrorCode(err.code)) { + resolve(false) + return + } + reject(err) + return + } + + resolve(true) + }) + }) +} + +/** + * @param {string} cwd the path of current working directory + * @return A promise that resolves name of command to trigger Gradle + */ +export function getCommand(cwd: string): Promise { + return new Promise((resolve, reject) => { + const gradleWrapper = join(cwd, 'gradlew') + access(gradleWrapper, constants.F_OK, async (err) => { + if (err) { + if (err.code === 'ENOENT') { + if (await isGradleAvailable()) { + resolve('gradle') + return + } + + reject(new Error('Gradle or Gradle wrapper not found.')) + } else { + reject(err) + } + } else { + resolve(gradleWrapper) + } + }) + }) +} diff --git a/packages/changesets-native-dependency-format/src/native-dependency/ios.ts b/packages/changesets-native-dependency-format/src/native-dependency/ios.ts new file mode 100644 index 0000000..fe5a56f --- /dev/null +++ b/packages/changesets-native-dependency-format/src/native-dependency/ios.ts @@ -0,0 +1,61 @@ +import { join } from 'node:path' +import { readFileSync } from 'node:fs' +import { isPodAvailable, podIpcSpec, type PodspecJson } from './pods' + +export interface IOSPlatformConfiguration { + podSpecPath: string + dependencyName: string + displayName: string | undefined +} + +export async function resolveIOSDependency({ podSpecPath, dependencyName }: IOSPlatformConfiguration) { + let podspecContents: PodspecJson | undefined + + try { + podspecContents = readPodspecJson(podSpecPath) + } catch (e) { + const podspecDSLPath = join(podSpecPath) + podspecContents = await readPodspecDSL(podspecDSLPath) + } + + if (!podspecContents.dependencies || !podspecContents.dependencies[dependencyName]) { + throw new Error(`${podSpecPath} file does not contain '${dependencyName}' in dependencies.`) + } + + return podspecContents.dependencies[dependencyName].join(' and ') +} + +async function readPodspecDSL(podspecFilePath: string): Promise { + if (!(await isPodAvailable())) { + throw new Error(`Pods not found in your system.`) + } + + return podIpcSpec(podspecFilePath) +} + +function readPodspecJson(podspecFilePath: string): PodspecJson { + const resolvedPodspecPath = join(process.cwd(), podspecFilePath) + + let fileContent: string + try { + fileContent = readFileSync(resolvedPodspecPath, 'utf8') + } catch (error: any) { + switch (error.code) { + case 'ENOENT': + throw new Error(`${podspecFilePath} file does not exist.`) + case 'EACCES': + throw new Error(`${podspecFilePath} file cannot be accessed.`) + default: + throw new Error(`${podspecFilePath} file cannot be read. Error: ${error.message}`) + } + } + + let data: PodspecJson + try { + data = JSON.parse(fileContent) as PodspecJson + } catch (error) { + throw new Error('Failed to parse podspec JSON. Please check the podspec file format.') + } + + return data +} diff --git a/packages/changesets-native-dependency-format/src/native-dependency/note.ts b/packages/changesets-native-dependency-format/src/native-dependency/note.ts new file mode 100644 index 0000000..478fec1 --- /dev/null +++ b/packages/changesets-native-dependency-format/src/native-dependency/note.ts @@ -0,0 +1,40 @@ +import { resolveIOSDependency } from './ios' +import { resolveAndroidDependency } from './android' + +export type NativePlatformDefinition = { displayName: string; versionRange: string } + +function formatter(platforms: NativePlatformDefinition[]) { + let result = `### Supported Native SDK Version Range\n\n` + + result += platforms + .map(({ displayName, versionRange }) => { + return `* ${displayName} Version Range: **\`${versionRange}\`**` + }) + .join('\n') + + return result +} + +export async function generateNativeDepsNote(androidPath: string, iosPodspecPath: string) { + const platformVersions: NativePlatformDefinition[] = [ + { + displayName: 'Fingerprint iOS SDK', + versionRange: await resolveIOSDependency({ + displayName: 'Fingerprint iOS SDK', + dependencyName: 'FingerprintPro', + podSpecPath: iosPodspecPath, + }), + }, + + { + displayName: 'Fingerprint Android SDK', + versionRange: await resolveAndroidDependency({ + path: androidPath, + displayName: 'Fingerprint Android SDK', + gradleTaskName: 'printFingerprintNativeSDKVersion', + }), + }, + ] + + return formatter(platformVersions) +} diff --git a/packages/changesets-native-dependency-format/src/native-dependency/pods.ts b/packages/changesets-native-dependency-format/src/native-dependency/pods.ts new file mode 100644 index 0000000..190d740 --- /dev/null +++ b/packages/changesets-native-dependency-format/src/native-dependency/pods.ts @@ -0,0 +1,55 @@ +import { exec } from 'node:child_process' +import { isNotFoundErrorCode } from './utils' + +/** + * Checks whether CocoaPods are installed and available on the system by executing the `pod --version` command. + * Resolves to `true` if CocoaPods are available, resolves to `false` if CocoaPods are not installed, + * and rejects with an error if another issue occurs. + * + * @return {Promise} A promise that resolves to `true` if CocoaPods are installed `false` otherwise. + */ +export function isPodAvailable(): Promise { + return new Promise((resolve, reject) => { + exec('pod --version', (err) => { + if (err) { + if (isNotFoundErrorCode(err.code)) { + resolve(false) + return + } + reject(err) + return + } + + resolve(true) + }) + }) +} + +/** + * Executes the `pod ipc spec` command on the given podspec file and returns the parsed result as an object. + * + * @param {string} podspecFile - The path to the `.podspec` file to be processed. + * @return {Promise} A promise that resolves to the parsed PodspecJson object or rejects with an error if the command fails. + */ +export function podIpcSpec(podspecFile: string): Promise { + return new Promise((resolve, reject) => { + exec(`pod ipc spec ${podspecFile}`, (err, stdout) => { + if (err) { + reject(err) + return + } + + try { + resolve(JSON.parse(stdout) as PodspecJson) + } catch { + reject(new Error('Failed to parse podspec file')) + } + }) + }) +} + +export type PodspecJson = { + dependencies: { + [key: string]: [string] + } +} diff --git a/packages/changesets-native-dependency-format/src/native-dependency/utils.ts b/packages/changesets-native-dependency-format/src/native-dependency/utils.ts new file mode 100644 index 0000000..cbb1511 --- /dev/null +++ b/packages/changesets-native-dependency-format/src/native-dependency/utils.ts @@ -0,0 +1,15 @@ +export function humanizeMavenStyleVersionRange(versionRange: string) { + return versionRange + .trim() + .replace(/\s*\[\s*(.*?)\s*,\s*(.*?)\s*]\s*/g, '>= $1 and <= $2') + .replace(/\s*\(\s*(.*?)\s*,\s*(.*?)\s*]\s*/g, '> $1 and <= $2') + .replace(/\s*\[\s*(.*?)\s*,\s*(.*?)\s*\)\s*/g, '>= $1 and < $2') + .replace(/\s*\(\s*(.*?)\s*,\s*(.*?)\s*\)\s*/g, '> $1 and < $2') + .replace(/\s*\[\s*(.*?)\s*]/g, '>=$1') + .replace(/\s*\(\s*(.*?)\s*\)/g, '>$1') +} + +export function isNotFoundErrorCode(code?: number) { + // 127 means command not found (https://tldp.org/LDP/abs/html/exitcodes.html) + return code === 127 +} diff --git a/packages/changesets-native-dependency-format/tsconfig.json b/packages/changesets-native-dependency-format/tsconfig.json new file mode 100644 index 0000000..9348e06 --- /dev/null +++ b/packages/changesets-native-dependency-format/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist" + }, + "files": ["src/index.ts"], + "exclude": ["dist", "node_modules", "**/*.test.ts"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d9bb507..15a0e19 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -109,6 +109,18 @@ importers: specifier: ^6.0.0 version: 6.0.0 + packages/changesets-native-dependency-format: + dependencies: + '@changesets/get-release-plan': + specifier: ^4.0.16 + version: 4.0.16 + '@changesets/types': + specifier: ^6.0.0 + version: 6.0.0 + '@fingerprintjs/changesets-changelog-format': + specifier: workspace:^ + version: link:../changesets-changelog-format + packages/commit-lint-dx-team: dependencies: '@commitlint/config-conventional': @@ -352,6 +364,9 @@ packages: '@changesets/assemble-release-plan@6.0.0': resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} + '@changesets/assemble-release-plan@6.0.10': + resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==} + '@changesets/changelog-git@0.2.0': resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} @@ -362,15 +377,24 @@ packages: '@changesets/config@3.0.0': resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} + '@changesets/config@3.1.4': + resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==} + '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} '@changesets/get-dependents-graph@2.0.0': resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} + '@changesets/get-dependents-graph@2.1.4': + resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==} + '@changesets/get-release-plan@4.0.0': resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} + '@changesets/get-release-plan@4.0.16': + resolution: {integrity: sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==} + '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} @@ -380,6 +404,9 @@ packages: '@changesets/git@3.0.1': resolution: {integrity: sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==} + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + '@changesets/logger@0.1.0': resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} @@ -389,18 +416,33 @@ packages: '@changesets/parse@0.4.0': resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + '@changesets/parse@0.4.3': + resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} + '@changesets/pre@2.0.0': resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + '@changesets/read@0.6.1': resolution: {integrity: sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==} + '@changesets/read@0.6.7': + resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} '@changesets/types@6.0.0': resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + '@changesets/write@0.3.0': resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} @@ -1306,6 +1348,10 @@ packages: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + breakword@1.0.6: resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} @@ -1792,6 +1838,10 @@ packages: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -2320,6 +2370,10 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} + hasBin: true + jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -2494,6 +2548,10 @@ packages: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -2948,6 +3006,9 @@ packages: spawndamnit@2.0.0: resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -3646,6 +3707,15 @@ snapshots: '@manypkg/get-packages': 1.1.3 semver: 7.6.3 + '@changesets/assemble-release-plan@6.0.10': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.8.4 + '@changesets/changelog-git@0.2.0': dependencies: '@changesets/types': 6.0.0 @@ -3695,6 +3765,17 @@ snapshots: fs-extra: 7.0.1 micromatch: 4.0.5 + '@changesets/config@3.1.4': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/logger': 0.1.1 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + '@changesets/errors@0.2.0': dependencies: extendable-error: 0.1.7 @@ -3707,6 +3788,13 @@ snapshots: fs-extra: 7.0.1 semver: 7.6.3 + '@changesets/get-dependents-graph@2.1.4': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.0 + semver: 7.8.4 + '@changesets/get-release-plan@4.0.0': dependencies: '@babel/runtime': 7.24.0 @@ -3717,6 +3805,15 @@ snapshots: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 + '@changesets/get-release-plan@4.0.16': + dependencies: + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/config': 3.1.4 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + '@changesets/get-version-range-type@0.4.0': {} '@changesets/git@3.0.0': @@ -3737,6 +3834,14 @@ snapshots: micromatch: 4.0.5 spawndamnit: 2.0.0 + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + '@changesets/logger@0.1.0': dependencies: chalk: 2.4.2 @@ -3747,9 +3852,14 @@ snapshots: '@changesets/parse@0.4.0': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 js-yaml: 3.14.1 + '@changesets/parse@0.4.3': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 4.3.0 + '@changesets/pre@2.0.0': dependencies: '@babel/runtime': 7.24.0 @@ -3758,6 +3868,13 @@ snapshots: '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + '@changesets/read@0.6.1': dependencies: '@changesets/git': 3.0.1 @@ -3768,10 +3885,27 @@ snapshots: p-filter: 2.1.0 picocolors: 1.1.0 + '@changesets/read@0.6.7': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.3 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.0 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + '@changesets/types@4.1.0': {} '@changesets/types@6.0.0': {} + '@changesets/types@6.1.0': {} + '@changesets/write@0.3.0': dependencies: '@babel/runtime': 7.24.0 @@ -4788,6 +4922,10 @@ snapshots: dependencies: fill-range: 7.0.1 + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + breakword@1.0.6: dependencies: wcwidth: 1.0.1 @@ -5329,6 +5467,10 @@ snapshots: dependencies: to-regex-range: 5.0.1 + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -5678,7 +5820,7 @@ snapshots: '@babel/parser': 7.24.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.3 + semver: 7.8.4 transitivePeerDependencies: - supports-color @@ -5970,7 +6112,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.6.3 + semver: 7.8.4 transitivePeerDependencies: - supports-color @@ -6035,6 +6177,10 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.3.0: + dependencies: + argparse: 2.0.1 + jsesc@2.5.2: {} json-buffer@3.0.1: {} @@ -6144,7 +6290,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.3 + semver: 7.8.4 make-error@1.3.6: {} @@ -6193,6 +6339,11 @@ snapshots: braces: 3.0.2 picomatch: 2.3.1 + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + mimic-fn@2.1.0: {} min-indent@1.0.1: {} @@ -6252,7 +6403,7 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 - semver: 7.6.3 + semver: 7.8.4 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -6623,6 +6774,11 @@ snapshots: cross-spawn: 5.1.0 signal-exit: 3.0.7 + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1