graphile-build-pg 4.11.0 → 4.11.2

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.
@@ -769,9 +769,7 @@ Original error: ${e.message}
769
769
  }
770
770
 
771
771
  _handleClientError(e) {
772
- // Client is already cleaned up
773
- this.client = null;
774
- this._reallyReleaseClient = null;
772
+ this._releaseClient(false);
775
773
 
776
774
  this._reconnect(e);
777
775
  }
@@ -831,28 +829,38 @@ Original error: ${e.message}
831
829
 
832
830
  async stop() {
833
831
  this.stopped = true;
832
+
833
+ this._handleChange.cancel();
834
+
834
835
  await this._releaseClient();
835
836
  }
837
+ /**
838
+ * Only pass `false` to this function if you know the client is going to be
839
+ * terminated; otherwise we risk leaving listeners running.
840
+ */
836
841
 
837
- async _releaseClient() {
838
- // $FlowFixMe
839
- this._handleChange.cancel();
840
842
 
843
+ async _releaseClient(clientIsStillViable = true) {
844
+ // $FlowFixMe
841
845
  const pgClient = this.client;
842
846
  const reallyReleaseClient = this._reallyReleaseClient;
843
847
  this.client = null;
844
848
  this._reallyReleaseClient = null;
845
849
 
846
850
  if (pgClient) {
847
- pgClient.query("unlisten postgraphile_watch").catch(e => {
848
- debug(`Error occurred trying to unlisten watch: ${e}`);
849
- });
851
+ // Don't attempt to run a query after a client has errored.
852
+ if (clientIsStillViable) {
853
+ pgClient.query("unlisten postgraphile_watch").catch(e => {
854
+ debug(`Error occurred trying to unlisten watch: ${e}`);
855
+ });
856
+ }
857
+
850
858
  pgClient.removeListener("notification", this._listener);
851
859
  pgClient.removeListener("error", this._handleClientError);
860
+ }
852
861
 
853
- if (reallyReleaseClient) {
854
- await reallyReleaseClient();
855
- }
862
+ if (reallyReleaseClient) {
863
+ await reallyReleaseClient();
856
864
  }
857
865
  }
858
866
 
@@ -1204,9 +1204,7 @@ Original error: ${e.message}
1204
1204
 
1205
1205
  _handleClientError: (e: Error) => void;
1206
1206
  _handleClientError(e) {
1207
- // Client is already cleaned up
1208
- this.client = null;
1209
- this._reallyReleaseClient = null;
1207
+ this._releaseClient(false);
1210
1208
  this._reconnect(e);
1211
1209
  }
1212
1210
  async _reconnect(e) {
@@ -1265,25 +1263,32 @@ Original error: ${e.message}
1265
1263
 
1266
1264
  async stop() {
1267
1265
  this.stopped = true;
1266
+ this._handleChange.cancel();
1268
1267
  await this._releaseClient();
1269
1268
  }
1270
1269
 
1271
- async _releaseClient() {
1270
+ /**
1271
+ * Only pass `false` to this function if you know the client is going to be
1272
+ * terminated; otherwise we risk leaving listeners running.
1273
+ */
1274
+ async _releaseClient(clientIsStillViable = true) {
1272
1275
  // $FlowFixMe
1273
- this._handleChange.cancel();
1274
1276
  const pgClient = this.client;
1275
1277
  const reallyReleaseClient = this._reallyReleaseClient;
1276
1278
  this.client = null;
1277
1279
  this._reallyReleaseClient = null;
1278
1280
  if (pgClient) {
1279
- pgClient.query("unlisten postgraphile_watch").catch(e => {
1280
- debug(`Error occurred trying to unlisten watch: ${e}`);
1281
- });
1281
+ // Don't attempt to run a query after a client has errored.
1282
+ if (clientIsStillViable) {
1283
+ pgClient.query("unlisten postgraphile_watch").catch(e => {
1284
+ debug(`Error occurred trying to unlisten watch: ${e}`);
1285
+ });
1286
+ }
1282
1287
  pgClient.removeListener("notification", this._listener);
1283
1288
  pgClient.removeListener("error", this._handleClientError);
1284
- if (reallyReleaseClient) {
1285
- await reallyReleaseClient();
1286
- }
1289
+ }
1290
+ if (reallyReleaseClient) {
1291
+ await reallyReleaseClient();
1287
1292
  }
1288
1293
  }
1289
1294
  }
@@ -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","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 { spec: fkSpec, tags, description } = parseConstraintSpec(\n fkSpecRaw\n );\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 = constraint.foreignKeyAttributeNums.map(\n nr => 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 {\n pgClient,\n 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 // Client is already cleaned up\n this.client = null;\n this._reallyReleaseClient = null;\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 await this._releaseClient();\n }\n\n async _releaseClient() {\n // $FlowFixMe\n this._handleChange.cancel();\n const pgClient = this.client;\n const reallyReleaseClient = this._reallyReleaseClient;\n this.client = null;\n this._reallyReleaseClient = null;\n if (pgClient) {\n pgClient.query(\"unlisten postgraphile_watch\").catch(e => {\n debug(`Error occurred trying to unlisten watch: ${e}`);\n });\n pgClient.removeListener(\"notification\", this._listener);\n pgClient.removeListener(\"error\", this._handleClientError);\n if (reallyReleaseClient) {\n await reallyReleaseClient();\n }\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","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 { spec: fkSpec, tags, description } = parseConstraintSpec(\n fkSpecRaw\n );\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 = constraint.foreignKeyAttributeNums.map(\n nr => 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 {\n pgClient,\n 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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "graphile-build-pg",
3
- "version": "4.11.0",
3
+ "version": "4.11.2",
4
4
  "description": "Build a GraphQL schema by reflection over a PostgreSQL schema. Easy to customize since it's built with plugins on graphile-build",
5
5
  "main": "node8plus/index.js",
6
6
  "types": "node8plus/index.d.ts",
@@ -65,5 +65,5 @@
65
65
  "engines": {
66
66
  "node": ">=8.6"
67
67
  },
68
- "gitHead": "742133b9064cd64d61e45edc981261a036d56c7f"
68
+ "gitHead": "48591afb29586cb3ad1aa5ca6907677e96a5f1ee"
69
69
  }