graphile-build-pg 4.9.1 → 4.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/node8plus/plugins/PageInfoStartEndCursor.js +2 -2
- package/node8plus/plugins/PageInfoStartEndCursor.js.flow +6 -2
- package/node8plus/plugins/PageInfoStartEndCursor.js.map +1 -1
- package/node8plus/plugins/PgAllRows.js +1 -1
- package/node8plus/plugins/PgAllRows.js.flow +6 -3
- package/node8plus/plugins/PgAllRows.js.map +1 -1
- package/node8plus/plugins/PgBackwardRelationPlugin.js +2 -2
- package/node8plus/plugins/PgBackwardRelationPlugin.js.flow +8 -2
- package/node8plus/plugins/PgBackwardRelationPlugin.js.map +1 -1
- package/node8plus/plugins/PgBasicsPlugin.js +1 -1
- package/node8plus/plugins/PgBasicsPlugin.js.flow +1 -1
- package/node8plus/plugins/PgBasicsPlugin.js.map +1 -1
- package/node8plus/plugins/PgConditionComputedColumnPlugin.js +1 -1
- package/node8plus/plugins/PgConditionComputedColumnPlugin.js.flow +4 -1
- package/node8plus/plugins/PgConditionComputedColumnPlugin.js.map +1 -1
- package/node8plus/plugins/PgConnectionArgCondition.js +3 -3
- package/node8plus/plugins/PgConnectionArgCondition.js.flow +11 -3
- package/node8plus/plugins/PgConnectionArgCondition.js.map +1 -1
- package/node8plus/plugins/PgConnectionArgFirstLastBeforeAfter.js +5 -5
- package/node8plus/plugins/PgConnectionArgFirstLastBeforeAfter.js.flow +20 -7
- package/node8plus/plugins/PgConnectionArgFirstLastBeforeAfter.js.map +1 -1
- package/node8plus/plugins/PgConnectionArgOrderBy.js +2 -2
- package/node8plus/plugins/PgConnectionArgOrderBy.js.flow +8 -2
- package/node8plus/plugins/PgConnectionArgOrderBy.js.map +1 -1
- package/node8plus/plugins/PgConnectionTotalCount.js +1 -1
- package/node8plus/plugins/PgConnectionTotalCount.js.flow +4 -1
- package/node8plus/plugins/PgConnectionTotalCount.js.map +1 -1
- package/node8plus/plugins/PgForwardRelationPlugin.js +1 -1
- package/node8plus/plugins/PgForwardRelationPlugin.js.flow +4 -1
- package/node8plus/plugins/PgForwardRelationPlugin.js.map +1 -1
- package/node8plus/plugins/PgIntrospectionPlugin.d.ts +1 -0
- package/node8plus/plugins/PgIntrospectionPlugin.js +182 -159
- package/node8plus/plugins/PgIntrospectionPlugin.js.flow +218 -198
- package/node8plus/plugins/PgIntrospectionPlugin.js.map +1 -1
- package/node8plus/plugins/PgJWTPlugin.js +1 -1
- package/node8plus/plugins/PgJWTPlugin.js.flow +3 -1
- package/node8plus/plugins/PgJWTPlugin.js.map +1 -1
- package/node8plus/plugins/PgMutationCreatePlugin.js +7 -7
- package/node8plus/plugins/PgMutationCreatePlugin.js.flow +26 -7
- package/node8plus/plugins/PgMutationCreatePlugin.js.map +1 -1
- package/node8plus/plugins/PgMutationPayloadEdgePlugin.js +2 -2
- package/node8plus/plugins/PgMutationPayloadEdgePlugin.js.flow +8 -2
- package/node8plus/plugins/PgMutationPayloadEdgePlugin.js.map +1 -1
- package/node8plus/plugins/PgMutationUpdateDeletePlugin.js +11 -11
- package/node8plus/plugins/PgMutationUpdateDeletePlugin.js.flow +40 -11
- package/node8plus/plugins/PgMutationUpdateDeletePlugin.js.map +1 -1
- package/node8plus/plugins/PgRecordFunctionConnectionPlugin.js +6 -6
- package/node8plus/plugins/PgRecordFunctionConnectionPlugin.js.flow +24 -6
- package/node8plus/plugins/PgRecordFunctionConnectionPlugin.js.map +1 -1
- package/node8plus/plugins/PgRecordReturnTypesPlugin.js +1 -1
- package/node8plus/plugins/PgRecordReturnTypesPlugin.js.flow +6 -3
- package/node8plus/plugins/PgRecordReturnTypesPlugin.js.map +1 -1
- package/node8plus/plugins/PgRowNode.js +2 -2
- package/node8plus/plugins/PgRowNode.js.flow +8 -2
- package/node8plus/plugins/PgRowNode.js.map +1 -1
- package/node8plus/plugins/PgScalarFunctionConnectionPlugin.js +6 -6
- package/node8plus/plugins/PgScalarFunctionConnectionPlugin.js.flow +24 -6
- package/node8plus/plugins/PgScalarFunctionConnectionPlugin.js.map +1 -1
- package/node8plus/plugins/PgTablesPlugin.js +13 -13
- package/node8plus/plugins/PgTablesPlugin.js.flow +56 -20
- package/node8plus/plugins/PgTablesPlugin.js.map +1 -1
- package/node8plus/plugins/PgTypesPlugin.js +62 -78
- package/node8plus/plugins/PgTypesPlugin.js.flow +193 -76
- package/node8plus/plugins/PgTypesPlugin.js.map +1 -1
- package/node8plus/plugins/makeProcField.js +3 -3
- package/node8plus/plugins/makeProcField.js.flow +16 -7
- package/node8plus/plugins/makeProcField.js.map +1 -1
- package/node8plus/plugins/viaTemporaryTable.js +1 -1
- package/node8plus/plugins/viaTemporaryTable.js.flow +8 -4
- package/node8plus/plugins/viaTemporaryTable.js.map +1 -1
- package/node8plus/postgresInterval.js +12 -33
- package/node8plus/postgresInterval.js.flow +22 -51
- package/node8plus/postgresInterval.js.map +1 -1
- package/package.json +9 -9
- package/res/watch-fixtures.sql +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugins/PgIntrospectionPlugin.js"],"names":["debug","WATCH_FIXTURES_PATH","__dirname","readFile","filename","encoding","Promise","resolve","reject","err","res","removeQuotes","str","trimmed","trim","length","Error","substr","toLowerCase","parseSqlColumnArray","parts","split","map","parseSqlColumnString","parseConstraintSpec","rawSpec","spec","tagComponents","parsed","join","tags","description","text","smartCommentConstraints","introspectionResults","attributesByNames","tbl","cols","debugStr","attributes","attribute","filter","a","classId","id","sort","b","num","pk","constraint","find","c","type","keyAttributeNums","n","namespaceName","name","colName","attr","class","forEach","klass","namespace","namespaceId","addKey","key","isPrimary","tag","keySpec","columns","notNull","fakeConstraint","kind","isFake","isIndexed","Math","random","foreignClassId","comment","foreignKeyAttributeNums","push","primaryKey","unique","Array","isArray","getType","t","typeId","foreignKey","foreignKeys","fkSpecRaw","index","fkSpec","matches","match","rawColumns","rawSchemaOrTable","rawTableOnly","rawForeignColumns","rawSchema","rawTable","foreignSchema","foreignTable","foreignColumns","foreignKlass","k","foreignNamespace","deepClone","value","val","Object","keys","reduce","memo","PgIntrospectionPlugin","builder","pgConfig","pgSchemas","schemas","pgEnableTags","persistentMemoizeWithKey","fn","pgThrowOnMissingSchema","pgIncludeExtensionResources","pgLegacyFunctionsOnly","pgIgnoreRBAC","pgSkipInstallingWatchFixtures","pgOwnerConnectionString","introspect","cacheKey","version","introspectionResultsByKind","pgClient","versionResult","query","serverVersionNum","parseInt","rows","server_version_num","introspectionQuery","result","__pgVersion","procedure","extension","object","extensionConfigurationClassIds","e","configurationClassIds","isExtensionConfigurationTable","indexOf","all","isEnumTable","enum","omit","isSelectable","isInsertable","isUpdatable","isDeletable","enumConstraints","con","isPrimaryKey","isUniqueConstraint","isExplicitEnumConstraint","isPrimaryKeyOfEnumTableConstraint","hasExactlyOneColumn","enumTableColumns","z","descriptionColumn","enumDescription","VARCHAR_ID","TEXT_ID","CHAR_ID","BPCHAR_ID","enumColumns","pgSql","compile","fragment","col","identifier","blank","allData","role","user","message","data","row","constraintIdent","enumTypeArray","category","domainIsNotNull","arrayItemTypeId","typeLength","isPgArray","domainBaseTypeId","domainTypeModifier","domainHasDefault","enumVariants","enumDescriptions","rangeSubTypeId","enumType","r","fkattr","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","leading","trailing","_listener","bind","_handleClientError","_start","isReconnect","releasePgClient","client","_reallyReleaseClient","on","_releaseClient","watchSqlInner","sql","_haveDisplayedError","chalk","bold","yellow","_reconnect","setTimeout","notification","channel","payload","parse","commands","schema","command","affectsOurSchemas","schemaName","stop","cancel","reallyReleaseClient","catch","removeListener","registerWatcher","l","hook","build","pgQueryFromResolveData","supportsJSONB","extend","pgIntrospectionResultsByKind","PgEntityKind","NAMESPACE","PROCEDURE","CLASS","TYPE","ATTRIBUTE","CONSTRAINT","EXTENSION","INDEX"],"mappings":"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","sourcesContent":["// @flow\nimport type { Plugin } from \"graphile-build\";\nimport type { Client } from \"pg\";\nimport withPgClient, {\n getPgClientAndReleaserFromConfig,\n} from \"../withPgClient\";\nimport { parseTags } from \"../utils\";\nimport { readFile as rawReadFile } from \"fs\";\nimport debugFactory from \"debug\";\nimport chalk from \"chalk\";\nimport throttle from \"lodash/throttle\";\nimport flatMap from \"lodash/flatMap\";\nimport { makeIntrospectionQuery } from \"./introspectionQuery\";\nimport * as pgSql from \"pg-sql2\";\n\nimport { version } from \"../../package.json\";\nimport queryFromResolveDataFactory from \"../queryFromResolveDataFactory\";\n\nconst debug = debugFactory(\"graphile-build-pg\");\nconst WATCH_FIXTURES_PATH = `${__dirname}/../../res/watch-fixtures.sql`;\n\n// Ref: https://github.com/graphile/postgraphile/tree/master/src/postgres/introspection/object\n\nexport type PgNamespace = {\n kind: \"namespace\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgProc = {\n kind: \"procedure\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n isStrict: boolean,\n returnsSet: boolean,\n isStable: boolean,\n returnTypeId: string,\n argTypeIds: Array<string>,\n argNames: Array<string>,\n argModes: Array<\"i\" | \"o\" | \"b\" | \"v\" | \"t\">,\n inputArgsCount: number,\n argDefaultsNum: number,\n namespace: PgNamespace,\n tags: { [string]: string },\n cost: number,\n aclExecutable: boolean,\n language: string,\n};\n\nexport type PgClass = {\n kind: \"class\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n classKind: string,\n namespaceId: string,\n namespaceName: string,\n typeId: string,\n isSelectable: boolean,\n isInsertable: boolean,\n isUpdatable: boolean,\n isDeletable: boolean,\n isExtensionConfigurationTable: boolean,\n namespace: PgNamespace,\n type: PgType,\n tags: { [string]: string },\n attributes: Array<PgAttribute>,\n constraints: Array<PgConstraint>,\n foreignConstraints: Array<PgConstraint>,\n primaryKeyConstraint: ?PgConstraint,\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n aclDeletable: boolean,\n canUseAsterisk: boolean,\n};\n\nexport type PgType = {\n kind: \"type\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n type: string,\n category: string,\n domainIsNotNull: boolean,\n arrayItemTypeId: ?string,\n arrayItemType: ?PgType,\n arrayType: ?PgType,\n typeLength: ?number,\n isPgArray: boolean,\n classId: ?string,\n class: ?PgClass,\n domainBaseTypeId: ?string,\n domainBaseType: ?PgType,\n domainTypeModifier: ?number,\n domainHasDefault: boolean,\n enumVariants: ?(string[]),\n enumDescriptions: ?(string[]),\n rangeSubTypeId: ?string,\n tags: { [string]: string },\n};\n\nexport type PgAttribute = {\n kind: \"attribute\",\n classId: string,\n num: number,\n name: string,\n comment: ?string,\n description: ?string,\n typeId: string,\n typeModifier: number,\n isNotNull: boolean,\n hasDefault: boolean,\n identity: \"\" | \"a\" | \"d\",\n class: PgClass,\n type: PgType,\n namespace: PgNamespace,\n tags: { [string]: string },\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n isIndexed: ?boolean,\n isUnique: ?boolean,\n columnLevelSelectGrant: boolean,\n};\n\nexport type PgConstraint = {\n kind: \"constraint\",\n id: string,\n name: string,\n type: string,\n classId: string,\n class: PgClass,\n foreignClassId: ?string,\n foreignClass: ?PgClass,\n comment: ?string,\n description: ?string,\n keyAttributeNums: Array<number>,\n keyAttributes: Array<PgAttribute>,\n foreignKeyAttributeNums: Array<number>,\n foreignKeyAttributes: Array<PgAttribute>,\n namespace: PgNamespace,\n isIndexed: ?boolean,\n tags: { [string]: string },\n};\n\nexport type PgExtension = {\n kind: \"extension\",\n id: string,\n name: string,\n namespaceId: string,\n namespaceName: string,\n relocatable: boolean,\n version: string,\n configurationClassIds?: Array<string>,\n comment: ?string,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgIndex = {\n kind: \"index\",\n id: string,\n name: string,\n namespaceName: string,\n classId: string,\n numberOfAttributes: number,\n indexType: string,\n isUnique: boolean,\n isPrimary: boolean,\n /*\n Though these exist, we don't want to officially\n support them yet.\n\n isImmediate: boolean,\n isReplicaIdentity: boolean,\n isValid: boolean,\n */\n isPartial: boolean,\n attributeNums: Array<number>,\n attributePropertiesAsc: ?Array<boolean>,\n attributePropertiesNullsFirst: ?Array<boolean>,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgEntity =\n | PgNamespace\n | PgProc\n | PgClass\n | PgType\n | PgAttribute\n | PgConstraint\n | PgExtension\n | PgIndex;\n\nexport type PgIntrospectionResultsByKind = {\n __pgVersion: number,\n attribute: PgAttribute[],\n attributeByClassIdAndNum: {\n [classId: string]: { [num: string]: PgAttribute },\n },\n class: PgClass[],\n classById: { [classId: string]: PgClass },\n constraint: PgConstraint[],\n extension: PgExtension[],\n extensionById: { [extId: string]: PgExtension },\n index: PgIndex[],\n namespace: PgNamespace[],\n namespaceById: { [namespaceId: string]: PgNamespace },\n procedure: PgProc[],\n type: PgType[],\n typeById: { [typeId: string]: PgType },\n};\n\nfunction readFile(filename, encoding) {\n return new Promise((resolve, reject) => {\n rawReadFile(filename, encoding, (err, res) => {\n if (err) reject(err);\n else resolve(res);\n });\n });\n}\n\nconst removeQuotes = str => {\n const trimmed = str.trim();\n if (trimmed[0] === '\"') {\n if (trimmed[trimmed.length - 1] !== '\"') {\n throw new Error(\n `We failed to parse a quoted identifier '${str}'. Please avoid putting quotes or commas in smart comment identifiers (or file a PR to fix the parser).`\n );\n }\n return trimmed.substr(1, trimmed.length - 2);\n } else {\n // PostgreSQL lower-cases unquoted columns, so we should too.\n return trimmed.toLowerCase();\n }\n};\n\nconst parseSqlColumnArray = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n const parts = str.split(\",\");\n return parts.map(removeQuotes);\n};\n\nconst parseSqlColumnString = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n return removeQuotes(str);\n};\n\nfunction parseConstraintSpec(rawSpec) {\n const [spec, ...tagComponents] = rawSpec.split(/\\|/);\n const parsed = parseTags(tagComponents.join(\"\\n\"));\n return {\n spec,\n tags: parsed.tags,\n description: parsed.text,\n };\n}\n\nfunction smartCommentConstraints(introspectionResults) {\n const attributesByNames = (tbl, cols, debugStr) => {\n const attributes = introspectionResults.attribute\n .filter(a => a.classId === tbl.id)\n .sort((a, b) => a.num - b.num);\n if (!cols) {\n const pk = introspectionResults.constraint.find(\n c => c.classId == tbl.id && c.type === \"p\"\n );\n if (pk) {\n return pk.keyAttributeNums.map(n => attributes.find(a => a.num === n));\n } else {\n throw new Error(\n `No columns specified for '${tbl.namespaceName}.${tbl.name}' (oid: ${tbl.id}) and no PK found (${debugStr}).`\n );\n }\n }\n return cols.map(colName => {\n const attr = attributes.find(a => a.name === colName);\n if (!attr) {\n throw new Error(\n `Could not find attribute '${colName}' in '${tbl.namespaceName}.${tbl.name}'`\n );\n }\n return attr;\n });\n };\n\n // First: primary and unique keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n function addKey(key: string, isPrimary = false) {\n const tag = isPrimary ? \"@primaryKey\" : \"@unique\";\n if (typeof key !== \"string\") {\n if (isPrimary) {\n throw new Error(\n `${tag} configuration of '${klass.namespaceName}.${klass.name}' is invalid; please specify just once \"${tag} col1,col2\"`\n );\n }\n throw new Error(\n `${tag} configuration of '${klass.namespaceName}.${\n klass.name\n }' is invalid; expected ${\n isPrimary ? \"a string\" : \"a string or string array\"\n } but found ${typeof key}`\n );\n }\n const { spec: keySpec, tags, description } = parseConstraintSpec(key);\n const columns: string[] = parseSqlColumnArray(keySpec);\n const attributes = attributesByNames(klass, columns, `${tag} ${key}`);\n if (isPrimary) {\n attributes.forEach(attr => {\n attr.tags.notNull = true;\n });\n }\n const keyAttributeNums = attributes.map(a => a.num);\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_${tag}`,\n type: isPrimary ? \"p\" : \"u\",\n classId: klass.id,\n foreignClassId: null,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums: null,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n }\n if (klass.tags.primaryKey) {\n addKey(klass.tags.primaryKey, true);\n }\n if (klass.tags.unique) {\n if (Array.isArray(klass.tags.unique)) {\n klass.tags.unique.forEach(key => addKey(key, true));\n } else {\n addKey(klass.tags.unique);\n }\n }\n });\n // Now primary keys are in place, we can apply foreign keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n const getType = () =>\n introspectionResults.type.find(t => t.id === klass.typeId);\n const foreignKey = klass.tags.foreignKey || getType().tags.foreignKey;\n if (foreignKey) {\n const foreignKeys =\n typeof foreignKey === \"string\" ? [foreignKey] : foreignKey;\n if (!Array.isArray(foreignKeys)) {\n throw new Error(\n `Invalid foreign key smart comment specified on '${klass.namespaceName}.${klass.name}'`\n );\n }\n foreignKeys.forEach((fkSpecRaw, index) => {\n if (typeof fkSpecRaw !== \"string\") {\n throw new Error(\n `Invalid foreign key spec (${index}) on '${klass.namespaceName}.${klass.name}'`\n );\n }\n const { spec: fkSpec, tags, description } = parseConstraintSpec(\n fkSpecRaw\n );\n const matches = fkSpec.match(\n /^\\(([^()]+)\\) references ([^().]+)(?:\\.([^().]+))?(?:\\s*\\(([^()]+)\\))?$/i\n );\n if (!matches) {\n throw new Error(\n `Invalid foreignKey syntax for '${klass.namespaceName}.${klass.name}'; expected something like \"(col1,col2) references schema.table (c1, c2)\", you passed '${fkSpecRaw}'`\n );\n }\n const [\n ,\n rawColumns,\n rawSchemaOrTable,\n rawTableOnly,\n rawForeignColumns,\n ] = matches;\n const rawSchema = rawTableOnly\n ? rawSchemaOrTable\n : `\"${klass.namespaceName}\"`;\n const rawTable = rawTableOnly || rawSchemaOrTable;\n const columns: string[] = parseSqlColumnArray(rawColumns);\n const foreignSchema: string = parseSqlColumnString(rawSchema);\n const foreignTable: string = parseSqlColumnString(rawTable);\n const foreignColumns: string[] | null = rawForeignColumns\n ? parseSqlColumnArray(rawForeignColumns)\n : null;\n\n const foreignKlass = introspectionResults.class.find(\n k => k.name === foreignTable && k.namespaceName === foreignSchema\n );\n if (!foreignKlass) {\n throw new Error(\n `@foreignKey smart comment referenced non-existant table/view '${foreignSchema}'.'${foreignTable}'. Note that this reference must use *database names* (i.e. it does not respect @name). (${fkSpecRaw})`\n );\n }\n const foreignNamespace = introspectionResults.namespace.find(\n n => n.id === foreignKlass.namespaceId\n );\n if (!foreignNamespace) {\n return;\n }\n\n const keyAttributeNums = attributesByNames(\n klass,\n columns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n const foreignKeyAttributeNums = attributesByNames(\n foreignKlass,\n foreignColumns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_foreignKey_${index}`,\n type: \"f\", // foreign key\n classId: klass.id,\n foreignClassId: foreignKlass.id,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n });\n }\n });\n}\n\n/* The argument to this must not contain cyclic references! */\nconst deepClone = value => {\n if (Array.isArray(value)) {\n return value.map(val => deepClone(val));\n } else if (typeof value === \"object\" && value) {\n return Object.keys(value).reduce((memo, k) => {\n memo[k] = deepClone(value[k]);\n return memo;\n }, {});\n } else {\n return value;\n }\n};\n\nexport default (async function PgIntrospectionPlugin(\n builder,\n {\n pgConfig,\n pgSchemas: schemas,\n pgEnableTags,\n persistentMemoizeWithKey = (key, fn) => fn(),\n pgThrowOnMissingSchema = false,\n pgIncludeExtensionResources = false,\n pgLegacyFunctionsOnly = false,\n pgIgnoreRBAC = true,\n pgSkipInstallingWatchFixtures = false,\n pgOwnerConnectionString,\n }\n) {\n /**\n * Introspect database and get the table/view/constraints.\n */\n async function introspect(): Promise<PgIntrospectionResultsByKind> {\n // Perform introspection\n if (!Array.isArray(schemas)) {\n throw new Error(\"Argument 'schemas' (array) is required\");\n }\n const cacheKey = `PgIntrospectionPlugin-introspectionResultsByKind-v${version}`;\n const introspectionResultsByKind = deepClone(\n await persistentMemoizeWithKey(cacheKey, () =>\n withPgClient(pgConfig, async pgClient => {\n const versionResult = await pgClient.query(\n \"show server_version_num;\"\n );\n const serverVersionNum = parseInt(\n versionResult.rows[0].server_version_num,\n 10\n );\n const introspectionQuery = makeIntrospectionQuery(serverVersionNum, {\n pgLegacyFunctionsOnly,\n pgIgnoreRBAC,\n });\n const { rows } = await pgClient.query(introspectionQuery, [\n schemas,\n pgIncludeExtensionResources,\n ]);\n\n const result = {\n __pgVersion: serverVersionNum,\n namespace: [],\n class: [],\n attribute: [],\n type: [],\n constraint: [],\n procedure: [],\n extension: [],\n index: [],\n };\n for (const { object } of rows) {\n result[object.kind].push(object);\n }\n\n // Parse tags from comments\n [\n \"namespace\",\n \"class\",\n \"attribute\",\n \"type\",\n \"constraint\",\n \"procedure\",\n \"extension\",\n \"index\",\n ].forEach(kind => {\n result[kind].forEach(object => {\n // Keep a copy of the raw comment\n object.comment = object.description;\n if (pgEnableTags && object.description) {\n const parsed = parseTags(object.description);\n object.tags = parsed.tags;\n object.description = parsed.text;\n } else {\n object.tags = {};\n }\n });\n });\n\n const extensionConfigurationClassIds = flatMap(\n result.extension,\n e => e.configurationClassIds\n );\n result.class.forEach(klass => {\n klass.isExtensionConfigurationTable =\n extensionConfigurationClassIds.indexOf(klass.id) >= 0;\n });\n\n await Promise.all(\n result.class.map(async klass => {\n const isEnumTable =\n klass.tags.enum === true || typeof klass.tags.enum === \"string\";\n\n if (isEnumTable) {\n // Prevent the table being recognised as a table\n // eslint-disable-next-line require-atomic-updates\n klass.tags.omit = true;\n // eslint-disable-next-line require-atomic-updates\n klass.isSelectable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isInsertable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isUpdatable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isDeletable = false;\n }\n\n const enumConstraints = result.constraint.filter(\n (con: PgConstraint) => {\n if (con.classId === klass.id) {\n const isPrimaryKey = con.type === \"p\";\n const isUniqueConstraint = con.type === \"u\";\n if (isPrimaryKey || isUniqueConstraint) {\n const isExplicitEnumConstraint =\n con.tags.enum === true ||\n typeof con.tags.enum === \"string\";\n const isPrimaryKeyOfEnumTableConstraint =\n con.type === \"p\" && isEnumTable;\n if (\n isExplicitEnumConstraint ||\n isPrimaryKeyOfEnumTableConstraint\n ) {\n const hasExactlyOneColumn =\n con.keyAttributeNums.length === 1;\n if (!hasExactlyOneColumn) {\n throw new Error(\n `Enum table \"${klass.namespaceName}\".\"${klass.name}\" enum constraint '${con.name}' is composite; it should have exactly one column (found: ${con.keyAttributeNums.length})`\n );\n }\n return true;\n }\n }\n }\n return false;\n }\n );\n if (enumConstraints.length > 0) {\n // Get all the columns\n const enumTableColumns = result.attribute\n .filter(attr => attr.classId === klass.id)\n .sort((a, z) => a.num - z.num);\n\n // Get description column\n const descriptionColumn = enumTableColumns.find(\n attr =>\n attr.name === \"description\" || attr.tags.enumDescription\n );\n\n // Assert the columns are text\n const VARCHAR_ID = \"1043\";\n const TEXT_ID = \"25\";\n const CHAR_ID = \"18\";\n const BPCHAR_ID = \"1042\";\n\n // Get the list of columns enums are defined for\n const enumColumns = enumConstraints.map(con => {\n const attr = enumTableColumns.find(\n attr => attr.num === con.keyAttributeNums[0]\n );\n if (!attr) {\n throw new Error(\n `Enum table \"${klass.namespaceName}\".\"${klass.name}\" enum column '${con.keyAttributeNums[0]}' couldn't be found`\n );\n }\n if (\n attr.typeId !== VARCHAR_ID &&\n attr.typeId !== TEXT_ID &&\n attr.typeId !== CHAR_ID &&\n attr.typeId !== BPCHAR_ID\n ) {\n throw new Error(\n `Enum table \"${klass.namespaceName}\".\"${klass.name}\" enum column '${attr.name}' must be 'text', 'char' or 'varchar' (actual type OID: ${attr.typeId})`\n );\n }\n return attr;\n });\n\n // Load data from the table.\n const query = pgSql.compile(\n pgSql.fragment`select ${pgSql.join(\n enumColumns.map(col => pgSql.identifier(col.name)),\n \", \"\n )}${\n descriptionColumn\n ? pgSql.fragment`, ${pgSql.identifier(\n descriptionColumn.name\n )}`\n : pgSql.blank\n } from ${pgSql.identifier(klass.namespaceName, klass.name)};`\n );\n let allData;\n try {\n ({ rows: allData } = await pgClient.query(query));\n } catch (e) {\n let role = \"RELEVANT_POSTGRES_USER\";\n try {\n const {\n rows: [{ user }],\n } = await pgClient.query(\"select user;\");\n role = user;\n } catch (e) {\n /* ignore */\n }\n throw new Error(`Introspection could not read from enum table \"${klass.namespaceName}\".\"${klass.name}\", perhaps you need to grant access:\n\n GRANT USAGE ON SCHEMA \"${klass.namespaceName}\" TO \"${role}\";\n GRANT SELECT ON \"${klass.namespaceName}\".\"${klass.name}\" TO \"${role}\";\n\nOriginal error: ${e.message}\n`);\n }\n\n // Assert there's at least one value\n enumConstraints.forEach(constraint => {\n const col = enumColumns.find(\n col => col.num === constraint.keyAttributeNums[0]\n );\n if (!col) {\n // Should never happen\n throw new Error(\n \"Graphile Engine error - could not find column for enum constraint\"\n );\n }\n const data = allData.filter(row => row[col.name] != null);\n if (data.length < 1) {\n throw new Error(\n `Enum table \"${klass.namespaceName}\".\"${klass.name}\" contains no entries for enum constraint '${constraint.name}'.`\n );\n }\n\n // Create fake enum type\n const constraintIdent =\n constraint.type === \"p\" ? \"\" : `_${constraint.name}`;\n const enumTypeArray = {\n kind: \"type\",\n id: `FAKE_ENUM_${klass.namespaceName}_${klass.name}${constraintIdent}_list`,\n name: `_${klass.name}${constraintIdent}`,\n description: null,\n tags: {},\n namespaceId: klass.namespaceId,\n namespaceName: klass.namespaceName,\n type: \"b\",\n category: \"A\",\n domainIsNotNull: null,\n arrayItemTypeId: null,\n typeLength: -1,\n isPgArray: true,\n classId: null,\n domainBaseTypeId: null,\n domainTypeModifier: null,\n domainHasDefault: false,\n enumVariants: null,\n enumDescriptions: null,\n rangeSubTypeId: null,\n };\n const enumType = {\n kind: \"type\",\n id: `FAKE_ENUM_${klass.namespaceName}_${klass.name}${constraintIdent}`,\n name: `${klass.name}${constraintIdent}`,\n description: klass.description,\n tags: { ...klass.tags, ...constraint.tags },\n namespaceId: klass.namespaceId,\n namespaceName: klass.namespaceName,\n type: \"e\",\n category: \"E\",\n domainIsNotNull: null,\n arrayItemTypeId: enumTypeArray.id,\n typeLength: 4, // ???\n isPgArray: false,\n classId: null,\n domainBaseTypeId: null,\n domainTypeModifier: null,\n domainHasDefault: false,\n enumVariants: data.map(r => r[col.name]),\n enumDescriptions: descriptionColumn\n ? data.map(r => r[descriptionColumn.name])\n : null,\n // TODO: enumDescriptions\n rangeSubTypeId: null,\n };\n result.type.push(enumType, enumTypeArray);\n\n // Change type of all attributes that reference this table to\n // reference this enum type\n result.constraint.forEach(c => {\n if (\n c.type === \"f\" &&\n c.foreignClassId === klass.id &&\n c.foreignKeyAttributeNums.length === 1 &&\n c.foreignKeyAttributeNums[0] === col.num\n ) {\n // Get the attribute\n const fkattr = result.attribute.find(\n attr =>\n attr.classId === c.classId &&\n attr.num === c.keyAttributeNums[0]\n );\n if (fkattr) {\n // Override the detected type to pretend to be our enum\n fkattr.typeId = enumType.id;\n }\n }\n });\n });\n }\n })\n );\n\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 if (payload.type === \"manual\") {\n this._handleChange();\n } else {\n throw new Error(`Payload type '${payload.type}' not recognised`);\n }\n } catch (e) {\n debug(`Error occurred parsing notification payload: ${e}`);\n }\n }\n\n async stop() {\n this.stopped = true;\n await this._releaseClient();\n }\n\n async _releaseClient() {\n // $FlowFixMe\n this._handleChange.cancel();\n const pgClient = this.client;\n const reallyReleaseClient = this._reallyReleaseClient;\n this.client = null;\n this._reallyReleaseClient = null;\n if (pgClient) {\n pgClient.query(\"unlisten postgraphile_watch\").catch(e => {\n debug(`Error occurred trying to unlisten watch: ${e}`);\n });\n pgClient.removeListener(\"notification\", this._listener);\n pgClient.removeListener(\"error\", this._handleClientError);\n if (reallyReleaseClient) {\n await reallyReleaseClient();\n }\n }\n }\n }\n\n builder.registerWatcher(\n async triggerRebuild => {\n // In case we started listening before, clean up\n if (listener) {\n await listener.stop();\n }\n // We're not worried about a race condition here.\n // eslint-disable-next-line require-atomic-updates\n listener = new Listener(triggerRebuild);\n },\n async () => {\n const l = listener;\n listener = null;\n if (l) {\n await l.stop();\n }\n }\n );\n\n builder.hook(\n \"build\",\n build => {\n const introspectionResultsByKind = introspectionResultsFromRaw(\n rawIntrospectionResultsByKind,\n build.pgAugmentIntrospectionResults\n );\n if (introspectionResultsByKind.__pgVersion < 90500) {\n // TODO:v5: remove this workaround\n // This is a bit of a hack, but until we have plugin priorities it's the\n // easiest way to conditionally support PG9.4.\n build.pgQueryFromResolveData = queryFromResolveDataFactory({\n supportsJSONB: false,\n });\n }\n return build.extend(build, {\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n });\n },\n [\"PgIntrospection\"],\n [],\n [\"PgBasics\"]\n );\n}: Plugin);\n\n// TypeScript compatibility\nexport const PgEntityKind = {\n NAMESPACE: \"namespace\",\n PROCEDURE: \"procedure\",\n CLASS: \"class\",\n TYPE: \"type\",\n ATTRIBUTE: \"attribute\",\n CONSTRAINT: \"constraint\",\n EXTENSION: \"extension\",\n INDEX: \"index\",\n};\n"],"file":"PgIntrospectionPlugin.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/plugins/PgIntrospectionPlugin.js"],"names":["debug","WATCH_FIXTURES_PATH","__dirname","readFile","filename","encoding","Promise","resolve","reject","err","res","removeQuotes","str","trimmed","trim","length","Error","substr","toLowerCase","parseSqlColumnArray","parts","split","map","parseSqlColumnString","parseConstraintSpec","rawSpec","spec","tagComponents","parsed","join","tags","description","text","smartCommentConstraints","introspectionResults","attributesByNames","tbl","cols","debugStr","attributes","attribute","filter","a","classId","id","sort","b","num","pk","constraint","find","c","type","keyAttributeNums","n","namespaceName","name","colName","attr","class","forEach","klass","namespace","namespaceId","addKey","key","isPrimary","tag","keySpec","columns","notNull","fakeConstraint","kind","isFake","isIndexed","Math","random","foreignClassId","comment","foreignKeyAttributeNums","push","primaryKey","unique","Array","isArray","getType","t","typeId","foreignKey","foreignKeys","fkSpecRaw","index","fkSpec","matches","match","rawColumns","rawSchemaOrTable","rawTableOnly","rawForeignColumns","rawSchema","rawTable","foreignSchema","foreignTable","foreignColumns","foreignKlass","k","foreignNamespace","isEnumConstraint","con","isEnumTable","isPrimaryKey","isUniqueConstraint","isExplicitEnumConstraint","enum","isPrimaryKeyOfEnumTableConstraint","hasExactlyOneColumn","enumTables","omit","isSelectable","isInsertable","isUpdatable","isDeletable","enumConstraints","enumTableColumns","descriptionColumn","enumDescription","allData","_internalEnumData","col","data","row","constraintIdent","enumTypeArray","category","domainIsNotNull","arrayItemTypeId","typeLength","isPgArray","domainBaseTypeId","domainTypeModifier","domainHasDefault","enumVariants","enumDescriptions","rangeSubTypeId","enumType","r","typeById","fkattr","deepClone","value","val","Object","keys","reduce","memo","PgIntrospectionPlugin","builder","pgConfig","pgSchemas","schemas","pgEnableTags","persistentMemoizeWithKey","fn","pgThrowOnMissingSchema","pgIncludeExtensionResources","pgLegacyFunctionsOnly","pgIgnoreRBAC","pgSkipInstallingWatchFixtures","pgOwnerConnectionString","introspect","cacheKey","version","introspectionResultsByKind","pgClient","versionResult","query","serverVersionNum","parseInt","rows","server_version_num","introspectionQuery","result","__pgVersion","procedure","extension","object","extensionConfigurationClassIds","e","configurationClassIds","isExtensionConfigurationTable","indexOf","VARCHAR_ID","TEXT_ID","CHAR_ID","BPCHAR_ID","VALID_TYPE_IDS","all","includes","hasEnumConstraints","some","z","pgSql","compile","fragment","identifier","role","user","message","freeze","knownSchemas","missingSchemas","s","errorMessage","console","warn","introspectionResultsFromRaw","rawResults","pgAugmentIntrospectionResults","xByY","arrayOfX","attrKey","x","xByYAndZ","attrKey2","namespaceById","classById","attributeByClassIdAndNum","extensionById","relate","array","newAttr","lookupAttr","lookup","missingOk","entry","innerKey","JSON","stringify","_","augment","arrayItemType","arrayType","canUseAsterisk","columnLevelSelectGrant","constraints","foreignConstraints","primaryKeyConstraint","keyAttributes","nr","foreignClass","foreignKeyAttributes","attributeNums","isUnique","every","idx","rawIntrospectionResultsByKind","listener","Listener","constructor","triggerRebuild","stopped","_handleChange","error","leading","trailing","_listener","bind","_handleClientError","_start","isReconnect","releasePgClient","client","_reallyReleaseClient","on","_releaseClient","watchSqlInner","sql","_haveDisplayedError","chalk","bold","yellow","_reconnect","setTimeout","notification","channel","payload","parse","commands","schema","command","affectsOurSchemas","schemaName","stop","cancel","clientIsStillViable","reallyReleaseClient","catch","removeListener","registerWatcher","l","hook","build","pgQueryFromResolveData","supportsJSONB","extend","pgIntrospectionResultsByKind","PgEntityKind","NAMESPACE","PROCEDURE","CLASS","TYPE","ATTRIBUTE","CONSTRAINT","EXTENSION","INDEX"],"mappings":"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","sourcesContent":["// @flow\nimport type { Plugin } from \"graphile-build\";\nimport type { Client } from \"pg\";\nimport withPgClient, {\n getPgClientAndReleaserFromConfig,\n} from \"../withPgClient\";\nimport { parseTags } from \"../utils\";\nimport { readFile as rawReadFile } from \"fs\";\nimport debugFactory from \"debug\";\nimport chalk from \"chalk\";\nimport throttle from \"lodash/throttle\";\nimport flatMap from \"lodash/flatMap\";\nimport { makeIntrospectionQuery } from \"./introspectionQuery\";\nimport * as pgSql from \"pg-sql2\";\n\nimport { version } from \"../../package.json\";\nimport queryFromResolveDataFactory from \"../queryFromResolveDataFactory\";\n\nconst debug = debugFactory(\"graphile-build-pg\");\nconst WATCH_FIXTURES_PATH = `${__dirname}/../../res/watch-fixtures.sql`;\n\n// Ref: https://github.com/graphile/postgraphile/tree/master/src/postgres/introspection/object\n\nexport type PgNamespace = {\n kind: \"namespace\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgProc = {\n kind: \"procedure\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n isStrict: boolean,\n returnsSet: boolean,\n isStable: boolean,\n returnTypeId: string,\n argTypeIds: Array<string>,\n argNames: Array<string>,\n argModes: Array<\"i\" | \"o\" | \"b\" | \"v\" | \"t\">,\n inputArgsCount: number,\n argDefaultsNum: number,\n namespace: PgNamespace,\n tags: { [string]: string },\n cost: number,\n aclExecutable: boolean,\n language: string,\n};\n\nexport type PgClass = {\n kind: \"class\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n classKind: string,\n namespaceId: string,\n namespaceName: string,\n typeId: string,\n isSelectable: boolean,\n isInsertable: boolean,\n isUpdatable: boolean,\n isDeletable: boolean,\n isExtensionConfigurationTable: boolean,\n namespace: PgNamespace,\n type: PgType,\n tags: { [string]: string },\n attributes: Array<PgAttribute>,\n constraints: Array<PgConstraint>,\n foreignConstraints: Array<PgConstraint>,\n primaryKeyConstraint: ?PgConstraint,\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n aclDeletable: boolean,\n canUseAsterisk: boolean,\n\n // eslint-disable-next-line flowtype/no-weak-types\n _internalEnumData?: any[], // This is Graphile internal, do not use this.\n};\n\nexport type PgType = {\n kind: \"type\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n type: string,\n category: string,\n domainIsNotNull: boolean,\n arrayItemTypeId: ?string,\n arrayItemType: ?PgType,\n arrayType: ?PgType,\n typeLength: ?number,\n isPgArray: boolean,\n classId: ?string,\n class: ?PgClass,\n domainBaseTypeId: ?string,\n domainBaseType: ?PgType,\n domainTypeModifier: ?number,\n domainHasDefault: boolean,\n enumVariants: ?(string[]),\n enumDescriptions: ?(string[]),\n rangeSubTypeId: ?string,\n tags: { [string]: string },\n isFake: ?boolean,\n};\n\nexport type PgAttribute = {\n kind: \"attribute\",\n classId: string,\n num: number,\n name: string,\n comment: ?string,\n description: ?string,\n typeId: string,\n typeModifier: number,\n isNotNull: boolean,\n hasDefault: boolean,\n identity: \"\" | \"a\" | \"d\",\n class: PgClass,\n type: PgType,\n namespace: PgNamespace,\n tags: { [string]: string },\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n isIndexed: ?boolean,\n isUnique: ?boolean,\n columnLevelSelectGrant: boolean,\n};\n\nexport type PgConstraint = {\n kind: \"constraint\",\n id: string,\n name: string,\n type: string,\n classId: string,\n class: PgClass,\n foreignClassId: ?string,\n foreignClass: ?PgClass,\n comment: ?string,\n description: ?string,\n keyAttributeNums: Array<number>,\n keyAttributes: Array<PgAttribute>,\n foreignKeyAttributeNums: Array<number>,\n foreignKeyAttributes: Array<PgAttribute>,\n namespace: PgNamespace,\n isIndexed: ?boolean,\n tags: { [string]: string },\n};\n\nexport type PgExtension = {\n kind: \"extension\",\n id: string,\n name: string,\n namespaceId: string,\n namespaceName: string,\n relocatable: boolean,\n version: string,\n configurationClassIds?: Array<string>,\n comment: ?string,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgIndex = {\n kind: \"index\",\n id: string,\n name: string,\n namespaceName: string,\n classId: string,\n numberOfAttributes: number,\n indexType: string,\n isUnique: boolean,\n isPrimary: boolean,\n /*\n Though these exist, we don't want to officially\n support them yet.\n\n isImmediate: boolean,\n isReplicaIdentity: boolean,\n isValid: boolean,\n */\n isPartial: boolean,\n attributeNums: Array<number>,\n attributePropertiesAsc: ?Array<boolean>,\n attributePropertiesNullsFirst: ?Array<boolean>,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgEntity =\n | PgNamespace\n | PgProc\n | PgClass\n | PgType\n | PgAttribute\n | PgConstraint\n | PgExtension\n | PgIndex;\n\nexport type PgIntrospectionResultsByKind = {\n __pgVersion: number,\n attribute: PgAttribute[],\n attributeByClassIdAndNum: {\n [classId: string]: { [num: string]: PgAttribute },\n },\n class: PgClass[],\n classById: { [classId: string]: PgClass },\n constraint: PgConstraint[],\n extension: PgExtension[],\n extensionById: { [extId: string]: PgExtension },\n index: PgIndex[],\n namespace: PgNamespace[],\n namespaceById: { [namespaceId: string]: PgNamespace },\n procedure: PgProc[],\n type: PgType[],\n typeById: { [typeId: string]: PgType },\n};\n\nfunction readFile(filename, encoding) {\n return new Promise((resolve, reject) => {\n rawReadFile(filename, encoding, (err, res) => {\n if (err) reject(err);\n else resolve(res);\n });\n });\n}\n\nconst removeQuotes = str => {\n const trimmed = str.trim();\n if (trimmed[0] === '\"') {\n if (trimmed[trimmed.length - 1] !== '\"') {\n throw new Error(\n `We failed to parse a quoted identifier '${str}'. Please avoid putting quotes or commas in smart comment identifiers (or file a PR to fix the parser).`\n );\n }\n return trimmed.substr(1, trimmed.length - 2);\n } else {\n // PostgreSQL lower-cases unquoted columns, so we should too.\n return trimmed.toLowerCase();\n }\n};\n\nconst parseSqlColumnArray = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n const parts = str.split(\",\");\n return parts.map(removeQuotes);\n};\n\nconst parseSqlColumnString = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n return removeQuotes(str);\n};\n\nfunction parseConstraintSpec(rawSpec) {\n const [spec, ...tagComponents] = rawSpec.split(/\\|/);\n const parsed = parseTags(tagComponents.join(\"\\n\"));\n return {\n spec,\n tags: parsed.tags,\n description: parsed.text,\n };\n}\n\nfunction smartCommentConstraints(introspectionResults) {\n const attributesByNames = (tbl, cols, debugStr) => {\n const attributes = introspectionResults.attribute\n .filter(a => a.classId === tbl.id)\n .sort((a, b) => a.num - b.num);\n if (!cols) {\n const pk = introspectionResults.constraint.find(\n c => c.classId == tbl.id && c.type === \"p\"\n );\n if (pk) {\n return pk.keyAttributeNums.map(n => attributes.find(a => a.num === n));\n } else {\n throw new Error(\n `No columns specified for '${tbl.namespaceName}.${tbl.name}' (oid: ${tbl.id}) and no PK found (${debugStr}).`\n );\n }\n }\n return cols.map(colName => {\n const attr = attributes.find(a => a.name === colName);\n if (!attr) {\n throw new Error(\n `Could not find attribute '${colName}' in '${tbl.namespaceName}.${tbl.name}'`\n );\n }\n return attr;\n });\n };\n\n // First: primary and unique keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n function addKey(key: string, isPrimary = false) {\n const tag = isPrimary ? \"@primaryKey\" : \"@unique\";\n if (typeof key !== \"string\") {\n if (isPrimary) {\n throw new Error(\n `${tag} configuration of '${klass.namespaceName}.${klass.name}' is invalid; please specify just once \"${tag} col1,col2\"`\n );\n }\n throw new Error(\n `${tag} configuration of '${klass.namespaceName}.${\n klass.name\n }' is invalid; expected ${\n isPrimary ? \"a string\" : \"a string or string array\"\n } but found ${typeof key}`\n );\n }\n const { spec: keySpec, tags, description } = parseConstraintSpec(key);\n const columns: string[] = parseSqlColumnArray(keySpec);\n const attributes = attributesByNames(klass, columns, `${tag} ${key}`);\n if (isPrimary) {\n attributes.forEach(attr => {\n attr.tags.notNull = true;\n });\n }\n const keyAttributeNums = attributes.map(a => a.num);\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_${tag}`,\n type: isPrimary ? \"p\" : \"u\",\n classId: klass.id,\n foreignClassId: null,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums: null,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n }\n if (klass.tags.primaryKey) {\n addKey(klass.tags.primaryKey, true);\n }\n if (klass.tags.unique) {\n if (Array.isArray(klass.tags.unique)) {\n klass.tags.unique.forEach(key => addKey(key));\n } else {\n addKey(klass.tags.unique);\n }\n }\n });\n // Now primary keys are in place, we can apply foreign keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n const getType = () =>\n introspectionResults.type.find(t => t.id === klass.typeId);\n const foreignKey = klass.tags.foreignKey || getType().tags.foreignKey;\n if (foreignKey) {\n const foreignKeys =\n typeof foreignKey === \"string\" ? [foreignKey] : foreignKey;\n if (!Array.isArray(foreignKeys)) {\n throw new Error(\n `Invalid foreign key smart comment specified on '${klass.namespaceName}.${klass.name}'`\n );\n }\n foreignKeys.forEach((fkSpecRaw, index) => {\n if (typeof fkSpecRaw !== \"string\") {\n throw new Error(\n `Invalid foreign key spec (${index}) on '${klass.namespaceName}.${klass.name}'`\n );\n }\n const { spec: fkSpec, tags, description } = parseConstraintSpec(\n fkSpecRaw\n );\n const matches = fkSpec.match(\n /^\\(([^()]+)\\) references ([^().]+)(?:\\.([^().]+))?(?:\\s*\\(([^()]+)\\))?$/i\n );\n if (!matches) {\n throw new Error(\n `Invalid foreignKey syntax for '${klass.namespaceName}.${klass.name}'; expected something like \"(col1,col2) references schema.table (c1, c2)\", you passed '${fkSpecRaw}'`\n );\n }\n const [\n ,\n rawColumns,\n rawSchemaOrTable,\n rawTableOnly,\n rawForeignColumns,\n ] = matches;\n const rawSchema = rawTableOnly\n ? rawSchemaOrTable\n : `\"${klass.namespaceName}\"`;\n const rawTable = rawTableOnly || rawSchemaOrTable;\n const columns: string[] = parseSqlColumnArray(rawColumns);\n const foreignSchema: string = parseSqlColumnString(rawSchema);\n const foreignTable: string = parseSqlColumnString(rawTable);\n const foreignColumns: string[] | null = rawForeignColumns\n ? parseSqlColumnArray(rawForeignColumns)\n : null;\n\n const foreignKlass = introspectionResults.class.find(\n k => k.name === foreignTable && k.namespaceName === foreignSchema\n );\n if (!foreignKlass) {\n throw new Error(\n `@foreignKey smart comment referenced non-existant table/view '${foreignSchema}'.'${foreignTable}'. Note that this reference must use *database names* (i.e. it does not respect @name). (${fkSpecRaw})`\n );\n }\n const foreignNamespace = introspectionResults.namespace.find(\n n => n.id === foreignKlass.namespaceId\n );\n if (!foreignNamespace) {\n return;\n }\n\n const keyAttributeNums = attributesByNames(\n klass,\n columns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n const foreignKeyAttributeNums = attributesByNames(\n foreignKlass,\n foreignColumns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_foreignKey_${index}`,\n type: \"f\", // foreign key\n classId: klass.id,\n foreignClassId: foreignKlass.id,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n });\n }\n });\n}\n\nfunction isEnumConstraint(\n klass: PgClass,\n con: PgConstraint,\n isEnumTable: boolean\n) {\n if (con.classId === klass.id) {\n const isPrimaryKey = con.type === \"p\";\n const isUniqueConstraint = con.type === \"u\";\n if (isPrimaryKey || isUniqueConstraint) {\n const isExplicitEnumConstraint =\n con.tags.enum === true || typeof con.tags.enum === \"string\";\n const isPrimaryKeyOfEnumTableConstraint = con.type === \"p\" && isEnumTable;\n if (isExplicitEnumConstraint || isPrimaryKeyOfEnumTableConstraint) {\n const hasExactlyOneColumn = con.keyAttributeNums.length === 1;\n if (!hasExactlyOneColumn) {\n throw new Error(\n `Enum table \"${klass.namespaceName}\".\"${klass.name}\" enum constraint '${con.name}' is composite; it should have exactly one column (found: ${con.keyAttributeNums.length})`\n );\n }\n return true;\n }\n }\n }\n return false;\n}\n\nfunction enumTables(introspectionResults) {\n introspectionResults.class.map(async klass => {\n const isEnumTable =\n klass.tags.enum === true || typeof klass.tags.enum === \"string\";\n\n if (isEnumTable) {\n // Prevent the table being recognised as a table\n // eslint-disable-next-line require-atomic-updates\n klass.tags.omit = true;\n // eslint-disable-next-line require-atomic-updates\n klass.isSelectable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isInsertable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isUpdatable = false;\n // eslint-disable-next-line require-atomic-updates\n klass.isDeletable = false;\n }\n\n // By this point, even views should have \"fake\" constraints we can use\n // (e.g. `@primaryKey`)\n const enumConstraints = introspectionResults.constraint.filter(con =>\n isEnumConstraint(klass, con, isEnumTable)\n );\n\n // Get all the columns\n const enumTableColumns = introspectionResults.attribute.filter(\n attr => attr.classId === klass.id\n );\n\n // Get description column\n const descriptionColumn = enumTableColumns.find(\n attr => attr.name === \"description\" || attr.tags.enumDescription\n );\n const allData = klass._internalEnumData || [];\n\n enumConstraints.forEach(constraint => {\n const col = enumTableColumns.find(\n col => col.num === constraint.keyAttributeNums[0]\n );\n if (!col) {\n // Should never happen\n throw new Error(\n \"Graphile Engine error - could not find column for enum constraint\"\n );\n }\n const data = allData.filter(row => row[col.name] != null);\n if (data.length < 1) {\n throw new Error(\n `Enum table \"${klass.namespaceName}\".\"${klass.name}\" contains no entries for enum constraint '${constraint.name}'.`\n );\n }\n\n // Create fake enum type\n const constraintIdent =\n constraint.type === \"p\" ? \"\" : `_${constraint.name}`;\n const enumTypeArray = {\n kind: \"type\",\n isFake: true,\n id: `FAKE_ENUM_${klass.namespaceName}_${klass.name}${constraintIdent}_list`,\n name: `_${klass.name}${constraintIdent}`,\n description: null,\n tags: {},\n namespaceId: klass.namespaceId,\n namespaceName: klass.namespaceName,\n type: \"b\",\n category: \"A\",\n domainIsNotNull: null,\n arrayItemTypeId: null,\n typeLength: -1,\n isPgArray: true,\n classId: null,\n domainBaseTypeId: null,\n domainTypeModifier: null,\n domainHasDefault: false,\n enumVariants: null,\n enumDescriptions: null,\n rangeSubTypeId: null,\n };\n const enumType = {\n kind: \"type\",\n isFake: true,\n id: `FAKE_ENUM_${klass.namespaceName}_${klass.name}${constraintIdent}`,\n name: `${klass.name}${constraintIdent}`,\n description: klass.description,\n tags: { ...klass.tags, ...constraint.tags },\n namespaceId: klass.namespaceId,\n namespaceName: klass.namespaceName,\n type: \"e\",\n category: \"E\",\n domainIsNotNull: null,\n arrayItemTypeId: enumTypeArray.id,\n typeLength: 4, // ???\n isPgArray: false,\n classId: null,\n domainBaseTypeId: null,\n domainTypeModifier: null,\n domainHasDefault: false,\n enumVariants: data.map(r => r[col.name]),\n enumDescriptions: descriptionColumn\n ? data.map(r => r[descriptionColumn.name])\n : null,\n // TODO: enumDescriptions\n rangeSubTypeId: null,\n };\n introspectionResults.type.push(enumType, enumTypeArray);\n introspectionResults.typeById[enumType.id] = enumType;\n introspectionResults.typeById[enumTypeArray.id] = enumTypeArray;\n\n // Change type of all attributes that reference this table to\n // reference this enum type\n introspectionResults.constraint.forEach(c => {\n if (\n c.type === \"f\" &&\n c.foreignClassId === klass.id &&\n c.foreignKeyAttributeNums.length === 1 &&\n c.foreignKeyAttributeNums[0] === col.num\n ) {\n // Get the attribute\n const fkattr = introspectionResults.attribute.find(\n attr =>\n attr.classId === c.classId && attr.num === c.keyAttributeNums[0]\n );\n if (fkattr) {\n // Override the detected type to pretend to be our enum\n fkattr.typeId = enumType.id;\n }\n }\n });\n });\n });\n}\n\n/* The argument to this must not contain cyclic references! */\nconst deepClone = value => {\n if (Array.isArray(value)) {\n return value.map(val => deepClone(val));\n } else if (typeof value === \"object\" && value) {\n return Object.keys(value).reduce((memo, k) => {\n memo[k] = deepClone(value[k]);\n return memo;\n }, {});\n } else {\n return value;\n }\n};\n\nexport default (async function PgIntrospectionPlugin(\n builder,\n {\n pgConfig,\n pgSchemas: schemas,\n pgEnableTags,\n persistentMemoizeWithKey = (key, fn) => fn(),\n pgThrowOnMissingSchema = false,\n pgIncludeExtensionResources = false,\n pgLegacyFunctionsOnly = false,\n pgIgnoreRBAC = true,\n pgSkipInstallingWatchFixtures = false,\n pgOwnerConnectionString,\n }\n) {\n /**\n * Introspect database and get the table/view/constraints.\n */\n async function introspect(): Promise<PgIntrospectionResultsByKind> {\n // Perform introspection\n if (!Array.isArray(schemas)) {\n throw new Error(\"Argument 'schemas' (array) is required\");\n }\n const cacheKey = `PgIntrospectionPlugin-introspectionResultsByKind-v${version}`;\n const introspectionResultsByKind = deepClone(\n await persistentMemoizeWithKey(cacheKey, () =>\n withPgClient(pgConfig, async pgClient => {\n const versionResult = await pgClient.query(\n \"show server_version_num;\"\n );\n const serverVersionNum = parseInt(\n versionResult.rows[0].server_version_num,\n 10\n );\n const introspectionQuery = makeIntrospectionQuery(serverVersionNum, {\n pgLegacyFunctionsOnly,\n pgIgnoreRBAC,\n });\n const { rows } = await pgClient.query(introspectionQuery, [\n schemas,\n pgIncludeExtensionResources,\n ]);\n\n const result = {\n __pgVersion: serverVersionNum,\n namespace: [],\n class: [],\n attribute: [],\n type: [],\n constraint: [],\n procedure: [],\n extension: [],\n index: [],\n };\n for (const { object } of rows) {\n result[object.kind].push(object);\n }\n\n // Parse tags from comments\n [\n \"namespace\",\n \"class\",\n \"attribute\",\n \"type\",\n \"constraint\",\n \"procedure\",\n \"extension\",\n \"index\",\n ].forEach(kind => {\n result[kind].forEach(object => {\n // Keep a copy of the raw comment\n object.comment = object.description;\n if (pgEnableTags && object.description) {\n const parsed = parseTags(object.description);\n object.tags = parsed.tags;\n object.description = parsed.text;\n } else {\n object.tags = {};\n }\n });\n });\n\n const extensionConfigurationClassIds = flatMap(\n result.extension,\n e => e.configurationClassIds\n );\n result.class.forEach(klass => {\n klass.isExtensionConfigurationTable =\n extensionConfigurationClassIds.indexOf(klass.id) >= 0;\n });\n\n // Assert the columns are text\n const VARCHAR_ID = \"1043\";\n const TEXT_ID = \"25\";\n const CHAR_ID = \"18\";\n const BPCHAR_ID = \"1042\";\n\n const VALID_TYPE_IDS = [VARCHAR_ID, TEXT_ID, CHAR_ID, BPCHAR_ID];\n\n await Promise.all(\n result.class.map(async klass => {\n if (!schemas.includes(klass.namespaceName)) {\n // Only support enums in public tables/views\n return;\n }\n const isEnumTable =\n klass.tags.enum === true || typeof klass.tags.enum === \"string\";\n\n // NOTE: this only matches on tables (not views, since they don't\n // have constraints), which is why we repeat the isEnumTable check below.\n const hasEnumConstraints = result.constraint.some(con =>\n isEnumConstraint(klass, con, isEnumTable)\n );\n if (isEnumTable || hasEnumConstraints) {\n // Get the list of columns enums are defined for\n const enumTableColumns = result.attribute\n .filter(\n attr =>\n attr.classId === klass.id &&\n VALID_TYPE_IDS.includes(attr.typeId)\n )\n .sort((a, z) => a.num - z.num);\n\n // Load data from the table/view.\n const query = pgSql.compile(\n pgSql.fragment`select ${pgSql.join(\n enumTableColumns.map(col => pgSql.identifier(col.name)),\n \", \"\n )} from ${pgSql.identifier(klass.namespaceName, klass.name)};`\n );\n\n let allData;\n try {\n ({ rows: allData } = await pgClient.query(query));\n } catch (e) {\n let role = \"RELEVANT_POSTGRES_USER\";\n try {\n const {\n rows: [{ user }],\n } = await pgClient.query(\"select user;\");\n role = user;\n } catch (e) {\n /*\n * Ignore; this is likely a 25P02 (transaction aborted)\n * error caused by the statement above failing.\n */\n }\n throw new Error(`Introspection could not read from enum table \"${klass.namespaceName}\".\"${klass.name}\", perhaps you need to grant access:\n\n GRANT USAGE ON SCHEMA \"${klass.namespaceName}\" TO \"${role}\";\n GRANT SELECT ON \"${klass.namespaceName}\".\"${klass.name}\" TO \"${role}\";\n\nOriginal error: ${e.message}\n`);\n }\n\n klass._internalEnumData = allData;\n }\n })\n );\n\n [\n \"namespace\",\n \"class\",\n \"attribute\",\n \"type\",\n \"constraint\",\n \"procedure\",\n \"extension\",\n \"index\",\n ].forEach(k => {\n result[k].forEach(Object.freeze);\n });\n\n return Object.freeze(result);\n })\n )\n );\n\n const knownSchemas = introspectionResultsByKind.namespace.map(n => n.name);\n const missingSchemas = schemas.filter(s => knownSchemas.indexOf(s) < 0);\n if (missingSchemas.length) {\n const errorMessage = `You requested to use schema '${schemas.join(\n \"', '\"\n )}'; however we couldn't find some of those! Missing schemas are: '${missingSchemas.join(\n \"', '\"\n )}'`;\n if (pgThrowOnMissingSchema) {\n throw new Error(errorMessage);\n } else {\n console.warn(\"⚠️ WARNING⚠️ \" + errorMessage); // eslint-disable-line no-console\n }\n }\n return introspectionResultsByKind;\n }\n\n function introspectionResultsFromRaw(\n rawResults,\n pgAugmentIntrospectionResults\n ) {\n const introspectionResultsByKind = deepClone(rawResults);\n\n const xByY = (arrayOfX, attrKey) =>\n arrayOfX.reduce((memo, x) => {\n memo[x[attrKey]] = x;\n return memo;\n }, {});\n const xByYAndZ = (arrayOfX, attrKey, attrKey2) =>\n arrayOfX.reduce((memo, x) => {\n if (!memo[x[attrKey]]) memo[x[attrKey]] = {};\n memo[x[attrKey]][x[attrKey2]] = x;\n return memo;\n }, {});\n introspectionResultsByKind.namespaceById = xByY(\n introspectionResultsByKind.namespace,\n \"id\"\n );\n introspectionResultsByKind.classById = xByY(\n introspectionResultsByKind.class,\n \"id\"\n );\n introspectionResultsByKind.typeById = xByY(\n introspectionResultsByKind.type,\n \"id\"\n );\n introspectionResultsByKind.attributeByClassIdAndNum = xByYAndZ(\n introspectionResultsByKind.attribute,\n \"classId\",\n \"num\"\n );\n introspectionResultsByKind.extensionById = xByY(\n introspectionResultsByKind.extension,\n \"id\"\n );\n\n const relate = (array, newAttr, lookupAttr, lookup, missingOk = false) => {\n array.forEach(entry => {\n const key = entry[lookupAttr];\n if (Array.isArray(key)) {\n entry[newAttr] = key\n .map(innerKey => {\n const result = lookup[innerKey];\n if (innerKey && !result) {\n if (missingOk) {\n return;\n }\n throw new Error(\n `Could not look up '${newAttr}' by '${lookupAttr}' ('${innerKey}') on '${JSON.stringify(\n entry\n )}'`\n );\n }\n return result;\n })\n .filter(_ => _);\n } else {\n const result = lookup[key];\n if (key && !result) {\n if (missingOk) {\n return;\n }\n throw new Error(\n `Could not look up '${newAttr}' by '${lookupAttr}' (= '${key}') on '${JSON.stringify(\n entry\n )}'`\n );\n }\n entry[newAttr] = result;\n }\n });\n };\n\n const augment = introspectionResults => {\n [\n pgAugmentIntrospectionResults,\n smartCommentConstraints,\n enumTables,\n ].forEach(fn => (fn ? fn(introspectionResults) : null));\n };\n augment(introspectionResultsByKind);\n\n relate(\n introspectionResultsByKind.class,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById,\n true // Because it could be a type defined in a different namespace - which is fine so long as we don't allow querying it directly\n );\n\n relate(\n introspectionResultsByKind.class,\n \"type\",\n \"typeId\",\n introspectionResultsByKind.typeById\n );\n\n relate(\n introspectionResultsByKind.attribute,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n relate(\n introspectionResultsByKind.attribute,\n \"type\",\n \"typeId\",\n introspectionResultsByKind.typeById\n );\n\n relate(\n introspectionResultsByKind.procedure,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById\n );\n\n relate(\n introspectionResultsByKind.type,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById,\n true\n );\n\n relate(\n introspectionResultsByKind.type,\n \"domainBaseType\",\n \"domainBaseTypeId\",\n introspectionResultsByKind.typeById,\n true // Because not all types are domains\n );\n\n relate(\n introspectionResultsByKind.type,\n \"arrayItemType\",\n \"arrayItemTypeId\",\n introspectionResultsByKind.typeById,\n true // Because not all types are arrays\n );\n\n relate(\n introspectionResultsByKind.constraint,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n relate(\n introspectionResultsByKind.constraint,\n \"foreignClass\",\n \"foreignClassId\",\n introspectionResultsByKind.classById,\n true // Because many constraints don't apply to foreign classes\n );\n\n relate(\n introspectionResultsByKind.extension,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById,\n true // Because the extension could be a defined in a different namespace\n );\n\n relate(\n introspectionResultsByKind.extension,\n \"configurationClasses\",\n \"configurationClassIds\",\n introspectionResultsByKind.classById,\n true // Because the configuration table could be a defined in a different namespace\n );\n\n relate(\n introspectionResultsByKind.index,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n // Reverse arrayItemType -> arrayType\n introspectionResultsByKind.type.forEach(type => {\n if (type.arrayItemType) {\n type.arrayItemType.arrayType = type;\n }\n });\n\n // Table/type columns / constraints\n introspectionResultsByKind.class.forEach(klass => {\n klass.attributes = introspectionResultsByKind.attribute.filter(\n attr => attr.classId === klass.id\n );\n klass.canUseAsterisk = !klass.attributes.some(\n attr => attr.columnLevelSelectGrant\n );\n klass.constraints = introspectionResultsByKind.constraint.filter(\n constraint => constraint.classId === klass.id\n );\n klass.foreignConstraints = introspectionResultsByKind.constraint.filter(\n constraint => constraint.foreignClassId === klass.id\n );\n klass.primaryKeyConstraint = klass.constraints.find(\n constraint => constraint.type === \"p\"\n );\n });\n\n // Constraint attributes\n introspectionResultsByKind.constraint.forEach(constraint => {\n if (constraint.keyAttributeNums && constraint.class) {\n constraint.keyAttributes = constraint.keyAttributeNums.map(nr =>\n constraint.class.attributes.find(attr => attr.num === nr)\n );\n } else {\n constraint.keyAttributes = [];\n }\n if (constraint.foreignKeyAttributeNums && constraint.foreignClass) {\n constraint.foreignKeyAttributes = constraint.foreignKeyAttributeNums.map(\n nr => constraint.foreignClass.attributes.find(attr => attr.num === nr)\n );\n } else {\n constraint.foreignKeyAttributes = [];\n }\n });\n\n // Detect which columns and constraints are indexed\n introspectionResultsByKind.index.forEach(index => {\n const columns = index.attributeNums.map(nr =>\n index.class.attributes.find(attr => attr.num === nr)\n );\n\n // Indexed column (for orderBy / filter):\n if (columns[0]) {\n columns[0].isIndexed = true;\n }\n\n if (columns[0] && columns.length === 1 && index.isUnique) {\n columns[0].isUnique = true;\n }\n\n // Indexed constraints (for reverse relations):\n index.class.constraints\n .filter(constraint => constraint.type === \"f\")\n .forEach(constraint => {\n if (\n constraint.keyAttributeNums.every(\n (nr, idx) => index.attributeNums[idx] === nr\n )\n ) {\n constraint.isIndexed = true;\n }\n });\n });\n\n return introspectionResultsByKind;\n }\n\n let rawIntrospectionResultsByKind = await introspect();\n\n let listener;\n\n class Listener {\n _handleChange: () => void;\n client: Client | null;\n stopped: boolean;\n _reallyReleaseClient: (() => Promise<void>) | null;\n _haveDisplayedError: boolean;\n constructor(triggerRebuild) {\n this.stopped = false;\n this._handleChange = throttle(\n async () => {\n debug(`Schema change detected: re-inspecting schema...`);\n try {\n rawIntrospectionResultsByKind = await introspect();\n debug(`Schema change detected: re-inspecting schema complete`);\n triggerRebuild();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(`Schema introspection failed: ${e.message}`);\n }\n },\n 750,\n {\n leading: true,\n trailing: true,\n }\n );\n this._listener = this._listener.bind(this);\n this._handleClientError = this._handleClientError.bind(this);\n this._start();\n }\n\n async _start(isReconnect = false) {\n if (this.stopped) {\n return;\n }\n // Connect to DB\n try {\n const {\n pgClient,\n releasePgClient,\n } = await getPgClientAndReleaserFromConfig(pgConfig);\n this.client = pgClient;\n // $FlowFixMe: hack property\n this._reallyReleaseClient = releasePgClient;\n pgClient.on(\"notification\", this._listener);\n pgClient.on(\"error\", this._handleClientError);\n if (this.stopped) {\n // In case watch mode was cancelled in the interrim.\n return this._releaseClient();\n } else {\n await pgClient.query(\"listen postgraphile_watch\");\n\n // Install the watch fixtures.\n if (!pgSkipInstallingWatchFixtures) {\n const watchSqlInner = await readFile(WATCH_FIXTURES_PATH, \"utf8\");\n const sql = `begin; ${watchSqlInner};`;\n await withPgClient(\n pgOwnerConnectionString || pgConfig,\n async pgClient => {\n try {\n await pgClient.query(sql);\n } catch (error) {\n if (!this._haveDisplayedError) {\n this._haveDisplayedError = true;\n /* eslint-disable no-console */\n console.warn(\n `${chalk.bold.yellow(\n \"Failed to setup watch fixtures in Postgres database\"\n )} ️️⚠️`\n );\n console.warn(\n chalk.yellow(\n \"This is likely because the PostgreSQL user in the connection string does not have sufficient privileges; you can solve this by passing the 'owner' connection string via '--owner-connection' / 'ownerConnectionString'. If the fixtures already exist, the watch functionality may still work.\"\n )\n );\n console.warn(\n chalk.yellow(\n \"Enable DEBUG='graphile-build-pg' to see the error\"\n )\n );\n /* eslint-enable no-console */\n }\n debug(error);\n } finally {\n await pgClient.query(\"commit;\");\n }\n }\n );\n }\n\n // Trigger re-introspection on server reconnect\n if (isReconnect) {\n this._handleChange();\n }\n }\n } catch (e) {\n // If something goes wrong, disconnect and try again after a short delay\n this._reconnect(e);\n }\n }\n\n _handleClientError: (e: Error) => void;\n _handleClientError(e) {\n this._releaseClient(false);\n this._reconnect(e);\n }\n async _reconnect(e) {\n if (this.stopped) {\n return;\n }\n // eslint-disable-next-line no-console\n console.error(\n \"Error occurred for PG watching client; reconnecting in 2 seconds.\",\n e.message\n );\n await this._releaseClient();\n setTimeout(() => {\n if (!this.stopped) {\n // Listen for further changes\n this._start(true);\n }\n }, 2000);\n }\n\n // eslint-disable-next-line flowtype/no-weak-types\n _listener: (notification: any) => void;\n // eslint-disable-next-line flowtype/no-weak-types\n async _listener(notification: any) {\n if (notification.channel !== \"postgraphile_watch\") {\n return;\n }\n try {\n const payload = JSON.parse(notification.payload);\n payload.payload = payload.payload || [];\n if (payload.type === \"ddl\") {\n const commands = payload.payload\n .filter(\n ({ schema }) => schema == null || schemas.indexOf(schema) >= 0\n )\n .map(({ command }) => command);\n if (commands.length) {\n this._handleChange();\n }\n } else if (payload.type === \"drop\") {\n const affectsOurSchemas = payload.payload.some(\n schemaName => schemas.indexOf(schemaName) >= 0\n );\n if (affectsOurSchemas) {\n this._handleChange();\n }\n } else if (payload.type === \"manual\") {\n this._handleChange();\n } else {\n throw new Error(`Payload type '${payload.type}' not recognised`);\n }\n } catch (e) {\n debug(`Error occurred parsing notification payload: ${e}`);\n }\n }\n\n async stop() {\n this.stopped = true;\n this._handleChange.cancel();\n await this._releaseClient();\n }\n\n /**\n * Only pass `false` to this function if you know the client is going to be\n * terminated; otherwise we risk leaving listeners running.\n */\n async _releaseClient(clientIsStillViable = true) {\n // $FlowFixMe\n const pgClient = this.client;\n const reallyReleaseClient = this._reallyReleaseClient;\n this.client = null;\n this._reallyReleaseClient = null;\n if (pgClient) {\n // Don't attempt to run a query after a client has errored.\n if (clientIsStillViable) {\n pgClient.query(\"unlisten postgraphile_watch\").catch(e => {\n debug(`Error occurred trying to unlisten watch: ${e}`);\n });\n }\n pgClient.removeListener(\"notification\", this._listener);\n pgClient.removeListener(\"error\", this._handleClientError);\n }\n if (reallyReleaseClient) {\n await reallyReleaseClient();\n }\n }\n }\n\n builder.registerWatcher(\n async triggerRebuild => {\n // In case we started listening before, clean up\n if (listener) {\n await listener.stop();\n }\n // We're not worried about a race condition here.\n // eslint-disable-next-line require-atomic-updates\n listener = new Listener(triggerRebuild);\n },\n async () => {\n const l = listener;\n listener = null;\n if (l) {\n await l.stop();\n }\n }\n );\n\n builder.hook(\n \"build\",\n build => {\n const introspectionResultsByKind = introspectionResultsFromRaw(\n rawIntrospectionResultsByKind,\n build.pgAugmentIntrospectionResults\n );\n if (introspectionResultsByKind.__pgVersion < 90500) {\n // TODO:v5: remove this workaround\n // This is a bit of a hack, but until we have plugin priorities it's the\n // easiest way to conditionally support PG9.4.\n build.pgQueryFromResolveData = queryFromResolveDataFactory({\n supportsJSONB: false,\n });\n }\n return build.extend(build, {\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n });\n },\n [\"PgIntrospection\"],\n [],\n [\"PgBasics\"]\n );\n}: Plugin);\n\n// TypeScript compatibility\nexport const PgEntityKind = {\n NAMESPACE: \"namespace\",\n PROCEDURE: \"procedure\",\n CLASS: \"class\",\n TYPE: \"type\",\n ATTRIBUTE: \"attribute\",\n CONSTRAINT: \"constraint\",\n EXTENSION: \"extension\",\n INDEX: \"index\",\n};\n"],"file":"PgIntrospectionPlugin.js"}
|
|
@@ -63,7 +63,7 @@ var PgJWTPlugin = function PgJWTPlugin(builder, {
|
|
|
63
63
|
pgRegisterGqlTypeByTypeId(compositeType.id, cb => {
|
|
64
64
|
const JWTType = newWithHooks(GraphQLScalarType, {
|
|
65
65
|
name: compositeTypeName,
|
|
66
|
-
description: "A JSON Web Token defined by [RFC 7519](https://tools.ietf.org/html/rfc7519) which securely represents claims between two parties.",
|
|
66
|
+
description: build.wrapDescription("A JSON Web Token defined by [RFC 7519](https://tools.ietf.org/html/rfc7519) which securely represents claims between two parties.", "type"),
|
|
67
67
|
|
|
68
68
|
serialize(value) {
|
|
69
69
|
const token = attributes.reduce((memo, attr) => {
|
|
@@ -66,8 +66,10 @@ export default (function PgJWTPlugin(
|
|
|
66
66
|
GraphQLScalarType,
|
|
67
67
|
{
|
|
68
68
|
name: compositeTypeName,
|
|
69
|
-
description:
|
|
69
|
+
description: build.wrapDescription(
|
|
70
70
|
"A JSON Web Token defined by [RFC 7519](https://tools.ietf.org/html/rfc7519) which securely represents claims between two parties.",
|
|
71
|
+
"type"
|
|
72
|
+
),
|
|
71
73
|
serialize(value) {
|
|
72
74
|
const token = attributes.reduce((memo, attr) => {
|
|
73
75
|
if (attr.name === "exp") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugins/PgJWTPlugin.js"],"names":["PgJWTPlugin","builder","pgJwtTypeIdentifier","pgJwtSecret","pgJwtSignOptions","hook","_","build","newWithHooks","pgSql","sql","pgIntrospectionResultsByKind","introspectionResultsByKind","pgRegisterGqlTypeByTypeId","pg2GqlMapper","pgTweaksByTypeId","pgTweakFragmentForTypeAndModifier","graphql","GraphQLScalarType","inflection","pgParseIdentifier","parseIdentifier","describePgEntity","Error","namespaceName","entityName","typeName","compositeClass","class","find","table","isSelectable","isInsertable","isUpdatable","isDeletable","name","compositeType","type","id","attributes","compositeTypeName","tableType","cb","JWTType","description","serialize","value","token","reduce","memo","attr","parseFloat","undefined","Object","assign","aud","audience","iss","issuer","exp","expiresIn","__origin","isPgJwtType","map","values","some","v","unmap","fragment","join","literal","identifier","typeModifier"],"mappings":";;;;;;;AAEA;;IAEyBA,W,GAAT,SAASA,WAAT,CACdC,OADc,EAEd;AAAEC,EAAAA,mBAAF;AAAuBC,EAAAA,WAAvB;AAAoCC,EAAAA;AAApC,CAFc,EAGd;AACAH,EAAAA,OAAO,CAACI,IAAR,CACE,MADF,EAEE,CAACC,CAAD,EAAIC,KAAJ,KAAc;AACZ,UAAM;AACJC,MAAAA,YADI;AAEJC,MAAAA,KAAK,EAAEC,GAFH;AAGJC,MAAAA,4BAA4B,EAAEC,0BAH1B;AAIJC,MAAAA,yBAJI;AAKJC,MAAAA,YALI;AAMJC,MAAAA,gBANI;AAOJC,MAAAA,iCAPI;AAQJC,MAAAA,OAAO,EAAE;AAAEC,QAAAA;AAAF,OARL;AASJC,MAAAA,UATI;AAUJC,MAAAA,iBAAiB,EAAEC,eAVf;AAWJC,MAAAA;AAXI,QAYFf,KAZJ;;AAcA,QAAI,CAACL,mBAAL,EAA0B;AACxB,aAAOI,CAAP;AACD;;AACD,QAAI,CAACH,WAAL,EAAkB;AAChB,YAAM,IAAIoB,KAAJ,CACJ,uDADI,CAAN;AAGD;;AACD,UAAM;AAAEC,MAAAA,aAAF;AAAiBC,MAAAA,UAAU,EAAEC;AAA7B,QAA0CL,eAAe,CAC7DnB,mBAD6D,CAA/D;AAIA,UAAMyB,cAAc,GAAGf,0BAA0B,CAACgB,KAA3B,CAAiCC,IAAjC,CACrBC,KAAK,IACH,CAACA,KAAK,CAACC,YAAP,IACA,CAACD,KAAK,CAACE,YADP,IAEA,CAACF,KAAK,CAACG,WAFP,IAGA,CAACH,KAAK,CAACI,WAHP,IAIAJ,KAAK,CAACK,IAAN,KAAeT,QAJf,IAKAI,KAAK,CAACN,aAAN,KAAwBA,aAPL,CAAvB;;AASA,QAAI,CAACG,cAAL,EAAqB;AACnB,YAAM,IAAIJ,KAAJ,CACH,6BAA4BC,aAAc,MAAKE,QAAS,IADrD,CAAN;AAGD;;AACD,UAAMU,aAAa,GAAGT,cAAc,CAACU,IAArC;;AACA,QAAI,CAACD,aAAL,EAAoB;AAClB,YAAM,IAAIb,KAAJ,CAAU,2CAAV,CAAN;AACD;;AACD,QAAIT,YAAY,CAACsB,aAAa,CAACE,EAAf,CAAhB,EAAoC;AAClC,YAAM,IAAIf,KAAJ,CAAU,uCAAV,CAAN;AACD;;AACD,UAAMgB,UAAU,GAAGZ,cAAc,CAACY,UAAlC;AAEA,UAAMC,iBAAiB,GAAGrB,UAAU,CAACsB,SAAX,CAAqBd,cAArB,CAA1B,CAlDY,CAoDZ;;AACAd,IAAAA,yBAAyB,CAACuB,aAAa,CAACE,EAAf,EAAmBI,EAAE,IAAI;AAChD,YAAMC,OAAO,GAAGnC,YAAY,CAC1BU,iBAD0B,EAE1B;AACEiB,QAAAA,IAAI,EAAEK,iBADR;AAEEI,QAAAA,WAAW,
|
|
1
|
+
{"version":3,"sources":["../../src/plugins/PgJWTPlugin.js"],"names":["PgJWTPlugin","builder","pgJwtTypeIdentifier","pgJwtSecret","pgJwtSignOptions","hook","_","build","newWithHooks","pgSql","sql","pgIntrospectionResultsByKind","introspectionResultsByKind","pgRegisterGqlTypeByTypeId","pg2GqlMapper","pgTweaksByTypeId","pgTweakFragmentForTypeAndModifier","graphql","GraphQLScalarType","inflection","pgParseIdentifier","parseIdentifier","describePgEntity","Error","namespaceName","entityName","typeName","compositeClass","class","find","table","isSelectable","isInsertable","isUpdatable","isDeletable","name","compositeType","type","id","attributes","compositeTypeName","tableType","cb","JWTType","description","wrapDescription","serialize","value","token","reduce","memo","attr","parseFloat","undefined","Object","assign","aud","audience","iss","issuer","exp","expiresIn","__origin","isPgJwtType","map","values","some","v","unmap","fragment","join","literal","identifier","typeModifier"],"mappings":"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","sourcesContent":["// @flow\nimport type { Plugin } from \"graphile-build\";\nimport { sign as signJwt } from \"jsonwebtoken\";\n\nexport default (function PgJWTPlugin(\n builder,\n { pgJwtTypeIdentifier, pgJwtSecret, pgJwtSignOptions }\n) {\n builder.hook(\n \"init\",\n (_, build) => {\n const {\n newWithHooks,\n pgSql: sql,\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n pgRegisterGqlTypeByTypeId,\n pg2GqlMapper,\n pgTweaksByTypeId,\n pgTweakFragmentForTypeAndModifier,\n graphql: { GraphQLScalarType },\n inflection,\n pgParseIdentifier: parseIdentifier,\n describePgEntity,\n } = build;\n\n if (!pgJwtTypeIdentifier) {\n return _;\n }\n if (!pgJwtSecret) {\n throw new Error(\n \"pgJwtTypeIdentifier was specified without pgJwtSecret\"\n );\n }\n const { namespaceName, entityName: typeName } = parseIdentifier(\n pgJwtTypeIdentifier\n );\n\n const compositeClass = introspectionResultsByKind.class.find(\n table =>\n !table.isSelectable &&\n !table.isInsertable &&\n !table.isUpdatable &&\n !table.isDeletable &&\n table.name === typeName &&\n table.namespaceName === namespaceName\n );\n if (!compositeClass) {\n throw new Error(\n `Could not find JWT type '\"${namespaceName}\".\"${typeName}\"'`\n );\n }\n const compositeType = compositeClass.type;\n if (!compositeType) {\n throw new Error(\"Could not determine the type for JWT type\");\n }\n if (pg2GqlMapper[compositeType.id]) {\n throw new Error(\"JWT type has already been overridden?\");\n }\n const attributes = compositeClass.attributes;\n\n const compositeTypeName = inflection.tableType(compositeClass);\n\n // NOTE: we deliberately do not create an input type\n pgRegisterGqlTypeByTypeId(compositeType.id, cb => {\n const JWTType = newWithHooks(\n GraphQLScalarType,\n {\n name: compositeTypeName,\n description: build.wrapDescription(\n \"A JSON Web Token defined by [RFC 7519](https://tools.ietf.org/html/rfc7519) which securely represents claims between two parties.\",\n \"type\"\n ),\n serialize(value) {\n const token = attributes.reduce((memo, attr) => {\n if (attr.name === \"exp\") {\n memo[attr.name] = value[attr.name]\n ? parseFloat(value[attr.name])\n : undefined;\n } else {\n memo[attr.name] = value[attr.name];\n }\n return memo;\n }, {});\n return signJwt(\n token,\n pgJwtSecret,\n Object.assign(\n {},\n pgJwtSignOptions,\n token.aud || (pgJwtSignOptions && pgJwtSignOptions.audience)\n ? null\n : {\n audience: \"postgraphile\",\n },\n token.iss || (pgJwtSignOptions && pgJwtSignOptions.issuer)\n ? null\n : {\n issuer: \"postgraphile\",\n },\n token.exp || (pgJwtSignOptions && pgJwtSignOptions.expiresIn)\n ? null\n : {\n expiresIn: \"1 day\",\n }\n )\n );\n },\n },\n {\n __origin: `Adding JWT type based on ${describePgEntity(\n compositeType\n )}`,\n isPgJwtType: true,\n }\n );\n cb(JWTType);\n\n pg2GqlMapper[compositeType.id] = {\n map: value => {\n if (!value) return null;\n const values = Object.values(value);\n if (values.some(v => v != null)) {\n return value;\n }\n return null;\n },\n unmap: () => {\n throw new Error(\n \"We don't support passing a JWT token into GraphQL currently\"\n );\n },\n };\n\n pgTweaksByTypeId[compositeType.id] = fragment =>\n sql.fragment`json_build_object(${sql.join(\n compositeClass.attributes.map(\n attr =>\n sql.fragment`${sql.literal(\n attr.name\n )}::text, ${pgTweakFragmentForTypeAndModifier(\n sql.fragment`(${fragment}).${sql.identifier(attr.name)}`,\n attr.type,\n attr.typeModifier,\n {}\n )}`\n ),\n \", \"\n )})`;\n });\n return _;\n },\n [\"PgJWT\"],\n [],\n [\"PgIntrospection\"]\n );\n}: Plugin);\n"],"file":"PgJWTPlugin.js"}
|
|
@@ -75,15 +75,15 @@ var PgMutationCreatePlugin = function PgMutationCreatePlugin(builder, {
|
|
|
75
75
|
const tableTypeName = inflection.tableType(table);
|
|
76
76
|
const InputType = newWithHooks(GraphQLInputObjectType, {
|
|
77
77
|
name: inflection.createInputType(table),
|
|
78
|
-
description: `All input for the create \`${tableTypeName}\` mutation.`,
|
|
78
|
+
description: build.wrapDescription(`All input for the create \`${tableTypeName}\` mutation.`, "type"),
|
|
79
79
|
fields: {
|
|
80
80
|
clientMutationId: {
|
|
81
|
-
description: "An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client.",
|
|
81
|
+
description: build.wrapDescription("An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client.", "field"),
|
|
82
82
|
type: GraphQLString
|
|
83
83
|
},
|
|
84
84
|
...(TableInput ? {
|
|
85
85
|
[inflection.tableFieldName(table)]: {
|
|
86
|
-
description: `The \`${tableTypeName}\` to be created by this mutation.`,
|
|
86
|
+
description: build.wrapDescription(`The \`${tableTypeName}\` to be created by this mutation.`, "field"),
|
|
87
87
|
type: new GraphQLNonNull(TableInput)
|
|
88
88
|
}
|
|
89
89
|
} : null)
|
|
@@ -99,18 +99,18 @@ var PgMutationCreatePlugin = function PgMutationCreatePlugin(builder, {
|
|
|
99
99
|
});
|
|
100
100
|
const PayloadType = newWithHooks(GraphQLObjectType, {
|
|
101
101
|
name: inflection.createPayloadType(table),
|
|
102
|
-
description: `The output of our create \`${tableTypeName}\` mutation.`,
|
|
102
|
+
description: build.wrapDescription(`The output of our create \`${tableTypeName}\` mutation.`, "type"),
|
|
103
103
|
fields: ({
|
|
104
104
|
fieldWithHooks
|
|
105
105
|
}) => {
|
|
106
106
|
const tableName = inflection.tableFieldName(table);
|
|
107
107
|
return {
|
|
108
108
|
clientMutationId: {
|
|
109
|
-
description: "The exact same `clientMutationId` that was provided in the mutation input, unchanged and unused. May be used by a client to track mutations.",
|
|
109
|
+
description: build.wrapDescription("The exact same `clientMutationId` that was provided in the mutation input, unchanged and unused. May be used by a client to track mutations.", "field"),
|
|
110
110
|
type: GraphQLString
|
|
111
111
|
},
|
|
112
112
|
[tableName]: pgField(build, fieldWithHooks, tableName, {
|
|
113
|
-
description: `The \`${tableTypeName}\` that was created by this mutation.`,
|
|
113
|
+
description: build.wrapDescription(`The \`${tableTypeName}\` that was created by this mutation.`, "field"),
|
|
114
114
|
type: Table
|
|
115
115
|
}, {
|
|
116
116
|
isPgCreatePayloadResultField: true,
|
|
@@ -136,7 +136,7 @@ var PgMutationCreatePlugin = function PgMutationCreatePlugin(builder, {
|
|
|
136
136
|
} = context;
|
|
137
137
|
const relevantAttributes = table.attributes.filter(attr => pgColumnFilter(attr, build, context) && !omit(attr, "create"));
|
|
138
138
|
return {
|
|
139
|
-
description: `Creates a single \`${tableTypeName}\`.`,
|
|
139
|
+
description: build.wrapDescription(`Creates a single \`${tableTypeName}\`.`, "field"),
|
|
140
140
|
type: PayloadType,
|
|
141
141
|
args: {
|
|
142
142
|
input: {
|
|
@@ -77,17 +77,25 @@ export default (function PgMutationCreatePlugin(
|
|
|
77
77
|
GraphQLInputObjectType,
|
|
78
78
|
{
|
|
79
79
|
name: inflection.createInputType(table),
|
|
80
|
-
description:
|
|
80
|
+
description: build.wrapDescription(
|
|
81
|
+
`All input for the create \`${tableTypeName}\` mutation.`,
|
|
82
|
+
"type"
|
|
83
|
+
),
|
|
81
84
|
fields: {
|
|
82
85
|
clientMutationId: {
|
|
83
|
-
description:
|
|
86
|
+
description: build.wrapDescription(
|
|
84
87
|
"An arbitrary string value with no semantic meaning. Will be included in the payload verbatim. May be used to track mutations by the client.",
|
|
88
|
+
"field"
|
|
89
|
+
),
|
|
85
90
|
type: GraphQLString,
|
|
86
91
|
},
|
|
87
92
|
...(TableInput
|
|
88
93
|
? {
|
|
89
94
|
[inflection.tableFieldName(table)]: {
|
|
90
|
-
description:
|
|
95
|
+
description: build.wrapDescription(
|
|
96
|
+
`The \`${tableTypeName}\` to be created by this mutation.`,
|
|
97
|
+
"field"
|
|
98
|
+
),
|
|
91
99
|
type: new GraphQLNonNull(TableInput),
|
|
92
100
|
},
|
|
93
101
|
}
|
|
@@ -112,13 +120,18 @@ export default (function PgMutationCreatePlugin(
|
|
|
112
120
|
GraphQLObjectType,
|
|
113
121
|
{
|
|
114
122
|
name: inflection.createPayloadType(table),
|
|
115
|
-
description:
|
|
123
|
+
description: build.wrapDescription(
|
|
124
|
+
`The output of our create \`${tableTypeName}\` mutation.`,
|
|
125
|
+
"type"
|
|
126
|
+
),
|
|
116
127
|
fields: ({ fieldWithHooks }) => {
|
|
117
128
|
const tableName = inflection.tableFieldName(table);
|
|
118
129
|
return {
|
|
119
130
|
clientMutationId: {
|
|
120
|
-
description:
|
|
131
|
+
description: build.wrapDescription(
|
|
121
132
|
"The exact same `clientMutationId` that was provided in the mutation input, unchanged and unused. May be used by a client to track mutations.",
|
|
133
|
+
"field"
|
|
134
|
+
),
|
|
122
135
|
type: GraphQLString,
|
|
123
136
|
},
|
|
124
137
|
[tableName]: pgField(
|
|
@@ -126,7 +139,10 @@ export default (function PgMutationCreatePlugin(
|
|
|
126
139
|
fieldWithHooks,
|
|
127
140
|
tableName,
|
|
128
141
|
{
|
|
129
|
-
description:
|
|
142
|
+
description: build.wrapDescription(
|
|
143
|
+
`The \`${tableTypeName}\` that was created by this mutation.`,
|
|
144
|
+
"field"
|
|
145
|
+
),
|
|
130
146
|
type: Table,
|
|
131
147
|
},
|
|
132
148
|
{
|
|
@@ -168,7 +184,10 @@ export default (function PgMutationCreatePlugin(
|
|
|
168
184
|
!omit(attr, "create")
|
|
169
185
|
);
|
|
170
186
|
return {
|
|
171
|
-
description:
|
|
187
|
+
description: build.wrapDescription(
|
|
188
|
+
`Creates a single \`${tableTypeName}\`.`,
|
|
189
|
+
"field"
|
|
190
|
+
),
|
|
172
191
|
type: PayloadType,
|
|
173
192
|
args: {
|
|
174
193
|
input: {
|