@strapi/database 5.51.0 → 5.51.2
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/dialects/mysql/database-inspector.js +1 -1
- package/dist/dialects/mysql/database-inspector.js.map +1 -1
- package/dist/dialects/mysql/database-inspector.mjs +1 -1
- package/dist/dialects/mysql/database-inspector.mjs.map +1 -1
- package/dist/dialects/mysql/index.js +2 -2
- package/dist/dialects/mysql/index.js.map +1 -1
- package/dist/dialects/mysql/index.mjs +2 -2
- package/dist/dialects/mysql/index.mjs.map +1 -1
- package/dist/entity-manager/index.js +30 -30
- package/dist/entity-manager/index.js.map +1 -1
- package/dist/entity-manager/index.mjs +30 -30
- package/dist/entity-manager/index.mjs.map +1 -1
- package/dist/entity-manager/relations-orderer.js +1 -1
- package/dist/entity-manager/relations-orderer.js.map +1 -1
- package/dist/entity-manager/relations-orderer.mjs +1 -1
- package/dist/entity-manager/relations-orderer.mjs.map +1 -1
- package/dist/fields/datetime.d.ts.map +1 -1
- package/dist/fields/datetime.js +6 -23
- package/dist/fields/datetime.js.map +1 -1
- package/dist/fields/datetime.mjs +6 -3
- package/dist/fields/datetime.mjs.map +1 -1
- package/dist/fields/index.d.ts.map +1 -1
- package/dist/fields/index.js +21 -8
- package/dist/fields/index.js.map +1 -1
- package/dist/fields/index.mjs +21 -4
- package/dist/fields/index.mjs.map +1 -1
- package/dist/fields/json.js +1 -1
- package/dist/fields/json.js.map +1 -1
- package/dist/fields/json.mjs +1 -1
- package/dist/fields/json.mjs.map +1 -1
- package/dist/fields/shared/parsers.js +1 -1
- package/dist/fields/shared/parsers.js.map +1 -1
- package/dist/fields/shared/parsers.mjs +1 -1
- package/dist/fields/shared/parsers.mjs.map +1 -1
- package/dist/fields/timestamp.d.ts.map +1 -1
- package/dist/fields/timestamp.js +5 -23
- package/dist/fields/timestamp.js.map +1 -1
- package/dist/fields/timestamp.mjs +5 -3
- package/dist/fields/timestamp.mjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js +1 -1
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs +1 -1
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -1
- package/dist/query/helpers/populate/apply.d.ts.map +1 -1
- package/dist/query/helpers/populate/apply.js +7 -5
- package/dist/query/helpers/populate/apply.js.map +1 -1
- package/dist/query/helpers/populate/apply.mjs +7 -5
- package/dist/query/helpers/populate/apply.mjs.map +1 -1
- package/dist/query/helpers/search.d.ts +1 -0
- package/dist/query/helpers/search.d.ts.map +1 -1
- package/dist/query/helpers/search.js +1 -0
- package/dist/query/helpers/search.js.map +1 -1
- package/dist/query/helpers/search.mjs +1 -1
- package/dist/query/helpers/search.mjs.map +1 -1
- package/dist/query/helpers/transform.d.ts.map +1 -1
- package/dist/query/helpers/transform.js +4 -1
- package/dist/query/helpers/transform.js.map +1 -1
- package/dist/query/helpers/transform.mjs +4 -1
- package/dist/query/helpers/transform.mjs.map +1 -1
- package/dist/query/helpers/where.d.ts.map +1 -1
- package/dist/query/helpers/where.js +34 -14
- package/dist/query/helpers/where.js.map +1 -1
- package/dist/query/helpers/where.mjs +34 -14
- package/dist/query/helpers/where.mjs.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sources":["../../../src/query/helpers/search.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport type { Knex } from 'knex';\n\nimport * as types from '../../utils/types';\nimport { toColumnName } from './transform';\nimport type { Ctx } from '../types';\n\nexport const applySearch = (knex: Knex.QueryBuilder, query: string, ctx: Ctx) => {\n const { qb, uid, db } = ctx;\n const meta = db.metadata.get(uid);\n\n const { attributes } = meta;\n\n const searchColumns = ['id'];\n\n const stringColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isString(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...stringColumns);\n\n if (!_.isNaN(_.toNumber(query))) {\n const numberColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isNumber(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...numberColumns);\n }\n\n switch (db.dialect.client) {\n case 'postgres': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`??::text ILIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n\n break;\n }\n case 'sqlite': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ? ESCAPE '\\\\'`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n case 'mysql': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n default: {\n // do nothing\n }\n }\n};\n\
|
|
1
|
+
{"version":3,"file":"search.js","sources":["../../../src/query/helpers/search.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport type { Knex } from 'knex';\n\nimport * as types from '../../utils/types';\nimport { toColumnName } from './transform';\nimport type { Ctx } from '../types';\n\nexport const applySearch = (knex: Knex.QueryBuilder, query: string, ctx: Ctx) => {\n const { qb, uid, db } = ctx;\n const meta = db.metadata.get(uid);\n\n const { attributes } = meta;\n\n const searchColumns = ['id'];\n\n const stringColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isString(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...stringColumns);\n\n if (!_.isNaN(_.toNumber(query))) {\n const numberColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isNumber(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...numberColumns);\n }\n\n switch (db.dialect.client) {\n case 'postgres': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`??::text ILIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n\n break;\n }\n case 'sqlite': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ? ESCAPE '\\\\'`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n case 'mysql': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n default: {\n // do nothing\n }\n }\n};\n\nexport const escapeQuery = (query: string, charsToEscape: string, escapeChar = '\\\\') => {\n return query\n .split('')\n .reduce(\n (escapedQuery, char) =>\n charsToEscape.includes(char)\n ? `${escapedQuery}${escapeChar}${char}`\n : `${escapedQuery}${char}`,\n ''\n );\n};\n"],"names":["applySearch","knex","query","ctx","qb","uid","db","meta","metadata","get","attributes","searchColumns","stringColumns","Object","keys","filter","attributeName","attribute","types","type","searchable","push","_","isNaN","toNumber","numberColumns","dialect","client","forEach","attr","columnName","toColumnName","orWhereRaw","aliasColumn","escapeQuery","charsToEscape","escapeChar","split","reduce","escapedQuery","char","includes"],"mappings":"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"}
|
|
@@ -61,5 +61,5 @@ const escapeQuery = (query, charsToEscape, escapeChar = '\\')=>{
|
|
|
61
61
|
return query.split('').reduce((escapedQuery, char)=>charsToEscape.includes(char) ? `${escapedQuery}${escapeChar}${char}` : `${escapedQuery}${char}`, '');
|
|
62
62
|
};
|
|
63
63
|
|
|
64
|
-
export { applySearch };
|
|
64
|
+
export { applySearch, escapeQuery };
|
|
65
65
|
//# sourceMappingURL=search.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.mjs","sources":["../../../src/query/helpers/search.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport type { Knex } from 'knex';\n\nimport * as types from '../../utils/types';\nimport { toColumnName } from './transform';\nimport type { Ctx } from '../types';\n\nexport const applySearch = (knex: Knex.QueryBuilder, query: string, ctx: Ctx) => {\n const { qb, uid, db } = ctx;\n const meta = db.metadata.get(uid);\n\n const { attributes } = meta;\n\n const searchColumns = ['id'];\n\n const stringColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isString(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...stringColumns);\n\n if (!_.isNaN(_.toNumber(query))) {\n const numberColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isNumber(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...numberColumns);\n }\n\n switch (db.dialect.client) {\n case 'postgres': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`??::text ILIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n\n break;\n }\n case 'sqlite': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ? ESCAPE '\\\\'`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n case 'mysql': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n default: {\n // do nothing\n }\n }\n};\n\
|
|
1
|
+
{"version":3,"file":"search.mjs","sources":["../../../src/query/helpers/search.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport type { Knex } from 'knex';\n\nimport * as types from '../../utils/types';\nimport { toColumnName } from './transform';\nimport type { Ctx } from '../types';\n\nexport const applySearch = (knex: Knex.QueryBuilder, query: string, ctx: Ctx) => {\n const { qb, uid, db } = ctx;\n const meta = db.metadata.get(uid);\n\n const { attributes } = meta;\n\n const searchColumns = ['id'];\n\n const stringColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isString(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...stringColumns);\n\n if (!_.isNaN(_.toNumber(query))) {\n const numberColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isNumber(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...numberColumns);\n }\n\n switch (db.dialect.client) {\n case 'postgres': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`??::text ILIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n\n break;\n }\n case 'sqlite': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ? ESCAPE '\\\\'`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n case 'mysql': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n default: {\n // do nothing\n }\n }\n};\n\nexport const escapeQuery = (query: string, charsToEscape: string, escapeChar = '\\\\') => {\n return query\n .split('')\n .reduce(\n (escapedQuery, char) =>\n charsToEscape.includes(char)\n ? `${escapedQuery}${escapeChar}${char}`\n : `${escapedQuery}${char}`,\n ''\n );\n};\n"],"names":["applySearch","knex","query","ctx","qb","uid","db","meta","metadata","get","attributes","searchColumns","stringColumns","Object","keys","filter","attributeName","attribute","types","type","searchable","push","_","isNaN","toNumber","numberColumns","dialect","client","forEach","attr","columnName","toColumnName","orWhereRaw","aliasColumn","escapeQuery","charsToEscape","escapeChar","split","reduce","escapedQuery","char","includes"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/query/helpers/transform.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;AAC1C,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/query/helpers/transform.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;AAC1C,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;AAsCjD,QAAA,MAAM,OAAO,GAAI,MAAM,IAAI,EAAE,KAAK,GAAG,GAAG,GAAG,EAAE,GAAG,SAAS,gBAUxD,CAAC;AA4BF,iBAAS,KAAK,CAAC,KAAK,SAAS,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,EAC7C,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,KAAK,GACV,KAAK,SAAS,IAAI,GAAG,IAAI,GAAG,KAAK,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;AAajE,QAAA,MAAM,YAAY,GAAI,MAAM,IAAI,EAAE,MAAM,IAAI,GAAG,MAAM,WAYpD,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -15,7 +15,10 @@ const fromSingleRow = (meta, row)=>{
|
|
|
15
15
|
}
|
|
16
16
|
const obj = {};
|
|
17
17
|
for(const column in row){
|
|
18
|
-
|
|
18
|
+
// `_.has` from lodash/fp treats its first argument as a property *path*, so every
|
|
19
|
+
// column of every row was run through lodash's path parser before this simple
|
|
20
|
+
// membership test. Column names are literal keys, never paths.
|
|
21
|
+
if (!Object.prototype.hasOwnProperty.call(meta.columnToAttribute, column)) {
|
|
19
22
|
continue;
|
|
20
23
|
}
|
|
21
24
|
const attributeName = meta.columnToAttribute[column];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","sources":["../../../src/query/helpers/transform.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport * as types from '../../utils/types';\nimport { createField } from '../../fields';\n\nimport type { Meta } from '../../metadata';\n\ntype Row = Record<string, unknown> | null;\nexport type Rec = Record<string, unknown> | null;\n\nconst fromSingleRow = (meta: Meta, row: Row): Rec => {\n const { attributes } = meta;\n\n if (_.isNil(row)) {\n return null;\n }\n\n const obj: Rec = {};\n\n for (const column in row) {\n
|
|
1
|
+
{"version":3,"file":"transform.js","sources":["../../../src/query/helpers/transform.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport * as types from '../../utils/types';\nimport { createField } from '../../fields';\n\nimport type { Meta } from '../../metadata';\n\ntype Row = Record<string, unknown> | null;\nexport type Rec = Record<string, unknown> | null;\n\nconst fromSingleRow = (meta: Meta, row: Row): Rec => {\n const { attributes } = meta;\n\n if (_.isNil(row)) {\n return null;\n }\n\n const obj: Rec = {};\n\n for (const column in row) {\n // `_.has` from lodash/fp treats its first argument as a property *path*, so every\n // column of every row was run through lodash's path parser before this simple\n // membership test. Column names are literal keys, never paths.\n if (!Object.prototype.hasOwnProperty.call(meta.columnToAttribute, column)) {\n continue;\n }\n\n const attributeName = meta.columnToAttribute[column];\n const attribute = attributes[attributeName];\n\n if (types.isScalar(attribute.type)) {\n const field = createField(attribute);\n\n const val = row[column] === null ? null : field.fromDB(row[column]);\n\n obj[attributeName] = val;\n }\n\n if (types.isRelation(attribute.type)) {\n obj[attributeName] = row[column];\n }\n }\n\n return obj;\n};\n\nconst fromRow = (meta: Meta, row: Row | Row[] | undefined) => {\n if (_.isNil(row)) {\n return null;\n }\n\n if (Array.isArray(row)) {\n return row.map((singleRow) => fromSingleRow(meta, singleRow));\n }\n\n return fromSingleRow(meta, row);\n};\n\nconst toSingleRow = (meta: Meta, data: Rec = {}): Row => {\n if (_.isNil(data)) {\n return data;\n }\n\n const { attributes } = meta;\n\n for (const key of Object.keys(data)) {\n const attribute = attributes[key];\n\n if (\n !attribute ||\n !('columnName' in attribute) ||\n !attribute.columnName ||\n attribute.columnName === key\n ) {\n continue;\n }\n\n data[attribute.columnName] = data[key];\n delete data[key];\n }\n\n return data;\n};\n\nfunction toRow<TData extends Rec | Rec[] | null>(\n meta: Meta,\n data: TData\n): TData extends null ? null : TData extends Rec[] ? Row[] : Rec;\nfunction toRow(meta: Meta, data: Rec | Rec[] | null): Row | Row[] | null {\n if (_.isNil(data)) {\n return data;\n }\n\n if (_.isArray(data)) {\n return data.map((datum) => toSingleRow(meta, datum));\n }\n\n return toSingleRow(meta, data);\n}\n\nconst toColumnName = (meta: Meta, name: null | string) => {\n if (!name) {\n throw new Error('Name cannot be null');\n }\n\n const attribute = meta.attributes[name];\n\n if (!attribute) {\n return name;\n }\n\n return ('columnName' in attribute && attribute.columnName) || name;\n};\n\nexport { toRow, fromRow, toColumnName };\n"],"names":["fromSingleRow","meta","row","attributes","_","isNil","obj","column","Object","prototype","hasOwnProperty","call","columnToAttribute","attributeName","attribute","types","type","field","createField","val","fromDB","fromRow","Array","isArray","map","singleRow","toSingleRow","data","key","keys","columnName","toRow","datum","toColumnName","name","Error"],"mappings":"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"}
|
|
@@ -9,7 +9,10 @@ const fromSingleRow = (meta, row)=>{
|
|
|
9
9
|
}
|
|
10
10
|
const obj = {};
|
|
11
11
|
for(const column in row){
|
|
12
|
-
|
|
12
|
+
// `_.has` from lodash/fp treats its first argument as a property *path*, so every
|
|
13
|
+
// column of every row was run through lodash's path parser before this simple
|
|
14
|
+
// membership test. Column names are literal keys, never paths.
|
|
15
|
+
if (!Object.prototype.hasOwnProperty.call(meta.columnToAttribute, column)) {
|
|
13
16
|
continue;
|
|
14
17
|
}
|
|
15
18
|
const attributeName = meta.columnToAttribute[column];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.mjs","sources":["../../../src/query/helpers/transform.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport * as types from '../../utils/types';\nimport { createField } from '../../fields';\n\nimport type { Meta } from '../../metadata';\n\ntype Row = Record<string, unknown> | null;\nexport type Rec = Record<string, unknown> | null;\n\nconst fromSingleRow = (meta: Meta, row: Row): Rec => {\n const { attributes } = meta;\n\n if (_.isNil(row)) {\n return null;\n }\n\n const obj: Rec = {};\n\n for (const column in row) {\n
|
|
1
|
+
{"version":3,"file":"transform.mjs","sources":["../../../src/query/helpers/transform.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport * as types from '../../utils/types';\nimport { createField } from '../../fields';\n\nimport type { Meta } from '../../metadata';\n\ntype Row = Record<string, unknown> | null;\nexport type Rec = Record<string, unknown> | null;\n\nconst fromSingleRow = (meta: Meta, row: Row): Rec => {\n const { attributes } = meta;\n\n if (_.isNil(row)) {\n return null;\n }\n\n const obj: Rec = {};\n\n for (const column in row) {\n // `_.has` from lodash/fp treats its first argument as a property *path*, so every\n // column of every row was run through lodash's path parser before this simple\n // membership test. Column names are literal keys, never paths.\n if (!Object.prototype.hasOwnProperty.call(meta.columnToAttribute, column)) {\n continue;\n }\n\n const attributeName = meta.columnToAttribute[column];\n const attribute = attributes[attributeName];\n\n if (types.isScalar(attribute.type)) {\n const field = createField(attribute);\n\n const val = row[column] === null ? null : field.fromDB(row[column]);\n\n obj[attributeName] = val;\n }\n\n if (types.isRelation(attribute.type)) {\n obj[attributeName] = row[column];\n }\n }\n\n return obj;\n};\n\nconst fromRow = (meta: Meta, row: Row | Row[] | undefined) => {\n if (_.isNil(row)) {\n return null;\n }\n\n if (Array.isArray(row)) {\n return row.map((singleRow) => fromSingleRow(meta, singleRow));\n }\n\n return fromSingleRow(meta, row);\n};\n\nconst toSingleRow = (meta: Meta, data: Rec = {}): Row => {\n if (_.isNil(data)) {\n return data;\n }\n\n const { attributes } = meta;\n\n for (const key of Object.keys(data)) {\n const attribute = attributes[key];\n\n if (\n !attribute ||\n !('columnName' in attribute) ||\n !attribute.columnName ||\n attribute.columnName === key\n ) {\n continue;\n }\n\n data[attribute.columnName] = data[key];\n delete data[key];\n }\n\n return data;\n};\n\nfunction toRow<TData extends Rec | Rec[] | null>(\n meta: Meta,\n data: TData\n): TData extends null ? null : TData extends Rec[] ? Row[] : Rec;\nfunction toRow(meta: Meta, data: Rec | Rec[] | null): Row | Row[] | null {\n if (_.isNil(data)) {\n return data;\n }\n\n if (_.isArray(data)) {\n return data.map((datum) => toSingleRow(meta, datum));\n }\n\n return toSingleRow(meta, data);\n}\n\nconst toColumnName = (meta: Meta, name: null | string) => {\n if (!name) {\n throw new Error('Name cannot be null');\n }\n\n const attribute = meta.attributes[name];\n\n if (!attribute) {\n return name;\n }\n\n return ('columnName' in attribute && attribute.columnName) || name;\n};\n\nexport { toRow, fromRow, toColumnName };\n"],"names":["fromSingleRow","meta","row","attributes","_","isNil","obj","column","Object","prototype","hasOwnProperty","call","columnToAttribute","attributeName","attribute","types","type","field","createField","val","fromDB","fromRow","Array","isArray","map","singleRow","toSingleRow","data","key","keys","columnName","toRow","datum","toColumnName","name","Error"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"where.d.ts","sourceRoot":"","sources":["../../../src/query/helpers/where.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"where.d.ts","sourceRoot":"","sources":["../../../src/query/helpers/where.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAUjC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAGpC,KAAK,QAAQ,GAAG,GAAG,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAgGhE;;GAEG;AACH,iBAAS,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC9F,iBAAS,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;AAmTlG,KAAK,KAAK,GACN;IACE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,GACD,KAAK,CAAC,KAAK,CAAC,CAAC;AAEjB,QAAA,MAAM,UAAU,GAAI,IAAI,IAAI,CAAC,YAAY,EAAE,OAAO,KAAK,KAAG,IAAI,CAAC,YAAY,GAAG,SAoC7E,CAAC;AAsBF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -6,6 +6,7 @@ var types = require('../../utils/types.js');
|
|
|
6
6
|
var index = require('../../fields/index.js');
|
|
7
7
|
var join = require('./join.js');
|
|
8
8
|
var transform = require('./transform.js');
|
|
9
|
+
var search = require('./search.js');
|
|
9
10
|
var knex = require('../../utils/knex.js');
|
|
10
11
|
|
|
11
12
|
const isRecord = (value)=>_.isPlainObject(value);
|
|
@@ -181,7 +182,7 @@ const applyOperator = (qb, column, operator, value)=>{
|
|
|
181
182
|
qb.whereNull(column);
|
|
182
183
|
break;
|
|
183
184
|
}
|
|
184
|
-
qb.whereRaw(`${fieldLowerFn(qb)}
|
|
185
|
+
qb.whereRaw(`${fieldLowerFn(qb)} = LOWER(?)`, [
|
|
185
186
|
column,
|
|
186
187
|
`${value}`
|
|
187
188
|
]);
|
|
@@ -202,7 +203,7 @@ const applyOperator = (qb, column, operator, value)=>{
|
|
|
202
203
|
qb.whereNotNull(column);
|
|
203
204
|
break;
|
|
204
205
|
}
|
|
205
|
-
qb.whereRaw(`${fieldLowerFn(qb)}
|
|
206
|
+
qb.whereRaw(`${fieldLowerFn(qb)} <> LOWER(?)`, [
|
|
206
207
|
column,
|
|
207
208
|
`${value}`
|
|
208
209
|
]);
|
|
@@ -253,53 +254,65 @@ const applyOperator = (qb, column, operator, value)=>{
|
|
|
253
254
|
}
|
|
254
255
|
case '$startsWith':
|
|
255
256
|
{
|
|
256
|
-
qb.
|
|
257
|
+
qb.whereRaw(`?? LIKE ?${likeEscapeClause(qb)}`, [
|
|
258
|
+
column,
|
|
259
|
+
`${escapeLike(value)}%`
|
|
260
|
+
]);
|
|
257
261
|
break;
|
|
258
262
|
}
|
|
259
263
|
case '$startsWithi':
|
|
260
264
|
{
|
|
261
|
-
qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)`, [
|
|
265
|
+
qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)${likeEscapeClause(qb)}`, [
|
|
262
266
|
column,
|
|
263
|
-
`${value}%`
|
|
267
|
+
`${escapeLike(value)}%`
|
|
264
268
|
]);
|
|
265
269
|
break;
|
|
266
270
|
}
|
|
267
271
|
case '$endsWith':
|
|
268
272
|
{
|
|
269
|
-
qb.
|
|
273
|
+
qb.whereRaw(`?? LIKE ?${likeEscapeClause(qb)}`, [
|
|
274
|
+
column,
|
|
275
|
+
`%${escapeLike(value)}`
|
|
276
|
+
]);
|
|
270
277
|
break;
|
|
271
278
|
}
|
|
272
279
|
case '$endsWithi':
|
|
273
280
|
{
|
|
274
|
-
qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)`, [
|
|
281
|
+
qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)${likeEscapeClause(qb)}`, [
|
|
275
282
|
column,
|
|
276
|
-
`%${value}`
|
|
283
|
+
`%${escapeLike(value)}`
|
|
277
284
|
]);
|
|
278
285
|
break;
|
|
279
286
|
}
|
|
280
287
|
case '$contains':
|
|
281
288
|
{
|
|
282
|
-
qb.
|
|
289
|
+
qb.whereRaw(`?? LIKE ?${likeEscapeClause(qb)}`, [
|
|
290
|
+
column,
|
|
291
|
+
`%${escapeLike(value)}%`
|
|
292
|
+
]);
|
|
283
293
|
break;
|
|
284
294
|
}
|
|
285
295
|
case '$notContains':
|
|
286
296
|
{
|
|
287
|
-
qb.
|
|
297
|
+
qb.whereRaw(`?? NOT LIKE ?${likeEscapeClause(qb)}`, [
|
|
298
|
+
column,
|
|
299
|
+
`%${escapeLike(value)}%`
|
|
300
|
+
]);
|
|
288
301
|
break;
|
|
289
302
|
}
|
|
290
303
|
case '$containsi':
|
|
291
304
|
{
|
|
292
|
-
qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)`, [
|
|
305
|
+
qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)${likeEscapeClause(qb)}`, [
|
|
293
306
|
column,
|
|
294
|
-
`%${value}%`
|
|
307
|
+
`%${escapeLike(value)}%`
|
|
295
308
|
]);
|
|
296
309
|
break;
|
|
297
310
|
}
|
|
298
311
|
case '$notContainsi':
|
|
299
312
|
{
|
|
300
|
-
qb.whereRaw(`${fieldLowerFn(qb)} NOT LIKE LOWER(?)`, [
|
|
313
|
+
qb.whereRaw(`${fieldLowerFn(qb)} NOT LIKE LOWER(?)${likeEscapeClause(qb)}`, [
|
|
301
314
|
column,
|
|
302
|
-
`%${value}%`
|
|
315
|
+
`%${escapeLike(value)}%`
|
|
303
316
|
]);
|
|
304
317
|
break;
|
|
305
318
|
}
|
|
@@ -366,6 +379,13 @@ const fieldLowerFn = (qb)=>{
|
|
|
366
379
|
}
|
|
367
380
|
return 'LOWER(??)';
|
|
368
381
|
};
|
|
382
|
+
// SQL LIKE wildcards (and the backslash escape character itself) that must be
|
|
383
|
+
// escaped so a user-supplied value is matched literally instead of as a pattern.
|
|
384
|
+
const LIKE_SPECIAL_CHARS = '%_\\';
|
|
385
|
+
const escapeLike = (value)=>search.escapeQuery(`${value}`, LIKE_SPECIAL_CHARS);
|
|
386
|
+
// SQLite has no default LIKE escape character and requires an explicit clause.
|
|
387
|
+
// PostgreSQL and MySQL both default to backslash, matching helpers/search.ts.
|
|
388
|
+
const likeEscapeClause = (qb)=>qb.client.dialect === 'sqlite3' ? " ESCAPE '\\'" : '';
|
|
369
389
|
|
|
370
390
|
exports.applyWhere = applyWhere;
|
|
371
391
|
exports.processWhere = processWhere;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"where.js","sources":["../../../src/query/helpers/where.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { isArray, castArray, isPlainObject } from 'lodash/fp';\nimport type { Knex } from 'knex';\n\nimport { isOperator, isOperatorOfType } from '@strapi/utils';\nimport * as types from '../../utils/types';\nimport { createField } from '../../fields';\nimport { createJoin } from './join';\nimport { toColumnName } from './transform';\nimport { isKnexQuery } from '../../utils/knex';\n\nimport type { Ctx } from '../types';\nimport type { Attribute } from '../../types';\n\ntype WhereCtx = Ctx & { alias?: string; isGroupRoot?: boolean };\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => isPlainObject(value);\n\nconst castValue = (value: unknown, attribute: Attribute | null) => {\n if (!attribute) {\n return value;\n }\n\n if (types.isScalar(attribute.type) && !isKnexQuery(value)) {\n const field = createField(attribute);\n\n return value === null ? null : field.toDB(value);\n }\n\n return value;\n};\n\nconst processSingleAttributeWhere = (\n attribute: Attribute | null,\n where: unknown,\n operator = '$eq'\n) => {\n if (!isRecord(where)) {\n if (isOperatorOfType('cast', operator)) {\n return castValue(where, attribute);\n }\n\n return where;\n }\n\n const filters: Record<string, unknown> = {};\n\n for (const key of Object.keys(where)) {\n const value = where[key];\n\n if (!isOperatorOfType('where', key)) {\n throw new Error(`Undefined attribute level operator ${key}`);\n }\n\n filters[key] = processAttributeWhere(attribute, value, key);\n }\n\n return filters;\n};\n\nconst processAttributeWhere = (attribute: Attribute | null, where: unknown, operator = '$eq') => {\n if (isArray(where)) {\n return where.map((sub) => processSingleAttributeWhere(attribute, sub, operator));\n }\n\n return processSingleAttributeWhere(attribute, where, operator);\n};\n\nconst processNested = (where: unknown, ctx: WhereCtx) => {\n if (!isRecord(where)) {\n return where;\n }\n\n return processWhere(where, ctx);\n};\n\nconst processRelationWhere = (where: unknown, ctx: WhereCtx) => {\n const { qb, alias } = ctx;\n\n const idAlias = qb.aliasColumn('id', alias);\n if (!isRecord(where)) {\n return { [idAlias]: where };\n }\n\n const keys = Object.keys(where);\n const operatorKeys = keys.filter((key) => isOperator(key));\n\n if (operatorKeys.length > 0 && operatorKeys.length !== keys.length) {\n throw new Error(`Operator and non-operator keys cannot be mixed in a relation where clause`);\n }\n\n if (operatorKeys.length > 1) {\n throw new Error(\n `Only one operator key is allowed in a relation where clause, but found: ${operatorKeys}`\n );\n }\n\n if (operatorKeys.length === 1) {\n const operator = operatorKeys[0];\n\n if (isOperatorOfType('group', operator)) {\n return processWhere(where, ctx);\n }\n\n return { [idAlias]: { [operator]: processNested(where[operator], ctx) } };\n }\n\n return processWhere(where, ctx);\n};\n\n/**\n * Process where parameter\n */\nfunction processWhere(where: Record<string, unknown>, ctx: WhereCtx): Record<string, unknown>;\nfunction processWhere(where: Record<string, unknown>[], ctx: WhereCtx): Record<string, unknown>[];\nfunction processWhere(\n where: Record<string, unknown> | Record<string, unknown>[],\n ctx: WhereCtx\n): Record<string, unknown> | Record<string, unknown>[] {\n if (!isArray(where) && !isRecord(where)) {\n throw new Error('Where must be an array or an object');\n }\n\n if (isArray(where)) {\n return where.map((sub) => processWhere(sub, ctx));\n }\n\n const { db, uid, qb, alias } = ctx;\n const meta = db.metadata.get(uid);\n\n const filters: Record<string, unknown> = {};\n\n // for each key in where\n for (const key of Object.keys(where)) {\n const value = where[key];\n\n // if operator $and $or -> process recursively\n if (isOperatorOfType('group', key)) {\n if (!Array.isArray(value)) {\n throw new Error(`Operator ${key} must be an array`);\n }\n\n filters[key] = value.map((sub) => processNested(sub, ctx));\n continue;\n }\n\n if (key === '$not') {\n filters[key] = processNested(value, ctx);\n continue;\n }\n\n if (isOperatorOfType('where', key)) {\n throw new Error(\n `Only $and, $or and $not can only be used as root level operators. Found ${key}.`\n );\n }\n\n const attribute = meta.attributes[key];\n\n if (!attribute) {\n filters[qb.aliasColumn(key, alias)] = processAttributeWhere(null, value);\n continue;\n }\n\n if (types.isRelation(attribute.type) && 'target' in attribute) {\n // attribute\n const subAlias = createJoin(ctx, {\n alias: alias || qb.alias,\n attributeName: key,\n attribute,\n });\n\n const nestedWhere = processRelationWhere(value, {\n db,\n qb,\n alias: subAlias,\n uid: attribute.target,\n });\n\n // TODO: use a better merge logic (push to $and when collisions)\n Object.assign(filters, nestedWhere);\n\n continue;\n }\n\n if (types.isScalar(attribute.type)) {\n const columnName = toColumnName(meta, key);\n const aliasedColumnName = qb.aliasColumn(columnName, alias);\n\n filters[aliasedColumnName] = processAttributeWhere(attribute, value);\n\n continue;\n }\n\n throw new Error(`You cannot filter on ${attribute.type} types`);\n }\n\n return filters;\n}\n\ntype Operator =\n | '$eq'\n | '$ne'\n | '$nei'\n | '$in'\n | '$notIn'\n | '$lt'\n | '$lte'\n | '$gt'\n | '$gte'\n | '$between'\n | '$contains'\n | '$notContains'\n | '$containsi'\n | '$notContainsi'\n | '$startsWith'\n | '$endsWith'\n | '$null'\n | '$notNull'\n | '$not'\n | '$eqi'\n | '$startsWithi'\n | '$endsWithi'\n | '$jsonSupersetOf';\n\n// TODO: add type casting per operator at some point\nconst applyOperator = (\n qb: Knex.QueryBuilder,\n column: any,\n operator: Operator,\n value: any\n): Knex.QueryBuilder | undefined => {\n if (Array.isArray(value) && !isOperatorOfType('array', operator)) {\n return qb.where((subQB) => {\n value.forEach((subValue) =>\n subQB.orWhere((innerQB) => {\n applyOperator(innerQB, column, operator, subValue);\n })\n );\n });\n }\n\n switch (operator) {\n case '$not': {\n qb.whereNot((qb) => applyWhereToColumn(qb, column, value));\n break;\n }\n\n case '$in': {\n // @ts-ignore\n // TODO: fix in v5\n qb.whereIn(column, isKnexQuery(value) ? value : castArray(value));\n break;\n }\n\n case '$notIn': {\n // @ts-ignore\n // TODO: fix in v5\n qb.whereNotIn(column, isKnexQuery(value) ? value : castArray(value));\n break;\n }\n\n case '$eq': {\n if (value === null) {\n qb.whereNull(column);\n break;\n }\n\n qb.where(column, value);\n break;\n }\n\n case '$eqi': {\n if (value === null) {\n qb.whereNull(column);\n break;\n }\n qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)`, [column, `${value}`]);\n break;\n }\n case '$ne': {\n if (value === null) {\n qb.whereNotNull(column);\n break;\n }\n\n qb.where(column, '<>', value);\n break;\n }\n case '$nei': {\n if (value === null) {\n qb.whereNotNull(column);\n break;\n }\n qb.whereRaw(`${fieldLowerFn(qb)} NOT LIKE LOWER(?)`, [column, `${value}`]);\n break;\n }\n case '$gt': {\n qb.where(column, '>', value);\n break;\n }\n case '$gte': {\n qb.where(column, '>=', value);\n break;\n }\n case '$lt': {\n qb.where(column, '<', value);\n break;\n }\n case '$lte': {\n qb.where(column, '<=', value);\n break;\n }\n case '$null': {\n if (value) {\n qb.whereNull(column);\n } else {\n qb.whereNotNull(column);\n }\n break;\n }\n case '$notNull': {\n if (value) {\n qb.whereNotNull(column);\n } else {\n qb.whereNull(column);\n }\n break;\n }\n case '$between': {\n qb.whereBetween(column, value);\n break;\n }\n case '$startsWith': {\n qb.where(column, 'like', `${value}%`);\n break;\n }\n case '$startsWithi': {\n qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)`, [column, `${value}%`]);\n break;\n }\n case '$endsWith': {\n qb.where(column, 'like', `%${value}`);\n break;\n }\n case '$endsWithi': {\n qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)`, [column, `%${value}`]);\n break;\n }\n case '$contains': {\n qb.where(column, 'like', `%${value}%`);\n break;\n }\n\n case '$notContains': {\n qb.whereNot(column, 'like', `%${value}%`);\n break;\n }\n\n case '$containsi': {\n qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)`, [column, `%${value}%`]);\n break;\n }\n\n case '$notContainsi': {\n qb.whereRaw(`${fieldLowerFn(qb)} NOT LIKE LOWER(?)`, [column, `%${value}%`]);\n break;\n }\n\n // Experimental, only for internal use\n // Only on MySQL, PostgreSQL and CockroachDB.\n // https://knexjs.org/guide/query-builder.html#wherejsonsupersetof\n case '$jsonSupersetOf': {\n qb.whereJsonSupersetOf(column, value);\n break;\n }\n\n // TODO: Add more JSON operators: whereJsonObject, whereJsonPath, whereJsonSubsetOf\n\n // TODO: relational operators every/some/exists/size ...\n\n default: {\n throw new Error(`Undefined attribute level operator ${operator}`);\n }\n }\n};\n\nconst applyWhereToColumn = (\n qb: Knex.QueryBuilder,\n column: string,\n columnWhere: Record<Operator, unknown> | Array<Record<Operator, unknown>>\n) => {\n if (!isRecord(columnWhere)) {\n if (Array.isArray(columnWhere)) {\n return qb.whereIn(column, columnWhere);\n }\n\n return qb.where(column, columnWhere);\n }\n\n const keys = Object.keys(columnWhere) as Operator[];\n\n keys.forEach((operator) => {\n const value = columnWhere[operator];\n\n applyOperator(qb, column, operator, value);\n });\n};\n\ntype Where =\n | {\n $and?: Where[];\n $or?: Where[];\n $not?: Where;\n [key: string]: any;\n }\n | Array<Where>;\n\nconst applyWhere = (qb: Knex.QueryBuilder, where: Where): Knex.QueryBuilder | undefined => {\n if (!isArray(where) && !isRecord(where)) {\n throw new Error('Where must be an array or an object');\n }\n\n if (isArray(where)) {\n return qb.where((subQB: Knex.QueryBuilder) =>\n where.forEach((subWhere) => applyWhere(subQB, subWhere))\n );\n }\n\n Object.keys(where).forEach((key) => {\n if (key === '$and') {\n const value = where[key] ?? [];\n\n return qb.where((subQB: Knex.QueryBuilder) => {\n value.forEach((v) => applyWhere(subQB, v));\n });\n }\n\n if (key === '$or') {\n const value = where[key] ?? [];\n\n return qb.where((subQB: Knex.QueryBuilder) => {\n value.forEach((v) => subQB.orWhere((inner) => applyWhere(inner, v)));\n });\n }\n\n if (key === '$not') {\n const value = where[key] ?? {};\n\n return qb.whereNot((qb) => applyWhere(qb, value));\n }\n\n applyWhereToColumn(qb, key, where[key]);\n });\n};\n\nconst fieldLowerFn = (qb: Knex.QueryBuilder) => {\n // Postgres requires string to be passed\n if (qb.client.dialect === 'postgresql') {\n return 'LOWER(CAST(?? AS VARCHAR))';\n }\n\n return 'LOWER(??)';\n};\n\nexport { applyWhere, processWhere };\n"],"names":["isRecord","value","isPlainObject","castValue","attribute","types","type","isKnexQuery","field","createField","toDB","processSingleAttributeWhere","where","operator","isOperatorOfType","filters","key","Object","keys","Error","processAttributeWhere","isArray","map","sub","processNested","ctx","processWhere","processRelationWhere","qb","alias","idAlias","aliasColumn","operatorKeys","filter","isOperator","length","db","uid","meta","metadata","get","Array","attributes","subAlias","createJoin","attributeName","nestedWhere","target","assign","columnName","toColumnName","aliasedColumnName","applyOperator","column","subQB","forEach","subValue","orWhere","innerQB","whereNot","applyWhereToColumn","whereIn","castArray","whereNotIn","whereNull","whereRaw","fieldLowerFn","whereNotNull","whereBetween","whereJsonSupersetOf","columnWhere","applyWhere","subWhere","v","inner","client","dialect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"where.js","sources":["../../../src/query/helpers/where.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { isArray, castArray, isPlainObject } from 'lodash/fp';\nimport type { Knex } from 'knex';\n\nimport { isOperator, isOperatorOfType } from '@strapi/utils';\nimport * as types from '../../utils/types';\nimport { createField } from '../../fields';\nimport { createJoin } from './join';\nimport { toColumnName } from './transform';\nimport { escapeQuery } from './search';\nimport { isKnexQuery } from '../../utils/knex';\n\nimport type { Ctx } from '../types';\nimport type { Attribute } from '../../types';\n\ntype WhereCtx = Ctx & { alias?: string; isGroupRoot?: boolean };\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => isPlainObject(value);\n\nconst castValue = (value: unknown, attribute: Attribute | null) => {\n if (!attribute) {\n return value;\n }\n\n if (types.isScalar(attribute.type) && !isKnexQuery(value)) {\n const field = createField(attribute);\n\n return value === null ? null : field.toDB(value);\n }\n\n return value;\n};\n\nconst processSingleAttributeWhere = (\n attribute: Attribute | null,\n where: unknown,\n operator = '$eq'\n) => {\n if (!isRecord(where)) {\n if (isOperatorOfType('cast', operator)) {\n return castValue(where, attribute);\n }\n\n return where;\n }\n\n const filters: Record<string, unknown> = {};\n\n for (const key of Object.keys(where)) {\n const value = where[key];\n\n if (!isOperatorOfType('where', key)) {\n throw new Error(`Undefined attribute level operator ${key}`);\n }\n\n filters[key] = processAttributeWhere(attribute, value, key);\n }\n\n return filters;\n};\n\nconst processAttributeWhere = (attribute: Attribute | null, where: unknown, operator = '$eq') => {\n if (isArray(where)) {\n return where.map((sub) => processSingleAttributeWhere(attribute, sub, operator));\n }\n\n return processSingleAttributeWhere(attribute, where, operator);\n};\n\nconst processNested = (where: unknown, ctx: WhereCtx) => {\n if (!isRecord(where)) {\n return where;\n }\n\n return processWhere(where, ctx);\n};\n\nconst processRelationWhere = (where: unknown, ctx: WhereCtx) => {\n const { qb, alias } = ctx;\n\n const idAlias = qb.aliasColumn('id', alias);\n if (!isRecord(where)) {\n return { [idAlias]: where };\n }\n\n const keys = Object.keys(where);\n const operatorKeys = keys.filter((key) => isOperator(key));\n\n if (operatorKeys.length > 0 && operatorKeys.length !== keys.length) {\n throw new Error(`Operator and non-operator keys cannot be mixed in a relation where clause`);\n }\n\n if (operatorKeys.length > 1) {\n throw new Error(\n `Only one operator key is allowed in a relation where clause, but found: ${operatorKeys}`\n );\n }\n\n if (operatorKeys.length === 1) {\n const operator = operatorKeys[0];\n\n if (isOperatorOfType('group', operator)) {\n return processWhere(where, ctx);\n }\n\n return { [idAlias]: { [operator]: processNested(where[operator], ctx) } };\n }\n\n return processWhere(where, ctx);\n};\n\n/**\n * Process where parameter\n */\nfunction processWhere(where: Record<string, unknown>, ctx: WhereCtx): Record<string, unknown>;\nfunction processWhere(where: Record<string, unknown>[], ctx: WhereCtx): Record<string, unknown>[];\nfunction processWhere(\n where: Record<string, unknown> | Record<string, unknown>[],\n ctx: WhereCtx\n): Record<string, unknown> | Record<string, unknown>[] {\n if (!isArray(where) && !isRecord(where)) {\n throw new Error('Where must be an array or an object');\n }\n\n if (isArray(where)) {\n return where.map((sub) => processWhere(sub, ctx));\n }\n\n const { db, uid, qb, alias } = ctx;\n const meta = db.metadata.get(uid);\n\n const filters: Record<string, unknown> = {};\n\n // for each key in where\n for (const key of Object.keys(where)) {\n const value = where[key];\n\n // if operator $and $or -> process recursively\n if (isOperatorOfType('group', key)) {\n if (!Array.isArray(value)) {\n throw new Error(`Operator ${key} must be an array`);\n }\n\n filters[key] = value.map((sub) => processNested(sub, ctx));\n continue;\n }\n\n if (key === '$not') {\n filters[key] = processNested(value, ctx);\n continue;\n }\n\n if (isOperatorOfType('where', key)) {\n throw new Error(\n `Only $and, $or and $not can only be used as root level operators. Found ${key}.`\n );\n }\n\n const attribute = meta.attributes[key];\n\n if (!attribute) {\n filters[qb.aliasColumn(key, alias)] = processAttributeWhere(null, value);\n continue;\n }\n\n if (types.isRelation(attribute.type) && 'target' in attribute) {\n // attribute\n const subAlias = createJoin(ctx, {\n alias: alias || qb.alias,\n attributeName: key,\n attribute,\n });\n\n const nestedWhere = processRelationWhere(value, {\n db,\n qb,\n alias: subAlias,\n uid: attribute.target,\n });\n\n // TODO: use a better merge logic (push to $and when collisions)\n Object.assign(filters, nestedWhere);\n\n continue;\n }\n\n if (types.isScalar(attribute.type)) {\n const columnName = toColumnName(meta, key);\n const aliasedColumnName = qb.aliasColumn(columnName, alias);\n\n filters[aliasedColumnName] = processAttributeWhere(attribute, value);\n\n continue;\n }\n\n throw new Error(`You cannot filter on ${attribute.type} types`);\n }\n\n return filters;\n}\n\ntype Operator =\n | '$eq'\n | '$ne'\n | '$nei'\n | '$in'\n | '$notIn'\n | '$lt'\n | '$lte'\n | '$gt'\n | '$gte'\n | '$between'\n | '$contains'\n | '$notContains'\n | '$containsi'\n | '$notContainsi'\n | '$startsWith'\n | '$endsWith'\n | '$null'\n | '$notNull'\n | '$not'\n | '$eqi'\n | '$startsWithi'\n | '$endsWithi'\n | '$jsonSupersetOf';\n\n// TODO: add type casting per operator at some point\nconst applyOperator = (\n qb: Knex.QueryBuilder,\n column: any,\n operator: Operator,\n value: any\n): Knex.QueryBuilder | undefined => {\n if (Array.isArray(value) && !isOperatorOfType('array', operator)) {\n return qb.where((subQB) => {\n value.forEach((subValue) =>\n subQB.orWhere((innerQB) => {\n applyOperator(innerQB, column, operator, subValue);\n })\n );\n });\n }\n\n switch (operator) {\n case '$not': {\n qb.whereNot((qb) => applyWhereToColumn(qb, column, value));\n break;\n }\n\n case '$in': {\n // @ts-ignore\n // TODO: fix in v5\n qb.whereIn(column, isKnexQuery(value) ? value : castArray(value));\n break;\n }\n\n case '$notIn': {\n // @ts-ignore\n // TODO: fix in v5\n qb.whereNotIn(column, isKnexQuery(value) ? value : castArray(value));\n break;\n }\n\n case '$eq': {\n if (value === null) {\n qb.whereNull(column);\n break;\n }\n\n qb.where(column, value);\n break;\n }\n\n case '$eqi': {\n if (value === null) {\n qb.whereNull(column);\n break;\n }\n qb.whereRaw(`${fieldLowerFn(qb)} = LOWER(?)`, [column, `${value}`]);\n break;\n }\n case '$ne': {\n if (value === null) {\n qb.whereNotNull(column);\n break;\n }\n\n qb.where(column, '<>', value);\n break;\n }\n case '$nei': {\n if (value === null) {\n qb.whereNotNull(column);\n break;\n }\n qb.whereRaw(`${fieldLowerFn(qb)} <> LOWER(?)`, [column, `${value}`]);\n break;\n }\n case '$gt': {\n qb.where(column, '>', value);\n break;\n }\n case '$gte': {\n qb.where(column, '>=', value);\n break;\n }\n case '$lt': {\n qb.where(column, '<', value);\n break;\n }\n case '$lte': {\n qb.where(column, '<=', value);\n break;\n }\n case '$null': {\n if (value) {\n qb.whereNull(column);\n } else {\n qb.whereNotNull(column);\n }\n break;\n }\n case '$notNull': {\n if (value) {\n qb.whereNotNull(column);\n } else {\n qb.whereNull(column);\n }\n break;\n }\n case '$between': {\n qb.whereBetween(column, value);\n break;\n }\n case '$startsWith': {\n qb.whereRaw(`?? LIKE ?${likeEscapeClause(qb)}`, [column, `${escapeLike(value)}%`]);\n break;\n }\n case '$startsWithi': {\n qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)${likeEscapeClause(qb)}`, [\n column,\n `${escapeLike(value)}%`,\n ]);\n break;\n }\n case '$endsWith': {\n qb.whereRaw(`?? LIKE ?${likeEscapeClause(qb)}`, [column, `%${escapeLike(value)}`]);\n break;\n }\n case '$endsWithi': {\n qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)${likeEscapeClause(qb)}`, [\n column,\n `%${escapeLike(value)}`,\n ]);\n break;\n }\n case '$contains': {\n qb.whereRaw(`?? LIKE ?${likeEscapeClause(qb)}`, [column, `%${escapeLike(value)}%`]);\n break;\n }\n\n case '$notContains': {\n qb.whereRaw(`?? NOT LIKE ?${likeEscapeClause(qb)}`, [column, `%${escapeLike(value)}%`]);\n break;\n }\n\n case '$containsi': {\n qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)${likeEscapeClause(qb)}`, [\n column,\n `%${escapeLike(value)}%`,\n ]);\n break;\n }\n\n case '$notContainsi': {\n qb.whereRaw(`${fieldLowerFn(qb)} NOT LIKE LOWER(?)${likeEscapeClause(qb)}`, [\n column,\n `%${escapeLike(value)}%`,\n ]);\n break;\n }\n\n // Experimental, only for internal use\n // Only on MySQL, PostgreSQL and CockroachDB.\n // https://knexjs.org/guide/query-builder.html#wherejsonsupersetof\n case '$jsonSupersetOf': {\n qb.whereJsonSupersetOf(column, value);\n break;\n }\n\n // TODO: Add more JSON operators: whereJsonObject, whereJsonPath, whereJsonSubsetOf\n\n // TODO: relational operators every/some/exists/size ...\n\n default: {\n throw new Error(`Undefined attribute level operator ${operator}`);\n }\n }\n};\n\nconst applyWhereToColumn = (\n qb: Knex.QueryBuilder,\n column: string,\n columnWhere: Record<Operator, unknown> | Array<Record<Operator, unknown>>\n) => {\n if (!isRecord(columnWhere)) {\n if (Array.isArray(columnWhere)) {\n return qb.whereIn(column, columnWhere);\n }\n\n return qb.where(column, columnWhere);\n }\n\n const keys = Object.keys(columnWhere) as Operator[];\n\n keys.forEach((operator) => {\n const value = columnWhere[operator];\n\n applyOperator(qb, column, operator, value);\n });\n};\n\ntype Where =\n | {\n $and?: Where[];\n $or?: Where[];\n $not?: Where;\n [key: string]: any;\n }\n | Array<Where>;\n\nconst applyWhere = (qb: Knex.QueryBuilder, where: Where): Knex.QueryBuilder | undefined => {\n if (!isArray(where) && !isRecord(where)) {\n throw new Error('Where must be an array or an object');\n }\n\n if (isArray(where)) {\n return qb.where((subQB: Knex.QueryBuilder) =>\n where.forEach((subWhere) => applyWhere(subQB, subWhere))\n );\n }\n\n Object.keys(where).forEach((key) => {\n if (key === '$and') {\n const value = where[key] ?? [];\n\n return qb.where((subQB: Knex.QueryBuilder) => {\n value.forEach((v) => applyWhere(subQB, v));\n });\n }\n\n if (key === '$or') {\n const value = where[key] ?? [];\n\n return qb.where((subQB: Knex.QueryBuilder) => {\n value.forEach((v) => subQB.orWhere((inner) => applyWhere(inner, v)));\n });\n }\n\n if (key === '$not') {\n const value = where[key] ?? {};\n\n return qb.whereNot((qb) => applyWhere(qb, value));\n }\n\n applyWhereToColumn(qb, key, where[key]);\n });\n};\n\nconst fieldLowerFn = (qb: Knex.QueryBuilder) => {\n // Postgres requires string to be passed\n if (qb.client.dialect === 'postgresql') {\n return 'LOWER(CAST(?? AS VARCHAR))';\n }\n\n return 'LOWER(??)';\n};\n\n// SQL LIKE wildcards (and the backslash escape character itself) that must be\n// escaped so a user-supplied value is matched literally instead of as a pattern.\nconst LIKE_SPECIAL_CHARS = '%_\\\\';\n\nconst escapeLike = (value: unknown) => escapeQuery(`${value}`, LIKE_SPECIAL_CHARS);\n\n// SQLite has no default LIKE escape character and requires an explicit clause.\n// PostgreSQL and MySQL both default to backslash, matching helpers/search.ts.\nconst likeEscapeClause = (qb: Knex.QueryBuilder) =>\n qb.client.dialect === 'sqlite3' ? \" ESCAPE '\\\\'\" : '';\n\nexport { applyWhere, processWhere };\n"],"names":["isRecord","value","isPlainObject","castValue","attribute","types","type","isKnexQuery","field","createField","toDB","processSingleAttributeWhere","where","operator","isOperatorOfType","filters","key","Object","keys","Error","processAttributeWhere","isArray","map","sub","processNested","ctx","processWhere","processRelationWhere","qb","alias","idAlias","aliasColumn","operatorKeys","filter","isOperator","length","db","uid","meta","metadata","get","Array","attributes","subAlias","createJoin","attributeName","nestedWhere","target","assign","columnName","toColumnName","aliasedColumnName","applyOperator","column","subQB","forEach","subValue","orWhere","innerQB","whereNot","applyWhereToColumn","whereIn","castArray","whereNotIn","whereNull","whereRaw","fieldLowerFn","whereNotNull","whereBetween","likeEscapeClause","escapeLike","whereJsonSupersetOf","columnWhere","applyWhere","subWhere","v","inner","client","dialect","LIKE_SPECIAL_CHARS","escapeQuery"],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { isRelation, isScalar } from '../../utils/types.mjs';
|
|
|
4
4
|
import { createField } from '../../fields/index.mjs';
|
|
5
5
|
import { createJoin } from './join.mjs';
|
|
6
6
|
import { toColumnName } from './transform.mjs';
|
|
7
|
+
import { escapeQuery } from './search.mjs';
|
|
7
8
|
import { isKnexQuery } from '../../utils/knex.mjs';
|
|
8
9
|
|
|
9
10
|
const isRecord = (value)=>isPlainObject(value);
|
|
@@ -179,7 +180,7 @@ const applyOperator = (qb, column, operator, value)=>{
|
|
|
179
180
|
qb.whereNull(column);
|
|
180
181
|
break;
|
|
181
182
|
}
|
|
182
|
-
qb.whereRaw(`${fieldLowerFn(qb)}
|
|
183
|
+
qb.whereRaw(`${fieldLowerFn(qb)} = LOWER(?)`, [
|
|
183
184
|
column,
|
|
184
185
|
`${value}`
|
|
185
186
|
]);
|
|
@@ -200,7 +201,7 @@ const applyOperator = (qb, column, operator, value)=>{
|
|
|
200
201
|
qb.whereNotNull(column);
|
|
201
202
|
break;
|
|
202
203
|
}
|
|
203
|
-
qb.whereRaw(`${fieldLowerFn(qb)}
|
|
204
|
+
qb.whereRaw(`${fieldLowerFn(qb)} <> LOWER(?)`, [
|
|
204
205
|
column,
|
|
205
206
|
`${value}`
|
|
206
207
|
]);
|
|
@@ -251,53 +252,65 @@ const applyOperator = (qb, column, operator, value)=>{
|
|
|
251
252
|
}
|
|
252
253
|
case '$startsWith':
|
|
253
254
|
{
|
|
254
|
-
qb.
|
|
255
|
+
qb.whereRaw(`?? LIKE ?${likeEscapeClause(qb)}`, [
|
|
256
|
+
column,
|
|
257
|
+
`${escapeLike(value)}%`
|
|
258
|
+
]);
|
|
255
259
|
break;
|
|
256
260
|
}
|
|
257
261
|
case '$startsWithi':
|
|
258
262
|
{
|
|
259
|
-
qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)`, [
|
|
263
|
+
qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)${likeEscapeClause(qb)}`, [
|
|
260
264
|
column,
|
|
261
|
-
`${value}%`
|
|
265
|
+
`${escapeLike(value)}%`
|
|
262
266
|
]);
|
|
263
267
|
break;
|
|
264
268
|
}
|
|
265
269
|
case '$endsWith':
|
|
266
270
|
{
|
|
267
|
-
qb.
|
|
271
|
+
qb.whereRaw(`?? LIKE ?${likeEscapeClause(qb)}`, [
|
|
272
|
+
column,
|
|
273
|
+
`%${escapeLike(value)}`
|
|
274
|
+
]);
|
|
268
275
|
break;
|
|
269
276
|
}
|
|
270
277
|
case '$endsWithi':
|
|
271
278
|
{
|
|
272
|
-
qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)`, [
|
|
279
|
+
qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)${likeEscapeClause(qb)}`, [
|
|
273
280
|
column,
|
|
274
|
-
`%${value}`
|
|
281
|
+
`%${escapeLike(value)}`
|
|
275
282
|
]);
|
|
276
283
|
break;
|
|
277
284
|
}
|
|
278
285
|
case '$contains':
|
|
279
286
|
{
|
|
280
|
-
qb.
|
|
287
|
+
qb.whereRaw(`?? LIKE ?${likeEscapeClause(qb)}`, [
|
|
288
|
+
column,
|
|
289
|
+
`%${escapeLike(value)}%`
|
|
290
|
+
]);
|
|
281
291
|
break;
|
|
282
292
|
}
|
|
283
293
|
case '$notContains':
|
|
284
294
|
{
|
|
285
|
-
qb.
|
|
295
|
+
qb.whereRaw(`?? NOT LIKE ?${likeEscapeClause(qb)}`, [
|
|
296
|
+
column,
|
|
297
|
+
`%${escapeLike(value)}%`
|
|
298
|
+
]);
|
|
286
299
|
break;
|
|
287
300
|
}
|
|
288
301
|
case '$containsi':
|
|
289
302
|
{
|
|
290
|
-
qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)`, [
|
|
303
|
+
qb.whereRaw(`${fieldLowerFn(qb)} LIKE LOWER(?)${likeEscapeClause(qb)}`, [
|
|
291
304
|
column,
|
|
292
|
-
`%${value}%`
|
|
305
|
+
`%${escapeLike(value)}%`
|
|
293
306
|
]);
|
|
294
307
|
break;
|
|
295
308
|
}
|
|
296
309
|
case '$notContainsi':
|
|
297
310
|
{
|
|
298
|
-
qb.whereRaw(`${fieldLowerFn(qb)} NOT LIKE LOWER(?)`, [
|
|
311
|
+
qb.whereRaw(`${fieldLowerFn(qb)} NOT LIKE LOWER(?)${likeEscapeClause(qb)}`, [
|
|
299
312
|
column,
|
|
300
|
-
`%${value}%`
|
|
313
|
+
`%${escapeLike(value)}%`
|
|
301
314
|
]);
|
|
302
315
|
break;
|
|
303
316
|
}
|
|
@@ -364,6 +377,13 @@ const fieldLowerFn = (qb)=>{
|
|
|
364
377
|
}
|
|
365
378
|
return 'LOWER(??)';
|
|
366
379
|
};
|
|
380
|
+
// SQL LIKE wildcards (and the backslash escape character itself) that must be
|
|
381
|
+
// escaped so a user-supplied value is matched literally instead of as a pattern.
|
|
382
|
+
const LIKE_SPECIAL_CHARS = '%_\\';
|
|
383
|
+
const escapeLike = (value)=>escapeQuery(`${value}`, LIKE_SPECIAL_CHARS);
|
|
384
|
+
// SQLite has no default LIKE escape character and requires an explicit clause.
|
|
385
|
+
// PostgreSQL and MySQL both default to backslash, matching helpers/search.ts.
|
|
386
|
+
const likeEscapeClause = (qb)=>qb.client.dialect === 'sqlite3' ? " ESCAPE '\\'" : '';
|
|
367
387
|
|
|
368
388
|
export { applyWhere, processWhere };
|
|
369
389
|
//# sourceMappingURL=where.mjs.map
|