Skip to content

Commit 3d5475b

Browse files
committed
feat: Extend reExport option
Close: unlight#6
1 parent 194577f commit 3d5475b

12 files changed

+275
-111
lines changed

README.md

+18-4
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,25 @@ Remove input types for atomic operations
6767
Type: `boolean`
6868
Default: `false`
6969

70-
#### `reExportAll`
70+
#### `reExport`
7171

72-
Create `index.ts` files for each directory with re-export
73-
Type: `boolean`
74-
Default: `false`
72+
Create `index.ts` file with re-export.
73+
Type: `enum`
74+
Values:
75+
`None` Default, create nothing
76+
`Directories` Create index file in all root directories
77+
`Single` Create single index file in output directory
78+
`All` Create index file in all root directories and in output directory
79+
80+
Example configuration:
81+
82+
```prisma
83+
generator nestgraphql {
84+
provider = "node node_modules/prisma-nestjs-graphql"
85+
output = "../src/@generated/prisma-nestjs-graphql"
86+
reExport = Directories
87+
}
88+
```
7589

7690
#### `types_*`
7791

Taskfile

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ compatibilty_check() {
1515
rm -rf src/@generated && npm run prisma:g && npm run tscheck
1616
sed -i 's/combineScalarFilters = true/combineScalarFilters = false/g' prisma/schema.prisma
1717

18-
# Enable reExportAll
19-
sed -i 's/reExportAll = false/reExportAll = true/g' prisma/schema.prisma
18+
# Switching reExport
19+
sed -i 's/reExport = None/reExport = All/g' prisma/schema.prisma
2020
rm -rf src/@generated && npm run prisma:g && npm run tscheck
21-
sed -i 's/reExportAll = true/reExportAll = false/g' prisma/schema.prisma
21+
sed -i 's/reExport = All/reExport = None/g' prisma/schema.prisma
2222
}
2323

