graphile-build-pg 4.12.2 → 4.13.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 CHANGED
@@ -23,10 +23,17 @@ maintenance and development via sponsorship.
23
23
  And please give some love to our featured sponsors 🤩:
24
24
 
25
25
  <table><tr>
26
+ <td align="center"><a href="https://surge.io/"><img src="https://graphile.org/images/sponsors/surge.png" width="90" height="90" alt="Surge" /><br />Surge</a> *</td>
27
+ <td align="center"><a href="https://www.netflix.com/"><img src="https://graphile.org/images/sponsors/Netflix.png" width="90" height="90" alt="Netflix" /><br />Netflix</a> *</td>
28
+ <td align="center"><a href="https://qwick.com/"><img src="https://graphile.org/images/sponsors/qwick.png" width="90" height="90" alt="Qwick" /><br />Qwick</a> *</td>
29
+ <td align="center"><a href="https://www.the-guild.dev/"><img src="https://graphile.org/images/sponsors/theguild.png" width="90" height="90" alt="The Guild" /><br />The Guild</a> *</td>
30
+ </tr><tr>
26
31
  <td align="center"><a href="http://chads.website"><img src="https://graphile.org/images/sponsors/chadf.png" width="90" height="90" alt="Chad Furman" /><br />Chad Furman</a> *</td>
27
- <td align="center"><a href="https://storyscript.com/?utm_source=postgraphile"><img src="https://graphile.org/images/sponsors/storyscript.png" width="90" height="90" alt="Storyscript" /><br />Storyscript</a> *</td>
28
- <td align="center"><a href="https://postlight.com/?utm_source=graphile"><img src="https://graphile.org/images/sponsors/postlight.jpg" width="90" height="90" alt="Postlight" /><br />Postlight</a> *</td>
29
- <td align="center"><a href="https://surge.io/"><img src="https://graphile.org/images/sponsors/surge.png" width="90" height="90" alt="Surge.io" /><br />Surge.io</a> *</td>
32
+ <td align="center"><a href="https://www.fanatics.com/"><img src="https://graphile.org/images/sponsors/fanatics.png" width="90" height="90" alt="Fanatics" /><br />Fanatics</a> *</td>
33
+ <td align="center"><a href="https://dovetailapp.com/"><img src="https://graphile.org/images/sponsors/dovetail.png" width="90" height="90" alt="Dovetail" /><br />Dovetail</a> *</td>
34
+ <td align="center"><a href="https://www.enzuzo.com/"><img src="https://graphile.org/images/sponsors/enzuzo.png" width="90" height="90" alt="Enzuzo" /><br />Enzuzo</a> *</td>
35
+ </tr><tr>
36
+ <td align="center"><a href="https://stellate.co/"><img src="https://graphile.org/images/sponsors/Stellate.png" width="90" height="90" alt="Stellate" /><br />Stellate</a> *</td>
30
37
  </tr></table>
31
38
 
32
39
  <em>\* Sponsors the entire Graphile suite</em>
package/node8plus/omit.js CHANGED
@@ -57,7 +57,7 @@ function parse(arrOrNot, errorPrefix = "Error") {
57
57
  }
58
58
 
