diff --git a/.changeset/metal-pianos-camp.md b/.changeset/metal-pianos-camp.md new file mode 100644 index 00000000..a845151c --- /dev/null +++ b/.changeset/metal-pianos-camp.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/packages/align-deps/test/__mocks__/fs.js b/packages/align-deps/test/__mocks__/fs.js index 72c7bde3..c88c3cd2 100644 --- a/packages/align-deps/test/__mocks__/fs.js +++ b/packages/align-deps/test/__mocks__/fs.js @@ -13,6 +13,7 @@ fs.__setMockFileWriter = (writer) => { fs.lstatSync = (...args) => actualFs.lstatSync(...args); fs.readFileSync = (...args) => data || actualFs.readFileSync(...args); +fs.readlinkSync = (...args) => actualFs.readlinkSync(...args); fs.statSync = actualFs.statSync; // used by cosmiconfig fs.writeFileSync = undefined; diff --git a/scripts/align-deps-preset.js b/scripts/align-deps-preset.js index 38bd6f54..ebd3307f 100644 --- a/scripts/align-deps-preset.js +++ b/scripts/align-deps-preset.js @@ -6,6 +6,44 @@ const dependencies = { yargs: "^16.0.0", }; +/** + * Returns available profiles. + * + * Note: We get available profiles from disk instead of importing + * `@rnx-kit/align-deps` to avoid circular dependency. + * + * @returns {string[]} + */ +function getAvailableProfiles() { + const profiles = []; + + const fs = require("node:fs"); + const path = require("node:path"); + + const prefix = "profile-"; + const presetDir = path.resolve( + __dirname, + "..", + "packages", + "align-deps", + "src", + "presets", + "microsoft", + "react-native" + ); + const files = fs.readdirSync(presetDir); + for (const filename of files) { + if (!filename.startsWith(prefix)) { + continue; + } + + const version = path.basename(filename, ".ts").substring(prefix.length); + profiles.push(version); + } + + return profiles; +} + function makeTypesEntries() { return Object.entries(dependencies).reduce((types, [name, version]) => { const pkgName = `@types/${name}`; @@ -58,10 +96,7 @@ const profile = { }, }; -const { presets } = require("@rnx-kit/align-deps"); -const profileNames = Object.keys(presets["microsoft/react-native"]); - -module.exports = profileNames.reduce((preset, key) => { +module.exports = getAvailableProfiles().reduce((preset, key) => { preset[key] = profile; return preset; }, {});