Latest Threat Research:SANDWORM_MODE: Shai-Hulud-Style npm Worm Hijacks CI Workflows and Poisons AI Toolchains.Details
Socket
Book a DemoInstallSign in
Socket

@mikro-orm/sql

Package Overview
Dependencies
Maintainers
1
Versions
186
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@mikro-orm/sql - npm Package Compare versions

Comparing version
7.0.0-dev.113
to
7.0.0-dev.114
+2
-2
package.json
{
"name": "@mikro-orm/sql",
"version": "7.0.0-dev.113",
"version": "7.0.0-dev.114",
"description": "TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JavaScript.",

@@ -59,4 +59,4 @@ "type": "module",

"peerDependencies": {
"@mikro-orm/core": "7.0.0-dev.113"
"@mikro-orm/core": "7.0.0-dev.114"
}
}

@@ -1,2 +0,2 @@

import { type EntityKey, type EntityProperty, type MetadataStorage } from '@mikro-orm/core';
import { type EntityKey, type EntityProperty, type MetadataStorage, type RawQueryFragmentSymbol } from '@mikro-orm/core';
import type { ICriteriaNode, ICriteriaNodeProcessOptions, IQueryBuilder } from '../typings.js';

@@ -12,3 +12,3 @@ /**

readonly parent?: ICriteriaNode<T> | undefined;
readonly key?: EntityKey<T> | undefined;
readonly key?: (EntityKey<T> | RawQueryFragmentSymbol) | undefined;
readonly strict: boolean;

@@ -18,3 +18,3 @@ payload: any;

index?: number;
constructor(metadata: MetadataStorage, entityName: string, parent?: ICriteriaNode<T> | undefined, key?: EntityKey<T> | undefined, validate?: boolean, strict?: boolean);
constructor(metadata: MetadataStorage, entityName: string, parent?: ICriteriaNode<T> | undefined, key?: (EntityKey<T> | RawQueryFragmentSymbol) | undefined, validate?: boolean, strict?: boolean);
process(qb: IQueryBuilder<T>, options?: ICriteriaNodeProcessOptions): any;

@@ -21,0 +21,0 @@ unwrap(): any;

@@ -23,3 +23,3 @@ import { RawQueryFragment, ReferenceKind, Utils, inspect, } from '@mikro-orm/core';

const meta = parent && metadata.find(parent.entityName);
if (meta && key) {
if (meta && key && !RawQueryFragment.isKnownFragmentSymbol(key)) {
const pks = Utils.splitPrimaryKeys(key);

@@ -33,3 +33,3 @@ if (pks.length > 1) {

// do not validate if the key is prefixed or type casted (e.g. `k::text`)
if (validate && !isProp && !k.includes('.') && !k.includes('::') && !Utils.isOperator(k) && !RawQueryFragment.isKnownFragment(k)) {
if (validate && !isProp && !k.includes('.') && !k.includes('::') && !Utils.isOperator(k)) {
throw new Error(`Trying to query by not existing property ${entityName}.${k}`);

@@ -55,7 +55,5 @@ }

const composite = this.prop?.joinColumns ? this.prop.joinColumns.length > 1 : false;
const customExpression = RawQueryFragment.isKnownFragment(this.key);
const scalar = payload === null || Utils.isPrimaryKey(payload) || payload instanceof RegExp || payload instanceof Date || customExpression;
const plainObject = Utils.isPlainObject(payload);
const keys = plainObject ? Object.keys(payload) : [];
const operator = plainObject && keys.every(k => Utils.isOperator(k, false));
const rawField = RawQueryFragment.isKnownFragmentSymbol(this.key);
const scalar = payload === null || Utils.isPrimaryKey(payload) || payload instanceof RegExp || payload instanceof Date || rawField;
const operator = Utils.isPlainObject(payload) && Utils.getObjectQueryKeys(payload).every(k => Utils.isOperator(k, false));
if (composite) {

@@ -90,3 +88,3 @@ return true;

// ignore group operators to allow easier mapping (e.g. for orderBy)
const key = this.key && !['$and', '$or', '$not'].includes(this.key) ? '.' + this.key : '';
const key = this.key && !RawQueryFragment.isKnownFragmentSymbol(this.key) && !['$and', '$or', '$not'].includes(this.key) ? '.' + this.key : '';
const ret = parentPath + index + key;

@@ -103,5 +101,5 @@ if (this.isPivotJoin()) {

}
const customExpression = RawQueryFragment.isKnownFragment(this.key);
const scalar = this.payload === null || Utils.isPrimaryKey(this.payload) || this.payload instanceof RegExp || this.payload instanceof Date || customExpression;
const operator = Utils.isObject(this.payload) && Object.keys(this.payload).every(k => Utils.isOperator(k, false));
const rawField = RawQueryFragment.isKnownFragmentSymbol(this.key);
const scalar = this.payload === null || Utils.isPrimaryKey(this.payload) || this.payload instanceof RegExp || this.payload instanceof Date || rawField;
const operator = Utils.isObject(this.payload) && Utils.getObjectQueryKeys(this.payload).every(k => Utils.isOperator(k, false));
return this.prop.kind === ReferenceKind.MANY_TO_MANY && (scalar || operator);

@@ -108,0 +106,0 @@ }

@@ -1,2 +0,2 @@

import { type Dictionary, type EntityKey, type EntityMetadata, type MetadataStorage } from '@mikro-orm/core';
import { type Dictionary, type EntityKey, type EntityMetadata, type MetadataStorage, type RawQueryFragmentSymbol } from '@mikro-orm/core';
import type { ICriteriaNode } from '../typings.js';

@@ -7,7 +7,7 @@ /**

export declare class CriteriaNodeFactory {
static createNode<T extends object>(metadata: MetadataStorage, entityName: string, payload: any, parent?: ICriteriaNode<T>, key?: EntityKey<T>): ICriteriaNode<T>;
static createScalarNode<T extends object>(metadata: MetadataStorage, entityName: string, payload: any, parent?: ICriteriaNode<T>, key?: EntityKey<T>): ICriteriaNode<T>;
static createNode<T extends object>(metadata: MetadataStorage, entityName: string, payload: any, parent?: ICriteriaNode<T>, key?: EntityKey<T> | RawQueryFragmentSymbol): ICriteriaNode<T>;
static createScalarNode<T extends object>(metadata: MetadataStorage, entityName: string, payload: any, parent?: ICriteriaNode<T>, key?: EntityKey<T> | RawQueryFragmentSymbol): ICriteriaNode<T>;
static createArrayNode<T extends object>(metadata: MetadataStorage, entityName: string, payload: any[], parent?: ICriteriaNode<T>, key?: EntityKey<T>): ICriteriaNode<T>;
static createObjectNode<T extends object>(metadata: MetadataStorage, entityName: string, payload: Dictionary, parent?: ICriteriaNode<T>, key?: EntityKey<T>): ICriteriaNode<T>;
static createObjectItemNode<T extends object>(metadata: MetadataStorage, entityName: string, node: ICriteriaNode<T>, payload: Dictionary, key: EntityKey<T>, meta?: EntityMetadata<T>): ICriteriaNode<T>;
static createObjectItemNode<T extends object>(metadata: MetadataStorage, entityName: string, node: ICriteriaNode<T>, payload: Dictionary, key: EntityKey<T> | RawQueryFragmentSymbol, meta?: EntityMetadata<T>): ICriteriaNode<T>;
}

@@ -10,4 +10,4 @@ import { GroupOperator, isRaw, JsonType, RawQueryFragment, ReferenceKind, Utils, ValidationError, } from '@mikro-orm/core';

static createNode(metadata, entityName, payload, parent, key) {
const customExpression = RawQueryFragment.isKnownFragment(key || '');
const scalar = Utils.isPrimaryKey(payload) || isRaw(payload) || payload instanceof RegExp || payload instanceof Date || customExpression;
const rawField = RawQueryFragment.isKnownFragmentSymbol(key);
const scalar = Utils.isPrimaryKey(payload) || isRaw(payload) || payload instanceof RegExp || payload instanceof Date || rawField;
if (Array.isArray(payload) && !scalar) {

@@ -42,4 +42,4 @@ return this.createArrayNode(metadata, entityName, payload, parent, key);

node.payload = {};
for (const key of Object.keys(payload)) {
node.payload[key] = this.createObjectItemNode(metadata, entityName, node, payload, key, meta);
for (const k of Utils.getObjectQueryKeys(payload)) {
node.payload[k] = this.createObjectItemNode(metadata, entityName, node, payload, k, meta);
}

@@ -49,15 +49,17 @@ return node;

static createObjectItemNode(metadata, entityName, node, payload, key, meta) {
const prop = meta?.properties[key];
const rawField = RawQueryFragment.isKnownFragmentSymbol(key);
const prop = rawField ? null : meta?.properties[key];
const childEntity = prop && prop.kind !== ReferenceKind.SCALAR ? prop.type : entityName;
const isNotEmbedded = prop?.kind !== ReferenceKind.EMBEDDED;
const isNotEmbedded = rawField || prop?.kind !== ReferenceKind.EMBEDDED;
const val = payload[key];
if (isNotEmbedded && prop?.customType instanceof JsonType) {
return this.createScalarNode(metadata, childEntity, payload[key], node, key);
return this.createScalarNode(metadata, childEntity, val, node, key);
}
if (prop?.kind === ReferenceKind.SCALAR && payload[key] != null && Object.keys(payload[key]).some(f => f in GroupOperator)) {
if (prop?.kind === ReferenceKind.SCALAR && val != null && Object.keys(val).some(f => f in GroupOperator)) {
throw ValidationError.cannotUseGroupOperatorsInsideScalars(entityName, prop.name, payload);
}
if (isNotEmbedded) {
return this.createNode(metadata, childEntity, payload[key], node, key);
return this.createNode(metadata, childEntity, val, node, key);
}
if (payload[key] == null) {
if (val == null) {
const map = Object.keys(prop.embeddedProps).reduce((oo, k) => {

@@ -71,7 +73,7 @@ oo[prop.embeddedProps[k].name] = null;

const allowedOperators = ['$contains', '$contained', '$overlap'];
const operator = Object.keys(payload[key]).some(f => Utils.isOperator(f) && !allowedOperators.includes(f));
const operator = Object.keys(val).some(f => Utils.isOperator(f) && !allowedOperators.includes(f));
if (operator) {
throw ValidationError.cannotUseOperatorsInsideEmbeddables(entityName, prop.name, payload);
}
const map = Object.keys(payload[key]).reduce((oo, k) => {
const map = Object.keys(val).reduce((oo, k) => {
const embeddedProp = prop.embeddedProps[k] ?? Object.values(prop.embeddedProps).find(p => p.name === k);

@@ -82,9 +84,9 @@ if (!embeddedProp && !allowedOperators.includes(k)) {

if (embeddedProp) {
oo[embeddedProp.name] = payload[key][k];
oo[embeddedProp.name] = val[k];
}
else if (typeof payload[key][k] === 'object') {
oo[k] = JSON.stringify(payload[key][k]);
else if (typeof val[k] === 'object') {
oo[k] = JSON.stringify(val[k]);
}
else {
oo[k] = payload[key][k];
oo[k] = val[k];
}

@@ -91,0 +93,0 @@ return oo;

@@ -30,4 +30,3 @@ import { LockMode, raw, RawQueryFragment, Utils } from '@mikro-orm/core';

if (tableName instanceof NativeQueryBuilder) {
const { sql, params } = tableName.compile();
tableName = raw(sql, params);
tableName = tableName.toRaw();
}

@@ -34,0 +33,0 @@ if (typeof tableName === 'string') {

@@ -12,3 +12,3 @@ import { ALIAS_REPLACEMENT, GroupOperator, QueryFlag, raw, RawQueryFragment, ReferenceKind, Utils, } from '@mikro-orm/core';

const ownerAlias = options?.alias || qb.alias;
const keys = Object.keys(this.payload);
const keys = Utils.getObjectQueryKeys(this.payload);
let alias = options?.alias;

@@ -35,3 +35,3 @@ if (nestedAlias) {

for (const key of keys) {
if (!['$some', '$none', '$every'].includes(key)) {
if (typeof key !== 'string' || !['$some', '$none', '$every'].includes(key)) {
throw new Error('Mixing collection operators with other filters is not allowed.');

@@ -83,3 +83,3 @@ }

const operator = Utils.isOperator(field);
const isRawField = RawQueryFragment.isKnownFragment(field);
const isRawField = RawQueryFragment.isKnownFragmentSymbol(field);
// we need to keep the prefixing for formulas otherwise we would lose aliasing context when nesting inside group operators

@@ -112,3 +112,3 @@ const virtual = childNode.prop?.persist === false && !childNode.prop?.formula;

isStrict() {
return this.strict || Object.keys(this.payload).some(key => {
return this.strict || Utils.getObjectQueryKeys(this.payload).some(key => {
return this.payload[key].isStrict();

@@ -118,3 +118,3 @@ });

unwrap() {
return Object.keys(this.payload).reduce((o, field) => {
return Utils.getObjectQueryKeys(this.payload).reduce((o, field) => {
o[field] = this.payload[field].unwrap();

@@ -127,3 +127,3 @@ return o;

const ownerAlias = alias || qb.alias;
const keys = Object.keys(this.payload);
const keys = Utils.getObjectQueryKeys(this.payload);
if (nestedAlias) {

@@ -141,5 +141,5 @@ alias = nestedAlias;

shouldInline(payload) {
const customExpression = RawQueryFragment.isKnownFragment(this.key);
const scalar = Utils.isPrimaryKey(payload) || payload instanceof RegExp || payload instanceof Date || customExpression;
const operator = Utils.isObject(payload) && Object.keys(payload).every(k => Utils.isOperator(k, false));
const rawField = RawQueryFragment.isKnownFragmentSymbol(this.key);
const scalar = Utils.isPrimaryKey(payload) || payload instanceof RegExp || payload instanceof Date || rawField;
const operator = Utils.isObject(payload) && Utils.getObjectQueryKeys(payload).every(k => Utils.isOperator(k, false));
return !!this.prop && this.prop.kind !== ReferenceKind.SCALAR && !scalar && !operator;

@@ -155,4 +155,4 @@ }

const key = this.getChildKey(k, prop, childAlias);
const value = payload.map((child) => Object.keys(child).reduce((inner, childKey) => {
const key = (this.isPrefixed(childKey) || Utils.isOperator(childKey)) ? childKey : this.aliased(childKey, childAlias);
const value = payload.map((child) => Utils.getObjectQueryKeys(child).reduce((inner, childKey) => {
const key = (RawQueryFragment.isKnownFragmentSymbol(childKey) || this.isPrefixed(childKey) || Utils.isOperator(childKey)) ? childKey : this.aliased(childKey, childAlias);
inner[key] = child[childKey];

@@ -165,4 +165,7 @@ return inner;

const prop = this.metadata.find(this.entityName).properties[field];
for (const k of Object.keys(payload)) {
if (Utils.isOperator(k, false)) {
for (const k of Utils.getObjectQueryKeys(payload)) {
if (RawQueryFragment.isKnownFragmentSymbol(k)) {
o[k] = payload[k];
}
else if (Utils.isOperator(k, false)) {
const tmp = payload[k];

@@ -179,5 +182,2 @@ delete payload[k];

}
else if (RawQueryFragment.isKnownFragment(k)) {
o[k] = payload[k];
}
else {

@@ -207,4 +207,4 @@ o[this.aliased(k, childAlias)] = payload[k];

}
const keys = Object.keys(this.payload);
if (keys.every(k => k.includes('.') && k.startsWith(`${qb.alias}.`))) {
const keys = Utils.getObjectQueryKeys(this.payload);
if (keys.every(k => typeof k === 'string' && k.includes('.') && k.startsWith(`${qb.alias}.`))) {
return false;

@@ -220,3 +220,3 @@ }

const primaryKeys = knownKey && keys.every(key => {
if (!meta.primaryKeys.includes(key)) {
if (typeof key !== 'string' || !meta.primaryKeys.includes(key)) {
return false;

@@ -227,3 +227,3 @@ }

}
return Object.keys(this.payload[key].payload).every(k => meta.properties[key].targetMeta.primaryKeys.includes(k));
return Utils.getObjectQueryKeys(this.payload[key].payload).every(k => typeof k === 'string' && meta.properties[key].targetMeta.primaryKeys.includes(k));
});

@@ -234,5 +234,5 @@ return !primaryKeys && !nestedAlias && !operatorKeys && !embeddable;

const nestedAlias = qb.getNextAlias(this.prop?.pivotTable ?? this.entityName);
const customExpression = RawQueryFragment.isKnownFragment(this.key);
const scalar = Utils.isPrimaryKey(this.payload) || this.payload instanceof RegExp || this.payload instanceof Date || customExpression;
const operator = Utils.isPlainObject(this.payload) && Object.keys(this.payload).every(k => Utils.isOperator(k, false));
const rawField = RawQueryFragment.isKnownFragmentSymbol(this.key);
const scalar = Utils.isPrimaryKey(this.payload) || this.payload instanceof RegExp || this.payload instanceof Date || rawField;
const operator = Utils.isPlainObject(this.payload) && Utils.getObjectQueryKeys(this.payload).every(k => Utils.isOperator(k, false));
const field = `${alias}.${this.prop.name}`;

@@ -239,0 +239,0 @@ const method = qb.hasFlag(QueryFlag.INFER_POPULATE) ? 'joinAndSelect' : 'join';

@@ -101,4 +101,2 @@ import { type AnyEntity, type ConnectionType, type Dictionary, type EntityData, type EntityKey, type EntityManager, type EntityMetadata, type EntityName, type EntityProperty, type ExpandProperty, type FilterOptions, type FlushMode, type GroupOperator, type Loaded, LockMode, type LoggingOptions, type MetadataStorage, type ObjectQuery, PopulateHint, type PopulateOptions, type QBFilterQuery, type QBQueryOrderMap, QueryFlag, type QueryOrderMap, type QueryResult, RawQueryFragment, type RequiredEntityData, type Transaction } from '@mikro-orm/core';

_populateMap: Dictionary<string>;
/** @internal */
readonly rawFragments: Set<string>;
protected aliasCounter: number;

