UNPKG

@alexaegis/workspace-tools

Version:

Tools for working with javascript workspaces

287 lines (286 loc) 7.98 kB
const require_get_workspace_root_function = require("./get-workspace-root.function-BKR-FeN5.cjs"); let node_path = require("node:path"); let _alexaegis_fs = require("@alexaegis/fs"); //#region src/sort/default-package-json-order.const.ts var DEFAULT_PACKAGE_JSON_SORTING_PREFERENCE = [ "name", "description", "version", "license", "private", { key: "archetype", order: [ "platform", "framework", "language", "kind", "bundler", "testing" ] }, "keywords", "author", "homepage", { key: "repository", order: [ "url", "type", "directory" ] }, "bugs", "type", "config", { key: "publishConfig", order: [ "access", { key: "exports", order: [{ key: ".*", order: [ "types", ".*", "default" ] }] }, ".*" ] }, ".*", "engines", "packageManager", "workspaces", { key: "scripts", order: [ "^build.*", "^lint.*", "^test.*" ] }, { key: "exports", order: [{ key: ".*", order: [ "types", ".*", "default" ] }] }, "bin", "dependencies", "peerDependencies", "optionalDependencies", "devDependencies" ]; //#endregion //#region src/sort/normalize-sorting-preference-for-package-json.function.ts /** * The types field in the exports object has to be the first one. This * sortingPreference normalizer ensures that. * * It's also recommended to have the 'default' key be the last. This is also * ensured here. * * @returns a sortingPreference that will always be suited for packageJson files */ var normalizeExportsOrder = (sortingPrefrence, targetKey) => { if (typeof sortingPrefrence === "string" && sortingPrefrence === targetKey) return { key: targetKey, order: [{ key: ".*", order: [ "types", ".*", "default" ] }] }; else if (typeof sortingPrefrence === "object" && sortingPrefrence.key === targetKey) return normalizeExportsDetailedEntry(sortingPrefrence, targetKey); return sortingPrefrence; }; var normalizeExportsDetailedEntry = (entry, targetKey) => { const order = entry.order.map((ordering) => { if (typeof ordering === "string") return { key: ordering, order: [ "types", ".*", "default" ] }; else { const typesEntry = ordering.order.find((o) => typeof o === "string" ? o === "types" : o.key === "types"); const defaultEntry = ordering.order.find((o) => typeof o === "string" ? o === "default" : o.key === "default"); const hasSpread = ordering.order.some((o) => typeof o === "string" ? o === ".*" : o.key === ".*"); const nonSpecialEntries = ordering.order.filter((o) => typeof o === "string" ? o !== "types" && o !== "default" : o.key !== "types" && o.key !== "default"); if (!hasSpread) nonSpecialEntries.push(".*"); return { key: ordering.key, order: [ typesEntry ?? "types", ...nonSpecialEntries, defaultEntry ?? "default" ] }; } }); if (!order.some((o) => typeof o === "object" && o.key === ".*")) order.push({ key: ".*", order: [ "types", ".*", "default" ] }); return { key: targetKey, order }; }; var normalizePublishConfigOrder = (sortingPrefrence) => { if (typeof sortingPrefrence === "string" && sortingPrefrence === "publishConfig") return { key: "publishConfig", order: [ "access", { key: "exports", order: [{ key: ".*", order: [ "types", ".*", "default" ] }] }, ".*" ] }; else if (typeof sortingPrefrence === "object" && sortingPrefrence.key === "publishConfig") return { key: "publishConfig", order: sortingPrefrence.order.map((inner) => normalizeExportsOrder(inner, "exports")) }; return sortingPrefrence; }; var normalizeSortingPreferenceForPackageJson = (sortingPreferences) => { return sortingPreferences.some((sortingPrefrence) => typeof sortingPrefrence === "string" && sortingPrefrence === "exports" || typeof sortingPrefrence === "object" && sortingPrefrence.key === "exports") ? sortingPreferences.map((sortingPrefrence) => { const normalized = normalizePublishConfigOrder(sortingPrefrence); if (normalized !== sortingPrefrence) return normalized; if (typeof sortingPrefrence === "string" && sortingPrefrence === "exports") return { key: "exports", order: [{ key: ".*", order: [ "types", ".*", "default" ] }] }; else if (typeof sortingPrefrence === "object" && sortingPrefrence.key === "exports") { const order = sortingPrefrence.order.map((ordering) => { if (typeof ordering === "string") return { key: ordering, order: [ "types", ".*", "default" ] }; else { const typesEntry = ordering.order.find((o) => typeof o === "string" ? o === "types" : o.key === "types"); const defaultEntry = ordering.order.find((o) => typeof o === "string" ? o === "default" : o.key === "default"); const hasSpread = ordering.order.some((o) => typeof o === "string" ? o === ".*" : o.key === ".*"); const nonSpecialEntries = ordering.order.filter((o) => typeof o === "string" ? o !== "types" && o !== "default" : o.key !== "types" && o.key !== "default"); if (!hasSpread) nonSpecialEntries.push(".*"); return { key: ordering.key, order: [ typesEntry ?? "types", ...nonSpecialEntries, defaultEntry ?? "default" ] }; } }); if (!order.some((o) => o.key === ".*")) order.push({ key: ".*", order: [ "types", ".*", "default" ] }); return { key: "exports", order }; } else return sortingPrefrence; }) : [...sortingPreferences.map((p) => normalizePublishConfigOrder(p)), { key: "exports", order: [{ key: ".*", order: [ "types", ".*", "default" ] }] }]; }; //#endregion //#region src/sort/normalize-json-sorting-preference.function.ts /** * Creates a function that can receive an optional objectKeyOrder and return it. * It will also try to load a file from .config/${filename}.sort.json * and treat it as the sorting preference if no custom preference is passed. * That's why this function is async, but the normalizer itself is not. * * If the fileName passed is package.json it will also perform some adjustments * to any order received to make sure the exports object will be valid. * * For package.json's only, when there's no keyorder is passed and there's no * .config/package.sort.json is present, an opinionated order is returned * specifically for package.json files. * */ var createJsonSortingPreferenceNormalizer = async (fileName, rawOptions) => { const workspaceRoot = require_get_workspace_root_function.getWorkspaceRoot((0, _alexaegis_fs.normalizeCwdOption)(rawOptions)); let workspaceSortPreference; if (workspaceRoot) workspaceSortPreference = await (0, _alexaegis_fs.readJson)((0, node_path.join)(workspaceRoot, ".config", fileName.replace(/\.json$/, ".sort.json"))); return (sortingPreference) => { let sortingOrder = sortingPreference ?? workspaceSortPreference?.sort; if (fileName === "package.json") if (sortingPreference) sortingOrder = normalizeSortingPreferenceForPackageJson(sortingPreference); else if (workspaceSortPreference?.sort) sortingOrder = normalizeSortingPreferenceForPackageJson(workspaceSortPreference.sort); else sortingOrder = normalizeSortingPreferenceForPackageJson(DEFAULT_PACKAGE_JSON_SORTING_PREFERENCE); return sortingOrder ?? []; }; }; //#endregion Object.defineProperty(exports, "DEFAULT_PACKAGE_JSON_SORTING_PREFERENCE", { enumerable: true, get: function() { return DEFAULT_PACKAGE_JSON_SORTING_PREFERENCE; } }); Object.defineProperty(exports, "createJsonSortingPreferenceNormalizer", { enumerable: true, get: function() { return createJsonSortingPreferenceNormalizer; } }); Object.defineProperty(exports, "normalizeSortingPreferenceForPackageJson", { enumerable: true, get: function() { return normalizeSortingPreferenceForPackageJson; } }); //# sourceMappingURL=sort-DbdqyQxk.cjs.map