UNPKG

graphile-settings

Version:
200 lines (199 loc) 8.62 kB
"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;