@flink-app/flink 0.4.4 → 0.4.5
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/bin/flink.js +2 -2
- package/dist/cli/build.js +3 -3
- package/dist/cli/clean.js +2 -2
- package/dist/cli/cli-utils.js +1 -1
- package/dist/cli/forked-compiler.d.ts +2 -0
- package/dist/cli/forked-compiler.js +33 -0
- package/dist/cli/generate-schemas.js +16 -20
- package/dist/cli/run.js +2 -2
- package/dist/src/FlinkApp.d.ts +1 -1
- package/dist/src/FlinkApp.js +54 -54
- package/dist/src/FlinkErrors.d.ts +1 -1
- package/dist/src/FlinkErrors.js +5 -5
- package/dist/src/FlinkHttpHandler.d.ts +7 -7
- package/dist/src/FlinkJob.d.ts +2 -2
- package/dist/src/FlinkRepo.js +1 -1
- package/dist/src/FlinkResponse.d.ts +2 -2
- package/dist/src/FsUtils.js +4 -4
- package/dist/src/TypeScriptCompiler.js +63 -67
- package/dist/src/TypeScriptUtils.js +1 -1
- package/dist/src/index.js +1 -5
- package/dist/src/mock-data-generator.js +1 -1
- package/dist/src/utils.js +27 -9
- package/package.json +2 -2
- package/spec/utils.spec.ts +245 -201
- package/src/utils.ts +111 -105
package/dist/src/FlinkErrors.js
CHANGED
|
@@ -6,7 +6,7 @@ function notFound(detail, code) {
|
|
|
6
6
|
return {
|
|
7
7
|
status: 404,
|
|
8
8
|
error: {
|
|
9
|
-
id:
|
|
9
|
+
id: uuid_1.v4(),
|
|
10
10
|
title: "Not Found",
|
|
11
11
|
detail: detail || "The requested resource does not exist",
|
|
12
12
|
code: code || "notFound"
|
|
@@ -18,7 +18,7 @@ function conflict(detail, code) {
|
|
|
18
18
|
return {
|
|
19
19
|
status: 409,
|
|
20
20
|
error: {
|
|
21
|
-
id:
|
|
21
|
+
id: uuid_1.v4(),
|
|
22
22
|
title: "Conflict",
|
|
23
23
|
detail: detail || "An identical entity exits",
|
|
24
24
|
code: code || "conflict"
|
|
@@ -30,7 +30,7 @@ function badRequest(detail, code) {
|
|
|
30
30
|
return {
|
|
31
31
|
status: 400,
|
|
32
32
|
error: {
|
|
33
|
-
id:
|
|
33
|
+
id: uuid_1.v4(),
|
|
34
34
|
title: "Bad Request",
|
|
35
35
|
detail: detail || "Invalid request",
|
|
36
36
|
code: code || "badRequest"
|
|
@@ -42,7 +42,7 @@ function unauthorized(detail, code) {
|
|
|
42
42
|
return {
|
|
43
43
|
status: 401,
|
|
44
44
|
error: {
|
|
45
|
-
id:
|
|
45
|
+
id: uuid_1.v4(),
|
|
46
46
|
title: "Unauthorized",
|
|
47
47
|
detail: detail || "User not logged in or or not allowed to access resource",
|
|
48
48
|
code: code || "badRequest"
|
|
@@ -54,7 +54,7 @@ function internalServerError(detail, code) {
|
|
|
54
54
|
return {
|
|
55
55
|
status: 500,
|
|
56
56
|
error: {
|
|
57
|
-
id:
|
|
57
|
+
id: uuid_1.v4(),
|
|
58
58
|
title: "Internal Server Error",
|
|
59
59
|
detail: detail || "Something unexpected went wrong",
|
|
60
60
|
code: code || "internalServerError"
|
|
@@ -9,12 +9,12 @@ export declare enum HttpMethod {
|
|
|
9
9
|
put = "put",
|
|
10
10
|
delete = "delete"
|
|
11
11
|
}
|
|
12
|
-
type Params = Request["params"];
|
|
13
|
-
type Query = Request["query"];
|
|
12
|
+
declare type Params = Request["params"];
|
|
13
|
+
declare type Query = Request["query"];
|
|
14
14
|
/**
|
|
15
15
|
* Flink request extends express Request but adds reqId and user object.
|
|
16
16
|
*/
|
|
17
|
-
export type FlinkRequest<T = any, P = Params, Q = Query> = Request<P, any, T, Q> & {
|
|
17
|
+
export declare type FlinkRequest<T = any, P = Params, Q = Query> = Request<P, any, T, Q> & {
|
|
18
18
|
reqId: string;
|
|
19
19
|
user?: any;
|
|
20
20
|
};
|
|
@@ -68,7 +68,7 @@ export interface RouteProps {
|
|
|
68
68
|
* Http handler function that handlers implements in order to
|
|
69
69
|
* handle HTTP requests and return a JSON response.
|
|
70
70
|
*/
|
|
71
|
-
export type Handler<Ctx extends FlinkContext, ReqSchema = any, ResSchema = any, P extends Params = Params, Q extends Query = Query> = (props: {
|
|
71
|
+
export declare type Handler<Ctx extends FlinkContext, ReqSchema = any, ResSchema = any, P extends Params = Params, Q extends Query = Query> = (props: {
|
|
72
72
|
req: FlinkRequest<ReqSchema, P, Q>;
|
|
73
73
|
ctx: Ctx;
|
|
74
74
|
origin?: string;
|
|
@@ -79,14 +79,14 @@ export type Handler<Ctx extends FlinkContext, ReqSchema = any, ResSchema = any,
|
|
|
79
79
|
*
|
|
80
80
|
* Just syntactic sugar on top op `HandlerFn`
|
|
81
81
|
*/
|
|
82
|
-
export type GetHandler<Ctx extends FlinkContext, ResSchema = any, P extends Params = Params, Q extends Query = Query> = Handler<Ctx, any, ResSchema, P, Q>;
|
|
82
|
+
export declare type GetHandler<Ctx extends FlinkContext, ResSchema = any, P extends Params = Params, Q extends Query = Query> = Handler<Ctx, any, ResSchema, P, Q>;
|
|
83
83
|
/**
|
|
84
84
|
* Type for Handler file. Describes shape of exports when using
|
|
85
85
|
* syntax like:
|
|
86
86
|
*
|
|
87
87
|
* `import * as FooHandler from "./src/handlers/FooHandler"
|
|
88
88
|
*/
|
|
89
|
-
export type HandlerFile = {
|
|
89
|
+
export declare type HandlerFile = {
|
|
90
90
|
default: Handler<any, any, any, any, any>;
|
|
91
91
|
Route?: RouteProps;
|
|
92
92
|
/**
|
|
@@ -109,7 +109,7 @@ export type HandlerFile = {
|
|
|
109
109
|
*/
|
|
110
110
|
__params?: QueryParamMetadata[];
|
|
111
111
|
};
|
|
112
|
-
export type QueryParamMetadata = {
|
|
112
|
+
export declare type QueryParamMetadata = {
|
|
113
113
|
name: string;
|
|
114
114
|
description: string;
|
|
115
115
|
};
|
package/dist/src/FlinkJob.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FlinkContext } from "./FlinkContext";
|
|
2
|
-
export type FlinkJobProps = {
|
|
2
|
+
export declare type FlinkJobProps = {
|
|
3
3
|
/**
|
|
4
4
|
* Id of job, must be unique
|
|
5
5
|
*/
|
|
@@ -48,7 +48,7 @@ export interface FlinkJob<C extends FlinkContext> {
|
|
|
48
48
|
*
|
|
49
49
|
* `import * as FooJob from "./src/jobs/FooJob"
|
|
50
50
|
*/
|
|
51
|
-
export type FlinkJobFile = {
|
|
51
|
+
export declare type FlinkJobFile = {
|
|
52
52
|
default: FlinkJob<any>;
|
|
53
53
|
Job: FlinkJobProps;
|
|
54
54
|
/**
|
package/dist/src/FlinkRepo.js
CHANGED
|
@@ -14,7 +14,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
14
14
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
15
|
function step(op) {
|
|
16
16
|
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (
|
|
17
|
+
while (_) try {
|
|
18
18
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
19
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
20
|
switch (op[0]) {
|
package/dist/src/FsUtils.js
CHANGED
|
@@ -14,7 +14,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
14
14
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
15
|
function step(op) {
|
|
16
16
|
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (
|
|
17
|
+
while (_) try {
|
|
18
18
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
19
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
20
|
switch (op[0]) {
|
|
@@ -70,7 +70,7 @@ function readJsonFiles(globPattern) {
|
|
|
70
70
|
var files, readPromises;
|
|
71
71
|
return __generator(this, function (_a) {
|
|
72
72
|
switch (_a.label) {
|
|
73
|
-
case 0: return [4 /*yield*/,
|
|
73
|
+
case 0: return [4 /*yield*/, tiny_glob_1.default(globPattern)];
|
|
74
74
|
case 1:
|
|
75
75
|
files = _a.sent();
|
|
76
76
|
readPromises = files.map(function (file) {
|
|
@@ -78,7 +78,7 @@ function readJsonFiles(globPattern) {
|
|
|
78
78
|
.readFile(file)
|
|
79
79
|
.then(function (data) { return JSON.parse(data.toString()); })
|
|
80
80
|
.catch(function (err) {
|
|
81
|
-
FlinkLog_1.log.error("Failed reading file "
|
|
81
|
+
FlinkLog_1.log.error("Failed reading file " + file + ": " + err);
|
|
82
82
|
return {};
|
|
83
83
|
});
|
|
84
84
|
});
|
|
@@ -99,7 +99,7 @@ function writeJsonFile(path, content, opts) {
|
|
|
99
99
|
if (!opts.ensureDir) return [3 /*break*/, 2];
|
|
100
100
|
i = path.lastIndexOf(path_1.sep);
|
|
101
101
|
if (!(i > 0 && i < path.length - 1)) return [3 /*break*/, 2];
|
|
102
|
-
return [4 /*yield*/,
|
|
102
|
+
return [4 /*yield*/, fs_extra_1.ensureDir(path.substr(0, i))];
|
|
103
103
|
case 1:
|
|
104
104
|
_a.sent();
|
|
105
105
|
_a.label = 2;
|
|
@@ -25,7 +25,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
25
25
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
26
|
function step(op) {
|
|
27
27
|
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
-
while (
|
|
28
|
+
while (_) try {
|
|
29
29
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
30
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
31
|
switch (op[0]) {
|
|
@@ -46,14 +46,10 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
46
46
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
47
|
}
|
|
48
48
|
};
|
|
49
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
ar[i] = from[i];
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
49
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
|
|
50
|
+
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
|
|
51
|
+
to[j] = from[i];
|
|
52
|
+
return to;
|
|
57
53
|
};
|
|
58
54
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
59
55
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -84,10 +80,10 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
84
80
|
*/
|
|
85
81
|
this.tsSchemasSymbolsToImports = [];
|
|
86
82
|
this.project = new ts_morph_1.Project({
|
|
87
|
-
tsConfigFilePath:
|
|
83
|
+
tsConfigFilePath: path_1.join(cwd, "tsconfig.json"),
|
|
88
84
|
compilerOptions: {
|
|
89
85
|
noEmit: false,
|
|
90
|
-
outDir:
|
|
86
|
+
outDir: path_1.join(cwd, "dist"),
|
|
91
87
|
// incremental: true,
|
|
92
88
|
},
|
|
93
89
|
});
|
|
@@ -103,7 +99,7 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
103
99
|
return __generator(this, function (_a) {
|
|
104
100
|
switch (_a.label) {
|
|
105
101
|
case 0:
|
|
106
|
-
flinkDir =
|
|
102
|
+
flinkDir = path_1.join(cwd, ".flink");
|
|
107
103
|
_a.label = 1;
|
|
108
104
|
case 1:
|
|
109
105
|
_a.trys.push([1, 3, , 5]);
|
|
@@ -117,7 +113,7 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
117
113
|
case 4:
|
|
118
114
|
_a.sent();
|
|
119
115
|
return [3 /*break*/, 5];
|
|
120
|
-
case 5: return [4 /*yield*/,
|
|
116
|
+
case 5: return [4 /*yield*/, tiny_glob_1.default(".flink/**/*.ts", { cwd: cwd })];
|
|
121
117
|
case 6:
|
|
122
118
|
files = _a.sent();
|
|
123
119
|
_i = 0, files_1 = files;
|
|
@@ -125,7 +121,7 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
125
121
|
case 7:
|
|
126
122
|
if (!(_i < files_1.length)) return [3 /*break*/, 10];
|
|
127
123
|
file = files_1[_i];
|
|
128
|
-
return [4 /*yield*/, fs_1.promises.rm(
|
|
124
|
+
return [4 /*yield*/, fs_1.promises.rm(path_1.join(cwd, file))];
|
|
129
125
|
case 8:
|
|
130
126
|
_a.sent();
|
|
131
127
|
_a.label = 9;
|
|
@@ -159,11 +155,11 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
159
155
|
message = message.getMessageText();
|
|
160
156
|
}
|
|
161
157
|
if (diag.getCategory() === ts_morph_1.DiagnosticCategory.Error) {
|
|
162
|
-
console.error("[ERROR] "
|
|
158
|
+
console.error("[ERROR] " + ((_a = diag.getSourceFile()) === null || _a === void 0 ? void 0 : _a.getBaseName()) + " (line " + diag.getLineNumber() + "):", message);
|
|
163
159
|
hasError = true;
|
|
164
160
|
}
|
|
165
161
|
if (diag.getCategory() === ts_morph_1.DiagnosticCategory.Warning) {
|
|
166
|
-
console.warn("[WARNING] "
|
|
162
|
+
console.warn("[WARNING] " + ((_b = diag.getSourceFile()) === null || _b === void 0 ? void 0 : _b.getBaseName()) + " (line " + diag.getLineNumber() + "):", message);
|
|
167
163
|
}
|
|
168
164
|
}
|
|
169
165
|
if (hasError) {
|
|
@@ -187,7 +183,7 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
187
183
|
return __generator(this, function (_a) {
|
|
188
184
|
switch (_a.label) {
|
|
189
185
|
case 0:
|
|
190
|
-
generatedFile = this.createSourceFile(["generatedHandlers.ts"], "// Generated "
|
|
186
|
+
generatedFile = this.createSourceFile(["generatedHandlers.ts"], "// Generated " + new Date() + "\nimport { autoRegisteredHandlers, HttpMethod } from \"@flink-app/flink\";\nexport const handlers = [];\nautoRegisteredHandlers.push(...handlers);\n ");
|
|
191
187
|
handlersArr = generatedFile.getVariableDeclarationOrThrow("handlers").getFirstDescendantByKindOrThrow(ts_morph_1.SyntaxKind.ArrayLiteralExpression);
|
|
192
188
|
return [4 /*yield*/, this.parseHandlerDir(generatedFile, handlersArr)];
|
|
193
189
|
case 1:
|
|
@@ -229,13 +225,13 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
229
225
|
return [3 /*break*/, 3];
|
|
230
226
|
}
|
|
231
227
|
isAutoRegister = this.isAutoRegisterableHandler(sf);
|
|
232
|
-
console.log("Detected handler "
|
|
228
|
+
console.log("Detected handler " + sf.getBaseName() + " " + (!isAutoRegister ? "(requires manual registration)" : ""));
|
|
233
229
|
namespaceImport = sf.getBaseNameWithoutExtension().replace(/\./g, "_") + "_" + i;
|
|
234
230
|
imports.push({
|
|
235
231
|
namespaceImport: namespaceImport,
|
|
236
232
|
moduleSpecifier: generatedFile.getRelativePathAsModuleSpecifierTo(sf),
|
|
237
233
|
});
|
|
238
|
-
assumedHttpMethod =
|
|
234
|
+
assumedHttpMethod = utils_1.getHttpMethodFromHandlerName(sf.getBaseName());
|
|
239
235
|
return [4 /*yield*/, this.extractSchemasFromHandlerSourceFile(sf)];
|
|
240
236
|
case 2:
|
|
241
237
|
schemaTypes = _b.sent();
|
|
@@ -246,34 +242,34 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
246
242
|
declarations: [
|
|
247
243
|
{
|
|
248
244
|
name: "__assumedHttpMethod",
|
|
249
|
-
initializer: "\""
|
|
245
|
+
initializer: "\"" + (assumedHttpMethod || "") + "\"",
|
|
250
246
|
},
|
|
251
247
|
{
|
|
252
248
|
name: "__file",
|
|
253
|
-
initializer: "\""
|
|
249
|
+
initializer: "\"" + sf.getBaseName() + "\"",
|
|
254
250
|
},
|
|
255
251
|
{
|
|
256
252
|
name: "__query",
|
|
257
|
-
initializer: "["
|
|
253
|
+
initializer: "[" + ((schemaTypes === null || schemaTypes === void 0 ? void 0 : schemaTypes.queryMetadata) || [])
|
|
258
254
|
.map(function (_a) {
|
|
259
255
|
var description = _a.description, name = _a.name;
|
|
260
|
-
return "{description: \""
|
|
256
|
+
return "{description: \"" + description + "\", name: \"" + name + "\"}";
|
|
261
257
|
})
|
|
262
|
-
.join(",")
|
|
258
|
+
.join(",") + "]",
|
|
263
259
|
},
|
|
264
260
|
{
|
|
265
261
|
name: "__params",
|
|
266
|
-
initializer: "["
|
|
262
|
+
initializer: "[" + ((schemaTypes === null || schemaTypes === void 0 ? void 0 : schemaTypes.paramsMetadata) || [])
|
|
267
263
|
.map(function (_a) {
|
|
268
264
|
var description = _a.description, name = _a.name;
|
|
269
|
-
return "{description: \""
|
|
265
|
+
return "{description: \"" + description + "\", name: \"" + name + "\"}";
|
|
270
266
|
})
|
|
271
|
-
.join(",")
|
|
267
|
+
.join(",") + "]",
|
|
272
268
|
},
|
|
273
269
|
],
|
|
274
270
|
});
|
|
275
271
|
if (isAutoRegister) {
|
|
276
|
-
handlersArr.insertElement(i, "{handler: "
|
|
272
|
+
handlersArr.insertElement(i, "{handler: " + namespaceImport + ", assumedHttpMethod: " + (assumedHttpMethod ? "HttpMethod." + assumedHttpMethod : undefined) + "}");
|
|
277
273
|
i++;
|
|
278
274
|
}
|
|
279
275
|
if (schemaTypes) {
|
|
@@ -297,7 +293,7 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
297
293
|
return __generator(this, function (_b) {
|
|
298
294
|
switch (_b.label) {
|
|
299
295
|
case 0:
|
|
300
|
-
generatedFile = this.createSourceFile(["generatedRepos.ts"], "// Generated "
|
|
296
|
+
generatedFile = this.createSourceFile(["generatedRepos.ts"], "// Generated " + new Date() + "\n import { autoRegisteredRepos } from \"@flink-app/flink\";\n export const repos = [];\n autoRegisteredRepos.push(...repos);\n ");
|
|
301
297
|
reposArr = generatedFile.getVariableDeclarationOrThrow("repos").getFirstDescendantByKindOrThrow(ts_morph_1.SyntaxKind.ArrayLiteralExpression);
|
|
302
298
|
imports = [];
|
|
303
299
|
i = 0;
|
|
@@ -306,12 +302,12 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
306
302
|
if (!sf.getFilePath().includes("src/repos/")) {
|
|
307
303
|
continue;
|
|
308
304
|
}
|
|
309
|
-
console.log("Detected repo "
|
|
305
|
+
console.log("Detected repo " + sf.getBaseName());
|
|
310
306
|
imports.push({
|
|
311
307
|
defaultImport: sf.getBaseNameWithoutExtension(),
|
|
312
308
|
moduleSpecifier: generatedFile.getRelativePathAsModuleSpecifierTo(sf),
|
|
313
309
|
});
|
|
314
|
-
reposArr.insertElement(i, "{collectionName: \""
|
|
310
|
+
reposArr.insertElement(i, "{collectionName: \"" + utils_1.getCollectionNameForRepo(sf.getBaseName()) + "\", repoInstanceName: \"" + utils_1.getRepoInstanceName(sf.getBaseName()) + "\", Repo: " + sf.getBaseNameWithoutExtension() + "}");
|
|
315
311
|
i++;
|
|
316
312
|
}
|
|
317
313
|
generatedFile.addImportDeclarations(imports);
|
|
@@ -338,10 +334,10 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
338
334
|
switch (_a.label) {
|
|
339
335
|
case 0:
|
|
340
336
|
if (!this.project.getSourceFile(function (sf) { return sf.getFilePath().endsWith(appEntryScript); })) {
|
|
341
|
-
console.error("Cannot find entry script '"
|
|
337
|
+
console.error("Cannot find entry script '" + appEntryScript + "'");
|
|
342
338
|
return [2 /*return*/, process.exit(1)];
|
|
343
339
|
}
|
|
344
|
-
sf = this.createSourceFile(["start.ts"], "// Generated "
|
|
340
|
+
sf = this.createSourceFile(["start.ts"], "// Generated " + new Date() + "\nimport \"./generatedHandlers\";\nimport \"./generatedRepos\";\nimport \"./generatedJobs\";\nimport \".." + appEntryScript.replace(/\.ts/g, "") + "\";\n");
|
|
345
341
|
return [4 /*yield*/, sf.save()];
|
|
346
342
|
case 1:
|
|
347
343
|
_a.sent();
|
|
@@ -351,7 +347,7 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
351
347
|
});
|
|
352
348
|
};
|
|
353
349
|
TypeScriptCompiler.prototype.createSourceFile = function (filename, contents) {
|
|
354
|
-
return this.project.createSourceFile(path_1.join.apply(void 0, __spreadArray([this.cwd, ".flink"], filename
|
|
350
|
+
return this.project.createSourceFile(path_1.join.apply(void 0, __spreadArray([this.cwd, ".flink"], filename)), contents, {
|
|
355
351
|
overwrite: true,
|
|
356
352
|
});
|
|
357
353
|
};
|
|
@@ -383,13 +379,13 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
383
379
|
return __awaiter(this, void 0, void 0, function () {
|
|
384
380
|
var defaultExport, handlerTypeRef;
|
|
385
381
|
return __generator(this, function (_a) {
|
|
386
|
-
defaultExport =
|
|
382
|
+
defaultExport = TypeScriptUtils_1.getDefaultExport(handlerSourceFile);
|
|
387
383
|
if (defaultExport) {
|
|
388
384
|
handlerTypeRef = defaultExport.getFirstDescendantByKindOrThrow(ts_morph_1.SyntaxKind.TypeReference);
|
|
389
385
|
return [2 /*return*/, this.extractSchemaTypeFromHandler(handlerTypeRef)];
|
|
390
386
|
}
|
|
391
387
|
else {
|
|
392
|
-
console.warn("Handler "
|
|
388
|
+
console.warn("Handler " + handlerSourceFile.getBaseName() + " is missing default exported handler function");
|
|
393
389
|
}
|
|
394
390
|
return [2 /*return*/];
|
|
395
391
|
});
|
|
@@ -405,25 +401,25 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
405
401
|
}
|
|
406
402
|
handlerFileName = handlerFile.getBaseNameWithoutExtension().replace(/\./g, "_");
|
|
407
403
|
generatedSchemaInterfaceStr = "";
|
|
408
|
-
schemaInterfaceName =
|
|
404
|
+
schemaInterfaceName = handlerFileName + "_" + suffix;
|
|
409
405
|
if (schema.isInterface()) {
|
|
410
406
|
schemaSymbol = schema.getSymbolOrThrow();
|
|
411
|
-
interfaceName =
|
|
407
|
+
interfaceName = TypeScriptUtils_1.getInterfaceName(schemaSymbol);
|
|
412
408
|
declaration = schemaSymbol.getDeclarations()[0];
|
|
413
409
|
if (declaration.getSourceFile() === handlerFile) {
|
|
414
410
|
// Interface is declared within handler file
|
|
415
|
-
generatedSchemaInterfaceStr = "export interface "
|
|
411
|
+
generatedSchemaInterfaceStr = "export interface " + schemaInterfaceName + " { \n " + schema
|
|
416
412
|
.getProperties()
|
|
417
413
|
.map(function (p) { return p.getValueDeclarationOrThrow().getText(); })
|
|
418
|
-
.join("\n")
|
|
419
|
-
for (_i = 0, _a =
|
|
414
|
+
.join("\n") + "\n }";
|
|
415
|
+
for (_i = 0, _a = TypeScriptUtils_1.getTypesToImport(declaration); _i < _a.length; _i++) {
|
|
420
416
|
typeToImport = _a[_i];
|
|
421
417
|
this.tsSchemasSymbolsToImports.push(typeToImport.getSymbolOrThrow().getDeclaredType().getSymbolOrThrow());
|
|
422
418
|
}
|
|
423
419
|
}
|
|
424
420
|
else {
|
|
425
421
|
// Interface is imported from other file
|
|
426
|
-
generatedSchemaInterfaceStr = "export interface "
|
|
422
|
+
generatedSchemaInterfaceStr = "export interface " + schemaInterfaceName + " extends " + interfaceName + " {}";
|
|
427
423
|
this.tsSchemasSymbolsToImports.push(schemaSymbol);
|
|
428
424
|
}
|
|
429
425
|
}
|
|
@@ -433,7 +429,7 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
433
429
|
interfaceName = schemaSymbol.getEscapedName();
|
|
434
430
|
declaration = schemaSymbol.getDeclarations()[0];
|
|
435
431
|
if (declaration.getSourceFile() !== handlerFile) {
|
|
436
|
-
generatedSchemaInterfaceStr = "export interface "
|
|
432
|
+
generatedSchemaInterfaceStr = "export interface " + schemaInterfaceName + " extends Array<" + interfaceName + "> {}";
|
|
437
433
|
this.tsSchemasSymbolsToImports.push(schemaSymbol);
|
|
438
434
|
}
|
|
439
435
|
else {
|
|
@@ -442,12 +438,12 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
442
438
|
.getProperties()
|
|
443
439
|
.map(function (p) { return p.getValueDeclarationOrThrow().getText(); })
|
|
444
440
|
.join(" ");
|
|
445
|
-
generatedSchemaInterfaceStr = "export interface "
|
|
441
|
+
generatedSchemaInterfaceStr = "export interface " + schemaInterfaceName + " extends Array<{" + props + "}> {}";
|
|
446
442
|
}
|
|
447
443
|
else {
|
|
448
|
-
generatedSchemaInterfaceStr = "export interface "
|
|
444
|
+
generatedSchemaInterfaceStr = "export interface " + schemaInterfaceName + " extends Array<" + declaration.getText() + "> {}";
|
|
449
445
|
}
|
|
450
|
-
for (_b = 0, _c =
|
|
446
|
+
for (_b = 0, _c = TypeScriptUtils_1.getTypesToImport(declaration); _b < _c.length; _b++) {
|
|
451
447
|
typeToImport = _c[_b];
|
|
452
448
|
this.tsSchemasSymbolsToImports.push(typeToImport.getSymbolOrThrow().getDeclaredType().getSymbolOrThrow());
|
|
453
449
|
}
|
|
@@ -461,10 +457,10 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
461
457
|
typeRefIdentifiers.forEach(function (tr) {
|
|
462
458
|
_this.tsSchemasSymbolsToImports.push(tr.getSymbolOrThrow().getDeclaredType().getSymbolOrThrow());
|
|
463
459
|
});
|
|
464
|
-
generatedSchemaInterfaceStr = "export interface "
|
|
460
|
+
generatedSchemaInterfaceStr = "export interface " + schemaInterfaceName + " { " + schema
|
|
465
461
|
.getProperties()
|
|
466
462
|
.map(function (p) { return p.getValueDeclarationOrThrow().getText(); })
|
|
467
|
-
.join("\n")
|
|
463
|
+
.join("\n") + " }";
|
|
468
464
|
}
|
|
469
465
|
else {
|
|
470
466
|
console.log("[WARN] Unknown schema type", schema.getText());
|
|
@@ -482,8 +478,8 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
482
478
|
// expose: "",
|
|
483
479
|
// topRef: false,
|
|
484
480
|
};
|
|
485
|
-
var formatter =
|
|
486
|
-
var parser =
|
|
481
|
+
var formatter = ts_json_schema_generator_1.createFormatter(conf);
|
|
482
|
+
var parser = ts_json_schema_generator_1.createParser(this.project.getProgram().compilerObject, conf);
|
|
487
483
|
var generator = new ts_json_schema_generator_1.SchemaGenerator(this.project.getProgram().compilerObject, parser, formatter, conf);
|
|
488
484
|
return generator;
|
|
489
485
|
};
|
|
@@ -513,8 +509,8 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
513
509
|
$ref: "#/definitions/Schemas",
|
|
514
510
|
definitions: {},
|
|
515
511
|
});
|
|
516
|
-
filePath =
|
|
517
|
-
return [4 /*yield*/,
|
|
512
|
+
filePath = path_1.join(this.cwd, ".flink", "schemas", "schemas.json");
|
|
513
|
+
return [4 /*yield*/, FsUtils_1.writeJsonFile(filePath, mergedSchemas)];
|
|
518
514
|
case 1:
|
|
519
515
|
_b.sent();
|
|
520
516
|
this.project.addSourceFileAtPath(filePath);
|
|
@@ -553,14 +549,14 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
553
549
|
query = handlerTypeArgs[3];
|
|
554
550
|
}
|
|
555
551
|
else {
|
|
556
|
-
throw new Error("Unknown handler type "
|
|
552
|
+
throw new Error("Unknown handler type " + handlerType + " in " + handlerTypeReference.getSourceFile().getBaseName() + " - should be Handler or GetHandler");
|
|
557
553
|
}
|
|
558
554
|
sf = handlerTypeReference.getSourceFile();
|
|
559
555
|
createReqSchemaPromise = reqSchema
|
|
560
|
-
? this.saveIntermediateTsSchema(reqSchema, sf,
|
|
556
|
+
? this.saveIntermediateTsSchema(reqSchema, sf, handlerTypeReference.getStartLineNumber() + "_ReqSchema")
|
|
561
557
|
: Promise.resolve("");
|
|
562
558
|
createResSchemaPromise = resSchema
|
|
563
|
-
? this.saveIntermediateTsSchema(resSchema, sf,
|
|
559
|
+
? this.saveIntermediateTsSchema(resSchema, sf, handlerTypeReference.getStartLineNumber() + "_ResSchema")
|
|
564
560
|
: Promise.resolve("");
|
|
565
561
|
return [4 /*yield*/, Promise.all([createReqSchemaPromise, createResSchemaPromise])];
|
|
566
562
|
case 1:
|
|
@@ -568,8 +564,8 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
568
564
|
return [2 /*return*/, {
|
|
569
565
|
reqSchemaType: reqSchemaType,
|
|
570
566
|
resSchemaType: resSchemaType,
|
|
571
|
-
queryMetadata:
|
|
572
|
-
paramsMetadata:
|
|
567
|
+
queryMetadata: TypeScriptUtils_1.getTypeMetadata(query),
|
|
568
|
+
paramsMetadata: TypeScriptUtils_1.getTypeMetadata(params),
|
|
573
569
|
}];
|
|
574
570
|
}
|
|
575
571
|
});
|
|
@@ -583,8 +579,8 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
583
579
|
return __awaiter(this, void 0, void 0, function () {
|
|
584
580
|
var schemaSourceFile;
|
|
585
581
|
return __generator(this, function (_a) {
|
|
586
|
-
schemaSourceFile = this.createSourceFile(["schemas", "schemas.ts"], "// Generated "
|
|
587
|
-
|
|
582
|
+
schemaSourceFile = this.createSourceFile(["schemas", "schemas.ts"], "// Generated " + new Date() + "\n" + this.parsedTsSchemas.join("\n\n"));
|
|
583
|
+
TypeScriptUtils_1.addImports(schemaSourceFile, this.tsSchemasSymbolsToImports);
|
|
588
584
|
return [2 /*return*/, schemaSourceFile.save()];
|
|
589
585
|
});
|
|
590
586
|
});
|
|
@@ -616,15 +612,15 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
616
612
|
for (var _i = 0, handlers_1 = handlers; _i < handlers_1.length; _i++) {
|
|
617
613
|
var _a = handlers_1[_i], sourceFile = _a.sourceFile, reqSchemaType = _a.reqSchemaType, resSchemaType = _a.resSchemaType;
|
|
618
614
|
if (reqSchemaType && !jsonSchemaDefs[reqSchemaType]) {
|
|
619
|
-
console.error("Handler "
|
|
615
|
+
console.error("Handler " + sourceFile.getBaseName + " has request schema\u00A0(" + reqSchemaType + ") defined, but JSON schema has been generated");
|
|
620
616
|
continue;
|
|
621
617
|
}
|
|
622
618
|
if (resSchemaType && !jsonSchemaDefs[resSchemaType]) {
|
|
623
|
-
console.error("Handler "
|
|
619
|
+
console.error("Handler " + sourceFile.getBaseName + " has response schema\u00A0(" + resSchemaType + ") defined, but JSON schema has been generated");
|
|
624
620
|
continue;
|
|
625
621
|
}
|
|
626
|
-
var reqJsonSchema = JSON.stringify(reqSchemaType ?
|
|
627
|
-
var resJsonSchema = JSON.stringify(resSchemaType ?
|
|
622
|
+
var reqJsonSchema = JSON.stringify(reqSchemaType ? utils_1.deRefSchema(jsonSchemaDefs[reqSchemaType], jsonSchemas) : undefined);
|
|
623
|
+
var resJsonSchema = JSON.stringify(resSchemaType ? utils_1.deRefSchema(jsonSchemaDefs[resSchemaType], jsonSchemas) : undefined);
|
|
628
624
|
sourceFile.addVariableStatement({
|
|
629
625
|
declarationKind: ts_morph_1.VariableDeclarationKind.Const,
|
|
630
626
|
isExported: true,
|
|
@@ -632,7 +628,7 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
632
628
|
{
|
|
633
629
|
name: "__schemas",
|
|
634
630
|
type: "any",
|
|
635
|
-
initializer: "{ reqSchema: "
|
|
631
|
+
initializer: "{ reqSchema: " + reqJsonSchema + ", resSchema: " + resJsonSchema + " }",
|
|
636
632
|
},
|
|
637
633
|
],
|
|
638
634
|
});
|
|
@@ -647,7 +643,7 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
647
643
|
return __generator(this, function (_b) {
|
|
648
644
|
switch (_b.label) {
|
|
649
645
|
case 0:
|
|
650
|
-
generatedFile = this.createSourceFile(["generatedJobs.ts"], "// Generated "
|
|
646
|
+
generatedFile = this.createSourceFile(["generatedJobs.ts"], "// Generated " + new Date() + "\nimport { autoRegisteredJobs } from \"@flink-app/flink\";\nexport const jobs = [];\nautoRegisteredJobs.push(...jobs);\n ");
|
|
651
647
|
jobsArr = generatedFile.getVariableDeclarationOrThrow("jobs").getFirstDescendantByKindOrThrow(ts_morph_1.SyntaxKind.ArrayLiteralExpression);
|
|
652
648
|
imports = [];
|
|
653
649
|
i = 0;
|
|
@@ -656,7 +652,7 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
656
652
|
if (!sf.getFilePath().includes("src/jobs/")) {
|
|
657
653
|
continue;
|
|
658
654
|
}
|
|
659
|
-
console.log("Detected job "
|
|
655
|
+
console.log("Detected job " + sf.getBaseName());
|
|
660
656
|
namespaceImport = sf.getBaseNameWithoutExtension().replace(/\./g, "_") + "_" + i;
|
|
661
657
|
imports.push({
|
|
662
658
|
namespaceImport: namespaceImport,
|
|
@@ -669,7 +665,7 @@ var TypeScriptCompiler = /** @class */ (function () {
|
|
|
669
665
|
declarations: [
|
|
670
666
|
{
|
|
671
667
|
name: "__file",
|
|
672
|
-
initializer: "\""
|
|
668
|
+
initializer: "\"" + sf.getBaseName() + "\"",
|
|
673
669
|
},
|
|
674
670
|
],
|
|
675
671
|
});
|
|
@@ -183,7 +183,7 @@ function getTypeMetadata(type) {
|
|
|
183
183
|
.getDescendantsOfKind(ts_morph_1.SyntaxKind.PropertySignature)
|
|
184
184
|
.map(function (prop) {
|
|
185
185
|
var _a;
|
|
186
|
-
var description =
|
|
186
|
+
var description = utils_1.getJsDocComment(((_a = prop.getLeadingCommentRanges()[0]) === null || _a === void 0 ? void 0 : _a.getText()) || "");
|
|
187
187
|
return {
|
|
188
188
|
description: description,
|
|
189
189
|
name: prop.getName(),
|
package/dist/src/index.js
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
9
5
|
}) : (function(o, m, k, k2) {
|
|
10
6
|
if (k2 === undefined) k2 = k;
|
|
11
7
|
o[k2] = m[k];
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
var mock_json_schema_1 = require("mock-json-schema");
|
|
4
4
|
var generateMockData = function (schema) {
|
|
5
5
|
// TODO: mock-json-schema does not seem to handle `examples` array, might want to switch to json-schema-faker
|
|
6
|
-
var mockData =
|
|
6
|
+
var mockData = mock_json_schema_1.mock(schema);
|
|
7
7
|
return mockData;
|
|
8
8
|
};
|
|
9
9
|
exports.default = generateMockData;
|