@@ -179,7 +177,7 @@ protected flags: Set<QueryFlag>;

where(cond: QBFilterQuery<Entity>, operator?: keyof typeof GroupOperator): this;
where(cond: string, params?: any[], operator?: keyof typeof GroupOperator): this;
where(cond: string | RawQueryFragment, params?: any[], operator?: keyof typeof GroupOperator): this;
andWhere(cond: QBFilterQuery<Entity>): this;
andWhere(cond: string, params?: any[]): this;
andWhere(cond: string | RawQueryFragment, params?: any[]): this;
orWhere(cond: QBFilterQuery<Entity>): this;
orWhere(cond: string, params?: any[]): this;
orWhere(cond: string | RawQueryFragment, params?: any[]): this;
orderBy(orderBy: QBQueryOrderMap<Entity> | QBQueryOrderMap<Entity>[]): SelectQueryBuilder<Entity, RootAlias, Hint, Context>;

@@ -231,6 +229,2 @@ andOrderBy(orderBy: QBQueryOrderMap<Entity> | QBQueryOrderMap<Entity>[]): SelectQueryBuilder<Entity, RootAlias, Hint, Context>;

/**
* @internal
*/
clearRawFragmentsCache(): void;
/**
* Returns the query with parameters as wildcards.

@@ -237,0 +231,0 @@ */

