@subsquid/openreader 0.0.0
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/README.md +34 -0
- package/dist/gql/opencrud.d.ts +4 -0
- package/dist/gql/opencrud.js +301 -0
- package/dist/gql/opencrud.js.map +1 -0
- package/dist/gql/schema.d.ts +4 -0
- package/dist/gql/schema.js +271 -0
- package/dist/gql/schema.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.js +97 -0
- package/dist/main.js.map +1 -0
- package/dist/model.d.ts +70 -0
- package/dist/model.js +3 -0
- package/dist/model.js.map +1 -0
- package/dist/model.tools.d.ts +9 -0
- package/dist/model.tools.js +120 -0
- package/dist/model.tools.js.map +1 -0
- package/dist/orderBy.d.ts +16 -0
- package/dist/orderBy.js +80 -0
- package/dist/orderBy.js.map +1 -0
- package/dist/queryBuilder.d.ts +52 -0
- package/dist/queryBuilder.js +605 -0
- package/dist/queryBuilder.js.map +1 -0
- package/dist/relayConnection.d.ts +36 -0
- package/dist/relayConnection.js +43 -0
- package/dist/relayConnection.js.map +1 -0
- package/dist/requestedFields.d.ts +32 -0
- package/dist/requestedFields.js +172 -0
- package/dist/requestedFields.js.map +1 -0
- package/dist/resolver.d.ts +8 -0
- package/dist/resolver.js +142 -0
- package/dist/resolver.js.map +1 -0
- package/dist/scalars.d.ts +33 -0
- package/dist/scalars.js +239 -0
- package/dist/scalars.js.map +1 -0
- package/dist/server.d.ts +25 -0
- package/dist/server.js +119 -0
- package/dist/server.js.map +1 -0
- package/dist/util.d.ts +19 -0
- package/dist/util.js +89 -0
- package/dist/util.js.map +1 -0
- package/dist/where.d.ts +8 -0
- package/dist/where.js +96 -0
- package/dist/where.js.map +1 -0
- package/package.json +39 -0
package/dist/main.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
6
|
+
}) : (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
o[k2] = m[k];
|
|
9
|
+
}));
|
|
10
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
11
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
12
|
+
}) : function(o, v) {
|
|
13
|
+
o["default"] = v;
|
|
14
|
+
});
|
|
15
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
16
|
+
if (mod && mod.__esModule) return mod;
|
|
17
|
+
var result = {};
|
|
18
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
19
|
+
__setModuleDefault(result, mod);
|
|
20
|
+
return result;
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.readDbConfig = void 0;
|
|
24
|
+
const fs = __importStar(require("fs"));
|
|
25
|
+
const graphql_1 = require("graphql");
|
|
26
|
+
const pg_1 = require("pg");
|
|
27
|
+
const schema_1 = require("./gql/schema");
|
|
28
|
+
const server_1 = require("./server");
|
|
29
|
+
function main() {
|
|
30
|
+
let args = process.argv.slice(2);
|
|
31
|
+
if (args.indexOf('--help') >= 0) {
|
|
32
|
+
help();
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
if (args.length != 1) {
|
|
36
|
+
help();
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
let schema = (0, schema_1.buildSchema)(readSchemaDocument(args[0]));
|
|
40
|
+
let errors = (0, graphql_1.validateSchema)(schema).filter(err => !/query root/i.test(err.message));
|
|
41
|
+
if (errors.length > 0) {
|
|
42
|
+
errors.forEach(err => console.log(err));
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
let db = new pg_1.Pool(readDbConfig());
|
|
46
|
+
let port = process.env.GRAPHQL_SERVER_PORT || 3000;
|
|
47
|
+
new server_1.Server({ schema, db }).listen(port).then(() => {
|
|
48
|
+
console.log('OpenReader is listening on port ' + port);
|
|
49
|
+
}, err => {
|
|
50
|
+
console.error(err);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function readDbConfig() {
|
|
55
|
+
let db = {};
|
|
56
|
+
if (process.env.DB_HOST) {
|
|
57
|
+
db.host = process.env.DB_HOST;
|
|
58
|
+
}
|
|
59
|
+
if (process.env.DB_PORT) {
|
|
60
|
+
db.port = parseInt(process.env.DB_PORT);
|
|
61
|
+
}
|
|
62
|
+
if (process.env.DB_NAME) {
|
|
63
|
+
db.database = process.env.DB_NAME;
|
|
64
|
+
}
|
|
65
|
+
if (process.env.DB_USER) {
|
|
66
|
+
db.user = process.env.DB_USER;
|
|
67
|
+
}
|
|
68
|
+
if (process.env.DB_PASS) {
|
|
69
|
+
db.password = process.env.DB_PASS;
|
|
70
|
+
}
|
|
71
|
+
return db;
|
|
72
|
+
}
|
|
73
|
+
exports.readDbConfig = readDbConfig;
|
|
74
|
+
function readSchemaDocument(file) {
|
|
75
|
+
let src = new graphql_1.Source(fs.readFileSync(file, 'utf-8'), file);
|
|
76
|
+
return (0, graphql_1.parse)(src);
|
|
77
|
+
}
|
|
78
|
+
function help() {
|
|
79
|
+
console.error(`
|
|
80
|
+
Usage: openreader SCHEMA
|
|
81
|
+
|
|
82
|
+
OpenCRUD compatible GraphQL server.
|
|
83
|
+
|
|
84
|
+
Can be configured using hydra environment variables:
|
|
85
|
+
|
|
86
|
+
DB_NAME
|
|
87
|
+
DB_USER
|
|
88
|
+
DB_PASS
|
|
89
|
+
DB_HOST
|
|
90
|
+
DB_PORT
|
|
91
|
+
GRAPHQL_SERVER_PORT
|
|
92
|
+
`);
|
|
93
|
+
}
|
|
94
|
+
if (require.main === module) {
|
|
95
|
+
main();
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAEA,uCAAwB;AACxB,qCAAqD;AACrD,2BAAmC;AACnC,yCAAwC;AACxC,qCAA+B;AAG/B,SAAS,IAAI;IACT,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAEhC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;QAC7B,IAAI,EAAE,CAAA;QACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;KAClB;IAED,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;QAClB,IAAI,EAAE,CAAA;QACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;KAClB;IAED,IAAI,MAAM,GAAG,IAAA,oBAAW,EACpB,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAC9B,CAAA;IAED,IAAI,MAAM,GAAG,IAAA,wBAAc,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IACnF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QACnB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;KAClB;IAED,IAAI,EAAE,GAAG,IAAI,SAAI,CAAC,YAAY,EAAE,CAAC,CAAA;IACjC,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAA;IAElD,IAAI,eAAM,CAAC,EAAC,MAAM,EAAE,EAAE,EAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CACtC,GAAG,EAAE;QACD,OAAO,CAAC,GAAG,CAAC,kCAAkC,GAAG,IAAI,CAAC,CAAA;IAC1D,CAAC,EACD,GAAG,CAAC,EAAE;QACF,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC,CACJ,CAAA;AACL,CAAC;AAGD,SAAgB,YAAY;IACxB,IAAI,EAAE,GAAe,EAAE,CAAA;IACvB,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;QACrB,EAAE,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAA;KAChC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;QACrB,EAAE,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;KAC1C;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;QACrB,EAAE,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAA;KACpC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;QACrB,EAAE,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAA;KAChC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;QACrB,EAAE,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAA;KACpC;IACD,OAAO,EAAE,CAAA;AACb,CAAC;AAlBD,oCAkBC;AAGD,SAAS,kBAAkB,CAAC,IAAY;IACpC,IAAI,GAAG,GAAG,IAAI,gBAAM,CAChB,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,EAC9B,IAAI,CACP,CAAA;IACD,OAAO,IAAA,eAAK,EAAC,GAAG,CAAC,CAAA;AACrB,CAAC;AAGD,SAAS,IAAI;IACT,OAAO,CAAC,KAAK,CAAC;;;;;;;;;;;;;CAajB,CAAC,CAAA;AACF,CAAC;AAGD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;IACzB,IAAI,EAAE,CAAA;CACT"}
|
package/dist/model.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export declare type Name = string;
|
|
2
|
+
export declare type Model = Record<Name, Entity | JsonObject | Interface | Union | Enum | FTS_Query>;
|
|
3
|
+
export interface Entity extends TypeMeta {
|
|
4
|
+
kind: 'entity';
|
|
5
|
+
properties: Record<Name, Prop>;
|
|
6
|
+
interfaces?: Name[];
|
|
7
|
+
}
|
|
8
|
+
export interface JsonObject extends TypeMeta {
|
|
9
|
+
kind: 'object';
|
|
10
|
+
properties: Record<Name, Prop>;
|
|
11
|
+
interfaces?: Name[];
|
|
12
|
+
}
|
|
13
|
+
export interface Interface extends TypeMeta {
|
|
14
|
+
kind: 'interface';
|
|
15
|
+
properties: Record<Name, Prop>;
|
|
16
|
+
}
|
|
17
|
+
export interface Union extends TypeMeta {
|
|
18
|
+
kind: 'union';
|
|
19
|
+
variants: Name[];
|
|
20
|
+
}
|
|
21
|
+
export interface Enum extends TypeMeta {
|
|
22
|
+
kind: 'enum';
|
|
23
|
+
values: Record<string, {}>;
|
|
24
|
+
}
|
|
25
|
+
export interface TypeMeta {
|
|
26
|
+
description?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface Prop {
|
|
29
|
+
type: PropType;
|
|
30
|
+
nullable: boolean;
|
|
31
|
+
description?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare type PropType = ScalarPropType | EnumPropType | ListPropType | ObjectPropType | UnionPropType | FkPropType | ListRelPropType;
|
|
34
|
+
export interface ScalarPropType {
|
|
35
|
+
kind: 'scalar';
|
|
36
|
+
name: Name;
|
|
37
|
+
}
|
|
38
|
+
export interface EnumPropType {
|
|
39
|
+
kind: 'enum';
|
|
40
|
+
name: Name;
|
|
41
|
+
}
|
|
42
|
+
export interface ObjectPropType {
|
|
43
|
+
kind: 'object';
|
|
44
|
+
name: Name;
|
|
45
|
+
}
|
|
46
|
+
export interface UnionPropType {
|
|
47
|
+
kind: 'union';
|
|
48
|
+
name: Name;
|
|
49
|
+
}
|
|
50
|
+
export interface ListPropType {
|
|
51
|
+
kind: 'list';
|
|
52
|
+
item: Prop;
|
|
53
|
+
}
|
|
54
|
+
export interface FkPropType {
|
|
55
|
+
kind: 'fk';
|
|
56
|
+
foreignEntity: Name;
|
|
57
|
+
}
|
|
58
|
+
export interface ListRelPropType {
|
|
59
|
+
kind: 'list-relation';
|
|
60
|
+
entity: Name;
|
|
61
|
+
field: Name;
|
|
62
|
+
}
|
|
63
|
+
export interface FTS_Query {
|
|
64
|
+
kind: 'fts';
|
|
65
|
+
sources: FTS_Source[];
|
|
66
|
+
}
|
|
67
|
+
export interface FTS_Source {
|
|
68
|
+
entity: Name;
|
|
69
|
+
fields: Name[];
|
|
70
|
+
}
|
package/dist/model.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Entity, FTS_Query, JsonObject, Model, PropType } from "./model";
|
|
2
|
+
export declare function getUnionProps(model: Model, unionName: string): JsonObject;
|
|
3
|
+
export declare function buildUnionProps(model: Model, unionName: string): JsonObject;
|
|
4
|
+
export declare function validateModel(model: Model): void;
|
|
5
|
+
export declare function validateNames(model: Model): void;
|
|
6
|
+
export declare function validateUnionTypes(model: Model): void;
|
|
7
|
+
export declare function propTypeEquals(a: PropType, b: PropType): boolean;
|
|
8
|
+
export declare function getEntity(model: Model, name: string): Entity;
|
|
9
|
+
export declare function getFtsQuery(model: Model, name: string): FTS_Query;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getFtsQuery = exports.getEntity = exports.propTypeEquals = exports.validateUnionTypes = exports.validateNames = exports.validateModel = exports.buildUnionProps = exports.getUnionProps = void 0;
|
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
const UNION_MAPS = new WeakMap();
|
|
9
|
+
function getUnionProps(model, unionName) {
|
|
10
|
+
let map = UNION_MAPS.get(model);
|
|
11
|
+
if (map == null) {
|
|
12
|
+
map = {};
|
|
13
|
+
UNION_MAPS.set(model, map);
|
|
14
|
+
}
|
|
15
|
+
if (map[unionName])
|
|
16
|
+
return map[unionName];
|
|
17
|
+
return map[unionName] = buildUnionProps(model, unionName);
|
|
18
|
+
}
|
|
19
|
+
exports.getUnionProps = getUnionProps;
|
|
20
|
+
function buildUnionProps(model, unionName) {
|
|
21
|
+
let union = model[unionName];
|
|
22
|
+
(0, assert_1.default)(union.kind == 'union');
|
|
23
|
+
let properties = {};
|
|
24
|
+
for (let i = 0; i < union.variants.length; i++) {
|
|
25
|
+
let objectName = union.variants[i];
|
|
26
|
+
let object = model[objectName];
|
|
27
|
+
(0, assert_1.default)(object.kind == 'object');
|
|
28
|
+
Object.assign(properties, object.properties);
|
|
29
|
+
}
|
|
30
|
+
properties.isTypeOf = {
|
|
31
|
+
type: { kind: 'scalar', name: 'String' },
|
|
32
|
+
nullable: false
|
|
33
|
+
};
|
|
34
|
+
return { kind: 'object', properties };
|
|
35
|
+
}
|
|
36
|
+
exports.buildUnionProps = buildUnionProps;
|
|
37
|
+
function validateModel(model) {
|
|
38
|
+
validateNames(model);
|
|
39
|
+
validateUnionTypes(model);
|
|
40
|
+
}
|
|
41
|
+
exports.validateModel = validateModel;
|
|
42
|
+
const TYPE_NAME_REGEX = /^[A-Z][a-zA-Z0-9]*$/;
|
|
43
|
+
const PROP_NAME_REGEX = /^[a-z][a-zA-Z0-9]*$/;
|
|
44
|
+
function validateNames(model) {
|
|
45
|
+
for (let name in model) {
|
|
46
|
+
let item = model[name];
|
|
47
|
+
if (item.kind == 'fts') {
|
|
48
|
+
if (!PROP_NAME_REGEX.test(name)) {
|
|
49
|
+
throw new Error(`Invalid fulltext search name: ${name}. It must match ${PROP_NAME_REGEX}.`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
if (!TYPE_NAME_REGEX.test(name)) {
|
|
54
|
+
throw new Error(`Invalid ${item.kind} name: ${name}. It must match ${TYPE_NAME_REGEX}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
switch (item.kind) {
|
|
58
|
+
case 'entity':
|
|
59
|
+
case 'object':
|
|
60
|
+
case 'interface':
|
|
61
|
+
for (let prop in item.properties) {
|
|
62
|
+
if (!PROP_NAME_REGEX.test(prop)) {
|
|
63
|
+
throw new Error(`Type ${name} has a property with invalid name: ${prop}. It must match ${PROP_NAME_REGEX}.`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.validateNames = validateNames;
|
|
71
|
+
function validateUnionTypes(model) {
|
|
72
|
+
for (let key in model) {
|
|
73
|
+
let item = model[key];
|
|
74
|
+
if (item.kind != 'union')
|
|
75
|
+
continue;
|
|
76
|
+
let properties = {};
|
|
77
|
+
item.variants.forEach(objectName => {
|
|
78
|
+
let object = model[objectName];
|
|
79
|
+
(0, assert_1.default)(object.kind == 'object');
|
|
80
|
+
for (let propName in object.properties) {
|
|
81
|
+
let rec = properties[propName];
|
|
82
|
+
if (rec && !propTypeEquals(rec.type, object.properties[propName].type)) {
|
|
83
|
+
throw new Error(`${rec.objectName} and ${objectName} variants of union ${key} both have property '${propName}', but types of ${rec.objectName}.${propName} and ${objectName}.${propName} are different.`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
properties[propName] = { objectName, type: object.properties[propName].type };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.validateUnionTypes = validateUnionTypes;
|
|
93
|
+
function propTypeEquals(a, b) {
|
|
94
|
+
if (a.kind != b.kind)
|
|
95
|
+
return false;
|
|
96
|
+
if (a.kind == 'list')
|
|
97
|
+
return propTypeEquals(a.item.type, b.item.type);
|
|
98
|
+
switch (a.kind) {
|
|
99
|
+
case 'fk':
|
|
100
|
+
return a.foreignEntity == b.foreignEntity;
|
|
101
|
+
case 'list-relation':
|
|
102
|
+
return a.entity == b.entity && a.field == b.field;
|
|
103
|
+
default:
|
|
104
|
+
return a.name == b.name;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.propTypeEquals = propTypeEquals;
|
|
108
|
+
function getEntity(model, name) {
|
|
109
|
+
let entity = model[name];
|
|
110
|
+
(0, assert_1.default)(entity.kind == 'entity');
|
|
111
|
+
return entity;
|
|
112
|
+
}
|
|
113
|
+
exports.getEntity = getEntity;
|
|
114
|
+
function getFtsQuery(model, name) {
|
|
115
|
+
let query = model[name];
|
|
116
|
+
(0, assert_1.default)(query.kind == 'fts');
|
|
117
|
+
return query;
|
|
118
|
+
}
|
|
119
|
+
exports.getFtsQuery = getFtsQuery;
|
|
120
|
+
//# sourceMappingURL=model.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.tools.js","sourceRoot":"","sources":["../src/model.tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Model } from "./model";
|
|
2
|
+
export declare type SortOrder = 'ASC' | 'DESC';
|
|
3
|
+
export interface OrderBy {
|
|
4
|
+
[field: string]: SortOrder | OrderBy;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* OpenCRUD orderBy enum value (e.g. foo_ASC)
|
|
8
|
+
*/
|
|
9
|
+
export declare type OpenCrudOrderByValue = string;
|
|
10
|
+
/**
|
|
11
|
+
* A mapping between OpenCRUD enum variants and OrderBy specs
|
|
12
|
+
*/
|
|
13
|
+
export declare type OpenCrud_OrderBy_Mapping = ReadonlyMap<OpenCrudOrderByValue, OrderBy>;
|
|
14
|
+
export declare function getOrderByMapping(model: Model, entityName: string): OpenCrud_OrderBy_Mapping;
|
|
15
|
+
export declare function parseOrderBy(model: Model, entityName: string, input: OpenCrudOrderByValue[]): OrderBy;
|
|
16
|
+
export declare function mergeOrderBy(list: OrderBy[]): OrderBy;
|
package/dist/orderBy.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.mergeOrderBy = exports.parseOrderBy = exports.getOrderByMapping = void 0;
|
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
const model_tools_1 = require("./model.tools");
|
|
9
|
+
const MAPPING_CACHE = new WeakMap();
|
|
10
|
+
function getOrderByMapping(model, entityName) {
|
|
11
|
+
let cache = MAPPING_CACHE.get(model);
|
|
12
|
+
if (cache == null) {
|
|
13
|
+
cache = {};
|
|
14
|
+
MAPPING_CACHE.set(model, cache);
|
|
15
|
+
}
|
|
16
|
+
if (cache[entityName])
|
|
17
|
+
return cache[entityName];
|
|
18
|
+
return cache[entityName] = buildOrderByMapping(model, entityName, 2);
|
|
19
|
+
}
|
|
20
|
+
exports.getOrderByMapping = getOrderByMapping;
|
|
21
|
+
function buildOrderByMapping(model, typeName, depth) {
|
|
22
|
+
if (depth <= 0)
|
|
23
|
+
return new Map();
|
|
24
|
+
let object = model[typeName];
|
|
25
|
+
if (object.kind == 'union') {
|
|
26
|
+
object = (0, model_tools_1.getUnionProps)(model, typeName);
|
|
27
|
+
}
|
|
28
|
+
(0, assert_1.default)(object.kind == 'entity' || object.kind == 'object');
|
|
29
|
+
let m = new Map();
|
|
30
|
+
for (let key in object.properties) {
|
|
31
|
+
let propType = object.properties[key].type;
|
|
32
|
+
switch (propType.kind) {
|
|
33
|
+
case 'scalar':
|
|
34
|
+
case 'enum':
|
|
35
|
+
m.set(key + '_ASC', { [key]: 'ASC' });
|
|
36
|
+
m.set(key + '_DESC', { [key]: 'DESC' });
|
|
37
|
+
break;
|
|
38
|
+
case 'object':
|
|
39
|
+
case 'union':
|
|
40
|
+
for (let [name, spec] of buildOrderByMapping(model, propType.name, depth - 1)) {
|
|
41
|
+
m.set(key + '_' + name, { [key]: spec });
|
|
42
|
+
}
|
|
43
|
+
break;
|
|
44
|
+
case 'fk':
|
|
45
|
+
for (let [name, spec] of buildOrderByMapping(model, propType.foreignEntity, depth - 1)) {
|
|
46
|
+
m.set(key + '_' + name, { [key]: spec });
|
|
47
|
+
}
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return m;
|
|
52
|
+
}
|
|
53
|
+
function parseOrderBy(model, entityName, input) {
|
|
54
|
+
let mapping = getOrderByMapping(model, entityName);
|
|
55
|
+
return mergeOrderBy(input.map(value => {
|
|
56
|
+
let spec = mapping.get(value);
|
|
57
|
+
(0, assert_1.default)(spec != null);
|
|
58
|
+
return spec;
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
exports.parseOrderBy = parseOrderBy;
|
|
62
|
+
function mergeOrderBy(list) {
|
|
63
|
+
let result = {};
|
|
64
|
+
list.forEach(item => {
|
|
65
|
+
for (let key in item) {
|
|
66
|
+
let current = result[key];
|
|
67
|
+
if (current == null) {
|
|
68
|
+
result[key] = item[key];
|
|
69
|
+
}
|
|
70
|
+
else if (typeof current != 'string') {
|
|
71
|
+
let it = item[key];
|
|
72
|
+
(0, assert_1.default)(typeof it == 'object');
|
|
73
|
+
result[key] = mergeOrderBy([current, it]);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
exports.mergeOrderBy = mergeOrderBy;
|
|
80
|
+
//# sourceMappingURL=orderBy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orderBy.js","sourceRoot":"","sources":["../src/orderBy.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA2B;AAE3B,+CAA2C;AAuB3C,MAAM,aAAa,GAAG,IAAI,OAAO,EAAmD,CAAA;AAGpF,SAAgB,iBAAiB,CAAC,KAAY,EAAE,UAAkB;IAC9D,IAAI,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACpC,IAAI,KAAK,IAAI,IAAI,EAAE;QACf,KAAK,GAAG,EAAE,CAAA;QACV,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;KAClC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC,UAAU,CAAC,CAAA;IAC/C,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;AACxE,CAAC;AARD,8CAQC;AAGD,SAAS,mBAAmB,CAAC,KAAY,EAAE,QAAgB,EAAE,KAAa;IACtE,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,GAAG,EAAE,CAAA;IAChC,IAAI,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC5B,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,EAAE;QACxB,MAAM,GAAG,IAAA,2BAAa,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;KAC1C;IACD,IAAA,gBAAM,EAAC,MAAM,CAAC,IAAI,IAAI,QAAQ,IAAI,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAA;IAC1D,IAAI,CAAC,GAAG,IAAI,GAAG,EAAmB,CAAA;IAClC,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE;QAC/B,IAAI,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;QAC1C,QAAO,QAAQ,CAAC,IAAI,EAAE;YAClB,KAAK,QAAQ,CAAC;YACd,KAAK,MAAM;gBACP,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,EAAE,EAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAC,CAAC,CAAA;gBACnC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,EAAC,CAAC,GAAG,CAAC,EAAE,MAAM,EAAC,CAAC,CAAA;gBACrC,MAAK;YACT,KAAK,QAAQ,CAAC;YACd,KAAK,OAAO;gBACR,KAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE;oBAC3E,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,EAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAC,CAAC,CAAA;iBACzC;gBACD,MAAK;YACT,KAAK,IAAI;gBACL,KAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE;oBACpF,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,EAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAC,CAAC,CAAA;iBACzC;gBACD,MAAK;SACZ;KACJ;IACD,OAAO,CAAC,CAAA;AACZ,CAAC;AAGD,SAAgB,YAAY,CAAC,KAAY,EAAE,UAAkB,EAAE,KAA6B;IACxF,IAAI,OAAO,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IAClD,OAAO,YAAY,CACf,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACd,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAC7B,IAAA,gBAAM,EAAC,IAAI,IAAI,IAAI,CAAC,CAAA;QACpB,OAAO,IAAI,CAAA;IACf,CAAC,CAAC,CACL,CAAA;AACL,CAAC;AATD,oCASC;AAGD,SAAgB,YAAY,CAAC,IAAe;IACxC,IAAI,MAAM,GAAY,EAAE,CAAA;IACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAChB,KAAK,IAAI,GAAG,IAAI,IAAI,EAAE;YAClB,IAAI,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;YACzB,IAAI,OAAO,IAAI,IAAI,EAAG;gBAClB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;aAC1B;iBAAM,IAAI,OAAO,OAAO,IAAI,QAAQ,EAAE;gBACnC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;gBAClB,IAAA,gBAAM,EAAC,OAAO,EAAE,IAAI,QAAQ,CAAC,CAAA;gBAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;aAC5C;SACJ;IACL,CAAC,CAAC,CAAA;IACF,OAAO,MAAM,CAAA;AACjB,CAAC;AAfD,oCAeC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { OpenCrudOrderByValue } from "./orderBy";
|
|
2
|
+
import type { FtsRequestedFields, RequestedFields } from "./requestedFields";
|
|
3
|
+
import type { ResolverContext } from "./resolver";
|
|
4
|
+
export interface ListArgs {
|
|
5
|
+
offset?: number;
|
|
6
|
+
limit?: number;
|
|
7
|
+
orderBy?: OpenCrudOrderByValue[];
|
|
8
|
+
where?: any;
|
|
9
|
+
}
|
|
10
|
+
export declare class QueryBuilder {
|
|
11
|
+
params: any[];
|
|
12
|
+
private aliases;
|
|
13
|
+
private db;
|
|
14
|
+
private model;
|
|
15
|
+
constructor(ctx: ResolverContext);
|
|
16
|
+
private param;
|
|
17
|
+
private ident;
|
|
18
|
+
select(entityName: string, args: ListArgs, fields?: RequestedFields, variant?: SelectVariant): string;
|
|
19
|
+
private populateOrderBy;
|
|
20
|
+
private populateColumns;
|
|
21
|
+
private generateWhere;
|
|
22
|
+
private addPropCondition;
|
|
23
|
+
toResult(rows: any[][], fields?: RequestedFields): any[];
|
|
24
|
+
private mapRow;
|
|
25
|
+
executeSelect(entityName: string, args: ListArgs, fields$: RequestedFields): Promise<any[]>;
|
|
26
|
+
executeSelectCount(entityName: string, where?: any): Promise<number>;
|
|
27
|
+
executeListCount(entityName: string, args: ListArgs): Promise<number>;
|
|
28
|
+
private query;
|
|
29
|
+
fulltextSearchSelect(queryName: string, args: any, $fields: FtsRequestedFields): string;
|
|
30
|
+
toFulltextSearchResult(rows: any[][], fields: FtsRequestedFields): FtsItem[];
|
|
31
|
+
executeFulltextSearch(queryName: string, args: any, $fields: FtsRequestedFields): Promise<FtsItem[]>;
|
|
32
|
+
}
|
|
33
|
+
export interface FtsItem {
|
|
34
|
+
rank?: number;
|
|
35
|
+
highlight?: string;
|
|
36
|
+
item?: any;
|
|
37
|
+
}
|
|
38
|
+
declare type SelectVariant = FtsVariant | ListSubquery;
|
|
39
|
+
interface FtsVariant {
|
|
40
|
+
kind: 'fts';
|
|
41
|
+
queryName: string;
|
|
42
|
+
textParam: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* SELECT json_build_array(...fields) FROM ... WHERE {toFkColumn(field)} = {parent}
|
|
46
|
+
*/
|
|
47
|
+
interface ListSubquery {
|
|
48
|
+
kind: 'list-subquery';
|
|
49
|
+
field: string;
|
|
50
|
+
parent: string;
|
|
51
|
+
}
|
|
52
|
+
export {};
|