Merge branch 'develop' into mahjong
This commit is contained in:
		
						commit
						9ea29fe84c
					
				|  | @ -1,66 +1,23 @@ | |||
| name: Deploy test environment | ||||
| name: deploy-test-environment | ||||
| 
 | ||||
| on: | ||||
|   push: | ||||
|   #push: | ||||
|   workflow_dispatch: | ||||
|     inputs: | ||||
|       repository: | ||||
|         description: 'Repository to deploy (optional)' | ||||
|         type: string | ||||
|         required: false | ||||
|       branch: | ||||
|         description: 'Branch to deploy (optional)' | ||||
|       branch_or_hash: | ||||
|         description: 'Branch or Commit hash to deploy (optional)' | ||||
|         type: string | ||||
|         required: false | ||||
| 
 | ||||
| jobs: | ||||
|   deploy-test-environment: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|     - name: Set environment variable (for tput command & pnpm) | ||||
|       run: | | ||||
|         echo "TERM=xterm" >> $GITHUB_ENV | ||||
|         REPOSITORY=${{ github.event.inputs.repository || github.repository }} | ||||
|         echo "REPOSITORY=$REPOSITORY" >> $GITHUB_ENV | ||||
|         BRANCH=${{ github.event.inputs.branch || github.ref_name }} | ||||
|         echo "BRANCH=$BRANCH" >> $GITHUB_ENV | ||||
| 
 | ||||
|     - name: Checkout | ||||
|       uses: actions/checkout@v4 | ||||
|       with: | ||||
|         repository: ${{ env.REPOSITORY }} | ||||
|         ref: ${{ env.BRANCH }} | ||||
| 
 | ||||
|     - name: Get the latest commit SHA | ||||
|       run: | | ||||
|         SHA=$(git log -1 --format="%H") | ||||
|         echo "SHA=$SHA" >> $GITHUB_ENV | ||||
| 
 | ||||