@@ -1,2 +0,2 @@

import { type Dictionary, type EntityData, type EntityKey, type EntityMetadata, type EntityProperty, type FlatQueryOrderMap, LockMode, type QBFilterQuery, RawQueryFragment } from '@mikro-orm/core';
import { type Dictionary, type EntityData, type EntityKey, type EntityMetadata, type EntityProperty, type FlatQueryOrderMap, LockMode, type QBFilterQuery, type QBQueryOrderMap, Raw, type RawQueryFragmentSymbol } from '@mikro-orm/core';
import { JoinType, QueryType } from './enums.js';

@@ -18,4 +18,4 @@ import type { Field, JoinOptions } from '../typings.js';

constructor(entityName: string, alias: string, aliasMap: Dictionary<Alias<any>>, subQueries: Dictionary<string>, driver: AbstractSqlDriver);
mapper(field: string | RawQueryFragment, type?: QueryType): string;
mapper(field: string | RawQueryFragment, type?: QueryType, value?: any, alias?: string | null): string;
mapper(field: string | Raw | RawQueryFragmentSymbol, type?: QueryType): string;
mapper(field: string | Raw | RawQueryFragmentSymbol, type?: QueryType, value?: any, alias?: string | null): string;
processData(data: Dictionary, convertCustomTypes: boolean, multi?: boolean): any;

