@dyrected/core 2.20.0 → 2.20.1

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.
@@ -553,11 +553,19 @@ type InferAggregateResult<T extends AggregateInput> = {
553
553
  * so adding a new operator without handling it will produce a TypeScript error
554
554
  * in every adapter translator.
555
555
  */
556
- type WhereOperatorName = 'equals' | 'not_equals' | 'in' | 'not_in' | 'gt' | 'greater_than' | 'gte' | 'greater_than_equal' | 'greater_than_or_equal' | 'lt' | 'less_than' | 'lte' | 'less_than_equal' | 'less_than_or_equal' | 'contains' | 'like' | 'starts_with' | 'exists';
556
+ type WhereOperatorName = 'equals' | 'not_equals' | 'not' | 'ne' | 'not_equal' | 'notEquals' | 'in' | 'not_in' | 'gt' | 'greater_than' | 'gte' | 'greater_than_equal' | 'greater_than_or_equal' | 'lt' | 'less_than' | 'lte' | 'less_than_equal' | 'less_than_or_equal' | 'contains' | 'like' | 'starts_with' | 'exists';
557
557
  type WhereOperator = {
558
558
  equals: any;
559
559
  } | {
560
560
  not_equals: any;
561
+ } | {
562
+ not: any;
563
+ } | {
564
+ ne: any;
565
+ } | {
566
+ not_equal: any;
567
+ } | {
568
+ notEquals: any;
561
569
  } | {
562
570
  in: any[];
563
571
  } | {
@@ -598,6 +606,8 @@ type WhereClause = {
598
606
  or?: WhereClause[] | readonly WhereClause[];
599
607
  AND?: WhereClause[] | readonly WhereClause[];
600
608
  and?: WhereClause[] | readonly WhereClause[];
609
+ NOT?: WhereClause[] | readonly WhereClause[] | WhereClause;
610
+ not?: WhereClause[] | readonly WhereClause[] | WhereClause;
601
611
  };
602
612
  interface SqlWhereResult {
603
613
  sql: string;
@@ -553,11 +553,19 @@ type InferAggregateResult<T extends AggregateInput> = {
553
553
  * so adding a new operator without handling it will produce a TypeScript error
554
554
  * in every adapter translator.
555
555
  */
556
- type WhereOperatorName = 'equals' | 'not_equals' | 'in' | 'not_in' | 'gt' | 'greater_than' | 'gte' | 'greater_than_equal' | 'greater_than_or_equal' | 'lt' | 'less_than' | 'lte' | 'less_than_equal' | 'less_than_or_equal' | 'contains' | 'like' | 'starts_with' | 'exists';
556
+ type WhereOperatorName = 'equals' | 'not_equals' | 'not' | 'ne' | 'not_equal' | 'notEquals' | 'in' | 'not_in' | 'gt' | 'greater_than' | 'gte' | 'greater_than_equal' | 'greater_than_or_equal' | 'lt' | 'less_than' | 'lte' | 'less_than_equal' | 'less_than_or_equal' | 'contains' | 'like' | 'starts_with' | 'exists';
557
557
  type WhereOperator = {
558
558
  equals: any;
559
559
  } | {
560
560
  not_equals: any;
561
+ } | {
562
+ not: any;
563
+ } | {
564
+ ne: any;
565
+ } | {
566
+ not_equal: any;
567
+ } | {
568
+ notEquals: any;
561
569
  } | {
562
570
  in: any[];
563
571
  } | {
@@ -598,6 +606,8 @@ type WhereClause = {
598
606
  or?: WhereClause[] | readonly WhereClause[];
599
607
  AND?: WhereClause[] | readonly WhereClause[];
600
608
  and?: WhereClause[] | readonly WhereClause[];
609
+ NOT?: WhereClause[] | readonly WhereClause[] | WhereClause;
610
+ not?: WhereClause[] | readonly WhereClause[] | WhereClause;
601
611
  };
602
612
  interface SqlWhereResult {
603
613
  sql: string;
package/dist/index.cjs CHANGED
@@ -5499,6 +5499,10 @@ function parseSqlWhere(where, getJsonField, placeholder = "?", likeOperator = pl
5499
5499
  }
5500
5500
  return `${c} = ${next()}`;
5501
5501
  case "not_equals":
5502
+ case "not":
5503
+ case "ne":
5504
+ case "not_equal":
5505
+ case "notEquals":
5502
5506
  if (operand === null) {
5503
5507
  return `${c} IS NOT NULL`;
5504
5508
  }
@@ -5514,9 +5518,33 @@ function parseSqlWhere(where, getJsonField, placeholder = "?", likeOperator = pl
5514
5518
  } else {
5515
5519
  params.push(operand);
5516
5520
  }
5517
- } else {
5518
- params.push(operand);
5521
+ return `${c} != ${next()}`;
5522
+ }
5523
+ if (Array.isArray(operand)) {
5524
+ if (operand.length === 0) return "1=1";
5525
+ const placeholders = operand.map((v) => {
5526
+ if (typeof v === "boolean") {
5527
+ if (placeholder === "?") {
5528
+ params.push(v ? 1 : 0);
5529
+ } else if (isJsonExtract) {
5530
+ params.push(String(v));
5531
+ } else {
5532
+ params.push(v);
5533
+ }
5534
+ } else {
5535
+ params.push(v);
5536
+ }
5537
+ return next();
5538
+ });
5539
+ return `${c} NOT IN (${placeholders.join(", ")})`;
5519
5540
  }
5541
+ if (typeof operand === "object") {
5542
+ const innerEntries = Object.entries(operand);
5543
+ if (innerEntries.length === 0) return "1=1";
5544
+ const innerSql = innerEntries.map(([innerOp, innerOperand]) => buildSingleOp(c, innerOp, innerOperand)).join(" AND ");
5545
+ return `NOT (${innerSql})`;
5546
+ }
5547
+ params.push(operand);
5520
5548
  return `${c} != ${next()}`;
5521
5549
  case "in": {
5522
5550
  const vals = Array.isArray(operand) ? operand : [operand];
@@ -5587,6 +5615,15 @@ function parseSqlWhere(where, getJsonField, placeholder = "?", likeOperator = pl
5587
5615
  } else if (upperField === "AND" && Array.isArray(value)) {
5588
5616
  const sub = value.map((v) => `(${buildClause(v)})`).join(" AND ");
5589
5617
  parts.push(`(${sub})`);
5618
+ } else if (upperField === "NOT") {
5619
+ if (Array.isArray(value)) {
5620
+ const sub = value.map((v) => `(${buildClause(v)})`).join(" AND ");
5621
+ parts.push(`(NOT (${sub}))`);
5622
+ } else if (typeof value === "object" && value !== null && !("equals" in value || "not_equals" in value || "not" in value || "ne" in value || "not_equal" in value || "notEquals" in value || "in" in value || "not_in" in value || "gt" in value || "gte" in value || "lt" in value || "lte" in value || "contains" in value || "like" in value || "starts_with" in value || "exists" in value)) {
5623
+ parts.push(`(NOT (${buildClause(value)}))`);
5624
+ } else {
5625
+ parts.push(buildOperator(field, value));
5626
+ }
5590
5627
  } else {
5591
5628
  parts.push(buildOperator(field, value));
5592
5629
  }
@@ -5617,7 +5654,28 @@ function parseMongoWhere(where) {
5617
5654
  case "equals":
5618
5655
  return { [field]: { $eq: operand } };
5619
5656
  case "not_equals":
5657
+ case "not":
5658
+ case "ne":
5659
+ case "not_equal":
5660
+ case "notEquals": {
5661
+ if (Array.isArray(operand)) {
5662
+ return { [field]: { $nin: operand } };
5663
+ }
5664
+ if (typeof operand === "object" && operand !== null) {
5665
+ const innerEntries = Object.entries(operand);
5666
+ if (innerEntries.length === 1) {
5667
+ const [innerOp, innerOperand] = innerEntries[0];
5668
+ const inner = buildSingleOp(field, innerOp, innerOperand)[field];
5669
+ return { [field]: { $not: inner } };
5670
+ }
5671
+ const merged = {};
5672
+ for (const [innerOp, innerOperand] of innerEntries) {
5673
+ Object.assign(merged, buildSingleOp(field, innerOp, innerOperand)[field]);
5674
+ }
5675
+ return { [field]: { $not: merged } };
5676
+ }
5620
5677
  return { [field]: { $ne: operand } };
5678
+ }
5621
5679
  case "in":
5622
5680
  return { [field]: { $in: Array.isArray(operand) ? operand : [operand] } };
5623
5681
  case "not_in":
@@ -5655,6 +5713,14 @@ function parseMongoWhere(where) {
5655
5713
  conditions.push({ $or: value.map(buildClause) });
5656
5714
  } else if (upperField === "AND" && Array.isArray(value)) {
5657
5715
  conditions.push({ $and: value.map(buildClause) });
5716
+ } else if (upperField === "NOT") {
5717
+ if (Array.isArray(value)) {
5718
+ conditions.push({ $nor: value.map(buildClause) });
5719
+ } else if (typeof value === "object" && value !== null && !("equals" in value || "not_equals" in value || "not" in value || "ne" in value || "not_equal" in value || "notEquals" in value || "in" in value || "not_in" in value || "gt" in value || "gte" in value || "lt" in value || "lte" in value || "contains" in value || "like" in value || "starts_with" in value || "exists" in value)) {
5720
+ conditions.push({ $nor: [buildClause(value)] });
5721
+ } else {
5722
+ conditions.push(buildOperator(field, value));
5723
+ }
5658
5724
  } else {
5659
5725
  conditions.push(buildOperator(field, value));
5660
5726
  }
@@ -5676,7 +5742,7 @@ function coerceBooleanWhere(where, fields) {
5676
5742
  if (!node || typeof node !== "object") return node;
5677
5743
  const out = {};
5678
5744
  for (const [key, value] of Object.entries(node)) {
5679
- if (key.toUpperCase() === "AND" || key.toUpperCase() === "OR") {
5745
+ if (key.toUpperCase() === "AND" || key.toUpperCase() === "OR" || key.toUpperCase() === "NOT") {
5680
5746
  out[key] = walk(value);
5681
5747
  } else if (booleanFields.has(key)) {
5682
5748
  if (value && typeof value === "object" && !Array.isArray(value)) {
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { F as Field, B as Block, C as CollectionConfig, D as DyrectedConfig, A as AdminAuthConfig, P as PublicAdminAuthConfig, G as GlobalConfig, a as DeclarativeHookExpression, W as WorkflowConfig, b as AuthenticatedUser, c as WorkflowTransition, L as LifecycleEventName, d as LifecycleEvent, e as DatabaseAdapter, f as BaseDocument, H as HookRequestContext, T as TaskRunResult, g as TaskConfig, h as DetailActionOptions, i as DetailAction, j as DetailComputedOptions, k as ComputedHandler, l as DetailComputed, m as DetailCustomOptions, n as DetailCustom, o as DetailDividerOptions, p as DetailDivider, q as DisplayFieldOptions, r as DetailField, s as DetailItem, t as DetailGridOptions, u as DetailGrid, v as DetailRepeatOptions, w as DetailRepeat, x as DetailSectionOptions, y as DetailSection, z as DetailTabOptions, E as DetailTab, I as DetailTabsOptions, J as DetailTabs, K as DetailTextOptions, M as DetailText, N as DetailSchema, O as DyrectedContext, Q as AIConfig, R as AIPIIConfig, S as IdStrategy, U as CompiledNavTree, V as CompiledNavItem, X as UserNavigationPreferences, Y as DefineWorkspaceOptions, Z as ViewConfig, _ as DateTimeField, $ as RelationshipField, a0 as SelectField, a1 as ArrayField, a2 as FieldType, a3 as BooleanField, a4 as AuthConfig, a5 as AccessPolicyResolver, a6 as DateField, a7 as TextField, a8 as EmailField, a9 as IconField, aa as ImageField, ab as JoinField, ac as JsonField, ad as MoneyField, ae as MultiSelectField, af as NumberField, ag as ObjectField, ah as RadioField, ai as RichTextField, aj as RowField, ak as TextareaField, al as TimeField, am as UrlField } from './app-v23fNf58.cjs';
2
- export { an as AIAction, ao as AIActionStatus, ap as AIActionType, aq as AIAuditActionType, ar as AIAuditRecord, as as AIChunk, at as AIMessage, au as AIPIIPattern, av as AIRateLimitResult, aw as AIRateLimitStore, ax as AIThread, ay as AIToolContext, az as AIToolDefinition, aA as AI_ACTIONS_COLLECTION, aB as AI_AUDIT_COLLECTION, aC as AI_CHUNKS_COLLECTION, aD as AI_MESSAGES_COLLECTION, aE as AI_THREADS_COLLECTION, aF as AccessConfig, aG as AccessFunction, aH as AccessFunctionArgs, aI as AccessResult, aJ as AccessRule, aK as ActionConfig, aL as ActionConfigBase, aM as ActionConfigWithHandler, aN as ActionConfigWithMutation, aO as ActionContext, aP as ActionType, aQ as AdminAuthAccessResolution, aR as AdminAuthClaimMapping, aS as AdminAuthMember, aT as AdminAuthProvider, aU as AdminAuthProviderMembersConfig, aV as AdminAuthProvisioningMode, aW as AdminAuthResolveAccessArgs, aX as AdminAuthResolvedIdentity, aY as AdminConfig, aZ as AdminDashboardComponentSlots, a_ as AdminIconName, a$ as AggregateArgs, b0 as AggregateCastType, b1 as AggregateCollectionResult, b2 as AggregateInput, b3 as AggregateOperation, b4 as AggregateResult, b5 as AppTrashConfig, b6 as BaseAdminAuthProvider, b7 as BaseFieldAdmin, b8 as BlockVariant, b9 as BlocksField, ba as BooleanFieldAdmin, bb as BooleanFormat, bc as CURRENT_NAV_PREFERENCES_VERSION, bd as CalendarViewConfig, be as CardsViewConfig, bf as CharacterLimitFieldAdmin, bg as CharacterLimitFieldConfig, bh as CollectionAfterChangeHook, bi as CollectionAfterDeleteHook, bj as CollectionAfterReadHook, bk as CollectionAfterReadHookEntry, bl as CollectionAfterRestoreHook, bm as CollectionAfterTransitionHook, bn as CollectionAfterTrashHook, bo as CollectionBeforeChangeHook, bp as CollectionBeforeChangeHookEntry, bq as CollectionBeforeCommitHook, br as CollectionBeforeDeleteHook, bs as CollectionBeforeReadHook, bt as CollectionBeforeReadHookEntry, bu as CollectionBeforeRestoreHook, bv as CollectionBeforeTransitionHook, bw as CollectionBeforeTrashHook, bx as CollectionEmailConfig, by as CollectionIndex, bz as CollectionListComponentSlots, bA as CollectionRAGConfig, bB as CollectionSchemaResult, bC as CollectionSummaryResult, bD as CollectionViewComponentSlots, bE as CompiledNavGroup, bF as CountOperation, bG as CustomAdminAuthProvider, bH as DEFAULT_USER_NAV_PREFERENCES, bI as DateFieldAdmin, bJ as DateFormat, bK as DefaultValueContext, bL as DefineActionOptions, bM as DefineCalendarViewOptions, bN as DefineCardsViewOptions, bO as DefineGanttViewOptions, bP as DefineKanbanViewOptions, bQ as DefineTableViewOptions, bR as DefineViewBaseOptions, bS as DefineViewOptions, bT as DetailSpan, bU as DisplayTone, bV as DisplayVariant, bW as DistinctCountOperation, bX as DistinctValuesOperation, bY as DynamicOptionItem, bZ as DynamicOptionsConfig, b_ as DynamicOptionsResolver, b$ as DynamicOptionsResolverArgs, c0 as DyrectedAIContext, c1 as DyrectedLoggerConfig, c2 as DyrectedObservabilityConfig, c3 as EmailFieldAdmin, c4 as EmailTemplateArgs, c5 as EmailTemplateResult, c6 as FieldAdminHooks, c7 as FieldAdminOnChangeHook, c8 as FieldAdminOnChangeHookArgs, c9 as FieldAdminOptionsHook, ca as FieldAdminOptionsHookArgs, cb as FieldAdminOptionsHookResult, cc as FieldAfterReadHook, cd as FieldAfterReadHookArgs, ce as FieldBase, cf as FieldBeforeChangeHook, cg as FieldBeforeChangeHookArgs, ch as FieldHook, ci as FieldHooks, cj as FileData, ck as GanttViewConfig, cl as GetDocumentResult, cm as GlobalAfterChangeHook, cn as GlobalAfterReadHook, co as GlobalAfterReadHookEntry, cp as GlobalBeforeChangeHook, cq as GlobalBeforeChangeHookEntry, cr as GlobalBeforeReadHook, cs as GlobalBeforeReadHookEntry, ct as GlobalRAGConfig, cu as GlobalSchemaResult, cv as GlobalSummaryResult, cw as HeadingLevel, cx as HookFunction, cy as IconFieldAdmin, cz as ImageService, cA as ImageTransformOptions, cB as InferAggregateResult, cC as JoinFieldAdmin, cD as JsonFieldAdmin, cE as JsonFormat, cF as KanbanViewConfig, cG as LIFECYCLE_EVENT_NAMES, cH as LifecycleEventHandler, cI as LinkFormat, cJ as MetricColor, cK as MoneyFieldAdmin, cL as MoneyFieldConfig, cM as MultiSelectFieldAdmin, cN as NamedAccessPolicy, cO as NavBadgeConfig, cP as NavGroup, cQ as NumberFieldAdmin, cR as NumberFormat, cS as NumberLimitFieldAdmin, cT as NumberLimitFieldConfig, cU as NumericOperation, cV as NumericUpdateOperator, cW as OIDCAdminAuthProvider, cX as OptionFormat, cY as OutboundEmail, cZ as PaginatedResult, c_ as PinnedNavItemRef, c$ as PublicAdminAuthProvider, d0 as QueryCollectionResult, d1 as RAGSearchResult, d2 as RadioFieldAdmin, d3 as RateLimitConfig, d4 as ReadonlyDatabaseAdapter, d5 as RichTextFeature, d6 as RichTextFieldConfig, d7 as SelectFieldAdmin, d8 as SqlWhereResult, d9 as StorageAdapter, da as TableViewConfig, db as TaskContext, dc as TaskLogger, dd as TaskRunStatus, de as TextFieldAdmin, df as TextFormat, dg as TextareaFieldAdmin, dh as TrashConfig, di as TrustProxyConfig, dj as TypedField, dk as UploadConfig, dl as UrlFieldAdmin, dm as UrlLinkValue, dn as ViewActionFeatures, dp as ViewComponentSlots, dq as ViewConfigBase, dr as ViewLayout, ds as ViewMetric, dt as ViewSubMetric, du as WhereClause, dv as WhereOperator, dw as WhereOperatorName, dx as WordLimitFieldAdmin, dy as WordLimitFieldConfig, dz as WorkflowMetadata, dA as WorkflowOnTransitionContext, dB as WorkflowOnTransitionHook, dC as WorkflowRole, dD as WorkflowState, dE as WorkflowTransitionContext, dF as coerceBooleanWhere, dG as defineAction, dH as defineCalendarView, dI as defineCardsView, dJ as defineGanttView, dK as defineKanbanView, dL as defineTableView, dM as defineView, dN as defineWorkspace, dO as isAICollection, dP as parseMongoWhere, dQ as parseSqlWhere } from './app-v23fNf58.cjs';
1
+ import { F as Field, B as Block, C as CollectionConfig, D as DyrectedConfig, A as AdminAuthConfig, P as PublicAdminAuthConfig, G as GlobalConfig, a as DeclarativeHookExpression, W as WorkflowConfig, b as AuthenticatedUser, c as WorkflowTransition, L as LifecycleEventName, d as LifecycleEvent, e as DatabaseAdapter, f as BaseDocument, H as HookRequestContext, T as TaskRunResult, g as TaskConfig, h as DetailActionOptions, i as DetailAction, j as DetailComputedOptions, k as ComputedHandler, l as DetailComputed, m as DetailCustomOptions, n as DetailCustom, o as DetailDividerOptions, p as DetailDivider, q as DisplayFieldOptions, r as DetailField, s as DetailItem, t as DetailGridOptions, u as DetailGrid, v as DetailRepeatOptions, w as DetailRepeat, x as DetailSectionOptions, y as DetailSection, z as DetailTabOptions, E as DetailTab, I as DetailTabsOptions, J as DetailTabs, K as DetailTextOptions, M as DetailText, N as DetailSchema, O as DyrectedContext, Q as AIConfig, R as AIPIIConfig, S as IdStrategy, U as CompiledNavTree, V as CompiledNavItem, X as UserNavigationPreferences, Y as DefineWorkspaceOptions, Z as ViewConfig, _ as DateTimeField, $ as RelationshipField, a0 as SelectField, a1 as ArrayField, a2 as FieldType, a3 as BooleanField, a4 as AuthConfig, a5 as AccessPolicyResolver, a6 as DateField, a7 as TextField, a8 as EmailField, a9 as IconField, aa as ImageField, ab as JoinField, ac as JsonField, ad as MoneyField, ae as MultiSelectField, af as NumberField, ag as ObjectField, ah as RadioField, ai as RichTextField, aj as RowField, ak as TextareaField, al as TimeField, am as UrlField } from './app-YGoigpOH.cjs';
2
+ export { an as AIAction, ao as AIActionStatus, ap as AIActionType, aq as AIAuditActionType, ar as AIAuditRecord, as as AIChunk, at as AIMessage, au as AIPIIPattern, av as AIRateLimitResult, aw as AIRateLimitStore, ax as AIThread, ay as AIToolContext, az as AIToolDefinition, aA as AI_ACTIONS_COLLECTION, aB as AI_AUDIT_COLLECTION, aC as AI_CHUNKS_COLLECTION, aD as AI_MESSAGES_COLLECTION, aE as AI_THREADS_COLLECTION, aF as AccessConfig, aG as AccessFunction, aH as AccessFunctionArgs, aI as AccessResult, aJ as AccessRule, aK as ActionConfig, aL as ActionConfigBase, aM as ActionConfigWithHandler, aN as ActionConfigWithMutation, aO as ActionContext, aP as ActionType, aQ as AdminAuthAccessResolution, aR as AdminAuthClaimMapping, aS as AdminAuthMember, aT as AdminAuthProvider, aU as AdminAuthProviderMembersConfig, aV as AdminAuthProvisioningMode, aW as AdminAuthResolveAccessArgs, aX as AdminAuthResolvedIdentity, aY as AdminConfig, aZ as AdminDashboardComponentSlots, a_ as AdminIconName, a$ as AggregateArgs, b0 as AggregateCastType, b1 as AggregateCollectionResult, b2 as AggregateInput, b3 as AggregateOperation, b4 as AggregateResult, b5 as AppTrashConfig, b6 as BaseAdminAuthProvider, b7 as BaseFieldAdmin, b8 as BlockVariant, b9 as BlocksField, ba as BooleanFieldAdmin, bb as BooleanFormat, bc as CURRENT_NAV_PREFERENCES_VERSION, bd as CalendarViewConfig, be as CardsViewConfig, bf as CharacterLimitFieldAdmin, bg as CharacterLimitFieldConfig, bh as CollectionAfterChangeHook, bi as CollectionAfterDeleteHook, bj as CollectionAfterReadHook, bk as CollectionAfterReadHookEntry, bl as CollectionAfterRestoreHook, bm as CollectionAfterTransitionHook, bn as CollectionAfterTrashHook, bo as CollectionBeforeChangeHook, bp as CollectionBeforeChangeHookEntry, bq as CollectionBeforeCommitHook, br as CollectionBeforeDeleteHook, bs as CollectionBeforeReadHook, bt as CollectionBeforeReadHookEntry, bu as CollectionBeforeRestoreHook, bv as CollectionBeforeTransitionHook, bw as CollectionBeforeTrashHook, bx as CollectionEmailConfig, by as CollectionIndex, bz as CollectionListComponentSlots, bA as CollectionRAGConfig, bB as CollectionSchemaResult, bC as CollectionSummaryResult, bD as CollectionViewComponentSlots, bE as CompiledNavGroup, bF as CountOperation, bG as CustomAdminAuthProvider, bH as DEFAULT_USER_NAV_PREFERENCES, bI as DateFieldAdmin, bJ as DateFormat, bK as DefaultValueContext, bL as DefineActionOptions, bM as DefineCalendarViewOptions, bN as DefineCardsViewOptions, bO as DefineGanttViewOptions, bP as DefineKanbanViewOptions, bQ as DefineTableViewOptions, bR as DefineViewBaseOptions, bS as DefineViewOptions, bT as DetailSpan, bU as DisplayTone, bV as DisplayVariant, bW as DistinctCountOperation, bX as DistinctValuesOperation, bY as DynamicOptionItem, bZ as DynamicOptionsConfig, b_ as DynamicOptionsResolver, b$ as DynamicOptionsResolverArgs, c0 as DyrectedAIContext, c1 as DyrectedLoggerConfig, c2 as DyrectedObservabilityConfig, c3 as EmailFieldAdmin, c4 as EmailTemplateArgs, c5 as EmailTemplateResult, c6 as FieldAdminHooks, c7 as FieldAdminOnChangeHook, c8 as FieldAdminOnChangeHookArgs, c9 as FieldAdminOptionsHook, ca as FieldAdminOptionsHookArgs, cb as FieldAdminOptionsHookResult, cc as FieldAfterReadHook, cd as FieldAfterReadHookArgs, ce as FieldBase, cf as FieldBeforeChangeHook, cg as FieldBeforeChangeHookArgs, ch as FieldHook, ci as FieldHooks, cj as FileData, ck as GanttViewConfig, cl as GetDocumentResult, cm as GlobalAfterChangeHook, cn as GlobalAfterReadHook, co as GlobalAfterReadHookEntry, cp as GlobalBeforeChangeHook, cq as GlobalBeforeChangeHookEntry, cr as GlobalBeforeReadHook, cs as GlobalBeforeReadHookEntry, ct as GlobalRAGConfig, cu as GlobalSchemaResult, cv as GlobalSummaryResult, cw as HeadingLevel, cx as HookFunction, cy as IconFieldAdmin, cz as ImageService, cA as ImageTransformOptions, cB as InferAggregateResult, cC as JoinFieldAdmin, cD as JsonFieldAdmin, cE as JsonFormat, cF as KanbanViewConfig, cG as LIFECYCLE_EVENT_NAMES, cH as LifecycleEventHandler, cI as LinkFormat, cJ as MetricColor, cK as MoneyFieldAdmin, cL as MoneyFieldConfig, cM as MultiSelectFieldAdmin, cN as NamedAccessPolicy, cO as NavBadgeConfig, cP as NavGroup, cQ as NumberFieldAdmin, cR as NumberFormat, cS as NumberLimitFieldAdmin, cT as NumberLimitFieldConfig, cU as NumericOperation, cV as NumericUpdateOperator, cW as OIDCAdminAuthProvider, cX as OptionFormat, cY as OutboundEmail, cZ as PaginatedResult, c_ as PinnedNavItemRef, c$ as PublicAdminAuthProvider, d0 as QueryCollectionResult, d1 as RAGSearchResult, d2 as RadioFieldAdmin, d3 as RateLimitConfig, d4 as ReadonlyDatabaseAdapter, d5 as RichTextFeature, d6 as RichTextFieldConfig, d7 as SelectFieldAdmin, d8 as SqlWhereResult, d9 as StorageAdapter, da as TableViewConfig, db as TaskContext, dc as TaskLogger, dd as TaskRunStatus, de as TextFieldAdmin, df as TextFormat, dg as TextareaFieldAdmin, dh as TrashConfig, di as TrustProxyConfig, dj as TypedField, dk as UploadConfig, dl as UrlFieldAdmin, dm as UrlLinkValue, dn as ViewActionFeatures, dp as ViewComponentSlots, dq as ViewConfigBase, dr as ViewLayout, ds as ViewMetric, dt as ViewSubMetric, du as WhereClause, dv as WhereOperator, dw as WhereOperatorName, dx as WordLimitFieldAdmin, dy as WordLimitFieldConfig, dz as WorkflowMetadata, dA as WorkflowOnTransitionContext, dB as WorkflowOnTransitionHook, dC as WorkflowRole, dD as WorkflowState, dE as WorkflowTransitionContext, dF as coerceBooleanWhere, dG as defineAction, dH as defineCalendarView, dI as defineCardsView, dJ as defineGanttView, dK as defineKanbanView, dL as defineTableView, dM as defineView, dN as defineWorkspace, dO as isAICollection, dP as parseMongoWhere, dQ as parseSqlWhere } from './app-YGoigpOH.cjs';
3
3
  import jexl from 'jexl';
4
4
  import { Context } from 'hono';
5
5
  export { z } from 'zod';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { F as Field, B as Block, C as CollectionConfig, D as DyrectedConfig, A as AdminAuthConfig, P as PublicAdminAuthConfig, G as GlobalConfig, a as DeclarativeHookExpression, W as WorkflowConfig, b as AuthenticatedUser, c as WorkflowTransition, L as LifecycleEventName, d as LifecycleEvent, e as DatabaseAdapter, f as BaseDocument, H as HookRequestContext, T as TaskRunResult, g as TaskConfig, h as DetailActionOptions, i as DetailAction, j as DetailComputedOptions, k as ComputedHandler, l as DetailComputed, m as DetailCustomOptions, n as DetailCustom, o as DetailDividerOptions, p as DetailDivider, q as DisplayFieldOptions, r as DetailField, s as DetailItem, t as DetailGridOptions, u as DetailGrid, v as DetailRepeatOptions, w as DetailRepeat, x as DetailSectionOptions, y as DetailSection, z as DetailTabOptions, E as DetailTab, I as DetailTabsOptions, J as DetailTabs, K as DetailTextOptions, M as DetailText, N as DetailSchema, O as DyrectedContext, Q as AIConfig, R as AIPIIConfig, S as IdStrategy, U as CompiledNavTree, V as CompiledNavItem, X as UserNavigationPreferences, Y as DefineWorkspaceOptions, Z as ViewConfig, _ as DateTimeField, $ as RelationshipField, a0 as SelectField, a1 as ArrayField, a2 as FieldType, a3 as BooleanField, a4 as AuthConfig, a5 as AccessPolicyResolver, a6 as DateField, a7 as TextField, a8 as EmailField, a9 as IconField, aa as ImageField, ab as JoinField, ac as JsonField, ad as MoneyField, ae as MultiSelectField, af as NumberField, ag as ObjectField, ah as RadioField, ai as RichTextField, aj as RowField, ak as TextareaField, al as TimeField, am as UrlField } from './app-v23fNf58.js';
2
- export { an as AIAction, ao as AIActionStatus, ap as AIActionType, aq as AIAuditActionType, ar as AIAuditRecord, as as AIChunk, at as AIMessage, au as AIPIIPattern, av as AIRateLimitResult, aw as AIRateLimitStore, ax as AIThread, ay as AIToolContext, az as AIToolDefinition, aA as AI_ACTIONS_COLLECTION, aB as AI_AUDIT_COLLECTION, aC as AI_CHUNKS_COLLECTION, aD as AI_MESSAGES_COLLECTION, aE as AI_THREADS_COLLECTION, aF as AccessConfig, aG as AccessFunction, aH as AccessFunctionArgs, aI as AccessResult, aJ as AccessRule, aK as ActionConfig, aL as ActionConfigBase, aM as ActionConfigWithHandler, aN as ActionConfigWithMutation, aO as ActionContext, aP as ActionType, aQ as AdminAuthAccessResolution, aR as AdminAuthClaimMapping, aS as AdminAuthMember, aT as AdminAuthProvider, aU as AdminAuthProviderMembersConfig, aV as AdminAuthProvisioningMode, aW as AdminAuthResolveAccessArgs, aX as AdminAuthResolvedIdentity, aY as AdminConfig, aZ as AdminDashboardComponentSlots, a_ as AdminIconName, a$ as AggregateArgs, b0 as AggregateCastType, b1 as AggregateCollectionResult, b2 as AggregateInput, b3 as AggregateOperation, b4 as AggregateResult, b5 as AppTrashConfig, b6 as BaseAdminAuthProvider, b7 as BaseFieldAdmin, b8 as BlockVariant, b9 as BlocksField, ba as BooleanFieldAdmin, bb as BooleanFormat, bc as CURRENT_NAV_PREFERENCES_VERSION, bd as CalendarViewConfig, be as CardsViewConfig, bf as CharacterLimitFieldAdmin, bg as CharacterLimitFieldConfig, bh as CollectionAfterChangeHook, bi as CollectionAfterDeleteHook, bj as CollectionAfterReadHook, bk as CollectionAfterReadHookEntry, bl as CollectionAfterRestoreHook, bm as CollectionAfterTransitionHook, bn as CollectionAfterTrashHook, bo as CollectionBeforeChangeHook, bp as CollectionBeforeChangeHookEntry, bq as CollectionBeforeCommitHook, br as CollectionBeforeDeleteHook, bs as CollectionBeforeReadHook, bt as CollectionBeforeReadHookEntry, bu as CollectionBeforeRestoreHook, bv as CollectionBeforeTransitionHook, bw as CollectionBeforeTrashHook, bx as CollectionEmailConfig, by as CollectionIndex, bz as CollectionListComponentSlots, bA as CollectionRAGConfig, bB as CollectionSchemaResult, bC as CollectionSummaryResult, bD as CollectionViewComponentSlots, bE as CompiledNavGroup, bF as CountOperation, bG as CustomAdminAuthProvider, bH as DEFAULT_USER_NAV_PREFERENCES, bI as DateFieldAdmin, bJ as DateFormat, bK as DefaultValueContext, bL as DefineActionOptions, bM as DefineCalendarViewOptions, bN as DefineCardsViewOptions, bO as DefineGanttViewOptions, bP as DefineKanbanViewOptions, bQ as DefineTableViewOptions, bR as DefineViewBaseOptions, bS as DefineViewOptions, bT as DetailSpan, bU as DisplayTone, bV as DisplayVariant, bW as DistinctCountOperation, bX as DistinctValuesOperation, bY as DynamicOptionItem, bZ as DynamicOptionsConfig, b_ as DynamicOptionsResolver, b$ as DynamicOptionsResolverArgs, c0 as DyrectedAIContext, c1 as DyrectedLoggerConfig, c2 as DyrectedObservabilityConfig, c3 as EmailFieldAdmin, c4 as EmailTemplateArgs, c5 as EmailTemplateResult, c6 as FieldAdminHooks, c7 as FieldAdminOnChangeHook, c8 as FieldAdminOnChangeHookArgs, c9 as FieldAdminOptionsHook, ca as FieldAdminOptionsHookArgs, cb as FieldAdminOptionsHookResult, cc as FieldAfterReadHook, cd as FieldAfterReadHookArgs, ce as FieldBase, cf as FieldBeforeChangeHook, cg as FieldBeforeChangeHookArgs, ch as FieldHook, ci as FieldHooks, cj as FileData, ck as GanttViewConfig, cl as GetDocumentResult, cm as GlobalAfterChangeHook, cn as GlobalAfterReadHook, co as GlobalAfterReadHookEntry, cp as GlobalBeforeChangeHook, cq as GlobalBeforeChangeHookEntry, cr as GlobalBeforeReadHook, cs as GlobalBeforeReadHookEntry, ct as GlobalRAGConfig, cu as GlobalSchemaResult, cv as GlobalSummaryResult, cw as HeadingLevel, cx as HookFunction, cy as IconFieldAdmin, cz as ImageService, cA as ImageTransformOptions, cB as InferAggregateResult, cC as JoinFieldAdmin, cD as JsonFieldAdmin, cE as JsonFormat, cF as KanbanViewConfig, cG as LIFECYCLE_EVENT_NAMES, cH as LifecycleEventHandler, cI as LinkFormat, cJ as MetricColor, cK as MoneyFieldAdmin, cL as MoneyFieldConfig, cM as MultiSelectFieldAdmin, cN as NamedAccessPolicy, cO as NavBadgeConfig, cP as NavGroup, cQ as NumberFieldAdmin, cR as NumberFormat, cS as NumberLimitFieldAdmin, cT as NumberLimitFieldConfig, cU as NumericOperation, cV as NumericUpdateOperator, cW as OIDCAdminAuthProvider, cX as OptionFormat, cY as OutboundEmail, cZ as PaginatedResult, c_ as PinnedNavItemRef, c$ as PublicAdminAuthProvider, d0 as QueryCollectionResult, d1 as RAGSearchResult, d2 as RadioFieldAdmin, d3 as RateLimitConfig, d4 as ReadonlyDatabaseAdapter, d5 as RichTextFeature, d6 as RichTextFieldConfig, d7 as SelectFieldAdmin, d8 as SqlWhereResult, d9 as StorageAdapter, da as TableViewConfig, db as TaskContext, dc as TaskLogger, dd as TaskRunStatus, de as TextFieldAdmin, df as TextFormat, dg as TextareaFieldAdmin, dh as TrashConfig, di as TrustProxyConfig, dj as TypedField, dk as UploadConfig, dl as UrlFieldAdmin, dm as UrlLinkValue, dn as ViewActionFeatures, dp as ViewComponentSlots, dq as ViewConfigBase, dr as ViewLayout, ds as ViewMetric, dt as ViewSubMetric, du as WhereClause, dv as WhereOperator, dw as WhereOperatorName, dx as WordLimitFieldAdmin, dy as WordLimitFieldConfig, dz as WorkflowMetadata, dA as WorkflowOnTransitionContext, dB as WorkflowOnTransitionHook, dC as WorkflowRole, dD as WorkflowState, dE as WorkflowTransitionContext, dF as coerceBooleanWhere, dG as defineAction, dH as defineCalendarView, dI as defineCardsView, dJ as defineGanttView, dK as defineKanbanView, dL as defineTableView, dM as defineView, dN as defineWorkspace, dO as isAICollection, dP as parseMongoWhere, dQ as parseSqlWhere } from './app-v23fNf58.js';
1
+ import { F as Field, B as Block, C as CollectionConfig, D as DyrectedConfig, A as AdminAuthConfig, P as PublicAdminAuthConfig, G as GlobalConfig, a as DeclarativeHookExpression, W as WorkflowConfig, b as AuthenticatedUser, c as WorkflowTransition, L as LifecycleEventName, d as LifecycleEvent, e as DatabaseAdapter, f as BaseDocument, H as HookRequestContext, T as TaskRunResult, g as TaskConfig, h as DetailActionOptions, i as DetailAction, j as DetailComputedOptions, k as ComputedHandler, l as DetailComputed, m as DetailCustomOptions, n as DetailCustom, o as DetailDividerOptions, p as DetailDivider, q as DisplayFieldOptions, r as DetailField, s as DetailItem, t as DetailGridOptions, u as DetailGrid, v as DetailRepeatOptions, w as DetailRepeat, x as DetailSectionOptions, y as DetailSection, z as DetailTabOptions, E as DetailTab, I as DetailTabsOptions, J as DetailTabs, K as DetailTextOptions, M as DetailText, N as DetailSchema, O as DyrectedContext, Q as AIConfig, R as AIPIIConfig, S as IdStrategy, U as CompiledNavTree, V as CompiledNavItem, X as UserNavigationPreferences, Y as DefineWorkspaceOptions, Z as ViewConfig, _ as DateTimeField, $ as RelationshipField, a0 as SelectField, a1 as ArrayField, a2 as FieldType, a3 as BooleanField, a4 as AuthConfig, a5 as AccessPolicyResolver, a6 as DateField, a7 as TextField, a8 as EmailField, a9 as IconField, aa as ImageField, ab as JoinField, ac as JsonField, ad as MoneyField, ae as MultiSelectField, af as NumberField, ag as ObjectField, ah as RadioField, ai as RichTextField, aj as RowField, ak as TextareaField, al as TimeField, am as UrlField } from './app-YGoigpOH.js';
2
+ export { an as AIAction, ao as AIActionStatus, ap as AIActionType, aq as AIAuditActionType, ar as AIAuditRecord, as as AIChunk, at as AIMessage, au as AIPIIPattern, av as AIRateLimitResult, aw as AIRateLimitStore, ax as AIThread, ay as AIToolContext, az as AIToolDefinition, aA as AI_ACTIONS_COLLECTION, aB as AI_AUDIT_COLLECTION, aC as AI_CHUNKS_COLLECTION, aD as AI_MESSAGES_COLLECTION, aE as AI_THREADS_COLLECTION, aF as AccessConfig, aG as AccessFunction, aH as AccessFunctionArgs, aI as AccessResult, aJ as AccessRule, aK as ActionConfig, aL as ActionConfigBase, aM as ActionConfigWithHandler, aN as ActionConfigWithMutation, aO as ActionContext, aP as ActionType, aQ as AdminAuthAccessResolution, aR as AdminAuthClaimMapping, aS as AdminAuthMember, aT as AdminAuthProvider, aU as AdminAuthProviderMembersConfig, aV as AdminAuthProvisioningMode, aW as AdminAuthResolveAccessArgs, aX as AdminAuthResolvedIdentity, aY as AdminConfig, aZ as AdminDashboardComponentSlots, a_ as AdminIconName, a$ as AggregateArgs, b0 as AggregateCastType, b1 as AggregateCollectionResult, b2 as AggregateInput, b3 as AggregateOperation, b4 as AggregateResult, b5 as AppTrashConfig, b6 as BaseAdminAuthProvider, b7 as BaseFieldAdmin, b8 as BlockVariant, b9 as BlocksField, ba as BooleanFieldAdmin, bb as BooleanFormat, bc as CURRENT_NAV_PREFERENCES_VERSION, bd as CalendarViewConfig, be as CardsViewConfig, bf as CharacterLimitFieldAdmin, bg as CharacterLimitFieldConfig, bh as CollectionAfterChangeHook, bi as CollectionAfterDeleteHook, bj as CollectionAfterReadHook, bk as CollectionAfterReadHookEntry, bl as CollectionAfterRestoreHook, bm as CollectionAfterTransitionHook, bn as CollectionAfterTrashHook, bo as CollectionBeforeChangeHook, bp as CollectionBeforeChangeHookEntry, bq as CollectionBeforeCommitHook, br as CollectionBeforeDeleteHook, bs as CollectionBeforeReadHook, bt as CollectionBeforeReadHookEntry, bu as CollectionBeforeRestoreHook, bv as CollectionBeforeTransitionHook, bw as CollectionBeforeTrashHook, bx as CollectionEmailConfig, by as CollectionIndex, bz as CollectionListComponentSlots, bA as CollectionRAGConfig, bB as CollectionSchemaResult, bC as CollectionSummaryResult, bD as CollectionViewComponentSlots, bE as CompiledNavGroup, bF as CountOperation, bG as CustomAdminAuthProvider, bH as DEFAULT_USER_NAV_PREFERENCES, bI as DateFieldAdmin, bJ as DateFormat, bK as DefaultValueContext, bL as DefineActionOptions, bM as DefineCalendarViewOptions, bN as DefineCardsViewOptions, bO as DefineGanttViewOptions, bP as DefineKanbanViewOptions, bQ as DefineTableViewOptions, bR as DefineViewBaseOptions, bS as DefineViewOptions, bT as DetailSpan, bU as DisplayTone, bV as DisplayVariant, bW as DistinctCountOperation, bX as DistinctValuesOperation, bY as DynamicOptionItem, bZ as DynamicOptionsConfig, b_ as DynamicOptionsResolver, b$ as DynamicOptionsResolverArgs, c0 as DyrectedAIContext, c1 as DyrectedLoggerConfig, c2 as DyrectedObservabilityConfig, c3 as EmailFieldAdmin, c4 as EmailTemplateArgs, c5 as EmailTemplateResult, c6 as FieldAdminHooks, c7 as FieldAdminOnChangeHook, c8 as FieldAdminOnChangeHookArgs, c9 as FieldAdminOptionsHook, ca as FieldAdminOptionsHookArgs, cb as FieldAdminOptionsHookResult, cc as FieldAfterReadHook, cd as FieldAfterReadHookArgs, ce as FieldBase, cf as FieldBeforeChangeHook, cg as FieldBeforeChangeHookArgs, ch as FieldHook, ci as FieldHooks, cj as FileData, ck as GanttViewConfig, cl as GetDocumentResult, cm as GlobalAfterChangeHook, cn as GlobalAfterReadHook, co as GlobalAfterReadHookEntry, cp as GlobalBeforeChangeHook, cq as GlobalBeforeChangeHookEntry, cr as GlobalBeforeReadHook, cs as GlobalBeforeReadHookEntry, ct as GlobalRAGConfig, cu as GlobalSchemaResult, cv as GlobalSummaryResult, cw as HeadingLevel, cx as HookFunction, cy as IconFieldAdmin, cz as ImageService, cA as ImageTransformOptions, cB as InferAggregateResult, cC as JoinFieldAdmin, cD as JsonFieldAdmin, cE as JsonFormat, cF as KanbanViewConfig, cG as LIFECYCLE_EVENT_NAMES, cH as LifecycleEventHandler, cI as LinkFormat, cJ as MetricColor, cK as MoneyFieldAdmin, cL as MoneyFieldConfig, cM as MultiSelectFieldAdmin, cN as NamedAccessPolicy, cO as NavBadgeConfig, cP as NavGroup, cQ as NumberFieldAdmin, cR as NumberFormat, cS as NumberLimitFieldAdmin, cT as NumberLimitFieldConfig, cU as NumericOperation, cV as NumericUpdateOperator, cW as OIDCAdminAuthProvider, cX as OptionFormat, cY as OutboundEmail, cZ as PaginatedResult, c_ as PinnedNavItemRef, c$ as PublicAdminAuthProvider, d0 as QueryCollectionResult, d1 as RAGSearchResult, d2 as RadioFieldAdmin, d3 as RateLimitConfig, d4 as ReadonlyDatabaseAdapter, d5 as RichTextFeature, d6 as RichTextFieldConfig, d7 as SelectFieldAdmin, d8 as SqlWhereResult, d9 as StorageAdapter, da as TableViewConfig, db as TaskContext, dc as TaskLogger, dd as TaskRunStatus, de as TextFieldAdmin, df as TextFormat, dg as TextareaFieldAdmin, dh as TrashConfig, di as TrustProxyConfig, dj as TypedField, dk as UploadConfig, dl as UrlFieldAdmin, dm as UrlLinkValue, dn as ViewActionFeatures, dp as ViewComponentSlots, dq as ViewConfigBase, dr as ViewLayout, ds as ViewMetric, dt as ViewSubMetric, du as WhereClause, dv as WhereOperator, dw as WhereOperatorName, dx as WordLimitFieldAdmin, dy as WordLimitFieldConfig, dz as WorkflowMetadata, dA as WorkflowOnTransitionContext, dB as WorkflowOnTransitionHook, dC as WorkflowRole, dD as WorkflowState, dE as WorkflowTransitionContext, dF as coerceBooleanWhere, dG as defineAction, dH as defineCalendarView, dI as defineCardsView, dJ as defineGanttView, dK as defineKanbanView, dL as defineTableView, dM as defineView, dN as defineWorkspace, dO as isAICollection, dP as parseMongoWhere, dQ as parseSqlWhere } from './app-YGoigpOH.js';
3
3
  import jexl from 'jexl';
4
4
  import { Context } from 'hono';
5
5
  export { z } from 'zod';
package/dist/index.js CHANGED
@@ -5247,6 +5247,10 @@ function parseSqlWhere(where, getJsonField, placeholder = "?", likeOperator = pl
5247
5247
  }
5248
5248
  return `${c} = ${next()}`;
5249
5249
  case "not_equals":
5250
+ case "not":
5251
+ case "ne":
5252
+ case "not_equal":
5253
+ case "notEquals":
5250
5254
  if (operand === null) {
5251
5255
  return `${c} IS NOT NULL`;
5252
5256
  }
@@ -5262,9 +5266,33 @@ function parseSqlWhere(where, getJsonField, placeholder = "?", likeOperator = pl
5262
5266
  } else {
5263
5267
  params.push(operand);
5264
5268
  }
5265
- } else {
5266
- params.push(operand);
5269
+ return `${c} != ${next()}`;
5270
+ }
5271
+ if (Array.isArray(operand)) {
5272
+ if (operand.length === 0) return "1=1";
5273
+ const placeholders = operand.map((v) => {
5274
+ if (typeof v === "boolean") {
5275
+ if (placeholder === "?") {
5276
+ params.push(v ? 1 : 0);
5277
+ } else if (isJsonExtract) {
5278
+ params.push(String(v));
5279
+ } else {
5280
+ params.push(v);
5281
+ }
5282
+ } else {
5283
+ params.push(v);
5284
+ }
5285
+ return next();
5286
+ });
5287
+ return `${c} NOT IN (${placeholders.join(", ")})`;
5267
5288
  }
5289
+ if (typeof operand === "object") {
5290
+ const innerEntries = Object.entries(operand);
5291
+ if (innerEntries.length === 0) return "1=1";
5292
+ const innerSql = innerEntries.map(([innerOp, innerOperand]) => buildSingleOp(c, innerOp, innerOperand)).join(" AND ");
5293
+ return `NOT (${innerSql})`;
5294
+ }
5295
+ params.push(operand);
5268
5296
  return `${c} != ${next()}`;
5269
5297
  case "in": {
5270
5298
  const vals = Array.isArray(operand) ? operand : [operand];
@@ -5335,6 +5363,15 @@ function parseSqlWhere(where, getJsonField, placeholder = "?", likeOperator = pl
5335
5363
  } else if (upperField === "AND" && Array.isArray(value)) {
5336
5364
  const sub = value.map((v) => `(${buildClause(v)})`).join(" AND ");
5337
5365
  parts.push(`(${sub})`);
5366
+ } else if (upperField === "NOT") {
5367
+ if (Array.isArray(value)) {
5368
+ const sub = value.map((v) => `(${buildClause(v)})`).join(" AND ");
5369
+ parts.push(`(NOT (${sub}))`);
5370
+ } else if (typeof value === "object" && value !== null && !("equals" in value || "not_equals" in value || "not" in value || "ne" in value || "not_equal" in value || "notEquals" in value || "in" in value || "not_in" in value || "gt" in value || "gte" in value || "lt" in value || "lte" in value || "contains" in value || "like" in value || "starts_with" in value || "exists" in value)) {
5371
+ parts.push(`(NOT (${buildClause(value)}))`);
5372
+ } else {
5373
+ parts.push(buildOperator(field, value));
5374
+ }
5338
5375
  } else {
5339
5376
  parts.push(buildOperator(field, value));
5340
5377
  }
@@ -5365,7 +5402,28 @@ function parseMongoWhere(where) {
5365
5402
  case "equals":
5366
5403
  return { [field]: { $eq: operand } };
5367
5404
  case "not_equals":
5405
+ case "not":
5406
+ case "ne":
5407
+ case "not_equal":
5408
+ case "notEquals": {
5409
+ if (Array.isArray(operand)) {
5410
+ return { [field]: { $nin: operand } };
5411
+ }
5412
+ if (typeof operand === "object" && operand !== null) {
5413
+ const innerEntries = Object.entries(operand);
5414
+ if (innerEntries.length === 1) {
5415
+ const [innerOp, innerOperand] = innerEntries[0];
5416
+ const inner = buildSingleOp(field, innerOp, innerOperand)[field];
5417
+ return { [field]: { $not: inner } };
5418
+ }
5419
+ const merged = {};
5420
+ for (const [innerOp, innerOperand] of innerEntries) {
5421
+ Object.assign(merged, buildSingleOp(field, innerOp, innerOperand)[field]);
5422
+ }
5423
+ return { [field]: { $not: merged } };
5424
+ }
5368
5425
  return { [field]: { $ne: operand } };
5426
+ }
5369
5427
  case "in":
5370
5428
  return { [field]: { $in: Array.isArray(operand) ? operand : [operand] } };
5371
5429
  case "not_in":
@@ -5403,6 +5461,14 @@ function parseMongoWhere(where) {
5403
5461
  conditions.push({ $or: value.map(buildClause) });
5404
5462
  } else if (upperField === "AND" && Array.isArray(value)) {
5405
5463
  conditions.push({ $and: value.map(buildClause) });
5464
+ } else if (upperField === "NOT") {
5465
+ if (Array.isArray(value)) {
5466
+ conditions.push({ $nor: value.map(buildClause) });
5467
+ } else if (typeof value === "object" && value !== null && !("equals" in value || "not_equals" in value || "not" in value || "ne" in value || "not_equal" in value || "notEquals" in value || "in" in value || "not_in" in value || "gt" in value || "gte" in value || "lt" in value || "lte" in value || "contains" in value || "like" in value || "starts_with" in value || "exists" in value)) {
5468
+ conditions.push({ $nor: [buildClause(value)] });
5469
+ } else {
5470
+ conditions.push(buildOperator(field, value));
5471
+ }
5406
5472
  } else {
5407
5473
  conditions.push(buildOperator(field, value));
5408
5474
  }
@@ -5424,7 +5490,7 @@ function coerceBooleanWhere(where, fields) {
5424
5490
  if (!node || typeof node !== "object") return node;
5425
5491
  const out = {};
5426
5492
  for (const [key, value] of Object.entries(node)) {
5427
- if (key.toUpperCase() === "AND" || key.toUpperCase() === "OR") {
5493
+ if (key.toUpperCase() === "AND" || key.toUpperCase() === "OR" || key.toUpperCase() === "NOT") {
5428
5494
  out[key] = walk(value);
5429
5495
  } else if (booleanFields.has(key)) {
5430
5496
  if (value && typeof value === "object" && !Array.isArray(value)) {
package/dist/server.cjs CHANGED
@@ -4307,12 +4307,17 @@ function sanitizeWhereClause(where, fields) {
4307
4307
  const result = {};
4308
4308
  for (const [key, value] of Object.entries(node)) {
4309
4309
  const upperKey = key.toUpperCase();
4310
- if (upperKey === "AND" || upperKey === "OR") {
4310
+ if (upperKey === "AND" || upperKey === "OR" || upperKey === "NOT") {
4311
4311
  if (Array.isArray(value)) {
4312
4312
  const processed = value.map((v) => walk(v)).filter((v) => Object.keys(v).length > 0);
4313
4313
  if (processed.length > 0) {
4314
4314
  result[upperKey] = processed;
4315
4315
  }
4316
+ } else if (typeof value === "object" && value !== null) {
4317
+ const processed = walk(value);
4318
+ if (Object.keys(processed).length > 0) {
4319
+ result[upperKey] = processed;
4320
+ }
4316
4321
  }
4317
4322
  continue;
4318
4323
  }
package/dist/server.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { O as DyrectedContext, D as DyrectedConfig, C as CollectionConfig, G as GlobalConfig, c4 as EmailTemplateArgs, c5 as EmailTemplateResult, cY as OutboundEmail, e as DatabaseAdapter, b as AuthenticatedUser, c0 as DyrectedAIContext, ax as AIThread, at as AIMessage, d1 as RAGSearchResult, aw as AIRateLimitStore, av as AIRateLimitResult } from './app-v23fNf58.cjs';
2
- export { dR as CollectionTokenPayload, dS as DEFAULT_INVITE_EXPIRY, dT as DEFAULT_RESET_PASSWORD_EXPIRY, dU as DEFAULT_SESSION_EXPIRY, dV as DyrectedObservabilityRuntime, dW as RequestBodyCapture, dX as RequestTraceContext, dY as ResolvedObservabilityConfig, dZ as attachRequestMetrics, d_ as bindObservabilityRuntime, d$ as buildRequestLogger, e0 as captureRequestBody, e1 as createDyrectedApp, e2 as createObservabilityRuntime, e3 as createRequestSpan, e4 as decodeCollectionToken, e5 as endRequestSpan, e6 as getConfigLogger, e7 as getObservabilityRuntime, e8 as getRequestLogger, e9 as redactBody, ea as redactHeaders, eb as renderPrometheusMetrics, ec as resolveInviteTokenExpiry, ed as resolveObservabilityConfig, ee as resolveResetPasswordTokenExpiry, ef as resolveSessionTokenExpiry, eg as shouldSampleRequest, eh as signCollectionToken, ei as verifyCollectionToken } from './app-v23fNf58.cjs';
1
+ import { O as DyrectedContext, D as DyrectedConfig, C as CollectionConfig, G as GlobalConfig, c4 as EmailTemplateArgs, c5 as EmailTemplateResult, cY as OutboundEmail, e as DatabaseAdapter, b as AuthenticatedUser, c0 as DyrectedAIContext, ax as AIThread, at as AIMessage, d1 as RAGSearchResult, aw as AIRateLimitStore, av as AIRateLimitResult } from './app-YGoigpOH.cjs';
2
+ export { dR as CollectionTokenPayload, dS as DEFAULT_INVITE_EXPIRY, dT as DEFAULT_RESET_PASSWORD_EXPIRY, dU as DEFAULT_SESSION_EXPIRY, dV as DyrectedObservabilityRuntime, dW as RequestBodyCapture, dX as RequestTraceContext, dY as ResolvedObservabilityConfig, dZ as attachRequestMetrics, d_ as bindObservabilityRuntime, d$ as buildRequestLogger, e0 as captureRequestBody, e1 as createDyrectedApp, e2 as createObservabilityRuntime, e3 as createRequestSpan, e4 as decodeCollectionToken, e5 as endRequestSpan, e6 as getConfigLogger, e7 as getObservabilityRuntime, e8 as getRequestLogger, e9 as redactBody, ea as redactHeaders, eb as renderPrometheusMetrics, ec as resolveInviteTokenExpiry, ed as resolveObservabilityConfig, ee as resolveResetPasswordTokenExpiry, ef as resolveSessionTokenExpiry, eg as shouldSampleRequest, eh as signCollectionToken, ei as verifyCollectionToken } from './app-YGoigpOH.cjs';
3
3
  import * as hono from 'hono';
4
4
  import { Hono, Context, Next } from 'hono';
5
5
  import * as hono_utils_http_status from 'hono/utils/http-status';
package/dist/server.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { O as DyrectedContext, D as DyrectedConfig, C as CollectionConfig, G as GlobalConfig, c4 as EmailTemplateArgs, c5 as EmailTemplateResult, cY as OutboundEmail, e as DatabaseAdapter, b as AuthenticatedUser, c0 as DyrectedAIContext, ax as AIThread, at as AIMessage, d1 as RAGSearchResult, aw as AIRateLimitStore, av as AIRateLimitResult } from './app-v23fNf58.js';
2
- export { dR as CollectionTokenPayload, dS as DEFAULT_INVITE_EXPIRY, dT as DEFAULT_RESET_PASSWORD_EXPIRY, dU as DEFAULT_SESSION_EXPIRY, dV as DyrectedObservabilityRuntime, dW as RequestBodyCapture, dX as RequestTraceContext, dY as ResolvedObservabilityConfig, dZ as attachRequestMetrics, d_ as bindObservabilityRuntime, d$ as buildRequestLogger, e0 as captureRequestBody, e1 as createDyrectedApp, e2 as createObservabilityRuntime, e3 as createRequestSpan, e4 as decodeCollectionToken, e5 as endRequestSpan, e6 as getConfigLogger, e7 as getObservabilityRuntime, e8 as getRequestLogger, e9 as redactBody, ea as redactHeaders, eb as renderPrometheusMetrics, ec as resolveInviteTokenExpiry, ed as resolveObservabilityConfig, ee as resolveResetPasswordTokenExpiry, ef as resolveSessionTokenExpiry, eg as shouldSampleRequest, eh as signCollectionToken, ei as verifyCollectionToken } from './app-v23fNf58.js';
1
+ import { O as DyrectedContext, D as DyrectedConfig, C as CollectionConfig, G as GlobalConfig, c4 as EmailTemplateArgs, c5 as EmailTemplateResult, cY as OutboundEmail, e as DatabaseAdapter, b as AuthenticatedUser, c0 as DyrectedAIContext, ax as AIThread, at as AIMessage, d1 as RAGSearchResult, aw as AIRateLimitStore, av as AIRateLimitResult } from './app-YGoigpOH.js';
2
+ export { dR as CollectionTokenPayload, dS as DEFAULT_INVITE_EXPIRY, dT as DEFAULT_RESET_PASSWORD_EXPIRY, dU as DEFAULT_SESSION_EXPIRY, dV as DyrectedObservabilityRuntime, dW as RequestBodyCapture, dX as RequestTraceContext, dY as ResolvedObservabilityConfig, dZ as attachRequestMetrics, d_ as bindObservabilityRuntime, d$ as buildRequestLogger, e0 as captureRequestBody, e1 as createDyrectedApp, e2 as createObservabilityRuntime, e3 as createRequestSpan, e4 as decodeCollectionToken, e5 as endRequestSpan, e6 as getConfigLogger, e7 as getObservabilityRuntime, e8 as getRequestLogger, e9 as redactBody, ea as redactHeaders, eb as renderPrometheusMetrics, ec as resolveInviteTokenExpiry, ed as resolveObservabilityConfig, ee as resolveResetPasswordTokenExpiry, ef as resolveSessionTokenExpiry, eg as shouldSampleRequest, eh as signCollectionToken, ei as verifyCollectionToken } from './app-YGoigpOH.js';
3
3
  import * as hono from 'hono';
4
4
  import { Hono, Context, Next } from 'hono';
5
5
  import * as hono_utils_http_status from 'hono/utils/http-status';
package/dist/server.js CHANGED
@@ -4305,12 +4305,17 @@ function sanitizeWhereClause(where, fields) {
4305
4305
  const result = {};
4306
4306
  for (const [key, value] of Object.entries(node)) {
4307
4307
  const upperKey = key.toUpperCase();
4308
- if (upperKey === "AND" || upperKey === "OR") {
4308
+ if (upperKey === "AND" || upperKey === "OR" || upperKey === "NOT") {
4309
4309
  if (Array.isArray(value)) {
4310
4310
  const processed = value.map((v) => walk(v)).filter((v) => Object.keys(v).length > 0);
4311
4311
  if (processed.length > 0) {
4312
4312
  result[upperKey] = processed;
4313
4313
  }
4314
+ } else if (typeof value === "object" && value !== null) {
4315
+ const processed = walk(value);
4316
+ if (Object.keys(processed).length > 0) {
4317
+ result[upperKey] = processed;
4318
+ }
4314
4319
  }
4315
4320
  continue;
4316
4321
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dyrected/core",
3
- "version": "2.20.0",
3
+ "version": "2.20.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -44,8 +44,8 @@
44
44
  "devDependencies": {
45
45
  "@types/node": "^20.12.12",
46
46
  "@types/nodemailer": "^6.4.23",
47
- "tsup": "^8.0.0",
48
- "typescript": "^5.0.0",
47
+ "tsup": "^8.5.1",
48
+ "typescript": "^6.0.3",
49
49
  "vite-plugin-node-polyfills": "^0.26.0",
50
50
  "vitest": "^1.0.0"
51
51
  },