@subsquid/openreader 0.2.0 → 0.3.3

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.
Files changed (128) hide show
  1. package/README.md +2 -15
  2. package/bin/main.js +2 -0
  3. package/dist/db.d.ts +28 -0
  4. package/dist/db.d.ts.map +1 -0
  5. package/dist/db.js +69 -0
  6. package/dist/db.js.map +1 -0
  7. package/dist/gql/opencrud.d.ts +1 -0
  8. package/dist/gql/opencrud.d.ts.map +1 -0
  9. package/dist/gql/opencrud.js +10 -9
  10. package/dist/gql/opencrud.js.map +1 -1
  11. package/dist/gql/schema.d.ts +1 -0
  12. package/dist/gql/schema.d.ts.map +1 -0
  13. package/dist/main.d.ts +2 -3
  14. package/dist/main.d.ts.map +1 -0
  15. package/dist/main.js +6 -30
  16. package/dist/main.js.map +1 -1
  17. package/dist/model.d.ts +1 -0
  18. package/dist/model.d.ts.map +1 -0
  19. package/dist/model.tools.d.ts +1 -0
  20. package/dist/model.tools.d.ts.map +1 -0
  21. package/dist/orderBy.d.ts +1 -0
  22. package/dist/orderBy.d.ts.map +1 -0
  23. package/dist/queryBuilder.d.ts +3 -2
  24. package/dist/queryBuilder.d.ts.map +1 -0
  25. package/dist/queryBuilder.js +28 -27
  26. package/dist/queryBuilder.js.map +1 -1
  27. package/dist/relayConnection.d.ts +1 -0
  28. package/dist/relayConnection.d.ts.map +1 -0
  29. package/dist/requestedFields.d.ts +1 -0
  30. package/dist/requestedFields.d.ts.map +1 -0
  31. package/dist/requestedFields.js +3 -3
  32. package/dist/requestedFields.js.map +1 -1
  33. package/dist/resolver.d.ts +3 -2
  34. package/dist/resolver.d.ts.map +1 -0
  35. package/dist/resolver.js +12 -11
  36. package/dist/resolver.js.map +1 -1
  37. package/dist/scalars.d.ts +2 -2
  38. package/dist/scalars.d.ts.map +1 -0
  39. package/dist/scalars.js +6 -2
  40. package/dist/scalars.js.map +1 -1
  41. package/dist/server.d.ts +5 -11
  42. package/dist/server.d.ts.map +1 -0
  43. package/dist/server.js +13 -31
  44. package/dist/server.js.map +1 -1
  45. package/dist/test/basic.test.d.ts +2 -0
  46. package/dist/test/basic.test.d.ts.map +1 -0
  47. package/dist/test/basic.test.js +286 -0
  48. package/dist/test/basic.test.js.map +1 -0
  49. package/dist/test/connection.test.d.ts +2 -0
  50. package/dist/test/connection.test.d.ts.map +1 -0
  51. package/dist/test/connection.test.js +193 -0
  52. package/dist/test/connection.test.js.map +1 -0
  53. package/dist/test/fts.test.d.ts +2 -0
  54. package/dist/test/fts.test.d.ts.map +1 -0
  55. package/dist/test/fts.test.js +110 -0
  56. package/dist/test/fts.test.js.map +1 -0
  57. package/dist/test/lists.test.d.ts +2 -0
  58. package/dist/test/lists.test.d.ts.map +1 -0
  59. package/dist/test/lists.test.js +266 -0
  60. package/dist/test/lists.test.js.map +1 -0
  61. package/dist/test/lookup.test.d.ts +2 -0
  62. package/dist/test/lookup.test.d.ts.map +1 -0
  63. package/dist/test/lookup.test.js +109 -0
  64. package/dist/test/lookup.test.js.map +1 -0
  65. package/dist/test/scalars.test.d.ts +2 -0
  66. package/dist/test/scalars.test.d.ts.map +1 -0
  67. package/dist/test/scalars.test.js +303 -0
  68. package/dist/test/scalars.test.js.map +1 -0
  69. package/dist/test/tools.test.d.ts +2 -0
  70. package/dist/test/tools.test.d.ts.map +1 -0
  71. package/dist/test/tools.test.js +49 -0
  72. package/dist/test/tools.test.js.map +1 -0
  73. package/dist/test/typed-json.test.d.ts +2 -0
  74. package/dist/test/typed-json.test.d.ts.map +1 -0
  75. package/dist/test/typed-json.test.js +75 -0
  76. package/dist/test/typed-json.test.js.map +1 -0
  77. package/dist/test/unions.test.d.ts +2 -0
  78. package/dist/test/unions.test.d.ts.map +1 -0
  79. package/dist/test/unions.test.js +84 -0
  80. package/dist/test/unions.test.js.map +1 -0
  81. package/dist/test/util/setup.d.ts +7 -0
  82. package/dist/test/util/setup.d.ts.map +1 -0
  83. package/dist/test/util/setup.js +60 -0
  84. package/dist/test/util/setup.js.map +1 -0
  85. package/dist/test/where.test.d.ts +2 -0
  86. package/dist/test/where.test.d.ts.map +1 -0
  87. package/dist/test/where.test.js +127 -0
  88. package/dist/test/where.test.js.map +1 -0
  89. package/dist/tools.d.ts +1 -0
  90. package/dist/tools.d.ts.map +1 -0
  91. package/dist/util.d.ts +1 -13
  92. package/dist/util.d.ts.map +1 -0
  93. package/dist/util.js +6 -79
  94. package/dist/util.js.map +1 -1
  95. package/dist/where.d.ts +1 -0
  96. package/dist/where.d.ts.map +1 -0
  97. package/package.json +26 -20
  98. package/src/db.ts +83 -0
  99. package/src/gql/opencrud.ts +328 -0
  100. package/src/gql/schema.ts +337 -0
  101. package/src/main.ts +51 -0
  102. package/src/model.tools.ts +173 -0
  103. package/src/model.ts +125 -0
  104. package/src/orderBy.ts +105 -0
  105. package/src/queryBuilder.ts +785 -0
  106. package/src/relayConnection.ts +80 -0
  107. package/src/requestedFields.ts +246 -0
  108. package/src/resolver.ts +199 -0
  109. package/src/scalars.ts +247 -0
  110. package/src/server.ts +115 -0
  111. package/src/test/basic.test.ts +339 -0
  112. package/src/test/connection.test.ts +195 -0
  113. package/src/test/fts.test.ts +114 -0
  114. package/src/test/lists.test.ts +278 -0
  115. package/src/test/lookup.test.ts +111 -0
  116. package/src/test/scalars.test.ts +316 -0
  117. package/src/test/tools.test.ts +27 -0
  118. package/src/test/typed-json.test.ts +76 -0
  119. package/src/test/unions.test.ts +85 -0
  120. package/src/test/util/setup.ts +63 -0
  121. package/src/test/where.test.ts +135 -0
  122. package/src/tools.ts +33 -0
  123. package/src/util.ts +39 -0
  124. package/src/where.ts +110 -0
  125. package/CHANGELOG.md +0 -16
  126. package/dist/transaction.d.ts +0 -10
  127. package/dist/transaction.js +0 -47
  128. package/dist/transaction.js.map +0 -1
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const setup_1 = require("./util/setup");
4
+ describe('AND, OR on entity filters', function () {
5
+ (0, setup_1.useDatabase)([
6
+ `create table item (id text primary key, a int, b int)`,
7
+ `insert into item (id, a, b) values ('1', 1, 1)`,
8
+ `insert into item (id, a, b) values ('2', 2, 2)`,
9
+ `insert into item (id, a, b) values ('3', 3, 2)`,
10
+ `insert into item (id, a, b) values ('4', 4, 4)`,
11
+ `insert into item (id, a, b) values ('5', 5, 4)`,
12
+ `insert into item (id, a, b) values ('6', 5, 6)`,
13
+ ]);
14
+ const client = (0, setup_1.useServer)(`
15
+ type Item @entity {
16
+ id: ID!
17
+ a: Int
18
+ b: Int
19
+ }
20
+ `);
21
+ it('{c, and: {c}}', function () {
22
+ return client.test(`
23
+ query {
24
+ items(where: {a_eq: 1, AND: {b_eq: 1}} orderBy: id_ASC) { id }
25
+ }
26
+ `, {
27
+ items: [
28
+ { id: '1' }
29
+ ]
30
+ });
31
+ });
32
+ it('{and: {and: {c}, c}}', function () {
33
+ return client.test(`
34
+ query {
35
+ items(where: {AND: {b_eq: 2, AND: {a_eq: 3}}} orderBy: id_ASC) { id }
36
+ }
37
+ `, {
38
+ items: [
39
+ { id: '3' }
40
+ ]
41
+ });
42
+ });
43
+ it('{and: [{c}, {c}]}', function () {
44
+ return client.test(`
45
+ query {
46
+ items(where: {AND: [{a_eq: 2}, {b_eq: 2}]} orderBy: id_ASC) { id }
47
+ }
48
+ `, {
49
+ items: [
50
+ { id: '2' }
51
+ ]
52
+ });
53
+ });
54
+ it('{c, {or: {c}}}', function () {
55
+ return client.test(`
56
+ query {
57
+ items(where: {a_eq: 1, OR: {a_eq: 2}} orderBy: id_ASC) { id }
58
+ }
59
+ `, {
60
+ items: [
61
+ { id: '1' },
62
+ { id: '2' }
63
+ ]
64
+ });
65
+ });
66
+ it('{or: [{c}, {c}]}', function () {
67
+ return client.test(`
68
+ query {
69
+ items(where: {OR: [{a_eq: 2}, {a_eq: 3}]} orderBy: id_ASC) { id }
70
+ }
71
+ `, {
72
+ items: [
73
+ { id: '2' },
74
+ { id: '3' }
75
+ ]
76
+ });
77
+ });
78
+ it('{or: {or: {c}, c}}', function () {
79
+ return client.test(`
80
+ query {
81
+ items(where: {OR: {a_eq: 1, OR: {b_eq: 2}}} orderBy: id_ASC) { id }
82
+ }
83
+ `, {
84
+ items: [
85
+ { id: '1' },
86
+ { id: '2' },
87
+ { id: '3' }
88
+ ]
89
+ });
90
+ });
91
+ it('{and: [{or: {c}, c}, {or: {c}, c}]}', function () {
92
+ return client.test(`
93
+ query {
94
+ items(where: {AND: [{OR: {a_eq: 5}, a_eq: 4}, {OR: {b_eq: 2}, b_eq: 4}]} orderBy: id_ASC) { id }
95
+ }
96
+ `, {
97
+ items: [
98
+ { id: '4' },
99
+ { id: '5' }
100
+ ]
101
+ });
102
+ });
103
+ it('{c, and: {c}, or: {c}}', function () {
104
+ return client.test(`
105
+ query {
106
+ items(where: { a_eq: 4, AND: {b_eq: 4}, OR: {b_eq: 6} } orderBy: id_ASC) { id }
107
+ }
108
+ `, {
109
+ items: [
110
+ { id: '4' },
111
+ { id: '6' }
112
+ ]
113
+ });
114
+ });
115
+ it('handles empty wheres', function () {
116
+ return client.test(`
117
+ query {
118
+ items(where: { a_eq: 4, AND: { OR: {}, AND: {} }, OR: { OR: {AND: {} } } } orderBy: id_ASC) { id }
119
+ }
120
+ `, {
121
+ items: [
122
+ { id: '4' }
123
+ ]
124
+ });
125
+ });
126
+ });
127
+ //# sourceMappingURL=where.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"where.test.js","sourceRoot":"","sources":["../../src/test/where.test.ts"],"names":[],"mappings":";;AAAA,wCAAmD;AAEnD,QAAQ,CAAC,2BAA2B,EAAE;IAClC,IAAA,mBAAW,EAAC;QACR,uDAAuD;QACvD,gDAAgD;QAChD,gDAAgD;QAChD,gDAAgD;QAChD,gDAAgD;QAChD,gDAAgD;QAChD,gDAAgD;KACnD,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC;;;;;;KAMxB,CAAC,CAAA;IAEF,EAAE,CAAC,eAAe,EAAE;QAChB,OAAO,MAAM,CAAC,IAAI,CAAC;;;;SAIlB,EAAE;YACC,KAAK,EAAE;gBACH,EAAC,EAAE,EAAE,GAAG,EAAC;aACZ;SACJ,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sBAAsB,EAAE;QACvB,OAAO,MAAM,CAAC,IAAI,CAAC;;;;SAIlB,EAAE;YACC,KAAK,EAAE;gBACH,EAAC,EAAE,EAAE,GAAG,EAAC;aACZ;SACJ,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mBAAmB,EAAE;QACpB,OAAO,MAAM,CAAC,IAAI,CAAC;;;;SAIlB,EAAE;YACC,KAAK,EAAE;gBACH,EAAC,EAAE,EAAE,GAAG,EAAC;aACZ;SACJ,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gBAAgB,EAAE;QACjB,OAAO,MAAM,CAAC,IAAI,CAAC;;;;SAIlB,EAAE;YACC,KAAK,EAAE;gBACH,EAAC,EAAE,EAAE,GAAG,EAAC;gBACT,EAAC,EAAE,EAAE,GAAG,EAAC;aACZ;SACJ,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kBAAkB,EAAE;QACnB,OAAO,MAAM,CAAC,IAAI,CAAC;;;;SAIlB,EAAE;YACC,KAAK,EAAE;gBACH,EAAC,EAAE,EAAE,GAAG,EAAC;gBACT,EAAC,EAAE,EAAE,GAAG,EAAC;aACZ;SACJ,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oBAAoB,EAAE;QACrB,OAAO,MAAM,CAAC,IAAI,CAAC;;;;SAIlB,EAAE;YACC,KAAK,EAAE;gBACH,EAAC,EAAE,EAAE,GAAG,EAAC;gBACT,EAAC,EAAE,EAAE,GAAG,EAAC;gBACT,EAAC,EAAE,EAAE,GAAG,EAAC;aACZ;SACJ,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE;QACtC,OAAO,MAAM,CAAC,IAAI,CAAC;;;;SAIlB,EAAE;YACC,KAAK,EAAE;gBACH,EAAC,EAAE,EAAE,GAAG,EAAC;gBACT,EAAC,EAAE,EAAE,GAAG,EAAC;aACZ;SACJ,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wBAAwB,EAAE;QACzB,OAAO,MAAM,CAAC,IAAI,CAAC;;;;SAIlB,EAAE;YACC,KAAK,EAAE;gBACH,EAAC,EAAE,EAAE,GAAG,EAAC;gBACT,EAAC,EAAE,EAAE,GAAG,EAAC;aACZ;SACJ,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sBAAsB,EAAE;QACvB,OAAO,MAAM,CAAC,IAAI,CAAC;;;;SAIlB,EAAE;YACC,KAAK,EAAE;gBACH,EAAC,EAAE,EAAE,GAAG,EAAC;aACZ;SACJ,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA"}
package/dist/tools.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  import type { Model } from "./model";
2
2
  export declare function loadModel(schemaFile: string): Model;