@@ -30,3 +30,3 @@ joinOneToReference(prop: EntityProperty, ownerAlias: string, alias: string, type: JoinType, cond?: Dictionary, schema?: string): JoinOptions;

};
mapJoinColumns(type: QueryType, join: JoinOptions): (string | RawQueryFragment)[];
mapJoinColumns(type: QueryType, join: JoinOptions): (string | Raw)[];
isOneToOneInverse(field: string, meta?: EntityMetadata): boolean;

@@ -50,2 +50,3 @@ getTableName(entityName: string): string;

private getOperatorReplacement;
validateQueryOrder<T>(orderBy: QBQueryOrderMap<T>): void;
getQueryOrder(type: QueryType, orderBy: FlatQueryOrderMap | FlatQueryOrderMap[], populate: Dictionary<string>): string[];

@@ -72,3 +73,3 @@ getQueryOrderFromObject(type: QueryType, orderBy: FlatQueryOrderMap, populate: Dictionary<string>): string[];

export interface OnConflictClause<T> {
fields: string[] | RawQueryFragment;
fields: string[] | Raw;
ignore?: boolean;

@@ -75,0 +76,0 @@ merge?: EntityData<T> | Field<T>[];

@@ -1,2 +0,2 @@

import { ALIAS_REPLACEMENT, ALIAS_REPLACEMENT_RE, ArrayType, isRaw, LockMode, OptimisticLockError, QueryOperator, QueryOrderNumeric, raw, RawQueryFragment, ReferenceKind, Utils, ValidationError, } from '@mikro-orm/core';
import { ALIAS_REPLACEMENT, ALIAS_REPLACEMENT_RE, ArrayType, inspect, isRaw, LockMode, OptimisticLockError, QueryOperator, QueryOrderNumeric, raw, Raw, ReferenceKind, Utils, ValidationError, } from '@mikro-orm/core';
import { JoinType, QueryType } from './enums.js';

@@ -28,2 +28,5 @@ import { NativeQueryBuilder } from './NativeQueryBuilder.js';

}
if (Raw.isKnownFragmentSymbol(field)) {
return Raw.getKnownFragment(field);
}
/* v8 ignore next */

