first commit

This commit is contained in:
2021-02-08 11:43:23 +08:00
parent 7871282709
commit 4d5ad8d9bc
15 changed files with 1757 additions and 0 deletions
+105
View File
@@ -0,0 +1,105 @@
import {
IComparatorFunction,
ISorterFunction,
IStyleAPI,
IStyleItem,
} from "import-sort-style";
import { IImport } from "import-sort-parser";
export default function (styleApi: IStyleAPI): IStyleItem[] {
const {
and,
always,
dotSegmentCount,
isAbsoluteModule,
isNodeModule,
isRelativeModule,
name,
startsWithAlphanumeric,
unicode,
} = styleApi;
// comparator function which place non-alphanumeric first
const natural: IComparatorFunction = (a: string, b: string) => {
if (a === b) {
return 0;
}
const sa = startsWithAlphanumeric(a),
sb = startsWithAlphanumeric(b);
if (sa === sb) {
return unicode(a, b);
} else {
return sa ? 1 : -1;
}
};
// sort: use member primarily, if member is not avaliable, use module name
const memberOrModule: (c: IComparatorFunction) => ISorterFunction = (
comparator: IComparatorFunction
) => {
return (a: IImport, b: IImport): number => {
const aHasDefaultMember = Boolean(a.defaultMember),
aHasNamespaceMember = Boolean(a.namespaceMember),
aHasNamedMember = Boolean(a.namedMembers[0]?.name),
aHasOnlyDefaultMember =
aHasDefaultMember && !aHasNamespaceMember && !aHasNamedMember,
aHasOnlyNamespaceMember =
aHasNamespaceMember && !aHasDefaultMember && !aHasNamedMember;
const bHasDefaultMember = Boolean(b.defaultMember),
bHasNamespaceMember = Boolean(b.namespaceMember),
bHasNamedMember = Boolean(b.namedMembers[0]?.name),
bHasOnlyDefaultMember =
bHasDefaultMember && !bHasNamespaceMember && !bHasNamedMember,
bHasOnlyNamespaceMember =
bHasNamespaceMember && !bHasDefaultMember && !bHasNamedMember;
if (aHasOnlyNamespaceMember !== bHasOnlyNamespaceMember) {
return aHasOnlyNamespaceMember ? -1 : 1;
} else if (aHasOnlyDefaultMember !== bHasOnlyDefaultMember) {
return aHasOnlyDefaultMember ? -1 : 1;
} else if (aHasNamespaceMember !== bHasNamespaceMember) {
return aHasNamespaceMember ? -1 : 1;
} else if (aHasDefaultMember !== bHasDefaultMember) {
return aHasDefaultMember ? -1 : 1;
} else if (aHasNamedMember !== bHasNamedMember) {
return aHasNamedMember ? -1 : 1;
}
const first =
a.defaultMember ||
a.namespaceMember ||
a.namedMembers[0]?.name ||
a.moduleName;
const second =
b.defaultMember ||
b.namespaceMember ||
b.namedMembers[0]?.name ||
b.moduleName;
return comparator(first, second);
};
};
return [
// built-in module, has member
{
match: isNodeModule,
sort: memberOrModule(natural),
sortNamedMembers: name(natural),
},
// absolute
{
match: isAbsoluteModule,
sort: memberOrModule(natural),
sortNamedMembers: name(natural),
},
// relative
{
match: isRelativeModule,
sort: [dotSegmentCount, memberOrModule(natural)],
sortNamedMembers: name(natural),
},
// fallback
{
match: always,
sort: [dotSegmentCount, memberOrModule(natural)],
sortNamedMembers: name(natural),
},
];
}