mirror of
https://github.com/misskey-dev/misskey.git
synced 2026-05-30 04:04:56 +02:00
perf: rsa sign on slacc (#17322)
* perf: rsa sign on slacc * fix: missing async/await * fix: threadPoolSize is always number Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * test(backend): init slacc in unit setup and await ap-request signing * test(backend): move slacc init to unit testEnvironment * test(backend): delete unused file * docs: update CHANGELOG * docs: fix indent Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * chore: migrate to vitest * fix * fix: fix changelog * chore: regenerate lockfile * docs: changelog --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
This commit is contained in:
@@ -182,6 +182,9 @@ id: 'aidx'
|
|||||||
# Number of worker processes
|
# Number of worker processes
|
||||||
#clusterLimit: 1
|
#clusterLimit: 1
|
||||||
|
|
||||||
|
# Number of threads of extra thread pool for CPU-intensive tasks (per worker)
|
||||||
|
#threadPoolSize: 1
|
||||||
|
|
||||||
# Job concurrency per worker
|
# Job concurrency per worker
|
||||||
# deliverJobConcurrency: 128
|
# deliverJobConcurrency: 128
|
||||||
# inboxJobConcurrency: 16
|
# inboxJobConcurrency: 16
|
||||||
|
|||||||
@@ -194,6 +194,9 @@ id: 'aidx'
|
|||||||
# Number of worker processes
|
# Number of worker processes
|
||||||
#clusterLimit: 1
|
#clusterLimit: 1
|
||||||
|
|
||||||
|
# Number of threads of extra thread pool for CPU-intensive tasks (per worker)
|
||||||
|
#threadPoolSize: 1
|
||||||
|
|
||||||
# Job concurrency per worker
|
# Job concurrency per worker
|
||||||
# deliverJobConcurrency: 128
|
# deliverJobConcurrency: 128
|
||||||
# inboxJobConcurrency: 16
|
# inboxJobConcurrency: 16
|
||||||
|
|||||||
@@ -328,6 +328,9 @@ id: 'aidx'
|
|||||||
# Number of worker processes
|
# Number of worker processes
|
||||||
#clusterLimit: 1
|
#clusterLimit: 1
|
||||||
|
|
||||||
|
# Number of threads of extra thread pool for CPU-intensive tasks (per worker)
|
||||||
|
#threadPoolSize: 1
|
||||||
|
|
||||||
# Job concurrency per worker
|
# Job concurrency per worker
|
||||||
#deliverJobConcurrency: 128
|
#deliverJobConcurrency: 128
|
||||||
#inboxJobConcurrency: 16
|
#inboxJobConcurrency: 16
|
||||||
|
|||||||
@@ -169,6 +169,9 @@ id: 'aidx'
|
|||||||
# Number of worker processes
|
# Number of worker processes
|
||||||
#clusterLimit: 1
|
#clusterLimit: 1
|
||||||
|
|
||||||
|
# Number of threads of extra thread pool for CPU-intensive tasks (per worker)
|
||||||
|
#threadPoolSize: 1
|
||||||
|
|
||||||
# Job concurrency per worker
|
# Job concurrency per worker
|
||||||
# deliverJobConcurrency: 128
|
# deliverJobConcurrency: 128
|
||||||
# inboxJobConcurrency: 16
|
# inboxJobConcurrency: 16
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
### Note
|
||||||
|
- config に `threadPoolSize` オプションが追加されました。
|
||||||
|
- デフォルトは `1` で、ワーカーごとに指定した数のスレッドが作成されます。
|
||||||
|
- スレッドプールは CPU バウンドな処理をオフロードするために使用されるため、みだりに大きな値を指定しないでください。
|
||||||
|
|
||||||
### General
|
### General
|
||||||
- Enhance: Unicode 17.0 に収録されている絵文字の処理・表示に対応
|
- Enhance: Unicode 17.0 に収録されている絵文字の処理・表示に対応
|
||||||
- Fluent Emojiや端末ネイティブの絵文字を利用している場合は、最新の絵文字に対応しておらず正しく表示できない可能性があります。絵文字が表示できない場合は、表示に使用する絵文字をTwemojiに切り替えてご利用ください。
|
- Fluent Emojiや端末ネイティブの絵文字を利用している場合は、最新の絵文字に対応しておらず正しく表示できない可能性があります。絵文字が表示できない場合は、表示に使用する絵文字をTwemojiに切り替えてご利用ください。
|
||||||
@@ -15,7 +20,7 @@
|
|||||||
- Fix: チャンネルの作成ロールポリシーにて、ヘッダーにロールポリシーの値が表示されない問題を修正
|
- Fix: チャンネルの作成ロールポリシーにて、ヘッダーにロールポリシーの値が表示されない問題を修正
|
||||||
|
|
||||||
### Server
|
### Server
|
||||||
-
|
- Enhance: RSA 署名処理のオフロード
|
||||||
|
|
||||||
|
|
||||||
## 2026.5.1
|
## 2026.5.1
|
||||||
|
|||||||
@@ -190,6 +190,9 @@ id: "aidx"
|
|||||||
# Number of worker processes
|
# Number of worker processes
|
||||||
#clusterLimit: 1
|
#clusterLimit: 1
|
||||||
|
|
||||||
|
# Number of threads of extra thread pool for CPU-intensive tasks (per worker)
|
||||||
|
#threadPoolSize: 1
|
||||||
|
|
||||||
# Job concurrency per worker
|
# Job concurrency per worker
|
||||||
# deliverJobConcurrency: 128
|
# deliverJobConcurrency: 128
|
||||||
# inboxJobConcurrency: 16
|
# inboxJobConcurrency: 16
|
||||||
|
|||||||
@@ -37,19 +37,19 @@
|
|||||||
"@tensorflow/tfjs": "4.22.0",
|
"@tensorflow/tfjs": "4.22.0",
|
||||||
"@tensorflow/tfjs-node": "4.22.0",
|
"@tensorflow/tfjs-node": "4.22.0",
|
||||||
"bufferutil": "4.1.0",
|
"bufferutil": "4.1.0",
|
||||||
"slacc-android-arm-eabi": "0.0.10",
|
"slacc-android-arm-eabi": "0.1.5",
|
||||||
"slacc-android-arm64": "0.0.10",
|
"slacc-android-arm64": "0.1.5",
|
||||||
"slacc-darwin-arm64": "0.0.10",
|
"slacc-darwin-arm64": "0.1.5",
|
||||||
"slacc-darwin-universal": "0.0.10",
|
"slacc-darwin-universal": "0.1.5",
|
||||||
"slacc-darwin-x64": "0.0.10",
|
"slacc-darwin-x64": "0.1.5",
|
||||||
"slacc-freebsd-x64": "0.0.10",
|
"slacc-freebsd-x64": "0.1.5",
|
||||||
"slacc-linux-arm-gnueabihf": "0.0.10",
|
"slacc-linux-arm-gnueabihf": "0.1.5",
|
||||||
"slacc-linux-arm64-gnu": "0.0.10",
|
"slacc-linux-arm64-gnu": "0.1.5",
|
||||||
"slacc-linux-arm64-musl": "0.0.10",
|
"slacc-linux-arm64-musl": "0.1.5",
|
||||||
"slacc-linux-x64-gnu": "0.0.10",
|
"slacc-linux-x64-gnu": "0.1.5",
|
||||||
"slacc-linux-x64-musl": "0.0.10",
|
"slacc-linux-x64-musl": "0.1.5",
|
||||||
"slacc-win32-arm64-msvc": "0.0.10",
|
"slacc-win32-arm64-msvc": "0.1.5",
|
||||||
"slacc-win32-x64-msvc": "0.0.10",
|
"slacc-win32-x64-msvc": "0.1.5",
|
||||||
"utf-8-validate": "6.0.6"
|
"utf-8-validate": "6.0.6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -142,7 +142,7 @@
|
|||||||
"secure-json-parse": "4.1.0",
|
"secure-json-parse": "4.1.0",
|
||||||
"semver": "7.7.4",
|
"semver": "7.7.4",
|
||||||
"sharp": "0.33.5",
|
"sharp": "0.33.5",
|
||||||
"slacc": "0.0.10",
|
"slacc": "0.1.5",
|
||||||
"strict-event-emitter-types": "2.0.0",
|
"strict-event-emitter-types": "2.0.0",
|
||||||
"stringz": "2.1.0",
|
"stringz": "2.1.0",
|
||||||
"systeminformation": "5.31.5",
|
"systeminformation": "5.31.5",
|
||||||
|
|||||||
@@ -4,7 +4,21 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { NestFactory } from '@nestjs/core';
|
import { NestFactory } from '@nestjs/core';
|
||||||
|
import { init } from 'slacc';
|
||||||
import { NestLogger } from '@/NestLogger.js';
|
import { NestLogger } from '@/NestLogger.js';
|
||||||
|
import type { Config } from '@/config.js';
|
||||||
|
|
||||||
|
let slaccInitialized = false;
|
||||||
|
|
||||||
|
export function initExtraThreadPool(config: Config) {
|
||||||
|
if (slaccInitialized) return;
|
||||||
|
|
||||||
|
const threadPoolSize = Math.max(config.threadPoolSize ?? 1, 1);
|
||||||
|
|
||||||
|
init(threadPoolSize);
|
||||||
|
|
||||||
|
slaccInitialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
export async function server() {
|
export async function server() {
|
||||||
const { MainModule } = await import('../MainModule.js');
|
const { MainModule } = await import('../MainModule.js');
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import { loadConfig } from '@/config.js';
|
|||||||
import type { Config } from '@/config.js';
|
import type { Config } from '@/config.js';
|
||||||
import { showMachineInfo } from '@/misc/show-machine-info.js';
|
import { showMachineInfo } from '@/misc/show-machine-info.js';
|
||||||
import { envOption } from '@/env.js';
|
import { envOption } from '@/env.js';
|
||||||
import { jobQueue, server } from './common.js';
|
import { initExtraThreadPool, jobQueue, server } from './common.js';
|
||||||
|
|
||||||
const logger = new Logger('core', 'cyan');
|
const logger = new Logger('core', 'cyan');
|
||||||
const bootLogger = logger.createSubLogger('boot', 'magenta');
|
const bootLogger = logger.createSubLogger('boot', 'magenta');
|
||||||
@@ -64,6 +64,8 @@ export async function masterMain() {
|
|||||||
|
|
||||||
bootLogger.succ('Misskey initialized');
|
bootLogger.succ('Misskey initialized');
|
||||||
|
|
||||||
|
initExtraThreadPool(config);
|
||||||
|
|
||||||
if (config.sentryForBackend) {
|
if (config.sentryForBackend) {
|
||||||
const Sentry = await import('@sentry/node');
|
const Sentry = await import('@sentry/node');
|
||||||
const { nodeProfilingIntegration } = await import('@sentry/profiling-node');
|
const { nodeProfilingIntegration } = await import('@sentry/profiling-node');
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
import cluster from 'node:cluster';
|
import cluster from 'node:cluster';
|
||||||
import { envOption } from '@/env.js';
|
import { envOption } from '@/env.js';
|
||||||
import { loadConfig } from '@/config.js';
|
import { loadConfig } from '@/config.js';
|
||||||
import { jobQueue, server } from './common.js';
|
import { initExtraThreadPool, jobQueue, server } from './common.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Init worker process
|
* Init worker process
|
||||||
@@ -14,6 +14,8 @@ import { jobQueue, server } from './common.js';
|
|||||||
export async function workerMain() {
|
export async function workerMain() {
|
||||||
const config = loadConfig();
|
const config = loadConfig();
|
||||||
|
|
||||||
|
initExtraThreadPool(config);
|
||||||
|
|
||||||
if (config.sentryForBackend) {
|
if (config.sentryForBackend) {
|
||||||
const Sentry = await import('@sentry/node');
|
const Sentry = await import('@sentry/node');
|
||||||
const { nodeProfilingIntegration } = await import('@sentry/profiling-node');
|
const { nodeProfilingIntegration } = await import('@sentry/profiling-node');
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ type Source = {
|
|||||||
maxFileSize?: number;
|
maxFileSize?: number;
|
||||||
|
|
||||||
clusterLimit?: number;
|
clusterLimit?: number;
|
||||||
|
threadPoolSize?: number;
|
||||||
|
|
||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
@@ -158,6 +159,7 @@ export type Config = {
|
|||||||
allowedPrivateNetworks: string[] | undefined;
|
allowedPrivateNetworks: string[] | undefined;
|
||||||
maxFileSize: number;
|
maxFileSize: number;
|
||||||
clusterLimit: number | undefined;
|
clusterLimit: number | undefined;
|
||||||
|
threadPoolSize: number;
|
||||||
id: string;
|
id: string;
|
||||||
outgoingAddress: string | undefined;
|
outgoingAddress: string | undefined;
|
||||||
outgoingAddressFamily: 'ipv4' | 'ipv6' | 'dual' | undefined;
|
outgoingAddressFamily: 'ipv4' | 'ipv6' | 'dual' | undefined;
|
||||||
@@ -313,6 +315,7 @@ export function loadConfig(): Config {
|
|||||||
allowedPrivateNetworks: config.allowedPrivateNetworks,
|
allowedPrivateNetworks: config.allowedPrivateNetworks,
|
||||||
maxFileSize: config.maxFileSize ?? 262144000,
|
maxFileSize: config.maxFileSize ?? 262144000,
|
||||||
clusterLimit: config.clusterLimit,
|
clusterLimit: config.clusterLimit,
|
||||||
|
threadPoolSize: config.threadPoolSize ?? 1,
|
||||||
outgoingAddress: config.outgoingAddress,
|
outgoingAddress: config.outgoingAddress,
|
||||||
outgoingAddressFamily: config.outgoingAddressFamily,
|
outgoingAddressFamily: config.outgoingAddressFamily,
|
||||||
deliverJobConcurrency: config.deliverJobConcurrency,
|
deliverJobConcurrency: config.deliverJobConcurrency,
|
||||||
|
|||||||
@@ -5,8 +5,10 @@
|
|||||||
|
|
||||||
import * as crypto from 'node:crypto';
|
import * as crypto from 'node:crypto';
|
||||||
import { URL } from 'node:url';
|
import { URL } from 'node:url';
|
||||||
|
import { promisify } from 'node:util';
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import * as htmlParser from 'node-html-parser';
|
import * as htmlParser from 'node-html-parser';
|
||||||
|
import { RsaKeyPair } from 'slacc';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import type { Config } from '@/config.js';
|
import type { Config } from '@/config.js';
|
||||||
import type { MiUser } from '@/models/User.js';
|
import type { MiUser } from '@/models/User.js';
|
||||||
@@ -39,7 +41,7 @@ type PrivateKey = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export class ApRequestCreator {
|
export class ApRequestCreator {
|
||||||
static createSignedPost(args: { key: PrivateKey, url: string, body: string, digest?: string, additionalHeaders: Record<string, string> }): Signed {
|
static async createSignedPost(args: { key: PrivateKey, url: string, body: string, digest?: string, additionalHeaders: Record<string, string> }): Promise<Signed> {
|
||||||
const u = new URL(args.url);
|
const u = new URL(args.url);
|
||||||
const digestHeader = args.digest ?? this.createDigest(args.body);
|
const digestHeader = args.digest ?? this.createDigest(args.body);
|
||||||
|
|
||||||
@@ -54,7 +56,7 @@ export class ApRequestCreator {
|
|||||||
}, args.additionalHeaders),
|
}, args.additionalHeaders),
|
||||||
};
|
};
|
||||||
|
|
||||||
const result = this.#signToRequest(request, args.key, ['(request-target)', 'date', 'host', 'digest']);
|
const result = await this.#signToRequest(request, args.key, ['(request-target)', 'date', 'host', 'digest']);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
request,
|
request,
|
||||||
@@ -68,7 +70,7 @@ export class ApRequestCreator {
|
|||||||
return `SHA-256=${crypto.createHash('sha256').update(body).digest('base64')}`;
|
return `SHA-256=${crypto.createHash('sha256').update(body).digest('base64')}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
static createSignedGet(args: { key: PrivateKey, url: string, additionalHeaders: Record<string, string> }): Signed {
|
static async createSignedGet(args: { key: PrivateKey, url: string, additionalHeaders: Record<string, string> }): Promise<Signed> {
|
||||||
const u = new URL(args.url);
|
const u = new URL(args.url);
|
||||||
|
|
||||||
const request: Request = {
|
const request: Request = {
|
||||||
@@ -81,7 +83,7 @@ export class ApRequestCreator {
|
|||||||
}, args.additionalHeaders),
|
}, args.additionalHeaders),
|
||||||
};
|
};
|
||||||
|
|
||||||
const result = this.#signToRequest(request, args.key, ['(request-target)', 'date', 'host']);
|
const result = await this.#signToRequest(request, args.key, ['(request-target)', 'date', 'host']);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
request,
|
request,
|
||||||
@@ -91,9 +93,10 @@ export class ApRequestCreator {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static #signToRequest(request: Request, key: PrivateKey, includeHeaders: string[]): Signed {
|
static async #signToRequest(request: Request, key: PrivateKey, includeHeaders: string[]): Promise<Signed> {
|
||||||
const signingString = this.#genSigningString(request, includeHeaders);
|
const signingString = this.#genSigningString(request, includeHeaders);
|
||||||
const signature = crypto.sign('sha256', Buffer.from(signingString), key.privateKeyPem).toString('base64');
|
const sign = promisify(RsaKeyPair.prototype.sign).bind(RsaKeyPair.fromPem(key.privateKeyPem));
|
||||||
|
const signature = (await sign(Buffer.from(signingString))).toString('base64');
|
||||||
const signatureHeader = `keyId="${key.keyId}",algorithm="rsa-sha256",headers="${includeHeaders.join(' ')}",signature="${signature}"`;
|
const signatureHeader = `keyId="${key.keyId}",algorithm="rsa-sha256",headers="${includeHeaders.join(' ')}",signature="${signature}"`;
|
||||||
|
|
||||||
request.headers = this.#objectAssignWithLcKey(request.headers, {
|
request.headers = this.#objectAssignWithLcKey(request.headers, {
|
||||||
@@ -160,7 +163,7 @@ export class ApRequestService {
|
|||||||
|
|
||||||
const keypair = await this.userKeypairService.getUserKeypair(user.id);
|
const keypair = await this.userKeypairService.getUserKeypair(user.id);
|
||||||
|
|
||||||
const req = ApRequestCreator.createSignedPost({
|
const req = await ApRequestCreator.createSignedPost({
|
||||||
key: {
|
key: {
|
||||||
privateKeyPem: keypair.privateKey,
|
privateKeyPem: keypair.privateKey,
|
||||||
keyId: `${this.config.url}/users/${user.id}#main-key`,
|
keyId: `${this.config.url}/users/${user.id}#main-key`,
|
||||||
@@ -189,7 +192,7 @@ export class ApRequestService {
|
|||||||
const _followAlternate = followAlternate ?? true;
|
const _followAlternate = followAlternate ?? true;
|
||||||
const keypair = await this.userKeypairService.getUserKeypair(user.id);
|
const keypair = await this.userKeypairService.getUserKeypair(user.id);
|
||||||
|
|
||||||
const req = ApRequestCreator.createSignedGet({
|
const req = await ApRequestCreator.createSignedGet({
|
||||||
key: {
|
key: {
|
||||||
privateKeyPem: keypair.privateKey,
|
privateKeyPem: keypair.privateKey,
|
||||||
keyId: `${this.config.url}/users/${user.id}#main-key`,
|
keyId: `${this.config.url}/users/${user.id}#main-key`,
|
||||||
|
|||||||
@@ -4,7 +4,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import * as crypto from 'node:crypto';
|
import * as crypto from 'node:crypto';
|
||||||
|
import { promisify } from 'node:util';
|
||||||
import { Injectable } from '@nestjs/common';
|
import { Injectable } from '@nestjs/common';
|
||||||
|
import { RsaKeyPair } from 'slacc';
|
||||||
import { HttpRequestService } from '@/core/HttpRequestService.js';
|
import { HttpRequestService } from '@/core/HttpRequestService.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { CONTEXT, PRELOADED_CONTEXTS } from './misc/contexts.js';
|
import { CONTEXT, PRELOADED_CONTEXTS } from './misc/contexts.js';
|
||||||
@@ -45,11 +47,9 @@ class JsonLd {
|
|||||||
|
|
||||||
const toBeSigned = await this.createVerifyData(data, options);
|
const toBeSigned = await this.createVerifyData(data, options);
|
||||||
|
|
||||||
const signer = crypto.createSign('sha256');
|
const sign = promisify(RsaKeyPair.prototype.sign).bind(RsaKeyPair.fromPem(privateKey));
|
||||||
signer.update(toBeSigned);
|
|
||||||
signer.end();
|
|
||||||
|
|
||||||
const signature = signer.sign(privateKey);
|
const signature = await sign(Buffer.from(toBeSigned));
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...data,
|
...data,
|
||||||
|
|||||||
10
packages/backend/test/environment.unit.ts
Normal file
10
packages/backend/test/environment.unit.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
import { init } from 'slacc';
|
||||||
|
import { builtinEnvironments } from 'vitest/runtime';
|
||||||
|
|
||||||
|
init(1);
|
||||||
|
|
||||||
|
export default builtinEnvironments.node;
|
||||||
@@ -42,7 +42,7 @@ describe('ap-request', () => {
|
|||||||
'User-Agent': 'UA',
|
'User-Agent': 'UA',
|
||||||
};
|
};
|
||||||
|
|
||||||
const req = ApRequestCreator.createSignedPost({ key, url, body, additionalHeaders: headers });
|
const req = await ApRequestCreator.createSignedPost({ key, url, body, additionalHeaders: headers });
|
||||||
|
|
||||||
const parsed = buildParsedSignature(req.signingString, req.signature, 'rsa-sha256');
|
const parsed = buildParsedSignature(req.signingString, req.signature, 'rsa-sha256');
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ describe('ap-request', () => {
|
|||||||
'User-Agent': 'UA',
|
'User-Agent': 'UA',
|
||||||
};
|
};
|
||||||
|
|
||||||
const req = ApRequestCreator.createSignedGet({ key, url, additionalHeaders: headers });
|
const req = await ApRequestCreator.createSignedGet({ key, url, additionalHeaders: headers });
|
||||||
|
|
||||||
const parsed = buildParsedSignature(req.signingString, req.signature, 'rsa-sha256');
|
const parsed = buildParsedSignature(req.signingString, req.signature, 'rsa-sha256');
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ export default mergeConfig(
|
|||||||
defineConfig({
|
defineConfig({
|
||||||
test: {
|
test: {
|
||||||
globalSetup: './test/setup.unit.ts',
|
globalSetup: './test/setup.unit.ts',
|
||||||
|
environment: './test/environment.unit.ts',
|
||||||
include: ['test/unit/**/*.ts', 'src/**/*.test.ts'],
|
include: ['test/unit/**/*.ts', 'src/**/*.test.ts'],
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
|
|||||||
197
pnpm-lock.yaml
generated
197
pnpm-lock.yaml
generated
@@ -358,8 +358,8 @@ importers:
|
|||||||
specifier: 0.33.5
|
specifier: 0.33.5
|
||||||
version: 0.33.5
|
version: 0.33.5
|
||||||
slacc:
|
slacc:
|
||||||
specifier: 0.0.10
|
specifier: 0.1.5
|
||||||
version: 0.0.10
|
version: 0.1.5
|
||||||
strict-event-emitter-types:
|
strict-event-emitter-types:
|
||||||
specifier: 2.0.0
|
specifier: 2.0.0
|
||||||
version: 2.0.0
|
version: 2.0.0
|
||||||
@@ -561,44 +561,44 @@ importers:
|
|||||||
specifier: 4.1.0
|
specifier: 4.1.0
|
||||||
version: 4.1.0
|
version: 4.1.0
|
||||||
slacc-android-arm-eabi:
|
slacc-android-arm-eabi:
|
||||||
specifier: 0.0.10
|
specifier: 0.1.5
|
||||||
version: 0.0.10
|
version: 0.1.5
|
||||||
slacc-android-arm64:
|
slacc-android-arm64:
|
||||||
specifier: 0.0.10
|
specifier: 0.1.5
|
||||||
version: 0.0.10
|
version: 0.1.5
|
||||||
slacc-darwin-arm64:
|
slacc-darwin-arm64:
|
||||||
specifier: 0.0.10
|
specifier: 0.1.5
|
||||||
version: 0.0.10
|
version: 0.1.5
|
||||||
slacc-darwin-universal:
|
slacc-darwin-universal:
|
||||||
specifier: 0.0.10
|
specifier: 0.1.5
|
||||||
version: 0.0.10
|
version: 0.1.5
|
||||||
slacc-darwin-x64:
|
slacc-darwin-x64:
|
||||||
specifier: 0.0.10
|
specifier: 0.1.5
|
||||||
version: 0.0.10
|
version: 0.1.5
|
||||||
slacc-freebsd-x64:
|
slacc-freebsd-x64:
|
||||||
specifier: 0.0.10
|
specifier: 0.1.5
|
||||||
version: 0.0.10
|
version: 0.1.5
|
||||||
slacc-linux-arm-gnueabihf:
|
slacc-linux-arm-gnueabihf:
|
||||||
specifier: 0.0.10
|
specifier: 0.1.5
|
||||||
version: 0.0.10
|
version: 0.1.5
|
||||||
slacc-linux-arm64-gnu:
|
slacc-linux-arm64-gnu:
|
||||||
specifier: 0.0.10
|
specifier: 0.1.5
|
||||||
version: 0.0.10
|
version: 0.1.5
|
||||||
slacc-linux-arm64-musl:
|
slacc-linux-arm64-musl:
|
||||||
specifier: 0.0.10
|
specifier: 0.1.5
|
||||||
version: 0.0.10
|
version: 0.1.5
|
||||||
slacc-linux-x64-gnu:
|
slacc-linux-x64-gnu:
|
||||||
specifier: 0.0.10
|
specifier: 0.1.5
|
||||||
version: 0.0.10
|
version: 0.1.5
|
||||||
slacc-linux-x64-musl:
|
slacc-linux-x64-musl:
|
||||||
specifier: 0.0.10
|
specifier: 0.1.5
|
||||||
version: 0.0.10
|
version: 0.1.5
|
||||||
slacc-win32-arm64-msvc:
|
slacc-win32-arm64-msvc:
|
||||||
specifier: 0.0.10
|
specifier: 0.1.5
|
||||||
version: 0.0.10
|
version: 0.1.5
|
||||||
slacc-win32-x64-msvc:
|
slacc-win32-x64-msvc:
|
||||||
specifier: 0.0.10
|
specifier: 0.1.5
|
||||||
version: 0.0.10
|
version: 0.1.5
|
||||||
utf-8-validate:
|
utf-8-validate:
|
||||||
specifier: 6.0.6
|
specifier: 6.0.6
|
||||||
version: 6.0.6
|
version: 6.0.6
|
||||||
@@ -4688,6 +4688,7 @@ packages:
|
|||||||
|
|
||||||
'@ungap/structured-clone@1.3.0':
|
'@ungap/structured-clone@1.3.0':
|
||||||
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
|
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
|
||||||
|
deprecated: Potential CWE-502 - Update to 1.3.1 or higher
|
||||||
|
|
||||||
'@vitejs/plugin-vue@6.0.6':
|
'@vitejs/plugin-vue@6.0.6':
|
||||||
resolution: {integrity: sha512-u9HHgfrq3AjXlysn0eINFnWQOJQLO9WN6VprZ8FXl7A2bYisv3Hui9Ij+7QZ41F/WYWarHjwBbXtD7dKg3uxbg==}
|
resolution: {integrity: sha512-u9HHgfrq3AjXlysn0eINFnWQOJQLO9WN6VprZ8FXl7A2bYisv3Hui9Ij+7QZ41F/WYWarHjwBbXtD7dKg3uxbg==}
|
||||||
@@ -9280,90 +9281,90 @@ packages:
|
|||||||
sinon@18.0.1:
|
sinon@18.0.1:
|
||||||
resolution: {integrity: sha512-a2N2TDY1uGviajJ6r4D1CyRAkzE9NNVlYOV1wX5xQDuAk0ONgzgRl0EjCQuRCPxOwp13ghsMwt9Gdldujs39qw==}
|
resolution: {integrity: sha512-a2N2TDY1uGviajJ6r4D1CyRAkzE9NNVlYOV1wX5xQDuAk0ONgzgRl0EjCQuRCPxOwp13ghsMwt9Gdldujs39qw==}
|
||||||
|
|
||||||
slacc-android-arm-eabi@0.0.10:
|
slacc-android-arm-eabi@0.1.5:
|
||||||
resolution: {integrity: sha512-U3dVBuM1m8rT1D/w6S4knJ/uscNwsCR+MKxSQFbgDJEh8Atv+ovuC+FMGuaBT4iOQjpMj5dWSsN3ZPjVeo3hgA==}
|
resolution: {integrity: sha512-4BvH5Ut1egLORdiMfww+RyIDTMVVx3jFdcAa6gz7VglCmksyTsvuGbTgn31aC/1hjqug3eObkS+K7d3ZW8Yk/Q==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [android]
|
os: [android]
|
||||||
|
|
||||||
slacc-android-arm64@0.0.10:
|
slacc-android-arm64@0.1.5:
|
||||||
resolution: {integrity: sha512-guVp88sW+4j1clTSXMzyDJHG8ondVnd8/FMKXIOfzKCEwSwX3uBxsuyHqtGvXkEwyZAGsBUy13Ei/PZAwElwYA==}
|
resolution: {integrity: sha512-P11kuouiYh74XSWdFOg0BBEoOl7d5PXy4JYXD4+FMhfew71aW98Mr4t1zI6JiolPqRKec5rRqqXUZwTXtVfXMQ==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [android]
|
os: [android]
|
||||||
|
|
||||||
slacc-darwin-arm64@0.0.10:
|
slacc-darwin-arm64@0.1.5:
|
||||||
resolution: {integrity: sha512-633qnOMTP7egvd5IeljAOku0tnxlBXSoCRu7HiT0yeXxN9y5Tbg2X2/FaRzstI36lClfIJ0Lavne4mOw/90z9A==}
|
resolution: {integrity: sha512-hwqTm0E4ujBjWpHTRQESOmRKymgVW+7S/hukRt0SjZp3FYec3tjaFK7hyJqcH9ht7XpuDtdPkMtVtAV+QRr/gA==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
slacc-darwin-universal@0.0.10:
|
slacc-darwin-universal@0.1.5:
|
||||||
resolution: {integrity: sha512-x5kEqRMTEQTi3NCufPEukWvaWqcOL+7EkP18ZCCiajcWH83jWnT8DOSGOmmLYdrXd0B7ZZcbd8GyLp3i5zu8PA==}
|
resolution: {integrity: sha512-anhPH1uROGEE5IXXFhS3MCRN9kejoBZVcUnwo+uzArvH0ONOVMEc/3AsgnNlbDhXBcYFPSALPQmTMsiK34Aerg==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
slacc-darwin-x64@0.0.10:
|
slacc-darwin-x64@0.1.5:
|
||||||
resolution: {integrity: sha512-5gQYboy/4T6Bj3sVXiCpM3EvF1sK/Zx1Nq5YBMUuYb2GzrIwywghHbCD6bK4JYGvNsLN7r4PC45ZUB4gVkU8yA==}
|
resolution: {integrity: sha512-BcK74s+GydaenPxcF7sHh0O6ksXXDdMYmqHlDHlyfvy1JeIgGGicnek/RQF7KpFR4ztVWCIMCPf08SfcePkUhw==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
slacc-freebsd-x64@0.0.10:
|
slacc-freebsd-x64@0.1.5:
|
||||||
resolution: {integrity: sha512-Jmi5YszELef/aCzYto+LwiNGhCk5mrlJfTJU/pOI91HBbrZlV+aRyIsPCcxAMg5yPsPQuyRljrDouVYrPzNmjw==}
|
resolution: {integrity: sha512-Tvuor8A3lY7+dmK3qBQt2+jSCC8ekJlx5xjMN1ITAw0XabLurpsaiAxlQ2oBr5r6TSli7ifg3eN4KJkjsK0wvw==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [freebsd]
|
os: [freebsd]
|
||||||
|
|
||||||
slacc-linux-arm-gnueabihf@0.0.10:
|
slacc-linux-arm-gnueabihf@0.1.5:
|
||||||
resolution: {integrity: sha512-9lTM3DGtISQlZYSKrMuQyKCiUnHYRcy04mY6HF1ywYcQ2sqfv3bKEnrypVewepIFUtytlIGzkgpiUAk/ghYGoA==}
|
resolution: {integrity: sha512-5UxG9pVO7eHcGsY+ZS4qPrqiDqraOHcjG6igqUJxpumSg7N+OdjwvIpbSc0OE7ihlGfc2BASoMHvCCKAGTGduw==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
slacc-linux-arm64-gnu@0.0.10:
|
slacc-linux-arm64-gnu@0.1.5:
|
||||||
resolution: {integrity: sha512-qXrNWSINXOjHRO3c9idGm8DeOAjAjG1xHY8WiplCoHWgsZf3E7V+sPhWqRUaGQEvftsJg40+cFYREBaLQhpAVQ==}
|
resolution: {integrity: sha512-9lGsHXExvuhnKHbwlPCfyQPrAKERSzTUG3pbB/MIOYRLLdl8/dB/Y9xaKjLs4lcGENjxOc56HWc8ammvt3N8MA==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
libc: [glibc]
|
||||||
|
|
||||||
slacc-linux-arm64-musl@0.0.10:
|
slacc-linux-arm64-musl@0.1.5:
|
||||||
resolution: {integrity: sha512-3lUX7752f6Okn54aONioaA+9M5TvifqXBAart+u2lNXEdWmmh003cVSU2Vcwg7nJ9lLHtju2DkDmKKfJjFuShA==}
|
resolution: {integrity: sha512-NkJWT+0mpXwi8+tmJIbqubunEaqrpDuc+eja4x9ctsZsg8ziyr/7/lw1k5eLgda2bTNk2VWW16G+nJsYoHtdLg==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [musl]
|
libc: [musl]
|
||||||
|
|
||||||
slacc-linux-x64-gnu@0.0.10:
|
slacc-linux-x64-gnu@0.1.5:
|
||||||
resolution: {integrity: sha512-BxxvylF9zlOLRLCpiyMvKTIUpdLlpetNBJ+DSMDh5+Ggq+AmQz2NUGawmcBJw58F8nMCj9TpWLlGNWc2AuY+JQ==}
|
resolution: {integrity: sha512-NRjPRndLumowKUsgjpdX4/JFWDhRuUYBxW3oNMiOBIih3QWQ6c5aSUzp+qtQOpAT3rWUX+u6MJzy01MBK6eUsA==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
libc: [glibc]
|
||||||
|
|
||||||
slacc-linux-x64-musl@0.0.10:
|
slacc-linux-x64-musl@0.1.5:
|
||||||
resolution: {integrity: sha512-TYJi8LOtJiTFcZvka4du7bMjF9Bz1RHRwyLnScr5E5yjjgoLRrsvgSu7bxp87xH+rgJ3CdEwE3w3Ux8EiewHpA==}
|
resolution: {integrity: sha512-bA3wxy3CV92vThnOydEQjSwHKlYmw7TzZAxGjdeUYTcXLGv3kNTFqVlaza51baX1zaAbLugE+XFqaMdWkExZuQ==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
libc: [musl]
|
||||||
|
|
||||||
slacc-win32-arm64-msvc@0.0.10:
|
slacc-win32-arm64-msvc@0.1.5:
|
||||||
resolution: {integrity: sha512-1CHPLiDB4exzFyT5ndtJDsRRhBxNg8mGz6I6eJEMjelGkJR2KZPT9LZuby/1bS/bcVOr7zuJvGNfbEGBeHRwPQ==}
|
resolution: {integrity: sha512-244eoyUKr9ucAbsF7FEKzHXgii/toF78F3Cm0wyUQDg5OT0k6B+Us9+MKL0/DPfqu81FqG/ej1TQTV8zArp01Q==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
slacc-win32-x64-msvc@0.0.10:
|
slacc-win32-x64-msvc@0.1.5:
|
||||||
resolution: {integrity: sha512-wAXBy5yKCAzfYWjVlyPpu6PscD+j4QhCQEy0wZaVuzNyx60HpXWcTZxxVnMR730Y7tfc7cBxSI8NtRb8RguSgg==}
|
resolution: {integrity: sha512-XQVxOJuyklg2u3Sgw4wFTEr6CMiMbzbG2OfJ03K1HrD4rDv6dYSwyJaoTpvcop3Ugr3FqaMRuCS9e9o/Ch+khA==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
slacc@0.0.10:
|
slacc@0.1.5:
|
||||||
resolution: {integrity: sha512-2jgms2/4mLr1AMq4oloAwPdKQK9RQvgmoEpMIxvC+HeHMwCR0XxB7gr/rKo4iLOKJ6gx02mnBU0JHWcTIonpmA==}
|
resolution: {integrity: sha512-rl7VNJQvmxZ/nmBepSGypPi6tNTOTK/j90yVCbqYaeNe7NiZD03SGM5SxpTRwxf2PH30TgDAHWPsjQ9Tt49sMQ==}
|
||||||
engines: {node: '>= 10'}
|
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
|
||||||
|
|
||||||
slash@3.0.0:
|
slash@3.0.0:
|
||||||
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
|
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
|
||||||
@@ -19728,60 +19729,60 @@ snapshots:
|
|||||||
nise: 6.1.1
|
nise: 6.1.1
|
||||||
supports-color: 7.2.0
|
supports-color: 7.2.0
|
||||||
|
|
||||||
slacc-android-arm-eabi@0.0.10:
|
slacc-android-arm-eabi@0.1.5:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
slacc-android-arm64@0.0.10:
|
slacc-android-arm64@0.1.5:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
slacc-darwin-arm64@0.0.10:
|
slacc-darwin-arm64@0.1.5:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
slacc-darwin-universal@0.0.10:
|
slacc-darwin-universal@0.1.5:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
slacc-darwin-x64@0.0.10:
|
slacc-darwin-x64@0.1.5:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
slacc-freebsd-x64@0.0.10:
|
slacc-freebsd-x64@0.1.5:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
slacc-linux-arm-gnueabihf@0.0.10:
|
slacc-linux-arm-gnueabihf@0.1.5:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
slacc-linux-arm64-gnu@0.0.10:
|
slacc-linux-arm64-gnu@0.1.5:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
slacc-linux-arm64-musl@0.0.10:
|
slacc-linux-arm64-musl@0.1.5:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
slacc-linux-x64-gnu@0.0.10:
|
slacc-linux-x64-gnu@0.1.5:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
slacc-linux-x64-musl@0.0.10:
|
slacc-linux-x64-musl@0.1.5:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
slacc-win32-arm64-msvc@0.0.10:
|
slacc-win32-arm64-msvc@0.1.5:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
slacc-win32-x64-msvc@0.0.10:
|
slacc-win32-x64-msvc@0.1.5:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
slacc@0.0.10:
|
slacc@0.1.5:
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
slacc-android-arm-eabi: 0.0.10
|
slacc-android-arm-eabi: 0.1.5
|
||||||
slacc-android-arm64: 0.0.10
|
slacc-android-arm64: 0.1.5
|
||||||
slacc-darwin-arm64: 0.0.10
|
slacc-darwin-arm64: 0.1.5
|
||||||
slacc-darwin-universal: 0.0.10
|
slacc-darwin-universal: 0.1.5
|
||||||
slacc-darwin-x64: 0.0.10
|
slacc-darwin-x64: 0.1.5
|
||||||
slacc-freebsd-x64: 0.0.10
|
slacc-freebsd-x64: 0.1.5
|
||||||
slacc-linux-arm-gnueabihf: 0.0.10
|
slacc-linux-arm-gnueabihf: 0.1.5
|
||||||
slacc-linux-arm64-gnu: 0.0.10
|
slacc-linux-arm64-gnu: 0.1.5
|
||||||
slacc-linux-arm64-musl: 0.0.10
|
slacc-linux-arm64-musl: 0.1.5
|
||||||
slacc-linux-x64-gnu: 0.0.10
|
slacc-linux-x64-gnu: 0.1.5
|
||||||
slacc-linux-x64-musl: 0.0.10
|
slacc-linux-x64-musl: 0.1.5
|
||||||
slacc-win32-arm64-msvc: 0.0.10
|
slacc-win32-arm64-msvc: 0.1.5
|
||||||
slacc-win32-x64-msvc: 0.0.10
|
slacc-win32-x64-msvc: 0.1.5
|
||||||
|
|
||||||
slash@3.0.0: {}
|
slash@3.0.0: {}
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,22 @@ onlyBuiltDependencies:
|
|||||||
ignorePatchFailures: false
|
ignorePatchFailures: false
|
||||||
minimumReleaseAge: 10080 # delay 7days to mitigate supply-chain attack
|
minimumReleaseAge: 10080 # delay 7days to mitigate supply-chain attack
|
||||||
minimumReleaseAgeExclude:
|
minimumReleaseAgeExclude:
|
||||||
- '@syuilo/aiscript'
|
|
||||||
- '@misskey-dev/*'
|
- '@misskey-dev/*'
|
||||||
|
- '@syuilo/aiscript'
|
||||||
|
- buraha
|
||||||
- mfm-js
|
- mfm-js
|
||||||
|
- slacc
|
||||||
|
- slacc-android-arm-eabi
|
||||||
|
- slacc-android-arm64
|
||||||
|
- slacc-darwin-arm64
|
||||||
|
- slacc-darwin-universal
|
||||||
|
- slacc-darwin-x64
|
||||||
|
- slacc-freebsd-x64
|
||||||
|
- slacc-linux-arm-gnueabihf
|
||||||
|
- slacc-linux-arm64-gnu
|
||||||
|
- slacc-linux-arm64-musl
|
||||||
|
- slacc-linux-x64-gnu
|
||||||
|
- slacc-linux-x64-musl
|
||||||
|
- slacc-win32-arm64-msvc
|
||||||
|
- slacc-win32-x64-msvc
|
||||||
- '@typescript/native-preview*'
|
- '@typescript/native-preview*'
|
||||||
|
|||||||
Reference in New Issue
Block a user