@@ -64,6 +67,2 @@ if (typeof field !== 'string') {

}
const rawField = RawQueryFragment.getKnownFragment(field);
if (rawField) {
return rawField;
}
const aliasPrefix = isTableNameAliasRequired ? this.alias + '.' : '';

@@ -74,3 +73,2 @@ const [a, f] = this.splitField(field);

const fkIdx = fkIdx2 === -1 ? 0 : fkIdx2;
let ret = field;
// embeddable nested path instead of a regular property with table alias, reset alias

@@ -113,6 +111,3 @@ if (prop?.name === a && prop.embeddedProps[f]) {

}
// do not wrap custom expressions
if (!rawField) {
ret = this.prefix(field, false, false, fkIdx);
}
let ret = this.prefix(field, false, false, fkIdx);
if (alias) {

@@ -250,3 +245,3 @@ ret += ' as ' + alias;

conditions.push(subquery.sql);
params.push(...subquery.params);
subquery.params.forEach(p => params.push(p));
}

@@ -340,3 +335,3 @@ if (conditions.length > 0) {

const params = [];
for (const k of Object.keys(cond)) {
for (const k of Utils.getObjectQueryKeys(cond)) {
if (k === '$and' || k === '$or') {

@@ -353,3 +348,3 @@ if (operator) {

parts.push(`not (${res.sql})`);
params.push(...res.params);
res.params.forEach(p => params.push(p));
continue;

@@ -372,3 +367,2 @@ }

const params = [];
const fields = Utils.splitPrimaryKeys(key);
if (this.isSimpleRegExp(cond[key])) {

@@ -383,4 +377,4 @@ parts.push(`${this.platform.quoteIdentifier(this.mapper(key, type))} like ?`);

const op = cond[key] === null ? 'is' : '=';
const raw = RawQueryFragment.getKnownFragment(key);
if (raw) {
if (Raw.isKnownFragmentSymbol(key)) {
const raw = Raw.getKnownFragment(key);
const sql = raw.sql.replaceAll(ALIAS_REPLACEMENT, this.alias);

@@ -390,3 +384,4 @@ const value = Utils.asArray(cond[key]);

if (value.length > 0) {
const val = this.getValueReplacement(fields, value[0], params, key);
const k = key;
const val = this.getValueReplacement([k], value[0], params, k);
parts.push(`${sql} ${op} ${val}`);

@@ -398,2 +393,3 @@ return { sql: parts.join(' and '), params };

}
const fields = Utils.splitPrimaryKeys(key);
if (this.subQueries[key]) {

@@ -418,5 +414,3 @@ const val = this.getValueReplacement(fields, cond[key], params, key);

if (size > 1) {
const rawField = RawQueryFragment.getKnownFragment(key);
const subCondition = Object.entries(value).map(([subKey, subValue]) => {
key = rawField?.clone().toString() ?? key;
return ({ [key]: { [subKey]: subValue } });

@@ -439,3 +433,4 @@ });

const replacement = this.getOperatorReplacement(op, value);
const fields = Utils.splitPrimaryKeys(key);
const rawField = Raw.isKnownFragmentSymbol(key);
const fields = rawField ? [key] : Utils.splitPrimaryKeys(key);
if (fields.length > 1 && Array.isArray(value[op])) {

@@ -468,8 +463,8 @@ const singleTuple = !value[op].every((v) => Array.isArray(v));

}
const [a, f] = this.splitField(key);
const prop = this.getProperty(f, a);
const [a, f] = rawField ? [] : this.splitField(key);
const prop = f && this.getProperty(f, a);
if (op === '$fulltext') {
/* v8 ignore next */
if (!prop) {
throw new Error(`Cannot use $fulltext operator on ${key}, property not found`);
throw new Error(`Cannot use $fulltext operator on ${String(key)}, property not found`);
}

@@ -486,3 +481,3 @@ const { sql, params: params2 } = raw(this.platform.getFullTextWhereClause(prop), {

}
else if (value[op] instanceof RawQueryFragment || value[op] instanceof NativeQueryBuilder) {
else if (value[op] instanceof Raw || value[op] instanceof NativeQueryBuilder) {
const query = value[op] instanceof NativeQueryBuilder ? value[op].toRaw() : value[op];

@@ -519,3 +514,3 @@ const mappedKey = this.mapper(key, type, query, null);

else {
value.forEach(v => params.push(v));
value.forEach(p => params.push(p));
}

@@ -547,2 +542,27 @@ return `(${value.map(() => '?').join(', ')})`;

}
validateQueryOrder(orderBy) {
const strKeys = [];
const rawKeys = [];
for (const key of Utils.getObjectQueryKeys(orderBy)) {
const raw = Raw.getKnownFragment(key);
if (raw) {
rawKeys.push(raw);
}
else {
strKeys.push(key);
}
}
if (strKeys.length > 0 && rawKeys.length > 0) {
const example = [
...strKeys.map(key => ({ [key]: orderBy[key] })),
...rawKeys.map(rawKey => ({ [`raw('${rawKey.sql}')`]: orderBy[rawKey] })),
];
throw new Error([
`Invalid "orderBy": You are mixing field-based keys and raw SQL fragments inside a single object.`,
`This is not allowed because object key order cannot reliably preserve evaluation order.`,
`To fix this, split them into separate objects inside an array:\n`,
`orderBy: ${inspect(example, { depth: 5 }).replace(/"raw\('(.*)'\)"/g, `[raw('$1')]`)}`,
].join('\n'));
}
}
getQueryOrder(type, orderBy, populate) {

@@ -556,7 +576,7 @@ if (Array.isArray(orderBy)) {

const ret = [];
for (const key of Object.keys(orderBy)) {
for (const key of Utils.getObjectQueryKeys(orderBy)) {
const direction = orderBy[key];
const order = typeof direction === 'number' ? QueryOrderNumeric[direction] : direction;
const raw = RawQueryFragment.getKnownFragment(key);
if (raw) {
if (Raw.isKnownFragmentSymbol(key)) {
const raw = Raw.getKnownFragment(key);
ret.push(...this.platform.getOrderByExpression(this.platform.formatQuery(raw.sql, raw.params), order));

@@ -570,3 +590,3 @@ continue;

const prop = this.getProperty(field, alias);
const noPrefix = (prop?.persist === false && !prop.formula && !prop.embedded) || RawQueryFragment.isKnownFragment(f);
const noPrefix = (prop?.persist === false && !prop.formula && !prop.embedded) || Raw.isKnownFragment(f);
const column = this.mapper(noPrefix ? field : `${alias}.${field}`, type, undefined, null);

@@ -674,3 +694,3 @@ /* v8 ignore next */

const fieldName = this.fieldName(field, this.alias, always, idx);
if (fieldName instanceof RawQueryFragment) {
if (fieldName instanceof Raw) {
return fieldName.sql;

@@ -684,3 +704,3 @@ }

const fieldName = this.fieldName(f, a, always, idx);
if (fieldName instanceof RawQueryFragment) {
if (fieldName instanceof Raw) {
return fieldName.sql;

@@ -707,3 +727,3 @@ }

// skip nesting parens if the value is simple = scalar or object without operators or with only single key, being the operator
const keys = Object.keys(sub);
const keys = Utils.getObjectQueryKeys(sub);
const val = sub[keys[0]];

@@ -710,0 +730,0 @@ const simple = !Utils.isPlainObject(val) || Utils.getObjectKeysSize(val) === 1 || Object.keys(val).every(k => !Utils.isOperator(k));

@@ -1,2 +0,2 @@

import { ReferenceKind, RawQueryFragment, } from '@mikro-orm/core';
import { ReferenceKind, isRaw, } from '@mikro-orm/core';
import { DatabaseTable } from './DatabaseTable.js';

@@ -111,11 +111,7 @@ /**

const columnName = check.property ? meta.properties[check.property].fieldNames[0] : undefined;
let expression = check.expression;
const raw = RawQueryFragment.getKnownFragment(expression);
if (raw) {
expression = platform.formatQuery(raw.sql, raw.params);
}
const expression = isRaw(check.expression) ? platform.formatQuery(check.expression.sql, check.expression.params) : check.expression;
table.addCheck({
name: check.name,
expression,
definition: `check (${check.expression})`,
definition: `check (${expression})`,
columnName,

@@ -122,0 +118,0 @@ });

@@ -1,2 +0,2 @@

import { type Connection, type Dictionary } from '@mikro-orm/core';
import { type Connection, type Dictionary, RawQueryFragment } from '@mikro-orm/core';
import type { AbstractSqlConnection } from '../AbstractSqlConnection.js';

@@ -42,3 +42,3 @@ import type { AbstractSqlPlatform } from '../AbstractSqlPlatform.js';

mapForeignKeys(fks: any[], tableName: string, schemaName?: string): Dictionary;
normalizeDefaultValue(defaultValue: string, length?: number, defaultValues?: Dictionary<string[]>): string | number;
normalizeDefaultValue(defaultValue: string | RawQueryFragment, length?: number, defaultValues?: Dictionary<string[]>): string | number;
getCreateDatabaseSQL(name: string): string;

@@ -45,0 +45,0 @@ getDropDatabaseSQL(name: string): string;

@@ -326,5 +326,4 @@ import { RawQueryFragment, Utils } from '@mikro-orm/core';

}
const raw = RawQueryFragment.getKnownFragment(defaultValue);
if (raw) {
return this.platform.formatQuery(raw.sql, raw.params);
if (defaultValue instanceof RawQueryFragment) {
return this.platform.formatQuery(defaultValue.sql, defaultValue.params);
}

@@ -331,0 +330,0 @@ const genericValue = defaultValue.replace(/\(\d+\)/, '(?)').toLowerCase();

@@ -182,3 +182,3 @@ import type { Generated, Kysely } from 'kysely';

readonly parent?: ICriteriaNode<T> | undefined;
readonly key?: string | undefined;
readonly key?: string | symbol | undefined;
readonly strict?: boolean;

@@ -185,0 +185,0 @@ payload: any;

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display