graphile-build-pg 4.4.5 → 4.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/node8plus/QueryBuilder.d.ts +10 -2
- package/node8plus/QueryBuilder.js +80 -1
- package/node8plus/QueryBuilder.js.flow +75 -2
- package/node8plus/QueryBuilder.js.map +1 -1
- package/node8plus/index.d.ts +8 -0
- package/node8plus/index.js +7 -1
- package/node8plus/index.js.flow +6 -1
- package/node8plus/index.js.map +1 -1
- package/node8plus/plugins/PgBasicsPlugin.js +5 -3
- package/node8plus/plugins/PgBasicsPlugin.js.flow +2 -0
- package/node8plus/plugins/PgBasicsPlugin.js.map +1 -1
- package/node8plus/plugins/PgConnectionTotalCount.js +10 -4
- package/node8plus/plugins/PgConnectionTotalCount.js.flow +13 -9
- package/node8plus/plugins/PgConnectionTotalCount.js.map +1 -1
- package/node8plus/plugins/PgIntrospectionPlugin.d.ts +48 -11
- package/node8plus/plugins/PgIntrospectionPlugin.js +53 -23
- package/node8plus/plugins/PgIntrospectionPlugin.js.flow +81 -25
- package/node8plus/plugins/PgIntrospectionPlugin.js.map +1 -1
- package/node8plus/plugins/PgJWTPlugin.js +6 -1
- package/node8plus/plugins/PgJWTPlugin.js.flow +7 -1
- package/node8plus/plugins/PgJWTPlugin.js.map +1 -1
- package/node8plus/plugins/PgMutationUpdateDeletePlugin.js +2 -1
- package/node8plus/plugins/PgMutationUpdateDeletePlugin.js.flow +3 -1
- package/node8plus/plugins/PgMutationUpdateDeletePlugin.js.map +1 -1
- package/node8plus/plugins/PgRecordFunctionConnectionPlugin.js +1 -0
- package/node8plus/plugins/PgRecordFunctionConnectionPlugin.js.flow +1 -0
- package/node8plus/plugins/PgRecordFunctionConnectionPlugin.js.map +1 -1
- package/node8plus/plugins/PgScalarFunctionConnectionPlugin.js +1 -0
- package/node8plus/plugins/PgScalarFunctionConnectionPlugin.js.flow +1 -0
- package/node8plus/plugins/PgScalarFunctionConnectionPlugin.js.map +1 -1
- package/node8plus/plugins/PgTypesPlugin.js +9 -2
- package/node8plus/plugins/PgTypesPlugin.js.flow +19 -0
- package/node8plus/plugins/PgTypesPlugin.js.map +1 -1
- package/node8plus/plugins/introspectionQuery.js +1 -0
- package/node8plus/plugins/introspectionQuery.js.flow +1 -0
- package/node8plus/plugins/introspectionQuery.js.map +1 -1
- package/node8plus/queryFromResolveDataFactory.js +8 -1
- package/node8plus/queryFromResolveDataFactory.js.flow +13 -1
- package/node8plus/queryFromResolveDataFactory.js.map +1 -1
- package/package.json +7 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugins/PgIntrospectionPlugin.js"],"names":["debug","WATCH_FIXTURES_PATH","__dirname","readFile","filename","encoding","Promise","resolve","reject","err","res","removeQuotes","str","trimmed","trim","length","Error","substr","toLowerCase","parseSqlColumnArray","parts","split","map","parseSqlColumnString","parseConstraintSpec","rawSpec","spec","tagComponents","parsed","join","tags","description","text","smartCommentConstraints","introspectionResults","attributesByNames","tbl","cols","debugStr","attributes","attribute","filter","a","classId","id","sort","b","num","pk","constraint","find","c","type","keyAttributeNums","n","namespaceName","name","colName","attr","class","forEach","klass","namespace","namespaceId","primaryKey","pkSpec","columns","notNull","fakeConstraint","kind","isFake","isIndexed","Math","random","foreignClassId","comment","foreignKeyAttributeNums","push","getType","t","typeId","foreignKey","foreignKeys","Array","isArray","fkSpecRaw","index","fkSpec","matches","match","rawColumns","rawSchemaOrTable","rawTableOnly","rawForeignColumns","rawSchema","rawTable","foreignSchema","foreignTable","foreignColumns","foreignKlass","k","foreignNamespace","PgIntrospectionPlugin","builder","pgConfig","pgSchemas","schemas","pgEnableTags","persistentMemoizeWithKey","key","fn","pgThrowOnMissingSchema","pgIncludeExtensionResources","pgLegacyFunctionsOnly","pgSkipInstallingWatchFixtures","pgAugmentIntrospectionResults","pgOwnerConnectionString","augment","introspect","cacheKey","version","cloneResults","obj","result","Object","keys","reduce","memo","v","introspectionResultsByKind","pgClient","versionResult","query","serverVersionNum","parseInt","rows","server_version_num","introspectionQuery","__pgVersion","procedure","extension","object","extensionConfigurationClassIds","e","configurationClassIds","isExtensionConfigurationTable","indexOf","freeze","knownSchemas","missingSchemas","s","errorMessage","console","warn","xByY","arrayOfX","attrKey","x","xByYAndZ","attrKey2","namespaceById","classById","typeById","attributeByClassIdAndNum","extensionById","relate","array","newAttr","lookupAttr","lookup","missingOk","entry","innerKey","JSON","stringify","_","arrayItemType","arrayType","canUseAsterisk","some","columnLevelSelectGrant","constraints","foreignConstraints","primaryKeyConstraint","keyAttributes","nr","foreignClass","foreignKeyAttributes","attributeNums","isUnique","every","idx","listener","Listener","constructor","triggerRebuild","stopped","_handleChange","error","message","leading","trailing","_listener","bind","_handleClientError","_start","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"],"mappings":"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","sourcesContent":["// @flow\nimport type { Plugin } from \"graphile-build\";\nimport type { Client } from \"pg\";\nimport withPgClient, {\n getPgClientAndReleaserFromConfig,\n} from \"../withPgClient\";\nimport { parseTags } from \"../utils\";\nimport { readFile as rawReadFile } from \"fs\";\nimport debugFactory from \"debug\";\nimport chalk from \"chalk\";\nimport throttle from \"lodash/throttle\";\nimport flatMap from \"lodash/flatMap\";\nimport { makeIntrospectionQuery } from \"./introspectionQuery\";\n\nimport { version } from \"../../package.json\";\nimport queryFromResolveDataFactory from \"../queryFromResolveDataFactory\";\n\nconst debug = debugFactory(\"graphile-build-pg\");\nconst WATCH_FIXTURES_PATH = `${__dirname}/../../res/watch-fixtures.sql`;\n\n// Ref: https://github.com/graphile/postgraphile/tree/master/src/postgres/introspection/object\n\nexport type PgNamespace = {\n kind: \"namespace\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgProc = {\n kind: \"procedure\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n isStrict: boolean,\n returnsSet: boolean,\n isStable: boolean,\n returnTypeId: string,\n argTypeIds: Array<string>,\n argNames: Array<string>,\n argModes: Array<\"i\" | \"o\" | \"b\" | \"v\" | \"t\">,\n inputArgsCount: number,\n argDefaultsNum: number,\n namespace: PgNamespace,\n tags: { [string]: string },\n cost: number,\n aclExecutable: boolean,\n language: string,\n};\n\nexport type PgClass = {\n kind: \"class\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n classKind: string,\n namespaceId: string,\n namespaceName: string,\n typeId: string,\n isSelectable: boolean,\n isInsertable: boolean,\n isUpdatable: boolean,\n isDeletable: boolean,\n isExtensionConfigurationTable: boolean,\n namespace: PgNamespace,\n type: PgType,\n tags: { [string]: string },\n attributes: [PgAttribute],\n constraints: [PgConstraint],\n foreignConstraints: [PgConstraint],\n primaryKeyConstraint: ?PgConstraint,\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n aclDeletable: boolean,\n canUseAsterisk: boolean,\n};\n\nexport type PgType = {\n kind: \"type\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n type: string,\n category: string,\n domainIsNotNull: boolean,\n arrayItemTypeId: ?string,\n arrayItemType: ?PgType,\n arrayType: ?PgType,\n typeLength: ?number,\n isPgArray: boolean,\n classId: ?string,\n class: ?PgClass,\n domainBaseTypeId: ?string,\n domainBaseType: ?PgType,\n domainTypeModifier: ?number,\n tags: { [string]: string },\n};\n\nexport type PgAttribute = {\n kind: \"attribute\",\n classId: string,\n num: number,\n name: string,\n comment: ?string,\n description: ?string,\n typeId: string,\n typeModifier: number,\n isNotNull: boolean,\n hasDefault: boolean,\n identity: \"\" | \"a\" | \"d\",\n class: PgClass,\n type: PgType,\n namespace: PgNamespace,\n tags: { [string]: string },\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n isIndexed: ?boolean,\n isUnique: ?boolean,\n columnLevelSelectGrant: boolean,\n};\n\nexport type PgConstraint = {\n kind: \"constraint\",\n id: string,\n name: string,\n type: string,\n classId: string,\n class: PgClass,\n foreignClassId: ?string,\n foreignClass: ?PgClass,\n comment: ?string,\n description: ?string,\n keyAttributeNums: Array<number>,\n keyAttributes: [PgAttribute],\n foreignKeyAttributeNums: Array<number>,\n foreignKeyAttributes: [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 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\nfunction readFile(filename, encoding) {\n return new Promise((resolve, reject) => {\n rawReadFile(filename, encoding, (err, res) => {\n if (err) reject(err);\n else resolve(res);\n });\n });\n}\n\nconst removeQuotes = str => {\n const trimmed = str.trim();\n if (trimmed[0] === '\"') {\n if (trimmed[trimmed.length - 1] !== '\"') {\n throw new Error(\n `We failed to parse a quoted identifier '${str}'. Please avoid putting quotes or commas in smart comment identifiers (or file a PR to fix the parser).`\n );\n }\n return trimmed.substr(1, trimmed.length - 2);\n } else {\n // PostgreSQL lower-cases unquoted columns, so we should too.\n return trimmed.toLowerCase();\n }\n};\n\nconst parseSqlColumnArray = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n const parts = str.split(\",\");\n return parts.map(removeQuotes);\n};\n\nconst parseSqlColumnString = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n return removeQuotes(str);\n};\n\nfunction parseConstraintSpec(rawSpec) {\n const [spec, ...tagComponents] = rawSpec.split(/\\|/);\n const parsed = parseTags(tagComponents.join(\"\\n\"));\n return {\n spec,\n tags: parsed.tags,\n description: parsed.text,\n };\n}\n\nfunction smartCommentConstraints(introspectionResults) {\n const attributesByNames = (tbl, cols, debugStr) => {\n const attributes = introspectionResults.attribute\n .filter(a => a.classId === tbl.id)\n .sort((a, b) => a.num - b.num);\n if (!cols) {\n const pk = introspectionResults.constraint.find(\n c => c.classId == tbl.id && c.type === \"p\"\n );\n if (pk) {\n return pk.keyAttributeNums.map(n => attributes.find(a => a.num === n));\n } else {\n throw new Error(\n `No columns specified for '${tbl.namespaceName}.${tbl.name}' (oid: ${tbl.id}) and no PK found (${debugStr}).`\n );\n }\n }\n return cols.map(colName => {\n const attr = attributes.find(a => a.name === colName);\n if (!attr) {\n throw new Error(\n `Could not find attribute '${colName}' in '${tbl.namespaceName}.${tbl.name}'`\n );\n }\n return attr;\n });\n };\n\n // First: primary keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n if (klass.tags.primaryKey) {\n if (typeof klass.tags.primaryKey !== \"string\") {\n throw new Error(\n `@primaryKey configuration of '${klass.namespaceName}.${klass.name}' is invalid; please specify just once \"@primaryKey col1,col2\"`\n );\n }\n const { spec: pkSpec, tags, description } = parseConstraintSpec(\n klass.tags.primaryKey\n );\n const columns: string[] = parseSqlColumnArray(pkSpec);\n const attributes = attributesByNames(\n klass,\n columns,\n `@primaryKey ${klass.tags.primaryKey}`\n );\n attributes.forEach(attr => {\n attr.tags.notNull = true;\n });\n const keyAttributeNums = attributes.map(a => a.num);\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_primaryKey`,\n type: \"p\", // primary key\n classId: klass.id,\n foreignClassId: null,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums: null,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n }\n });\n // Now primary keys are in place, we can apply foreign keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n const getType = () =>\n introspectionResults.type.find(t => t.id === klass.typeId);\n const foreignKey = klass.tags.foreignKey || getType().tags.foreignKey;\n if (foreignKey) {\n const foreignKeys =\n typeof foreignKey === \"string\" ? [foreignKey] : foreignKey;\n if (!Array.isArray(foreignKeys)) {\n throw new Error(\n `Invalid foreign key smart comment specified on '${klass.namespaceName}.${klass.name}'`\n );\n }\n foreignKeys.forEach((fkSpecRaw, index) => {\n if (typeof fkSpecRaw !== \"string\") {\n throw new Error(\n `Invalid foreign key spec (${index}) on '${klass.namespaceName}.${klass.name}'`\n );\n }\n const { spec: fkSpec, tags, description } = parseConstraintSpec(\n fkSpecRaw\n );\n const matches = fkSpec.match(\n /^\\(([^()]+)\\) references ([^().]+)(?:\\.([^().]+))?(?:\\s*\\(([^()]+)\\))?$/i\n );\n if (!matches) {\n throw new Error(\n `Invalid foreignKey syntax for '${klass.namespaceName}.${klass.name}'; expected something like \"(col1,col2) references schema.table (c1, c2)\", you passed '${fkSpecRaw}'`\n );\n }\n const [\n ,\n rawColumns,\n rawSchemaOrTable,\n rawTableOnly,\n rawForeignColumns,\n ] = matches;\n const rawSchema = rawTableOnly\n ? rawSchemaOrTable\n : `\"${klass.namespaceName}\"`;\n const rawTable = rawTableOnly || rawSchemaOrTable;\n const columns: string[] = parseSqlColumnArray(rawColumns);\n const foreignSchema: string = parseSqlColumnString(rawSchema);\n const foreignTable: string = parseSqlColumnString(rawTable);\n const foreignColumns: string[] | null = rawForeignColumns\n ? parseSqlColumnArray(rawForeignColumns)\n : null;\n\n const foreignKlass = introspectionResults.class.find(\n k => k.name === foreignTable && k.namespaceName === foreignSchema\n );\n if (!foreignKlass) {\n throw new Error(\n `@foreignKey smart comment referenced non-existant table/view '${foreignSchema}'.'${foreignTable}'. Note that this reference must use *database names* (i.e. it does not respect @name). (${fkSpecRaw})`\n );\n }\n const foreignNamespace = introspectionResults.namespace.find(\n n => n.id === foreignKlass.namespaceId\n );\n if (!foreignNamespace) {\n return;\n }\n\n const keyAttributeNums = attributesByNames(\n klass,\n columns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n const foreignKeyAttributeNums = attributesByNames(\n foreignKlass,\n foreignColumns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_foreignKey_${index}`,\n type: \"f\", // foreign key\n classId: klass.id,\n foreignClassId: foreignKlass.id,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n });\n }\n });\n}\n\nexport default (async function PgIntrospectionPlugin(\n builder,\n {\n pgConfig,\n pgSchemas: schemas,\n pgEnableTags,\n persistentMemoizeWithKey = (key, fn) => fn(),\n pgThrowOnMissingSchema = false,\n pgIncludeExtensionResources = false,\n pgLegacyFunctionsOnly = false,\n pgSkipInstallingWatchFixtures = false,\n pgAugmentIntrospectionResults,\n pgOwnerConnectionString,\n }\n) {\n const augment = introspectionResults => {\n [pgAugmentIntrospectionResults, smartCommentConstraints].forEach(fn =>\n fn ? fn(introspectionResults) : null\n );\n };\n async function introspect() {\n // Perform introspection\n if (!Array.isArray(schemas)) {\n throw new Error(\"Argument 'schemas' (array) is required\");\n }\n const cacheKey = `PgIntrospectionPlugin-introspectionResultsByKind-v${version}`;\n const cloneResults = obj => {\n const result = Object.keys(obj).reduce((memo, k) => {\n memo[k] = Array.isArray(obj[k]) ? obj[k].map(v => ({ ...v })) : obj[k];\n return memo;\n }, {});\n return result;\n };\n const introspectionResultsByKind = cloneResults(\n await persistentMemoizeWithKey(cacheKey, () =>\n withPgClient(pgConfig, async pgClient => {\n const versionResult = await pgClient.query(\n \"show server_version_num;\"\n );\n const serverVersionNum = parseInt(\n versionResult.rows[0].server_version_num,\n 10\n );\n const introspectionQuery = makeIntrospectionQuery(serverVersionNum, {\n pgLegacyFunctionsOnly,\n });\n const { rows } = await pgClient.query(introspectionQuery, [\n schemas,\n pgIncludeExtensionResources,\n ]);\n\n const result = {\n __pgVersion: serverVersionNum,\n namespace: [],\n class: [],\n attribute: [],\n type: [],\n constraint: [],\n procedure: [],\n extension: [],\n index: [],\n };\n for (const { object } of rows) {\n result[object.kind].push(object);\n }\n\n // Parse tags from comments\n [\n \"namespace\",\n \"class\",\n \"attribute\",\n \"type\",\n \"constraint\",\n \"procedure\",\n \"extension\",\n \"index\",\n ].forEach(kind => {\n result[kind].forEach(object => {\n // Keep a copy of the raw comment\n object.comment = object.description;\n if (pgEnableTags && object.description) {\n const parsed = parseTags(object.description);\n object.tags = parsed.tags;\n object.description = parsed.text;\n } else {\n object.tags = {};\n }\n });\n });\n\n const extensionConfigurationClassIds = flatMap(\n result.extension,\n e => e.configurationClassIds\n );\n result.class.forEach(klass => {\n klass.isExtensionConfigurationTable =\n extensionConfigurationClassIds.indexOf(klass.id) >= 0;\n });\n\n [\n \"namespace\",\n \"class\",\n \"attribute\",\n \"type\",\n \"constraint\",\n \"procedure\",\n \"extension\",\n \"index\",\n ].forEach(k => {\n result[k].forEach(Object.freeze);\n });\n\n return Object.freeze(result);\n })\n )\n );\n\n const knownSchemas = introspectionResultsByKind.namespace.map(n => n.name);\n const missingSchemas = schemas.filter(s => knownSchemas.indexOf(s) < 0);\n if (missingSchemas.length) {\n const errorMessage = `You requested to use schema '${schemas.join(\n \"', '\"\n )}'; however we couldn't find some of those! Missing schemas are: '${missingSchemas.join(\n \"', '\"\n )}'`;\n if (pgThrowOnMissingSchema) {\n throw new Error(errorMessage);\n } else {\n console.warn(\"⚠️ WARNING⚠️ \" + errorMessage); // eslint-disable-line no-console\n }\n }\n\n const xByY = (arrayOfX, attrKey) =>\n arrayOfX.reduce((memo, x) => {\n memo[x[attrKey]] = x;\n return memo;\n }, {});\n const xByYAndZ = (arrayOfX, attrKey, attrKey2) =>\n arrayOfX.reduce((memo, x) => {\n if (!memo[x[attrKey]]) memo[x[attrKey]] = {};\n memo[x[attrKey]][x[attrKey2]] = x;\n return memo;\n }, {});\n introspectionResultsByKind.namespaceById = xByY(\n introspectionResultsByKind.namespace,\n \"id\"\n );\n introspectionResultsByKind.classById = xByY(\n introspectionResultsByKind.class,\n \"id\"\n );\n introspectionResultsByKind.typeById = xByY(\n introspectionResultsByKind.type,\n \"id\"\n );\n introspectionResultsByKind.attributeByClassIdAndNum = xByYAndZ(\n introspectionResultsByKind.attribute,\n \"classId\",\n \"num\"\n );\n introspectionResultsByKind.extensionById = xByY(\n introspectionResultsByKind.extension,\n \"id\"\n );\n\n const relate = (array, newAttr, lookupAttr, lookup, missingOk = false) => {\n array.forEach(entry => {\n const key = entry[lookupAttr];\n if (Array.isArray(key)) {\n entry[newAttr] = key\n .map(innerKey => {\n const result = lookup[innerKey];\n if (innerKey && !result) {\n if (missingOk) {\n return;\n }\n throw new Error(\n `Could not look up '${newAttr}' by '${lookupAttr}' ('${innerKey}') on '${JSON.stringify(\n entry\n )}'`\n );\n }\n return result;\n })\n .filter(_ => _);\n } else {\n const result = lookup[key];\n if (key && !result) {\n if (missingOk) {\n return;\n }\n throw new Error(\n `Could not look up '${newAttr}' by '${lookupAttr}' on '${JSON.stringify(\n entry\n )}'`\n );\n }\n entry[newAttr] = result;\n }\n });\n };\n\n augment(introspectionResultsByKind);\n\n relate(\n introspectionResultsByKind.class,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById,\n true // Because it could be a type defined in a different namespace - which is fine so long as we don't allow querying it directly\n );\n\n relate(\n introspectionResultsByKind.class,\n \"type\",\n \"typeId\",\n introspectionResultsByKind.typeById\n );\n\n relate(\n introspectionResultsByKind.attribute,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n relate(\n introspectionResultsByKind.attribute,\n \"type\",\n \"typeId\",\n introspectionResultsByKind.typeById\n );\n\n relate(\n introspectionResultsByKind.procedure,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById\n );\n\n relate(\n introspectionResultsByKind.type,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById,\n true\n );\n\n relate(\n introspectionResultsByKind.type,\n \"domainBaseType\",\n \"domainBaseTypeId\",\n introspectionResultsByKind.typeById,\n true // Because not all types are domains\n );\n\n relate(\n introspectionResultsByKind.type,\n \"arrayItemType\",\n \"arrayItemTypeId\",\n introspectionResultsByKind.typeById,\n true // Because not all types are arrays\n );\n\n relate(\n introspectionResultsByKind.constraint,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n relate(\n introspectionResultsByKind.constraint,\n \"foreignClass\",\n \"foreignClassId\",\n introspectionResultsByKind.classById,\n true // Because many constraints don't apply to foreign classes\n );\n\n relate(\n introspectionResultsByKind.extension,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById,\n true // Because the extension could be a defined in a different namespace\n );\n\n relate(\n introspectionResultsByKind.extension,\n \"configurationClasses\",\n \"configurationClassIds\",\n introspectionResultsByKind.classById,\n true // Because the configuration table could be a defined in a different namespace\n );\n\n relate(\n introspectionResultsByKind.index,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n // Reverse arrayItemType -> arrayType\n introspectionResultsByKind.type.forEach(type => {\n if (type.arrayItemType) {\n type.arrayItemType.arrayType = type;\n }\n });\n\n // Table/type columns / constraints\n introspectionResultsByKind.class.forEach(klass => {\n klass.attributes = introspectionResultsByKind.attribute.filter(\n attr => attr.classId === klass.id\n );\n klass.canUseAsterisk = !klass.attributes.some(\n attr => attr.columnLevelSelectGrant\n );\n klass.constraints = introspectionResultsByKind.constraint.filter(\n constraint => constraint.classId === klass.id\n );\n klass.foreignConstraints = introspectionResultsByKind.constraint.filter(\n constraint => constraint.foreignClassId === klass.id\n );\n klass.primaryKeyConstraint = klass.constraints.find(\n constraint => constraint.type === \"p\"\n );\n });\n\n // Constraint attributes\n introspectionResultsByKind.constraint.forEach(constraint => {\n if (constraint.keyAttributeNums && constraint.class) {\n constraint.keyAttributes = constraint.keyAttributeNums.map(nr =>\n constraint.class.attributes.find(attr => attr.num === nr)\n );\n } else {\n constraint.keyAttributes = [];\n }\n if (constraint.foreignKeyAttributeNums && constraint.foreignClass) {\n constraint.foreignKeyAttributes = constraint.foreignKeyAttributeNums.map(\n nr => constraint.foreignClass.attributes.find(attr => attr.num === nr)\n );\n } else {\n constraint.foreignKeyAttributes = [];\n }\n });\n\n // Detect which columns and constraints are indexed\n introspectionResultsByKind.index.forEach(index => {\n const columns = index.attributeNums.map(nr =>\n index.class.attributes.find(attr => attr.num === nr)\n );\n\n // Indexed column (for orderBy / filter):\n if (columns[0]) {\n columns[0].isIndexed = true;\n }\n\n if (columns[0] && columns.length === 1 && index.isUnique) {\n columns[0].isUnique = true;\n }\n\n // Indexed constraints (for reverse relations):\n index.class.constraints\n .filter(constraint => constraint.type === \"f\")\n .forEach(constraint => {\n if (\n constraint.keyAttributeNums.every(\n (nr, idx) => index.attributeNums[idx] === nr\n )\n ) {\n constraint.isIndexed = true;\n }\n });\n });\n\n return introspectionResultsByKind;\n }\n\n let introspectionResultsByKind = await introspect();\n\n let listener;\n\n class Listener {\n _handleChange: () => void;\n client: Client | null;\n stopped: boolean;\n _reallyReleaseClient: (() => Promise<void>) | null;\n _haveDisplayedError: boolean;\n constructor(triggerRebuild) {\n this.stopped = false;\n this._handleChange = throttle(\n async () => {\n debug(`Schema change detected: re-inspecting schema...`);\n try {\n introspectionResultsByKind = await introspect();\n debug(`Schema change detected: re-inspecting schema complete`);\n triggerRebuild();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(`Schema introspection failed: ${e.message}`);\n }\n },\n 750,\n {\n leading: true,\n trailing: true,\n }\n );\n this._listener = this._listener.bind(this);\n this._handleClientError = this._handleClientError.bind(this);\n this._start();\n }\n\n async _start() {\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 this._handleChange();\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();\n }\n }, 2000);\n }\n\n // eslint-disable-next-line flowtype/no-weak-types\n _listener: (notification: any) => void;\n // eslint-disable-next-line flowtype/no-weak-types\n async _listener(notification: any) {\n if (notification.channel !== \"postgraphile_watch\") {\n return;\n }\n try {\n const payload = JSON.parse(notification.payload);\n payload.payload = payload.payload || [];\n if (payload.type === \"ddl\") {\n const commands = payload.payload\n .filter(\n ({ schema }) => schema == null || schemas.indexOf(schema) >= 0\n )\n .map(({ command }) => command);\n if (commands.length) {\n this._handleChange();\n }\n } else if (payload.type === \"drop\") {\n const affectsOurSchemas = payload.payload.some(\n schemaName => schemas.indexOf(schemaName) >= 0\n );\n if (affectsOurSchemas) {\n this._handleChange();\n }\n } else {\n throw new Error(`Payload type '${payload.type}' not recognised`);\n }\n } catch (e) {\n debug(`Error occurred parsing notification payload: ${e}`);\n }\n }\n\n async stop() {\n this.stopped = true;\n await this._releaseClient();\n }\n\n async _releaseClient() {\n // $FlowFixMe\n this._handleChange.cancel();\n const pgClient = this.client;\n const reallyReleaseClient = this._reallyReleaseClient;\n this.client = null;\n this._reallyReleaseClient = null;\n if (pgClient) {\n pgClient.query(\"unlisten postgraphile_watch\").catch(e => {\n debug(`Error occurred trying to unlisten watch: ${e}`);\n });\n pgClient.removeListener(\"notification\", this._listener);\n pgClient.removeListener(\"error\", this._handleClientError);\n if (reallyReleaseClient) {\n await reallyReleaseClient();\n }\n }\n }\n }\n\n builder.registerWatcher(\n async triggerRebuild => {\n // In case we started listening before, clean up\n if (listener) {\n await listener.stop();\n }\n // We're not worried about a race condition here.\n // eslint-disable-next-line require-atomic-updates\n listener = new Listener(triggerRebuild);\n },\n async () => {\n const l = listener;\n listener = null;\n if (l) {\n await l.stop();\n }\n }\n );\n\n builder.hook(\n \"build\",\n build => {\n if (introspectionResultsByKind.__pgVersion < 90500) {\n // TODO:v5: remove this workaround\n // This is a bit of a hack, but until we have plugin priorities it's the\n // easiest way to conditionally support PG9.4.\n build.pgQueryFromResolveData = queryFromResolveDataFactory({\n supportsJSONB: false,\n });\n }\n return build.extend(build, {\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n });\n },\n [\"PgIntrospection\"],\n [],\n [\"PgBasics\"]\n );\n}: Plugin);\n"],"file":"PgIntrospectionPlugin.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/plugins/PgIntrospectionPlugin.js"],"names":["debug","WATCH_FIXTURES_PATH","__dirname","readFile","filename","encoding","Promise","resolve","reject","err","res","removeQuotes","str","trimmed","trim","length","Error","substr","toLowerCase","parseSqlColumnArray","parts","split","map","parseSqlColumnString","parseConstraintSpec","rawSpec","spec","tagComponents","parsed","join","tags","description","text","smartCommentConstraints","introspectionResults","attributesByNames","tbl","cols","debugStr","attributes","attribute","filter","a","classId","id","sort","b","num","pk","constraint","find","c","type","keyAttributeNums","n","namespaceName","name","colName","attr","class","forEach","klass","namespace","namespaceId","primaryKey","pkSpec","columns","notNull","fakeConstraint","kind","isFake","isIndexed","Math","random","foreignClassId","comment","foreignKeyAttributeNums","push","getType","t","typeId","foreignKey","foreignKeys","Array","isArray","fkSpecRaw","index","fkSpec","matches","match","rawColumns","rawSchemaOrTable","rawTableOnly","rawForeignColumns","rawSchema","rawTable","foreignSchema","foreignTable","foreignColumns","foreignKlass","k","foreignNamespace","deepClone","value","val","Object","keys","reduce","memo","PgIntrospectionPlugin","builder","pgConfig","pgSchemas","schemas","pgEnableTags","persistentMemoizeWithKey","key","fn","pgThrowOnMissingSchema","pgIncludeExtensionResources","pgLegacyFunctionsOnly","pgSkipInstallingWatchFixtures","pgOwnerConnectionString","introspect","cacheKey","version","introspectionResultsByKind","pgClient","versionResult","query","serverVersionNum","parseInt","rows","server_version_num","introspectionQuery","result","__pgVersion","procedure","extension","object","extensionConfigurationClassIds","e","configurationClassIds","isExtensionConfigurationTable","indexOf","freeze","knownSchemas","missingSchemas","s","errorMessage","console","warn","introspectionResultsFromRaw","rawResults","pgAugmentIntrospectionResults","xByY","arrayOfX","attrKey","x","xByYAndZ","attrKey2","namespaceById","classById","typeById","attributeByClassIdAndNum","extensionById","relate","array","newAttr","lookupAttr","lookup","missingOk","entry","innerKey","JSON","stringify","_","augment","arrayItemType","arrayType","canUseAsterisk","some","columnLevelSelectGrant","constraints","foreignConstraints","primaryKeyConstraint","keyAttributes","nr","foreignClass","foreignKeyAttributes","attributeNums","isUnique","every","idx","rawIntrospectionResultsByKind","listener","Listener","constructor","triggerRebuild","stopped","_handleChange","error","message","leading","trailing","_listener","bind","_handleClientError","_start","isReconnect","releasePgClient","client","_reallyReleaseClient","on","_releaseClient","watchSqlInner","sql","_haveDisplayedError","chalk","bold","yellow","_reconnect","setTimeout","notification","channel","payload","parse","commands","schema","command","affectsOurSchemas","schemaName","stop","cancel","reallyReleaseClient","catch","removeListener","registerWatcher","l","hook","build","pgQueryFromResolveData","supportsJSONB","extend","pgIntrospectionResultsByKind","PgEntityKind","NAMESPACE","PROCEDURE","CLASS","TYPE","ATTRIBUTE","CONSTRAINT","EXTENSION","INDEX"],"mappings":"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","sourcesContent":["// @flow\nimport type { Plugin } from \"graphile-build\";\nimport type { Client } from \"pg\";\nimport withPgClient, {\n getPgClientAndReleaserFromConfig,\n} from \"../withPgClient\";\nimport { parseTags } from \"../utils\";\nimport { readFile as rawReadFile } from \"fs\";\nimport debugFactory from \"debug\";\nimport chalk from \"chalk\";\nimport throttle from \"lodash/throttle\";\nimport flatMap from \"lodash/flatMap\";\nimport { makeIntrospectionQuery } from \"./introspectionQuery\";\n\nimport { version } from \"../../package.json\";\nimport queryFromResolveDataFactory from \"../queryFromResolveDataFactory\";\n\nconst debug = debugFactory(\"graphile-build-pg\");\nconst WATCH_FIXTURES_PATH = `${__dirname}/../../res/watch-fixtures.sql`;\n\n// Ref: https://github.com/graphile/postgraphile/tree/master/src/postgres/introspection/object\n\nexport type PgNamespace = {\n kind: \"namespace\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgProc = {\n kind: \"procedure\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n isStrict: boolean,\n returnsSet: boolean,\n isStable: boolean,\n returnTypeId: string,\n argTypeIds: Array<string>,\n argNames: Array<string>,\n argModes: Array<\"i\" | \"o\" | \"b\" | \"v\" | \"t\">,\n inputArgsCount: number,\n argDefaultsNum: number,\n namespace: PgNamespace,\n tags: { [string]: string },\n cost: number,\n aclExecutable: boolean,\n language: string,\n};\n\nexport type PgClass = {\n kind: \"class\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n classKind: string,\n namespaceId: string,\n namespaceName: string,\n typeId: string,\n isSelectable: boolean,\n isInsertable: boolean,\n isUpdatable: boolean,\n isDeletable: boolean,\n isExtensionConfigurationTable: boolean,\n namespace: PgNamespace,\n type: PgType,\n tags: { [string]: string },\n attributes: Array<PgAttribute>,\n constraints: Array<PgConstraint>,\n foreignConstraints: Array<PgConstraint>,\n primaryKeyConstraint: ?PgConstraint,\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n aclDeletable: boolean,\n canUseAsterisk: boolean,\n};\n\nexport type PgType = {\n kind: \"type\",\n id: string,\n name: string,\n comment: ?string,\n description: ?string,\n namespaceId: string,\n namespaceName: string,\n type: string,\n category: string,\n domainIsNotNull: boolean,\n arrayItemTypeId: ?string,\n arrayItemType: ?PgType,\n arrayType: ?PgType,\n typeLength: ?number,\n isPgArray: boolean,\n classId: ?string,\n class: ?PgClass,\n domainBaseTypeId: ?string,\n domainBaseType: ?PgType,\n domainTypeModifier: ?number,\n tags: { [string]: string },\n};\n\nexport type PgAttribute = {\n kind: \"attribute\",\n classId: string,\n num: number,\n name: string,\n comment: ?string,\n description: ?string,\n typeId: string,\n typeModifier: number,\n isNotNull: boolean,\n hasDefault: boolean,\n identity: \"\" | \"a\" | \"d\",\n class: PgClass,\n type: PgType,\n namespace: PgNamespace,\n tags: { [string]: string },\n aclSelectable: boolean,\n aclInsertable: boolean,\n aclUpdatable: boolean,\n isIndexed: ?boolean,\n isUnique: ?boolean,\n columnLevelSelectGrant: boolean,\n};\n\nexport type PgConstraint = {\n kind: \"constraint\",\n id: string,\n name: string,\n type: string,\n classId: string,\n class: PgClass,\n foreignClassId: ?string,\n foreignClass: ?PgClass,\n comment: ?string,\n description: ?string,\n keyAttributeNums: Array<number>,\n keyAttributes: Array<PgAttribute>,\n foreignKeyAttributeNums: Array<number>,\n foreignKeyAttributes: Array<PgAttribute>,\n namespace: PgNamespace,\n isIndexed: ?boolean,\n tags: { [string]: string },\n};\n\nexport type PgExtension = {\n kind: \"extension\",\n id: string,\n name: string,\n namespaceId: string,\n namespaceName: string,\n relocatable: boolean,\n version: string,\n configurationClassIds?: Array<string>,\n comment: ?string,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgIndex = {\n kind: \"index\",\n id: string,\n name: string,\n namespaceName: string,\n classId: string,\n numberOfAttributes: number,\n indexType: string,\n isUnique: boolean,\n isPrimary: boolean,\n /*\n Though these exist, we don't want to officially\n support them yet.\n\n isImmediate: boolean,\n isReplicaIdentity: boolean,\n isValid: boolean,\n */\n isPartial: boolean,\n attributeNums: Array<number>,\n attributePropertiesAsc: ?Array<boolean>,\n attributePropertiesNullsFirst: ?Array<boolean>,\n description: ?string,\n tags: { [string]: string },\n};\n\nexport type PgEntity =\n | PgNamespace\n | PgProc\n | PgClass\n | PgType\n | PgAttribute\n | PgConstraint\n | PgExtension\n | PgIndex;\n\nexport type PgIntrospectionResultsByKind = {\n __pgVersion: number,\n attribute: PgAttribute[],\n attributeByClassIdAndNum: {\n [classId: string]: { [num: string]: PgAttribute },\n },\n class: PgClass[],\n classById: { [classId: string]: PgClass },\n constraint: PgConstraint[],\n extension: PgExtension[],\n extensionById: { [extId: string]: PgExtension },\n index: PgIndex[],\n namespace: PgNamespace[],\n namespaceById: { [namespaceId: string]: PgNamespace },\n procedure: PgProc[],\n type: PgType[],\n typeById: { [typeId: string]: PgType },\n};\n\nfunction readFile(filename, encoding) {\n return new Promise((resolve, reject) => {\n rawReadFile(filename, encoding, (err, res) => {\n if (err) reject(err);\n else resolve(res);\n });\n });\n}\n\nconst removeQuotes = str => {\n const trimmed = str.trim();\n if (trimmed[0] === '\"') {\n if (trimmed[trimmed.length - 1] !== '\"') {\n throw new Error(\n `We failed to parse a quoted identifier '${str}'. Please avoid putting quotes or commas in smart comment identifiers (or file a PR to fix the parser).`\n );\n }\n return trimmed.substr(1, trimmed.length - 2);\n } else {\n // PostgreSQL lower-cases unquoted columns, so we should too.\n return trimmed.toLowerCase();\n }\n};\n\nconst parseSqlColumnArray = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n const parts = str.split(\",\");\n return parts.map(removeQuotes);\n};\n\nconst parseSqlColumnString = str => {\n if (!str) {\n throw new Error(`Cannot parse '${str}'`);\n }\n return removeQuotes(str);\n};\n\nfunction parseConstraintSpec(rawSpec) {\n const [spec, ...tagComponents] = rawSpec.split(/\\|/);\n const parsed = parseTags(tagComponents.join(\"\\n\"));\n return {\n spec,\n tags: parsed.tags,\n description: parsed.text,\n };\n}\n\nfunction smartCommentConstraints(introspectionResults) {\n const attributesByNames = (tbl, cols, debugStr) => {\n const attributes = introspectionResults.attribute\n .filter(a => a.classId === tbl.id)\n .sort((a, b) => a.num - b.num);\n if (!cols) {\n const pk = introspectionResults.constraint.find(\n c => c.classId == tbl.id && c.type === \"p\"\n );\n if (pk) {\n return pk.keyAttributeNums.map(n => attributes.find(a => a.num === n));\n } else {\n throw new Error(\n `No columns specified for '${tbl.namespaceName}.${tbl.name}' (oid: ${tbl.id}) and no PK found (${debugStr}).`\n );\n }\n }\n return cols.map(colName => {\n const attr = attributes.find(a => a.name === colName);\n if (!attr) {\n throw new Error(\n `Could not find attribute '${colName}' in '${tbl.namespaceName}.${tbl.name}'`\n );\n }\n return attr;\n });\n };\n\n // First: primary keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n if (klass.tags.primaryKey) {\n if (typeof klass.tags.primaryKey !== \"string\") {\n throw new Error(\n `@primaryKey configuration of '${klass.namespaceName}.${klass.name}' is invalid; please specify just once \"@primaryKey col1,col2\"`\n );\n }\n const { spec: pkSpec, tags, description } = parseConstraintSpec(\n klass.tags.primaryKey\n );\n const columns: string[] = parseSqlColumnArray(pkSpec);\n const attributes = attributesByNames(\n klass,\n columns,\n `@primaryKey ${klass.tags.primaryKey}`\n );\n attributes.forEach(attr => {\n attr.tags.notNull = true;\n });\n const keyAttributeNums = attributes.map(a => a.num);\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_primaryKey`,\n type: \"p\", // primary key\n classId: klass.id,\n foreignClassId: null,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums: null,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n }\n });\n // Now primary keys are in place, we can apply foreign keys\n introspectionResults.class.forEach(klass => {\n const namespace = introspectionResults.namespace.find(\n n => n.id === klass.namespaceId\n );\n if (!namespace) {\n return;\n }\n const getType = () =>\n introspectionResults.type.find(t => t.id === klass.typeId);\n const foreignKey = klass.tags.foreignKey || getType().tags.foreignKey;\n if (foreignKey) {\n const foreignKeys =\n typeof foreignKey === \"string\" ? [foreignKey] : foreignKey;\n if (!Array.isArray(foreignKeys)) {\n throw new Error(\n `Invalid foreign key smart comment specified on '${klass.namespaceName}.${klass.name}'`\n );\n }\n foreignKeys.forEach((fkSpecRaw, index) => {\n if (typeof fkSpecRaw !== \"string\") {\n throw new Error(\n `Invalid foreign key spec (${index}) on '${klass.namespaceName}.${klass.name}'`\n );\n }\n const { spec: fkSpec, tags, description } = parseConstraintSpec(\n fkSpecRaw\n );\n const matches = fkSpec.match(\n /^\\(([^()]+)\\) references ([^().]+)(?:\\.([^().]+))?(?:\\s*\\(([^()]+)\\))?$/i\n );\n if (!matches) {\n throw new Error(\n `Invalid foreignKey syntax for '${klass.namespaceName}.${klass.name}'; expected something like \"(col1,col2) references schema.table (c1, c2)\", you passed '${fkSpecRaw}'`\n );\n }\n const [\n ,\n rawColumns,\n rawSchemaOrTable,\n rawTableOnly,\n rawForeignColumns,\n ] = matches;\n const rawSchema = rawTableOnly\n ? rawSchemaOrTable\n : `\"${klass.namespaceName}\"`;\n const rawTable = rawTableOnly || rawSchemaOrTable;\n const columns: string[] = parseSqlColumnArray(rawColumns);\n const foreignSchema: string = parseSqlColumnString(rawSchema);\n const foreignTable: string = parseSqlColumnString(rawTable);\n const foreignColumns: string[] | null = rawForeignColumns\n ? parseSqlColumnArray(rawForeignColumns)\n : null;\n\n const foreignKlass = introspectionResults.class.find(\n k => k.name === foreignTable && k.namespaceName === foreignSchema\n );\n if (!foreignKlass) {\n throw new Error(\n `@foreignKey smart comment referenced non-existant table/view '${foreignSchema}'.'${foreignTable}'. Note that this reference must use *database names* (i.e. it does not respect @name). (${fkSpecRaw})`\n );\n }\n const foreignNamespace = introspectionResults.namespace.find(\n n => n.id === foreignKlass.namespaceId\n );\n if (!foreignNamespace) {\n return;\n }\n\n const keyAttributeNums = attributesByNames(\n klass,\n columns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n const foreignKeyAttributeNums = attributesByNames(\n foreignKlass,\n foreignColumns,\n `@foreignKey ${fkSpecRaw}`\n ).map(a => a.num);\n\n // Now we need to fake a constraint for this:\n const fakeConstraint = {\n kind: \"constraint\",\n isFake: true,\n isIndexed: true, // otherwise it gets ignored by ignoreIndexes\n id: Math.random(),\n name: `FAKE_${klass.namespaceName}_${klass.name}_foreignKey_${index}`,\n type: \"f\", // foreign key\n classId: klass.id,\n foreignClassId: foreignKlass.id,\n comment: null,\n description,\n keyAttributeNums,\n foreignKeyAttributeNums,\n tags,\n };\n introspectionResults.constraint.push(fakeConstraint);\n });\n }\n });\n}\n\n/* The argument to this must not contain cyclic references! */\nconst deepClone = value => {\n if (Array.isArray(value)) {\n return value.map(val => deepClone(val));\n } else if (typeof value === \"object\" && value) {\n return Object.keys(value).reduce((memo, k) => {\n memo[k] = deepClone(value[k]);\n return memo;\n }, {});\n } else {\n return value;\n }\n};\n\nexport default (async function PgIntrospectionPlugin(\n builder,\n {\n pgConfig,\n pgSchemas: schemas,\n pgEnableTags,\n persistentMemoizeWithKey = (key, fn) => fn(),\n pgThrowOnMissingSchema = false,\n pgIncludeExtensionResources = false,\n pgLegacyFunctionsOnly = false,\n pgSkipInstallingWatchFixtures = false,\n pgOwnerConnectionString,\n }\n) {\n /**\n * @summary introspect database and get the table/view/constraints.\n * @returns {Promise<PgIntrospectionResultsByKind>}\n */\n async function introspect(): Promise<PgIntrospectionResultsByKind> {\n // Perform introspection\n if (!Array.isArray(schemas)) {\n throw new Error(\"Argument 'schemas' (array) is required\");\n }\n const cacheKey = `PgIntrospectionPlugin-introspectionResultsByKind-v${version}`;\n const introspectionResultsByKind = deepClone(\n await persistentMemoizeWithKey(cacheKey, () =>\n withPgClient(pgConfig, async pgClient => {\n const versionResult = await pgClient.query(\n \"show server_version_num;\"\n );\n const serverVersionNum = parseInt(\n versionResult.rows[0].server_version_num,\n 10\n );\n const introspectionQuery = makeIntrospectionQuery(serverVersionNum, {\n pgLegacyFunctionsOnly,\n });\n const { rows } = await pgClient.query(introspectionQuery, [\n schemas,\n pgIncludeExtensionResources,\n ]);\n\n const result = {\n __pgVersion: serverVersionNum,\n namespace: [],\n class: [],\n attribute: [],\n type: [],\n constraint: [],\n procedure: [],\n extension: [],\n index: [],\n };\n for (const { object } of rows) {\n result[object.kind].push(object);\n }\n\n // Parse tags from comments\n [\n \"namespace\",\n \"class\",\n \"attribute\",\n \"type\",\n \"constraint\",\n \"procedure\",\n \"extension\",\n \"index\",\n ].forEach(kind => {\n result[kind].forEach(object => {\n // Keep a copy of the raw comment\n object.comment = object.description;\n if (pgEnableTags && object.description) {\n const parsed = parseTags(object.description);\n object.tags = parsed.tags;\n object.description = parsed.text;\n } else {\n object.tags = {};\n }\n });\n });\n\n const extensionConfigurationClassIds = flatMap(\n result.extension,\n e => e.configurationClassIds\n );\n result.class.forEach(klass => {\n klass.isExtensionConfigurationTable =\n extensionConfigurationClassIds.indexOf(klass.id) >= 0;\n });\n\n [\n \"namespace\",\n \"class\",\n \"attribute\",\n \"type\",\n \"constraint\",\n \"procedure\",\n \"extension\",\n \"index\",\n ].forEach(k => {\n result[k].forEach(Object.freeze);\n });\n\n return Object.freeze(result);\n })\n )\n );\n\n const knownSchemas = introspectionResultsByKind.namespace.map(n => n.name);\n const missingSchemas = schemas.filter(s => knownSchemas.indexOf(s) < 0);\n if (missingSchemas.length) {\n const errorMessage = `You requested to use schema '${schemas.join(\n \"', '\"\n )}'; however we couldn't find some of those! Missing schemas are: '${missingSchemas.join(\n \"', '\"\n )}'`;\n if (pgThrowOnMissingSchema) {\n throw new Error(errorMessage);\n } else {\n console.warn(\"⚠️ WARNING⚠️ \" + errorMessage); // eslint-disable-line no-console\n }\n }\n return introspectionResultsByKind;\n }\n\n function introspectionResultsFromRaw(\n rawResults,\n pgAugmentIntrospectionResults\n ) {\n const introspectionResultsByKind = deepClone(rawResults);\n\n const xByY = (arrayOfX, attrKey) =>\n arrayOfX.reduce((memo, x) => {\n memo[x[attrKey]] = x;\n return memo;\n }, {});\n const xByYAndZ = (arrayOfX, attrKey, attrKey2) =>\n arrayOfX.reduce((memo, x) => {\n if (!memo[x[attrKey]]) memo[x[attrKey]] = {};\n memo[x[attrKey]][x[attrKey2]] = x;\n return memo;\n }, {});\n introspectionResultsByKind.namespaceById = xByY(\n introspectionResultsByKind.namespace,\n \"id\"\n );\n introspectionResultsByKind.classById = xByY(\n introspectionResultsByKind.class,\n \"id\"\n );\n introspectionResultsByKind.typeById = xByY(\n introspectionResultsByKind.type,\n \"id\"\n );\n introspectionResultsByKind.attributeByClassIdAndNum = xByYAndZ(\n introspectionResultsByKind.attribute,\n \"classId\",\n \"num\"\n );\n introspectionResultsByKind.extensionById = xByY(\n introspectionResultsByKind.extension,\n \"id\"\n );\n\n const relate = (array, newAttr, lookupAttr, lookup, missingOk = false) => {\n array.forEach(entry => {\n const key = entry[lookupAttr];\n if (Array.isArray(key)) {\n entry[newAttr] = key\n .map(innerKey => {\n const result = lookup[innerKey];\n if (innerKey && !result) {\n if (missingOk) {\n return;\n }\n throw new Error(\n `Could not look up '${newAttr}' by '${lookupAttr}' ('${innerKey}') on '${JSON.stringify(\n entry\n )}'`\n );\n }\n return result;\n })\n .filter(_ => _);\n } else {\n const result = lookup[key];\n if (key && !result) {\n if (missingOk) {\n return;\n }\n throw new Error(\n `Could not look up '${newAttr}' by '${lookupAttr}' on '${JSON.stringify(\n entry\n )}'`\n );\n }\n entry[newAttr] = result;\n }\n });\n };\n\n const augment = introspectionResults => {\n [pgAugmentIntrospectionResults, smartCommentConstraints].forEach(fn =>\n fn ? fn(introspectionResults) : null\n );\n };\n augment(introspectionResultsByKind);\n\n relate(\n introspectionResultsByKind.class,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById,\n true // Because it could be a type defined in a different namespace - which is fine so long as we don't allow querying it directly\n );\n\n relate(\n introspectionResultsByKind.class,\n \"type\",\n \"typeId\",\n introspectionResultsByKind.typeById\n );\n\n relate(\n introspectionResultsByKind.attribute,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n relate(\n introspectionResultsByKind.attribute,\n \"type\",\n \"typeId\",\n introspectionResultsByKind.typeById\n );\n\n relate(\n introspectionResultsByKind.procedure,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById\n );\n\n relate(\n introspectionResultsByKind.type,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById,\n true\n );\n\n relate(\n introspectionResultsByKind.type,\n \"domainBaseType\",\n \"domainBaseTypeId\",\n introspectionResultsByKind.typeById,\n true // Because not all types are domains\n );\n\n relate(\n introspectionResultsByKind.type,\n \"arrayItemType\",\n \"arrayItemTypeId\",\n introspectionResultsByKind.typeById,\n true // Because not all types are arrays\n );\n\n relate(\n introspectionResultsByKind.constraint,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n relate(\n introspectionResultsByKind.constraint,\n \"foreignClass\",\n \"foreignClassId\",\n introspectionResultsByKind.classById,\n true // Because many constraints don't apply to foreign classes\n );\n\n relate(\n introspectionResultsByKind.extension,\n \"namespace\",\n \"namespaceId\",\n introspectionResultsByKind.namespaceById,\n true // Because the extension could be a defined in a different namespace\n );\n\n relate(\n introspectionResultsByKind.extension,\n \"configurationClasses\",\n \"configurationClassIds\",\n introspectionResultsByKind.classById,\n true // Because the configuration table could be a defined in a different namespace\n );\n\n relate(\n introspectionResultsByKind.index,\n \"class\",\n \"classId\",\n introspectionResultsByKind.classById\n );\n\n // Reverse arrayItemType -> arrayType\n introspectionResultsByKind.type.forEach(type => {\n if (type.arrayItemType) {\n type.arrayItemType.arrayType = type;\n }\n });\n\n // Table/type columns / constraints\n introspectionResultsByKind.class.forEach(klass => {\n klass.attributes = introspectionResultsByKind.attribute.filter(\n attr => attr.classId === klass.id\n );\n klass.canUseAsterisk = !klass.attributes.some(\n attr => attr.columnLevelSelectGrant\n );\n klass.constraints = introspectionResultsByKind.constraint.filter(\n constraint => constraint.classId === klass.id\n );\n klass.foreignConstraints = introspectionResultsByKind.constraint.filter(\n constraint => constraint.foreignClassId === klass.id\n );\n klass.primaryKeyConstraint = klass.constraints.find(\n constraint => constraint.type === \"p\"\n );\n });\n\n // Constraint attributes\n introspectionResultsByKind.constraint.forEach(constraint => {\n if (constraint.keyAttributeNums && constraint.class) {\n constraint.keyAttributes = constraint.keyAttributeNums.map(nr =>\n constraint.class.attributes.find(attr => attr.num === nr)\n );\n } else {\n constraint.keyAttributes = [];\n }\n if (constraint.foreignKeyAttributeNums && constraint.foreignClass) {\n constraint.foreignKeyAttributes = constraint.foreignKeyAttributeNums.map(\n nr => constraint.foreignClass.attributes.find(attr => attr.num === nr)\n );\n } else {\n constraint.foreignKeyAttributes = [];\n }\n });\n\n // Detect which columns and constraints are indexed\n introspectionResultsByKind.index.forEach(index => {\n const columns = index.attributeNums.map(nr =>\n index.class.attributes.find(attr => attr.num === nr)\n );\n\n // Indexed column (for orderBy / filter):\n if (columns[0]) {\n columns[0].isIndexed = true;\n }\n\n if (columns[0] && columns.length === 1 && index.isUnique) {\n columns[0].isUnique = true;\n }\n\n // Indexed constraints (for reverse relations):\n index.class.constraints\n .filter(constraint => constraint.type === \"f\")\n .forEach(constraint => {\n if (\n constraint.keyAttributeNums.every(\n (nr, idx) => index.attributeNums[idx] === nr\n )\n ) {\n constraint.isIndexed = true;\n }\n });\n });\n\n return introspectionResultsByKind;\n }\n\n let rawIntrospectionResultsByKind = await introspect();\n\n let listener;\n\n class Listener {\n _handleChange: () => void;\n client: Client | null;\n stopped: boolean;\n _reallyReleaseClient: (() => Promise<void>) | null;\n _haveDisplayedError: boolean;\n constructor(triggerRebuild) {\n this.stopped = false;\n this._handleChange = throttle(\n async () => {\n debug(`Schema change detected: re-inspecting schema...`);\n try {\n rawIntrospectionResultsByKind = await introspect();\n debug(`Schema change detected: re-inspecting schema complete`);\n triggerRebuild();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(`Schema introspection failed: ${e.message}`);\n }\n },\n 750,\n {\n leading: true,\n trailing: true,\n }\n );\n this._listener = this._listener.bind(this);\n this._handleClientError = this._handleClientError.bind(this);\n this._start();\n }\n\n async _start(isReconnect = false) {\n if (this.stopped) {\n return;\n }\n // Connect to DB\n try {\n const {\n pgClient,\n releasePgClient,\n } = await getPgClientAndReleaserFromConfig(pgConfig);\n this.client = pgClient;\n // $FlowFixMe: hack property\n this._reallyReleaseClient = releasePgClient;\n pgClient.on(\"notification\", this._listener);\n pgClient.on(\"error\", this._handleClientError);\n if (this.stopped) {\n // In case watch mode was cancelled in the interrim.\n return this._releaseClient();\n } else {\n await pgClient.query(\"listen postgraphile_watch\");\n\n // Install the watch fixtures.\n if (!pgSkipInstallingWatchFixtures) {\n const watchSqlInner = await readFile(WATCH_FIXTURES_PATH, \"utf8\");\n const sql = `begin; ${watchSqlInner};`;\n await withPgClient(\n pgOwnerConnectionString || pgConfig,\n async pgClient => {\n try {\n await pgClient.query(sql);\n } catch (error) {\n if (!this._haveDisplayedError) {\n this._haveDisplayedError = true;\n /* eslint-disable no-console */\n console.warn(\n `${chalk.bold.yellow(\n \"Failed to setup watch fixtures in Postgres database\"\n )} ️️⚠️`\n );\n console.warn(\n chalk.yellow(\n \"This is likely because the PostgreSQL user in the connection string does not have sufficient privileges; you can solve this by passing the 'owner' connection string via '--owner-connection' / 'ownerConnectionString'. If the fixtures already exist, the watch functionality may still work.\"\n )\n );\n console.warn(\n chalk.yellow(\n \"Enable DEBUG='graphile-build-pg' to see the error\"\n )\n );\n /* eslint-enable no-console */\n }\n debug(error);\n } finally {\n await pgClient.query(\"commit;\");\n }\n }\n );\n }\n\n // Trigger re-introspection on server reconnect\n if (isReconnect) {\n this._handleChange();\n }\n }\n } catch (e) {\n // If something goes wrong, disconnect and try again after a short delay\n this._reconnect(e);\n }\n }\n\n _handleClientError: (e: Error) => void;\n _handleClientError(e) {\n // Client is already cleaned up\n this.client = null;\n this._reallyReleaseClient = null;\n this._reconnect(e);\n }\n async _reconnect(e) {\n if (this.stopped) {\n return;\n }\n // eslint-disable-next-line no-console\n console.error(\n \"Error occurred for PG watching client; reconnecting in 2 seconds.\",\n e.message\n );\n await this._releaseClient();\n setTimeout(() => {\n if (!this.stopped) {\n // Listen for further changes\n this._start(true);\n }\n }, 2000);\n }\n\n // eslint-disable-next-line flowtype/no-weak-types\n _listener: (notification: any) => void;\n // eslint-disable-next-line flowtype/no-weak-types\n async _listener(notification: any) {\n if (notification.channel !== \"postgraphile_watch\") {\n return;\n }\n try {\n const payload = JSON.parse(notification.payload);\n payload.payload = payload.payload || [];\n if (payload.type === \"ddl\") {\n const commands = payload.payload\n .filter(\n ({ schema }) => schema == null || schemas.indexOf(schema) >= 0\n )\n .map(({ command }) => command);\n if (commands.length) {\n this._handleChange();\n }\n } else if (payload.type === \"drop\") {\n const affectsOurSchemas = payload.payload.some(\n schemaName => schemas.indexOf(schemaName) >= 0\n );\n if (affectsOurSchemas) {\n this._handleChange();\n }\n } else {\n throw new Error(`Payload type '${payload.type}' not recognised`);\n }\n } catch (e) {\n debug(`Error occurred parsing notification payload: ${e}`);\n }\n }\n\n async stop() {\n this.stopped = true;\n await this._releaseClient();\n }\n\n async _releaseClient() {\n // $FlowFixMe\n this._handleChange.cancel();\n const pgClient = this.client;\n const reallyReleaseClient = this._reallyReleaseClient;\n this.client = null;\n this._reallyReleaseClient = null;\n if (pgClient) {\n pgClient.query(\"unlisten postgraphile_watch\").catch(e => {\n debug(`Error occurred trying to unlisten watch: ${e}`);\n });\n pgClient.removeListener(\"notification\", this._listener);\n pgClient.removeListener(\"error\", this._handleClientError);\n if (reallyReleaseClient) {\n await reallyReleaseClient();\n }\n }\n }\n }\n\n builder.registerWatcher(\n async triggerRebuild => {\n // In case we started listening before, clean up\n if (listener) {\n await listener.stop();\n }\n // We're not worried about a race condition here.\n // eslint-disable-next-line require-atomic-updates\n listener = new Listener(triggerRebuild);\n },\n async () => {\n const l = listener;\n listener = null;\n if (l) {\n await l.stop();\n }\n }\n );\n\n builder.hook(\n \"build\",\n build => {\n const introspectionResultsByKind = introspectionResultsFromRaw(\n rawIntrospectionResultsByKind,\n build.pgAugmentIntrospectionResults\n );\n if (introspectionResultsByKind.__pgVersion < 90500) {\n // TODO:v5: remove this workaround\n // This is a bit of a hack, but until we have plugin priorities it's the\n // easiest way to conditionally support PG9.4.\n build.pgQueryFromResolveData = queryFromResolveDataFactory({\n supportsJSONB: false,\n });\n }\n return build.extend(build, {\n pgIntrospectionResultsByKind: introspectionResultsByKind,\n });\n },\n [\"PgIntrospection\"],\n [],\n [\"PgBasics\"]\n );\n}: Plugin);\n\n// TypeScript compatibility\nexport const PgEntityKind = {\n NAMESPACE: \"namespace\",\n PROCEDURE: \"procedure\",\n CLASS: \"class\",\n TYPE: \"type\",\n ATTRIBUTE: \"attribute\",\n CONSTRAINT: \"constraint\",\n EXTENSION: \"extension\",\n INDEX: \"index\",\n};\n"],"file":"PgIntrospectionPlugin.js"}
|
|
@@ -67,7 +67,12 @@ var PgJWTPlugin = function PgJWTPlugin(builder, {
|
|
|
67
67
|
|
|
68
68
|
serialize(value) {
|
|
69
69
|
const token = attributes.reduce((memo, attr) => {
|
|
70
|
-
|
|
70
|
+
if (attr.name === "exp") {
|
|
71
|
+
memo[attr.name] = value[attr.name] ? parseFloat(value[attr.name]) : undefined;
|
|
72
|
+
} else {
|
|
73
|
+
memo[attr.name] = value[attr.name];
|
|
74
|
+
}
|
|
75
|
+
|
|
71
76
|
return memo;
|
|
72
77
|
}, {});
|
|
73
78
|
return (0, _jsonwebtoken.sign)(token, pgJwtSecret, Object.assign({}, pgJwtSignOptions, token.aud || pgJwtSignOptions && pgJwtSignOptions.audience ? null : {
|
|
@@ -70,7 +70,13 @@ export default (function PgJWTPlugin(
|
|
|
70
70
|
"A JSON Web Token defined by [RFC 7519](https://tools.ietf.org/html/rfc7519) which securely represents claims between two parties.",
|
|
71
71
|
serialize(value) {
|
|
72
72
|
const token = attributes.reduce((memo, attr) => {
|
|
73
|
-
|
|
73
|
+
if (attr.name === "exp") {
|
|
74
|
+
memo[attr.name] = value[attr.name]
|
|
75
|
+
? parseFloat(value[attr.name])
|
|
76
|
+
: undefined;
|
|
77
|
+
} else {
|
|
78
|
+
memo[attr.name] = value[attr.name];
|
|
79
|
+
}
|
|
74
80
|
return memo;
|
|
75
81
|
}, {});
|
|
76
82
|
return signJwt(
|
|
@@ -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","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,EACT,mIAHJ;;AAIEC,QAAAA,SAAS,CAACC,KAAD,EAAQ;AACf,gBAAMC,KAAK,GAAGR,UAAU,CAACS,MAAX,CAAkB,CAACC,IAAD,EAAOC,IAAP,KAAgB;
|
|
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":"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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:\n \"A JSON Web Token defined by [RFC 7519](https://tools.ietf.org/html/rfc7519) which securely represents claims between two parties.\",\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"}
|
|
@@ -63,7 +63,8 @@ var PgMutationUpdateDeletePlugin = async function PgMutationUpdateDeletePlugin(b
|
|
|
63
63
|
return extend(fields, ["update", "delete"].reduce((outerMemo, mode) => introspectionResultsByKind.class.reduce((memo, table) => {
|
|
64
64
|
// PERFORMANCE: These used to be .filter(...) calls
|
|
65
65
|
if (!table.namespace) return memo;
|
|
66
|
-
const canUpdate = mode === "update" && table.isUpdatable && !omit(table, "update")
|
|
66
|
+
const canUpdate = mode === "update" && table.isUpdatable && !omit(table, "update") && // Check at least one attribute is updatable
|
|
67
|
+
table.attributes.find(attr => !omit(attr, "update"));
|
|
67
68
|
const canDelete = mode === "delete" && table.isDeletable && !omit(table, "delete");
|
|
68
69
|
if (!canUpdate && !canDelete) return memo;
|
|
69
70
|
const TableType = pgGetGqlTypeByTypeIdAndModifier(table.type.id, null);
|
|
@@ -64,7 +64,9 @@ export default (async function PgMutationUpdateDeletePlugin(
|
|
|
64
64
|
const canUpdate =
|
|
65
65
|
mode === "update" &&
|
|
66
66
|
table.isUpdatable &&
|
|
67
|
-
!omit(table, "update")
|
|
67
|
+
!omit(table, "update") &&
|
|
68
|
+
// Check at least one attribute is updatable
|
|
69
|
+
table.attributes.find(attr => !omit(attr, "update"));
|
|
68
70
|
const canDelete =
|
|
69
71
|
mode === "delete" &&
|
|
70
72
|
table.isDeletable &&
|