From 304a1aacd7a4808804d6a16204ea83e72eee669e Mon Sep 17 00:00:00 2001 From: Marshall Thompson Date: Thu, 13 Aug 2026 19:42:56 -0600 Subject: [PATCH 1/2] fix(adapter-commons): validate query operators nested in arrays (#3700) * fix(adapter-commons): validate query operators nested in arrays validateQueryProperty skipped array values because isPlainObject excludes arrays. That let unknown $ operators through when wrapped in an extra array level, e.g. $or: [[{ $where: '1==1' }]]. Recurse into arrays so the operator allow-list applies at every level. * fix: validate filter values and tighten ObjectIdSchema filterQuery left $select, $or, $and, and $sort object values unvalidated, so unknown $ operators could ride through those filters. ObjectIdSchema accepted any object, which let operator documents pass querySyntax on generated MongoDB services. Validate those filter values with validateQueryProperty. The objectid keyword now accepts ObjectId instances and rejects other objects, and ObjectIdSchema uses that for its object branch. * fix(schema): allow $exists on queryProperty after ObjectIdSchema tighten Tightening ObjectIdSchema dropped { _id: { $exists: true } }, which only passed because the old any-object branch treated the operator document as an id. Add $exists as a boolean operator on queryProperty so it is allowed on every querySyntax field, including ObjectIds. * fix(schema): allow null in $ne, $in, and $nin query operators { userId: { $ne: null } } is the usual Mongo and SQL "field is set" query. After tightening ObjectIdSchema it only passed when the field type already included null. Accept null on $ne/$in/$nin in queryProperty so ObjectId, number, and string fields all allow it. * docs: show querySyntax extensions for adapter-specific queries The default syntax already covers $ne/$in/$nin null and $exists. Document how to add $like/$regex/array operators, how to allow { userId: null } on ObjectId query fields, and how $meta/$slice map to service operators rather than querySyntax. * fix: allow null equality, projection ops, and Mongo $regex { userId: null } is a real IS NULL query; accept null on the queryProperty equality branch the same way as $ne/$in/$nin. Allow $meta/$slice/$elemMatch inside object $select and $sort (not as field operators). Add more with projectionOperators. @feathersjs/mongodb defaults operators to include $regex and $options. Generated Mongo query schemas do the same on the primary string field. * revert: drop new query syntax obligations Keep the allow-list tightenings. Remove $exists, implicit null equality, default Mongo $regex, and projectionOperators so those stay app-level extensions via querySyntax or operators, not new supported syntax. * test: cover typical querySyntax and operators extensions Assert $regex/$options, $like, $exists, $meta, and nullable ObjectId fields still work when the app opts in, and that unlisted operators such as $where stay rejected. * fix: reject spoofed ObjectId JSON and correct querySyntax example isObjectId now requires instanceof ObjectId, or _bsontype plus a non-Object constructor and toHexString, so `{ _bsontype: 'ObjectId' }` does not pass ObjectIdSchema. Attach $regex/$options to text in the TypeBox Pick example. * test(mongodb): isolate validated $regex find from service create CI failed because people.create() returned no _id after earlier aggregation tests mutated the shared service. Insert the fixture through the collection so the test only covers validateQuery + $regex. --- docs/api/databases/knex.md | 10 +- docs/api/databases/mongodb.md | 19 +- docs/api/schema/schema.md | 6 +- docs/api/schema/typebox.md | 24 ++- docs/api/schema/validators.md | 2 +- docs/guides/cli/service.schemas.md | 2 +- packages/adapter-commons/src/query.ts | 27 +-- packages/adapter-commons/test/query.test.ts | 199 ++++++++++++++++++ packages/adapter-commons/test/service.test.ts | 10 + packages/mongodb/src/converters.ts | 29 ++- packages/mongodb/test/converters.test.ts | 33 +++ packages/mongodb/test/index.test.ts | 22 +- packages/schema/src/json-schema.ts | 2 +- packages/schema/test/json-schema.test.ts | 72 +++++++ packages/typebox/src/index.ts | 2 +- packages/typebox/test/index.test.ts | 69 ++++++ 16 files changed, 473 insertions(+), 55 deletions(-) diff --git a/docs/api/databases/knex.md b/docs/api/databases/knex.md index fc57770c75..510695538b 100644 --- a/docs/api/databases/knex.md +++ b/docs/api/databases/knex.md @@ -113,19 +113,21 @@ In addition to the [common querying mechanism](./querying.md), this adapter also ```ts const messageQuerySchema = Type.Intersect( [ - // This will additionally allow querying for `{ name: { $ilike: 'Dav%' } }` querySyntax(messageQueryProperties, { name: { - $ilike: Type.String() + $like: Type.String(), + $notlike: Type.String(), + $ilike: Type.String() // PostgreSQL } }), - // Add additional query properties here - Type.Object({}) + Type.Object({}, { additionalProperties: false }) ], { additionalProperties: false } ) ``` +More extension examples are in [querySyntax](../schema/typebox.md#querysyntax). `{ age: null }` and `{ age: { $ne: null } }` work when the query property type includes `null` (see the `age` field in the adapter tests). + ### $like Find all records where the value matches the given string pattern. The following query retrieves all messages that start with `Hello`: diff --git a/docs/api/databases/mongodb.md b/docs/api/databases/mongodb.md index 785a77b05f..fc868299de 100644 --- a/docs/api/databases/mongodb.md +++ b/docs/api/databases/mongodb.md @@ -215,13 +215,13 @@ new MongoDBService({
-Note that in a normal application all MongoDB specific operators have to explicitly be added to the [TypeBox query schema](../schema/typebox.md#query-schemas) or [JSON query schema](../schema/schema.md#querysyntax). +Note that in a normal application all MongoDB specific operators have to explicitly be added to the [TypeBox query schema](../schema/typebox.md#querysyntax) or [JSON query schema](../schema/schema.md#querysyntax).
There are two ways to perform search queries with MongoDB: -- Perform basic Regular Expression matches using the `$regex` filter. +- Perform basic Regular Expression matches using the `$regex` operator. - Perform full-text search using the `$search` filter. ### Basic Regex Search @@ -234,6 +234,19 @@ You can perform basic search using regular expressions with the `$regex` operato } ``` +Allow those operators on the properties that need them: + +```ts +querySyntax(messageQueryProperties, { + text: { + $regex: Type.String(), + $options: Type.String() + } +}) +``` + +If you also use [`validateQuery(schema, { skipSanitize: false })`](../schema/validators.md#keeping-adapter-sanitization), list them on the service as well: `operators: ['$regex', '$options']`. + ### Full-Text Search See the MongoDB documentation for instructions on performing full-text search using the `$search` operator: @@ -456,7 +469,7 @@ validator.addKeyword(keywordObjectId) ### ObjectIdSchema -Both, `@feathersjs/typebox` and `@feathersjs/schema` export an `ObjectIdSchema` helper that creates a schema which can be both, a MongoDB ObjectId or a string that will be converted with the `objectid` keyword: +Both, `@feathersjs/typebox` and `@feathersjs/schema` export an `ObjectIdSchema` helper that creates a schema which can be a MongoDB ObjectId instance or a string that will be converted with the `objectid` keyword. Arbitrary objects — including query operator documents like `{ $ne: null }` or `{ $where: '…' }` — are not valid ObjectIds. ```ts import { ObjectIdSchema } from '@feathersjs/typebox' // or '@feathersjs/schema' diff --git a/docs/api/schema/schema.md b/docs/api/schema/schema.md index f0615acfb2..65d2ae8801 100644 --- a/docs/api/schema/schema.md +++ b/docs/api/schema/schema.md @@ -171,7 +171,7 @@ const userQuery: UserQuery = { } ``` -Additional special query properties [that are not already included in the query syntax](../databases/querying.md) like `$ilike` can be added like this: +Additional operators that are [not already in the common query syntax](../databases/querying.md) (`$like`, `$regex`, …) are added per property. Only add operators your adapter supports. See [TypeBox querySyntax](./typebox.md#querysyntax) for more examples. ```ts import { querySyntax } from '@feathersjs/schema' @@ -184,9 +184,7 @@ export const userQuerySchema = { properties: { ...querySyntax(userSchema.properties, { email: { - $ilike: { - type: 'string' - } + $ilike: { type: 'string' } } } as const) } diff --git a/docs/api/schema/typebox.md b/docs/api/schema/typebox.md index 0bc80386ee..be2daf3ab4 100644 --- a/docs/api/schema/typebox.md +++ b/docs/api/schema/typebox.md @@ -101,30 +101,38 @@ const messageQuerySchema = querySyntax(messageQueryProperties) type MessageQuery = Static ``` -Additional special query properties [that are not already included in the query syntax](../databases/querying.md) like `$ilike` can be added like this: +Additional operators that are [not already in the common query syntax](../databases/querying.md) must be added per property. Only add operators your adapter actually supports. ```ts -import { querySyntax } from '@feathersjs/typebox' +import { querySyntax, Type } from '@feathersjs/typebox' -// Schema for allowed query properties const messageQueryProperties = Type.Pick(messageSchema, ['id', 'text', 'createdAt', 'userId'], { additionalProperties: false }) + const messageQuerySchema = Type.Intersect( [ - // This will additionally allow querying for `{ name: { $ilike: 'Dav%' } }` querySyntax(messageQueryProperties, { - name: { - $ilike: Type.String() + text: { + $like: Type.String(), + $notlike: Type.String(), + $ilike: Type.String(), // PostgreSQL + $regex: Type.String(), + $options: Type.String() } }), - // Add additional query properties here - Type.Object({}) + Type.Object({}, { additionalProperties: false }) ], { additionalProperties: false } ) ``` +That allows `{ text: { $like: 'Hello%' } }` and `{ text: { $regex: 'feathers', $options: 'i' } }`. + +`$ne: null` and `{ userId: null }` are allowed when the **query** property type includes `null` (for example `Type.Union([Type.Number(), Type.Null()])` or `Type.Union([ObjectIdSchema(), Type.Null()])`). That is a field type, not a new operator. Do not change the create/patch data schema unless you also want to store nulls. + +Mongo `$meta` / `$slice` in object `$select` or `$sort` are not part of the common syntax. On the adapter sanitizer path, list them on the existing service `operators` option if you need them. `querySyntax` `$select` remains a string array. + To allow additional query properties outside of the query syntax use the intersection type: ```ts diff --git a/docs/api/schema/validators.md b/docs/api/schema/validators.md index 686f1b1999..58d17266c1 100644 --- a/docs/api/schema/validators.md +++ b/docs/api/schema/validators.md @@ -113,7 +113,7 @@ This is intentional. Schema validation and the legacy sanitizer are alternative - Prefer [`querySyntax`](./typebox.md#querysyntax) (or the [JSON schema helpers](./schema.md#query-helpers)) so only the common operators are allowed on each property. - Set `additionalProperties: false` on query objects so unknown keys (including unexpected `$` operators) are rejected. Generated applications already do this. -- Only add extra operators (for example `$ilike` or `$regex`) when your adapter supports them and your application needs them. +- Only add extra operators (for example `$ilike` or `$regex`) when your adapter supports them and your application needs them. Copy-paste examples: [querySyntax](./typebox.md#querysyntax). - Avoid permissive schemas such as `additionalProperties: true` or an open object on external query validation unless you intentionally want clients to send those keys.
diff --git a/docs/guides/cli/service.schemas.md b/docs/guides/cli/service.schemas.md index 788303c053..140d5d723c 100644 --- a/docs/guides/cli/service.schemas.md +++ b/docs/guides/cli/service.schemas.md @@ -105,7 +105,7 @@ export const messageQueryValidator = getValidator(messageQuerySchema, queryValid export const messageQueryResolver = resolve({}) ``` -To add additional operators like `$like` see the [querySyntax](../../api/schema/typebox.md#querysyntax) documentation. You can also add your own query parameters in the `Type.Object({}, { additionalProperties: false })` definition. +To add additional operators like `$like` or `$regex`, see [querySyntax](../../api/schema/typebox.md#querysyntax). You can also add your own query parameters in the `Type.Object({}, { additionalProperties: false })` definition.
diff --git a/packages/adapter-commons/src/query.ts b/packages/adapter-commons/src/query.ts index 1dc31ffdec..38fd2605c8 100644 --- a/packages/adapter-commons/src/query.ts +++ b/packages/adapter-commons/src/query.ts @@ -8,6 +8,10 @@ const parse = (value: any) => (typeof value !== 'undefined' ? parseInt(value, 10 const isPlainObject = (value: any) => _.isObject(value) && value.constructor === {}.constructor const validateQueryProperty = (query: any, operators: string[] = []): Query => { + if (Array.isArray(query)) { + return query.map((value) => validateQueryProperty(value, operators)) + } + if (!isPlainObject(query)) { return query } @@ -17,11 +21,7 @@ const validateQueryProperty = (query: any, operators: string[] = []): Query => { throw new BadRequest(`Invalid query parameter ${key}`, query) } - const value = query[key] - - if (isPlainObject(value)) { - query[key] = validateQueryProperty(value, operators) - } + query[key] = validateQueryProperty(query[key], operators) } return { @@ -91,41 +91,44 @@ export const OPERATORS = ['$in', '$nin', '$lt', '$lte', '$gt', '$gte', '$ne', '$ export const FILTERS: FilterSettings = { $skip: (value: any) => parse(value), - $sort: (sort: any): { [key: string]: number } => { + $sort: (sort: any, { operators }: FilterQueryOptions): { [key: string]: any } => { if (typeof sort !== 'object' || Array.isArray(sort)) { return sort } return Object.keys(sort).reduce( (result, key) => { - result[key] = typeof sort[key] === 'object' ? sort[key] : parse(sort[key]) + result[key] = + typeof sort[key] === 'object' && sort[key] !== null + ? validateQueryProperty(sort[key], operators) + : parse(sort[key]) return result }, - {} as { [key: string]: number } + {} as { [key: string]: any } ) }, $limit: (_limit: any, { paginate }: FilterQueryOptions) => getLimit(_limit, paginate), - $select: (select: any) => { + $select: (select: any, { operators }: FilterQueryOptions) => { if (Array.isArray(select)) { return select.map((current) => `${current}`) } - return select + return validateQueryProperty(select, operators) }, $or: (or: any, { operators }: FilterQueryOptions) => { if (Array.isArray(or)) { return or.map((current) => validateQueryProperty(current, operators)) } - return or + return validateQueryProperty(or, operators) }, $and: (and: any, { operators }: FilterQueryOptions) => { if (Array.isArray(and)) { return and.map((current) => validateQueryProperty(current, operators)) } - return and + return validateQueryProperty(and, operators) } } diff --git a/packages/adapter-commons/test/query.test.ts b/packages/adapter-commons/test/query.test.ts index 805704c97e..d40f4d7964 100644 --- a/packages/adapter-commons/test/query.test.ts +++ b/packages/adapter-commons/test/query.test.ts @@ -245,6 +245,169 @@ describe('@feathersjs/adapter-commons/filterQuery', () => { $or: [{ value: { $gte: 10 } }] }) }) + + it('rejects unknown operators nested one array level under $or', () => { + assert.throws( + () => { + filterQuery({ + $or: [[{ $where: '1==1' }]] + }) + }, + { + name: 'BadRequest', + message: 'Invalid query parameter $where' + } + ) + }) + + it('rejects unknown operators nested one array level under $and', () => { + assert.throws( + () => { + filterQuery({ + $and: [[{ $where: '1==1' }]] + }) + }, + { + name: 'BadRequest', + message: 'Invalid query parameter $where' + } + ) + }) + + it('rejects unknown operators in a property value array', () => { + assert.throws( + () => { + filterQuery({ + name: [{ $where: '1==1' }] + }) + }, + { + name: 'BadRequest', + message: 'Invalid query parameter $where' + } + ) + }) + + it('rejects unknown operators nested inside an allowed operator array', () => { + assert.throws( + () => { + filterQuery({ + name: { $in: [{ $where: '1==1' }] } + }) + }, + { + name: 'BadRequest', + message: 'Invalid query parameter $where' + } + ) + }) + + it('rejects unknown operators in deeply nested arrays', () => { + assert.throws( + () => { + filterQuery({ + $or: [[[{ $exists: false }]]] + }) + }, + { + name: 'BadRequest', + message: 'Invalid query parameter $exists' + } + ) + }) + + it('allows primitive arrays and valid nested objects', () => { + const { query, filters } = filterQuery({ + tags: ['a', 'b'], + name: { $in: ['dave', 'alice'] }, + $or: [{ value: { $gte: 10 } }, { name: 'dave' }] + }) + + assert.deepStrictEqual(query, { + tags: ['a', 'b'], + name: { $in: ['dave', 'alice'] } + }) + assert.deepStrictEqual(filters, { + $or: [{ value: { $gte: 10 } }, { name: 'dave' }] + }) + }) + + it('rejects unknown operators in a non-array $or object', () => { + assert.throws( + () => { + filterQuery({ + $or: { $where: '1==1' } + }) + }, + { + name: 'BadRequest', + message: 'Invalid query parameter $where' + } + ) + }) + + it('rejects unknown operators in a non-array $and object', () => { + assert.throws( + () => { + filterQuery({ + $and: { $where: '1==1' } + }) + }, + { + name: 'BadRequest', + message: 'Invalid query parameter $where' + } + ) + }) + + it('rejects unknown operators nested in an object $select', () => { + assert.throws( + () => { + filterQuery({ + $select: { + owned: { $function: { body: 'return 1', lang: 'js', args: [] } } + } + }) + }, + { + name: 'BadRequest', + message: 'Invalid query parameter $function' + } + ) + }) + + it('allows MongoDB inclusion-style object $select', () => { + const { filters } = filterQuery({ + $select: { name: 1, age: 1 } + }) + + assert.deepStrictEqual(filters.$select, { name: 1, age: 1 }) + }) + + it('allows extra operators in object $select when listed on operators', () => { + const { filters } = filterQuery( + { + $select: { score: { $meta: 'textScore' } } + }, + { operators: ['$meta'] } + ) + + assert.deepStrictEqual(filters.$select, { score: { $meta: 'textScore' } }) + }) + + it('rejects unknown operators nested in a $sort value', () => { + assert.throws( + () => { + filterQuery({ + $sort: { score: { $function: { body: 'return 1', lang: 'js', args: [] } } } + }) + }, + { + name: 'BadRequest', + message: 'Invalid query parameter $function' + } + ) + }) }) describe('additional filters', () => { @@ -286,6 +449,42 @@ describe('@feathersjs/adapter-commons/filterQuery', () => { }) }) + describe('configured operators', () => { + it('allows $exists when listed on operators', () => { + const { query } = filterQuery({ name: { $exists: true } }, { operators: ['$exists'] }) + + assert.deepStrictEqual(query, { name: { $exists: true } }) + }) + + it('allows $regex and $options when listed on operators', () => { + const { query } = filterQuery( + { name: { $regex: 'Dav', $options: 'i' } }, + { operators: ['$regex', '$options'] } + ) + + assert.deepStrictEqual(query, { name: { $regex: 'Dav', $options: 'i' } }) + }) + + it('allows $like when listed on operators', () => { + const { query } = filterQuery({ name: { $like: 'D%' } }, { operators: ['$like'] }) + + assert.deepStrictEqual(query, { name: { $like: 'D%' } }) + }) + + it('allows $meta in $select and $sort when listed on operators', () => { + const { filters } = filterQuery( + { + $select: { score: { $meta: 'textScore' } }, + $sort: { score: { $meta: 'textScore' } } + }, + { operators: ['$meta'] } + ) + + assert.deepStrictEqual(filters.$select, { score: { $meta: 'textScore' } }) + assert.deepStrictEqual(filters.$sort, { score: { $meta: 'textScore' } }) + }) + }) + describe('additional operators', () => { it('returns query with default and known additional operators', () => { const { query } = filterQuery( diff --git a/packages/adapter-commons/test/service.test.ts b/packages/adapter-commons/test/service.test.ts index ed5cc4a4c6..dce497b077 100644 --- a/packages/adapter-commons/test/service.test.ts +++ b/packages/adapter-commons/test/service.test.ts @@ -103,6 +103,16 @@ describe('@feathersjs/adapter-commons/service', () => { } ) + await assert.rejects( + () => + service.sanitizeQuery({ + query: { $or: [[{ $where: '1==1' }]] } + }), + { + message: 'Invalid query parameter $where' + } + ) + assert.deepStrictEqual( await service.sanitizeQuery({ adapter: { diff --git a/packages/mongodb/src/converters.ts b/packages/mongodb/src/converters.ts index e38a677def..4e97ccdc5d 100644 --- a/packages/mongodb/src/converters.ts +++ b/packages/mongodb/src/converters.ts @@ -44,14 +44,39 @@ export async function resolveQueryObjectId(value: ObjectIdParam | IdQueryObject< return convertedObject } +const isObjectId = (value: any): value is ObjectId => { + if (value == null || typeof value !== 'object') { + return false + } + + if (value instanceof ObjectId) { + return true + } + + // Another mongodb/bson copy of ObjectId (instanceof fails across duplicates). + // Reject plain JSON such as `{ _bsontype: 'ObjectId' }`. + return ( + value._bsontype === 'ObjectId' && + value.constructor !== Object && + typeof value.toHexString === 'function' + ) +} + export const keywordObjectId = { keyword: 'objectid', - type: 'string', modifying: true, compile(schemaVal: boolean) { if (!schemaVal) return () => true - return function (value: string, obj: any) { + return function (value: any, obj: any) { + if (isObjectId(value)) { + return true + } + + if (typeof value !== 'string') { + return false + } + const { parentData, parentDataProperty } = obj try { parentData[parentDataProperty] = new ObjectId(value) diff --git a/packages/mongodb/test/converters.test.ts b/packages/mongodb/test/converters.test.ts index 910ba58fa5..e85f100059 100644 --- a/packages/mongodb/test/converters.test.ts +++ b/packages/mongodb/test/converters.test.ts @@ -108,6 +108,39 @@ describe('objectid keyword', () => { assert.equal(validate.errors?.[0].keyword, 'objectid') }) + it('accepts ObjectId instances', async () => { + const schema = { + type: 'object', + properties: { + _id: { type: 'object', objectid: true } + }, + additionalProperties: false + } + const validate = validator.compile(schema) + const data = { _id: new ObjectId() } + + assert.equal(validate(data), true) + assert.ok(data._id instanceof ObjectId) + }) + + it('rejects operator objects that are not ObjectId instances', async () => { + const schema = { + type: 'object', + properties: { + _id: { type: 'object', objectid: true } + }, + additionalProperties: false + } + const validate = validator.compile(schema) + + assert.equal(validate({ _id: { $where: '1==1' } }), false) + assert.equal(validate.errors?.[0].keyword, 'objectid') + assert.equal(validate({ _id: { $ne: null } }), false) + assert.equal(validate({ _id: { $regex: '.*' } }), false) + assert.equal(validate({ _id: { _bsontype: 'ObjectId' } }), false) + assert.equal(validate({ _id: { _bsontype: 'ObjectId', $where: '1==1' } }), false) + }) + it('continues validating nullable unions when an objectid branch fails', async () => { const nullableValidator = new Ajv({ coerceTypes: true, useDefaults: true }) nullableValidator.addKeyword(keywordObjectId) diff --git a/packages/mongodb/test/index.test.ts b/packages/mongodb/test/index.test.ts index 561b75f336..bd5944c741 100644 --- a/packages/mongodb/test/index.test.ts +++ b/packages/mongodb/test/index.test.ts @@ -747,21 +747,11 @@ describe('Feathers MongoDB Service', () => { describe('query validation', () => { it('validated queries are not sanitized', async () => { const people = app.service('people') - // Isolate from earlier tests that mutate shared service options - const previous = { - multi: people.options.multi, - disableObjectify: people.options.disableObjectify, - paginate: people.options.paginate - } - people.options.multi = false - people.options.disableObjectify = false - people.options.paginate = false + const name = `Dave-${Date.now()}` + const inserted = await db.collection('people').insertOne({ name }) + const dave = { _id: inserted.insertedId, name } try { - const name = `Dave-${Date.now()}` - const dave = await people.create({ name }) - assert.ok(dave && dave._id, 'create should return the created person') - // $regex is not in the default operator allowlist; validateQuery marks the // query as validated so sanitizeQuery skips and $regex reaches MongoDB. const result = await people.find({ @@ -773,12 +763,8 @@ describe('Feathers MongoDB Service', () => { } }) assert.deepStrictEqual(result, [dave]) - - await people.remove(dave._id) } finally { - people.options.multi = previous.multi - people.options.disableObjectify = previous.disableObjectify - people.options.paginate = previous.paginate + await db.collection('people').deleteOne({ _id: inserted.insertedId }) } }) }) diff --git a/packages/schema/src/json-schema.ts b/packages/schema/src/json-schema.ts index 0d0739b49b..9d9f55dbac 100644 --- a/packages/schema/src/json-schema.ts +++ b/packages/schema/src/json-schema.ts @@ -239,6 +239,6 @@ export const ObjectIdSchema = () => ({ anyOf: [ { type: 'string', objectid: true }, - { type: 'object', properties: {}, additionalProperties: true } + { type: 'object', objectid: true } ] }) as const diff --git a/packages/schema/test/json-schema.test.ts b/packages/schema/test/json-schema.test.ts index 85a8234104..255b193b0f 100644 --- a/packages/schema/test/json-schema.test.ts +++ b/packages/schema/test/json-schema.test.ts @@ -1,6 +1,7 @@ import Ajv from 'ajv' import assert from 'assert' import { ObjectId as MongoObjectId } from 'mongodb' +import { keywordObjectId } from '@feathersjs/mongodb' import { FromSchema } from '../src/' import { querySyntax, ObjectIdSchema } from '../src/json-schema' @@ -57,6 +58,38 @@ describe('@feathersjs/schema/json-schema', () => { assert.ok(validator(q)) }) + it('can extend common operators people typically add', async () => { + const ajv = new Ajv({ strict: false }) + ajv.addKeyword(keywordObjectId) + + const querySchema = { + type: 'object', + additionalProperties: false, + properties: querySyntax( + { + _id: { anyOf: [ObjectIdSchema(), { type: 'null' }] }, + name: { type: 'string' } + }, + { + name: { + $regex: { type: 'string' }, + $options: { type: 'string' }, + $like: { type: 'string' }, + $exists: { type: 'boolean' } + } + } + ) + } + const validator = ajv.compile(querySchema) + + assert.equal(validator({ name: { $regex: 'Dav', $options: 'i' } }), true) + assert.equal(validator({ name: { $like: 'D%' } }), true) + assert.equal(validator({ name: { $exists: true } }), true) + assert.equal(validator({ _id: null }), true) + assert.equal(validator({ _id: { $ne: null } }), true) + assert.equal(validator({ name: { $where: '1==1' } }), false) + }) + it('$in and $nin works with array definitions', async () => { const schema = { things: { @@ -106,4 +139,43 @@ describe('@feathersjs/schema/json-schema', () => { }) assert.ok(validated2) }) + + it('ObjectIdSchema rejects operator objects when the objectid keyword is registered', async () => { + const ajv = new Ajv({ strict: false }) + ajv.addKeyword(keywordObjectId) + + const schema = { + type: 'object', + properties: { + _id: ObjectIdSchema() + } + } + const validator = ajv.compile(schema) + + assert.equal(validator({ _id: '507f191e810c19729de860ea' }), true) + assert.equal(validator({ _id: new MongoObjectId() }), true) + assert.equal(validator({ _id: { $where: '1==1' } }), false) + assert.equal(validator({ _id: { $regex: '.*' } }), false) + assert.equal(validator({ _id: { $ne: null } }), false) + }) + + it('querySyntax with ObjectIdSchema does not treat operator objects as ids', async () => { + const ajv = new Ajv({ strict: false }) + ajv.addKeyword(keywordObjectId) + + const querySchema = { + type: 'object', + additionalProperties: false, + properties: querySyntax({ + _id: ObjectIdSchema(), + text: { type: 'string' } + }) + } + const validator = ajv.compile(querySchema) + + assert.equal(validator({ _id: '507f191e810c19729de860ea' }), true) + assert.equal(validator({ _id: { $ne: '507f191e810c19729de860ea' } }), true) + assert.equal(validator({ _id: { $where: '1==1' } }), false) + assert.equal(validator({ $or: [{ _id: { $where: '1==1' } }] }), false) + }) }) diff --git a/packages/typebox/src/index.ts b/packages/typebox/src/index.ts index 098cf22a90..9ef726ee8c 100644 --- a/packages/typebox/src/index.ts +++ b/packages/typebox/src/index.ts @@ -198,4 +198,4 @@ export const querySyntax = < } export const ObjectIdSchema = () => - Type.Union([Type.String({ objectid: true }), Type.Object({}, { additionalProperties: true })]) + Type.Union([Type.String({ objectid: true }), Type.Unsafe({ type: 'object', objectid: true })]) diff --git a/packages/typebox/test/index.test.ts b/packages/typebox/test/index.test.ts index bfb82718db..25ddf5b215 100644 --- a/packages/typebox/test/index.test.ts +++ b/packages/typebox/test/index.test.ts @@ -1,5 +1,6 @@ import assert from 'assert' import { ObjectId as MongoObjectId } from 'mongodb' +import { keywordObjectId } from '@feathersjs/mongodb' import { Ajv } from '@feathersjs/schema' import { querySyntax, @@ -78,6 +79,37 @@ describe('@feathersjs/schema/typebox', () => { assert.ok(validated) }) + + it('can extend common operators people typically add', async () => { + const ajv = new Ajv({ strict: false }) + ajv.addKeyword(keywordObjectId) + + const querySchema = querySyntax( + Type.Object( + { + _id: Type.Union([ObjectIdSchema(), Type.Null()]), + name: Type.String() + }, + { additionalProperties: false } + ), + { + name: { + $regex: Type.String(), + $options: Type.String(), + $like: Type.String(), + $exists: Type.Boolean() + } + } + ) + const validator = ajv.compile(querySchema) + + assert.equal(validator({ name: { $regex: 'Dav', $options: 'i' } }), true) + assert.equal(validator({ name: { $like: 'D%' } }), true) + assert.equal(validator({ name: { $exists: true } }), true) + assert.equal(validator({ _id: null }), true) + assert.equal(validator({ _id: { $ne: null } }), true) + assert.equal(validator({ name: { $where: '1==1' } }), false) + }) }) it('$in and $nin works with array type', async () => { @@ -141,6 +173,43 @@ describe('@feathersjs/schema/typebox', () => { assert.ok(validated2) }) + it('ObjectIdSchema rejects operator objects when the objectid keyword is registered', async () => { + const ajv = new Ajv({ strict: false }) + ajv.addKeyword(keywordObjectId) + + const schema = Type.Object({ + _id: ObjectIdSchema() + }) + const validator = ajv.compile(schema) + + assert.equal(validator({ _id: '507f191e810c19729de860ea' }), true) + assert.equal(validator({ _id: new MongoObjectId() }), true) + assert.equal(validator({ _id: { $where: '1==1' } }), false) + assert.equal(validator({ _id: { $regex: '.*' } }), false) + assert.equal(validator({ _id: { $ne: null } }), false) + }) + + it('querySyntax with ObjectIdSchema does not treat operator objects as ids', async () => { + const ajv = new Ajv({ strict: false }) + ajv.addKeyword(keywordObjectId) + + const querySchema = querySyntax( + Type.Object( + { + _id: ObjectIdSchema(), + text: Type.String() + }, + { additionalProperties: false } + ) + ) + const validator = ajv.compile(querySchema) + + assert.equal(validator({ _id: '507f191e810c19729de860ea' }), true) + assert.equal(validator({ _id: { $ne: '507f191e810c19729de860ea' } }), true) + assert.equal(validator({ _id: { $where: '1==1' } }), false) + assert.equal(validator({ $or: [{ _id: { $where: '1==1' } }] }), false) + }) + it('validators', () => { assert.strictEqual(typeof getDataValidator(Type.Object({}), new Ajv()), 'object') assert.strictEqual(typeof getValidator(Type.Object({}), new Ajv()), 'function') From cc972d02f607b0af5516f57eb3ccc316d51e36c1 Mon Sep 17 00:00:00 2001 From: Marshall Thompson Date: Thu, 13 Aug 2026 19:47:19 -0600 Subject: [PATCH 2/2] chore(release): publish v5.0.49 --- CHANGELOG.md | 6 + lerna.json | 2 +- package-lock.json | 336 ++++++++++---------- packages/adapter-commons/CHANGELOG.md | 6 + packages/adapter-commons/package.json | 8 +- packages/adapter-tests/CHANGELOG.md | 4 + packages/adapter-tests/package.json | 2 +- packages/authentication-client/CHANGELOG.md | 4 + packages/authentication-client/package.json | 22 +- packages/authentication-local/CHANGELOG.md | 4 + packages/authentication-local/package.json | 14 +- packages/authentication-oauth/CHANGELOG.md | 4 + packages/authentication-oauth/package.json | 18 +- packages/authentication/CHANGELOG.md | 4 + packages/authentication/package.json | 14 +- packages/cli/CHANGELOG.md | 4 + packages/cli/package.json | 38 +-- packages/client/CHANGELOG.md | 4 + packages/client/package.json | 20 +- packages/commons/CHANGELOG.md | 4 + packages/commons/package.json | 2 +- packages/configuration/CHANGELOG.md | 4 + packages/configuration/package.json | 8 +- packages/create-feathers/CHANGELOG.md | 4 + packages/create-feathers/package.json | 4 +- packages/errors/CHANGELOG.md | 4 + packages/errors/package.json | 4 +- packages/express/CHANGELOG.md | 4 + packages/express/package.json | 16 +- packages/feathers/CHANGELOG.md | 4 + packages/feathers/package.json | 4 +- packages/generators/CHANGELOG.md | 4 + packages/generators/package.json | 36 +-- packages/knex/CHANGELOG.md | 4 + packages/knex/package.json | 14 +- packages/koa/CHANGELOG.md | 4 + packages/koa/package.json | 18 +- packages/memory/CHANGELOG.md | 4 + packages/memory/package.json | 10 +- packages/mongodb/CHANGELOG.md | 6 + packages/mongodb/package.json | 14 +- packages/rest-client/CHANGELOG.md | 4 + packages/rest-client/package.json | 14 +- packages/schema/CHANGELOG.md | 6 + packages/schema/package.json | 12 +- packages/socketio-client/CHANGELOG.md | 4 + packages/socketio-client/package.json | 14 +- packages/socketio/CHANGELOG.md | 4 + packages/socketio/package.json | 14 +- packages/tests/CHANGELOG.md | 4 + packages/tests/package.json | 4 +- packages/transport-commons/CHANGELOG.md | 4 + packages/transport-commons/package.json | 8 +- packages/typebox/CHANGELOG.md | 6 + packages/typebox/package.json | 4 +- 55 files changed, 455 insertions(+), 337 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e6950432d..02ffc46433 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +### Bug Fixes + +- **adapter-commons:** validate query operators nested in arrays ([#3700](https://github.com/feathersjs/feathers/issues/3700)) ([304a1aa](https://github.com/feathersjs/feathers/commit/304a1aacd7a4808804d6a16204ea83e72eee669e)) + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) ### Bug Fixes diff --git a/lerna.json b/lerna.json index 786b8bac84..7bb270eb32 100644 --- a/lerna.json +++ b/lerna.json @@ -1,7 +1,7 @@ { "ci": false, "packages": ["packages/*"], - "version": "5.0.48", + "version": "5.0.49", "command": { "bootstrap": { "hoist": true diff --git a/package-lock.json b/package-lock.json index d400630894..17d624a820 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29349,12 +29349,12 @@ }, "packages/adapter-commons": { "name": "@feathersjs/adapter-commons", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48" + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49" }, "devDependencies": { "@types/mocha": "^10.0.10", @@ -29376,7 +29376,7 @@ }, "packages/adapter-tests": { "name": "@feathersjs/adapter-tests", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "devDependencies": { "@types/mocha": "^10.0.10", @@ -29396,15 +29396,15 @@ }, "packages/authentication": { "name": "@feathersjs/authentication", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", "@feathersjs/hooks": "^0.9.0", - "@feathersjs/schema": "^5.0.48", - "@feathersjs/transport-commons": "^5.0.48", + "@feathersjs/schema": "^5.0.49", + "@feathersjs/transport-commons": "^5.0.49", "@types/jsonwebtoken": "^9.0.10", "jsonwebtoken": "^9.0.3", "lodash": "^4.18.1", @@ -29412,7 +29412,7 @@ "uuid": "^11.1.0" }, "devDependencies": { - "@feathersjs/memory": "^5.0.48", + "@feathersjs/memory": "^5.0.49", "@types/lodash": "^4.17.24", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", @@ -29432,21 +29432,21 @@ }, "packages/authentication-client": { "name": "@feathersjs/authentication-client", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/authentication": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48" + "@feathersjs/authentication": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49" }, "devDependencies": { - "@feathersjs/authentication-local": "^5.0.48", - "@feathersjs/express": "^5.0.48", - "@feathersjs/memory": "^5.0.48", - "@feathersjs/rest-client": "^5.0.48", - "@feathersjs/socketio": "^5.0.48", - "@feathersjs/socketio-client": "^5.0.48", + "@feathersjs/authentication-local": "^5.0.49", + "@feathersjs/express": "^5.0.49", + "@feathersjs/memory": "^5.0.49", + "@feathersjs/rest-client": "^5.0.49", + "@feathersjs/socketio": "^5.0.49", + "@feathersjs/socketio-client": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "axios": "^1.18.0", @@ -29465,19 +29465,19 @@ }, "packages/authentication-local": { "name": "@feathersjs/authentication-local", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/authentication": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/authentication": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", "bcryptjs": "^3.0.3", "lodash": "^4.18.1" }, "devDependencies": { - "@feathersjs/memory": "^5.0.48", - "@feathersjs/schema": "^5.0.48", + "@feathersjs/memory": "^5.0.49", + "@feathersjs/schema": "^5.0.49", "@types/bcryptjs": "^2.4.6", "@types/lodash": "^4.17.24", "@types/mocha": "^10.0.10", @@ -29497,23 +29497,23 @@ }, "packages/authentication-oauth": { "name": "@feathersjs/authentication-oauth", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/authentication": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/express": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/koa": "^5.0.48", - "@feathersjs/schema": "^5.0.48", + "@feathersjs/authentication": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/express": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/koa": "^5.0.49", + "@feathersjs/schema": "^5.0.49", "cookie-session": "^2.1.1", "grant": "^5.4.24", "koa-session": "^7.0.2", "qs": "^6.15.2" }, "devDependencies": { - "@feathersjs/memory": "^5.0.48", + "@feathersjs/memory": "^5.0.49", "@types/cookie-session": "^2.0.49", "@types/express": "^4.17.21", "@types/koa-session": "^6.4.5", @@ -29550,10 +29550,10 @@ }, "packages/cli": { "name": "@feathersjs/cli", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/generators": "^5.0.48", + "@feathersjs/generators": "^5.0.49", "chalk": "^5.6.2", "commander": "^13.1.0" }, @@ -29561,23 +29561,23 @@ "feathers": "bin/feathers.js" }, "devDependencies": { - "@feathersjs/adapter-commons": "^5.0.48", - "@feathersjs/authentication": "^5.0.48", - "@feathersjs/authentication-client": "^5.0.48", - "@feathersjs/authentication-local": "^5.0.48", - "@feathersjs/authentication-oauth": "^5.0.48", - "@feathersjs/configuration": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/express": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/knex": "^5.0.48", - "@feathersjs/koa": "^5.0.48", - "@feathersjs/mongodb": "^5.0.48", - "@feathersjs/rest-client": "^5.0.48", - "@feathersjs/schema": "^5.0.48", - "@feathersjs/socketio": "^5.0.48", - "@feathersjs/transport-commons": "^5.0.48", - "@feathersjs/typebox": "^5.0.48", + "@feathersjs/adapter-commons": "^5.0.49", + "@feathersjs/authentication": "^5.0.49", + "@feathersjs/authentication-client": "^5.0.49", + "@feathersjs/authentication-local": "^5.0.49", + "@feathersjs/authentication-oauth": "^5.0.49", + "@feathersjs/configuration": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/express": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/knex": "^5.0.49", + "@feathersjs/koa": "^5.0.49", + "@feathersjs/mongodb": "^5.0.49", + "@feathersjs/rest-client": "^5.0.49", + "@feathersjs/schema": "^5.0.49", + "@feathersjs/socketio": "^5.0.49", + "@feathersjs/transport-commons": "^5.0.49", + "@feathersjs/typebox": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "@types/prettier": "^2.7.3", @@ -29614,22 +29614,22 @@ }, "packages/client": { "name": "@feathersjs/client", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/authentication-client": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/rest-client": "^5.0.48", - "@feathersjs/socketio-client": "^5.0.48" + "@feathersjs/authentication-client": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/rest-client": "^5.0.49", + "@feathersjs/socketio-client": "^5.0.49" }, "devDependencies": { "@babel/core": "^8.0.1", "@babel/preset-env": "^8.0.2", - "@feathersjs/express": "^5.0.48", - "@feathersjs/memory": "^5.0.48", - "@feathersjs/socketio": "^5.0.48", - "@feathersjs/tests": "^5.0.48", + "@feathersjs/express": "^5.0.49", + "@feathersjs/memory": "^5.0.49", + "@feathersjs/socketio": "^5.0.49", + "@feathersjs/tests": "^5.0.49", "babel-loader": "^10.1.1", "mocha": "^11.7.6", "node-fetch": "^2.6.1", @@ -29652,7 +29652,7 @@ }, "packages/commons": { "name": "@feathersjs/commons", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "devDependencies": { "@types/mocha": "^10.0.10", @@ -29672,12 +29672,12 @@ }, "packages/configuration": { "name": "@feathersjs/configuration", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/schema": "^5.0.48", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/schema": "^5.0.49", "@types/config": "^3.3.5", "config": "^4.4.1" }, @@ -29698,10 +29698,10 @@ } }, "packages/create-feathers": { - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/cli": "^5.0.48" + "@feathersjs/cli": "^5.0.49" }, "bin": { "create-feathers": "bin/create-feathers.js" @@ -29716,10 +29716,10 @@ }, "packages/errors": { "name": "@feathersjs/errors", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "devDependencies": { - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/feathers": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "mocha": "^11.7.6", @@ -29733,14 +29733,14 @@ }, "packages/express": { "name": "@feathersjs/express", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/authentication": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/transport-commons": "^5.0.48", + "@feathersjs/authentication": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/transport-commons": "^5.0.49", "@types/compression": "^1.8.1", "@types/cors": "^2.8.19", "@types/express": "^4.17.21", @@ -29750,8 +29750,8 @@ "express": "^4.21.2" }, "devDependencies": { - "@feathersjs/authentication-local": "^5.0.48", - "@feathersjs/tests": "^5.0.48", + "@feathersjs/authentication-local": "^5.0.49", + "@feathersjs/tests": "^5.0.49", "@types/lodash": "^4.17.24", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", @@ -29772,10 +29772,10 @@ }, "packages/feathers": { "name": "@feathersjs/feathers", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.48", + "@feathersjs/commons": "^5.0.49", "@feathersjs/hooks": "^0.9.0", "events": "^3.3.0" }, @@ -29797,7 +29797,7 @@ }, "packages/generators": { "name": "@feathersjs/generators", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { "@featherscloud/pinion": "^0.5.7", @@ -29807,23 +29807,23 @@ "typescript": "^5.9.3" }, "devDependencies": { - "@feathersjs/adapter-commons": "^5.0.48", - "@feathersjs/authentication": "^5.0.48", - "@feathersjs/authentication-client": "^5.0.48", - "@feathersjs/authentication-local": "^5.0.48", - "@feathersjs/authentication-oauth": "^5.0.48", - "@feathersjs/configuration": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/express": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/knex": "^5.0.48", - "@feathersjs/koa": "^5.0.48", - "@feathersjs/mongodb": "^5.0.48", - "@feathersjs/rest-client": "^5.0.48", - "@feathersjs/schema": "^5.0.48", - "@feathersjs/socketio": "^5.0.48", - "@feathersjs/transport-commons": "^5.0.48", - "@feathersjs/typebox": "^5.0.48", + "@feathersjs/adapter-commons": "^5.0.49", + "@feathersjs/authentication": "^5.0.49", + "@feathersjs/authentication-client": "^5.0.49", + "@feathersjs/authentication-local": "^5.0.49", + "@feathersjs/authentication-oauth": "^5.0.49", + "@feathersjs/configuration": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/express": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/knex": "^5.0.49", + "@feathersjs/koa": "^5.0.49", + "@feathersjs/mongodb": "^5.0.49", + "@feathersjs/rest-client": "^5.0.49", + "@feathersjs/schema": "^5.0.49", + "@feathersjs/socketio": "^5.0.49", + "@feathersjs/transport-commons": "^5.0.49", + "@feathersjs/typebox": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "@types/prettier": "^2.7.3", @@ -29866,17 +29866,17 @@ }, "packages/knex": { "name": "@feathersjs/knex", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/adapter-commons": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48" + "@feathersjs/adapter-commons": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49" }, "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.48", - "@feathersjs/schema": "^5.0.48", + "@feathersjs/adapter-tests": "^5.0.49", + "@feathersjs/schema": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "knex": "^3.2.10", @@ -29899,14 +29899,14 @@ }, "packages/koa": { "name": "@feathersjs/koa", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/authentication": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/transport-commons": "^5.0.48", + "@feathersjs/authentication": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/transport-commons": "^5.0.49", "@koa/cors": "^5.0.0", "@types/koa": "^3.0.3", "@types/koa__cors": "^5.0.1", @@ -29919,9 +29919,9 @@ "koa-static": "^5.0.0" }, "devDependencies": { - "@feathersjs/authentication-local": "^5.0.48", - "@feathersjs/memory": "^5.0.48", - "@feathersjs/tests": "^5.0.48", + "@feathersjs/authentication-local": "^5.0.49", + "@feathersjs/memory": "^5.0.49", + "@feathersjs/tests": "^5.0.49", "@types/koa-compose": "^3.2.9", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", @@ -29937,16 +29937,16 @@ }, "packages/memory": { "name": "@feathersjs/memory", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/adapter-commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", + "@feathersjs/adapter-commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", "sift": "^17.1.3" }, "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/adapter-tests": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "mocha": "^11.7.6", @@ -29960,17 +29960,17 @@ }, "packages/mongodb": { "name": "@feathersjs/mongodb", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/adapter-commons": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48" + "@feathersjs/adapter-commons": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49" }, "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.48", - "@feathersjs/schema": "^5.0.48", + "@feathersjs/adapter-tests": "^5.0.49", + "@feathersjs/schema": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "mocha": "^11.7.6", @@ -29991,19 +29991,19 @@ }, "packages/rest-client": { "name": "@feathersjs/rest-client", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", "@types/superagent": "^8.1.10", "qs": "^6.15.2" }, "devDependencies": { - "@feathersjs/express": "^5.0.48", - "@feathersjs/memory": "^5.0.48", - "@feathersjs/tests": "^5.0.48", + "@feathersjs/express": "^5.0.49", + "@feathersjs/memory": "^5.0.49", + "@feathersjs/tests": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "@types/node-fetch": "^2.6.13", @@ -30027,13 +30027,13 @@ }, "packages/schema": { "name": "@feathersjs/schema", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/adapter-commons": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/adapter-commons": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", "@feathersjs/hooks": "^0.9.0", "@types/json-schema": "^7.0.15", "ajv": "^8.20.0", @@ -30041,7 +30041,7 @@ "json-schema-to-ts": "^3.1.1" }, "devDependencies": { - "@feathersjs/memory": "^5.0.48", + "@feathersjs/memory": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "ajv-formats": "^3.0.1", @@ -30084,18 +30084,18 @@ }, "packages/socketio": { "name": "@feathersjs/socketio", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/transport-commons": "^5.0.48", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/transport-commons": "^5.0.49", "socket.io": "^4.8.3" }, "devDependencies": { - "@feathersjs/express": "^5.0.48", - "@feathersjs/memory": "^5.0.48", - "@feathersjs/tests": "^5.0.48", + "@feathersjs/express": "^5.0.49", + "@feathersjs/memory": "^5.0.49", + "@feathersjs/tests": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "lodash": "^4.18.1", @@ -30114,17 +30114,17 @@ }, "packages/socketio-client": { "name": "@feathersjs/socketio-client", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/transport-commons": "^5.0.48" + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/transport-commons": "^5.0.49" }, "devDependencies": { - "@feathersjs/commons": "^5.0.48", - "@feathersjs/memory": "^5.0.48", - "@feathersjs/socketio": "^5.0.48", - "@feathersjs/tests": "^5.0.48", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/memory": "^5.0.49", + "@feathersjs/socketio": "^5.0.49", + "@feathersjs/tests": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "mocha": "^11.7.6", @@ -30143,7 +30143,7 @@ }, "packages/tests": { "name": "@feathersjs/tests", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { "@types/lodash": "^4.17.24", @@ -30151,7 +30151,7 @@ "lodash": "^4.18.1" }, "devDependencies": { - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/feathers": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "mocha": "^11.7.6", @@ -30169,12 +30169,12 @@ }, "packages/transport-commons": { "name": "@feathersjs/transport-commons", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", "encodeurl": "^2.0.0", "lodash": "^4.18.1" }, @@ -30198,10 +30198,10 @@ }, "packages/typebox": { "name": "@feathersjs/typebox", - "version": "5.0.48", + "version": "5.0.49", "license": "MIT", "dependencies": { - "@feathersjs/schema": "^5.0.48", + "@feathersjs/schema": "^5.0.49", "@sinclair/typebox": "^0.25.0" }, "devDependencies": { diff --git a/packages/adapter-commons/CHANGELOG.md b/packages/adapter-commons/CHANGELOG.md index d496f63d7c..9358acd126 100644 --- a/packages/adapter-commons/CHANGELOG.md +++ b/packages/adapter-commons/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +### Bug Fixes + +- **adapter-commons:** validate query operators nested in arrays ([#3700](https://github.com/feathersjs/feathers/issues/3700)) ([304a1aa](https://github.com/feathersjs/feathers/commit/304a1aacd7a4808804d6a16204ea83e72eee669e)) + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/adapter-commons diff --git a/packages/adapter-commons/package.json b/packages/adapter-commons/package.json index 54a2a74f0d..6f89594df9 100644 --- a/packages/adapter-commons/package.json +++ b/packages/adapter-commons/package.json @@ -1,6 +1,6 @@ { "name": "@feathersjs/adapter-commons", - "version": "5.0.48", + "version": "5.0.49", "description": "Shared database adapter utility functions", "homepage": "https://feathersjs.com", "keywords": [ @@ -50,9 +50,9 @@ "access": "public" }, "dependencies": { - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48" + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49" }, "devDependencies": { "@types/mocha": "^10.0.10", diff --git a/packages/adapter-tests/CHANGELOG.md b/packages/adapter-tests/CHANGELOG.md index 4d35e35453..5d22ef862b 100644 --- a/packages/adapter-tests/CHANGELOG.md +++ b/packages/adapter-tests/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/adapter-tests + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/adapter-tests diff --git a/packages/adapter-tests/package.json b/packages/adapter-tests/package.json index 443f8a212e..d2c5ad3d21 100644 --- a/packages/adapter-tests/package.json +++ b/packages/adapter-tests/package.json @@ -1,6 +1,6 @@ { "name": "@feathersjs/adapter-tests", - "version": "5.0.48", + "version": "5.0.49", "description": "Feathers shared database adapter test suite", "homepage": "https://feathersjs.com", "keywords": [ diff --git a/packages/authentication-client/CHANGELOG.md b/packages/authentication-client/CHANGELOG.md index 1a9dffad01..56b20b5b97 100644 --- a/packages/authentication-client/CHANGELOG.md +++ b/packages/authentication-client/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/authentication-client + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/authentication-client diff --git a/packages/authentication-client/package.json b/packages/authentication-client/package.json index 0a89865d05..a2cf30294b 100644 --- a/packages/authentication-client/package.json +++ b/packages/authentication-client/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/authentication-client", "description": "The authentication plugin for feathers-client", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -53,18 +53,18 @@ "access": "public" }, "dependencies": { - "@feathersjs/authentication": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48" + "@feathersjs/authentication": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49" }, "devDependencies": { - "@feathersjs/authentication-local": "^5.0.48", - "@feathersjs/express": "^5.0.48", - "@feathersjs/memory": "^5.0.48", - "@feathersjs/rest-client": "^5.0.48", - "@feathersjs/socketio": "^5.0.48", - "@feathersjs/socketio-client": "^5.0.48", + "@feathersjs/authentication-local": "^5.0.49", + "@feathersjs/express": "^5.0.49", + "@feathersjs/memory": "^5.0.49", + "@feathersjs/rest-client": "^5.0.49", + "@feathersjs/socketio": "^5.0.49", + "@feathersjs/socketio-client": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "axios": "^1.18.0", diff --git a/packages/authentication-local/CHANGELOG.md b/packages/authentication-local/CHANGELOG.md index 72dda5aca5..810fe6fb0e 100644 --- a/packages/authentication-local/CHANGELOG.md +++ b/packages/authentication-local/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/authentication-local + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/authentication-local diff --git a/packages/authentication-local/package.json b/packages/authentication-local/package.json index 9a5ae5db8f..da5df9c57b 100644 --- a/packages/authentication-local/package.json +++ b/packages/authentication-local/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/authentication-local", "description": "Local authentication strategy for @feathers/authentication", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -53,16 +53,16 @@ "access": "public" }, "dependencies": { - "@feathersjs/authentication": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/authentication": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", "bcryptjs": "^3.0.3", "lodash": "^4.18.1" }, "devDependencies": { - "@feathersjs/memory": "^5.0.48", - "@feathersjs/schema": "^5.0.48", + "@feathersjs/memory": "^5.0.49", + "@feathersjs/schema": "^5.0.49", "@types/bcryptjs": "^2.4.6", "@types/lodash": "^4.17.24", "@types/mocha": "^10.0.10", diff --git a/packages/authentication-oauth/CHANGELOG.md b/packages/authentication-oauth/CHANGELOG.md index 090a505cf6..8b7df75856 100644 --- a/packages/authentication-oauth/CHANGELOG.md +++ b/packages/authentication-oauth/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/authentication-oauth + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) ### Bug Fixes diff --git a/packages/authentication-oauth/package.json b/packages/authentication-oauth/package.json index 523d0d6af8..5cdb0da3e5 100644 --- a/packages/authentication-oauth/package.json +++ b/packages/authentication-oauth/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/authentication-oauth", "description": "oAuth 1 and 2 authentication for Feathers. Powered by Grant.", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -54,20 +54,20 @@ "access": "public" }, "dependencies": { - "@feathersjs/authentication": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/express": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/koa": "^5.0.48", - "@feathersjs/schema": "^5.0.48", + "@feathersjs/authentication": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/express": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/koa": "^5.0.49", + "@feathersjs/schema": "^5.0.49", "cookie-session": "^2.1.1", "grant": "^5.4.24", "koa-session": "^7.0.2", "qs": "^6.15.2" }, "devDependencies": { - "@feathersjs/memory": "^5.0.48", + "@feathersjs/memory": "^5.0.49", "@types/cookie-session": "^2.0.49", "@types/express": "^4.17.21", "@types/koa-session": "^6.4.5", diff --git a/packages/authentication/CHANGELOG.md b/packages/authentication/CHANGELOG.md index e5e2da21aa..8f44a354b5 100644 --- a/packages/authentication/CHANGELOG.md +++ b/packages/authentication/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/authentication + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/authentication diff --git a/packages/authentication/package.json b/packages/authentication/package.json index ed6257461e..26d8322a14 100644 --- a/packages/authentication/package.json +++ b/packages/authentication/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/authentication", "description": "Add Authentication to your FeathersJS app.", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -53,12 +53,12 @@ "access": "public" }, "dependencies": { - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", "@feathersjs/hooks": "^0.9.0", - "@feathersjs/schema": "^5.0.48", - "@feathersjs/transport-commons": "^5.0.48", + "@feathersjs/schema": "^5.0.49", + "@feathersjs/transport-commons": "^5.0.49", "@types/jsonwebtoken": "^9.0.10", "jsonwebtoken": "^9.0.3", "lodash": "^4.18.1", @@ -66,7 +66,7 @@ "uuid": "^11.1.0" }, "devDependencies": { - "@feathersjs/memory": "^5.0.48", + "@feathersjs/memory": "^5.0.49", "@types/lodash": "^4.17.24", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 9393c109d4..93df36e625 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/cli + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/cli diff --git a/packages/cli/package.json b/packages/cli/package.json index 2f95a4c1b8..7ed3ee05aa 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/cli", "description": "The command line interface for creating Feathers applications", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/index.js", "type": "module", @@ -53,28 +53,28 @@ "access": "public" }, "dependencies": { - "@feathersjs/generators": "^5.0.48", + "@feathersjs/generators": "^5.0.49", "chalk": "^5.6.2", "commander": "^13.1.0" }, "devDependencies": { - "@feathersjs/adapter-commons": "^5.0.48", - "@feathersjs/authentication": "^5.0.48", - "@feathersjs/authentication-client": "^5.0.48", - "@feathersjs/authentication-local": "^5.0.48", - "@feathersjs/authentication-oauth": "^5.0.48", - "@feathersjs/configuration": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/express": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/knex": "^5.0.48", - "@feathersjs/koa": "^5.0.48", - "@feathersjs/mongodb": "^5.0.48", - "@feathersjs/rest-client": "^5.0.48", - "@feathersjs/schema": "^5.0.48", - "@feathersjs/socketio": "^5.0.48", - "@feathersjs/transport-commons": "^5.0.48", - "@feathersjs/typebox": "^5.0.48", + "@feathersjs/adapter-commons": "^5.0.49", + "@feathersjs/authentication": "^5.0.49", + "@feathersjs/authentication-client": "^5.0.49", + "@feathersjs/authentication-local": "^5.0.49", + "@feathersjs/authentication-oauth": "^5.0.49", + "@feathersjs/configuration": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/express": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/knex": "^5.0.49", + "@feathersjs/koa": "^5.0.49", + "@feathersjs/mongodb": "^5.0.49", + "@feathersjs/rest-client": "^5.0.49", + "@feathersjs/schema": "^5.0.49", + "@feathersjs/socketio": "^5.0.49", + "@feathersjs/transport-commons": "^5.0.49", + "@feathersjs/typebox": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "@types/prettier": "^2.7.3", diff --git a/packages/client/CHANGELOG.md b/packages/client/CHANGELOG.md index 3c954b7da3..a09bf12738 100644 --- a/packages/client/CHANGELOG.md +++ b/packages/client/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/client + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/client diff --git a/packages/client/package.json b/packages/client/package.json index d6c068223a..e98b49bdb4 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/client", "description": "A module that consolidates Feathers client modules for REST (jQuery, Request, Superagent) and Websocket (Socket.io, Primus) connections", - "version": "5.0.48", + "version": "5.0.49", "repository": { "type": "git", "url": "https://github.com/feathersjs/feathers.git", @@ -49,19 +49,19 @@ "IE 11" ], "dependencies": { - "@feathersjs/authentication-client": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/rest-client": "^5.0.48", - "@feathersjs/socketio-client": "^5.0.48" + "@feathersjs/authentication-client": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/rest-client": "^5.0.49", + "@feathersjs/socketio-client": "^5.0.49" }, "devDependencies": { "@babel/core": "^8.0.1", "@babel/preset-env": "^8.0.2", - "@feathersjs/express": "^5.0.48", - "@feathersjs/memory": "^5.0.48", - "@feathersjs/socketio": "^5.0.48", - "@feathersjs/tests": "^5.0.48", + "@feathersjs/express": "^5.0.49", + "@feathersjs/memory": "^5.0.49", + "@feathersjs/socketio": "^5.0.49", + "@feathersjs/tests": "^5.0.49", "babel-loader": "^10.1.1", "mocha": "^11.7.6", "node-fetch": "^2.6.1", diff --git a/packages/commons/CHANGELOG.md b/packages/commons/CHANGELOG.md index 9d8dbc7191..17cc335c7b 100644 --- a/packages/commons/CHANGELOG.md +++ b/packages/commons/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/commons + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/commons diff --git a/packages/commons/package.json b/packages/commons/package.json index 347f41c581..805b0eb73c 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -1,6 +1,6 @@ { "name": "@feathersjs/commons", - "version": "5.0.48", + "version": "5.0.49", "description": "Shared Feathers utility functions", "homepage": "https://feathersjs.com", "keywords": [ diff --git a/packages/configuration/CHANGELOG.md b/packages/configuration/CHANGELOG.md index 00da465906..83ab132415 100644 --- a/packages/configuration/CHANGELOG.md +++ b/packages/configuration/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/configuration + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/configuration diff --git a/packages/configuration/package.json b/packages/configuration/package.json index 4cc42d380f..401a498c24 100644 --- a/packages/configuration/package.json +++ b/packages/configuration/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/configuration", "description": "A small configuration module for your Feathers application.", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -58,9 +58,9 @@ "access": "public" }, "dependencies": { - "@feathersjs/commons": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/schema": "^5.0.48", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/schema": "^5.0.49", "@types/config": "^3.3.5", "config": "^4.4.1" }, diff --git a/packages/create-feathers/CHANGELOG.md b/packages/create-feathers/CHANGELOG.md index 3f5d15f833..93cc8e95cc 100644 --- a/packages/create-feathers/CHANGELOG.md +++ b/packages/create-feathers/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package create-feathers + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package create-feathers diff --git a/packages/create-feathers/package.json b/packages/create-feathers/package.json index a1ed9f4249..a4900231d7 100644 --- a/packages/create-feathers/package.json +++ b/packages/create-feathers/package.json @@ -1,7 +1,7 @@ { "name": "create-feathers", "description": "Create a new Feathers application", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "bin": { "create-feathers": "./bin/create-feathers.js" @@ -48,7 +48,7 @@ "access": "public" }, "dependencies": { - "@feathersjs/cli": "^5.0.48" + "@feathersjs/cli": "^5.0.49" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md index e05467ab4f..20d4e0804c 100644 --- a/packages/errors/CHANGELOG.md +++ b/packages/errors/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/errors + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/errors diff --git a/packages/errors/package.json b/packages/errors/package.json index 2fda8fa765..3baccd92ff 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/errors", "description": "Common error types for Feathers apps", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -49,7 +49,7 @@ "*.js" ], "devDependencies": { - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/feathers": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "mocha": "^11.7.6", diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index a7d27a6f0e..9f66d0a429 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/express + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/express diff --git a/packages/express/package.json b/packages/express/package.json index 7e11d41dca..76e3f16587 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/express", "description": "Feathers Express framework bindings and REST provider", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -52,11 +52,11 @@ "access": "public" }, "dependencies": { - "@feathersjs/authentication": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/transport-commons": "^5.0.48", + "@feathersjs/authentication": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/transport-commons": "^5.0.49", "@types/compression": "^1.8.1", "@types/cors": "^2.8.19", "@types/express": "^4.17.21", @@ -66,8 +66,8 @@ "express": "^4.21.2" }, "devDependencies": { - "@feathersjs/authentication-local": "^5.0.48", - "@feathersjs/tests": "^5.0.48", + "@feathersjs/authentication-local": "^5.0.49", + "@feathersjs/tests": "^5.0.49", "@types/lodash": "^4.17.24", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", diff --git a/packages/feathers/CHANGELOG.md b/packages/feathers/CHANGELOG.md index fb1ee62f0a..21bdaf367e 100644 --- a/packages/feathers/CHANGELOG.md +++ b/packages/feathers/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/feathers + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/feathers diff --git a/packages/feathers/package.json b/packages/feathers/package.json index 81ca32a241..f3e130ef00 100644 --- a/packages/feathers/package.json +++ b/packages/feathers/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/feathers", "description": "A framework for real-time applications and REST API with JavaScript and TypeScript", - "version": "5.0.48", + "version": "5.0.49", "homepage": "http://feathersjs.com", "repository": { "type": "git", @@ -58,7 +58,7 @@ "access": "public" }, "dependencies": { - "@feathersjs/commons": "^5.0.48", + "@feathersjs/commons": "^5.0.49", "@feathersjs/hooks": "^0.9.0", "events": "^3.3.0" }, diff --git a/packages/generators/CHANGELOG.md b/packages/generators/CHANGELOG.md index 128140d792..67529d04bc 100644 --- a/packages/generators/CHANGELOG.md +++ b/packages/generators/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/generators + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/generators diff --git a/packages/generators/package.json b/packages/generators/package.json index 1a77867d8e..4cd9c7a449 100644 --- a/packages/generators/package.json +++ b/packages/generators/package.json @@ -1,6 +1,6 @@ { "name": "@feathersjs/generators", - "version": "5.0.48", + "version": "5.0.49", "description": "Feathers CLI core generators, powered by Pinion", "homepage": "https://feathersjs.com", "keywords": [ @@ -59,23 +59,23 @@ "typescript": "^5.9.3" }, "devDependencies": { - "@feathersjs/adapter-commons": "^5.0.48", - "@feathersjs/authentication": "^5.0.48", - "@feathersjs/authentication-client": "^5.0.48", - "@feathersjs/authentication-local": "^5.0.48", - "@feathersjs/authentication-oauth": "^5.0.48", - "@feathersjs/configuration": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/express": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/knex": "^5.0.48", - "@feathersjs/koa": "^5.0.48", - "@feathersjs/mongodb": "^5.0.48", - "@feathersjs/rest-client": "^5.0.48", - "@feathersjs/schema": "^5.0.48", - "@feathersjs/socketio": "^5.0.48", - "@feathersjs/transport-commons": "^5.0.48", - "@feathersjs/typebox": "^5.0.48", + "@feathersjs/adapter-commons": "^5.0.49", + "@feathersjs/authentication": "^5.0.49", + "@feathersjs/authentication-client": "^5.0.49", + "@feathersjs/authentication-local": "^5.0.49", + "@feathersjs/authentication-oauth": "^5.0.49", + "@feathersjs/configuration": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/express": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/knex": "^5.0.49", + "@feathersjs/koa": "^5.0.49", + "@feathersjs/mongodb": "^5.0.49", + "@feathersjs/rest-client": "^5.0.49", + "@feathersjs/schema": "^5.0.49", + "@feathersjs/socketio": "^5.0.49", + "@feathersjs/transport-commons": "^5.0.49", + "@feathersjs/typebox": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "@types/prettier": "^2.7.3", diff --git a/packages/knex/CHANGELOG.md b/packages/knex/CHANGELOG.md index dcaafa3864..09204a167b 100644 --- a/packages/knex/CHANGELOG.md +++ b/packages/knex/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/knex + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/knex diff --git a/packages/knex/package.json b/packages/knex/package.json index b076a80953..c06170e792 100644 --- a/packages/knex/package.json +++ b/packages/knex/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/knex", "description": "Feathers SQL service adapter using KnexJS", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "keywords": [ @@ -51,17 +51,17 @@ "access": "public" }, "dependencies": { - "@feathersjs/adapter-commons": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48" + "@feathersjs/adapter-commons": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49" }, "peerDependencies": { "knex": ">=3.2.10" }, "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.48", - "@feathersjs/schema": "^5.0.48", + "@feathersjs/adapter-tests": "^5.0.49", + "@feathersjs/schema": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "knex": "^3.2.10", diff --git a/packages/koa/CHANGELOG.md b/packages/koa/CHANGELOG.md index eb92c916c0..457e580c1c 100644 --- a/packages/koa/CHANGELOG.md +++ b/packages/koa/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/koa + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/koa diff --git a/packages/koa/package.json b/packages/koa/package.json index 5803bad2ec..be8999b8f3 100644 --- a/packages/koa/package.json +++ b/packages/koa/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/koa", "description": "Feathers KoaJS framework bindings and REST provider", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -49,11 +49,11 @@ "access": "public" }, "dependencies": { - "@feathersjs/authentication": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/transport-commons": "^5.0.48", + "@feathersjs/authentication": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/transport-commons": "^5.0.49", "@koa/cors": "^5.0.0", "@types/koa": "^3.0.3", "@types/koa-qs": "^2.0.5", @@ -66,9 +66,9 @@ "koa-static": "^5.0.0" }, "devDependencies": { - "@feathersjs/authentication-local": "^5.0.48", - "@feathersjs/memory": "^5.0.48", - "@feathersjs/tests": "^5.0.48", + "@feathersjs/authentication-local": "^5.0.49", + "@feathersjs/memory": "^5.0.49", + "@feathersjs/tests": "^5.0.49", "@types/koa-compose": "^3.2.9", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", diff --git a/packages/memory/CHANGELOG.md b/packages/memory/CHANGELOG.md index a019b53c4b..b21cab970c 100644 --- a/packages/memory/CHANGELOG.md +++ b/packages/memory/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/memory + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/memory diff --git a/packages/memory/package.json b/packages/memory/package.json index 41077b6b0f..2da431fba3 100644 --- a/packages/memory/package.json +++ b/packages/memory/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/memory", "description": "An in memory service store", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://github.com/feathersjs/feathers", "main": "lib/", "types": "lib/", @@ -49,13 +49,13 @@ "lib": "lib" }, "dependencies": { - "@feathersjs/adapter-commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", + "@feathersjs/adapter-commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", "sift": "^17.1.3" }, "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/adapter-tests": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "mocha": "^11.7.6", diff --git a/packages/mongodb/CHANGELOG.md b/packages/mongodb/CHANGELOG.md index 83faaf7670..d7eaac278d 100644 --- a/packages/mongodb/CHANGELOG.md +++ b/packages/mongodb/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +### Bug Fixes + +- **adapter-commons:** validate query operators nested in arrays ([#3700](https://github.com/feathersjs/feathers/issues/3700)) ([304a1aa](https://github.com/feathersjs/feathers/commit/304a1aacd7a4808804d6a16204ea83e72eee669e)) + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/mongodb diff --git a/packages/mongodb/package.json b/packages/mongodb/package.json index df2aa3574a..769718feb3 100644 --- a/packages/mongodb/package.json +++ b/packages/mongodb/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/mongodb", "description": "Feathers MongoDB service adapter", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "keywords": [ @@ -51,17 +51,17 @@ "access": "public" }, "dependencies": { - "@feathersjs/adapter-commons": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48" + "@feathersjs/adapter-commons": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49" }, "peerDependencies": { "mongodb": "^6.19.0" }, "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.48", - "@feathersjs/schema": "^5.0.48", + "@feathersjs/adapter-tests": "^5.0.49", + "@feathersjs/schema": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "mocha": "^11.7.6", diff --git a/packages/rest-client/CHANGELOG.md b/packages/rest-client/CHANGELOG.md index ac7f9c971e..9c36c31c50 100644 --- a/packages/rest-client/CHANGELOG.md +++ b/packages/rest-client/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/rest-client + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/rest-client diff --git a/packages/rest-client/package.json b/packages/rest-client/package.json index eb4bf19c4a..2d02fbb6c5 100644 --- a/packages/rest-client/package.json +++ b/packages/rest-client/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/rest-client", "description": "REST client services for different Ajax libraries", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -53,16 +53,16 @@ "access": "public" }, "dependencies": { - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", "@types/superagent": "^8.1.10", "qs": "^6.15.2" }, "devDependencies": { - "@feathersjs/express": "^5.0.48", - "@feathersjs/memory": "^5.0.48", - "@feathersjs/tests": "^5.0.48", + "@feathersjs/express": "^5.0.49", + "@feathersjs/memory": "^5.0.49", + "@feathersjs/tests": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "@types/node-fetch": "^2.6.13", diff --git a/packages/schema/CHANGELOG.md b/packages/schema/CHANGELOG.md index 41fdaf3725..e9791b210a 100644 --- a/packages/schema/CHANGELOG.md +++ b/packages/schema/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +### Bug Fixes + +- **adapter-commons:** validate query operators nested in arrays ([#3700](https://github.com/feathersjs/feathers/issues/3700)) ([304a1aa](https://github.com/feathersjs/feathers/commit/304a1aacd7a4808804d6a16204ea83e72eee669e)) + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/schema diff --git a/packages/schema/package.json b/packages/schema/package.json index c37fd882a9..7f5975190b 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/schema", "description": "A common data schema definition format", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -54,10 +54,10 @@ "access": "public" }, "dependencies": { - "@feathersjs/adapter-commons": "^5.0.48", - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/adapter-commons": "^5.0.49", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", "@feathersjs/hooks": "^0.9.0", "@types/json-schema": "^7.0.15", "ajv": "^8.20.0", @@ -65,7 +65,7 @@ "json-schema-to-ts": "^3.1.1" }, "devDependencies": { - "@feathersjs/memory": "^5.0.48", + "@feathersjs/memory": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "ajv-formats": "^3.0.1", diff --git a/packages/socketio-client/CHANGELOG.md b/packages/socketio-client/CHANGELOG.md index dccdf43087..d5cfcc91ad 100644 --- a/packages/socketio-client/CHANGELOG.md +++ b/packages/socketio-client/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/socketio-client + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/socketio-client diff --git a/packages/socketio-client/package.json b/packages/socketio-client/package.json index 260ff8e058..ad846bfe92 100644 --- a/packages/socketio-client/package.json +++ b/packages/socketio-client/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/socketio-client", "description": "The client for Socket.io through feathers-socketio", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -54,14 +54,14 @@ "access": "public" }, "dependencies": { - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/transport-commons": "^5.0.48" + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/transport-commons": "^5.0.49" }, "devDependencies": { - "@feathersjs/commons": "^5.0.48", - "@feathersjs/memory": "^5.0.48", - "@feathersjs/socketio": "^5.0.48", - "@feathersjs/tests": "^5.0.48", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/memory": "^5.0.49", + "@feathersjs/socketio": "^5.0.49", + "@feathersjs/tests": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "mocha": "^11.7.6", diff --git a/packages/socketio/CHANGELOG.md b/packages/socketio/CHANGELOG.md index a662ed4281..4fec29ac8d 100644 --- a/packages/socketio/CHANGELOG.md +++ b/packages/socketio/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/socketio + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/socketio diff --git a/packages/socketio/package.json b/packages/socketio/package.json index c26738a09b..56845af8e6 100644 --- a/packages/socketio/package.json +++ b/packages/socketio/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/socketio", "description": "The Feathers Socket.io real-time API provider", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -53,15 +53,15 @@ "access": "public" }, "dependencies": { - "@feathersjs/commons": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", - "@feathersjs/transport-commons": "^5.0.48", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", + "@feathersjs/transport-commons": "^5.0.49", "socket.io": "^4.8.3" }, "devDependencies": { - "@feathersjs/express": "^5.0.48", - "@feathersjs/memory": "^5.0.48", - "@feathersjs/tests": "^5.0.48", + "@feathersjs/express": "^5.0.49", + "@feathersjs/memory": "^5.0.49", + "@feathersjs/tests": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "lodash": "^4.18.1", diff --git a/packages/tests/CHANGELOG.md b/packages/tests/CHANGELOG.md index dedd57ae31..42567a11b8 100644 --- a/packages/tests/CHANGELOG.md +++ b/packages/tests/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/tests + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/tests diff --git a/packages/tests/package.json b/packages/tests/package.json index 93da1c4b68..fa6063227d 100644 --- a/packages/tests/package.json +++ b/packages/tests/package.json @@ -2,7 +2,7 @@ "name": "@feathersjs/tests", "private": true, "description": "Feathers core module common tests", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -49,7 +49,7 @@ "lodash": "^4.18.1" }, "devDependencies": { - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/feathers": "^5.0.49", "@types/mocha": "^10.0.10", "@types/node": "^26.0.0", "mocha": "^11.7.6", diff --git a/packages/transport-commons/CHANGELOG.md b/packages/transport-commons/CHANGELOG.md index 91f4bcb779..e600a80af0 100644 --- a/packages/transport-commons/CHANGELOG.md +++ b/packages/transport-commons/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +**Note:** Version bump only for package @feathersjs/transport-commons + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/transport-commons diff --git a/packages/transport-commons/package.json b/packages/transport-commons/package.json index a3f91b587b..04fb9d147e 100644 --- a/packages/transport-commons/package.json +++ b/packages/transport-commons/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/transport-commons", "description": "Shared functionality for websocket providers", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -54,9 +54,9 @@ "*.js" ], "dependencies": { - "@feathersjs/commons": "^5.0.48", - "@feathersjs/errors": "^5.0.48", - "@feathersjs/feathers": "^5.0.48", + "@feathersjs/commons": "^5.0.49", + "@feathersjs/errors": "^5.0.49", + "@feathersjs/feathers": "^5.0.49", "encodeurl": "^2.0.0", "lodash": "^4.18.1" }, diff --git a/packages/typebox/CHANGELOG.md b/packages/typebox/CHANGELOG.md index e2fd5421b6..ab084ff45b 100644 --- a/packages/typebox/CHANGELOG.md +++ b/packages/typebox/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.49](https://github.com/feathersjs/feathers/compare/v5.0.48...v5.0.49) (2026-08-14) + +### Bug Fixes + +- **adapter-commons:** validate query operators nested in arrays ([#3700](https://github.com/feathersjs/feathers/issues/3700)) ([304a1aa](https://github.com/feathersjs/feathers/commit/304a1aacd7a4808804d6a16204ea83e72eee669e)) + ## [5.0.48](https://github.com/feathersjs/feathers/compare/v5.0.47...v5.0.48) (2026-08-11) **Note:** Version bump only for package @feathersjs/typebox diff --git a/packages/typebox/package.json b/packages/typebox/package.json index 8fd803f35f..3c59eaa84d 100644 --- a/packages/typebox/package.json +++ b/packages/typebox/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/typebox", "description": "TypeBox integration for @feathersjs/schema", - "version": "5.0.48", + "version": "5.0.49", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -54,7 +54,7 @@ "access": "public" }, "dependencies": { - "@feathersjs/schema": "^5.0.48", + "@feathersjs/schema": "^5.0.49", "@sinclair/typebox": "^0.25.0" }, "devDependencies": {