postgraphile 4.12.11 → 5.0.0-0.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 (134) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/LICENSE.md +15 -20
  3. package/README.md +20 -171
  4. package/dist/cli-run.d.ts +3 -0
  5. package/dist/cli-run.d.ts.map +1 -0
  6. package/dist/cli-run.js +7 -0
  7. package/dist/cli-run.js.map +1 -0
  8. package/dist/cli.d.ts +21 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +180 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/index.d.ts +14 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +88 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/plugins/PgV4BehaviorPlugin.d.ts +11 -0
  17. package/dist/plugins/PgV4BehaviorPlugin.d.ts.map +1 -0
  18. package/dist/plugins/PgV4BehaviorPlugin.js +73 -0
  19. package/dist/plugins/PgV4BehaviorPlugin.js.map +1 -0
  20. package/dist/plugins/PgV4InflectionPlugin.d.ts +11 -0
  21. package/dist/plugins/PgV4InflectionPlugin.d.ts.map +1 -0
  22. package/dist/plugins/PgV4InflectionPlugin.js +91 -0
  23. package/dist/plugins/PgV4InflectionPlugin.js.map +1 -0
  24. package/dist/plugins/PgV4NoIgnoreIndexes.d.ts +2 -0
  25. package/dist/plugins/PgV4NoIgnoreIndexes.d.ts.map +1 -0
  26. package/dist/plugins/PgV4NoIgnoreIndexes.js +72 -0
  27. package/dist/plugins/PgV4NoIgnoreIndexes.js.map +1 -0
  28. package/dist/plugins/PgV4SmartTagsPlugin.d.ts +11 -0
  29. package/dist/plugins/PgV4SmartTagsPlugin.d.ts.map +1 -0
  30. package/dist/plugins/PgV4SmartTagsPlugin.js +190 -0
  31. package/dist/plugins/PgV4SmartTagsPlugin.js.map +1 -0
  32. package/dist/presets/amber.d.ts +5 -0
  33. package/dist/presets/amber.d.ts.map +1 -0
  34. package/dist/presets/amber.js +38 -0
  35. package/dist/presets/amber.js.map +1 -0
  36. package/dist/presets/v4.d.ts +34 -0
  37. package/dist/presets/v4.d.ts.map +1 -0
  38. package/dist/presets/v4.js +142 -0
  39. package/dist/presets/v4.js.map +1 -0
  40. package/dist/schema.d.ts +34 -0
  41. package/dist/schema.d.ts.map +1 -0
  42. package/dist/schema.js +82 -0
  43. package/dist/schema.js.map +1 -0
  44. package/package.json +77 -154
  45. package/build/assets/favicon.ico.d.ts +0 -3
  46. package/build/assets/favicon.ico.js +0 -6
  47. package/build/assets/graphiql.html.d.ts +0 -2
  48. package/build/assets/graphiql.html.js +0 -6
  49. package/build/index.d.ts +0 -8
  50. package/build/index.js +0 -34
  51. package/build/interfaces.d.ts +0 -162
  52. package/build/interfaces.js +0 -3
  53. package/build/plugins.d.ts +0 -3
  54. package/build/plugins.js +0 -53
  55. package/build/postgraphile/cli.d.ts +0 -3
  56. package/build/postgraphile/cli.js +0 -541
  57. package/build/postgraphile/extendedFormatError.d.ts +0 -9
  58. package/build/postgraphile/extendedFormatError.js +0 -51
  59. package/build/postgraphile/http/createPostGraphileHttpRequestHandler.d.ts +0 -11
  60. package/build/postgraphile/http/createPostGraphileHttpRequestHandler.js +0 -974
  61. package/build/postgraphile/http/frameworks.d.ts +0 -110
  62. package/build/postgraphile/http/frameworks.js +0 -258
  63. package/build/postgraphile/http/liveSubscribe.d.ts +0 -22
  64. package/build/postgraphile/http/liveSubscribe.js +0 -89
  65. package/build/postgraphile/http/mapAsyncIterator.d.ts +0 -15
  66. package/build/postgraphile/http/mapAsyncIterator.js +0 -71
  67. package/build/postgraphile/http/setupServerSentEvents.d.ts +0 -9
  68. package/build/postgraphile/http/setupServerSentEvents.js +0 -51
  69. package/build/postgraphile/http/subscriptions.d.ts +0 -7
  70. package/build/postgraphile/http/subscriptions.js +0 -410
  71. package/build/postgraphile/index.d.ts +0 -5
  72. package/build/postgraphile/index.js +0 -14
  73. package/build/postgraphile/pluginHook.d.ts +0 -104
  74. package/build/postgraphile/pluginHook.js +0 -100
  75. package/build/postgraphile/postgraphile.d.ts +0 -20
  76. package/build/postgraphile/postgraphile.js +0 -332
  77. package/build/postgraphile/postgraphilerc.d.ts +0 -2
  78. package/build/postgraphile/postgraphilerc.js +0 -16
  79. package/build/postgraphile/schema/exportPostGraphileSchema.d.ts +0 -6
  80. package/build/postgraphile/schema/exportPostGraphileSchema.js +0 -45
  81. package/build/postgraphile/shutdownActions.d.ts +0 -41
  82. package/build/postgraphile/shutdownActions.js +0 -87
  83. package/build/postgraphile/withPostGraphileContext.d.ts +0 -55
  84. package/build/postgraphile/withPostGraphileContext.js +0 -457
  85. package/build/postgres/inventory/pgClientFromContext.d.ts +0 -8
  86. package/build/postgres/inventory/pgClientFromContext.js +0 -21
  87. package/build-turbo/assets/favicon.ico.d.ts +0 -3
  88. package/build-turbo/assets/favicon.ico.js +0 -6
  89. package/build-turbo/assets/graphiql.html.d.ts +0 -2
  90. package/build-turbo/assets/graphiql.html.js +0 -6
  91. package/build-turbo/index.d.ts +0 -8
  92. package/build-turbo/index.js +0 -34
  93. package/build-turbo/interfaces.d.ts +0 -162
  94. package/build-turbo/interfaces.js +0 -3
  95. package/build-turbo/plugins.d.ts +0 -3
  96. package/build-turbo/plugins.js +0 -53
  97. package/build-turbo/postgraphile/cli.d.ts +0 -3
  98. package/build-turbo/postgraphile/cli.js +0 -572
  99. package/build-turbo/postgraphile/extendedFormatError.d.ts +0 -9
  100. package/build-turbo/postgraphile/extendedFormatError.js +0 -61
  101. package/build-turbo/postgraphile/http/createPostGraphileHttpRequestHandler.d.ts +0 -11
  102. package/build-turbo/postgraphile/http/createPostGraphileHttpRequestHandler.js +0 -982
  103. package/build-turbo/postgraphile/http/frameworks.d.ts +0 -110
  104. package/build-turbo/postgraphile/http/frameworks.js +0 -258
  105. package/build-turbo/postgraphile/http/liveSubscribe.d.ts +0 -22
  106. package/build-turbo/postgraphile/http/liveSubscribe.js +0 -89
  107. package/build-turbo/postgraphile/http/mapAsyncIterator.d.ts +0 -15
  108. package/build-turbo/postgraphile/http/mapAsyncIterator.js +0 -71
  109. package/build-turbo/postgraphile/http/setupServerSentEvents.d.ts +0 -9
  110. package/build-turbo/postgraphile/http/setupServerSentEvents.js +0 -51
  111. package/build-turbo/postgraphile/http/subscriptions.d.ts +0 -7
  112. package/build-turbo/postgraphile/http/subscriptions.js +0 -409
  113. package/build-turbo/postgraphile/index.d.ts +0 -5
  114. package/build-turbo/postgraphile/index.js +0 -14
  115. package/build-turbo/postgraphile/pluginHook.d.ts +0 -104
  116. package/build-turbo/postgraphile/pluginHook.js +0 -100
  117. package/build-turbo/postgraphile/postgraphile.d.ts +0 -20
  118. package/build-turbo/postgraphile/postgraphile.js +0 -337
  119. package/build-turbo/postgraphile/postgraphilerc.d.ts +0 -2
  120. package/build-turbo/postgraphile/postgraphilerc.js +0 -16
  121. package/build-turbo/postgraphile/schema/exportPostGraphileSchema.d.ts +0 -6
  122. package/build-turbo/postgraphile/schema/exportPostGraphileSchema.js +0 -45
  123. package/build-turbo/postgraphile/shutdownActions.d.ts +0 -41
  124. package/build-turbo/postgraphile/shutdownActions.js +0 -87
  125. package/build-turbo/postgraphile/withPostGraphileContext.d.ts +0 -55
  126. package/build-turbo/postgraphile/withPostGraphileContext.js +0 -466
  127. package/build-turbo/postgres/inventory/pgClientFromContext.d.ts +0 -8
  128. package/build-turbo/postgres/inventory/pgClientFromContext.js +0 -21
  129. package/cli.js +0 -6
  130. package/index.js +0 -5
  131. package/isTurbo.js +0 -11
  132. package/plugins.d.ts +0 -1
  133. package/plugins.js +0 -5
  134. package/sponsors.json +0 -150
