graphile-settings
Version:
graphile settings
100 lines (99 loc) • 4.74 kB
JavaScript
"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;
}