UNPKG

graphile-settings

Version:
100 lines (99 loc) 4.74 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.collectTablesMeta = collectTablesMeta; const constraint_meta_builders_1 = require("./constraint-meta-builders"); const name_meta_builders_1 = require("./name-meta-builders"); const relation_meta_builders_1 = require("./relation-meta-builders"); const storage_search_meta_builders_1 = require("./storage-search-meta-builders"); const type_mappings_1 = require("./type-mappings"); const table_meta_context_1 = require("./table-meta-context"); const table_resource_utils_1 = require("./table-resource-utils"); function buildTableMeta(resource, schemaName, context) { const codec = resource.codec; const attributes = codec.attributes; const uniques = (0, table_resource_utils_1.getUniques)(resource); const relations = (0, table_resource_utils_1.getRelations)(resource); // Compute PK and FK attribute name sets for field metadata const pkAttrNames = new Set(); const fkAttrNames = new Set(); for (const unique of uniques) { if (unique.isPrimary) { for (const attrName of unique.attributes) pkAttrNames.add(attrName); } } for (const relation of Object.values(relations)) { if (relation.isReferencee) continue; for (const attrName of relation.localAttributes || []) fkAttrNames.add(attrName); } const fields = Object.entries(attributes).map(([attrName, attr]) => (0, type_mappings_1.buildFieldMeta)(context.inflectAttr(attrName, codec), attr, context.build, { isPrimaryKey: pkAttrNames.has(attrName), isForeignKey: fkAttrNames.has(attrName), })); const indexes = (0, constraint_meta_builders_1.buildIndexes)(codec, attributes, uniques, context); const primaryKey = (0, constraint_meta_builders_1.buildPrimaryKey)(codec, attributes, uniques, context); const uniqueConstraints = (0, constraint_meta_builders_1.buildUniqueConstraints)(codec, attributes, uniques, context); const foreignKeyConstraints = (0, constraint_meta_builders_1.buildForeignKeyConstraints)(codec, attributes, relations, context); const constraints = { primaryKey, unique: uniqueConstraints, foreignKey: foreignKeyConstraints, }; const belongsTo = (0, relation_meta_builders_1.buildBelongsToRelations)(codec, attributes, uniques, relations, context); const { hasOne, hasMany } = (0, relation_meta_builders_1.buildReverseRelations)(codec, attributes, relations, context); const manyToMany = (0, relation_meta_builders_1.buildManyToManyRelations)(resource, codec, context); const relationsMeta = { belongsTo, has: [...hasOne, ...hasMany], hasOne, hasMany, manyToMany, }; const tableType = (0, name_meta_builders_1.resolveTableType)(context.build, codec); const storage = (0, storage_search_meta_builders_1.buildStorageMeta)(codec); const search = (0, storage_search_meta_builders_1.buildSearchMeta)(codec, context.build, context.inflectAttr); const i18n = (0, storage_search_meta_builders_1.buildI18nMeta)(codec, context.build, context.inflectAttr); const realtime = (0, storage_search_meta_builders_1.buildRealtimeMeta)(codec, context.build); return { name: tableType, schemaName, fields, indexes, constraints, foreignKeyConstraints, primaryKeyConstraints: primaryKey ? [primaryKey] : [], uniqueConstraints, relations: relationsMeta, inflection: (0, name_meta_builders_1.buildInflectionMeta)(resource, tableType, context.build), query: (0, name_meta_builders_1.buildQueryMeta)(resource, uniques, tableType, context.build), storage, search, i18n, realtime, }; } function collectTablesMeta(build) { const configuredSchemas = (0, table_resource_utils_1.getConfiguredSchemas)(build); const context = (0, table_meta_context_1.createBuildContext)(build); const seenCodecs = new Set(); const tablesMeta = []; for (const resource of Object.values(build.input.pgRegistry.pgResources || {})) { if (!(0, table_resource_utils_1.isTableResource)(resource)) continue; const codec = resource.codec; if (seenCodecs.has(codec)) continue; seenCodecs.add(codec); const schemaName = (0, table_resource_utils_1.getSchemaName)(resource); if (!schemaName) continue; if (configuredSchemas.length > 0 && !configuredSchemas.includes(schemaName)) { continue; } tablesMeta.push(buildTableMeta(resource, schemaName, context)); } return tablesMeta; }