|     - name: Start cloudflare tunnel (quick) | ||||
|       run: | | ||||
|         wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb | ||||
|         sudo dpkg -i cloudflared-linux-amd64.deb | ||||
|         sudo cloudflared tunnel --metrics localhost:55555 --url localhost:3000 > /dev/null 2>&1 & | ||||
|         sleep 15 | ||||
|         TUNNEL_RESPONSE=$(curl http://localhost:55555/quicktunnel) | ||||
|         TUNNEL_DOMAIN=$(echo $TUNNEL_RESPONSE | grep -o '"hostname":"[^"]*' | grep -o '[^"]*$') | ||||
|         echo "::add-mask::$TUNNEL_DOMAIN" | ||||
|         echo "TUNNEL_DOMAIN=$TUNNEL_DOMAIN" >> $GITHUB_ENV | ||||
| 
 | ||||
|     - name: Install misskey | ||||
|       run: | | ||||
|         wget https://raw.githubusercontent.com/joinmisskey/bash-install/v4/misskey-install.sh | ||||
|         wget https://raw.githubusercontent.com/joinmisskey/bash-install/v4/testenv_githubactions.txt | ||||
|         sed -i "s/host=127.0.0.1/host=$TUNNEL_DOMAIN/g" testenv_githubactions.txt | ||||
|         sed -i "s|git_repository=https://github.com/misskey-dev/misskey|git_repository=https://github.com/$REPOSITORY|g" testenv_githubactions.txt | ||||
|         sed -i "s|git_branch=master|git_branch=$BRANCH|g" testenv_githubactions.txt | ||||
|         sudo chmod 555 ./misskey-install.sh | ||||
|         sudo bash -x ./misskey-install.sh -c ./testenv_githubactions.txt | ||||
| 
 | ||||
|     - name: Post tunnel info to Discord | ||||
|       run: | | ||||
|         CURRENT_TIME=$(TZ=Asia/Tokyo date +'%Y-%m-%d %H:%M:%S JST') | ||||
|         COMMIT_URL="https://github.com/$REPOSITORY/commit/$SHA" | ||||
|         curl -X POST -H "Content-Type: application/json" -d "{\"content\": \"==============================\nURL: https://$TUNNEL_DOMAIN\nRepository: $REPOSITORY\nBranch: $BRANCH\nCommit: $COMMIT_URL\nTime: $CURRENT_TIME\n==============================\"}" ${{ secrets.DISCORD_WEBHOOK_URL }} | ||||
| 
 | ||||
|     - name: Wait | ||||
|       run: | | ||||
|         timeout 3600 tail -f /var/log/syslog || true | ||||
|     uses: joinmisskey/misskey-tga/.github/workflows/deploy-test-environment.yml@main | ||||
|     with: | ||||
|       repository: ${{ github.event.inputs.repository }} | ||||
|       branch_or_hash: ${{ github.event.inputs.branch_or_hash }} | ||||
|     secrets: | ||||
|       DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ jobs: | |||
|         private_key: ${{ secrets.DEPLOYBOT_PRIVATE_KEY }} | ||||
| 
 | ||||
|     - name: Slash Command Dispatch | ||||
|       uses: peter-evans/slash-command-dispatch@v3 | ||||
|       uses: peter-evans/slash-command-dispatch@v4 | ||||
|       env: | ||||
|         TOKEN: ${{ steps.generate_token.outputs.token }} | ||||
|       with: | ||||
|  |  | |||
|  | @ -61,7 +61,7 @@ jobs: | |||
|     - name: Test | ||||
|       run: pnpm --filter backend test-and-coverage | ||||
|     - name: Upload to Codecov | ||||
|       uses: codecov/codecov-action@v3 | ||||
|       uses: codecov/codecov-action@v4 | ||||
|       with: | ||||
|         token: ${{ secrets.CODECOV_TOKEN }} | ||||
|         files: ./packages/backend/coverage/coverage-final.json | ||||
|  | @ -111,7 +111,7 @@ jobs: | |||
|       - name: Test | ||||
|         run: pnpm --filter backend test-and-coverage:e2e | ||||
|       - name: Upload to Codecov | ||||
|         uses: codecov/codecov-action@v3 | ||||
|         uses: codecov/codecov-action@v4 | ||||
|         with: | ||||
|           token: ${{ secrets.CODECOV_TOKEN }} | ||||
|           files: ./packages/backend/coverage/coverage-final.json | ||||
|  |  | |||
|  | @ -53,7 +53,7 @@ jobs: | |||
|     - name: Test | ||||
|       run: pnpm --filter frontend test-and-coverage | ||||
|     - name: Upload Coverage | ||||
|       uses: codecov/codecov-action@v3 | ||||
|       uses: codecov/codecov-action@v4 | ||||
|       with: | ||||
|         token: ${{ secrets.CODECOV_TOKEN }} | ||||
|         files: ./packages/frontend/coverage/coverage-final.json | ||||
|  |  | |||
|  | @ -50,7 +50,7 @@ jobs: | |||
|           CI: true | ||||
| 
 | ||||
|       - name: Upload Coverage | ||||
|         uses: codecov/codecov-action@v3 | ||||
|         uses: codecov/codecov-action@v4 | ||||
|         with: | ||||
|           token: ${{ secrets.CODECOV_TOKEN }} | ||||
|           files: ./packages/misskey-js/coverage/coverage-final.json | ||||
|  |  | |||
|  | @ -21,6 +21,9 @@ | |||
| - Feat: [mCaptcha](https://github.com/mCaptcha/mCaptcha)のサポートを追加 | ||||
| - Fix: リストライムラインの「リノートを表示」が正しく機能しない問題を修正 | ||||
| - Feat: Add support for TrueMail | ||||
| - Fix: リモートユーザーのリアクション一覧がすべて見えてしまうのを修正 | ||||
|   * すべてのリモートユーザーのリアクション一覧を見えないようにします | ||||
| - Enhance: モデレーターはすべてのユーザーのリアクション一覧を見られるように | ||||
| 
 | ||||
| ### Client | ||||
| - Feat: 新しいゲームを追加 | ||||
|  | @ -58,6 +61,7 @@ | |||
| - Fix: プラグインで`Plugin:register_note_post_interruptor`を使用すると、ノートが投稿できなくなる問題を修正 | ||||
| - Enhance: ページ遷移時にPlayerを閉じるように | ||||
| - Fix: iOSで大きな画像を変換してアップロードできない問題を修正 | ||||
| - Fix: 「アニメーション画像を再生しない」もしくは「データセーバー(アイコン)」を有効にしていても、アイコンデコレーションのアニメーションが停止されない問題を修正 | ||||
| 
 | ||||
| ### Server | ||||
| - Enhance: 連合先のレートリミットに引っかかった際にリトライするようになりました | ||||
|  | @ -71,6 +75,7 @@ | |||
| - Fix: ipv4とipv6の両方が利用可能な環境でallowedPrivateNetworksが設定されていた場合プライベートipの検証ができていなかった問題を修正 | ||||
| - Fix: properly handle cc followers | ||||
| - Fix: ジョブに関する設定の名前を修正 relashionshipJobPerSec -> relationshipJobPerSec | ||||
| - Fix: コントロールパネル->モデレーション->「誰でも新規登録できるようにする」の初期値をONからOFFに変更 #13122 | ||||
| 
 | ||||
| ### Service Worker | ||||
| - Enhance: オフライン表示のデザインを改善・多言語対応 | ||||
|  |  | |||
|  | @ -3,6 +3,6 @@ import { genOpenapiSpec } from './built/server/api/openapi/gen-spec.js' | |||
| import { writeFileSync } from "node:fs"; | ||||
| 
 | ||||
| const config = loadConfig(); | ||||
| const spec = genOpenapiSpec(config); | ||||
| const spec = genOpenapiSpec(config, true); | ||||
| 
 | ||||
| writeFileSync('./built/api.json', JSON.stringify(spec), 'utf-8'); | ||||
|  | @ -0,0 +1,16 @@ | |||
| /* | ||||
|  * SPDX-FileCopyrightText: syuilo and other misskey contributors | ||||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
| 
 | ||||
| export class FixMetaDisableRegistration1706791962000 { | ||||
|     name = 'FixMetaDisableRegistration1706791962000' | ||||
| 
 | ||||
|     async up(queryRunner) { | ||||
|         await queryRunner.query(`alter table meta alter column "disableRegistration" set default true;`); | ||||
|     } | ||||
| 
 | ||||
|     async down(queryRunner) { | ||||
|         await queryRunner.query(`alter table meta alter column "disableRegistration" set default false;`); | ||||
|     } | ||||
| } | ||||
|  | @ -409,7 +409,7 @@ export class UserEntityService implements OnModuleInit { | |||
| 				}), | ||||
| 				pinnedPageId: profile!.pinnedPageId, | ||||
| 				pinnedPage: profile!.pinnedPageId ? this.pageEntityService.pack(profile!.pinnedPageId, me) : null, | ||||
| 				publicReactions: profile!.publicReactions, | ||||
| 				publicReactions: this.isLocalUser(user) ? profile!.publicReactions : false, // https://github.com/misskey-dev/misskey/issues/12964
 | ||||
| 				followersVisibility: profile!.followersVisibility, | ||||
| 				followingVisibility: profile!.followingVisibility, | ||||
| 				twoFactorEnabled: profile!.twoFactorEnabled, | ||||
|  |  | |||
|  | @ -121,6 +121,7 @@ export interface Schema extends OfSchema { | |||
| 	readonly example?: any; | ||||
| 	readonly format?: string; | ||||
| 	readonly ref?: keyof typeof refs; | ||||
| 	readonly selfRef?: boolean; | ||||
| 	readonly enum?: ReadonlyArray<string | null>; | ||||
| 	readonly default?: (this['type'] extends TypeStringef ? StringDefToType<this['type']> : any) | null; | ||||
| 	readonly maxLength?: number; | ||||
|  |  | |||
|  | @ -53,6 +53,7 @@ const sectionBlockSchema = { | |||
| 				type: 'object', | ||||
| 				optional: false, nullable: false, | ||||
| 				ref: 'PageBlock', | ||||
| 				selfRef: true, | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
|  |  | |||
|  | @ -9,6 +9,9 @@ import { Endpoint } from '@/server/api/endpoint-base.js'; | |||
| import { QueryService } from '@/core/QueryService.js'; | ||||
| import { NoteReactionEntityService } from '@/core/entities/NoteReactionEntityService.js'; | ||||
| import { DI } from '@/di-symbols.js'; | ||||
| import { CacheService } from '@/core/CacheService.js'; | ||||
| import { UserEntityService } from '@/core/entities/UserEntityService.js'; | ||||
| import { RoleService } from '@/core/RoleService.js'; | ||||
| import { ApiError } from '../../error.js'; | ||||
| 
 | ||||
| export const meta = { | ||||
|  | @ -34,6 +37,11 @@ export const meta = { | |||
| 			code: 'REACTIONS_NOT_PUBLIC', | ||||
| 			id: '673a7dd2-6924-1093-e0c0-e68456ceae5c', | ||||
| 		}, | ||||
| 		isRemoteUser: { | ||||
| 			message: 'Currently unavailable to display reactions of remote users. See https://github.com/misskey-dev/misskey/issues/12964', | ||||
| 			code: 'IS_REMOTE_USER', | ||||
| 			id: '6b95fa98-8cf9-2350-e284-f0ffdb54a805', | ||||
| 		}, | ||||
| 	}, | ||||
| } as const; | ||||
| 
 | ||||
|  | @ -59,14 +67,24 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint- | |||
| 		@Inject(DI.noteReactionsRepository) | ||||
| 		private noteReactionsRepository: NoteReactionsRepository, | ||||
| 
 | ||||
| 		private cacheService: CacheService, | ||||
| 		private userEntityService: UserEntityService, | ||||
| 		private noteReactionEntityService: NoteReactionEntityService, | ||||
| 		private queryService: QueryService, | ||||
| 		private roleService: RoleService, | ||||
| 	) { | ||||
| 		super(meta, paramDef, async (ps, me) => { | ||||
| 			const profile = await this.userProfilesRepository.findOneByOrFail({ userId: ps.userId }); | ||||
| 			const iAmModerator = me ? await this.roleService.isModerator(me) : false; // Moderators can see reactions of all users
 | ||||
| 			if (!iAmModerator) { | ||||
| 				const user = await this.cacheService.findUserById(ps.userId); | ||||
| 				if (this.userEntityService.isRemoteUser(user)) { | ||||
| 					throw new ApiError(meta.errors.isRemoteUser); | ||||
| 				} | ||||
| 
 | ||||
| 			if ((me == null || me.id !== ps.userId) && !profile.publicReactions) { | ||||
| 				throw new ApiError(meta.errors.reactionsNotPublic); | ||||
| 				const profile = await this.userProfilesRepository.findOneByOrFail({ userId: ps.userId }); | ||||
| 				if ((me == null || me.id !== ps.userId) && !profile.publicReactions) { | ||||
| 					throw new ApiError(meta.errors.reactionsNotPublic); | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			const query = this.queryService.makePaginationQuery(this.noteReactionsRepository.createQueryBuilder('reaction'), | ||||
|  |  | |||
|  | @ -6,9 +6,9 @@ | |||
| import type { Config } from '@/config.js'; | ||||
| import endpoints, { IEndpoint } from '../endpoints.js'; | ||||
| import { errors as basicErrors } from './errors.js'; | ||||
| import { schemas, convertSchemaToOpenApiSchema } from './schemas.js'; | ||||
| import { getSchemas, convertSchemaToOpenApiSchema } from './schemas.js'; | ||||
| 
 | ||||
| export function genOpenapiSpec(config: Config) { | ||||
| export function genOpenapiSpec(config: Config, includeSelfRef = false) { | ||||
| 	const spec = { | ||||
| 		openapi: '3.1.0', | ||||
| 
 | ||||
|  | @ -30,7 +30,7 @@ export function genOpenapiSpec(config: Config) { | |||
| 		paths: {} as any, | ||||
| 
 | ||||
| 		components: { | ||||
| 			schemas: schemas, | ||||
| 			schemas: getSchemas(includeSelfRef), | ||||
| 
 | ||||
| 			securitySchemes: { | ||||
| 				bearerAuth: { | ||||
|  | @ -56,7 +56,7 @@ export function genOpenapiSpec(config: Config) { | |||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		const resSchema = endpoint.meta.res ? convertSchemaToOpenApiSchema(endpoint.meta.res, 'res') : {}; | ||||
| 		const resSchema = endpoint.meta.res ? convertSchemaToOpenApiSchema(endpoint.meta.res, 'res', includeSelfRef) : {}; | ||||
| 
 | ||||
| 		let desc = (endpoint.meta.description ? endpoint.meta.description : 'No description provided.') + '\n\n'; | ||||
| 
 | ||||
|  | @ -71,7 +71,7 @@ export function genOpenapiSpec(config: Config) { | |||
| 		} | ||||
| 
 | ||||
| 		const requestType = endpoint.meta.requireFile ? 'multipart/form-data' : 'application/json'; | ||||
| 		const schema = { ...convertSchemaToOpenApiSchema(endpoint.params, 'param') }; | ||||
| 		const schema = { ...convertSchemaToOpenApiSchema(endpoint.params, 'param', false) }; | ||||
| 
 | ||||
| 		if (endpoint.meta.requireFile) { | ||||
| 			schema.properties = { | ||||
|  |  | |||
|  | @ -6,10 +6,10 @@ | |||
| import type { Schema } from '@/misc/json-schema.js'; | ||||
| import { refs } from '@/misc/json-schema.js'; | ||||
| 
 | ||||
| export function convertSchemaToOpenApiSchema(schema: Schema, type: 'param' | 'res') { | ||||
| export function convertSchemaToOpenApiSchema(schema: Schema, type: 'param' | 'res', includeSelfRef: boolean): any { | ||||
| 	// optional, nullable, refはスキーマ定義に含まれないので分離しておく
 | ||||
| 	// eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
| 	const { optional, nullable, ref, ...res }: any = schema; | ||||
| 	const { optional, nullable, ref, selfRef, ...res }: any = schema; | ||||
| 
 | ||||
| 	if (schema.type === 'object' && schema.properties) { | ||||
| 		if (type === 'res') { | ||||
|  | @ -21,20 +21,20 @@ export function convertSchemaToOpenApiSchema(schema: Schema, type: 'param' | 're | |||
| 		} | ||||
| 
 | ||||
| 		for (const k of Object.keys(schema.properties)) { | ||||
| 			res.properties[k] = convertSchemaToOpenApiSchema(schema.properties[k], type); | ||||
| 			res.properties[k] = convertSchemaToOpenApiSchema(schema.properties[k], type, includeSelfRef); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (schema.type === 'array' && schema.items) { | ||||
| 		res.items = convertSchemaToOpenApiSchema(schema.items, type); | ||||
| 		res.items = convertSchemaToOpenApiSchema(schema.items, type, includeSelfRef); | ||||
| 	} | ||||
| 
 | ||||
| 	for (const o of ['anyOf', 'oneOf', 'allOf'] as const) { | ||||
| 		// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
 | ||||
| 		if (o in schema) res[o] = schema[o]!.map(schema => convertSchemaToOpenApiSchema(schema, type)); | ||||
| 		if (o in schema) res[o] = schema[o]!.map(schema => convertSchemaToOpenApiSchema(schema, type, includeSelfRef)); | ||||
| 	} | ||||
| 
 | ||||
| 	if (type === 'res' && schema.ref) { | ||||
| 	if (type === 'res' && schema.ref && (!schema.selfRef || includeSelfRef)) { | ||||
| 		const $ref = `#/components/schemas/${schema.ref}`; | ||||
| 		if (schema.nullable || schema.optional) { | ||||
| 			res.allOf = [{ $ref }]; | ||||
|  | @ -54,35 +54,37 @@ export function convertSchemaToOpenApiSchema(schema: Schema, type: 'param' | 're | |||
| 	return res; | ||||
| } | ||||
| 
 | ||||
| export const schemas = { | ||||
| 	Error: { | ||||
| 		type: 'object', | ||||
| 		properties: { | ||||
| 			error: { | ||||
| 				type: 'object', | ||||
| 				description: 'An error object.', | ||||
| 				properties: { | ||||
| 					code: { | ||||
| 						type: 'string', | ||||
| 						description: 'An error code. Unique within the endpoint.', | ||||
| 					}, | ||||
| 					message: { | ||||
| 						type: 'string', | ||||
| 						description: 'An error message.', | ||||
| 					}, | ||||
| 					id: { | ||||
| 						type: 'string', | ||||
| 						format: 'uuid', | ||||
| 						description: 'An error ID. This ID is static.', | ||||
| export function getSchemas(includeSelfRef: boolean) { | ||||
| 	return { | ||||
| 		Error: { | ||||
| 			type: 'object', | ||||
| 			properties: { | ||||
| 				error: { | ||||
| 					type: 'object', | ||||
| 					description: 'An error object.', | ||||
| 					properties: { | ||||
| 						code: { | ||||
| 							type: 'string', | ||||
| 							description: 'An error code. Unique within the endpoint.', | ||||
| 						}, | ||||
| 						message: { | ||||
| 							type: 'string', | ||||
| 							description: 'An error message.', | ||||
| 						}, | ||||
| 						id: { | ||||
| 							type: 'string', | ||||
| 							format: 'uuid', | ||||
| 							description: 'An error ID. This ID is static.', | ||||
| 						}, | ||||
| 					}, | ||||
| 					required: ['code', 'id', 'message'], | ||||
| 				}, | ||||
| 				required: ['code', 'id', 'message'], | ||||
| 			}, | ||||
| 			required: ['error'], | ||||
| 		}, | ||||
| 		required: ['error'], | ||||
| 	}, | ||||
| 
 | ||||
| 	...Object.fromEntries( | ||||
| 		Object.entries(refs).map(([key, schema]) => [key, convertSchemaToOpenApiSchema(schema, 'res')]), | ||||
| 	), | ||||
| }; | ||||
| 		...Object.fromEntries( | ||||
| 			Object.entries(refs).map(([key, schema]) => [key, convertSchemaToOpenApiSchema(schema, 'res', includeSelfRef)]), | ||||
| 		), | ||||
| 	}; | ||||
| } | ||||
|  |  | |||
|  | @ -61,7 +61,7 @@ | |||
| 		"rollup": "4.9.6", | ||||
| 		"sanitize-html": "2.11.0", | ||||
| 		"sass": "1.70.0", | ||||
| 		"shiki": "0.14.7", | ||||
| 		"shiki": "1.0.0-beta.3", | ||||
| 		"strict-event-emitter-types": "2.0.0", | ||||
| 		"textarea-caret": "3.1.0", | ||||
| 		"three": "0.160.1", | ||||
|  | @ -135,6 +135,7 @@ | |||
| 		"vite-plugin-turbosnap": "1.0.3", | ||||
| 		"vitest": "0.34.6", | ||||
| 		"vitest-fetch-mock": "0.2.2", | ||||
| 		"vue-component-type-helpers": "^1.8.27", | ||||
| 		"vue-eslint-parser": "9.4.2", | ||||
| 		"vue-tsc": "1.8.27" | ||||
| 	} | ||||
|  |  | |||
|  | @ -431,7 +431,7 @@ function applySelect() { | |||
| 
 | ||||
| function chooseUser() { | ||||
| 	props.close(); | ||||
| 	os.selectUser().then(user => { | ||||
| 	os.selectUser({ includeSelf: true }).then(user => { | ||||
| 		complete('user', user); | ||||
| 		props.textarea.focus(); | ||||
| 	}); | ||||
|  |  | |||
|  | @ -30,9 +30,9 @@ function onClick(item: LegendItem) { | |||
| 	if (chart.value == null) return; | ||||
| 	if (type.value === 'pie' || type.value === 'doughnut') { | ||||
| 		// Pie and doughnut charts only have a single dataset and visibility is per item | ||||
| 		if (item.index) chart.value.toggleDataVisibility(item.index); | ||||
| 		if (item.index != null) chart.value.toggleDataVisibility(item.index); | ||||
| 	} else { | ||||
| 		if (item.datasetIndex) chart.value.setDatasetVisibility(item.datasetIndex, !chart.value.isDatasetVisible(item.datasetIndex)); | ||||
| 		if (item.datasetIndex != null) chart.value.setDatasetVisibility(item.datasetIndex, !chart.value.isDatasetVisible(item.datasetIndex)); | ||||
| 	} | ||||
| 	chart.value.update(); | ||||
| } | ||||
|  |  | |||
|  | @ -5,13 +5,13 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| 
 | ||||
| <!-- eslint-disable vue/no-v-html --> | ||||
| <template> | ||||
| <div :class="['codeBlockRoot', { 'codeEditor': codeEditor }]" v-html="html"></div> | ||||
| <div :class="[$style.codeBlockRoot, { [$style.codeEditor]: codeEditor }]" v-html="html"></div> | ||||
| </template> | ||||
| 
 | ||||
| <script lang="ts" setup> | ||||
| import { ref, computed, watch } from 'vue'; | ||||
| import { BUNDLED_LANGUAGES } from 'shiki'; | ||||
| import type { Lang as ShikiLang } from 'shiki'; | ||||
| import { bundledLanguagesInfo } from 'shiki'; | ||||
| import type { BuiltinLanguage } from 'shiki'; | ||||
| import { getHighlighter } from '@/scripts/code-highlighter.js'; | ||||
| 
 | ||||
| const props = defineProps<{ | ||||
|  | @ -22,24 +22,25 @@ const props = defineProps<{ | |||
| 
 | ||||
| const highlighter = await getHighlighter(); | ||||
| 
 | ||||
| const codeLang = ref<ShikiLang | 'aiscript'>('js'); | ||||
| const codeLang = ref<BuiltinLanguage | 'aiscript'>('js'); | ||||
| const html = computed(() => highlighter.codeToHtml(props.code, { | ||||
| 	lang: codeLang.value, | ||||
| 	theme: 'dark-plus', | ||||
| })); | ||||
| 
 | ||||
| async function fetchLanguage(to: string): Promise<void> { | ||||
| 	const language = to as ShikiLang; | ||||
| 	const language = to as BuiltinLanguage; | ||||
| 
 | ||||
| 	// Check for the loaded languages, and load the language if it's not loaded yet. | ||||
| 	if (!highlighter.getLoadedLanguages().includes(language)) { | ||||
| 		// Check if the language is supported by Shiki | ||||
| 		const bundles = BUNDLED_LANGUAGES.filter((bundle) => { | ||||
| 		const bundles = bundledLanguagesInfo.filter((bundle) => { | ||||
| 			// Languages are specified by their id, they can also have aliases (i. e. "js" and "javascript") | ||||
| 			return bundle.id === language || bundle.aliases?.includes(language); | ||||
| 		}); | ||||
| 		if (bundles.length > 0) { | ||||
| 			await highlighter.loadLanguage(language); | ||||
| 			console.log(`Loading language: ${language}`); | ||||
| 			await highlighter.loadLanguage(bundles[0].import); | ||||
| 			codeLang.value = language; | ||||
| 		} else { | ||||
| 			codeLang.value = 'js'; | ||||
|  | @ -57,8 +58,8 @@ watch(() => props.lang, (to) => { | |||
| }, { immediate: true }); | ||||
| </script> | ||||
| 
 | ||||
| <style scoped lang="scss"> | ||||
| .codeBlockRoot :deep(.shiki) { | ||||
| <style module lang="scss"> | ||||
| .codeBlockRoot :global(.shiki) { | ||||
| 	padding: 1em; | ||||
| 	margin: .5em 0; | ||||
| 	overflow: auto; | ||||
|  | @ -74,7 +75,7 @@ watch(() => props.lang, (to) => { | |||
| 	min-width: 100%; | ||||
| 	height: 100%; | ||||
| 
 | ||||
| 	& :deep(.shiki) { | ||||
| 	& :global(.shiki) { | ||||
| 		padding: 12px; | ||||
| 		margin: 0; | ||||
| 		border-radius: 6px; | ||||
|  |  | |||
|  | @ -396,6 +396,7 @@ onDeactivated(() => { | |||
| 
 | ||||
| .hidden { | ||||
| 	width: 100%; | ||||
| 	height: 100%; | ||||
| 	background: #000; | ||||
| 	border: none; | ||||
| 	outline: none; | ||||
|  |  | |||
|  | @ -263,7 +263,12 @@ const translation = ref<Misskey.entities.NotesTranslateResponse | null>(null); | |||
| const translating = ref(false); | ||||
| const showTicker = (defaultStore.state.instanceTicker === 'always') || (defaultStore.state.instanceTicker === 'remote' && appearNote.value.user.instance); | ||||
| const canRenote = computed(() => ['public', 'home'].includes(appearNote.value.visibility) || (appearNote.value.visibility === 'followers' && appearNote.value.userId === $i?.id)); | ||||
| const renoteCollapsed = ref(defaultStore.state.collapseRenotes && isRenote && (($i && ($i.id === note.value.userId || $i.id === appearNote.value.userId)) ?? (appearNote.value.myReaction != null))); | ||||
| const renoteCollapsed = ref( | ||||
| 	defaultStore.state.collapseRenotes && isRenote && ( | ||||
| 		($i && ($i.id === note.value.userId || $i.id === appearNote.value.userId)) || // `||` must be `||`! See https://github.com/misskey-dev/misskey/issues/13131 | ||||
| 		(appearNote.value.myReaction != null) | ||||
| 	) | ||||
| ); | ||||
| 
 | ||||
| /* Overload FunctionにLintが対応していないのでコメントアウト | ||||
| function checkMute(noteToCheck: Misskey.entities.Note, mutedWords: Array<string | string[]> | undefined | null, checkOnly: true): boolean; | ||||
|  |  | |||
|  | @ -860,7 +860,7 @@ function cancel() { | |||
| } | ||||
| 
 | ||||
| function insertMention() { | ||||
| 	os.selectUser().then(user => { | ||||
| 	os.selectUser({ localOnly: localOnly.value, includeSelf: true }).then(user => { | ||||
| 		insertTextAtCursor(textareaEl.value, '@' + Misskey.acct.toString(user) + ' '); | ||||
| 	}); | ||||
| } | ||||
|  |  | |||
|  | @ -78,10 +78,13 @@ const emit = defineEmits<{ | |||
| 	(ev: 'closed'): void; | ||||
| }>(); | ||||
| 
 | ||||
| const props = defineProps<{ | ||||
| const props = withDefaults(defineProps<{ | ||||
| 	includeSelf?: boolean; | ||||
| 	localOnly?: boolean; | ||||
| }>(); | ||||
| }>(), { | ||||
| 	includeSelf: false, | ||||
| 	localOnly: false, | ||||
| }); | ||||
| 
 | ||||
| const username = ref(''); | ||||
| const host = ref(''); | ||||
|  | @ -102,10 +105,10 @@ function search() { | |||
| 		detail: false, | ||||
| 	}).then(_users => { | ||||
| 		users.value = _users.filter((u) => { | ||||
| 			if (props.includeSelf === false) { | ||||
| 				return u.id !== $i?.id; | ||||
| 			} else { | ||||
| 			if (props.includeSelf) { | ||||
| 				return true; | ||||
| 			} else { | ||||
| 				return u.id !== $i?.id; | ||||
| 			} | ||||
| 		}); | ||||
| 	}); | ||||
|  | @ -146,10 +149,10 @@ onMounted(() => { | |||
| 			} | ||||
| 		}); | ||||
| 		_users = _users.filter((u) => { | ||||
| 			if (props.includeSelf === false) { | ||||
| 				return u.id !== $i?.id; | ||||
| 			} else { | ||||
| 			if (props.includeSelf) { | ||||
| 				return true; | ||||
| 			} else { | ||||
| 				return u.id !== $i?.id; | ||||
| 			} | ||||
| 		}); | ||||
| 		recentUsers.value = _users; | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| 		<img | ||||
| 			v-for="decoration in decorations ?? user.avatarDecorations" | ||||
| 			:class="[$style.decoration]" | ||||
| 			:src="decoration.url" | ||||
| 			:src="getDecorationUrl(decoration)" | ||||
| 			:style="{ | ||||
| 				rotate: getDecorationAngle(decoration), | ||||
| 				scale: getDecorationScale(decoration), | ||||
|  | @ -92,6 +92,11 @@ function onClick(ev: MouseEvent): void { | |||
| 	emit('click', ev); | ||||
| } | ||||
| 
 | ||||
| function getDecorationUrl(decoration: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>) { | ||||
| 	if (defaultStore.state.disableShowingAnimatedImages || defaultStore.state.dataSaver.avatar) return getStaticImageUrl(decoration.url); | ||||
| 	return decoration.url; | ||||
| } | ||||
| 
 | ||||
| function getDecorationAngle(decoration: Omit<Misskey.entities.UserDetailed['avatarDecorations'][number], 'id'>) { | ||||
| 	const angle = decoration.angle ?? 0; | ||||
| 	return angle === 0 ? undefined : `${angle * 360}deg`; | ||||
|  |  | |||
|  | @ -9,6 +9,7 @@ import { Component, markRaw, Ref, ref, defineAsyncComponent } from 'vue'; | |||
| import { EventEmitter } from 'eventemitter3'; | ||||
| import insertTextAtCursor from 'insert-text-at-cursor'; | ||||
| import * as Misskey from 'misskey-js'; | ||||
| import type { ComponentProps } from 'vue-component-type-helpers'; | ||||
| import { misskeyApi } from '@/scripts/misskey-api.js'; | ||||
| import { i18n } from '@/i18n.js'; | ||||
| import MkPostFormDialog from '@/components/MkPostFormDialog.vue'; | ||||
|  | @ -143,7 +144,7 @@ export function claimZIndex(priority: keyof typeof zIndexes = 'low'): number { | |||
| 	return zIndexes[priority]; | ||||
| } | ||||
| 
 | ||||
| export async function popup(component: Component, props: Record<string, any>, events = {}, disposeEvent?: string) { | ||||
| export async function popup<T extends Component>(component: T, props: ComponentProps<T>, events = {}, disposeEvent?: string) { | ||||
| 	markRaw(component); | ||||
| 
 | ||||
| 	const id = ++popupIdCount; | ||||
|  |  | |||
|  | @ -45,7 +45,7 @@ async function init() { | |||
| } | ||||
| 
 | ||||
| function chooseProxyAccount() { | ||||
| 	os.selectUser().then(user => { | ||||
| 	os.selectUser({ localOnly: true }).then(user => { | ||||
| 		proxyAccount.value = user; | ||||
| 		proxyAccountId.value = user.id; | ||||
| 		save(); | ||||
|  |  | |||
|  | @ -116,9 +116,7 @@ async function del() { | |||
| } | ||||
| 
 | ||||
| async function assign() { | ||||
| 	const user = await os.selectUser({ | ||||
| 		includeSelf: true, | ||||
| 	}); | ||||
| 	const user = await os.selectUser({ includeSelf: true }); | ||||
| 
 | ||||
| 	const { canceled: canceled2, result: period } = await os.select({ | ||||
| 		title: i18n.ts.period, | ||||
|  |  | |||
|  | @ -90,7 +90,7 @@ const pagination = { | |||
| }; | ||||
| 
 | ||||
| function searchUser() { | ||||
| 	os.selectUser().then(user => { | ||||
| 	os.selectUser({ includeSelf: true }).then(user => { | ||||
| 		show(user); | ||||
| 	}); | ||||
| } | ||||
|  |  | |||
|  | @ -129,7 +129,7 @@ async function deleteAntenna() { | |||
| } | ||||
| 
 | ||||
| function addUser() { | ||||
| 	os.selectUser().then(user => { | ||||
| 	os.selectUser({ includeSelf: true }).then(user => { | ||||
| 		users.value = users.value.trim(); | ||||
| 		users.value += '\n@' + Misskey.acct.toString(user as any); | ||||
| 		users.value = users.value.trim(); | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| 			<div class="_gaps_m"> | ||||
| 				<MkSwitch v-model="isLocalOnly">{{ i18n.ts.localOnly }}</MkSwitch> | ||||
| 
 | ||||
| 				<MkFolder> | ||||
| 				<MkFolder :defaultOpen="true"> | ||||
| 					<template #label>{{ i18n.ts.specifyUser }}</template> | ||||
| 					<template v-if="user" #suffix>@{{ user.username }}</template> | ||||
| 
 | ||||
|  | @ -64,7 +64,7 @@ const user = ref<any>(null); | |||
| const isLocalOnly = ref(false); | ||||
| 
 | ||||
| function selectUser() { | ||||
| 	os.selectUser().then(_user => { | ||||
| 	os.selectUser({ includeSelf: true }).then(_user => { | ||||
| 		user.value = _user; | ||||
| 	}); | ||||
| } | ||||
|  |  | |||
|  | @ -96,7 +96,7 @@ const headerTabs = computed(() => user.value ? [{ | |||
| 	key: 'achievements', | ||||
| 	title: i18n.ts.achievements, | ||||
| 	icon: 'ti ti-medal', | ||||
| }] : []), ...($i && ($i.id === user.value.id)) || user.value.publicReactions ? [{ | ||||
| }] : []), ...($i && ($i.id === user.value.id || $i.isAdmin || $i.isModerator)) || user.value.publicReactions ? [{ | ||||
| 	key: 'reactions', | ||||
| 	title: i18n.ts.reaction, | ||||
| 	icon: 'ti ti-mood-happy', | ||||
|  |  | |||
|  | @ -1,7 +1,6 @@ | |||
| import { setWasm, setCDN, Highlighter, getHighlighter as _getHighlighter } from 'shiki'; | ||||
| 
 | ||||
| setWasm('/assets/shiki/dist/onig.wasm'); | ||||
| setCDN('/assets/shiki/'); | ||||
| import { getHighlighterCore, loadWasm } from 'shiki/core'; | ||||
| import darkPlus from 'shiki/themes/dark-plus.mjs'; | ||||
| import type { Highlighter, LanguageRegistration } from 'shiki'; | ||||
| 
 | ||||
| let _highlighter: Highlighter | null = null; | ||||
| 
 | ||||
|  | @ -13,16 +12,19 @@ export async function getHighlighter(): Promise<Highlighter> { | |||
| } | ||||
| 
 | ||||
| export async function initHighlighter() { | ||||
| 	const highlighter = await _getHighlighter({ | ||||
| 		theme: 'dark-plus', | ||||
| 		langs: ['js'], | ||||
| 	}); | ||||
| 	const aiScriptGrammar = await import('aiscript-vscode/aiscript/syntaxes/aiscript.tmLanguage.json'); | ||||
| 
 | ||||
| 	await highlighter.loadLanguage({ | ||||
| 		path: 'languages/aiscript.tmLanguage.json', | ||||
| 		id: 'aiscript', | ||||
| 		scopeName: 'source.aiscript', | ||||
| 		aliases: ['is', 'ais'], | ||||
| 	await loadWasm(import('shiki/onig.wasm?init')); | ||||
| 
 | ||||
| 	const highlighter = await getHighlighterCore({ | ||||
| 		themes: [darkPlus], | ||||
| 		langs: [ | ||||
| 			import('shiki/langs/javascript.mjs'), | ||||
| 			{ | ||||
| 				aliases: ['is', 'ais'], | ||||
| 				...aiScriptGrammar.default, | ||||
| 			} as unknown as LanguageRegistration, | ||||
| 		], | ||||
| 	}); | ||||
| 
 | ||||
| 	_highlighter = highlighter; | ||||
|  |  | |||
							
								
								
									
										113
									
								
								pnpm-lock.yaml
								
								
								
								
							
							
						
						
									
										113
									
								
								pnpm-lock.yaml
								
								
								
								
							|  | @ -803,8 +803,8 @@ importers: | |||
|         specifier: 1.70.0 | ||||
|         version: 1.70.0 | ||||
|       shiki: | ||||
|         specifier: 0.14.7 | ||||
|         version: 0.14.7 | ||||
|         specifier: 1.0.0-beta.3 | ||||
|         version: 1.0.0-beta.3 | ||||
|       strict-event-emitter-types: | ||||
|         specifier: 2.0.0 | ||||
|         version: 2.0.0 | ||||
|  | @ -1019,6 +1019,9 @@ importers: | |||
|       vitest-fetch-mock: | ||||
|         specifier: 0.2.2 | ||||
|         version: 0.2.2(vitest@0.34.6) | ||||
|       vue-component-type-helpers: | ||||
|         specifier: ^1.8.27 | ||||
|         version: 1.8.27 | ||||
|       vue-eslint-parser: | ||||
|         specifier: 9.4.2 | ||||
|         version: 9.4.2(eslint@8.56.0) | ||||
|  | @ -1946,7 +1949,7 @@ packages: | |||
|       '@babel/traverse': 7.22.11 | ||||
|       '@babel/types': 7.22.17 | ||||
|       convert-source-map: 1.9.0 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       gensync: 1.0.0-beta.2 | ||||
|       json5: 2.2.3 | ||||
|       semver: 6.3.1 | ||||
|  | @ -1969,7 +1972,7 @@ packages: | |||
|       '@babel/traverse': 7.23.5 | ||||
|       '@babel/types': 7.23.5 | ||||
|       convert-source-map: 2.0.0 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       gensync: 1.0.0-beta.2 | ||||
|       json5: 2.2.3 | ||||
|       semver: 6.3.1 | ||||
|  | @ -2071,7 +2074,7 @@ packages: | |||
|       '@babel/core': 7.23.5 | ||||
|       '@babel/helper-compilation-targets': 7.22.15 | ||||
|       '@babel/helper-plugin-utils': 7.22.5 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       lodash.debounce: 4.0.8 | ||||
|       resolve: 1.22.8 | ||||
|     transitivePeerDependencies: | ||||
|  | @ -3470,7 +3473,7 @@ packages: | |||
|       '@babel/helper-split-export-declaration': 7.22.6 | ||||
|       '@babel/parser': 7.23.5 | ||||
|       '@babel/types': 7.22.17 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       globals: 11.12.0 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | @ -3488,7 +3491,7 @@ packages: | |||
|       '@babel/helper-split-export-declaration': 7.22.6 | ||||
|       '@babel/parser': 7.23.6 | ||||
|       '@babel/types': 7.23.5 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       globals: 11.12.0 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | @ -4195,7 +4198,7 @@ packages: | |||
|     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} | ||||
|     dependencies: | ||||
|       ajv: 6.12.6 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       espree: 9.6.1 | ||||
|       globals: 13.19.0 | ||||
|       ignore: 5.2.4 | ||||
|  | @ -4212,7 +4215,7 @@ packages: | |||
|     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} | ||||
|     dependencies: | ||||
|       ajv: 6.12.6 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       espree: 9.6.1 | ||||
|       globals: 13.19.0 | ||||
|       ignore: 5.2.4 | ||||
|  | @ -4447,7 +4450,7 @@ packages: | |||
|     engines: {node: '>=10.10.0'} | ||||
|     dependencies: | ||||
|       '@humanwhocodes/object-schema': 2.0.1 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       minimatch: 3.1.2 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | @ -5988,6 +5991,10 @@ packages: | |||
|       string-argv: 0.3.1 | ||||
|     dev: true | ||||
| 
 | ||||
|   /@shikijs/core@1.0.0-beta.3: | ||||
|     resolution: {integrity: sha512-SCwPom2Wn8XxNlEeqdzycU93SKgzYeVsedjqDsgZaz4XiiPpZUzlHt2NAEQTwTnPcHNZapZ6vbkwJ8P11ggL3Q==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@sideway/address@4.1.4: | ||||
|     resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} | ||||
|     dependencies: | ||||
|  | @ -8626,7 +8633,7 @@ packages: | |||
|       '@typescript-eslint/type-utils': 6.11.0(eslint@8.53.0)(typescript@5.3.3) | ||||
|       '@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.3.3) | ||||
|       '@typescript-eslint/visitor-keys': 6.11.0 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       eslint: 8.53.0 | ||||
|       graphemer: 1.4.0 | ||||
|       ignore: 5.2.4 | ||||
|  | @ -8655,7 +8662,7 @@ packages: | |||
|       '@typescript-eslint/type-utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3) | ||||
|       '@typescript-eslint/utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3) | ||||
|       '@typescript-eslint/visitor-keys': 6.18.1 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       eslint: 8.56.0 | ||||
|       graphemer: 1.4.0 | ||||
|       ignore: 5.2.4 | ||||
|  | @ -8681,7 +8688,7 @@ packages: | |||
|       '@typescript-eslint/types': 6.11.0 | ||||
|       '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.3.3) | ||||
|       '@typescript-eslint/visitor-keys': 6.11.0 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       eslint: 8.53.0 | ||||
|       typescript: 5.3.3 | ||||
|     transitivePeerDependencies: | ||||
|  | @ -8702,7 +8709,7 @@ packages: | |||
|       '@typescript-eslint/types': 6.18.1 | ||||
|       '@typescript-eslint/typescript-estree': 6.18.1(typescript@5.3.3) | ||||
|       '@typescript-eslint/visitor-keys': 6.18.1 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       eslint: 8.56.0 | ||||
|       typescript: 5.3.3 | ||||
|     transitivePeerDependencies: | ||||
|  | @ -8737,7 +8744,7 @@ packages: | |||
|     dependencies: | ||||
|       '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.3.3) | ||||
|       '@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.3.3) | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       eslint: 8.53.0 | ||||
|       ts-api-utils: 1.0.1(typescript@5.3.3) | ||||
|       typescript: 5.3.3 | ||||
|  | @ -8757,7 +8764,7 @@ packages: | |||
|     dependencies: | ||||
|       '@typescript-eslint/typescript-estree': 6.18.1(typescript@5.3.3) | ||||
|       '@typescript-eslint/utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3) | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       eslint: 8.56.0 | ||||
|       ts-api-utils: 1.0.1(typescript@5.3.3) | ||||
|       typescript: 5.3.3 | ||||
|  | @ -8786,7 +8793,7 @@ packages: | |||
|     dependencies: | ||||
|       '@typescript-eslint/types': 6.11.0 | ||||
|       '@typescript-eslint/visitor-keys': 6.11.0 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       globby: 11.1.0 | ||||
|       is-glob: 4.0.3 | ||||
|       semver: 7.5.4 | ||||
|  | @ -8807,7 +8814,7 @@ packages: | |||
|     dependencies: | ||||
|       '@typescript-eslint/types': 6.18.1 | ||||
|       '@typescript-eslint/visitor-keys': 6.18.1 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       globby: 11.1.0 | ||||
|       is-glob: 4.0.3 | ||||
|       minimatch: 9.0.3 | ||||
|  | @ -9248,7 +9255,7 @@ packages: | |||
|     engines: {node: '>= 6.0.0'} | ||||
|     requiresBuild: true | ||||
|     dependencies: | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
| 
 | ||||
|  | @ -9256,7 +9263,7 @@ packages: | |||
|     resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} | ||||
|     engines: {node: '>= 14'} | ||||
|     dependencies: | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|     dev: false | ||||
|  | @ -9334,10 +9341,6 @@ packages: | |||
|     resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} | ||||
|     engines: {node: '>=12'} | ||||
| 
 | ||||
|   /ansi-sequence-parser@1.1.1: | ||||
|     resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /ansi-styles@3.2.1: | ||||
|     resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} | ||||
|     engines: {node: '>=4'} | ||||
|  | @ -9642,7 +9645,7 @@ packages: | |||
|     resolution: {integrity: sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==} | ||||
|     dependencies: | ||||
|       archy: 1.0.0 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       fastq: 1.15.0 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | @ -11094,7 +11097,6 @@ packages: | |||
|     dependencies: | ||||
|       ms: 2.1.2 | ||||
|       supports-color: 5.5.0 | ||||
|     dev: true | ||||
| 
 | ||||
|   /debug@4.3.4(supports-color@8.1.1): | ||||
|     resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} | ||||
|  | @ -11107,6 +11109,7 @@ packages: | |||
|     dependencies: | ||||
|       ms: 2.1.2 | ||||
|       supports-color: 8.1.1 | ||||
|     dev: true | ||||
| 
 | ||||
|   /decamelize-keys@1.1.1: | ||||
|     resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} | ||||
|  | @ -11323,7 +11326,7 @@ packages: | |||
|     hasBin: true | ||||
|     dependencies: | ||||
|       address: 1.2.2 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|     dev: true | ||||
|  | @ -11647,7 +11650,7 @@ packages: | |||
|     peerDependencies: | ||||
|       esbuild: '>=0.12 <1' | ||||
|     dependencies: | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       esbuild: 0.18.20 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | @ -11956,7 +11959,7 @@ packages: | |||
|       ajv: 6.12.6 | ||||
|       chalk: 4.1.2 | ||||
|       cross-spawn: 7.0.3 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       doctrine: 3.0.0 | ||||
|       escape-string-regexp: 4.0.0 | ||||
|       eslint-scope: 7.2.2 | ||||
|  | @ -12003,7 +12006,7 @@ packages: | |||
|       ajv: 6.12.6 | ||||
|       chalk: 4.1.2 | ||||
|       cross-spawn: 7.0.3 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       doctrine: 3.0.0 | ||||
|       escape-string-regexp: 4.0.0 | ||||
|       eslint-scope: 7.2.2 | ||||
|  | @ -12634,7 +12637,7 @@ packages: | |||
|       debug: | ||||
|         optional: true | ||||
|     dependencies: | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
| 
 | ||||
|   /for-each@0.3.3: | ||||
|     resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} | ||||
|  | @ -13190,7 +13193,6 @@ packages: | |||
|   /has-flag@3.0.0: | ||||
|     resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} | ||||
|     engines: {node: '>=4'} | ||||
|     dev: true | ||||
| 
 | ||||
|   /has-flag@4.0.0: | ||||
|     resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} | ||||
|  | @ -13328,7 +13330,7 @@ packages: | |||
|     engines: {node: '>= 14'} | ||||
|     dependencies: | ||||
|       agent-base: 7.1.0 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|     dev: false | ||||
|  | @ -13388,7 +13390,7 @@ packages: | |||
|     engines: {node: '>= 6.0.0'} | ||||
|     dependencies: | ||||
|       agent-base: 5.1.1 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|     dev: true | ||||
|  | @ -13398,7 +13400,7 @@ packages: | |||
|     engines: {node: '>= 6'} | ||||
|     dependencies: | ||||
|       agent-base: 6.0.2 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
| 
 | ||||
|  | @ -13407,7 +13409,7 @@ packages: | |||
|     engines: {node: '>= 14'} | ||||
|     dependencies: | ||||
|       agent-base: 7.1.0 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|     dev: false | ||||
|  | @ -13567,7 +13569,7 @@ packages: | |||
|     dependencies: | ||||
|       '@ioredis/commands': 1.2.0 | ||||
|       cluster-key-slot: 1.1.2 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       denque: 2.1.0 | ||||
|       lodash.defaults: 4.2.0 | ||||
|       lodash.isarguments: 3.1.0 | ||||
|  | @ -14013,7 +14015,7 @@ packages: | |||
|     resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} | ||||
|     engines: {node: '>=10'} | ||||
|     dependencies: | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       istanbul-lib-coverage: 3.2.2 | ||||
|       source-map: 0.6.1 | ||||
|     transitivePeerDependencies: | ||||
|  | @ -14731,6 +14733,7 @@ packages: | |||
| 
 | ||||
|   /jsonc-parser@3.2.0: | ||||
|     resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} | ||||
|     dev: true | ||||
| 
 | ||||
|   /jsonfile@4.0.0: | ||||
|     resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} | ||||
|  | @ -17323,7 +17326,7 @@ packages: | |||
|     engines: {node: '>=8.16.0'} | ||||
|     dependencies: | ||||
|       '@types/mime-types': 2.1.4 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       extract-zip: 1.7.0 | ||||
|       https-proxy-agent: 4.0.0 | ||||
|       mime: 2.6.0 | ||||
|  | @ -18285,13 +18288,10 @@ packages: | |||
|     resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} | ||||
|     engines: {node: '>=8'} | ||||
| 
 | ||||
|   /shiki@0.14.7: | ||||
|     resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} | ||||
|   /shiki@1.0.0-beta.3: | ||||
|     resolution: {integrity: sha512-z7cHTNSSvwGx2DfeLwjSNLo+HcVxifgNIzLm6Ye52eXcIwNHXT0wHbhy7FDOKSKveuEHBwt9opfj3Hoc8LE1Yg==} | ||||
|     dependencies: | ||||
|       ansi-sequence-parser: 1.1.1 | ||||
|       jsonc-parser: 3.2.0 | ||||
|       vscode-oniguruma: 1.7.0 | ||||
|       vscode-textmate: 8.0.0 | ||||
|       '@shikijs/core': 1.0.0-beta.3 | ||||
|     dev: false | ||||
| 
 | ||||
|   /side-channel@1.0.4: | ||||
|  | @ -18327,7 +18327,7 @@ packages: | |||
|     dependencies: | ||||
|       '@hapi/hoek': 10.0.1 | ||||
|       '@hapi/wreck': 18.0.1 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       joi: 17.7.0 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | @ -18527,7 +18527,7 @@ packages: | |||
|     engines: {node: '>= 14'} | ||||
|     dependencies: | ||||
|       agent-base: 7.1.0 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       socks: 2.7.1 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | @ -18680,7 +18680,7 @@ packages: | |||
|       arg: 5.0.2 | ||||
|       bluebird: 3.7.2 | ||||
|       check-more-types: 2.24.0 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       execa: 5.1.1 | ||||
|       lazy-ass: 1.6.0 | ||||
|       ps-tree: 1.2.0 | ||||
|  | @ -18938,7 +18938,6 @@ packages: | |||
|     engines: {node: '>=4'} | ||||
|     dependencies: | ||||
|       has-flag: 3.0.0 | ||||
|     dev: true | ||||
| 
 | ||||
|   /supports-color@7.2.0: | ||||
|     resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} | ||||
|  | @ -19559,7 +19558,7 @@ packages: | |||
|       chalk: 4.1.2 | ||||
|       cli-highlight: 2.1.11 | ||||
|       dayjs: 1.11.10 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       dotenv: 16.0.3 | ||||
|       glob: 10.3.10 | ||||
|       ioredis: 5.3.2 | ||||
|  | @ -19919,7 +19918,7 @@ packages: | |||
|     hasBin: true | ||||
|     dependencies: | ||||
|       cac: 6.7.14 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       mlly: 1.5.0 | ||||
|       pathe: 1.1.2 | ||||
|       picocolors: 1.0.0 | ||||
|  | @ -20031,7 +20030,7 @@ packages: | |||
|       acorn-walk: 8.3.2 | ||||
|       cac: 6.7.14 | ||||
|       chai: 4.3.10 | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       happy-dom: 10.0.3 | ||||
|       local-pkg: 0.4.3 | ||||
|       magic-string: 0.30.5 | ||||
|  | @ -20058,14 +20057,6 @@ packages: | |||
|     resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} | ||||
|     engines: {node: '>=0.10.0'} | ||||
| 
 | ||||
|   /vscode-oniguruma@1.7.0: | ||||
|     resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /vscode-textmate@8.0.0: | ||||
|     resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /vue-component-type-helpers@1.8.27: | ||||
|     resolution: {integrity: sha512-0vOfAtI67UjeO1G6UiX5Kd76CqaQ67wrRZiOe7UAb9Jm6GzlUr/fC7CV90XfwapJRjpCMaZFhv1V0ajWRmE9Dg==} | ||||
|     dev: true | ||||
|  | @ -20113,7 +20104,7 @@ packages: | |||
|     peerDependencies: | ||||
|       eslint: '>=6.0.0' | ||||
|     dependencies: | ||||
|       debug: 4.3.4(supports-color@8.1.1) | ||||
|       debug: 4.3.4(supports-color@5.5.0) | ||||
|       eslint: 8.56.0 | ||||
|       eslint-scope: 7.2.2 | ||||
|       eslint-visitor-keys: 3.4.3 | ||||
|  |  | |||
|  | @ -35,13 +35,6 @@ async function copyFrontendLocales() { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| async function copyFrontendShikiAssets() { | ||||
|   await fs.cp('./packages/frontend/node_modules/shiki/dist', './built/_frontend_dist_/shiki/dist', { dereference: true, recursive: true }); | ||||
|   await fs.cp('./packages/frontend/node_modules/shiki/languages', './built/_frontend_dist_/shiki/languages', { dereference: true, recursive: true }); | ||||
|   await fs.cp('./packages/frontend/node_modules/aiscript-vscode/aiscript/syntaxes', './built/_frontend_dist_/shiki/languages', { dereference: true, recursive: true }); | ||||
|   await fs.cp('./packages/frontend/node_modules/shiki/themes', './built/_frontend_dist_/shiki/themes', { dereference: true, recursive: true }); | ||||
| } | ||||
| 
 | ||||
| async function copyBackendViews() { | ||||
|   await fs.cp('./packages/backend/src/server/web/views', './packages/backend/built/server/web/views', { recursive: true }); | ||||
| } | ||||
|  | @ -81,7 +74,6 @@ async function build() { | |||
|     copyFrontendFonts(), | ||||
|     copyFrontendTablerIcons(), | ||||
|     copyFrontendLocales(), | ||||
|     copyFrontendShikiAssets(), | ||||
|     copyBackendViews(), | ||||
|     buildBackendScript(), | ||||
|     buildBackendStyle(), | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue