graphile-build-pg 4.5.0 → 4.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -240,8 +240,9 @@ var PgBasicsPlugin = function PgBasicsPlugin(builder, {
240
240
  pgIgnoreIndexes = true,
241
241
  // TODO:v5: change this to false
242
242
  pgHideIndexWarnings = false,
243
- pgLegacyJsonUuid = false // TODO:v5: remove this
244
-
243
+ pgLegacyJsonUuid = false,
244
+ // TODO:v5: remove this
245
+ pgAugmentIntrospectionResults
245
246
  }) {
246
247
  let pgOmit = _omit.default;
247
248
 
@@ -272,7 +273,8 @@ var PgBasicsPlugin = function PgBasicsPlugin(builder, {
272
273
  describePgEntity,
273
274
  pgField: _pgField.default,
274
275
  sqlCommentByAddingTags,
275
- pgPrepareAndRun: _pgPrepareAndRun.default
276
+ pgPrepareAndRun: _pgPrepareAndRun.default,
277
+ pgAugmentIntrospectionResults
276
278
  });
277
279
  }, ["PgBasics"]);
278
280
  builder.hook("inflection", (inflection, build) => {
@@ -321,6 +321,7 @@ export default (function PgBasicsPlugin(
321
321
  pgIgnoreIndexes = true, // TODO:v5: change this to false
322
322
  pgHideIndexWarnings = false,
323
323
  pgLegacyJsonUuid = false, // TODO:v5: remove this
324
+ pgAugmentIntrospectionResults,
324
325
  }
325
326
  ) {
326
327
  let pgOmit = baseOmit;
@@ -354,6 +355,7 @@ export default (function PgBasicsPlugin(
354
355
  pgField,
355
356
  sqlCommentByAddingTags,
356
357
  pgPrepareAndRun,
358
+ pgAugmentIntrospectionResults,
357
359
  });
358
360
  },
359
361
  ["PgBasics"]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/PgBasicsPlugin.js"],"names":["defaultPgColumnFilter","_attr","_build","_context","identity","_","preventEmptyResult","obj","Object","keys","reduce","memo","key","fn","args","result","apply","length","stringifiedArgs","require","inspect","Error","String","omitWithRBACChecks","omit","entity","permission","ORDINARY_TABLE","VIEW","MATERIALIZED_VIEW","isTableLike","kind","classKind","EXECUTE","aclExecutable","tableEntity","READ","ALL","MANY","aclSelectable","attributes","some","attr","CREATE","aclInsertable","UPDATE","aclUpdatable","DELETE","aclDeletable","class","attributeEntity","klass","FILTER","ORDER","omitUnindexed","hideIndexWarnings","isIndexed","type","shouldOutputWarning","_omitUnindexedReadWarningGiven","console","log","describePgEntity","namespaceName","name","keyAttributes","map","a","join","includeAlias","getAlias","tags","value","endsWith","chalk","bold","t","c","f","p","r","v","m","e","error","id","sqlCommentByAddingTags","tagsToAdd","escape","str","replace","chr","description","tagsSql","tag","tagValue","valueArray","Array","isArray","highlightOrNot","green","forEach","push","commentValue","sqlThing","identifier","PgBasicsPlugin","builder","pgStrictFunctions","pgColumnFilter","pgIgnoreRBAC","pgIgnoreIndexes","pgHideIndexWarnings","pgLegacyJsonUuid","pgOmit","baseOmit","hook","build","versions","version","liveCoordinator","registerProvider","PgLiveProvider","extend","graphileBuildPgVersion","pgSql","sql","pgQueryFromResolveData","pgAddStartEndCursor","addStartEndCursor","pgMakeProcField","makeProcField","pgParseIdentifier","parseIdentifier","pgViaTemporaryTable","viaTemporaryTable","pgField","pgPrepareAndRun","inflection","oldBuiltin","builtin","call","conditionType","typeName","upperCamelCase","inputType","rangeBoundType","rangeType","patchType","baseInputType","patchField","itemName","camelCase","orderByType","pluralize","edge","connection","_functionName","proc","coerceToGraphQLName","_typeName","_tableName","table","_singularizedTableName","singularize","_columnName","_options","enumType","argument","index","orderByEnum","columnName","ascending","constantCase","orderByColumnEnum","skipRowId","orderByComputedColumnEnum","pseudoColumnName","computedColumn","domainType","enumName","inValue","$","tableNode","tableFieldName","allRows","allRowsSimple","functionMutationName","functionMutationResultFieldName","gqlType","plural","outputArgNames","resultFieldName","returnTypeId","functionQueryName","functionQueryNameList","functionPayloadType","functionInputType","functionOutputFieldName","outputArgName","tableType","column","_table","fieldName","computedColumnList","singleRelationByKeys","detailedKeys","_foreignTable","constraint","singleRelationByKeysBackwards","foreignSingleFieldName","foreignFieldName","manyRelationByKeys","manyRelationByKeysSimple","foreignSimpleFieldName","rowByUniqueKeys","updateByKeys","updateFieldName","deleteByKeys","deleteFieldName","updateByKeysInputType","deleteByKeysInputType","updateNode","deleteNode","deletedNodeId","updateNodeInputType","deleteNodeInputType","edgeField","recordFunctionReturnType","resultTypeName","recordFunctionConnection","recordFunctionEdge","scalarFunctionConnection","scalarFunctionEdge","createField","createInputType","createPayloadType","updatePayloadType","deletePayloadType"],"mappings":"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","sourcesContent":["// @flow\nimport * as sql from \"pg-sql2\";\nimport type { Plugin } from \"graphile-build\";\nimport { version } from \"../../package.json\";\nimport type {\n PgProc,\n PgType,\n PgClass,\n PgAttribute,\n PgConstraint,\n PgEntity,\n} from \"./PgIntrospectionPlugin\";\nimport pgField from \"./pgField\";\n\nimport queryFromResolveDataFactory from \"../queryFromResolveDataFactory\";\nimport addStartEndCursor from \"./addStartEndCursor\";\nimport baseOmit, {\n CREATE,\n READ,\n UPDATE,\n DELETE,\n ALL,\n MANY,\n ORDER,\n FILTER,\n EXECUTE,\n} from \"../omit\";\nimport makeProcField from \"./makeProcField\";\nimport parseIdentifier from \"../parseIdentifier\";\nimport viaTemporaryTable from \"./viaTemporaryTable\";\nimport chalk from \"chalk\";\nimport pickBy from \"lodash/pickBy\";\nimport PgLiveProvider from \"../PgLiveProvider\";\nimport pgPrepareAndRun from \"../pgPrepareAndRun\";\n\nconst defaultPgColumnFilter = (_attr, _build, _context) => true;\ntype Keys = Array<{\n column: string,\n table: string,\n schema: ?string,\n}>;\n\nconst identity = _ => _;\n\nexport function preventEmptyResult<\n // eslint-disable-next-line flowtype/no-weak-types\n O: { [key: string]: (...args: Array<any>) => string }\n>(obj: O): $ObjMap<O, <V>(V) => V> {\n return Object.keys(obj).reduce((memo, key) => {\n const fn = obj[key];\n memo[key] = function(...args) {\n const result = fn.apply(this, args);\n if (typeof result !== \"string\" || result.length === 0) {\n const stringifiedArgs = require(\"util\").inspect(args);\n throw new Error(\n `Inflector for '${key}' returned '${String(\n result\n )}'; expected non-empty string\\n` +\n `See: https://github.com/graphile/graphile-build/blob/master/packages/graphile-build-pg/src/plugins/PgBasicsPlugin.js\\n` +\n `Arguments passed to ${key}:\\n${stringifiedArgs}`\n );\n }\n return result;\n };\n return memo;\n }, {});\n}\n\nconst omitWithRBACChecks = omit => (\n entity: PgProc | PgClass | PgAttribute | PgConstraint,\n permission: string\n) => {\n const ORDINARY_TABLE = \"r\";\n const VIEW = \"v\";\n const MATERIALIZED_VIEW = \"m\";\n const isTableLike = entity =>\n entity &&\n entity.kind === \"class\" &&\n (entity.classKind === ORDINARY_TABLE ||\n entity.classKind === VIEW ||\n entity.classKind === MATERIALIZED_VIEW);\n if (entity.kind === \"procedure\") {\n if (permission === EXECUTE && !entity.aclExecutable) {\n return true;\n }\n } else if (entity.kind === \"class\" && isTableLike(entity)) {\n const tableEntity: PgClass = entity;\n if (\n (permission === READ || permission === ALL || permission === MANY) &&\n (!tableEntity.aclSelectable &&\n !tableEntity.attributes.some(attr => attr.aclSelectable))\n ) {\n return true;\n } else if (\n permission === CREATE &&\n (!tableEntity.aclInsertable &&\n !tableEntity.attributes.some(attr => attr.aclInsertable))\n ) {\n return true;\n } else if (\n permission === UPDATE &&\n (!tableEntity.aclUpdatable &&\n !tableEntity.attributes.some(attr => attr.aclUpdatable))\n ) {\n return true;\n } else if (permission === DELETE && !tableEntity.aclDeletable) {\n return true;\n }\n } else if (entity.kind === \"attribute\" && isTableLike(entity.class)) {\n const attributeEntity: PgAttribute = entity;\n\n const klass = attributeEntity.class;\n // Have we got *any* permissions on the table?\n if (\n klass.aclSelectable ||\n klass.attributes.some(attr => attr.aclSelectable)\n ) {\n // Yes; this is a regular table; omit if RBAC permissions tell us to.\n if (\n (permission === READ ||\n permission === FILTER ||\n permission === ORDER) &&\n !attributeEntity.aclSelectable\n ) {\n return true;\n } else if (permission === CREATE && !attributeEntity.aclInsertable) {\n return true;\n } else if (permission === UPDATE && !attributeEntity.aclUpdatable) {\n return true;\n }\n } else {\n // No permissions on the table at all, so normal connections will skip\n // over it. Thus we must be being exposed via a security definer function\n // or similar, so we should expose all fields except those that are\n // explicitly @omit-ed.\n }\n }\n return omit(entity, permission);\n};\n\nconst omitUnindexed = (omit, hideIndexWarnings) => (\n entity: PgProc | PgClass | PgAttribute | PgConstraint,\n permission: string\n) => {\n if (\n entity.kind === \"attribute\" &&\n !entity.isIndexed &&\n (permission === \"filter\" || permission === \"order\")\n ) {\n return true;\n }\n if (\n entity.kind === \"constraint\" &&\n entity.type === \"f\" &&\n !entity.isIndexed &&\n permission === \"read\"\n ) {\n const klass = entity.class;\n if (klass) {\n const shouldOutputWarning =\n // $FlowFixMe\n !entity._omitUnindexedReadWarningGiven && !hideIndexWarnings;\n if (shouldOutputWarning) {\n // $FlowFixMe\n entity._omitUnindexedReadWarningGiven = true;\n // eslint-disable-next-line no-console\n console.log(\n \"%s\",\n `Disabled 'read' permission for ${describePgEntity(\n entity\n )} because it isn't indexed. For more information see https://graphile.org/postgraphile/best-practices/ To fix, perform\\n\\n CREATE INDEX ON ${`\"${klass.namespaceName}\".\"${klass.name}\"`}(\"${entity.keyAttributes\n .map(a => a.name)\n .join('\", \"')}\");`\n );\n }\n }\n return true;\n }\n return omit(entity, permission);\n};\n\nfunction describePgEntity(entity: PgEntity, includeAlias = true) {\n const getAlias = !includeAlias\n ? () => \"\"\n : () => {\n const tags = pickBy(\n entity.tags,\n (value, key) => key === \"name\" || key.endsWith(\"Name\")\n );\n if (Object.keys(tags).length) {\n return ` (with smart comments: ${chalk.bold(\n Object.keys(tags)\n .map(t => `@${t} ${tags[t]}`)\n .join(\" | \")\n )})`;\n }\n return \"\";\n };\n\n try {\n if (entity.kind === \"constraint\") {\n return `constraint ${chalk.bold(\n `\"${entity.name}\"`\n )} on ${describePgEntity(entity.class, false)}${getAlias()}`;\n } else if (entity.kind === \"class\") {\n // see pg_class.relkind https://www.postgresql.org/docs/10/static/catalog-pg-class.html\n const kind =\n {\n c: \"composite type\",\n f: \"foreign table\",\n p: \"partitioned table\",\n r: \"table\",\n v: \"view\",\n m: \"materialized view\",\n }[entity.classKind] || \"table-like\";\n return `${kind} ${chalk.bold(\n `\"${entity.namespaceName}\".\"${entity.name}\"`\n )}${getAlias()}`;\n } else if (entity.kind === \"procedure\") {\n return `function ${chalk.bold(\n `\"${entity.namespaceName}\".\"${entity.name}\"(...args...)`\n )}${getAlias()}`;\n } else if (entity.kind === \"attribute\") {\n return `column ${chalk.bold(`\"${entity.name}\"`)} on ${describePgEntity(\n entity.class,\n false\n )}${getAlias()}`;\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"Error occurred while attempting to debug entity:\", entity);\n // eslint-disable-next-line no-console\n console.error(e);\n }\n return `entity of kind '${entity.kind}' with ${\n typeof entity.id === \"string\" ? `oid '${entity.id}'` : \"\"\n }`;\n}\n\nfunction sqlCommentByAddingTags(entity, tagsToAdd) {\n // NOTE: this function is NOT intended to be SQL safe; it's for\n // displaying in error messages. Nonetheless if you find issues with\n // SQL compatibility, please send a PR or issue.\n\n // Ref: https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-BACKSLASH-TABLE\n const escape = str =>\n str.replace(\n /['\\\\\\b\\f\\n\\r\\t]/g,\n chr =>\n ({\n \"\\b\": \"\\\\b\",\n \"\\f\": \"\\\\f\",\n \"\\n\": \"\\\\n\",\n \"\\r\": \"\\\\r\",\n \"\\t\": \"\\\\t\",\n }[chr] || \"\\\\\" + chr)\n );\n\n // tagsToAdd is here twice to ensure that the keys in tagsToAdd come first, but that they also \"win\" any conflicts.\n const tags = {\n ...tagsToAdd,\n ...entity.tags,\n ...tagsToAdd,\n };\n\n const description = entity.description;\n const tagsSql = Object.keys(tags)\n .reduce((memo, tag) => {\n const tagValue = tags[tag];\n const valueArray = Array.isArray(tagValue) ? tagValue : [tagValue];\n const highlightOrNot = tag in tagsToAdd ? chalk.bold.green : identity;\n valueArray.forEach(value => {\n memo.push(\n highlightOrNot(\n `@${escape(escape(tag))}${\n value === true ? \"\" : \" \" + escape(escape(value))\n }`\n )\n );\n });\n return memo;\n }, [])\n .join(\"\\\\n\");\n const commentValue = `E'${tagsSql}${\n description ? \"\\\\n\" + escape(description) : \"\"\n }'`;\n let sqlThing;\n if (entity.kind === \"class\") {\n const identifier = `\"${entity.namespaceName}\".\"${entity.name}\"`;\n if (entity.classKind === \"r\") {\n sqlThing = `TABLE ${identifier}`;\n } else if (entity.classKind === \"v\") {\n sqlThing = `VIEW ${identifier}`;\n } else if (entity.classKind === \"m\") {\n sqlThing = `MATERIALIZED VIEW ${identifier}`;\n } else if (entity.classKind === \"c\") {\n sqlThing = `TYPE ${identifier}`;\n } else {\n sqlThing = `PLEASE_SEND_A_PULL_REQUEST_TO_FIX_THIS ${identifier}`;\n }\n } else if (entity.kind === \"attribute\") {\n sqlThing = `COLUMN \"${entity.class.namespaceName}\".\"${entity.class.name}\".\"${entity.name}\"`;\n } else if (entity.kind === \"procedure\") {\n sqlThing = `FUNCTION \"${entity.namespaceName}\".\"${entity.name}\"(...arg types go here...)`;\n } else if (entity.kind === \"constraint\") {\n // TODO: TEST!\n sqlThing = `CONSTRAINT \"${entity.name}\" ON \"${entity.class.namespaceName}\".\"${entity.class.name}\"`;\n } else {\n sqlThing = `UNKNOWN_ENTITY_PLEASE_SEND_A_PULL_REQUEST`;\n }\n\n return `COMMENT ON ${sqlThing} IS ${commentValue};`;\n}\n\nexport default (function PgBasicsPlugin(\n builder,\n {\n pgStrictFunctions = false,\n pgColumnFilter = defaultPgColumnFilter,\n pgIgnoreRBAC = false,\n pgIgnoreIndexes = true, // TODO:v5: change this to false\n pgHideIndexWarnings = false,\n pgLegacyJsonUuid = false, // TODO:v5: remove this\n }\n) {\n let pgOmit = baseOmit;\n if (!pgIgnoreRBAC) {\n pgOmit = omitWithRBACChecks(pgOmit);\n }\n if (!pgIgnoreIndexes) {\n pgOmit = omitUnindexed(pgOmit, pgHideIndexWarnings);\n }\n builder.hook(\n \"build\",\n build => {\n build.versions[\"graphile-build-pg\"] = version;\n build.liveCoordinator.registerProvider(new PgLiveProvider());\n return build.extend(build, {\n graphileBuildPgVersion: version,\n pgSql: sql,\n pgStrictFunctions,\n pgColumnFilter,\n\n // TODO:v5: remove this workaround\n // BEWARE: this may be overridden in PgIntrospectionPlugin for PG < 9.5\n pgQueryFromResolveData: queryFromResolveDataFactory(),\n\n pgAddStartEndCursor: addStartEndCursor,\n pgOmit,\n pgMakeProcField: makeProcField,\n pgParseIdentifier: parseIdentifier,\n pgViaTemporaryTable: viaTemporaryTable,\n describePgEntity,\n pgField,\n sqlCommentByAddingTags,\n pgPrepareAndRun,\n });\n },\n [\"PgBasics\"]\n );\n\n builder.hook(\n \"inflection\",\n (inflection, build) => {\n // TODO:v5: move this to postgraphile-core\n const oldBuiltin = inflection.builtin;\n inflection.builtin = function(name) {\n if (pgLegacyJsonUuid && name === \"JSON\") return \"Json\";\n if (pgLegacyJsonUuid && name === \"UUID\") return \"Uuid\";\n return oldBuiltin.call(this, name);\n };\n\n return build.extend(\n inflection,\n preventEmptyResult({\n // These helpers are passed GraphQL type names as strings\n conditionType(typeName: string) {\n return this.upperCamelCase(`${typeName}-condition`);\n },\n inputType(typeName: string) {\n return this.upperCamelCase(`${typeName}-input`);\n },\n rangeBoundType(typeName: string) {\n return this.upperCamelCase(`${typeName}-range-bound`);\n },\n rangeType(typeName: string) {\n return this.upperCamelCase(`${typeName}-range`);\n },\n patchType(typeName: string) {\n return this.upperCamelCase(`${typeName}-patch`);\n },\n baseInputType(typeName: string) {\n return this.upperCamelCase(`${typeName}-base-input`);\n },\n patchField(itemName: string) {\n return this.camelCase(`${itemName}-patch`);\n },\n orderByType(typeName: string) {\n return this.upperCamelCase(`${this.pluralize(typeName)}-order-by`);\n },\n edge(typeName: string) {\n return this.upperCamelCase(`${this.pluralize(typeName)}-edge`);\n },\n connection(typeName: string) {\n return this.upperCamelCase(\n `${this.pluralize(typeName)}-connection`\n );\n },\n\n // These helpers handle overrides via smart comments. They should only\n // be used in other inflectors, hence the underscore prefix.\n //\n // IMPORTANT: do NOT do case transforms here, because detail can be\n // lost, e.g.\n // `constantCase(camelCase('foo_1')) !== constantCase('foo_1')`\n _functionName(proc: PgProc) {\n return this.coerceToGraphQLName(proc.tags.name || proc.name);\n },\n _typeName(type: PgType) {\n // 'type' introspection result\n return this.coerceToGraphQLName(type.tags.name || type.name);\n },\n _tableName(table: PgClass) {\n return this.coerceToGraphQLName(\n table.tags.name || table.type.tags.name || table.name\n );\n },\n _singularizedTableName(table: PgClass): string {\n return this.singularize(this._tableName(table)).replace(\n /.(?:(?:[_-]i|I)nput|(?:[_-]p|P)atch)$/,\n \"$&_record\"\n );\n },\n _columnName(attr: PgAttribute, _options?: { skipRowId?: boolean }) {\n return this.coerceToGraphQLName(attr.tags.name || attr.name);\n },\n\n // From here down, functions are passed database introspection results\n enumType(type: PgType) {\n return this.upperCamelCase(this._typeName(type));\n },\n argument(name: ?string, index: number) {\n return this.coerceToGraphQLName(\n this.camelCase(name || `arg${index}`)\n );\n },\n orderByEnum(columnName, ascending) {\n return this.constantCase(\n `${columnName}_${ascending ? \"asc\" : \"desc\"}`\n );\n },\n orderByColumnEnum(attr: PgAttribute, ascending: boolean) {\n const columnName = this._columnName(attr, {\n skipRowId: true, // Because we messed up 😔\n });\n return this.orderByEnum(columnName, ascending);\n },\n orderByComputedColumnEnum(\n pseudoColumnName: string,\n proc: PgProc,\n table: PgClass,\n ascending: boolean\n ) {\n const columnName = this.computedColumn(\n pseudoColumnName,\n proc,\n table\n );\n return this.orderByEnum(columnName, ascending);\n },\n domainType(type: PgType) {\n return this.upperCamelCase(this._typeName(type));\n },\n enumName(inValue: string) {\n let value = inValue;\n\n if (value === \"\") {\n return \"_EMPTY_\";\n }\n\n // Some enums use asterisks to signify wildcards - this might be for\n // the whole item, or prefixes/suffixes, or even in the middle. This\n // is provided on a best efforts basis, if it doesn't suit your\n // purposes then please pass a custom inflector as mentioned below.\n value = value\n .replace(/\\*/g, \"_ASTERISK_\")\n .replace(/^(_?)_+ASTERISK/, \"$1ASTERISK\")\n .replace(/ASTERISK_(_?)_*$/, \"ASTERISK$1\");\n\n // This is a best efforts replacement for common symbols that you\n // might find in enums. Generally we only support enums that are\n // alphanumeric, if these replacements don't work for you, you should\n // pass a custom inflector that replaces this `enumName` method\n // with one of your own chosing.\n value =\n {\n // SQL comparison operators\n \">\": \"GREATER_THAN\",\n \">=\": \"GREATER_THAN_OR_EQUAL\",\n \"=\": \"EQUAL\",\n \"!=\": \"NOT_EQUAL\",\n \"<>\": \"DIFFERENT\",\n \"<=\": \"LESS_THAN_OR_EQUAL\",\n \"<\": \"LESS_THAN\",\n\n // PostgreSQL LIKE shortcuts\n \"~~\": \"LIKE\",\n \"~~*\": \"ILIKE\",\n \"!~~\": \"NOT_LIKE\",\n \"!~~*\": \"NOT_ILIKE\",\n\n // '~' doesn't necessarily represent regexps, but the three\n // operators following it likely do, so we'll use the word TILDE\n // in all for consistency.\n \"~\": \"TILDE\",\n \"~*\": \"TILDE_ASTERISK\",\n \"!~\": \"NOT_TILDE\",\n \"!~*\": \"NOT_TILDE_ASTERISK\",\n\n // A number of other symbols where we're not sure of their\n // meaning. We give them common generic names so that they're\n // suitable for multiple purposes, e.g. favouring 'PLUS' over\n // 'ADDITION' and 'DOT' over 'FULL_STOP'\n \"%\": \"PERCENT\",\n \"+\": \"PLUS\",\n \"-\": \"MINUS\",\n \"/\": \"SLASH\",\n \"\\\\\": \"BACKSLASH\",\n _: \"UNDERSCORE\",\n \"#\": \"POUND\",\n \"£\": \"STERLING\",\n $: \"DOLLAR\",\n \"&\": \"AMPERSAND\",\n \"@\": \"AT\",\n \"'\": \"APOSTROPHE\",\n '\"': \"QUOTE\",\n \"`\": \"BACKTICK\",\n \":\": \"COLON\",\n \";\": \"SEMICOLON\",\n \"!\": \"EXCLAMATION_POINT\",\n \"?\": \"QUESTION_MARK\",\n \",\": \"COMMA\",\n \".\": \"DOT\",\n \"^\": \"CARET\",\n \"|\": \"BAR\",\n \"[\": \"OPEN_BRACKET\",\n \"]\": \"CLOSE_BRACKET\",\n \"(\": \"OPEN_PARENTHESIS\",\n \")\": \"CLOSE_PARENTHESIS\",\n \"{\": \"OPEN_BRACE\",\n \"}\": \"CLOSE_BRACE\",\n }[value] || value;\n return value;\n },\n\n tableNode(table: PgClass) {\n return this.camelCase(this._singularizedTableName(table));\n },\n tableFieldName(table: PgClass) {\n return this.camelCase(this._singularizedTableName(table));\n },\n allRows(table: PgClass) {\n return this.camelCase(\n `all-${this.pluralize(this._singularizedTableName(table))}`\n );\n },\n allRowsSimple(table: PgClass) {\n return this.camelCase(\n `all-${this.pluralize(this._singularizedTableName(table))}-list`\n );\n },\n functionMutationName(proc: PgProc) {\n return this.camelCase(this._functionName(proc));\n },\n functionMutationResultFieldName(\n proc: PgProc,\n gqlType,\n plural: boolean = false,\n outputArgNames: Array<string> = []\n ) {\n if (proc.tags.resultFieldName) {\n return proc.tags.resultFieldName;\n }\n let name;\n if (outputArgNames.length === 1 && outputArgNames[0] !== \"\") {\n name = this.camelCase(outputArgNames[0]);\n } else if (gqlType.name === \"Int\") {\n name = \"integer\";\n } else if (gqlType.name === \"Float\") {\n name = \"float\";\n } else if (gqlType.name === \"Boolean\") {\n name = \"boolean\";\n } else if (gqlType.name === \"String\") {\n name = \"string\";\n } else if (proc.returnTypeId === \"2249\") {\n // returns a record type\n name = \"result\";\n } else {\n name = this.camelCase(gqlType.name);\n }\n return plural ? this.pluralize(name) : name;\n },\n functionQueryName(proc: PgProc) {\n return this.camelCase(this._functionName(proc));\n },\n functionQueryNameList(proc: PgProc) {\n return this.camelCase(`${this._functionName(proc)}-list`);\n },\n functionPayloadType(proc: PgProc) {\n return this.upperCamelCase(`${this._functionName(proc)}-payload`);\n },\n functionInputType(proc: PgProc) {\n return this.upperCamelCase(`${this._functionName(proc)}-input`);\n },\n functionOutputFieldName(\n proc: PgProc,\n outputArgName: string,\n index: number\n ) {\n return this.argument(outputArgName, index);\n },\n tableType(table: PgClass) {\n return this.upperCamelCase(this._singularizedTableName(table));\n },\n column(attr: PgAttribute) {\n return this.camelCase(this._columnName(attr));\n },\n computedColumn(\n pseudoColumnName: string,\n proc: PgProc,\n _table: PgClass\n ) {\n return proc.tags.fieldName || this.camelCase(pseudoColumnName);\n },\n computedColumnList(\n pseudoColumnName: string,\n proc: PgProc,\n _table: PgClass\n ) {\n return proc.tags.fieldName\n ? proc.tags.fieldName + \"List\"\n : this.camelCase(`${pseudoColumnName}-list`);\n },\n singleRelationByKeys(\n detailedKeys: Keys,\n table: PgClass,\n _foreignTable: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.fieldName) {\n return constraint.tags.fieldName;\n }\n return this.camelCase(\n `${this._singularizedTableName(table)}-by-${detailedKeys\n .map(key => this.column(key))\n .join(\"-and-\")}`\n );\n },\n singleRelationByKeysBackwards(\n detailedKeys: Keys,\n table: PgClass,\n _foreignTable: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.foreignSingleFieldName) {\n return constraint.tags.foreignSingleFieldName;\n }\n if (constraint.tags.foreignFieldName) {\n return constraint.tags.foreignFieldName;\n }\n return this.singleRelationByKeys(\n detailedKeys,\n table,\n _foreignTable,\n constraint\n );\n },\n manyRelationByKeys(\n detailedKeys: Keys,\n table: PgClass,\n _foreignTable: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.foreignFieldName) {\n return constraint.tags.foreignFieldName;\n }\n return this.camelCase(\n `${this.pluralize(\n this._singularizedTableName(table)\n )}-by-${detailedKeys.map(key => this.column(key)).join(\"-and-\")}`\n );\n },\n manyRelationByKeysSimple(\n detailedKeys: Keys,\n table: PgClass,\n _foreignTable: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.foreignSimpleFieldName) {\n return constraint.tags.foreignSimpleFieldName;\n }\n if (constraint.tags.foreignFieldName) {\n return constraint.tags.foreignFieldName;\n }\n return this.camelCase(\n `${this.pluralize(\n this._singularizedTableName(table)\n )}-by-${detailedKeys\n .map(key => this.column(key))\n .join(\"-and-\")}-list`\n );\n },\n rowByUniqueKeys(\n detailedKeys: Keys,\n table: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.fieldName) {\n return constraint.tags.fieldName;\n }\n return this.camelCase(\n `${this._singularizedTableName(table)}-by-${detailedKeys\n .map(key => this.column(key))\n .join(\"-and-\")}`\n );\n },\n updateByKeys(\n detailedKeys: Keys,\n table: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.updateFieldName) {\n return constraint.tags.updateFieldName;\n }\n return this.camelCase(\n `update-${this._singularizedTableName(\n table\n )}-by-${detailedKeys.map(key => this.column(key)).join(\"-and-\")}`\n );\n },\n deleteByKeys(\n detailedKeys: Keys,\n table: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.deleteFieldName) {\n return constraint.tags.deleteFieldName;\n }\n return this.camelCase(\n `delete-${this._singularizedTableName(\n table\n )}-by-${detailedKeys.map(key => this.column(key)).join(\"-and-\")}`\n );\n },\n updateByKeysInputType(\n detailedKeys: Keys,\n table: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.updateFieldName) {\n return this.upperCamelCase(\n `${constraint.tags.updateFieldName}-input`\n );\n }\n return this.upperCamelCase(\n `update-${this._singularizedTableName(\n table\n )}-by-${detailedKeys\n .map(key => this.column(key))\n .join(\"-and-\")}-input`\n );\n },\n deleteByKeysInputType(\n detailedKeys: Keys,\n table: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.deleteFieldName) {\n return this.upperCamelCase(\n `${constraint.tags.deleteFieldName}-input`\n );\n }\n return this.upperCamelCase(\n `delete-${this._singularizedTableName(\n table\n )}-by-${detailedKeys\n .map(key => this.column(key))\n .join(\"-and-\")}-input`\n );\n },\n updateNode(table: PgClass) {\n return this.camelCase(\n `update-${this._singularizedTableName(table)}`\n );\n },\n deleteNode(table: PgClass) {\n return this.camelCase(\n `delete-${this._singularizedTableName(table)}`\n );\n },\n deletedNodeId(table: PgClass) {\n return this.camelCase(`deleted-${this.singularize(table.name)}-id`);\n },\n updateNodeInputType(table: PgClass) {\n return this.upperCamelCase(\n `update-${this._singularizedTableName(table)}-input`\n );\n },\n deleteNodeInputType(table: PgClass) {\n return this.upperCamelCase(\n `delete-${this._singularizedTableName(table)}-input`\n );\n },\n edgeField(table: PgClass) {\n return this.camelCase(`${this._singularizedTableName(table)}-edge`);\n },\n recordFunctionReturnType(proc: PgProc) {\n return (\n proc.tags.resultTypeName ||\n this.upperCamelCase(`${this._functionName(proc)}-record`)\n );\n },\n recordFunctionConnection(proc: PgProc) {\n return this.upperCamelCase(\n `${this._functionName(proc)}-connection`\n );\n },\n recordFunctionEdge(proc: PgProc) {\n return this.upperCamelCase(\n `${this.singularize(this._functionName(proc))}-edge`\n );\n },\n scalarFunctionConnection(proc: PgProc) {\n return this.upperCamelCase(\n `${this._functionName(proc)}-connection`\n );\n },\n scalarFunctionEdge(proc: PgProc) {\n return this.upperCamelCase(\n `${this.singularize(this._functionName(proc))}-edge`\n );\n },\n createField(table: PgClass) {\n return this.camelCase(\n `create-${this._singularizedTableName(table)}`\n );\n },\n createInputType(table: PgClass) {\n return this.upperCamelCase(\n `create-${this._singularizedTableName(table)}-input`\n );\n },\n createPayloadType(table: PgClass) {\n return this.upperCamelCase(\n `create-${this._singularizedTableName(table)}-payload`\n );\n },\n updatePayloadType(table: PgClass) {\n return this.upperCamelCase(\n `update-${this._singularizedTableName(table)}-payload`\n );\n },\n deletePayloadType(table: PgClass) {\n return this.upperCamelCase(\n `delete-${this._singularizedTableName(table)}-payload`\n );\n },\n }),\n \"Default inflectors from PgBasicsPlugin. You can override these with `makeAddInflectorsPlugin(..., true)`.\"\n );\n },\n [\"PgBasics\"]\n );\n}: Plugin);\n"],"file":"PgBasicsPlugin.js"}
1
+ {"version":3,"sources":["../../src/plugins/PgBasicsPlugin.js"],"names":["defaultPgColumnFilter","_attr","_build","_context","identity","_","preventEmptyResult","obj","Object","keys","reduce","memo","key","fn","args","result","apply","length","stringifiedArgs","require","inspect","Error","String","omitWithRBACChecks","omit","entity","permission","ORDINARY_TABLE","VIEW","MATERIALIZED_VIEW","isTableLike","kind","classKind","EXECUTE","aclExecutable","tableEntity","READ","ALL","MANY","aclSelectable","attributes","some","attr","CREATE","aclInsertable","UPDATE","aclUpdatable","DELETE","aclDeletable","class","attributeEntity","klass","FILTER","ORDER","omitUnindexed","hideIndexWarnings","isIndexed","type","shouldOutputWarning","_omitUnindexedReadWarningGiven","console","log","describePgEntity","namespaceName","name","keyAttributes","map","a","join","includeAlias","getAlias","tags","value","endsWith","chalk","bold","t","c","f","p","r","v","m","e","error","id","sqlCommentByAddingTags","tagsToAdd","escape","str","replace","chr","description","tagsSql","tag","tagValue","valueArray","Array","isArray","highlightOrNot","green","forEach","push","commentValue","sqlThing","identifier","PgBasicsPlugin","builder","pgStrictFunctions","pgColumnFilter","pgIgnoreRBAC","pgIgnoreIndexes","pgHideIndexWarnings","pgLegacyJsonUuid","pgAugmentIntrospectionResults","pgOmit","baseOmit","hook","build","versions","version","liveCoordinator","registerProvider","PgLiveProvider","extend","graphileBuildPgVersion","pgSql","sql","pgQueryFromResolveData","pgAddStartEndCursor","addStartEndCursor","pgMakeProcField","makeProcField","pgParseIdentifier","parseIdentifier","pgViaTemporaryTable","viaTemporaryTable","pgField","pgPrepareAndRun","inflection","oldBuiltin","builtin","call","conditionType","typeName","upperCamelCase","inputType","rangeBoundType","rangeType","patchType","baseInputType","patchField","itemName","camelCase","orderByType","pluralize","edge","connection","_functionName","proc","coerceToGraphQLName","_typeName","_tableName","table","_singularizedTableName","singularize","_columnName","_options","enumType","argument","index","orderByEnum","columnName","ascending","constantCase","orderByColumnEnum","skipRowId","orderByComputedColumnEnum","pseudoColumnName","computedColumn","domainType","enumName","inValue","$","tableNode","tableFieldName","allRows","allRowsSimple","functionMutationName","functionMutationResultFieldName","gqlType","plural","outputArgNames","resultFieldName","returnTypeId","functionQueryName","functionQueryNameList","functionPayloadType","functionInputType","functionOutputFieldName","outputArgName","tableType","column","_table","fieldName","computedColumnList","singleRelationByKeys","detailedKeys","_foreignTable","constraint","singleRelationByKeysBackwards","foreignSingleFieldName","foreignFieldName","manyRelationByKeys","manyRelationByKeysSimple","foreignSimpleFieldName","rowByUniqueKeys","updateByKeys","updateFieldName","deleteByKeys","deleteFieldName","updateByKeysInputType","deleteByKeysInputType","updateNode","deleteNode","deletedNodeId","updateNodeInputType","deleteNodeInputType","edgeField","recordFunctionReturnType","resultTypeName","recordFunctionConnection","recordFunctionEdge","scalarFunctionConnection","scalarFunctionEdge","createField","createInputType","createPayloadType","updatePayloadType","deletePayloadType"],"mappings":"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","sourcesContent":["// @flow\nimport * as sql from \"pg-sql2\";\nimport type { Plugin } from \"graphile-build\";\nimport { version } from \"../../package.json\";\nimport type {\n PgProc,\n PgType,\n PgClass,\n PgAttribute,\n PgConstraint,\n PgEntity,\n} from \"./PgIntrospectionPlugin\";\nimport pgField from \"./pgField\";\n\nimport queryFromResolveDataFactory from \"../queryFromResolveDataFactory\";\nimport addStartEndCursor from \"./addStartEndCursor\";\nimport baseOmit, {\n CREATE,\n READ,\n UPDATE,\n DELETE,\n ALL,\n MANY,\n ORDER,\n FILTER,\n EXECUTE,\n} from \"../omit\";\nimport makeProcField from \"./makeProcField\";\nimport parseIdentifier from \"../parseIdentifier\";\nimport viaTemporaryTable from \"./viaTemporaryTable\";\nimport chalk from \"chalk\";\nimport pickBy from \"lodash/pickBy\";\nimport PgLiveProvider from \"../PgLiveProvider\";\nimport pgPrepareAndRun from \"../pgPrepareAndRun\";\n\nconst defaultPgColumnFilter = (_attr, _build, _context) => true;\ntype Keys = Array<{\n column: string,\n table: string,\n schema: ?string,\n}>;\n\nconst identity = _ => _;\n\nexport function preventEmptyResult<\n // eslint-disable-next-line flowtype/no-weak-types\n O: { [key: string]: (...args: Array<any>) => string }\n>(obj: O): $ObjMap<O, <V>(V) => V> {\n return Object.keys(obj).reduce((memo, key) => {\n const fn = obj[key];\n memo[key] = function(...args) {\n const result = fn.apply(this, args);\n if (typeof result !== \"string\" || result.length === 0) {\n const stringifiedArgs = require(\"util\").inspect(args);\n throw new Error(\n `Inflector for '${key}' returned '${String(\n result\n )}'; expected non-empty string\\n` +\n `See: https://github.com/graphile/graphile-build/blob/master/packages/graphile-build-pg/src/plugins/PgBasicsPlugin.js\\n` +\n `Arguments passed to ${key}:\\n${stringifiedArgs}`\n );\n }\n return result;\n };\n return memo;\n }, {});\n}\n\nconst omitWithRBACChecks = omit => (\n entity: PgProc | PgClass | PgAttribute | PgConstraint,\n permission: string\n) => {\n const ORDINARY_TABLE = \"r\";\n const VIEW = \"v\";\n const MATERIALIZED_VIEW = \"m\";\n const isTableLike = entity =>\n entity &&\n entity.kind === \"class\" &&\n (entity.classKind === ORDINARY_TABLE ||\n entity.classKind === VIEW ||\n entity.classKind === MATERIALIZED_VIEW);\n if (entity.kind === \"procedure\") {\n if (permission === EXECUTE && !entity.aclExecutable) {\n return true;\n }\n } else if (entity.kind === \"class\" && isTableLike(entity)) {\n const tableEntity: PgClass = entity;\n if (\n (permission === READ || permission === ALL || permission === MANY) &&\n (!tableEntity.aclSelectable &&\n !tableEntity.attributes.some(attr => attr.aclSelectable))\n ) {\n return true;\n } else if (\n permission === CREATE &&\n (!tableEntity.aclInsertable &&\n !tableEntity.attributes.some(attr => attr.aclInsertable))\n ) {\n return true;\n } else if (\n permission === UPDATE &&\n (!tableEntity.aclUpdatable &&\n !tableEntity.attributes.some(attr => attr.aclUpdatable))\n ) {\n return true;\n } else if (permission === DELETE && !tableEntity.aclDeletable) {\n return true;\n }\n } else if (entity.kind === \"attribute\" && isTableLike(entity.class)) {\n const attributeEntity: PgAttribute = entity;\n\n const klass = attributeEntity.class;\n // Have we got *any* permissions on the table?\n if (\n klass.aclSelectable ||\n klass.attributes.some(attr => attr.aclSelectable)\n ) {\n // Yes; this is a regular table; omit if RBAC permissions tell us to.\n if (\n (permission === READ ||\n permission === FILTER ||\n permission === ORDER) &&\n !attributeEntity.aclSelectable\n ) {\n return true;\n } else if (permission === CREATE && !attributeEntity.aclInsertable) {\n return true;\n } else if (permission === UPDATE && !attributeEntity.aclUpdatable) {\n return true;\n }\n } else {\n // No permissions on the table at all, so normal connections will skip\n // over it. Thus we must be being exposed via a security definer function\n // or similar, so we should expose all fields except those that are\n // explicitly @omit-ed.\n }\n }\n return omit(entity, permission);\n};\n\nconst omitUnindexed = (omit, hideIndexWarnings) => (\n entity: PgProc | PgClass | PgAttribute | PgConstraint,\n permission: string\n) => {\n if (\n entity.kind === \"attribute\" &&\n !entity.isIndexed &&\n (permission === \"filter\" || permission === \"order\")\n ) {\n return true;\n }\n if (\n entity.kind === \"constraint\" &&\n entity.type === \"f\" &&\n !entity.isIndexed &&\n permission === \"read\"\n ) {\n const klass = entity.class;\n if (klass) {\n const shouldOutputWarning =\n // $FlowFixMe\n !entity._omitUnindexedReadWarningGiven && !hideIndexWarnings;\n if (shouldOutputWarning) {\n // $FlowFixMe\n entity._omitUnindexedReadWarningGiven = true;\n // eslint-disable-next-line no-console\n console.log(\n \"%s\",\n `Disabled 'read' permission for ${describePgEntity(\n entity\n )} because it isn't indexed. For more information see https://graphile.org/postgraphile/best-practices/ To fix, perform\\n\\n CREATE INDEX ON ${`\"${klass.namespaceName}\".\"${klass.name}\"`}(\"${entity.keyAttributes\n .map(a => a.name)\n .join('\", \"')}\");`\n );\n }\n }\n return true;\n }\n return omit(entity, permission);\n};\n\nfunction describePgEntity(entity: PgEntity, includeAlias = true) {\n const getAlias = !includeAlias\n ? () => \"\"\n : () => {\n const tags = pickBy(\n entity.tags,\n (value, key) => key === \"name\" || key.endsWith(\"Name\")\n );\n if (Object.keys(tags).length) {\n return ` (with smart comments: ${chalk.bold(\n Object.keys(tags)\n .map(t => `@${t} ${tags[t]}`)\n .join(\" | \")\n )})`;\n }\n return \"\";\n };\n\n try {\n if (entity.kind === \"constraint\") {\n return `constraint ${chalk.bold(\n `\"${entity.name}\"`\n )} on ${describePgEntity(entity.class, false)}${getAlias()}`;\n } else if (entity.kind === \"class\") {\n // see pg_class.relkind https://www.postgresql.org/docs/10/static/catalog-pg-class.html\n const kind =\n {\n c: \"composite type\",\n f: \"foreign table\",\n p: \"partitioned table\",\n r: \"table\",\n v: \"view\",\n m: \"materialized view\",\n }[entity.classKind] || \"table-like\";\n return `${kind} ${chalk.bold(\n `\"${entity.namespaceName}\".\"${entity.name}\"`\n )}${getAlias()}`;\n } else if (entity.kind === \"procedure\") {\n return `function ${chalk.bold(\n `\"${entity.namespaceName}\".\"${entity.name}\"(...args...)`\n )}${getAlias()}`;\n } else if (entity.kind === \"attribute\") {\n return `column ${chalk.bold(`\"${entity.name}\"`)} on ${describePgEntity(\n entity.class,\n false\n )}${getAlias()}`;\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"Error occurred while attempting to debug entity:\", entity);\n // eslint-disable-next-line no-console\n console.error(e);\n }\n return `entity of kind '${entity.kind}' with ${\n typeof entity.id === \"string\" ? `oid '${entity.id}'` : \"\"\n }`;\n}\n\nfunction sqlCommentByAddingTags(entity, tagsToAdd) {\n // NOTE: this function is NOT intended to be SQL safe; it's for\n // displaying in error messages. Nonetheless if you find issues with\n // SQL compatibility, please send a PR or issue.\n\n // Ref: https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-BACKSLASH-TABLE\n const escape = str =>\n str.replace(\n /['\\\\\\b\\f\\n\\r\\t]/g,\n chr =>\n ({\n \"\\b\": \"\\\\b\",\n \"\\f\": \"\\\\f\",\n \"\\n\": \"\\\\n\",\n \"\\r\": \"\\\\r\",\n \"\\t\": \"\\\\t\",\n }[chr] || \"\\\\\" + chr)\n );\n\n // tagsToAdd is here twice to ensure that the keys in tagsToAdd come first, but that they also \"win\" any conflicts.\n const tags = {\n ...tagsToAdd,\n ...entity.tags,\n ...tagsToAdd,\n };\n\n const description = entity.description;\n const tagsSql = Object.keys(tags)\n .reduce((memo, tag) => {\n const tagValue = tags[tag];\n const valueArray = Array.isArray(tagValue) ? tagValue : [tagValue];\n const highlightOrNot = tag in tagsToAdd ? chalk.bold.green : identity;\n valueArray.forEach(value => {\n memo.push(\n highlightOrNot(\n `@${escape(escape(tag))}${\n value === true ? \"\" : \" \" + escape(escape(value))\n }`\n )\n );\n });\n return memo;\n }, [])\n .join(\"\\\\n\");\n const commentValue = `E'${tagsSql}${\n description ? \"\\\\n\" + escape(description) : \"\"\n }'`;\n let sqlThing;\n if (entity.kind === \"class\") {\n const identifier = `\"${entity.namespaceName}\".\"${entity.name}\"`;\n if (entity.classKind === \"r\") {\n sqlThing = `TABLE ${identifier}`;\n } else if (entity.classKind === \"v\") {\n sqlThing = `VIEW ${identifier}`;\n } else if (entity.classKind === \"m\") {\n sqlThing = `MATERIALIZED VIEW ${identifier}`;\n } else if (entity.classKind === \"c\") {\n sqlThing = `TYPE ${identifier}`;\n } else {\n sqlThing = `PLEASE_SEND_A_PULL_REQUEST_TO_FIX_THIS ${identifier}`;\n }\n } else if (entity.kind === \"attribute\") {\n sqlThing = `COLUMN \"${entity.class.namespaceName}\".\"${entity.class.name}\".\"${entity.name}\"`;\n } else if (entity.kind === \"procedure\") {\n sqlThing = `FUNCTION \"${entity.namespaceName}\".\"${entity.name}\"(...arg types go here...)`;\n } else if (entity.kind === \"constraint\") {\n // TODO: TEST!\n sqlThing = `CONSTRAINT \"${entity.name}\" ON \"${entity.class.namespaceName}\".\"${entity.class.name}\"`;\n } else {\n sqlThing = `UNKNOWN_ENTITY_PLEASE_SEND_A_PULL_REQUEST`;\n }\n\n return `COMMENT ON ${sqlThing} IS ${commentValue};`;\n}\n\nexport default (function PgBasicsPlugin(\n builder,\n {\n pgStrictFunctions = false,\n pgColumnFilter = defaultPgColumnFilter,\n pgIgnoreRBAC = false,\n pgIgnoreIndexes = true, // TODO:v5: change this to false\n pgHideIndexWarnings = false,\n pgLegacyJsonUuid = false, // TODO:v5: remove this\n pgAugmentIntrospectionResults,\n }\n) {\n let pgOmit = baseOmit;\n if (!pgIgnoreRBAC) {\n pgOmit = omitWithRBACChecks(pgOmit);\n }\n if (!pgIgnoreIndexes) {\n pgOmit = omitUnindexed(pgOmit, pgHideIndexWarnings);\n }\n builder.hook(\n \"build\",\n build => {\n build.versions[\"graphile-build-pg\"] = version;\n build.liveCoordinator.registerProvider(new PgLiveProvider());\n return build.extend(build, {\n graphileBuildPgVersion: version,\n pgSql: sql,\n pgStrictFunctions,\n pgColumnFilter,\n\n // TODO:v5: remove this workaround\n // BEWARE: this may be overridden in PgIntrospectionPlugin for PG < 9.5\n pgQueryFromResolveData: queryFromResolveDataFactory(),\n\n pgAddStartEndCursor: addStartEndCursor,\n pgOmit,\n pgMakeProcField: makeProcField,\n pgParseIdentifier: parseIdentifier,\n pgViaTemporaryTable: viaTemporaryTable,\n describePgEntity,\n pgField,\n sqlCommentByAddingTags,\n pgPrepareAndRun,\n pgAugmentIntrospectionResults,\n });\n },\n [\"PgBasics\"]\n );\n\n builder.hook(\n \"inflection\",\n (inflection, build) => {\n // TODO:v5: move this to postgraphile-core\n const oldBuiltin = inflection.builtin;\n inflection.builtin = function(name) {\n if (pgLegacyJsonUuid && name === \"JSON\") return \"Json\";\n if (pgLegacyJsonUuid && name === \"UUID\") return \"Uuid\";\n return oldBuiltin.call(this, name);\n };\n\n return build.extend(\n inflection,\n preventEmptyResult({\n // These helpers are passed GraphQL type names as strings\n conditionType(typeName: string) {\n return this.upperCamelCase(`${typeName}-condition`);\n },\n inputType(typeName: string) {\n return this.upperCamelCase(`${typeName}-input`);\n },\n rangeBoundType(typeName: string) {\n return this.upperCamelCase(`${typeName}-range-bound`);\n },\n rangeType(typeName: string) {\n return this.upperCamelCase(`${typeName}-range`);\n },\n patchType(typeName: string) {\n return this.upperCamelCase(`${typeName}-patch`);\n },\n baseInputType(typeName: string) {\n return this.upperCamelCase(`${typeName}-base-input`);\n },\n patchField(itemName: string) {\n return this.camelCase(`${itemName}-patch`);\n },\n orderByType(typeName: string) {\n return this.upperCamelCase(`${this.pluralize(typeName)}-order-by`);\n },\n edge(typeName: string) {\n return this.upperCamelCase(`${this.pluralize(typeName)}-edge`);\n },\n connection(typeName: string) {\n return this.upperCamelCase(\n `${this.pluralize(typeName)}-connection`\n );\n },\n\n // These helpers handle overrides via smart comments. They should only\n // be used in other inflectors, hence the underscore prefix.\n //\n // IMPORTANT: do NOT do case transforms here, because detail can be\n // lost, e.g.\n // `constantCase(camelCase('foo_1')) !== constantCase('foo_1')`\n _functionName(proc: PgProc) {\n return this.coerceToGraphQLName(proc.tags.name || proc.name);\n },\n _typeName(type: PgType) {\n // 'type' introspection result\n return this.coerceToGraphQLName(type.tags.name || type.name);\n },\n _tableName(table: PgClass) {\n return this.coerceToGraphQLName(\n table.tags.name || table.type.tags.name || table.name\n );\n },\n _singularizedTableName(table: PgClass): string {\n return this.singularize(this._tableName(table)).replace(\n /.(?:(?:[_-]i|I)nput|(?:[_-]p|P)atch)$/,\n \"$&_record\"\n );\n },\n _columnName(attr: PgAttribute, _options?: { skipRowId?: boolean }) {\n return this.coerceToGraphQLName(attr.tags.name || attr.name);\n },\n\n // From here down, functions are passed database introspection results\n enumType(type: PgType) {\n return this.upperCamelCase(this._typeName(type));\n },\n argument(name: ?string, index: number) {\n return this.coerceToGraphQLName(\n this.camelCase(name || `arg${index}`)\n );\n },\n orderByEnum(columnName, ascending) {\n return this.constantCase(\n `${columnName}_${ascending ? \"asc\" : \"desc\"}`\n );\n },\n orderByColumnEnum(attr: PgAttribute, ascending: boolean) {\n const columnName = this._columnName(attr, {\n skipRowId: true, // Because we messed up 😔\n });\n return this.orderByEnum(columnName, ascending);\n },\n orderByComputedColumnEnum(\n pseudoColumnName: string,\n proc: PgProc,\n table: PgClass,\n ascending: boolean\n ) {\n const columnName = this.computedColumn(\n pseudoColumnName,\n proc,\n table\n );\n return this.orderByEnum(columnName, ascending);\n },\n domainType(type: PgType) {\n return this.upperCamelCase(this._typeName(type));\n },\n enumName(inValue: string) {\n let value = inValue;\n\n if (value === \"\") {\n return \"_EMPTY_\";\n }\n\n // Some enums use asterisks to signify wildcards - this might be for\n // the whole item, or prefixes/suffixes, or even in the middle. This\n // is provided on a best efforts basis, if it doesn't suit your\n // purposes then please pass a custom inflector as mentioned below.\n value = value\n .replace(/\\*/g, \"_ASTERISK_\")\n .replace(/^(_?)_+ASTERISK/, \"$1ASTERISK\")\n .replace(/ASTERISK_(_?)_*$/, \"ASTERISK$1\");\n\n // This is a best efforts replacement for common symbols that you\n // might find in enums. Generally we only support enums that are\n // alphanumeric, if these replacements don't work for you, you should\n // pass a custom inflector that replaces this `enumName` method\n // with one of your own chosing.\n value =\n {\n // SQL comparison operators\n \">\": \"GREATER_THAN\",\n \">=\": \"GREATER_THAN_OR_EQUAL\",\n \"=\": \"EQUAL\",\n \"!=\": \"NOT_EQUAL\",\n \"<>\": \"DIFFERENT\",\n \"<=\": \"LESS_THAN_OR_EQUAL\",\n \"<\": \"LESS_THAN\",\n\n // PostgreSQL LIKE shortcuts\n \"~~\": \"LIKE\",\n \"~~*\": \"ILIKE\",\n \"!~~\": \"NOT_LIKE\",\n \"!~~*\": \"NOT_ILIKE\",\n\n // '~' doesn't necessarily represent regexps, but the three\n // operators following it likely do, so we'll use the word TILDE\n // in all for consistency.\n \"~\": \"TILDE\",\n \"~*\": \"TILDE_ASTERISK\",\n \"!~\": \"NOT_TILDE\",\n \"!~*\": \"NOT_TILDE_ASTERISK\",\n\n // A number of other symbols where we're not sure of their\n // meaning. We give them common generic names so that they're\n // suitable for multiple purposes, e.g. favouring 'PLUS' over\n // 'ADDITION' and 'DOT' over 'FULL_STOP'\n \"%\": \"PERCENT\",\n \"+\": \"PLUS\",\n \"-\": \"MINUS\",\n \"/\": \"SLASH\",\n \"\\\\\": \"BACKSLASH\",\n _: \"UNDERSCORE\",\n \"#\": \"POUND\",\n \"£\": \"STERLING\",\n $: \"DOLLAR\",\n \"&\": \"AMPERSAND\",\n \"@\": \"AT\",\n \"'\": \"APOSTROPHE\",\n '\"': \"QUOTE\",\n \"`\": \"BACKTICK\",\n \":\": \"COLON\",\n \";\": \"SEMICOLON\",\n \"!\": \"EXCLAMATION_POINT\",\n \"?\": \"QUESTION_MARK\",\n \",\": \"COMMA\",\n \".\": \"DOT\",\n \"^\": \"CARET\",\n \"|\": \"BAR\",\n \"[\": \"OPEN_BRACKET\",\n \"]\": \"CLOSE_BRACKET\",\n \"(\": \"OPEN_PARENTHESIS\",\n \")\": \"CLOSE_PARENTHESIS\",\n \"{\": \"OPEN_BRACE\",\n \"}\": \"CLOSE_BRACE\",\n }[value] || value;\n return value;\n },\n\n tableNode(table: PgClass) {\n return this.camelCase(this._singularizedTableName(table));\n },\n tableFieldName(table: PgClass) {\n return this.camelCase(this._singularizedTableName(table));\n },\n allRows(table: PgClass) {\n return this.camelCase(\n `all-${this.pluralize(this._singularizedTableName(table))}`\n );\n },\n allRowsSimple(table: PgClass) {\n return this.camelCase(\n `all-${this.pluralize(this._singularizedTableName(table))}-list`\n );\n },\n functionMutationName(proc: PgProc) {\n return this.camelCase(this._functionName(proc));\n },\n functionMutationResultFieldName(\n proc: PgProc,\n gqlType,\n plural: boolean = false,\n outputArgNames: Array<string> = []\n ) {\n if (proc.tags.resultFieldName) {\n return proc.tags.resultFieldName;\n }\n let name;\n if (outputArgNames.length === 1 && outputArgNames[0] !== \"\") {\n name = this.camelCase(outputArgNames[0]);\n } else if (gqlType.name === \"Int\") {\n name = \"integer\";\n } else if (gqlType.name === \"Float\") {\n name = \"float\";\n } else if (gqlType.name === \"Boolean\") {\n name = \"boolean\";\n } else if (gqlType.name === \"String\") {\n name = \"string\";\n } else if (proc.returnTypeId === \"2249\") {\n // returns a record type\n name = \"result\";\n } else {\n name = this.camelCase(gqlType.name);\n }\n return plural ? this.pluralize(name) : name;\n },\n functionQueryName(proc: PgProc) {\n return this.camelCase(this._functionName(proc));\n },\n functionQueryNameList(proc: PgProc) {\n return this.camelCase(`${this._functionName(proc)}-list`);\n },\n functionPayloadType(proc: PgProc) {\n return this.upperCamelCase(`${this._functionName(proc)}-payload`);\n },\n functionInputType(proc: PgProc) {\n return this.upperCamelCase(`${this._functionName(proc)}-input`);\n },\n functionOutputFieldName(\n proc: PgProc,\n outputArgName: string,\n index: number\n ) {\n return this.argument(outputArgName, index);\n },\n tableType(table: PgClass) {\n return this.upperCamelCase(this._singularizedTableName(table));\n },\n column(attr: PgAttribute) {\n return this.camelCase(this._columnName(attr));\n },\n computedColumn(\n pseudoColumnName: string,\n proc: PgProc,\n _table: PgClass\n ) {\n return proc.tags.fieldName || this.camelCase(pseudoColumnName);\n },\n computedColumnList(\n pseudoColumnName: string,\n proc: PgProc,\n _table: PgClass\n ) {\n return proc.tags.fieldName\n ? proc.tags.fieldName + \"List\"\n : this.camelCase(`${pseudoColumnName}-list`);\n },\n singleRelationByKeys(\n detailedKeys: Keys,\n table: PgClass,\n _foreignTable: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.fieldName) {\n return constraint.tags.fieldName;\n }\n return this.camelCase(\n `${this._singularizedTableName(table)}-by-${detailedKeys\n .map(key => this.column(key))\n .join(\"-and-\")}`\n );\n },\n singleRelationByKeysBackwards(\n detailedKeys: Keys,\n table: PgClass,\n _foreignTable: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.foreignSingleFieldName) {\n return constraint.tags.foreignSingleFieldName;\n }\n if (constraint.tags.foreignFieldName) {\n return constraint.tags.foreignFieldName;\n }\n return this.singleRelationByKeys(\n detailedKeys,\n table,\n _foreignTable,\n constraint\n );\n },\n manyRelationByKeys(\n detailedKeys: Keys,\n table: PgClass,\n _foreignTable: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.foreignFieldName) {\n return constraint.tags.foreignFieldName;\n }\n return this.camelCase(\n `${this.pluralize(\n this._singularizedTableName(table)\n )}-by-${detailedKeys.map(key => this.column(key)).join(\"-and-\")}`\n );\n },\n manyRelationByKeysSimple(\n detailedKeys: Keys,\n table: PgClass,\n _foreignTable: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.foreignSimpleFieldName) {\n return constraint.tags.foreignSimpleFieldName;\n }\n if (constraint.tags.foreignFieldName) {\n return constraint.tags.foreignFieldName;\n }\n return this.camelCase(\n `${this.pluralize(\n this._singularizedTableName(table)\n )}-by-${detailedKeys\n .map(key => this.column(key))\n .join(\"-and-\")}-list`\n );\n },\n rowByUniqueKeys(\n detailedKeys: Keys,\n table: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.fieldName) {\n return constraint.tags.fieldName;\n }\n return this.camelCase(\n `${this._singularizedTableName(table)}-by-${detailedKeys\n .map(key => this.column(key))\n .join(\"-and-\")}`\n );\n },\n updateByKeys(\n detailedKeys: Keys,\n table: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.updateFieldName) {\n return constraint.tags.updateFieldName;\n }\n return this.camelCase(\n `update-${this._singularizedTableName(\n table\n )}-by-${detailedKeys.map(key => this.column(key)).join(\"-and-\")}`\n );\n },\n deleteByKeys(\n detailedKeys: Keys,\n table: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.deleteFieldName) {\n return constraint.tags.deleteFieldName;\n }\n return this.camelCase(\n `delete-${this._singularizedTableName(\n table\n )}-by-${detailedKeys.map(key => this.column(key)).join(\"-and-\")}`\n );\n },\n updateByKeysInputType(\n detailedKeys: Keys,\n table: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.updateFieldName) {\n return this.upperCamelCase(\n `${constraint.tags.updateFieldName}-input`\n );\n }\n return this.upperCamelCase(\n `update-${this._singularizedTableName(\n table\n )}-by-${detailedKeys\n .map(key => this.column(key))\n .join(\"-and-\")}-input`\n );\n },\n deleteByKeysInputType(\n detailedKeys: Keys,\n table: PgClass,\n constraint: PgConstraint\n ) {\n if (constraint.tags.deleteFieldName) {\n return this.upperCamelCase(\n `${constraint.tags.deleteFieldName}-input`\n );\n }\n return this.upperCamelCase(\n `delete-${this._singularizedTableName(\n table\n )}-by-${detailedKeys\n .map(key => this.column(key))\n .join(\"-and-\")}-input`\n );\n },\n updateNode(table: PgClass) {\n return this.camelCase(\n `update-${this._singularizedTableName(table)}`\n );\n },\n deleteNode(table: PgClass) {\n return this.camelCase(\n `delete-${this._singularizedTableName(table)}`\n );\n },\n deletedNodeId(table: PgClass) {\n return this.camelCase(`deleted-${this.singularize(table.name)}-id`);\n },\n updateNodeInputType(table: PgClass) {\n return this.upperCamelCase(\n `update-${this._singularizedTableName(table)}-input`\n );\n },\n deleteNodeInputType(table: PgClass) {\n return this.upperCamelCase(\n `delete-${this._singularizedTableName(table)}-input`\n );\n },\n edgeField(table: PgClass) {\n return this.camelCase(`${this._singularizedTableName(table)}-edge`);\n },\n recordFunctionReturnType(proc: PgProc) {\n return (\n proc.tags.resultTypeName ||\n this.upperCamelCase(`${this._functionName(proc)}-record`)\n );\n },\n recordFunctionConnection(proc: PgProc) {\n return this.upperCamelCase(\n `${this._functionName(proc)}-connection`\n );\n },\n recordFunctionEdge(proc: PgProc) {\n return this.upperCamelCase(\n `${this.singularize(this._functionName(proc))}-edge`\n );\n },\n scalarFunctionConnection(proc: PgProc) {\n return this.upperCamelCase(\n `${this._functionName(proc)}-connection`\n );\n },\n scalarFunctionEdge(proc: PgProc) {\n return this.upperCamelCase(\n `${this.singularize(this._functionName(proc))}-edge`\n );\n },\n createField(table: PgClass) {\n return this.camelCase(\n `create-${this._singularizedTableName(table)}`\n );\n },\n createInputType(table: PgClass) {\n return this.upperCamelCase(\n `create-${this._singularizedTableName(table)}-input`\n );\n },\n createPayloadType(table: PgClass) {\n return this.upperCamelCase(\n `create-${this._singularizedTableName(table)}-payload`\n );\n },\n updatePayloadType(table: PgClass) {\n return this.upperCamelCase(\n `update-${this._singularizedTableName(table)}-payload`\n );\n },\n deletePayloadType(table: PgClass) {\n return this.upperCamelCase(\n `delete-${this._singularizedTableName(table)}-payload`\n );\n },\n }),\n \"Default inflectors from PgBasicsPlugin. You can override these with `makeAddInflectorsPlugin(..., true)`.\"\n );\n },\n [\"PgBasics\"]\n );\n}: Plugin);\n"],"file":"PgBasicsPlugin.js"}
@@ -233,6 +233,21 @@ function smartCommentConstraints(introspectionResults) {
233
233
  }
234
234
  });