59
59
  if (str[0] === ":") {
60
- const perms = str.substr(1).split("").map(p => aliases[p]);
60
+ const perms = str.slice(1).split("").map(p => aliases[p]);
61
61
  const bad = perms.find(p => !p);
62
62
 
63
63
  if (bad) {
@@ -50,7 +50,7 @@ function parse(arrOrNot, errorPrefix = "Error") {
50
50
  }
51
51
  if (str[0] === ":") {
52
52
  const perms = str
53
- .substr(1)
53
+ .slice(1)
54
54
  .split("")
55
55
  .map(p => aliases[p]);
56
56
  const bad = perms.find(p => !p);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/omit.js"],"names":["CREATE","READ","UPDATE","DELETE","FILTER","ORDER","ALL","MANY","EXECUTE","BASE","aliases","C","R","U","D","F","O","A","M","X","B","PERMISSIONS_THAT_REQUIRE_READ","parse","arrOrNot","errorPrefix","arr","Array","isArray","all","arrayNormalized","concat","map","str","perms","substr","split","p","bad","find","Error","omit","entity","permission","tags","omitSpecRaw","includeSpecRaw","kind","name","omitSpec","includeSpec","indexOf","filter","length","join"],"mappings":"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","sourcesContent":["// @flow\n\nimport type {\n PgProc,\n PgClass,\n PgAttribute,\n PgConstraint,\n} from \"./plugins/PgIntrospectionPlugin\";\n\n/*\n * Please only use capitals for aliases and lower case for the values.\n */\nexport const CREATE = \"create\";\nexport const READ = \"read\";\nexport const UPDATE = \"update\";\nexport const DELETE = \"delete\";\nexport const FILTER = \"filter\";\nexport const ORDER = \"order\";\nexport const ALL = \"all\";\nexport const MANY = \"many\";\nexport const EXECUTE = \"execute\";\nexport const BASE = \"base\";\n\nconst aliases = {\n C: CREATE,\n R: READ,\n U: UPDATE,\n D: DELETE,\n F: FILTER,\n O: ORDER,\n A: ALL,\n M: MANY,\n X: EXECUTE,\n B: BASE,\n};\n\nconst PERMISSIONS_THAT_REQUIRE_READ = [UPDATE, CREATE, DELETE, ALL, MANY];\n\nfunction parse(arrOrNot, errorPrefix = \"Error\") {\n if (!arrOrNot) {\n return null;\n }\n const arr = Array.isArray(arrOrNot) ? arrOrNot : [arrOrNot];\n let all = false;\n const arrayNormalized = [].concat(\n ...arr.map(str => {\n if (str === true || str === \"*\") {\n all = true;\n return [];\n }\n if (str[0] === \":\") {\n const perms = str\n .substr(1)\n .split(\"\")\n .map(p => aliases[p]);\n const bad = perms.find(p => !p);\n if (bad) {\n throw new Error(\n `${errorPrefix} - abbreviated parameter '${bad}' not understood`\n );\n }\n return perms;\n } else {\n const perms = str.split(\",\");\n // TODO: warning if not in list?\n return perms;\n }\n })\n );\n if (all) {\n return true;\n }\n return arrayNormalized;\n}\n\nexport default function omit(\n entity: PgProc | PgClass | PgAttribute | PgConstraint,\n permission: string\n) {\n const tags = entity.tags;\n const omitSpecRaw = tags.omit;\n\n // '@include' is not being released yet because it would mean every new\n // filter we added would become a breaking change for people using @include.\n const includeSpecRaw = null;\n // const includeSpecRaw = tags.include;\n\n if (omitSpecRaw && includeSpecRaw) {\n throw new Error(\n `Error when processing instructions for ${entity.kind} '${entity.name}' - you must only specify @omit or @include, not both`\n );\n }\n const omitSpec = parse(\n omitSpecRaw,\n `Error when processing @omit instructions for ${entity.kind} '${entity.name}'`\n );\n const includeSpec = parse(\n includeSpecRaw,\n `Error when processing @include instructions for ${entity.kind} '${entity.name}'`\n );\n\n if (omitSpec) {\n if (omitSpec === true) {\n return true;\n }\n if (omitSpec.indexOf(READ) >= 0) {\n const bad = PERMISSIONS_THAT_REQUIRE_READ.filter(\n p => omitSpec.indexOf(p) === -1\n );\n if (bad.length > 0) {\n throw new Error(\n `Processing @omit for ${entity.kind} '${entity.name}' - '${bad.join(\n \",\"\n )}' must be omitted when '${READ}' is omitted. Add '${bad.join(\n \",\"\n )}' to the @omit clause, or use '@omit' to omit all actions.`\n );\n }\n }\n return omitSpec.indexOf(permission) >= 0;\n } else if (includeSpec) {\n if (includeSpec === true) {\n throw new Error(\n `Error when processing instructions for ${entity.kind} '${entity.name}' - @include should specify a list of actions`\n );\n }\n if (includeSpec.indexOf(READ) === -1) {\n const bad = PERMISSIONS_THAT_REQUIRE_READ.find(\n p => includeSpec.indexOf(p) >= 0\n );\n if (bad) {\n throw new Error(\n `Error when processing @include for ${entity.kind} '${entity.name}' - we currently don't support '${bad}' when '${READ}' is forbidden`\n );\n }\n }\n return includeSpec.indexOf(permission) === -1;\n } else {\n return false;\n }\n}\n"],"file":"omit.js"}
1
+ {"version":3,"sources":["../src/omit.js"],"names":["CREATE","READ","UPDATE","DELETE","FILTER","ORDER","ALL","MANY","EXECUTE","BASE","aliases","C","R","U","D","F","O","A","M","X","B","PERMISSIONS_THAT_REQUIRE_READ","parse","arrOrNot","errorPrefix","arr","Array","isArray","all","arrayNormalized","concat","map","str","perms","slice","split","p","bad","find","Error","omit","entity","permission","tags","omitSpecRaw","includeSpecRaw","kind","name","omitSpec","includeSpec","indexOf","filter","length","join"],"mappings":"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","sourcesContent":["// @flow\n\nimport type {\n PgProc,\n PgClass,\n PgAttribute,\n PgConstraint,\n} from \"./plugins/PgIntrospectionPlugin\";\n\n/*\n * Please only use capitals for aliases and lower case for the values.\n */\nexport const CREATE = \"create\";\nexport const READ = \"read\";\nexport const UPDATE = \"update\";\nexport const DELETE = \"delete\";\nexport const FILTER = \"filter\";\nexport const ORDER = \"order\";\nexport const ALL = \"all\";\nexport const MANY = \"many\";\nexport const EXECUTE = \"execute\";\nexport const BASE = \"base\";\n\nconst aliases = {\n C: CREATE,\n R: READ,\n U: UPDATE,\n D: DELETE,\n F: FILTER,\n O: ORDER,\n A: ALL,\n M: MANY,\n X: EXECUTE,\n B: BASE,\n};\n\nconst PERMISSIONS_THAT_REQUIRE_READ = [UPDATE, CREATE, DELETE, ALL, MANY];\n\nfunction parse(arrOrNot, errorPrefix = \"Error\") {\n if (!arrOrNot) {\n return null;\n }\n const arr = Array.isArray(arrOrNot) ? arrOrNot : [arrOrNot];\n let all = false;\n const arrayNormalized = [].concat(\n ...arr.map(str => {\n if (str === true || str === \"*\") {\n all = true;\n return [];\n }\n if (str[0] === \":\") {\n const perms = str\n .slice(1)\n .split(\"\")\n .map(p => aliases[p]);\n const bad = perms.find(p => !p);\n if (bad) {\n throw new Error(\n `${errorPrefix} - abbreviated parameter '${bad}' not understood`\n );\n }\n return perms;\n } else {\n const perms = str.split(\",\");\n // TODO: warning if not in list?\n return perms;\n }\n })\n );\n if (all) {\n return true;\n }\n return arrayNormalized;\n}\n\nexport default function omit(\n entity: PgProc | PgClass | PgAttribute | PgConstraint,\n permission: string\n) {\n const tags = entity.tags;\n const omitSpecRaw = tags.omit;\n\n // '@include' is not being released yet because it would mean every new\n // filter we added would become a breaking change for people using @include.\n const includeSpecRaw = null;\n // const includeSpecRaw = tags.include;\n\n if (omitSpecRaw && includeSpecRaw) {\n throw new Error(\n `Error when processing instructions for ${entity.kind} '${entity.name}' - you must only specify @omit or @include, not both`\n );\n }\n const omitSpec = parse(\n omitSpecRaw,\n `Error when processing @omit instructions for ${entity.kind} '${entity.name}'`\n );\n const includeSpec = parse(\n includeSpecRaw,\n `Error when processing @include instructions for ${entity.kind} '${entity.name}'`\n );\n\n if (omitSpec) {\n if (omitSpec === true) {\n return true;\n }\n if (omitSpec.indexOf(READ) >= 0) {\n const bad = PERMISSIONS_THAT_REQUIRE_READ.filter(\n p => omitSpec.indexOf(p) === -1\n );\n if (bad.length > 0) {\n throw new Error(\n `Processing @omit for ${entity.kind} '${entity.name}' - '${bad.join(\n \",\"\n )}' must be omitted when '${READ}' is omitted. Add '${bad.join(\n \",\"\n )}' to the @omit clause, or use '@omit' to omit all actions.`\n );\n }\n }\n return omitSpec.indexOf(permission) >= 0;\n } else if (includeSpec) {\n if (includeSpec === true) {\n throw new Error(\n `Error when processing instructions for ${entity.kind} '${entity.name}' - @include should specify a list of actions`\n );\n }\n if (includeSpec.indexOf(READ) === -1) {\n const bad = PERMISSIONS_THAT_REQUIRE_READ.find(\n p => includeSpec.indexOf(p) >= 0\n );\n if (bad) {\n throw new Error(\n `Error when processing @include for ${entity.kind} '${entity.name}' - we currently don't support '${bad}' when '${READ}' is forbidden`\n );\n }\n }\n return includeSpec.indexOf(permission) === -1;\n } else {\n return false;\n }\n}\n"],"file":"omit.js"}
@@ -27,7 +27,7 @@ const getComputedColumnDetails = (build, table, proc) => {
27
27
  return null;
28
28
  }
29
29
 
30
- const pseudoColumnName = proc.name.substr(table.name.length + 1);
30
+ const pseudoColumnName = proc.name.slice(table.name.length + 1);
31
31
  return {
32
32
  argTypes,
33
33
  pseudoColumnName
@@ -32,7 +32,7 @@ export const getComputedColumnDetails = (
32
32
  return null;
33
33
  }
34
34
 
35
- const pseudoColumnName = proc.name.substr(table.name.length + 1);
35
+ const pseudoColumnName = proc.name.slice(table.name.length + 1);
36
36
  return { argTypes, pseudoColumnName };
37
37
  };
38
38
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/PgComputedColumnsPlugin.js"],"names":["getComputedColumnDetails","build","table","proc","isStable","namespaceId","name","startsWith","argTypeIds","length","type","id","argTypes","reduce","prev","typeId","idx","argModes","push","pgIntrospectionResultsByKind","typeById","slice","some","class","isSelectable","pseudoColumnName","substr","PgComputedColumnsPlugin","builder","pgSimpleCollections","hook","fields","context","scope","isPgRowType","isPgCompoundType","isInputType","pgIntrospection","fieldWithHooks","Self","kind","namespace","extend","introspectionResultsByKind","inflection","pgOmit","omit","pgMakeProcField","makeProcField","swallowError","describePgEntity","sqlCommentByAddingTags","tableType","Error","procedure","memo","computedColumnDetails","makeField","forceList","fieldName","computedColumnList","computedColumn","computed","e","simpleCollections","tags","hasConnections","hasSimpleCollections","returnsSet"],"mappings":"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","sourcesContent":["// @flow\nimport type { Plugin, Build } from \"graphile-build\";\nimport type { PgClass, PgProc } from \"./PgIntrospectionPlugin\";\n\nexport const getComputedColumnDetails = (\n build: Build,\n table: PgClass,\n proc: PgProc\n) => {\n if (!proc.isStable) return null;\n if (proc.namespaceId !== table.namespaceId) return null;\n if (!proc.name.startsWith(`${table.name}_`)) return null;\n if (proc.argTypeIds.length < 1) return null;\n if (proc.argTypeIds[0] !== table.type.id) return null;\n\n const argTypes = proc.argTypeIds.reduce((prev, typeId, idx) => {\n if (\n proc.argModes.length === 0 || // all args are `in`\n proc.argModes[idx] === \"i\" || // this arg is `in`\n proc.argModes[idx] === \"b\" // this arg is `inout`\n ) {\n prev.push(build.pgIntrospectionResultsByKind.typeById[typeId]);\n }\n return prev;\n }, []);\n if (\n argTypes\n .slice(1)\n .some(type => type.type === \"c\" && type.class && type.class.isSelectable)\n ) {\n // Accepts two input tables? Skip.\n return null;\n }\n\n const pseudoColumnName = proc.name.substr(table.name.length + 1);\n return { argTypes, pseudoColumnName };\n};\n\nexport default (function PgComputedColumnsPlugin(\n builder,\n { pgSimpleCollections }\n) {\n builder.hook(\n \"GraphQLObjectType:fields\",\n (fields, build, context) => {\n const {\n scope: {\n isPgRowType,\n isPgCompoundType,\n isInputType,\n pgIntrospection: table,\n },\n fieldWithHooks,\n Self,\n } = context;\n\n if (\n isInputType ||\n !(isPgRowType || isPgCompoundType) ||\n !table ||\n table.kind !== \"class\" ||\n !table.namespace\n ) {\n return fields;\n }\n\n const {\n extend,\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n inflection,\n pgOmit: omit,\n pgMakeProcField: makeProcField,\n swallowError,\n describePgEntity,\n sqlCommentByAddingTags,\n } = build;\n const tableType = table.type;\n if (!tableType) {\n throw new Error(\"Could not determine the type for this table\");\n }\n return extend(\n fields,\n introspectionResultsByKind.procedure.reduce((memo, proc) => {\n if (omit(proc, \"execute\")) return memo;\n const computedColumnDetails = getComputedColumnDetails(\n build,\n table,\n proc\n );\n if (!computedColumnDetails) return memo;\n const { pseudoColumnName } = computedColumnDetails;\n function makeField(forceList) {\n const fieldName = forceList\n ? inflection.computedColumnList(pseudoColumnName, proc, table)\n : inflection.computedColumn(pseudoColumnName, proc, table);\n try {\n memo = extend(\n memo,\n {\n [fieldName]: makeProcField(fieldName, proc, build, {\n fieldWithHooks,\n computed: true,\n forceList,\n }),\n },\n `Adding computed column for ${describePgEntity(\n proc\n )}. You can rename this field with a 'Smart Comment':\\n\\n ${sqlCommentByAddingTags(\n proc,\n {\n fieldName: \"newNameHere\",\n }\n )}`\n );\n } catch (e) {\n swallowError(e);\n }\n }\n const simpleCollections =\n proc.tags.simpleCollections || pgSimpleCollections;\n const hasConnections = simpleCollections !== \"only\";\n const hasSimpleCollections =\n simpleCollections === \"only\" || simpleCollections === \"both\";\n if (!proc.returnsSet || hasConnections) {\n makeField(false);\n }\n if (proc.returnsSet && hasSimpleCollections) {\n makeField(true);\n }\n return memo;\n }, {}),\n `Adding computed column to '${Self.name}'`\n );\n },\n [\"PgComputedColumns\"]\n );\n}: Plugin);\n"],"file":"PgComputedColumnsPlugin.js"}
1
+ {"version":3,"sources":["../../src/plugins/PgComputedColumnsPlugin.js"],"names":["getComputedColumnDetails","build","table","proc","isStable","namespaceId","name","startsWith","argTypeIds","length","type","id","argTypes","reduce","prev","typeId","idx","argModes","push","pgIntrospectionResultsByKind","typeById","slice","some","class","isSelectable","pseudoColumnName","PgComputedColumnsPlugin","builder","pgSimpleCollections","hook","fields","context","scope","isPgRowType","isPgCompoundType","isInputType","pgIntrospection","fieldWithHooks","Self","kind","namespace","extend","introspectionResultsByKind","inflection","pgOmit","omit","pgMakeProcField","makeProcField","swallowError","describePgEntity","sqlCommentByAddingTags","tableType","Error","procedure","memo","computedColumnDetails","makeField","forceList","fieldName","computedColumnList","computedColumn","computed","e","simpleCollections","tags","hasConnections","hasSimpleCollections","returnsSet"],"mappings":"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","sourcesContent":["// @flow\nimport type { Plugin, Build } from \"graphile-build\";\nimport type { PgClass, PgProc } from \"./PgIntrospectionPlugin\";\n\nexport const getComputedColumnDetails = (\n build: Build,\n table: PgClass,\n proc: PgProc\n) => {\n if (!proc.isStable) return null;\n if (proc.namespaceId !== table.namespaceId) return null;\n if (!proc.name.startsWith(`${table.name}_`)) return null;\n if (proc.argTypeIds.length < 1) return null;\n if (proc.argTypeIds[0] !== table.type.id) return null;\n\n const argTypes = proc.argTypeIds.reduce((prev, typeId, idx) => {\n if (\n proc.argModes.length === 0 || // all args are `in`\n proc.argModes[idx] === \"i\" || // this arg is `in`\n proc.argModes[idx] === \"b\" // this arg is `inout`\n ) {\n prev.push(build.pgIntrospectionResultsByKind.typeById[typeId]);\n }\n return prev;\n }, []);\n if (\n argTypes\n .slice(1)\n .some(type => type.type === \"c\" && type.class && type.class.isSelectable)\n ) {\n // Accepts two input tables? Skip.\n return null;\n }\n\n const pseudoColumnName = proc.name.slice(table.name.length + 1);\n return { argTypes, pseudoColumnName };\n};\n\nexport default (function PgComputedColumnsPlugin(\n builder,\n { pgSimpleCollections }\n) {\n builder.hook(\n \"GraphQLObjectType:fields\",\n (fields, build, context) => {\n const {\n scope: {\n isPgRowType,\n isPgCompoundType,\n isInputType,\n pgIntrospection: table,\n },\n fieldWithHooks,\n Self,\n } = context;\n\n if (\n isInputType ||\n !(isPgRowType || isPgCompoundType) ||\n !table ||\n table.kind !== \"class\" ||\n !table.namespace\n ) {\n return fields;\n }\n\n const {\n extend,\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n inflection,\n pgOmit: omit,\n pgMakeProcField: makeProcField,\n swallowError,\n describePgEntity,\n sqlCommentByAddingTags,\n } = build;\n const tableType = table.type;\n if (!tableType) {\n throw new Error(\"Could not determine the type for this table\");\n }\n return extend(\n fields,\n introspectionResultsByKind.procedure.reduce((memo, proc) => {\n if (omit(proc, \"execute\")) return memo;\n const computedColumnDetails = getComputedColumnDetails(\n build,\n table,\n proc\n );\n if (!computedColumnDetails) return memo;\n const { pseudoColumnName } = computedColumnDetails;\n function makeField(forceList) {\n const fieldName = forceList\n ? inflection.computedColumnList(pseudoColumnName, proc, table)\n : inflection.computedColumn(pseudoColumnName, proc, table);\n try {\n memo = extend(\n memo,\n {\n [fieldName]: makeProcField(fieldName, proc, build, {\n fieldWithHooks,\n computed: true,\n forceList,\n }),\n },\n `Adding computed column for ${describePgEntity(\n proc\n )}. You can rename this field with a 'Smart Comment':\\n\\n ${sqlCommentByAddingTags(\n proc,\n {\n fieldName: \"newNameHere\",\n }\n )}`\n );\n } catch (e) {\n swallowError(e);\n }\n }\n const simpleCollections =\n proc.tags.simpleCollections || pgSimpleCollections;\n const hasConnections = simpleCollections !== \"only\";\n const hasSimpleCollections =\n simpleCollections === \"only\" || simpleCollections === \"both\";\n if (!proc.returnsSet || hasConnections) {\n makeField(false);\n }\n if (proc.returnsSet && hasSimpleCollections) {\n makeField(true);\n }\n return memo;\n }, {}),\n `Adding computed column to '${Self.name}'`\n );\n },\n [\"PgComputedColumns\"]\n );\n}: Plugin);\n"],"file":"PgComputedColumnsPlugin.js"}
@@ -52,7 +52,7 @@ const removeQuotes = str => {
52
52
  throw new Error(`We failed to parse a quoted identifier '${str}'. Please avoid putting quotes or commas in smart comment identifiers (or file a PR to fix the parser).`);
53
53
  }
54
54
 
55
- return trimmed.substr(1, trimmed.length - 2);
55
+ return trimmed.slice(1, -1);
56
56
  } else {
57
57
  // PostgreSQL lower-cases unquoted columns, so we should too.
58
58
  return trimmed.toLowerCase();
@@ -318,7 +318,7 @@ function enumTables(introspectionResults) {
318
318
  const data = allData.filter(row => row[col.name] != null);
319
319
 
320
320
  if (data.length < 1) {
321
- throw new Error(`Enum table "${klass.namespaceName}"."${klass.name}" contains no entries for enum constraint '${constraint.name}'.`);
321
+ throw new Error(`Enum table "${klass.namespaceName}"."${klass.name}" contains no visible entries for enum constraint '${constraint.name}'. Check that the table contains at least one row and that the rows are not hidden by row-level security policies.`);
322
322
  } // Create fake enum type
323
323
 
324
324
 
@@ -245,7 +245,7 @@ const removeQuotes = str => {
245
245
  `We failed to parse a quoted identifier '${str}'. Please avoid putting quotes or commas in smart comment identifiers (or file a PR to fix the parser).`
246
246
  );
247
247
  }
248
- return trimmed.substr(1, trimmed.length - 2);
248
+ return trimmed.slice(1, -1);
249
249
  } else {
250
250
  // PostgreSQL lower-cases unquoted columns, so we should too.
251
251
  return trimmed.toLowerCase();
@@ -546,7 +546,7 @@ function enumTables(introspectionResults) {
546
546
  const data = allData.filter(row => row[col.name] != null);
547
547
  if (data.length < 1) {
548
548
  throw new Error(
549
- `Enum table "${klass.namespaceName}"."${klass.name}" contains no entries for enum constraint '${constraint.name}'.`
549
+ `Enum table "${klass.namespaceName}"."${klass.name}" contains no visible entries for enum constraint '${constraint.name}'. Check that the table contains at least one row and that the rows are not hidden by row-level security policies.`
550
550
  );
551
551
  }
552
552
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/PgIntrospectionPlugin.js"],"names":["debug","WATCH_FIXTURES_PATH","__dirname","readFile","filename","encoding","Promise","resolve","reject","err","res","removeQuotes","str","trimmed","trim","length","Error","substr","toLowerCase","parseSqlColumnArray","parts","split","map","parseSqlColumnString","parseConstraintSpec","rawSpec","spec","tagComponents","parsed","join","tags","description","text","smartCommentConstraints","introspectionResults","attributesByNames","tbl","cols","debugStr","attributes","attribute","filter","a","classId","id","sort","b","num","pk","constraint","find","c","type","keyAttributeNums","n","namespaceName","name","colName","attr","class","forEach","klass","namespace","namespaceId","addKey","key","isPrimary","tag","keySpec","columns","notNull","fakeConstraint","kind","isFake","isIndexed","Math","random","foreignClassId","comment","foreignKeyAttributeNums","push","primaryKey","unique","Array","isArray","getType","t","typeId","foreignKey","foreignKeys","fkSpecRaw","index","fkSpec","matches","match","rawColumns","rawSchemaOrTable","rawTableOnly","rawForeignColumns","rawSchema","rawTable","foreignSchema","foreignTable","foreignColumns","foreignKlass","k","foreignNamespace","isEnumConstraint","con","isEnumTable","isPrimaryKey","isUniqueConstraint","isExplicitEnumConstraint","enum","isPrimaryKeyOfEnumTableConstraint","hasExactlyOneColumn","enumTables","omit","isSelectable","isInsertable","isUpdatable","isDeletable","enumConstraints","enumTableColumns","descriptionColumn","enumDescription","allData","_internalEnumData","col","data","row","constraintIdent","enumTypeArray","category","domainIsNotNull","arrayItemTypeId","typeLength","isPgArray","domainBaseTypeId","domainTypeModifier","domainHasDefault","enumVariants","enumDescriptions","rangeSubTypeId","enumType","r","typeById","fkattr","deepClone","value","val","Object","keys","reduce","memo","PgIntrospectionPlugin","builder","pgConfig","pgSchemas","schemas","pgEnableTags","persistentMemoizeWithKey","fn","pgThrowOnMissingSchema","pgIncludeExtensionResources","pgLegacyFunctionsOnly","pgIgnoreRBAC","pgSkipInstallingWatchFixtures","pgOwnerConnectionString","introspect","cacheKey","version","introspectionResultsByKind","pgClient","versionResult","query","serverVersionNum","parseInt","rows","server_version_num","introspectionQuery","result","__pgVersion","procedure","extension","object","extensionConfigurationClassIds","e","configurationClassIds","isExtensionConfigurationTable","indexOf","VARCHAR_ID","TEXT_ID","CHAR_ID","BPCHAR_ID","VALID_TYPE_IDS","all","includes","hasEnumConstraints","some","z","pgSql","compile","fragment","identifier","role","user","message","freeze","knownSchemas","missingSchemas","s","errorMessage","console","warn","introspectionResultsFromRaw","rawResults","pgAugmentIntrospectionResults","xByY","arrayOfX","attrKey","x","xByYAndZ","attrKey2","namespaceById","classById","attributeByClassIdAndNum","extensionById","relate","array","newAttr","lookupAttr","lookup","missingOk","entry","innerKey","JSON","stringify","_","augment","arrayItemType","arrayType","canUseAsterisk","columnLevelSelectGrant","constraints","foreignConstraints","primaryKeyConstraint","keyAttributes","nr","foreignClass","foreignKeyAttributes","attributeNums","isUnique","every","idx","rawIntrospectionResultsByKind","listener","Listener","constructor","triggerRebuild","stopped","_handleChange","error","leading","trailing","_listener","bind","_handleClientError","_start","isReconnect","releasePgClient","client","_reallyReleaseClient","on","_releaseClient","watchSqlInner","sql","_haveDisplayedError","chalk","bold","yellow","_reconnect","setTimeout","notification","channel","payload","parse","commands","schema","command","affectsOurSchemas","schemaName","stop","cancel","clientIsStillViable","reallyReleaseClient","catch","removeListener","registerWatcher","l","hook","build","pgQueryFromResolveData","supportsJSONB","extend","pgIntrospectionResultsByKind","PgEntityKind","NAMESPACE","PROCEDURE","CLASS","TYPE","ATTRIBUTE","CONSTRAINT","EXTENSION","INDEX"],"mappings":"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","sourcesContent":["// @flow\nimport type { Plugin } from \"graphile-build\";\nimport type { Client } from \"pg\";\nimport withPgClient, {\n getPgClientAndReleaserFromConfig,\n} from \"../withPgClient\";\nimport { parseTags } from \"../utils\";\nimport { readFile as rawReadFile } from \"fs\";\nimport debugFactory from \"debug\";\nimport chalk from \"chalk\";\nimport throttle from \"lodash/throttle\";\nimport flatMap from \"lodash/flatMap\";\nimport { makeIntrospectionQuery } from \"./introspectionQuery\";\nimport * as pgSql from \"pg-sql2\";\n\nimport { version } from \"../../package.json\";\nimport queryFromResolveDataFactory from \"../queryFromResolveDataFactory\";\n\nconst debug = debugFactory(\"graphile-build-pg\");\nconst WATCH_FIXTURES_PATH = `${__dirname}/../../res/watch-fixtures.sql`;\n\n// Ref: https://github.com/graphile/postgraphile/tree/master/src/postgres/introspection/object\n\nexport type PgNamespace = {\n kind: \"namespace\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgProc = {\n kind: \"procedure\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n isStrict: boolean,\n returnsSet: boolean,\n isStable: boolean,\n returnTypeId: string,\n argTypeIds: Array<string>,\n argNames: Array<string>,\n argModes: Array<\"i\" | \"o\" | \"b\" | \"v\" | \"t\">,\n inputArgsCount: number,\n argDefaultsNum: number,\n namespace: PgNamespace,\n tags: { [string]: string },\n cost: number,\n aclExecutable: boolean,\n language: string,\n};\n\nexport type PgClass = {\n kind: \"class\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n classKind: string,\n namespaceId: string,\n namespaceName: string,\n typeId: string,\n isSelectable: boolean,\n isInsertable: boolean,\n isUpdatable: boolean,\n isDeletable: boolean,\n isExtensionConfigurationTable: boolean,\n namespace: PgNamespace,\n type: PgType,\n tags: { [string]: string },\n attributes: Array<PgAttribute>,\n constraints: Array<PgConstraint>,\n foreignConstraints: Array<PgConstraint>,\n primaryKeyConstraint: ?PgConstraint,\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n aclDeletable: boolean,\n canUseAsterisk: boolean,\n\n // eslint-disable-next-line flowtype/no-weak-types\n _internalEnumData?: any[], // This is Graphile internal, do not use this.\n};\n\nexport type PgType = {\n kind: \"type\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n type: string,\n category: string,\n domainIsNotNull: boolean,\n arrayItemTypeId: ?string,\n arrayItemType: ?PgType,\n arrayType: ?PgType,\n typeLength: ?number,\n isPgArray: boolean,\n classId: ?string,\n class: ?PgClass,\n domainBaseTypeId: ?string,\n domainBaseType: ?PgType,\n domainTypeModifier: ?number,\n domainHasDefault: boolean,\n enumVariants: ?(string[]),\n enumDescriptions: ?(string[]),\n rangeSubTypeId: ?string,\n tags: { [string]: string },\n isFake: ?boolean,\n};\n\nexport type PgAttribute = {\n kind: \"attribute\",\n classId: string,\n num: number,\n name: string,\n comment: ?string,\n description: ?string,\n typeId: string,\n typeModifier: number,\n isNotNull: boolean,\n hasDefault: boolean,\n identity: \"\" | \"a\" | \"d\",\n class: PgClass,\n type: PgType,\n namespace: PgNamespace,\n tags: { [string]: string },\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n isIndexed: ?boolean,\n isUnique: ?boolean,\n columnLevelSelectGrant: boolean,\n};\n\nexport type PgConstraint = {\n kind: \"constraint\",\n id: string,\n name: string,\n type: string,\n classId: string,\n class: PgClass,\n foreignClassId: ?string,\n foreignClass: ?PgClass,\n comment: ?string,\n description: ?string,\n keyAttributeNums: Array<number>,\n keyAttributes: Array<PgAttribute>,\n foreignKeyAttributeNums: Array<number>,\n foreignKeyAttributes: Array<PgAttribute>,\n namespace: PgNamespace,\n isIndexed: ?boolean,\n tags: { [string]: string },\n};\n\nexport type PgExtension = {\n kind: \"extension\",\n id: string,\n name: string,\n namespaceId: string,\n namespaceName: string,\n relocatable: boolean,\n version: string,\n configurationClassIds?: Array<string>,\n comment: ?string,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgIndex = {\n kind: \"index\",\n id: string,\n name: string,\n namespaceName: string,\n classId: string,\n numberOfAttributes: number,\n indexType: string,\n isUnique: boolean,\n isPrimary: boolean,\n /*\n Though these exist, we don't want to officially\n support them yet.\n\n isImmediate: boolean,\n isReplicaIdentity: boolean,\n isValid: boolean,\n */\n isPartial: boolean,\n attributeNums: Array<number>,\n attributePropertiesAsc: ?Array<boolean>,\n attributePropertiesNullsFirst: ?Array<boolean>,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgEntity =\n | PgNamespace\n | PgProc\n | PgClass\n | PgType\n | PgAttribute\n | PgConstraint\n | PgExtension\n | PgIndex;\n\nexport type PgIntrospectionResultsByKind = {\n __pgVersion: number,\n attribute: PgAttribute[],\n attributeByClassIdAndNum: {\n [classId: string]: { [num: string]: PgAttribute },\n },\n class: PgClass[],\n classById: { [classId: string]: PgClass },\n constraint: PgConstraint[],\n extension: PgExtension[],\n extensionById: { [extId: string]: PgExtension },\n index: PgIndex[],\n namespace: PgNamespace[],\n namespaceById: { [namespaceId: string]: PgNamespace },\n procedure: PgProc[],\n type: PgType[],\n typeById: { [typeId: string]: PgType },\n};\n\nfunction readFile(filename, encoding) {\n return new Promise((resolve, reject) => {\n rawReadFile(filename, encoding, (err, res) => {\n if (err) reject(err);\n else resolve(res);\n });\n });\n}\n\nconst removeQuotes = str => {\n const trimmed = str.trim();\n if (trimmed[0] === '\"') {\n if (trimmed[trimmed.length - 1] !== '\"') {\n throw new Error(\n `We failed to parse a quoted identifier '${str}'. Please avoid putting quotes or commas in smart comment identifiers (or file a PR to fix the parser).`\n );\n }\n return trimmed.substr(1, trimmed.length - 2);\n } else {\n // PostgreSQL lower-cases unquoted columns, so we should too.\n return trimmed.toLowerCase();\n }\n};\n\nconst parseSqlColumnArray = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n const parts = str.split(\",\");\n return parts.map(removeQuotes);\n};\n\nconst parseSqlColumnString = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n return removeQuotes(str);\n};\n\nfunction parseConstraintSpec(rawSpec) {\n const [spec, ...tagComponents] = rawSpec.split(/\\|/);\n const parsed = parseTags(tagComponents.join(\"\\n\"));\n return {\n spec,\n tags: parsed.tags,\n description: parsed.text,\n };\n}\n\nfunction smartCommentConstraints(introspectionResults) {\n const attributesByNames = (tbl, cols, debugStr) => {\n const attributes = introspectionResults.attribute\n .filter(a => a.classId === tbl.id)\n .sort((a, b) => a.num - b.num);\n if (!cols) {\n const pk = introspectionResults.constraint.find(\n c => c.classId == tbl.id && c.type === \"p\"\n );\n if (pk) {\n return pk.keyAttributeNums.map(n => attributes.find(a => a.num === n));\n } else {\n throw new Error(\n `No columns specified for '${tbl.namespaceName}.${tbl.name}' (oid: ${tbl.id}) and no PK found (${debugStr}).`\n );\n }\n }\n return cols.map(colName => {\n const attr = attributes.find(a => a.name === colName);\n if (!attr) {\n throw new Error(\n `Could not find attribute '${colName}' in '${tbl.namespaceName}.${tbl.name}'`\n );\n }\n return attr;\n });\n };\n\n // First: primary and unique keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n function addKey(key: string, isPrimary = false) {\n const tag = isPrimary ? \"@primaryKey\" : \"@unique\";\n if (typeof key !== \"string\") {\n if (isPrimary) {\n throw new Error(\n `${tag} configuration of '${klass.namespaceName}.${klass.name}' is invalid; please specify just once \"${tag} col1,col2\"`\n );\n }\n throw new Error(\n `${tag} configuration of '${klass.namespaceName}.${\n klass.name\n }' is invalid; expected ${\n isPrimary ? \"a string\" : \"a string or string array\"\n } but found ${typeof key}`\n );\n }\n const { spec: keySpec, tags, description } = parseConstraintSpec(key);\n const columns: string[] = parseSqlColumnArray(keySpec);\n const attributes = attributesByNames(klass, columns, `${tag} ${key}`);\n if (isPrimary) {\n attributes.forEach(attr => {\n attr.tags.notNull = true;\n });\n }\n const keyAttributeNums = attributes.map(a => a.num);\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_${tag}`,\n type: isPrimary ? \"p\" : \"u\",\n classId: klass.id,\n foreignClassId: null,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums: null,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n }\n if (klass.tags.primaryKey) {\n addKey(klass.tags.primaryKey, true);\n }\n if (klass.tags.unique) {\n if (Array.isArray(klass.tags.unique)) {\n klass.tags.unique.forEach(key => addKey(key));\n } else {\n addKey(klass.tags.unique);\n }\n }\n });\n // Now primary keys are in place, we can apply foreign keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n const getType = () =>\n introspectionResults.type.find(t => t.id === klass.typeId);\n const foreignKey = klass.tags.foreignKey || getType().tags.foreignKey;\n if (foreignKey) {\n const foreignKeys =\n typeof foreignKey === \"string\" ? [foreignKey] : foreignKey;\n if (!Array.isArray(foreignKeys)) {\n throw new Error(\n `Invalid foreign key smart comment specified on '${klass.namespaceName}.${klass.name}'`\n );\n }\n foreignKeys.forEach((fkSpecRaw, index) => {\n if (typeof fkSpecRaw !== \"string\") {\n throw new Error(\n `Invalid foreign key spec (${index}) on '${klass.namespaceName}.${klass.name}'`\n );\n }\n const {\n spec: fkSpec,\n tags,\n description,\n } = parseConstraintSpec(fkSpecRaw);\n const matches = fkSpec.match(\n /^\\(([^()]+)\\) references ([^().]+)(?:\\.([^().]+))?(?:\\s*\\(([^()]+)\\))?$/i\n );\n if (!matches) {\n throw new Error(\n `Invalid foreignKey syntax for '${klass.namespaceName}.${klass.name}'; expected something like \"(col1,col2) references schema.table (c1, c2)\", you passed '${fkSpecRaw}'`\n );\n }\n const [\n ,\n rawColumns,\n rawSchemaOrTable,\n rawTableOnly,\n rawForeignColumns,\n ] = matches;\n const rawSchema = rawTableOnly\n ? rawSchemaOrTable\n : `\"${klass.namespaceName}\"`;\n const rawTable = rawTableOnly || rawSchemaOrTable;\n const columns: string[] = parseSqlColumnArray(rawColumns);\n const foreignSchema: string = parseSqlColumnString(rawSchema);\n const foreignTable: string = parseSqlColumnString(rawTable);\n const foreignColumns: string[] | null = rawForeignColumns\n ? parseSqlColumnArray(rawForeignColumns)\n : null;\n\n const foreignKlass = introspectionResults.class.find(\n k => k.name === foreignTable && k.namespaceName === foreignSchema\n );\n if (!foreignKlass) {\n throw new Error(\n `@foreignKey smart comment referenced non-existant table/view '${foreignSchema}'.'${foreignTable}'. Note that this reference must use *database names* (i.e. it does not respect @name). (${fkSpecRaw})`\n );\n }\n const foreignNamespace = introspectionResults.namespace.find(\n n => n.id === foreignKlass.namespaceId\n );\n if (!foreignNamespace) {\n return;\n }\n\n const keyAttributeNums = attributesByNames(\n klass,\n columns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n const foreignKeyAttributeNums = attributesByNames(\n foreignKlass,\n foreignColumns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_foreignKey_${index}`,\n type: \"f\", // foreign key\n classId: klass.id,\n foreignClassId: foreignKlass.id,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n });\n }\n });\n}\n\nfunction isEnumConstraint(\n klass: PgClass,\n con: PgConstraint,\n isEnumTable: boolean\n) {\n if (con.classId === klass.id) {\n const isPrimaryKey = con.type === \"p\";\n const isUniqueConstraint = con.type === \"u\";\n if (isPrimaryKey || isUniqueConstraint) {\n const isExplicitEnumConstraint =\n con.tags.enum === true || typeof con.tags.enum === \"string\";\n const isPrimaryKeyOfEnumTableConstraint = con.type === \"p\" && isEnumTable;\n if (isExplicitEnumConstraint || isPrimaryKeyOfEnumTableConstraint) {\n const hasExactlyOneColumn = con.keyAttributeNums.length === 1;\n if (!hasExactlyOneColumn) {\n throw new Error(\n `Enum table \"${klass.namespaceName}\".\"${klass.name}\" enum constraint '${con.name}' is composite; it should have exactly one column (found: ${con.keyAttributeNums.length})`\n );\n }\n return true;\n }\n }\n }\n return false;\n}\n\nfunction enumTables(introspectionResults) {\n introspectionResults.class.map(async klass => {\n const isEnumTable =\n klass.tags.enum === true || typeof klass.tags.enum === \"string\";\n\n if (isEnumTable) {\n // Prevent the table being recognised as a table\n // eslint-disable-next-line require-atomic-updates\n klass.tags.omit = true;\n // eslint-disable-next-line require-atomic-updates\n klass.isSelectable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isInsertable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isUpdatable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isDeletable = false;\n }\n\n // By this point, even views should have \"fake\" constraints we can use\n // (e.g. `@primaryKey`)\n const enumConstraints = introspectionResults.constraint.filter(con =>\n isEnumConstraint(klass, con, isEnumTable)\n );\n\n // Get all the columns\n const enumTableColumns = introspectionResults.attribute.filter(\n attr => attr.classId === klass.id\n );\n\n // Get description column\n const descriptionColumn = enumTableColumns.find(\n attr => attr.name === \"description\" || attr.tags.enumDescription\n );\n const allData = klass._internalEnumData || [];\n\n enumConstraints.forEach(constraint => {\n const col = enumTableColumns.find(\n col => col.num === constraint.keyAttributeNums[0]\n );\n if (!col) {\n // Should never happen\n throw new Error(\n \"Graphile Engine error - could not find column for enum constraint\"\n );\n }\n const data = allData.filter(row => row[col.name] != null);\n if (data.length < 1) {\n throw new Error(\n `Enum table \"${klass.namespaceName}\".\"${klass.name}\" contains no entries for enum constraint '${constraint.name}'.`\n );\n }\n\n // Create fake enum type\n const constraintIdent =\n constraint.type === \"p\" ? \"\" : `_${constraint.name}`;\n const enumTypeArray = {\n kind: \"type\",\n isFake: true,\n id: `FAKE_ENUM_${klass.namespaceName}_${klass.name}${constraintIdent}_list`,\n name: `_${klass.name}${constraintIdent}`,\n description: null,\n tags: {},\n namespaceId: klass.namespaceId,\n namespaceName: klass.namespaceName,\n type: \"b\",\n category: \"A\",\n domainIsNotNull: null,\n arrayItemTypeId: null,\n typeLength: -1,\n isPgArray: true,\n classId: null,\n domainBaseTypeId: null,\n domainTypeModifier: null,\n domainHasDefault: false,\n enumVariants: null,\n enumDescriptions: null,\n rangeSubTypeId: null,\n };\n const enumType = {\n kind: \"type\",\n isFake: true,\n id: `FAKE_ENUM_${klass.namespaceName}_${klass.name}${constraintIdent}`,\n name: `${klass.name}${constraintIdent}`,\n description: klass.description,\n tags: { ...klass.tags, ...constraint.tags },\n namespaceId: klass.namespaceId,\n namespaceName: klass.namespaceName,\n type: \"e\",\n category: \"E\",\n domainIsNotNull: null,\n arrayItemTypeId: enumTypeArray.id,\n typeLength: 4, // ???\n isPgArray: false,\n classId: null,\n domainBaseTypeId: null,\n domainTypeModifier: null,\n domainHasDefault: false,\n enumVariants: data.map(r => r[col.name]),\n enumDescriptions: descriptionColumn\n ? data.map(r => r[descriptionColumn.name])\n : null,\n // TODO: enumDescriptions\n rangeSubTypeId: null,\n };\n introspectionResults.type.push(enumType, enumTypeArray);\n introspectionResults.typeById[enumType.id] = enumType;\n introspectionResults.typeById[enumTypeArray.id] = enumTypeArray;\n\n // Change type of all attributes that reference this table to\n // reference this enum type\n introspectionResults.constraint.forEach(c => {\n if (\n c.type === \"f\" &&\n c.foreignClassId === klass.id &&\n c.foreignKeyAttributeNums.length === 1 &&\n c.foreignKeyAttributeNums[0] === col.num\n ) {\n // Get the attribute\n const fkattr = introspectionResults.attribute.find(\n attr =>\n attr.classId === c.classId && attr.num === c.keyAttributeNums[0]\n );\n if (fkattr) {\n // Override the detected type to pretend to be our enum\n fkattr.typeId = enumType.id;\n }\n }\n });\n });\n });\n}\n\n/* The argument to this must not contain cyclic references! */\nconst deepClone = value => {\n if (Array.isArray(value)) {\n return value.map(val => deepClone(val));\n } else if (typeof value === \"object\" && value) {\n return Object.keys(value).reduce((memo, k) => {\n memo[k] = deepClone(value[k]);\n return memo;\n }, {});\n } else {\n return value;\n }\n};\n\nexport default (async function PgIntrospectionPlugin(\n builder,\n {\n pgConfig,\n pgSchemas: schemas,\n pgEnableTags,\n persistentMemoizeWithKey = (key, fn) => fn(),\n pgThrowOnMissingSchema = false,\n pgIncludeExtensionResources = false,\n pgLegacyFunctionsOnly = false,\n pgIgnoreRBAC = true,\n pgSkipInstallingWatchFixtures = false,\n pgOwnerConnectionString,\n }\n) {\n /**\n * Introspect database and get the table/view/constraints.\n */\n async function introspect(): Promise<PgIntrospectionResultsByKind> {\n // Perform introspection\n if (!Array.isArray(schemas)) {\n throw new Error(\"Argument 'schemas' (array) is required\");\n }\n const cacheKey = `PgIntrospectionPlugin-introspectionResultsByKind-v${version}`;\n const introspectionResultsByKind = deepClone(\n await persistentMemoizeWithKey(cacheKey, () =>\n withPgClient(pgConfig, async pgClient => {\n const versionResult = await pgClient.query(\n \"show server_version_num;\"\n );\n const serverVersionNum = parseInt(\n versionResult.rows[0].server_version_num,\n 10\n );\n const introspectionQuery = makeIntrospectionQuery(serverVersionNum, {\n pgLegacyFunctionsOnly,\n pgIgnoreRBAC,\n });\n const { rows } = await pgClient.query(introspectionQuery, [\n schemas,\n pgIncludeExtensionResources,\n ]);\n\n const result = {\n __pgVersion: serverVersionNum,\n namespace: [],\n class: [],\n attribute: [],\n type: [],\n constraint: [],\n procedure: [],\n extension: [],\n index: [],\n };\n for (const { object } of rows) {\n result[object.kind].push(object);\n }\n\n // Parse tags from comments\n [\n \"namespace\",\n \"class\",\n \"attribute\",\n \"type\",\n \"constraint\",\n \"procedure\",\n \"extension\",\n \"index\",\n ].forEach(kind => {\n result[kind].forEach(object => {\n // Keep a copy of the raw comment\n object.comment = object.description;\n if (pgEnableTags && object.description) {\n const parsed = parseTags(object.description);\n object.tags = parsed.tags;\n object.description = parsed.text;\n } else {\n object.tags = {};\n }\n });\n });\n\n const extensionConfigurationClassIds = flatMap(\n result.extension,\n e => e.configurationClassIds\n );\n result.class.forEach(klass => {\n klass.isExtensionConfigurationTable =\n extensionConfigurationClassIds.indexOf(klass.id) >= 0;\n });\n\n // Assert the columns are text\n const VARCHAR_ID = \"1043\";\n const TEXT_ID = \"25\";\n const CHAR_ID = \"18\";\n const BPCHAR_ID = \"1042\";\n\n const VALID_TYPE_IDS = [VARCHAR_ID, TEXT_ID, CHAR_ID, BPCHAR_ID];\n\n await Promise.all(\n result.class.map(async klass => {\n if (!schemas.includes(klass.namespaceName)) {\n // Only support enums in public tables/views\n return;\n }\n const isEnumTable =\n klass.tags.enum === true || typeof klass.tags.enum === \"string\";\n\n // NOTE: this only matches on tables (not views, since they don't\n // have constraints), which is why we repeat the isEnumTable check below.\n const hasEnumConstraints = result.constraint.some(con =>\n isEnumConstraint(klass, con, isEnumTable)\n );\n if (isEnumTable || hasEnumConstraints) {\n // Get the list of columns enums are defined for\n const enumTableColumns = result.attribute\n .filter(\n attr =>\n attr.classId === klass.id &&\n VALID_TYPE_IDS.includes(attr.typeId)\n )\n .sort((a, z) => a.num - z.num);\n\n // Load data from the table/view.\n const query = pgSql.compile(\n pgSql.fragment`select ${pgSql.join(\n enumTableColumns.map(col => pgSql.identifier(col.name)),\n \", \"\n )} from ${pgSql.identifier(klass.namespaceName, klass.name)};`\n );\n\n let allData;\n try {\n ({ rows: allData } = await pgClient.query(query));\n } catch (e) {\n let role = \"RELEVANT_POSTGRES_USER\";\n try {\n const {\n rows: [{ user }],\n } = await pgClient.query(\"select user;\");\n role = user;\n } catch (e) {\n /*\n * Ignore; this is likely a 25P02 (transaction aborted)\n * error caused by the statement above failing.\n */\n }\n throw new Error(`Introspection could not read from enum table \"${klass.namespaceName}\".\"${klass.name}\", perhaps you need to grant access:\n\n GRANT USAGE ON SCHEMA \"${klass.namespaceName}\" TO \"${role}\";\n GRANT SELECT ON \"${klass.namespaceName}\".\"${klass.name}\" TO \"${role}\";\n\nOriginal error: ${e.message}\n`);\n }\n\n klass._internalEnumData = allData;\n }\n })\n );\n\n [\n \"namespace\",\n \"class\",\n \"attribute\",\n \"type\",\n \"constraint\",\n \"procedure\",\n \"extension\",\n \"index\",\n ].forEach(k => {\n result[k].forEach(Object.freeze);\n });\n\n return Object.freeze(result);\n })\n )\n );\n\n const knownSchemas = introspectionResultsByKind.namespace.map(n => n.name);\n const missingSchemas = schemas.filter(s => knownSchemas.indexOf(s) < 0);\n if (missingSchemas.length) {\n const errorMessage = `You requested to use schema '${schemas.join(\n \"', '\"\n )}'; however we couldn't find some of those! Missing schemas are: '${missingSchemas.join(\n \"', '\"\n )}'`;\n if (pgThrowOnMissingSchema) {\n throw new Error(errorMessage);\n } else {\n console.warn(\"⚠️ WARNING⚠️ \" + errorMessage); // eslint-disable-line no-console\n }\n }\n return introspectionResultsByKind;\n }\n\n function introspectionResultsFromRaw(\n rawResults,\n pgAugmentIntrospectionResults\n ) {\n const introspectionResultsByKind = deepClone(rawResults);\n\n const xByY = (arrayOfX, attrKey) =>\n arrayOfX.reduce((memo, x) => {\n memo[x[attrKey]] = x;\n return memo;\n }, {});\n const xByYAndZ = (arrayOfX, attrKey, attrKey2) =>\n arrayOfX.reduce((memo, x) => {\n if (!memo[x[attrKey]]) memo[x[attrKey]] = {};\n memo[x[attrKey]][x[attrKey2]] = x;\n return memo;\n }, {});\n introspectionResultsByKind.namespaceById = xByY(\n introspectionResultsByKind.namespace,\n \"id\"\n );\n introspectionResultsByKind.classById = xByY(\n introspectionResultsByKind.class,\n \"id\"\n );\n introspectionResultsByKind.typeById = xByY(\n introspectionResultsByKind.type,\n \"id\"\n );\n introspectionResultsByKind.attributeByClassIdAndNum = xByYAndZ(\n introspectionResultsByKind.attribute,\n \"classId\",\n \"num\"\n );\n introspectionResultsByKind.extensionById = xByY(\n introspectionResultsByKind.extension,\n \"id\"\n );\n\n const relate = (array, newAttr, lookupAttr, lookup, missingOk = false) => {\n array.forEach(entry => {\n const key = entry[lookupAttr];\n if (Array.isArray(key)) {\n entry[newAttr] = key\n .map(innerKey => {\n const result = lookup[innerKey];\n if (innerKey && !result) {\n if (missingOk) {\n return;\n }\n throw new Error(\n `Could not look up '${newAttr}' by '${lookupAttr}' ('${innerKey}') on '${JSON.stringify(\n entry\n )}'`\n );\n }\n return result;\n })\n .filter(_ => _);\n } else {\n const result = lookup[key];\n if (key && !result) {\n if (missingOk) {\n return;\n }\n throw new Error(\n `Could not look up '${newAttr}' by '${lookupAttr}' (= '${key}') on '${JSON.stringify(\n entry\n )}'`\n );\n }\n entry[newAttr] = result;\n }\n });\n };\n\n const augment = introspectionResults => {\n [\n pgAugmentIntrospectionResults,\n smartCommentConstraints,\n enumTables,\n ].forEach(fn => (fn ? fn(introspectionResults) : null));\n };\n augment(introspectionResultsByKind);\n\n relate(\n introspectionResultsByKind.class,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById,\n true // Because it could be a type defined in a different namespace - which is fine so long as we don't allow querying it directly\n );\n\n relate(\n introspectionResultsByKind.class,\n \"type\",\n \"typeId\",\n introspectionResultsByKind.typeById\n );\n\n relate(\n introspectionResultsByKind.attribute,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n relate(\n introspectionResultsByKind.attribute,\n \"type\",\n \"typeId\",\n introspectionResultsByKind.typeById\n );\n\n relate(\n introspectionResultsByKind.procedure,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById\n );\n\n relate(\n introspectionResultsByKind.type,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById,\n true\n );\n\n relate(\n introspectionResultsByKind.type,\n \"domainBaseType\",\n \"domainBaseTypeId\",\n introspectionResultsByKind.typeById,\n true // Because not all types are domains\n );\n\n relate(\n introspectionResultsByKind.type,\n \"arrayItemType\",\n \"arrayItemTypeId\",\n introspectionResultsByKind.typeById,\n true // Because not all types are arrays\n );\n\n relate(\n introspectionResultsByKind.constraint,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n relate(\n introspectionResultsByKind.constraint,\n \"foreignClass\",\n \"foreignClassId\",\n introspectionResultsByKind.classById,\n true // Because many constraints don't apply to foreign classes\n );\n\n relate(\n introspectionResultsByKind.extension,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById,\n true // Because the extension could be a defined in a different namespace\n );\n\n relate(\n introspectionResultsByKind.extension,\n \"configurationClasses\",\n \"configurationClassIds\",\n introspectionResultsByKind.classById,\n true // Because the configuration table could be a defined in a different namespace\n );\n\n relate(\n introspectionResultsByKind.index,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n // Reverse arrayItemType -> arrayType\n introspectionResultsByKind.type.forEach(type => {\n if (type.arrayItemType) {\n type.arrayItemType.arrayType = type;\n }\n });\n\n // Table/type columns / constraints\n introspectionResultsByKind.class.forEach(klass => {\n klass.attributes = introspectionResultsByKind.attribute.filter(\n attr => attr.classId === klass.id\n );\n klass.canUseAsterisk = !klass.attributes.some(\n attr => attr.columnLevelSelectGrant\n );\n klass.constraints = introspectionResultsByKind.constraint.filter(\n constraint => constraint.classId === klass.id\n );\n klass.foreignConstraints = introspectionResultsByKind.constraint.filter(\n constraint => constraint.foreignClassId === klass.id\n );\n klass.primaryKeyConstraint = klass.constraints.find(\n constraint => constraint.type === \"p\"\n );\n });\n\n // Constraint attributes\n introspectionResultsByKind.constraint.forEach(constraint => {\n if (constraint.keyAttributeNums && constraint.class) {\n constraint.keyAttributes = constraint.keyAttributeNums.map(nr =>\n constraint.class.attributes.find(attr => attr.num === nr)\n );\n } else {\n constraint.keyAttributes = [];\n }\n if (constraint.foreignKeyAttributeNums && constraint.foreignClass) {\n constraint.foreignKeyAttributes =\n constraint.foreignKeyAttributeNums.map(nr =>\n constraint.foreignClass.attributes.find(attr => attr.num === nr)\n );\n } else {\n constraint.foreignKeyAttributes = [];\n }\n });\n\n // Detect which columns and constraints are indexed\n introspectionResultsByKind.index.forEach(index => {\n const columns = index.attributeNums.map(nr =>\n index.class.attributes.find(attr => attr.num === nr)\n );\n\n // Indexed column (for orderBy / filter):\n if (columns[0]) {\n columns[0].isIndexed = true;\n }\n\n if (columns[0] && columns.length === 1 && index.isUnique) {\n columns[0].isUnique = true;\n }\n\n // Indexed constraints (for reverse relations):\n index.class.constraints\n .filter(constraint => constraint.type === \"f\")\n .forEach(constraint => {\n if (\n constraint.keyAttributeNums.every(\n (nr, idx) => index.attributeNums[idx] === nr\n )\n ) {\n constraint.isIndexed = true;\n }\n });\n });\n\n return introspectionResultsByKind;\n }\n\n let rawIntrospectionResultsByKind = await introspect();\n\n let listener;\n\n class Listener {\n _handleChange: () => void;\n client: Client | null;\n stopped: boolean;\n _reallyReleaseClient: (() => Promise<void>) | null;\n _haveDisplayedError: boolean;\n constructor(triggerRebuild) {\n this.stopped = false;\n this._handleChange = throttle(\n async () => {\n debug(`Schema change detected: re-inspecting schema...`);\n try {\n rawIntrospectionResultsByKind = await introspect();\n debug(`Schema change detected: re-inspecting schema complete`);\n triggerRebuild();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(`Schema introspection failed: ${e.message}`);\n }\n },\n 750,\n {\n leading: true,\n trailing: true,\n }\n );\n this._listener = this._listener.bind(this);\n this._handleClientError = this._handleClientError.bind(this);\n this._start();\n }\n\n async _start(isReconnect = false) {\n if (this.stopped) {\n return;\n }\n // Connect to DB\n try {\n const { pgClient, releasePgClient } =\n await getPgClientAndReleaserFromConfig(pgConfig);\n this.client = pgClient;\n // $FlowFixMe: hack property\n this._reallyReleaseClient = releasePgClient;\n pgClient.on(\"notification\", this._listener);\n pgClient.on(\"error\", this._handleClientError);\n if (this.stopped) {\n // In case watch mode was cancelled in the interrim.\n return this._releaseClient();\n } else {\n await pgClient.query(\"listen postgraphile_watch\");\n\n // Install the watch fixtures.\n if (!pgSkipInstallingWatchFixtures) {\n const watchSqlInner = await readFile(WATCH_FIXTURES_PATH, \"utf8\");\n const sql = `begin; ${watchSqlInner};`;\n await withPgClient(\n pgOwnerConnectionString || pgConfig,\n async pgClient => {\n try {\n await pgClient.query(sql);\n } catch (error) {\n if (!this._haveDisplayedError) {\n this._haveDisplayedError = true;\n /* eslint-disable no-console */\n console.warn(\n `${chalk.bold.yellow(\n \"Failed to setup watch fixtures in Postgres database\"\n )} ️️⚠️`\n );\n console.warn(\n chalk.yellow(\n \"This is likely because the PostgreSQL user in the connection string does not have sufficient privileges; you can solve this by passing the 'owner' connection string via '--owner-connection' / 'ownerConnectionString'. If the fixtures already exist, the watch functionality may still work.\"\n )\n );\n console.warn(\n chalk.yellow(\n \"Enable DEBUG='graphile-build-pg' to see the error\"\n )\n );\n /* eslint-enable no-console */\n }\n debug(error);\n } finally {\n await pgClient.query(\"commit;\");\n }\n }\n );\n }\n\n // Trigger re-introspection on server reconnect\n if (isReconnect) {\n this._handleChange();\n }\n }\n } catch (e) {\n // If something goes wrong, disconnect and try again after a short delay\n this._reconnect(e);\n }\n }\n\n _handleClientError: (e: Error) => void;\n _handleClientError(e) {\n this._releaseClient(false);\n this._reconnect(e);\n }\n async _reconnect(e) {\n if (this.stopped) {\n return;\n }\n // eslint-disable-next-line no-console\n console.error(\n \"Error occurred for PG watching client; reconnecting in 2 seconds.\",\n e.message\n );\n await this._releaseClient();\n setTimeout(() => {\n if (!this.stopped) {\n // Listen for further changes\n this._start(true);\n }\n }, 2000);\n }\n\n // eslint-disable-next-line flowtype/no-weak-types\n _listener: (notification: any) => void;\n // eslint-disable-next-line flowtype/no-weak-types\n async _listener(notification: any) {\n if (notification.channel !== \"postgraphile_watch\") {\n return;\n }\n try {\n const payload = JSON.parse(notification.payload);\n payload.payload = payload.payload || [];\n if (payload.type === \"ddl\") {\n const commands = payload.payload\n .filter(\n ({ schema }) => schema == null || schemas.indexOf(schema) >= 0\n )\n .map(({ command }) => command);\n if (commands.length) {\n this._handleChange();\n }\n } else if (payload.type === \"drop\") {\n const affectsOurSchemas = payload.payload.some(\n schemaName => schemas.indexOf(schemaName) >= 0\n );\n if (affectsOurSchemas) {\n this._handleChange();\n }\n } else if (payload.type === \"manual\") {\n this._handleChange();\n } else {\n throw new Error(`Payload type '${payload.type}' not recognised`);\n }\n } catch (e) {\n debug(`Error occurred parsing notification payload: ${e}`);\n }\n }\n\n async stop() {\n this.stopped = true;\n this._handleChange.cancel();\n await this._releaseClient();\n }\n\n /**\n * Only pass `false` to this function if you know the client is going to be\n * terminated; otherwise we risk leaving listeners running.\n */\n async _releaseClient(clientIsStillViable = true) {\n // $FlowFixMe\n const pgClient = this.client;\n const reallyReleaseClient = this._reallyReleaseClient;\n this.client = null;\n this._reallyReleaseClient = null;\n if (pgClient) {\n // Don't attempt to run a query after a client has errored.\n if (clientIsStillViable) {\n pgClient.query(\"unlisten postgraphile_watch\").catch(e => {\n debug(`Error occurred trying to unlisten watch: ${e}`);\n });\n }\n pgClient.removeListener(\"notification\", this._listener);\n pgClient.removeListener(\"error\", this._handleClientError);\n }\n if (reallyReleaseClient) {\n await reallyReleaseClient();\n }\n }\n }\n\n builder.registerWatcher(\n async triggerRebuild => {\n // In case we started listening before, clean up\n if (listener) {\n await listener.stop();\n }\n // We're not worried about a race condition here.\n // eslint-disable-next-line require-atomic-updates\n listener = new Listener(triggerRebuild);\n },\n async () => {\n const l = listener;\n listener = null;\n if (l) {\n await l.stop();\n }\n }\n );\n\n builder.hook(\n \"build\",\n build => {\n const introspectionResultsByKind = introspectionResultsFromRaw(\n rawIntrospectionResultsByKind,\n build.pgAugmentIntrospectionResults\n );\n if (introspectionResultsByKind.__pgVersion < 90500) {\n // TODO:v5: remove this workaround\n // This is a bit of a hack, but until we have plugin priorities it's the\n // easiest way to conditionally support PG9.4.\n build.pgQueryFromResolveData = queryFromResolveDataFactory({\n supportsJSONB: false,\n });\n }\n return build.extend(build, {\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n });\n },\n [\"PgIntrospection\"],\n [],\n [\"PgBasics\"]\n );\n}: Plugin);\n\n// TypeScript compatibility\nexport const PgEntityKind = {\n NAMESPACE: \"namespace\",\n PROCEDURE: \"procedure\",\n CLASS: \"class\",\n TYPE: \"type\",\n ATTRIBUTE: \"attribute\",\n CONSTRAINT: \"constraint\",\n EXTENSION: \"extension\",\n INDEX: \"index\",\n};\n"],"file":"PgIntrospectionPlugin.js"}
1
+ {"version":3,"sources":["../../src/plugins/PgIntrospectionPlugin.js"],"names":["debug","WATCH_FIXTURES_PATH","__dirname","readFile","filename","encoding","Promise","resolve","reject","err","res","removeQuotes","str","trimmed","trim","length","Error","slice","toLowerCase","parseSqlColumnArray","parts","split","map","parseSqlColumnString","parseConstraintSpec","rawSpec","spec","tagComponents","parsed","join","tags","description","text","smartCommentConstraints","introspectionResults","attributesByNames","tbl","cols","debugStr","attributes","attribute","filter","a","classId","id","sort","b","num","pk","constraint","find","c","type","keyAttributeNums","n","namespaceName","name","colName","attr","class","forEach","klass","namespace","namespaceId","addKey","key","isPrimary","tag","keySpec","columns","notNull","fakeConstraint","kind","isFake","isIndexed","Math","random","foreignClassId","comment","foreignKeyAttributeNums","push","primaryKey","unique","Array","isArray","getType","t","typeId","foreignKey","foreignKeys","fkSpecRaw","index","fkSpec","matches","match","rawColumns","rawSchemaOrTable","rawTableOnly","rawForeignColumns","rawSchema","rawTable","foreignSchema","foreignTable","foreignColumns","foreignKlass","k","foreignNamespace","isEnumConstraint","con","isEnumTable","isPrimaryKey","isUniqueConstraint","isExplicitEnumConstraint","enum","isPrimaryKeyOfEnumTableConstraint","hasExactlyOneColumn","enumTables","omit","isSelectable","isInsertable","isUpdatable","isDeletable","enumConstraints","enumTableColumns","descriptionColumn","enumDescription","allData","_internalEnumData","col","data","row","constraintIdent","enumTypeArray","category","domainIsNotNull","arrayItemTypeId","typeLength","isPgArray","domainBaseTypeId","domainTypeModifier","domainHasDefault","enumVariants","enumDescriptions","rangeSubTypeId","enumType","r","typeById","fkattr","deepClone","value","val","Object","keys","reduce","memo","PgIntrospectionPlugin","builder","pgConfig","pgSchemas","schemas","pgEnableTags","persistentMemoizeWithKey","fn","pgThrowOnMissingSchema","pgIncludeExtensionResources","pgLegacyFunctionsOnly","pgIgnoreRBAC","pgSkipInstallingWatchFixtures","pgOwnerConnectionString","introspect","cacheKey","version","introspectionResultsByKind","pgClient","versionResult","query","serverVersionNum","parseInt","rows","server_version_num","introspectionQuery","result","__pgVersion","procedure","extension","object","extensionConfigurationClassIds","e","configurationClassIds","isExtensionConfigurationTable","indexOf","VARCHAR_ID","TEXT_ID","CHAR_ID","BPCHAR_ID","VALID_TYPE_IDS","all","includes","hasEnumConstraints","some","z","pgSql","compile","fragment","identifier","role","user","message","freeze","knownSchemas","missingSchemas","s","errorMessage","console","warn","introspectionResultsFromRaw","rawResults","pgAugmentIntrospectionResults","xByY","arrayOfX","attrKey","x","xByYAndZ","attrKey2","namespaceById","classById","attributeByClassIdAndNum","extensionById","relate","array","newAttr","lookupAttr","lookup","missingOk","entry","innerKey","JSON","stringify","_","augment","arrayItemType","arrayType","canUseAsterisk","columnLevelSelectGrant","constraints","foreignConstraints","primaryKeyConstraint","keyAttributes","nr","foreignClass","foreignKeyAttributes","attributeNums","isUnique","every","idx","rawIntrospectionResultsByKind","listener","Listener","constructor","triggerRebuild","stopped","_handleChange","error","leading","trailing","_listener","bind","_handleClientError","_start","isReconnect","releasePgClient","client","_reallyReleaseClient","on","_releaseClient","watchSqlInner","sql","_haveDisplayedError","chalk","bold","yellow","_reconnect","setTimeout","notification","channel","payload","parse","commands","schema","command","affectsOurSchemas","schemaName","stop","cancel","clientIsStillViable","reallyReleaseClient","catch","removeListener","registerWatcher","l","hook","build","pgQueryFromResolveData","supportsJSONB","extend","pgIntrospectionResultsByKind","PgEntityKind","NAMESPACE","PROCEDURE","CLASS","TYPE","ATTRIBUTE","CONSTRAINT","EXTENSION","INDEX"],"mappings":"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","sourcesContent":["// @flow\nimport type { Plugin } from \"graphile-build\";\nimport type { Client } from \"pg\";\nimport withPgClient, {\n getPgClientAndReleaserFromConfig,\n} from \"../withPgClient\";\nimport { parseTags } from \"../utils\";\nimport { readFile as rawReadFile } from \"fs\";\nimport debugFactory from \"debug\";\nimport chalk from \"chalk\";\nimport throttle from \"lodash/throttle\";\nimport flatMap from \"lodash/flatMap\";\nimport { makeIntrospectionQuery } from \"./introspectionQuery\";\nimport * as pgSql from \"pg-sql2\";\n\nimport { version } from \"../../package.json\";\nimport queryFromResolveDataFactory from \"../queryFromResolveDataFactory\";\n\nconst debug = debugFactory(\"graphile-build-pg\");\nconst WATCH_FIXTURES_PATH = `${__dirname}/../../res/watch-fixtures.sql`;\n\n// Ref: https://github.com/graphile/postgraphile/tree/master/src/postgres/introspection/object\n\nexport type PgNamespace = {\n kind: \"namespace\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgProc = {\n kind: \"procedure\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n isStrict: boolean,\n returnsSet: boolean,\n isStable: boolean,\n returnTypeId: string,\n argTypeIds: Array<string>,\n argNames: Array<string>,\n argModes: Array<\"i\" | \"o\" | \"b\" | \"v\" | \"t\">,\n inputArgsCount: number,\n argDefaultsNum: number,\n namespace: PgNamespace,\n tags: { [string]: string },\n cost: number,\n aclExecutable: boolean,\n language: string,\n};\n\nexport type PgClass = {\n kind: \"class\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n classKind: string,\n namespaceId: string,\n namespaceName: string,\n typeId: string,\n isSelectable: boolean,\n isInsertable: boolean,\n isUpdatable: boolean,\n isDeletable: boolean,\n isExtensionConfigurationTable: boolean,\n namespace: PgNamespace,\n type: PgType,\n tags: { [string]: string },\n attributes: Array<PgAttribute>,\n constraints: Array<PgConstraint>,\n foreignConstraints: Array<PgConstraint>,\n primaryKeyConstraint: ?PgConstraint,\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n aclDeletable: boolean,\n canUseAsterisk: boolean,\n\n // eslint-disable-next-line flowtype/no-weak-types\n _internalEnumData?: any[], // This is Graphile internal, do not use this.\n};\n\nexport type PgType = {\n kind: \"type\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n type: string,\n category: string,\n domainIsNotNull: boolean,\n arrayItemTypeId: ?string,\n arrayItemType: ?PgType,\n arrayType: ?PgType,\n typeLength: ?number,\n isPgArray: boolean,\n classId: ?string,\n class: ?PgClass,\n domainBaseTypeId: ?string,\n domainBaseType: ?PgType,\n domainTypeModifier: ?number,\n domainHasDefault: boolean,\n enumVariants: ?(string[]),\n enumDescriptions: ?(string[]),\n rangeSubTypeId: ?string,\n tags: { [string]: string },\n isFake: ?boolean,\n};\n\nexport type PgAttribute = {\n kind: \"attribute\",\n classId: string,\n num: number,\n name: string,\n comment: ?string,\n description: ?string,\n typeId: string,\n typeModifier: number,\n isNotNull: boolean,\n hasDefault: boolean,\n identity: \"\" | \"a\" | \"d\",\n class: PgClass,\n type: PgType,\n namespace: PgNamespace,\n tags: { [string]: string },\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n isIndexed: ?boolean,\n isUnique: ?boolean,\n columnLevelSelectGrant: boolean,\n};\n\nexport type PgConstraint = {\n kind: \"constraint\",\n id: string,\n name: string,\n type: string,\n classId: string,\n class: PgClass,\n foreignClassId: ?string,\n foreignClass: ?PgClass,\n comment: ?string,\n description: ?string,\n keyAttributeNums: Array<number>,\n keyAttributes: Array<PgAttribute>,\n foreignKeyAttributeNums: Array<number>,\n foreignKeyAttributes: Array<PgAttribute>,\n namespace: PgNamespace,\n isIndexed: ?boolean,\n tags: { [string]: string },\n};\n\nexport type PgExtension = {\n kind: \"extension\",\n id: string,\n name: string,\n namespaceId: string,\n namespaceName: string,\n relocatable: boolean,\n version: string,\n configurationClassIds?: Array<string>,\n comment: ?string,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgIndex = {\n kind: \"index\",\n id: string,\n name: string,\n namespaceName: string,\n classId: string,\n numberOfAttributes: number,\n indexType: string,\n isUnique: boolean,\n isPrimary: boolean,\n /*\n Though these exist, we don't want to officially\n support them yet.\n\n isImmediate: boolean,\n isReplicaIdentity: boolean,\n isValid: boolean,\n */\n isPartial: boolean,\n attributeNums: Array<number>,\n attributePropertiesAsc: ?Array<boolean>,\n attributePropertiesNullsFirst: ?Array<boolean>,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgEntity =\n | PgNamespace\n | PgProc\n | PgClass\n | PgType\n | PgAttribute\n | PgConstraint\n | PgExtension\n | PgIndex;\n\nexport type PgIntrospectionResultsByKind = {\n __pgVersion: number,\n attribute: PgAttribute[],\n attributeByClassIdAndNum: {\n [classId: string]: { [num: string]: PgAttribute },\n },\n class: PgClass[],\n classById: { [classId: string]: PgClass },\n constraint: PgConstraint[],\n extension: PgExtension[],\n extensionById: { [extId: string]: PgExtension },\n index: PgIndex[],\n namespace: PgNamespace[],\n namespaceById: { [namespaceId: string]: PgNamespace },\n procedure: PgProc[],\n type: PgType[],\n typeById: { [typeId: string]: PgType },\n};\n\nfunction readFile(filename, encoding) {\n return new Promise((resolve, reject) => {\n rawReadFile(filename, encoding, (err, res) => {\n if (err) reject(err);\n else resolve(res);\n });\n });\n}\n\nconst removeQuotes = str => {\n const trimmed = str.trim();\n if (trimmed[0] === '\"') {\n if (trimmed[trimmed.length - 1] !== '\"') {\n throw new Error(\n `We failed to parse a quoted identifier '${str}'. Please avoid putting quotes or commas in smart comment identifiers (or file a PR to fix the parser).`\n );\n }\n return trimmed.slice(1, -1);\n } else {\n // PostgreSQL lower-cases unquoted columns, so we should too.\n return trimmed.toLowerCase();\n }\n};\n\nconst parseSqlColumnArray = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n const parts = str.split(\",\");\n return parts.map(removeQuotes);\n};\n\nconst parseSqlColumnString = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n return removeQuotes(str);\n};\n\nfunction parseConstraintSpec(rawSpec) {\n const [spec, ...tagComponents] = rawSpec.split(/\\|/);\n const parsed = parseTags(tagComponents.join(\"\\n\"));\n return {\n spec,\n tags: parsed.tags,\n description: parsed.text,\n };\n}\n\nfunction smartCommentConstraints(introspectionResults) {\n const attributesByNames = (tbl, cols, debugStr) => {\n const attributes = introspectionResults.attribute\n .filter(a => a.classId === tbl.id)\n .sort((a, b) => a.num - b.num);\n if (!cols) {\n const pk = introspectionResults.constraint.find(\n c => c.classId == tbl.id && c.type === \"p\"\n );\n if (pk) {\n return pk.keyAttributeNums.map(n => attributes.find(a => a.num === n));\n } else {\n throw new Error(\n `No columns specified for '${tbl.namespaceName}.${tbl.name}' (oid: ${tbl.id}) and no PK found (${debugStr}).`\n );\n }\n }\n return cols.map(colName => {\n const attr = attributes.find(a => a.name === colName);\n if (!attr) {\n throw new Error(\n `Could not find attribute '${colName}' in '${tbl.namespaceName}.${tbl.name}'`\n );\n }\n return attr;\n });\n };\n\n // First: primary and unique keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n function addKey(key: string, isPrimary = false) {\n const tag = isPrimary ? \"@primaryKey\" : \"@unique\";\n if (typeof key !== \"string\") {\n if (isPrimary) {\n throw new Error(\n `${tag} configuration of '${klass.namespaceName}.${klass.name}' is invalid; please specify just once \"${tag} col1,col2\"`\n );\n }\n throw new Error(\n `${tag} configuration of '${klass.namespaceName}.${\n klass.name\n }' is invalid; expected ${\n isPrimary ? \"a string\" : \"a string or string array\"\n } but found ${typeof key}`\n );\n }\n const { spec: keySpec, tags, description } = parseConstraintSpec(key);\n const columns: string[] = parseSqlColumnArray(keySpec);\n const attributes = attributesByNames(klass, columns, `${tag} ${key}`);\n if (isPrimary) {\n attributes.forEach(attr => {\n attr.tags.notNull = true;\n });\n }\n const keyAttributeNums = attributes.map(a => a.num);\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_${tag}`,\n type: isPrimary ? \"p\" : \"u\",\n classId: klass.id,\n foreignClassId: null,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums: null,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n }\n if (klass.tags.primaryKey) {\n addKey(klass.tags.primaryKey, true);\n }\n if (klass.tags.unique) {\n if (Array.isArray(klass.tags.unique)) {\n klass.tags.unique.forEach(key => addKey(key));\n } else {\n addKey(klass.tags.unique);\n }\n }\n });\n // Now primary keys are in place, we can apply foreign keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n const getType = () =>\n introspectionResults.type.find(t => t.id === klass.typeId);\n const foreignKey = klass.tags.foreignKey || getType().tags.foreignKey;\n if (foreignKey) {\n const foreignKeys =\n typeof foreignKey === \"string\" ? [foreignKey] : foreignKey;\n if (!Array.isArray(foreignKeys)) {\n throw new Error(\n `Invalid foreign key smart comment specified on '${klass.namespaceName}.${klass.name}'`\n );\n }\n foreignKeys.forEach((fkSpecRaw, index) => {\n if (typeof fkSpecRaw !== \"string\") {\n throw new Error(\n `Invalid foreign key spec (${index}) on '${klass.namespaceName}.${klass.name}'`\n );\n }\n const {\n spec: fkSpec,\n tags,\n description,\n } = parseConstraintSpec(fkSpecRaw);\n const matches = fkSpec.match(\n /^\\(([^()]+)\\) references ([^().]+)(?:\\.([^().]+))?(?:\\s*\\(([^()]+)\\))?$/i\n );\n if (!matches) {\n throw new Error(\n `Invalid foreignKey syntax for '${klass.namespaceName}.${klass.name}'; expected something like \"(col1,col2) references schema.table (c1, c2)\", you passed '${fkSpecRaw}'`\n );\n }\n const [\n ,\n rawColumns,\n rawSchemaOrTable,\n rawTableOnly,\n rawForeignColumns,\n ] = matches;\n const rawSchema = rawTableOnly\n ? rawSchemaOrTable\n : `\"${klass.namespaceName}\"`;\n const rawTable = rawTableOnly || rawSchemaOrTable;\n const columns: string[] = parseSqlColumnArray(rawColumns);\n const foreignSchema: string = parseSqlColumnString(rawSchema);\n const foreignTable: string = parseSqlColumnString(rawTable);\n const foreignColumns: string[] | null = rawForeignColumns\n ? parseSqlColumnArray(rawForeignColumns)\n : null;\n\n const foreignKlass = introspectionResults.class.find(\n k => k.name === foreignTable && k.namespaceName === foreignSchema\n );\n if (!foreignKlass) {\n throw new Error(\n `@foreignKey smart comment referenced non-existant table/view '${foreignSchema}'.'${foreignTable}'. Note that this reference must use *database names* (i.e. it does not respect @name). (${fkSpecRaw})`\n );\n }\n const foreignNamespace = introspectionResults.namespace.find(\n n => n.id === foreignKlass.namespaceId\n );\n if (!foreignNamespace) {\n return;\n }\n\n const keyAttributeNums = attributesByNames(\n klass,\n columns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n const foreignKeyAttributeNums = attributesByNames(\n foreignKlass,\n foreignColumns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_foreignKey_${index}`,\n type: \"f\", // foreign key\n classId: klass.id,\n foreignClassId: foreignKlass.id,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n });\n }\n });\n}\n\nfunction isEnumConstraint(\n klass: PgClass,\n con: PgConstraint,\n isEnumTable: boolean\n) {\n if (con.classId === klass.id) {\n const isPrimaryKey = con.type === \"p\";\n const isUniqueConstraint = con.type === \"u\";\n if (isPrimaryKey || isUniqueConstraint) {\n const isExplicitEnumConstraint =\n con.tags.enum === true || typeof con.tags.enum === \"string\";\n const isPrimaryKeyOfEnumTableConstraint = con.type === \"p\" && isEnumTable;\n if (isExplicitEnumConstraint || isPrimaryKeyOfEnumTableConstraint) {\n const hasExactlyOneColumn = con.keyAttributeNums.length === 1;\n if (!hasExactlyOneColumn) {\n throw new Error(\n `Enum table \"${klass.namespaceName}\".\"${klass.name}\" enum constraint '${con.name}' is composite; it should have exactly one column (found: ${con.keyAttributeNums.length})`\n );\n }\n return true;\n }\n }\n }\n return false;\n}\n\nfunction enumTables(introspectionResults) {\n introspectionResults.class.map(async klass => {\n const isEnumTable =\n klass.tags.enum === true || typeof klass.tags.enum === \"string\";\n\n if (isEnumTable) {\n // Prevent the table being recognised as a table\n // eslint-disable-next-line require-atomic-updates\n klass.tags.omit = true;\n // eslint-disable-next-line require-atomic-updates\n klass.isSelectable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isInsertable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isUpdatable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isDeletable = false;\n }\n\n // By this point, even views should have \"fake\" constraints we can use\n // (e.g. `@primaryKey`)\n const enumConstraints = introspectionResults.constraint.filter(con =>\n isEnumConstraint(klass, con, isEnumTable)\n );\n\n // Get all the columns\n const enumTableColumns = introspectionResults.attribute.filter(\n attr => attr.classId === klass.id\n );\n\n // Get description column\n const descriptionColumn = enumTableColumns.find(\n attr => attr.name === \"description\" || attr.tags.enumDescription\n );\n const allData = klass._internalEnumData || [];\n\n enumConstraints.forEach(constraint => {\n const col = enumTableColumns.find(\n col => col.num === constraint.keyAttributeNums[0]\n );\n if (!col) {\n // Should never happen\n throw new Error(\n \"Graphile Engine error - could not find column for enum constraint\"\n );\n }\n const data = allData.filter(row => row[col.name] != null);\n if (data.length < 1) {\n throw new Error(\n `Enum table \"${klass.namespaceName}\".\"${klass.name}\" contains no visible entries for enum constraint '${constraint.name}'. Check that the table contains at least one row and that the rows are not hidden by row-level security policies.`\n );\n }\n\n // Create fake enum type\n const constraintIdent =\n constraint.type === \"p\" ? \"\" : `_${constraint.name}`;\n const enumTypeArray = {\n kind: \"type\",\n isFake: true,\n id: `FAKE_ENUM_${klass.namespaceName}_${klass.name}${constraintIdent}_list`,\n name: `_${klass.name}${constraintIdent}`,\n description: null,\n tags: {},\n namespaceId: klass.namespaceId,\n namespaceName: klass.namespaceName,\n type: \"b\",\n category: \"A\",\n domainIsNotNull: null,\n arrayItemTypeId: null,\n typeLength: -1,\n isPgArray: true,\n classId: null,\n domainBaseTypeId: null,\n domainTypeModifier: null,\n domainHasDefault: false,\n enumVariants: null,\n enumDescriptions: null,\n rangeSubTypeId: null,\n };\n const enumType = {\n kind: \"type\",\n isFake: true,\n id: `FAKE_ENUM_${klass.namespaceName}_${klass.name}${constraintIdent}`,\n name: `${klass.name}${constraintIdent}`,\n description: klass.description,\n tags: { ...klass.tags, ...constraint.tags },\n namespaceId: klass.namespaceId,\n namespaceName: klass.namespaceName,\n type: \"e\",\n category: \"E\",\n domainIsNotNull: null,\n arrayItemTypeId: enumTypeArray.id,\n typeLength: 4, // ???\n isPgArray: false,\n classId: null,\n domainBaseTypeId: null,\n domainTypeModifier: null,\n domainHasDefault: false,\n enumVariants: data.map(r => r[col.name]),\n enumDescriptions: descriptionColumn\n ? data.map(r => r[descriptionColumn.name])\n : null,\n // TODO: enumDescriptions\n rangeSubTypeId: null,\n };\n introspectionResults.type.push(enumType, enumTypeArray);\n introspectionResults.typeById[enumType.id] = enumType;\n introspectionResults.typeById[enumTypeArray.id] = enumTypeArray;\n\n // Change type of all attributes that reference this table to\n // reference this enum type\n introspectionResults.constraint.forEach(c => {\n if (\n c.type === \"f\" &&\n c.foreignClassId === klass.id &&\n c.foreignKeyAttributeNums.length === 1 &&\n c.foreignKeyAttributeNums[0] === col.num\n ) {\n // Get the attribute\n const fkattr = introspectionResults.attribute.find(\n attr =>\n attr.classId === c.classId && attr.num === c.keyAttributeNums[0]\n );\n if (fkattr) {\n // Override the detected type to pretend to be our enum\n fkattr.typeId = enumType.id;\n }\n }\n });\n });\n });\n}\n\n/* The argument to this must not contain cyclic references! */\nconst deepClone = value => {\n if (Array.isArray(value)) {\n return value.map(val => deepClone(val));\n } else if (typeof value === \"object\" && value) {\n return Object.keys(value).reduce((memo, k) => {\n memo[k] = deepClone(value[k]);\n return memo;\n }, {});\n } else {\n return value;\n }\n};\n\nexport default (async function PgIntrospectionPlugin(\n builder,\n {\n pgConfig,\n pgSchemas: schemas,\n pgEnableTags,\n persistentMemoizeWithKey = (key, fn) => fn(),\n pgThrowOnMissingSchema = false,\n pgIncludeExtensionResources = false,\n pgLegacyFunctionsOnly = false,\n pgIgnoreRBAC = true,\n pgSkipInstallingWatchFixtures = false,\n pgOwnerConnectionString,\n }\n) {\n /**\n * Introspect database and get the table/view/constraints.\n */\n async function introspect(): Promise<PgIntrospectionResultsByKind> {\n // Perform introspection\n if (!Array.isArray(schemas)) {\n throw new Error(\"Argument 'schemas' (array) is required\");\n }\n const cacheKey = `PgIntrospectionPlugin-introspectionResultsByKind-v${version}`;\n const introspectionResultsByKind = deepClone(\n await persistentMemoizeWithKey(cacheKey, () =>\n withPgClient(pgConfig, async pgClient => {\n const versionResult = await pgClient.query(\n \"show server_version_num;\"\n );\n const serverVersionNum = parseInt(\n versionResult.rows[0].server_version_num,\n 10\n );\n const introspectionQuery = makeIntrospectionQuery(serverVersionNum, {\n pgLegacyFunctionsOnly,\n pgIgnoreRBAC,\n });\n const { rows } = await pgClient.query(introspectionQuery, [\n schemas,\n pgIncludeExtensionResources,\n ]);\n\n const result = {\n __pgVersion: serverVersionNum,\n namespace: [],\n class: [],\n attribute: [],\n type: [],\n constraint: [],\n procedure: [],\n extension: [],\n index: [],\n };\n for (const { object } of rows) {\n result[object.kind].push(object);\n }\n\n // Parse tags from comments\n [\n \"namespace\",\n \"class\",\n \"attribute\",\n \"type\",\n \"constraint\",\n \"procedure\",\n \"extension\",\n \"index\",\n ].forEach(kind => {\n result[kind].forEach(object => {\n // Keep a copy of the raw comment\n object.comment = object.description;\n if (pgEnableTags && object.description) {\n const parsed = parseTags(object.description);\n object.tags = parsed.tags;\n object.description = parsed.text;\n } else {\n object.tags = {};\n }\n });\n });\n\n const extensionConfigurationClassIds = flatMap(\n result.extension,\n e => e.configurationClassIds\n );\n result.class.forEach(klass => {\n klass.isExtensionConfigurationTable =\n extensionConfigurationClassIds.indexOf(klass.id) >= 0;\n });\n\n // Assert the columns are text\n const VARCHAR_ID = \"1043\";\n const TEXT_ID = \"25\";\n const CHAR_ID = \"18\";\n const BPCHAR_ID = \"1042\";\n\n const VALID_TYPE_IDS = [VARCHAR_ID, TEXT_ID, CHAR_ID, BPCHAR_ID];\n\n await Promise.all(\n result.class.map(async klass => {\n if (!schemas.includes(klass.namespaceName)) {\n // Only support enums in public tables/views\n return;\n }\n const isEnumTable =\n klass.tags.enum === true || typeof klass.tags.enum === \"string\";\n\n // NOTE: this only matches on tables (not views, since they don't\n // have constraints), which is why we repeat the isEnumTable check below.\n const hasEnumConstraints = result.constraint.some(con =>\n isEnumConstraint(klass, con, isEnumTable)\n );\n if (isEnumTable || hasEnumConstraints) {\n // Get the list of columns enums are defined for\n const enumTableColumns = result.attribute\n .filter(\n attr =>\n attr.classId === klass.id &&\n VALID_TYPE_IDS.includes(attr.typeId)\n )\n .sort((a, z) => a.num - z.num);\n\n // Load data from the table/view.\n const query = pgSql.compile(\n pgSql.fragment`select ${pgSql.join(\n enumTableColumns.map(col => pgSql.identifier(col.name)),\n \", \"\n )} from ${pgSql.identifier(klass.namespaceName, klass.name)};`\n );\n\n let allData;\n try {\n ({ rows: allData } = await pgClient.query(query));\n } catch (e) {\n let role = \"RELEVANT_POSTGRES_USER\";\n try {\n const {\n rows: [{ user }],\n } = await pgClient.query(\"select user;\");\n role = user;\n } catch (e) {\n /*\n * Ignore; this is likely a 25P02 (transaction aborted)\n * error caused by the statement above failing.\n */\n }\n throw new Error(`Introspection could not read from enum table \"${klass.namespaceName}\".\"${klass.name}\", perhaps you need to grant access:\n\n GRANT USAGE ON SCHEMA \"${klass.namespaceName}\" TO \"${role}\";\n GRANT SELECT ON \"${klass.namespaceName}\".\"${klass.name}\" TO \"${role}\";\n\nOriginal error: ${e.message}\n`);\n }\n\n klass._internalEnumData = allData;\n }\n })\n );\n\n [\n \"namespace\",\n \"class\",\n \"attribute\",\n \"type\",\n \"constraint\",\n \"procedure\",\n \"extension\",\n \"index\",\n ].forEach(k => {\n result[k].forEach(Object.freeze);\n });\n\n return Object.freeze(result);\n })\n )\n );\n\n const knownSchemas = introspectionResultsByKind.namespace.map(n => n.name);\n const missingSchemas = schemas.filter(s => knownSchemas.indexOf(s) < 0);\n if (missingSchemas.length) {\n const errorMessage = `You requested to use schema '${schemas.join(\n \"', '\"\n )}'; however we couldn't find some of those! Missing schemas are: '${missingSchemas.join(\n \"', '\"\n )}'`;\n if (pgThrowOnMissingSchema) {\n throw new Error(errorMessage);\n } else {\n console.warn(\"⚠️ WARNING⚠️ \" + errorMessage); // eslint-disable-line no-console\n }\n }\n return introspectionResultsByKind;\n }\n\n function introspectionResultsFromRaw(\n rawResults,\n pgAugmentIntrospectionResults\n ) {\n const introspectionResultsByKind = deepClone(rawResults);\n\n const xByY = (arrayOfX, attrKey) =>\n arrayOfX.reduce((memo, x) => {\n memo[x[attrKey]] = x;\n return memo;\n }, {});\n const xByYAndZ = (arrayOfX, attrKey, attrKey2) =>\n arrayOfX.reduce((memo, x) => {\n if (!memo[x[attrKey]]) memo[x[attrKey]] = {};\n memo[x[attrKey]][x[attrKey2]] = x;\n return memo;\n }, {});\n introspectionResultsByKind.namespaceById = xByY(\n introspectionResultsByKind.namespace,\n \"id\"\n );\n introspectionResultsByKind.classById = xByY(\n introspectionResultsByKind.class,\n \"id\"\n );\n introspectionResultsByKind.typeById = xByY(\n introspectionResultsByKind.type,\n \"id\"\n );\n introspectionResultsByKind.attributeByClassIdAndNum = xByYAndZ(\n introspectionResultsByKind.attribute,\n \"classId\",\n \"num\"\n );\n introspectionResultsByKind.extensionById = xByY(\n introspectionResultsByKind.extension,\n \"id\"\n );\n\n const relate = (array, newAttr, lookupAttr, lookup, missingOk = false) => {\n array.forEach(entry => {\n const key = entry[lookupAttr];\n if (Array.isArray(key)) {\n entry[newAttr] = key\n .map(innerKey => {\n const result = lookup[innerKey];\n if (innerKey && !result) {\n if (missingOk) {\n return;\n }\n throw new Error(\n `Could not look up '${newAttr}' by '${lookupAttr}' ('${innerKey}') on '${JSON.stringify(\n entry\n )}'`\n );\n }\n return result;\n })\n .filter(_ => _);\n } else {\n const result = lookup[key];\n if (key && !result) {\n if (missingOk) {\n return;\n }\n throw new Error(\n `Could not look up '${newAttr}' by '${lookupAttr}' (= '${key}') on '${JSON.stringify(\n entry\n )}'`\n );\n }\n entry[newAttr] = result;\n }\n });\n };\n\n const augment = introspectionResults => {\n [\n pgAugmentIntrospectionResults,\n smartCommentConstraints,\n enumTables,\n ].forEach(fn => (fn ? fn(introspectionResults) : null));\n };\n augment(introspectionResultsByKind);\n\n relate(\n introspectionResultsByKind.class,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById,\n true // Because it could be a type defined in a different namespace - which is fine so long as we don't allow querying it directly\n );\n\n relate(\n introspectionResultsByKind.class,\n \"type\",\n \"typeId\",\n introspectionResultsByKind.typeById\n );\n\n relate(\n introspectionResultsByKind.attribute,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n relate(\n introspectionResultsByKind.attribute,\n \"type\",\n \"typeId\",\n introspectionResultsByKind.typeById\n );\n\n relate(\n introspectionResultsByKind.procedure,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById\n );\n\n relate(\n introspectionResultsByKind.type,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById,\n true\n );\n\n relate(\n introspectionResultsByKind.type,\n \"domainBaseType\",\n \"domainBaseTypeId\",\n introspectionResultsByKind.typeById,\n true // Because not all types are domains\n );\n\n relate(\n introspectionResultsByKind.type,\n \"arrayItemType\",\n \"arrayItemTypeId\",\n introspectionResultsByKind.typeById,\n true // Because not all types are arrays\n );\n\n relate(\n introspectionResultsByKind.constraint,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n relate(\n introspectionResultsByKind.constraint,\n \"foreignClass\",\n \"foreignClassId\",\n introspectionResultsByKind.classById,\n true // Because many constraints don't apply to foreign classes\n );\n\n relate(\n introspectionResultsByKind.extension,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById,\n true // Because the extension could be a defined in a different namespace\n );\n\n relate(\n introspectionResultsByKind.extension,\n \"configurationClasses\",\n \"configurationClassIds\",\n introspectionResultsByKind.classById,\n true // Because the configuration table could be a defined in a different namespace\n );\n\n relate(\n introspectionResultsByKind.index,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n // Reverse arrayItemType -> arrayType\n introspectionResultsByKind.type.forEach(type => {\n if (type.arrayItemType) {\n type.arrayItemType.arrayType = type;\n }\n });\n\n // Table/type columns / constraints\n introspectionResultsByKind.class.forEach(klass => {\n klass.attributes = introspectionResultsByKind.attribute.filter(\n attr => attr.classId === klass.id\n );\n klass.canUseAsterisk = !klass.attributes.some(\n attr => attr.columnLevelSelectGrant\n );\n klass.constraints = introspectionResultsByKind.constraint.filter(\n constraint => constraint.classId === klass.id\n );\n klass.foreignConstraints = introspectionResultsByKind.constraint.filter(\n constraint => constraint.foreignClassId === klass.id\n );\n klass.primaryKeyConstraint = klass.constraints.find(\n constraint => constraint.type === \"p\"\n );\n });\n\n // Constraint attributes\n introspectionResultsByKind.constraint.forEach(constraint => {\n if (constraint.keyAttributeNums && constraint.class) {\n constraint.keyAttributes = constraint.keyAttributeNums.map(nr =>\n constraint.class.attributes.find(attr => attr.num === nr)\n );\n } else {\n constraint.keyAttributes = [];\n }\n if (constraint.foreignKeyAttributeNums && constraint.foreignClass) {\n constraint.foreignKeyAttributes =\n constraint.foreignKeyAttributeNums.map(nr =>\n constraint.foreignClass.attributes.find(attr => attr.num === nr)\n );\n } else {\n constraint.foreignKeyAttributes = [];\n }\n });\n\n // Detect which columns and constraints are indexed\n introspectionResultsByKind.index.forEach(index => {\n const columns = index.attributeNums.map(nr =>\n index.class.attributes.find(attr => attr.num === nr)\n );\n\n // Indexed column (for orderBy / filter):\n if (columns[0]) {\n columns[0].isIndexed = true;\n }\n\n if (columns[0] && columns.length === 1 && index.isUnique) {\n columns[0].isUnique = true;\n }\n\n // Indexed constraints (for reverse relations):\n index.class.constraints\n .filter(constraint => constraint.type === \"f\")\n .forEach(constraint => {\n if (\n constraint.keyAttributeNums.every(\n (nr, idx) => index.attributeNums[idx] === nr\n )\n ) {\n constraint.isIndexed = true;\n }\n });\n });\n\n return introspectionResultsByKind;\n }\n\n let rawIntrospectionResultsByKind = await introspect();\n\n let listener;\n\n class Listener {\n _handleChange: () => void;\n client: Client | null;\n stopped: boolean;\n _reallyReleaseClient: (() => Promise<void>) | null;\n _haveDisplayedError: boolean;\n constructor(triggerRebuild) {\n this.stopped = false;\n this._handleChange = throttle(\n async () => {\n debug(`Schema change detected: re-inspecting schema...`);\n try {\n rawIntrospectionResultsByKind = await introspect();\n debug(`Schema change detected: re-inspecting schema complete`);\n triggerRebuild();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(`Schema introspection failed: ${e.message}`);\n }\n },\n 750,\n {\n leading: true,\n trailing: true,\n }\n );\n this._listener = this._listener.bind(this);\n this._handleClientError = this._handleClientError.bind(this);\n this._start();\n }\n\n async _start(isReconnect = false) {\n if (this.stopped) {\n return;\n }\n // Connect to DB\n try {\n const { pgClient, releasePgClient } =\n await getPgClientAndReleaserFromConfig(pgConfig);\n this.client = pgClient;\n // $FlowFixMe: hack property\n this._reallyReleaseClient = releasePgClient;\n pgClient.on(\"notification\", this._listener);\n pgClient.on(\"error\", this._handleClientError);\n if (this.stopped) {\n // In case watch mode was cancelled in the interrim.\n return this._releaseClient();\n } else {\n await pgClient.query(\"listen postgraphile_watch\");\n\n // Install the watch fixtures.\n if (!pgSkipInstallingWatchFixtures) {\n const watchSqlInner = await readFile(WATCH_FIXTURES_PATH, \"utf8\");\n const sql = `begin; ${watchSqlInner};`;\n await withPgClient(\n pgOwnerConnectionString || pgConfig,\n async pgClient => {\n try {\n await pgClient.query(sql);\n } catch (error) {\n if (!this._haveDisplayedError) {\n this._haveDisplayedError = true;\n /* eslint-disable no-console */\n console.warn(\n `${chalk.bold.yellow(\n \"Failed to setup watch fixtures in Postgres database\"\n )} ️️⚠️`\n );\n console.warn(\n chalk.yellow(\n \"This is likely because the PostgreSQL user in the connection string does not have sufficient privileges; you can solve this by passing the 'owner' connection string via '--owner-connection' / 'ownerConnectionString'. If the fixtures already exist, the watch functionality may still work.\"\n )\n );\n console.warn(\n chalk.yellow(\n \"Enable DEBUG='graphile-build-pg' to see the error\"\n )\n );\n /* eslint-enable no-console */\n }\n debug(error);\n } finally {\n await pgClient.query(\"commit;\");\n }\n }\n );\n }\n\n // Trigger re-introspection on server reconnect\n if (isReconnect) {\n this._handleChange();\n }\n }\n } catch (e) {\n // If something goes wrong, disconnect and try again after a short delay\n this._reconnect(e);\n }\n }\n\n _handleClientError: (e: Error) => void;\n _handleClientError(e) {\n this._releaseClient(false);\n this._reconnect(e);\n }\n async _reconnect(e) {\n if (this.stopped) {\n return;\n }\n // eslint-disable-next-line no-console\n console.error(\n \"Error occurred for PG watching client; reconnecting in 2 seconds.\",\n e.message\n );\n await this._releaseClient();\n setTimeout(() => {\n if (!this.stopped) {\n // Listen for further changes\n this._start(true);\n }\n }, 2000);\n }\n\n // eslint-disable-next-line flowtype/no-weak-types\n _listener: (notification: any) => void;\n // eslint-disable-next-line flowtype/no-weak-types\n async _listener(notification: any) {\n if (notification.channel !== \"postgraphile_watch\") {\n return;\n }\n try {\n const payload = JSON.parse(notification.payload);\n payload.payload = payload.payload || [];\n if (payload.type === \"ddl\") {\n const commands = payload.payload\n .filter(\n ({ schema }) => schema == null || schemas.indexOf(schema) >= 0\n )\n .map(({ command }) => command);\n if (commands.length) {\n this._handleChange();\n }\n } else if (payload.type === \"drop\") {\n const affectsOurSchemas = payload.payload.some(\n schemaName => schemas.indexOf(schemaName) >= 0\n );\n if (affectsOurSchemas) {\n this._handleChange();\n }\n } else if (payload.type === \"manual\") {\n this._handleChange();\n } else {\n throw new Error(`Payload type '${payload.type}' not recognised`);\n }\n } catch (e) {\n debug(`Error occurred parsing notification payload: ${e}`);\n }\n }\n\n async stop() {\n this.stopped = true;\n this._handleChange.cancel();\n await this._releaseClient();\n }\n\n /**\n * Only pass `false` to this function if you know the client is going to be\n * terminated; otherwise we risk leaving listeners running.\n */\n async _releaseClient(clientIsStillViable = true) {\n // $FlowFixMe\n const pgClient = this.client;\n const reallyReleaseClient = this._reallyReleaseClient;\n this.client = null;\n this._reallyReleaseClient = null;\n if (pgClient) {\n // Don't attempt to run a query after a client has errored.\n if (clientIsStillViable) {\n pgClient.query(\"unlisten postgraphile_watch\").catch(e => {\n debug(`Error occurred trying to unlisten watch: ${e}`);\n });\n }\n pgClient.removeListener(\"notification\", this._listener);\n pgClient.removeListener(\"error\", this._handleClientError);\n }\n if (reallyReleaseClient) {\n await reallyReleaseClient();\n }\n }\n }\n\n builder.registerWatcher(\n async triggerRebuild => {\n // In case we started listening before, clean up\n if (listener) {\n await listener.stop();\n }\n // We're not worried about a race condition here.\n // eslint-disable-next-line require-atomic-updates\n listener = new Listener(triggerRebuild);\n },\n async () => {\n const l = listener;\n listener = null;\n if (l) {\n await l.stop();\n }\n }\n );\n\n builder.hook(\n \"build\",\n build => {\n const introspectionResultsByKind = introspectionResultsFromRaw(\n rawIntrospectionResultsByKind,\n build.pgAugmentIntrospectionResults\n );\n if (introspectionResultsByKind.__pgVersion < 90500) {\n // TODO:v5: remove this workaround\n // This is a bit of a hack, but until we have plugin priorities it's the\n // easiest way to conditionally support PG9.4.\n build.pgQueryFromResolveData = queryFromResolveDataFactory({\n supportsJSONB: false,\n });\n }\n return build.extend(build, {\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n });\n },\n [\"PgIntrospection\"],\n [],\n [\"PgBasics\"]\n );\n}: Plugin);\n\n// TypeScript compatibility\nexport const PgEntityKind = {\n NAMESPACE: \"namespace\",\n PROCEDURE: \"procedure\",\n CLASS: \"class\",\n TYPE: \"type\",\n ATTRIBUTE: \"attribute\",\n CONSTRAINT: \"constraint\",\n EXTENSION: \"extension\",\n INDEX: \"index\",\n};\n"],"file":"PgIntrospectionPlugin.js"}