{"_id":"sonolus-pack","_rev":"38-a06d7144537a7a53d6350361765d5bbd","name":"sonolus-pack","dist-tags":{"latest":"5.3.0","beta":"5.3.0","alpha":"5.4.0-alpha.3"},"versions":{"0.1.0":{"name":"sonolus-pack","version":"0.1.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/NonSpicyBurrito/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"build":"node ./build/prepare.js && tsc -p .","lint":"eslint --ext .ts src/"},"devDependencies":{"@types/fs-extra":"^9.0.11","@typescript-eslint/eslint-plugin":"^4.27.0","@typescript-eslint/parser":"^4.27.0","eslint":"^7.28.0","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^3.4.0","prettier":"^2.3.1","typescript":"^4.3.4"},"dependencies":{"ajv":"^8.6.0","commander":"^7.2.0","fs-extra":"^10.0.0"},"gitHead":"fd37a6a132d6ecf448ba947326e0f495d01a6c93","bugs":{"url":"https://github.com/NonSpicyBurrito/sonolus-pack/issues"},"homepage":"https://github.com/NonSpicyBurrito/sonolus-pack#readme","_id":"sonolus-pack@0.1.0","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-5Yra4z8nf+eteeBgLEC70uXYB4LYKm6e6s/vylwKx/9ofzrflz1NeT/bYx8u1uRTyWqeRnQO8v6OyWkBBcdYCg==","shasum":"f92edd2ae10eaaf487d417f3650dbca5a0810d3c","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-0.1.0.tgz","fileCount":33,"unpackedSize":42847,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg1iGYCRA9TVsSAnZWagAA6EgQAJhzxj3p/6b0NUmufJIY\ntzt91WTQTWKvGhyjzNny1EUdAATco041wzb2z8Xi6M/ehYWHfkE/8rt5CccQ\ncDZg5yXeOe6WlgHuVu370WEEzAGV1dqvhp8oVnjVX4qgdMXH4cBEd9g+HrC3\nNZ6VIOf9Agzda9btWt7vSgx5rwYrmQwcTPjvzImm5fZhv5SAXU1jLJ9SImBS\n0mDUnbpavu9M7EHOQYksANZnkS0wflUwPcmzRndVkMvAbUPCy0jfK0K+dG/0\nrl9ABHYzA0dxynHI7cTPJOgDA0EbTQ5aDKi7fKPY89cHo7gg6LnbLX7/4Z0h\n4XrXmFnUE8st/QDCH/+FNfliXoDx1LiiKeHSy7p3SzJPPoN6JongCrXPzkMN\ncsQ9B2l9GOlvuFSwYPyR0kZiZugF+XdlsLBRNxFn5ZuUV8InceKGswQEuWEg\nhEgjz6SXjADUQHkTe802u7Um+OwT09zBtspmV0AmzknW92z9OXQd9B7X16ml\nBXKK/7t/hzqu3mOdfmMv5XrzUQQDV071P0X2NzIOP4PYNDbDJU6eViXPU0vn\nfrsQcpqGp3L1B4th4pR41ES6r3147MrQ+ucXEZ8dOUrwDw5xKynKBrh1VTV3\nDtRli9fMgXeY/CzPFPyXlHmHc+o3XBmiOMw1hjPTN9a76WKsNGe8Cs7B5+Vi\nMOSi\r\n=Zcm/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCZx6Joz8G0xls7J/zTRqkLZRhembZPOlmtdEquNzwJhAIgEgI3L5bP2Y3R25i8VwwGKffCjWrw/CDJq5npj6TpOt8="}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_0.1.0_1624646039883_0.33160481251742313"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"0.2.0-beta.0":{"name":"sonolus-pack","version":"0.2.0-beta.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/NonSpicyBurrito/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"build":"node ./build/prepare.js && tsc -p .","lint":"eslint --ext .ts src/"},"devDependencies":{"@types/fs-extra":"^9.0.11","@typescript-eslint/eslint-plugin":"^4.27.0","@typescript-eslint/parser":"^4.27.0","eslint":"^7.28.0","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^3.4.0","prettier":"^2.3.1","typescript":"^4.3.4"},"dependencies":{"ajv":"^8.6.0","commander":"^7.2.0","fs-extra":"^10.0.0"},"readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://github.com/NonSpicyBurrito/sonolus-wiki)\n-   [sonolus-express](https://github.com/NonSpicyBurrito/sonolus-express)\n-   [sonolus-generate-static](https://github.com/NonSpicyBurrito/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `info.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zh-hans\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Folder Structure\n\n```\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           info.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           {clip}[.mp3/.srl]\n|           ...\n|           {clip}[.mp3/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n\\---engines\n    +---{engine}\n    +---...\n    \\---{engine}\n            info.json\n            thumbnail[.png/.srl]\n            data[.json/.srl]\n            configuration[.json/.srl]\n```\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `info.json`\n\nLevel information.\n\n```ts\ntype LevelInfo = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: Use\n    useBackground: Use\n    useEffect: Use\n    useParticle: Use\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype Use = {\n    useDefault: boolean\n    item?: string // name of referenced item\n}\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `info.json`\n\nSkin information.\n\n```ts\ntype SkinInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `info.json`\n\nBackground information.\n\n```ts\ntype BackgroundInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `info.json`\n\nEffect information.\n\n```ts\ntype EffectInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\nClips in effect data should simply be `string` that references the corresponding clip file.\n\n#### `{clip}[.mp3/.srl]`\n\nEffect clip referenced in effect data.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `info.json`\n\nParticle information.\n\n```ts\ntype ParticleInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `info.json`\n\nEngine information.\n\n```ts\ntype EngineInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `data[.json/.srl]`\n\nEngine data.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/NonSpicyBurrito/sonolus-express) and [sonolus-generate-static](https://github.com/NonSpicyBurrito/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"fcf1570e69c6d2bd182051a528ca45378b96ef8f","bugs":{"url":"https://github.com/NonSpicyBurrito/sonolus-pack/issues"},"homepage":"https://github.com/NonSpicyBurrito/sonolus-pack#readme","_id":"sonolus-pack@0.2.0-beta.0","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-8naJDwlDWKs1h7T3F/rZIJMeJjrYaIhJvB0dR3tSFbUg1a+sU/lkuCe03DCJ9995OAq1it9Ugil7eH5Cg/7JKw==","shasum":"8048bec18ced3fdef86ec1ae178a44c04f37fbc7","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-0.2.0-beta.0.tgz","fileCount":33,"unpackedSize":43184,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhDoltCRA9TVsSAnZWagAAzTgQAJ0Kr83Hi+mNH+Kx+Ke/\nJzT8L9ZnSGCdhdVHGvNBleivn2gyD9eDLkxxnztQ6Liku3i/KEzn8z00BLVh\nlYVqUQgLX0NG/MrsjbyKw0parBYTehC411QcCZe8vhWcKMvNLiOe5Vt6YRjU\neGnC4UykgFmd8Kf0lnWZVwWCIGQCJOt8Dea9/mGDGigTHQ1LJuQupVYsPat7\nS6sRNJ9TLwg6T78hksLdgB9i9O/zIfYdxobifsuvuPQQ6nIfguB0QNivZ8z9\ni13Nl7xWuB2Z7dOYHfjzBBBYtyt6+qNFC2gPJl8insAaT2e82pZxU4mh8+Gp\nK16tyr5Jts9U4GWnKJDSz69a9rA8ZmOCFKp395Cn4qLeLk7e/Nw7EZl5wv4k\nTwSZpdJhs4cRmEsX+reO30qaMgTutwJm0EYNBNzRERTkvvexf4N+RNiez0qJ\nWxDpM8bQUPELeuwYan8xgWo8PUEoVJ1odgtV17ktQoj0kg7vu0j7Cr9Uu1NF\nM+dR11U5N+4p22gURxl8bw4Mm9xZi99+ios8fdv8LYAf47JdCIgBdPt5qOq/\nRJwnm6NmixEv5dx+BEEcNTUH++scLk146R4pVx+9sUOnsneGLphOMMmSR8oQ\nJjZsnbtygVGZLtXYncYsSbR2gqzotEnNXopo1etSnnDQ737MXwn04ZadrOT8\n9zy5\r\n=4bVf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC+5ZldqePKbeTTdcDDRgpLR61w6B9hSk1L3tJYPl/FPwIhAL6zB4I6rd3eU1Alh8PoqGirYhQxMLW92mj6KhXxbCkc"}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_0.2.0-beta.0_1628342637179_0.9268159143623291"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"0.2.0":{"name":"sonolus-pack","version":"0.2.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/NonSpicyBurrito/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"build":"node ./build/prepare.js && tsc -p .","lint":"eslint --ext .ts src/"},"devDependencies":{"@types/fs-extra":"^9.0.11","@typescript-eslint/eslint-plugin":"^4.27.0","@typescript-eslint/parser":"^4.27.0","eslint":"^7.28.0","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^3.4.0","prettier":"^2.3.1","typescript":"^4.3.4"},"dependencies":{"ajv":"^8.6.0","commander":"^7.2.0","fs-extra":"^10.0.0"},"gitHead":"509fc5878d2dbbf47396bb3dd193a46dfa28d5b2","bugs":{"url":"https://github.com/NonSpicyBurrito/sonolus-pack/issues"},"homepage":"https://github.com/NonSpicyBurrito/sonolus-pack#readme","_id":"sonolus-pack@0.2.0","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-WhKsp+ye3FopA4agr5i/rIim4pg5klxPwLhGXTh0CgGVOp86u/6FUHdTlUy+7RCEBjQp/KsFWDXzZvHe7HoKBA==","shasum":"92d44c3398a39ce95519fe2d805361ae010ab970","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-0.2.0.tgz","fileCount":16,"unpackedSize":24878,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhECdECRA9TVsSAnZWagAATgUP/0feIkgTgzG3HJMVt/n5\nO19QvkK4IlhuqhuziFOAOOAhdEeYy1r4rh3UCAUylN4L7Kn3vwCm/JgZjLne\n4HcqWXgnLx/bnt1qMarDbMTUdDjRndHS0MYWaMn12EkWLU2kpczVeN5TlALM\nNMTP2cIO8OgDciL8AVJnMXNk+5NWGWAO3c3v/rNYsfp2ApWnbPHDPEkPauU/\n7dH/GI3pbA7prdxA9W/1UB/sXZ9JhIqwCtyhlDKKVQE5HgYZXHvIRmW5JaBX\n63PEa69qdQGFBxnP1FBzatBucSBZrD78pedyxYWgE2doDcEKcXJ+KpkkqO8h\npRqmmN8ltXXcedGqdzTXtAiEqRxnBQjKI5SXHQUpaeBMdAlvpzfnYta/K4g5\novNrbtQmewHrv0o2bMmryX8hQP/hXQaoYQ6QdoLHfuU35+FGMwmIZSd0AbYC\nfOVMG+CxCt2LEYVkZ+u9cwiIscdAHWfUBeAcSUloruQCPOB4h9yygGCaIrbH\nB6V0pS5sRNGp14eZZqYV0wx8799XS28UU32Rm5QSRWcYosXBnhtotsHsKilX\nf8Svmuoa7XVJETMNvp+/0ghYbvFnbcUEgdMx+ON5UfYQROVOv6G2F25z7Q9j\nVRFmt/DteQod+d4VxXiz/m5zc3+ruc3jYu8/byx2gjQ1Wd8bYtC70OZY462S\n8eMc\r\n=P2aZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDHgnrqbIj6dDAXSO7oCyz2m11ACDUa9Y26tjPoGP6zDwIhAPCC8BBbseQ3M6FYSyaL228Nq9YDsQ2u6ou92OwiQa+S"}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_0.2.0_1628448579938_0.36867899365064094"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"1.0.0":{"name":"sonolus-pack","version":"1.0.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/NonSpicyBurrito/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","eslint":"^7.32.0","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^4.0.0","prettier":"^2.4.1","typescript":"^4.4.3"},"dependencies":{"commander":"^8.2.0","fs-extra":"^10.0.0","sonolus-core":"^0.1.0","zod":"^3.9.4"},"gitHead":"3d6d39ec1b785aedb49af9dbc54611073cb84ceb","bugs":{"url":"https://github.com/NonSpicyBurrito/sonolus-pack/issues"},"homepage":"https://github.com/NonSpicyBurrito/sonolus-pack#readme","_id":"sonolus-pack@1.0.0","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-duv8ryg5wSCGfm6alyI1u23l0TBCmjD33W9gv/aQ3S0v3P1W62cWoy4u9FTSDW/lmRXrR3/7CfUlMCpOZvWf+g==","shasum":"084799b4167719ef891bb37f7e1908d7f012d763","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-1.0.0.tgz","fileCount":16,"unpackedSize":23208,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFgwyABD7kp+MTGkHbrmGDkvyJYkYxgvynKEzc0a/zivAiEA4qpVfe7HTspPZDOBVWG8LlkrgVcvIKez5XreZ2V8CEQ="}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_1.0.0_1632880791407_0.3665229709702027"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"1.0.1":{"name":"sonolus-pack","version":"1.0.1","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","eslint":"^7.32.0","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^4.0.0","prettier":"^2.4.1","typescript":"^4.4.3"},"dependencies":{"commander":"^8.2.0","fs-extra":"^10.0.0","sonolus-core":"^0.1.0","zod":"^3.9.4"},"gitHead":"3929a2f6cd8a36fc767526f0efadc7619dd86f84","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@1.0.1","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-ggmjG5Dgc4QruqXtwZjATKXSjZvURqhECvTN//u/EGJ41AOtGv+X9PFpcO3tUmvmqnvlAWlHjbR4xZBSLAkpRQ==","shasum":"7d8dd3a9dc5664c929964d16a2624a7e8a5ab9a7","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-1.0.1.tgz","fileCount":16,"unpackedSize":23145,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh27miCRA9TVsSAnZWagAAhFwQAKR2nxmxfn4zw/tbKijW\nfzF/D9eWYTMdxKqv79AMuvt0eU2q/d48eg5MUcKjEQhHUCpl3E1AH3cXwCh/\nxmdBkEVYXh/Dq17Gi7jxknMbjSkokE7pJCNsaSic5SVPJ3mCaYxOtM7hab6E\nkpVe+KAC9zU+jK3PjZrhrtSAKr3VIEbxYpS67tOO9dzSnvqsAedYu4x2uwmZ\nY+JkNQAhwdnnzYNTlJnbxK9bHoqZuSJTeXNYp1CHVWC0x8tG344Tw9esX+E7\nEBMwiOfD6sfpkfarItx0PcIUPIVpf8Tv6v2G4scE7XCHFj8bLPhZ7tAwoKWH\nEDzG859JtFFg388PPhk+vTTjmo92AFv9rq2C6PDsZB+9+KyJFf+Ilgz8PhBL\nH3bY+ZRwTYHt2H6kR90IV8anZ8usrFQP5vm8bw/5iRko1nSQQpxvDPTpNHFS\nUjnHClDM4+P9wQEKLjuX+w4fsQOGJKc30pXzMEHnSxsgeWqxmeqSJwZ5gg1b\nhn4x0K0M3N/enhs7YC8j9XTivopQkLydy2DCxOam70wh/RUL/n6rbiXWIfXZ\n5vPGLQu/hE19tVyrPFruvNFKyZKfTtmKg+L/7kuErTZjlq8T3X6Vj0J5xCqj\nBWS6CIH8fykiS28LCfH7hw7+iReb9ztOzSC/nWT7AVii9vwAQ6CCffWK0TGl\nKLpU\r\n=wkJR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDr9I+2MiFNFm6ZWsWv5ejvjnwFcNDqOACCMou7jDfcywIhAM5gOTZ0Vg/ieLDA7KEyBTlmaDnYBnT2rLJY79JLoWX+"}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_1.0.1_1636639688759_0.2409778294183511"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"1.1.0-beta.0":{"name":"sonolus-pack","version":"1.1.0-beta.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","eslint":"^7.32.0","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^4.0.0","prettier":"^2.4.1","typescript":"^4.4.3"},"dependencies":{"commander":"^8.2.0","fs-extra":"^10.0.0","sonolus-core":"^1.0.0-beta.3","zod":"^3.9.4"},"readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://wiki.sonolus.com)\n-   [sonolus-express](https://github.com/Sonolus/sonolus-express)\n-   [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `info.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zh-hans\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Folder Structure\n\n```\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           info.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           {clip}[.mp3/.srl]\n|           ...\n|           {clip}[.mp3/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n\\---engines\n    +---{engine}\n    +---...\n    \\---{engine}\n            info.json\n            thumbnail[.png/.srl]\n            data[.json/.srl]\n            configuration[.json/.srl]\n```\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `info.json`\n\nLevel information.\n\n```ts\ntype LevelInfo = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: Use\n    useBackground: Use\n    useEffect: Use\n    useParticle: Use\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype Use = {\n    useDefault: boolean\n    item?: string // name of referenced item\n}\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `info.json`\n\nSkin information.\n\n```ts\ntype SkinInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `info.json`\n\nBackground information.\n\n```ts\ntype BackgroundInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `info.json`\n\nEffect information.\n\n```ts\ntype EffectInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\nClips in effect data should simply be `string` that references the corresponding clip file.\n\n#### `{clip}[.mp3/.srl]`\n\nEffect clip referenced in effect data.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `info.json`\n\nParticle information.\n\n```ts\ntype ParticleInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `info.json`\n\nEngine information.\n\n```ts\ntype EngineInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `data[.json/.srl]`\n\nEngine data.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/Sonolus/sonolus-express) and [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"b004e1f2b0a0fee875af6fad1049fb6c332f9af4","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@1.1.0-beta.0","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-AAlux+GenvPZ5nwf6aGHQup8eEeyf0nlInpN0qhS8zRYPHYL2owbymvG6Tk7dQVgHr99IFBSQmfqVo676A0JcA==","shasum":"9b224ddf68d651b802249c3fa96eb0d41670e5b0","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-1.1.0-beta.0.tgz","fileCount":16,"unpackedSize":23412,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh7l9nCRA9TVsSAnZWagAALs4P/jaVMEOjQS3Iw58pXwee\nCS0+23/BUnOfKco1aebQtC7ZP3WRrP/LsNcmJq2RjqsE5dhmANE0H4i0HVe8\nOs07RbxMZ4dU+A+Bscu4a5kSoScwh4BR80Tt8wf8aUHyd3FFLd4UtVqbV/2d\nLKREXiwV7847Hix2vOiRI0/qgixEGz9H3Kjus384JtNGl72MjMxZwuaqa3rd\nUq/n6jp8gaTXduw+n9s9qoAQa2gr2kTvumJcINk897aIZcL4BcrHrHCViTBt\nvdaMuowkdHYxLFfiD7LJxxABdD8UNI554uh562JLZ9B8AFSAoH+LC6AZBeiz\n2sAbzW+ITjfXJUoZEaoiH8Fpw288eDdbrbXNEMxN84sNlJv570EZlOGYBf7l\nOzscEImMCkspoZKwO3pVbcaehlonVXU0f4DwIvmA6zguoQi82hE27C4dKAMx\nfggPJccSAwf/lGmDZW2jZUreQhsZ4KZCRCgXHYwM5vmxzIUCVpNqT7eGd2Kj\nwpmYPSGkSbfg3XjwiDFw1n9ohPwUrqh7xGbzZ+pt1vvyqizqCn+NINcEB81u\nZlb3yOY0lb2D+H7yJTaC9g/pjSbjp2CVjP3kJZN7ftzztOWh/XtyWP+2lNJX\nqBLwQ43rjfdv+yAwjHKAYBe4b4r8yvyo0qfV0lHW+2BuYyumiDdiLifEWf+3\nkiEi\r\n=M4k/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC7Ixt00DYKSPhpEA/Gnr3/aJ0PYCphF9eIOHlIupkzxAiAtM9sJvSrh+nozyCDhhcUv0ObiV7TXhLUVVuicmB0V1Q=="}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_1.1.0-beta.0_1643011942822_0.8658409877208577"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"1.1.0":{"name":"sonolus-pack","version":"1.1.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","eslint":"^7.32.0","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^4.0.0","prettier":"^2.4.1","typescript":"^4.4.3"},"dependencies":{"commander":"^8.2.0","fs-extra":"^10.0.0","sonolus-core":"^1.0.0","zod":"^3.9.4"},"gitHead":"b220c5c8c029252650c1dc79d761e359a80dd061","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@1.1.0","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-GEEKIkPg3sUtFozR7YMmR6lc25xY6RhFYuVFpgmV9AK/8XXToDuin0PARa3oOlcGiDe7xbwWyKqOuEAodHd/eQ==","shasum":"71c601753832de19f376c62729dd30b070e919ed","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-1.1.0.tgz","fileCount":16,"unpackedSize":23391,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh8o7OCRA9TVsSAnZWagAAa+MP/2BL98ogt/j8CK2qZHAm\n7eCxEYQKY0yCYUKGVXOFrqwAwLnjziGQmNHVxzQjOWd+6IxqOyN3Co4O/Pfm\n2W4ZGAoIfEIP+J/Dp+AMdjH4D0kqpjly/a+CIETo2nEUlISdt6V13dnPIHus\nfNBGyBvBvaIU9tYfKzOkWXMOtAU6TB2J0GYqBRhGMKRR7OWGNqvLuXxaC51H\nse4F4rScHR34WpN0PsUDhCbei5dGhHrROk/rtT47dCeK9CKlR6hCwFEw70B7\n/vYutEHwY0WObiK/giCjpvxYWc8dwX4G7RteaQ3VUS9vAMZYGsWWqPsqLDV2\nPHAt3TqBYtAaAVsv19S9OxzduHuU1gl2EJmsLDOxKciSl2qYrXvyqB4rd6Uq\ncsUrhJXsrBMcaCvaw3jfANSVi1BO/Jknh+ZNsGnzSDjm59zj5epcwHWDBJl3\ndAkBGB1iBeXS1WZkFLLWoIAi9DXif80tAK+d5S1QnWmAa1m91duXI1UzxkTt\nnFp2PngH4sfkzE5aDdFbrJExq3kzvyav9iajf9WbNpk9mREJpZrpZ3kC/3c6\nQFFF70Au9/e95g/LBlhq3StWBWT32pM6snVPtYxwBYKXK/IWiX/JilXVmW/R\nlRiZDTqjoZHUi68vTTTgqSxK8QZAA6l1vZwS/ljtw2G3pHCxG8lYzJczu/Sx\nYvSI\r\n=z/sN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICXEc0b2o/FlYMTZPSU8wIezQLphroagyLJhMhToz34mAiEAtxb8eWbsz807XdXZQAN0LciWgxAfep6nOfe7ebRDCBk="}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_1.1.0_1643286222688_0.7710670371825157"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"1.2.0-beta.0":{"name":"sonolus-pack","version":"1.2.0-beta.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^5.12.0","@typescript-eslint/parser":"^5.12.0","eslint":"^8.9.0","eslint-config-prettier":"^8.4.0","eslint-plugin-prettier":"^4.0.0","prettier":"^2.5.1","typescript":"^4.5.5"},"dependencies":{"commander":"^9.0.0","fs-extra":"^10.0.0","sonolus-core":"^1.1.0-beta.0","zod":"^3.11.6"},"readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://wiki.sonolus.com)\n-   [sonolus-express](https://github.com/Sonolus/sonolus-express)\n-   [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `info.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zh-hans\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Folder Structure\n\n```\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           info.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           preview[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           {clip}[.mp3/.srl]\n|           ...\n|           {clip}[.mp3/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n\\---engines\n    +---{engine}\n    +---...\n    \\---{engine}\n            info.json\n            thumbnail[.png/.srl]\n            data[.json/.srl]\n            rom[.bin/.srl]\n            configuration[.json/.srl]\n```\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `info.json`\n\nLevel information.\n\n```ts\ntype LevelInfo = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: Use\n    useBackground: Use\n    useEffect: Use\n    useParticle: Use\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype Use = {\n    useDefault: boolean\n    item?: string // name of referenced item\n}\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `preview[.mp3/.srl]`\n\nOptional, level preview.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `info.json`\n\nSkin information.\n\n```ts\ntype SkinInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `info.json`\n\nBackground information.\n\n```ts\ntype BackgroundInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `info.json`\n\nEffect information.\n\n```ts\ntype EffectInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\nClips in effect data should simply be `string` that references the corresponding clip file.\n\n#### `{clip}[.mp3/.srl]`\n\nEffect clip referenced in effect data.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `info.json`\n\nParticle information.\n\n```ts\ntype ParticleInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `info.json`\n\nEngine information.\n\n```ts\ntype EngineInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `data[.json/.srl]`\n\nEngine data.\n\n#### `rom[.bin/.srl]`\n\nOptional, engine rom.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/Sonolus/sonolus-express) and [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"190be7fe45a4a0b45d8e6eaf47204d0b1a4d7436","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@1.2.0-beta.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-7jTiU7dm4RvALnsDtwuwlI69LOagBojBgt1KTQ9sWHW8ClU5o2HSGVmbMBZ0Bw59IMNf8fw/IdZTCGdAACS/MA==","shasum":"4f904c53ecef0310850a09491f6ae5da30d14fbb","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-1.2.0-beta.0.tgz","fileCount":16,"unpackedSize":23856,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiEw0rACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrVMA/+IcXyC3aKlsQ/cYQZW00LBr20aR8Ik2zsYIpGmqZRY8neGrnV\r\nSReQif5N9Y8jrX0pdNqLJNUCDyc5QuLcF7L+WGL8T/I6+lR5/Roq9o+1V/Xb\r\nkvOTfFHLdWnGl4dPg0eWwaa76rUi9Ic/KrsVgVaAr3xxAproBUXbrT5ywAAN\r\nnq1aUFD7cNSA/yU4fyyuMXs1RFkhvChPCo8sKQb7d8lyVEPc/zBvoZhLXAVS\r\nAmnWYl627r8L6kX6xJo4hwTB7l66kDKCXWwgzS1E85fhSnKiTI1Mefth9Bb5\r\nKOc2OSWWlcHZUsp1VMLpgJkxoE4Ra6PCoYx8xL5XlPjLafthg2yQk88XzdxY\r\nQBT7gyqlK/qoFN81mE/I1mTRfh/cuRYmeCo791P+XlEJMIdaG6L4vEiMVYgs\r\nqXoYDTUQELQowLzv6GglMoagUcAD0gdUpLpg6gl0tLiwH9BjcbWZo7BRF+Tt\r\nWsR/bOfUPdouUtjGgJsoOsK/Azaw8j8J1EK8AMsoNcDuk9rTn5dk9cfStmen\r\n2in4l5FzVJQaxOtbOVubZCAUmCPJg8GfQGk9bZfmmlDwK44K5ZtgMoEPMFpy\r\nkjMmvqXL0M7az2kUVMvPyhrgdWD8uC0Qj5eb7Uww6QfLLNduFUL3HLBf0nc6\r\nWjgMMUPYhNKrJR3D7qTmeFOTVB9iZLLPUPk=\r\n=Tro1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDLAVi52alI1TpBOGianr7WLk9ar8Td1yy4ZmRFwHwUygIhAJK8jxJYCNak9R4m1hbzDSNDH46n/lP41SW2XrW+fvxU"}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_1.2.0-beta.0_1645415722961_0.8726067569890941"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"1.2.0":{"name":"sonolus-pack","version":"1.2.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^5.12.0","@typescript-eslint/parser":"^5.12.0","eslint":"^8.9.0","eslint-config-prettier":"^8.4.0","eslint-plugin-prettier":"^4.0.0","prettier":"^2.5.1","typescript":"^4.5.5"},"dependencies":{"commander":"^9.0.0","fs-extra":"^10.0.0","sonolus-core":"^1.1.0","zod":"^3.11.6"},"gitHead":"7d4afbe8e4af0a0cdb0d60265cb99b90731c3f9b","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@1.2.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-Np+DSca+q3X+zDxtCBZnId5zAt1fyjHi2jLdq9/DsAVGi4oLG7JpqBGxv4++wS530YXu1W8q/XHMykrThdBmqA==","shasum":"2f13f69b55f5f858ca6fe237d10171b317b9fd81","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-1.2.0.tgz","fileCount":16,"unpackedSize":23835,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiFl2eACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrjTA/9HAKFOWnoD9s7CbVb0c2WZdenFCjaxIxxbNoPE2TXvdZN2041\r\nMSVDlVYVK/lcae3zLF4mruxMDJ1vsYXZgTIp23BBVPCqbMOz7N7NyK1Ay/dN\r\nXcIoIlSnwvsRzfpifJ63BPc4gC1QH45DeSFJhhKZhh4h4RN5YKuAUhxLMpEl\r\nkCCFKJl4rT5Rfgqtz6DHP91lpqBhsTljDyPU4BUnVipPy0qxSa1Ql96+rMN5\r\nKEEg0jhe6TH/slWWH34RxUsY99KVJrmVzNo7+rZzfWQx2FivswKg79GisG2t\r\nIQas/2ko4jxfLgt9YG0ClRHOK7TrXTwMFJDyCyby8KS2g4LP3HjQhCB6hv3X\r\ngXP8gW32rgivhDJhZSNcMWzPvUaBlYYxdWJH0i9PKs7bGCp5PNuQllSObIc/\r\nNDu9+V6tvgIVVehhY/mZ1It2mFVSuHHZnBbqXxrG3W7NRU3G3Eo9tBkAD9q5\r\nr+kgnNzlwIm8QxWIeO1mtHJN2qIVhg1Wa5hbFGMD4WdRYBKy9qdFR1XQkNwa\r\nZdehqV7FQnirLBhaHgDu2PxZZDYTTtDSnonlWegUMpoAanJDsr1IruLnaEcu\r\nZ4ttoAEe68rML93Sf8FaV1pypwKUEFz6wcTYZzJJwVPJuu/JogejVjCrJp8a\r\nHRNE4p65lJFbKQHgq/zal3BExvqMGq/mnZE=\r\n=Cnw5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCEjwKRG76wbtmQSM9nlCZT12oqbiBQDiYODbHHptCAaQIgeMuvLg19eKxvYj8Tp3d5gbQZcjqOXOmHSZawIOQtODE="}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_1.2.0_1645632925881_0.44561739269908185"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"1.2.1-beta.0":{"name":"sonolus-pack","version":"1.2.1-beta.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^5.12.0","@typescript-eslint/parser":"^5.12.0","eslint":"^8.9.0","eslint-config-prettier":"^8.4.0","eslint-plugin-prettier":"^4.0.0","prettier":"^2.5.1","typescript":"^4.5.5"},"dependencies":{"commander":"^9.0.0","fs-extra":"^10.0.0","sonolus-core":"^1.1.2-beta.0","zod":"^3.11.6"},"readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://wiki.sonolus.com)\n-   [sonolus-express](https://github.com/Sonolus/sonolus-express)\n-   [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `info.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zh-hans\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Folder Structure\n\n```\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           info.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           preview[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|           configuration[.json/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           {clip}[.mp3/.srl]\n|           ...\n|           {clip}[.mp3/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n\\---engines\n    +---{engine}\n    +---...\n    \\---{engine}\n            info.json\n            thumbnail[.png/.srl]\n            data[.json/.srl]\n            rom[.bin/.srl]\n            configuration[.json/.srl]\n```\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `info.json`\n\nLevel information.\n\n```ts\ntype LevelInfo = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: Use\n    useBackground: Use\n    useEffect: Use\n    useParticle: Use\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype Use = {\n    useDefault: boolean\n    item?: string // name of referenced item\n}\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `preview[.mp3/.srl]`\n\nOptional, level preview.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `info.json`\n\nSkin information.\n\n```ts\ntype SkinInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `info.json`\n\nBackground information.\n\n```ts\ntype BackgroundInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n#### `configuration[.json/.srl]`\n\nBackground configuration.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `info.json`\n\nEffect information.\n\n```ts\ntype EffectInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\nClips in effect data should simply be `string` that references the corresponding clip file.\n\n#### `{clip}[.mp3/.srl]`\n\nEffect clip referenced in effect data.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `info.json`\n\nParticle information.\n\n```ts\ntype ParticleInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `info.json`\n\nEngine information.\n\n```ts\ntype EngineInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `data[.json/.srl]`\n\nEngine data.\n\n#### `rom[.bin/.srl]`\n\nOptional, engine rom.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/Sonolus/sonolus-express) and [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"6d50d343b2bcacf0489e1d2a30349d3ee1956189","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@1.2.1-beta.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-trjjRC/NzX6w3fibDy828ud5vl/XGmjw4PcGaUunw5XGbW3oiaPOm+Rl/SRtIh16n0YMcumC9v0lenIwc0GM5w==","shasum":"7519a8bc28d705c168374ada622ab453dd8a30c1","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-1.2.1-beta.0.tgz","fileCount":16,"unpackedSize":23948,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDK3bq+xRMuy0IwnMEO94naRrfqAUFsZthSlqjOiyNKNgIgBzOO7Dh/ka2WNBAFDe4aC9Ckn0lfnlfYIoqzCkm5rOI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiY9AQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqDtA/8Cs7kk8LWaVWVvEewGI0WoXEvW4n9iXKLXIT91j2vOTvnXS+C\r\n4B7ISL8zwJlL2ZkfUsTHbkPyI7N7lMykC2mfb8t9wNWrTNymsARzDHEc64f2\r\nb7uR1Yi3ZcYm0xPrfqYOzyaxgwDyvE+2zPp0dGWsHT3LMcLFC0rAX3YuhNiX\r\nKgzZQfBtd1AWxeY2kGnl9ukJN4JgqS4RQvZpXaB6KRQgyIRzbknRQ5rN1vpo\r\nQeEJWBCVJGc71OZBe1qdOgGAhpKsRtVJkM5AiuwNVT1lj95m5bM+Is+DwRkJ\r\nlwqo62/Avs+ZsA/K6eh1TP+LCtX26sdwIGiG9oDCCzM+IN7d+aE+7Yth1bCf\r\n3FRMWYaD+jaMdGamFfV0z7Kw0K3WdwH/Z952Q8gsTqnE6G3MXfsjZsUgDVUn\r\nqc3nmm7xvpp3vdEjZis2Ss++QNB9yYN1QU2D1nz+vz4Bp1F3xGgqO58TUb7a\r\np7X64VrAqNz9dllae2hqW6rVu9sK2XxQ50xMgKRuSNsSRKar4i7As40N/CHc\r\nnQSDNGIE6oy2mATAYuS3a4+pK3pSNhowMM1H3Tl6c/m+0IpJoZudqU2crPCp\r\nX5MK3YaP353wMtKzaF1G0WtLGxnktXzgIxIvQATtiEnlh/Av1/nCnTHS+XOt\r\nb/ZQ56sj3+amXKoRjbEguzA1JFFJPIIZBbc=\r\n=juVo\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_1.2.1-beta.0_1650708496610_0.8537421501013971"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"1.2.1-beta.1":{"name":"sonolus-pack","version":"1.2.1-beta.1","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^5.12.0","@typescript-eslint/parser":"^5.12.0","eslint":"^8.9.0","eslint-config-prettier":"^8.4.0","eslint-plugin-prettier":"^4.0.0","prettier":"^2.5.1","typescript":"^4.5.5"},"dependencies":{"commander":"^9.0.0","fs-extra":"^10.0.0","sonolus-core":"^1.1.2-beta.0","zod":"^3.11.6"},"readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://wiki.sonolus.com)\n-   [sonolus-express](https://github.com/Sonolus/sonolus-express)\n-   [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `info.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zh-hans\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Folder Structure\n\n```\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           info.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           preview[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|           configuration[.json/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           {clip}[.mp3/.srl]\n|           ...\n|           {clip}[.mp3/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n\\---engines\n    +---{engine}\n    +---...\n    \\---{engine}\n            info.json\n            thumbnail[.png/.srl]\n            data[.json/.srl]\n            rom[.bin/.srl]\n            configuration[.json/.srl]\n```\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `info.json`\n\nLevel information.\n\n```ts\ntype LevelInfo = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: Use\n    useBackground: Use\n    useEffect: Use\n    useParticle: Use\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype Use = {\n    useDefault: boolean\n    item?: string // name of referenced item\n}\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `preview[.mp3/.srl]`\n\nOptional, level preview.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `info.json`\n\nSkin information.\n\n```ts\ntype SkinInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `info.json`\n\nBackground information.\n\n```ts\ntype BackgroundInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n#### `configuration[.json/.srl]`\n\nBackground configuration.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `info.json`\n\nEffect information.\n\n```ts\ntype EffectInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\nClips in effect data should simply be `string` that references the corresponding clip file.\n\n#### `{clip}[.mp3/.srl]`\n\nEffect clip referenced in effect data.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `info.json`\n\nParticle information.\n\n```ts\ntype ParticleInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `info.json`\n\nEngine information.\n\n```ts\ntype EngineInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `data[.json/.srl]`\n\nEngine data.\n\n#### `rom[.bin/.srl]`\n\nOptional, engine rom.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/Sonolus/sonolus-express) and [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"87f410ad0cea90d5f59ce10740ba480e06e966c4","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@1.2.1-beta.1","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-jp+uUfntzMLoEHMCD9vdLGDptdtU83N9svxv+paXd7uc8vTKAgUmuMchuZGLYuLNdXh4X56WsYIpkbPsCxcBbg==","shasum":"69fb653cd452ae8c142be855fd399fcf83670643","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-1.2.1-beta.1.tgz","fileCount":16,"unpackedSize":23955,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDZfpWk6CCvXTdPJfdhjvviHrGktSTwrvP35SutsLLLiQIhAImwQSD6mYGRwZ2MQ1svHz6O4BSZ6xSRBR/laTpqznZC"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiY9KpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrPbhAAip79cNVpe38VIZejo6nLEIMS9IzqcIlnO2dsWntQk2xh28+E\r\ngnVEaRpLWjIUO4ejtWpRk0GvjnJi5+NICbh+d6tzKuDaKmYqEdOmfg4IBRfy\r\n3v2aF+bpAZe13ipRex/6aZCV7DWoStmY6WlKEDuXlFfKc+00Dbi4KGN+6PKC\r\nkGAAKcWYrvOe4AqTOiBQAklMGhfNYU0e1CULxpqeZpLBQDp6aG0W/MocvqYb\r\nrQMFkKfatsESl+O8VEHXBUmLwvfyoIX/BpUMVU5Z2Fu3KQ78h3F/xBUeYGT2\r\nED3Cb029PRyYArnq8tM6je8LfoiDh9xC3Fi3aLCSnaqyGVqhhClKhAx3/a3S\r\n+1Ozry7NcOr2JsbjwD99sQDbbv9k6lyBT2pvCA327u+vAEvy7euc2CmY/3iO\r\n3d5YZmnkHVX5pl5FkfSzp7jdZ6CsgEUOQn5TxkSOZHqGn/58059xq9FkPThl\r\nm7LqTGcWxlsJjYGTxqDBJMBHms3yrYxYIHjlYyOM4NuUBjb5I3uit3XvOHDx\r\n3xsQCaxqW4F9L4BDkSA4fjUR4q65HGecd57Szy7BrDxttudup42oTBx8T3il\r\n7NJ8YumYkQt8/Gq5syMiB0vgoIC3v2GhPaeO6X12xp0EATIB6/e8CYIcLEnr\r\n8nZTl0H1ECTCTZwu7ZxEm2wPt8nbJJzQIdw=\r\n=6Dp8\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_1.2.1-beta.1_1650709161761_0.024720144075135453"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"1.2.1":{"name":"sonolus-pack","version":"1.2.1","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^5.12.0","@typescript-eslint/parser":"^5.12.0","eslint":"^8.9.0","eslint-config-prettier":"^8.4.0","eslint-plugin-prettier":"^4.0.0","prettier":"^2.5.1","typescript":"^4.5.5"},"dependencies":{"commander":"^9.0.0","fs-extra":"^10.0.0","sonolus-core":"^1.1.2","zod":"^3.11.6"},"gitHead":"fa4932e710e40bf52b722f167e65a5b3e86dc731","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@1.2.1","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-4Pj+PsMv1eRntNejeMjl6Dx9AXBaT5pR74sNB8HE180Clfu235jAkpHTvYfM78sR1JY3cG1b4hOC0ifOhgNy+Q==","shasum":"f530577d3dd5391eb759d89c7734643cc3b7defd","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-1.2.1.tgz","fileCount":16,"unpackedSize":23934,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHX7rmpSYPOydIRYILTfAPQjXODSryB7ZfvW2rDW643LAiEAnYhIlxS5KKDIu8J/MFJuQqFisIf1tFHC7tGOGdVyPnM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiZOLMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqG/A//ZoMRwjGj2DnXbJezsp28uVY62WzkPeTSaphJ5byxnVwYGMqR\r\ni9sR0cUKvf2mjnmVbuOBolV47GNRj3CVQqwuId0wJsEXsPV4sylIV1q6UMi5\r\n8jLknY/G/x+sQJsDkQyauaIuCt9X+oK6z6vMDDlG3dX0tG4oIzD3XjfTCeI3\r\nEhMlnerCocP/v1orwo3f3sXmKYnPb7KQteyKisbDWnV8no3uNY90gMzSbMQa\r\nVfPdNc28y+lzZ87PMGgMj8pa2e4Km8Pu3KI1bOjwo4yNOEvm4Ne2sCi/saJa\r\nuf3BHYz0Y5P0JiMCVheqf3/wpZwNjZwc+LqS5G7Cl1YfHlGNJhUC9pBkPaf/\r\n6Gz2ljY+sSKwKL2qYlyNP+7GzOeTSI3cXLIQg+N0KzuKlA+w0DYxOy6ZyY6s\r\ngD0R0GAOgsM8bHY1UW2JdC1NOVizx5gAsd9Urt8sxLwItn79FZaOxkogndSL\r\n/ze4QEW1ldyhPja/jUQU4cGPhFhqjYS0Wk6fcOXb6/Ef4Nfc1XBobSh9Wurh\r\nawI8ZW9e/gfSI7Bbj1bZ/HsdwpC/yv0G4b+4FdT0uHUXxSochTK/olJZpQTH\r\nqo2rM8MbfbshzOmNR4xfgPAUpgBGehuvsMMlV3Nai4Ufroa3g4sDn56osJ4S\r\n8RIUE1S5QcKLM91pn1zgukyt8LUdtX86zEU=\r\n=eiXW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_1.2.1_1650778828521_0.2866446599183934"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"2.0.0-beta.1":{"name":"sonolus-pack","version":"2.0.0-beta.1","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^5.12.0","@typescript-eslint/parser":"^5.12.0","eslint":"^8.9.0","eslint-config-prettier":"^8.4.0","eslint-plugin-prettier":"^4.0.0","prettier":"^2.5.1","typescript":"^4.5.5"},"dependencies":{"commander":"^9.0.0","fs-extra":"^10.0.0","sonolus-core":"^2.0.0-beta.1","zod":"^3.11.6"},"readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://wiki.sonolus.com)\n-   [sonolus-express](https://github.com/Sonolus/sonolus-express)\n-   [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `info.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zh-hans\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Folder Structure\n\n```\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           info.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           preview[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|           configuration[.json/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           {clip}[.mp3/.srl]\n|           ...\n|           {clip}[.mp3/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n\\---engines\n    +---{engine}\n    +---...\n    \\---{engine}\n            info.json\n            thumbnail[.png/.srl]\n            data[.json/.srl]\n            rom[.bin/.srl]\n            configuration[.json/.srl]\n```\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `info.json`\n\nLevel information.\n\n```ts\ntype LevelInfo = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: Use\n    useBackground: Use\n    useEffect: Use\n    useParticle: Use\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype Use = {\n    useDefault: boolean\n    item?: string // name of referenced item\n}\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `preview[.mp3/.srl]`\n\nOptional, level preview.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `info.json`\n\nSkin information.\n\n```ts\ntype SkinInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `info.json`\n\nBackground information.\n\n```ts\ntype BackgroundInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n#### `configuration[.json/.srl]`\n\nBackground configuration.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `info.json`\n\nEffect information.\n\n```ts\ntype EffectInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\nClips in effect data should simply be `string` that references the corresponding clip file.\n\n#### `{clip}[.mp3/.srl]`\n\nEffect clip referenced in effect data.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `info.json`\n\nParticle information.\n\n```ts\ntype ParticleInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `info.json`\n\nEngine information.\n\n```ts\ntype EngineInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `data[.json/.srl]`\n\nEngine data.\n\n#### `rom[.bin/.srl]`\n\nOptional, engine rom.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/Sonolus/sonolus-express) and [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"0d6ec50b3a55dc1781abe923edf5e04bbbd2fb4e","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@2.0.0-beta.1","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-ezhGLLX9Lw1yOCblti13Fa28IvcNCe13dvsFRLCE9xIrOYXMF99/9QUXvQ8VypoZcBh10niUahp5BW+o/sDLmA==","shasum":"a4ab0ca39616966fa4b9b1315b9800a6b0118f4c","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-2.0.0-beta.1.tgz","fileCount":15,"unpackedSize":22867,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEYNuoQmWa3z4jdHN34AECl7Tgxw97xj75otolV+UwKjAiEAm6DJAnf2NQi9Uk40mcbqFMjMCe8KiikrAMq/d9NS8VA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiyHy5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo4CBAAnHoQo9POWHrIaPYNDQYmB6yjc8xOTWwaVC6/bMLG7X36Z5E/\r\n5neJOlwHDTmw5Dmt5p3LyMh7LxU4M6JQ4uuyLUazAPwyZ3El3X6acdDGnkDt\r\nk9ctwSZcdKfx2fyCB9CfeYrjzOruf/zwyjHhittUeIy8UNG0xTtvB5YIX2hL\r\nDzhX4fD5x7EX/n82vKdVX4divUBASvEcr9EJpbLFqNn3m7PUYGT5WWf9yT0H\r\nbmcBN/t+dXdr0e9+RpyER+pwi6Z4S5i0KThHCaUXffUJXYpPHua92CYS1c2O\r\n0gDrv7OVvOUIxBGNxH9tPfa/87UZTYrrtpscW2ud8MYnDm2NaybQfEKgpDUp\r\nlsyriOmNc8BPt4lGfNtecytlBGKpXQF8RBm24qT2N9alvCw2Ph5yD9G40mgA\r\nJNwcToZydSWHeKa3LSXy2WaU2jfT/UMJgyBq9TUtNIEjhfm44LIz1WusCDi/\r\nTAghGfbivt3AvXmEJLsZJ6JtbfuUYlxV3W5nvjhl2cgj3dCjtPgWIBZ5lSRd\r\nxnLssqBBlKyutkyZ+SDS4OW2hL8/Opg0129bFxLPwebdUHjnznOHpIxTYCnx\r\nQfme5cnpRSk8+3b2Df8gltygWxY2BTvyOWayMrx999mBX8xXRZdsFD/9yKDD\r\n9isB6zQVbaKY74yCSXf7n5okRyq93y58yX0=\r\n=/Tvt\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_2.0.0-beta.1_1657306297639_0.9102873271283527"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"2.0.0":{"name":"sonolus-pack","version":"2.0.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^5.12.0","@typescript-eslint/parser":"^5.12.0","eslint":"^8.9.0","eslint-config-prettier":"^8.4.0","eslint-plugin-prettier":"^4.0.0","prettier":"^2.5.1","typescript":"^4.5.5"},"dependencies":{"commander":"^9.0.0","fs-extra":"^10.0.0","sonolus-core":"^2.0.0","zod":"^3.11.6"},"gitHead":"2d18af91722716c509036ac3c9e7634c66d0dff1","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@2.0.0","_nodeVersion":"16.14.0","_npmVersion":"8.6.0","dist":{"integrity":"sha512-9mzud9ptyjhbCcrC3261EXoDsYbLNQcbvUS4IFsTwDaUbn+nFBsM1eABkOZU+ehuWgrwShO+tOku+OuqNpc2xw==","shasum":"4f26cc36d3ebe01a34a925c906b581f2dad37dba","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-2.0.0.tgz","fileCount":15,"unpackedSize":22847,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCv5VCfEqF/4QoCT/7itX+3oVSAfsLbvfMSofk9ViysBgIhAIz6D+Z5/HYGAmUziTZ7qPPLjpKM/7rIQRSqh+Odp8em"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi8ipYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp6rw//YPrP4E5f6nn3AVphSwjwUxrnOvG1g2HUpXO93VWIUrYT+3Rn\r\nRC8ubEI6pxKuV7kvf9JWC18Y3yaknj1QoPLvBhBb6HC+1yRR+VK2ZX6/sBIM\r\nDhXihNtaRsMNXevldI88/xeiTmPQ/osmKtSvqOyI0AGn3BgTYh4RzNw3dJIx\r\nqbdNN2Dj3NHPTGsjyPGyk2gZNys/j1OeoPJu246qddcgs/g3prsXKAs2tWmr\r\nTncGAJZHBJMzBeMTGIZOoEGk5GQfau/tuHvJQC/SlSkzA84oPNLLVtecPBHK\r\n4ldYakBrcz320R8whke0tzOaHyhxXZkj8ccYN1xjBVC48v9NqqKQSxA7TGrj\r\nKypOEluNcv8wTkLhLsuyGOxguKE1L5A7NfQrO2sQmEWvzgTZNKHw4jA0dNPP\r\niQyy701Dc27KrfiqpWrx/CnLtdZssW6gh6rYwRBt4kSs4lwV5LhPLbUl+lPR\r\nkvEvK6BNJ59ih4T6wFH5iFvJFMo8Em7MBk8jgdWUujekyVeCX1nv+mJlyhRm\r\nsIp1qe7XrYdApy0Ydq/UeDyntI5mx4RK4RBVihROfkeIskInXrnbekmeFsNe\r\njTSiX/lAVJauX9kSw2nYjdSVOx1mLya2G4asvs+/aBEBQHyGtkMt4dA3nv02\r\n9mwgNGYUiHLvS5Gklq5sTLx7sF3/oDUUQFA=\r\n=6MrC\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_2.0.0_1660037719834_0.3897027991368234"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"3.0.0":{"name":"sonolus-pack","version":"3.0.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^5.12.0","@typescript-eslint/parser":"^5.12.0","eslint":"^8.9.0","eslint-config-prettier":"^8.4.0","eslint-plugin-prettier":"^4.0.0","prettier":"^2.5.1","typescript":"^4.5.5"},"dependencies":{"commander":"^9.0.0","fs-extra":"^10.0.0","sonolus-core":"^4.0.0","zod":"^3.18.0"},"gitHead":"1fdb8e547e40d86b385645011ab04014842a8663","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@3.0.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-Jx2n0zCUzek1vWMSkZ71w4qMCZhNxI2g0Wv+He01JqIHubWoutF+n0gjcHgTcUwnbJcQklK90oAmcpvbKERpiw==","shasum":"d7c09fd6163408c8cc77e04467b197b4f2595cdd","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-3.0.0.tgz","fileCount":15,"unpackedSize":22970,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDmydxsNiN94ZHO443GN0Vp2zR3UEhenIJzLMyXX/4mWgIhAMEBfk2NcVY6PNcGmhgJC92IlMUIfGGXHWdPTpYazpFq"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjFfqaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrJNA//elhPAk5978D2QSbDW+/3Aihnf3HPc5BbqTIqpOEqQzChW/KS\r\nnhsNp6MgJ38y5Rs4iopqLjv25lwBoEp8NoXrAkVULdEfwuPUwZxp+dZqf/g4\r\nSzaFSag3KNbhsCd7DLvLbxrMRo6dY+aGpRgr5/AMzjD6DysbcZls9HIOO7DM\r\nLzQoUaBYcT1wkqYgRpJijyrkRvXufO9iu6TrXwQZrRWAvbWillxFkCEIx91P\r\nNwK+ZpdoLA/7yRVrhkpmOoD2ZLfnKvK6i+NwyzDqLazV5bAS5/bFPbPo7wy0\r\nntOadCpfjIxS7aoCA+tC3cnqV46KTP+wNvRo5eUNZuXG3i7FWJqMs3EvF8FL\r\nqz4+tURokVmi1sysqHWoKWJlE/87/fTdc8s93GOUQDSn4tbIUvJg3s1i+FEM\r\nyc49aCCyfwW8rpEa2vh/KqDI2EIJtTE/xWKq1QFNBFmiPNiKrK4qnVB095qb\r\n0wAWg2fWVcKp/OSf2eT8WUPGbCLEDk5U5VHDfvVx7ZFV31jJe2bIFk4Sg7lp\r\nAeW5Qaygi5jyQvixDMT1uycGvzVXoqAjoBbdMs7hV0yae+1YsaqqIweg95EU\r\nU3XN5w82Qg2xM8ziSScdYkdHkThpeGBtRtA3otczEYJmf7PwhpLmoCI/FMo1\r\n8Vr/kS+gpvoudaAp2Ovu2XkjU5jjC/6wsxI=\r\n=nchX\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_3.0.0_1662384794704_0.01593353428694444"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"4.0.0-beta.0":{"name":"sonolus-pack","version":"4.0.0-beta.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^5.12.0","@typescript-eslint/parser":"^5.12.0","eslint":"^8.9.0","eslint-config-prettier":"^8.4.0","eslint-plugin-prettier":"^4.0.0","prettier":"^2.5.1","typescript":"^4.5.5"},"dependencies":{"commander":"^9.0.0","fs-extra":"^10.0.0","sonolus-core":"^5.0.0-beta.0","zod":"^3.18.0"},"readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://wiki.sonolus.com)\n-   [sonolus-express](https://github.com/Sonolus/sonolus-express)\n-   [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `info.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zh-hans\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Folder Structure\n\n```\n|   info.json\n|   banner[.png/.srl]\n|\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           info.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           preview[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|           configuration[.json/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           {clip}[.mp3/.srl]\n|           ...\n|           {clip}[.mp3/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n\\---engines\n    +---{engine}\n    +---...\n    \\---{engine}\n            info.json\n            thumbnail[.png/.srl]\n            data[.json/.srl]\n            rom[.bin/.srl]\n            configuration[.json/.srl]\n```\n\n### Info\n\nResources of server is located in `/`.\n\n#### `info.json`\n\nServer information.\n\n```ts\ntype ServerInfo = {\n    title: LocalizationText\n}\n```\n\n#### `banner[.png/.srl]`\n\nServer banner.\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `info.json`\n\nLevel information.\n\n```ts\ntype LevelInfo = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: Use\n    useBackground: Use\n    useEffect: Use\n    useParticle: Use\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype Use =\n    | {\n          useDefault: true\n      }\n    | {\n          useDefault: false\n          item: string // name of referenced item\n      }\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `preview[.mp3/.srl]`\n\nOptional, level preview.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `info.json`\n\nSkin information.\n\n```ts\ntype SkinInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `info.json`\n\nBackground information.\n\n```ts\ntype BackgroundInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n#### `configuration[.json/.srl]`\n\nBackground configuration.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `info.json`\n\nEffect information.\n\n```ts\ntype EffectInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\nClips in effect data should simply be `string` that references the corresponding clip file.\n\n#### `{clip}[.mp3/.srl]`\n\nEffect clip referenced in effect data.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `info.json`\n\nParticle information.\n\n```ts\ntype ParticleInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `info.json`\n\nEngine information.\n\n```ts\ntype EngineInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `data[.json/.srl]`\n\nEngine data.\n\n#### `rom[.bin/.srl]`\n\nOptional, engine rom.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/Sonolus/sonolus-express) and [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"17afd11d5c339758cad6c99e261cb738db38d63e","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@4.0.0-beta.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-LLFN1j2srM/6Dot2CrJx06lfqwQyvnz8xa/hWIrpWnHamboA5UUmWZS91wNKghQGZvtjosTNv7piQ0tGRkKo7Q==","shasum":"446c60964e9c3c7ca694e649104cc0a8863132ad","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-4.0.0-beta.0.tgz","fileCount":16,"unpackedSize":24062,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA9g96vkyDtbpxCy+gq2L9CYHR42duV9BkDuf+3L7EiOAiEAy2jMeG+A/C7Q/ZLcdLWCz4whi6H0nLkiSFCogClNpI0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjG/I9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmquhhAAmViEDeBDMKT0QbVPIjqsKx8zNMJvW7edSktnKqKEUPsNVvz/\r\n73PgjauZnUW5nVmYRNjHUD2fyOUKCirk/PD4cOuwY8+WDepRHPDXZYXy7wnd\r\nyn73mz2J+Ykn1HqoNqnf2CBrQajpn4r2zAGpoFXsOpRPw+Xmp1n8asp6w+Vw\r\nsJgC3SHMMvadCvmacIcdT4BPKonDBQYwu5yV+peTJ0omgPgbdCeKxIf9+Tql\r\nrWGn2cBHvNQ8CJ2L/faOnI4sQPoXDNKmrUoku9SbShL7uW6flMpryKmnXwXz\r\nCGOfkxMatM4PYELHECyutvToqKCzPmnKLZF5ChT7HvZiDVyL65yXqV+yuyBa\r\ndXATmY61VByMH1S/BVytPajtpG4mzB0fr6KZTSD4yfqcQJCrnteCzjI4cNmC\r\nrLNVVVJjN6WDCrfDUUttWqTOKi/L/fcaIxGdrQ2G2HPgvKON4jtAAszLt/MS\r\n8dPE3EXKX75vgihRJiMD6d0fl0dKggSHvL1XtvdA120nCpjozvTvYcMvQWYT\r\n93sXTEdboY0ZT+CL80f+DKlgTUFeCodmy3wDhVZseLPFcvsV4onrqpY5otFu\r\nLkhnvdehKHYBrE4wu2flxdo6723/+i2u+TFrtV0MLdOws86Mxg91DTjQs1OI\r\nIS9Ff8mhhDD5BX9UIoT4sMSaqXr5M6MdCdE=\r\n=Iic2\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_4.0.0-beta.0_1662775869323_0.9621979454987113"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"4.0.0":{"name":"sonolus-pack","version":"4.0.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^5.12.0","@typescript-eslint/parser":"^5.12.0","eslint":"^8.9.0","eslint-config-prettier":"^8.4.0","eslint-plugin-prettier":"^4.0.0","prettier":"^2.5.1","typescript":"^4.5.5"},"dependencies":{"commander":"^9.0.0","fs-extra":"^10.0.0","sonolus-core":"^5.0.0","zod":"^3.18.0"},"gitHead":"4df70c57c875c36cbe2672c84bc6a4bf7264abf0","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@4.0.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-3g7LjmEK7sUG1KZ6x8HWTonqeg6bAE4w3jd+TFe35ClC0KW9oAjWLqEwd77Z8iVPlPT9PQLqfllXpjMKP2gtBw==","shasum":"36292771573b4ef5de08cd4001fb15b5fba271ca","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-4.0.0.tgz","fileCount":16,"unpackedSize":24041,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGDQtXE2BMmdPV8ObjnwBkwHLuJiZPhbVHbyoHrXxt0qAiEAt63Nzd901aj0E6nWPl5SnoCmGSx4E2CMvb6KubCbWm0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjOX1vACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmobtg//Rqkrahvhd3mm/QLWo6GlF4p3xQ/S/zIkHeRjQvkqKd6DJMVp\r\n8FBzQ2dDQlDSllYcFyw6w4PaKQn+Hqs+fIUNg6doEeimyQYDCbrtOb6czDok\r\nY7i8Zms1AJmvlgdwvv7sCY1uBXB2xLcg5M4kzQlJcx6S8x/1qvuW6EqY7qSA\r\nowG7ckADDsMHs9I7PCCg0B0EOWIJJLRuqZLAU0U6sthMfDIuUPPO7OREFkAQ\r\nmDqftbpfhZEHVqRGKQgDYnOQQL0ZLnkfu3vHSYqVazjFX48YSl/Dh2Ol1o8R\r\no4Zvx3+ur+PAFmRz2d+vxAXImO0ZUj6A/7XN+0JBYXNdyCPByGecX/4ivzJZ\r\neqMeHZdqfcx4TkO7Qsm83C3pFAyYLXkiKSutfJJWL452z16qo5r3vgNjhMjv\r\nxeB4d5ovbQKNYEm1xi+XJBRIoXAfRnh3B9hIsyyyrm1DliDaKtoOYeB+oEqH\r\ndXEccEFvSrbRz+QGz0H9I4b5itOpupHf3q4aAD4V38xWDurW7aP1AbJ34onI\r\nowkGvCAMe9A97qSoMBd861C6i4D93El4hljwdku+eYv/Yq6kX7mUxbJ2MaT8\r\nzu+DlkW0yse8upbhW8u2MYLMWjt4WMMXRrk4uD6Wf1SvfUT81auYTXZMxUUf\r\n8phGyF4tx5JRzJf5kxUt8PT+2UHjAshsdiw=\r\n=IA8h\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_4.0.0_1664712047284_0.629347332638007"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"4.0.1-beta.0":{"name":"sonolus-pack","version":"4.0.1-beta.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@tsconfig/node16":"^1.0.3","@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^5.44.0","@typescript-eslint/parser":"^5.44.0","eslint":"^8.28.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","prettier":"^2.8.0","prettier-plugin-organize-imports":"^3.2.1","typescript":"^4.9.3"},"dependencies":{"commander":"^9.4.1","fs-extra":"^10.1.0","sonolus-core":"^6.0.0-beta.3","zod":"^3.19.1"},"readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://wiki.sonolus.com)\n-   [sonolus-express](https://github.com/Sonolus/sonolus-express)\n-   [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `info.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zh-hans\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Folder Structure\n\n```\n|   info.json\n|   banner[.png/.srl]\n|\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           info.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           preview[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|           configuration[.json/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           audio[.zip/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n\\---engines\n    +---{engine}\n    +---...\n    \\---{engine}\n            info.json\n            thumbnail[.png/.srl]\n            data[.json/.srl]\n            rom[.bin/.srl]\n            configuration[.json/.srl]\n```\n\n### Info\n\nResources of server is located in `/`.\n\n#### `info.json`\n\nServer information.\n\n```ts\ntype ServerInfo = {\n    title: LocalizationText\n}\n```\n\n#### `banner[.png/.srl]`\n\nServer banner.\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `info.json`\n\nLevel information.\n\n```ts\ntype LevelInfo = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: Use\n    useBackground: Use\n    useEffect: Use\n    useParticle: Use\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype Use =\n    | {\n          useDefault: true\n      }\n    | {\n          useDefault: false\n          item: string // name of referenced item\n      }\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `preview[.mp3/.srl]`\n\nOptional, level preview.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `info.json`\n\nSkin information.\n\n```ts\ntype SkinInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `info.json`\n\nBackground information.\n\n```ts\ntype BackgroundInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n#### `configuration[.json/.srl]`\n\nBackground configuration.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `info.json`\n\nEffect information.\n\n```ts\ntype EffectInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\n#### `audio[.zip/.srl]`\n\nEffect audio.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `info.json`\n\nParticle information.\n\n```ts\ntype ParticleInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `info.json`\n\nEngine information.\n\n```ts\ntype EngineInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `data[.json/.srl]`\n\nEngine data.\n\n#### `rom[.bin/.srl]`\n\nOptional, engine rom.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/Sonolus/sonolus-express) and [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"6b53b2c2bb6a658163f475a21d9abc41394b08b0","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@4.0.1-beta.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-H7uFiW7+/spEl/LXv5VHeSk0BUvBdnyKnZ1DezjNgr2pBGD79b3K6vx3PYruYyrZdVVM9Ai7WANcF5pJOCHxRQ==","shasum":"63f205b987fd1b8ea9fc64ff6eaaa3f45279b35b","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-4.0.1-beta.0.tgz","fileCount":16,"unpackedSize":23981,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDjYO/3Bxfw2wNSF1wN0jxjtImIQhCMA+RhrzKx6Hjw1AiAKHMe0U/3JEg11jVZ7WnDZVQdanr179dwbWiwlES6Gzg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjgzu5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqG+Q/9ET2gXji18op1Ola8CAyGBO0uQNGzxhN9oDqTzKrGo4CfnM32\r\n8yAeLAiwOaXS3I/nyMgR91Uz0EW1m38m2U4Xo+OmC4gAHwdKnVRgY926Sa3w\r\nX1AOlk2xPF6+i3+tuRW5DKMEGs/1duz7Q20bMA/HOIYMorOK6mgLDu8fTMJ3\r\nsPaLdhC1OY8gsJJmW/6FnWrT1/jy8isV6Ycoa2x5F5d4HxXSms28yJV1jd0j\r\noG4MP4ynjhrpvqXM4BQFdGXRpZOvwkNmGLb1LC+o97DN2ZzRAJ3B8XXazQxz\r\nnzLrx/nLFJXBfDFVM9GWAz0/c+vCEN9VQnZWybiiOPJZzj49S8/amw8xvKnf\r\n+6n+GKRfLC7Pr6asgKX5yxBNPzujCtlNNqQuQiVxYoNN8DbJVOfmXsG5oHud\r\nvg3RTHpMAybbo6kX+9yWGoLuetSA7//GXjVwdIWstc+LVhGXSUWJ+Zf1sk48\r\n8iVboa1WpogFuT4f+aG1jFsQ3HkXf2+UXYSAxeqMArGM6VWZvjfUjkEg8DDr\r\nZS5oRzoc8CdqqJrSOB9wc0JH38qPcS0V3zNBHAgnMZheY8MOjg1Kvl727ync\r\nskV28modEUUC1gnTj8rGrtHF9KBaf9wIZAA9eG/6+aPWZW8tdQX/3GGTmcZ7\r\n4wgIXLv0qYZDfJgn7Kw/aTDPuL4NcAtmoxs=\r\n=QRbR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_4.0.1-beta.0_1669544889764_0.5126892782803292"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"4.0.1":{"name":"sonolus-pack","version":"4.0.1","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@tsconfig/node16":"^1.0.3","@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^5.44.0","@typescript-eslint/parser":"^5.44.0","eslint":"^8.28.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","prettier":"^2.8.0","prettier-plugin-organize-imports":"^3.2.1","typescript":"^4.9.3"},"dependencies":{"commander":"^9.4.1","fs-extra":"^10.1.0","sonolus-core":"^6.0.0","zod":"^3.19.1"},"gitHead":"c66eaa5193c18d8ce59cb815bed3023b240b1fa8","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@4.0.1","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-xuXNUXes/JiGAYO26oa6V9JH3AwSrI/FvAMEEdyf8RTprPRtWHWZdH6C10S70oDfLRe37bENZSpNTaSVt8XuZg==","shasum":"af8e4eae6a2a48e75e52172b856ce4ce9b8bd667","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-4.0.1.tgz","fileCount":16,"unpackedSize":23960,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGDeVKzYquTuQ5TSKo+qirCOskgzdh+Jjyde4lLaxzF5AiAVox7wBXSUwPGkf+ovbfFg26Tyh05A//1t2i/GWM5viA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjkdSAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoBBBAAmEikSH8l2mpNCagNmqvEfCLEixNYY5HQEmgnTQwG38CjmkG0\r\nL1oHmCZWT1o9TU6gmt4k0i7pRYhocz9ydu/pdqVgG100AVV4VRi+undzTwhI\r\nAy1qTABqbEqZfH9pJzaGZWBF0IMssjDI6QVL3n8MqOKbsa0Tm80nbh9PJqBk\r\nJLwV97nQSoHjK4hj3CrfNOAQecZpITmbClm4GawgtSeUefoxgt9eVdN35ZTQ\r\nCqtvVDJyhqE1gGWOScnGqC2gnHY8TvrmVlrS3fPkFd/j8JWZOofvaUthKddo\r\ntlAweq3BwiD5ETBwZfTBNf/+N4bBvHrz9Oi1TyykaTLMRusaKI3MhJ+go7jY\r\npk7/cRGCfbeTFTVdWVgNI0M7TdyW/IoCW29QCp11vcDnrnAp9pLYBEjZRCEa\r\n2QmZtJOiqR2lsUHZisL8lppWfJfOj918jt/9QgsdXERwPcRXsu9MqSWPX1px\r\nsmCdqdcfewzNrzRumN56e9SBxVo9LOmBDiQAUQZ024C6Kk26K4topE61vu6b\r\noCwBHi+1uAyqmrvU5NmNx4IvIhYlZVCpnSbG63tYezbM2UbJUgeI6jQBnF6b\r\nTpur3Ut5W4BqoiqiCXxyLJdQn7yLKozjPdOlv7OFaMC5GlejP1AXiGRWOyfP\r\n8yinNLEAVIhJoN82qLxeJTQrb0C9EwmvhcY=\r\n=ftGb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_4.0.1_1670501504187_0.4883267868924239"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"5.0.0-beta.0":{"name":"sonolus-pack","version":"5.0.0-beta.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"lint":"tsc -p . --noEmit && eslint --ext .ts src/","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@tsconfig/node16":"^1.0.3","@types/fs-extra":"^9.0.13","@typescript-eslint/eslint-plugin":"^5.44.0","@typescript-eslint/parser":"^5.44.0","eslint":"^8.28.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","prettier":"^2.8.0","prettier-plugin-organize-imports":"^3.2.1","typescript":"^4.9.3"},"dependencies":{"commander":"^9.4.1","fs-extra":"^10.1.0","sonolus-core":"^7.0.0-beta.0","zod":"^3.19.1"},"readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://wiki.sonolus.com)\n-   [sonolus-express](https://github.com/Sonolus/sonolus-express)\n-   [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `info.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zh-hans\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Folder Structure\n\n```\n|   info.json\n|   banner[.png/.srl]\n|\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           info.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           preview[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|           configuration[.json/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           audio[.zip/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n\\---engines\n    +---{engine}\n    +---...\n    \\---{engine}\n            info.json\n            thumbnail[.png/.srl]\n            data[.json/.srl]\n            rom[.bin/.srl]\n            configuration[.json/.srl]\n```\n\n### Info\n\nResources of server is located in `/`.\n\n#### `info.json`\n\nServer information.\n\n```ts\ntype ServerInfo = {\n    title: LocalizationText\n}\n```\n\n#### `banner[.png/.srl]`\n\nServer banner.\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `info.json`\n\nLevel information.\n\n```ts\ntype LevelInfo = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: Use\n    useBackground: Use\n    useEffect: Use\n    useParticle: Use\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype Use =\n    | {\n          useDefault: true\n      }\n    | {\n          useDefault: false\n          item: string // name of referenced item\n      }\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `preview[.mp3/.srl]`\n\nOptional, level preview.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `info.json`\n\nSkin information.\n\n```ts\ntype SkinInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `info.json`\n\nBackground information.\n\n```ts\ntype BackgroundInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n#### `configuration[.json/.srl]`\n\nBackground configuration.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `info.json`\n\nEffect information.\n\n```ts\ntype EffectInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\n#### `audio[.zip/.srl]`\n\nEffect audio.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `info.json`\n\nParticle information.\n\n```ts\ntype ParticleInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `info.json`\n\nEngine information.\n\n```ts\ntype EngineInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `data[.json/.srl]`\n\nEngine data.\n\n#### `rom[.bin/.srl]`\n\nOptional, engine rom.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/Sonolus/sonolus-express) and [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"9b59e58c4834d91d676b91a3674f984dfde7eec0","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@5.0.0-beta.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-57SWjHe+SU2nQKHHgqWT/DEjCD6IsSx+sLDIL5yCtF8FfHr4MD67pQMjZcG66QvhaY1sErJIYZ5RSHXiDqpchQ==","shasum":"35587317a10e704823e7f0dd210e88b47de167fa","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-5.0.0-beta.0.tgz","fileCount":16,"unpackedSize":23981,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID4ys1VXit3yfGfDVQ1pnR5EyOppub0Pk9hsRf58pY/JAiAz3nBHcd9H3QjNvcNS1EuuyeQC5Ae+X75QN2v/TjnkOQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkRWqWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqNJw//fTUfVLMuCgqhwVuLPBIxQqI7igUic8tPXcuyELVuGBSxD068\r\nK/2HB4Ljrx2Q/hX5Ew6/axCkbHg+2s+LBZstQnu0SK+RSPlC3BP/993afxxz\r\nS40ABoo0YAlefqoNAcJKidH+vUnQu0XgXPeZXMOmdFRlbhWm+dN7QRwCvU5S\r\ncRepPE5hKJG4frrrh43G4KeSEppsfbv5eORIPDw2DesU/SjoXhJ7yO7eMB7t\r\nPU53hJBqcaSaB6ePotVC7JTgisyv1Yseu5M5sofdUtQ5MQDeaD6aP6ys0HIN\r\nnvUQlc0mAO/UZY4auFciOiSsNI2N+SV7DAUK60RAzoLSOSZOR7UHoVFRMGj7\r\nCU57xr5LPrUPWzcR1xnB7Q0QOfa2eSCoaeXG5tZgqKOP+ApjFOPg6zRyF33S\r\niMJlV6YhoLF67isqMCvIl08fP92XyIPx3of9iiSkqwQd7aIH40cDs0YKQVus\r\nNLRVQELZkGTI023i8IdIM9qmLoi1lfkqiYem2GmOMV5aHTjpPzY+2VIVyCvH\r\nzrJ8idwiTXFN2k9HC0Vosp32AY0acJaogElhaNT4EzJ2iS0CgD370DGRXG0Z\r\nakA37y/hCj0l5cGf0v11b0ycR9anzX0ZCHFYe7mjeUWZT58uBL4u6QwKhPL9\r\n+zGgdKfu/h9AAhBYAoYlBHz84tXREWVGxbg=\r\n=05S9\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_5.0.0-beta.0_1682270870328_0.1403267012667846"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"5.0.0":{"name":"sonolus-pack","version":"5.0.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"prebuild":"tsc -p . --noEmit && eslint --ext .ts ./src","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^11.0.1","@typescript-eslint/eslint-plugin":"^5.59.9","@typescript-eslint/parser":"^5.59.9","eslint":"^8.42.0","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","prettier":"^2.8.8","prettier-plugin-organize-imports":"^3.2.2","typescript":"~5.1.3"},"dependencies":{"commander":"^10.0.1","fs-extra":"^11.1.1","sonolus-core":"~7.0.0","zod":"^3.21.4"},"gitHead":"01472ebcd3cacccddf617763b3297b95da0d1ed2","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@5.0.0","_nodeVersion":"18.16.0","_npmVersion":"9.5.1","dist":{"integrity":"sha512-wNX8auEeNlga7R4mx+LxOL9Y5qhc3s7T2RZkPUedUX5bW+oRlQ1M1h3/OHk+yBAX546nLCbJHScJVm6RMEUtPg==","shasum":"7f30f7a8447e7ea17d292237ea646727e14ecd3b","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-5.0.0.tgz","fileCount":16,"unpackedSize":23494,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDdbb+Vp5QF4CKzxYFfEcuANsZdcgJB1HyACgNna9lScAiBbTzO5yWZdAOngbkxHspB56GYXnny78/EaV1dvSTj6ZQ=="}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_5.0.0_1686510428014_0.9920512954663459"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"5.1.0-beta.0":{"name":"sonolus-pack","version":"5.1.0-beta.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"prebuild":"tsc -p . --noEmit && eslint --ext .ts ./src","build":"node ./build/prepare.js && tsc -p ."},"devDependencies":{"@types/fs-extra":"^11.0.1","@typescript-eslint/eslint-plugin":"^6.2.0","@typescript-eslint/parser":"^6.2.0","eslint":"^8.45.0","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^5.0.0","prettier":"^3.0.0","prettier-plugin-organize-imports":"^3.2.3","typescript":"~5.1.6"},"dependencies":{"commander":"^11.0.0","fs-extra":"^11.1.1","sonolus-core":"~7.2.0-beta.0","zod":"^3.21.4"},"readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://wiki.sonolus.com)\n-   [sonolus-express](https://github.com/Sonolus/sonolus-express)\n-   [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `info.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zh-hans\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Folder Structure\n\n```\n|   info.json\n|   banner[.png/.srl]\n|\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           info.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           preview[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|           configuration[.json/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           audio[.zip/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n\\---engines\n    +---{engine}\n    +---...\n    \\---{engine}\n            info.json\n            thumbnail[.png/.srl]\n            playData[.json/.srl]\n            tutorialData[.json/.srl]\n            rom[.bin/.srl]\n            configuration[.json/.srl]\n```\n\n### Info\n\nResources of server is located in `/`.\n\n#### `info.json`\n\nServer information.\n\n```ts\ntype ServerInfo = {\n    title: LocalizationText\n}\n```\n\n#### `banner[.png/.srl]`\n\nServer banner.\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `info.json`\n\nLevel information.\n\n```ts\ntype LevelInfo = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: Use\n    useBackground: Use\n    useEffect: Use\n    useParticle: Use\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype Use =\n    | {\n          useDefault: true\n      }\n    | {\n          useDefault: false\n          item: string // name of referenced item\n      }\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `preview[.mp3/.srl]`\n\nOptional, level preview.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `info.json`\n\nSkin information.\n\n```ts\ntype SkinInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `info.json`\n\nBackground information.\n\n```ts\ntype BackgroundInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n#### `configuration[.json/.srl]`\n\nBackground configuration.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `info.json`\n\nEffect information.\n\n```ts\ntype EffectInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\n#### `audio[.zip/.srl]`\n\nEffect audio.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `info.json`\n\nParticle information.\n\n```ts\ntype ParticleInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `info.json`\n\nEngine information.\n\n```ts\ntype EngineInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `playData[.json/.srl]`\n\nEngine play data.\n\n#### `tutorialData[.json/.srl]`\n\nEngine tutorial data.\n\n#### `rom[.bin/.srl]`\n\nOptional, engine rom.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/Sonolus/sonolus-express) and [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"3494059361c6cbfc437f55af365d7073e831771f","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@5.1.0-beta.0","_nodeVersion":"18.16.0","_npmVersion":"9.5.1","dist":{"integrity":"sha512-2KrEsYxP8CMz31MZjCE5Pp4JQ/1QWop/l3eKgYI4/rHYfN6fRKrWtDvArBrm9F5rfJnd1crQZjUMcNjDqdEa2A==","shasum":"422432a477e9c00a9fa74e756f888456dd11843f","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-5.1.0-beta.0.tgz","fileCount":16,"unpackedSize":23823,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEx3jz8nwdZTSqUi6GJppsNPrGYeQZpnuplxdJC7+vPvAiEAptvPAtfACfSUC1gcuNtJwv6Min/BTV8vwf2OqkyQ7RI="}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_5.1.0-beta.0_1690405370299_0.772093320412101"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"5.1.0":{"name":"sonolus-pack","version":"5.1.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"prebuild":"tsc -p . --noEmit && eslint --ext .ts ./src","build":"tsc -p ."},"devDependencies":{"@types/fs-extra":"^11.0.1","@typescript-eslint/eslint-plugin":"^6.3.0","@typescript-eslint/parser":"^6.3.0","eslint":"^8.47.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","prettier":"^3.0.1","prettier-plugin-organize-imports":"^3.2.3","typescript":"~5.1.6"},"dependencies":{"commander":"^11.0.0","fs-extra":"^11.1.1","sonolus-core":"~7.2.0","zod":"^3.21.4"},"gitHead":"48481ddcf7e73a688b06f300524745e5f1f6d10b","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@5.1.0","_nodeVersion":"18.16.0","_npmVersion":"9.5.1","dist":{"integrity":"sha512-S5grA+YloLmIromZqj7g1hSJQNFb75pupucQvsA3LQ+FM7RW3ZnCiHghpLpGbg/mLzxTKJfssxoV/NXnlboWKw==","shasum":"6310c80b3e0f9a237d4808208f45b74090865db8","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-5.1.0.tgz","fileCount":15,"unpackedSize":23653,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICFGQ5kZtj/ns8+9n7kWoySsOoQDuXwgFLM8ojEqGcdaAiEAipVfF2ZvE52Yev7zUzfE+46hKU7kWrkBRoVkw1SbukQ="}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_5.1.0_1691821252588_0.10025572527008708"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"5.2.0-beta.0":{"name":"sonolus-pack","version":"5.2.0-beta.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"prebuild":"tsc -p . --noEmit && eslint --ext .ts ./src","build":"tsc -p ."},"devDependencies":{"@types/fs-extra":"^11.0.1","@typescript-eslint/eslint-plugin":"^6.3.0","@typescript-eslint/parser":"^6.3.0","eslint":"^8.47.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","prettier":"^3.0.1","prettier-plugin-organize-imports":"^3.2.3","typescript":"~5.1.6"},"dependencies":{"commander":"^11.0.0","fs-extra":"^11.1.1","sonolus-core":"~7.3.0-beta.0","zod":"^3.21.4"},"readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://wiki.sonolus.com)\n-   [sonolus-express](https://github.com/Sonolus/sonolus-express)\n-   [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `info.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zh-hans\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Folder Structure\n\n```\n|   info.json\n|   banner[.png/.srl]\n|\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           info.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           preview[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|           configuration[.json/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           audio[.zip/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n\\---engines\n    +---{engine}\n    +---...\n    \\---{engine}\n            info.json\n            thumbnail[.png/.srl]\n            playData[.json/.srl]\n            tutorialData[.json/.srl]\n            rom[.bin/.srl]\n            configuration[.json/.srl]\n```\n\n### Info\n\nResources of server is located in `/`.\n\n#### `info.json`\n\nServer information.\n\n```ts\ntype ServerInfo = {\n    title: LocalizationText\n}\n```\n\n#### `banner[.png/.srl]`\n\nServer banner.\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `info.json`\n\nLevel information.\n\n```ts\ntype LevelInfo = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: Use\n    useBackground: Use\n    useEffect: Use\n    useParticle: Use\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype Use =\n    | {\n          useDefault: true\n      }\n    | {\n          useDefault: false\n          item: string // name of referenced item\n      }\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `preview[.mp3/.srl]`\n\nOptional, level preview.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `info.json`\n\nSkin information.\n\n```ts\ntype SkinInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `info.json`\n\nBackground information.\n\n```ts\ntype BackgroundInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n#### `configuration[.json/.srl]`\n\nBackground configuration.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `info.json`\n\nEffect information.\n\n```ts\ntype EffectInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\n#### `audio[.zip/.srl]`\n\nEffect audio.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `info.json`\n\nParticle information.\n\n```ts\ntype ParticleInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `info.json`\n\nEngine information.\n\n```ts\ntype EngineInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `playData[.json/.srl]`\n\nEngine play data.\n\n#### `tutorialData[.json/.srl]`\n\nEngine tutorial data.\n\n#### `rom[.bin/.srl]`\n\nOptional, engine rom.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/Sonolus/sonolus-express) and [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"1bd1603564ccec44d0668bfbe2b749993d0ec9bb","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@5.2.0-beta.0","_nodeVersion":"18.16.0","_npmVersion":"9.5.1","dist":{"integrity":"sha512-gpLQDFy0Mb4A/EI52B2u/hagvgzhfdXptLhDr7VNYrquFtDBpOQSI7nvWbM+BEKUoor+sf4CTUz/oZYaRT+6gQ==","shasum":"4b2d7309a71f9b3bc795352bb096e5c6356a325c","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-5.2.0-beta.0.tgz","fileCount":15,"unpackedSize":23740,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID8TGkvhuPfHAnGByZz20UgD3b4HPB/hyzXf8Y8V3G2lAiEA3d1gw/ZARn1yTwvqHsHBMHk1uwlGHd2EbGfRifoIkd4="}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_5.2.0-beta.0_1693218061227_0.7093301432353902"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"5.2.0":{"name":"sonolus-pack","version":"5.2.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"prebuild":"tsc -p . --noEmit && eslint . && prettier . --check","build":"tsc -p ."},"devDependencies":{"@types/fs-extra":"^11.0.1","@typescript-eslint/eslint-plugin":"^6.5.0","@typescript-eslint/parser":"^6.5.0","eslint":"^8.48.0","eslint-config-prettier":"^9.0.0","prettier":"^3.0.3","prettier-plugin-organize-imports":"^3.2.3","typescript":"~5.2.2"},"dependencies":{"commander":"^11.0.0","fs-extra":"^11.1.1","sonolus-core":"~7.3.0","zod":"^3.22.2"},"gitHead":"b18c8c59c41c34ca674c86f0a8de441d4abcd432","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@5.2.0","_nodeVersion":"18.16.0","_npmVersion":"9.5.1","dist":{"integrity":"sha512-pDA8SkJvnDwO5fa2wvFon8NkzYnznRrnYpRablUTAvLCwkNUpdpwP+3ptkk+grKtNo1ZmxOhx5n7bIZinv4xlw==","shasum":"853d688ee148425c63c74de9f1a8eb40fd865ebf","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-5.2.0.tgz","fileCount":15,"unpackedSize":23687,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD0Gpy4OocmJc9+bWitlZUOyuymnH6t1fB4feVnyBD6FAIgUE62Ofsg/VtUMlks9vIwzPAZFO5IpfojHBPdoS3Gsxw="}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_5.2.0_1693750507253_0.8793192487626014"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"5.3.0-beta.0":{"name":"sonolus-pack","version":"5.3.0-beta.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"prebuild":"tsc -p . --noEmit && eslint . && prettier . --check","build":"tsc -p ."},"devDependencies":{"@types/fs-extra":"^11.0.1","@typescript-eslint/eslint-plugin":"^6.5.0","@typescript-eslint/parser":"^6.5.0","eslint":"^8.48.0","eslint-config-prettier":"^9.0.0","prettier":"^3.0.3","prettier-plugin-organize-imports":"^3.2.3","typescript":"~5.2.2"},"dependencies":{"commander":"^11.0.0","fs-extra":"^11.1.1","sonolus-core":"~7.4.0-beta.0","zod":"^3.22.2"},"readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://wiki.sonolus.com)\n-   [sonolus-express](https://github.com/Sonolus/sonolus-express)\n-   [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `info.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zh-hans\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Folder Structure\n\n```\n|   info.json\n|   banner[.png/.srl]\n|\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           info.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           preview[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|           configuration[.json/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           audio[.zip/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n\\---engines\n    +---{engine}\n    +---...\n    \\---{engine}\n            info.json\n            thumbnail[.png/.srl]\n            playData[.json/.srl]\n            tutorialData[.json/.srl]\n            rom[.bin/.srl]\n            configuration[.json/.srl]\n```\n\n### Info\n\nResources of server is located in `/`.\n\n#### `info.json`\n\nServer information.\n\n```ts\ntype ServerInfo = {\n    title: LocalizationText\n}\n```\n\n#### `banner[.png/.srl]`\n\nServer banner.\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `info.json`\n\nLevel information.\n\n```ts\ntype LevelInfo = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: Use\n    useBackground: Use\n    useEffect: Use\n    useParticle: Use\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype Use =\n    | {\n          useDefault: true\n      }\n    | {\n          useDefault: false\n          item: string // name of referenced item\n      }\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `preview[.mp3/.srl]`\n\nOptional, level preview.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `info.json`\n\nSkin information.\n\n```ts\ntype SkinInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `info.json`\n\nBackground information.\n\n```ts\ntype BackgroundInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n#### `configuration[.json/.srl]`\n\nBackground configuration.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `info.json`\n\nEffect information.\n\n```ts\ntype EffectInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\n#### `audio[.zip/.srl]`\n\nEffect audio.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `info.json`\n\nParticle information.\n\n```ts\ntype ParticleInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `info.json`\n\nEngine information.\n\n```ts\ntype EngineInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `playData[.json/.srl]`\n\nEngine play data.\n\n#### `tutorialData[.json/.srl]`\n\nEngine tutorial data.\n\n#### `rom[.bin/.srl]`\n\nOptional, engine rom.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/Sonolus/sonolus-express) and [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"c56f8f0848080223686b84e11659ea89592e658f","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@5.3.0-beta.0","_nodeVersion":"18.17.1","_npmVersion":"9.6.7","dist":{"integrity":"sha512-+7tk5wYTACmduU5IdQf1sTet0EBooBVFeRD8H8tGOtePyONIi5ZyMRWOrKhWNAT4Or5BSv3wHXssEcZacVNC6Q==","shasum":"224880e3dc76476b81cd51f92bf295d370e01077","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-5.3.0-beta.0.tgz","fileCount":15,"unpackedSize":23769,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCSqYSDWrDi2Ll4dEkKNGvu0EcY4wHSPPUQhk+RbrMeEgIhAIiszyccMiGibS3r86zAx5/cBJ1j+GJZhtrFiSKHhg2l"}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_5.3.0-beta.0_1700359665468_0.0013833756492196425"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"5.3.0":{"name":"sonolus-pack","version":"5.3.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"prebuild":"tsc -p . --noEmit && eslint . && prettier . --check","build":"tsc -p ."},"devDependencies":{"@types/fs-extra":"^11.0.4","@typescript-eslint/eslint-plugin":"^6.12.0","@typescript-eslint/parser":"^6.12.0","eslint":"^8.54.0","eslint-config-prettier":"^9.0.0","prettier":"^3.1.0","prettier-plugin-organize-imports":"^3.2.4","typescript":"~5.2.2"},"dependencies":{"commander":"^11.1.0","fs-extra":"^11.1.1","sonolus-core":"~7.4.0","zod":"^3.22.4"},"gitHead":"6da16c07616304d516f6d51eeb6e2c6cd92a3de8","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_id":"sonolus-pack@5.3.0","_nodeVersion":"18.17.1","_npmVersion":"9.6.7","dist":{"integrity":"sha512-+ySDPCCQnofz7CDN21e0jdyJiCSG868O7qRhKlf8QHNgL2a6px2x7C4d4vFPYknJLQ91iAueFEd/yAGEuUfm6g==","shasum":"b4e73c2017039c308eda19810fe8bf898039a26f","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-5.3.0.tgz","fileCount":15,"unpackedSize":23750,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDPofr9nxh0o6rP7Rjzxl15QMHbeOwyFtC38N7VjHFNgAiAmwKaOC5AYrHrMFbKIQv0m32yyrL1LmFhcb44bAbIE3Q=="}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_5.3.0_1701005247897_0.2296815085778947"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"5.4.0-alpha.0":{"name":"sonolus-pack","version":"5.4.0-alpha.0","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"prebuild":"tsc -p . --noEmit && eslint . && prettier . --check","build":"tsc -p ."},"devDependencies":{"@types/fs-extra":"^11.0.4","@typescript-eslint/eslint-plugin":"^6.12.0","@typescript-eslint/parser":"^6.12.0","eslint":"^8.54.0","eslint-config-prettier":"^9.0.0","prettier":"^3.1.0","prettier-plugin-organize-imports":"^3.2.4","typescript":"~5.2.2"},"dependencies":{"commander":"^11.1.0","fs-extra":"^11.1.1","sonolus-core":"7.5.0-alpha.0","zod":"^3.22.4"},"_id":"sonolus-pack@5.4.0-alpha.0","readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://wiki.sonolus.com)\n-   [sonolus-express](https://github.com/Sonolus/sonolus-express)\n-   [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `info.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zh-hans\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Folder Structure\n\n```\n|   info.json\n|   banner[.png/.srl]\n|\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           info.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           preview[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|           configuration[.json/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           audio[.zip/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           info.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n\\---engines\n    +---{engine}\n    +---...\n    \\---{engine}\n            info.json\n            thumbnail[.png/.srl]\n            playData[.json/.srl]\n            tutorialData[.json/.srl]\n            rom[.bin/.srl]\n            configuration[.json/.srl]\n```\n\n### Info\n\nResources of server is located in `/`.\n\n#### `info.json`\n\nServer information.\n\n```ts\ntype ServerInfo = {\n    title: LocalizationText\n}\n```\n\n#### `banner[.png/.srl]`\n\nServer banner.\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `info.json`\n\nLevel information.\n\n```ts\ntype LevelInfo = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: Use\n    useBackground: Use\n    useEffect: Use\n    useParticle: Use\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype Use =\n    | {\n          useDefault: true\n      }\n    | {\n          useDefault: false\n          item: string // name of referenced item\n      }\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `preview[.mp3/.srl]`\n\nOptional, level preview.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `info.json`\n\nSkin information.\n\n```ts\ntype SkinInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `info.json`\n\nBackground information.\n\n```ts\ntype BackgroundInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n#### `configuration[.json/.srl]`\n\nBackground configuration.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `info.json`\n\nEffect information.\n\n```ts\ntype EffectInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\n#### `audio[.zip/.srl]`\n\nEffect audio.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `info.json`\n\nParticle information.\n\n```ts\ntype ParticleInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `info.json`\n\nEngine information.\n\n```ts\ntype EngineInfo = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `playData[.json/.srl]`\n\nEngine play data.\n\n#### `tutorialData[.json/.srl]`\n\nEngine tutorial data.\n\n#### `rom[.bin/.srl]`\n\nOptional, engine rom.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/Sonolus/sonolus-express) and [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"931bbbe0e0c8da8250a6eeaff3d29c4d567211ed","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_nodeVersion":"20.10.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-MAvWXWg1jC2sxrA7jxEUjc5qGFdxJ7vIn6OAS+4AdgjQNBsFszzDUXTL+PpKOr0g5Leq6tcRH/00MKFhM3MQ6A==","shasum":"5d15ba60b158bf77dc940623f7b29040451ae67f","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-5.4.0-alpha.0.tgz","fileCount":16,"unpackedSize":24958,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8jmJDy3zxMPoYI2BA5k0K0tf+tNJnlmOYzADphpjn/wIgaBX6xexVexLhv04SapTUQE/HOtGz64OaDmWTX23hXUQ="}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_5.4.0-alpha.0_1705805101791_0.39371725075455477"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"5.4.0-alpha.1":{"name":"sonolus-pack","version":"5.4.0-alpha.1","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"prebuild":"tsc -p . --noEmit && eslint . && prettier . --check","build":"tsc -p ."},"devDependencies":{"@types/fs-extra":"^11.0.4","@typescript-eslint/eslint-plugin":"^6.12.0","@typescript-eslint/parser":"^6.12.0","eslint":"^8.54.0","eslint-config-prettier":"^9.0.0","prettier":"^3.1.0","prettier-plugin-organize-imports":"^3.2.4","typescript":"~5.2.2"},"dependencies":{"commander":"^11.1.0","fs-extra":"^11.1.1","sonolus-core":"7.5.0-alpha.1","zod":"^3.22.4"},"_id":"sonolus-pack@5.4.0-alpha.1","readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://wiki.sonolus.com)\n-   [sonolus-express](https://github.com/Sonolus/sonolus-express)\n-   [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `item.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zhs\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Tag\n\nCommon type for tag.\n\n```ts\ntype Tag = {\n    title: LocalizationText\n    icon?: string\n}\n```\n\n### Folder Structure\n\n```\n|   info.json\n|   banner[.png/.srl]\n|\n+---posts\n|   +---{post}\n|   +---...\n|   \\---{post}\n|           item.json\n|           thumbnail[.png/.srl]\n|\n+---playlists\n|   +---{playlist}\n|   +---...\n|   \\---{playlist}\n|           item.json\n|           thumbnail[.png/.srl]\n|\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           item.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           preview[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           item.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           item.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|           configuration[.json/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           item.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           audio[.zip/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           item.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---engines\n|   +---{engine}\n|   +---...\n|   \\---{engine}\n|           item.json\n|           thumbnail[.png/.srl]\n|           playData[.json/.srl]\n|           tutorialData[.json/.srl]\n|           rom[.bin/.srl]\n|           configuration[.json/.srl]\n|\n\\---replays\n    +---{replay}\n    +---...\n    \\---{replay}\n            item.json\n            data[.json/.srl]\n            configuration[.json/.srl]\n```\n\n### Server\n\nResources of server is located in `/`.\n\n#### `info.json`\n\nServer information.\n\n```ts\ntype ServerInfo = {\n    title: LocalizationText\n}\n```\n\n#### `banner[.png/.srl]`\n\nOptional, server banner.\n\n### Posts\n\nResources of each post is located in `/posts/{post}`.\n\n#### `item.json`\n\nPost information.\n\n```ts\ntype PostItem = {\n    version: number\n    title: LocalizationText\n    time: number\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nOptional, post thumbnail.\n\n### Playlists\n\nResources of each playlist is located in `/playlists/{post}`.\n\n#### `item.json`\n\nPlaylist information.\n\n```ts\ntype PlaylistItem = {\n    version: number\n    title: LocalizationText\n    time: number\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    levels: string[] // name of referenced levels\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nOptional, playlist thumbnail.\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `item.json`\n\nLevel information.\n\n```ts\ntype LevelItem = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: UseItem\n    useBackground: UseItem\n    useEffect: UseItem\n    useParticle: UseItem\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype UseItem =\n    | {\n          useDefault: true\n      }\n    | {\n          useDefault: false\n          item: string // name of referenced item\n      }\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `preview[.mp3/.srl]`\n\nOptional, level preview.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `item.json`\n\nSkin information.\n\n```ts\ntype SkinItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `item.json`\n\nBackground information.\n\n```ts\ntype BackgroundItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n#### `configuration[.json/.srl]`\n\nBackground configuration.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `item.json`\n\nEffect information.\n\n```ts\ntype EffectItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\n#### `audio[.zip/.srl]`\n\nEffect audio.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `item.json`\n\nParticle information.\n\n```ts\ntype ParticleItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `item.json`\n\nEngine information.\n\n```ts\ntype EngineItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `playData[.json/.srl]`\n\nEngine play data.\n\n#### `tutorialData[.json/.srl]`\n\nEngine tutorial data.\n\n#### `rom[.bin/.srl]`\n\nOptional, engine rom.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n### Replays\n\nResources of each replay is located in `/replays/{replay}`.\n\n#### `item.json`\n\nReplay information.\n\n```ts\ntype ReplayItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    level: string // name of referenced level\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `data[.json/.srl]`\n\nReplay data.\n\n#### `configuration[.json/.srl]`\n\nReplay configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/Sonolus/sonolus-express) and [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"c0a563e4a7ed3e73265bd3cb0dbb0395f432f814","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_nodeVersion":"20.10.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-8FLmz1ZfOdMmx6RR9scXDTZGeFuqNkY5fNOiCUQt+iMoJuz7lKy+C4KL44BvsVwJkkcVkrJKyWFOXRQ7Pvenyw==","shasum":"86b77b81a24ab18ab004da273154e83d00dc01ef","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-5.4.0-alpha.1.tgz","fileCount":19,"unpackedSize":31004,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCNoJL+VUnsBPuuecKh7q+0E4FIHfXoBWxOMJ6YvRYZIQIgfcX1MYqDl7X1yQkFbjSDs00A8qbVMNzCW2KnQDVyiN8="}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_5.4.0-alpha.1_1707135019880_0.8462728526904786"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"5.4.0-alpha.2":{"name":"sonolus-pack","version":"5.4.0-alpha.2","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"prebuild":"tsc -p . --noEmit && eslint . && prettier . --check","build":"tsc -p ."},"devDependencies":{"@types/fs-extra":"^11.0.4","@typescript-eslint/eslint-plugin":"^6.12.0","@typescript-eslint/parser":"^6.12.0","eslint":"^8.54.0","eslint-config-prettier":"^9.0.0","prettier":"^3.1.0","prettier-plugin-organize-imports":"^3.2.4","typescript":"~5.2.2"},"dependencies":{"commander":"^11.1.0","fs-extra":"^11.1.1","sonolus-core":"7.5.0-alpha.2","zod":"^3.22.4"},"_id":"sonolus-pack@5.4.0-alpha.2","readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://wiki.sonolus.com)\n-   [sonolus-express](https://github.com/Sonolus/sonolus-express)\n-   [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `item.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zhs\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Tag\n\nCommon type for tag.\n\n```ts\ntype Tag = {\n    title: LocalizationText\n    icon?: string\n}\n```\n\n### Folder Structure\n\n```\n|   info.json\n|   banner[.png/.srl]\n|\n+---posts\n|   +---{post}\n|   +---...\n|   \\---{post}\n|           item.json\n|           thumbnail[.png/.srl]\n|\n+---playlists\n|   +---{playlist}\n|   +---...\n|   \\---{playlist}\n|           item.json\n|           thumbnail[.png/.srl]\n|\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           item.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           preview[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           item.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           item.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|           configuration[.json/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           item.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           audio[.zip/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           item.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---engines\n|   +---{engine}\n|   +---...\n|   \\---{engine}\n|           item.json\n|           thumbnail[.png/.srl]\n|           playData[.json/.srl]\n|           tutorialData[.json/.srl]\n|           rom[.bin/.srl]\n|           configuration[.json/.srl]\n|\n\\---replays\n    +---{replay}\n    +---...\n    \\---{replay}\n            item.json\n            data[.json/.srl]\n            configuration[.json/.srl]\n```\n\n### Server\n\nResources of server is located in `/`.\n\n#### `info.json`\n\nServer information.\n\n```ts\ntype ServerInfo = {\n    title: LocalizationText\n}\n```\n\n#### `banner[.png/.srl]`\n\nOptional, server banner.\n\n### Posts\n\nResources of each post is located in `/posts/{post}`.\n\n#### `item.json`\n\nPost information.\n\n```ts\ntype PostItem = {\n    version: number\n    title: LocalizationText\n    time: number\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nOptional, post thumbnail.\n\n### Playlists\n\nResources of each playlist is located in `/playlists/{post}`.\n\n#### `item.json`\n\nPlaylist information.\n\n```ts\ntype PlaylistItem = {\n    version: number\n    title: LocalizationText\n    time: number\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    levels: string[] // name of referenced levels\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nOptional, playlist thumbnail.\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `item.json`\n\nLevel information.\n\n```ts\ntype LevelItem = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: UseItem\n    useBackground: UseItem\n    useEffect: UseItem\n    useParticle: UseItem\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype UseItem =\n    | {\n          useDefault: true\n      }\n    | {\n          useDefault: false\n          item: string // name of referenced item\n      }\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `preview[.mp3/.srl]`\n\nOptional, level preview.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `item.json`\n\nSkin information.\n\n```ts\ntype SkinItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `item.json`\n\nBackground information.\n\n```ts\ntype BackgroundItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n#### `configuration[.json/.srl]`\n\nBackground configuration.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `item.json`\n\nEffect information.\n\n```ts\ntype EffectItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\n#### `audio[.zip/.srl]`\n\nEffect audio.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `item.json`\n\nParticle information.\n\n```ts\ntype ParticleItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `item.json`\n\nEngine information.\n\n```ts\ntype EngineItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `playData[.json/.srl]`\n\nEngine play data.\n\n#### `tutorialData[.json/.srl]`\n\nEngine tutorial data.\n\n#### `rom[.bin/.srl]`\n\nOptional, engine rom.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n### Replays\n\nResources of each replay is located in `/replays/{replay}`.\n\n#### `item.json`\n\nReplay information.\n\n```ts\ntype ReplayItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    level: string // name of referenced level\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `data[.json/.srl]`\n\nReplay data.\n\n#### `configuration[.json/.srl]`\n\nReplay configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/Sonolus/sonolus-express) and [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"5d226112569c8b3471c6cc30a2ecf94a15596b1d","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_nodeVersion":"20.10.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-ZnIG4m1xywzLtAvhdGY0SrdfwrkZsJrI28b0gU7UWZVbUVuSY0UluDBhvngJMrliqGyKTrLotXQRQoQCZBGp1g==","shasum":"3ce50189d944b2df2240d0ef65df7cc5901f469a","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-5.4.0-alpha.2.tgz","fileCount":19,"unpackedSize":30106,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA/MXYZHIRibmfp0fMjoz2MRJOcux7HOx81SgoZ5h2gTAiAe8+ksf/8LgC/wECRIyBA09WtF0Q45Rhm8xNBv/G8Hzg=="}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_5.4.0-alpha.2_1709785867364_0.4303053137817541"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"},"5.4.0-alpha.3":{"name":"sonolus-pack","version":"5.4.0-alpha.3","description":"CLI tool to pack Sonolus source files into repository and database","author":{"name":"NonSpicyBurrito"},"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"license":"MIT","keywords":["Sonolus"],"bin":{"sonolus-pack":"dist/index.js"},"scripts":{"prebuild":"tsc -p . --noEmit && eslint . && prettier . --check","build":"tsc -p ."},"devDependencies":{"@types/fs-extra":"^11.0.4","@typescript-eslint/eslint-plugin":"^6.12.0","@typescript-eslint/parser":"^6.12.0","eslint":"^8.54.0","eslint-config-prettier":"^9.0.0","prettier":"^3.1.0","prettier-plugin-organize-imports":"^3.2.4","typescript":"~5.2.2"},"dependencies":{"commander":"^11.1.0","fs-extra":"^11.1.1","sonolus-core":"7.5.0-alpha.4","zod":"^3.22.4"},"_id":"sonolus-pack@5.4.0-alpha.3","readme":"# sonolus-pack\n\nCLI tool to pack Sonolus source files into repository and database.\n\n## Links\n\n-   [Sonolus Website](https://sonolus.com)\n-   [Sonolus Wiki](https://wiki.sonolus.com)\n-   [sonolus-express](https://github.com/Sonolus/sonolus-express)\n-   [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static)\n\n## Usage\n\n### `npx`\n\nUse `npx` to execute without installing.\n\nPacking using default options:\n\n```\nnpx sonolus-pack\n```\n\nUse `-h` to see a list of available options:\n\n```\nnpx sonolus-pack -h\n```\n\n### Install Globally\n\nInstalling globally (only need once):\n\n```\nnpm i -g sonolus-pack\n```\n\n`sonolus-pack` will become available to use:\n\n```\nsonolus-pack -h\n```\n\n## Input\n\n### Resources\n\nEach resource (except `item.json`):\n\n-   if a file with default extension is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if an extension-less file is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if an `.srl` extension file is provided, its content will be used as `SRL`.\n\nFor example resource `cover[.png/.srl]`:\n\n-   if file `cover.png` is provided, it will be processed, and corresponding `SRL` will be generated.\n-   if file `cover` is provided, processing will be skipped, and corresponding `SRL` will be generated.\n-   if file `cover.srl` is provided, its content will be used as `SRL`.\n\n### Localization Text\n\nCommon type for text with localization.\n\n```ts\ntype LocalizationText = Record<string, string>\n```\n\nFor example:\n\n```json\n{\n    \"en\": \"Hello!\",\n    \"zhs\": \"你好！\",\n    \"ja\": \"こんにちは！\",\n    \"ko\": \"안녕하세요!\"\n}\n```\n\n### Tag\n\nCommon type for tag.\n\n```ts\ntype Tag = {\n    title: LocalizationText\n    icon?: string\n}\n```\n\n### Folder Structure\n\n```\n|   info.json\n|   banner[.png/.srl]\n|\n+---posts\n|   +---{post}\n|   +---...\n|   \\---{post}\n|           item.json\n|           thumbnail[.png/.srl]\n|\n+---playlists\n|   +---{playlist}\n|   +---...\n|   \\---{playlist}\n|           item.json\n|           thumbnail[.png/.srl]\n|\n+---levels\n|   +---{level}\n|   +---...\n|   \\---{level}\n|           item.json\n|           cover[.png/.srl]\n|           bgm[.mp3/.srl]\n|           preview[.mp3/.srl]\n|           data[.json/.srl]\n|\n+---skins\n|   +---{skin}\n|   +---...\n|   \\---{skin}\n|           item.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---backgrounds\n|   +---{background}\n|   +---...\n|   \\---{background}\n|           item.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           image[.png/.srl]\n|           configuration[.json/.srl]\n|\n+---effects\n|   +---{effect}\n|   +---...\n|   \\---{effect}\n|           item.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           audio[.zip/.srl]\n|\n+---particles\n|   +---{particle}\n|   +---...\n|   \\---{particle}\n|           item.json\n|           thumbnail[.png/.srl]\n|           data[.json/.srl]\n|           texture[.png/.srl]\n|\n+---engines\n|   +---{engine}\n|   +---...\n|   \\---{engine}\n|           item.json\n|           thumbnail[.png/.srl]\n|           playData[.json/.srl]\n|           tutorialData[.json/.srl]\n|           rom[.bin/.srl]\n|           configuration[.json/.srl]\n|\n\\---replays\n    +---{replay}\n    +---...\n    \\---{replay}\n            item.json\n            data[.json/.srl]\n            configuration[.json/.srl]\n```\n\n### Server\n\nResources of server is located in `/`.\n\n#### `info.json`\n\nServer information.\n\n```ts\ntype ServerInfo = {\n    title: LocalizationText\n}\n```\n\n#### `banner[.png/.srl]`\n\nOptional, server banner.\n\n### Posts\n\nResources of each post is located in `/posts/{post}`.\n\n#### `item.json`\n\nPost information.\n\n```ts\ntype PostItem = {\n    version: number\n    title: LocalizationText\n    time: number\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nOptional, post thumbnail.\n\n### Playlists\n\nResources of each playlist is located in `/playlists/{post}`.\n\n#### `item.json`\n\nPlaylist information.\n\n```ts\ntype PlaylistItem = {\n    version: number\n    title: LocalizationText\n    time: number\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    levels: string[] // name of referenced levels\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nOptional, playlist thumbnail.\n\n### Levels\n\nResources of each level is located in `/levels/{name}`.\n\n#### `item.json`\n\nLevel information.\n\n```ts\ntype LevelItem = {\n    version: number\n    rating: number\n    engine: string // name of referenced engine\n    useSkin: UseItem\n    useBackground: UseItem\n    useEffect: UseItem\n    useParticle: UseItem\n    title: LocalizationText\n    artists: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n\ntype UseItem =\n    | {\n          useDefault: true\n      }\n    | {\n          useDefault: false\n          item: string // name of referenced item\n      }\n```\n\n#### `cover[.png/.srl]`\n\nLevel cover.\n\n#### `bgm[.mp3/.srl]`\n\nLevel bgm.\n\n#### `preview[.mp3/.srl]`\n\nOptional, level preview.\n\n#### `data[.json/.srl]`\n\nLevel data.\n\n### Skins\n\nResources of each skin is located in `/skins/{skin}`.\n\n#### `item.json`\n\nSkin information.\n\n```ts\ntype SkinItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nSkin thumbnail.\n\n#### `data[.json/.srl]`\n\nSkin data.\n\n#### `texture[.png/.srl]`\n\nSkin texture.\n\n### Backgrounds\n\nResources of each background is located in `/backgrounds/{background}`.\n\n#### `item.json`\n\nBackground information.\n\n```ts\ntype BackgroundItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nBackground thumbnail.\n\n#### `data[.json/.srl]`\n\nBackground data.\n\n#### `image[.png/.srl]`\n\nBackground image.\n\n#### `configuration[.json/.srl]`\n\nBackground configuration.\n\n### Effects\n\nResources of each effect is located in `/effects/{effect}`.\n\n#### `item.json`\n\nEffect information.\n\n```ts\ntype EffectItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEffect thumbnail.\n\n#### `data[.json/.srl]`\n\nEffect data.\n\n#### `audio[.zip/.srl]`\n\nEffect audio.\n\n### Particles\n\nResources of each particle is located in `/particles/{particle}`.\n\n#### `item.json`\n\nParticle information.\n\n```ts\ntype ParticleItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nParticle thumbnail.\n\n#### `data[.json/.srl]`\n\nParticle data.\n\n#### `texture[.png/.srl]`\n\nParticle texture.\n\n### Engines\n\nResources of each engine is located in `/engines/{engine}`.\n\n#### `item.json`\n\nEngine information.\n\n```ts\ntype EngineItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    skin: string // name of referenced skin\n    background: string // name of referenced background\n    effect: string // name of referenced effect\n    particle: string // name of referenced particle\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `thumbnail[.png/.srl]`\n\nEngine thumbnail.\n\n#### `playData[.json/.srl]`\n\nEngine play data.\n\n#### `tutorialData[.json/.srl]`\n\nEngine tutorial data.\n\n#### `rom[.bin/.srl]`\n\nOptional, engine rom.\n\n#### `configuration[.json/.srl]`\n\nEngine configuration.\n\n### Replays\n\nResources of each replay is located in `/replays/{replay}`.\n\n#### `item.json`\n\nReplay information.\n\n```ts\ntype ReplayItem = {\n    version: number\n    title: LocalizationText\n    subtitle: LocalizationText\n    author: LocalizationText\n    tags: Tag[]\n    description: LocalizationText\n    level: string // name of referenced level\n    meta?: unknown // (optional) user-defined meta information\n}\n```\n\n#### `data[.json/.srl]`\n\nReplay data.\n\n#### `configuration[.json/.srl]`\n\nReplay configuration.\n\n## Output\n\nOutput contains:\n\n-   `/repository` contains processed resources.\n-   `/db.json` contains information of items.\n\nOutput can be used by [sonolus-express](https://github.com/Sonolus/sonolus-express) and [sonolus-generate-static](https://github.com/Sonolus/sonolus-generate-static) to develop Sonolus servers.\n","readmeFilename":"README.md","gitHead":"10970647551d39c42f3f4302eda162a077c1fae8","bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"homepage":"https://github.com/Sonolus/sonolus-pack#readme","_nodeVersion":"20.10.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-W3AOSdhE61tZuP6mqS0FTYtLuEgFqUxfOQd5gZ3cS2zLYQSvX4pN449A0+yvUxz4oloAe/SUTAHQIRipVyzmzQ==","shasum":"16ae54c21b18ede9f2c27b1130f81ac73caf3520","tarball":"https://registry.npmjs.org/sonolus-pack/-/sonolus-pack-5.4.0-alpha.3.tgz","fileCount":19,"unpackedSize":30106,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID+N1jWvDr01h4KP6t9tShwl3iPH8DkXvz7fPtHzdCI3AiEAqX1sX061pwT2bk9jKsG2HbNYUuot036ZE65Lj1NPjWE="}]},"_npmUser":{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"},"directories":{},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sonolus-pack_5.4.0-alpha.3_1710929568172_0.8169679787753088"},"_hasShrinkwrap":false,"deprecated":"Moved to @sonolus/pack"}},"time":{"created":"2021-06-25T18:33:59.883Z","0.1.0":"2021-06-25T18:34:00.042Z","modified":"2024-04-09T21:59:27.267Z","0.2.0-beta.0":"2021-08-07T13:23:57.361Z","0.2.0":"2021-08-08T18:49:40.112Z","1.0.0":"2021-09-29T01:59:51.573Z","1.0.1":"2021-11-11T14:08:08.948Z","1.1.0-beta.0":"2022-01-24T08:12:23.030Z","1.1.0":"2022-01-27T12:23:42.850Z","1.2.0-beta.0":"2022-02-21T03:55:23.077Z","1.2.0":"2022-02-23T16:15:26.375Z","1.2.1-beta.0":"2022-04-23T10:08:16.745Z","1.2.1-beta.1":"2022-04-23T10:19:21.919Z","1.2.1":"2022-04-24T05:40:28.648Z","2.0.0-beta.1":"2022-07-08T18:51:37.836Z","2.0.0":"2022-08-09T09:35:20.086Z","3.0.0":"2022-09-05T13:33:14.871Z","4.0.0-beta.0":"2022-09-10T02:11:09.483Z","4.0.0":"2022-10-02T12:00:47.509Z","4.0.1-beta.0":"2022-11-27T10:28:09.906Z","4.0.1":"2022-12-08T12:11:44.344Z","5.0.0-beta.0":"2023-04-23T17:27:50.512Z","5.0.0":"2023-06-11T19:07:08.197Z","5.1.0-beta.0":"2023-07-26T21:02:50.482Z","5.1.0":"2023-08-12T06:20:52.781Z","5.2.0-beta.0":"2023-08-28T10:21:01.382Z","5.2.0":"2023-09-03T14:15:07.421Z","5.3.0-beta.0":"2023-11-19T02:07:45.721Z","5.3.0":"2023-11-26T13:27:28.097Z","5.4.0-alpha.0":"2024-01-21T02:45:01.976Z","5.4.0-alpha.1":"2024-02-05T12:10:20.059Z","5.4.0-alpha.2":"2024-03-07T04:31:07.523Z","5.4.0-alpha.3":"2024-03-20T10:12:48.329Z"},"maintainers":[{"name":"nonspicyburrito","email":"burritoyangster@gmail.com"}],"description":"CLI tool to pack Sonolus source files into repository and database","homepage":"https://github.com/Sonolus/sonolus-pack#readme","keywords":["Sonolus"],"repository":{"type":"git","url":"git+https://github.com/Sonolus/sonolus-pack.git"},"author":{"name":"NonSpicyBurrito"},"bugs":{"url":"https://github.com/Sonolus/sonolus-pack/issues"},"license":"MIT","readme":"","readmeFilename":""}