3
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,SAAS,CAAA;AAGlC,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,CAwBnD"}
package/dist/util.d.ts CHANGED
@@ -1,8 +1,3 @@
1
- import { pluralize } from "inflected";
2
- export { pluralize };
3
- export declare function snakeCase(name: string): string;
4
- export declare function lowerCaseFirst(s: string): string;
5
- export declare function upperCaseFirst(s: string): string;
6
1
  export declare function toQueryListField(entityName: string): string;
7
2
  export declare function toColumn(gqlFieldName: string): string;
8
3
  export declare function toFkColumn(gqlFieldName: string): string;
@@ -10,11 +5,4 @@ export declare function toTable(entityName: string): string;
10
5
  export declare function ensureArray<T>(item: T | T[]): T[];
11
6
  export declare function unsupportedCase(value: string): Error;
12
7
  export declare function toInt(val: number | string): number;
13
- export declare class Output {
14
- private out;
15
- private indent;
16
- line(s?: string): void;
17
- block(start: string, cb: () => void): void;
18
- lazy(gen: () => string[]): void;
19
- toString(): string;
20
- }
8
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D;AAGD,wBAAgB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAErD;AAGD,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEvD;AAGD,wBAAgB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAElD;AAGD,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAEjD;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAEpD;AAGD,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAIlD"}
package/dist/util.js CHANGED
@@ -3,46 +3,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Output = exports.toInt = exports.unsupportedCase = exports.ensureArray = exports.toTable = exports.toFkColumn = exports.toColumn = exports.toQueryListField = exports.upperCaseFirst = exports.lowerCaseFirst = exports.snakeCase = exports.pluralize = void 0;
6
+ exports.toInt = exports.unsupportedCase = exports.ensureArray = exports.toTable = exports.toFkColumn = exports.toColumn = exports.toQueryListField = void 0;
7
+ const util_1 = require("@subsquid/util");
7
8
  const assert_1 = __importDefault(require("assert"));