2424
build() {

prisma/schema.prisma

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ generator client {
1111
generator nestgraphql {
1212
provider = "node -r ts-node/register/transpile-only src/index.ts"
1313
output = "../src/@generated"
14-
noAtomicOperations = false
14+
noAtomicOperations = false
1515
combineScalarFilters = false
16-
reExportAll = false
16+
reExport = None
1717
}
1818

1919
model User {

src/generate.spec.ts

+116-22
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,11 @@ async function testGenerate(args: {
3838
name: string;
3939
type: string;
4040
};
41+
onConnect?: (emitter: AwaitEventEmitter) => void;
4142
}) {
42-
const { schema, options, createSouceFile } = args;
43+
const { schema, options, createSouceFile, onConnect } = args;
4344
const connectCallback = (emitter: AwaitEventEmitter) => {
45+
onConnect && onConnect(emitter);
4446
emitter.off('GenerateFiles');
4547
if (createSouceFile) {
4648
emitter.on(
@@ -1265,35 +1267,127 @@ describe('combine scalar filters', () => {
12651267
});
12661268
});
12671269

1268-
describe('export all from index', () => {
1269-
before(async () => {
1270-
await testGenerate({
1271-
schema: `
1270+
describe('reexport option', () => {
1271+
describe('reexport Directories clean', () => {
1272+
before(async () => {
1273+
await testGenerate({
1274+
schema: `
12721275
model User {
12731276
id Int @id
12741277
}`,
1275-
options: ['reExportAll = true'],
1278+
options: ['reExport = Directories'],
1279+
});
1280+
});
1281+
1282+
it('user/index', () => {
1283+
sourceFile = project.getSourceFile(s =>
1284+
s.getFilePath().endsWith('/user/index.ts'),
1285+
)!;
1286+
// sourceFile = project.getSourceFile('/user/index.ts')!;
1287+
expect(sourceFile).toBeTruthy();
1288+
expect(sourceFile.getText()).toContain(
1289+
`export { AggregateUser } from './aggregate-user.output'`,
1290+
);
1291+
expect(sourceFile.getText()).toContain(
1292+
`export { User } from './user.model'`,
1293+
);
12761294
});
12771295
});
12781296

1279-
it('user/index', () => {
1280-
sourceFile = project.getSourceFile(s =>
1281-
s.getFilePath().endsWith('/user/index.ts'),
1282-
)!;
1283-
// sourceFile = project.getSourceFile('/user/index.ts')!;
1284-
expect(sourceFile).toBeTruthy();
1285-
expect(sourceFile.getText()).toContain(
1286-
`export { AggregateUser } from './aggregate-user.output'`,
1287-
);
1288-
expect(sourceFile.getText()).toContain(`export { User } from './user.model'`);
1297+
describe('reexport Directories with existing file', () => {
1298+
before(async () => {
1299+
await testGenerate({
1300+
schema: `
1301+
model User {
1302+
id Int @id
1303+
}`,
1304+
options: ['reExport = Directories'],
1305+
onConnect(emitter) {
1306+
emitter.on('PostBegin', ({ project, output }: EventArguments) => {
1307+
project.createSourceFile(
1308+
`${output}/user/index.ts`,
1309+
`export { User } from './user.model';`,
1310+
{ overwrite: true },
1311+
);
1312+
});
1313+
},
1314+
});
1315+
});
1316+
1317+
it('user index should not contain duplicate identifer', () => {
1318+
sourceFile = project.getSourceFile(s =>
1319+
s.getFilePath().endsWith('/user/index.ts'),
1320+
)!;
1321+
exports = sourceFile.getExportDeclarations().map(x => ({
1322+
specifier: x.getModuleSpecifierValue(),
1323+
name: x.getNamedExports()[0].getName(),
1324+
}));
1325+
expect(exports).not.toContainEqual(
1326+
expect.objectContaining({ specifier: './index' }),
1327+
);
1328+
});
12891329
});
12901330

1291-
it('root index', () => {
1292-
const rootDirectory = project.getRootDirectories()[0].getParent();
1293-
const sourceFile = rootDirectory?.getSourceFile('index.ts')!;
1294-
expect(sourceFile).toBeTruthy();
1295-
expect(sourceFile.getText()).toContain(`SortOrder } from './prisma'`);
1296-
expect(sourceFile.getText()).toContain(`from './user'`);
1331+
describe('reexport Single', () => {
1332+
before(async () => {
1333+
await testGenerate({
1334+
schema: `
1335+
model User {
1336+
id Int @id
1337+
}`,
1338+
options: ['reExport = Single'],
1339+
});
1340+
});
1341+
1342+
it('root index', () => {
1343+
const rootDirectory = project.getRootDirectories()[0].getParent();
1344+
const sourceFile = rootDirectory?.getSourceFileOrThrow('index.ts')!;
1345+
expect(sourceFile).toBeTruthy();
1346+
expect(sourceFile.getText()).toContain(
1347+
`export { SortOrder } from './prisma/sort-order.enum'`,
1348+
);
1349+
expect(sourceFile.getText()).toContain(
1350+
`export { User } from './user/user.model'`,
1351+
);
1352+
});
1353+
});
1354+
1355+
describe('reexport All', () => {
1356+
before(async () => {
1357+
await testGenerate({
1358+
schema: `
1359+
model User {
1360+
id Int @id
1361+
}`,
1362+
options: ['reExport = All'],
1363+
});
1364+
});
1365+
1366+
it('root index', () => {
1367+
const rootDirectory = project.getRootDirectories()[0].getParent();
1368+
const sourceFile = rootDirectory?.getSourceFileOrThrow('index.ts')!;
1369+
expect(sourceFile).toBeTruthy();
1370+
expect(sourceFile.getText()).toMatch(
1371+
/export {.*AffectedRows,.*} from '\.\/prisma'/,
1372+
);
1373+
expect(sourceFile.getText()).toMatch(
1374+
/export {.*UserWhereInput,.*} from '\.\/user'/,
1375+
);
1376+
});
1377+
1378+
it('user index', () => {
1379+
sourceFile = project.getSourceFile(s =>
1380+
s.getFilePath().endsWith('/user/index.ts'),
1381+
)!;
1382+
// sourceFile = project.getSourceFile('/user/index.ts')!;
1383+
expect(sourceFile).toBeTruthy();
1384+
expect(sourceFile.getText()).toContain(
1385+
`export { AggregateUser } from './aggregate-user.output'`,
1386+
);
1387+
expect(sourceFile.getText()).toContain(
1388+
`export { User } from './user.model'`,
1389+
);
1390+
});
12971391
});
12981392
});
12991393

src/generate.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { modelData } from './handlers/model-data';
1313
import { modelOutputType } from './handlers/model-output-type';
1414
import { noAtomicOperations } from './handlers/no-atomic-operations';
1515
import { outputType } from './handlers/output-type';
16-
import { reExportAll } from './handlers/re-export-all';
16+
import { ReExport, reExport } from './handlers/re-export';
1717
import { registerEnum } from './handlers/register-enum';
1818
import { typeNames } from './handlers/type-names';
1919
import { warning } from './handlers/warning';
@@ -78,7 +78,7 @@ export async function generate(
7878

7979
config.combineScalarFilters && combineScalarFilters(eventEmitter);
8080
config.noAtomicOperations && noAtomicOperations(eventEmitter);
81-
config.reExportAll && reExportAll(eventEmitter);
81+
config.reExport !== ReExport.None && reExport(eventEmitter);
8282

8383
const models = new Map<string, Model>();
8484
const modelNames: string[] = [];
@@ -89,6 +89,7 @@ export async function generate(
8989
project,
9090
modelNames,
9191
outputFilePattern: config.outputFilePattern,
92+
eventEmitter,
9293
});
9394
const {
9495
datamodel,

src/handlers/input-type.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export function inputType(
2929
name: inputType.name,
3030
type: fileType,
3131
});
32-
const classStructure = {
32+
const classStructure: ClassDeclarationStructure = {
3333
kind: StructureKind.Class,
3434
isExported: true,
3535
name: inputType.name,
@@ -40,7 +40,7 @@ export function inputType(
4040
},
4141
],
4242
properties: [],
43-
} as ClassDeclarationStructure;
43+
};
4444

4545
importDeclarations
4646
.set('Field', {

src/handlers/re-export-all.ts

-53
This file was deleted.

0 commit comments

Comments
 (0)