diff --git a/.changeset/tidy-friends-build.md b/.changeset/tidy-friends-build.md new file mode 100644 index 000000000..a845151cc --- /dev/null +++ b/.changeset/tidy-friends-build.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/packages/align-deps/src/types.ts b/packages/align-deps/src/types.ts index 45948e085..029e78711 100644 --- a/packages/align-deps/src/types.ts +++ b/packages/align-deps/src/types.ts @@ -27,11 +27,11 @@ export type DiffMode = "strict" | "allow-subset"; export type Options = { presets: string[]; - loose: boolean; - migrateConfig: boolean; - noUnmanaged: boolean; - verbose: boolean; - write: boolean; + loose?: boolean; + migrateConfig?: boolean; + noUnmanaged?: boolean; + verbose?: boolean; + write?: boolean; diffMode?: DiffMode; excludePackages?: string[]; requirements?: string[]; @@ -41,13 +41,13 @@ export type Args = Pick & { "diff-mode"?: string; "exclude-packages"?: string | number; "export-catalogs"?: string; - "migrate-config": boolean; - "no-unmanaged": boolean; + "migrate-config"?: boolean; + "no-unmanaged"?: boolean; "set-version"?: string | number; init?: string; packages?: (string | number)[]; - presets?: string | number; - requirements?: string | number; + presets?: string | number | string[]; + requirements?: string | number | string[]; }; export type DependencyType = "direct" | "development" | "peer"; diff --git a/scripts/align-deps-preset.cjs b/scripts/align-deps-preset.cjs index 23f66f3c7..0fcef1455 100644 --- a/scripts/align-deps-preset.cjs +++ b/scripts/align-deps-preset.cjs @@ -45,40 +45,49 @@ function getAvailableProfiles() { } function makeTypesEntries() { - return Object.entries(dependencies).reduce((types, [name, version]) => { + /** @type {Record} */ + const types = {}; + for (const [name, version] of Object.entries(dependencies)) { const pkgName = `@types/${name}`; types[pkgName] = { name: pkgName, version, devOnly: true }; - return types; - }, {}); + } + return types; } -const profile = { - ...makeTypesEntries(), - esbuild: { - name: "esbuild", - version: "^0.27.1", - devOnly: true, - }, - "find-up": { - name: "find-up", - version: "^5.0.0", - }, - "oxc-resolver": { - name: "oxc-resolver", - version: "^11.0.0", - devOnly: true, - }, - semver: { - name: "semver", - version: "^7.0.0", - }, - yargs: { - name: "yargs", - version: dependencies.yargs, - }, -}; +function makePreset() { + const profile = { + ...makeTypesEntries(), + esbuild: { + name: "esbuild", + version: "^0.27.1", + devOnly: true, + }, + "find-up": { + name: "find-up", + version: "^5.0.0", + }, + "oxc-resolver": { + name: "oxc-resolver", + version: "^11.0.0", + devOnly: true, + }, + semver: { + name: "semver", + version: "^7.0.0", + }, + yargs: { + name: "yargs", + version: dependencies.yargs, + }, + }; + + /** @type {Record} */ + const preset = {}; + for (const key of getAvailableProfiles()) { + preset[key] = profile; + } -module.exports = getAvailableProfiles().reduce((preset, key) => { - preset[key] = profile; return preset; -}, {}); +} + +module.exports = makePreset(); diff --git a/scripts/dependencies.config.js b/scripts/dependencies.config.js index b7ac2b2af..af4b2ef6f 100644 --- a/scripts/dependencies.config.js +++ b/scripts/dependencies.config.js @@ -3,6 +3,14 @@ import * as fs from "node:fs"; import * as path from "node:path"; +/** + * @typedef {{ + * scripts?: Record; + * dependencies?: Record; + * jest?: unknown; + * }} Manifest; + */ + /** * @returns {true} */ @@ -10,6 +18,17 @@ function always() { return true; } +/** + * @template {object} T + * @template {keyof T} K + * @param {T} obj + * @param {K} property + * @returns {obj is T & Pick, K>} + */ +function hasOwn(obj, property) { + return Object.hasOwn(obj, property); +} + /** * @param {string} filename * @returns {(cwd: string) => boolean} @@ -20,25 +39,24 @@ function lookForFile(filename) { /** * @param {string} cwd - * @param {Record} manifest + * @param {Manifest} manifest * @returns {boolean} */ function needsJest(cwd, manifest) { return ( - Object.hasOwn(manifest, "jest") || - fs.existsSync(path.join(cwd, "jest.config.js")) + hasOwn(manifest, "jest") || fs.existsSync(path.join(cwd, "jest.config.js")) ); } /** * @param {string} _cwd - * @param {Record>} manifest + * @param {Manifest} manifest * @returns {boolean} */ function needsLint(_cwd, manifest) { return ( - Object.hasOwn(manifest, "scripts") && - Object.hasOwn(manifest["scripts"], "lint") && + hasOwn(manifest, "scripts") && + hasOwn(manifest["scripts"], "lint") && manifest["scripts"]["lint"].includes("rnx-kit-scripts lint") ); } @@ -54,7 +72,11 @@ const COMMON_DEPENDENCIES = /** @type {const} */ ([ ["typescript", needsTypeScript], ]); +/** + * @param {{ cwd: string; manifest: Manifest; }} + */ export default function ({ cwd, manifest }) { + /** @type {Pick, "dependencies"> | undefined} */ let extensions = undefined; for (const [pkg, test] of COMMON_DEPENDENCIES) { diff --git a/scripts/rnx-align-deps.js b/scripts/rnx-align-deps.js index 199fdd567..684842795 100755 --- a/scripts/rnx-align-deps.js +++ b/scripts/rnx-align-deps.js @@ -1,7 +1,7 @@ #!/usr/bin/env node import { URL, fileURLToPath } from "node:url"; -// Directly import align-deps to avoid circular dependency +// @ts-ignore Directly import align-deps to avoid circular dependency import { cli } from "../packages/align-deps/lib/index.js"; cli({ diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json index d44d6e5dc..41b5875b5 100644 --- a/scripts/tsconfig.json +++ b/scripts/tsconfig.json @@ -3,5 +3,5 @@ "compilerOptions": { "noEmit": true }, - "include": ["src", "*.ts"] + "include": ["*.cjs", "*.js", "*.ts", "src"] }