├── .prettierignore ├── .gitignore ├── .prettierrc ├── dist ├── model.js.map ├── model.js ├── index.js.map ├── index.d.ts ├── index.d.ts.map ├── pixi-hooks.d.ts ├── pixi-hooks.d.ts.map ├── tsconfig.tsbuildinfo ├── hooks │ ├── GLHook.d.ts │ ├── GLHook.d.ts.map │ ├── TextureHook.d.ts │ ├── TextureHook.d.ts.map │ ├── BaseHooks.d.ts.map │ ├── BaseHooks.d.ts │ ├── GLHook.js.map │ ├── GLHook.js │ ├── BaseHooks.js.map │ ├── TextureHook.js.map │ ├── BaseHooks.js │ └── TextureHook.js ├── stats-constants.d.ts.map ├── stats-adapter.d.ts.map ├── stats-adapter.d.ts ├── stats-panel.d.ts ├── stats-constants.d.ts ├── stats-panel.d.ts.map ├── stat-storage.d.ts.map ├── stats-constants.js.map ├── stat-storage.d.ts ├── stats-constants.js ├── stats-adapter.js.map ├── index.js ├── stats-adapter.js ├── stats.d.ts.map ├── pixi-hooks.js.map ├── model.d.ts.map ├── model.d.ts ├── stats.d.ts ├── stat-storage.js.map ├── stat-storage.js ├── pixi-hooks.js ├── stats-panel.js.map ├── stats-panel.js ├── stats.js.map └── stats.js ├── src ├── index.ts ├── stats-constants.ts ├── stats-adapter.ts ├── hooks │ ├── GLHook.ts │ ├── BaseHooks.ts │ └── TextureHook.ts ├── model.ts ├── stat-storage.ts ├── pixi-hooks.ts ├── stats-panel.ts └── stats.ts ├── tsconfig.json ├── eslint.config.mjs ├── LICENSE ├── package.json ├── README.md └── yarn.lock /.prettierignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .git 3 | package-lock.json 4 | yarn-error.log 5 | .npmrc 6 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "none", 3 | "tabWidth": 2, 4 | "semi": false, 5 | "singleQuote": true 6 | } 7 | -------------------------------------------------------------------------------- /dist/model.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":""} -------------------------------------------------------------------------------- /dist/model.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=model.js.map -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './stats-constants' 2 | export * from './stats-panel' 3 | export * from './stats-adapter' 4 | export * from './stat-storage' 5 | export * from './stats' 6 | -------------------------------------------------------------------------------- /dist/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAiC;AACjC,gDAA6B;AAC7B,kDAA+B;AAC/B,iDAA8B;AAC9B,0CAAuB"} -------------------------------------------------------------------------------- /dist/index.d.ts: -------------------------------------------------------------------------------- 1 | export * from './stats-constants'; 2 | export * from './stats-panel'; 3 | export * from './stats-adapter'; 4 | export * from './stat-storage'; 5 | export * from './stats'; 6 | //# sourceMappingURL=index.d.ts.map -------------------------------------------------------------------------------- /dist/index.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA"} -------------------------------------------------------------------------------- /dist/pixi-hooks.d.ts: -------------------------------------------------------------------------------- 1 | import BaseHooks from './hooks/BaseHooks'; 2 | import { Renderer } from './model'; 3 | export declare class PIXIHooks extends BaseHooks { 4 | get hooked(): boolean; 5 | constructor(renderer: Renderer); 6 | } 7 | //# sourceMappingURL=pixi-hooks.d.ts.map -------------------------------------------------------------------------------- /dist/pixi-hooks.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"pixi-hooks.d.ts","sourceRoot":"","sources":["../src/pixi-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAA8C,QAAQ,EAAE,MAAM,SAAS,CAAA;AAE9E,qBAAa,SAAU,SAAQ,SAAS;IACtC,IAAI,MAAM,YAET;gBAEW,QAAQ,EAAE,QAAQ;CA2C/B"} -------------------------------------------------------------------------------- /dist/tsconfig.tsbuildinfo: -------------------------------------------------------------------------------- 1 | {"root":["../src/index.ts","../src/model.ts","../src/pixi-hooks.ts","../src/stat-storage.ts","../src/stats-adapter.ts","../src/stats-constants.ts","../src/stats-panel.ts","../src/stats.ts","../src/hooks/BaseHooks.ts","../src/hooks/GLHook.ts","../src/hooks/TextureHook.ts"],"version":"5.9.3"} -------------------------------------------------------------------------------- /dist/hooks/GLHook.d.ts: -------------------------------------------------------------------------------- 1 | export default class GLHook { 2 | drawPasses: number; 3 | isInit: boolean; 4 | private realGLDrawElements; 5 | private gl; 6 | constructor(_gl?: any); 7 | private fakeGLdrawElements; 8 | reset(): void; 9 | release(): void; 10 | } 11 | //# sourceMappingURL=GLHook.d.ts.map -------------------------------------------------------------------------------- /dist/hooks/GLHook.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"GLHook.d.ts","sourceRoot":"","sources":["../../src/hooks/GLHook.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,MAAM;IAClB,UAAU,EAAE,MAAM,CAAI;IAEtB,MAAM,EAAE,OAAO,CAAQ;IAE9B,OAAO,CAAC,kBAAkB,CAA2C;IAErE,OAAO,CAAC,EAAE,CAAK;gBAEH,GAAG,CAAC,EAAE,GAAG;IAerB,OAAO,CAAC,kBAAkB;IAUnB,KAAK,IAAI,IAAI;IAIb,OAAO,IAAI,IAAI;CASvB"} -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["es2020", "dom"], 4 | "experimentalDecorators": true, 5 | "esModuleInterop": true, 6 | "strict": true, 7 | "allowJs": true, 8 | "sourceMap": true, 9 | "declaration": true, 10 | "declarationMap": true, 11 | "moduleResolution": "node", 12 | "target": "es2015", 13 | "module": "none", 14 | "outDir": "./dist" 15 | }, 16 | "include": ["./src"] 17 | } 18 | -------------------------------------------------------------------------------- /src/stats-constants.ts: -------------------------------------------------------------------------------- 1 | export const PR = 4 2 | export const WIDTH = 50 * PR 3 | export const HEIGHT = 30 * PR 4 | export const TEXT_X = 7 5 | export const TEXT_Y = 7 6 | export const GRAPH_X = TEXT_X 7 | export const FONT_SIZE = 20 // tested @ 120.0 FPS (120~120) 8 | export const GRAPH_Y = FONT_SIZE + TEXT_Y 9 | export const GRAPH_WIDTH = WIDTH - GRAPH_X * 2 10 | export const GRAPH_HEIGHT = HEIGHT - GRAPH_X - GRAPH_Y 11 | export const DOM_ELEMENT_ID = 'stats' 12 | -------------------------------------------------------------------------------- /dist/stats-constants.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"stats-constants.d.ts","sourceRoot":"","sources":["../src/stats-constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,EAAE,IAAI,CAAA;AACnB,eAAO,MAAM,KAAK,QAAU,CAAA;AAC5B,eAAO,MAAM,MAAM,QAAU,CAAA;AAC7B,eAAO,MAAM,MAAM,IAAI,CAAA;AACvB,eAAO,MAAM,MAAM,IAAI,CAAA;AACvB,eAAO,MAAM,OAAO,IAAS,CAAA;AAC7B,eAAO,MAAM,SAAS,KAAK,CAAA;AAC3B,eAAO,MAAM,OAAO,QAAqB,CAAA;AACzC,eAAO,MAAM,WAAW,QAAsB,CAAA;AAC9C,eAAO,MAAM,YAAY,QAA6B,CAAA;AACtD,eAAO,MAAM,cAAc,UAAU,CAAA"} -------------------------------------------------------------------------------- /dist/stats-adapter.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"stats-adapter.d.ts","sourceRoot":"","sources":["../src/stats-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,qBAAa,cAAe,YAAW,eAAe;IACpD,IAAI,EAAE,SAAS,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IAEb,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,MAAM,CAAC,EAAE,WAAW,CAAA;gBAER,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM;IAU1C,MAAM,IAAI,IAAI;IAoBd,KAAK,IAAI,IAAI;CAKd"} -------------------------------------------------------------------------------- /dist/stats-adapter.d.ts: -------------------------------------------------------------------------------- 1 | import { IStats, IStatsJSAdapter } from './model'; 2 | import { PIXIHooks } from './pixi-hooks'; 3 | import { StatStorage } from './stat-storage'; 4 | export declare class StatsJSAdapter implements IStatsJSAdapter { 5 | hook: PIXIHooks; 6 | stats: IStats; 7 | dcStat?: StatStorage; 8 | tcStat?: StatStorage; 9 | constructor(hook: PIXIHooks, stats: IStats); 10 | update(): void; 11 | reset(): void; 12 | } 13 | //# sourceMappingURL=stats-adapter.d.ts.map -------------------------------------------------------------------------------- /dist/stats-panel.d.ts: -------------------------------------------------------------------------------- 1 | import { StatStorage } from './stat-storage'; 2 | export declare class RenderPanel { 3 | dom: HTMLCanvasElement | null; 4 | context: CanvasRenderingContext2D | null; 5 | fg: string; 6 | bg: string; 7 | name: string; 8 | statStorage: StatStorage | null; 9 | constructor(name: string, fg: string, bg: string, statStorage: StatStorage); 10 | update(value: number, maxValue: number): void; 11 | destroy(): void; 12 | } 13 | //# sourceMappingURL=stats-panel.d.ts.map -------------------------------------------------------------------------------- /dist/stats-constants.d.ts: -------------------------------------------------------------------------------- 1 | export declare const PR = 4; 2 | export declare const WIDTH: number; 3 | export declare const HEIGHT: number; 4 | export declare const TEXT_X = 7; 5 | export declare const TEXT_Y = 7; 6 | export declare const GRAPH_X = 7; 7 | export declare const FONT_SIZE = 20; 8 | export declare const GRAPH_Y: number; 9 | export declare const GRAPH_WIDTH: number; 10 | export declare const GRAPH_HEIGHT: number; 11 | export declare const DOM_ELEMENT_ID = "stats"; 12 | //# sourceMappingURL=stats-constants.d.ts.map -------------------------------------------------------------------------------- /dist/stats-panel.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"stats-panel.d.ts","sourceRoot":"","sources":["../src/stats-panel.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,qBAAa,WAAW;IACtB,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAC7B,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAAA;IACxC,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,WAAW,GAAG,IAAI,CAAA;gBAEnB,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW;IAkC1E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAuCtC,OAAO;CAaR"} -------------------------------------------------------------------------------- /dist/hooks/TextureHook.d.ts: -------------------------------------------------------------------------------- 1 | export default class TextureHook { 2 | createdTextures: Array; 3 | maxTexturesCount: number; 4 | isInit: boolean; 5 | private realGLCreateTexture; 6 | private realGLDeleteTexture; 7 | private gl; 8 | constructor(_gl?: any); 9 | get currentTextureCount(): number; 10 | registerTexture(texture: any): void; 11 | private fakeGLCreateTexture; 12 | private fakeGLDeleteTexture; 13 | reset(): void; 14 | release(): void; 15 | } 16 | //# sourceMappingURL=TextureHook.d.ts.map -------------------------------------------------------------------------------- /dist/hooks/TextureHook.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"TextureHook.d.ts","sourceRoot":"","sources":["../../src/hooks/TextureHook.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,WAAW;IACvB,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,CAAmB;IAE9C,gBAAgB,EAAE,MAAM,CAAI;IAE5B,MAAM,EAAE,OAAO,CAAQ;IAE9B,OAAO,CAAC,mBAAmB,CAA2C;IAEtE,OAAO,CAAC,mBAAmB,CAA2C;IAEtE,OAAO,CAAC,EAAE,CAAK;gBAEH,GAAG,CAAC,EAAE,GAAG;IAiBrB,IAAW,mBAAmB,IAAI,MAAM,CAEvC;IAEM,eAAe,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAQ1C,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,mBAAmB;IASpB,KAAK,IAAI,IAAI;IAKb,OAAO,IAAI,IAAI;CAUvB"} -------------------------------------------------------------------------------- /dist/stat-storage.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"stat-storage.d.ts","sourceRoot":"","sources":["../src/stat-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAE5C,qBAAa,WAAW;IACtB,MAAM,EAAE,MAAM,EAAE,CAAK;IACrB,YAAY,EAAE,MAAM,CAAK;IACzB,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAY;IAEvD,IAAI,GAAG,IAAI,MAAM,CAIhB;IAED,IAAI,GAAG,IAAI,MAAM,CAIhB;IAED,IAAI,YAAY,IAAI,MAAM,CAKzB;IAED,SAAS,CAAC,KAAK,EAAE,MAAM;IAOvB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAOtC,WAAW,CAAC,EAAE,EAAE,kBAAkB;IAMlC,cAAc,CAAC,EAAE,EAAE,kBAAkB;IAIrC,cAAc;CAGf"} -------------------------------------------------------------------------------- /dist/stats-constants.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"stats-constants.js","sourceRoot":"","sources":["../src/stats-constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,EAAE,GAAG,CAAC,CAAA;AACN,QAAA,KAAK,GAAG,EAAE,GAAG,UAAE,CAAA;AACf,QAAA,MAAM,GAAG,EAAE,GAAG,UAAE,CAAA;AAChB,QAAA,MAAM,GAAG,CAAC,CAAA;AACV,QAAA,MAAM,GAAG,CAAC,CAAA;AACV,QAAA,OAAO,GAAG,cAAM,CAAA;AAChB,QAAA,SAAS,GAAG,EAAE,CAAA,CAAC,+BAA+B;AAC9C,QAAA,OAAO,GAAG,iBAAS,GAAG,cAAM,CAAA;AAC5B,QAAA,WAAW,GAAG,aAAK,GAAG,eAAO,GAAG,CAAC,CAAA;AACjC,QAAA,YAAY,GAAG,cAAM,GAAG,eAAO,GAAG,eAAO,CAAA;AACzC,QAAA,cAAc,GAAG,OAAO,CAAA"} -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import globals from 'globals' 2 | import tseslint from 'typescript-eslint' 3 | 4 | export default [ 5 | { files: ['**/*.{js,mjs,cjs,ts,jsx,tsx}'] }, 6 | { ignores: ['dist/', '**/*.spec.ts'] }, 7 | { 8 | settings: { 9 | react: { 10 | version: 'detect' 11 | } 12 | } 13 | }, 14 | { 15 | languageOptions: { globals: { ...globals.browser, ...globals.node } } 16 | }, 17 | ...tseslint.configs.recommended, 18 | { 19 | rules: { 20 | '@typescript-eslint/no-explicit-any': ['warn'] 21 | } 22 | } 23 | ] 24 | -------------------------------------------------------------------------------- /dist/stat-storage.d.ts: -------------------------------------------------------------------------------- 1 | import { UpdateCallbackType } from './model'; 2 | export declare class StatStorage { 3 | values: number[]; 4 | snapshotSize: number; 5 | updateCallbacksSet: Set; 6 | get min(): string; 7 | get max(): string; 8 | get averageValue(): string; 9 | pushValue(value: number): void; 10 | update(value: number, maxValue: number): void; 11 | addCallback(cb: UpdateCallbackType): void; 12 | removeCallback(cb: UpdateCallbackType): void; 13 | clearCallbacks(): void; 14 | } 15 | //# sourceMappingURL=stat-storage.d.ts.map -------------------------------------------------------------------------------- /dist/hooks/BaseHooks.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"BaseHooks.d.ts","sourceRoot":"","sources":["../../src/hooks/BaseHooks.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,UAAU,CAAA;AAC7B,OAAO,WAAW,MAAM,eAAe,CAAA;AAEvC,MAAM,CAAC,OAAO,OAAO,SAAS;IAC5B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAK;IAEjC,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAK;IAEzC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IAEzB,SAAS,CAAC,WAAW,CAAC,EAAE,WAAW,CAAA;;IAI5B,MAAM,CAAC,EAAE,EAAE,GAAG;IAKrB,IAAW,SAAS,IAAI,MAAM,CAM7B;IAED,IAAW,iBAAiB,WAE3B;IAED,IAAW,cAAc,IAAI,MAAM,CAWlC;IAED,IAAW,eAAe,IAAI,MAAM,CAInC;IAED,IAAW,aAAa,IAAI,MAAM,CAIjC;IAEM,KAAK,IAAI,IAAI;IAOb,OAAO,IAAI,IAAI;CAIvB"} -------------------------------------------------------------------------------- /dist/hooks/BaseHooks.d.ts: -------------------------------------------------------------------------------- 1 | import GLHook from './GLHook'; 2 | import TextureHook from './TextureHook'; 3 | export default class BaseHooks { 4 | protected _drawCalls: number; 5 | protected _maxDeltaDrawCalls: number; 6 | protected glhook?: GLHook; 7 | protected texturehook?: TextureHook; 8 | constructor(); 9 | attach(gl: any): void; 10 | get drawCalls(): number; 11 | get maxDeltaDrawCalls(): number; 12 | get deltaDrawCalls(): number; 13 | get maxTextureCount(): number; 14 | get texturesCount(): number; 15 | reset(): void; 16 | release(): void; 17 | } 18 | //# sourceMappingURL=BaseHooks.d.ts.map -------------------------------------------------------------------------------- /dist/stats-constants.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.DOM_ELEMENT_ID = exports.GRAPH_HEIGHT = exports.GRAPH_WIDTH = exports.GRAPH_Y = exports.FONT_SIZE = exports.GRAPH_X = exports.TEXT_Y = exports.TEXT_X = exports.HEIGHT = exports.WIDTH = exports.PR = void 0; 4 | exports.PR = 4; 5 | exports.WIDTH = 50 * exports.PR; 6 | exports.HEIGHT = 30 * exports.PR; 7 | exports.TEXT_X = 7; 8 | exports.TEXT_Y = 7; 9 | exports.GRAPH_X = exports.TEXT_X; 10 | exports.FONT_SIZE = 20; // tested @ 120.0 FPS (120~120) 11 | exports.GRAPH_Y = exports.FONT_SIZE + exports.TEXT_Y; 12 | exports.GRAPH_WIDTH = exports.WIDTH - exports.GRAPH_X * 2; 13 | exports.GRAPH_HEIGHT = exports.HEIGHT - exports.GRAPH_X - exports.GRAPH_Y; 14 | exports.DOM_ELEMENT_ID = 'stats'; 15 | //# sourceMappingURL=stats-constants.js.map -------------------------------------------------------------------------------- /dist/stats-adapter.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"stats-adapter.js","sourceRoot":"","sources":["../src/stats-adapter.ts"],"names":[],"mappings":";;;AAGA,MAAa,cAAc;IAOzB,YAAY,IAAe,EAAE,KAAa;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAElB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;YACzD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;IAED,MAAM;;QACJ,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,CACjB,IAAI,CAAC,IAAI,CAAC,cAAc,EACxB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAC1C,CAAA;YAED,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,CACjB,IAAI,CAAC,IAAI,CAAC,aAAa,EACvB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CACxC,CAAA;QACH,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAA;IACrB,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;QACnB,CAAC;IACH,CAAC;CACF;AA1CD,wCA0CC"} -------------------------------------------------------------------------------- /dist/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 3 | if (k2 === undefined) k2 = k; 4 | var desc = Object.getOwnPropertyDescriptor(m, k); 5 | if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { 6 | desc = { enumerable: true, get: function() { return m[k]; } }; 7 | } 8 | Object.defineProperty(o, k2, desc); 9 | }) : (function(o, m, k, k2) { 10 | if (k2 === undefined) k2 = k; 11 | o[k2] = m[k]; 12 | })); 13 | var __exportStar = (this && this.__exportStar) || function(m, exports) { 14 | for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); 15 | }; 16 | Object.defineProperty(exports, "__esModule", { value: true }); 17 | __exportStar(require("./stats-constants"), exports); 18 | __exportStar(require("./stats-panel"), exports); 19 | __exportStar(require("./stats-adapter"), exports); 20 | __exportStar(require("./stat-storage"), exports); 21 | __exportStar(require("./stats"), exports); 22 | //# sourceMappingURL=index.js.map -------------------------------------------------------------------------------- /dist/hooks/GLHook.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"GLHook.js","sourceRoot":"","sources":["../../src/hooks/GLHook.ts"],"names":[],"mappings":";AAAA,uDAAuD;;AAEvD,MAAqB,MAAM;IASzB,YAAY,GAAS;QARd,eAAU,GAAW,CAAC,CAAA;QAEtB,WAAM,GAAY,KAAK,CAAA;QAEtB,uBAAkB,GAA6B,cAAa,CAAC,CAAA;QAKnE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;QAC3C,CAAC;aAAM,IAAI,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;YACtC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAA;YACb,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,YAAY,CAAA;YAExD,4BAA4B;YAC5B,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;YAElB,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IAEO,kBAAkB,CACxB,IAAS,EACT,KAAU,EACV,IAAS,EACT,MAAW;QAEX,IAAI,CAAC,UAAU,EAAE,CAAA;QACjB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IAClE,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,UAAU,GAAG,CAAC,CAAA;IACrB,CAAC;IAEM,OAAO;QACZ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAA;YAExD,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;QAC5C,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;IACrB,CAAC;CACF;AA/CD,yBA+CC"} -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2009-2025 pixi-stats authors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /dist/stats-adapter.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.StatsJSAdapter = void 0; 4 | class StatsJSAdapter { 5 | constructor(hook, stats) { 6 | this.hook = hook; 7 | this.stats = stats; 8 | if (this.hook.hooked) { 9 | this.dcStat = this.stats.createStat('DC', '#f60', '#300'); 10 | this.tcStat = this.stats.createStat('TC', '#0c6', '#033'); 11 | } 12 | } 13 | update() { 14 | var _a, _b; 15 | if (!this.stats) { 16 | return; 17 | } 18 | if (this.hook) { 19 | (_a = this.dcStat) === null || _a === void 0 ? void 0 : _a.update(this.hook.deltaDrawCalls, Math.max(50, this.hook.maxDeltaDrawCalls)); 20 | (_b = this.tcStat) === null || _b === void 0 ? void 0 : _b.update(this.hook.texturesCount, Math.max(20, this.hook.maxTextureCount)); 21 | } 22 | this.stats.update(); 23 | } 24 | reset() { 25 | if (this.hook) { 26 | this.hook.reset(); 27 | } 28 | } 29 | } 30 | exports.StatsJSAdapter = StatsJSAdapter; 31 | //# sourceMappingURL=stats-adapter.js.map -------------------------------------------------------------------------------- /src/stats-adapter.ts: -------------------------------------------------------------------------------- 1 | import { IStats, IStatsJSAdapter } from './model' 2 | import { PIXIHooks } from './pixi-hooks' 3 | import { StatStorage } from './stat-storage' 4 | export class StatsJSAdapter implements IStatsJSAdapter { 5 | hook: PIXIHooks 6 | stats: IStats 7 | 8 | dcStat?: StatStorage 9 | tcStat?: StatStorage 10 | 11 | constructor(hook: PIXIHooks, stats: IStats) { 12 | this.hook = hook 13 | this.stats = stats 14 | 15 | if (this.hook.hooked) { 16 | this.dcStat = this.stats.createStat('DC', '#f60', '#300') 17 | this.tcStat = this.stats.createStat('TC', '#0c6', '#033') 18 | } 19 | } 20 | 21 | update(): void { 22 | if (!this.stats) { 23 | return 24 | } 25 | 26 | if (this.hook) { 27 | this.dcStat?.update( 28 | this.hook.deltaDrawCalls, 29 | Math.max(50, this.hook.maxDeltaDrawCalls) 30 | ) 31 | 32 | this.tcStat?.update( 33 | this.hook.texturesCount, 34 | Math.max(20, this.hook.maxTextureCount) 35 | ) 36 | } 37 | 38 | this.stats.update() 39 | } 40 | 41 | reset(): void { 42 | if (this.hook) { 43 | this.hook.reset() 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /dist/stats.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EACL,MAAM,EACN,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,UAAU,EACX,MAAM,SAAS,CAAA;AAGhB,qBAAa,KAAM,YAAW,MAAM;IAClC,IAAI,SAAK;IACT,MAAM,SAAI;IAEV,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAEhB,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,eAAe,CAAA;IAExB,OAAO,EAAE,WAAW,CAAA;IACpB,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,CAAC,EAAE,WAAW,CAAA;IAErB,MAAM,EAAE,YAAY,EAAE,CAAK;IAC3B,UAAU,EAAE,cAAc,GAAG,IAAI,CAAO;IACxC,gBAAgB,EAAE,WAAW,GAAG,IAAI,CAAO;IAC3C,WAAW,EAAE,WAAW,GAAG,IAAI,CAAO;IAEtC;;OAEG;IACH,MAAM,CAAC,mBAAmB,IAAI,WAAW,GAAG,SAAS;gBASnD,QAAQ,EAAE,QAAQ,EAClB,MAAM,CAAC,EAAE,UAAU,EACnB,gBAAgB,0BAA8B,EAC9C,SAAS,UAAO;IAyClB,cAAc,IAAI,IAAI;IAStB,gBAAgB,GAAI,OAAO,UAAU,KAAG,IAAI,CAG3C;IAED,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW;IAM7D,SAAS,CAAC,EAAE,SAAI;IAYhB,SAAS;IAMT,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,YAAY,GAAG,IAAI;IAWpE,oBAAoB,IAAI,IAAI;IAY5B,gBAAgB,IAAI,IAAI;IAUxB,KAAK,IAAI,IAAI;IAIb,GAAG,IAAI,MAAM;IA4Bb,MAAM,IAAI,IAAI;CAGf"} -------------------------------------------------------------------------------- /dist/pixi-hooks.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"pixi-hooks.js","sourceRoot":"","sources":["../src/pixi-hooks.ts"],"names":[],"mappings":";;;;;;AAAA,kEAAyC;AAGzC,MAAa,SAAU,SAAQ,mBAAS;IACtC,IAAI,MAAM;QACR,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;IACtB,CAAC;IAED,YAAY,QAAkB;QAC5B,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;YAC9D,OAAM;QACR,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;YACrD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAExB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAA;YACjE,OAAM;QACR,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAA2C,CAAA;QAEpE,wBAAwB;QACxB,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,eAAe,CAAA;QAEjE,wBAAwB;QACxB,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;YAC/C,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAiC,CAAC,CAAA;QAEpD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;YACjD,OAAM;QACR,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;QAE3E,eAAe,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YACpC,IAAI,SAAS,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtD,IAAI,CAAC,WAAY,CAAC,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YACtD,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;CACF;AAhDD,8BAgDC"} -------------------------------------------------------------------------------- /src/hooks/GLHook.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | 3 | export default class GLHook { 4 | public drawPasses: number = 0 5 | 6 | public isInit: boolean = false 7 | 8 | private realGLDrawElements: (...args: any[]) => void = function () {} 9 | 10 | private gl: any 11 | 12 | constructor(_gl?: any) { 13 | if (!_gl) { 14 | console.warn("[GLHook] GL can't be NULL") 15 | } else if (_gl.__proto__.drawElements) { 16 | this.gl = _gl 17 | this.realGLDrawElements = this.gl.__proto__.drawElements 18 | 19 | // replace with new function 20 | this.gl.__proto__.drawElements = this.fakeGLdrawElements.bind(this) 21 | this.isInit = true 22 | 23 | console.info('[GLHook] GL was Hooked!') 24 | } 25 | } 26 | 27 | private fakeGLdrawElements( 28 | mode: any, 29 | count: any, 30 | type: any, 31 | offset: any 32 | ): void { 33 | this.drawPasses++ 34 | this.realGLDrawElements.call(this.gl, mode, count, type, offset) 35 | } 36 | 37 | public reset(): void { 38 | this.drawPasses = 0 39 | } 40 | 41 | public release(): void { 42 | if (this.isInit) { 43 | this.gl.__proto__.drawElements = this.realGLDrawElements 44 | 45 | console.info('[GLHook] Hook was removed!') 46 | } 47 | 48 | this.isInit = false 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pixi-stats", 3 | "version": "5.1.7", 4 | "description": "WebGL stats for pixi.js or/and three.js", 5 | "main": "dist/index.js", 6 | "types": "dist/index.d.ts", 7 | "scripts": { 8 | "prebuild": "rm -rf dist", 9 | "build": "tsc --build", 10 | "format": "prettier . --write", 11 | "lint": "eslint src --fix", 12 | "precommit": "yarn lint;yarn format;yarn build", 13 | "amend": "yarn precommit && git commit -a --am --no-edit" 14 | }, 15 | "resolutions": { 16 | "semver": ">=5.7.2" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "git+https://github.com/nenjack/pixi-stats.git" 21 | }, 22 | "files": [ 23 | "dist/", 24 | "src/" 25 | ], 26 | "keywords": [ 27 | "stats.js", 28 | "gstats", 29 | "pixi.js", 30 | "three.js", 31 | "webgl", 32 | "stats", 33 | "fps" 34 | ], 35 | "author": "Jacek Pietal ", 36 | "license": "MIT", 37 | "bugs": { 38 | "url": "https://github.com/nenjack/pixi-stats/issues" 39 | }, 40 | "homepage": "https://github.com/nenjack/pixi-stats#readme", 41 | "dependencies": {}, 42 | "devDependencies": { 43 | "eslint": "^9.39.2", 44 | "globals": "^16.5.0", 45 | "prettier": "^3.7.4", 46 | "typescript": "^5.9.3", 47 | "typescript-eslint": "^8.50.0" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /dist/hooks/GLHook.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | /* eslint-disable @typescript-eslint/no-explicit-any */ 3 | Object.defineProperty(exports, "__esModule", { value: true }); 4 | class GLHook { 5 | constructor(_gl) { 6 | this.drawPasses = 0; 7 | this.isInit = false; 8 | this.realGLDrawElements = function () { }; 9 | if (!_gl) { 10 | console.warn("[GLHook] GL can't be NULL"); 11 | } 12 | else if (_gl.__proto__.drawElements) { 13 | this.gl = _gl; 14 | this.realGLDrawElements = this.gl.__proto__.drawElements; 15 | // replace with new function 16 | this.gl.__proto__.drawElements = this.fakeGLdrawElements.bind(this); 17 | this.isInit = true; 18 | console.info('[GLHook] GL was Hooked!'); 19 | } 20 | } 21 | fakeGLdrawElements(mode, count, type, offset) { 22 | this.drawPasses++; 23 | this.realGLDrawElements.call(this.gl, mode, count, type, offset); 24 | } 25 | reset() { 26 | this.drawPasses = 0; 27 | } 28 | release() { 29 | if (this.isInit) { 30 | this.gl.__proto__.drawElements = this.realGLDrawElements; 31 | console.info('[GLHook] Hook was removed!'); 32 | } 33 | this.isInit = false; 34 | } 35 | } 36 | exports.default = GLHook; 37 | //# sourceMappingURL=GLHook.js.map -------------------------------------------------------------------------------- /dist/model.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG5C,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAEtC,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAA;AAE3B,MAAM,MAAM,OAAO,GAAG,IAAI,CAAA;AAE1B,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,eAAe,CAAA;IACxB,OAAO,EAAE,WAAW,CAAA;IACpB,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW,CAAA;IAC7D,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,SAAS,IAAI,IAAI,CAAA;IACjB,MAAM,IAAI,IAAI,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,MAAM,IAAI,IAAI,CAAA;IACd,KAAK,IAAI,IAAI,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,WAAW,CAAA;CACzB;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;AAE1E,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,qBAAqB,CAAA;IACzB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,MAAM,kBAAkB,GAAG,aAAa,EAAE,CAAA;AAEhD,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;AAE/D,MAAM,WAAW,qBAAqB;IAEpC,eAAe,CAAC,EAAE,kBAAkB,CAAA;IAEpC,WAAW,CAAC,EAAE,mBAAmB,CAAA;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAA;CAC9B"} -------------------------------------------------------------------------------- /dist/model.d.ts: -------------------------------------------------------------------------------- 1 | import { PIXIHooks } from './pixi-hooks'; 2 | import { StatStorage } from './stat-storage'; 3 | export type Stub = Record; 4 | export type Renderer = Stub; 5 | export type Texture = Stub; 6 | export interface IStats { 7 | pixiHooks: PIXIHooks; 8 | adapter: IStatsJSAdapter; 9 | fpsStat: StatStorage; 10 | msStat: StatStorage; 11 | memStat?: StatStorage; 12 | createStat(name: string, fg: string, bg: string): StatStorage; 13 | showPanel(id?: number): void; 14 | hidePanel(): void; 15 | update(): void; 16 | } 17 | export interface IStatsJSAdapter { 18 | hook: PIXIHooks; 19 | stats: IStats; 20 | dcStat?: StatStorage; 21 | tcStat?: StatStorage; 22 | update(): void; 23 | reset(): void; 24 | } 25 | export interface IPanelConfig { 26 | name: string; 27 | fg: string; 28 | bg: string; 29 | statStorage: StatStorage; 30 | } 31 | export type UpdateCallbackType = (value: number, maxValue: number) => void; 32 | export interface PIXIGlTexture { 33 | gl: WebGLRenderingContext; 34 | texture: Texture; 35 | } 36 | export type PIXIGlTextureArray = PIXIGlTexture[]; 37 | export type PIXIGlTextureRecord = Record; 38 | export interface PIXIRendererGlTexture { 39 | managedTextures?: PIXIGlTextureArray; 40 | _glTextures?: PIXIGlTextureRecord; 41 | } 42 | export interface PIXITicker { 43 | add: (fn: () => void) => void; 44 | } 45 | //# sourceMappingURL=model.d.ts.map -------------------------------------------------------------------------------- /dist/stats.d.ts: -------------------------------------------------------------------------------- 1 | import { PIXIHooks } from './pixi-hooks'; 2 | import { RenderPanel } from './stats-panel'; 3 | import { StatStorage } from './stat-storage'; 4 | import { IStats, IPanelConfig, IStatsJSAdapter, Renderer, PIXITicker } from './model'; 5 | export declare class Stats implements IStats { 6 | mode: number; 7 | frames: number; 8 | beginTime: number; 9 | prevTime: number; 10 | pixiHooks: PIXIHooks; 11 | adapter: IStatsJSAdapter; 12 | fpsStat: StatStorage; 13 | msStat: StatStorage; 14 | memStat?: StatStorage; 15 | panels: IPanelConfig[]; 16 | domElement: HTMLDivElement | null; 17 | containerElement: HTMLElement | null; 18 | renderPanel: RenderPanel | null; 19 | /** 20 | * in document/html/dom context returns document's body 21 | */ 22 | static getContainerElement(): HTMLElement | undefined; 23 | constructor(renderer: Renderer, ticker?: PIXITicker, containerElement?: HTMLElement | undefined, autoStart?: boolean); 24 | initDomElement(): void; 25 | handleClickPanel: (event: MouseEvent) => void; 26 | createStat(name: string, fg: string, bg: string): StatStorage; 27 | showPanel(id?: number): void; 28 | hidePanel(): void; 29 | createRenderPanel({ name, fg, bg, statStorage }: IPanelConfig): void; 30 | removeDomRenderPanel(): void; 31 | removeDomElement(): void; 32 | begin(): void; 33 | end(): number; 34 | update(): void; 35 | } 36 | //# sourceMappingURL=stats.d.ts.map -------------------------------------------------------------------------------- /src/model.ts: -------------------------------------------------------------------------------- 1 | import { PIXIHooks } from './pixi-hooks' 2 | import { StatStorage } from './stat-storage' 3 | 4 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 5 | export type Stub = Record 6 | 7 | export type Renderer = Stub 8 | 9 | export type Texture = Stub 10 | 11 | export interface IStats { 12 | pixiHooks: PIXIHooks 13 | adapter: IStatsJSAdapter 14 | fpsStat: StatStorage 15 | msStat: StatStorage 16 | memStat?: StatStorage 17 | createStat(name: string, fg: string, bg: string): StatStorage 18 | showPanel(id?: number): void 19 | hidePanel(): void 20 | update(): void 21 | } 22 | 23 | export interface IStatsJSAdapter { 24 | hook: PIXIHooks 25 | stats: IStats 26 | dcStat?: StatStorage 27 | tcStat?: StatStorage 28 | update(): void 29 | reset(): void 30 | } 31 | 32 | export interface IPanelConfig { 33 | name: string 34 | fg: string 35 | bg: string 36 | statStorage: StatStorage 37 | } 38 | 39 | export type UpdateCallbackType = (value: number, maxValue: number) => void 40 | 41 | export interface PIXIGlTexture { 42 | gl: WebGLRenderingContext 43 | texture: Texture 44 | } 45 | 46 | export type PIXIGlTextureArray = PIXIGlTexture[] 47 | 48 | export type PIXIGlTextureRecord = Record 49 | 50 | export interface PIXIRendererGlTexture { 51 | // pixi v6 52 | managedTextures?: PIXIGlTextureArray 53 | // pixi v8 54 | _glTextures?: PIXIGlTextureRecord 55 | } 56 | 57 | export interface PIXITicker { 58 | add: (fn: () => void) => void 59 | } 60 | -------------------------------------------------------------------------------- /src/stat-storage.ts: -------------------------------------------------------------------------------- 1 | import { UpdateCallbackType } from './model' 2 | 3 | export class StatStorage { 4 | values: number[] = [] 5 | snapshotSize: number = 30 // min~max of X frames total 6 | updateCallbacksSet: Set = new Set() 7 | 8 | get min(): string { 9 | return this.values 10 | .reduce((min: number, value: number) => Math.min(min, value), Infinity) 11 | .toFixed() 12 | } 13 | 14 | get max(): string { 15 | return this.values 16 | .reduce((max: number, value: number) => Math.max(max, value), 0) 17 | .toFixed() 18 | } 19 | 20 | get averageValue(): string { 21 | return ( 22 | this.values.reduce((sum: number, value: number) => sum + value, 0) / 23 | this.values.length 24 | ).toFixed(1) 25 | } 26 | 27 | pushValue(value: number) { 28 | this.values.push(value) 29 | if (this.values.length > this.snapshotSize) { 30 | this.values = this.values.slice(-this.snapshotSize) 31 | } 32 | } 33 | 34 | update(value: number, maxValue: number) { 35 | this.pushValue(value) 36 | if (this.updateCallbacksSet.size) { 37 | this.updateCallbacksSet.forEach((cb) => cb(value, maxValue)) 38 | } 39 | } 40 | 41 | addCallback(cb: UpdateCallbackType) { 42 | if (typeof cb === 'function') { 43 | this.updateCallbacksSet.add(cb) 44 | } 45 | } 46 | 47 | removeCallback(cb: UpdateCallbackType) { 48 | this.updateCallbacksSet.delete(cb) 49 | } 50 | 51 | clearCallbacks() { 52 | this.updateCallbacksSet.clear() 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/pixi-hooks.ts: -------------------------------------------------------------------------------- 1 | import BaseHooks from './hooks/BaseHooks' 2 | import { PIXIGlTextureRecord, PIXIRendererGlTexture, Renderer } from './model' 3 | 4 | export class PIXIHooks extends BaseHooks { 5 | get hooked() { 6 | return !!this.glhook 7 | } 8 | 9 | constructor(renderer: Renderer) { 10 | super() 11 | 12 | if (!renderer) { 13 | console.warn('[PIXI Hooks] renderer in constructor undefined') 14 | return 15 | } 16 | 17 | if (!renderer.gl) { 18 | console.warn('[PIXI Hooks] gl in renderer not found') 19 | return 20 | } 21 | 22 | this.attach(renderer.gl) 23 | 24 | if (!this.texturehook) { 25 | console.warn('[PIXI Hooks] attach hook to gl in renderer failed') 26 | return 27 | } 28 | 29 | const texture = renderer.texture as unknown as PIXIRendererGlTexture 30 | 31 | // pixi v6 compatibility 32 | const glTextures = texture._glTextures || texture.managedTextures 33 | 34 | // pixi v6 compatibility 35 | const glTexturesArray = Array.isArray(glTextures) 36 | ? glTextures 37 | : Object.values(glTextures as PIXIGlTextureRecord) 38 | 39 | if (!glTexturesArray) { 40 | console.warn('[PIXI Hooks] no gl textures found') 41 | return 42 | } 43 | 44 | console.info('[PIXI Hooks] Collect used textures:', glTexturesArray.length) 45 | 46 | glTexturesArray.forEach((glTexture) => { 47 | if (glTexture.gl === renderer.gl && glTexture.texture) { 48 | this.texturehook!.registerTexture(glTexture.texture) 49 | } 50 | }) 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /dist/stat-storage.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"stat-storage.js","sourceRoot":"","sources":["../src/stat-storage.ts"],"names":[],"mappings":";;;AAEA,MAAa,WAAW;IAAxB;QACE,WAAM,GAAa,EAAE,CAAA;QACrB,iBAAY,GAAW,EAAE,CAAA,CAAC,4BAA4B;QACtD,uBAAkB,GAA4B,IAAI,GAAG,EAAE,CAAA;IAgDzD,CAAC;IA9CC,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,MAAM;aACf,MAAM,CAAC,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC;aACtE,OAAO,EAAE,CAAA;IACd,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,MAAM;aACf,MAAM,CAAC,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;aAC/D,OAAO,EAAE,CAAA;IACd,CAAC;IAED,IAAI,YAAY;QACd,OAAO,CACL,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;YAClE,IAAI,CAAC,MAAM,CAAC,MAAM,CACnB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACd,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACvB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACrD,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,QAAgB;QACpC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACrB,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC9D,CAAC;IACH,CAAC;IAED,WAAW,CAAC,EAAsB;QAChC,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE,CAAC;YAC7B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAED,cAAc,CAAC,EAAsB;QACnC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACpC,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAA;IACjC,CAAC;CACF;AAnDD,kCAmDC"} -------------------------------------------------------------------------------- /dist/stat-storage.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.StatStorage = void 0; 4 | class StatStorage { 5 | constructor() { 6 | this.values = []; 7 | this.snapshotSize = 30; // min~max of X frames total 8 | this.updateCallbacksSet = new Set(); 9 | } 10 | get min() { 11 | return this.values 12 | .reduce((min, value) => Math.min(min, value), Infinity) 13 | .toFixed(); 14 | } 15 | get max() { 16 | return this.values 17 | .reduce((max, value) => Math.max(max, value), 0) 18 | .toFixed(); 19 | } 20 | get averageValue() { 21 | return (this.values.reduce((sum, value) => sum + value, 0) / 22 | this.values.length).toFixed(1); 23 | } 24 | pushValue(value) { 25 | this.values.push(value); 26 | if (this.values.length > this.snapshotSize) { 27 | this.values = this.values.slice(-this.snapshotSize); 28 | } 29 | } 30 | update(value, maxValue) { 31 | this.pushValue(value); 32 | if (this.updateCallbacksSet.size) { 33 | this.updateCallbacksSet.forEach((cb) => cb(value, maxValue)); 34 | } 35 | } 36 | addCallback(cb) { 37 | if (typeof cb === 'function') { 38 | this.updateCallbacksSet.add(cb); 39 | } 40 | } 41 | removeCallback(cb) { 42 | this.updateCallbacksSet.delete(cb); 43 | } 44 | clearCallbacks() { 45 | this.updateCallbacksSet.clear(); 46 | } 47 | } 48 | exports.StatStorage = StatStorage; 49 | //# sourceMappingURL=stat-storage.js.map -------------------------------------------------------------------------------- /dist/hooks/BaseHooks.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"BaseHooks.js","sourceRoot":"","sources":["../../src/hooks/BaseHooks.ts"],"names":[],"mappings":";AAAA,uDAAuD;;;;;AAEvD,sDAA6B;AAC7B,gEAAuC;AAEvC,MAAqB,SAAS;IAS5B;QARU,eAAU,GAAW,CAAC,CAAC,CAAA;QAEvB,uBAAkB,GAAW,CAAC,CAAC,CAAA;IAM1B,CAAC;IAET,MAAM,CAAC,EAAO;QACnB,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAM,CAAC,EAAE,CAAC,CAAA;QAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,qBAAW,CAAC,EAAE,CAAC,CAAA;IACxC,CAAC;IAED,IAAW,SAAS;QAClB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAA;QAC/B,CAAC;QAED,OAAO,CAAC,CAAC,CAAA;IACX,CAAC;IAED,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,kBAAkB,CAAA;IAChC,CAAC;IAED,IAAW,cAAc;QACvB,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAA;YAChC,OAAO,CAAC,CAAA;QACV,CAAC;QAED,MAAM,EAAE,GAAW,IAAI,CAAC,SAAS,CAAA;QACjC,MAAM,KAAK,GAAW,EAAE,GAAG,IAAI,CAAC,UAAU,CAAA;QAC1C,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;QACpB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;QAClE,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAW,eAAe;QACxB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM;YAC7C,OAAO,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAA;QAC1C,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAW,aAAa;QACtB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM;YAC7C,OAAO,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAA;QAC7C,OAAO,CAAC,CAAA;IACV,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAA;QAC5B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAA;QACpB,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACpC,IAAI,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA;IAChD,CAAC;IAEM,OAAO;QACZ,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;QACtC,IAAI,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAA;IAClD,CAAC;CACF;AAhED,4BAgEC"} -------------------------------------------------------------------------------- /dist/pixi-hooks.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | exports.PIXIHooks = void 0; 7 | const BaseHooks_1 = __importDefault(require("./hooks/BaseHooks")); 8 | class PIXIHooks extends BaseHooks_1.default { 9 | get hooked() { 10 | return !!this.glhook; 11 | } 12 | constructor(renderer) { 13 | super(); 14 | if (!renderer) { 15 | console.warn('[PIXI Hooks] renderer in constructor undefined'); 16 | return; 17 | } 18 | if (!renderer.gl) { 19 | console.warn('[PIXI Hooks] gl in renderer not found'); 20 | return; 21 | } 22 | this.attach(renderer.gl); 23 | if (!this.texturehook) { 24 | console.warn('[PIXI Hooks] attach hook to gl in renderer failed'); 25 | return; 26 | } 27 | const texture = renderer.texture; 28 | // pixi v6 compatibility 29 | const glTextures = texture._glTextures || texture.managedTextures; 30 | // pixi v6 compatibility 31 | const glTexturesArray = Array.isArray(glTextures) 32 | ? glTextures 33 | : Object.values(glTextures); 34 | if (!glTexturesArray) { 35 | console.warn('[PIXI Hooks] no gl textures found'); 36 | return; 37 | } 38 | console.info('[PIXI Hooks] Collect used textures:', glTexturesArray.length); 39 | glTexturesArray.forEach((glTexture) => { 40 | if (glTexture.gl === renderer.gl && glTexture.texture) { 41 | this.texturehook.registerTexture(glTexture.texture); 42 | } 43 | }); 44 | } 45 | } 46 | exports.PIXIHooks = PIXIHooks; 47 | //# sourceMappingURL=pixi-hooks.js.map -------------------------------------------------------------------------------- /src/hooks/BaseHooks.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | 3 | import GLHook from './GLHook' 4 | import TextureHook from './TextureHook' 5 | 6 | export default class BaseHooks { 7 | protected _drawCalls: number = -1 8 | 9 | protected _maxDeltaDrawCalls: number = -1 10 | 11 | protected glhook?: GLHook 12 | 13 | protected texturehook?: TextureHook 14 | 15 | constructor() {} 16 | 17 | public attach(gl: any) { 18 | this.glhook = new GLHook(gl) 19 | this.texturehook = new TextureHook(gl) 20 | } 21 | 22 | public get drawCalls(): number { 23 | if (this.glhook && this.glhook.isInit) { 24 | return this.glhook.drawPasses 25 | } 26 | 27 | return -1 28 | } 29 | 30 | public get maxDeltaDrawCalls() { 31 | return this._maxDeltaDrawCalls 32 | } 33 | 34 | public get deltaDrawCalls(): number { 35 | if (this._drawCalls == -1) { 36 | this._drawCalls = this.drawCalls 37 | return 0 38 | } 39 | 40 | const dc: number = this.drawCalls 41 | const delta: number = dc - this._drawCalls 42 | this._drawCalls = dc 43 | this._maxDeltaDrawCalls = Math.max(this._maxDeltaDrawCalls, delta) 44 | return delta 45 | } 46 | 47 | public get maxTextureCount(): number { 48 | if (this.texturehook && this.texturehook.isInit) 49 | return this.texturehook.maxTexturesCount 50 | return 0 51 | } 52 | 53 | public get texturesCount(): number { 54 | if (this.texturehook && this.texturehook.isInit) 55 | return this.texturehook.currentTextureCount 56 | return 0 57 | } 58 | 59 | public reset(): void { 60 | this._maxDeltaDrawCalls = -1 61 | this._drawCalls = -1 62 | if (this.glhook) this.glhook.reset() 63 | if (this.texturehook) this.texturehook.reset() 64 | } 65 | 66 | public release(): void { 67 | if (this.glhook) this.glhook.release() 68 | if (this.texturehook) this.texturehook.release() 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /dist/hooks/TextureHook.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"TextureHook.js","sourceRoot":"","sources":["../../src/hooks/TextureHook.ts"],"names":[],"mappings":";AAAA,uDAAuD;;AAEvD,MAAqB,WAAW;IAa9B,YAAY,GAAS;QAZd,oBAAe,GAAe,IAAI,KAAK,EAAO,CAAA;QAE9C,qBAAgB,GAAW,CAAC,CAAA;QAE5B,WAAM,GAAY,KAAK,CAAA;QAEtB,wBAAmB,GAA6B,cAAa,CAAC,CAAA;QAE9D,wBAAmB,GAA6B,cAAa,CAAC,CAAA;QAKpE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;QAChD,CAAC;aAAM,IAAI,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;YACvC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAA;YACb,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAA;YAC1D,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAA;YAE1D,4BAA4B;YAC5B,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrE,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;YAElB,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;IAED,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAA;IACpC,CAAC;IAEM,eAAe,CAAC,OAAY;QACjC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,CAAC,MAAM;QACzC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAC9B,IAAI,CAAC,eAAe,CAAC,MAAM,EAC3B,IAAI,CAAC,gBAAgB,CACtB,CAAA;IACH,CAAC;IAEO,mBAAmB;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACtD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;QAC7B,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,mBAAmB,CAAC,OAAY;QACtC,MAAM,KAAK,GAAW,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC3D,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QACvC,CAAC;QAED,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IACjD,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,eAAe,GAAG,IAAI,KAAK,EAAO,CAAA;QACvC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAA;IAC3B,CAAC;IAEM,OAAO;QACZ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAA;YAC1D,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAA;YAE1D,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;QACjD,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;IACrB,CAAC;CACF;AAxED,8BAwEC"} -------------------------------------------------------------------------------- /dist/hooks/BaseHooks.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | /* eslint-disable @typescript-eslint/no-explicit-any */ 3 | var __importDefault = (this && this.__importDefault) || function (mod) { 4 | return (mod && mod.__esModule) ? mod : { "default": mod }; 5 | }; 6 | Object.defineProperty(exports, "__esModule", { value: true }); 7 | const GLHook_1 = __importDefault(require("./GLHook")); 8 | const TextureHook_1 = __importDefault(require("./TextureHook")); 9 | class BaseHooks { 10 | constructor() { 11 | this._drawCalls = -1; 12 | this._maxDeltaDrawCalls = -1; 13 | } 14 | attach(gl) { 15 | this.glhook = new GLHook_1.default(gl); 16 | this.texturehook = new TextureHook_1.default(gl); 17 | } 18 | get drawCalls() { 19 | if (this.glhook && this.glhook.isInit) { 20 | return this.glhook.drawPasses; 21 | } 22 | return -1; 23 | } 24 | get maxDeltaDrawCalls() { 25 | return this._maxDeltaDrawCalls; 26 | } 27 | get deltaDrawCalls() { 28 | if (this._drawCalls == -1) { 29 | this._drawCalls = this.drawCalls; 30 | return 0; 31 | } 32 | const dc = this.drawCalls; 33 | const delta = dc - this._drawCalls; 34 | this._drawCalls = dc; 35 | this._maxDeltaDrawCalls = Math.max(this._maxDeltaDrawCalls, delta); 36 | return delta; 37 | } 38 | get maxTextureCount() { 39 | if (this.texturehook && this.texturehook.isInit) 40 | return this.texturehook.maxTexturesCount; 41 | return 0; 42 | } 43 | get texturesCount() { 44 | if (this.texturehook && this.texturehook.isInit) 45 | return this.texturehook.currentTextureCount; 46 | return 0; 47 | } 48 | reset() { 49 | this._maxDeltaDrawCalls = -1; 50 | this._drawCalls = -1; 51 | if (this.glhook) 52 | this.glhook.reset(); 53 | if (this.texturehook) 54 | this.texturehook.reset(); 55 | } 56 | release() { 57 | if (this.glhook) 58 | this.glhook.release(); 59 | if (this.texturehook) 60 | this.texturehook.release(); 61 | } 62 | } 63 | exports.default = BaseHooks; 64 | //# sourceMappingURL=BaseHooks.js.map -------------------------------------------------------------------------------- /src/hooks/TextureHook.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | 3 | export default class TextureHook { 4 | public createdTextures: Array = new Array() 5 | 6 | public maxTexturesCount: number = 0 7 | 8 | public isInit: boolean = false 9 | 10 | private realGLCreateTexture: (...args: any[]) => void = function () {} 11 | 12 | private realGLDeleteTexture: (...args: any[]) => void = function () {} 13 | 14 | private gl: any 15 | 16 | constructor(_gl?: any) { 17 | if (!_gl) { 18 | console.warn("[TextureHook] GL can't be NULL") 19 | } else if (_gl.__proto__.createTexture) { 20 | this.gl = _gl 21 | this.realGLCreateTexture = this.gl.__proto__.createTexture 22 | this.realGLDeleteTexture = this.gl.__proto__.deleteTexture 23 | 24 | // replace with new function 25 | this.gl.__proto__.createTexture = this.fakeGLCreateTexture.bind(this) 26 | this.gl.__proto__.deleteTexture = this.fakeGLDeleteTexture.bind(this) 27 | this.isInit = true 28 | 29 | console.info('[TextureHook] GL was Hooked!') 30 | } 31 | } 32 | 33 | public get currentTextureCount(): number { 34 | return this.createdTextures.length 35 | } 36 | 37 | public registerTexture(texture: any): void { 38 | this.createdTextures.push(texture) // ++; 39 | this.maxTexturesCount = Math.max( 40 | this.createdTextures.length, 41 | this.maxTexturesCount 42 | ) 43 | } 44 | 45 | private fakeGLCreateTexture(): any { 46 | const texture = this.realGLCreateTexture.call(this.gl) 47 | this.registerTexture(texture) 48 | return texture 49 | } 50 | 51 | private fakeGLDeleteTexture(texture: any): void { 52 | const index: number = this.createdTextures.indexOf(texture) 53 | if (index > -1) { 54 | this.createdTextures.splice(index, 1) 55 | } 56 | 57 | this.realGLDeleteTexture.call(this.gl, texture) 58 | } 59 | 60 | public reset(): void { 61 | this.createdTextures = new Array() 62 | this.maxTexturesCount = 0 63 | } 64 | 65 | public release(): void { 66 | if (this.isInit) { 67 | this.gl.__proto__.createTexture = this.realGLCreateTexture 68 | this.gl.__proto__.deleteTexture = this.realGLDeleteTexture 69 | 70 | console.info('[TextureHook] Hook was removed!') 71 | } 72 | 73 | this.isInit = false 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /dist/hooks/TextureHook.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | /* eslint-disable @typescript-eslint/no-explicit-any */ 3 | Object.defineProperty(exports, "__esModule", { value: true }); 4 | class TextureHook { 5 | constructor(_gl) { 6 | this.createdTextures = new Array(); 7 | this.maxTexturesCount = 0; 8 | this.isInit = false; 9 | this.realGLCreateTexture = function () { }; 10 | this.realGLDeleteTexture = function () { }; 11 | if (!_gl) { 12 | console.warn("[TextureHook] GL can't be NULL"); 13 | } 14 | else if (_gl.__proto__.createTexture) { 15 | this.gl = _gl; 16 | this.realGLCreateTexture = this.gl.__proto__.createTexture; 17 | this.realGLDeleteTexture = this.gl.__proto__.deleteTexture; 18 | // replace with new function 19 | this.gl.__proto__.createTexture = this.fakeGLCreateTexture.bind(this); 20 | this.gl.__proto__.deleteTexture = this.fakeGLDeleteTexture.bind(this); 21 | this.isInit = true; 22 | console.info('[TextureHook] GL was Hooked!'); 23 | } 24 | } 25 | get currentTextureCount() { 26 | return this.createdTextures.length; 27 | } 28 | registerTexture(texture) { 29 | this.createdTextures.push(texture); // ++; 30 | this.maxTexturesCount = Math.max(this.createdTextures.length, this.maxTexturesCount); 31 | } 32 | fakeGLCreateTexture() { 33 | const texture = this.realGLCreateTexture.call(this.gl); 34 | this.registerTexture(texture); 35 | return texture; 36 | } 37 | fakeGLDeleteTexture(texture) { 38 | const index = this.createdTextures.indexOf(texture); 39 | if (index > -1) { 40 | this.createdTextures.splice(index, 1); 41 | } 42 | this.realGLDeleteTexture.call(this.gl, texture); 43 | } 44 | reset() { 45 | this.createdTextures = new Array(); 46 | this.maxTexturesCount = 0; 47 | } 48 | release() { 49 | if (this.isInit) { 50 | this.gl.__proto__.createTexture = this.realGLCreateTexture; 51 | this.gl.__proto__.deleteTexture = this.realGLDeleteTexture; 52 | console.info('[TextureHook] Hook was removed!'); 53 | } 54 | this.isInit = false; 55 | } 56 | } 57 | exports.default = TextureHook; 58 | //# sourceMappingURL=TextureHook.js.map -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pixi-stats 2 | 3 | [npm version](https://www.npmjs.com/package/pixi-stats?activeTab=versions) 4 | [npm downloads per week](https://www.npmjs.com/package/pixi-stats) 5 | 6 | #### JavaScript Performance Monitor 7 | 8 | This library provides an info box that will help you monitor your code performance. 9 | 10 | - **FPS** Frames rendered in the last second. The higher the number the better. 11 | - **MS** Milliseconds needed to render a frame. The lower the number the better. 12 | - **MB** MBytes of allocated memory. (Run Chrome with `--enable-precise-memory-info`) 13 | - **DC** Draw Calls made within one frame. 14 | - **TC** Texture Count used within one frame. 15 | - **CUSTOM** User-defined panel support. 16 | 17 | ### Screenshots 18 | 19 | ![fps.png](https://raw.githubusercontent.com/mrdoob/stats.js/master/files/fps.png) 20 | ![ms.png](https://raw.githubusercontent.com/mrdoob/stats.js/master/files/ms.png) 21 | ![mb.png](https://raw.githubusercontent.com/mrdoob/stats.js/master/files/mb.png) 22 | ![custom.png](https://raw.githubusercontent.com/mrdoob/stats.js/master/files/custom.png) 23 | 24 | ### pixi.js 25 | 26 | #### Live demo 27 | 28 | - https://nenjack.github.io/make2d/demo/?fps (pixi.js) 29 | 30 | - https://nenjack.github.io/make3d/demo/?fps (three.js) 31 | 32 | #### Usage 33 | 34 | ```ts 35 | import { Application } from 'pixi.js' 36 | import { Stats } from 'pixi-stats' 37 | 38 | const { renderer } = new Application() 39 | const stats = new Stats(renderer) 40 | ``` 41 | 42 | #### Parameters 43 | 44 | ```ts 45 | const element = document.querySelector('#your_container') 46 | const ticker = PIXI.ticker 47 | 48 | new Stats(renderer, ticker, element) 49 | ``` 50 | 51 | ### three.js 52 | 53 | #### Live demo 54 | 55 | https://legacyofpain.app/?fps 56 | 57 | #### Usage 58 | 59 | ```ts 60 | import { Renderer } from 'three' 61 | import { Stats } from 'pixi-stats' 62 | 63 | const renderer = new Renderer() 64 | const stats = new Stats(renderer) 65 | ``` 66 | 67 | ### Installation 68 | 69 | ```bash 70 | npm install pixi-stats --save 71 | ``` 72 | 73 | ### Set CSS 74 | 75 | ```css 76 | #stats { 77 | position: fixed; 78 | top: 0; 79 | left: 0; 80 | z-index: 1000; 81 | } 82 | 83 | #stats canvas { 84 | width: max(100px, 10vw, 10vh); 85 | height: max(60px, 6vh, 6vw); 86 | user-select: none; 87 | } 88 | ``` 89 | 90 | ### Contributors 91 | 92 | The credit goes to: 93 | 94 | - https://github.com/mrdoob/stats.js/ - FPS, MS, MB counters 95 | - https://github.com/eXponenta/gstatsjs/ - DC, TC counters 96 | - https://github.com/nenjack/ - maintainer, fixes, updates 97 | 98 | ### License 99 | 100 | MIT 101 | -------------------------------------------------------------------------------- /dist/stats-panel.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"stats-panel.js","sourceRoot":"","sources":["../src/stats-panel.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /src/stats-panel.ts: -------------------------------------------------------------------------------- 1 | import { 2 | FONT_SIZE, 3 | GRAPH_HEIGHT, 4 | GRAPH_WIDTH, 5 | GRAPH_X, 6 | GRAPH_Y, 7 | HEIGHT, 8 | PR, 9 | TEXT_X, 10 | TEXT_Y, 11 | WIDTH 12 | } from './stats-constants' 13 | import { StatStorage } from './stat-storage' 14 | 15 | export class RenderPanel { 16 | dom: HTMLCanvasElement | null 17 | context: CanvasRenderingContext2D | null 18 | fg: string 19 | bg: string 20 | name: string 21 | statStorage: StatStorage | null 22 | 23 | constructor(name: string, fg: string, bg: string, statStorage: StatStorage) { 24 | this.fg = fg 25 | this.bg = bg 26 | this.name = name 27 | this.statStorage = statStorage 28 | this.statStorage.addCallback(this.update.bind(this)) 29 | const canvas: HTMLCanvasElement = document.createElement('canvas') 30 | 31 | canvas.width = WIDTH 32 | canvas.height = HEIGHT 33 | 34 | const context: CanvasRenderingContext2D | null = canvas.getContext('2d') 35 | if (!context) { 36 | throw new Error('Cant get context on canvas') 37 | } 38 | 39 | context.font = `bold ${FONT_SIZE}px ${getComputedStyle(document.body).fontFamily}` 40 | context.textBaseline = 'top' 41 | 42 | context.fillStyle = this.bg 43 | context.fillRect(0, 0, WIDTH, HEIGHT) 44 | 45 | context.fillStyle = this.fg 46 | context.fillText(this.name, TEXT_X, TEXT_Y) 47 | context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT) 48 | 49 | context.fillStyle = this.bg 50 | context.globalAlpha = 0.8 51 | context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT) 52 | 53 | this.dom = canvas 54 | this.context = context 55 | } 56 | 57 | update(value: number, maxValue: number) { 58 | if (!this.context || !this.statStorage || !this.dom) { 59 | return 60 | } 61 | 62 | const context: CanvasRenderingContext2D = this.context 63 | context.fillStyle = this.bg 64 | context.globalAlpha = 1 65 | context.fillRect(0, 0, WIDTH, GRAPH_Y) 66 | context.fillStyle = this.fg 67 | context.font = `bold ${FONT_SIZE}px ${getComputedStyle(document.body).fontFamily}` 68 | context.fillText( 69 | `${this.statStorage.averageValue} ${this.name} (${this.statStorage.min}-${this.statStorage.max})`, 70 | TEXT_X, 71 | TEXT_Y 72 | ) 73 | 74 | context.drawImage( 75 | this.dom, 76 | GRAPH_X + PR, 77 | GRAPH_Y, 78 | GRAPH_WIDTH - PR, 79 | GRAPH_HEIGHT, 80 | GRAPH_X, 81 | GRAPH_Y, 82 | GRAPH_WIDTH - PR, 83 | GRAPH_HEIGHT 84 | ) 85 | 86 | context.fillRect(GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT) 87 | 88 | const graphValue = value 89 | ? Math.round((1 - value / maxValue) * GRAPH_HEIGHT) 90 | : parseFloat(this.statStorage.averageValue) 91 | context.fillStyle = this.bg 92 | context.globalAlpha = 0.8 93 | context.fillRect(GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, 2 * PR, graphValue) 94 | } 95 | 96 | destroy() { 97 | if (!this.statStorage) { 98 | return 99 | } 100 | 101 | this.statStorage.removeCallback(this.update.bind(this)) 102 | this.statStorage = null 103 | this.context = null 104 | if (this.dom) { 105 | this.dom.remove() 106 | this.dom = null 107 | } 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /dist/stats-panel.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.RenderPanel = void 0; 4 | const stats_constants_1 = require("./stats-constants"); 5 | class RenderPanel { 6 | constructor(name, fg, bg, statStorage) { 7 | this.fg = fg; 8 | this.bg = bg; 9 | this.name = name; 10 | this.statStorage = statStorage; 11 | this.statStorage.addCallback(this.update.bind(this)); 12 | const canvas = document.createElement('canvas'); 13 | canvas.width = stats_constants_1.WIDTH; 14 | canvas.height = stats_constants_1.HEIGHT; 15 | const context = canvas.getContext('2d'); 16 | if (!context) { 17 | throw new Error('Cant get context on canvas'); 18 | } 19 | context.font = `bold ${stats_constants_1.FONT_SIZE}px ${getComputedStyle(document.body).fontFamily}`; 20 | context.textBaseline = 'top'; 21 | context.fillStyle = this.bg; 22 | context.fillRect(0, 0, stats_constants_1.WIDTH, stats_constants_1.HEIGHT); 23 | context.fillStyle = this.fg; 24 | context.fillText(this.name, stats_constants_1.TEXT_X, stats_constants_1.TEXT_Y); 25 | context.fillRect(stats_constants_1.GRAPH_X, stats_constants_1.GRAPH_Y, stats_constants_1.GRAPH_WIDTH, stats_constants_1.GRAPH_HEIGHT); 26 | context.fillStyle = this.bg; 27 | context.globalAlpha = 0.8; 28 | context.fillRect(stats_constants_1.GRAPH_X, stats_constants_1.GRAPH_Y, stats_constants_1.GRAPH_WIDTH, stats_constants_1.GRAPH_HEIGHT); 29 | this.dom = canvas; 30 | this.context = context; 31 | } 32 | update(value, maxValue) { 33 | if (!this.context || !this.statStorage || !this.dom) { 34 | return; 35 | } 36 | const context = this.context; 37 | context.fillStyle = this.bg; 38 | context.globalAlpha = 1; 39 | context.fillRect(0, 0, stats_constants_1.WIDTH, stats_constants_1.GRAPH_Y); 40 | context.fillStyle = this.fg; 41 | context.font = `bold ${stats_constants_1.FONT_SIZE}px ${getComputedStyle(document.body).fontFamily}`; 42 | context.fillText(`${this.statStorage.averageValue} ${this.name} (${this.statStorage.min}-${this.statStorage.max})`, stats_constants_1.TEXT_X, stats_constants_1.TEXT_Y); 43 | context.drawImage(this.dom, stats_constants_1.GRAPH_X + stats_constants_1.PR, stats_constants_1.GRAPH_Y, stats_constants_1.GRAPH_WIDTH - stats_constants_1.PR, stats_constants_1.GRAPH_HEIGHT, stats_constants_1.GRAPH_X, stats_constants_1.GRAPH_Y, stats_constants_1.GRAPH_WIDTH - stats_constants_1.PR, stats_constants_1.GRAPH_HEIGHT); 44 | context.fillRect(stats_constants_1.GRAPH_X + stats_constants_1.GRAPH_WIDTH - stats_constants_1.PR, stats_constants_1.GRAPH_Y, stats_constants_1.PR, stats_constants_1.GRAPH_HEIGHT); 45 | const graphValue = value 46 | ? Math.round((1 - value / maxValue) * stats_constants_1.GRAPH_HEIGHT) 47 | : parseFloat(this.statStorage.averageValue); 48 | context.fillStyle = this.bg; 49 | context.globalAlpha = 0.8; 50 | context.fillRect(stats_constants_1.GRAPH_X + stats_constants_1.GRAPH_WIDTH - stats_constants_1.PR, stats_constants_1.GRAPH_Y, 2 * stats_constants_1.PR, graphValue); 51 | } 52 | destroy() { 53 | if (!this.statStorage) { 54 | return; 55 | } 56 | this.statStorage.removeCallback(this.update.bind(this)); 57 | this.statStorage = null; 58 | this.context = null; 59 | if (this.dom) { 60 | this.dom.remove(); 61 | this.dom = null; 62 | } 63 | } 64 | } 65 | exports.RenderPanel = RenderPanel; 66 | //# sourceMappingURL=stats-panel.js.map -------------------------------------------------------------------------------- /dist/stats.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"stats.js","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":";;;AAAA,6CAAwC;AACxC,+CAA2C;AAC3C,iDAA4C;AAQ5C,mDAAgD;AAChD,uDAAkD;AAClD,MAAa,KAAK;IAmBhB;;OAEG;IACH,MAAM,CAAC,mBAAmB;QACxB,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;YACpC,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,OAAO,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,CAAA;IACvB,CAAC;IAED,YACE,QAAkB,EAClB,MAAmB,EACnB,gBAAgB,GAAG,KAAK,CAAC,mBAAmB,EAAE,EAC9C,SAAS,GAAG,IAAI;QAjClB,SAAI,GAAG,CAAC,CAAC,CAAA;QACT,WAAM,GAAG,CAAC,CAAA;QAYV,WAAM,GAAmB,EAAE,CAAA;QAC3B,eAAU,GAA0B,IAAI,CAAA;QACxC,qBAAgB,GAAuB,IAAI,CAAA;QAC3C,gBAAW,GAAuB,IAAI,CAAA;QAmEtC,qBAAgB,GAAG,CAAC,KAAiB,EAAQ,EAAE;YAC7C,KAAK,CAAC,cAAc,EAAE,CAAA;YACtB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAClD,CAAC,CAAA;QAnDC,IAAI,CAAC,SAAS,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,CAAA;QAC5C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAA;QAE9B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACrD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAEnD,IAAI,QAAQ,IAAI,WAAW,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACtD,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,sBAAS,CAAC,QAAQ,CAAC,CAAA;QACxC,IAAI,CAAC,OAAO,GAAG,IAAI,8BAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QAEvD,IAAI,OAAO,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,CAAA,KAAK,WAAW,EAAE,CAAC;YAChD,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA;YACvB,CAAC,CAAC,CAAA;QACJ,CAAC;aAAM,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA;YACvB,CAAC,CAAC,CAAA;QACJ,CAAC;aAAM,IAAI,OAAO,qBAAqB,KAAK,WAAW,EAAE,CAAC;YACxD,MAAM,KAAK,GAAG,GAAG,EAAE;gBACjB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA;gBACrB,qBAAqB,CAAC,KAAK,CAAC,CAAA;YAC9B,CAAC,CAAA;YAED,KAAK,EAAE,CAAA;QACT,CAAC;QAED,IAAI,gBAAgB,EAAE,CAAC;YACrB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAA;QAC1C,CAAC;QAED,IAAI,IAAI,CAAC,gBAAgB,IAAI,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC,SAAS,EAAE,CAAA;QAClB,CAAC;IACH,CAAC;IAED,cAAc;QACZ,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;YAC/C,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,gCAAc,CAAA;YACnC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAA;YACvE,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IAOD,UAAU,CAAC,IAAY,EAAE,EAAU,EAAE,EAAU;QAC7C,MAAM,WAAW,GAAG,IAAI,0BAAW,EAAE,CAAA;QACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAC/C,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,SAAS,CAAC,EAAE,GAAG,CAAC;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC7B,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,cAAc,EAAE,CAAA;YACrB,IAAI,CAAC,oBAAoB,EAAE,CAAA;YAC3B,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAA;YAC7B,IAAI,CAAC,IAAI,GAAG,EAAE,CAAA;QAChB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,EAAE,CAAA;QAClB,CAAC;IACH,CAAC;IAED,SAAS;QACP,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACvB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAgB;QAC3D,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,yBAAW,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,CAAA;QAC7D,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QACnD,CAAC;IACH,CAAC;IAED,oBAAoB;;QAClB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QAED,IAAI,MAAA,IAAI,CAAC,WAAW,0CAAE,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;YACjD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAA;YAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACzB,CAAC;IACH,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC/C,OAAM;QACR,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAClD,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAA;QAC1E,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;IACxB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,CAAA;IAC9C,CAAC;IAED,GAAG;QACD,MAAM,IAAI,GAAW,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,CAAA;QAEhD,IAAI,CAAC,MAAM,EAAE,CAAA;QACb,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QAE9C,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAA;YAEvE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;YACpB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;YAEf,IAAI,QAAQ,IAAI,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC5C,MAAM,MAAM,GAAG,WAAW,CAAC,MAG1B,CAAA;gBAED,IAAI,CAAC,OAAO,CAAC,MAAM,CACjB,MAAM,CAAC,cAAc,GAAG,OAAO,EAC/B,MAAM,CAAC,eAAe,GAAG,OAAO,CACjC,CAAA;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC7B,CAAC;CACF;AArLD,sBAqLC"} -------------------------------------------------------------------------------- /src/stats.ts: -------------------------------------------------------------------------------- 1 | import { PIXIHooks } from './pixi-hooks' 2 | import { RenderPanel } from './stats-panel' 3 | import { StatStorage } from './stat-storage' 4 | import { 5 | IStats, 6 | IPanelConfig, 7 | IStatsJSAdapter, 8 | Renderer, 9 | PIXITicker 10 | } from './model' 11 | import { StatsJSAdapter } from './stats-adapter' 12 | import { DOM_ELEMENT_ID } from './stats-constants' 13 | export class Stats implements IStats { 14 | mode = -1 15 | frames = 0 16 | 17 | beginTime: number 18 | prevTime: number 19 | 20 | pixiHooks: PIXIHooks 21 | adapter: IStatsJSAdapter 22 | 23 | fpsStat: StatStorage 24 | msStat: StatStorage 25 | memStat?: StatStorage 26 | 27 | panels: IPanelConfig[] = [] 28 | domElement: HTMLDivElement | null = null 29 | containerElement: HTMLElement | null = null 30 | renderPanel: RenderPanel | null = null 31 | 32 | /** 33 | * in document/html/dom context returns document's body 34 | */ 35 | static getContainerElement(): HTMLElement | undefined { 36 | if (typeof document === 'undefined') { 37 | return undefined 38 | } 39 | 40 | return document?.body 41 | } 42 | 43 | constructor( 44 | renderer: Renderer, 45 | ticker?: PIXITicker, 46 | containerElement = Stats.getContainerElement(), 47 | autoStart = true 48 | ) { 49 | this.beginTime = (performance || Date).now() 50 | this.prevTime = this.beginTime 51 | 52 | this.fpsStat = this.createStat('FPS', '#3ff', '#002') 53 | this.msStat = this.createStat('MS', '#0f0', '#020') 54 | 55 | if ('memory' in performance) { 56 | this.memStat = this.createStat('MB', '#f08', '#200') 57 | } 58 | 59 | this.pixiHooks = new PIXIHooks(renderer) 60 | this.adapter = new StatsJSAdapter(this.pixiHooks, this) 61 | 62 | if (typeof renderer?.animations !== 'undefined') { 63 | renderer.animations.push(() => { 64 | this.adapter.update() 65 | }) 66 | } else if (typeof ticker !== 'undefined') { 67 | ticker.add(() => { 68 | this.adapter.update() 69 | }) 70 | } else if (typeof requestAnimationFrame !== 'undefined') { 71 | const frame = () => { 72 | this.adapter.update() 73 | requestAnimationFrame(frame) 74 | } 75 | 76 | frame() 77 | } 78 | 79 | if (containerElement) { 80 | this.containerElement = containerElement 81 | } 82 | 83 | if (this.containerElement && autoStart) { 84 | this.showPanel() 85 | } 86 | } 87 | 88 | initDomElement(): void { 89 | if (this.containerElement && !this.domElement) { 90 | this.domElement = document.createElement('div') 91 | this.domElement.id = DOM_ELEMENT_ID 92 | this.domElement.addEventListener('click', this.handleClickPanel, false) 93 | this.containerElement.appendChild(this.domElement) 94 | } 95 | } 96 | 97 | handleClickPanel = (event: MouseEvent): void => { 98 | event.preventDefault() 99 | this.showPanel(++this.mode % this.panels.length) 100 | } 101 | 102 | createStat(name: string, fg: string, bg: string): StatStorage { 103 | const statStorage = new StatStorage() 104 | this.panels.push({ name, fg, bg, statStorage }) 105 | return statStorage 106 | } 107 | 108 | showPanel(id = 0) { 109 | const panel = this.panels[id] 110 | if (panel) { 111 | this.initDomElement() 112 | this.removeDomRenderPanel() 113 | this.createRenderPanel(panel) 114 | this.mode = id 115 | } else { 116 | this.hidePanel() 117 | } 118 | } 119 | 120 | hidePanel() { 121 | this.removeDomRenderPanel() 122 | this.removeDomElement() 123 | this.mode = -1 124 | } 125 | 126 | createRenderPanel({ name, fg, bg, statStorage }: IPanelConfig): void { 127 | if (!this.domElement) { 128 | return 129 | } 130 | 131 | this.renderPanel = new RenderPanel(name, fg, bg, statStorage) 132 | if (this.renderPanel.dom) { 133 | this.domElement.appendChild(this.renderPanel.dom) 134 | } 135 | } 136 | 137 | removeDomRenderPanel(): void { 138 | if (!this.domElement) { 139 | return 140 | } 141 | 142 | if (this.renderPanel?.dom) { 143 | this.domElement.removeChild(this.renderPanel.dom) 144 | this.renderPanel.destroy() 145 | this.renderPanel = null 146 | } 147 | } 148 | 149 | removeDomElement(): void { 150 | if (!this.domElement || !this.containerElement) { 151 | return 152 | } 153 | 154 | this.containerElement.removeChild(this.domElement) 155 | this.domElement.removeEventListener('click', this.handleClickPanel, false) 156 | this.domElement = null 157 | } 158 | 159 | begin(): void { 160 | this.beginTime = (performance || Date).now() 161 | } 162 | 163 | end(): number { 164 | const time: number = (performance || Date).now() 165 | 166 | this.frames++ 167 | this.msStat.update(time - this.beginTime, 200) 168 | 169 | if (time > this.prevTime + 1000) { 170 | this.fpsStat.update((this.frames * 1000) / (time - this.prevTime), 100) 171 | 172 | this.prevTime = time 173 | this.frames = 0 174 | 175 | if ('memory' in performance && this.memStat) { 176 | const memory = performance.memory as { 177 | usedJSHeapSize: number 178 | jsHeapSizeLimit: number 179 | } 180 | 181 | this.memStat.update( 182 | memory.usedJSHeapSize / 1048576, 183 | memory.jsHeapSizeLimit / 1048576 184 | ) 185 | } 186 | } 187 | 188 | return time 189 | } 190 | 191 | update(): void { 192 | this.beginTime = this.end() 193 | } 194 | } 195 | -------------------------------------------------------------------------------- /dist/stats.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.Stats = void 0; 4 | const pixi_hooks_1 = require("./pixi-hooks"); 5 | const stats_panel_1 = require("./stats-panel"); 6 | const stat_storage_1 = require("./stat-storage"); 7 | const stats_adapter_1 = require("./stats-adapter"); 8 | const stats_constants_1 = require("./stats-constants"); 9 | class Stats { 10 | /** 11 | * in document/html/dom context returns document's body 12 | */ 13 | static getContainerElement() { 14 | if (typeof document === 'undefined') { 15 | return undefined; 16 | } 17 | return document === null || document === void 0 ? void 0 : document.body; 18 | } 19 | constructor(renderer, ticker, containerElement = Stats.getContainerElement(), autoStart = true) { 20 | this.mode = -1; 21 | this.frames = 0; 22 | this.panels = []; 23 | this.domElement = null; 24 | this.containerElement = null; 25 | this.renderPanel = null; 26 | this.handleClickPanel = (event) => { 27 | event.preventDefault(); 28 | this.showPanel(++this.mode % this.panels.length); 29 | }; 30 | this.beginTime = (performance || Date).now(); 31 | this.prevTime = this.beginTime; 32 | this.fpsStat = this.createStat('FPS', '#3ff', '#002'); 33 | this.msStat = this.createStat('MS', '#0f0', '#020'); 34 | if ('memory' in performance) { 35 | this.memStat = this.createStat('MB', '#f08', '#200'); 36 | } 37 | this.pixiHooks = new pixi_hooks_1.PIXIHooks(renderer); 38 | this.adapter = new stats_adapter_1.StatsJSAdapter(this.pixiHooks, this); 39 | if (typeof (renderer === null || renderer === void 0 ? void 0 : renderer.animations) !== 'undefined') { 40 | renderer.animations.push(() => { 41 | this.adapter.update(); 42 | }); 43 | } 44 | else if (typeof ticker !== 'undefined') { 45 | ticker.add(() => { 46 | this.adapter.update(); 47 | }); 48 | } 49 | else if (typeof requestAnimationFrame !== 'undefined') { 50 | const frame = () => { 51 | this.adapter.update(); 52 | requestAnimationFrame(frame); 53 | }; 54 | frame(); 55 | } 56 | if (containerElement) { 57 | this.containerElement = containerElement; 58 | } 59 | if (this.containerElement && autoStart) { 60 | this.showPanel(); 61 | } 62 | } 63 | initDomElement() { 64 | if (this.containerElement && !this.domElement) { 65 | this.domElement = document.createElement('div'); 66 | this.domElement.id = stats_constants_1.DOM_ELEMENT_ID; 67 | this.domElement.addEventListener('click', this.handleClickPanel, false); 68 | this.containerElement.appendChild(this.domElement); 69 | } 70 | } 71 | createStat(name, fg, bg) { 72 | const statStorage = new stat_storage_1.StatStorage(); 73 | this.panels.push({ name, fg, bg, statStorage }); 74 | return statStorage; 75 | } 76 | showPanel(id = 0) { 77 | const panel = this.panels[id]; 78 | if (panel) { 79 | this.initDomElement(); 80 | this.removeDomRenderPanel(); 81 | this.createRenderPanel(panel); 82 | this.mode = id; 83 | } 84 | else { 85 | this.hidePanel(); 86 | } 87 | } 88 | hidePanel() { 89 | this.removeDomRenderPanel(); 90 | this.removeDomElement(); 91 | this.mode = -1; 92 | } 93 | createRenderPanel({ name, fg, bg, statStorage }) { 94 | if (!this.domElement) { 95 | return; 96 | } 97 | this.renderPanel = new stats_panel_1.RenderPanel(name, fg, bg, statStorage); 98 | if (this.renderPanel.dom) { 99 | this.domElement.appendChild(this.renderPanel.dom); 100 | } 101 | } 102 | removeDomRenderPanel() { 103 | var _a; 104 | if (!this.domElement) { 105 | return; 106 | } 107 | if ((_a = this.renderPanel) === null || _a === void 0 ? void 0 : _a.dom) { 108 | this.domElement.removeChild(this.renderPanel.dom); 109 | this.renderPanel.destroy(); 110 | this.renderPanel = null; 111 | } 112 | } 113 | removeDomElement() { 114 | if (!this.domElement || !this.containerElement) { 115 | return; 116 | } 117 | this.containerElement.removeChild(this.domElement); 118 | this.domElement.removeEventListener('click', this.handleClickPanel, false); 119 | this.domElement = null; 120 | } 121 | begin() { 122 | this.beginTime = (performance || Date).now(); 123 | } 124 | end() { 125 | const time = (performance || Date).now(); 126 | this.frames++; 127 | this.msStat.update(time - this.beginTime, 200); 128 | if (time > this.prevTime + 1000) { 129 | this.fpsStat.update((this.frames * 1000) / (time - this.prevTime), 100); 130 | this.prevTime = time; 131 | this.frames = 0; 132 | if ('memory' in performance && this.memStat) { 133 | const memory = performance.memory; 134 | this.memStat.update(memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576); 135 | } 136 | } 137 | return time; 138 | } 139 | update() { 140 | this.beginTime = this.end(); 141 | } 142 | } 143 | exports.Stats = Stats; 144 | //# sourceMappingURL=stats.js.map -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0": 6 | version "4.9.0" 7 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3" 8 | integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== 9 | dependencies: 10 | eslint-visitor-keys "^3.4.3" 11 | 12 | "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": 13 | version "4.12.2" 14 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" 15 | integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== 16 | 17 | "@eslint/config-array@^0.21.1": 18 | version "0.21.1" 19 | resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.1.tgz#7d1b0060fea407f8301e932492ba8c18aff29713" 20 | integrity sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA== 21 | dependencies: 22 | "@eslint/object-schema" "^2.1.7" 23 | debug "^4.3.1" 24 | minimatch "^3.1.2" 25 | 26 | "@eslint/config-helpers@^0.4.2": 27 | version "0.4.2" 28 | resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz#1bd006ceeb7e2e55b2b773ab318d300e1a66aeda" 29 | integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== 30 | dependencies: 31 | "@eslint/core" "^0.17.0" 32 | 33 | "@eslint/core@^0.17.0": 34 | version "0.17.0" 35 | resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.17.0.tgz#77225820413d9617509da9342190a2019e78761c" 36 | integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== 37 | dependencies: 38 | "@types/json-schema" "^7.0.15" 39 | 40 | "@eslint/eslintrc@^3.3.1": 41 | version "3.3.1" 42 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" 43 | integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== 44 | dependencies: 45 | ajv "^6.12.4" 46 | debug "^4.3.2" 47 | espree "^10.0.1" 48 | globals "^14.0.0" 49 | ignore "^5.2.0" 50 | import-fresh "^3.2.1" 51 | js-yaml "^4.1.0" 52 | minimatch "^3.1.2" 53 | strip-json-comments "^3.1.1" 54 | 55 | "@eslint/js@9.39.2": 56 | version "9.39.2" 57 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.2.tgz#2d4b8ec4c3ea13c1b3748e0c97ecd766bdd80599" 58 | integrity sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA== 59 | 60 | "@eslint/object-schema@^2.1.7": 61 | version "2.1.7" 62 | resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad" 63 | integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== 64 | 65 | "@eslint/plugin-kit@^0.4.1": 66 | version "0.4.1" 67 | resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz#9779e3fd9b7ee33571a57435cf4335a1794a6cb2" 68 | integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== 69 | dependencies: 70 | "@eslint/core" "^0.17.0" 71 | levn "^0.4.1" 72 | 73 | "@humanfs/core@^0.19.1": 74 | version "0.19.1" 75 | resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" 76 | integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== 77 | 78 | "@humanfs/node@^0.16.6": 79 | version "0.16.7" 80 | resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.7.tgz#822cb7b3a12c5a240a24f621b5a2413e27a45f26" 81 | integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ== 82 | dependencies: 83 | "@humanfs/core" "^0.19.1" 84 | "@humanwhocodes/retry" "^0.4.0" 85 | 86 | "@humanwhocodes/module-importer@^1.0.1": 87 | version "1.0.1" 88 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 89 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 90 | 91 | "@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": 92 | version "0.4.3" 93 | resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" 94 | integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== 95 | 96 | "@types/estree@^1.0.6": 97 | version "1.0.8" 98 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" 99 | integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== 100 | 101 | "@types/json-schema@^7.0.15": 102 | version "7.0.15" 103 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" 104 | integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== 105 | 106 | "@typescript-eslint/eslint-plugin@8.50.0": 107 | version "8.50.0" 108 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.0.tgz#a6ce899690542e2affa9543306d2d3935740abb7" 109 | integrity sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg== 110 | dependencies: 111 | "@eslint-community/regexpp" "^4.10.0" 112 | "@typescript-eslint/scope-manager" "8.50.0" 113 | "@typescript-eslint/type-utils" "8.50.0" 114 | "@typescript-eslint/utils" "8.50.0" 115 | "@typescript-eslint/visitor-keys" "8.50.0" 116 | ignore "^7.0.0" 117 | natural-compare "^1.4.0" 118 | ts-api-utils "^2.1.0" 119 | 120 | "@typescript-eslint/parser@8.50.0": 121 | version "8.50.0" 122 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.50.0.tgz#c35b28f686dbe08e81b9d6208ebc08912549f4ba" 123 | integrity sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q== 124 | dependencies: 125 | "@typescript-eslint/scope-manager" "8.50.0" 126 | "@typescript-eslint/types" "8.50.0" 127 | "@typescript-eslint/typescript-estree" "8.50.0" 128 | "@typescript-eslint/visitor-keys" "8.50.0" 129 | debug "^4.3.4" 130 | 131 | "@typescript-eslint/project-service@8.50.0": 132 | version "8.50.0" 133 | resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.50.0.tgz#1422366b7cc11fef8c6d87770884e608093423a4" 134 | integrity sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ== 135 | dependencies: 136 | "@typescript-eslint/tsconfig-utils" "^8.50.0" 137 | "@typescript-eslint/types" "^8.50.0" 138 | debug "^4.3.4" 139 | 140 | "@typescript-eslint/scope-manager@8.50.0": 141 | version "8.50.0" 142 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.50.0.tgz#e0d6c838dc9044bc679724611b138cb34c81bddf" 143 | integrity sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A== 144 | dependencies: 145 | "@typescript-eslint/types" "8.50.0" 146 | "@typescript-eslint/visitor-keys" "8.50.0" 147 | 148 | "@typescript-eslint/tsconfig-utils@8.50.0", "@typescript-eslint/tsconfig-utils@^8.50.0": 149 | version "8.50.0" 150 | resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.0.tgz#5c17537ad4c8a13bf6d7393035edaf91a1e13191" 151 | integrity sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w== 152 | 153 | "@typescript-eslint/type-utils@8.50.0": 154 | version "8.50.0" 155 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.50.0.tgz#feb6f54f876980a258b14f1cb033f54fc545d37b" 156 | integrity sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw== 157 | dependencies: 158 | "@typescript-eslint/types" "8.50.0" 159 | "@typescript-eslint/typescript-estree" "8.50.0" 160 | "@typescript-eslint/utils" "8.50.0" 161 | debug "^4.3.4" 162 | ts-api-utils "^2.1.0" 163 | 164 | "@typescript-eslint/types@8.50.0", "@typescript-eslint/types@^8.50.0": 165 | version "8.50.0" 166 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.50.0.tgz#ad8f1ad88ae0096f548c9cdf60da9b92832db96e" 167 | integrity sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w== 168 | 169 | "@typescript-eslint/typescript-estree@8.50.0": 170 | version "8.50.0" 171 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.0.tgz#2871d36617f81a127db905fa91b16d1a0251411b" 172 | integrity sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ== 173 | dependencies: 174 | "@typescript-eslint/project-service" "8.50.0" 175 | "@typescript-eslint/tsconfig-utils" "8.50.0" 176 | "@typescript-eslint/types" "8.50.0" 177 | "@typescript-eslint/visitor-keys" "8.50.0" 178 | debug "^4.3.4" 179 | minimatch "^9.0.4" 180 | semver "^7.6.0" 181 | tinyglobby "^0.2.15" 182 | ts-api-utils "^2.1.0" 183 | 184 | "@typescript-eslint/utils@8.50.0": 185 | version "8.50.0" 186 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.50.0.tgz#107f20a5747eab5db988c5f6ad462b59851cdd1f" 187 | integrity sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg== 188 | dependencies: 189 | "@eslint-community/eslint-utils" "^4.7.0" 190 | "@typescript-eslint/scope-manager" "8.50.0" 191 | "@typescript-eslint/types" "8.50.0" 192 | "@typescript-eslint/typescript-estree" "8.50.0" 193 | 194 | "@typescript-eslint/visitor-keys@8.50.0": 195 | version "8.50.0" 196 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.0.tgz#79d1c95474e08f844dbe13370715cfb9b7e21363" 197 | integrity sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q== 198 | dependencies: 199 | "@typescript-eslint/types" "8.50.0" 200 | eslint-visitor-keys "^4.2.1" 201 | 202 | acorn-jsx@^5.3.2: 203 | version "5.3.2" 204 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 205 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 206 | 207 | acorn@^8.15.0: 208 | version "8.15.0" 209 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" 210 | integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== 211 | 212 | ajv@^6.12.4: 213 | version "6.12.6" 214 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 215 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 216 | dependencies: 217 | fast-deep-equal "^3.1.1" 218 | fast-json-stable-stringify "^2.0.0" 219 | json-schema-traverse "^0.4.1" 220 | uri-js "^4.2.2" 221 | 222 | ansi-styles@^4.1.0: 223 | version "4.3.0" 224 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 225 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 226 | dependencies: 227 | color-convert "^2.0.1" 228 | 229 | argparse@^2.0.1: 230 | version "2.0.1" 231 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 232 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 233 | 234 | balanced-match@^1.0.0: 235 | version "1.0.2" 236 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 237 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 238 | 239 | brace-expansion@^1.1.7: 240 | version "1.1.12" 241 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" 242 | integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== 243 | dependencies: 244 | balanced-match "^1.0.0" 245 | concat-map "0.0.1" 246 | 247 | brace-expansion@^2.0.1: 248 | version "2.0.2" 249 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" 250 | integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== 251 | dependencies: 252 | balanced-match "^1.0.0" 253 | 254 | callsites@^3.0.0: 255 | version "3.1.0" 256 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 257 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 258 | 259 | chalk@^4.0.0: 260 | version "4.1.2" 261 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 262 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 263 | dependencies: 264 | ansi-styles "^4.1.0" 265 | supports-color "^7.1.0" 266 | 267 | color-convert@^2.0.1: 268 | version "2.0.1" 269 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 270 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 271 | dependencies: 272 | color-name "~1.1.4" 273 | 274 | color-name@~1.1.4: 275 | version "1.1.4" 276 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 277 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 278 | 279 | concat-map@0.0.1: 280 | version "0.0.1" 281 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 282 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 283 | 284 | cross-spawn@^7.0.6: 285 | version "7.0.6" 286 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" 287 | integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== 288 | dependencies: 289 | path-key "^3.1.0" 290 | shebang-command "^2.0.0" 291 | which "^2.0.1" 292 | 293 | debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: 294 | version "4.4.3" 295 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" 296 | integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== 297 | dependencies: 298 | ms "^2.1.3" 299 | 300 | deep-is@^0.1.3: 301 | version "0.1.4" 302 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 303 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 304 | 305 | escape-string-regexp@^4.0.0: 306 | version "4.0.0" 307 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 308 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 309 | 310 | eslint-scope@^8.4.0: 311 | version "8.4.0" 312 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" 313 | integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== 314 | dependencies: 315 | esrecurse "^4.3.0" 316 | estraverse "^5.2.0" 317 | 318 | eslint-visitor-keys@^3.4.3: 319 | version "3.4.3" 320 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 321 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 322 | 323 | eslint-visitor-keys@^4.2.1: 324 | version "4.2.1" 325 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" 326 | integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== 327 | 328 | eslint@^9.39.2: 329 | version "9.39.2" 330 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.2.tgz#cb60e6d16ab234c0f8369a3fe7cc87967faf4b6c" 331 | integrity sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw== 332 | dependencies: 333 | "@eslint-community/eslint-utils" "^4.8.0" 334 | "@eslint-community/regexpp" "^4.12.1" 335 | "@eslint/config-array" "^0.21.1" 336 | "@eslint/config-helpers" "^0.4.2" 337 | "@eslint/core" "^0.17.0" 338 | "@eslint/eslintrc" "^3.3.1" 339 | "@eslint/js" "9.39.2" 340 | "@eslint/plugin-kit" "^0.4.1" 341 | "@humanfs/node" "^0.16.6" 342 | "@humanwhocodes/module-importer" "^1.0.1" 343 | "@humanwhocodes/retry" "^0.4.2" 344 | "@types/estree" "^1.0.6" 345 | ajv "^6.12.4" 346 | chalk "^4.0.0" 347 | cross-spawn "^7.0.6" 348 | debug "^4.3.2" 349 | escape-string-regexp "^4.0.0" 350 | eslint-scope "^8.4.0" 351 | eslint-visitor-keys "^4.2.1" 352 | espree "^10.4.0" 353 | esquery "^1.5.0" 354 | esutils "^2.0.2" 355 | fast-deep-equal "^3.1.3" 356 | file-entry-cache "^8.0.0" 357 | find-up "^5.0.0" 358 | glob-parent "^6.0.2" 359 | ignore "^5.2.0" 360 | imurmurhash "^0.1.4" 361 | is-glob "^4.0.0" 362 | json-stable-stringify-without-jsonify "^1.0.1" 363 | lodash.merge "^4.6.2" 364 | minimatch "^3.1.2" 365 | natural-compare "^1.4.0" 366 | optionator "^0.9.3" 367 | 368 | espree@^10.0.1, espree@^10.4.0: 369 | version "10.4.0" 370 | resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" 371 | integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== 372 | dependencies: 373 | acorn "^8.15.0" 374 | acorn-jsx "^5.3.2" 375 | eslint-visitor-keys "^4.2.1" 376 | 377 | esquery@^1.5.0: 378 | version "1.6.0" 379 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" 380 | integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== 381 | dependencies: 382 | estraverse "^5.1.0" 383 | 384 | esrecurse@^4.3.0: 385 | version "4.3.0" 386 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 387 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 388 | dependencies: 389 | estraverse "^5.2.0" 390 | 391 | estraverse@^5.1.0, estraverse@^5.2.0: 392 | version "5.3.0" 393 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 394 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 395 | 396 | esutils@^2.0.2: 397 | version "2.0.3" 398 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 399 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 400 | 401 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 402 | version "3.1.3" 403 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 404 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 405 | 406 | fast-json-stable-stringify@^2.0.0: 407 | version "2.1.0" 408 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 409 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 410 | 411 | fast-levenshtein@^2.0.6: 412 | version "2.0.6" 413 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 414 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 415 | 416 | fdir@^6.5.0: 417 | version "6.5.0" 418 | resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" 419 | integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== 420 | 421 | file-entry-cache@^8.0.0: 422 | version "8.0.0" 423 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" 424 | integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== 425 | dependencies: 426 | flat-cache "^4.0.0" 427 | 428 | find-up@^5.0.0: 429 | version "5.0.0" 430 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 431 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 432 | dependencies: 433 | locate-path "^6.0.0" 434 | path-exists "^4.0.0" 435 | 436 | flat-cache@^4.0.0: 437 | version "4.0.1" 438 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" 439 | integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== 440 | dependencies: 441 | flatted "^3.2.9" 442 | keyv "^4.5.4" 443 | 444 | flatted@^3.2.9: 445 | version "3.3.3" 446 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" 447 | integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== 448 | 449 | glob-parent@^6.0.2: 450 | version "6.0.2" 451 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 452 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 453 | dependencies: 454 | is-glob "^4.0.3" 455 | 456 | globals@^14.0.0: 457 | version "14.0.0" 458 | resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" 459 | integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== 460 | 461 | globals@^16.5.0: 462 | version "16.5.0" 463 | resolved "https://registry.yarnpkg.com/globals/-/globals-16.5.0.tgz#ccf1594a437b97653b2be13ed4d8f5c9f850cac1" 464 | integrity sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ== 465 | 466 | has-flag@^4.0.0: 467 | version "4.0.0" 468 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 469 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 470 | 471 | ignore@^5.2.0: 472 | version "5.3.2" 473 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" 474 | integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== 475 | 476 | ignore@^7.0.0: 477 | version "7.0.5" 478 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" 479 | integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== 480 | 481 | import-fresh@^3.2.1: 482 | version "3.3.1" 483 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" 484 | integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== 485 | dependencies: 486 | parent-module "^1.0.0" 487 | resolve-from "^4.0.0" 488 | 489 | imurmurhash@^0.1.4: 490 | version "0.1.4" 491 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 492 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 493 | 494 | is-extglob@^2.1.1: 495 | version "2.1.1" 496 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 497 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 498 | 499 | is-glob@^4.0.0, is-glob@^4.0.3: 500 | version "4.0.3" 501 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 502 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 503 | dependencies: 504 | is-extglob "^2.1.1" 505 | 506 | isexe@^2.0.0: 507 | version "2.0.0" 508 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 509 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 510 | 511 | js-yaml@^4.1.0: 512 | version "4.1.1" 513 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" 514 | integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== 515 | dependencies: 516 | argparse "^2.0.1" 517 | 518 | json-buffer@3.0.1: 519 | version "3.0.1" 520 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 521 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 522 | 523 | json-schema-traverse@^0.4.1: 524 | version "0.4.1" 525 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 526 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 527 | 528 | json-stable-stringify-without-jsonify@^1.0.1: 529 | version "1.0.1" 530 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 531 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 532 | 533 | keyv@^4.5.4: 534 | version "4.5.4" 535 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" 536 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 537 | dependencies: 538 | json-buffer "3.0.1" 539 | 540 | levn@^0.4.1: 541 | version "0.4.1" 542 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 543 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 544 | dependencies: 545 | prelude-ls "^1.2.1" 546 | type-check "~0.4.0" 547 | 548 | locate-path@^6.0.0: 549 | version "6.0.0" 550 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 551 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 552 | dependencies: 553 | p-locate "^5.0.0" 554 | 555 | lodash.merge@^4.6.2: 556 | version "4.6.2" 557 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 558 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 559 | 560 | minimatch@^3.1.2: 561 | version "3.1.2" 562 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 563 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 564 | dependencies: 565 | brace-expansion "^1.1.7" 566 | 567 | minimatch@^9.0.4: 568 | version "9.0.5" 569 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" 570 | integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== 571 | dependencies: 572 | brace-expansion "^2.0.1" 573 | 574 | ms@^2.1.3: 575 | version "2.1.3" 576 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 577 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 578 | 579 | natural-compare@^1.4.0: 580 | version "1.4.0" 581 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 582 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 583 | 584 | optionator@^0.9.3: 585 | version "0.9.4" 586 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" 587 | integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== 588 | dependencies: 589 | deep-is "^0.1.3" 590 | fast-levenshtein "^2.0.6" 591 | levn "^0.4.1" 592 | prelude-ls "^1.2.1" 593 | type-check "^0.4.0" 594 | word-wrap "^1.2.5" 595 | 596 | p-limit@^3.0.2: 597 | version "3.1.0" 598 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 599 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 600 | dependencies: 601 | yocto-queue "^0.1.0" 602 | 603 | p-locate@^5.0.0: 604 | version "5.0.0" 605 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 606 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 607 | dependencies: 608 | p-limit "^3.0.2" 609 | 610 | parent-module@^1.0.0: 611 | version "1.0.1" 612 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 613 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 614 | dependencies: 615 | callsites "^3.0.0" 616 | 617 | path-exists@^4.0.0: 618 | version "4.0.0" 619 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 620 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 621 | 622 | path-key@^3.1.0: 623 | version "3.1.1" 624 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 625 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 626 | 627 | picomatch@^4.0.3: 628 | version "4.0.3" 629 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" 630 | integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== 631 | 632 | prelude-ls@^1.2.1: 633 | version "1.2.1" 634 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 635 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 636 | 637 | prettier@^3.7.4: 638 | version "3.7.4" 639 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.7.4.tgz#d2f8335d4b1cec47e1c8098645411b0c9dff9c0f" 640 | integrity sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA== 641 | 642 | punycode@^2.1.0: 643 | version "2.3.1" 644 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 645 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 646 | 647 | resolve-from@^4.0.0: 648 | version "4.0.0" 649 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 650 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 651 | 652 | semver@>=5.7.2, semver@^7.6.0: 653 | version "7.7.3" 654 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" 655 | integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== 656 | 657 | shebang-command@^2.0.0: 658 | version "2.0.0" 659 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 660 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 661 | dependencies: 662 | shebang-regex "^3.0.0" 663 | 664 | shebang-regex@^3.0.0: 665 | version "3.0.0" 666 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 667 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 668 | 669 | strip-json-comments@^3.1.1: 670 | version "3.1.1" 671 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 672 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 673 | 674 | supports-color@^7.1.0: 675 | version "7.2.0" 676 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 677 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 678 | dependencies: 679 | has-flag "^4.0.0" 680 | 681 | tinyglobby@^0.2.15: 682 | version "0.2.15" 683 | resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" 684 | integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== 685 | dependencies: 686 | fdir "^6.5.0" 687 | picomatch "^4.0.3" 688 | 689 | ts-api-utils@^2.1.0: 690 | version "2.1.0" 691 | resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" 692 | integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== 693 | 694 | type-check@^0.4.0, type-check@~0.4.0: 695 | version "0.4.0" 696 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 697 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 698 | dependencies: 699 | prelude-ls "^1.2.1" 700 | 701 | typescript-eslint@^8.50.0: 702 | version "8.50.0" 703 | resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.50.0.tgz#b91e73eea65edf46e10425dbeb0dc1ddb0d7fea5" 704 | integrity sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A== 705 | dependencies: 706 | "@typescript-eslint/eslint-plugin" "8.50.0" 707 | "@typescript-eslint/parser" "8.50.0" 708 | "@typescript-eslint/typescript-estree" "8.50.0" 709 | "@typescript-eslint/utils" "8.50.0" 710 | 711 | typescript@^5.9.3: 712 | version "5.9.3" 713 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" 714 | integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== 715 | 716 | uri-js@^4.2.2: 717 | version "4.4.1" 718 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 719 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 720 | dependencies: 721 | punycode "^2.1.0" 722 | 723 | which@^2.0.1: 724 | version "2.0.2" 725 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 726 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 727 | dependencies: 728 | isexe "^2.0.0" 729 | 730 | word-wrap@^1.2.5: 731 | version "1.2.5" 732 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" 733 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 734 | 735 | yocto-queue@^0.1.0: 736 | version "0.1.0" 737 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 738 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 739 | --------------------------------------------------------------------------------