diff --git a/packages/common/src/library/libraries/abstracts/index.ts b/packages/common/src/library/libraries/abstracts/index.ts index 720cb0be..b31b3db0 100644 --- a/packages/common/src/library/libraries/abstracts/index.ts +++ b/packages/common/src/library/libraries/abstracts/index.ts @@ -4,3 +4,4 @@ export { BaseGraphicsLibrary } from "./graphics.library.abstract"; export { BaseInputLibrary } from "./input.library.abstract"; export { BaseSoundLibrary } from "./sound.library.abstract"; export { BaseNetworkLibrary } from "./network.library.abstract"; +export { BaseMusicLibrary } from "./music.library.abstract"; diff --git a/packages/common/src/library/libraries/abstracts/music.library.abstract.ts b/packages/common/src/library/libraries/abstracts/music.library.abstract.ts new file mode 100644 index 00000000..e6da30de --- /dev/null +++ b/packages/common/src/library/libraries/abstracts/music.library.abstract.ts @@ -0,0 +1,14 @@ +import { type InitContext } from "../../../context"; +import { type IMusicLibrary } from "../interfaces"; +import { Library } from "../library"; + +export abstract class BaseMusicLibrary extends Library implements IMusicLibrary { + public abstract init(context: InitContext): Promise; + + public abstract play(sound: string): void; + + /** + * mutes or unmutes the sound. + */ + public abstract mute(): void; +} diff --git a/packages/common/src/library/libraries/consts/library-label.const.ts b/packages/common/src/library/libraries/consts/library-label.const.ts index c99a6c1a..adb3051a 100644 --- a/packages/common/src/library/libraries/consts/library-label.const.ts +++ b/packages/common/src/library/libraries/consts/library-label.const.ts @@ -2,5 +2,6 @@ export const COMPONENT_SYSTEM_LIBRARY = Symbol("COMPONENT_SYSTEM_LIBRARY"); export const GRAPHICS_LIBRARY = Symbol("GRAPHICS_LIBRARY"); export const NETWORK_LIBRARY = Symbol("NETWORK_LIBRARY"); export const SOUND_LIBRARY = Symbol("SOUND_LIBRARY"); +export const MUSIC_LIBRARY = Symbol("MUSIC_LIBRARY"); export const ASSET_MANAGER_LIBRARY = Symbol("ASSET_MANAGER_LIBRARY"); export const INPUT_LIBRARY = Symbol("INPUT_LIBRARY"); diff --git a/packages/common/src/library/libraries/interfaces/bases/mutable.library.type.ts b/packages/common/src/library/libraries/interfaces/bases/mutable.library.type.ts new file mode 100644 index 00000000..f0b52055 --- /dev/null +++ b/packages/common/src/library/libraries/interfaces/bases/mutable.library.type.ts @@ -0,0 +1,8 @@ +import { type ILibrary } from "../../library.type"; + +export interface IMutableLibrary extends ILibrary { + /** + * mutes or unmutes the sound. + */ + mute(): void; +} diff --git a/packages/common/src/library/libraries/interfaces/finals/music.library.type.ts b/packages/common/src/library/libraries/interfaces/finals/music.library.type.ts new file mode 100644 index 00000000..3f469d0a --- /dev/null +++ b/packages/common/src/library/libraries/interfaces/finals/music.library.type.ts @@ -0,0 +1,4 @@ +import { type IExposedLibrary } from "../bases/exposed.library.type"; +import { type IMutableLibrary } from "../bases/mutable.library.type"; + +export interface IMusicLibrary extends IExposedLibrary, IMutableLibrary {} diff --git a/packages/common/src/library/libraries/interfaces/finals/sound.library.type.ts b/packages/common/src/library/libraries/interfaces/finals/sound.library.type.ts index 37755fa7..67141946 100644 --- a/packages/common/src/library/libraries/interfaces/finals/sound.library.type.ts +++ b/packages/common/src/library/libraries/interfaces/finals/sound.library.type.ts @@ -1,8 +1,4 @@ import { type IExposedLibrary } from "../bases/exposed.library.type"; +import { type IMutableLibrary } from "../bases/mutable.library.type"; -export interface ISoundLibrary extends IExposedLibrary { - /** - * mutes or unmutes the sound. - */ - mute(): void; -} +export interface ISoundLibrary extends IExposedLibrary, IMutableLibrary {} diff --git a/packages/common/src/library/libraries/interfaces/index.ts b/packages/common/src/library/libraries/interfaces/index.ts index 166cbb0c..4ae803d5 100644 --- a/packages/common/src/library/libraries/interfaces/index.ts +++ b/packages/common/src/library/libraries/interfaces/index.ts @@ -6,3 +6,5 @@ export { IGraphicsLibrary } from "./finals/graphics.library.type"; export { IInputLibrary } from "./finals/input.library.type"; export { ISoundLibrary } from "./finals/sound.library.type"; export { INetworkLibrary } from "./finals/network.library.type"; +export { IMusicLibrary } from "./finals/music.library.type"; +export { IMutableLibrary } from "./bases/mutable.library.type"; diff --git a/packages/common/src/library/manager/managers/library.manager.ts b/packages/common/src/library/manager/managers/library.manager.ts index 542e45a8..4cdf3abb 100644 --- a/packages/common/src/library/manager/managers/library.manager.ts +++ b/packages/common/src/library/manager/managers/library.manager.ts @@ -6,8 +6,10 @@ import { type IComponentSystemLibrary, type IGraphicsLibrary, type IInputLibrary, + type IMusicLibrary, type INetworkLibrary, type ISoundLibrary, + MUSIC_LIBRARY, NETWORK_LIBRARY, SOUND_LIBRARY, } from "../../libraries"; @@ -21,6 +23,7 @@ export enum DefaultLibrariesEnum { INPUT, NETWORK, SOUND, + MUSIC, } const DEFAULT_LIBRARIES: { index: DefaultLibrariesEnum; sym: symbol }[] = [ @@ -29,6 +32,7 @@ const DEFAULT_LIBRARIES: { index: DefaultLibrariesEnum; sym: symbol }[] = [ { index: DefaultLibrariesEnum.GRAPHICS, sym: GRAPHICS_LIBRARY }, { index: DefaultLibrariesEnum.NETWORK, sym: NETWORK_LIBRARY }, { index: DefaultLibrariesEnum.SOUND, sym: SOUND_LIBRARY }, + { index: DefaultLibrariesEnum.MUSIC, sym: MUSIC_LIBRARY }, ]; export class LibraryManager extends BaseLibraryManager { @@ -67,4 +71,8 @@ export class LibraryManager extends BaseLibraryManager { public getSound(): LibraryHandle { return this._get(DefaultLibrariesEnum.SOUND); } + + public getMusic(): LibraryHandle { + return this._get(DefaultLibrariesEnum.MUSIC); + } } diff --git a/packages/core/src/application/application-config.ts b/packages/core/src/application/application-config.ts index f4d9eccd..8419e60b 100644 --- a/packages/core/src/application/application-config.ts +++ b/packages/core/src/application/application-config.ts @@ -4,6 +4,7 @@ import { type IGraphicsLibrary, type IInputLibrary, type ILibrary, + type IMusicLibrary, type INetworkLibrary, type ISoundLibrary, type LibraryHandle, @@ -77,4 +78,16 @@ export class ApplicationConfig { public useSoundLibrary(library: ISoundLibrary) { this._libraryManager.setSound(library); } + + public getMusicLibrary() { + return this._libraryManager.getMusic(); + } + + public useMusicLibrary(library: IMusicLibrary) { + this._libraryManager.setMusic(library); + } + + public getMutableLibraries() { + return this._libraryManager.getMutableLibraries(); + } } diff --git a/packages/core/src/common/library/manager/library.manager.ts b/packages/core/src/common/library/manager/library.manager.ts index 56629e57..76efa807 100644 --- a/packages/core/src/common/library/manager/library.manager.ts +++ b/packages/core/src/common/library/manager/library.manager.ts @@ -8,12 +8,15 @@ import { type IGraphicsLibrary, type IInputLibrary, type ILibrary, + type IMusicLibrary, + type IMutableLibrary, INPUT_LIBRARY, type INetworkLibrary, type IRunnerLibrary, type ISoundLibrary, type LibraryHandle, LibraryManager, + MUSIC_LIBRARY, NETWORK_LIBRARY, SOUND_LIBRARY, } from "@nanoforge/common"; @@ -65,6 +68,10 @@ export class EditableLibraryManager extends LibraryManager { this._set(DefaultLibrariesEnum.SOUND, SOUND_LIBRARY, library, new EditableLibraryContext()); } + public setMusic(library: IMusicLibrary): void { + this._set(DefaultLibrariesEnum.MUSIC, MUSIC_LIBRARY, library, new EditableLibraryContext()); + } + public getLibraries(): LibraryHandle[] { return this._libraries; } @@ -81,6 +88,12 @@ export class EditableLibraryManager extends LibraryManager { return Relationship.getLibrariesByDependencies(this._libraries, true); } + public getMutableLibraries(): LibraryHandle[] { + return this._libraries.filter( + (handle) => handle && typeof handle.library["mute"] === "function", + ) as LibraryHandle[]; + } + private _getRunnerLibraries(): LibraryHandle[] { return this._libraries.filter( (handle) => handle && typeof handle.library["run"] === "function", diff --git a/packages/core/src/core/core.ts b/packages/core/src/core/core.ts index 5f733129..35631fbb 100644 --- a/packages/core/src/core/core.ts +++ b/packages/core/src/core/core.ts @@ -53,6 +53,13 @@ export class Core { const intervalHandle = setInterval(render, 1000 / this.options.tickRate); } + /** + * mutes / unmutes mutable libraries all at once. + */ + public mute(): void { + this.config.getMutableLibraries().map((x) => x.library.mute()); + } + private getInitContext(options: IRunOptions): InitContext { return new InitContext(this.context, this.config.libraryManager, this._configRegistry, options); } diff --git a/packages/music/.gitignore b/packages/music/.gitignore new file mode 100644 index 00000000..9f6061cc --- /dev/null +++ b/packages/music/.gitignore @@ -0,0 +1,272 @@ +### VisualStudioCode template +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### C++ template +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Node template +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Private + +# NX +.nx/ + +# Compiled files +src/**/*.js +src/**/*.d.ts + +# pubilc directory +public/ +compile_commands.json +emsdk/ diff --git a/packages/music/.nvmrc b/packages/music/.nvmrc new file mode 100644 index 00000000..c9758a53 --- /dev/null +++ b/packages/music/.nvmrc @@ -0,0 +1 @@ +v23.6.0 diff --git a/packages/music/.prettierignore b/packages/music/.prettierignore new file mode 100644 index 00000000..e814a634 --- /dev/null +++ b/packages/music/.prettierignore @@ -0,0 +1,8 @@ +# Ignore files for PNPM, NPM and YARN +pnpm-lock.yaml +package-lock.json +yarn.lock +bun.lock + +*.js +*.d.ts diff --git a/packages/music/.prettierrc b/packages/music/.prettierrc new file mode 100644 index 00000000..d5f635c3 --- /dev/null +++ b/packages/music/.prettierrc @@ -0,0 +1,11 @@ +{ + "plugins": ["@trivago/prettier-plugin-sort-imports"], + "importOrderSeparation": true, + "importOrderSortSpecifiers": true, + "importOrderParserPlugins": ["typescript", "decorators-legacy"], + "importOrder": ["^~/(.*)$", "^[./]"], + "useTabs": false, + "singleQuote": false, + "trailingComma": "all", + "printWidth": 100 +} diff --git a/packages/music/README.md b/packages/music/README.md new file mode 100644 index 00000000..ed41a35b --- /dev/null +++ b/packages/music/README.md @@ -0,0 +1 @@ +# Music diff --git a/packages/music/eslint.config.js b/packages/music/eslint.config.js new file mode 100644 index 00000000..4a7529ef --- /dev/null +++ b/packages/music/eslint.config.js @@ -0,0 +1,63 @@ +import pluginJs from "@eslint/js"; +import eslintConfigPrettier from "eslint-config-prettier"; +import globals from "globals"; +import tseslint from "typescript-eslint"; +import pluginJest from "eslint-plugin-jest"; + +export default [ + { + files: ["src/**/*.{ts}"], + }, + { languageOptions: { globals: globals.node } }, + + + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + ...tseslint.configs.strict, + eslintConfigPrettier, + { ignores: ["**/*.js"] }, + { + rules: { + "@typescript-eslint/consistent-type-imports": [ + "error", + { + disallowTypeAnnotations: true, + fixStyle: "inline-type-imports", + prefer: "type-imports", + }, + ], + "@typescript-eslint/no-extraneous-class": "off", + "@typescript-eslint/no-empty-object-type": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/member-ordering": [ + "error", + { + default: [ + "static-field", + "field", + "public-static-method", + "constructor", + "method", + "protected-method", + "private-method", + ], + }, + ], + }, + }, + { + files: ["**/*.spec.ts"], + plugins: { jest: pluginJest }, + languageOptions: { + globals: pluginJest.environments.globals.globals, + }, + rules: { + "jest/no-disabled-tests": "warn", + "jest/no-focused-tests": "error", + "jest/no-identical-title": "error", + "jest/prefer-to-have-length": "warn", + "jest/valid-expect": "error", + } + } +]; diff --git a/packages/music/package.json b/packages/music/package.json new file mode 100644 index 00000000..d3d67784 --- /dev/null +++ b/packages/music/package.json @@ -0,0 +1,66 @@ +{ + "name": "@nanoforge/music", + "version": "1.0.0", + "description": "NanoForge Engine - music", + "homepage": "https://github.com/NanoForge-dev/Engine#readme", + "license": "MIT", + "contributors": [ + "Bill", + "Exelo", + "Fexkoser", + "Tchips" + ], + "funding": { + "type": "individual", + "url": "" + }, + "type": "module", + "main": "src/index.ts", + "repository": { + "type": "git", + "url": "git+https://github.com/NanoForge-dev/Engine.git", + "directory": "packages/music" + }, + "scripts": { + "build": "tsc -b .", + "clean": "pnpm clean:types && pnpm clean:scripts && rm -f tsconfig.build.tsbuildinfo", + "clean:types": "find src -name '*.d.ts' -delete", + "clean:scripts": "find src -name '*.js' -delete", + "lint": "eslint . && prettier --check .", + "fix": "eslint . --fix && prettier --write .", + "taze": "taze major -w", + "lint-staged": "lint-staged" + }, + "dependencies": { + "@nanoforge/common": "workspace:^" + }, + "devDependencies": { + "@commitlint/cli": "^20.0.0", + "@commitlint/config-conventional": "^20.0.0", + "@eslint/js": "^9.36.0", + "@trivago/prettier-plugin-sort-imports": "^5.2.2", + "@types/node": "^22.18.7", + "eslint": "^9.36.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-format": "^1.0.2", + "eslint-plugin-jest": "^29.0.1", + "eslint-plugin-prettier": "^5.5.4", + "globals": "^16.4.0", + "lint-staged": "^16.2.3", + "prettier": "^3.6.2", + "taze": "^19.7.0", + "typescript": "^5.9.2", + "typescript-eslint": "^8.45.0" + }, + "engines": { + "node": "23.6.0", + "pnpm": "10.17.1" + }, + "packageManager": "pnpm@10.17.1", + "lint-staged": { + "**/*.{js,ts}": [ + "eslint --fix", + "prettier --write" + ] + } +} diff --git a/packages/music/src/index.ts b/packages/music/src/index.ts new file mode 100644 index 00000000..dbfecc27 --- /dev/null +++ b/packages/music/src/index.ts @@ -0,0 +1 @@ +export { MusicLibrary } from "./music.library"; diff --git a/packages/music/src/music.library.ts b/packages/music/src/music.library.ts new file mode 100644 index 00000000..a073bffb --- /dev/null +++ b/packages/music/src/music.library.ts @@ -0,0 +1,54 @@ +import { BaseMusicLibrary } from "@nanoforge/common"; +import { NfNotFound } from "@nanoforge/common/src/exception"; + +export class MusicLibrary extends BaseMusicLibrary { + private muted: boolean; + private musics: Map; + private current: HTMLAudioElement | null = null; + + get name(): string { + return "NfMusic"; + } + + public async init(): Promise { + this.musics = new Map(); + this.muted = true; + } + + public mute(): void { + this.muted = !this.muted; + for (const key in this.musics) { + const element = this.musics[key]; + + if (element) { + element.muted = this.muted; + } + } + } + + public play(music: string): void { + const musicElement = this.musics.get(music); + + if (musicElement) { + this.current?.pause(); + this.current = musicElement; + this.current + ?.play() + .then(() => {}) + .catch((e) => { + console.error(`Got error: ${e}`); + }); + } else { + this.current = null; + throw new NfNotFound(music); + } + } + + public load(music: string, file: string) { + const element = new Audio(file); + if (element) { + element.muted = this.muted; + } + this.musics.set(music, element); + } +} diff --git a/packages/music/tsconfig.build.json b/packages/music/tsconfig.build.json new file mode 100644 index 00000000..a7e09c73 --- /dev/null +++ b/packages/music/tsconfig.build.json @@ -0,0 +1,16 @@ +{ + "extends": "../tsconfig.build.json", + "compilerOptions": { + "outDir": ".", + "rootDir": ".", + "paths": { + "@nanoforge/common": ["../common"] + } + }, + "exclude": ["node_modules", "dist", "test/**/*", "*.spec.ts"], + "references": [ + { + "path": "../common/tsconfig.build.json" + } + ] +} diff --git a/packages/music/tsconfig.json b/packages/music/tsconfig.json new file mode 100644 index 00000000..a74c8e2d --- /dev/null +++ b/packages/music/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.build.json", + "compilerOptions": { + "types": ["jest", "node"] + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.build.json" + } + ] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b0a2f02..7702805f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -460,6 +460,61 @@ importers: specifier: ^8.45.0 version: 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + packages/music: + dependencies: + '@nanoforge/common': + specifier: workspace:^ + version: link:../common + devDependencies: + '@commitlint/cli': + specifier: ^20.0.0 + version: 20.0.0(@types/node@22.18.7)(typescript@5.9.2) + '@commitlint/config-conventional': + specifier: ^20.0.0 + version: 20.0.0 + '@eslint/js': + specifier: ^9.36.0 + version: 9.36.0 + '@trivago/prettier-plugin-sort-imports': + specifier: ^5.2.2 + version: 5.2.2(prettier@3.6.2) + '@types/node': + specifier: ^22.18.7 + version: 22.18.7 + eslint: + specifier: ^9.36.0 + version: 9.36.0(jiti@2.6.0) + eslint-config-prettier: + specifier: ^10.1.8 + version: 10.1.8(eslint@9.36.0(jiti@2.6.0)) + eslint-plugin-format: + specifier: ^1.0.2 + version: 1.0.2(eslint@9.36.0(jiti@2.6.0)) + eslint-plugin-jest: + specifier: ^29.0.1 + version: 29.0.1(@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(jest@30.2.0(@types/node@22.18.7))(typescript@5.9.2) + eslint-plugin-prettier: + specifier: ^5.5.4 + version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.6.0)))(eslint@9.36.0(jiti@2.6.0))(prettier@3.6.2) + globals: + specifier: ^16.4.0 + version: 16.4.0 + lint-staged: + specifier: ^16.2.3 + version: 16.2.3 + prettier: + specifier: ^3.6.2 + version: 3.6.2 + taze: + specifier: ^19.7.0 + version: 19.7.0 + typescript: + specifier: ^5.9.2 + version: 5.9.2 + typescript-eslint: + specifier: ^8.45.0 + version: 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + packages/sound: dependencies: '@nanoforge/common': @@ -1528,11 +1583,6 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} @@ -2191,10 +2241,6 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-visitor-keys@4.2.1: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2209,10 +2255,6 @@ packages: jiti: optional: true - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4715,7 +4757,7 @@ snapshots: dependencies: ajv: 6.12.6 debug: 4.4.3 - espree: 10.3.0 + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 @@ -5506,7 +5548,7 @@ snapshots: '@typescript-eslint/types': 8.45.0 '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.45.0 - debug: 4.4.0 + debug: 4.4.3 eslint: 9.36.0(jiti@2.6.0) typescript: 5.9.2 transitivePeerDependencies: @@ -5550,11 +5592,11 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.2) '@typescript-eslint/types': 8.45.0 '@typescript-eslint/visitor-keys': 8.45.0 - debug: 4.4.0 + debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: @@ -5657,16 +5699,10 @@ snapshots: abbrev@2.0.0: {} - acorn-jsx@5.3.2(acorn@8.14.1): - dependencies: - acorn: 8.14.1 - acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 - acorn@8.14.1: {} - acorn@8.15.0: {} add-stream@1.0.0: {} @@ -6282,8 +6318,6 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} - eslint-visitor-keys@4.2.1: {} eslint@9.36.0(jiti@2.6.0): @@ -6304,7 +6338,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.3 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -6328,12 +6362,6 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.3.0: - dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 4.2.0 - espree@10.4.0: dependencies: acorn: 8.15.0