mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-12-25 01:40:27 +01:00
Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7e2a2f488 | ||
|
|
245e5df385 | ||
|
|
c1f82b78a8 | ||
|
|
c434262e21 | ||
|
|
17cd19c701 | ||
|
|
e2e85053a6 | ||
|
|
f31faa457d | ||
|
|
6790000d1a | ||
|
|
a9ef58a5e8 | ||
|
|
49013f813f | ||
|
|
48f7ae9999 | ||
|
|
94dfb3adcc | ||
|
|
dcb0c4dbb0 | ||
|
|
21e5953888 | ||
|
|
46f6f9eff0 | ||
|
|
1f8007476c | ||
|
|
668a355afe | ||
|
|
b1b3dcb660 | ||
|
|
5d7c10f128 |
369
CHANGELOG.md
369
CHANGELOG.md
@@ -1,3 +1,372 @@
|
||||
#### 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
|
||||
|
||||
* up mentions (b1b3dcb6)
|
||||
* incrementing version number - v3.5.0 (d06fb4f0)
|
||||
* update changelog for v3.5.0 (5d7c10f1)
|
||||
* 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)
|
||||
|
||||
##### New Features
|
||||
|
||||
* closes #12123, allow setting hh:mm for pin expiry (1f800747)
|
||||
|
||||
##### Bug Fixes
|
||||
|
||||
* update ajaxifyTimer logic to only drop the request if the URL is the same as the one it's already processing (dcb0c4db)
|
||||
* closes #12156, missing data for privilege tables (21e59538)
|
||||
* thumb width (46f6f9ef)
|
||||
* closes #12126, fix language keys (668a355a)
|
||||
|
||||
#### v3.5.0 (2023-10-25)
|
||||
|
||||
##### Chores
|
||||
|
||||
* up persona (8428cc8d)
|
||||
* up harmony (bd9eebd7)
|
||||
* up harmony (574f95f5)
|
||||
* up harmony (2c996606)
|
||||
* up harmony (f619696b)
|
||||
* up harmony (0d2e0752)
|
||||
* up persona (75170693)
|
||||
* up themes (36fe90dd)
|
||||
* up themes (4d6a6ff5)
|
||||
* up rewards (35d9a78d)
|
||||
* up harmony (e09b0332)
|
||||
* up harmony (ad72f653)
|
||||
* up persona (215ac672)
|
||||
* up harmony (560403a9)
|
||||
* up harmony (a5a33db7)
|
||||
* up harmony (732af96f)
|
||||
* up harmony (2af856d8)
|
||||
* up harmony (05a9dd4e)
|
||||
* up harmony (15a0a196)
|
||||
* up deps for lang key change (96c9ccc4)
|
||||
* up harmony (cddfdae0)
|
||||
* up harmony (90692d95)
|
||||
* up harmony (7e75cfaf)
|
||||
* up harmony (a5c1b2a0)
|
||||
* up harmony (3a108cab)
|
||||
* up persona (cc5e9d9c)
|
||||
* up harmony (769f879e)
|
||||
* up themes (46530337)
|
||||
* incrementing version number - v3.4.3 (5c984250)
|
||||
* update changelog for v3.4.3 (08949be9)
|
||||
* up themes (e0b29ba9)
|
||||
* up emoji (00dd0cb3)
|
||||
* up emoji (86de8cb2)
|
||||
* up emoji (5081ff48)
|
||||
* up emoji (805aaa5e)
|
||||
* up emoji (7568be3c)
|
||||
* up themes (b7d8fd1e)
|
||||
* up themes (d0682905)
|
||||
* incrementing version number - v3.4.2 (3f0dac38)
|
||||
* up deps (f1021542)
|
||||
* up composer (45b9803a)
|
||||
* up composer (7e5d9b71)
|
||||
* up harmony (13ea14f1)
|
||||
* up engines (0f9f875b)
|
||||
* incrementing version number - v3.4.1 (01e69574)
|
||||
* up dbsearch (b4775b18)
|
||||
* 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)
|
||||
* **deps:**
|
||||
* update actions/setup-node action to v4 (#12114) (762ad161)
|
||||
* update dependency eslint-plugin-import to v2.29.0 (#12112) (2ae031ed)
|
||||
* update redis docker tag to v7.2.2 (#12097) (bb812937)
|
||||
* update dependency eslint to v8.52.0 (#12106) (8acdd355)
|
||||
* update commitlint monorepo to v17.8.1 (#12104) (022e2a10)
|
||||
* update dependency lint-staged to v15.0.2 (#12099) (8549d7de)
|
||||
* update dependency sass-embedded to v1.69.4 (#12093) (f5f1679c)
|
||||
* update dependency lint-staged to v15 (#12086) (d1cd625d)
|
||||
* update commitlint monorepo to v17.8.0 (#12084) (225acb2e)
|
||||
* update dependency sass-embedded to v1.69.2 (#12073) (9967ae6b)
|
||||
* update dependency sass-embedded to v1.69.1 (#12071) (7fe72085)
|
||||
* update dependency eslint to v8.51.0 (#12063) (6c01148e)
|
||||
* update dependency @commitlint/cli to v17.7.2 (#12047) (d10a09a0)
|
||||
* update dependency eslint to v8.50.0 (#12029) (65051066)
|
||||
* update postgres docker tag to v16 (#12012) (6fa6f73b)
|
||||
* update actions/checkout action to v4 (#11978) (b4233366)
|
||||
* update docker/build-push-action action to v5 (#11997) (4ecfe40e)
|
||||
* update docker/login-action action to v3 (#11998) (478f7c74)
|
||||
* update docker/metadata-action action to v5 (#11999) (21b280d2)
|
||||
* update docker/setup-buildx-action action to v3 (#12000) (95f7112a)
|
||||
* update docker/setup-qemu-action action to v3 (#12001) (f286d7fa)
|
||||
* update dependency sass-embedded to v1.67.0 (#12003) (b9d04e2f)
|
||||
* update dependency eslint to v8.49.0 (#11993) (ceed4327)
|
||||
* update coverallsapp/github-action action to v2.2.3 (#11988) (a473b515)
|
||||
* update redis docker tag to v7.2.1 (#11987) (0b231fd3)
|
||||
* **i18n:**
|
||||
* fallback strings for new resources: nodebb.admin-extend-widgets (990bbd8c)
|
||||
* fallback strings for new resources: nodebb.admin-manage-privileges (3cb6881c)
|
||||
* fallback strings for new resources: nodebb.themes-harmony (67fec93d)
|
||||
* fallback strings for new resources: nodebb.notifications (ed77a0b1)
|
||||
* fallback strings for new resources: nodebb.admin-advanced-database (b517645f)
|
||||
* fallback strings for new resources: nodebb.error, nodebb.flags (19cfd89f)
|
||||
* fallback strings for new resources: nodebb.admin-extend-widgets (8b5f0334)
|
||||
* fallback strings for new resources: nodebb.email (fc8a6b31)
|
||||
* fallback strings for new resources: nodebb.admin-settings-post (8cb2c270)
|
||||
* fallback strings for new resources: nodebb.email, nodebb.notifications (a71378cb)
|
||||
* fallback strings for new resources: nodebb.topic (8df56d60)
|
||||
* fallback strings for new resources: nodebb.notifications, nodebb.pages, nodebb.tags, nodebb.user (2627e974)
|
||||
* fallback strings for new resources: nodebb.modules (ec3ab986)
|
||||
* fallback strings for new resources: nodebb.admin-settings-chat (968ee0c7)
|
||||
|
||||
##### New Features
|
||||
|
||||
* show # of widgets on templates (2ca5192b)
|
||||
* #12101, dont return rssFeedUrl if feeds are disabled (2955fdb5)
|
||||
* add sidebar setting lang key (97a86ba4)
|
||||
* award notif filter (9e9046bf)
|
||||
* update to mongodb 6.1 (#12087) (e542b27d)
|
||||
* add category canonical url (f96b0b7a)
|
||||
* update error handler to check for pseudo-standard no-* prefix and route to 404 handler instead (db5b0f47)
|
||||
* flag rescinding logic + api method (e012edea)
|
||||
* backend methods for rescinding a report, supplemental adds and removing a report now adds to the flag history (bc0f362c)
|
||||
* use homePageTitle in breadcrumbs if its set (1a745201)
|
||||
* 3 column layout for widgets (db9279eb)
|
||||
* update all language keys to use - instead of _ (#12059) (844cb91b)
|
||||
* closes #12052, ability to disable stale topic warning (f8a3aceb)
|
||||
* add .has() method in cache/ttl lib (d478de16)
|
||||
* upgrade chartjs to 4.x (fe192b92)
|
||||
* closes #11553, add forked from message like merged into (be14f6cc)
|
||||
* add workerpool for password, closes #10326 (#12038) (8b25aff7)
|
||||
* add new hook action:chat.onMessagesAddedToDom (a7517d88)
|
||||
* add composerActions for chat rooms (d906097a)
|
||||
* add heading strings (8c977f4c)
|
||||
* introduce new ACP setting for newbie chat message delay, defaults to 2 minutes (223e7656)
|
||||
|
||||
##### Bug Fixes
|
||||
|
||||
* **deps:**
|
||||
* update dependency cron to v3.1.4 (#12117) (3e45788f)
|
||||
* update dependency ace-builds to v1.31.0 (#12113) (aba7eb0f)
|
||||
* update dependency nconf to v0.12.1 (#12111) (91d00979)
|
||||
* update dependency @fontsource/inter to v5.0.15 (#12108) (99c3c874)
|
||||
* update dependency nodemailer to v6.9.7 (#12109) (e546adaa)
|
||||
* update dependency mongodb to v6.2.0 (#11965) (7302e769)
|
||||
* update dependency @fontsource/inter to v5.0.14 (#12103) (c9c6175a)
|
||||
* update dependency cron to v3.1.3 (#12100) (bad9198e)
|
||||
* update dependency sass to v1.69.4 (#12094) (2adc96c2)
|
||||
* update dependency esbuild to v0.19.5 (#12091) (94434125)
|
||||
* update dependency webpack-merge to v5.10.0 (#12088) (d45f506f)
|
||||
* update dependency webpack to v5.89.0 (#12083) (1ebdfaea)
|
||||
* update dependency connect-mongo to v5.1.0 (#12085) (212a3415)
|
||||
* update dependency ace-builds to v1.30.0 (#12082) (8456682c)
|
||||
* update dependency cron to v3.1.1 (#12078) (24d6b73f)
|
||||
* update dependency commander to v11.1.0 (#12079) (7d38e9ed)
|
||||
* update dependency sass to v1.69.3 (#12076) (193e54e2)
|
||||
* update dependency workerpool to v6.5.1 (#12077) (14eede15)
|
||||
* update dependency sass to v1.69.2 (#12074) (0dd4cedf)
|
||||
* update dependency nodemailer to v6.9.6 (#12068) (6c59d72a)
|
||||
* update dependency winston to v3.11.0 (#12064) (fdf279a3)
|
||||
* update dependency cron to v3 (#12049) (f2fad2d3)
|
||||
* update dependency @fontsource/inter to v5.0.13 (#12065) (512ac525)
|
||||
* update dependency ace-builds to v1.29.0 (#12067) (b04fbf89)
|
||||
* update dependency sass to v1.69.1 (#12070) (a5d2871c)
|
||||
* update dependency @fontsource/inter to v5.0.12 (#12053) (1033218c)
|
||||
* update dependency sass to v1.69.0 (#12060) (ecb847fc)
|
||||
* update dependency nodebb-plugin-2factor to v7.4.0 (6c5c1afd)
|
||||
* update dependency nodebb-plugin-ntfy to v1.7.3 (98e58252)
|
||||
* update dependency postcss to v8.4.31 (#12048) (eaa7aff3)
|
||||
* update dependency esbuild to v0.19.4 (#12046) (4289230f)
|
||||
* update dependency rimraf to v5.0.5 (#12036) (3549fbdd)
|
||||
* update dependency nodebb-theme-persona to v13.2.34 (#12043) (339481ca)
|
||||
* update dependency nodebb-plugin-spam-be-gone to v2.2.0 (#12039) (84648db2)
|
||||
* update dependency cron to v2.4.4 (#12033) (c1f873b3)
|
||||
* update dependency ace-builds to v1.28.0 (#12028) (3262923a)
|
||||
* update dependency nodebb-plugin-2factor to v7.3.1 (#12026) (d29ea026)
|
||||
* update dependency nodebb-plugin-ntfy to v1.7.2 (#12024) (360d3257)
|
||||
* update dependency sass to v1.68.0 (#12023) (be600a84)
|
||||
* update dependency autoprefixer to v10.4.16 (#12022) (f6b6e6c7)
|
||||
* update dependency nodebb-plugin-2factor to v7.3.0 (#12021) (639fb33f)
|
||||
* update dependency bootswatch to v5.3.2 (#12020) (5dc368a9)
|
||||
* update dependency ace-builds to v1.27.0 (#12019) (f73ed6dd)
|
||||
* update dependency nodebb-plugin-emoji to v5.1.10 (#12018) (16fe4fde)
|
||||
* update dependency sharp to v0.32.6 (#12016) (f838498b)
|
||||
* update dependency postcss to v8.4.30 (#12015) (7dbc6668)
|
||||
* update dependency rtlcss to v4.1.1 (#12014) (ba894a04)
|
||||
* update dependency nodebb-plugin-ntfy to v1.7.1 (#12011) (4e834a2e)
|
||||
* update dependency ace-builds to v1.26.0 (#12010) (5a003acb)
|
||||
* update dependency mongodb to v5.9.0 (#12008) (5bfcd34c)
|
||||
* update dependency cropperjs to v1.6.1 (#12013) (9f5362c8)
|
||||
* update dependency ace-builds to v1.25.1 (#12006) (1558d7a2)
|
||||
* update dependency bootstrap to v5.3.2 (#12005) (44d120df)
|
||||
* update dependency esbuild to v0.19.3 (#12002) (ef41b8bc)
|
||||
* update dependency sass to v1.67.0 (#12004) (d2e49472)
|
||||
* update dependency ace-builds to v1.24.2 (#11991) (447b7954)
|
||||
* closes #12115 , toggle hasmore as well (728d63f9)
|
||||
* #10276, only move widgets if area doesn't exist (1739f5a9)
|
||||
* #12090, dont award disabled rewards (c1ae879d)
|
||||
* rewards fixes (347a43f4)
|
||||
* use template name instead of component (f6120ebb)
|
||||
* incorrect data passed to api.flags.get (cc8fe435)
|
||||
* missing body classes on error pages (54a810dd)
|
||||
* edit notification key (bda37ac2)
|
||||
* lang key (bffa7880)
|
||||
* #12062, relax blockquote selector (99bdad80)
|
||||
* allowing forward slash in language keys, temporarily allowing upper case characters (d25a24fc)
|
||||
* rename filter-perPage to filter-per-page (872ddc26)
|
||||
* upgrade script date (6f5a965a)
|
||||
* add upgrade script for notifications (6c3ff86b)
|
||||
* lang key, type has _, lang keys changed to use - (1072b38b)
|
||||
* #12017, unreliable forum updated messaging (715bdac3)
|
||||
* #12057, allow gmods to change user email (344ece8d)
|
||||
* only show emailChanged alert for self (56794cf8)
|
||||
* closes #12054 handle negative start/stop in psql (0f4e6648)
|
||||
* make socket errors and static hook errors less noisy (2a1be01a)
|
||||
* restore notificationSendDelay back to 60 (5fe1ad95)
|
||||
* breaking tests (857433d1)
|
||||
* #12044, only load notifications when opening dropdown (dbd0a715)
|
||||
* change `notificationSendDelay` to default to 10 seconds instead of 60, #11445 (cf50b0fe)
|
||||
* clear interstitial data if there are no additional interstitials on abort (bdc221eb)
|
||||
* #11808, reduce zeal of middleware.registrationComplete (74902e4a)
|
||||
* pass in missing uid (d50473df)
|
||||
* #12025, validity checking on user-provided toPid value (fe42fd4e)
|
||||
* #12032, truncate long category names (b518e036)
|
||||
* field name importance (8041f4d1)
|
||||
* closes #12007, parseInt notification fields (b8e43143)
|
||||
* on shutdown clear locks (615b2f0f)
|
||||
* remaining text, when sending with send button (6553e454)
|
||||
* nodebb/nodebb-plugin-link-preview#18, remove sup from allowedTags, add source + source attributes (f09f4105)
|
||||
* use isPrivileged instead of isAdmin (b9c3cdb6)
|
||||
* failing test due to increased chat message delay (ff07fc44)
|
||||
* better labels in ACP chat settings, #11983 (88dd21e2)
|
||||
* bump chat message delay by 10x to 2000ms, re: #11983 (9b0b33cc)
|
||||
* #11981, post immediately when canceling scheduling (aa797f23)
|
||||
* **i18n:**
|
||||
* added rewards resource and fallbacks (47910d70)
|
||||
* fallbacks for new language keys (2b3d2055)
|
||||
* push fallbacks for modules resource (9b384b98)
|
||||
|
||||
##### Other Changes
|
||||
|
||||
* fix quotes (b8705380)
|
||||
* fix lint (3b46ad42)
|
||||
|
||||
##### Performance Improvements
|
||||
|
||||
* no need to count on every call (130815c7)
|
||||
|
||||
##### Refactors
|
||||
|
||||
* get rid of util.promisify on async function (b1ff93f8)
|
||||
* fix comment (ff6bfeb8)
|
||||
* get rid of async.series (c7c6e8ff)
|
||||
* shorter timeago (6149252b)
|
||||
* shorter code for pinned topics (ff952e59)
|
||||
* change private message email subject (f9fb3c3a)
|
||||
* use helpers.isAllowedTo (47c16e90)
|
||||
* add email notification delay to chat message notifications (a47b4805)
|
||||
* remove chat message notification queue, implement merge IDs for chat message notifications, so they can be grouped together (3ba371f6)
|
||||
* update buildCategoryLabel (82ea9192)
|
||||
* use esm only import used chart types/plugins (56b31674)
|
||||
* get rid of exists db call, use promise.parallel (8895b152)
|
||||
* get rid of some async.waterfall/series/parallel calls (e452c097)
|
||||
* get rid of async.waterfall/series (8bc2ef22)
|
||||
* reduce socket.emits for typing (4d1b8e76)
|
||||
|
||||
##### Tests
|
||||
|
||||
* add spec for new notif type (90e10b9c)
|
||||
* worked with chatgpt to restrict the i18n test a bit to match requirements (99364427)
|
||||
* fix flag tests (6606d96a)
|
||||
* added test cases for .addReport and .rescindReport() (da239059)
|
||||
* added i18n test to enforce kebab casing (69dde2b9)
|
||||
* add reverse list test (66be9826)
|
||||
* additional tests for #12034 (d7e9f324)
|
||||
* added tests for new logic paths (toPid validation on post creation) (ce740301)
|
||||
* 💥 i18n tests (8202c555)
|
||||
|
||||
#### v3.4.3 (2023-09-27)
|
||||
|
||||
##### Chores
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "nodebb",
|
||||
"license": "GPL-3.0",
|
||||
"description": "NodeBB Forum",
|
||||
"version": "3.5.0",
|
||||
"version": "3.5.3",
|
||||
"homepage": "https://www.nodebb.org",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -93,16 +93,16 @@
|
||||
"multiparty": "4.2.3",
|
||||
"nconf": "0.12.1",
|
||||
"nodebb-plugin-2factor": "7.4.0",
|
||||
"nodebb-plugin-composer-default": "10.2.24",
|
||||
"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",
|
||||
"nodebb-plugin-markdown": "12.2.5",
|
||||
"nodebb-plugin-mentions": "4.3.6",
|
||||
"nodebb-plugin-mentions": "4.3.7",
|
||||
"nodebb-plugin-ntfy": "1.7.3",
|
||||
"nodebb-plugin-spam-be-gone": "2.2.0",
|
||||
"nodebb-rewards-essentials": "1.0.0",
|
||||
"nodebb-theme-harmony": "1.1.90",
|
||||
"nodebb-theme-harmony": "1.1.91",
|
||||
"nodebb-theme-lavender": "7.1.5",
|
||||
"nodebb-theme-peace": "2.1.23",
|
||||
"nodebb-theme-persona": "13.2.42",
|
||||
|
||||
@@ -413,8 +413,10 @@ define('admin/manage/privileges', [
|
||||
return cb();
|
||||
}
|
||||
// Generate data for new row
|
||||
const privilegeSet = ajaxify.data.privileges.keys.groups.reduce(function (memo, cur) {
|
||||
const typesMap = {};
|
||||
const privilegeSet = ajaxify.data.privileges.keys.groups.reduce(function (memo, cur, index) {
|
||||
memo[cur] = false;
|
||||
typesMap[cur] = ajaxify.data.privileges.labelData[index].type;
|
||||
return memo;
|
||||
}, {});
|
||||
|
||||
@@ -425,6 +427,7 @@ define('admin/manage/privileges', [
|
||||
name: group,
|
||||
nameEscaped: translator.escape(group),
|
||||
privileges: privilegeSet,
|
||||
types: typesMap,
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -434,7 +437,9 @@ define('admin/manage/privileges', [
|
||||
tbodyEl.append(html.get(0));
|
||||
Privileges.exposeAssumedPrivileges();
|
||||
hightlightRowByDataAttr('data-group-name', group);
|
||||
document.querySelector('.privilege-filters').querySelectorAll('button')[btnIdx].click();
|
||||
if (btnIdx >= 0) {
|
||||
document.querySelector('.privilege-filters').querySelectorAll('button')[btnIdx].click();
|
||||
}
|
||||
cb();
|
||||
});
|
||||
}
|
||||
@@ -447,8 +452,10 @@ define('admin/manage/privileges', [
|
||||
return cb();
|
||||
}
|
||||
// Generate data for new row
|
||||
const privilegeSet = ajaxify.data.privileges.keys.users.reduce(function (memo, cur) {
|
||||
const typesMap = {};
|
||||
const privilegeSet = ajaxify.data.privileges.keys.users.reduce(function (memo, cur, index) {
|
||||
memo[cur] = false;
|
||||
typesMap[cur] = ajaxify.data.privileges.labelData[index].type;
|
||||
return memo;
|
||||
}, {});
|
||||
|
||||
@@ -463,6 +470,7 @@ define('admin/manage/privileges', [
|
||||
'icon:text': user['icon:text'],
|
||||
'icon:bgColor': user['icon:bgColor'],
|
||||
privileges: privilegeSet,
|
||||
types: typesMap,
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -473,7 +481,9 @@ define('admin/manage/privileges', [
|
||||
tbodyEl[1].append(html.get(0));
|
||||
Privileges.exposeAssumedPrivileges();
|
||||
hightlightRowByDataAttr('data-uid', user.uid);
|
||||
document.querySelectorAll('.privilege-filters')[1].querySelectorAll('button')[btnIdx].click();
|
||||
if (btnIdx >= 0) {
|
||||
document.querySelectorAll('.privilege-filters')[1].querySelectorAll('button')[btnIdx].click();
|
||||
}
|
||||
cb();
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ ajaxify.widgets = { render: render };
|
||||
|
||||
ajaxify.count = 0;
|
||||
ajaxify.currentPage = null;
|
||||
ajaxify.requestedPage = null;
|
||||
// disables scroll to top when back button is clicked
|
||||
// https://developer.chrome.com/blog/history-api-scroll-restoration/
|
||||
if ('scrollRestoration' in history) {
|
||||
@@ -38,10 +39,11 @@ ajaxify.widgets = { render: render };
|
||||
}
|
||||
|
||||
// Abort subsequent requests if clicked multiple times within a short window of time
|
||||
if (ajaxifyTimer && (Date.now() - ajaxifyTimer) < 500) {
|
||||
if (ajaxify.requestedPage === url && ajaxifyTimer && (Date.now() - ajaxifyTimer) < 500) {
|
||||
return true;
|
||||
}
|
||||
ajaxifyTimer = Date.now();
|
||||
ajaxify.requestedPage = url;
|
||||
|
||||
if (ajaxify.handleRedirects(url)) {
|
||||
return true;
|
||||
@@ -134,6 +136,7 @@ ajaxify.widgets = { render: render };
|
||||
|
||||
ajaxify.updateHistory = function (url, quiet) {
|
||||
ajaxify.currentPage = url.split(/[?#]/)[0];
|
||||
ajaxify.requestedPage = null;
|
||||
if (window.history && window.history.pushState) {
|
||||
window.history[!quiet ? 'pushState' : 'replaceState']({
|
||||
url: url,
|
||||
|
||||
@@ -257,7 +257,6 @@ define('forum/topic/threadTools', [
|
||||
title: '[[topic:thread-tools.pin]]',
|
||||
message: html,
|
||||
onEscape: true,
|
||||
size: 'small',
|
||||
buttons: {
|
||||
cancel: {
|
||||
label: '[[modules:bootbox.cancel]]',
|
||||
@@ -267,19 +266,19 @@ define('forum/topic/threadTools', [
|
||||
label: '[[global:save]]',
|
||||
className: 'btn-primary',
|
||||
callback: function () {
|
||||
const expiryEl = modal.get(0).querySelector('#expiry');
|
||||
let expiry = expiryEl.value;
|
||||
|
||||
const expiryDateEl = modal.get(0).querySelector('#expiry-date');
|
||||
const expiryTimeEl = modal.get(0).querySelector('#expiry-time');
|
||||
let expiryDate = expiryDateEl.value;
|
||||
let expiryTime = expiryTimeEl.value;
|
||||
// No expiry set
|
||||
if (expiry === '') {
|
||||
if (expiryDate === '' && expiryTime === '') {
|
||||
return onSuccess();
|
||||
}
|
||||
|
||||
// Expiration date set
|
||||
expiry = new Date(expiry);
|
||||
|
||||
if (expiry && expiry.getTime() > Date.now()) {
|
||||
body.expiry = expiry.getTime();
|
||||
expiryDate = expiryDate || new Date().toDateString();
|
||||
expiryTime = expiryTime || new Date().toTimeString();
|
||||
const date = new Date(`${expiryDate} ${expiryTime}`);
|
||||
if (date.getTime() > Date.now()) {
|
||||
body.expiry = date.getTime();
|
||||
onSuccess();
|
||||
} else {
|
||||
alerts.error('[[error:invalid-date]]');
|
||||
|
||||
@@ -343,8 +343,11 @@ module.exports = function (utils, Benchpress, relative_path) {
|
||||
return `[[topic:wrote-${langSuffix}, ${relative_path}/post/${post.pid}, ${post.timestampISO}]]`;
|
||||
}
|
||||
|
||||
function isoTimeToLocaleString(isoTime) {
|
||||
return new Date(isoTime).toLocaleString().replace(/,/g, ',');
|
||||
function isoTimeToLocaleString(isoTime, locale = 'en-GB') {
|
||||
return new Date(isoTime).toLocaleString([locale], {
|
||||
dateStyle: 'short',
|
||||
timeStyle: 'short',
|
||||
}).replace(/,/g, ',');
|
||||
}
|
||||
|
||||
function shouldHideReplyContainer(post) {
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
'use strict';
|
||||
|
||||
const util = require('util');
|
||||
const path = require('path');
|
||||
const fs = require('fs').promises;
|
||||
|
||||
@@ -330,10 +329,6 @@ usersAPI.deleteToken = async (caller, { uid, token }) => {
|
||||
return true;
|
||||
};
|
||||
|
||||
const getSessionAsync = util.promisify((sid, callback) => {
|
||||
db.sessionStore.get(sid, (err, sessionObj) => callback(err, sessionObj || null));
|
||||
});
|
||||
|
||||
usersAPI.revokeSession = async (caller, { uid, uuid }) => {
|
||||
// Only admins or global mods (besides the user themselves) can revoke sessions
|
||||
if (parseInt(uid, 10) !== caller.uid && !await user.isAdminOrGlobalMod(caller.uid)) {
|
||||
@@ -344,7 +339,7 @@ usersAPI.revokeSession = async (caller, { uid, uuid }) => {
|
||||
let _id;
|
||||
for (const sid of sids) {
|
||||
/* eslint-disable no-await-in-loop */
|
||||
const sessionObj = await getSessionAsync(sid);
|
||||
const sessionObj = await db.sessionStoreGet(sid);
|
||||
if (sessionObj && sessionObj.meta && sessionObj.meta.uuid === uuid) {
|
||||
_id = sid;
|
||||
break;
|
||||
|
||||
@@ -77,6 +77,7 @@ let winston;
|
||||
async function init() {
|
||||
db = require('../database');
|
||||
await db.init();
|
||||
await db.initSessionStore();
|
||||
|
||||
user = require('../user');
|
||||
groups = require('../groups');
|
||||
|
||||
@@ -49,7 +49,7 @@ settingsController.user = async (req, res) => {
|
||||
const notificationTypes = await notifications.getAllNotificationTypes();
|
||||
const notificationSettings = notificationTypes.map(type => ({
|
||||
name: type,
|
||||
label: `[[notifications:${type}]]`,
|
||||
label: `[[notifications:${type.replace(/_/g, '-')}]]`,
|
||||
}));
|
||||
res.render('admin/settings/user', {
|
||||
title: '[[admin/menu:settings/user]]',
|
||||
|
||||
@@ -34,4 +34,26 @@ primaryDB.initSessionStore = async function () {
|
||||
primaryDB.sessionStore = await sessionStoreDB.createSessionStore(sessionStoreConfig);
|
||||
};
|
||||
|
||||
function promisifySessionStoreMethod(method, sid) {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!primaryDB.sessionStore) {
|
||||
resolve(method === 'get' ? null : undefined);
|
||||
return;
|
||||
}
|
||||
|
||||
primaryDB.sessionStore[method](sid, (err, result) => {
|
||||
if (err) reject(err);
|
||||
else resolve(method === 'get' ? result || null : undefined);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
primaryDB.sessionStoreGet = function (sid) {
|
||||
return promisifySessionStoreMethod('get', sid);
|
||||
};
|
||||
|
||||
primaryDB.sessionStoreDestroy = function (sid) {
|
||||
return promisifySessionStoreMethod('destroy', sid);
|
||||
};
|
||||
|
||||
module.exports = primaryDB;
|
||||
|
||||
@@ -241,10 +241,6 @@ async function checkMaintenance(socket) {
|
||||
throw new Error(`[[pages:maintenance.text, ${validator.escape(String(meta.config.title || 'NodeBB'))}]]`);
|
||||
}
|
||||
|
||||
const getSessionAsync = util.promisify(
|
||||
(sid, callback) => db.sessionStore.get(sid, (err, sessionObj) => callback(err, sessionObj || null))
|
||||
);
|
||||
|
||||
async function validateSession(socket, errorMsg) {
|
||||
const req = socket.request;
|
||||
const { sessionId } = await plugins.hooks.fire('filter:sockets.sessionId', {
|
||||
@@ -256,7 +252,7 @@ async function validateSession(socket, errorMsg) {
|
||||
return;
|
||||
}
|
||||
|
||||
const sessionData = await getSessionAsync(sessionId);
|
||||
const sessionData = await db.sessionStoreGet(sessionId);
|
||||
if (!sessionData) {
|
||||
throw new Error(errorMsg);
|
||||
}
|
||||
@@ -282,7 +278,7 @@ async function authorize(request, callback) {
|
||||
request: request,
|
||||
});
|
||||
|
||||
const sessionData = await getSessionAsync(sessionId);
|
||||
const sessionData = await db.sessionStoreGet(sessionId);
|
||||
request.session = sessionData;
|
||||
let uid = 0;
|
||||
if (sessionData && sessionData.passport && sessionData.passport.user) {
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
const winston = require('winston');
|
||||
const validator = require('validator');
|
||||
const util = require('util');
|
||||
const _ = require('lodash');
|
||||
const db = require('../database');
|
||||
const meta = require('../meta');
|
||||
@@ -62,17 +61,10 @@ module.exports = function (User) {
|
||||
]);
|
||||
};
|
||||
|
||||
const getSessionFromStore = util.promisify(
|
||||
(sid, callback) => db.sessionStore.get(sid, (err, sessObj) => callback(err, sessObj || null))
|
||||
);
|
||||
const sessionStoreDestroy = util.promisify(
|
||||
(sid, callback) => db.sessionStore.destroy(sid, err => callback(err))
|
||||
);
|
||||
|
||||
User.auth.getSessions = async function (uid, curSessionId) {
|
||||
await cleanExpiredSessions(uid);
|
||||
const sids = await db.getSortedSetRevRange(`uid:${uid}:sessions`, 0, 19);
|
||||
let sessions = await Promise.all(sids.map(sid => getSessionFromStore(sid)));
|
||||
let sessions = await Promise.all(sids.map(sid => db.sessionStoreGet(sid)));
|
||||
sessions = sessions.map((sessObj, idx) => {
|
||||
if (sessObj && sessObj.meta) {
|
||||
sessObj.meta.current = curSessionId === sids[idx];
|
||||
@@ -93,7 +85,7 @@ module.exports = function (User) {
|
||||
const expiredSids = [];
|
||||
await Promise.all(Object.keys(uuidMapping).map(async (uuid) => {
|
||||
const sid = uuidMapping[uuid];
|
||||
const sessionObj = await getSessionFromStore(sid);
|
||||
const sessionObj = await db.sessionStoreGet(sid);
|
||||
const expired = !sessionObj || !sessionObj.hasOwnProperty('passport') ||
|
||||
!sessionObj.passport.hasOwnProperty('user') ||
|
||||
parseInt(sessionObj.passport.user, 10) !== parseInt(uid, 10);
|
||||
@@ -128,13 +120,13 @@ module.exports = function (User) {
|
||||
|
||||
User.auth.revokeSession = async function (sessionId, uid) {
|
||||
winston.verbose(`[user.auth] Revoking session ${sessionId} for user ${uid}`);
|
||||
const sessionObj = await getSessionFromStore(sessionId);
|
||||
const sessionObj = await db.sessionStoreGet(sessionId);
|
||||
if (sessionObj && sessionObj.meta && sessionObj.meta.uuid) {
|
||||
await db.deleteObjectField(`uid:${uid}:sessionUUID:sessionId`, sessionObj.meta.uuid);
|
||||
}
|
||||
await Promise.all([
|
||||
db.sortedSetRemove(`uid:${uid}:sessions`, sessionId),
|
||||
sessionStoreDestroy(sessionId),
|
||||
db.sessionStoreDestroy(sessionId),
|
||||
]);
|
||||
};
|
||||
|
||||
@@ -159,7 +151,7 @@ module.exports = function (User) {
|
||||
|
||||
await Promise.all([
|
||||
db.deleteAll(sessionKeys.concat(sessionUUIDKeys)),
|
||||
...sids.map(sid => sessionStoreDestroy(sid)),
|
||||
...sids.map(sid => db.sessionStoreDestroy(sid)),
|
||||
]);
|
||||
}, { batch: 1000 });
|
||||
};
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="expiry">[[topic:pin-modal-expiry]]</label>
|
||||
<input id="expiry" type="date" class="form-control" />
|
||||
<div class="d-flex gap-1">
|
||||
<input id="expiry-date" type="date" class="form-control" />
|
||||
<input id="expiry-time" type="time" class="form-control" />
|
||||
</div>
|
||||
<p class="form-text">[[topic:pin-modal-help]]</p>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<div class="d-flex flex-column gap-4 topic-thumbs-view-modal">
|
||||
<div class="d-flex justify-content-center align-items-center mb-5" style="height: 33vh; max-height: 33vh;">
|
||||
<img component="topic/thumb/current" src="{src}" style="max-height: 33vh;" />
|
||||
<img component="topic/thumb/current" src="{src}" style="max-height: 33vh; max-width:100%;" />
|
||||
</div>
|
||||
{{{ if (thumbs.length != "1") }}}
|
||||
<hr/>
|
||||
|
||||
@@ -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'
|
||||
|
||||
56
types/database/hash.d.ts
vendored
Normal file
56
types/database/hash.d.ts
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
export interface Hash {
|
||||
decrObjectField(
|
||||
key: string | string[],
|
||||
field: string,
|
||||
): Promise<number | number[]>
|
||||
|
||||
deleteObjectField(key: string, field: string): Promise<void>
|
||||
|
||||
deleteObjectFields(key: string, fields: string[]): Promise<void>
|
||||
|
||||
getObject(key: string, fields: string[]): Promise<object>
|
||||
|
||||
getObjectField(key: string, field: string): Promise<any>
|
||||
|
||||
getObjectFields(key: string, fields: string[]): Promise<Record<string, any>>
|
||||
|
||||
getObjectKeys(key: string): Promise<string[]>
|
||||
|
||||
getObjectValues(key: string): Promise<any[]>
|
||||
|
||||
getObjects(keys: string[], fields: string[]): Promise<any[]>
|
||||
|
||||
getObjectsFields(
|
||||
keys: string[],
|
||||
fields: string[],
|
||||
): Promise<Record<string, any>[]>
|
||||
|
||||
incrObjectField(
|
||||
key: string | string[],
|
||||
field: string,
|
||||
): Promise<number | number[]>
|
||||
|
||||
incrObjectFieldBy(
|
||||
key: string | string[],
|
||||
field: string,
|
||||
value: number,
|
||||
): Promise<number | number[]>
|
||||
|
||||
incrObjectFieldByBulk(
|
||||
data: [key: string, batch: Record<string, number>][],
|
||||
): Promise<void>
|
||||
|
||||
isObjectField(key: string, field: string): Promise<boolean>
|
||||
|
||||
isObjectFields(key: string, fields: string[]): Promise<boolean[]>
|
||||
|
||||
setObject(key: string | string[], data: Record<string, any>): Promise<void>
|
||||
|
||||
setObjectBulk(args: [key: string, data: Record<string, any>][]): Promise<void>
|
||||
|
||||
setObjectField(
|
||||
key: string | string[],
|
||||
field: string,
|
||||
value: any,
|
||||
): Promise<void>
|
||||
}
|
||||
54
types/database/index.d.ts
vendored
Normal file
54
types/database/index.d.ts
vendored
Normal file
@@ -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<void>
|
||||
|
||||
checkCompatibilityVersion(
|
||||
version: string,
|
||||
callback: () => void,
|
||||
): Promise<void>
|
||||
|
||||
close(): Promise<void>
|
||||
|
||||
createIndices(callback: () => void): Promise<void>
|
||||
|
||||
createSessionStore(options: any): Promise<Store>
|
||||
|
||||
emptydb(): Promise<void>
|
||||
|
||||
flushdb(): Promise<void>
|
||||
|
||||
info(db: any): Promise<any>
|
||||
|
||||
init(): Promise<void>
|
||||
}
|
||||
|
||||
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'
|
||||
15
types/database/list.d.ts
vendored
Normal file
15
types/database/list.d.ts
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
export interface List {
|
||||
listPrepend(key: string, value: string): Promise<void>
|
||||
|
||||
listAppend(key: string, value: string): Promise<void>
|
||||
|
||||
listRemoveLast(key: string): Promise<string | null>
|
||||
|
||||
listRemoveAll(key: string, value: string | string[]): Promise<void>
|
||||
|
||||
listTrim(key: string, start: number, stop: number): Promise<void>
|
||||
|
||||
getListRange(key: string, start: number, stop: number): Promise<string[]>
|
||||
|
||||
listLength(key: string): Promise<number>
|
||||
}
|
||||
25
types/database/set.d.ts
vendored
Normal file
25
types/database/set.d.ts
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
export interface Set {
|
||||
getSetMembers(key: string): Promise<string[]>
|
||||
|
||||
getSetsMembers(keys: string[]): Promise<string[][]>
|
||||
|
||||
isMemberOfSets(sets: string[], value: string): Promise<boolean[]>
|
||||
|
||||
isSetMember(key: string, value: string): Promise<boolean>
|
||||
|
||||
isSetMembers(key: string, values: string[]): Promise<boolean[]>
|
||||
|
||||
setAdd(key: string, value: string | string[]): Promise<void>
|
||||
|
||||
setCount(key: string): Promise<number>
|
||||
|
||||
setRemove(key: string | string[], value: string | string[]): Promise<void>
|
||||
|
||||
setRemoveRandom(key: string): Promise<string>
|
||||
|
||||
setsAdd(keys: string[], value: string | string[]): Promise<void>
|
||||
|
||||
setsCount(keys: string[]): Promise<number[]>
|
||||
|
||||
setsRemove(keys: string[], value: string): Promise<void>
|
||||
}
|
||||
35
types/database/string.d.ts
vendored
Normal file
35
types/database/string.d.ts
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
import { ObjectType, RedisStyleMatchString } from './index'
|
||||
|
||||
export interface Item {
|
||||
delete(key: string): Promise<void>
|
||||
|
||||
deleteAll(keys: string[]): Promise<void>
|
||||
|
||||
exists(key: string): Promise<boolean>
|
||||
|
||||
exists(key: string[]): Promise<boolean[]>
|
||||
|
||||
expire(key: string, seconds: number): Promise<void>
|
||||
|
||||
expireAt(key: string, timestampInSeconds: number): Promise<void>
|
||||
|
||||
get(key: string): Promise<string | null>
|
||||
|
||||
increment(key: string): Promise<number>
|
||||
|
||||
pexpire(key: string, ms: number): Promise<void>
|
||||
|
||||
pexpireAt(key: string, timestampInMs: number): Promise<void>
|
||||
|
||||
pttl(key: string): Promise<number>
|
||||
|
||||
rename(oldkey: string, newkey: string): Promise<void>
|
||||
|
||||
scan(params: { match: RedisStyleMatchString }): Promise<string[]>
|
||||
|
||||
set(key: string, value: string): Promise<void>
|
||||
|
||||
ttl(key: string): Promise<number>
|
||||
|
||||
type(key: string): Promise<ObjectType | null>
|
||||
}
|
||||
245
types/database/zset.d.ts
vendored
Normal file
245
types/database/zset.d.ts
vendored
Normal file
@@ -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<ValueAndScore[]>
|
||||
|
||||
getSortedSetIntersect(
|
||||
params: SortedSetTheoryOperation & { withScores?: false },
|
||||
): Promise<string[]>
|
||||
|
||||
getSortedSetMembers(key: string): Promise<string[]>
|
||||
|
||||
getSortedSetMembersWithScores(key: string): Promise<ValueAndScore[]>
|
||||
|
||||
getSortedSetRange(
|
||||
key: string | string[],
|
||||
start: number,
|
||||
stop: number,
|
||||
): Promise<string[]>
|
||||
|
||||
getSortedSetRangeByLex(
|
||||
key: string | string[],
|
||||
min: RedisStyleRangeString | '-',
|
||||
max: RedisStyleRangeString | '+',
|
||||
start?: number,
|
||||
count?: number,
|
||||
): Promise<string[]>
|
||||
|
||||
getSortedSetRangeByScore(
|
||||
key: string | string[],
|
||||
start: number,
|
||||
count: number,
|
||||
min: NumberTowardsMinima,
|
||||
max: NumberTowardsMaxima,
|
||||
): Promise<string[]>
|
||||
|
||||
getSortedSetRangeByScoreWithScores(
|
||||
key: string | string[],
|
||||
start: number,
|
||||
count: number,
|
||||
min: NumberTowardsMinima,
|
||||
max: NumberTowardsMaxima,
|
||||
): Promise<ValueAndScore[]>
|
||||
|
||||
getSortedSetRangeWithScores(
|
||||
key: string | string[],
|
||||
start: number,
|
||||
stop: number,
|
||||
): Promise<ValueAndScore[]>
|
||||
|
||||
getSortedSetRevIntersect(
|
||||
params: SortedSetTheoryOperation & { withScores: true },
|
||||
): Promise<ValueAndScore[]>
|
||||
|
||||
getSortedSetRevIntersect(
|
||||
params: SortedSetTheoryOperation & { withScores?: false },
|
||||
): Promise<string[]>
|
||||
|
||||
getSortedSetRevRange(
|
||||
key: string | string[],
|
||||
start: number,
|
||||
stop: number,
|
||||
): Promise<string[]>
|
||||
|
||||
getSortedSetRevRangeByLex(
|
||||
key: string,
|
||||
max: RedisStyleRangeString | '+',
|
||||
min: RedisStyleRangeString | '-',
|
||||
start?: number,
|
||||
count?: number,
|
||||
): Promise<string[]>
|
||||
|
||||
getSortedSetRevRangeByScore(
|
||||
key: string,
|
||||
start: number,
|
||||
count: number,
|
||||
max: NumberTowardsMaxima | '+',
|
||||
min: NumberTowardsMinima | '-',
|
||||
): Promise<string[]>
|
||||
|
||||
getSortedSetRevRangeByScoreWithScores(
|
||||
key: string,
|
||||
start: number,
|
||||
count: number,
|
||||
max: NumberTowardsMaxima,
|
||||
min: NumberTowardsMinima,
|
||||
): Promise<ValueAndScore[]>
|
||||
|
||||
getSortedSetRevRangeWithScores(
|
||||
key: string,
|
||||
start: number,
|
||||
stop: number,
|
||||
): Promise<ValueAndScore[]>
|
||||
|
||||
getSortedSetRevUnion(
|
||||
params: SortedSetTheoryOperation & { withScores?: false },
|
||||
): Promise<string[]>
|
||||
|
||||
getSortedSetRevUnion(
|
||||
params: SortedSetTheoryOperation & { withScores: true },
|
||||
): Promise<ValueAndScore[]>
|
||||
|
||||
getSortedSetScan(
|
||||
params: SortedSetScanBaseParameters & { withScores: true },
|
||||
): Promise<ValueAndScore[]>
|
||||
|
||||
getSortedSetScan(
|
||||
params: SortedSetScanBaseParameters & { withScores?: false },
|
||||
): Promise<string[]>
|
||||
|
||||
getSortedSetUnion(
|
||||
params: SortedSetTheoryOperation & { withScores: true },
|
||||
): Promise<ValueAndScore[]>
|
||||
|
||||
getSortedSetUnion(
|
||||
params: SortedSetTheoryOperation & { withScores?: false },
|
||||
): Promise<string[]>
|
||||
|
||||
getSortedSetsMembers(keys: string[]): Promise<string[][]>
|
||||
|
||||
getSortedSetsMembersWithScores(keys: string[]): Promise<ValueAndScore[][]>
|
||||
|
||||
isMemberOfSortedSets(keys: string[], value: string): Promise<boolean[]>
|
||||
|
||||
isSortedSetMember(key: string, value: string): Promise<boolean>
|
||||
|
||||
isSortedSetMembers(key: string, values: string[]): Promise<boolean[]>
|
||||
|
||||
processSortedSet(
|
||||
setKey: string,
|
||||
processFn: (ids: number[]) => Promise<void> | void,
|
||||
options: { withScores?: boolean; batch?: number; interval?: number, reverse?: boolean; },
|
||||
): Promise<any>
|
||||
|
||||
sortedSetAdd(key: string, score: number, value: string): Promise<void>
|
||||
|
||||
sortedSetAdd(key: string, score: number[], value: string[]): Promise<void>
|
||||
|
||||
sortedSetAddBulk(
|
||||
args: [key: string, score: number[], value: string[]][],
|
||||
): Promise<void>
|
||||
|
||||
sortedSetCard(key: string): Promise<number>
|
||||
|
||||
sortedSetCount(
|
||||
key: string,
|
||||
min: NumberTowardsMinima,
|
||||
max: NumberTowardsMaxima,
|
||||
): Promise<number>
|
||||
|
||||
sortedSetIncrBy(
|
||||
key: string,
|
||||
increment: number,
|
||||
value: string,
|
||||
): Promise<number>
|
||||
|
||||
sortedSetIncrByBulk(
|
||||
data: [key: string, increment: number, value: string][],
|
||||
): Promise<number[]>
|
||||
|
||||
sortedSetIntersectCard(keys: string[]): Promise<number>
|
||||
|
||||
sortedSetLexCount(
|
||||
key: string,
|
||||
min: RedisStyleRangeString,
|
||||
max: RedisStyleRangeString,
|
||||
): Promise<number>
|
||||
|
||||
sortedSetRank(key: string, value: string): Promise<number | null>
|
||||
|
||||
sortedSetRanks(key: string, values: string[]): Promise<(number | null)[]>
|
||||
|
||||
sortedSetRemove(
|
||||
key: string | string[],
|
||||
value: string | string[],
|
||||
): Promise<void>
|
||||
|
||||
sortedSetRemoveBulk(data: [key: string, member: string][]): Promise<void>
|
||||
|
||||
sortedSetRemoveRangeByLex(
|
||||
key: string,
|
||||
min: RedisStyleRangeString | '-',
|
||||
max: RedisStyleRangeString | '+',
|
||||
): Promise<void>
|
||||
|
||||
sortedSetRevRank(key: string, value: string): Promise<number>
|
||||
|
||||
sortedSetRevRanks(key: string, values: string[]): Promise<number[]>
|
||||
|
||||
sortedSetScore(key: string, value: string): Promise<number | null>
|
||||
|
||||
sortedSetScores(key: string, values: string[]): Promise<number[]>
|
||||
|
||||
sortedSetUnionCard(keys: string[]): Promise<number>
|
||||
|
||||
sortedSetsAdd(
|
||||
keys: string[],
|
||||
scores: number | number[],
|
||||
value: string,
|
||||
): Promise<void>
|
||||
|
||||
sortedSetsCard(keys: string[]): Promise<number[]>
|
||||
|
||||
sortedSetsCardSum(keys: string[]): Promise<number>
|
||||
|
||||
sortedSetsRanks<T extends readonly [] | readonly string[]>(
|
||||
keys: T,
|
||||
values: { [K in keyof T]: string },
|
||||
): Promise<number[]>
|
||||
|
||||
sortedSetsRemove(keys: string[], value: string): Promise<void>
|
||||
|
||||
sortedSetsRemoveRangeByScore(
|
||||
keys: string[],
|
||||
min: NumberTowardsMinima,
|
||||
max: NumberTowardsMaxima,
|
||||
): Promise<void>
|
||||
|
||||
sortedSetsRevRanks(keys: string[], values: string[]): Promise<number[]>
|
||||
|
||||
sortedSetsScore(keys: string[], value: string): Promise<number[]>
|
||||
}
|
||||
Reference in New Issue
Block a user