prettier-plugin-imports
Version:
A prettier plugins to sort imports in provided RegEx order
243 lines (237 loc) • 7.46 kB
text/typescript
import { describe, expect, test } from 'vitest';
import {
BUILTIN_MODULES_REGEX_STR,
BUILTIN_MODULES_SPECIAL_WORD,
DEFAULT_IMPORT_ORDER,
THIRD_PARTY_MODULES_SPECIAL_WORD,
} from '../constants';
import { NormalizableOptions } from '../types';
import {
examineAndNormalizePluginOptions,
testingOnly,
} from './normalize-plugin-options';
describe('normalizeImportOrderOption', () => {
test('it should not inject defaults if [] is passed explicitly', () => {
expect(testingOnly.normalizeImportOrderOption([])).toEqual([]);
});
test('it should inject required modules if not present', () => {
expect(testingOnly.normalizeImportOrderOption(['^[.]'])).toEqual([
BUILTIN_MODULES_REGEX_STR,
THIRD_PARTY_MODULES_SPECIAL_WORD,
'^[.]',
]);
expect(
testingOnly.normalizeImportOrderOption(['<THIRD_PARTY_MODULES>', '^[.]']),
).toEqual([
BUILTIN_MODULES_REGEX_STR,
THIRD_PARTY_MODULES_SPECIAL_WORD,
'^[.]',
]);
expect(
testingOnly.normalizeImportOrderOption(['<BUILTIN_MODULES>', '^[.]']),
).toEqual([
THIRD_PARTY_MODULES_SPECIAL_WORD,
BUILTIN_MODULES_REGEX_STR,
'^[.]',
]);
expect(
testingOnly.normalizeImportOrderOption([
'<BUILTIN_MODULES>',
'<THIRD_PARTY_MODULES>',
'^[.]',
]),
).toEqual([
BUILTIN_MODULES_REGEX_STR,
THIRD_PARTY_MODULES_SPECIAL_WORD,
'^[.]',
]);
});
test('it should inject required modules *after the first-separator& if any are present', () => {
expect(testingOnly.normalizeImportOrderOption([''])).toEqual([
'',
BUILTIN_MODULES_REGEX_STR,
THIRD_PARTY_MODULES_SPECIAL_WORD,
]);
expect(
testingOnly.normalizeImportOrderOption([
'',
'<BUILTIN_MODULES>',
'<THIRD_PARTY_MODULES>',
]),
).toEqual([
'',
BUILTIN_MODULES_REGEX_STR,
THIRD_PARTY_MODULES_SPECIAL_WORD,
]);
expect(testingOnly.normalizeImportOrderOption([' '])).toEqual([
' ',
BUILTIN_MODULES_REGEX_STR,
THIRD_PARTY_MODULES_SPECIAL_WORD,
]);
expect(testingOnly.normalizeImportOrderOption(['', '', '^[.]'])).toEqual([
'',
BUILTIN_MODULES_REGEX_STR,
THIRD_PARTY_MODULES_SPECIAL_WORD,
'',
'^[.]',
]);
});
});
describe('examineAndNormalizePluginOptions', () => {
test('it should set most defaults', () => {
expect(
examineAndNormalizePluginOptions({
importOrder: DEFAULT_IMPORT_ORDER,
importOrderParserPlugins: [],
importOrderCaseSensitive: false,
importOrderTypeScriptVersion: '1.0.0',
filepath: __filename,
} as NormalizableOptions),
).toEqual({
hasAnyCustomGroupSeparatorsInImportOrder: false,
importOrder: [
BUILTIN_MODULES_REGEX_STR,
THIRD_PARTY_MODULES_SPECIAL_WORD,
'^[.]',
],
importOrderCombineTypeAndValueImports: true,
importOrderCaseSensitive: false,
plugins: [],
provideGapAfterTopOfFileComments: false,
});
});
test('it should detect group separators anywhere (relevant for side-effects)', () => {
expect(
examineAndNormalizePluginOptions({
importOrder: [
BUILTIN_MODULES_SPECIAL_WORD,
THIRD_PARTY_MODULES_SPECIAL_WORD,
'',
'^[./]',
],
importOrderParserPlugins: [],
importOrderCaseSensitive: false,
importOrderTypeScriptVersion: '1.0.0',
filepath: __filename,
} as NormalizableOptions),
).toEqual({
hasAnyCustomGroupSeparatorsInImportOrder: true,
importOrder: [
BUILTIN_MODULES_REGEX_STR,
THIRD_PARTY_MODULES_SPECIAL_WORD,
'',
'^[./]',
],
importOrderCombineTypeAndValueImports: true,
importOrderCaseSensitive: false,
plugins: [],
provideGapAfterTopOfFileComments: false,
});
});
test('it should detect top-of-file gap', () => {
expect(
examineAndNormalizePluginOptions({
importOrder: [''],
importOrderParserPlugins: [],
importOrderCaseSensitive: false,
importOrderTypeScriptVersion: '1.0.0',
filepath: __filename,
} as NormalizableOptions),
).toEqual({
hasAnyCustomGroupSeparatorsInImportOrder: true,
importOrder: [
'',
BUILTIN_MODULES_REGEX_STR,
THIRD_PARTY_MODULES_SPECIAL_WORD,
],
importOrderCombineTypeAndValueImports: true,
importOrderCaseSensitive: false,
plugins: [],
provideGapAfterTopOfFileComments: true,
});
});
test('it should detect typescript-version-dependent-flags', () => {
expect(
examineAndNormalizePluginOptions({
importOrder: DEFAULT_IMPORT_ORDER,
importOrderParserPlugins: ['typescript'],
importOrderTypeScriptVersion: '5.0.0',
filepath: __filename,
} as NormalizableOptions),
).toEqual({
hasAnyCustomGroupSeparatorsInImportOrder: false,
importOrder: [
BUILTIN_MODULES_REGEX_STR,
THIRD_PARTY_MODULES_SPECIAL_WORD,
'^[.]',
],
importOrderCombineTypeAndValueImports: true,
importOrderCaseSensitive: false,
plugins: ['typescript'],
provideGapAfterTopOfFileComments: false,
});
});
test('it should call getExperimentalParserPlugins & filter', () => {
// full tests for getExperimentalParserPlugins is in its own spec file
expect(
examineAndNormalizePluginOptions({
importOrder: DEFAULT_IMPORT_ORDER,
importOrderParserPlugins: ['typescript', 'jsx'],
importOrderTypeScriptVersion: '5.0.0',
importOrderCaseSensitive: false,
filepath: __filename,
} as NormalizableOptions),
).toEqual({
hasAnyCustomGroupSeparatorsInImportOrder: false,
importOrder: [
BUILTIN_MODULES_REGEX_STR,
THIRD_PARTY_MODULES_SPECIAL_WORD,
'^[.]',
],
importOrderCombineTypeAndValueImports: true,
importOrderCaseSensitive: false,
plugins: ['typescript'],
provideGapAfterTopOfFileComments: false,
});
});
test('it should not have a problem with a missing filepath', () => {
expect(
examineAndNormalizePluginOptions({
importOrder: DEFAULT_IMPORT_ORDER,
importOrderParserPlugins: [],
importOrderCaseSensitive: false,
importOrderTypeScriptVersion: '1.0.0',
filepath: undefined,
} as NormalizableOptions),
).toEqual({
hasAnyCustomGroupSeparatorsInImportOrder: false,
importOrder: [
BUILTIN_MODULES_REGEX_STR,
THIRD_PARTY_MODULES_SPECIAL_WORD,
'^[.]',
],
importOrderCombineTypeAndValueImports: true,
importOrderCaseSensitive: false,
plugins: [],
provideGapAfterTopOfFileComments: false,
});
});
test('it should be disabled if importOrder is empty array', () => {
expect(
examineAndNormalizePluginOptions({
importOrder: [],
importOrderParserPlugins: [],
importOrderCaseSensitive: false,
importOrderTypeScriptVersion: '1.0.0',
filepath: __filename,
} as NormalizableOptions),
).toEqual({
hasAnyCustomGroupSeparatorsInImportOrder: false,
importOrder: [],
importOrderCombineTypeAndValueImports: true,
importOrderCaseSensitive: false,
plugins: [],
provideGapAfterTopOfFileComments: false,
});
});
});