diff --git a/CHANGELOG.md b/CHANGELOG.md index c92b8c06a1..76abe42e10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,8 @@ -## 2024.11.0 +## 2024.10.2 ### General - Feat: コンテンツの表示にログインを必須にできるように - Feat: 過去のノートを非公開化/フォロワーのみ表示可能にできるように -- Enhance: 依存関係の更新 -- Enhance: l10nの更新 ### Client - Enhance: Bull DashboardでRelationship Queueの状態も確認できるように @@ -27,14 +25,12 @@ - Fix: リンク切れを修正 = Fix: ノート投稿ボタンにホバー時のスタイルが適用されていないのを修正 (Cherry-picked from https://github.com/taiyme/misskey/pull/305) -- Fix: メールアドレス登録有効化時の「完了」ダイアログボックスの表示条件を修正 ### Server - Enhance: 起動前の疎通チェックで、DBとメイン以外のRedisの疎通確認も行うように (Based on https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/588) (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/715) -- Enhance: リモートユーザーの照会をオリジナルにリダイレクトするように -- Fix: フォロワーへのメッセージの絵文字をemojisに含めるように +- fix(backend): フォロワーへのメッセージの絵文字をemojisに含めるように - Fix: Nested proxy requestsを検出した際にブロックするように [ghsa-gq5q-c77c-v236](https://github.com/misskey-dev/misskey/security/advisories/ghsa-gq5q-c77c-v236) - Fix: 招待コードの発行可能な残り数算出に使用すべきロールポリシーの値が違う問題を修正 @@ -45,7 +41,7 @@ (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/712) - Fix: FTT無効時にユーザーリストタイムラインが使用できない問題を修正 (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/709) -- Fix: User Webhookテスト機能のMock Payloadを修正 +- Enhance: リモートユーザーの照会をオリジナルにリダイレクトするように ### Misskey.js - Fix: Stream初期化時、別途WebSocketを指定する場合の型定義を修正 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f8af6b3df0..76a5f42eac 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -85,7 +85,6 @@ Be willing to comment on the good points and not just the things you want fixed 読んでおくといいやつ - https://blog.lacolaco.net/posts/1e2cf439b3c2/ -- https://konifar-zatsu.hatenadiary.jp/entry/2024/11/05/192421 ### Review perspective - Scope diff --git a/package.json b/package.json index 6a44eb04f3..dbdedd4635 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "2024.11.0-alpha.0", + "version": "2024.10.2-alpha.3", "codename": "nasubi", "repository": { "type": "git", diff --git a/packages/backend/src/core/QueueService.ts b/packages/backend/src/core/QueueService.ts index 50f08da241..37028026cc 100644 --- a/packages/backend/src/core/QueueService.ts +++ b/packages/backend/src/core/QueueService.ts @@ -7,7 +7,7 @@ import { randomUUID } from 'node:crypto'; import { Inject, Injectable } from '@nestjs/common'; import type { IActivity } from '@/core/activitypub/type.js'; import type { MiDriveFile } from '@/models/DriveFile.js'; -import type { MiWebhook, WebhookEventTypes, webhookEventTypes } from '@/models/Webhook.js'; +import type { MiWebhook, webhookEventTypes } from '@/models/Webhook.js'; import type { MiSystemWebhook, SystemWebhookEventType } from '@/models/SystemWebhook.js'; import type { Config } from '@/config.js'; import { DI } from '@/di-symbols.js'; @@ -35,7 +35,6 @@ import type { } from './QueueModule.js'; import type httpSignature from '@peertube/http-signature'; import type * as Bull from 'bullmq'; -import { type UserWebhookPayload } from './UserWebhookService.js'; @Injectable() export class QueueService { @@ -469,10 +468,10 @@ export class QueueService { * @see UserWebhookDeliverProcessorService */ @bindThis - public userWebhookDeliver( + public userWebhookDeliver( webhook: MiWebhook, - type: T, - content: UserWebhookPayload, + type: typeof webhookEventTypes[number], + content: unknown, opts?: { attempts?: number }, ) { const data: UserWebhookDeliverJobData = { diff --git a/packages/backend/src/core/UserWebhookService.ts b/packages/backend/src/core/UserWebhookService.ts index 7117a3d7fa..8a40a53688 100644 --- a/packages/backend/src/core/UserWebhookService.ts +++ b/packages/backend/src/core/UserWebhookService.ts @@ -6,23 +6,11 @@ import { Inject, Injectable } from '@nestjs/common'; import * as Redis from 'ioredis'; import { type WebhooksRepository } from '@/models/_.js'; -import { MiWebhook, WebhookEventTypes } from '@/models/Webhook.js'; +import { MiWebhook } from '@/models/Webhook.js'; import { DI } from '@/di-symbols.js'; import { bindThis } from '@/decorators.js'; import { GlobalEvents } from '@/core/GlobalEventService.js'; import type { OnApplicationShutdown } from '@nestjs/common'; -import type { Packed } from '@/misc/json-schema.js'; - -export type UserWebhookPayload = - T extends 'note' | 'reply' | 'renote' |'mention' ? { - note: Packed<'Note'>, - } : - T extends 'follow' | 'unfollow' ? { - user: Packed<'UserDetailedNotMe'>, - } : - T extends 'followed' ? { - user: Packed<'UserLite'>, - } : never; @Injectable() export class UserWebhookService implements OnApplicationShutdown { diff --git a/packages/backend/src/core/WebhookTestService.ts b/packages/backend/src/core/WebhookTestService.ts index b1ea7974fb..c826a28963 100644 --- a/packages/backend/src/core/WebhookTestService.ts +++ b/packages/backend/src/core/WebhookTestService.ts @@ -10,7 +10,7 @@ import { MiSystemWebhook, type SystemWebhookEventType } from '@/models/SystemWeb import { SystemWebhookService } from '@/core/SystemWebhookService.js'; import { Packed } from '@/misc/json-schema.js'; import { type WebhookEventTypes } from '@/models/Webhook.js'; -import { type UserWebhookPayload, UserWebhookService } from '@/core/UserWebhookService.js'; +import { UserWebhookService } from '@/core/UserWebhookService.js'; import { QueueService } from '@/core/QueueService.js'; import { ModeratorInactivityRemainingTime } from '@/queue/processors/CheckModeratorsActivityProcessorService.js'; @@ -306,10 +306,10 @@ export class WebhookTestService { * - 送信対象イベント(on)に関する設定 */ @bindThis - public async testUserWebhook( + public async testUserWebhook( params: { webhookId: MiWebhook['id'], - type: T, + type: WebhookEventTypes, override?: Partial>, }, sender: MiUser | null, @@ -321,7 +321,7 @@ export class WebhookTestService { } const webhook = webhooks[0]; - const send = (type: U, contents: UserWebhookPayload) => { + const send = (contents: unknown) => { const merged = { ...webhook, ...params.override, @@ -329,7 +329,7 @@ export class WebhookTestService { // テスト目的なのでUserWebhookServiceの機能を経由せず直接キューに追加する(チェック処理などをスキップする意図). // また、Jobの試行回数も1回だけ. - this.queueService.userWebhookDeliver(merged, type, contents, { attempts: 1 }); + this.queueService.userWebhookDeliver(merged, params.type, contents, { attempts: 1 }); }; const dummyNote1 = generateDummyNote({ @@ -361,40 +361,33 @@ export class WebhookTestService { switch (params.type) { case 'note': { - send('note', { note: toPackedNote(dummyNote1) }); + send(toPackedNote(dummyNote1)); break; } case 'reply': { - send('reply', { note: toPackedNote(dummyReply1) }); + send(toPackedNote(dummyReply1)); break; } case 'renote': { - send('renote', { note: toPackedNote(dummyRenote1) }); + send(toPackedNote(dummyRenote1)); break; } case 'mention': { - send('mention', { note: toPackedNote(dummyMention1) }); + send(toPackedNote(dummyMention1)); break; } case 'follow': { - send('follow', { user: toPackedUserDetailedNotMe(dummyUser1) }); + send(toPackedUserDetailedNotMe(dummyUser1)); break; } case 'followed': { - send('followed', { user: toPackedUserLite(dummyUser2) }); + send(toPackedUserLite(dummyUser2)); break; } case 'unfollow': { - send('unfollow', { user: toPackedUserDetailedNotMe(dummyUser3) }); + send(toPackedUserDetailedNotMe(dummyUser3)); break; } - // まだ実装されていない (#9485) - case 'reaction': return; - default: { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const _exhaustiveAssertion: never = params.type; - return; - } } } diff --git a/packages/backend/test/unit/WebhookTestService.ts b/packages/backend/test/unit/WebhookTestService.ts index be84ae9b84..5e63b86f8f 100644 --- a/packages/backend/test/unit/WebhookTestService.ts +++ b/packages/backend/test/unit/WebhookTestService.ts @@ -7,7 +7,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { beforeAll, describe, jest } from '@jest/globals'; import { WebhookTestService } from '@/core/WebhookTestService.js'; -import { UserWebhookPayload, UserWebhookService } from '@/core/UserWebhookService.js'; +import { UserWebhookService } from '@/core/UserWebhookService.js'; import { SystemWebhookService } from '@/core/SystemWebhookService.js'; import { GlobalModule } from '@/GlobalModule.js'; import { MiSystemWebhook, MiUser, MiWebhook, UserProfilesRepository, UsersRepository } from '@/models/_.js'; @@ -122,7 +122,7 @@ describe('WebhookTestService', () => { const calls = queueService.userWebhookDeliver.mock.calls[0]; expect((calls[0] as any).id).toBe('dummy-webhook'); expect(calls[1]).toBe('note'); - expect((calls[2] as UserWebhookPayload<'note'>).note.id).toBe('dummy-note-1'); + expect((calls[2] as any).id).toBe('dummy-note-1'); }); test('reply', async () => { @@ -131,7 +131,7 @@ describe('WebhookTestService', () => { const calls = queueService.userWebhookDeliver.mock.calls[0]; expect((calls[0] as any).id).toBe('dummy-webhook'); expect(calls[1]).toBe('reply'); - expect((calls[2] as UserWebhookPayload<'reply'>).note.id).toBe('dummy-reply-1'); + expect((calls[2] as any).id).toBe('dummy-reply-1'); }); test('renote', async () => { @@ -140,7 +140,7 @@ describe('WebhookTestService', () => { const calls = queueService.userWebhookDeliver.mock.calls[0]; expect((calls[0] as any).id).toBe('dummy-webhook'); expect(calls[1]).toBe('renote'); - expect((calls[2] as UserWebhookPayload<'renote'>).note.id).toBe('dummy-renote-1'); + expect((calls[2] as any).id).toBe('dummy-renote-1'); }); test('mention', async () => { @@ -149,7 +149,7 @@ describe('WebhookTestService', () => { const calls = queueService.userWebhookDeliver.mock.calls[0]; expect((calls[0] as any).id).toBe('dummy-webhook'); expect(calls[1]).toBe('mention'); - expect((calls[2] as UserWebhookPayload<'mention'>).note.id).toBe('dummy-mention-1'); + expect((calls[2] as any).id).toBe('dummy-mention-1'); }); test('follow', async () => { @@ -158,7 +158,7 @@ describe('WebhookTestService', () => { const calls = queueService.userWebhookDeliver.mock.calls[0]; expect((calls[0] as any).id).toBe('dummy-webhook'); expect(calls[1]).toBe('follow'); - expect((calls[2] as UserWebhookPayload<'follow'>).user.id).toBe('dummy-user-1'); + expect((calls[2] as any).id).toBe('dummy-user-1'); }); test('followed', async () => { @@ -167,7 +167,7 @@ describe('WebhookTestService', () => { const calls = queueService.userWebhookDeliver.mock.calls[0]; expect((calls[0] as any).id).toBe('dummy-webhook'); expect(calls[1]).toBe('followed'); - expect((calls[2] as UserWebhookPayload<'followed'>).user.id).toBe('dummy-user-2'); + expect((calls[2] as any).id).toBe('dummy-user-2'); }); test('unfollow', async () => { @@ -176,7 +176,7 @@ describe('WebhookTestService', () => { const calls = queueService.userWebhookDeliver.mock.calls[0]; expect((calls[0] as any).id).toBe('dummy-webhook'); expect(calls[1]).toBe('unfollow'); - expect((calls[2] as UserWebhookPayload<'unfollow'>).user.id).toBe('dummy-user-3'); + expect((calls[2] as any).id).toBe('dummy-user-3'); }); describe('NoSuchWebhookError', () => { diff --git a/packages/frontend/src/account.ts b/packages/frontend/src/account.ts index 722f296732..36186ecac1 100644 --- a/packages/frontend/src/account.ts +++ b/packages/frontend/src/account.ts @@ -22,66 +22,23 @@ type Account = Misskey.entities.MeDetailed & { token: string }; const accountData = miLocalStorage.getItem('account'); // TODO: 外部からはreadonlyに -/** - * Reactive state for the current account. "I" as in "I am logged in". - * Initialized from local storage if available, otherwise null. - * - * @type {Account | null} - */ export const $i = accountData ? reactive(JSON.parse(accountData) as Account) : null; -/** - * Whether the current account is a moderator. - * - * @type {boolean} - */ export const iAmModerator = $i != null && ($i.isAdmin === true || $i.isModerator === true); - -/** - * Whether the current account is an administrator. - * - * @type {boolean} - */ export const iAmAdmin = $i != null && $i.isAdmin; -/** - * Whether it is necessary to sign in; checks if the current - * account is null and throws an error if so. - * - * @throws {Error} If the current account is null - * @returns {Account} The current account - */ export function signinRequired() { if ($i == null) throw new Error('signin required'); return $i; } -/** - * Extracts the current number of notes from the current account. - * - * Note: This appears to only be used for the "notes1" achievement. - * - * Also, separating it like this might cause counts to get out-of-sync. - */ export let notesCount = $i == null ? 0 : $i.notesCount; - -/** - * Increments the number of notes by one. - * - * Documentation TODO: What about $i.notesCount? Why not increment that? - */ export function incNotesCount() { notesCount++; } export async function signout() { - - // If we're not signed in, there's nothing to do. - if (!$i) { - // Error log: - console.error('signout() called when not signed in'); - return; - } + if (!$i) return; waiting(); miLocalStorage.removeItem('account'); diff --git a/packages/frontend/src/components/MkSignupDialog.form.vue b/packages/frontend/src/components/MkSignupDialog.form.vue index e1f4e26d62..3d1c44fc90 100644 --- a/packages/frontend/src/components/MkSignupDialog.form.vue +++ b/packages/frontend/src/components/MkSignupDialog.form.vue @@ -277,7 +277,7 @@ async function onSubmit(): Promise { return null; }); - if (res && res.ok) { + if (res) { if (res.status === 204 || instance.emailRequiredForSignup) { os.alert({ type: 'success', @@ -295,8 +295,6 @@ async function onSubmit(): Promise { await login(resJson.token); } } - } else { - onSignupApiError(); } submitting.value = false; diff --git a/packages/frontend/src/local-storage.ts b/packages/frontend/src/local-storage.ts index 828b01848f..5b8ba77e01 100644 --- a/packages/frontend/src/local-storage.ts +++ b/packages/frontend/src/local-storage.ts @@ -3,9 +3,6 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -/** - * A typesafe enum of keys for localStorage. - */ export type Keys = 'v' | 'lastVersion' | @@ -47,45 +44,16 @@ export type Keys = // セッション毎に廃棄されるLocalStorage代替(セーフモードなどで使用できそう) //const safeSessionStorage = new Map(); - -/** - * A utility object for interacting with the browser's localStorage. - * - * It's mostly a small wrapper around window.localStorage, but it validates - * keys with a typesafe enum, and provides a few convenience methods for JSON. - */ export const miLocalStorage = { - /** - * Retrieves an item from localStorage. - * @param {Keys} key - The key of the item to retrieve. - * @returns {string | null} The value of the item, or null if the item does not exist. - */ getItem: (key: Keys): string | null => { return window.localStorage.getItem(key); }, - - /** - * Stores an item in localStorage. - * @param {Keys} key - The key of the item to store. - * @param {string} value - The value of the item to store. - */ setItem: (key: Keys, value: string): void => { window.localStorage.setItem(key, value); }, - - /** - * Removes an item from localStorage. - * @param {Keys} key - The key of the item to remove. - */ removeItem: (key: Keys): void => { window.localStorage.removeItem(key); }, - - /** - * Retrieves an item from localStorage and parses it as JSON. - * @param {Keys} key - The key of the item to retrieve. - * @returns {any | undefined} The parsed value of the item, or undefined if the item does not exist. - */ getItemAsJson: (key: Keys): any | undefined => { const item = miLocalStorage.getItem(key); if (item === null) { @@ -93,12 +61,6 @@ export const miLocalStorage = { } return JSON.parse(item); }, - - /** - * Stores an item in localStorage as a JSON string. - * @param {Keys} key - The key of the item to store. - * @param {any} value - The value of the item to store. - */ setItemAsJson: (key: Keys, value: any): void => { miLocalStorage.setItem(key, JSON.stringify(value)); }, diff --git a/packages/frontend/src/os.ts b/packages/frontend/src/os.ts index 0eb4e2ac53..ea1b673de9 100644 --- a/packages/frontend/src/os.ts +++ b/packages/frontend/src/os.ts @@ -136,16 +136,7 @@ export function promiseDialog>( return promise; } -/** - * Counter for generating unique popup IDs. - * @type {number} - */ let popupIdCount = 0; - -/** - * A reactive list of the currently opened popups. This is used in a Vue component - * in a v-for loop to render the popups. - */ export const popups = ref<{ id: number; component: Component; @@ -153,23 +144,12 @@ export const popups = ref<{ events: Record; }[]>([]); -/** - * An object containing z-index values for different priority levels. - */ const zIndexes = { veryLow: 500000, low: 1000000, middle: 2000000, high: 3000000, }; - -/** - * Claims a z-index value for a given priority level. - * Increments the z-index value for the specified priority by 100 and returns the new value. - * - * @param {keyof typeof zIndexes} [priority='low'] - The priority level for which to claim a z-index. - * @returns {number} The new z-index value for the specified priority. - */ export function claimZIndex(priority: keyof typeof zIndexes = 'low'): number { zIndexes[priority] += 100; return zIndexes[priority]; @@ -197,15 +177,6 @@ type EmitsExtractor = { [K in keyof T as K extends `onVnode${string}` ? never : K extends `on${infer E}` ? Uncapitalize : K extends string ? never : K]: T[K]; }; -/** - * Opens a popup with the specified component, props, and events. - * - * @template T - The type of the component. - * @param {T} component - The Vue component to display in the popup. - * @param {ComponentProps} props - The props to pass to the component. - * @param {ComponentEmit} [events={}] - The events to bind to the component. - * @returns {{ dispose: () => void }} An object containing a dispose function to close the popup. - */ export function popup( component: T, props: ComponentProps, @@ -213,18 +184,13 @@ export function popup( ): { dispose: () => void } { markRaw(component); - // Generate a unique ID for this popup. const id = ++popupIdCount; - - // On disposal, remove this popup from the list of open popups. const dispose = () => { // このsetTimeoutが無いと挙動がおかしくなる(autocompleteが閉じなくなる)。Vueのバグ? window.setTimeout(() => { popups.value = popups.value.filter(p => p.id !== id); }, 0); }; - - // Bundle the component, props, and events into a state object. const state = { component, props, @@ -232,19 +198,13 @@ export function popup( id, }; - // Add the popup to the list of open popups. popups.value.push(state); - // Return a function that can be called to close the popup. return { dispose, }; } -/** - * Open the page with the given path in a pop-up window. - * @param path The path of the page to open. - */ export function pageWindow(path: string) { const { dispose } = popup(MkPageWindow, { initialPath: path, @@ -253,11 +213,6 @@ export function pageWindow(path: string) { }); } -/** - * Displays a toast message to the user. - * - * @param {string} message - The message to display in the toast. - */ export function toast(message: string) { const { dispose } = popup(MkToast, { message, @@ -266,15 +221,6 @@ export function toast(message: string) { }); } -/** - * Displays an alert dialog to the user. - * - * @param {Object} props - The properties for the alert dialog. - * @param {'error' | 'info' | 'success' | 'warning' | 'waiting' | 'question'} [props.type] - The type of the alert. - * @param {string} [props.title] - The title of the alert dialog. - * @param {string} [props.text] - The text content of the alert dialog. - * @returns {Promise} A promise that resolves when the alert dialog is closed. - */ export function alert(props: { type?: 'error' | 'info' | 'success' | 'warning' | 'waiting' | 'question'; title?: string; diff --git a/packages/frontend/src/pages/about-misskey.vue b/packages/frontend/src/pages/about-misskey.vue index f2becfd8f5..fbbfb6ea61 100644 --- a/packages/frontend/src/pages/about-misskey.vue +++ b/packages/frontend/src/pages/about-misskey.vue @@ -272,9 +272,6 @@ const patronsWithIcon = [{ }, { name: 'Yatoigawa', icon: 'https://assets.misskey-hub.net/patrons/505e3568885a4a488431a8f22b4553d0.jpg', -}, { - name: '秋瀬カヲル', - icon: 'https://assets.misskey-hub.net/patrons/0f22aeb866484f4fa51db6721e3f9847.jpg', }]; const patrons = [ @@ -383,7 +380,6 @@ const patrons = [ 'ケモナーのケシン', 'こまつぶり', 'まゆつな空高', - 'asata', ]; const thereIsTreasure = ref($i && !claimedAchievements.includes('foundTreasure')); diff --git a/packages/frontend/src/pages/settings/webhook.edit.vue b/packages/frontend/src/pages/settings/webhook.edit.vue index 22b008fb61..40d23e36c5 100644 --- a/packages/frontend/src/pages/settings/webhook.edit.vue +++ b/packages/frontend/src/pages/settings/webhook.edit.vue @@ -44,7 +44,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- {{ i18n.ts._webhookSettings._events.reaction }} + {{ i18n.ts._webhookSettings._events.reaction }}
diff --git a/packages/frontend/src/pages/settings/webhook.new.vue b/packages/frontend/src/pages/settings/webhook.new.vue index 727c4df2d6..d62357caaf 100644 --- a/packages/frontend/src/pages/settings/webhook.new.vue +++ b/packages/frontend/src/pages/settings/webhook.new.vue @@ -27,7 +27,7 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts._webhookSettings._events.note }} {{ i18n.ts._webhookSettings._events.reply }} {{ i18n.ts._webhookSettings._events.renote }} - {{ i18n.ts._webhookSettings._events.reaction }} + {{ i18n.ts._webhookSettings._events.reaction }} {{ i18n.ts._webhookSettings._events.mention }}
diff --git a/packages/frontend/src/scripts/idb-proxy.ts b/packages/frontend/src/scripts/idb-proxy.ts index 425225fc42..20f51660c7 100644 --- a/packages/frontend/src/scripts/idb-proxy.ts +++ b/packages/frontend/src/scripts/idb-proxy.ts @@ -26,7 +26,6 @@ if (window.Cypress) { console.log('Cypress detected. It will use localStorage.'); } -// Check for the availability of indexedDB. if (idbAvailable) { await iset('idb-test', 'test') .catch(err => { @@ -38,36 +37,16 @@ if (idbAvailable) { console.error('indexedDB is unavailable. It will use localStorage.'); } -/** - * Get a value from indexedDB (or localStorage as a fallback). - * - * @param key The key of the item to retrieve. - * - * @returns The value of the item. - */ export async function get(key: string) { if (idbAvailable) return iget(key); return miLocalStorage.getItemAsJson(`${PREFIX}${key}`); } -/** - * Set a value in indexedDB (or localStorage as a fallback). - * - * @param {string} key - The key of the item to set. - * @param {any} val - The value of the item to set. - * @returns {Promise} - A promise that resolves when the value has been set.` - */ export async function set(key: string, val: any) { if (idbAvailable) return iset(key, val); return miLocalStorage.setItemAsJson(`${PREFIX}${key}`, val); } -/** - * Delete a value from indexedDB (or localStorage as a fallback). - * - * @param {string} key - The key of the item to delete. - * @returns {Promise} - A promise that resolves when the value has been deleted. - */ export async function del(key: string) { if (idbAvailable) return idel(key); return miLocalStorage.removeItem(`${PREFIX}${key}`); diff --git a/packages/misskey-js/package.json b/packages/misskey-js/package.json index 19615cfee5..f638bacbf9 100644 --- a/packages/misskey-js/package.json +++ b/packages/misskey-js/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "misskey-js", - "version": "2024.11.0-alpha.0", + "version": "2024.10.2-alpha.3", "description": "Misskey SDK for JavaScript", "license": "MIT", "main": "./built/index.js",