{"_id":"@bariqmbani/sakata-syllable-engine","_rev":"2-c33fbddf37a725de9830bcbc14ff8b16","name":"@bariqmbani/sakata-syllable-engine","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@bariqmbani/sakata-syllable-engine","version":"0.1.0","keywords":["indonesian","syllable","word-game"],"author":{"name":"Bariq Mbani","email":"bariq.m70@gmail.com"},"license":"MIT","_id":"@bariqmbani/sakata-syllable-engine@0.1.0","maintainers":[{"name":"bariqmbani","email":"bariq.m70@gmail.com"}],"dist":{"shasum":"84d6dbe74353454578f02fbf2b024faa80e8b961","tarball":"https://registry.npmjs.org/@bariqmbani/sakata-syllable-engine/-/sakata-syllable-engine-0.1.0.tgz","fileCount":78,"integrity":"sha512-dtycL2RstaE4bxxDWRCahpWU3Wmo0NSxmHkEVy60iCYgwKcaV9/Yg3/xdhWmIgrXf+qcmVZqPp19ZqOkwQ4QAQ==","signatures":[{"sig":"MEQCIDdVnFTjEQxHMvmK/dfqMRFEwEoQtUDjSIDu4FmzV7TCAiAbz/SDv27ham38gQrRMtw5comCZkjs3qxRm2CMZ6IMPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53008},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ceb27b97f3d5c8a9c555c27d94ef0a2e50fb96d3","scripts":{"lint":"eslint .","test":"vitest run","build":"npm run clean && tsc -p tsconfig.build.json","clean":"node -e \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier . --write","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier . --check"},"_npmUser":{"name":"bariqmbani","email":"bariq.m70@gmail.com"},"_npmVersion":"11.11.0","description":"Deterministic Indonesian last-syllable engine for gameplay.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.3.0","vitest":"^4.1.6","prettier":"^3.8.3","@eslint/js":"^10.0.1","typescript":"^6.0.3","typescript-eslint":"^8.59.3"},"_npmOperationalInternal":{"tmp":"tmp/sakata-syllable-engine_0.1.0_1778896786990_0.6288251791189987","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@bariqmbani/sakata-syllable-engine","version":"0.1.1","description":"Deterministic Indonesian last-syllable engine for gameplay.","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"sideEffects":false,"scripts":{"clean":"node -e \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","build":"npm run clean && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","lint":"eslint .","test":"vitest run","test:watch":"vitest","format":"prettier . --write","format:check":"prettier . --check"},"keywords":["indonesian","syllable","word-game"],"author":{"name":"Bariq Mbani","email":"bariq.m70@gmail.com"},"license":"MIT","engines":{"node":">=20"},"devDependencies":{"@eslint/js":"^10.0.1","eslint":"^10.3.0","prettier":"^3.8.3","typescript":"^6.0.3","typescript-eslint":"^8.59.3","vitest":"^4.1.6"},"gitHead":"ceb27b97f3d5c8a9c555c27d94ef0a2e50fb96d3","_id":"@bariqmbani/sakata-syllable-engine@0.1.1","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-xENwyTrC7WxPZc36w+dIA+f0oJv1n76xmonhoSXAyLExREUP749Y/e4BKcVGvFbutYx8g8J0lCiMuh6qT3kQlQ==","shasum":"302304a45ea72788928d5e0ea759014cf8d6800d","tarball":"https://registry.npmjs.org/@bariqmbani/sakata-syllable-engine/-/sakata-syllable-engine-0.1.1.tgz","fileCount":2,"unpackedSize":2966,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCRdq56oakcutReOYdxI1b0U3G7z0UNInljusEPEjet8gIhAOFiPKGqJFpTHexcj+cYfOWNbgd991QypYUOh0ReTeZj"}]},"_npmUser":{"name":"bariqmbani","email":"bariq.m70@gmail.com"},"directories":{},"maintainers":[{"name":"bariqmbani","email":"bariq.m70@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sakata-syllable-engine_0.1.1_1778897371434_0.8514492505094147"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-16T01:59:46.908Z","modified":"2026-05-16T02:09:31.734Z","0.1.0":"2026-05-16T01:59:47.135Z","0.1.1":"2026-05-16T02:09:31.608Z"},"author":{"name":"Bariq Mbani","email":"bariq.m70@gmail.com"},"license":"MIT","keywords":["indonesian","syllable","word-game"],"description":"Deterministic Indonesian last-syllable engine for gameplay.","maintainers":[{"name":"bariqmbani","email":"bariq.m70@gmail.com"}],"readme":"# Sakata Syllable Engine\n\nDeterministic Indonesian last-syllable engine for word-chain gameplay.\n\nThe engine is designed for consistent gameplay behavior, not academic syllabification. It has no runtime database, network, AI, ML, or Node-only dependency in the core engine.\n\n## Package\n\nInstall it from a Node project:\n\n```bash\nnpm install @bariqmbani/sakata-syllable-engine\n```\n\nThis package is ESM-only and exports its TypeScript declarations from the root entrypoint.\n\n## Usage\n\n```ts\nimport { getLastSyllable, identifyLastSyllable, splitLastSyllable } from 'sakata-syllable-engine';\n\nidentifyLastSyllable('makan');\n// ['ma', 'kan']\n\ngetLastSyllable('kandidat');\n// 'dat'\n\nsplitLastSyllable('makan');\n// {\n//   original: 'makan',\n//   normalized: 'makan',\n//   prefix: 'ma',\n//   last: 'kan',\n//   parts: ['ma', 'kan'],\n//   ruleId: 'ends-with-vc',\n//   source: 'rule'\n// }\n```\n\n## Base Word Lookup\n\nSome gameplay splits depend on knowing whether a stripped base word is known. The engine includes a small built-in gameplay fallback, and callers can override it with `isKnownBaseWord`.\n\n```ts\nidentifyLastSyllable('memulai', {\n  isKnownBaseWord: (word) => word === 'mulai',\n});\n// ['memu', 'lai']\n```\n\n## Edge Handler\n\nThe package also exports a framework-neutral Web `Request` handler.\n\n```ts\nimport { handleSyllableRequest } from 'sakata-syllable-engine';\n\nexport const GET = handleSyllableRequest;\n```\n\nFor a valid request like `?word=makan`, the handler returns:\n\n```json\n{\n  \"word\": \"makan\",\n  \"lastSyllable\": \"kan\",\n  \"parts\": [\"ma\", \"kan\"]\n}\n```\n\nFor a missing or empty word, it returns `400`:\n\n```json\n{\n  \"error\": \"EMPTY_INPUT\",\n  \"message\": \"Kata wajib diisi.\"\n}\n```\n\n## Development\n\n```bash\nnpm install\nnpm run test\nnpm run typecheck\nnpm run lint\nnpm run format:check\nnpm run build\n```\n","readmeFilename":"README.md"}