graphile-settings
Version:
graphile settings
200 lines (199 loc) • 8.62 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConstructivePreset = void 0;
exports.createConstructivePreset = createConstructivePreset;
const graphile_bucket_provisioner_plugin_1 = require("graphile-bucket-provisioner-plugin");
const graphile_bulk_mutations_1 = require("graphile-bulk-mutations");
const graphile_connection_filter_1 = require("graphile-connection-filter");
const graphile_i18n_1 = require("graphile-i18n");
const graphile_ltree_1 = require("graphile-ltree");
const graphile_pg_aggregates_1 = require("graphile-pg-aggregates");
const graphile_postgis_1 = require("graphile-postgis");
const graphile_presigned_url_plugin_1 = require("graphile-presigned-url-plugin");
const graphile_realtime_subscriptions_1 = require("graphile-realtime-subscriptions");
const graphile_search_1 = require("graphile-search");
const graphile_llm_1 = require("graphile-llm");
const graphile_upload_plugin_1 = require("graphile-upload-plugin");
const bucket_provisioner_resolver_1 = require("../bucket-provisioner-resolver");
const plugins_1 = require("../plugins");
const presigned_url_resolver_1 = require("../presigned-url-resolver");
const upload_resolver_1 = require("../upload-resolver");
const DEFAULTS = {
enableAggregates: false,
enablePostgis: true,
enableSearch: true,
enableDirectUploads: true,
enablePresignedUploads: true,
enableManyToMany: true,
enableConnectionFilter: true,
enableLtree: true,
enableLlm: true,
enableRealtime: false,
enableBulk: false,
enableI18n: false
};
/**
* Create a Constructive PostGraphile v5 Preset.
*
* Accepts optional feature flags (`ConstructivePresetOptions`) that map 1-to-1
* with the `database_settings` / `api_settings` tables. When a flag is `true`
* its corresponding plugin preset is included; when `false` it is omitted.
*
* Calling with no arguments produces the same preset as the previous static
* `ConstructivePreset` (everything on except aggregates).
*
* CORE PRESETS (always included):
* - MinimalPreset (PostGraphile without Node/Relay)
* - ConflictDetectorPreset (multi-schema conflict detection)
* - InflektPreset (custom inflection)
* - InflectorLoggerPreset (debugging, INFLECTOR_LOG=1)
* - NoUniqueLookupPreset (primary-key-only lookups)
* - MetaSchemaPreset (_meta introspection)
* - PgTypeMappingsPreset (email, url, etc.)
* - RequiredInputPreset (@requiredInput support)
*
* FLAG-CONTROLLED PRESETS:
* - enableConnectionFilter -> ConnectionFilterPreset, EnableAllFilterColumnsPreset
* - enableManyToMany -> ManyToManyOptInPreset
* - enableSearch -> UnifiedSearchPreset (tsvector, BM25, pg_trgm, pgvector)
* - enablePostgis -> GraphilePostgisPreset
* - enableLtree -> GraphileLtreePreset
* - enableDirectUploads -> UploadPreset
* - enablePresignedUploads -> PresignedUrlPreset, BucketProvisionerPreset
* - enableAggregates -> PgAggregatesPreset (off by default)
* - enableRealtime -> RealtimeSubscriptionsPreset (off by default)
* - enableBulk -> BulkMutationPreset (off by default)
* - enableI18n -> I18nPreset (off by default)
* - enableLlm -> GraphileLlmPreset (auto-embed unifiedSearch, vector text fields)
*
* RELATION FILTERS (when enableConnectionFilter is true):
* - Forward: filter child by parent
* - Backward: filter parent by children
*
* USAGE:
* ```typescript
* import { createConstructivePreset, makePgService } from 'graphile-settings';
*
* // All defaults (same as previous static ConstructivePreset)
* const preset = {
* extends: [createConstructivePreset()],
* pgServices: [makePgService({ connectionString, schemas })],
* };
*
* // With database_settings feature flags
* const preset = {
* extends: [createConstructivePreset({ enableAggregates: true, enablePostgis: false })],
* pgServices: [makePgService({ connectionString, schemas })],
* };
* ```
*/
function createConstructivePreset(options) {
const opts = { ...DEFAULTS, ...options };
// ----- extends array -----
const presets = [
// Core (always on)
plugins_1.MinimalPreset,
plugins_1.ConflictDetectorPreset,
plugins_1.InflektPreset,
plugins_1.InflectorLoggerPreset,
plugins_1.NoUniqueLookupPreset,
plugins_1.MetaSchemaPreset,
plugins_1.PgTypeMappingsPreset,
plugins_1.RequiredInputPreset
];
if (opts.enableConnectionFilter) {
presets.push((0, graphile_connection_filter_1.ConnectionFilterPreset)({ connectionFilterRelations: true }), plugins_1.EnableAllFilterColumnsPreset);
}
if (opts.enableManyToMany) {
presets.push(plugins_1.ManyToManyOptInPreset);
}
if (opts.enableSearch) {
presets.push((0, graphile_search_1.UnifiedSearchPreset)({ fullTextScalarName: 'FullText', tsConfig: 'english' }));
}
if (opts.enablePostgis) {
presets.push(graphile_postgis_1.GraphilePostgisPreset);
}
if (opts.enableLtree) {
presets.push(graphile_ltree_1.GraphileLtreePreset);
}
if (opts.enableDirectUploads) {
presets.push((0, graphile_upload_plugin_1.UploadPreset)({
uploadFieldDefinitions: upload_resolver_1.constructiveUploadFieldDefinitions,
maxFileSize: 10 * 1024 * 1024 // 10MB
}));
}
if (opts.enablePresignedUploads) {
presets.push((0, graphile_presigned_url_plugin_1.PresignedUrlPreset)({
s3: presigned_url_resolver_1.getPresignedUrlS3Config,
resolveBucketName: (0, presigned_url_resolver_1.createBucketNameResolver)(),
ensureBucketProvisioned: (0, presigned_url_resolver_1.createEnsureBucketProvisioned)()
}), (0, graphile_bucket_provisioner_plugin_1.BucketProvisionerPreset)({
connection: bucket_provisioner_resolver_1.getBucketProvisionerConnection,
allowedOrigins: (0, presigned_url_resolver_1.getAllowedOrigins)()
}));
}
if (opts.enableAggregates) {
presets.push(graphile_pg_aggregates_1.PgAggregatesPreset);
}
if (opts.enableRealtime) {
presets.push((0, graphile_realtime_subscriptions_1.RealtimeSubscriptionsPreset)());
}
if (opts.enableBulk) {
presets.push((0, graphile_bulk_mutations_1.BulkMutationPreset)());
}
if (opts.enableI18n) {
presets.push((0, graphile_i18n_1.I18nPreset)());
}
if (opts.enableLlm) {
presets.push((0, graphile_llm_1.GraphileLlmPreset)());
}
// ----- connectionFilterOperatorFactories -----
// Only include operator factories for features that are actually enabled.
// graphile-config replaces (not concatenates) arrays when merging presets,
// so we collect all active factories into a single top-level array.
const operatorFactories = [];
if (opts.enableConnectionFilter) {
if (opts.enableSearch) {
operatorFactories.push((0, graphile_search_1.createMatchesOperatorFactory)('FullText', 'english'), (0, graphile_search_1.createTrgmOperatorFactories)());
}
if (opts.enablePostgis) {
operatorFactories.push((0, graphile_postgis_1.createPostgisOperatorFactory)());
}
if (opts.enableLtree) {
operatorFactories.push((0, graphile_ltree_1.createFolderOperatorFactory)());
}
}
// ----- disablePlugins -----
// When connection filter is enabled it replaces the built-in condition arg.
const disablePlugins = [];
if (opts.enableConnectionFilter) {
disablePlugins.push('PgConditionArgumentPlugin', 'PgConditionCustomFieldsPlugin');
}
// ----- schema options -----
const schema = {};
if (opts.enableConnectionFilter) {
schema.connectionFilterComputedColumns = false;
schema.connectionFilterSetofFunctions = false;
schema.connectionFilterLogicalOperators = true;
schema.connectionFilterArrays = true;
if (operatorFactories.length > 0) {
schema.connectionFilterOperatorFactories = operatorFactories;
}
}
const preset = {
extends: presets
};
if (disablePlugins.length > 0) {
preset.disablePlugins = disablePlugins;
}
if (Object.keys(schema).length > 0) {
preset.schema = schema;
}
return preset;
}
/**
* Default Constructive preset -- everything enabled except aggregates.
* Backwards-compatible: identical to the previous static ConstructivePreset.
*/
exports.ConstructivePreset = createConstructivePreset();
exports.default = exports.ConstructivePreset;