8
- const inflected_1 = require("inflected");
9
- Object.defineProperty(exports, "pluralize", { enumerable: true, get: function () { return inflected_1.pluralize; } });
10
- function snakeCase(name) {
11
- return (0, inflected_1.underscore)(name);
12
- }
13
- exports.snakeCase = snakeCase;
14
- function lowerCaseFirst(s) {
15
- if (s) {
16
- return s[0].toLowerCase() + s.slice(1);
17
- }
18
- else {
19
- return s;
20
- }
21
- }
22
- exports.lowerCaseFirst = lowerCaseFirst;
23
- function upperCaseFirst(s) {
24
- if (s) {
25
- return s[0].toUpperCase() + s.slice(1);
26
- }
27
- else {
28
- return s;
29
- }
30
- }
31
- exports.upperCaseFirst = upperCaseFirst;
32
9
  function toQueryListField(entityName) {
33
- return (0, inflected_1.pluralize)(lowerCaseFirst(entityName));
10
+ return (0, util_1.toPlural)((0, util_1.toCamelCase)(entityName));
34
11
  }
35
12
  exports.toQueryListField = toQueryListField;
36
13
  function toColumn(gqlFieldName) {
37
- return snakeCase(gqlFieldName);
14
+ return (0, util_1.toSnakeCase)(gqlFieldName);
38
15
  }