235
235
  }
236
+ /* The argument to this must not contain cyclic references! */
237
+
238
+
239
+ const deepClone = value => {
240
+ if (Array.isArray(value)) {
241
+ return value.map(val => deepClone(val));
242
+ } else if (typeof value === "object" && value) {
243
+ return Object.keys(value).reduce((memo, k) => {
244
+ memo[k] = deepClone(value[k]);
245
+ return memo;
246
+ }, {});
247
+ } else {
248
+ return value;
249
+ }
250
+ };
236
251
 
237
252
  var PgIntrospectionPlugin = async function PgIntrospectionPlugin(builder, {
238
253
  pgConfig,
@@ -243,18 +258,12 @@ var PgIntrospectionPlugin = async function PgIntrospectionPlugin(builder, {
243
258
  pgIncludeExtensionResources = false,
244
259
  pgLegacyFunctionsOnly = false,
245
260
  pgSkipInstallingWatchFixtures = false,
246
- pgAugmentIntrospectionResults,
247
261
  pgOwnerConnectionString
248
262
  }) {
249
- const augment = introspectionResults => {
250
- [pgAugmentIntrospectionResults, smartCommentConstraints].forEach(fn => fn ? fn(introspectionResults) : null);
251
- };
252
263
  /**
253
264
  * @summary introspect database and get the table/view/constraints.
254
265
  * @returns {Promise<PgIntrospectionResultsByKind>}
255
266
  */
256
-
257
-
258
267
  async function introspect() {
259
268
  // Perform introspection
260
269
  if (!Array.isArray(schemas)) {
@@ -262,17 +271,7 @@ var PgIntrospectionPlugin = async function PgIntrospectionPlugin(builder, {
262
271
  }
263
272
 
264
273
  const cacheKey = `PgIntrospectionPlugin-introspectionResultsByKind-v${_package.version}`;
265
-
266
- const cloneResults = obj => {
267
- const result = Object.keys(obj).reduce((memo, k) => {
268
- memo[k] = Array.isArray(obj[k]) ? obj[k].map(v => ({ ...v
269
- })) : obj[k];
270
- return memo;
271
- }, {});
272
- return result;
273
- };
274
-
275
- const introspectionResultsByKind = cloneResults((await persistentMemoizeWithKey(cacheKey, () => (0, _withPgClient.default)(pgConfig, async pgClient => {
274
+ const introspectionResultsByKind = deepClone((await persistentMemoizeWithKey(cacheKey, () => (0, _withPgClient.default)(pgConfig, async pgClient => {
276
275
  const versionResult = await pgClient.query("show server_version_num;");
277
276
  const serverVersionNum = parseInt(versionResult.rows[0].server_version_num, 10);
278
277
  const introspectionQuery = (0, _introspectionQuery.makeIntrospectionQuery)(serverVersionNum, {
@@ -336,6 +335,12 @@ var PgIntrospectionPlugin = async function PgIntrospectionPlugin(builder, {
336
335
  }
337
336
  }
338
337
 
338
+ return introspectionResultsByKind;
339
+ }
340
+
341
+ function introspectionResultsFromRaw(rawResults, pgAugmentIntrospectionResults) {
342
+ const introspectionResultsByKind = deepClone(rawResults);
343
+
339
344
  const xByY = (arrayOfX, attrKey) => arrayOfX.reduce((memo, x) => {
340
345
  memo[x[attrKey]] = x;
341
346
  return memo;
@@ -387,6 +392,10 @@ var PgIntrospectionPlugin = async function PgIntrospectionPlugin(builder, {
387
392
  });
388
393
  };
389
394
 
395
+ const augment = introspectionResults => {
396
+ [pgAugmentIntrospectionResults, smartCommentConstraints].forEach(fn => fn ? fn(introspectionResults) : null);
397
+ };
398
+
390
399
  augment(introspectionResultsByKind);
391
400
  relate(introspectionResultsByKind.class, "namespace", "namespaceId", introspectionResultsByKind.namespaceById, 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
392
401
  );
@@ -457,7 +466,7 @@ var PgIntrospectionPlugin = async function PgIntrospectionPlugin(builder, {
457
466
  return introspectionResultsByKind;
458
467
  }
459
468
 
460
- let introspectionResultsByKind = await introspect();
469
+ let rawIntrospectionResultsByKind = await introspect();
461
470
  let listener;
462
471
 
463
472
  class Listener {
@@ -467,7 +476,7 @@ var PgIntrospectionPlugin = async function PgIntrospectionPlugin(builder, {
467
476
  debug(`Schema change detected: re-inspecting schema...`);
468
477
 
469
478
  try {
470
- introspectionResultsByKind = await introspect();
479
+ rawIntrospectionResultsByKind = await introspect();
471
480
  debug(`Schema change detected: re-inspecting schema complete`);
472
481
  triggerRebuild();
473
482
  } catch (e) {
@@ -648,6 +657,8 @@ var PgIntrospectionPlugin = async function PgIntrospectionPlugin(builder, {
648
657
  }
649
658
  });
650
659
  builder.hook("build", build => {
660
+ const introspectionResultsByKind = introspectionResultsFromRaw(rawIntrospectionResultsByKind, build.pgAugmentIntrospectionResults);
661
+
651
662
  if (introspectionResultsByKind.__pgVersion < 90500) {
652
663
  // TODO:v5: remove this workaround
653
664
  // This is a bit of a hack, but until we have plugin priorities it's the
@@ -444,6 +444,20 @@ function smartCommentConstraints(introspectionResults) {
444
444
  });
445
445
  }
446
446
 
447
+ /* The argument to this must not contain cyclic references! */
448
+ const deepClone = value => {
449
+ if (Array.isArray(value)) {
450
+ return value.map(val => deepClone(val));
451
+ } else if (typeof value === "object" && value) {
452
+ return Object.keys(value).reduce((memo, k) => {
453
+ memo[k] = deepClone(value[k]);
454
+ return memo;
455
+ }, {});
456
+ } else {
457
+ return value;
458
+ }
459
+ };
460
+
447
461
  export default (async function PgIntrospectionPlugin(
448
462
  builder,
449
463
  {
@@ -455,15 +469,9 @@ export default (async function PgIntrospectionPlugin(
455
469
  pgIncludeExtensionResources = false,
456
470
  pgLegacyFunctionsOnly = false,
457
471
  pgSkipInstallingWatchFixtures = false,
458
- pgAugmentIntrospectionResults,
459
472
  pgOwnerConnectionString,
460
473
  }
461
474
  ) {
462
- const augment = introspectionResults => {
463
- [pgAugmentIntrospectionResults, smartCommentConstraints].forEach(fn =>
464
- fn ? fn(introspectionResults) : null
465
- );
466
- };
467
475
  /**
468
476
  * @summary introspect database and get the table/view/constraints.
469
477
  * @returns {Promise<PgIntrospectionResultsByKind>}
@@ -474,14 +482,7 @@ export default (async function PgIntrospectionPlugin(
474
482
  throw new Error("Argument 'schemas' (array) is required");
475
483
  }
476
484
  const cacheKey = `PgIntrospectionPlugin-introspectionResultsByKind-v${version}`;
477
- const cloneResults = obj => {
478
- const result = Object.keys(obj).reduce((memo, k) => {
479
- memo[k] = Array.isArray(obj[k]) ? obj[k].map(v => ({ ...v })) : obj[k];
480
- return memo;
481
- }, {});
482
- return result;
483
- };
484
- const introspectionResultsByKind = cloneResults(
485
+ const introspectionResultsByKind = deepClone(
485
486
  await persistentMemoizeWithKey(cacheKey, () =>
486
487
  withPgClient(pgConfig, async pgClient => {
487
488
  const versionResult = await pgClient.query(
@@ -579,6 +580,14 @@ export default (async function PgIntrospectionPlugin(
579
580
  console.warn("⚠️ WARNING⚠️ " + errorMessage); // eslint-disable-line no-console
580
581
  }
581
582
  }
583
+ return introspectionResultsByKind;
584
+ }
585
+
586
+ function introspectionResultsFromRaw(
587
+ rawResults,
588
+ pgAugmentIntrospectionResults
589
+ ) {
590
+ const introspectionResultsByKind = deepClone(rawResults);
582
591
 
583
592
  const xByY = (arrayOfX, attrKey) =>
584
593
  arrayOfX.reduce((memo, x) => {
@@ -650,6 +659,11 @@ export default (async function PgIntrospectionPlugin(
650
659
  });
651
660
  };
652
661
 
662
+ const augment = introspectionResults => {
663
+ [pgAugmentIntrospectionResults, smartCommentConstraints].forEach(fn =>
664
+ fn ? fn(introspectionResults) : null
665
+ );
666
+ };
653
667
  augment(introspectionResultsByKind);
654
668
 
655
669
  relate(
@@ -826,7 +840,7 @@ export default (async function PgIntrospectionPlugin(
826
840
  return introspectionResultsByKind;
827
841
  }
828
842
 
829
- let introspectionResultsByKind = await introspect();
843
+ let rawIntrospectionResultsByKind = await introspect();
830
844
 
831
845
  let listener;
832
846
 
@@ -842,7 +856,7 @@ export default (async function PgIntrospectionPlugin(
842
856
  async () => {
843
857
  debug(`Schema change detected: re-inspecting schema...`);
844
858
  try {
845
- introspectionResultsByKind = await introspect();
859
+ rawIntrospectionResultsByKind = await introspect();
846
860
  debug(`Schema change detected: re-inspecting schema complete`);
847
861
  triggerRebuild();
848
862
  } catch (e) {
@@ -1037,6 +1051,10 @@ export default (async function PgIntrospectionPlugin(
1037
1051
  builder.hook(
1038
1052
  "build",
1039
1053
  build => {
1054
+ const introspectionResultsByKind = introspectionResultsFromRaw(
1055
+ rawIntrospectionResultsByKind,
1056
+ build.pgAugmentIntrospectionResults
1057
+ );
1040
1058
  if (introspectionResultsByKind.__pgVersion < 90500) {
1041
1059
  // TODO:v5: remove this workaround
1042
1060
  // This is a bit of a hack, but until we have plugin priorities it's the
@@ -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","primaryKey","pkSpec","columns","notNull","fakeConstraint","kind","isFake","isIndexed","Math","random","foreignClassId","comment","foreignKeyAttributeNums","push","getType","t","typeId","foreignKey","foreignKeys","Array","isArray","fkSpecRaw","index","fkSpec","matches","match","rawColumns","rawSchemaOrTable","rawTableOnly","rawForeignColumns","rawSchema","rawTable","foreignSchema","foreignTable","foreignColumns","foreignKlass","k","foreignNamespace","PgIntrospectionPlugin","builder","pgConfig","pgSchemas","schemas","pgEnableTags","persistentMemoizeWithKey","key","fn","pgThrowOnMissingSchema","pgIncludeExtensionResources","pgLegacyFunctionsOnly","pgSkipInstallingWatchFixtures","pgAugmentIntrospectionResults","pgOwnerConnectionString","augment","introspect","cacheKey","version","cloneResults","obj","result","Object","keys","reduce","memo","v","introspectionResultsByKind","pgClient","versionResult","query","serverVersionNum","parseInt","rows","server_version_num","introspectionQuery","__pgVersion","procedure","extension","object","extensionConfigurationClassIds","e","configurationClassIds","isExtensionConfigurationTable","indexOf","freeze","knownSchemas","missingSchemas","s","errorMessage","console","warn","xByY","arrayOfX","attrKey","x","xByYAndZ","attrKey2","namespaceById","classById","typeById","attributeByClassIdAndNum","extensionById","relate","array","newAttr","lookupAttr","lookup","missingOk","entry","innerKey","JSON","stringify","_","arrayItemType","arrayType","canUseAsterisk","some","columnLevelSelectGrant","constraints","foreignConstraints","primaryKeyConstraint","keyAttributes","nr","foreignClass","foreignKeyAttributes","attributeNums","isUnique","every","idx","listener","Listener","constructor","triggerRebuild","stopped","_handleChange","error","message","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\";\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\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 tags: { [string]: string },\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 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 if (klass.tags.primaryKey) {\n if (typeof klass.tags.primaryKey !== \"string\") {\n throw new Error(\n `@primaryKey configuration of '${klass.namespaceName}.${klass.name}' is invalid; please specify just once \"@primaryKey col1,col2\"`\n );\n }\n const { spec: pkSpec, tags, description } = parseConstraintSpec(\n klass.tags.primaryKey\n );\n const columns: string[] = parseSqlColumnArray(pkSpec);\n const attributes = attributesByNames(\n klass,\n columns,\n `@primaryKey ${klass.tags.primaryKey}`\n );\n attributes.forEach(attr => {\n attr.tags.notNull = true;\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}_primaryKey`,\n type: \"p\", // primary key\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 });\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\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 pgSkipInstallingWatchFixtures = false,\n pgAugmentIntrospectionResults,\n pgOwnerConnectionString,\n }\n) {\n const augment = introspectionResults => {\n [pgAugmentIntrospectionResults, smartCommentConstraints].forEach(fn =>\n fn ? fn(introspectionResults) : null\n );\n };\n /**\n * @summary introspect database and get the table/view/constraints.\n * @returns {Promise<PgIntrospectionResultsByKind>}\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 cloneResults = obj => {\n const result = Object.keys(obj).reduce((memo, k) => {\n memo[k] = Array.isArray(obj[k]) ? obj[k].map(v => ({ ...v })) : obj[k];\n return memo;\n }, {});\n return result;\n };\n const introspectionResultsByKind = cloneResults(\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 });\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 [\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\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}' on '${JSON.stringify(\n entry\n )}'`\n );\n }\n entry[newAttr] = result;\n }\n });\n };\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 introspectionResultsByKind = 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 introspectionResultsByKind = 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 {\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 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","primaryKey","pkSpec","columns","notNull","fakeConstraint","kind","isFake","isIndexed","Math","random","foreignClassId","comment","foreignKeyAttributeNums","push","getType","t","typeId","foreignKey","foreignKeys","Array","isArray","fkSpecRaw","index","fkSpec","matches","match","rawColumns","rawSchemaOrTable","rawTableOnly","rawForeignColumns","rawSchema","rawTable","foreignSchema","foreignTable","foreignColumns","foreignKlass","k","foreignNamespace","deepClone","value","val","Object","keys","reduce","memo","PgIntrospectionPlugin","builder","pgConfig","pgSchemas","schemas","pgEnableTags","persistentMemoizeWithKey","key","fn","pgThrowOnMissingSchema","pgIncludeExtensionResources","pgLegacyFunctionsOnly","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","freeze","knownSchemas","missingSchemas","s","errorMessage","console","warn","introspectionResultsFromRaw","rawResults","pgAugmentIntrospectionResults","xByY","arrayOfX","attrKey","x","xByYAndZ","attrKey2","namespaceById","classById","typeById","attributeByClassIdAndNum","extensionById","relate","array","newAttr","lookupAttr","lookup","missingOk","entry","innerKey","JSON","stringify","_","augment","arrayItemType","arrayType","canUseAsterisk","some","columnLevelSelectGrant","constraints","foreignConstraints","primaryKeyConstraint","keyAttributes","nr","foreignClass","foreignKeyAttributes","attributeNums","isUnique","every","idx","rawIntrospectionResultsByKind","listener","Listener","constructor","triggerRebuild","stopped","_handleChange","error","message","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":";;;;;;;AAGA;;AAGA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;;;AAEA,MAAMA,KAAK,GAAG,oBAAa,mBAAb,CAAd;AACA,MAAMC,mBAAmB,GAAI,GAAEC,SAAU,+BAAzC,C,CAEA;;AAyMA,SAASC,QAAT,CAAkBC,QAAlB,EAA4BC,QAA5B,EAAsC;AACpC,SAAO,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtC,sBAAYJ,QAAZ,EAAsBC,QAAtB,EAAgC,CAACI,GAAD,EAAMC,GAAN,KAAc;AAC5C,UAAID,GAAJ,EAASD,MAAM,CAACC,GAAD,CAAN,CAAT,KACKF,OAAO,CAACG,GAAD,CAAP;AACN,KAHD;AAID,GALM,CAAP;AAMD;;AAED,MAAMC,YAAY,GAAGC,GAAG,IAAI;AAC1B,QAAMC,OAAO,GAAGD,GAAG,CAACE,IAAJ,EAAhB;;AACA,MAAID,OAAO,CAAC,CAAD,CAAP,KAAe,GAAnB,EAAwB;AACtB,QAAIA,OAAO,CAACA,OAAO,CAACE,MAAR,GAAiB,CAAlB,CAAP,KAAgC,GAApC,EAAyC;AACvC,YAAM,IAAIC,KAAJ,CACH,2CAA0CJ,GAAI,yGAD3C,CAAN;AAGD;;AACD,WAAOC,OAAO,CAACI,MAAR,CAAe,CAAf,EAAkBJ,OAAO,CAACE,MAAR,GAAiB,CAAnC,CAAP;AACD,GAPD,MAOO;AACL;AACA,WAAOF,OAAO,CAACK,WAAR,EAAP;AACD;AACF,CAbD;;AAeA,MAAMC,mBAAmB,GAAGP,GAAG,IAAI;AACjC,MAAI,CAACA,GAAL,EAAU;AACR,UAAM,IAAII,KAAJ,CAAW,iBAAgBJ,GAAI,GAA/B,CAAN;AACD;;AACD,QAAMQ,KAAK,GAAGR,GAAG,CAACS,KAAJ,CAAU,GAAV,CAAd;AACA,SAAOD,KAAK,CAACE,GAAN,CAAUX,YAAV,CAAP;AACD,CAND;;AAQA,MAAMY,oBAAoB,GAAGX,GAAG,IAAI;AAClC,MAAI,CAACA,GAAL,EAAU;AACR,UAAM,IAAII,KAAJ,CAAW,iBAAgBJ,GAAI,GAA/B,CAAN;AACD;;AACD,SAAOD,YAAY,CAACC,GAAD,CAAnB;AACD,CALD;;AAOA,SAASY,mBAAT,CAA6BC,OAA7B,EAAsC;AACpC,QAAM,CAACC,IAAD,EAAO,GAAGC,aAAV,IAA2BF,OAAO,CAACJ,KAAR,CAAc,IAAd,CAAjC;AACA,QAAMO,MAAM,GAAG,sBAAUD,aAAa,CAACE,IAAd,CAAmB,IAAnB,CAAV,CAAf;AACA,SAAO;AACLH,IAAAA,IADK;AAELI,IAAAA,IAAI,EAAEF,MAAM,CAACE,IAFR;AAGLC,IAAAA,WAAW,EAAEH,MAAM,CAACI;AAHf,GAAP;AAKD;;AAED,SAASC,uBAAT,CAAiCC,oBAAjC,EAAuD;AACrD,QAAMC,iBAAiB,GAAG,CAACC,GAAD,EAAMC,IAAN,EAAYC,QAAZ,KAAyB;AACjD,UAAMC,UAAU,GAAGL,oBAAoB,CAACM,SAArB,CAChBC,MADgB,CACTC,CAAC,IAAIA,CAAC,CAACC,OAAF,KAAcP,GAAG,CAACQ,EADd,EAEhBC,IAFgB,CAEX,CAACH,CAAD,EAAII,CAAJ,KAAUJ,CAAC,CAACK,GAAF,GAAQD,CAAC,CAACC,GAFT,CAAnB;;AAGA,QAAI,CAACV,IAAL,EAAW;AACT,YAAMW,EAAE,GAAGd,oBAAoB,CAACe,UAArB,CAAgCC,IAAhC,CACTC,CAAC,IAAIA,CAAC,CAACR,OAAF,IAAaP,GAAG,CAACQ,EAAjB,IAAuBO,CAAC,CAACC,IAAF,KAAW,GAD9B,CAAX;;AAGA,UAAIJ,EAAJ,EAAQ;AACN,eAAOA,EAAE,CAACK,gBAAH,CAAoB/B,GAApB,CAAwBgC,CAAC,IAAIf,UAAU,CAACW,IAAX,CAAgBR,CAAC,IAAIA,CAAC,CAACK,GAAF,KAAUO,CAA/B,CAA7B,CAAP;AACD,OAFD,MAEO;AACL,cAAM,IAAItC,KAAJ,CACH,6BAA4BoB,GAAG,CAACmB,aAAc,IAAGnB,GAAG,CAACoB,IAAK,WAAUpB,GAAG,CAACQ,EAAG,sBAAqBN,QAAS,IADtG,CAAN;AAGD;AACF;;AACD,WAAOD,IAAI,CAACf,GAAL,CAASmC,OAAO,IAAI;AACzB,YAAMC,IAAI,GAAGnB,UAAU,CAACW,IAAX,CAAgBR,CAAC,IAAIA,CAAC,CAACc,IAAF,KAAWC,OAAhC,CAAb;;AACA,UAAI,CAACC,IAAL,EAAW;AACT,cAAM,IAAI1C,KAAJ,CACH,6BAA4ByC,OAAQ,SAAQrB,GAAG,CAACmB,aAAc,IAAGnB,GAAG,CAACoB,IAAK,GADvE,CAAN;AAGD;;AACD,aAAOE,IAAP;AACD,KARM,CAAP;AASD,GAzBD,CADqD,CA4BrD;;;AACAxB,EAAAA,oBAAoB,CAACyB,KAArB,CAA2BC,OAA3B,CAAmCC,KAAK,IAAI;AAC1C,UAAMC,SAAS,GAAG5B,oBAAoB,CAAC4B,SAArB,CAA+BZ,IAA/B,CAChBI,CAAC,IAAIA,CAAC,CAACV,EAAF,KAASiB,KAAK,CAACE,WADJ,CAAlB;;AAGA,QAAI,CAACD,SAAL,EAAgB;AACd;AACD;;AACD,QAAID,KAAK,CAAC/B,IAAN,CAAWkC,UAAf,EAA2B;AACzB,UAAI,OAAOH,KAAK,CAAC/B,IAAN,CAAWkC,UAAlB,KAAiC,QAArC,EAA+C;AAC7C,cAAM,IAAIhD,KAAJ,CACH,iCAAgC6C,KAAK,CAACN,aAAc,IAAGM,KAAK,CAACL,IAAK,gEAD/D,CAAN;AAGD;;AACD,YAAM;AAAE9B,QAAAA,IAAI,EAAEuC,MAAR;AAAgBnC,QAAAA,IAAhB;AAAsBC,QAAAA;AAAtB,UAAsCP,mBAAmB,CAC7DqC,KAAK,CAAC/B,IAAN,CAAWkC,UADkD,CAA/D;AAGA,YAAME,OAAiB,GAAG/C,mBAAmB,CAAC8C,MAAD,CAA7C;AACA,YAAM1B,UAAU,GAAGJ,iBAAiB,CAClC0B,KADkC,EAElCK,OAFkC,EAGjC,eAAcL,KAAK,CAAC/B,IAAN,CAAWkC,UAAW,EAHH,CAApC;AAKAzB,MAAAA,UAAU,CAACqB,OAAX,CAAmBF,IAAI,IAAI;AACzBA,QAAAA,IAAI,CAAC5B,IAAL,CAAUqC,OAAV,GAAoB,IAApB;AACD,OAFD;AAGA,YAAMd,gBAAgB,GAAGd,UAAU,CAACjB,GAAX,CAAeoB,CAAC,IAAIA,CAAC,CAACK,GAAtB,CAAzB,CAlByB,CAmBzB;;AACA,YAAMqB,cAAc,GAAG;AACrBC,QAAAA,IAAI,EAAE,YADe;AAErBC,QAAAA,MAAM,EAAE,IAFa;AAGrBC,QAAAA,SAAS,EAAE,IAHU;AAGJ;AACjB3B,QAAAA,EAAE,EAAE4B,IAAI,CAACC,MAAL,EAJiB;AAKrBjB,QAAAA,IAAI,EAAG,QAAOK,KAAK,CAACN,aAAc,IAAGM,KAAK,CAACL,IAAK,aAL3B;AAMrBJ,QAAAA,IAAI,EAAE,GANe;AAMV;AACXT,QAAAA,OAAO,EAAEkB,KAAK,CAACjB,EAPM;AAQrB8B,QAAAA,cAAc,EAAE,IARK;AASrBC,QAAAA,OAAO,EAAE,IATY;AAUrB5C,QAAAA,WAVqB;AAWrBsB,QAAAA,gBAXqB;AAYrBuB,QAAAA,uBAAuB,EAAE,IAZJ;AAarB9C,QAAAA;AAbqB,OAAvB;AAeAI,MAAAA,oBAAoB,CAACe,UAArB,CAAgC4B,IAAhC,CAAqCT,cAArC;AACD;AACF,GA5CD,EA7BqD,CA0ErD;;AACAlC,EAAAA,oBAAoB,CAACyB,KAArB,CAA2BC,OAA3B,CAAmCC,KAAK,IAAI;AAC1C,UAAMC,SAAS,GAAG5B,oBAAoB,CAAC4B,SAArB,CAA+BZ,IAA/B,CAChBI,CAAC,IAAIA,CAAC,CAACV,EAAF,KAASiB,KAAK,CAACE,WADJ,CAAlB;;AAGA,QAAI,CAACD,SAAL,EAAgB;AACd;AACD;;AACD,UAAMgB,OAAO,GAAG,MACd5C,oBAAoB,CAACkB,IAArB,CAA0BF,IAA1B,CAA+B6B,CAAC,IAAIA,CAAC,CAACnC,EAAF,KAASiB,KAAK,CAACmB,MAAnD,CADF;;AAEA,UAAMC,UAAU,GAAGpB,KAAK,CAAC/B,IAAN,CAAWmD,UAAX,IAAyBH,OAAO,GAAGhD,IAAV,CAAemD,UAA3D;;AACA,QAAIA,UAAJ,EAAgB;AACd,YAAMC,WAAW,GACf,OAAOD,UAAP,KAAsB,QAAtB,GAAiC,CAACA,UAAD,CAAjC,GAAgDA,UADlD;;AAEA,UAAI,CAACE,KAAK,CAACC,OAAN,CAAcF,WAAd,CAAL,EAAiC;AAC/B,cAAM,IAAIlE,KAAJ,CACH,mDAAkD6C,KAAK,CAACN,aAAc,IAAGM,KAAK,CAACL,IAAK,GADjF,CAAN;AAGD;;AACD0B,MAAAA,WAAW,CAACtB,OAAZ,CAAoB,CAACyB,SAAD,EAAYC,KAAZ,KAAsB;AACxC,YAAI,OAAOD,SAAP,KAAqB,QAAzB,EAAmC;AACjC,gBAAM,IAAIrE,KAAJ,CACH,6BAA4BsE,KAAM,SAAQzB,KAAK,CAACN,aAAc,IAAGM,KAAK,CAACL,IAAK,GADzE,CAAN;AAGD;;AACD,cAAM;AAAE9B,UAAAA,IAAI,EAAE6D,MAAR;AAAgBzD,UAAAA,IAAhB;AAAsBC,UAAAA;AAAtB,YAAsCP,mBAAmB,CAC7D6D,SAD6D,CAA/D;AAGA,cAAMG,OAAO,GAAGD,MAAM,CAACE,KAAP,CACd,0EADc,CAAhB;;AAGA,YAAI,CAACD,OAAL,EAAc;AACZ,gBAAM,IAAIxE,KAAJ,CACH,kCAAiC6C,KAAK,CAACN,aAAc,IAAGM,KAAK,CAACL,IAAK,0FAAyF6B,SAAU,GADnK,CAAN;AAGD;;AACD,cAAM,GAEJK,UAFI,EAGJC,gBAHI,EAIJC,YAJI,EAKJC,iBALI,IAMFL,OANJ;AAOA,cAAMM,SAAS,GAAGF,YAAY,GAC1BD,gBAD0B,GAEzB,IAAG9B,KAAK,CAACN,aAAc,GAF5B;AAGA,cAAMwC,QAAQ,GAAGH,YAAY,IAAID,gBAAjC;AACA,cAAMzB,OAAiB,GAAG/C,mBAAmB,CAACuE,UAAD,CAA7C;AACA,cAAMM,aAAqB,GAAGzE,oBAAoB,CAACuE,SAAD,CAAlD;AACA,cAAMG,YAAoB,GAAG1E,oBAAoB,CAACwE,QAAD,CAAjD;AACA,cAAMG,cAA+B,GAAGL,iBAAiB,GACrD1E,mBAAmB,CAAC0E,iBAAD,CADkC,GAErD,IAFJ;AAIA,cAAMM,YAAY,GAAGjE,oBAAoB,CAACyB,KAArB,CAA2BT,IAA3B,CACnBkD,CAAC,IAAIA,CAAC,CAAC5C,IAAF,KAAWyC,YAAX,IAA2BG,CAAC,CAAC7C,aAAF,KAAoByC,aADjC,CAArB;;AAGA,YAAI,CAACG,YAAL,EAAmB;AACjB,gBAAM,IAAInF,KAAJ,CACH,iEAAgEgF,aAAc,MAAKC,YAAa,4FAA2FZ,SAAU,GADlM,CAAN;AAGD;;AACD,cAAMgB,gBAAgB,GAAGnE,oBAAoB,CAAC4B,SAArB,CAA+BZ,IAA/B,CACvBI,CAAC,IAAIA,CAAC,CAACV,EAAF,KAASuD,YAAY,CAACpC,WADJ,CAAzB;;AAGA,YAAI,CAACsC,gBAAL,EAAuB;AACrB;AACD;;AAED,cAAMhD,gBAAgB,GAAGlB,iBAAiB,CACxC0B,KADwC,EAExCK,OAFwC,EAGvC,eAAcmB,SAAU,EAHe,CAAjB,CAIvB/D,GAJuB,CAInBoB,CAAC,IAAIA,CAAC,CAACK,GAJY,CAAzB;AAKA,cAAM6B,uBAAuB,GAAGzC,iBAAiB,CAC/CgE,YAD+C,EAE/CD,cAF+C,EAG9C,eAAcb,SAAU,EAHsB,CAAjB,CAI9B/D,GAJ8B,CAI1BoB,CAAC,IAAIA,CAAC,CAACK,GAJmB,CAAhC,CAvDwC,CA6DxC;;AACA,cAAMqB,cAAc,GAAG;AACrBC,UAAAA,IAAI,EAAE,YADe;AAErBC,UAAAA,MAAM,EAAE,IAFa;AAGrBC,UAAAA,SAAS,EAAE,IAHU;AAGJ;AACjB3B,UAAAA,EAAE,EAAE4B,IAAI,CAACC,MAAL,EAJiB;AAKrBjB,UAAAA,IAAI,EAAG,QAAOK,KAAK,CAACN,aAAc,IAAGM,KAAK,CAACL,IAAK,eAAc8B,KAAM,EAL/C;AAMrBlC,UAAAA,IAAI,EAAE,GANe;AAMV;AACXT,UAAAA,OAAO,EAAEkB,KAAK,CAACjB,EAPM;AAQrB8B,UAAAA,cAAc,EAAEyB,YAAY,CAACvD,EARR;AASrB+B,UAAAA,OAAO,EAAE,IATY;AAUrB5C,UAAAA,WAVqB;AAWrBsB,UAAAA,gBAXqB;AAYrBuB,UAAAA,uBAZqB;AAarB9C,UAAAA;AAbqB,SAAvB;AAeAI,QAAAA,oBAAoB,CAACe,UAArB,CAAgC4B,IAAhC,CAAqCT,cAArC;AACD,OA9ED;AA+ED;AACF,GAlGD;AAmGD;AAED;;;AACA,MAAMkC,SAAS,GAAGC,KAAK,IAAI;AACzB,MAAIpB,KAAK,CAACC,OAAN,CAAcmB,KAAd,CAAJ,EAA0B;AACxB,WAAOA,KAAK,CAACjF,GAAN,CAAUkF,GAAG,IAAIF,SAAS,CAACE,GAAD,CAA1B,CAAP;AACD,GAFD,MAEO,IAAI,OAAOD,KAAP,KAAiB,QAAjB,IAA6BA,KAAjC,EAAwC;AAC7C,WAAOE,MAAM,CAACC,IAAP,CAAYH,KAAZ,EAAmBI,MAAnB,CAA0B,CAACC,IAAD,EAAOR,CAAP,KAAa;AAC5CQ,MAAAA,IAAI,CAACR,CAAD,CAAJ,GAAUE,SAAS,CAACC,KAAK,CAACH,CAAD,CAAN,CAAnB;AACA,aAAOQ,IAAP;AACD,KAHM,EAGJ,EAHI,CAAP;AAID,GALM,MAKA;AACL,WAAOL,KAAP;AACD;AACF,CAXD;;IAa+BM,qB,GAAf,eAAeA,qBAAf,CACdC,OADc,EAEd;AACEC,EAAAA,QADF;AAEEC,EAAAA,SAAS,EAAEC,OAFb;AAGEC,EAAAA,YAHF;AAIEC,EAAAA,wBAAwB,GAAG,CAACC,GAAD,EAAMC,EAAN,KAAaA,EAAE,EAJ5C;AAKEC,EAAAA,sBAAsB,GAAG,KAL3B;AAMEC,EAAAA,2BAA2B,GAAG,KANhC;AAOEC,EAAAA,qBAAqB,GAAG,KAP1B;AAQEC,EAAAA,6BAA6B,GAAG,KARlC;AASEC,EAAAA;AATF,CAFc,EAad;AACA;;;;AAIA,iBAAeC,UAAf,GAAmE;AACjE;AACA,QAAI,CAACxC,KAAK,CAACC,OAAN,CAAc6B,OAAd,CAAL,EAA6B;AAC3B,YAAM,IAAIjG,KAAJ,CAAU,wCAAV,CAAN;AACD;;AACD,UAAM4G,QAAQ,GAAI,qDAAoDC,gBAAQ,EAA9E;AACA,UAAMC,0BAA0B,GAAGxB,SAAS,EAC1C,MAAMa,wBAAwB,CAACS,QAAD,EAAW,MACvC,2BAAab,QAAb,EAAuB,MAAMgB,QAAN,IAAkB;AACvC,YAAMC,aAAa,GAAG,MAAMD,QAAQ,CAACE,KAAT,CAC1B,0BAD0B,CAA5B;AAGA,YAAMC,gBAAgB,GAAGC,QAAQ,CAC/BH,aAAa,CAACI,IAAd,CAAmB,CAAnB,EAAsBC,kBADS,EAE/B,EAF+B,CAAjC;AAIA,YAAMC,kBAAkB,GAAG,gDAAuBJ,gBAAvB,EAAyC;AAClEV,QAAAA;AADkE,OAAzC,CAA3B;AAGA,YAAM;AAAEY,QAAAA;AAAF,UAAW,MAAML,QAAQ,CAACE,KAAT,CAAeK,kBAAf,EAAmC,CACxDrB,OADwD,EAExDM,2BAFwD,CAAnC,CAAvB;AAKA,YAAMgB,MAAM,GAAG;AACbC,QAAAA,WAAW,EAAEN,gBADA;AAEbpE,QAAAA,SAAS,EAAE,EAFE;AAGbH,QAAAA,KAAK,EAAE,EAHM;AAIbnB,QAAAA,SAAS,EAAE,EAJE;AAKbY,QAAAA,IAAI,EAAE,EALO;AAMbH,QAAAA,UAAU,EAAE,EANC;AAObwF,QAAAA,SAAS,EAAE,EAPE;AAQbC,QAAAA,SAAS,EAAE,EARE;AASbpD,QAAAA,KAAK,EAAE;AATM,OAAf;;AAWA,WAAK,MAAM;AAAEqD,QAAAA;AAAF,OAAX,IAAyBP,IAAzB,EAA+B;AAC7BG,QAAAA,MAAM,CAACI,MAAM,CAACtE,IAAR,CAAN,CAAoBQ,IAApB,CAAyB8D,MAAzB;AACD,OA7BsC,CA+BvC;;;AACA,OACE,WADF,EAEE,OAFF,EAGE,WAHF,EAIE,MAJF,EAKE,YALF,EAME,WANF,EAOE,WAPF,EAQE,OARF,EASE/E,OATF,CASUS,IAAI,IAAI;AAChBkE,QAAAA,MAAM,CAAClE,IAAD,CAAN,CAAaT,OAAb,CAAqB+E,MAAM,IAAI;AAC7B;AACAA,UAAAA,MAAM,CAAChE,OAAP,GAAiBgE,MAAM,CAAC5G,WAAxB;;AACA,cAAImF,YAAY,IAAIyB,MAAM,CAAC5G,WAA3B,EAAwC;AACtC,kBAAMH,MAAM,GAAG,sBAAU+G,MAAM,CAAC5G,WAAjB,CAAf;AACA4G,YAAAA,MAAM,CAAC7G,IAAP,GAAcF,MAAM,CAACE,IAArB;AACA6G,YAAAA,MAAM,CAAC5G,WAAP,GAAqBH,MAAM,CAACI,IAA5B;AACD,WAJD,MAIO;AACL2G,YAAAA,MAAM,CAAC7G,IAAP,GAAc,EAAd;AACD;AACF,SAVD;AAWD,OArBD;AAuBA,YAAM8G,8BAA8B,GAAG,sBACrCL,MAAM,CAACG,SAD8B,EAErCG,CAAC,IAAIA,CAAC,CAACC,qBAF8B,CAAvC;AAIAP,MAAAA,MAAM,CAAC5E,KAAP,CAAaC,OAAb,CAAqBC,KAAK,IAAI;AAC5BA,QAAAA,KAAK,CAACkF,6BAAN,GACEH,8BAA8B,CAACI,OAA/B,CAAuCnF,KAAK,CAACjB,EAA7C,KAAoD,CADtD;AAED,OAHD;AAKA,OACE,WADF,EAEE,OAFF,EAGE,WAHF,EAIE,MAJF,EAKE,YALF,EAME,WANF,EAOE,WAPF,EAQE,OARF,EASEgB,OATF,CASUwC,CAAC,IAAI;AACbmC,QAAAA,MAAM,CAACnC,CAAD,CAAN,CAAUxC,OAAV,CAAkB6C,MAAM,CAACwC,MAAzB;AACD,OAXD;AAaA,aAAOxC,MAAM,CAACwC,MAAP,CAAcV,MAAd,CAAP;AACD,KA9ED,CAD4B,CADY,EAA5C;AAoFA,UAAMW,YAAY,GAAGpB,0BAA0B,CAAChE,SAA3B,CAAqCxC,GAArC,CAAyCgC,CAAC,IAAIA,CAAC,CAACE,IAAhD,CAArB;AACA,UAAM2F,cAAc,GAAGlC,OAAO,CAACxE,MAAR,CAAe2G,CAAC,IAAIF,YAAY,CAACF,OAAb,CAAqBI,CAArB,IAA0B,CAA9C,CAAvB;;AACA,QAAID,cAAc,CAACpI,MAAnB,EAA2B;AACzB,YAAMsI,YAAY,GAAI,gCAA+BpC,OAAO,CAACpF,IAAR,CACnD,MADmD,CAEnD,oEAAmEsH,cAAc,CAACtH,IAAf,CACnE,MADmE,CAEnE,GAJF;;AAKA,UAAIyF,sBAAJ,EAA4B;AAC1B,cAAM,IAAItG,KAAJ,CAAUqI,YAAV,CAAN;AACD,OAFD,MAEO;AACLC,QAAAA,OAAO,CAACC,IAAR,CAAa,mBAAmBF,YAAhC,EADK,CAC0C;AAChD;AACF;;AACD,WAAOvB,0BAAP;AACD;;AAED,WAAS0B,2BAAT,CACEC,UADF,EAEEC,6BAFF,EAGE;AACA,UAAM5B,0BAA0B,GAAGxB,SAAS,CAACmD,UAAD,CAA5C;;AAEA,UAAME,IAAI,GAAG,CAACC,QAAD,EAAWC,OAAX,KACXD,QAAQ,CAACjD,MAAT,CAAgB,CAACC,IAAD,EAAOkD,CAAP,KAAa;AAC3BlD,MAAAA,IAAI,CAACkD,CAAC,CAACD,OAAD,CAAF,CAAJ,GAAmBC,CAAnB;AACA,aAAOlD,IAAP;AACD,KAHD,EAGG,EAHH,CADF;;AAKA,UAAMmD,QAAQ,GAAG,CAACH,QAAD,EAAWC,OAAX,EAAoBG,QAApB,KACfJ,QAAQ,CAACjD,MAAT,CAAgB,CAACC,IAAD,EAAOkD,CAAP,KAAa;AAC3B,UAAI,CAAClD,IAAI,CAACkD,CAAC,CAACD,OAAD,CAAF,CAAT,EAAuBjD,IAAI,CAACkD,CAAC,CAACD,OAAD,CAAF,CAAJ,GAAmB,EAAnB;AACvBjD,MAAAA,IAAI,CAACkD,CAAC,CAACD,OAAD,CAAF,CAAJ,CAAiBC,CAAC,CAACE,QAAD,CAAlB,IAAgCF,CAAhC;AACA,aAAOlD,IAAP;AACD,KAJD,EAIG,EAJH,CADF;;AAMAkB,IAAAA,0BAA0B,CAACmC,aAA3B,GAA2CN,IAAI,CAC7C7B,0BAA0B,CAAChE,SADkB,EAE7C,IAF6C,CAA/C;AAIAgE,IAAAA,0BAA0B,CAACoC,SAA3B,GAAuCP,IAAI,CACzC7B,0BAA0B,CAACnE,KADc,EAEzC,IAFyC,CAA3C;AAIAmE,IAAAA,0BAA0B,CAACqC,QAA3B,GAAsCR,IAAI,CACxC7B,0BAA0B,CAAC1E,IADa,EAExC,IAFwC,CAA1C;AAIA0E,IAAAA,0BAA0B,CAACsC,wBAA3B,GAAsDL,QAAQ,CAC5DjC,0BAA0B,CAACtF,SADiC,EAE5D,SAF4D,EAG5D,KAH4D,CAA9D;AAKAsF,IAAAA,0BAA0B,CAACuC,aAA3B,GAA2CV,IAAI,CAC7C7B,0BAA0B,CAACY,SADkB,EAE7C,IAF6C,CAA/C;;AAKA,UAAM4B,MAAM,GAAG,CAACC,KAAD,EAAQC,OAAR,EAAiBC,UAAjB,EAA6BC,MAA7B,EAAqCC,SAAS,GAAG,KAAjD,KAA2D;AACxEJ,MAAAA,KAAK,CAAC3G,OAAN,CAAcgH,KAAK,IAAI;AACrB,cAAMxD,GAAG,GAAGwD,KAAK,CAACH,UAAD,CAAjB;;AACA,YAAItF,KAAK,CAACC,OAAN,CAAcgC,GAAd,CAAJ,EAAwB;AACtBwD,UAAAA,KAAK,CAACJ,OAAD,CAAL,GAAiBpD,GAAG,CACjB9F,GADc,CACVuJ,QAAQ,IAAI;AACf,kBAAMtC,MAAM,GAAGmC,MAAM,CAACG,QAAD,CAArB;;AACA,gBAAIA,QAAQ,IAAI,CAACtC,MAAjB,EAAyB;AACvB,kBAAIoC,SAAJ,EAAe;AACb;AACD;;AACD,oBAAM,IAAI3J,KAAJ,CACH,sBAAqBwJ,OAAQ,SAAQC,UAAW,OAAMI,QAAS,UAASC,IAAI,CAACC,SAAL,CACvEH,KADuE,CAEvE,GAHE,CAAN;AAKD;;AACD,mBAAOrC,MAAP;AACD,WAdc,EAed9F,MAfc,CAePuI,CAAC,IAAIA,CAfE,CAAjB;AAgBD,SAjBD,MAiBO;AACL,gBAAMzC,MAAM,GAAGmC,MAAM,CAACtD,GAAD,CAArB;;AACA,cAAIA,GAAG,IAAI,CAACmB,MAAZ,EAAoB;AAClB,gBAAIoC,SAAJ,EAAe;AACb;AACD;;AACD,kBAAM,IAAI3J,KAAJ,CACH,sBAAqBwJ,OAAQ,SAAQC,UAAW,SAAQK,IAAI,CAACC,SAAL,CACvDH,KADuD,CAEvD,GAHE,CAAN;AAKD;;AACDA,UAAAA,KAAK,CAACJ,OAAD,CAAL,GAAiBjC,MAAjB;AACD;AACF,OAjCD;AAkCD,KAnCD;;AAqCA,UAAM0C,OAAO,GAAG/I,oBAAoB,IAAI;AACtC,OAACwH,6BAAD,EAAgCzH,uBAAhC,EAAyD2B,OAAzD,CAAiEyD,EAAE,IACjEA,EAAE,GAAGA,EAAE,CAACnF,oBAAD,CAAL,GAA8B,IADlC;AAGD,KAJD;;AAKA+I,IAAAA,OAAO,CAACnD,0BAAD,CAAP;AAEAwC,IAAAA,MAAM,CACJxC,0BAA0B,CAACnE,KADvB,EAEJ,WAFI,EAGJ,aAHI,EAIJmE,0BAA0B,CAACmC,aAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAK,IAAAA,MAAM,CACJxC,0BAA0B,CAACnE,KADvB,EAEJ,MAFI,EAGJ,QAHI,EAIJmE,0BAA0B,CAACqC,QAJvB,CAAN;AAOAG,IAAAA,MAAM,CACJxC,0BAA0B,CAACtF,SADvB,EAEJ,OAFI,EAGJ,SAHI,EAIJsF,0BAA0B,CAACoC,SAJvB,CAAN;AAOAI,IAAAA,MAAM,CACJxC,0BAA0B,CAACtF,SADvB,EAEJ,MAFI,EAGJ,QAHI,EAIJsF,0BAA0B,CAACqC,QAJvB,CAAN;AAOAG,IAAAA,MAAM,CACJxC,0BAA0B,CAACW,SADvB,EAEJ,WAFI,EAGJ,aAHI,EAIJX,0BAA0B,CAACmC,aAJvB,CAAN;AAOAK,IAAAA,MAAM,CACJxC,0BAA0B,CAAC1E,IADvB,EAEJ,OAFI,EAGJ,SAHI,EAIJ0E,0BAA0B,CAACoC,SAJvB,EAKJ,IALI,CAAN;AAQAI,IAAAA,MAAM,CACJxC,0BAA0B,CAAC1E,IADvB,EAEJ,gBAFI,EAGJ,kBAHI,EAIJ0E,0BAA0B,CAACqC,QAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAG,IAAAA,MAAM,CACJxC,0BAA0B,CAAC1E,IADvB,EAEJ,eAFI,EAGJ,iBAHI,EAIJ0E,0BAA0B,CAACqC,QAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAG,IAAAA,MAAM,CACJxC,0BAA0B,CAAC7E,UADvB,EAEJ,OAFI,EAGJ,SAHI,EAIJ6E,0BAA0B,CAACoC,SAJvB,CAAN;AAOAI,IAAAA,MAAM,CACJxC,0BAA0B,CAAC7E,UADvB,EAEJ,cAFI,EAGJ,gBAHI,EAIJ6E,0BAA0B,CAACoC,SAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAI,IAAAA,MAAM,CACJxC,0BAA0B,CAACY,SADvB,EAEJ,WAFI,EAGJ,aAHI,EAIJZ,0BAA0B,CAACmC,aAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAK,IAAAA,MAAM,CACJxC,0BAA0B,CAACY,SADvB,EAEJ,sBAFI,EAGJ,uBAHI,EAIJZ,0BAA0B,CAACoC,SAJvB,EAKJ,IALI,CAKC;AALD,KAAN;AAQAI,IAAAA,MAAM,CACJxC,0BAA0B,CAACxC,KADvB,EAEJ,OAFI,EAGJ,SAHI,EAIJwC,0BAA0B,CAACoC,SAJvB,CAAN,CA3KA,CAkLA;;AACApC,IAAAA,0BAA0B,CAAC1E,IAA3B,CAAgCQ,OAAhC,CAAwCR,IAAI,IAAI;AAC9C,UAAIA,IAAI,CAAC8H,aAAT,EAAwB;AACtB9H,QAAAA,IAAI,CAAC8H,aAAL,CAAmBC,SAAnB,GAA+B/H,IAA/B;AACD;AACF,KAJD,EAnLA,CAyLA;;AACA0E,IAAAA,0BAA0B,CAACnE,KAA3B,CAAiCC,OAAjC,CAAyCC,KAAK,IAAI;AAChDA,MAAAA,KAAK,CAACtB,UAAN,GAAmBuF,0BAA0B,CAACtF,SAA3B,CAAqCC,MAArC,CACjBiB,IAAI,IAAIA,IAAI,CAACf,OAAL,KAAiBkB,KAAK,CAACjB,EADd,CAAnB;AAGAiB,MAAAA,KAAK,CAACuH,cAAN,GAAuB,CAACvH,KAAK,CAACtB,UAAN,CAAiB8I,IAAjB,CACtB3H,IAAI,IAAIA,IAAI,CAAC4H,sBADS,CAAxB;AAGAzH,MAAAA,KAAK,CAAC0H,WAAN,GAAoBzD,0BAA0B,CAAC7E,UAA3B,CAAsCR,MAAtC,CAClBQ,UAAU,IAAIA,UAAU,CAACN,OAAX,KAAuBkB,KAAK,CAACjB,EADzB,CAApB;AAGAiB,MAAAA,KAAK,CAAC2H,kBAAN,GAA2B1D,0BAA0B,CAAC7E,UAA3B,CAAsCR,MAAtC,CACzBQ,UAAU,IAAIA,UAAU,CAACyB,cAAX,KAA8Bb,KAAK,CAACjB,EADzB,CAA3B;AAGAiB,MAAAA,KAAK,CAAC4H,oBAAN,GAA6B5H,KAAK,CAAC0H,WAAN,CAAkBrI,IAAlB,CAC3BD,UAAU,IAAIA,UAAU,CAACG,IAAX,KAAoB,GADP,CAA7B;AAGD,KAhBD,EA1LA,CA4MA;;AACA0E,IAAAA,0BAA0B,CAAC7E,UAA3B,CAAsCW,OAAtC,CAA8CX,UAAU,IAAI;AAC1D,UAAIA,UAAU,CAACI,gBAAX,IAA+BJ,UAAU,CAACU,KAA9C,EAAqD;AACnDV,QAAAA,UAAU,CAACyI,aAAX,GAA2BzI,UAAU,CAACI,gBAAX,CAA4B/B,GAA5B,CAAgCqK,EAAE,IAC3D1I,UAAU,CAACU,KAAX,CAAiBpB,UAAjB,CAA4BW,IAA5B,CAAiCQ,IAAI,IAAIA,IAAI,CAACX,GAAL,KAAa4I,EAAtD,CADyB,CAA3B;AAGD,OAJD,MAIO;AACL1I,QAAAA,UAAU,CAACyI,aAAX,GAA2B,EAA3B;AACD;;AACD,UAAIzI,UAAU,CAAC2B,uBAAX,IAAsC3B,UAAU,CAAC2I,YAArD,EAAmE;AACjE3I,QAAAA,UAAU,CAAC4I,oBAAX,GAAkC5I,UAAU,CAAC2B,uBAAX,CAAmCtD,GAAnC,CAChCqK,EAAE,IAAI1I,UAAU,CAAC2I,YAAX,CAAwBrJ,UAAxB,CAAmCW,IAAnC,CAAwCQ,IAAI,IAAIA,IAAI,CAACX,GAAL,KAAa4I,EAA7D,CAD0B,CAAlC;AAGD,OAJD,MAIO;AACL1I,QAAAA,UAAU,CAAC4I,oBAAX,GAAkC,EAAlC;AACD;AACF,KAfD,EA7MA,CA8NA;;AACA/D,IAAAA,0BAA0B,CAACxC,KAA3B,CAAiC1B,OAAjC,CAAyC0B,KAAK,IAAI;AAChD,YAAMpB,OAAO,GAAGoB,KAAK,CAACwG,aAAN,CAAoBxK,GAApB,CAAwBqK,EAAE,IACxCrG,KAAK,CAAC3B,KAAN,CAAYpB,UAAZ,CAAuBW,IAAvB,CAA4BQ,IAAI,IAAIA,IAAI,CAACX,GAAL,KAAa4I,EAAjD,CADc,CAAhB,CADgD,CAKhD;;AACA,UAAIzH,OAAO,CAAC,CAAD,CAAX,EAAgB;AACdA,QAAAA,OAAO,CAAC,CAAD,CAAP,CAAWK,SAAX,GAAuB,IAAvB;AACD;;AAED,UAAIL,OAAO,CAAC,CAAD,CAAP,IAAcA,OAAO,CAACnD,MAAR,KAAmB,CAAjC,IAAsCuE,KAAK,CAACyG,QAAhD,EAA0D;AACxD7H,QAAAA,OAAO,CAAC,CAAD,CAAP,CAAW6H,QAAX,GAAsB,IAAtB;AACD,OAZ+C,CAchD;;;AACAzG,MAAAA,KAAK,CAAC3B,KAAN,CAAY4H,WAAZ,CACG9I,MADH,CACUQ,UAAU,IAAIA,UAAU,CAACG,IAAX,KAAoB,GAD5C,EAEGQ,OAFH,CAEWX,UAAU,IAAI;AACrB,YACEA,UAAU,CAACI,gBAAX,CAA4B2I,KAA5B,CACE,CAACL,EAAD,EAAKM,GAAL,KAAa3G,KAAK,CAACwG,aAAN,CAAoBG,GAApB,MAA6BN,EAD5C,CADF,EAIE;AACA1I,UAAAA,UAAU,CAACsB,SAAX,GAAuB,IAAvB;AACD;AACF,OAVH;AAWD,KA1BD;AA4BA,WAAOuD,0BAAP;AACD;;AAED,MAAIoE,6BAA6B,GAAG,MAAMvE,UAAU,EAApD;AAEA,MAAIwE,QAAJ;;AAEA,QAAMC,QAAN,CAAe;AAMbC,IAAAA,WAAW,CAACC,cAAD,EAAiB;AAC1B,WAAKC,OAAL,GAAe,KAAf;AACA,WAAKC,aAAL,GAAqB,uBACnB,YAAY;AACVxM,QAAAA,KAAK,CAAE,iDAAF,CAAL;;AACA,YAAI;AACFkM,UAAAA,6BAA6B,GAAG,MAAMvE,UAAU,EAAhD;AACA3H,UAAAA,KAAK,CAAE,uDAAF,CAAL;AACAsM,UAAAA,cAAc;AACf,SAJD,CAIE,OAAOzD,CAAP,EAAU;AACV;AACAS,UAAAA,OAAO,CAACmD,KAAR,CAAe,gCAA+B5D,CAAC,CAAC6D,OAAQ,EAAxD;AACD;AACF,OAXkB,EAYnB,GAZmB,EAanB;AACEC,QAAAA,OAAO,EAAE,IADX;AAEEC,QAAAA,QAAQ,EAAE;AAFZ,OAbmB,CAArB;AAkBA,WAAKC,SAAL,GAAiB,KAAKA,SAAL,CAAeC,IAAf,CAAoB,IAApB,CAAjB;AACA,WAAKC,kBAAL,GAA0B,KAAKA,kBAAL,CAAwBD,IAAxB,CAA6B,IAA7B,CAA1B;;AACA,WAAKE,MAAL;AACD;;AAED,UAAMA,MAAN,CAAaC,WAAW,GAAG,KAA3B,EAAkC;AAChC,UAAI,KAAKV,OAAT,EAAkB;AAChB;AACD,OAH+B,CAIhC;;;AACA,UAAI;AACF,cAAM;AACJxE,UAAAA,QADI;AAEJmF,UAAAA;AAFI,YAGF,MAAM,oDAAiCnG,QAAjC,CAHV;AAIA,aAAKoG,MAAL,GAAcpF,QAAd,CALE,CAMF;;AACA,aAAKqF,oBAAL,GAA4BF,eAA5B;AACAnF,QAAAA,QAAQ,CAACsF,EAAT,CAAY,cAAZ,EAA4B,KAAKR,SAAjC;AACA9E,QAAAA,QAAQ,CAACsF,EAAT,CAAY,OAAZ,EAAqB,KAAKN,kBAA1B;;AACA,YAAI,KAAKR,OAAT,EAAkB;AAChB;AACA,iBAAO,KAAKe,cAAL,EAAP;AACD,SAHD,MAGO;AACL,gBAAMvF,QAAQ,CAACE,KAAT,CAAe,2BAAf,CAAN,CADK,CAGL;;AACA,cAAI,CAACR,6BAAL,EAAoC;AAClC,kBAAM8F,aAAa,GAAG,MAAMpN,QAAQ,CAACF,mBAAD,EAAsB,MAAtB,CAApC;AACA,kBAAMuN,GAAG,GAAI,UAASD,aAAc,GAApC;AACA,kBAAM,2BACJ7F,uBAAuB,IAAIX,QADvB,EAEJ,MAAMgB,QAAN,IAAkB;AAChB,kBAAI;AACF,sBAAMA,QAAQ,CAACE,KAAT,CAAeuF,GAAf,CAAN;AACD,eAFD,CAEE,OAAOf,KAAP,EAAc;AACd,oBAAI,CAAC,KAAKgB,mBAAV,EAA+B;AAC7B,uBAAKA,mBAAL,GAA2B,IAA3B;AACA;;AACAnE,kBAAAA,OAAO,CAACC,IAAR,CACG,GAAEmE,eAAMC,IAAN,CAAWC,MAAX,CACD,qDADC,CAED,OAHJ;AAKAtE,kBAAAA,OAAO,CAACC,IAAR,CACEmE,eAAME,MAAN,CACE,iSADF,CADF;AAKAtE,kBAAAA,OAAO,CAACC,IAAR,CACEmE,eAAME,MAAN,CACE,mDADF,CADF;AAKA;AACD;;AACD5N,gBAAAA,KAAK,CAACyM,KAAD,CAAL;AACD,eAxBD,SAwBU;AACR,sBAAM1E,QAAQ,CAACE,KAAT,CAAe,SAAf,CAAN;AACD;AACF,aA9BG,CAAN;AAgCD,WAvCI,CAyCL;;;AACA,cAAIgF,WAAJ,EAAiB;AACf,iBAAKT,aAAL;AACD;AACF;AACF,OA3DD,CA2DE,OAAO3D,CAAP,EAAU;AACV;AACA,aAAKgF,UAAL,CAAgBhF,CAAhB;AACD;AACF;;AAGDkE,IAAAA,kBAAkB,CAAClE,CAAD,EAAI;AACpB;AACA,WAAKsE,MAAL,GAAc,IAAd;AACA,WAAKC,oBAAL,GAA4B,IAA5B;;AACA,WAAKS,UAAL,CAAgBhF,CAAhB;AACD;;AACD,UAAMgF,UAAN,CAAiBhF,CAAjB,EAAoB;AAClB,UAAI,KAAK0D,OAAT,EAAkB;AAChB;AACD,OAHiB,CAIlB;;;AACAjD,MAAAA,OAAO,CAACmD,KAAR,CACE,mEADF,EAEE5D,CAAC,CAAC6D,OAFJ;AAIA,YAAM,KAAKY,cAAL,EAAN;AACAQ,MAAAA,UAAU,CAAC,MAAM;AACf,YAAI,CAAC,KAAKvB,OAAV,EAAmB;AACjB;AACA,eAAKS,MAAL,CAAY,IAAZ;AACD;AACF,OALS,EAKP,IALO,CAAV;AAMD,KA5HY,CA8Hb;;;AAEA;AACA,UAAMH,SAAN,CAAgBkB,YAAhB,EAAmC;AACjC,UAAIA,YAAY,CAACC,OAAb,KAAyB,oBAA7B,EAAmD;AACjD;AACD;;AACD,UAAI;AACF,cAAMC,OAAO,GAAGnD,IAAI,CAACoD,KAAL,CAAWH,YAAY,CAACE,OAAxB,CAAhB;AACAA,QAAAA,OAAO,CAACA,OAAR,GAAkBA,OAAO,CAACA,OAAR,IAAmB,EAArC;;AACA,YAAIA,OAAO,CAAC7K,IAAR,KAAiB,KAArB,EAA4B;AAC1B,gBAAM+K,QAAQ,GAAGF,OAAO,CAACA,OAAR,CACdxL,MADc,CAEb,CAAC;AAAE2L,YAAAA;AAAF,WAAD,KAAgBA,MAAM,IAAI,IAAV,IAAkBnH,OAAO,CAAC+B,OAAR,CAAgBoF,MAAhB,KAA2B,CAFhD,EAId9M,GAJc,CAIV,CAAC;AAAE+M,YAAAA;AAAF,WAAD,KAAiBA,OAJP,CAAjB;;AAKA,cAAIF,QAAQ,CAACpN,MAAb,EAAqB;AACnB,iBAAKyL,aAAL;AACD;AACF,SATD,MASO,IAAIyB,OAAO,CAAC7K,IAAR,KAAiB,MAArB,EAA6B;AAClC,gBAAMkL,iBAAiB,GAAGL,OAAO,CAACA,OAAR,CAAgB5C,IAAhB,CACxBkD,UAAU,IAAItH,OAAO,CAAC+B,OAAR,CAAgBuF,UAAhB,KAA+B,CADrB,CAA1B;;AAGA,cAAID,iBAAJ,EAAuB;AACrB,iBAAK9B,aAAL;AACD;AACF,SAPM,MAOA;AACL,gBAAM,IAAIxL,KAAJ,CAAW,iBAAgBiN,OAAO,CAAC7K,IAAK,kBAAxC,CAAN;AACD;AACF,OAtBD,CAsBE,OAAOyF,CAAP,EAAU;AACV7I,QAAAA,KAAK,CAAE,gDAA+C6I,CAAE,EAAnD,CAAL;AACD;AACF;;AAED,UAAM2F,IAAN,GAAa;AACX,WAAKjC,OAAL,GAAe,IAAf;AACA,YAAM,KAAKe,cAAL,EAAN;AACD;;AAED,UAAMA,cAAN,GAAuB;AACrB;AACA,WAAKd,aAAL,CAAmBiC,MAAnB;;AACA,YAAM1G,QAAQ,GAAG,KAAKoF,MAAtB;AACA,YAAMuB,mBAAmB,GAAG,KAAKtB,oBAAjC;AACA,WAAKD,MAAL,GAAc,IAAd;AACA,WAAKC,oBAAL,GAA4B,IAA5B;;AACA,UAAIrF,QAAJ,EAAc;AACZA,QAAAA,QAAQ,CAACE,KAAT,CAAe,6BAAf,EAA8C0G,KAA9C,CAAoD9F,CAAC,IAAI;AACvD7I,UAAAA,KAAK,CAAE,4CAA2C6I,CAAE,EAA/C,CAAL;AACD,SAFD;AAGAd,QAAAA,QAAQ,CAAC6G,cAAT,CAAwB,cAAxB,EAAwC,KAAK/B,SAA7C;AACA9E,QAAAA,QAAQ,CAAC6G,cAAT,CAAwB,OAAxB,EAAiC,KAAK7B,kBAAtC;;AACA,YAAI2B,mBAAJ,EAAyB;AACvB,gBAAMA,mBAAmB,EAAzB;AACD;AACF;AACF;;AAtLY;;AAyLf5H,EAAAA,OAAO,CAAC+H,eAAR,CACE,MAAMvC,cAAN,IAAwB;AACtB;AACA,QAAIH,QAAJ,EAAc;AACZ,YAAMA,QAAQ,CAACqC,IAAT,EAAN;AACD,KAJqB,CAKtB;AACA;;;AACArC,IAAAA,QAAQ,GAAG,IAAIC,QAAJ,CAAaE,cAAb,CAAX;AACD,GATH,EAUE,YAAY;AACV,UAAMwC,CAAC,GAAG3C,QAAV;AACAA,IAAAA,QAAQ,GAAG,IAAX;;AACA,QAAI2C,CAAJ,EAAO;AACL,YAAMA,CAAC,CAACN,IAAF,EAAN;AACD;AACF,GAhBH;AAmBA1H,EAAAA,OAAO,CAACiI,IAAR,CACE,OADF,EAEEC,KAAK,IAAI;AACP,UAAMlH,0BAA0B,GAAG0B,2BAA2B,CAC5D0C,6BAD4D,EAE5D8C,KAAK,CAACtF,6BAFsD,CAA9D;;AAIA,QAAI5B,0BAA0B,CAACU,WAA3B,GAAyC,KAA7C,EAAoD;AAClD;AACA;AACA;AACAwG,MAAAA,KAAK,CAACC,sBAAN,GAA+B,0CAA4B;AACzDC,QAAAA,aAAa,EAAE;AAD0C,OAA5B,CAA/B;AAGD;;AACD,WAAOF,KAAK,CAACG,MAAN,CAAaH,KAAb,EAAoB;AACzBI,MAAAA,4BAA4B,EAAEtH;AADL,KAApB,CAAP;AAGD,GAlBH,EAmBE,CAAC,iBAAD,CAnBF,EAoBE,EApBF,EAqBE,CAAC,UAAD,CArBF;AAuBD,C,EAED;;;;AACO,MAAMuH,YAAY,GAAG;AAC1BC,EAAAA,SAAS,EAAE,WADe;AAE1BC,EAAAA,SAAS,EAAE,WAFe;AAG1BC,EAAAA,KAAK,EAAE,OAHmB;AAI1BC,EAAAA,IAAI,EAAE,MAJoB;AAK1BC,EAAAA,SAAS,EAAE,WALe;AAM1BC,EAAAA,UAAU,EAAE,YANc;AAO1BC,EAAAA,SAAS,EAAE,WAPe;AAQ1BC,EAAAA,KAAK,EAAE;AARmB,CAArB","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\";\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\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 tags: { [string]: string },\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 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 if (klass.tags.primaryKey) {\n if (typeof klass.tags.primaryKey !== \"string\") {\n throw new Error(\n `@primaryKey configuration of '${klass.namespaceName}.${klass.name}' is invalid; please specify just once \"@primaryKey col1,col2\"`\n );\n }\n const { spec: pkSpec, tags, description } = parseConstraintSpec(\n klass.tags.primaryKey\n );\n const columns: string[] = parseSqlColumnArray(pkSpec);\n const attributes = attributesByNames(\n klass,\n columns,\n `@primaryKey ${klass.tags.primaryKey}`\n );\n attributes.forEach(attr => {\n attr.tags.notNull = true;\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}_primaryKey`,\n type: \"p\", // primary key\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 });\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\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 pgSkipInstallingWatchFixtures = false,\n pgOwnerConnectionString,\n }\n) {\n /**\n * @summary introspect database and get the table/view/constraints.\n * @returns {Promise<PgIntrospectionResultsByKind>}\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 });\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 [\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}' on '${JSON.stringify(\n entry\n )}'`\n );\n }\n entry[newAttr] = result;\n }\n });\n };\n\n const augment = introspectionResults => {\n [pgAugmentIntrospectionResults, smartCommentConstraints].forEach(fn =>\n fn ? fn(introspectionResults) : null\n );\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 {\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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "graphile-build-pg",
3
- "version": "4.5.0",
3
+ "version": "4.5.3",
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",
@@ -66,5 +66,5 @@
66
66
  "engines": {
67
67
  "node": ">=8.6"
68
68
  },
69
- "gitHead": "46257b486fb53851962581aacb3063ebd435f580"
69
+ "gitHead": "5fb2c6a5a258f5976f55aa06391b9be9d5f0c4fc"
70
70
  }