diff --git a/.gitignore b/.gitignore index d80178d..3de575b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,11 @@ # Logs logs *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* pnpm-debug.log* lerna-debug.log* node_modules dist -test/dist/* +tests/dist/* dist-ssr *.local # Editor directories and files @@ -24,4 +21,5 @@ dist-ssr .env .cache .temp -cache \ No newline at end of file +cache +.npmrc diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index e5c4b0b..2e1e35d 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -1,9 +1,12 @@ import DefaultTheme from 'vitepress/theme'; + export default { ...DefaultTheme, + async enhanceApp() { if (!(import.meta as any).env.SSR) { - const { loadOml2d } = await import('oh-mylive-2d'); + const { loadOml2d } = await import('oh-my-live2d'); + loadOml2d({ models: [ { diff --git a/packages/oh-my-live2d/package.json b/packages/oh-my-live2d/package.json index a80b82e..9a57580 100644 --- a/packages/oh-my-live2d/package.json +++ b/packages/oh-my-live2d/package.json @@ -11,7 +11,8 @@ "bugs": "https://github.com/oh-my-live2d/oh-my-live2d/issues", "repository": { "type": "git", - "url": "git+https://github.com/oh-my-live2d/oh-my-live2d.git" + "url": "git+https://github.com/oh-my-live2d/oh-my-live2d.git", + "directory": "packages/oh-my-live2d" }, "license": "MIT", "author": "loclink", @@ -22,9 +23,15 @@ "files": [ "dist" ], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, "scripts": { - "build": "rimraf dist && tsc && tsc-alias && node ./scripts/build.js", - "dev": "rimraf dist && tsc && (concurrently \"tsc -w\" \"tsc-alias -w\" \"cross-env OML_ENV=dev node ./scripts/build.js\" \"pnpm run test\")", + "build": "rimraf dist && tsc && node ./scripts/build.js", + "dev": "rimraf dist && tsc && (concurrently \"tsc -w\" \"cross-env OML_ENV=dev node ./scripts/build.js\" \"pnpm run test\")", "release": "dotenv release-it" }, "devDependencies": { @@ -32,7 +39,6 @@ "pixi-live2d-display": "0.4.0", "pixi.js": "6.5.10", "tianjie": "^0.0.9", - "tsc-alias": "^1.8.8", "vite": "5.1.4" } } diff --git a/packages/oh-my-live2d/scripts/build.js b/packages/oh-my-live2d/scripts/build.js index d86aaf4..54c6c73 100644 --- a/packages/oh-my-live2d/scripts/build.js +++ b/packages/oh-my-live2d/scripts/build.js @@ -47,8 +47,8 @@ const profiles = entries.flatMap(({ entry, name, format }) => { name: 'copy-min-file', writeBundle(outOptions) { if (outOptions.format === 'umd') { - fs.ensureDirSync(resolve(__dirname, '../test/vite-app/public')); - fs.copyFile(resolve(__dirname, `../dist/${name}.min.js`), resolve(__dirname, `../test/vite-app/public/${name}.min.js`)); + fs.ensureDirSync(resolve(__dirname, '../../../testd/vite-app/public')); + fs.copyFile(resolve(__dirname, `../dist/${name}.min.js`), resolve(__dirname, `../../../tests/vite-app/public/${name}.min.js`)); } } } diff --git a/packages/oh-my-live2d/src/config/config.ts b/packages/oh-my-live2d/src/config/config.ts new file mode 100644 index 0000000..77dd2bf --- /dev/null +++ b/packages/oh-my-live2d/src/config/config.ts @@ -0,0 +1,86 @@ +import type { DefaultOptions } from '../types/index.js'; + +// 第三方库服务地址 +const libServicePath = 'https://lib.oml2d.com'; + +// 默认配置选项, 实例化时会与用户传进来的合并 +export const DEFAULT_OPTIONS: DefaultOptions = { + fixed: true, + sayHello: true, + transitionTime: 1000, + parentElement: document.body, + importType: 'complete', + libraryUrls: { + cubism2: `${libServicePath}/live2d.min.js`, + cubism5: `${libServicePath}/live2dcubismcore.min.js` + }, + models: [], + tips: { + style: { + width: 230, + height: 100, + offsetX: 0, + offsetY: 0 + }, + idleTips: { + wordTheDay: false, + message: [], + duration: 5000, + interval: 10000, + priority: 2 + }, + welcomeTips: { + message: { + daybreak: '早上好!一日之计在于晨,美好的一天就要开始了。', + morning: '上午好!工作顺利嘛,不要久坐,多起来走动走动哦!', + noon: '中午了,工作了一个上午,现在是午餐时间!', + afternoon: '午后很容易犯困呢,来杯咖啡吧~', + dusk: '傍晚了!工作一天幸苦啦~', + night: '晚上好,今天过得怎么样呢?', + lateNight: '已经这么晚了呀,早点休息吧,晚安~', + weeHours: '这么晚还不睡吗?当心熬夜秃头哦!' + }, + duration: 6000, + priority: 3 + }, + copyTips: { + duration: 3000, + priority: 3, + message: ['你复制了什么内容呢?记得注明出处哦~'] + } + } +}; + +/** 第三方 SDK */ +export const SDK = { + PIXI: `${libServicePath}/pixi.min.js`, + PIXI_LIVE2D_DISPLAY: `${libServicePath}/pixi-live2d-display.min.js` +}; + +/** 全局配置 */ +export const CONFIG = { + stageId: 'oml2dStage', + canvasId: 'oml2dCanvas', + statusBarId: 'oml2dStatusBar', + tipsId: 'oml2dTips', + menusId: 'oml2dMenus' +}; + +/** 菜单的配置 */ +export const MENU_ITEMS = [ + { + id: 'SwitchModel', + name: 'icon-a-userswitch-fill', + title: '切换模型' + }, + { + id: 'Play', + name: 'icon-skin-fill', + title: '变装' + }, + { + id: 'About', + name: 'icon-info-circle-fill', + title: '关于' + } +]; diff --git a/packages/oh-my-live2d/src/config/index.ts b/packages/oh-my-live2d/src/config/index.ts index 65374fc..755cd6e 100644 --- a/packages/oh-my-live2d/src/config/index.ts +++ b/packages/oh-my-live2d/src/config/index.ts @@ -1,88 +1,2 @@ -import '@/library/iconfont'; - -import type { DefaultOptions } from '@/types'; - -// 第三方库服务地址 -const libServicePath = 'https://lib.oml2d.com'; - -// 默认配置选项, 实例化时会与用户传进来的合并 -export const defaultOptions: DefaultOptions = { - fixed: true, - sayHello: true, - transitionTime: 1000, - parentElement: document.body, - importType: 'complete', - libraryUrls: { - cubism2: `${libServicePath}/live2d.min.js`, - cubism5: `${libServicePath}/live2dcubismcore.min.js` - }, - models: [], - tips: { - style: { - width: 230, - height: 100, - offsetX: 0, - offsetY: 0 - }, - idleTips: { - wordTheDay: false, - message: [], - duration: 5000, - interval: 10000, - priority: 2 - }, - welcomeTips: { - message: { - daybreak: '早上好!一日之计在于晨,美好的一天就要开始了。', - morning: '上午好!工作顺利嘛,不要久坐,多起来走动走动哦!', - noon: '中午了,工作了一个上午,现在是午餐时间!', - afternoon: '午后很容易犯困呢,来杯咖啡吧~', - dusk: '傍晚了!工作一天幸苦啦~', - night: '晚上好,今天过得怎么样呢?', - lateNight: '已经这么晚了呀,早点休息吧,晚安~', - weeHours: '这么晚还不睡吗?当心熬夜秃头哦!' - }, - duration: 6000, - priority: 3 - }, - copyTips: { - duration: 3000, - priority: 3, - message: ['你复制了什么内容呢?记得注明出处哦~'] - } - } -}; - -// 第三方SDK -export const SDK = { - PIXI: `${libServicePath}/pixi.min.js`, - PIXI_LIVE2D_DISPLAY: `${libServicePath}/pixi-live2d-display.min.js` -}; - -// 全局配置 -export const config = { - stageId: 'oml2dStage', - canvasId: 'oml2dCanvas', - statusBarId: 'oml2dStatusBar', - tipsId: 'oml2dTips', - menusId: 'oml2dMenus' -}; - -// 菜单的配置 -export const menusConfig = [ - { - id: 'SwitchModel', - name: 'icon-a-userswitch-fill', - title: '切换模型' - }, - { - id: 'Play', - name: 'icon-skin-fill', - title: '变装' - }, - { - id: 'About', - name: 'icon-info-circle-fill', - title: '关于' - } -]; +export * from './config.js'; +export * from './style.js'; diff --git a/packages/oh-my-live2d/src/constants/index.ts b/packages/oh-my-live2d/src/constants/index.ts index bb4e010..7eba22b 100644 --- a/packages/oh-my-live2d/src/constants/index.ts +++ b/packages/oh-my-live2d/src/constants/index.ts @@ -1,15 +1,8 @@ -const COMPLETE = 'complete'; -const CUBISM2 = 'cubism2'; -const CUBISM4 = 'cubism4'; +export const COMPLETE = 'complete'; +export const CUBISM2 = 'cubism2'; +export const CUBISM4 = 'cubism4'; -// export enum ImportType { -// COMPLETE = 'complete', -// CUBISM2 = 'cubism2', -// CUBISM4 = 'cubism4' -// } - -export enum WindowSizeType { +export const enum WindowSizeType { PC = 'PC', MOBILE = 'MOBILE' } -export { COMPLETE, CUBISM2, CUBISM4 }; diff --git a/packages/oh-my-live2d/src/index.ts b/packages/oh-my-live2d/src/index.ts index 4077f7e..3deb9a3 100644 --- a/packages/oh-my-live2d/src/index.ts +++ b/packages/oh-my-live2d/src/index.ts @@ -1,15 +1,21 @@ -import { setup } from '@/modules'; -import { loadLibrary } from '@/utils'; import * as PIXI from 'pixi.js'; +import { setup } from './modules/index.js'; +import { loadLibrary } from './utils/index.js'; + +import './library/iconfont.js'; + +export * from './types/options.js'; + (window as any).PIXI = PIXI; + PIXI.utils.skipHello(); export const loadOml2d = setup(async (importType, urls) => { const Live2dModule = await loadLibrary(importType, urls); + return { Live2dModule, PIXI }; }); -export * from './types/options'; diff --git a/packages/oh-my-live2d/src/index.umd.ts b/packages/oh-my-live2d/src/index.umd.ts index 626c4fe..b0374d6 100644 --- a/packages/oh-my-live2d/src/index.umd.ts +++ b/packages/oh-my-live2d/src/index.umd.ts @@ -1,5 +1,9 @@ -import { setup } from '@/modules'; -import { loadUmdLibrary } from '@/utils'; +import { setup } from './modules/index.js'; +import { loadUmdLibrary } from './utils/index.js'; + +import './library/iconfont.js'; + +export * from './types/options.js'; export const loadOml2d = setup(async (importType, urls) => { await loadUmdLibrary(importType, urls); @@ -9,5 +13,3 @@ export const loadOml2d = setup(async (importType, urls) => { PIXI: (window as any).PIXI }; }); - -export * from './types/options'; diff --git a/packages/oh-my-live2d/src/modules/index.ts b/packages/oh-my-live2d/src/modules/index.ts index 8b76766..d5c8d52 100644 --- a/packages/oh-my-live2d/src/modules/index.ts +++ b/packages/oh-my-live2d/src/modules/index.ts @@ -1,17 +1,16 @@ import type { Application } from 'pixi.js'; -import { checkVersion, formatUnit, printProjectInfo } from '../utils'; - -import { defaultOptions } from '@/config'; -import { WindowSizeType } from '@/constants'; -import { Menus } from '@/modules/menus'; -import { Model } from '@/modules/model'; -import { Stage } from '@/modules/stage'; -import { StatusBar, SystemStete } from '@/modules/status-bar'; -import { Tips } from '@/modules/tips'; -import type { ApplicationType, DefaultOptions, Live2DModelType } from '@/types'; -import { Options } from '@/types/options'; import { isNumber, mergeDeep } from 'tianjie'; +import { WindowSizeType } from '../constants/index.js'; +import { DEFAULT_OPTIONS } from '../config/index.js'; +import { checkVersion, formatUnit, printProjectInfo } from '../utils/index.js'; +import { Menus } from './menus.js'; +import { Model } from './model.js'; +import { Stage } from './stage.js'; +import { StatusBar, SystemState } from './status-bar.js'; +import { Tips } from './tips.js'; +import type { ApplicationType, DefaultOptions, Live2DModelType, Options } from '../types/index.js'; + export class OhMyLive2D { private stage: Stage; private statusBar: StatusBar; @@ -38,7 +37,7 @@ export class OhMyLive2D { initialize() { this.verifyWindowSizeType(); if (this.windowSizeType !== WindowSizeType.PC) { - this.statusBar.popup('暂不支持移动端', SystemStete.info, 8000); + this.statusBar.popup('暂不支持移动端', SystemState.info, 8000); return; } this.loadModel(); @@ -178,7 +177,7 @@ export const setup = (loadMethod) => { let oml2d; const loadOml2d = async (options: Options) => { const { parentElement } = options; - const finalOptions = mergeDeep(defaultOptions, options); + const finalOptions = mergeDeep(DEFAULT_OPTIONS, options); finalOptions.parentElement = parentElement || document.body; if (!finalOptions.models?.length) throw new Error('至少需要配置一个模型'); const { Live2dModule, PIXI } = await loadMethod(finalOptions.importType, finalOptions.libraryUrls); diff --git a/packages/oh-my-live2d/src/modules/menus.ts b/packages/oh-my-live2d/src/modules/menus.ts index e6ba744..f902b86 100644 --- a/packages/oh-my-live2d/src/modules/menus.ts +++ b/packages/oh-my-live2d/src/modules/menus.ts @@ -1,15 +1,16 @@ -import { config, menusConfig } from '@/config'; -import { CSSProperties } from '@/types'; -import { createElement, setStyleByElement } from '@/utils'; import { mergeDeep } from 'tianjie'; +import { CONFIG, MENU_ITEMS } from '../config/index.js'; +import type { CSSProperties } from '../types/index.js'; +import { createElement, setStyleByElement } from '../utils/index.js'; + export class Menus { element: HTMLElement; private style: CSSProperties = {}; private clickItem?: (name: string) => void; constructor(private stageElement: HTMLElement) { - this.element = createElement({ id: config.menusId, tagName: 'div', className: config.menusId }); + this.element = createElement({ id: CONFIG.menusId, tagName: 'div', className: CONFIG.menusId }); this.createMenuItem(); this.stageElement.append(this.element); this.ininStyle(); @@ -31,7 +32,7 @@ export class Menus { this.stageElement.addEventListener('mouseout', () => this.setStyle({ opacity: 0, visibility: 'hidden' })); } createMenuItem() { - const menuItemList = menusConfig.map((item) => { + const menuItemList = MENU_ITEMS.map((item) => { const el = createElement({ id: item.id, tagName: 'div', diff --git a/packages/oh-my-live2d/src/modules/model.ts b/packages/oh-my-live2d/src/modules/model.ts index 94d4afa..e10327b 100644 --- a/packages/oh-my-live2d/src/modules/model.ts +++ b/packages/oh-my-live2d/src/modules/model.ts @@ -1,7 +1,7 @@ -import { Live2DModelType } from '@/types'; -import { Model as ModelOptions } from '@/types/model'; -import { InternalModel, Live2DModel } from 'pixi-live2d-display'; import { Application } from 'pixi.js'; +import { InternalModel, Live2DModel } from 'pixi-live2d-display'; + +import type { Live2DModelType, ModelOptions } from '../types/index.js'; export class Model { private model: Live2DModel; // 模型实例 diff --git a/packages/oh-my-live2d/src/modules/stage.ts b/packages/oh-my-live2d/src/modules/stage.ts index 37c8733..7d62721 100644 --- a/packages/oh-my-live2d/src/modules/stage.ts +++ b/packages/oh-my-live2d/src/modules/stage.ts @@ -1,11 +1,10 @@ -import { config } from '@/config'; -import { globalStyle } from '@/config/style'; -import { CSSProperties } from '@/types'; -import { Options } from '@/types/options'; -import { createElement, setStyleByElement } from '@/utils'; import { mergeDeep } from 'tianjie'; -enum Status { +import { CONFIG, globalStyle } from '../config/index.js'; +import type { CSSProperties, Options } from '../types/index.js'; +import { createElement, setStyleByElement } from '../utils/index.js'; + +const enum Status { Display = 1, Hidden = 0 } @@ -19,8 +18,8 @@ export class Stage { private status: Status = Status.Hidden; private slideChangeEnd?: (status: Status) => void; constructor(private targetElement: HTMLElement, private options: Options) { - this.element = createElement({ id: config.stageId, tagName: 'div' }); - this.canvasElement = createElement({ id: config.canvasId, tagName: 'canvas' }) as HTMLCanvasElement; + this.element = createElement({ id: CONFIG.stageId, tagName: 'div' }); + this.canvasElement = createElement({ id: CONFIG.canvasId, tagName: 'canvas' }) as HTMLCanvasElement; this.wrapperElement = createElement({ id: 'oml2dWrapper', tagName: 'div' }); this.create(); this.initStyle(); diff --git a/packages/oh-my-live2d/src/modules/status-bar.ts b/packages/oh-my-live2d/src/modules/status-bar.ts index fcffdff..b77f343 100644 --- a/packages/oh-my-live2d/src/modules/status-bar.ts +++ b/packages/oh-my-live2d/src/modules/status-bar.ts @@ -1,12 +1,14 @@ -import { config } from '@/config'; -import { CSSProperties } from '@/types'; -import { createElement, setStyleByElement } from '@/utils'; import { mergeDeep } from 'tianjie'; -enum Status { + +import { CONFIG } from '../config/index.js'; +import type { CSSProperties } from '../types/index.js'; +import { createElement, setStyleByElement } from '../utils/index.js'; + +const enum Status { Display = 1, Hidden = 0 } -export enum SystemStete { +export const enum SystemState { info = 'info', error = 'error' } @@ -25,7 +27,7 @@ export class StatusBar { private style: CSSProperties = {}; constructor(wrapperElement: HTMLElement) { - this.element = createElement({ id: config.statusBarId, tagName: 'div', innerText: 'hello' }); + this.element = createElement({ id: CONFIG.statusBarId, tagName: 'div', innerText: 'hello' }); wrapperElement.append(this.element); this.initStyle(); } @@ -112,15 +114,15 @@ export class StatusBar { * @param reloadFn */ loadingError(reloadFn: () => any) { - this.popup('加载失败', SystemStete.error, false); + this.popup('加载失败', SystemState.error, false); // this.setStyle({}) // 添加 mouseover 事件监听器 const mouseover = () => { - this.popup('重新加载', SystemStete.info, false); + this.popup('重新加载', SystemState.info, false); }; const mouseout = () => { - this.popup('加载失败', SystemStete.error, false); + this.popup('加载失败', SystemState.error, false); }; const handleClick = () => { @@ -141,7 +143,7 @@ export class StatusBar { * @param state * @param delay */ - popup(message: string, state: SystemStete = SystemStete.info, delay: number | false = 1000) { + popup(message: string, state: SystemState = SystemState.info, delay: number | false = 1000) { this.setContent(message); this.setStyle({ backgroundColor: this.stateColor[state] }); this.slideIn().then(() => { diff --git a/packages/oh-my-live2d/src/modules/tips.ts b/packages/oh-my-live2d/src/modules/tips.ts index ed122be..a49ba24 100644 --- a/packages/oh-my-live2d/src/modules/tips.ts +++ b/packages/oh-my-live2d/src/modules/tips.ts @@ -1,15 +1,8 @@ -import { config } from '@/config'; -import { CSSProperties, DeepRequired } from '@/types'; -import { Tips as TipsOptions } from '@/types/tips'; -import { createElement, getWordTheDay, setStyleByElement, sleep } from '@/utils'; -import { getWelcomeMessage } from '@/utils/tips'; +import { CONFIG } from '../config/index.js'; +import type { CSSProperties, DeepRequired, TipsOptions } from '../types/index.js'; +import { createElement, getWordTheDay, setStyleByElement, sleep, getWelcomeMessage } from '../utils/index.js'; import { getRandomElement, mergeDeep, setIntervalAsync } from 'tianjie'; -// enum Status { -// Display = 1, -// Hidden = 0 -// } - export class Tips { private element: HTMLElement; // private status: Status = Status.Hidden; @@ -24,7 +17,7 @@ export class Tips { private priority = 0; // 当前优先级 constructor(stageElement: HTMLElement, private tipsOptions: DeepRequired) { - this.element = createElement({ id: config.tipsId, tagName: 'div' }); + this.element = createElement({ id: CONFIG.tipsId, tagName: 'div' }); stageElement.append(this.element); this.initStyle(); this.idlePlayer = this.createIdleMessagePlayer(); @@ -96,7 +89,7 @@ export class Tips { animationName: 'oml2d-hidden-tips,oml2d-shake-tips' }); this.priority = 0; - }, duration); + }, duration) as unknown as number; } /** diff --git a/packages/oh-my-live2d/src/types/index.ts b/packages/oh-my-live2d/src/types/index.ts index 3cfeb9c..a4105dd 100644 --- a/packages/oh-my-live2d/src/types/index.ts +++ b/packages/oh-my-live2d/src/types/index.ts @@ -1,16 +1,22 @@ -import { Model } from '@/types/model'; -import { Options } from '@/types/options'; import CSS from 'csstype'; -import type { Live2DModel } from 'pixi-live2d-display'; import { Application } from 'pixi.js'; +import type { Live2DModel } from 'pixi-live2d-display'; + +import type { ModelOptions } from './model.js'; +import type { Options } from './options.js'; +import type { DeepRequired } from './utils.js'; + +export * from './options.js'; +export * from './utils.js'; export type PIXI_LIVE2D_DISPLAY_MODULE = typeof import('pixi-live2d-display'); -export type Live2DModelType = typeof Live2DModel; -export type CSSProperties = CSS.Properties; -export type DefaultOptions = Omit, 'parentElement' | 'models'> & { parentElement: HTMLElement } & { models: Model[] }; -export type ApplicationType = typeof Application; -export type ImportType = 'complete' | 'cubism2' | 'cubism5'; +export type ApplicationType = typeof Application; +export type CSSProperties = CSS.Properties; +export type DefaultOptions = Omit, 'parentElement' | 'models'> & { parentElement: HTMLElement } & { + models: ModelOptions[]; +}; +export type Live2DModelType = typeof Live2DModel; export interface ElementConfig { id: string; @@ -21,6 +27,3 @@ export interface ElementConfig { innerHtml?: string; innerText?: string; } - -export type DeepRequired = T extends Function ? T : T extends object ? { [P in keyof T]-?: DeepRequired } : T; -// export type IdleTipsType = typeof defaultOptions.tips.idleTips; diff --git a/packages/oh-my-live2d/src/types/model.ts b/packages/oh-my-live2d/src/types/model.ts index 149819e..2ede05c 100644 --- a/packages/oh-my-live2d/src/types/model.ts +++ b/packages/oh-my-live2d/src/types/model.ts @@ -3,7 +3,7 @@ * 可配置模型地址来源以及缩放比例、舞台大小等 * @name 模型选项 */ -export interface Model { +export interface ModelOptions { /** * 模型的json文件url地址, 必填项 */ diff --git a/packages/oh-my-live2d/src/types/options.ts b/packages/oh-my-live2d/src/types/options.ts index 32c6816..8cbdf31 100644 --- a/packages/oh-my-live2d/src/types/options.ts +++ b/packages/oh-my-live2d/src/types/options.ts @@ -1,6 +1,7 @@ -import { ImportType } from '@/types'; -import { Model } from '@/types/model'; -import { Tips } from '@/types/tips'; +import { ModelOptions } from './model.js'; +import { TipsOptions } from './tips.js'; + +export type ImportType = 'complete' | 'cubism2' | 'cubism5'; /** * # 配置选项 @@ -56,7 +57,7 @@ export interface Options { * @valueType Model[] * @default [] */ - models?: Model[]; + models?: ModelOptions[]; /** * 自定义提示框样式和内容, 前往[提示框选项](/options/Tips)查看详细内容 @@ -64,7 +65,7 @@ export interface Options { * @default object * @valueType Tips */ - tips?: Tips; + tips?: TipsOptions; /** * 为组件提供一个父元素,如果未指定则默认挂载到 body 中 @@ -84,5 +85,5 @@ export interface Options { fixed?: boolean; } -export * from './model'; -export * from './tips'; +export * from './model.js'; +export * from './tips.js'; diff --git a/packages/oh-my-live2d/src/types/tips.ts b/packages/oh-my-live2d/src/types/tips.ts index 5d5ea2c..d6ec6aa 100644 --- a/packages/oh-my-live2d/src/types/tips.ts +++ b/packages/oh-my-live2d/src/types/tips.ts @@ -4,7 +4,7 @@ * 配置提示框样式和消息内容 * @name 提示框选项 */ -export interface Tips { +export interface TipsOptions { /** * * 自定义提示框样式 diff --git a/packages/oh-my-live2d/src/types/utils.ts b/packages/oh-my-live2d/src/types/utils.ts new file mode 100644 index 0000000..eae1aab --- /dev/null +++ b/packages/oh-my-live2d/src/types/utils.ts @@ -0,0 +1 @@ +export type DeepRequired = T extends Function ? T : T extends object ? { [P in keyof T]-?: DeepRequired } : T; diff --git a/packages/oh-my-live2d/src/utils/index.ts b/packages/oh-my-live2d/src/utils/index.ts index bb72c50..87f635a 100644 --- a/packages/oh-my-live2d/src/utils/index.ts +++ b/packages/oh-my-live2d/src/utils/index.ts @@ -1,8 +1,10 @@ -import { SDK } from '@/config'; -import type { CSSProperties, ElementConfig, PIXI_LIVE2D_DISPLAY_MODULE } from '@/types'; -import { ImportType } from '@/types'; import { isNumber } from 'tianjie'; +import { SDK } from '../config/index.js'; +import type { PIXI_LIVE2D_DISPLAY_MODULE, CSSProperties, ElementConfig, ImportType } from '../types/index.js'; + +export * from './tips.js'; + /** * 打印项目信息 * @param importType diff --git a/packages/oh-my-live2d/src/utils/tips.ts b/packages/oh-my-live2d/src/utils/tips.ts index 7b9d781..ff5388e 100644 --- a/packages/oh-my-live2d/src/utils/tips.ts +++ b/packages/oh-my-live2d/src/utils/tips.ts @@ -1,10 +1,7 @@ -// import { welcomeTipsMessage } from '@/config/tips-message'; -// import { WelcomeTips } from '@/types/tips'; - -import { defaultOptions } from '@/config'; +import { DEFAULT_OPTIONS } from '../config/index.js'; export const getWelcomeMessage = function (tipsConfig) { - const welcomeTipsMessage = defaultOptions.tips.welcomeTips.message; + const welcomeTipsMessage = DEFAULT_OPTIONS.tips.welcomeTips.message; const { message } = tipsConfig; let welMessage = ''; const nowHours = new Date().getHours().toString(); diff --git a/packages/oh-my-live2d/tsconfig.json b/packages/oh-my-live2d/tsconfig.json index aeb0e5a..40ebdf6 100644 --- a/packages/oh-my-live2d/tsconfig.json +++ b/packages/oh-my-live2d/tsconfig.json @@ -2,9 +2,9 @@ "compilerOptions": { "target": "ES2022", "useDefineForClassFields": true, - "module": "ESNext", - "moduleResolution": "Node", - "lib": ["ESNext", "DOM"], + "module": "NodeNext", + "moduleResolution": "NodeNext", + "lib": ["DOM", "ESNext"], "outDir": "./dist", "baseUrl": ".", "declaration": true, @@ -14,11 +14,8 @@ "allowSyntheticDefaultImports": true, "strict": true, "allowJs": true, - "noImplicitAny": false, - "paths": { - "@/*": ["src/*"] - } + "noImplicitAny": false }, - "include": ["**/*"], + "include": ["src/*"], "exclude": ["src/library/*"] } diff --git a/packages/oh-my-live2d/vite.config.ts b/packages/oh-my-live2d/vite.config.ts index efef914..8321ba7 100644 --- a/packages/oh-my-live2d/vite.config.ts +++ b/packages/oh-my-live2d/vite.config.ts @@ -1,4 +1,3 @@ -import { resolve } from 'path'; import { defineConfig } from 'vite'; import project from './package.json'; @@ -18,10 +17,5 @@ export default defineConfig({ chunkFileNames: 'oml2d.app.js' } } - }, - resolve: { - alias: { - '@': resolve(__dirname, './src') - } } }); diff --git a/packages/vuepress-plugin/package.json b/packages/vuepress-plugin/package.json index 81de50f..3a303ac 100644 --- a/packages/vuepress-plugin/package.json +++ b/packages/vuepress-plugin/package.json @@ -29,7 +29,8 @@ "release": "dotenv release-it" }, "dependencies": { - "oh-my-live2d": "workspace:*" + "oh-my-live2d": "workspace:*", + "vue": "^3.4.21" }, "peerDependencies": { "vuepress": "^2.0.0-rc.8" diff --git a/packages/vuepress-plugin/tsconfig.build.json b/packages/vuepress-plugin/tsconfig.build.json index fedac7d..6429bef 100644 --- a/packages/vuepress-plugin/tsconfig.build.json +++ b/packages/vuepress-plugin/tsconfig.build.json @@ -5,7 +5,8 @@ "moduleResolution": "NodeNext", "lib": ["ESNext", "DOM"], "outDir": "./dist", - "strict": true + "strict": true, + "skipLibCheck": true }, "include": ["src"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e46a09a..311daea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -95,6 +95,9 @@ importers: oh-my-live2d: specifier: workspace:* version: link:../oh-my-live2d + vue: + specifier: ^3.4.21 + version: 3.4.21(typescript@5.3.3) vuepress: specifier: ^2.0.0-rc.8 version: 2.0.0-rc.8(typescript@5.3.3)(vue@3.4.21) diff --git a/tests/vite-app/public/index.min.js b/tests/vite-app/public/index.min.js index 86ba0dc..568468d 100644 --- a/tests/vite-app/public/index.min.js +++ b/tests/vite-app/public/index.min.js @@ -1,10 +1,4 @@ -(function(d,l){typeof exports=="object"&&typeof module!="undefined"?l(exports):typeof define=="function"&&define.amd?define(["exports"],l):(d=typeof globalThis!="undefined"?globalThis:d||self,l(d.OML2D={}))})(this,function(d){"use strict";var Q=Object.defineProperty;var K=(d,l,h)=>l in d?Q(d,l,{enumerable:!0,configurable:!0,writable:!0,value:h}):d[l]=h;var n=(d,l,h)=>(K(d,typeof l!="symbol"?l+"":l,h),h);var c=(d,l,h)=>new Promise((k,y)=>{var z=u=>{try{M(h.next(u))}catch(b){y(b)}},O=u=>{try{M(h.throw(u))}catch(b){y(b)}},M=u=>u.done?k(u.value):Promise.resolve(u.value).then(z,O);M((h=h.apply(d,l)).next())});window._iconfont_svg_string_3847283='',function(i){var e=(e=document.getElementsByTagName("script"))[e.length-1],t=e.getAttribute("data-injectcss"),e=e.getAttribute("data-disable-injectsvg");if(!e){var s,o,a,p,f,v=function(m,r){r.parentNode.insertBefore(m,r)};if(t&&!i.__iconfont__svg__cssinject__){i.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(m){console&&console.log(m)}}s=function(){var m,r=document.createElement("div");r.innerHTML=i._iconfont_svg_string_3847283,(r=r.getElementsByTagName("svg")[0])&&(r.setAttribute("aria-hidden","true"),r.style.position="absolute",r.style.width=0,r.style.height=0,r.style.overflow="hidden",r=r,(m=document.body).firstChild?v(r,m.firstChild):m.appendChild(r))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(s,0):(o=function(){document.removeEventListener("DOMContentLoaded",o,!1),s()},document.addEventListener("DOMContentLoaded",o,!1)):document.attachEvent&&(a=s,p=i.document,f=!1,S(),p.onreadystatechange=function(){p.readyState=="complete"&&(p.onreadystatechange=null,w())})}function w(){f||(f=!0,a())}function S(){try{p.documentElement.doScroll("left")}catch(m){return void setTimeout(S,50)}w()}}(window);const l="https://lib.oml2d.com",h={fixed:!0,sayHello:!0,transitionTime:1e3,parentElement:document.body,importType:"complete",libraryUrls:{cubism2:`${l}/live2d.min.js`,cubism5:`${l}/live2dcubismcore.min.js`},models:[],tips:{style:{width:230,height:100,offsetX:0,offsetY:0},idleTips:{wordTheDay:!1,message:[],duration:5e3,interval:1e4,priority:2},welcomeTips:{message:{daybreak:"早上好!一日之计在于晨,美好的一天就要开始了。",morning:"上午好!工作顺利嘛,不要久坐,多起来走动走动哦!",noon:"中午了,工作了一个上午,现在是午餐时间!",afternoon:"午后很容易犯困呢,来杯咖啡吧~",dusk:"傍晚了!工作一天幸苦啦~",night:"晚上好,今天过得怎么样呢?",lateNight:"已经这么晚了呀,早点休息吧,晚安~",weeHours:"这么晚还不睡吗?当心熬夜秃头哦!"},duration:6e3,priority:3},copyTips:{duration:3e3,priority:3,message:["你复制了什么内容呢?记得注明出处哦~"]}}},k={PIXI:`${l}/pixi.min.js`,PIXI_LIVE2D_DISPLAY:`${l}/pixi-live2d-display.min.js`},y={stageId:"oml2dStage",canvasId:"oml2dCanvas",statusBarId:"oml2dStatusBar",tipsId:"oml2dTips",menusId:"oml2dMenus"},z=[{id:"SwitchModel",name:"icon-a-userswitch-fill",title:"切换模型"},{id:"Play",name:"icon-skin-fill",title:"变装"},{id:"About",name:"icon-info-circle-fill",title:"关于"}],O=i=>{const t=i.length;if(t===0)return;const e=Math.floor(Math.random()*t);return i[e]},M=(i,t)=>{let e;return{start:function(){return c(this,null,function*(){const s=()=>c(this,null,function*(){e&&(yield i(),clearTimeout(e),e=setTimeout(s,t))});e||(clearTimeout(e),e=setTimeout(s,t))})},stop:function(){clearTimeout(e),e=void 0}}},u=i=>i!==null&&typeof i=="object"&&!Array.isArray(i),b=i=>typeof i=="number"||i instanceof Number,x=(i,t)=>{const e=Object.assign({},i);return u(i)&&u(t)&&Object.keys(t).forEach(s=>{u(t[s])?s in i?e[s]=x(i[s],t[s]):Object.assign(e,{[s]:t[s]}):Object.assign(e,{[s]:t[s]})}),e},N=()=>{console.log(...[` - %c 🎉🎉🎉 %c %c ✨ oh-my-live2d v0.7.1 - https://oml2d.com Happy Hacking !! ✨ %c %c 🎉🎉🎉 -`,"background: #add7fb; padding:5px 0;","background: #58b0fc; padding:5px 0;","color: #fff; background: #030307; padding:5px 0;","background: #58b0fc; padding:5px 0;","background: #add7fb; padding:5px 0;"])},H=i=>{"width"in i&&b(i.width)&&(i.width=`${i.width}px`),"height"in i&&b(i.height)&&(i.height=`${i.height}px`)},E=(i,t)=>{Object.assign(t.style,i)},$=i=>new Promise(t=>setTimeout(t,i)),g=i=>{const t=document.createElement(i.tagName);return t.id=i.id,i.className&&(t.className=i.className),i.dataName&&t.setAttribute("data-name",i.dataName),i.childrens&&i.childrens.forEach(e=>{t.appendChild(g(e))}),i.innerHtml&&(t.innerHTML=i.innerHtml),i.innerText&&(t.innerText=i.innerText),t},I=i=>new Promise(t=>{const e=document.createElement("script");document.head.append(e),e.src=i,e.addEventListener("load",()=>{t()})}),_=(i,t)=>c(this,null,function*(){switch(i){case"complete":yield Promise.all([I(t.cubism2),I(t.cubism5)]);break;default:yield I(t[i]);break}yield I(k.PIXI),yield I(k.PIXI_LIVE2D_DISPLAY)}),B=()=>c(this,null,function*(){const t=yield(yield fetch("https://unpkg.com/oh-my-live2d/package.json")).json();t.version!=="0.7.1"&&console.warn("[oml2d] 检查到 oh-my-live2d 存在最新版:",`v${t.version}`,"请前往: https://oml2d.com 以获得最新版详细信息, 并及时更新.")}),j=()=>c(this,null,function*(){const t=yield(yield fetch("https://v1.hitokoto.cn/")).json();return`${t.hitokoto} -- ${t.from}`});var T=(i=>(i.PC="PC",i.MOBILE="MOBILE",i))(T||{});class A{constructor(t){n(this,"element");n(this,"style",{});n(this,"clickItem");this.stageElement=t,this.element=g({id:y.menusId,tagName:"div",className:y.menusId}),this.createMenuItem(),this.stageElement.append(this.element),this.ininStyle()}ininStyle(){this.setStyle({transition:"all 500ms",visibility:"hidden",opacity:0,position:"absolute",right:0,bottom:"10%",zIndex:"9999",fontSize:"26px"}),this.stageElement.addEventListener("mouseover",()=>this.setStyle({opacity:1,visibility:"visible"})),this.stageElement.addEventListener("mouseout",()=>this.setStyle({opacity:0,visibility:"hidden"}))}createMenuItem(){const t=z.map(e=>{const s=g({id:e.id,tagName:"div",dataName:e.id,className:"oml2d-menus-item",innerHtml:` - - - - `});return s.title=e.title,s});this.element.append(...t),this.element.addEventListener("click",e=>{var o;if(e.target===e.currentTarget)return;let s=e.target;for(;s.parentNode!==e.currentTarget;)s=s.parentNode;(o=this.clickItem)==null||o.call(this,s.getAttribute("data-name"))})}onClickItem(t){this.clickItem=t}setStyle(t){this.style=x(this.style,t),E(this.style,this.element)}}class D{constructor(t,e,s){n(this,"model");n(this,"failEvent");this.live2dModel=t,this.modelOptions=e,this.application=s,this.model=this.create()}create(){const t=this.live2dModel.fromSync(this.modelOptions.path||"",{onError:e=>{var s;(s=this.failEvent)==null||s.call(this,e)}});return t.once("load",()=>{this.application.stage.addChild(this.model),this.application.resize()}),t}onLoaded(t){this.model.once("load",()=>{t({width:this.model.width,height:this.model.height})})}onFail(t){this.failEvent=t}setScale(t=.1,e=.1){this.model.scale.set(t,e)}setPosition(t=0,e=0){this.model.x=t,this.model.y=e}changeTexture(t){if(this.model.textures.length<=1)t({status:!1});else{const e=this.model.textures.shift();this.model.textures.push(e),t({status:!0})}}}const X=` +(function(d,r){typeof exports=="object"&&typeof module!="undefined"?r(exports):typeof define=="function"&&define.amd?define(["exports"],r):(d=typeof globalThis!="undefined"?globalThis:d||self,r(d.OML2D={}))})(this,function(d){"use strict";var G=Object.defineProperty;var K=(d,r,m)=>r in d?G(d,r,{enumerable:!0,configurable:!0,writable:!0,value:m}):d[r]=m;var n=(d,r,m)=>(K(d,typeof r!="symbol"?r+"":r,m),m);var c=(d,r,m)=>new Promise((I,T)=>{var y=u=>{try{b(m.next(u))}catch(S){T(S)}},g=u=>{try{b(m.throw(u))}catch(S){T(S)}},b=u=>u.done?I(u.value):Promise.resolve(u.value).then(y,g);b((m=m.apply(d,r)).next())});const r=i=>{const t=i.length;if(t===0)return;const e=Math.floor(Math.random()*t);return i[e]},m=(i,t)=>{let e;return{start:function(){return c(this,null,function*(){const s=()=>c(this,null,function*(){e&&(yield i(),clearTimeout(e),e=setTimeout(s,t))});e||(clearTimeout(e),e=setTimeout(s,t))})},stop:function(){clearTimeout(e),e=void 0}}},I=i=>i!==null&&typeof i=="object"&&!Array.isArray(i),T=i=>typeof i=="number"||i instanceof Number,y=(i,t)=>{const e=Object.assign({},i);return I(i)&&I(t)&&Object.keys(t).forEach(s=>{I(t[s])?s in i?e[s]=y(i[s],t[s]):Object.assign(e,{[s]:t[s]}):Object.assign(e,{[s]:t[s]})}),e};var g=(i=>(i.PC="PC",i.MOBILE="MOBILE",i))(g||{});const b="https://lib.oml2d.com",u={fixed:!0,sayHello:!0,transitionTime:1e3,parentElement:document.body,importType:"complete",libraryUrls:{cubism2:`${b}/live2d.min.js`,cubism5:`${b}/live2dcubismcore.min.js`},models:[],tips:{style:{width:230,height:100,offsetX:0,offsetY:0},idleTips:{wordTheDay:!1,message:[],duration:5e3,interval:1e4,priority:2},welcomeTips:{message:{daybreak:"早上好!一日之计在于晨,美好的一天就要开始了。",morning:"上午好!工作顺利嘛,不要久坐,多起来走动走动哦!",noon:"中午了,工作了一个上午,现在是午餐时间!",afternoon:"午后很容易犯困呢,来杯咖啡吧~",dusk:"傍晚了!工作一天幸苦啦~",night:"晚上好,今天过得怎么样呢?",lateNight:"已经这么晚了呀,早点休息吧,晚安~",weeHours:"这么晚还不睡吗?当心熬夜秃头哦!"},duration:6e3,priority:3},copyTips:{duration:3e3,priority:3,message:["你复制了什么内容呢?记得注明出处哦~"]}}},S={PIXI:`${b}/pixi.min.js`,PIXI_LIVE2D_DISPLAY:`${b}/pixi-live2d-display.min.js`},M={stageId:"oml2dStage",canvasId:"oml2dCanvas",statusBarId:"oml2dStatusBar",tipsId:"oml2dTips",menusId:"oml2dMenus"},N=[{id:"SwitchModel",name:"icon-a-userswitch-fill",title:"切换模型"},{id:"Play",name:"icon-skin-fill",title:"变装"},{id:"About",name:"icon-info-circle-fill",title:"关于"}],P=` @keyframes oml2d-shake-tips{ 0% { transform: translate(-50%, 5%) scale(0.99); @@ -123,9 +117,15 @@ transform: translateX(0%); } } -`;class R{constructor(t,e){n(this,"element");n(this,"canvasElement");n(this,"wrapperElement");n(this,"style",{});n(this,"canvasStyle",{});n(this,"status",0);n(this,"slideChangeEnd");this.targetElement=t,this.options=e,this.element=g({id:y.stageId,tagName:"div"}),this.canvasElement=g({id:y.canvasId,tagName:"canvas"}),this.wrapperElement=g({id:"oml2dWrapper",tagName:"div"}),this.create(),this.initStyle()}create(){const t=document.createDocumentFragment();this.element.append(this.canvasElement),t.append(this.element),this.targetElement.append(t),this.targetElement!==document.body&&document.body.append(this.targetElement),window.onbeforeunload=()=>{this.targetElement.removeChild(this.element)}}initStyle(){this.setStyle({width:"0px",height:"0px",position:this.options.fixed?"fixed":"relative",left:0,bottom:0,zIndex:"9997",transform:"translateY(130%)"});const t=g({tagName:"style",id:"oml2dStyle",innerHtml:X});document.head.append(t)}setStyle(t){this.style=x(this.style,t),E(this.style,this.element),this.setCanvasStyle({width:"100%",height:"100%",zIndex:"9999",position:"relative"})}setCanvasStyle(t){this.canvasStyle=x(this.canvasStyle,t),E(this.canvasStyle,this.canvasElement)}slideIn(t){return this.setStyle({animationName:"oml2d-stage-slide-in",animationDuration:`${t}ms`,animationFillMode:"forwards"}),this.status=1,new Promise(e=>{setTimeout(()=>c(this,null,function*(){var s;(s=this.slideChangeEnd)==null||s.call(this,this.status),e()}),t)})}slideOut(t){return this.setStyle({animationName:"oml2d-stage-slide-out",animationDuration:`${t}ms`,animationFillMode:"forwards"}),this.status=0,new Promise(e=>setTimeout(()=>{var s;(s=this.slideChangeEnd)==null||s.call(this,this.status),e()},t))}onSlideChangeEnd(t){this.slideChangeEnd=t}}var L=(i=>(i.info="info",i.error="error",i))(L||{});class F{constructor(t){n(this,"element");n(this,"transitionTime",800);n(this,"status",0);n(this,"stateColor",{info:"#58b0fc",error:"#F08080"});n(this,"style",{});this.element=g({id:y.statusBarId,tagName:"div",innerText:"hello"}),t.append(this.element),this.initStyle()}initStyle(){this.setStyle({minWidth:"20px",minHeight:"50px",position:"fixed",transform:"translateX(-110%)",left:"0",bottom:"80px",padding:"7px 5px",zIndex:"9998",backgroundColor:"#58b0fc",borderStyle:"solid",borderColor:"#fff",fontWeight:"bold",borderRadius:"0 5px 5px 0",borderWidth:"2px 2px 2px 0",boxShadow:"0 0 5px #999",color:"#fff",display:"flex",alignItems:"center",textAlign:"center",flexWrap:"wrap",fontSize:"14px",writingMode:"vertical-lr"})}setStyle(t){this.style=x(this.style,t),E(t,this.element)}slideIn(){return new Promise(t=>{this.status=1,this.setStyle({animationName:"oml2d-status-bar-slide-in",animationDuration:`${this.transitionTime}ms`,animationFillMode:"forwards"}),setTimeout(()=>{t(this.status)},this.transitionTime)})}slideOut(){return new Promise(t=>{this.status=0,this.setStyle({animationName:"oml2d-status-bar-slide-out",animationDuration:`${this.transitionTime}ms`,animationFillMode:"forwards"}),setTimeout(()=>{t(this.status)},this.transitionTime)})}showLoading(){this.setContent(` +`,H=function(i){const t=u.tips.welcomeTips.message,{message:e}=i;let s="";const o=new Date().getHours().toString(),a=/^[5-7]$/,p=/^(?:[8-9]|1[0-1])$/,f=/^(1[2-3])$/,w=/^1[4-7]$/,x=/^1[8-9]$/,E=/^2[0-1]$/,h=/^2[2-3]$/;return a.test(o)?s=(e==null?void 0:e.daybreak)||t.daybreak:p.test(o)?s=(e==null?void 0:e.morning)||t.morning:f.test(o)?s=(e==null?void 0:e.noon)||t.noon:w.test(o)?s=(e==null?void 0:e.afternoon)||t.afternoon:x.test(o)?s=(e==null?void 0:e.dusk)||t.dusk:E.test(o)?s=(e==null?void 0:e.night)||t.night:h.test(o)?s=(e==null?void 0:e.lateNight)||t.lateNight:s=(e==null?void 0:e.weeHours)||t.weeHours,s},_=()=>{console.log(...[` + %c 🎉🎉🎉 %c %c ✨ oh-my-live2d v0.7.1 - https://oml2d.com Happy Hacking !! ✨ %c %c 🎉🎉🎉 +`,"background: #add7fb; padding:5px 0;","background: #58b0fc; padding:5px 0;","color: #fff; background: #030307; padding:5px 0;","background: #58b0fc; padding:5px 0;","background: #add7fb; padding:5px 0;"])},$=i=>{"width"in i&&T(i.width)&&(i.width=`${i.width}px`),"height"in i&&T(i.height)&&(i.height=`${i.height}px`)},k=(i,t)=>{Object.assign(t.style,i)},B=i=>new Promise(t=>setTimeout(t,i)),v=i=>{const t=document.createElement(i.tagName);return t.id=i.id,i.className&&(t.className=i.className),i.dataName&&t.setAttribute("data-name",i.dataName),i.children&&i.children.forEach(e=>{t.appendChild(v(e))}),i.innerHtml&&(t.innerHTML=i.innerHtml),i.innerText&&(t.innerText=i.innerText),t},O=i=>new Promise(t=>{const e=document.createElement("script");document.head.append(e),e.src=i,e.addEventListener("load",()=>{t()})}),j=(i,t)=>c(this,null,function*(){switch(i){case"complete":yield Promise.all([O(t.cubism2),O(t.cubism5)]);break;default:yield O(t[i]);break}yield O(S.PIXI),yield O(S.PIXI_LIVE2D_DISPLAY)}),A=()=>c(this,null,function*(){const t=yield(yield fetch("https://unpkg.com/oh-my-live2d/package.json")).json();t.version!=="0.7.1"&&console.warn("[oml2d] 检查到 oh-my-live2d 存在最新版:",`v${t.version}`,"请前往: https://oml2d.com 以获得最新版详细信息, 并及时更新.")}),D=()=>c(this,null,function*(){const t=yield(yield fetch("https://v1.hitokoto.cn/")).json();return`${t.hitokoto} -- ${t.from}`});class X{constructor(t){n(this,"element");n(this,"style",{});n(this,"clickItem");this.stageElement=t,this.element=v({id:M.menusId,tagName:"div",className:M.menusId}),this.createMenuItem(),this.stageElement.append(this.element),this.ininStyle()}ininStyle(){this.setStyle({transition:"all 500ms",visibility:"hidden",opacity:0,position:"absolute",right:0,bottom:"10%",zIndex:"9999",fontSize:"26px"}),this.stageElement.addEventListener("mouseover",()=>this.setStyle({opacity:1,visibility:"visible"})),this.stageElement.addEventListener("mouseout",()=>this.setStyle({opacity:0,visibility:"hidden"}))}createMenuItem(){const t=N.map(e=>{const s=v({id:e.id,tagName:"div",dataName:e.id,className:"oml2d-menus-item",innerHtml:` + + + + `});return s.title=e.title,s});this.element.append(...t),this.element.addEventListener("click",e=>{var o;if(e.target===e.currentTarget)return;let s=e.target;for(;s.parentNode!==e.currentTarget;)s=s.parentNode;(o=this.clickItem)==null||o.call(this,s.getAttribute("data-name"))})}onClickItem(t){this.clickItem=t}setStyle(t){this.style=y(this.style,t),k(this.style,this.element)}}class F{constructor(t,e,s){n(this,"model");n(this,"failEvent");this.live2dModel=t,this.modelOptions=e,this.application=s,this.model=this.create()}create(){const t=this.live2dModel.fromSync(this.modelOptions.path||"",{onError:e=>{var s;(s=this.failEvent)==null||s.call(this,e)}});return t.once("load",()=>{this.application.stage.addChild(this.model),this.application.resize()}),t}onLoaded(t){this.model.once("load",()=>{t({width:this.model.width,height:this.model.height})})}onFail(t){this.failEvent=t}setScale(t=.1,e=.1){this.model.scale.set(t,e)}setPosition(t=0,e=0){this.model.x=t,this.model.y=e}changeTexture(t){if(this.model.textures.length<=1)t({status:!1});else{const e=this.model.textures.shift();this.model.textures.push(e),t({status:!0})}}}class R{constructor(t,e){n(this,"element");n(this,"canvasElement");n(this,"wrapperElement");n(this,"style",{});n(this,"canvasStyle",{});n(this,"status",0);n(this,"slideChangeEnd");this.targetElement=t,this.options=e,this.element=v({id:M.stageId,tagName:"div"}),this.canvasElement=v({id:M.canvasId,tagName:"canvas"}),this.wrapperElement=v({id:"oml2dWrapper",tagName:"div"}),this.create(),this.initStyle()}create(){const t=document.createDocumentFragment();this.element.append(this.canvasElement),t.append(this.element),this.targetElement.append(t),this.targetElement!==document.body&&document.body.append(this.targetElement),window.onbeforeunload=()=>{this.targetElement.removeChild(this.element)}}initStyle(){this.setStyle({width:"0px",height:"0px",position:this.options.fixed?"fixed":"relative",left:0,bottom:0,zIndex:"9997",transform:"translateY(130%)"});const t=v({tagName:"style",id:"oml2dStyle",innerHtml:P});document.head.append(t)}setStyle(t){this.style=y(this.style,t),k(this.style,this.element),this.setCanvasStyle({width:"100%",height:"100%",zIndex:"9999",position:"relative"})}setCanvasStyle(t){this.canvasStyle=y(this.canvasStyle,t),k(this.canvasStyle,this.canvasElement)}slideIn(t){return this.setStyle({animationName:"oml2d-stage-slide-in",animationDuration:`${t}ms`,animationFillMode:"forwards"}),this.status=1,new Promise(e=>{setTimeout(()=>c(this,null,function*(){var s;(s=this.slideChangeEnd)==null||s.call(this,this.status),e()}),t)})}slideOut(t){return this.setStyle({animationName:"oml2d-stage-slide-out",animationDuration:`${t}ms`,animationFillMode:"forwards"}),this.status=0,new Promise(e=>setTimeout(()=>{var s;(s=this.slideChangeEnd)==null||s.call(this,this.status),e()},t))}onSlideChangeEnd(t){this.slideChangeEnd=t}}var L=(i=>(i.info="info",i.error="error",i))(L||{});class W{constructor(t){n(this,"element");n(this,"transitionTime",800);n(this,"status",0);n(this,"stateColor",{info:"#58b0fc",error:"#F08080"});n(this,"style",{});this.element=v({id:M.statusBarId,tagName:"div",innerText:"hello"}),t.append(this.element),this.initStyle()}initStyle(){this.setStyle({minWidth:"20px",minHeight:"50px",position:"fixed",transform:"translateX(-110%)",left:"0",bottom:"80px",padding:"7px 5px",zIndex:"9998",backgroundColor:"#58b0fc",borderStyle:"solid",borderColor:"#fff",fontWeight:"bold",borderRadius:"0 5px 5px 0",borderWidth:"2px 2px 2px 0",boxShadow:"0 0 5px #999",color:"#fff",display:"flex",alignItems:"center",textAlign:"center",flexWrap:"wrap",fontSize:"14px",writingMode:"vertical-lr"})}setStyle(t){this.style=y(this.style,t),k(t,this.element)}slideIn(){return new Promise(t=>{this.status=1,this.setStyle({animationName:"oml2d-status-bar-slide-in",animationDuration:`${this.transitionTime}ms`,animationFillMode:"forwards"}),setTimeout(()=>{t(this.status)},this.transitionTime)})}slideOut(){return new Promise(t=>{this.status=0,this.setStyle({animationName:"oml2d-status-bar-slide-out",animationDuration:`${this.transitionTime}ms`,animationFillMode:"forwards"}),setTimeout(()=>{t(this.status)},this.transitionTime)})}showLoading(){this.setContent(`
加载中
- `),this.slideIn()}hideLoading(){this.popup("加载成功")}loadingError(t){this.popup("加载失败","error",!1);const e=()=>{this.popup("重新加载","info",!1)},s=()=>{this.popup("加载失败","error",!1)},o=()=>{t(),this.element.removeEventListener("mouseout",s),this.element.removeEventListener("mouseover",e),this.element.removeEventListener("click",o)};this.element.addEventListener("click",o),this.element.addEventListener("mouseover",e),this.element.addEventListener("mouseout",s)}popup(t,e="info",s=1e3){this.setContent(t),this.setStyle({backgroundColor:this.stateColor[e]}),this.slideIn().then(()=>{s&&setTimeout(()=>{this.slideOut()},s)})}setContent(t){this.element.innerHTML=t}}const W=function(i){const t=h.tips.welcomeTips.message,{message:e}=i;let s="";const o=new Date().getHours().toString(),a=/^[5-7]$/,p=/^(?:[8-9]|1[0-1])$/,f=/^(1[2-3])$/,v=/^1[4-7]$/,w=/^1[8-9]$/,S=/^2[0-1]$/,m=/^2[2-3]$/;return a.test(o)?s=(e==null?void 0:e.daybreak)||t.daybreak:p.test(o)?s=(e==null?void 0:e.morning)||t.morning:f.test(o)?s=(e==null?void 0:e.noon)||t.noon:v.test(o)?s=(e==null?void 0:e.afternoon)||t.afternoon:w.test(o)?s=(e==null?void 0:e.dusk)||t.dusk:S.test(o)?s=(e==null?void 0:e.night)||t.night:m.test(o)?s=(e==null?void 0:e.lateNight)||t.lateNight:s=(e==null?void 0:e.weeHours)||t.weeHours,s};class Y{constructor(t,e){n(this,"element");n(this,"idlePlayer");n(this,"closeTimer",0);n(this,"transitionTime",1e3);n(this,"style",{});n(this,"priority",0);this.tipsOptions=e,this.element=g({id:y.tipsId,tagName:"div"}),t.append(this.element),this.initStyle(),this.idlePlayer=this.createIdleMessagePlayer()}initStyle(){if(this.setStyle({position:"absolute",fontSize:"18px",borderRadius:"10px",filter:"drop-shadow(0 0 5px #999)",backgroundColor:"#58b0fc",border:"2px solid #fff",color:"#fff",padding:"3px 5px",opacity:0,visibility:"hidden",transform:"translateX(-50%)",left:"50%",textAlign:"center",display:"flex",alignItems:"center",justifyContent:"center",animationDuration:`${this.transitionTime}ms,${this.transitionTime}ms`,animationFillMode:"forwards, none",animationIterationCount:"1, infinite",minWidth:"230px",minHeight:"100px",top:0}),this.tipsOptions){const{width:t=230,height:e=100,offsetX:s=0,offsetY:o=0}=this.tipsOptions.style||{};this.setStyle({minWidth:`${t}px`,minHeight:`${e}px`,left:`calc(${s}px + 50%)`,top:`${o}px`})}}setStyle(t){this.style=x(this.style,t),E(this.style,this.element)}setContent(t){this.element.innerHTML=t}showMessage(t,e=3e3,s=0){s{this.setStyle({animationName:"oml2d-hidden-tips,oml2d-shake-tips"}),this.priority=0},e))}clear(){var t;this.setStyle({animationName:"oml2d-hidden-tips,oml2d-shake-tips"}),(t=this.idlePlayer)==null||t.stop(),clearTimeout(this.closeTimer),this.priority=0}notification(t,e=3e3,s=3){var o;(o=this.idlePlayer)==null||o.stop(),this.showMessage(t,e,s),setTimeout(()=>{var a;(a=this.idlePlayer)==null||a.start()},e+this.transitionTime)}welcome(){return c(this,null,function*(){if(!this.tipsOptions)return;const t=W(this.tipsOptions.welcomeTips||{}),{duration:e,priority:s}=this.tipsOptions.welcomeTips;this.notification(t,e,s)})}copy(){return c(this,null,function*(){var t,e;if((e=(t=this.tipsOptions.copyTips)==null?void 0:t.message)!=null&&e.length){const s=O(this.tipsOptions.copyTips.message);this.notification(s,this.tipsOptions.copyTips.duration,this.tipsOptions.copyTips.priority)}})}createIdleMessagePlayer(){if(!this.tipsOptions)return;const{message:t,duration:e,priority:s}=this.tipsOptions.idleTips;let o="";const a=M(()=>c(this,null,function*(){this.tipsOptions.idleTips.wordTheDay?o=yield j():o=O(t||[])||"",o?(yield this.showMessage(o,e,s),yield $(e)):a.stop()}),this.tipsOptions.idleTips.interval);return a}}class V{constructor(t,e,s){n(this,"stage");n(this,"statusBar");n(this,"tips");n(this,"menus");n(this,"application");n(this,"model");n(this,"modelIndex",0);n(this,"windowSizeType",T.PC);n(this,"mediaQuery",window.matchMedia("screen and (max-width: 768px)"));this.options=t,this.live2dModel=e,this.Application=s,B(),this.options.sayHello&&this.sayHello(),this.stage=new R(this.options.parentElement,t),this.statusBar=new F(this.options.parentElement),this.tips=new Y(this.stage.element,this.options.tips),this.menus=new A(this.stage.element),this.application=this.createApplication(),this.initialize()}initialize(){if(this.verifyWindowSizeType(),this.windowSizeType!==T.PC){this.statusBar.popup("暂不支持移动端",L.info,8e3);return}this.loadModel(),this.registerEvents()}verifyWindowSizeType(){this.mediaQuery.matches?this.windowSizeType=T.MOBILE:this.windowSizeType=T.PC,this.mediaQuery.addEventListener("change",t=>{t.matches?this.windowSizeType=T.MOBILE:this.windowSizeType=T.PC})}loadModel(t=!0){var e,s,o,a,p,f,v;t&&this.statusBar.showLoading(),this.model=new D(this.live2dModel,this.currentModelOption,this.application),(o=this.model)==null||o.setScale((e=this.currentModelOption)==null?void 0:e.scale,(s=this.currentModelOption)==null?void 0:s.scale),(p=this.model)==null||p.setPosition(...((a=this.currentModelOption)==null?void 0:a.position)||[]),(f=this.model)==null||f.onLoaded(({width:w,height:S})=>{var m,r,C,P;this.setStageStyle({width:((m=this.currentModelOption.stageStyle)==null?void 0:m.width)||w,height:((r=this.currentModelOption.stageStyle)==null?void 0:r.height)||S,backgroundColor:((C=this.currentModelOption.stageStyle)==null?void 0:C.backgroundColor)||"rgba(0, 0, 0, 0)"}),this.stage.slideIn((P=this.options)==null?void 0:P.transitionTime),this.statusBar.hideLoading()}),(v=this.model)==null||v.onFail(w=>{this.statusBar.loadingError(this.loadModel.bind(this)),console.error(w)})}setStageStyle(t){H(t),this.stage.setStyle(t),this.application.resize()}get currentModelOption(){return this.options.models[this.modelIndex]}loadNextModel(){return c(this,null,function*(){var t;if(this.options.models.length<=1){yield this.tips.notification("没找到其他模型哦...",3e3,9);return}this.tips.clear(),this.statusBar.showLoading(),yield this.stage.slideOut(this.options.transitionTime),this.application.stage.children.length>=1&&this.application.stage.removeChildAt(0),b((t=this.options.models)==null?void 0:t.length)&&(this.modelIndex{var e;switch(t){case"SwitchModel":this.loadNextModel();return;case"Play":(e=this.model)==null||e.changeTexture(({status:s})=>{s?this.tips.notification("变装成功!!!",5e3,9):this.tips.notification("没有找到其他衣服哦...",5e3,9)});return;case"About":window.open("https://oml2d.com");return}}),window.addEventListener("copy",()=>{this.tips.copy()}),this.stage.onSlideChangeEnd(t=>c(this,null,function*(){t&&(yield this.tips.welcome())}))}createApplication(){return new this.Application({view:this.stage.canvasElement,resolution:2,autoStart:!0,autoDensity:!0,backgroundAlpha:0,resizeTo:this.stage.element})}}const U=(i=>{let t;return s=>c(this,null,function*(){var v;const{parentElement:o}=s,a=x(h,s);if(a.parentElement=o||document.body,!((v=a.models)!=null&&v.length))throw new Error("至少需要配置一个模型");const{Live2dModule:p,PIXI:f}=yield i(a.importType,a.libraryUrls);t||(t=new V(a,p.Live2DModel,f.Application))})})((i,t)=>c(this,null,function*(){return yield _(i,t),window.PIXI.utils.skipHello(),{Live2dModule:window.PIXI.live2d,PIXI:window.PIXI}}));d.loadOml2d=U,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}); + `),this.slideIn()}hideLoading(){this.popup("加载成功")}loadingError(t){this.popup("加载失败","error",!1);const e=()=>{this.popup("重新加载","info",!1)},s=()=>{this.popup("加载失败","error",!1)},o=()=>{t(),this.element.removeEventListener("mouseout",s),this.element.removeEventListener("mouseover",e),this.element.removeEventListener("click",o)};this.element.addEventListener("click",o),this.element.addEventListener("mouseover",e),this.element.addEventListener("mouseout",s)}popup(t,e="info",s=1e3){this.setContent(t),this.setStyle({backgroundColor:this.stateColor[e]}),this.slideIn().then(()=>{s&&setTimeout(()=>{this.slideOut()},s)})}setContent(t){this.element.innerHTML=t}}class Y{constructor(t,e){n(this,"element");n(this,"idlePlayer");n(this,"closeTimer",0);n(this,"transitionTime",1e3);n(this,"style",{});n(this,"priority",0);this.tipsOptions=e,this.element=v({id:M.tipsId,tagName:"div"}),t.append(this.element),this.initStyle(),this.idlePlayer=this.createIdleMessagePlayer()}initStyle(){if(this.setStyle({position:"absolute",fontSize:"18px",borderRadius:"10px",filter:"drop-shadow(0 0 5px #999)",backgroundColor:"#58b0fc",border:"2px solid #fff",color:"#fff",padding:"3px 5px",opacity:0,visibility:"hidden",transform:"translateX(-50%)",left:"50%",textAlign:"center",display:"flex",alignItems:"center",justifyContent:"center",animationDuration:`${this.transitionTime}ms,${this.transitionTime}ms`,animationFillMode:"forwards, none",animationIterationCount:"1, infinite",minWidth:"230px",minHeight:"100px",top:0}),this.tipsOptions){const{width:t=230,height:e=100,offsetX:s=0,offsetY:o=0}=this.tipsOptions.style||{};this.setStyle({minWidth:`${t}px`,minHeight:`${e}px`,left:`calc(${s}px + 50%)`,top:`${o}px`})}}setStyle(t){this.style=y(this.style,t),k(this.style,this.element)}setContent(t){this.element.innerHTML=t}showMessage(t,e=3e3,s=0){s{this.setStyle({animationName:"oml2d-hidden-tips,oml2d-shake-tips"}),this.priority=0},e))}clear(){var t;this.setStyle({animationName:"oml2d-hidden-tips,oml2d-shake-tips"}),(t=this.idlePlayer)==null||t.stop(),clearTimeout(this.closeTimer),this.priority=0}notification(t,e=3e3,s=3){var o;(o=this.idlePlayer)==null||o.stop(),this.showMessage(t,e,s),setTimeout(()=>{var a;(a=this.idlePlayer)==null||a.start()},e+this.transitionTime)}welcome(){return c(this,null,function*(){if(!this.tipsOptions)return;const t=H(this.tipsOptions.welcomeTips||{}),{duration:e,priority:s}=this.tipsOptions.welcomeTips;this.notification(t,e,s)})}copy(){return c(this,null,function*(){var t,e;if((e=(t=this.tipsOptions.copyTips)==null?void 0:t.message)!=null&&e.length){const s=r(this.tipsOptions.copyTips.message);this.notification(s,this.tipsOptions.copyTips.duration,this.tipsOptions.copyTips.priority)}})}createIdleMessagePlayer(){if(!this.tipsOptions)return;const{message:t,duration:e,priority:s}=this.tipsOptions.idleTips;let o="";const a=m(()=>c(this,null,function*(){this.tipsOptions.idleTips.wordTheDay?o=yield D():o=r(t||[])||"",o?(yield this.showMessage(o,e,s),yield B(e)):a.stop()}),this.tipsOptions.idleTips.interval);return a}}class V{constructor(t,e,s){n(this,"stage");n(this,"statusBar");n(this,"tips");n(this,"menus");n(this,"application");n(this,"model");n(this,"modelIndex",0);n(this,"windowSizeType",g.PC);n(this,"mediaQuery",window.matchMedia("screen and (max-width: 768px)"));this.options=t,this.live2dModel=e,this.Application=s,A(),this.options.sayHello&&this.sayHello(),this.stage=new R(this.options.parentElement,t),this.statusBar=new W(this.options.parentElement),this.tips=new Y(this.stage.element,this.options.tips),this.menus=new X(this.stage.element),this.application=this.createApplication(),this.initialize()}initialize(){if(this.verifyWindowSizeType(),this.windowSizeType!==g.PC){this.statusBar.popup("暂不支持移动端",L.info,8e3);return}this.loadModel(),this.registerEvents()}verifyWindowSizeType(){this.mediaQuery.matches?this.windowSizeType=g.MOBILE:this.windowSizeType=g.PC,this.mediaQuery.addEventListener("change",t=>{t.matches?this.windowSizeType=g.MOBILE:this.windowSizeType=g.PC})}loadModel(t=!0){var e,s,o,a,p,f,w;t&&this.statusBar.showLoading(),this.model=new F(this.live2dModel,this.currentModelOption,this.application),(o=this.model)==null||o.setScale((e=this.currentModelOption)==null?void 0:e.scale,(s=this.currentModelOption)==null?void 0:s.scale),(p=this.model)==null||p.setPosition(...((a=this.currentModelOption)==null?void 0:a.position)||[]),(f=this.model)==null||f.onLoaded(({width:x,height:E})=>{var h,l,z,C;this.setStageStyle({width:((h=this.currentModelOption.stageStyle)==null?void 0:h.width)||x,height:((l=this.currentModelOption.stageStyle)==null?void 0:l.height)||E,backgroundColor:((z=this.currentModelOption.stageStyle)==null?void 0:z.backgroundColor)||"rgba(0, 0, 0, 0)"}),this.stage.slideIn((C=this.options)==null?void 0:C.transitionTime),this.statusBar.hideLoading()}),(w=this.model)==null||w.onFail(x=>{this.statusBar.loadingError(this.loadModel.bind(this)),console.error(x)})}setStageStyle(t){$(t),this.stage.setStyle(t),this.application.resize()}get currentModelOption(){return this.options.models[this.modelIndex]}loadNextModel(){return c(this,null,function*(){var t;if(this.options.models.length<=1){yield this.tips.notification("没找到其他模型哦...",3e3,9);return}this.tips.clear(),this.statusBar.showLoading(),yield this.stage.slideOut(this.options.transitionTime),this.application.stage.children.length>=1&&this.application.stage.removeChildAt(0),T((t=this.options.models)==null?void 0:t.length)&&(this.modelIndex{var e;switch(t){case"SwitchModel":this.loadNextModel();return;case"Play":(e=this.model)==null||e.changeTexture(({status:s})=>{s?this.tips.notification("变装成功!!!",5e3,9):this.tips.notification("没有找到其他衣服哦...",5e3,9)});return;case"About":window.open("https://oml2d.com");return}}),window.addEventListener("copy",()=>{this.tips.copy()}),this.stage.onSlideChangeEnd(t=>c(this,null,function*(){t&&(yield this.tips.welcome())}))}createApplication(){return new this.Application({view:this.stage.canvasElement,resolution:2,autoStart:!0,autoDensity:!0,backgroundAlpha:0,resizeTo:this.stage.element})}}const U=i=>{let t;return s=>c(this,null,function*(){var w;const{parentElement:o}=s,a=y(u,s);if(a.parentElement=o||document.body,!((w=a.models)!=null&&w.length))throw new Error("至少需要配置一个模型");const{Live2dModule:p,PIXI:f}=yield i(a.importType,a.libraryUrls);t||(t=new V(a,p.Live2DModel,f.Application))})};window._iconfont_svg_string_3847283='',function(i){var e=(e=document.getElementsByTagName("script"))[e.length-1],t=e.getAttribute("data-injectcss"),e=e.getAttribute("data-disable-injectsvg");if(!e){var s,o,a,p,f,w=function(h,l){l.parentNode.insertBefore(h,l)};if(t&&!i.__iconfont__svg__cssinject__){i.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(h){console&&console.log(h)}}s=function(){var h,l=document.createElement("div");l.innerHTML=i._iconfont_svg_string_3847283,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(h=document.body).firstChild?w(l,h.firstChild):h.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(s,0):(o=function(){document.removeEventListener("DOMContentLoaded",o,!1),s()},document.addEventListener("DOMContentLoaded",o,!1)):document.attachEvent&&(a=s,p=i.document,f=!1,E(),p.onreadystatechange=function(){p.readyState=="complete"&&(p.onreadystatechange=null,x())})}function x(){f||(f=!0,a())}function E(){try{p.documentElement.doScroll("left")}catch(h){return void setTimeout(E,50)}x()}}(window);const Q=U((i,t)=>c(this,null,function*(){return yield j(i,t),window.PIXI.utils.skipHello(),{Live2dModule:window.PIXI.live2d,PIXI:window.PIXI}}));d.loadOml2d=Q,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}); diff --git a/tsconfig.json b/tsconfig.json index af9cda8..55037b1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,9 @@ { "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", + "target": "ES2022", "lib": ["ESNext", "DOM"], - "moduleResolution": "Node", + "module": "NodeNext", + "moduleResolution": "NodeNext", "outDir": "./dist", "baseUrl": ".", "declaration": true, @@ -20,9 +19,7 @@ "noImplicitReturns": true, "skipLibCheck": true, "noImplicitAny": false, - "paths": { - "@/*": ["packages/oh-my-live2d/src/*"] - } + "useDefineForClassFields": true }, "include": ["**/*", "docs/.vitepress/**/*.ts"], "exclude": ["packages/oh-my-live2d/src/library/*"]