39
16
  exports.toColumn = toColumn;
40
17
  function toFkColumn(gqlFieldName) {
41
- return snakeCase(gqlFieldName) + '_id';
18
+ return (0, util_1.toSnakeCase)(gqlFieldName) + '_id';
42
19
  }
43
20
  exports.toFkColumn = toFkColumn;
44
21
  function toTable(entityName) {
45
- return snakeCase(entityName);
22
+ return (0, util_1.toSnakeCase)(entityName);
46
23
  }
47
24
  exports.toTable = toTable;
48
25
  function ensureArray(item) {
@@ -59,54 +36,4 @@ function toInt(val) {
59
36
  return i;
60
37
  }
61
38
  exports.toInt = toInt;
62
- class Output {
63
- constructor() {
64
- this.out = [];
65
- this.indent = '';
66
- }
67
- line(s) {
68
- if (s) {
69
- this.out.push(this.indent + s);
70
- }
71
- else {
72
- this.out.push('');
73
- }
74
- }
75
- block(start, cb) {
76
- this.line(start + ' {');
77
- this.indent += ' ';
78
- try {
79
- cb();
80
- }
81
- finally {
82
- this.indent = this.indent.slice(0, this.indent.length - 2);
83
- }
84
- this.line('}');
85
- }
86
- lazy(gen) {
87
- this.out.push({ indent: this.indent, gen });
88
- }
89
- toString() {
90
- let out = '';
91
- for (let i = 0; i < this.out.length; i++) {
92
- let line = this.out[i];
93
- if (typeof line == 'string') {
94
- out += line + '\n';
95
- }
96
- else {
97
- let lazy = line;
98
- lazy.gen().forEach(s => {
99
- if (s) {
100
- out += lazy.indent + s + '\n';
101
- }
102
- else {
103
- out += '\n';
104
- }
105
- });
106
- }
107
- }
108
- return out;
109
- }
110
- }
111
- exports.Output = Output;
112
39
  //# sourceMappingURL=util.js.map
package/dist/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAiE;AACjE,oDAA2B;AAG3B,SAAgB,gBAAgB,CAAC,UAAkB;IAC/C,OAAO,IAAA,eAAQ,EAAC,IAAA,kBAAW,EAAC,UAAU,CAAC,CAAC,CAAA;AAC5C,CAAC;AAFD,4CAEC;AAGD,SAAgB,QAAQ,CAAC,YAAoB;IACzC,OAAO,IAAA,kBAAW,EAAC,YAAY,CAAC,CAAA;AACpC,CAAC;AAFD,4BAEC;AAGD,SAAgB,UAAU,CAAC,YAAoB;IAC3C,OAAO,IAAA,kBAAW,EAAC,YAAY,CAAC,GAAG,KAAK,CAAA;AAC5C,CAAC;AAFD,gCAEC;AAGD,SAAgB,OAAO,CAAC,UAAkB;IACtC,OAAO,IAAA,kBAAW,EAAC,UAAU,CAAC,CAAA;AAClC,CAAC;AAFD,0BAEC;AAGD,SAAgB,WAAW,CAAI,IAAa;IACxC,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAC9C,CAAC;AAFD,kCAEC;AAGD,SAAgB,eAAe,CAAC,KAAa;IACzC,OAAO,IAAI,KAAK,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAA;AAClD,CAAC;AAFD,0CAEC;AAGD,SAAgB,KAAK,CAAC,GAAoB;IACtC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAa,CAAC,CAAA;IAC/B,IAAA,gBAAM,EAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAChC,OAAO,CAAC,CAAA;AACZ,CAAC;AAJD,sBAIC"}
package/dist/where.d.ts CHANGED
@@ -6,3 +6,4 @@ export declare function parseWhereField(field: string): {
6
6
  };
7
7
  export declare function hasConditions(where?: any): where is any;
8
8
  export declare function whereOpToSqlOperator(op: WhereOp): string;
9
+ //# sourceMappingURL=where.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"where.d.ts","sourceRoot":"","sources":["../src/where.ts"],"names":[],"mappings":"AACA,oBAAY,OAAO,GACf,GAAG,GAAG,cAAc;AACpB,IAAI,GAAG,QAAQ,GACf,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,KAAK,GACL,IAAI,GAAG,QAAQ,GACf,UAAU,GAAG,cAAc,GAC3B,YAAY,GAAG,gBAAgB,GAC/B,UAAU,GAAG,cAAc,GAC3B,aAAa,GACb,aAAa,GACb,cAAc,GACd,MAAM,GACN,OAAO,GACP,MAAM,CAAA;AAmCV,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAQ3E;AAGD,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,KAAK,IAAI,GAAG,CAsBvD;AAGD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,CAqBxD"}
package/package.json CHANGED
@@ -1,44 +1,50 @@
1
1
  {
2
2
  "name": "@subsquid/openreader",
3
- "version": "0.2.0",
4
- "description": "GraphQL server for Hydra",
3
+ "version": "0.3.3",
4
+ "description": "GraphQL server for squid framework",
5
5
  "keywords": [
6
6
  "graphql",
7
7
  "opencrud"
8
8
  ],
9
- "license": "MIT",
10
- "repository": "git@github.com:subsquid/openreader.git",
9
+ "license": "GPL-3.0-or-later",
10
+ "repository": "git@github.com:subsquid/squid.git",
11
11
  "publishConfig": {
12
12
  "access": "public"
13
13
  },
14
14
  "bin": {
15
- "openreader": "./dist/main.js"
15
+ "openreader": "./bin/main.js"
16
16
  },
17
17
  "files": [
18
+ "bin",
18
19
  "dist",
19
- "!dist/test"
20
+ "src"
20
21
  ],
21
22
  "dependencies": {
22
23
  "@graphql-tools/merge": "^8",
23
24
  "@graphql-tools/utils": "^8",
24
25
  "@subsquid/graphiql-console": "^0.2.0",
25
- "apollo-server-core": "^3.3.0",
26
- "apollo-server-express": "^3.3.0",
27
- "express": "^4.17.1",
28
- "graphql": "^15.5.2",
26
+ "@subsquid/util": "^0.0.3",
27
+ "apollo-server-core": "^3.5.0",
28
+ "apollo-server-express": "^3.5.0",
29
+ "express": "^4.17.2",
30
+ "graphql": "^15.8.0",
29
31
  "graphql-parse-resolve-info": "^4.12.0",
30
- "inflected": "^2.1.0",
31
32
  "pg": "^8.7.1"
32
33
  },
33
34
  "devDependencies": {
34
- "@types/inflected": "^1.1.29",
35
+ "@types/express": "^4.17.13",
35
36
  "@types/mocha": "^9.0.0",
36
- "@types/node-fetch": "^2.5.12",
37
- "@types/pg": "^8.6.1",
37
+ "@types/node": "^16.11.17",
38
+ "@types/pg": "^8.6.3",
38
39
  "dotenv": "^10.0.0",
39
- "expect": "^27.2.1",
40
- "mocha": "^9.1.1",
41
- "node-fetch": "^2.6.3",
42
- "typescript": "^4.4.2"
43
- }
44
- }
40
+ "expect": "^27.4.6",
41
+ "gql-test-client": "^0.0.0",
42
+ "mocha": "^9.1.3",
43
+ "typescript": "~4.5.4"
44
+ },
45
+ "scripts": {
46
+ "build": "rm -rf dist && tsc",
47
+ "test": "make up && sleep 1 && make test && make down || (make down && exit 1)"
48
+ },
49
+ "readme": "# OpenReader\n\nGraphQL server for squid framework. Given [data schema](https://docs.subsquid.io/schema-spec) \nand compatible Postgres database it serves \"read part\" of [OpenCRUD spec](https://www.opencrud.org).\n\n## Usage\n\n```bash\nopenreader schema.graphql\n```\n\nDatabase connection and server port are configured via environment variables:\n\n```\nDB_NAME\nDB_USER\nDB_PASS\nDB_HOST\nDB_PORT\nGRAPHQL_SERVER_PORT\n```\n"
50
+ }
package/src/db.ts ADDED
@@ -0,0 +1,83 @@
1
+ import type {ClientBase, Pool, PoolClient, PoolConfig} from "pg"
2
+
3
+
4
+ export interface Database {
5
+ query(sql: string, parameters?: any[]): Promise<any[][]>
6
+ escapeIdentifier(name: string): string
7
+ }
8
+
9
+
10
+ /**
11
+ * This is an interface OpenReader uses to interact with underling database.
12
+ */
13
+ export interface Transaction {
14
+ get(): Promise<Database>
15
+ }
16
+
17
+
18
+ export class PgDatabase implements Database {
19
+ constructor(private client: ClientBase) {}
20
+
21
+ query(sql: string, parameters?: any[]): Promise<any[]> {
22
+ return this.client.query({text: sql, rowMode: 'array'}, parameters).then(result => result.rows)
23
+ }
24
+
25
+ escapeIdentifier(name: string): string {
26
+ return this.client.escapeIdentifier(name)
27
+ }
28
+ }
29
+
30
+
31
+ export class PoolTransaction implements Transaction {
32
+ private tx: Promise<{client: PoolClient, db: Database}> | undefined
33
+ private closed = false
34
+
35
+ constructor(private pool: Pool) {}
36
+
37
+ async get(): Promise<Database> {
38
+ if (this.closed) {
39
+ throw new Error('Too late to request transaction')
40
+ }
41
+ this.tx = this.tx || this.startTransaction()
42
+ let {db} = await this.tx
43
+ return db
44
+ }
45
+
46
+ private async startTransaction(): Promise<{client: PoolClient, db: Database}> {
47
+ let client = await this.pool.connect()
48
+ try {
49
+ await client.query('START TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY')
50
+ return {
51
+ client,
52
+ db: new PgDatabase(client)
53
+ }
54
+ } catch(e: any) {
55
+ client.release()
56
+ throw e
57
+ }
58
+ }
59
+
60
+ close(): Promise<void> {
61
+ this.closed = true
62
+ return this.tx?.then(async ({client}) => {
63
+ try {
64
+ await client.query('COMMIT')
65
+ } catch(e: any) {
66
+ // ignore
67
+ } finally {
68
+ client.release()
69
+ }
70
+ }) || Promise.resolve()
71
+ }
72
+ }
73
+
74
+
75
+ export function createPoolConfig(): PoolConfig {
76
+ return {
77
+ host: process.env.DB_HOST || 'localhost',
78
+ port: process.env.DB_PORT ? parseInt(process.env.DB_PORT) : 5432,
79
+ database: process.env.DB_NAME || 'postgres',
80
+ user: process.env.DB_USER || 'postgres',
81
+ password: process.env.DB_PASS || 'postgres'
82
+ }
83
+ }