@@ -1,87 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ShutdownActions = void 0;
4
- /**
5
- * This class tracks actions that must be taken when PostGraphile is shut down
6
- * (released) in order to make sure that all the resources it has consumed has
7
- * been cleaned up.
8
- *
9
- * Since PostGraphile is extensible via plugins and plugins may have their own
10
- * shutdown actions we use this generic system to handle them all. If your
11
- * plugin sets up something that would keep running after PostGraphile is
12
- * `.release()`d (such as a timer, interval, network connection, filesystem
13
- * monitoring, or similar activity) then you should register an action via
14
- * `shutdownActions` to clean it up.
15
- *
16
- * This class currently has "experimental" status, it may have breaking
17
- * changes in future semver minor releases.
18
- */
19
- class ShutdownActions {
20
- constructor() {
21
- this.actions = [];
22
- this.didInvoke = false;
23
- }
24
- /**
25
- * Register a function to be called when PostGraphile is released.
26
- */
27
- add(action) {
28
- if (this.didInvoke) {
29
- console.warn("WARNING: shutdown action added after shutdown actions were invoked; we'll call it now but your program may have already moved on.");
30
- setImmediate(() => {
31
- Promise.resolve(action()).catch(e => {
32
- console.error('Error occurred calling shutdown action after invoke:');
33
- console.error(e);
34
- });
35
- });
36
- }
37
- else {
38
- this.actions.push(action);
39
- }
40
- }
41
- /**
42
- * If your action is no longer relevant (for example it has completed, or it
43
- * was only relevant whilst in a particular mode) then be sure to remove it so
44
- * it won't be called when PostGraphile is released.
45
- */
46
- remove(action) {
47
- const index = this.actions.indexOf(action);
48
- if (index === -1) {
49
- throw new Error('The specified shutdown action was not found.');
50
- }
51
- this.actions.splice(index, 1);
52
- }
53
- /**
54
- * Calls the release actions in reverse order and returns the array of resulting
55
- * promises/results. Will not throw unless the shutdown actions have already
56
- * been invoked.
57
- */
58
- invoke() {
59
- if (this.didInvoke) {
60
- throw new Error('release() has already been called.');
61
- }
62
- this.didInvoke = true;
63
- const actions = this.actions;
64
- this.actions = [];
65
- // Invoke in reverse order.
66
- const result = new Array(actions.length);
67
- let chain = Promise.resolve();
68
- for (let i = actions.length - 1; i >= 0; i--) {
69
- const fn = actions[i];
70
- // Ensure that all actions are called, even if a previous action throws an
71
- // error.
72
- result[i] = chain = chain.then(() => fn(), () => fn());
73
- }
74
- return result;
75
- }
76
- /**
77
- * Calls all the release actions and resolves when complete (rejecting if an
78
- * error occurred).
79
- */
80
- async invokeAll() {
81
- // TODO:v5: This would be better if it used `Promise.allSettled()` but we
82
- // can't use it yet.
83
- await Promise.all(this.invoke());
84
- }
85
- }
86
- exports.ShutdownActions = ShutdownActions;
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2h1dGRvd25BY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Bvc3RncmFwaGlsZS9zaHV0ZG93bkFjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFhLGVBQWU7SUFBNUI7UUFDVSxZQUFPLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLGNBQVMsR0FBRyxLQUFLLENBQUM7SUF1RTVCLENBQUM7SUFyRUM7O09BRUc7SUFDSCxHQUFHLENBQUMsTUFBYztRQUNoQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsT0FBTyxDQUFDLElBQUksQ0FDVixtSUFBbUksQ0FDcEksQ0FBQztZQUNGLFlBQVksQ0FBQyxHQUFHLEVBQUU7Z0JBQ2hCLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ2xDLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztvQkFDdEUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMzQjtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLE1BQWM7UUFDbkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1NBQ2pFO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDdkQ7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLDJCQUEyQjtRQUMzQixNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekMsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFdEIsMEVBQTBFO1lBQzFFLFNBQVM7WUFDVCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQzVCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUNWLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNYLENBQUM7U0FDSDtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsU0FBUztRQUNiLHlFQUF5RTtRQUN6RSxvQkFBb0I7UUFDcEIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQXpFRCwwQ0F5RUMifQ==
@@ -1,55 +0,0 @@
1
- import { PoolClient } from 'pg';
2
- import { ExecutionResult } from 'graphql';
3
- import { $$pgClient } from '../postgres/inventory/pgClientFromContext';
4
- import { mixed, WithPostGraphileContextOptions } from '../interfaces';
5
- interface PostGraphileContext {
6
- [$$pgClient]: PoolClient;
7
- [key: string]: PoolClient | mixed;
8
- }
9
- export declare type WithPostGraphileContextFn<TResult = ExecutionResult> = (options: WithPostGraphileContextOptions, callback: (context: PostGraphileContext) => Promise<TResult>) => Promise<TResult>;
10
- /**
11
- * Creates a PostGraphile context object which should be passed into a GraphQL
12
- * execution. This function will also connect a client from a Postgres pool and
13
- * setup a transaction in that client.
14
- *
15
- * This function is intended to wrap a call to GraphQL-js execution like so:
16
- *
17
- * ```js
18
- * const result = await withPostGraphileContext({
19
- * pgPool,
20
- * jwtToken,
21
- * jwtSecret,
22
- * pgDefaultRole,
23
- * }, async context => {
24
- * return await graphql(
25
- * schema,
26
- * query,
27
- * null,
28
- * { ...context },
29
- * variables,
30
- * operationName,
31
- * );
32
- * });
33
- * ```
34
- */
35
- declare const withPostGraphileContext: WithPostGraphileContextFn;
36
- export default withPostGraphileContext;
37
- interface RawExplainResult {
38
- query: string;
39
- result: any;
40
- }
41
- declare type ExplainResult = Omit<RawExplainResult, 'result'> & {
42
- plan: string;
43
- };
44
- declare module 'pg' {
45
- interface ClientBase {
46
- _explainResults: Array<RawExplainResult> | null;
47
- startExplain: () => void;
48
- stopExplain: () => Promise<Array<ExplainResult>>;
49
- }
50
- }
51
- /**
52
- * Monkey-patches the `query` method of a pg Client to add debugging
53
- * functionality. Use with care.
54
- */
55
- export declare function debugPgClient(pgClient: PoolClient, allowExplain?: boolean): PoolClient;
@@ -1,466 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.debugPgClient = void 0;
4
- const createDebugger = require("debug");
5
- const jwt = require("jsonwebtoken");
6
- const graphql_1 = require("graphql");
7
- const sql = require("pg-sql2");
8
- const pgClientFromContext_1 = require("../postgres/inventory/pgClientFromContext");
9
- const pluginHook_1 = require("./pluginHook");
10
- const postgraphile_core_1 = require("postgraphile-core");
11
- const undefinedIfEmpty = (o) => o && (!Array.isArray(o) || o.length) ? o : undefined;
12
- const debugPg = createDebugger('postgraphile:postgres');
13
- const debugPgError = createDebugger('postgraphile:postgres:error');
14
- const debugPgNotice = createDebugger('postgraphile:postgres:notice');
15
- /**
16
- * Formats an error/notice from `pg` and feeds it into a `debug` function.
17
- */
18
- function debugPgErrorObject(debugFn, object) {
19
- debugFn('%s%s: %s%s%s', object.severity || 'ERROR', object.code ? `[${object.code}]` : '', object.message || object, object.where ? ` | WHERE: ${object.where}` : '', object.hint ? ` | HINT: ${object.hint}` : '');
20
- }
21
- function swallowErrors() {
22
- /* noop */
23
- }
24
- const simpleWithPgClientCache = new WeakMap();
25
- function simpleWithPgClient(pgPool) {
26
- const cached = simpleWithPgClientCache.get(pgPool);
27
- if (cached) {
28
- return cached;
29
- }
30
- const func = async (cb) => {
31
- const pgClient = await pgPool.connect();
32
- pgClient.on('error', swallowErrors);
33
- try {
34
- return await cb(pgClient);
35
- }
36
- finally {
37
- pgClient.removeListener('error', swallowErrors);
38
- pgClient.release();
39
- }
40
- };
41
- simpleWithPgClientCache.set(pgPool, func);
42
- return func;
43
- }
44
- const withDefaultPostGraphileContext = async (options, callback) => {
45
- const { pgPool, jwtToken, jwtSecret, jwtPublicKey, jwtAudiences, jwtRole = ['role'], jwtVerifyOptions, pgDefaultRole, pgSettings, explain, queryDocumentAst, operationName, pgForceTransaction, singleStatement, } = options;
46
- let operation;
47
- if (!pgForceTransaction && queryDocumentAst) {
48
- // tslint:disable-next-line
49
- for (let i = 0, l = queryDocumentAst.definitions.length; i < l; i++) {
50
- const definition = queryDocumentAst.definitions[i];
51
- if (definition.kind === graphql_1.Kind.OPERATION_DEFINITION) {
52
- if (!operationName && operation) {
53
- throw new Error('Multiple operations present in GraphQL query, you must specify an `operationName` so we know which one to execute.');
54
- }
55
- else if (!operationName || (definition.name && definition.name.value === operationName)) {
56
- operation = definition;
57
- }
58
- }
59
- }
60
- }
61
- // Warning: this is only set if pgForceTransaction is falsy
62
- const operationType = operation != null ? operation.operation : null;
63
- const { role: pgRole, localSettings, jwtClaims } = await getSettingsForPgClientTransaction({
64
- jwtToken,
65
- jwtSecret,
66
- jwtPublicKey,
67
- jwtAudiences,
68
- jwtRole,
69
- jwtVerifyOptions,
70
- pgDefaultRole,
71
- pgSettings,
72
- });
73
- const sqlSettings = [];
74
- if (localSettings.length > 0) {
75
- // Later settings should win, so we're going to loop backwards and not
76
- // add settings for keys we've already seen.
77
- const seenKeys = [];
78
- // TODO:perf: looping backwards is slow
79
- for (let i = localSettings.length - 1; i >= 0; i--) {
80
- const [key, value] = localSettings[i];
81
- if (!seenKeys.includes(key)) {
82
- seenKeys.push(key);
83
- // Make sure that the third config is always `true` so that we are only
84
- // ever setting variables on the transaction.
85
- // Also, we're using `unshift` to undo the reverse-looping we're doing
86
- sqlSettings.unshift(sql.fragment `set_config(${sql.value(key)}, ${sql.value(value)}, true)`);
87
- }
88
- }
89
- }
90
- const sqlSettingsQuery = sqlSettings.length > 0 ? sql.compile(sql.query `select ${sql.join(sqlSettings, ', ')}`) : null;
91
- // If we can avoid transactions, we get greater performance.
92
- const needTransaction = pgForceTransaction ||
93
- !!sqlSettingsQuery ||
94
- (operationType !== 'query' && operationType !== 'subscription');
95
- // Now we've caught as many errors as we can at this stage, let's create a DB connection.
96
- const withAuthenticatedPgClient = !needTransaction
97
- ? simpleWithPgClient(pgPool)
98
- : async (cb) => {
99
- // Connect a new Postgres client
100
- const pgClient = await pgPool.connect();
101
- pgClient.on('error', swallowErrors);
102
- try {
103
- // Begin our transaction
104
- await pgClient.query('begin');
105
- try {
106
- // If there is at least one local setting, load it into the database.
107
- if (sqlSettingsQuery) {
108
- await pgClient.query(sqlSettingsQuery);
109
- }
110
- // Use the client, wait for it to be finished with, then go to 'finally'
111
- return await cb(pgClient);
112
- }
113
- finally {
114
- // Cleanup our Postgres client by ending the transaction and releasing
115
- // the client back to the pool. Always do this even if the query fails.
116
- await pgClient.query('commit');
117
- }
118
- }
119
- finally {
120
- pgClient.removeListener('error', swallowErrors);
121
- pgClient.release();
122
- }
123
- };
124
- if (singleStatement) {
125
- // TODO:v5: remove this workaround
126
- /*
127
- * This is a workaround for subscriptions; the GraphQL context is allocated
128
- * for the entire duration of the subscription, however hogging a pgClient
129
- * for more than a few milliseconds (let alone hours!) is a no-no. So we
130
- * fake a PG client that will set up the transaction each time `query` is
131
- * called. It's a very thin/dumb wrapper, so it supports nothing but
132
- * `query`.
133
- */
134
- const fakePgClient = {
135
- query(textOrQueryOptions, values, // tslint:disable-line no-any
136
- cb) {
137
- if (!textOrQueryOptions) {
138
- throw new Error('Incompatible call to singleStatement - no statement passed?');
139
- }
140
- else if (typeof textOrQueryOptions === 'object') {
141
- if (values || cb) {
142
- throw new Error('Incompatible call to singleStatement - expected no callback');
143
- }
144
- }
145
- else if (typeof textOrQueryOptions !== 'string') {
146
- throw new Error('Incompatible call to singleStatement - bad query');
147
- }
148
- else if (values && !Array.isArray(values)) {
149
- throw new Error('Incompatible call to singleStatement - bad values');
150
- }
151
- else if (cb) {
152
- throw new Error('Incompatible call to singleStatement - expected to return promise');
153
- }
154
- // Generate an authenticated client on the fly
155
- return withAuthenticatedPgClient(pgClient => pgClient.query(textOrQueryOptions, values));
156
- },
157
- }; // tslint:disable-line no-any
158
- return callback({
159
- [pgClientFromContext_1.$$pgClient]: fakePgClient,
160
- pgRole,
161
- jwtClaims,
162
- });
163
- }
164
- else {
165
- return withAuthenticatedPgClient(async (pgClient) => {
166
- let results = null;
167
- if (explain) {
168
- pgClient.startExplain();
169
- }
170
- try {
171
- return await callback({
172
- [pgClientFromContext_1.$$pgClient]: pgClient,
173
- pgRole,
174
- jwtClaims,
175
- ...(explain
176
- ? {
177
- getExplainResults: () => {
178
- results = results || pgClient.stopExplain();
179
- return results;
180
- },
181
- }
182
- : null),
183
- });
184
- }
185
- finally {
186
- if (explain) {
187
- results = results || pgClient.stopExplain();
188
- }
189
- }
190
- });
191
- }
192
- };
193
- /**
194
- * Creates a PostGraphile context object which should be passed into a GraphQL
195
- * execution. This function will also connect a client from a Postgres pool and
196
- * setup a transaction in that client.
197
- *
198
- * This function is intended to wrap a call to GraphQL-js execution like so:
199
- *
200
- * ```js
201
- * const result = await withPostGraphileContext({
202
- * pgPool,
203
- * jwtToken,
204
- * jwtSecret,
205
- * pgDefaultRole,
206
- * }, async context => {
207
- * return await graphql(
208
- * schema,
209
- * query,
210
- * null,
211
- * { ...context },
212
- * variables,
213
- * operationName,
214
- * );
215
- * });
216
- * ```
217
- */
218
- const withPostGraphileContext = async (options, callback) => {
219
- const pluginHook = pluginHook_1.pluginHookFromOptions(options);
220
- const withContext = pluginHook('withPostGraphileContext', withDefaultPostGraphileContext, {
221
- options,
222
- });
223
- return withContext(options, callback);
224
- };
225
- exports.default = withPostGraphileContext;
226
- /**
227
- * Sets up the Postgres client transaction by decoding the JSON web token and
228
- * doing some other cool things.
229
- */
230
- // THIS METHOD SHOULD NEVER RETURN EARLY. If this method returns early then it
231
- // may skip the super important step of setting the role on the Postgres
232
- // client. If this happens it’s a huge security vulnerability. Never using the
233
- // keyword `return` in this function is a good first step. You can still throw
234
- // errors, however, as this will stop the request execution.
235
- async function getSettingsForPgClientTransaction({ jwtToken, jwtSecret, jwtPublicKey, jwtAudiences, jwtRole, jwtVerifyOptions, pgDefaultRole, pgSettings, }) {
236
- // Setup our default role. Once we decode our token, the role may change.
237
- let role = pgDefaultRole;
238
- let jwtClaims = {};
239
- // If we were provided a JWT token, let us try to verify it. If verification
240
- // fails we want to throw an error.
241
- if (jwtToken) {
242
- // Try to run `jwt.verify`. If it fails, capture the error and re-throw it
243
- // as a 403 error because the token is not trustworthy.
244
- try {
245
- const jwtVerificationSecret = jwtPublicKey || jwtSecret;
246
- // If a JWT token was defined, but a secret was not provided to the server or
247
- // secret had unsupported type, throw a 403 error.
248
- if (!Buffer.isBuffer(jwtVerificationSecret) &&
249
- typeof jwtVerificationSecret !== 'string' &&
250
- typeof jwtVerificationSecret !== 'function') {
251
- // tslint:disable-next-line no-console
252
- console.error(`ERROR: '${jwtPublicKey ? 'jwtPublicKey' : 'jwtSecret'}' was not set to a string or buffer - rejecting JWT-authenticated request.`);
253
- throw new Error('Not allowed to provide a JWT token.');
254
- }
255
- if (jwtAudiences != null && jwtVerifyOptions && 'audience' in jwtVerifyOptions)
256
- throw new Error(`Provide either 'jwtAudiences' or 'jwtVerifyOptions.audience' but not both`);
257
- const claims = await new Promise((resolve, reject) => {
258
- jwt.verify(jwtToken, jwtVerificationSecret, {
259
- ...jwtVerifyOptions,
260
- audience: jwtAudiences ||
261
- (jwtVerifyOptions && 'audience' in jwtVerifyOptions
262
- ? undefinedIfEmpty(jwtVerifyOptions.audience)
263
- : ['postgraphile']),
264
- }, (err, decoded) => {
265
- if (err)
266
- reject(err);
267
- else
268
- resolve(decoded);
269
- });
270
- });
271
- if (typeof claims === 'string') {
272
- throw new Error('Invalid JWT payload');
273
- }
274
- // jwt.verify returns `object | string`; but the `object` part is really a map
275
- jwtClaims = claims;
276
- const roleClaim = getPath(jwtClaims, jwtRole);
277
- // If there is a `role` property in the claims, use that instead of our
278
- // default role.
279
- if (typeof roleClaim !== 'undefined') {
280
- if (typeof roleClaim !== 'string')
281
- throw new Error(`JWT \`role\` claim must be a string. Instead found '${typeof jwtClaims['role']}'.`);
282
- role = roleClaim;
283
- }
284
- }
285
- catch (error) {
286
- // In case this error is thrown in an HTTP context, we want to add status code
287
- // Note. jwt.verify will add a name key to its errors. (https://github.com/auth0/node-jsonwebtoken#errors--codes)
288
- error.statusCode =
289
- 'name' in error && error.name === 'TokenExpiredError'
290
- ? // The correct status code for an expired ( but otherwise acceptable token is 401 )
291
- 401
292
- : // All other authentication errors should get a 403 status code.
293
- 403;
294
- throw error;
295
- }
296
- }
297
- // Instantiate a map of local settings. This map will be transformed into a
298
- // Sql query.
299
- const localSettings = [];
300
- // Set the custom provided settings before jwt claims and role are set
301
- // this prevents an accidentional overwriting
302
- if (pgSettings && typeof pgSettings === 'object') {
303
- for (const key in pgSettings) {
304
- if (Object.prototype.hasOwnProperty.call(pgSettings, key) &&
305
- isPgSettingValid(pgSettings[key])) {
306
- if (key === 'role') {
307
- role = String(pgSettings[key]);
308
- }
309
- else {
310
- localSettings.push([key, String(pgSettings[key])]);
311
- }
312
- }
313
- }
314
- }
315
- // If there is a rule, we want to set the root `role` setting locally
316
- // to be our role. The role may only be null if we have no default role.
317
- if (typeof role === 'string') {
318
- localSettings.push(['role', role]);
319
- }
320
- // If we have some JWT claims, we want to set those claims as local
321
- // settings with the namespace `jwt.claims`.
322
- for (const key in jwtClaims) {
323
- if (Object.prototype.hasOwnProperty.call(jwtClaims, key)) {
324
- const rawValue = jwtClaims[key];
325
- // Unsafe to pass raw object/array to pg.query -> set_config; instead JSONify
326
- const value = rawValue != null && typeof rawValue === 'object' ? JSON.stringify(rawValue) : rawValue;
327
- if (isPgSettingValid(value)) {
328
- localSettings.push([`jwt.claims.${key}`, String(value)]);
329
- }
330
- }
331
- }
332
- return {
333
- localSettings,
334
- role,
335
- jwtClaims: jwtToken ? jwtClaims : null,
336
- };
337
- }
338
- const $$pgClientOrigQuery = Symbol();
339
- /**
340
- * Monkey-patches the `query` method of a pg Client to add debugging
341
- * functionality. Use with care.
342
- */
343
- function debugPgClient(pgClient, allowExplain = false) {
344
- // If Postgres debugging is enabled, enhance our query function by adding
345
- // a debug statement.
346
- if (!pgClient[$$pgClientOrigQuery]) {
347
- // Set the original query method to a key on our client. If that key is
348
- // already set, use that.
349
- pgClient[$$pgClientOrigQuery] = pgClient.query;
350
- pgClient.startExplain = () => {
351
- pgClient._explainResults = [];
352
- };
353
- pgClient.stopExplain = async () => {
354
- const results = pgClient._explainResults;
355
- pgClient._explainResults = null;
356
- if (!results) {
357
- return Promise.resolve([]);
358
- }
359
- return (await Promise.all(results.map(async (r) => {
360
- const { result: resultPromise, ...rest } = r;
361
- const result = await resultPromise;
362
- const firstKey = result && result[0] && Object.keys(result[0])[0];
363
- if (!firstKey) {
364
- return null;
365
- }
366
- const plan = result.map((r) => r[firstKey]).join('\n');
367
- return {
368
- ...rest,
369
- plan,
370
- };
371
- }))).filter((entry) => !!entry);
372
- };
373
- if (debugPgNotice.enabled) {
374
- pgClient.on('notice', (msg) => {
375
- debugPgErrorObject(debugPgNotice, msg);
376
- });
377
- }
378
- const logError = (error) => {
379
- if (error.name && error['severity']) {
380
- debugPgErrorObject(debugPgError, error);
381
- }
382
- else {
383
- debugPgError('%O', error);
384
- }
385
- };
386
- if (debugPg.enabled || debugPgNotice.enabled || allowExplain) {
387
- // tslint:disable-next-line only-arrow-functions
388
- pgClient.query = function (...args) {
389
- const [a, b, c] = args;
390
- // If we understand it (and it uses the promises API)
391
- if ((typeof a === 'string' && !c && (!b || Array.isArray(b))) ||
392
- (typeof a === 'object' && !b && !c)) {
393
- if (debugPg.enabled) {
394
- // Debug just the query text. We don’t want to debug variables because
395
- // there may be passwords in there.
396
- debugPg('%s', postgraphile_core_1.formatSQLForDebugging(a && a.text ? a.text : a));
397
- }
398
- if (pgClient._explainResults) {
399
- const query = a && a.text ? a.text : a;
400
- const values = a && a.text ? a.values : b;
401
- if (query.match(/^\s*(select|insert|update|delete|with)\s/i) && !query.includes(';')) {
402
- // Explain it
403
- const explain = `explain ${query}`;
404
- pgClient._explainResults.push({
405
- query,
406
- result: pgClient[$$pgClientOrigQuery]
407
- .call(this, explain, values)
408
- .then((data) => data.rows)
409
- // swallow errors during explain
410
- .catch(() => null),
411
- });
412
- }
413
- }
414
- const promiseResult = pgClient[$$pgClientOrigQuery].apply(this, args);
415
- if (debugPgError.enabled) {
416
- // Report the error with our Postgres debugger.
417
- promiseResult.catch(logError);
418
- }
419
- return promiseResult;
420
- }
421
- else {
422
- // We don't understand it (e.g. `pgPool.query`), just let it happen.
423
- return pgClient[$$pgClientOrigQuery].apply(this, args);
424
- }
425
- };
426
- }
427
- }
428
- return pgClient;
429
- }
430
- exports.debugPgClient = debugPgClient;
431
- /**
432
- * Safely gets the value at `path` (array of keys) of `inObject`.
433
- *
434
- * @private
435
- */
436
- function getPath(inObject, path) {
437
- let object = inObject;
438
- // From https://github.com/lodash/lodash/blob/master/.internal/baseGet.js
439
- let index = 0;
440
- const length = path.length;
441
- while (object && index < length) {
442
- object = object[path[index++]];
443
- }
444
- return index && index === length ? object : undefined;
445
- }
446
- /**
447
- * Check if a pgSetting is a string or a number.
448
- * Null and Undefined settings are not valid and will be ignored.
449
- * pgSettings of other types throw an error.
450
- *
451
- * @private
452
- */
453
- function isPgSettingValid(pgSetting) {
454
- if (pgSetting === undefined || pgSetting === null) {
455
- return false;
456
- }
457
- const typeOfPgSetting = typeof pgSetting;
458
- if (typeOfPgSetting === 'string' ||
459
- typeOfPgSetting === 'number' ||
460
- typeOfPgSetting === 'boolean') {
461
- return true;
462
- }
463
- // TODO: booleans!
464
- throw new Error(`Error converting pgSetting: ${typeof pgSetting} needs to be of type string, number or boolean.`);
465
- }
466
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aFBvc3RHcmFwaGlsZUNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9zdGdyYXBoaWxlL3dpdGhQb3N0R3JhcGhpbGVDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHdDQUF5QztBQUN6QyxvQ0FBcUM7QUFFckMscUNBQXlFO0FBQ3pFLCtCQUErQjtBQUMvQixtRkFBdUU7QUFDdkUsNkNBQXFEO0FBRXJELHlEQUEwRDtBQUUxRCxNQUFNLGdCQUFnQixHQUFHLENBQ3ZCLENBQTRDLEVBQ1UsRUFBRSxDQUN4RCxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQVl2RCxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsdUJBQXVCLENBQUMsQ0FBQztBQUN4RCxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUNuRSxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsOEJBQThCLENBQUMsQ0FBQztBQUVyRTs7R0FFRztBQUNILFNBQVMsa0JBQWtCLENBQUMsT0FBaUMsRUFBRSxNQUFnQjtJQUM3RSxPQUFPLENBQ0wsY0FBYyxFQUNkLE1BQU0sQ0FBQyxRQUFRLElBQUksT0FBTyxFQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUNyQyxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sRUFDeEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsYUFBYSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxNQUFN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
@@ -1,8 +0,0 @@
1
- import { mixed } from '../../interfaces';
2
- import { PoolClient } from 'pg';
3
- export declare const $$pgClient = "pgClient";
4
- /**
5
- * Retrieves a Postgres client from a context, throwing an error if such a
6
- * client does not exist.
7
- */
8
- export default function getPgClientFromContext(context: mixed): PoolClient;