@alexaegis/workspace-tools
Version:
Tools for working with javascript workspaces
1 lines • 13.3 kB
Source Map (JSON)
{"version":3,"file":"sort-DbdqyQxk.cjs","names":[],"sources":["../src/sort/default-package-json-order.const.ts","../src/sort/normalize-sorting-preference-for-package-json.function.ts","../src/sort/normalize-json-sorting-preference.function.ts"],"sourcesContent":["import type { ObjectKeyOrder } from '@alexaegis/common';\n\nexport const DEFAULT_PACKAGE_JSON_SORTING_PREFERENCE: ObjectKeyOrder = [\n\t'name',\n\t'description',\n\t'version',\n\t'license',\n\t'private',\n\t{\n\t\tkey: 'archetype',\n\t\torder: ['platform', 'framework', 'language', 'kind', 'bundler', 'testing'],\n\t},\n\t'keywords',\n\t'author',\n\t'homepage',\n\t{\n\t\tkey: 'repository',\n\t\torder: ['url', 'type', 'directory'],\n\t},\n\t'bugs',\n\t'type',\n\t'config',\n\t{\n\t\tkey: 'publishConfig',\n\t\torder: [\n\t\t\t'access',\n\t\t\t{ key: 'exports', order: [{ key: '.*', order: ['types', '.*', 'default'] }] },\n\t\t\t'.*',\n\t\t],\n\t},\n\t'.*',\n\t'engines',\n\t'packageManager',\n\t'workspaces',\n\t{ key: 'scripts', order: ['^build.*', '^lint.*', '^test.*'] },\n\t{ key: 'exports', order: [{ key: '.*', order: ['types', '.*', 'default'] }] },\n\t'bin',\n\t'dependencies',\n\t'peerDependencies',\n\t'optionalDependencies',\n\t'devDependencies',\n];\n","import type { ObjectKeyOrder } from '@alexaegis/common';\n\n/**\n * The types field in the exports object has to be the first one. This\n * sortingPreference normalizer ensures that.\n *\n * It's also recommended to have the 'default' key be the last. This is also\n * ensured here.\n *\n * @returns a sortingPreference that will always be suited for packageJson files\n */\nconst normalizeExportsOrder = (\n\tsortingPrefrence: string | { key: string; order: ObjectKeyOrder },\n\ttargetKey: string,\n): string | { key: string; order: ObjectKeyOrder } => {\n\tif (typeof sortingPrefrence === 'string' && sortingPrefrence === targetKey) {\n\t\treturn {\n\t\t\tkey: targetKey,\n\t\t\torder: [{ key: '.*', order: ['types', '.*', 'default'] }],\n\t\t};\n\t} else if (typeof sortingPrefrence === 'object' && sortingPrefrence.key === targetKey) {\n\t\treturn normalizeExportsDetailedEntry(sortingPrefrence, targetKey);\n\t}\n\treturn sortingPrefrence;\n};\n\nconst normalizeExportsDetailedEntry = (\n\tentry: { key: string; order: ObjectKeyOrder },\n\ttargetKey: string,\n): { key: string; order: ObjectKeyOrder } => {\n\tconst order = entry.order.map((ordering) => {\n\t\tif (typeof ordering === 'string') {\n\t\t\treturn { key: ordering, order: ['types', '.*', 'default'] as ObjectKeyOrder };\n\t\t} else {\n\t\t\tconst typesEntry = ordering.order.find((o) =>\n\t\t\t\ttypeof o === 'string' ? o === 'types' : o.key === 'types',\n\t\t\t);\n\t\t\tconst defaultEntry = ordering.order.find((o) =>\n\t\t\t\ttypeof o === 'string' ? o === 'default' : o.key === 'default',\n\t\t\t);\n\n\t\t\tconst hasSpread = ordering.order.some((o) =>\n\t\t\t\ttypeof o === 'string' ? o === '.*' : o.key === '.*',\n\t\t\t);\n\t\t\tconst nonSpecialEntries = ordering.order.filter((o) =>\n\t\t\t\ttypeof o === 'string'\n\t\t\t\t\t? o !== 'types' && o !== 'default'\n\t\t\t\t\t: o.key !== 'types' && o.key !== 'default',\n\t\t\t);\n\n\t\t\tif (!hasSpread) {\n\t\t\t\tnonSpecialEntries.push('.*');\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkey: ordering.key,\n\t\t\t\torder: [typesEntry ?? 'types', ...nonSpecialEntries, defaultEntry ?? 'default'],\n\t\t\t};\n\t\t}\n\t});\n\n\tif (!order.some((o) => typeof o === 'object' && o.key === '.*')) {\n\t\torder.push({ key: '.*', order: ['types', '.*', 'default'] as ObjectKeyOrder });\n\t}\n\n\treturn { key: targetKey, order: order as ObjectKeyOrder };\n};\n\nconst normalizePublishConfigOrder = (\n\tsortingPrefrence: string | { key: string; order: ObjectKeyOrder },\n): string | { key: string; order: ObjectKeyOrder } => {\n\tif (typeof sortingPrefrence === 'string' && sortingPrefrence === 'publishConfig') {\n\t\treturn {\n\t\t\tkey: 'publishConfig',\n\t\t\torder: [\n\t\t\t\t'access',\n\t\t\t\t{ key: 'exports', order: [{ key: '.*', order: ['types', '.*', 'default'] }] },\n\t\t\t\t'.*',\n\t\t\t],\n\t\t};\n\t} else if (typeof sortingPrefrence === 'object' && sortingPrefrence.key === 'publishConfig') {\n\t\treturn {\n\t\t\tkey: 'publishConfig',\n\t\t\torder: sortingPrefrence.order.map((inner) => normalizeExportsOrder(inner, 'exports')),\n\t\t};\n\t}\n\treturn sortingPrefrence;\n};\n\nexport const normalizeSortingPreferenceForPackageJson = (\n\tsortingPreferences: ObjectKeyOrder,\n): ObjectKeyOrder => {\n\treturn sortingPreferences.some(\n\t\t(sortingPrefrence) =>\n\t\t\t(typeof sortingPrefrence === 'string' && sortingPrefrence === 'exports') ||\n\t\t\t(typeof sortingPrefrence === 'object' && sortingPrefrence.key === 'exports'),\n\t)\n\t\t? sortingPreferences.map((sortingPrefrence) => {\n\t\t\t\tconst normalized = normalizePublishConfigOrder(sortingPrefrence);\n\t\t\t\tif (normalized !== sortingPrefrence) return normalized;\n\n\t\t\t\tif (typeof sortingPrefrence === 'string' && sortingPrefrence === 'exports') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkey: 'exports',\n\t\t\t\t\t\torder: [{ key: '.*', order: ['types', '.*', 'default'] }],\n\t\t\t\t\t};\n\t\t\t\t} else if (\n\t\t\t\t\ttypeof sortingPrefrence === 'object' &&\n\t\t\t\t\tsortingPrefrence.key === 'exports'\n\t\t\t\t) {\n\t\t\t\t\tconst order = sortingPrefrence.order.map((ordering) => {\n\t\t\t\t\t\tif (typeof ordering === 'string') {\n\t\t\t\t\t\t\treturn { key: ordering, order: ['types', '.*', 'default'] };\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// These special entries may be defined by the user as an object so let's keep it\n\t\t\t\t\t\t\tconst typesEntry = ordering.order.find((o) =>\n\t\t\t\t\t\t\t\ttypeof o === 'string' ? o === 'types' : o.key === 'types',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst defaultEntry = ordering.order.find((o) =>\n\t\t\t\t\t\t\t\ttypeof o === 'string' ? o === 'default' : o.key === 'default',\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tconst hasSpread = ordering.order.some((o) =>\n\t\t\t\t\t\t\t\ttypeof o === 'string' ? o === '.*' : o.key === '.*',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst nonSpecialEntries = ordering.order.filter((o) =>\n\t\t\t\t\t\t\t\ttypeof o === 'string'\n\t\t\t\t\t\t\t\t\t? o !== 'types' && o !== 'default'\n\t\t\t\t\t\t\t\t\t: o.key !== 'types' && o.key !== 'default',\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (!hasSpread) {\n\t\t\t\t\t\t\t\tnonSpecialEntries.push('.*');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tkey: ordering.key,\n\t\t\t\t\t\t\t\torder: [\n\t\t\t\t\t\t\t\t\ttypesEntry ?? 'types',\n\t\t\t\t\t\t\t\t\t...nonSpecialEntries,\n\t\t\t\t\t\t\t\t\tdefaultEntry ?? 'default',\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!order.some((o) => o.key === '.*')) {\n\t\t\t\t\t\torder.push({ key: '.*', order: ['types', '.*', 'default'] });\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkey: 'exports',\n\t\t\t\t\t\torder,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\treturn sortingPrefrence;\n\t\t\t\t}\n\t\t\t})\n\t\t: [\n\t\t\t\t...sortingPreferences.map((p) => normalizePublishConfigOrder(p)),\n\t\t\t\t{\n\t\t\t\t\tkey: 'exports',\n\t\t\t\t\torder: [{ key: '.*', order: ['types', '.*', 'default'] }],\n\t\t\t\t},\n\t\t\t];\n};\n","import type { ObjectKeyOrder } from '@alexaegis/common';\nimport { normalizeCwdOption, readJson, type CwdOption } from '@alexaegis/fs';\nimport { join } from 'node:path';\n\nimport { getWorkspaceRoot } from '../npm/get-workspace-root.function.js';\nimport { PACKAGE_JSON_NAME } from '../package-json/package-json.interface.js';\nimport { DEFAULT_PACKAGE_JSON_SORTING_PREFERENCE } from './default-package-json-order.const.js';\nimport { normalizeSortingPreferenceForPackageJson } from './normalize-sorting-preference-for-package-json.function.js';\n\nexport interface SortingPreferenceJson {\n\tschema?: string;\n\tsort: ObjectKeyOrder;\n}\n\n/**\n * Creates a function that can receive an optional objectKeyOrder and return it.\n * It will also try to load a file from .config/${filename}.sort.json\n * and treat it as the sorting preference if no custom preference is passed.\n * That's why this function is async, but the normalizer itself is not.\n *\n * If the fileName passed is package.json it will also perform some adjustments\n * to any order received to make sure the exports object will be valid.\n *\n * For package.json's only, when there's no keyorder is passed and there's no\n * .config/package.sort.json is present, an opinionated order is returned\n * specifically for package.json files.\n *\n */\nexport const createJsonSortingPreferenceNormalizer = async (\n\tfileName: string,\n\trawOptions?: CwdOption,\n) => {\n\tconst options = normalizeCwdOption(rawOptions);\n\tconst workspaceRoot = getWorkspaceRoot(options);\n\n\tlet workspaceSortPreference: SortingPreferenceJson | undefined;\n\tif (workspaceRoot) {\n\t\tworkspaceSortPreference = await readJson<SortingPreferenceJson>(\n\t\t\tjoin(workspaceRoot, '.config', fileName.replace(/\\.json$/, '.sort.json')),\n\t\t);\n\t}\n\n\treturn (sortingPreference?: ObjectKeyOrder): ObjectKeyOrder => {\n\t\tlet sortingOrder: ObjectKeyOrder | undefined =\n\t\t\tsortingPreference ?? workspaceSortPreference?.sort;\n\n\t\tif (fileName === PACKAGE_JSON_NAME) {\n\t\t\tif (sortingPreference) {\n\t\t\t\tsortingOrder = normalizeSortingPreferenceForPackageJson(sortingPreference);\n\t\t\t} else if (workspaceSortPreference?.sort) {\n\t\t\t\tsortingOrder = normalizeSortingPreferenceForPackageJson(\n\t\t\t\t\tworkspaceSortPreference.sort,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tsortingOrder = normalizeSortingPreferenceForPackageJson(\n\t\t\t\t\tDEFAULT_PACKAGE_JSON_SORTING_PREFERENCE,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn sortingOrder ?? [];\n\t};\n};\n"],"mappings":"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"}