Skip to content

Commit 7d719f8

Browse files
feat: Export resolve/validator APIs
1 parent aec1de1 commit 7d719f8

30 files changed

+721
-637
lines changed

.prettierrc

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
"semi": false,
55
"singleQuote": true,
66
"arrowParens": "always"
7-
}
7+
}

package-lock.json

+6-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"scripts": {
1414
"clean": "rimraf ./coverage ./dist ./**/codegen",
1515
"clean:all": "npm run clean && rimraf ./node_modules package-lock.json",
16-
"codegen": "node ./dist/main/bin/index.js --sourceDir ./src/tests/integration/thrift --outDir ./src/tests/integration/apache/codegen",
16+
"codegen": "node ./dist/main/bin/index.js --target apache --sourceDir ./src/tests/integration/thrift --outDir ./src/tests/integration/apache/codegen",
1717
"prebuild": "npm run clean && npm run lint && npm run format",
1818
"build": "npm run build:only",
1919
"build:only": "tsc",
@@ -57,7 +57,7 @@
5757
"chai": "^4.2.0",
5858
"mocha": "^5.2.0",
5959
"nyc": "^13.3.0",
60-
"prettier": "^1.15.3",
60+
"prettier": "^1.17.0",
6161
"rimraf": "^2.6.2",
6262
"source-map-support": "^0.5.9",
6363
"thrift": "^0.11.0",

src/main/generator/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
import { rendererForTarget } from '../render'
1212
import { processStatements, renderStatement } from './iterator'
1313

14-
import { exportsForFile } from '../resolver/utils'
14+
import { exportsForFile } from '../resolver'
1515
import {
1616
IGeneratedFile,
1717
INamespace,

src/main/index.ts

+128-60
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import * as path from 'path'
33
import { parseFromSource, parseThriftFile } from './parser'
44

55
import {
6-
CompileTarget,
76
IFileExports,
87
IGeneratedFile,
98
IMakeOptions,
@@ -32,9 +31,19 @@ import { print } from './printer'
3231
import { readThriftFile } from './reader'
3332
import { rendererForTarget } from './render'
3433
import { resolveFile } from './resolver'
35-
import { exportsForFile } from './resolver/utils'
34+
import { exportsForFile } from './resolver'
3635
import { validateFile } from './validator'
3736

37+
import * as Parser from './parser'
38+
import * as Resolver from './resolver'
39+
import * as Validator from './validator'
40+
import * as Utils from './utils'
41+
42+
export { Resolver }
43+
export { Parser }
44+
export { Validator }
45+
export { Utils }
46+
3847
/**
3948
* This function is mostly for testing purposes. It does not support includes.
4049
* Given a string of Thrift IDL it will return a string of TypeScript. If the
@@ -45,29 +54,19 @@ import { validateFile } from './validator'
4554
*/
4655
export function make(
4756
source: string,
48-
target: CompileTarget = 'thrift-server',
49-
strictUnions: boolean = false,
57+
options: Partial<IMakeOptions> = {},
5058
): string {
51-
const options: IMakeOptions = mergeWithDefaults({
52-
target,
53-
strictUnions,
54-
})
55-
const parsedFile: IParsedFile = parseFromSource(source, options)
56-
const resolvedFile: IResolvedFile = resolveFile(parsedFile, {}, '', options)
57-
const validatedFile: IResolvedFile = validateFile(resolvedFile, {}, '')
58-
59-
if (validatedFile.errors.length > 0) {
60-
throw new Error(`Shit broke`)
61-
}
59+
const mergedOptions: IMakeOptions = mergeWithDefaults(options)
60+
const validatedFile: IResolvedFile = parseThriftSource(source, options)
6261

63-
const fileExports: IFileExports = exportsForFile(resolvedFile.body)
62+
const fileExports: IFileExports = exportsForFile(validatedFile.body)
6463
const state: IRenderState = {
65-
options,
64+
options: mergedOptions,
6665
currentNamespace: {
6766
type: 'Namespace',
6867
namespace: emptyNamespace(),
6968
files: {
70-
[resolvedFile.sourceFile.fullPath]: resolvedFile,
69+
[validatedFile.sourceFile.fullPath]: validatedFile,
7170
},
7271
exports: fileExports,
7372
includedNamespaces: {},
@@ -85,41 +84,53 @@ export function make(
8584
sourceDir: '',
8685
outDir: '',
8786
namespaces: {},
88-
options,
87+
options: mergedOptions,
8988
},
9089
}
9190

9291
return print(
93-
processStatements(resolvedFile.body, state, rendererForTarget(target)),
92+
processStatements(
93+
validatedFile.body,
94+
state,
95+
rendererForTarget(mergedOptions.target),
96+
),
9497
)
9598
}
9699

97-
export async function generate(options: Partial<IMakeOptions>): Promise<void> {
100+
export function parseThriftSource(
101+
source: string,
102+
options: Partial<IMakeOptions> = {},
103+
): IResolvedFile {
98104
const mergedOptions: IMakeOptions = mergeWithDefaults(options)
99-
100-
// Root at which we operate relative to
101-
const rootDir: string = path.resolve(process.cwd(), mergedOptions.rootDir)
102-
103-
// Where do we save generated files
104-
const outDir: string = path.resolve(rootDir, mergedOptions.outDir)
105-
106-
// Where do we read source files
107-
const sourceDir: string = path.resolve(rootDir, mergedOptions.sourceDir)
108-
109-
const fileNames: Array<string> = collectSourceFiles(
110-
sourceDir,
111-
mergedOptions,
105+
const parsedFile: IParsedFile = parseFromSource(
106+
source,
107+
mergedOptions.fallbackNamespace,
112108
)
113-
114-
const thriftFiles: Array<ISourceFile> = await Promise.all(
115-
fileNames.map((next: string) => {
116-
return readThriftFile(next, [sourceDir])
117-
}),
109+
const resolvedFile: IResolvedFile = resolveFile(
110+
parsedFile,
111+
{},
112+
'',
113+
mergedOptions.fallbackNamespace,
118114
)
115+
const validatedFile: IResolvedFile = validateFile(resolvedFile, {}, '')
119116

117+
if (validatedFile.errors.length > 0) {
118+
throw new Error(`Unable to validate thrift source`)
119+
}
120+
121+
return validatedFile
122+
}
123+
124+
export async function parseThriftFiles(
125+
thriftFiles: Array<ISourceFile>,
126+
options: {
127+
sourceDir: string
128+
fallbackNamespace: string
129+
},
130+
): Promise<Array<IResolvedFile>> {
120131
const parsedFiles: Array<IParsedFile> = thriftFiles.map(
121132
(next: ISourceFile) => {
122-
const parsed = parseThriftFile(next, mergedOptions)
133+
const parsed = parseThriftFile(next, options.fallbackNamespace)
123134
return parsed
124135
},
125136
)
@@ -134,7 +145,12 @@ export async function generate(options: Partial<IMakeOptions>): Promise<void> {
134145

135146
const resolvedFiles: Array<IResolvedFile> = parsedFiles.map(
136147
(next: IParsedFile) => {
137-
return resolveFile(next, parsedFileMap, sourceDir, mergedOptions)
148+
return resolveFile(
149+
next,
150+
parsedFileMap,
151+
options.sourceDir,
152+
options.fallbackNamespace,
153+
)
138154
},
139155
)
140156

@@ -144,7 +160,7 @@ export async function generate(options: Partial<IMakeOptions>): Promise<void> {
144160

145161
if (resolvedInvalidFiles.length > 0) {
146162
printErrors(resolvedInvalidFiles)
147-
process.exitCode = 1
163+
throw new Error(`Unable to parse Thrift files`)
148164
} else {
149165
const resolvedFileMap: ResolvedFileMap = resolvedFiles.reduce(
150166
(acc: ResolvedFileMap, next: IResolvedFile) => {
@@ -155,7 +171,7 @@ export async function generate(options: Partial<IMakeOptions>): Promise<void> {
155171
)
156172
const validatedFiles: Array<IResolvedFile> = resolvedFiles.map(
157173
(next: IResolvedFile) => {
158-
return validateFile(next, resolvedFileMap, sourceDir)
174+
return validateFile(next, resolvedFileMap, options.sourceDir)
159175
},
160176
)
161177

@@ -165,24 +181,76 @@ export async function generate(options: Partial<IMakeOptions>): Promise<void> {
165181

166182
if (validatedInvalidFiles.length > 0) {
167183
printErrors(validatedInvalidFiles)
168-
process.exitCode = 1
184+
throw new Error(`Unable to parse Thrift files`)
169185
} else {
170-
const namespaces: INamespaceMap = organizeByNamespace(resolvedFiles)
171-
172-
const thriftProject: IThriftProject = {
173-
type: 'ThriftProject',
174-
rootDir,
175-
outDir,
176-
sourceDir,
177-
namespaces,
178-
options: mergedOptions,
179-
}
180-
181-
const generatedFiles: Array<IGeneratedFile> = generateProject(
182-
thriftProject,
183-
)
184-
185-
saveFiles(generatedFiles, outDir)
186+
return validatedFiles
186187
}
187188
}
188189
}
190+
191+
export async function readThriftFiles(options: {
192+
rootDir: string
193+
sourceDir: string
194+
files?: Array<string>
195+
}): Promise<Array<ISourceFile>> {
196+
// Root at which we operate relative to
197+
const rootDir: string = path.resolve(process.cwd(), options.rootDir)
198+
199+
// Where do we read source files
200+
const sourceDir: string = path.resolve(rootDir, options.sourceDir)
201+
202+
const fileNames: Array<string> = collectSourceFiles(
203+
sourceDir,
204+
options.files,
205+
)
206+
207+
const thriftFiles: Array<ISourceFile> = await Promise.all(
208+
fileNames.map((next: string) => {
209+
return readThriftFile(next, [sourceDir])
210+
}),
211+
)
212+
213+
return thriftFiles
214+
}
215+
216+
export async function generate(options: Partial<IMakeOptions>): Promise<void> {
217+
const mergedOptions: IMakeOptions = mergeWithDefaults(options)
218+
219+
// Root at which we operate relative to
220+
const rootDir: string = path.resolve(process.cwd(), mergedOptions.rootDir)
221+
222+
// Where do we save generated files
223+
const outDir: string = path.resolve(rootDir, mergedOptions.outDir)
224+
225+
// Where do we read source files
226+
const sourceDir: string = path.resolve(rootDir, mergedOptions.sourceDir)
227+
228+
const thriftFiles: Array<ISourceFile> = await readThriftFiles({
229+
rootDir,
230+
sourceDir,
231+
files: mergedOptions.files,
232+
})
233+
234+
const validatedFiles: Array<IResolvedFile> = await parseThriftFiles(
235+
thriftFiles,
236+
{
237+
sourceDir,
238+
fallbackNamespace: mergedOptions.fallbackNamespace,
239+
},
240+
)
241+
242+
const namespaces: INamespaceMap = organizeByNamespace(validatedFiles)
243+
244+
const thriftProject: IThriftProject = {
245+
type: 'ThriftProject',
246+
rootDir,
247+
outDir,
248+
sourceDir,
249+
namespaces,
250+
options: mergedOptions,
251+
}
252+
253+
const generatedFiles: Array<IGeneratedFile> = generateProject(thriftProject)
254+
255+
saveFiles(generatedFiles, outDir)
256+
}

src/main/parser/index.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@ import {
44
ThriftDocument,
55
ThriftErrors,
66
} from '@creditkarma/thrift-parser'
7-
import { exportsForFile } from '../resolver/utils'
7+
import { exportsForFile } from '../resolver'
88
import {
99
IFileExports,
1010
IFileIncludes,
11-
IMakeOptions,
1211
INamespacePath,
1312
IParsedFile,
1413
ISourceFile,
@@ -28,7 +27,7 @@ export function parseThriftString(source: string): ThriftDocument {
2827

2928
export function parseFromSource(
3029
source: string,
31-
options: IMakeOptions,
30+
fallbackNamespace: string,
3231
): IParsedFile {
3332
const sourceFile: ISourceFile = {
3433
type: 'SourceFile',
@@ -38,16 +37,19 @@ export function parseFromSource(
3837
source,
3938
}
4039

41-
return parseThriftFile(sourceFile, options)
40+
return parseThriftFile(sourceFile, fallbackNamespace)
4241
}
4342

4443
export function parseThriftFile(
4544
file: ISourceFile,
46-
options: IMakeOptions,
45+
fallbackNamespace: string,
4746
): IParsedFile {
4847
const thriftDoc: ThriftDocument = parseThriftString(file.source)
4948
const exports: IFileExports = exportsForFile(thriftDoc.body)
50-
const namespace: INamespacePath = namespaceForFile(thriftDoc.body, options)
49+
const namespace: INamespacePath = namespaceForFile(
50+
thriftDoc.body,
51+
fallbackNamespace,
52+
)
5153
const includes: IFileIncludes = includesForFile(thriftDoc.body, file)
5254

5355
return {

src/main/render/apache/service/client.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import {
4040
typeNodeForFieldType,
4141
} from '../types'
4242

43-
import { resolveIdentifierName } from '../../../resolver/utils'
43+
import { resolveIdentifierName } from '../../../resolver'
4444
import { IRenderState } from '../../../types'
4545

4646
export function renderClient(

src/main/render/apache/service/processor.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import {
2828
import {
2929
resolveIdentifierDefinition,
3030
resolveIdentifierName,
31-
} from '../../../resolver/utils'
31+
} from '../../../resolver'
3232
import { IRenderState } from '../../../types'
3333

3434
import {

src/main/render/apache/struct/read.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import { THRIFT_IDENTIFIERS, THRIFT_TYPES } from '../identifiers'
3636
import {
3737
resolveIdentifierDefinition,
3838
resolveIdentifierName,
39-
} from '../../../resolver/utils'
39+
} from '../../../resolver'
4040
import { READ_METHODS } from './methods'
4141

4242
/**

0 commit comments

Comments
 (0)