From eb492983e9b70f2ff5f02e3189833df60c03c076 Mon Sep 17 00:00:00 2001 From: chouchouji <70570907+chouchouji@users.noreply.github.com> Date: Mon, 13 Jan 2025 19:25:19 +0800 Subject: [PATCH] feat: sort pre/post scripts with colon together (#330) * feat: sort pre/post scripts with colon together * test: add test case --- index.js | 21 ++++++++++++++++++--- tests/scripts.js | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index d5da5e4..10a5ff3 100755 --- a/index.js +++ b/index.js @@ -248,9 +248,24 @@ const sortScripts = onObject((scripts, packageJson) => { keys.sort() } - const order = keys.flatMap((key) => - prefixable.has(key) ? [`pre${key}`, key, `post${key}`] : [key], - ) + const scriptsKeyMap = new Map() + + keys + .flatMap((key) => + prefixable.has(key) ? [`pre${key}`, key, `post${key}`] : [key], + ) + .forEach((key) => { + const [prefix] = key.split(':') + const keySet = scriptsKeyMap.has(prefix) + ? scriptsKeyMap.get(prefix) + : new Set() + scriptsKeyMap.set(prefix, keySet.add(key)) + }) + + const order = [...scriptsKeyMap.values()].flat().reduce((keys, keySet) => { + keys.push(...keySet) + return keys + }, []) return sortObjectKeys(scripts, order) }) diff --git a/tests/scripts.js b/tests/scripts.js index 8a417c6..9f71086 100644 --- a/tests/scripts.js +++ b/tests/scripts.js @@ -85,3 +85,46 @@ for (const field of ['scripts', 'betterScripts']) { }, }) } + +for (const field of ['scripts', 'betterScripts']) { + test(`${field} sort pre/post scripts with colon together`, macro.sortObject, { + value: { + [field]: { + prebuild: 'run-s prebuild:*', + build: 'run-s build:*', + postbuild: 'run-s prebuild:*', + 'build:bar': 'node bar.js', + 'build:baz': 'node baz.js', + 'build:foo': 'node foo.js', + 'd-unrelated': '..', + 'e-unrelated': '..', + 'f-unrelated': '..', + 'postbuild:1': 'node prebuild.js 1', + 'postbuild:2': 'node prebuild.js 2', + 'postbuild:3': 'node prebuild.js 3', + 'prebuild:1': 'node prebuild.js 1', + 'prebuild:2': 'node prebuild.js 2', + 'prebuild:3': 'node prebuild.js 3', + }, + }, + expect: { + [field]: { + prebuild: 'run-s prebuild:*', + 'prebuild:1': 'node prebuild.js 1', + 'prebuild:2': 'node prebuild.js 2', + 'prebuild:3': 'node prebuild.js 3', + build: 'run-s build:*', + 'build:bar': 'node bar.js', + 'build:baz': 'node baz.js', + 'build:foo': 'node foo.js', + postbuild: 'run-s prebuild:*', + 'postbuild:1': 'node prebuild.js 1', + 'postbuild:2': 'node prebuild.js 2', + 'postbuild:3': 'node prebuild.js 3', + 'd-unrelated': '..', + 'e-unrelated': '..', + 'f-unrelated': '..', + }, + }, + }) +}