From f31faa457d1f11aa97d4f2b6276b615313eda47b Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Wed, 29 Nov 2023 17:21:39 +0000 Subject: [PATCH 1/6] chore: incrementing version number - v3.5.2 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 93af7416b7..5ef77abd22 100644 --- a/install/package.json +++ b/install/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "3.5.1", + "version": "3.5.2", "homepage": "https://www.nodebb.org", "repository": { "type": "git", From e2e85053a6bb2988aa9f4f1f10b36e0c4a0f1025 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Wed, 29 Nov 2023 17:21:40 +0000 Subject: [PATCH 2/6] chore: update changelog for v3.5.2 --- CHANGELOG.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84078cf370..0a0993f03d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,44 @@ +#### v3.5.2 (2023-11-29) + +##### Chores + +* up composer (49013f81) +* incrementing version number - v3.5.1 (4c543488) +* update changelog for v3.5.1 (48f7ae99) +* incrementing version number - v3.5.0 (d06fb4f0) +* incrementing version number - v3.4.3 (5c984250) +* incrementing version number - v3.4.2 (3f0dac38) +* incrementing version number - v3.4.1 (01e69574) +* incrementing version number - v3.4.0 (fd9247c5) +* incrementing version number - v3.3.9 (5805e770) +* incrementing version number - v3.3.8 (a5603565) +* incrementing version number - v3.3.7 (b26f1744) +* incrementing version number - v3.3.6 (7fb38792) +* incrementing version number - v3.3.4 (a67f84ea) +* incrementing version number - v3.3.3 (f94d239b) +* incrementing version number - v3.3.2 (ec9dac97) +* incrementing version number - v3.3.1 (151cc68f) +* incrementing version number - v3.3.0 (fc1ad70f) +* incrementing version number - v3.2.3 (b06d3e63) +* incrementing version number - v3.2.2 (758ecfcd) +* incrementing version number - v3.2.1 (20145074) +* incrementing version number - v3.2.0 (9ecac38e) +* incrementing version number - v3.1.7 (0b4e81ab) +* incrementing version number - v3.1.6 (b3a3b130) +* incrementing version number - v3.1.5 (ec19343a) +* incrementing version number - v3.1.4 (2452783c) +* incrementing version number - v3.1.3 (3b4e9d3f) +* incrementing version number - v3.1.2 (40fa3489) +* incrementing version number - v3.1.1 (40250733) +* incrementing version number - v3.1.0 (0cb386bd) +* incrementing version number - v3.0.1 (26f6ea49) +* incrementing version number - v3.0.0 (224e08cd) + +##### Bug Fixes + +* closes #12185, fix cli user password reset (6790000d) +* thumb width (a9ef58a5) + #### v3.5.1 (2023-11-14) ##### Chores From 17cd19c701d8a4959c02091dc50d445bf1982418 Mon Sep 17 00:00:00 2001 From: Steve Fan <29133953+stevefan1999-personal@users.noreply.github.com> Date: Thu, 30 Nov 2023 22:55:57 +0800 Subject: [PATCH 3/6] types: add types for database abstration layer (#10762) * types: add types for database abstration layer Signed-off-by: steve <29133953+stevefan1999-personal@users.noreply.github.com> * types: fix more type dependent return value cases Signed-off-by: steve <29133953+stevefan1999-personal@users.noreply.github.com> * types: make INodeBBDatabaseBackend implement the five major interface set Signed-off-by: steve <29133953+stevefan1999-personal@users.noreply.github.com> * update types * update type names * add reverse for options in processSortedSet * add getSortedSetMembersWithScores and getSortedSetsMembersWithScores --------- Signed-off-by: steve <29133953+stevefan1999-personal@users.noreply.github.com> --- types/database/hash.d.ts | 56 +++++++++ types/database/index.d.ts | 54 ++++++++ types/database/list.d.ts | 15 +++ types/database/set.d.ts | 25 ++++ types/database/string.d.ts | 35 ++++++ types/database/zset.d.ts | 245 +++++++++++++++++++++++++++++++++++++ 6 files changed, 430 insertions(+) create mode 100644 types/database/hash.d.ts create mode 100644 types/database/index.d.ts create mode 100644 types/database/list.d.ts create mode 100644 types/database/set.d.ts create mode 100644 types/database/string.d.ts create mode 100644 types/database/zset.d.ts diff --git a/types/database/hash.d.ts b/types/database/hash.d.ts new file mode 100644 index 0000000000..3bc7a93834 --- /dev/null +++ b/types/database/hash.d.ts @@ -0,0 +1,56 @@ +export interface Hash { + decrObjectField( + key: string | string[], + field: string, + ): Promise + + deleteObjectField(key: string, field: string): Promise + + deleteObjectFields(key: string, fields: string[]): Promise + + getObject(key: string, fields: string[]): Promise + + getObjectField(key: string, field: string): Promise + + getObjectFields(key: string, fields: string[]): Promise> + + getObjectKeys(key: string): Promise + + getObjectValues(key: string): Promise + + getObjects(keys: string[], fields: string[]): Promise + + getObjectsFields( + keys: string[], + fields: string[], + ): Promise[]> + + incrObjectField( + key: string | string[], + field: string, + ): Promise + + incrObjectFieldBy( + key: string | string[], + field: string, + value: number, + ): Promise + + incrObjectFieldByBulk( + data: [key: string, batch: Record][], + ): Promise + + isObjectField(key: string, field: string): Promise + + isObjectFields(key: string, fields: string[]): Promise + + setObject(key: string | string[], data: Record): Promise + + setObjectBulk(args: [key: string, data: Record][]): Promise + + setObjectField( + key: string | string[], + field: string, + value: any, + ): Promise +} diff --git a/types/database/index.d.ts b/types/database/index.d.ts new file mode 100644 index 0000000000..8ec2e7d865 --- /dev/null +++ b/types/database/index.d.ts @@ -0,0 +1,54 @@ +import { Store } from 'express-session' + +export { Hash } from './hash' +export { List } from './list' +export { Set } from './set' +export { Item } from './string' +export { + SortedSet, + SortedSetTheoryOperation, + SortedSetScanBaseParameters, +} from './zset' + +export interface Database { + checkCompatibility(callback: () => void): Promise + + checkCompatibilityVersion( + version: string, + callback: () => void, + ): Promise + + close(): Promise + + createIndices(callback: () => void): Promise + + createSessionStore(options: any): Promise + + emptydb(): Promise + + flushdb(): Promise + + info(db: any): Promise + + init(): Promise +} + +export type RedisStyleMatchString = + | string + | `*${string}` + | `${string}*` + | `*${string}*` +export type RedisStyleRangeString = `${'(' | '['}${string}` | `${string}` + +export enum ObjectType { + HASH = 'hash', + LIST = 'list', + SET = 'set', + STRING = 'string', + SORTED_SET = 'zset', +} + +export type ValueAndScore = { value: string; score: number } +export type RedisStyleAggregate = 'SUM' | 'MIN' | 'MAX' +export type NumberTowardsMinima = number | '-inf' +export type NumberTowardsMaxima = number | '+inf' diff --git a/types/database/list.d.ts b/types/database/list.d.ts new file mode 100644 index 0000000000..aa43cfa738 --- /dev/null +++ b/types/database/list.d.ts @@ -0,0 +1,15 @@ +export interface List { + listPrepend(key: string, value: string): Promise + + listAppend(key: string, value: string): Promise + + listRemoveLast(key: string): Promise + + listRemoveAll(key: string, value: string | string[]): Promise + + listTrim(key: string, start: number, stop: number): Promise + + getListRange(key: string, start: number, stop: number): Promise + + listLength(key: string): Promise +} diff --git a/types/database/set.d.ts b/types/database/set.d.ts new file mode 100644 index 0000000000..5dcfcc5ab2 --- /dev/null +++ b/types/database/set.d.ts @@ -0,0 +1,25 @@ +export interface Set { + getSetMembers(key: string): Promise + + getSetsMembers(keys: string[]): Promise + + isMemberOfSets(sets: string[], value: string): Promise + + isSetMember(key: string, value: string): Promise + + isSetMembers(key: string, values: string[]): Promise + + setAdd(key: string, value: string | string[]): Promise + + setCount(key: string): Promise + + setRemove(key: string | string[], value: string | string[]): Promise + + setRemoveRandom(key: string): Promise + + setsAdd(keys: string[], value: string | string[]): Promise + + setsCount(keys: string[]): Promise + + setsRemove(keys: string[], value: string): Promise +} diff --git a/types/database/string.d.ts b/types/database/string.d.ts new file mode 100644 index 0000000000..090a5cf252 --- /dev/null +++ b/types/database/string.d.ts @@ -0,0 +1,35 @@ +import { ObjectType, RedisStyleMatchString } from './index' + +export interface Item { + delete(key: string): Promise + + deleteAll(keys: string[]): Promise + + exists(key: string): Promise + + exists(key: string[]): Promise + + expire(key: string, seconds: number): Promise + + expireAt(key: string, timestampInSeconds: number): Promise + + get(key: string): Promise + + increment(key: string): Promise + + pexpire(key: string, ms: number): Promise + + pexpireAt(key: string, timestampInMs: number): Promise + + pttl(key: string): Promise + + rename(oldkey: string, newkey: string): Promise + + scan(params: { match: RedisStyleMatchString }): Promise + + set(key: string, value: string): Promise + + ttl(key: string): Promise + + type(key: string): Promise +} diff --git a/types/database/zset.d.ts b/types/database/zset.d.ts new file mode 100644 index 0000000000..b3b5e71bff --- /dev/null +++ b/types/database/zset.d.ts @@ -0,0 +1,245 @@ +import { + NumberTowardsMaxima, + NumberTowardsMinima, + RedisStyleAggregate, + RedisStyleMatchString, + RedisStyleRangeString, + ValueAndScore, +} from './index' + +export type SortedSetTheoryOperation = { + sets: string[] + sort?: 'ASC' | 'DESC' + start?: number + stop?: number + weights?: number[] + aggregate?: RedisStyleAggregate +} + +export type SortedSetScanBaseParameters = { + key: string + match: RedisStyleMatchString + limit?: number +} + +export interface SortedSet { + getSortedSetIntersect( + params: SortedSetTheoryOperation & { withScores: true }, + ): Promise + + getSortedSetIntersect( + params: SortedSetTheoryOperation & { withScores?: false }, + ): Promise + + getSortedSetMembers(key: string): Promise + + getSortedSetMembersWithScores(key: string): Promise + + getSortedSetRange( + key: string | string[], + start: number, + stop: number, + ): Promise + + getSortedSetRangeByLex( + key: string | string[], + min: RedisStyleRangeString | '-', + max: RedisStyleRangeString | '+', + start?: number, + count?: number, + ): Promise + + getSortedSetRangeByScore( + key: string | string[], + start: number, + count: number, + min: NumberTowardsMinima, + max: NumberTowardsMaxima, + ): Promise + + getSortedSetRangeByScoreWithScores( + key: string | string[], + start: number, + count: number, + min: NumberTowardsMinima, + max: NumberTowardsMaxima, + ): Promise + + getSortedSetRangeWithScores( + key: string | string[], + start: number, + stop: number, + ): Promise + + getSortedSetRevIntersect( + params: SortedSetTheoryOperation & { withScores: true }, + ): Promise + + getSortedSetRevIntersect( + params: SortedSetTheoryOperation & { withScores?: false }, + ): Promise + + getSortedSetRevRange( + key: string | string[], + start: number, + stop: number, + ): Promise + + getSortedSetRevRangeByLex( + key: string, + max: RedisStyleRangeString | '+', + min: RedisStyleRangeString | '-', + start?: number, + count?: number, + ): Promise + + getSortedSetRevRangeByScore( + key: string, + start: number, + count: number, + max: NumberTowardsMaxima | '+', + min: NumberTowardsMinima | '-', + ): Promise + + getSortedSetRevRangeByScoreWithScores( + key: string, + start: number, + count: number, + max: NumberTowardsMaxima, + min: NumberTowardsMinima, + ): Promise + + getSortedSetRevRangeWithScores( + key: string, + start: number, + stop: number, + ): Promise + + getSortedSetRevUnion( + params: SortedSetTheoryOperation & { withScores?: false }, + ): Promise + + getSortedSetRevUnion( + params: SortedSetTheoryOperation & { withScores: true }, + ): Promise + + getSortedSetScan( + params: SortedSetScanBaseParameters & { withScores: true }, + ): Promise + + getSortedSetScan( + params: SortedSetScanBaseParameters & { withScores?: false }, + ): Promise + + getSortedSetUnion( + params: SortedSetTheoryOperation & { withScores: true }, + ): Promise + + getSortedSetUnion( + params: SortedSetTheoryOperation & { withScores?: false }, + ): Promise + + getSortedSetsMembers(keys: string[]): Promise + + getSortedSetsMembersWithScores(keys: string[]): Promise + + isMemberOfSortedSets(keys: string[], value: string): Promise + + isSortedSetMember(key: string, value: string): Promise + + isSortedSetMembers(key: string, values: string[]): Promise + + processSortedSet( + setKey: string, + processFn: (ids: number[]) => Promise | void, + options: { withScores?: boolean; batch?: number; interval?: number, reverse?: boolean; }, + ): Promise + + sortedSetAdd(key: string, score: number, value: string): Promise + + sortedSetAdd(key: string, score: number[], value: string[]): Promise + + sortedSetAddBulk( + args: [key: string, score: number[], value: string[]][], + ): Promise + + sortedSetCard(key: string): Promise + + sortedSetCount( + key: string, + min: NumberTowardsMinima, + max: NumberTowardsMaxima, + ): Promise + + sortedSetIncrBy( + key: string, + increment: number, + value: string, + ): Promise + + sortedSetIncrByBulk( + data: [key: string, increment: number, value: string][], + ): Promise + + sortedSetIntersectCard(keys: string[]): Promise + + sortedSetLexCount( + key: string, + min: RedisStyleRangeString, + max: RedisStyleRangeString, + ): Promise + + sortedSetRank(key: string, value: string): Promise + + sortedSetRanks(key: string, values: string[]): Promise<(number | null)[]> + + sortedSetRemove( + key: string | string[], + value: string | string[], + ): Promise + + sortedSetRemoveBulk(data: [key: string, member: string][]): Promise + + sortedSetRemoveRangeByLex( + key: string, + min: RedisStyleRangeString | '-', + max: RedisStyleRangeString | '+', + ): Promise + + sortedSetRevRank(key: string, value: string): Promise + + sortedSetRevRanks(key: string, values: string[]): Promise + + sortedSetScore(key: string, value: string): Promise + + sortedSetScores(key: string, values: string[]): Promise + + sortedSetUnionCard(keys: string[]): Promise + + sortedSetsAdd( + keys: string[], + scores: number | number[], + value: string, + ): Promise + + sortedSetsCard(keys: string[]): Promise + + sortedSetsCardSum(keys: string[]): Promise + + sortedSetsRanks( + keys: T, + values: { [K in keyof T]: string }, + ): Promise + + sortedSetsRemove(keys: string[], value: string): Promise + + sortedSetsRemoveRangeByScore( + keys: string[], + min: NumberTowardsMinima, + max: NumberTowardsMaxima, + ): Promise + + sortedSetsRevRanks(keys: string[], values: string[]): Promise + + sortedSetsScore(keys: string[], value: string): Promise +} From c434262e2105617d83376ad12ac7977dad7c6f15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 8 Dec 2023 10:58:13 -0500 Subject: [PATCH 4/6] fix: change translator escape remove \\\] and \\\[ match double ] and [ --- public/src/modules/translator.common.js | 7 ++++--- test/translator.js | 4 ---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/public/src/modules/translator.common.js b/public/src/modules/translator.common.js index 49a3b59c60..c69a9cc265 100644 --- a/public/src/modules/translator.common.js +++ b/public/src/modules/translator.common.js @@ -463,7 +463,9 @@ module.exports = function (utils, load, warn) { * @returns {string} */ Translator.escape = function escape(text) { - return typeof text === 'string' ? text.replace(/\[\[/g, '[[').replace(/\]\]/g, ']]') : text; + return typeof text === 'string' ? + text.replace(/\[\[/g, '[[').replace(/\]\]/g, ']]') : + text; }; /** @@ -473,8 +475,7 @@ module.exports = function (utils, load, warn) { */ Translator.unescape = function unescape(text) { return typeof text === 'string' ? - text.replace(/[/g, '[').replace(/\\\[/g, '[') - .replace(/]/g, ']').replace(/\\\]/g, ']') : + text.replace(/]]/g, ']]').replace(/[[/g, '[[') : text; }; diff --git a/test/translator.js b/test/translator.js index 6e34012a7a..61c3d5af8e 100644 --- a/test/translator.js +++ b/test/translator.js @@ -308,10 +308,6 @@ describe('Translator static methods', () => { describe('.unescape', () => { it('should unescape escaped translation patterns within text', (done) => { - assert.strictEqual( - Translator.unescape('some nice text \\[\\[global:home\\]\\] here'), - 'some nice text [[global:home]] here' - ); assert.strictEqual( Translator.unescape('some nice text [[global:home]] here'), 'some nice text [[global:home]] here' From c1f82b78a82fdbe0c174c5a94adac5d995d145a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 8 Dec 2023 11:07:11 -0500 Subject: [PATCH 5/6] chore: up composer default --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 5ef77abd22..300f0c3853 100644 --- a/install/package.json +++ b/install/package.json @@ -93,7 +93,7 @@ "multiparty": "4.2.3", "nconf": "0.12.1", "nodebb-plugin-2factor": "7.4.0", - "nodebb-plugin-composer-default": "10.2.27", + "nodebb-plugin-composer-default": "10.2.28", "nodebb-plugin-dbsearch": "6.2.2", "nodebb-plugin-emoji": "5.1.13", "nodebb-plugin-emoji-android": "4.0.0", From 245e5df38574af2499f223799404bc65e06ae174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 8 Dec 2023 13:54:57 -0500 Subject: [PATCH 6/6] chore: up composer --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 300f0c3853..14de04da6f 100644 --- a/install/package.json +++ b/install/package.json @@ -93,7 +93,7 @@ "multiparty": "4.2.3", "nconf": "0.12.1", "nodebb-plugin-2factor": "7.4.0", - "nodebb-plugin-composer-default": "10.2.28", + "nodebb-plugin-composer-default": "10.2.29", "nodebb-plugin-dbsearch": "6.2.2", "nodebb-plugin-emoji": "5.1.13", "nodebb-plugin-emoji-android": "4.0.0",