@semilayer/core 0.1.0

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/dist/index.cjs ADDED
@@ -0,0 +1,433 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ DEPLOYMENT_MODES: () => DEPLOYMENT_MODES,
24
+ FACET_NAMES: () => FACET_NAMES,
25
+ FIELD_TYPES: () => FIELD_TYPES,
26
+ FUTURE_FACETS: () => FUTURE_FACETS,
27
+ INGEST_JOB_TYPES: () => INGEST_JOB_TYPES,
28
+ INGEST_STATUSES: () => INGEST_STATUSES,
29
+ KEY_PREFIXES: () => KEY_PREFIXES,
30
+ LENS_STATUSES: () => LENS_STATUSES,
31
+ MERGE_STRATEGIES: () => MERGE_STRATEGIES,
32
+ SOURCE_FEATURES: () => SOURCE_FEATURES,
33
+ TRANSFORM_TYPES: () => TRANSFORM_TYPES,
34
+ canonicalHash: () => canonicalHash,
35
+ defineConfig: () => defineConfig,
36
+ getDeploymentMode: () => getDeploymentMode,
37
+ isSaasMode: () => isSaasMode,
38
+ mapDbTypeToFieldType: () => mapDbTypeToFieldType,
39
+ resolveEmbeddingFieldNames: () => resolveEmbeddingFieldNames,
40
+ resolveEmbeddingFields: () => resolveEmbeddingFields,
41
+ resolveSourceColumns: () => resolveSourceColumns,
42
+ validateConfig: () => validateConfig
43
+ });
44
+ module.exports = __toCommonJS(index_exports);
45
+
46
+ // src/constants.ts
47
+ var FACET_NAMES = [
48
+ "search",
49
+ "similar"
50
+ ];
51
+ var FUTURE_FACETS = ["dedup", "classify"];
52
+ var FIELD_TYPES = [
53
+ "text",
54
+ "number",
55
+ "boolean",
56
+ "date",
57
+ "json",
58
+ "enum",
59
+ "relation"
60
+ ];
61
+ var INGEST_JOB_TYPES = [
62
+ "full",
63
+ "incremental",
64
+ "delete",
65
+ "records"
66
+ ];
67
+ var LENS_STATUSES = [
68
+ "paused",
69
+ "indexing",
70
+ "ready",
71
+ "error"
72
+ ];
73
+ var INGEST_STATUSES = [
74
+ "queued",
75
+ "running",
76
+ "completed",
77
+ "failed"
78
+ ];
79
+ var KEY_PREFIXES = {
80
+ serviceKey: "sk_",
81
+ publishableKey: "pk_",
82
+ ingestKey: "ik_"
83
+ };
84
+ var DEPLOYMENT_MODES = ["saas", "enterprise"];
85
+ var SOURCE_FEATURES = [
86
+ "incremental",
87
+ "change-tracking",
88
+ "streaming"
89
+ ];
90
+ var TRANSFORM_TYPES = [
91
+ "toString",
92
+ "toNumber",
93
+ "toBoolean",
94
+ "toDate",
95
+ "round",
96
+ "trim",
97
+ "lowercase",
98
+ "uppercase",
99
+ "default",
100
+ "split",
101
+ "join",
102
+ "truncate",
103
+ "replace",
104
+ "custom"
105
+ ];
106
+ var MERGE_STRATEGIES = ["concat", "coalesce"];
107
+
108
+ // src/validate.ts
109
+ function validateConfig(config) {
110
+ if (!config.stack || typeof config.stack !== "string") {
111
+ throw new Error("config.stack must be a non-empty string");
112
+ }
113
+ const sourceNames = Object.keys(config.sources);
114
+ if (sourceNames.length === 0) {
115
+ throw new Error("config.sources must define at least one source");
116
+ }
117
+ const lensEntries = Object.entries(config.lenses);
118
+ if (lensEntries.length === 0) {
119
+ throw new Error("config.lenses must define at least one lens");
120
+ }
121
+ for (const [lensName, lens] of lensEntries) {
122
+ if (!sourceNames.includes(lens.source)) {
123
+ throw new Error(
124
+ `lens "${lensName}" references unknown source "${lens.source}"`
125
+ );
126
+ }
127
+ const fieldEntries = Object.entries(lens.fields);
128
+ const fieldNames = fieldEntries.map(([name]) => name);
129
+ if (lens.primaryKey) {
130
+ if (!fieldNames.includes(lens.primaryKey)) {
131
+ throw new Error(
132
+ `lens "${lensName}" primaryKey "${lens.primaryKey}" does not exist in fields`
133
+ );
134
+ }
135
+ const pkInFields = fieldEntries.filter(([, f]) => f.primaryKey);
136
+ const firstPk = pkInFields[0];
137
+ if (firstPk && firstPk[0] !== lens.primaryKey) {
138
+ throw new Error(
139
+ `lens "${lensName}" has primaryKey "${lens.primaryKey}" but field "${firstPk[0]}" also has primaryKey: true`
140
+ );
141
+ }
142
+ } else {
143
+ const primaryKeys = fieldEntries.filter(([, f]) => f.primaryKey);
144
+ if (primaryKeys.length !== 1) {
145
+ throw new Error(
146
+ `lens "${lensName}" must have exactly one primary key field (found ${primaryKeys.length})`
147
+ );
148
+ }
149
+ }
150
+ for (const [fieldName, field] of fieldEntries) {
151
+ if (field.type === "enum" && (!field.values || field.values.length === 0)) {
152
+ throw new Error(
153
+ `field "${fieldName}" in lens "${lensName}" is type "enum" but has no values`
154
+ );
155
+ }
156
+ if (field.type === "relation" && !field.to) {
157
+ throw new Error(
158
+ `field "${fieldName}" in lens "${lensName}" is type "relation" but has no "to"`
159
+ );
160
+ }
161
+ validateFieldMapping(lensName, fieldName, field);
162
+ }
163
+ if (lens.syncInterval) {
164
+ const valid = ["1m", "5m", "15m", "30m", "1h", "6h", "24h"];
165
+ if (!valid.includes(lens.syncInterval)) {
166
+ throw new Error(
167
+ `lens "${lensName}" syncInterval "${lens.syncInterval}" is invalid (valid: ${valid.join(", ")})`
168
+ );
169
+ }
170
+ }
171
+ if (lens.rules) {
172
+ const validRuleKeys = /* @__PURE__ */ new Set([
173
+ ...Object.keys(lens.facets ?? {}),
174
+ "query"
175
+ ]);
176
+ for (const [key, rule] of Object.entries(lens.rules)) {
177
+ if (!validRuleKeys.has(key)) {
178
+ throw new Error(
179
+ `lens "${lensName}" has rule for "${key}" but no matching facet (valid: ${[...validRuleKeys].join(", ")})`
180
+ );
181
+ }
182
+ if (rule !== "public" && rule !== "authenticated" && typeof rule !== "function") {
183
+ throw new Error(
184
+ `lens "${lensName}" rule "${key}" must be 'public', 'authenticated', or a function`
185
+ );
186
+ }
187
+ }
188
+ }
189
+ for (const [facetName, facet] of Object.entries(lens.facets)) {
190
+ if (!FACET_NAMES.includes(facetName)) {
191
+ throw new Error(
192
+ `lens "${lensName}" has invalid facet name "${facetName}" (valid: ${FACET_NAMES.join(", ")})`
193
+ );
194
+ }
195
+ if ("fields" in facet && Array.isArray(facet.fields)) {
196
+ for (const ref of facet.fields) {
197
+ if (!fieldNames.includes(ref)) {
198
+ throw new Error(
199
+ `facet "${facetName}" in lens "${lensName}" references unknown field "${ref}"`
200
+ );
201
+ }
202
+ }
203
+ }
204
+ }
205
+ }
206
+ }
207
+ function validateFieldMapping(lensName, fieldName, field) {
208
+ if (field.from === void 0) return;
209
+ if (Array.isArray(field.from)) {
210
+ if (!field.merge) {
211
+ throw new Error(
212
+ `field "${fieldName}" in lens "${lensName}" has multiple sources but no merge strategy`
213
+ );
214
+ }
215
+ if (field.merge === "concat" && field.separator === void 0) {
216
+ throw new Error(
217
+ `field "${fieldName}" in lens "${lensName}" uses merge "concat" but has no separator`
218
+ );
219
+ }
220
+ if (field.from.length < 2) {
221
+ throw new Error(
222
+ `field "${fieldName}" in lens "${lensName}" has multi-source from but fewer than 2 entries`
223
+ );
224
+ }
225
+ } else if (typeof field.from !== "string") {
226
+ throw new Error(
227
+ `field "${fieldName}" in lens "${lensName}" has invalid from value (must be string or string[])`
228
+ );
229
+ }
230
+ if (field.transform) {
231
+ validateTransformSpec(lensName, fieldName, field.transform);
232
+ }
233
+ }
234
+ function validateTransformSpec(lensName, fieldName, spec) {
235
+ const transforms = Array.isArray(spec) ? spec : [spec];
236
+ for (const t of transforms) {
237
+ if (!t || typeof t !== "object" || !("type" in t)) {
238
+ throw new Error(
239
+ `field "${fieldName}" in lens "${lensName}" has invalid transform (missing type)`
240
+ );
241
+ }
242
+ if (!TRANSFORM_TYPES.includes(t.type)) {
243
+ throw new Error(
244
+ `field "${fieldName}" in lens "${lensName}" has unknown transform type "${t.type}"`
245
+ );
246
+ }
247
+ validateTransformFields(lensName, fieldName, t);
248
+ }
249
+ }
250
+ function validateTransformFields(lensName, fieldName, t) {
251
+ switch (t.type) {
252
+ case "split":
253
+ if (typeof t.separator !== "string") {
254
+ throw new Error(
255
+ `field "${fieldName}" in lens "${lensName}" transform "split" requires "separator"`
256
+ );
257
+ }
258
+ break;
259
+ case "join":
260
+ if (typeof t.separator !== "string") {
261
+ throw new Error(
262
+ `field "${fieldName}" in lens "${lensName}" transform "join" requires "separator"`
263
+ );
264
+ }
265
+ break;
266
+ case "truncate":
267
+ if (typeof t.length !== "number" || t.length < 0) {
268
+ throw new Error(
269
+ `field "${fieldName}" in lens "${lensName}" transform "truncate" requires positive "length"`
270
+ );
271
+ }
272
+ break;
273
+ case "replace":
274
+ if (typeof t.pattern !== "string" || typeof t.replacement !== "string") {
275
+ throw new Error(
276
+ `field "${fieldName}" in lens "${lensName}" transform "replace" requires "pattern" and "replacement"`
277
+ );
278
+ }
279
+ break;
280
+ case "custom":
281
+ if (typeof t.body !== "string") {
282
+ throw new Error(
283
+ `field "${fieldName}" in lens "${lensName}" transform "custom" requires "body" string`
284
+ );
285
+ }
286
+ break;
287
+ case "round":
288
+ if (t.mode && !["round", "ceil", "floor"].includes(t.mode)) {
289
+ throw new Error(
290
+ `field "${fieldName}" in lens "${lensName}" transform "round" mode must be 'round', 'ceil', or 'floor'`
291
+ );
292
+ }
293
+ break;
294
+ }
295
+ }
296
+
297
+ // src/mapping.ts
298
+ function resolveSourceColumns(fields) {
299
+ const cols = /* @__PURE__ */ new Set();
300
+ for (const [outputName, config] of Object.entries(fields)) {
301
+ if (config.from) {
302
+ if (Array.isArray(config.from)) {
303
+ for (const src of config.from) cols.add(src);
304
+ } else {
305
+ cols.add(config.from);
306
+ }
307
+ } else {
308
+ cols.add(outputName);
309
+ }
310
+ }
311
+ return [...cols];
312
+ }
313
+ function resolveEmbeddingFields(fields) {
314
+ const result = [];
315
+ for (const [name, config] of Object.entries(fields)) {
316
+ if (!config.searchable) continue;
317
+ const weight = typeof config.searchable === "object" ? config.searchable.weight ?? 1 : 1;
318
+ result.push({ field: name, weight });
319
+ }
320
+ return result;
321
+ }
322
+ function resolveEmbeddingFieldNames(fields) {
323
+ return resolveEmbeddingFields(fields).map((e) => e.field);
324
+ }
325
+
326
+ // src/hash.ts
327
+ var import_node_crypto = require("crypto");
328
+ function canonicalHash(obj) {
329
+ const json = JSON.stringify(sortKeys(obj)) ?? "null";
330
+ const digest = (0, import_node_crypto.createHash)("sha256").update(json).digest("hex");
331
+ return `sha256:${digest}`;
332
+ }
333
+ function sortKeys(value) {
334
+ if (value === null || value === void 0) return value;
335
+ if (Array.isArray(value)) return value.map(sortKeys);
336
+ if (typeof value === "object") {
337
+ const sorted = {};
338
+ for (const key of Object.keys(value).sort()) {
339
+ sorted[key] = sortKeys(value[key]);
340
+ }
341
+ return sorted;
342
+ }
343
+ return value;
344
+ }
345
+
346
+ // src/type-mapper.ts
347
+ var DB_TYPE_MAP = {
348
+ // Text
349
+ varchar: "text",
350
+ text: "text",
351
+ char: "text",
352
+ "character varying": "text",
353
+ character: "text",
354
+ citext: "text",
355
+ uuid: "text",
356
+ name: "text",
357
+ // Number
358
+ integer: "number",
359
+ int: "number",
360
+ int4: "number",
361
+ bigint: "number",
362
+ int8: "number",
363
+ smallint: "number",
364
+ int2: "number",
365
+ numeric: "number",
366
+ decimal: "number",
367
+ real: "number",
368
+ float4: "number",
369
+ "double precision": "number",
370
+ float8: "number",
371
+ serial: "number",
372
+ bigserial: "number",
373
+ // Boolean
374
+ boolean: "boolean",
375
+ bool: "boolean",
376
+ // Date
377
+ timestamp: "date",
378
+ "timestamp with time zone": "date",
379
+ "timestamp without time zone": "date",
380
+ timestamptz: "date",
381
+ date: "date",
382
+ time: "date",
383
+ "time with time zone": "date",
384
+ "time without time zone": "date",
385
+ timetz: "date",
386
+ // JSON
387
+ json: "json",
388
+ jsonb: "json",
389
+ // Arrays → json
390
+ "ARRAY": "json"
391
+ };
392
+ function mapDbTypeToFieldType(dbType) {
393
+ const normalized = dbType.toLowerCase().trim();
394
+ return DB_TYPE_MAP[normalized] ?? "text";
395
+ }
396
+
397
+ // src/deployment.ts
398
+ function getDeploymentMode() {
399
+ return process.env.DEPLOYMENT_MODE ?? "enterprise";
400
+ }
401
+ function isSaasMode() {
402
+ return getDeploymentMode() === "saas";
403
+ }
404
+
405
+ // src/index.ts
406
+ function defineConfig(config) {
407
+ validateConfig(config);
408
+ return config;
409
+ }
410
+ // Annotate the CommonJS export names for ESM import in node:
411
+ 0 && (module.exports = {
412
+ DEPLOYMENT_MODES,
413
+ FACET_NAMES,
414
+ FIELD_TYPES,
415
+ FUTURE_FACETS,
416
+ INGEST_JOB_TYPES,
417
+ INGEST_STATUSES,
418
+ KEY_PREFIXES,
419
+ LENS_STATUSES,
420
+ MERGE_STRATEGIES,
421
+ SOURCE_FEATURES,
422
+ TRANSFORM_TYPES,
423
+ canonicalHash,
424
+ defineConfig,
425
+ getDeploymentMode,
426
+ isSaasMode,
427
+ mapDbTypeToFieldType,
428
+ resolveEmbeddingFieldNames,
429
+ resolveEmbeddingFields,
430
+ resolveSourceColumns,
431
+ validateConfig
432
+ });
433
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/validate.ts","../src/mapping.ts","../src/hash.ts","../src/type-mapper.ts","../src/deployment.ts"],"sourcesContent":["import type { SemiLayerConfig } from './config.js'\r\nimport { validateConfig } from './validate.js'\r\n\r\nexport function defineConfig(config: SemiLayerConfig): SemiLayerConfig {\r\n validateConfig(config)\r\n return config\r\n}\r\n\r\nexport { validateConfig } from './validate.js'\r\n\r\nexport type {\r\n SemiLayerConfig,\r\n SourceConfig,\r\n LensConfig,\r\n FieldConfig,\r\n SearchFacetConfig,\r\n SimilarFacetConfig,\r\n DedupFacetConfig,\r\n ClassifyFacetConfig,\r\n FacetConfig,\r\n AuthConfig,\r\n JwtConfig,\r\n JwtClaims,\r\n AccessRule,\r\n AccessRuleResult,\r\n ClaimCheck,\r\n EnvironmentAuthConfig,\r\n LensRules,\r\n LensRuleKey,\r\n EmbeddingConfig,\r\n BuiltinTransform,\r\n TransformSpec,\r\n SyncInterval,\r\n} from './config.js'\r\n\r\nexport { resolveSourceColumns, resolveEmbeddingFields, resolveEmbeddingFieldNames } from './mapping.js'\r\nexport type { EmbeddingField } from './mapping.js'\r\nexport { canonicalHash } from './hash.js'\r\nexport { mapDbTypeToFieldType } from './type-mapper.js'\r\n\r\nexport type {\r\n WhereClause,\r\n OrderByClause,\r\n QueryOptions,\r\n QueryResult,\r\n} from './query.js'\r\n\r\nexport type {\r\n BridgeRow,\r\n ReadOptions,\r\n ReadResult,\r\n TargetColumnInfo,\r\n TargetSchema,\r\n Bridge,\r\n BridgeConstructor,\r\n} from './bridge.js'\r\n\r\nexport type {\r\n TransportMode,\r\n TransportOptions,\r\n} from './transport.js'\r\n\r\nexport type {\r\n IngestJobPayload,\r\n IngestJobData,\r\n IngestControl,\r\n RateLimitState,\r\n IngestErrorEntry,\r\n LensStatusInfo,\r\n QueueCounts,\r\n FailedJobInfo,\r\n} from './ingest.js'\r\n\r\nexport {\r\n FACET_NAMES,\r\n FUTURE_FACETS,\r\n FIELD_TYPES,\r\n INGEST_JOB_TYPES,\r\n LENS_STATUSES,\r\n INGEST_STATUSES,\r\n KEY_PREFIXES,\r\n DEPLOYMENT_MODES,\r\n SOURCE_FEATURES,\r\n TRANSFORM_TYPES,\r\n MERGE_STRATEGIES,\r\n} from './constants.js'\r\n\r\nexport type {\r\n FacetName,\r\n FieldType,\r\n IngestJobType,\r\n IngestStatus,\r\n LensStatus,\r\n DeploymentMode,\r\n SourceFeature,\r\n TransformType,\r\n MergeStrategy,\r\n} from './constants.js'\r\n\r\nexport type {\r\n ISODateString,\r\n Org,\r\n Project,\r\n Environment,\r\n Source,\r\n Lens,\r\n ApiKeyInfo,\r\n Member,\r\n IngestRun,\r\n Tier,\r\n TierOverride,\r\n TierSummary,\r\n AuthUser,\r\n AuthOrg,\r\n MeResponse,\r\n NewKeyPair,\r\n CreateProjectResponse,\r\n CreateEnvResponse,\r\n PushLensSummary,\r\n PushIngestJob,\r\n PushResponse,\r\n StatusEnvironment,\r\n StatusResponse,\r\n PlatformAdmin,\r\n AuditLogEntry,\r\n PlatformStats,\r\n SystemHealth,\r\n InAppNotification,\r\n NotificationPreferenceSummary,\r\n OrgListItem,\r\n OrgDetailResponse,\r\n ProjectWithEnvs,\r\n InviteInfo,\r\n DriftLensInfo,\r\n DriftResponse,\r\n EnvsResponse,\r\n ConfigExportResponse,\r\n LensComparison,\r\n LensCreateResponse,\r\n DailyMetrics,\r\n MetricPoint,\r\n BannerData,\r\n FeedbackItem,\r\n FeedbackDetail,\r\n BannedIp,\r\n BannedUser,\r\n SearchParams,\r\n SearchResult,\r\n SearchResponse,\r\n SimilarParams,\r\n SimilarResponse,\r\n QueryParams,\r\n QueryResponse,\r\n AdminUserListItem,\r\n AdminUserListResponse,\r\n AdminUserOrgMembership,\r\n AdminUserDetail,\r\n AdminAssignUserBody,\r\n PendingInvite,\r\n PendingInvitesResponse,\r\n // Step 12 — Billing\r\n BillingSnapshot,\r\n BillingPlan,\r\n UsageMetricSnapshot,\r\n BillingCycleInfo,\r\n Invoice,\r\n TierFull,\r\n TiersResponse,\r\n CheckoutRequest,\r\n BillingRedirectResponse,\r\n CancelSubscriptionRequest,\r\n AdminMrrSnapshot,\r\n AdminCashSnapshot,\r\n AdminStripeEventRow,\r\n AdminOrgUsage,\r\n AdminTopConsumerRow,\r\n AdminTopConsumersResponse,\r\n TierOverrideRequest,\r\n QuotaErrorResponse,\r\n} from './models.js'\r\n\r\nexport { getDeploymentMode, isSaasMode } from './deployment.js'\r\n","export const FACET_NAMES = [\r\n 'search',\r\n 'similar',\r\n] as const\r\n\r\nexport type FacetName = (typeof FACET_NAMES)[number]\r\n\r\n/** Facets planned for future releases. Config types exist but no runtime support yet. */\r\nexport const FUTURE_FACETS = ['dedup', 'classify'] as const\r\n\r\nexport const FIELD_TYPES = [\r\n 'text',\r\n 'number',\r\n 'boolean',\r\n 'date',\r\n 'json',\r\n 'enum',\r\n 'relation',\r\n] as const\r\n\r\nexport type FieldType = (typeof FIELD_TYPES)[number]\r\n\r\nexport const INGEST_JOB_TYPES = [\r\n 'full',\r\n 'incremental',\r\n 'delete',\r\n 'records',\r\n] as const\r\n\r\nexport type IngestJobType = (typeof INGEST_JOB_TYPES)[number]\r\n\r\nexport const LENS_STATUSES = [\r\n 'paused',\r\n 'indexing',\r\n 'ready',\r\n 'error',\r\n] as const\r\n\r\nexport type LensStatus = (typeof LENS_STATUSES)[number]\r\n\r\nexport const INGEST_STATUSES = [\r\n 'queued',\r\n 'running',\r\n 'completed',\r\n 'failed',\r\n] as const\r\n\r\nexport type IngestStatus = (typeof INGEST_STATUSES)[number]\r\n\r\nexport const KEY_PREFIXES = {\r\n serviceKey: 'sk_',\r\n publishableKey: 'pk_',\r\n ingestKey: 'ik_',\r\n} as const\r\n\r\nexport const DEPLOYMENT_MODES = ['saas', 'enterprise'] as const\r\n\r\nexport type DeploymentMode = (typeof DEPLOYMENT_MODES)[number]\r\n\r\nexport const SOURCE_FEATURES = [\r\n 'incremental',\r\n 'change-tracking',\r\n 'streaming',\r\n] as const\r\n\r\nexport type SourceFeature = (typeof SOURCE_FEATURES)[number]\r\n\r\nexport const TRANSFORM_TYPES = [\r\n 'toString',\r\n 'toNumber',\r\n 'toBoolean',\r\n 'toDate',\r\n 'round',\r\n 'trim',\r\n 'lowercase',\r\n 'uppercase',\r\n 'default',\r\n 'split',\r\n 'join',\r\n 'truncate',\r\n 'replace',\r\n 'custom',\r\n] as const\r\n\r\nexport type TransformType = (typeof TRANSFORM_TYPES)[number]\r\n\r\nexport const MERGE_STRATEGIES = ['concat', 'coalesce'] as const\r\n\r\nexport type MergeStrategy = (typeof MERGE_STRATEGIES)[number]\r\n","import type {\n SemiLayerConfig,\n FieldConfig,\n BuiltinTransform,\n TransformSpec,\n} from './config.js'\nimport { FACET_NAMES, TRANSFORM_TYPES } from './constants.js'\n\nexport function validateConfig(config: SemiLayerConfig): void {\n if (!config.stack || typeof config.stack !== 'string') {\n throw new Error('config.stack must be a non-empty string')\n }\n\n const sourceNames = Object.keys(config.sources)\n if (sourceNames.length === 0) {\n throw new Error('config.sources must define at least one source')\n }\n\n const lensEntries = Object.entries(config.lenses)\n if (lensEntries.length === 0) {\n throw new Error('config.lenses must define at least one lens')\n }\n\n for (const [lensName, lens] of lensEntries) {\n if (!sourceNames.includes(lens.source)) {\n throw new Error(\n `lens \"${lensName}\" references unknown source \"${lens.source}\"`,\n )\n }\n\n const fieldEntries = Object.entries(lens.fields)\n const fieldNames = fieldEntries.map(([name]) => name)\n\n // ── Primary key resolution ─────────────────────────────────\n if (lens.primaryKey) {\n if (!fieldNames.includes(lens.primaryKey)) {\n throw new Error(\n `lens \"${lensName}\" primaryKey \"${lens.primaryKey}\" does not exist in fields`,\n )\n }\n const pkInFields = fieldEntries.filter(([, f]) => f.primaryKey)\n const firstPk = pkInFields[0]\n if (firstPk && firstPk[0] !== lens.primaryKey) {\n throw new Error(\n `lens \"${lensName}\" has primaryKey \"${lens.primaryKey}\" but field \"${firstPk[0]}\" also has primaryKey: true`,\n )\n }\n } else {\n const primaryKeys = fieldEntries.filter(([, f]) => f.primaryKey)\n if (primaryKeys.length !== 1) {\n throw new Error(\n `lens \"${lensName}\" must have exactly one primary key field (found ${primaryKeys.length})`,\n )\n }\n }\n\n // ── Field validation (type-specific + mapping props) ──────\n for (const [fieldName, field] of fieldEntries) {\n if (field.type === 'enum' && (!field.values || field.values.length === 0)) {\n throw new Error(\n `field \"${fieldName}\" in lens \"${lensName}\" is type \"enum\" but has no values`,\n )\n }\n if (field.type === 'relation' && !field.to) {\n throw new Error(\n `field \"${fieldName}\" in lens \"${lensName}\" is type \"relation\" but has no \"to\"`,\n )\n }\n\n // Mapping validation — inline\n validateFieldMapping(lensName, fieldName, field)\n }\n\n // ── Sync interval validation ─────────────────────────────────\n if (lens.syncInterval) {\n const valid = ['1m', '5m', '15m', '30m', '1h', '6h', '24h']\n if (!valid.includes(lens.syncInterval)) {\n throw new Error(\n `lens \"${lensName}\" syncInterval \"${lens.syncInterval}\" is invalid (valid: ${valid.join(', ')})`,\n )\n }\n }\n\n // ── Rules validation ───────────────────────────────────────\n if (lens.rules) {\n const validRuleKeys = new Set<string>([\n ...Object.keys(lens.facets ?? {}),\n 'query',\n ])\n\n for (const [key, rule] of Object.entries(lens.rules)) {\n if (!validRuleKeys.has(key)) {\n throw new Error(\n `lens \"${lensName}\" has rule for \"${key}\" but no matching facet (valid: ${[...validRuleKeys].join(', ')})`,\n )\n }\n\n if (rule !== 'public' && rule !== 'authenticated' && typeof rule !== 'function') {\n throw new Error(\n `lens \"${lensName}\" rule \"${key}\" must be 'public', 'authenticated', or a function`,\n )\n }\n }\n }\n\n // ── Facet validation (directly against field keys) ─────────\n for (const [facetName, facet] of Object.entries(lens.facets)) {\n if (!FACET_NAMES.includes(facetName as never)) {\n throw new Error(\n `lens \"${lensName}\" has invalid facet name \"${facetName}\" (valid: ${FACET_NAMES.join(', ')})`,\n )\n }\n\n if ('fields' in facet && Array.isArray(facet.fields)) {\n for (const ref of facet.fields) {\n if (!fieldNames.includes(ref)) {\n throw new Error(\n `facet \"${facetName}\" in lens \"${lensName}\" references unknown field \"${ref}\"`,\n )\n }\n }\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Field mapping validation\n// ---------------------------------------------------------------------------\n\nfunction validateFieldMapping(\n lensName: string,\n fieldName: string,\n field: FieldConfig,\n): void {\n if (field.from === undefined) return // identity mapping, nothing to validate\n\n if (Array.isArray(field.from)) {\n // Multi-source\n if (!field.merge) {\n throw new Error(\n `field \"${fieldName}\" in lens \"${lensName}\" has multiple sources but no merge strategy`,\n )\n }\n if (field.merge === 'concat' && field.separator === undefined) {\n throw new Error(\n `field \"${fieldName}\" in lens \"${lensName}\" uses merge \"concat\" but has no separator`,\n )\n }\n if (field.from.length < 2) {\n throw new Error(\n `field \"${fieldName}\" in lens \"${lensName}\" has multi-source from but fewer than 2 entries`,\n )\n }\n } else if (typeof field.from !== 'string') {\n throw new Error(\n `field \"${fieldName}\" in lens \"${lensName}\" has invalid from value (must be string or string[])`,\n )\n }\n\n if (field.transform) {\n validateTransformSpec(lensName, fieldName, field.transform)\n }\n}\n\nfunction validateTransformSpec(lensName: string, fieldName: string, spec: TransformSpec): void {\n const transforms = Array.isArray(spec) ? spec : [spec]\n for (const t of transforms) {\n if (!t || typeof t !== 'object' || !('type' in t)) {\n throw new Error(\n `field \"${fieldName}\" in lens \"${lensName}\" has invalid transform (missing type)`,\n )\n }\n if (!TRANSFORM_TYPES.includes(t.type as never)) {\n throw new Error(\n `field \"${fieldName}\" in lens \"${lensName}\" has unknown transform type \"${t.type}\"`,\n )\n }\n validateTransformFields(lensName, fieldName, t)\n }\n}\n\nfunction validateTransformFields(lensName: string, fieldName: string, t: BuiltinTransform): void {\n switch (t.type) {\n case 'split':\n if (typeof t.separator !== 'string') {\n throw new Error(\n `field \"${fieldName}\" in lens \"${lensName}\" transform \"split\" requires \"separator\"`,\n )\n }\n break\n case 'join':\n if (typeof t.separator !== 'string') {\n throw new Error(\n `field \"${fieldName}\" in lens \"${lensName}\" transform \"join\" requires \"separator\"`,\n )\n }\n break\n case 'truncate':\n if (typeof t.length !== 'number' || t.length < 0) {\n throw new Error(\n `field \"${fieldName}\" in lens \"${lensName}\" transform \"truncate\" requires positive \"length\"`,\n )\n }\n break\n case 'replace':\n if (typeof t.pattern !== 'string' || typeof t.replacement !== 'string') {\n throw new Error(\n `field \"${fieldName}\" in lens \"${lensName}\" transform \"replace\" requires \"pattern\" and \"replacement\"`,\n )\n }\n break\n case 'custom':\n if (typeof t.body !== 'string') {\n throw new Error(\n `field \"${fieldName}\" in lens \"${lensName}\" transform \"custom\" requires \"body\" string`,\n )\n }\n break\n case 'round':\n if (t.mode && !['round', 'ceil', 'floor'].includes(t.mode)) {\n throw new Error(\n `field \"${fieldName}\" in lens \"${lensName}\" transform \"round\" mode must be 'round', 'ceil', or 'floor'`,\n )\n }\n break\n }\n}\n","import type { FieldConfig } from './config.js'\n\n/**\n * Returns the list of source column names that the bridge needs to read.\n * Derives from `from` properties on fields, falling back to the output field name.\n */\nexport function resolveSourceColumns(fields: Record<string, FieldConfig>): string[] {\n const cols = new Set<string>()\n for (const [outputName, config] of Object.entries(fields)) {\n if (config.from) {\n if (Array.isArray(config.from)) {\n for (const src of config.from) cols.add(src)\n } else {\n cols.add(config.from)\n }\n } else {\n cols.add(outputName)\n }\n }\n return [...cols]\n}\n\nexport interface EmbeddingField {\n field: string\n weight: number\n}\n\n/**\n * Returns the output field names that are marked for embedding,\n * with their weights. Weight controls how many times a field's text\n * is repeated in the embedding input (higher = more relevance).\n */\nexport function resolveEmbeddingFields(fields: Record<string, FieldConfig>): EmbeddingField[] {\n const result: EmbeddingField[] = []\n for (const [name, config] of Object.entries(fields)) {\n if (!config.searchable) continue\n const weight =\n typeof config.searchable === 'object'\n ? (config.searchable.weight ?? 1)\n : 1\n result.push({ field: name, weight })\n }\n return result\n}\n\n/**\n * Convenience: returns just the field names (for APIs that only need names).\n */\nexport function resolveEmbeddingFieldNames(fields: Record<string, FieldConfig>): string[] {\n return resolveEmbeddingFields(fields).map((e) => e.field)\n}\n","import { createHash } from 'node:crypto'\n\n/**\n * Creates a deterministic SHA-256 hash of any JSON-serializable value.\n * Object keys are sorted recursively to ensure determinism regardless of insertion order.\n */\nexport function canonicalHash(obj: unknown): string {\n const json = JSON.stringify(sortKeys(obj)) ?? 'null'\n const digest = createHash('sha256').update(json).digest('hex')\n return `sha256:${digest}`\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (value === null || value === undefined) return value\n if (Array.isArray(value)) return value.map(sortKeys)\n if (typeof value === 'object') {\n const sorted: Record<string, unknown> = {}\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n sorted[key] = sortKeys((value as Record<string, unknown>)[key])\n }\n return sorted\n }\n return value\n}\n","import type { FieldType } from './constants.js'\n\nconst DB_TYPE_MAP: Record<string, FieldType> = {\n // Text\n varchar: 'text',\n text: 'text',\n char: 'text',\n 'character varying': 'text',\n character: 'text',\n citext: 'text',\n uuid: 'text',\n name: 'text',\n\n // Number\n integer: 'number',\n int: 'number',\n int4: 'number',\n bigint: 'number',\n int8: 'number',\n smallint: 'number',\n int2: 'number',\n numeric: 'number',\n decimal: 'number',\n real: 'number',\n float4: 'number',\n 'double precision': 'number',\n float8: 'number',\n serial: 'number',\n bigserial: 'number',\n\n // Boolean\n boolean: 'boolean',\n bool: 'boolean',\n\n // Date\n timestamp: 'date',\n 'timestamp with time zone': 'date',\n 'timestamp without time zone': 'date',\n timestamptz: 'date',\n date: 'date',\n time: 'date',\n 'time with time zone': 'date',\n 'time without time zone': 'date',\n timetz: 'date',\n\n // JSON\n json: 'json',\n jsonb: 'json',\n\n // Arrays → json\n 'ARRAY': 'json',\n}\n\n/**\n * Maps a raw database column type to a SemiLayer FieldType.\n * Falls back to 'text' for unknown types.\n */\nexport function mapDbTypeToFieldType(dbType: string): FieldType {\n const normalized = dbType.toLowerCase().trim()\n return DB_TYPE_MAP[normalized] ?? 'text'\n}\n","import type { DeploymentMode } from './constants.js'\r\n\r\nexport function getDeploymentMode(): DeploymentMode {\r\n return (process.env.DEPLOYMENT_MODE as DeploymentMode) ?? 'enterprise'\r\n}\r\n\r\nexport function isSaasMode(): boolean {\r\n return getDeploymentMode() === 'saas'\r\n}\r\n"],"mappings":"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","names":[]}