Skip to content

Commit

Permalink
feat: Extend reExport option
Browse files Browse the repository at this point in the history
Close: unlight#6
  • Loading branch information
unlight committed Mar 19, 2021
1 parent 194577f commit 3d5475b
Show file tree
Hide file tree
Showing 12 changed files with 275 additions and 111 deletions.
22 changes: 18 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,11 +67,25 @@ Remove input types for atomic operations
Type: `boolean`
Default: `false`

#### `reExportAll`
#### `reExport`

Create `index.ts` files for each directory with re-export
Type: `boolean`
Default: `false`
Create `index.ts` file with re-export.
Type: `enum`
Values:
`None` Default, create nothing
`Directories` Create index file in all root directories
`Single` Create single index file in output directory
`All` Create index file in all root directories and in output directory

Example configuration:

```prisma
generator nestgraphql {
provider = "node node_modules/prisma-nestjs-graphql"
output = "../src/@generated/prisma-nestjs-graphql"
reExport = Directories
}
```

#### `types_*`

Expand Down
6 changes: 3 additions & 3 deletions Taskfile
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ compatibilty_check() {
rm -rf src/@generated && npm run prisma:g && npm run tscheck
sed -i 's/combineScalarFilters = true/combineScalarFilters = false/g' prisma/schema.prisma

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

build() {
Expand Down
4 changes: 2 additions & 2 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ generator client {
generator nestgraphql {
provider = "node -r ts-node/register/transpile-only src/index.ts"
output = "../src/@generated"
noAtomicOperations = false
noAtomicOperations = false
combineScalarFilters = false
reExportAll = false
reExport = None
}

model User {
Expand Down
138 changes: 116 additions & 22 deletions src/generate.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,11 @@ async function testGenerate(args: {
name: string;
type: string;
};
onConnect?: (emitter: AwaitEventEmitter) => void;
}) {
const { schema, options, createSouceFile } = args;
const { schema, options, createSouceFile, onConnect } = args;
const connectCallback = (emitter: AwaitEventEmitter) => {
onConnect && onConnect(emitter);
emitter.off('GenerateFiles');
if (createSouceFile) {
emitter.on(
Expand Down Expand Up @@ -1265,35 +1267,127 @@ describe('combine scalar filters', () => {
});
});

describe('export all from index', () => {
before(async () => {
await testGenerate({
schema: `
describe('reexport option', () => {
describe('reexport Directories clean', () => {
before(async () => {
await testGenerate({
schema: `
model User {
id Int @id
}`,
options: ['reExportAll = true'],
options: ['reExport = Directories'],
});
});

it('user/index', () => {
sourceFile = project.getSourceFile(s =>
s.getFilePath().endsWith('/user/index.ts'),
)!;
// sourceFile = project.getSourceFile('/user/index.ts')!;
expect(sourceFile).toBeTruthy();
expect(sourceFile.getText()).toContain(
`export { AggregateUser } from './aggregate-user.output'`,
);
expect(sourceFile.getText()).toContain(
`export { User } from './user.model'`,
);
});
});

it('user/index', () => {
sourceFile = project.getSourceFile(s =>
s.getFilePath().endsWith('/user/index.ts'),
)!;
// sourceFile = project.getSourceFile('/user/index.ts')!;
expect(sourceFile).toBeTruthy();
expect(sourceFile.getText()).toContain(
`export { AggregateUser } from './aggregate-user.output'`,
);
expect(sourceFile.getText()).toContain(`export { User } from './user.model'`);
describe('reexport Directories with existing file', () => {
before(async () => {
await testGenerate({
schema: `
model User {
id Int @id
}`,
options: ['reExport = Directories'],
onConnect(emitter) {
emitter.on('PostBegin', ({ project, output }: EventArguments) => {
project.createSourceFile(
`${output}/user/index.ts`,
`export { User } from './user.model';`,
{ overwrite: true },
);
});
},
});
});

it('user index should not contain duplicate identifer', () => {
sourceFile = project.getSourceFile(s =>
s.getFilePath().endsWith('/user/index.ts'),
)!;
exports = sourceFile.getExportDeclarations().map(x => ({
specifier: x.getModuleSpecifierValue(),
name: x.getNamedExports()[0].getName(),
}));
expect(exports).not.toContainEqual(
expect.objectContaining({ specifier: './index' }),
);
});
});

it('root index', () => {
const rootDirectory = project.getRootDirectories()[0].getParent();
const sourceFile = rootDirectory?.getSourceFile('index.ts')!;
expect(sourceFile).toBeTruthy();
expect(sourceFile.getText()).toContain(`SortOrder } from './prisma'`);
expect(sourceFile.getText()).toContain(`from './user'`);
describe('reexport Single', () => {
before(async () => {
await testGenerate({
schema: `
model User {
id Int @id
}`,
options: ['reExport = Single'],
});
});

it('root index', () => {
const rootDirectory = project.getRootDirectories()[0].getParent();
const sourceFile = rootDirectory?.getSourceFileOrThrow('index.ts')!;
expect(sourceFile).toBeTruthy();
expect(sourceFile.getText()).toContain(
`export { SortOrder } from './prisma/sort-order.enum'`,
);
expect(sourceFile.getText()).toContain(
`export { User } from './user/user.model'`,
);
});
});

describe('reexport All', () => {
before(async () => {
await testGenerate({
schema: `
model User {
id Int @id
}`,
options: ['reExport = All'],
});
});

it('root index', () => {
const rootDirectory = project.getRootDirectories()[0].getParent();
const sourceFile = rootDirectory?.getSourceFileOrThrow('index.ts')!;
expect(sourceFile).toBeTruthy();
expect(sourceFile.getText()).toMatch(
/export {.*AffectedRows,.*} from '\.\/prisma'/,
);
expect(sourceFile.getText()).toMatch(
/export {.*UserWhereInput,.*} from '\.\/user'/,
);
});

it('user index', () => {
sourceFile = project.getSourceFile(s =>
s.getFilePath().endsWith('/user/index.ts'),
)!;
// sourceFile = project.getSourceFile('/user/index.ts')!;
expect(sourceFile).toBeTruthy();
expect(sourceFile.getText()).toContain(
`export { AggregateUser } from './aggregate-user.output'`,
);
expect(sourceFile.getText()).toContain(
`export { User } from './user.model'`,
);
});
});
});

Expand Down
5 changes: 3 additions & 2 deletions src/generate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { modelData } from './handlers/model-data';
import { modelOutputType } from './handlers/model-output-type';
import { noAtomicOperations } from './handlers/no-atomic-operations';
import { outputType } from './handlers/output-type';
import { reExportAll } from './handlers/re-export-all';
import { ReExport, reExport } from './handlers/re-export';
import { registerEnum } from './handlers/register-enum';
import { typeNames } from './handlers/type-names';
import { warning } from './handlers/warning';
Expand Down Expand Up @@ -78,7 +78,7 @@ export async function generate(

config.combineScalarFilters && combineScalarFilters(eventEmitter);
config.noAtomicOperations && noAtomicOperations(eventEmitter);
config.reExportAll && reExportAll(eventEmitter);
config.reExport !== ReExport.None && reExport(eventEmitter);

const models = new Map<string, Model>();
const modelNames: string[] = [];
Expand All @@ -89,6 +89,7 @@ export async function generate(
project,
modelNames,
outputFilePattern: config.outputFilePattern,
eventEmitter,
});
const {
datamodel,
Expand Down
4 changes: 2 additions & 2 deletions src/handlers/input-type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export function inputType(
name: inputType.name,
type: fileType,
});
const classStructure = {
const classStructure: ClassDeclarationStructure = {
kind: StructureKind.Class,
isExported: true,
name: inputType.name,
Expand All @@ -40,7 +40,7 @@ export function inputType(
},
],
properties: [],
} as ClassDeclarationStructure;
};

importDeclarations
.set('Field', {
Expand Down
53 changes: 0 additions & 53 deletions src/handlers/re-export-all.ts

This file was deleted.

Loading

0 comments on commit 3d5475b

Please sign in to comment.