@eddeee888/gcg-typescript-resolver-files 0.18.0 → 0.18.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/defineConfig.d.ts +1 -1
- package/dist/defineConfig.js +8 -0
- package/package.json +7 -3
- package/CHANGELOG.md +0 -816
- package/DEVELOPMENT.md +0 -49
- package/dist/tsconfig.lib.tsbuildinfo +0 -1
- package/eslint.config.mjs +0 -22
- package/project.json +0 -8
- package/src/addVirtualTypesFileToTsMorphProject/addVirtualTypesFileToTsMorphProject.ts +0 -109
- package/src/addVirtualTypesFileToTsMorphProject/index.ts +0 -1
- package/src/defineConfig.spec.ts +0 -76
- package/src/defineConfig.ts +0 -37
- package/src/generateResolverFiles/addExternalResolverImport.ts +0 -185
- package/src/generateResolverFiles/addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented.spec.ts +0 -1174
- package/src/generateResolverFiles/addObjectTypeResolversPropertyAssignmentNodesIfNotImplemented.ts +0 -144
- package/src/generateResolverFiles/addResolverMainFiles.ts +0 -343
- package/src/generateResolverFiles/ensureEnumTypeResolversAreGenerated.ts +0 -51
- package/src/generateResolverFiles/generateResolverFiles.ts +0 -148
- package/src/generateResolverFiles/getImportStatementWithExpectedNamedImport.spec.ts +0 -127
- package/src/generateResolverFiles/getImportStatementWithExpectedNamedImport.ts +0 -25
- package/src/generateResolverFiles/getVariableStatementWithExpectedIdentifier.spec.ts +0 -147
- package/src/generateResolverFiles/getVariableStatementWithExpectedIdentifier.ts +0 -34
- package/src/generateResolverFiles/handleGraphQLEnumType.ts +0 -100
- package/src/generateResolverFiles/handleGraphQLInterfaceType.ts +0 -70
- package/src/generateResolverFiles/handleGraphQLObjectType.ts +0 -171
- package/src/generateResolverFiles/handleGraphQLRootObjectTypeField.ts +0 -105
- package/src/generateResolverFiles/handleGraphQLScalarType.ts +0 -81
- package/src/generateResolverFiles/handleGraphQLUnionType.ts +0 -68
- package/src/generateResolverFiles/index.ts +0 -2
- package/src/generateResolverFiles/postProcessFiles.ts +0 -287
- package/src/generateResolverFiles/types.ts +0 -203
- package/src/generateResolverFiles/visitNamedType.ts +0 -66
- package/src/generateTypeDefsFiles/generateTypeDefsContent.ts +0 -15
- package/src/generateTypeDefsFiles/generateTypeDefsFiles.ts +0 -100
- package/src/generateTypeDefsFiles/index.ts +0 -1
- package/src/getGraphQLObjectTypeResolversToGenerate/getGraphQLObjectTypeResolversToGenerate.ts +0 -361
- package/src/getGraphQLObjectTypeResolversToGenerate/getNodePropertyMap.spec.ts +0 -115
- package/src/getGraphQLObjectTypeResolversToGenerate/getNodePropertyMap.ts +0 -88
- package/src/getGraphQLObjectTypeResolversToGenerate/index.ts +0 -1
- package/src/index.ts +0 -3
- package/src/normalizeAddConfigPath/index.ts +0 -1
- package/src/normalizeAddConfigPath/normalizeAddConfigPath.ts +0 -29
- package/src/parseGraphQLSchema/index.ts +0 -2
- package/src/parseGraphQLSchema/normalizeResolverName.ts +0 -28
- package/src/parseGraphQLSchema/parseGraphQLSchema.ts +0 -531
- package/src/parseGraphQLSchema/parseLocationForOutputDir.ts +0 -76
- package/src/parseSources/index.ts +0 -1
- package/src/parseSources/parseSources.ts +0 -83
- package/src/parseTypeMappers/collectTypeMappersFromSourceFile.spec.ts +0 -789
- package/src/parseTypeMappers/collectTypeMappersFromSourceFile.ts +0 -197
- package/src/parseTypeMappers/index.ts +0 -1
- package/src/parseTypeMappers/parseTypeMappers.ts +0 -75
- package/src/preset.ts +0 -317
- package/src/utils/cwd.ts +0 -8
- package/src/utils/fmt.ts +0 -16
- package/src/utils/index.ts +0 -12
- package/src/utils/isMatchResolverNamePattern.ts +0 -27
- package/src/utils/isNativeNamedType.ts +0 -21
- package/src/utils/isRootObjectType.ts +0 -8
- package/src/utils/isWhitelistedModule.spec.ts +0 -71
- package/src/utils/isWhitelistedModule.ts +0 -21
- package/src/utils/logger.ts +0 -14
- package/src/utils/normalizeImportExtension.spec.ts +0 -42
- package/src/utils/normalizeImportExtension.ts +0 -16
- package/src/utils/normalizeRelativePath.ts +0 -6
- package/src/utils/parseLocationForWhitelistedModule.spec.ts +0 -130
- package/src/utils/parseLocationForWhitelistedModule.ts +0 -38
- package/src/utils/printImportLine.spec.ts +0 -150
- package/src/utils/printImportLine.ts +0 -78
- package/src/utils/relativeModulePath.ts +0 -7
- package/src/validateAndMergeParsedConfigs/index.ts +0 -1
- package/src/validateAndMergeParsedConfigs/validateAndMergeParsedConfigs.spec.ts +0 -211
- package/src/validateAndMergeParsedConfigs/validateAndMergeParsedConfigs.ts +0 -92
- package/src/validatePresetConfig/index.ts +0 -1
- package/src/validatePresetConfig/validatePresetConfig.spec.ts +0 -706
- package/src/validatePresetConfig/validatePresetConfig.ts +0 -571
- package/tsconfig.json +0 -14
- package/tsconfig.lib.json +0 -18
- package/tsconfig.spec.json +0 -20
- package/vite.config.ts +0 -24
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { isWhitelistedModule } from './isWhitelistedModule';
|
|
2
|
-
|
|
3
|
-
describe('isWhitelistedModule()', () => {
|
|
4
|
-
it.each([
|
|
5
|
-
{
|
|
6
|
-
description:
|
|
7
|
-
'is whitelisted if whitelistedModules and blacklistedModules are empty arrays',
|
|
8
|
-
moduleName: 'moduleA',
|
|
9
|
-
whitelistedModules: [],
|
|
10
|
-
blacklistedModules: [],
|
|
11
|
-
result: true,
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
description: 'is whitelisted if exists in whitelistedModules',
|
|
15
|
-
moduleName: 'moduleA',
|
|
16
|
-
whitelistedModules: ['moduleA', 'moduleB'],
|
|
17
|
-
blacklistedModules: [],
|
|
18
|
-
result: true,
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
description: 'is NOT whitelisted if not exists in whitelistedModules',
|
|
22
|
-
moduleName: 'moduleA',
|
|
23
|
-
whitelistedModules: ['moduleB', 'moduleC'],
|
|
24
|
-
blacklistedModules: [],
|
|
25
|
-
result: false,
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
description:
|
|
29
|
-
'is whitelisted if exists in whitelistedModules but not blacklistedModules',
|
|
30
|
-
moduleName: 'moduleB',
|
|
31
|
-
whitelistedModules: ['moduleB', 'moduleC'],
|
|
32
|
-
blacklistedModules: ['moduleA'],
|
|
33
|
-
result: true,
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
description:
|
|
37
|
-
'is whitelisted if whitelistedModules is empty but does not exist in blacklistedModules',
|
|
38
|
-
moduleName: 'moduleA',
|
|
39
|
-
whitelistedModules: [],
|
|
40
|
-
blacklistedModules: ['moduleB'],
|
|
41
|
-
result: true,
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
description:
|
|
45
|
-
'is NOT whitelisted if exists in both whitelistedModules and blacklistedModules',
|
|
46
|
-
moduleName: 'moduleA',
|
|
47
|
-
whitelistedModules: ['moduleA', 'moduleB', 'moduleC'],
|
|
48
|
-
blacklistedModules: ['moduleA'],
|
|
49
|
-
result: false,
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
description:
|
|
53
|
-
'is NOT whitelisted if whitelistedModules is empty and exists in blacklistedModules',
|
|
54
|
-
moduleName: 'moduleA',
|
|
55
|
-
whitelistedModules: [],
|
|
56
|
-
blacklistedModules: ['moduleA'],
|
|
57
|
-
result: false,
|
|
58
|
-
},
|
|
59
|
-
])(
|
|
60
|
-
'$description',
|
|
61
|
-
({ moduleName, blacklistedModules, whitelistedModules, result }) => {
|
|
62
|
-
expect(result).toEqual(
|
|
63
|
-
isWhitelistedModule({
|
|
64
|
-
moduleName,
|
|
65
|
-
whitelistedModules,
|
|
66
|
-
blacklistedModules,
|
|
67
|
-
})
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
);
|
|
71
|
-
});
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export const isWhitelistedModule = ({
|
|
2
|
-
moduleName,
|
|
3
|
-
whitelistedModules,
|
|
4
|
-
blacklistedModules,
|
|
5
|
-
}: {
|
|
6
|
-
moduleName: string;
|
|
7
|
-
whitelistedModules: string[];
|
|
8
|
-
blacklistedModules: string[];
|
|
9
|
-
}): boolean => {
|
|
10
|
-
if (blacklistedModules.includes(moduleName)) {
|
|
11
|
-
return false;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const isInWhitelistedModule =
|
|
15
|
-
// whitelistedModules is empty a.k.a. all are whitelisted
|
|
16
|
-
whitelistedModules.length === 0
|
|
17
|
-
? true
|
|
18
|
-
: whitelistedModules.includes(moduleName);
|
|
19
|
-
|
|
20
|
-
return isInWhitelistedModule;
|
|
21
|
-
};
|
package/src/utils/logger.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { presetName } from '../preset.js';
|
|
2
|
-
import { fmt } from './fmt.js';
|
|
3
|
-
|
|
4
|
-
export const logger = {
|
|
5
|
-
debug: (...args: Parameters<(typeof fmt)['debug']>) => {
|
|
6
|
-
const debugEnvVar = process.env.DEBUG || '';
|
|
7
|
-
if (debugEnvVar.includes(presetName)) {
|
|
8
|
-
console.debug(`\x1b[34m${fmt.debug(...args)}`);
|
|
9
|
-
}
|
|
10
|
-
},
|
|
11
|
-
warn: (...args: Parameters<(typeof fmt)['warn']>) => {
|
|
12
|
-
console.warn(`\x1b[34m${fmt.warn(...args)}`);
|
|
13
|
-
},
|
|
14
|
-
};
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { normalizeImportExtension } from './normalizeImportExtension';
|
|
2
|
-
|
|
3
|
-
describe('normalizeImportExtension', () => {
|
|
4
|
-
describe('when importExtension is explicitly provided', () => {
|
|
5
|
-
it('returns the explicit extension regardless of emitLegacyCommonJSImports', () => {
|
|
6
|
-
expect(normalizeImportExtension('.js', true)).toBe('.js');
|
|
7
|
-
expect(normalizeImportExtension('.js', false)).toBe('.js');
|
|
8
|
-
expect(normalizeImportExtension('.js', undefined)).toBe('.js');
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
it('returns empty string when explicitly set to empty', () => {
|
|
12
|
-
expect(normalizeImportExtension('', true)).toBe('');
|
|
13
|
-
expect(normalizeImportExtension('', false)).toBe('');
|
|
14
|
-
expect(normalizeImportExtension('', undefined)).toBe('');
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it('returns custom extension formats', () => {
|
|
18
|
-
expect(normalizeImportExtension('.mjs', undefined)).toBe('.mjs');
|
|
19
|
-
expect(normalizeImportExtension('.cjs', false)).toBe('.cjs');
|
|
20
|
-
expect(normalizeImportExtension('.mjs', true)).toBe('.mjs');
|
|
21
|
-
expect(normalizeImportExtension('.custom.ext')).toBe('.custom.ext');
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it('takes precedence over emitLegacyCommonJSImports', () => {
|
|
25
|
-
expect(normalizeImportExtension('.mjs', false)).toBe('.mjs');
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
describe('when importExtension is undefined', () => {
|
|
30
|
-
it('returns .js when emitLegacyCommonJSImports is false', () => {
|
|
31
|
-
expect(normalizeImportExtension(undefined, false)).toBe('.js');
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('returns empty string when emitLegacyCommonJSImports is true', () => {
|
|
35
|
-
expect(normalizeImportExtension(undefined, true)).toBe('');
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('returns empty string when emitLegacyCommonJSImports is undefined', () => {
|
|
39
|
-
expect(normalizeImportExtension(undefined, undefined)).toBe('');
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
});
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export type ImportExtension = '' | `.${string}`;
|
|
2
|
-
|
|
3
|
-
export function normalizeImportExtension(
|
|
4
|
-
importExtension?: ImportExtension,
|
|
5
|
-
emitLegacyCommonJSImports?: boolean
|
|
6
|
-
): ImportExtension {
|
|
7
|
-
if (importExtension !== undefined) {
|
|
8
|
-
return importExtension;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
if (emitLegacyCommonJSImports !== undefined) {
|
|
12
|
-
return emitLegacyCommonJSImports ? '' : '.js';
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
return '';
|
|
16
|
-
}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import * as path from 'path';
|
|
2
|
-
import {
|
|
3
|
-
type ParseLocationForWhitelistedModule,
|
|
4
|
-
parseLocationForWhitelistedModule,
|
|
5
|
-
} from './parseLocationForWhitelistedModule.js';
|
|
6
|
-
import type {
|
|
7
|
-
ParsedSource,
|
|
8
|
-
ParseSourcesResult,
|
|
9
|
-
} from '../parseSources/index.js';
|
|
10
|
-
|
|
11
|
-
const createPartialLocation = (
|
|
12
|
-
moduleName: string
|
|
13
|
-
): { source: { name: string } } => {
|
|
14
|
-
return {
|
|
15
|
-
source: { name: `/path/to/${moduleName}/schema.graphqls` },
|
|
16
|
-
};
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const createParsedSource = (moduleName: string): ParsedSource => {
|
|
20
|
-
const location = `/path/to/${moduleName}/schema.graphqls`;
|
|
21
|
-
return {
|
|
22
|
-
moduleName,
|
|
23
|
-
relativePathFromBaseToModule: [moduleName],
|
|
24
|
-
sourcePath: path.parse(location),
|
|
25
|
-
source: { location: `/path/to/${moduleName}/schema.graphqls` },
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const createSourcesMap = (
|
|
30
|
-
moduleNames: string[]
|
|
31
|
-
): ParseSourcesResult['sourceMap'] => {
|
|
32
|
-
return moduleNames.reduce<ParseSourcesResult['sourceMap']>(
|
|
33
|
-
(res, moduleName) => {
|
|
34
|
-
const sourceLocation = `/path/to/${moduleName}/schema.graphqls`;
|
|
35
|
-
res[sourceLocation] = createParsedSource(moduleName);
|
|
36
|
-
return res;
|
|
37
|
-
},
|
|
38
|
-
{}
|
|
39
|
-
);
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
describe('parseLocationForWhitelistedModule', () => {
|
|
43
|
-
test.each([
|
|
44
|
-
{
|
|
45
|
-
description:
|
|
46
|
-
'is whitelisted if whitelistedModules and blacklistedModules are empty arrays',
|
|
47
|
-
location: createPartialLocation('module1'),
|
|
48
|
-
sourceMap: createSourcesMap(['module1']),
|
|
49
|
-
whitelistedModules: [],
|
|
50
|
-
blacklistedModules: [],
|
|
51
|
-
result: createParsedSource('module1'),
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
description: 'is whitelisted if exists in whitelistedModules',
|
|
55
|
-
location: createPartialLocation('module2'),
|
|
56
|
-
sourceMap: createSourcesMap(['module1', 'module2', 'module3']),
|
|
57
|
-
whitelistedModules: ['module1', 'module2', 'module3'],
|
|
58
|
-
blacklistedModules: [],
|
|
59
|
-
result: createParsedSource('module2'),
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
description: 'is NOT whitelisted if not exists in whitelistedModules',
|
|
63
|
-
location: createPartialLocation('module2'),
|
|
64
|
-
sourceMap: createSourcesMap(['module1', 'module2', 'module3']),
|
|
65
|
-
whitelistedModules: ['module1', 'module3'],
|
|
66
|
-
blacklistedModules: [],
|
|
67
|
-
result: undefined,
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
description:
|
|
71
|
-
'is whitelisted if exists in whitelistedModules but not blacklistedModules',
|
|
72
|
-
location: createPartialLocation('module2'),
|
|
73
|
-
sourceMap: createSourcesMap(['module1', 'module2', 'module3']),
|
|
74
|
-
whitelistedModules: ['module1', 'module2', 'module3'],
|
|
75
|
-
blacklistedModules: ['module1'],
|
|
76
|
-
result: createParsedSource('module2'),
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
description:
|
|
80
|
-
'is whitelisted if whitelistedModules is empty but does not exist in blacklistedModules',
|
|
81
|
-
location: createPartialLocation('module2'),
|
|
82
|
-
sourceMap: createSourcesMap(['module1', 'module2', 'module3']),
|
|
83
|
-
whitelistedModules: [],
|
|
84
|
-
blacklistedModules: ['module1'],
|
|
85
|
-
result: createParsedSource('module2'),
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
description:
|
|
89
|
-
'is NOT whitelisted if exists in both whitelistedModules and blacklistedModules',
|
|
90
|
-
location: createPartialLocation('module1'),
|
|
91
|
-
sourceMap: createSourcesMap(['module1', 'module2', 'module3']),
|
|
92
|
-
whitelistedModules: ['module1', 'module2', 'module3'],
|
|
93
|
-
blacklistedModules: ['module1'],
|
|
94
|
-
result: undefined,
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
description:
|
|
98
|
-
'is NOT whitelisted if whitelistedModules is empty and exists in blacklistedModules',
|
|
99
|
-
location: createPartialLocation('module3'),
|
|
100
|
-
sourceMap: createSourcesMap(['module1', 'module2', 'module3']),
|
|
101
|
-
whitelistedModules: [],
|
|
102
|
-
blacklistedModules: ['module3'],
|
|
103
|
-
result: undefined,
|
|
104
|
-
},
|
|
105
|
-
])(
|
|
106
|
-
'$description',
|
|
107
|
-
({ location, sourceMap, blacklistedModules, whitelistedModules, result }) =>
|
|
108
|
-
expect(
|
|
109
|
-
parseLocationForWhitelistedModule({
|
|
110
|
-
location,
|
|
111
|
-
sourceMap,
|
|
112
|
-
blacklistedModules,
|
|
113
|
-
whitelistedModules,
|
|
114
|
-
} as unknown as ParseLocationForWhitelistedModule)
|
|
115
|
-
).toEqual(result)
|
|
116
|
-
);
|
|
117
|
-
|
|
118
|
-
it('throws if location does not exist in sourceMap', () => {
|
|
119
|
-
expect(() =>
|
|
120
|
-
parseLocationForWhitelistedModule({
|
|
121
|
-
location: createPartialLocation('module10'),
|
|
122
|
-
sourceMap: createSourcesMap(['module1', 'module2']),
|
|
123
|
-
blacklistedModules: [],
|
|
124
|
-
whitelistedModules: [],
|
|
125
|
-
} as unknown as ParseLocationForWhitelistedModule)
|
|
126
|
-
).toThrowErrorMatchingInlineSnapshot(
|
|
127
|
-
`[Error: Unable to find /path/to/module10/schema.graphqls in sourceMap]`
|
|
128
|
-
);
|
|
129
|
-
});
|
|
130
|
-
});
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import type { Location } from 'graphql';
|
|
2
|
-
import type {
|
|
3
|
-
ParseSourcesResult,
|
|
4
|
-
ParsedSource,
|
|
5
|
-
} from '../parseSources/index.js';
|
|
6
|
-
import { isWhitelistedModule } from './isWhitelistedModule.js';
|
|
7
|
-
|
|
8
|
-
export interface ParseLocationForWhitelistedModule {
|
|
9
|
-
location: Location | undefined;
|
|
10
|
-
sourceMap: ParseSourcesResult['sourceMap'];
|
|
11
|
-
whitelistedModules: string[];
|
|
12
|
-
blacklistedModules: string[];
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export const parseLocationForWhitelistedModule = ({
|
|
16
|
-
location,
|
|
17
|
-
sourceMap,
|
|
18
|
-
whitelistedModules,
|
|
19
|
-
blacklistedModules,
|
|
20
|
-
}: ParseLocationForWhitelistedModule): ParsedSource | undefined => {
|
|
21
|
-
if (!location) {
|
|
22
|
-
throw new Error('Location is invalid');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const sourceFilename = location.source.name;
|
|
26
|
-
const sourceFile = sourceMap[sourceFilename];
|
|
27
|
-
if (!sourceFile) {
|
|
28
|
-
throw new Error(`Unable to find ${sourceFilename} in sourceMap`);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const isWhitelisted = isWhitelistedModule({
|
|
32
|
-
moduleName: sourceFile.moduleName,
|
|
33
|
-
whitelistedModules,
|
|
34
|
-
blacklistedModules,
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
return isWhitelisted ? sourceFile : undefined;
|
|
38
|
-
};
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { printImportLine } from './printImportLine';
|
|
2
|
-
|
|
3
|
-
describe('printImportLine', () => {
|
|
4
|
-
it('prints default import correctly', () => {
|
|
5
|
-
const result = printImportLine({
|
|
6
|
-
module: './path/to/file',
|
|
7
|
-
moduleType: 'file',
|
|
8
|
-
isTypeImport: false,
|
|
9
|
-
namedImports: [],
|
|
10
|
-
defaultImport: 'DefaultImport',
|
|
11
|
-
emitLegacyCommonJSImports: true,
|
|
12
|
-
});
|
|
13
|
-
expect(result).toBe("import DefaultImport from './path/to/file';");
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it('prints one named import correctly', () => {
|
|
17
|
-
const result = printImportLine({
|
|
18
|
-
module: './path/to/file',
|
|
19
|
-
moduleType: 'file',
|
|
20
|
-
isTypeImport: false,
|
|
21
|
-
namedImports: ['Thing'],
|
|
22
|
-
emitLegacyCommonJSImports: true,
|
|
23
|
-
});
|
|
24
|
-
expect(result).toBe("import { Thing } from './path/to/file';");
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('prints one aliased named import correctly', () => {
|
|
28
|
-
const result = printImportLine({
|
|
29
|
-
module: './path/to/file',
|
|
30
|
-
moduleType: 'file',
|
|
31
|
-
isTypeImport: false,
|
|
32
|
-
namedImports: [{ propertyName: 'Thing', identifierName: 'OtherThing' }],
|
|
33
|
-
emitLegacyCommonJSImports: true,
|
|
34
|
-
});
|
|
35
|
-
expect(result).toBe(
|
|
36
|
-
"import { Thing as OtherThing } from './path/to/file';"
|
|
37
|
-
);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('prints multiple mixed default and named imports correctly', () => {
|
|
41
|
-
const result = printImportLine({
|
|
42
|
-
module: './path/to/file',
|
|
43
|
-
moduleType: 'file',
|
|
44
|
-
isTypeImport: false,
|
|
45
|
-
defaultImport: 'DefaultThing',
|
|
46
|
-
namedImports: [
|
|
47
|
-
{ propertyName: 'Thing', identifierName: 'OtherThing' },
|
|
48
|
-
'ThingTwo',
|
|
49
|
-
],
|
|
50
|
-
emitLegacyCommonJSImports: true,
|
|
51
|
-
});
|
|
52
|
-
expect(result).toBe(
|
|
53
|
-
"import DefaultThing , { Thing as OtherThing,ThingTwo } from './path/to/file';"
|
|
54
|
-
);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('prints .js extension for ESM files', () => {
|
|
58
|
-
const result = printImportLine({
|
|
59
|
-
module: './path/to/file',
|
|
60
|
-
moduleType: 'file',
|
|
61
|
-
isTypeImport: false,
|
|
62
|
-
namedImports: ['Thing'],
|
|
63
|
-
emitLegacyCommonJSImports: false,
|
|
64
|
-
});
|
|
65
|
-
expect(result).toBe("import { Thing } from './path/to/file.js';");
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('does not print .js extension for ESM modules', () => {
|
|
69
|
-
const result = printImportLine({
|
|
70
|
-
module: '@org/module',
|
|
71
|
-
moduleType: 'module',
|
|
72
|
-
isTypeImport: false,
|
|
73
|
-
namedImports: ['Thing'],
|
|
74
|
-
emitLegacyCommonJSImports: false,
|
|
75
|
-
});
|
|
76
|
-
expect(result).toBe("import { Thing } from '@org/module';");
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it('prints extension as declared', () => {
|
|
80
|
-
const result = printImportLine({
|
|
81
|
-
module: 'absolute/path/to/file.js',
|
|
82
|
-
moduleType: 'preserve',
|
|
83
|
-
isTypeImport: false,
|
|
84
|
-
namedImports: ['Thing'],
|
|
85
|
-
emitLegacyCommonJSImports: true,
|
|
86
|
-
});
|
|
87
|
-
expect(result).toBe("import { Thing } from 'absolute/path/to/file.js';");
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
it('prints type import correctly', () => {
|
|
91
|
-
const result = printImportLine({
|
|
92
|
-
module: './path/to/file',
|
|
93
|
-
moduleType: 'file',
|
|
94
|
-
isTypeImport: true,
|
|
95
|
-
namedImports: ['Thing'],
|
|
96
|
-
emitLegacyCommonJSImports: true,
|
|
97
|
-
});
|
|
98
|
-
expect(result).toBe("import type { Thing } from './path/to/file';");
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
describe('importExtension parameter', () => {
|
|
102
|
-
it('uses explicit importExtension parameter over emitLegacyCommonJSImports', () => {
|
|
103
|
-
const result = printImportLine({
|
|
104
|
-
module: './path/to/file',
|
|
105
|
-
moduleType: 'file',
|
|
106
|
-
isTypeImport: false,
|
|
107
|
-
namedImports: ['Thing'],
|
|
108
|
-
emitLegacyCommonJSImports: false,
|
|
109
|
-
importExtension: '.mjs',
|
|
110
|
-
});
|
|
111
|
-
expect(result).toBe("import { Thing } from './path/to/file.mjs';");
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
it('uses custom .cjs extension when importExtension is provided', () => {
|
|
115
|
-
const result = printImportLine({
|
|
116
|
-
module: './path/to/file',
|
|
117
|
-
moduleType: 'file',
|
|
118
|
-
isTypeImport: false,
|
|
119
|
-
namedImports: ['Thing'],
|
|
120
|
-
emitLegacyCommonJSImports: true,
|
|
121
|
-
importExtension: '.cjs',
|
|
122
|
-
});
|
|
123
|
-
expect(result).toBe("import { Thing } from './path/to/file.cjs';");
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
it('uses empty string when importExtension is explicitly set to empty', () => {
|
|
127
|
-
const result = printImportLine({
|
|
128
|
-
module: './path/to/file',
|
|
129
|
-
moduleType: 'file',
|
|
130
|
-
isTypeImport: false,
|
|
131
|
-
namedImports: ['Thing'],
|
|
132
|
-
emitLegacyCommonJSImports: false,
|
|
133
|
-
importExtension: '',
|
|
134
|
-
});
|
|
135
|
-
expect(result).toBe("import { Thing } from './path/to/file';");
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
it('does not apply importExtension to module imports', () => {
|
|
139
|
-
const result = printImportLine({
|
|
140
|
-
module: '@org/module',
|
|
141
|
-
moduleType: 'module',
|
|
142
|
-
isTypeImport: false,
|
|
143
|
-
namedImports: ['Thing'],
|
|
144
|
-
emitLegacyCommonJSImports: false,
|
|
145
|
-
importExtension: '.mjs',
|
|
146
|
-
});
|
|
147
|
-
expect(result).toBe("import { Thing } from '@org/module';");
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
});
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
normalizeImportExtension,
|
|
3
|
-
type ImportExtension,
|
|
4
|
-
} from './normalizeImportExtension.js';
|
|
5
|
-
|
|
6
|
-
export interface ImportLineMeta {
|
|
7
|
-
isTypeImport: boolean;
|
|
8
|
-
module: string;
|
|
9
|
-
/**
|
|
10
|
-
* moduleType
|
|
11
|
-
*
|
|
12
|
-
* @description Determines how the module should be treated when imported taking into consideration CJS vs ESM
|
|
13
|
-
* - file: import is a file. For ESM, .js extension is added. For CJS, no extension is added.
|
|
14
|
-
* - module: import is a module from `node_modules` or aliased e.g. `graphql-scalars` or `@org/your-module`. No extension is added.
|
|
15
|
-
* - preserve: preserve what the config declares. This is only used when taking user's config or preset-controlled config e.g. `externalExternals` because the import could be either file or module
|
|
16
|
-
*/
|
|
17
|
-
moduleType: 'file' | 'module' | 'preserve';
|
|
18
|
-
namedImports: (string | { propertyName: string; identifierName: string })[];
|
|
19
|
-
defaultImport?: string;
|
|
20
|
-
/** @deprecated Use importExtension instead */
|
|
21
|
-
emitLegacyCommonJSImports: boolean;
|
|
22
|
-
importExtension?: ImportExtension;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function printImportLine({
|
|
26
|
-
isTypeImport,
|
|
27
|
-
module,
|
|
28
|
-
moduleType,
|
|
29
|
-
namedImports,
|
|
30
|
-
defaultImport,
|
|
31
|
-
emitLegacyCommonJSImports,
|
|
32
|
-
importExtension,
|
|
33
|
-
}: ImportLineMeta): string {
|
|
34
|
-
const typeImportKeyword = isTypeImport ? 'type' : '';
|
|
35
|
-
const hasDefaultImport = Boolean(defaultImport);
|
|
36
|
-
const hasNamedImports = namedImports.length > 0;
|
|
37
|
-
const namedImportsString = hasNamedImports
|
|
38
|
-
? `{ ${namedImports.map(printNamedImportSpecifier).join(',')} }`
|
|
39
|
-
: '';
|
|
40
|
-
|
|
41
|
-
let fileExt = '';
|
|
42
|
-
if (moduleType !== 'preserve') {
|
|
43
|
-
const isFile = moduleType === 'file';
|
|
44
|
-
if (isFile) {
|
|
45
|
-
fileExt = normalizeImportExtension(
|
|
46
|
-
importExtension,
|
|
47
|
-
emitLegacyCommonJSImports
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return `import ${typeImportKeyword} ${defaultImport || ''} ${
|
|
53
|
-
hasDefaultImport && hasNamedImports ? ',' : ''
|
|
54
|
-
} ${namedImportsString} from '${normalizeModuleExtensionForImport(
|
|
55
|
-
module
|
|
56
|
-
)}${fileExt}';`;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const normalizeModuleExtensionForImport = (module: string): string => {
|
|
60
|
-
if (module.endsWith('.ts')) {
|
|
61
|
-
return module.split('.').slice(0, -1).join('.');
|
|
62
|
-
}
|
|
63
|
-
return module;
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
const printNamedImportSpecifier = (
|
|
67
|
-
namedImport: ImportLineMeta['namedImports'][number]
|
|
68
|
-
): string => {
|
|
69
|
-
if (typeof namedImport === 'string') {
|
|
70
|
-
return namedImport;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
if (namedImport.propertyName === namedImport.identifierName) {
|
|
74
|
-
return namedImport.identifierName;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return `${namedImport.propertyName} as ${namedImport.identifierName}`;
|
|
78
|
-
};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import * as path from 'path';
|
|
2
|
-
import { normalizeRelativePath } from './normalizeRelativePath.js';
|
|
3
|
-
|
|
4
|
-
export const relativeModulePath = (from: string, to: string): string => {
|
|
5
|
-
const rawPath = path.posix.relative(from, to);
|
|
6
|
-
return normalizeRelativePath(rawPath);
|
|
7
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './validateAndMergeParsedConfigs.js';
|