mirror of
https://github.com/nullnyat/NullcatChan.git
synced 2025-04-29 08:07:18 +09:00
commit
ccafd0fb7c
@ -17,9 +17,9 @@ RUN if [ $enable_mecab -ne 0 ]; then apt-get update \
|
|||||||
&& echo "dicdir = /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/" > /etc/mecabrc \
|
&& echo "dicdir = /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/" > /etc/mecabrc \
|
||||||
&& apt-get purge git make curl xz-utils file -y; fi
|
&& apt-get purge git make curl xz-utils file -y; fi
|
||||||
|
|
||||||
COPY ../NullcatChan-old /nullcat-chan
|
COPY . /NullcatChan
|
||||||
|
|
||||||
WORKDIR /nullcat-chan
|
WORKDIR /NullcatChan
|
||||||
RUN npm install && npm run build
|
RUN npm install && npm run build
|
||||||
|
|
||||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||||||
|
@ -3,7 +3,7 @@ services:
|
|||||||
app:
|
app:
|
||||||
build:
|
build:
|
||||||
dockerfile: Dockerfile_production
|
dockerfile: Dockerfile_production
|
||||||
context: ../NullcatChan-old
|
context: ../NullcatChan
|
||||||
args:
|
args:
|
||||||
- enable_mecab=1
|
- enable_mecab=1
|
||||||
volumes:
|
volumes:
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"docker:dev": "cross-env DOCKER_ENV=development docker-compose -f docker-compose.yml -f docker-compose_development.yml up -d --build && docker-compose logs -f",
|
"docker:dev": "cross-env DOCKER_ENV=development docker compose -f docker-compose.yml -f docker-compose_development.yml up -d --build && docker compose logs -f",
|
||||||
"docker": "cross-env DOCKER_ENV=production docker-compose up -d --build && docker-compose logs -f",
|
"docker": "cross-env DOCKER_ENV=production docker compose up -d --build && docker compose logs -f",
|
||||||
"dev": "cross-env NODE_ENV=development node ./built",
|
"dev": "cross-env NODE_ENV=development node ./built",
|
||||||
"start": "cross-env NODE_ENV=production node ./built",
|
"start": "cross-env NODE_ENV=production node ./built",
|
||||||
"build": "tsc",
|
"build": "tsc",
|
||||||
@ -25,7 +25,7 @@
|
|||||||
"@types/ws": "7.4.6",
|
"@types/ws": "7.4.6",
|
||||||
"accurate-interval": "1.0.9",
|
"accurate-interval": "1.0.9",
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"canvas": "2.8.0",
|
"canvas": "2.11.0",
|
||||||
"chalk": "4.1.1",
|
"chalk": "4.1.1",
|
||||||
"cjp": "1.2.3",
|
"cjp": "1.2.3",
|
||||||
"gomamayo-js": "0.2.1",
|
"gomamayo-js": "0.2.1",
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { User } from "./misskey/user"
|
import { User } from "./misskey/user"
|
||||||
import IModule from "../../NullcatChan-old/src/module"
|
import IModule from "../../NullcatChan/src/module"
|
||||||
import NullcatChan from "../../NullcatChan-old/src/nullcat-chan"
|
import NullcatChan from "../../NullcatChan/src/nullcat-chan"
|
||||||
import getDate from "../../NullcatChan-old/src/utils/get-date"
|
import getDate from "../../NullcatChan/src/utils/get-date"
|
||||||
import { genItem } from "../../NullcatChan-old/src/vocabulary"
|
import { genItem } from "../../NullcatChan/src/vocabulary"
|
||||||
import autobind from "autobind-decorator"
|
import autobind from "autobind-decorator"
|
||||||
|
|
||||||
export type FriendDoc = {
|
export type FriendDoc = {
|
||||||
|
60
src/index.ts
60
src/index.ts
@ -4,39 +4,38 @@ import * as chalk from "chalk"
|
|||||||
import "module-alias/register"
|
import "module-alias/register"
|
||||||
import * as request from "request-promise-native"
|
import * as request from "request-promise-native"
|
||||||
import config from "./config"
|
import config from "./config"
|
||||||
import BirthdayModule from "../../NullcatChan-old/src/modules/birthday"
|
import BirthdayModule from "../../NullcatChan/src/modules/birthday"
|
||||||
import CoreModule from "../../NullcatChan-old/src/modules/core"
|
import CoreModule from "../../NullcatChan/src/modules/core"
|
||||||
import EmojiReactModule from "../../NullcatChan-old/src/modules/emoji-react"
|
import EmojiReactModule from "../../NullcatChan/src/modules/emoji-react"
|
||||||
import FeelingModule from "../../NullcatChan-old/src/modules/feeling"
|
import FeelingModule from "../../NullcatChan/src/modules/feeling"
|
||||||
import FollowModule from "../../NullcatChan-old/src/modules/follow"
|
import FollowModule from "../../NullcatChan/src/modules/follow"
|
||||||
import FortuneModule from "../../NullcatChan-old/src/modules/fortune"
|
import FortuneModule from "../../NullcatChan/src/modules/fortune"
|
||||||
import GitHubStatusModule from "../../NullcatChan-old/src/modules/github-status"
|
import GitHubStatusModule from "../../NullcatChan/src/modules/github-status"
|
||||||
import CloudflareStatus from "../../NullcatChan-old/src/modules/cloudflare-status";
|
import CloudflareStatus from "../../NullcatChan/src/modules/cloudflare-status";
|
||||||
import GomamayoModule from "../../NullcatChan-old/src/modules/gomamayo"
|
import GomamayoModule from "../../NullcatChan/src/modules/gomamayo"
|
||||||
import JihouModule from "../../NullcatChan-old/src/modules/jihou"
|
import JihouModule from "../../NullcatChan/src/modules/jihou"
|
||||||
import KeywordModule from "../../NullcatChan-old/src/modules/keyword"
|
import KeywordModule from "../../NullcatChan/src/modules/keyword"
|
||||||
import KiatsuModule from "../../NullcatChan-old/src/modules/kiatsu"
|
import KiatsuModule from "../../NullcatChan/src/modules/kiatsu"
|
||||||
import NotingModule from "../../NullcatChan-old/src/modules/noting"
|
import NotingModule from "../../NullcatChan/src/modules/noting"
|
||||||
import PingModule from "../../NullcatChan-old/src/modules/ping"
|
import PingModule from "../../NullcatChan/src/modules/ping"
|
||||||
import ReminderModule from "../../NullcatChan-old/src/modules/reminder"
|
import ReminderModule from "../../NullcatChan/src/modules/reminder"
|
||||||
import RoguboModule from "../../NullcatChan-old/src/modules/rogubo"
|
import ServerModule from "../../NullcatChan/src/modules/server"
|
||||||
import ServerModule from "../../NullcatChan-old/src/modules/server"
|
import SleepReportModule from "../../NullcatChan/src/modules/sleep-report"
|
||||||
import SleepReportModule from "../../NullcatChan-old/src/modules/sleep-report"
|
import TalkModule from "../../NullcatChan/src/modules/talk"
|
||||||
import TalkModule from "../../NullcatChan-old/src/modules/talk"
|
import TimerModule from "../../NullcatChan/src/modules/timer"
|
||||||
import TimerModule from "../../NullcatChan-old/src/modules/timer"
|
import TraceMoeModule from "../../NullcatChan/src/modules/trace-moe"
|
||||||
import TraceMoeModule from "../../NullcatChan-old/src/modules/trace-moe"
|
import ValentineModule from "../../NullcatChan/src/modules/valentine"
|
||||||
import ValentineModule from "../../NullcatChan-old/src/modules/valentine"
|
import WhatModule from "../../NullcatChan/src/modules/what"
|
||||||
import WhatModule from "../../NullcatChan-old/src/modules/what"
|
import YarukotoModule from "../../NullcatChan/src/modules/yarukoto"
|
||||||
import YarukotoModule from "../../NullcatChan-old/src/modules/yarukoto"
|
import NullcatChan from "../../NullcatChan/src/nullcat-chan"
|
||||||
import NullcatChan from "../../NullcatChan-old/src/nullcat-chan"
|
import _log from "../../NullcatChan/src/utils/log"
|
||||||
import _log from "../../NullcatChan-old/src/utils/log"
|
import ShellGeiModule from "../../NullcatChan/src/modules/shellgei"
|
||||||
import ShellGeiModule from "../../NullcatChan-old/src/modules/shellgei"
|
import SversionModule from "../../NullcatChan/src/modules/version"
|
||||||
import SversionModule from "../../NullcatChan-old/src/modules/Sversion"
|
import AyashiiModule from "../../NullcatChan/src/modules/ayashii"
|
||||||
import AyashiiModule from "../../NullcatChan-old/src/modules/ayashii"
|
|
||||||
|
|
||||||
const promiseRetry = require("promise-retry")
|
const promiseRetry = require("promise-retry")
|
||||||
|
|
||||||
const pkg = require("../../NullcatChan-old/package.json")
|
const pkg = require("../../NullcatChan/package.json")
|
||||||
|
|
||||||
console.log(" _ __ ____ __ ________ __ ")
|
console.log(" _ __ ____ __ ________ __ ")
|
||||||
console.log(" / | / /_ __/ / /________ _/ /_/ ____/ /_ ____ _____ / / ")
|
console.log(" / | / /_ __/ / /________ _/ /_/ ____/ /_ ____ _____ / / ")
|
||||||
@ -91,7 +90,6 @@ promiseRetry(
|
|||||||
new GitHubStatusModule(),
|
new GitHubStatusModule(),
|
||||||
new CloudflareStatus(),
|
new CloudflareStatus(),
|
||||||
new YarukotoModule(),
|
new YarukotoModule(),
|
||||||
new RoguboModule(),
|
|
||||||
new KiatsuModule(),
|
new KiatsuModule(),
|
||||||
new JihouModule(),
|
new JihouModule(),
|
||||||
new WhatModule(),
|
new WhatModule(),
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import config from "@/config"
|
import config from "@/config"
|
||||||
import Friend from "@/friend"
|
import Friend from "@/friend"
|
||||||
import { User } from "./misskey/user"
|
import { User } from "./misskey/user"
|
||||||
import NullcatChan from "../../NullcatChan-old/src/nullcat-chan"
|
import NullcatChan from "../../NullcatChan/src/nullcat-chan"
|
||||||
import includes from "../../NullcatChan-old/src/utils/includes"
|
import includes from "../../NullcatChan/src/utils/includes"
|
||||||
import or from "../../NullcatChan-old/src/utils/or"
|
import or from "../../NullcatChan/src/utils/or"
|
||||||
import autobind from "autobind-decorator"
|
import autobind from "autobind-decorator"
|
||||||
import * as chalk from "chalk"
|
import * as chalk from "chalk"
|
||||||
const delay = require("timeout-as-promise")
|
const delay = require("timeout-as-promise")
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import NullcatChan, { InstallerResult } from "./nullcat-chan"
|
import NullcatChan, { InstallerResult } from "@/nullcat-chan"
|
||||||
import autobind from "autobind-decorator"
|
import autobind from "autobind-decorator"
|
||||||
|
|
||||||
export default abstract class Module {
|
export default abstract class Module {
|
||||||
|
61
src/modules/cloudflare-status/index.ts
Normal file
61
src/modules/cloudflare-status/index.ts
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
import config from '@/config';
|
||||||
|
import Message from '@/message';
|
||||||
|
import Module from '@/module';
|
||||||
|
import autobind from 'autobind-decorator';
|
||||||
|
import fetch from 'node-fetch';
|
||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
|
export default class extends Module {
|
||||||
|
public readonly name = 'cloudflare-status';
|
||||||
|
|
||||||
|
private readonly schema = z.object({
|
||||||
|
status: z.object({
|
||||||
|
description: z.string(),
|
||||||
|
indicator: z.enum(['none', 'minor', 'major', 'critical'])
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
private indicator: z.infer<typeof this.schema>['status']['indicator'] = 'none';
|
||||||
|
private description: z.infer<typeof this.schema>['status']['description'] = '';
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public install() {
|
||||||
|
setInterval(this.updateStatus, 10 * 60 * 1000);
|
||||||
|
this.updateStatus();
|
||||||
|
|
||||||
|
return {
|
||||||
|
mentionHook: this.mentionHook
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private async updateStatus() {
|
||||||
|
try {
|
||||||
|
const response = await fetch('https://www.cloudflarestatus.com/api/v2/status.json');
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
const result = this.schema.safeParse(data);
|
||||||
|
|
||||||
|
if (result.success) {
|
||||||
|
this.indicator = result.data.status.indicator;
|
||||||
|
this.description = result.data.status.description;
|
||||||
|
} else {
|
||||||
|
this.log('Validation failed.');
|
||||||
|
console.warn(result.error);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
this.log('Failed to fetch status from Cloudflare.');
|
||||||
|
console.warn(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private async mentionHook(msg: Message) {
|
||||||
|
if (msg.text?.toLowerCase().includes('cloudflare')) {
|
||||||
|
msg.reply(`いまのCloudflareのステータスだよ!\n\nじょうきょう: ${this.indicator}\nせつめい: ${this.description}\nhttps://www.cloudflarestatus.com`);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
import Message from "@/message"
|
import Message from "@/message"
|
||||||
import Module from "@/module"
|
import Module from "@/module"
|
||||||
import serifs from "@/serifs"
|
import serifs from "@/serifs"
|
||||||
import { safeForInterpolate } from "../../../../NullcatChan-old/src/utils/safe-for-interpolate"
|
import { safeForInterpolate } from "../../../../NullcatChan/src/utils/safe-for-interpolate"
|
||||||
import autobind from "autobind-decorator"
|
import autobind from "autobind-decorator"
|
||||||
|
|
||||||
const titles = ["さん", "くん", "君", "ちゃん", "様", "先生"]
|
const titles = ["さん", "くん", "君", "ちゃん", "様", "先生"]
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Note } from "../../misskey/note"
|
import { Note } from "../../misskey/note"
|
||||||
import Module from "@/module"
|
import Module from "@/module"
|
||||||
import Stream from "@/stream"
|
import Stream from "@/stream"
|
||||||
import includes from "../../../../NullcatChan-old/src/utils/includes"
|
import includes from "../../../../NullcatChan/src/utils/includes"
|
||||||
import autobind from "autobind-decorator"
|
import autobind from "autobind-decorator"
|
||||||
const delay = require("timeout-as-promise")
|
const delay = require("timeout-as-promise")
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ import config from "@/config"
|
|||||||
import Message from "@/message"
|
import Message from "@/message"
|
||||||
import Module from "@/module"
|
import Module from "@/module"
|
||||||
import serifs, { getSerif } from "@/serifs"
|
import serifs, { getSerif } from "@/serifs"
|
||||||
import { acct } from "../../../../NullcatChan-old/src/utils/acct"
|
import { acct } from "../../../../NullcatChan/src/utils/acct"
|
||||||
import autobind from "autobind-decorator"
|
import autobind from "autobind-decorator"
|
||||||
import * as loki from "lokijs"
|
import * as loki from "lokijs"
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import Message from "@/message"
|
import Message from "@/message"
|
||||||
import Module from "@/module"
|
import Module from "@/module"
|
||||||
import { HandlerResult } from "../../nullcat-chan"
|
import { HandlerResult } from "@/nullcat-chan"
|
||||||
import serifs, { getSerif } from "@/serifs"
|
import serifs, { getSerif } from "@/serifs"
|
||||||
import getDate from "../../../../NullcatChan-old/src/utils/get-date"
|
import getDate from "../../../../NullcatChan/src/utils/get-date"
|
||||||
import autobind from "autobind-decorator"
|
import autobind from "autobind-decorator"
|
||||||
|
|
||||||
export default class extends Module {
|
export default class extends Module {
|
||||||
|
101
src/modules/version/index.ts
Normal file
101
src/modules/version/index.ts
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
import autobind from 'autobind-decorator';
|
||||||
|
import Module from '@/module';
|
||||||
|
import Message from '@/message';
|
||||||
|
/**
|
||||||
|
* バージョン情報
|
||||||
|
*/
|
||||||
|
interface Version {
|
||||||
|
/**
|
||||||
|
* サーバーバージョン(meta.Sversion)
|
||||||
|
*/
|
||||||
|
server: string;
|
||||||
|
/**
|
||||||
|
* クライアントバージョン(meta.clientVersion)
|
||||||
|
*/
|
||||||
|
client: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class extends Module {
|
||||||
|
public readonly name = 'version';
|
||||||
|
|
||||||
|
private latest?: Version;
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
public install() {
|
||||||
|
this.versionCheck();
|
||||||
|
setInterval(this.versionCheck, 1000 * 60 * 60 * 1);
|
||||||
|
|
||||||
|
return {
|
||||||
|
mentionHook: this.mentionHook
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public versionCheck = () => {
|
||||||
|
// バージョンチェック
|
||||||
|
this.getVersion()
|
||||||
|
.then(fetched => {
|
||||||
|
this.log(`Version fetched: ${JSON.stringify(fetched)}`);
|
||||||
|
|
||||||
|
if (this.latest != null && fetched != null) {
|
||||||
|
const serverChanged = this.latest.server !== fetched.server;
|
||||||
|
|
||||||
|
if (serverChanged) {
|
||||||
|
let v = '';
|
||||||
|
v += (serverChanged ? '**' : '') + `${this.latest.server} → ${this.mfmVersion(fetched.server)}\n` + (serverChanged ? '**' : '');
|
||||||
|
|
||||||
|
this.log(`Version changed: ${v}`);
|
||||||
|
|
||||||
|
this.nullcatChan.post({ text: `ぼくのおうちが${v}にリフォームされたよ!!` });
|
||||||
|
} else {
|
||||||
|
// 変更なし
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.latest = fetched;
|
||||||
|
})
|
||||||
|
.catch(e => this.log(`warn: ${e}`));
|
||||||
|
};
|
||||||
|
|
||||||
|
@autobind
|
||||||
|
private async mentionHook(msg: Message) {
|
||||||
|
if (msg.text == null) return false;
|
||||||
|
|
||||||
|
const query = msg.text.match(/サーバーバージョン/);
|
||||||
|
|
||||||
|
if (query == null) return false;
|
||||||
|
|
||||||
|
this.nullcatChan
|
||||||
|
.api('meta')
|
||||||
|
.then(meta => {
|
||||||
|
msg.reply(`${this.mfmVersion(meta.version)} みたいだよ!`);
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
msg.reply(`取得失敗しちゃった:cry_nullcatchan:`);
|
||||||
|
});
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* バージョンを取得する
|
||||||
|
*/
|
||||||
|
private getVersion = (): Promise<Version> => {
|
||||||
|
return this.nullcatChan.api('meta').then(meta => {
|
||||||
|
return {
|
||||||
|
server: meta.version,
|
||||||
|
client: meta.clientVersion
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
private mfmVersion = (v): string => {
|
||||||
|
if (v == null) return v;
|
||||||
|
return v.match(/^\d+\.\d+\.\d+$/) ? `[${v}](https://github.com/syuilo/misskey/releases/tag/${v})` : v;
|
||||||
|
};
|
||||||
|
|
||||||
|
private wait = (ms: number): Promise<void> => {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
setTimeout(() => resolve(), ms);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
import toHiragana from '../../NullcatChan-old/src/utils/to-hiragana';
|
import toHiragana from '../../NullcatChan/src/utils/to-hiragana';
|
||||||
|
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const readline = require('readline');
|
const readline = require('readline');
|
||||||
|
@ -4,9 +4,9 @@ import config from "./config"
|
|||||||
import Friend, { FriendDoc } from "./friend"
|
import Friend, { FriendDoc } from "./friend"
|
||||||
import Message from "./message"
|
import Message from "./message"
|
||||||
import { User } from "./misskey/user"
|
import { User } from "./misskey/user"
|
||||||
import Module from "../../NullcatChan-old/src/module"
|
import Module from "../../NullcatChan/src/module"
|
||||||
import Stream from "./stream"
|
import Stream from "./stream"
|
||||||
import log from "../../NullcatChan-old/src/utils/log"
|
import log from "../../NullcatChan/src/utils/log"
|
||||||
import autobind from "autobind-decorator"
|
import autobind from "autobind-decorator"
|
||||||
import * as chalk from "chalk"
|
import * as chalk from "chalk"
|
||||||
import * as fs from "fs"
|
import * as fs from "fs"
|
||||||
@ -15,7 +15,7 @@ import * as request from "request-promise-native"
|
|||||||
import { v4 as uuid } from "uuid"
|
import { v4 as uuid } from "uuid"
|
||||||
const delay = require("timeout-as-promise")
|
const delay = require("timeout-as-promise")
|
||||||
|
|
||||||
const pkg = require("../../NullcatChan-old/package.json")
|
const pkg = require("../../NullcatChan/package.json")
|
||||||
|
|
||||||
type MentionHook = (msg: Message) => Promise<boolean | HandlerResult>
|
type MentionHook = (msg: Message) => Promise<boolean | HandlerResult>
|
||||||
type ContextHook = (key: any, msg: Message, data?: any) => Promise<void | boolean | HandlerResult>
|
type ContextHook = (key: any, msg: Message, data?: any) => Promise<void | boolean | HandlerResult>
|
||||||
|
5
src/utils/to-hiragana.ts
Normal file
5
src/utils/to-hiragana.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
const moji = require('moji');
|
||||||
|
|
||||||
|
export default function toHiragana(str: string): string {
|
||||||
|
return moji(str).convert('HK', 'ZK').convert('KK', 'HG').toString();
|
||||||
|
}
|
@ -14,7 +14,7 @@
|
|||||||
"noLib": false,
|
"noLib": false,
|
||||||
"outDir": "built",
|
"outDir": "built",
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"baseUrl": "../NullcatChan-old",
|
"baseUrl": "../NullcatChan",
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": ["src/*"]
|
"@/*": ["src/*"]
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user