{"_id":"@4kk11/cooklang-sankey","_rev":"6-7fb730a159a51236225cd90fc4ad4b31","name":"@4kk11/cooklang-sankey","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.0":{"name":"@4kk11/cooklang-sankey","version":"0.1.0","keywords":["cooklang","sankey","diagram","recipe","visualization"],"license":"MIT","_id":"@4kk11/cooklang-sankey@0.1.0","maintainers":[{"name":"4kk11","email":"akiaki118row@yahoo.co.jp"}],"dist":{"shasum":"368e0d909a58d217dce22e7fe221f22521aec881","tarball":"https://registry.npmjs.org/@4kk11/cooklang-sankey/-/cooklang-sankey-0.1.0.tgz","fileCount":8,"integrity":"sha512-1SWpzMRUEmDaq7YKoTHIldWKTOs+Tw3tHvbjo1xWhDfuIReYN4MQwpMX+4kLPjjokCfmKdBNuAfcmudYp+yapQ==","signatures":[{"sig":"MEYCIQCj8Zf77lq0EV1ScCG/Xc8uDcSoc9r+CywGjP+hRt2oRQIhAJNNlcMa0fTo50A+t2UQEPGpGYBFYZayO+w8TT001LbZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":168003},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"569e9d5bd17672f101483a29f31cf71263d605ad","scripts":{"dev":"tsup --watch","build":"tsup","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","typecheck":"tsc --noEmit","format:check":"prettier --check \"src/**/*.ts\""},"_npmUser":{"name":"4kk11","email":"akiaki118row@yahoo.co.jp"},"repository":{"url":"","type":"git"},"_npmVersion":"10.9.2","description":"Generate Sankey diagram data from Cooklang recipes","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"toposort":"^2.0.2","@cooklang/cooklang":"^0.17.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.0.0","prettier":"^3.7.4","typescript":"^5.0.0","@types/node":"^25.0.3","@types/toposort":"^2.0.7"},"_npmOperationalInternal":{"tmp":"tmp/cooklang-sankey_0.1.0_1767107002609_0.6803671565573506","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@4kk11/cooklang-sankey","version":"0.1.1","keywords":["cooklang","sankey","diagram","recipe","visualization"],"license":"MIT","_id":"@4kk11/cooklang-sankey@0.1.1","maintainers":[{"name":"4kk11","email":"akiaki118row@yahoo.co.jp"}],"dist":{"shasum":"16ee92eed7c4171bbd362fb2c2aa2b15753161f4","tarball":"https://registry.npmjs.org/@4kk11/cooklang-sankey/-/cooklang-sankey-0.1.1.tgz","fileCount":8,"integrity":"sha512-Wjfd+2wPOkiugbjUOos9HYmTdfB8v09mC4TDxo5BAWUhDJS1oVlxriAA0Cm4FRFYhTOmjSEaM9jevb0Zax3l4g==","signatures":[{"sig":"MEUCIAm8Wr9tUb9d/GFyxjcIV3L3Iw9NWpejvIgRVw+sAD9+AiEAmQFaXKhEykytptAHE3aZgSs9UMW0tLJsTqa4tObtVOc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":186189},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"14a70ae90a6b6d81e6c720f2c8f9e4f7acb5ecf3","scripts":{"dev":"tsup --watch","build":"tsup","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","typecheck":"tsc --noEmit","format:check":"prettier --check \"src/**/*.ts\""},"_npmUser":{"name":"4kk11","email":"akiaki118row@yahoo.co.jp"},"repository":{"url":"","type":"git"},"_npmVersion":"10.9.2","description":"Generate Sankey diagram data from Cooklang recipes","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"toposort":"^2.0.2","@cooklang/cooklang":"^0.17.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.0.0","prettier":"^3.7.4","typescript":"^5.0.0","@types/node":"^25.0.3","@types/toposort":"^2.0.7"},"_npmOperationalInternal":{"tmp":"tmp/cooklang-sankey_0.1.1_1767167625999_0.22297998095067162","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@4kk11/cooklang-sankey","version":"0.1.2","keywords":["cooklang","sankey","diagram","recipe","visualization"],"license":"MIT","_id":"@4kk11/cooklang-sankey@0.1.2","maintainers":[{"name":"4kk11","email":"akiaki118row@yahoo.co.jp"}],"dist":{"shasum":"1f64cfc868ecd4ee7de05f0869dd4c003b334180","tarball":"https://registry.npmjs.org/@4kk11/cooklang-sankey/-/cooklang-sankey-0.1.2.tgz","fileCount":8,"integrity":"sha512-RxoKZHDkW5b0DpQb8x675I1upsv9qrlWUoP3HmqhB8TFThfayB+Tx3/rwHsk77DoG7x3P3DLjMoLCrV+tOaN6A==","signatures":[{"sig":"MEUCIQCQH0njLk2Xd5e+6mT0jtxfcX0XtA0KRE8lMDMEiK0uGwIgbAolf3w0AiPpuniV8GVSTmlJdfdXGgf903hmwhNOazk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":176385},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"14a70ae90a6b6d81e6c720f2c8f9e4f7acb5ecf3","scripts":{"dev":"tsup --watch","build":"tsup","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","typecheck":"tsc --noEmit","format:check":"prettier --check \"src/**/*.ts\""},"_npmUser":{"name":"4kk11","email":"akiaki118row@yahoo.co.jp"},"repository":{"url":"","type":"git"},"_npmVersion":"10.9.2","description":"Generate Sankey diagram data from Cooklang recipes","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"toposort":"^2.0.2","@cooklang/cooklang":"^0.17.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.0.0","prettier":"^3.7.4","typescript":"^5.0.0","@types/node":"^25.0.3","@types/toposort":"^2.0.7"},"_npmOperationalInternal":{"tmp":"tmp/cooklang-sankey_0.1.2_1767170196806_0.538280746835555","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@4kk11/cooklang-sankey","version":"0.1.3","keywords":["cooklang","sankey","diagram","recipe","visualization"],"license":"MIT","_id":"@4kk11/cooklang-sankey@0.1.3","maintainers":[{"name":"4kk11","email":"akiaki118row@yahoo.co.jp"}],"dist":{"shasum":"6af3f1655356d808452fe0c936782b14d08cc63d","tarball":"https://registry.npmjs.org/@4kk11/cooklang-sankey/-/cooklang-sankey-0.1.3.tgz","fileCount":8,"integrity":"sha512-0CnP55wqZYYIVGp36p/DZcEWm6h9aSBjOs1ife9/9I3pUyJEA92kFT2xEt6bdnMuEIVKK2G0adFBiji+aMEnew==","signatures":[{"sig":"MEUCICiGC7Tgtc5oSRgIswCDWsBqkiNOmEWJafwLXHCH8iupAiEA5ityymXAreHL179hWn59NOev07tQcEE6F8F06xR+rBU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":168003},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"14a70ae90a6b6d81e6c720f2c8f9e4f7acb5ecf3","scripts":{"dev":"tsup --watch","build":"tsup","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","typecheck":"tsc --noEmit","format:check":"prettier --check \"src/**/*.ts\""},"_npmUser":{"name":"4kk11","email":"akiaki118row@yahoo.co.jp"},"repository":{"url":"","type":"git"},"_npmVersion":"10.9.2","description":"Generate Sankey diagram data from Cooklang recipes","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"toposort":"^2.0.2","@cooklang/cooklang":"^0.17.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.0.0","prettier":"^3.7.4","typescript":"^5.0.0","@types/node":"^25.0.3","@types/toposort":"^2.0.7"},"_npmOperationalInternal":{"tmp":"tmp/cooklang-sankey_0.1.3_1767170410038_0.10148821602939906","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@4kk11/cooklang-sankey","version":"0.1.4","keywords":["cooklang","sankey","diagram","recipe","visualization"],"license":"MIT","_id":"@4kk11/cooklang-sankey@0.1.4","maintainers":[{"name":"4kk11","email":"akiaki118row@yahoo.co.jp"}],"dist":{"shasum":"a6cc0d37c324993fa2813da6091f8bbfc5d8ba64","tarball":"https://registry.npmjs.org/@4kk11/cooklang-sankey/-/cooklang-sankey-0.1.4.tgz","fileCount":8,"integrity":"sha512-cRV2yMJM7jMxx1bvxHWQROoLk3sIK3XTgx54R/SAnL49CJiy61FUJEtzbcufocYieunWu/58qCTA2eglSo1JBg==","signatures":[{"sig":"MEQCIC0EBCAn3YBWdA9/9oKvxwIcWp2yWS5SfHmZvFQ31cYlAiAk2RBulxqkyAugQ1ySk8myWDMvsB1lEEXdhSrWa+Hwbg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":174735},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"0adf1c42df030b55eb6be05d9c63696bec145180","scripts":{"dev":"tsup --watch","build":"tsup","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","typecheck":"tsc --noEmit","format:check":"prettier --check \"src/**/*.ts\""},"_npmUser":{"name":"4kk11","email":"akiaki118row@yahoo.co.jp"},"repository":{"url":"","type":"git"},"_npmVersion":"10.9.2","description":"Generate Sankey diagram data from Cooklang recipes","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"toposort":"^2.0.2","@cooklang/cooklang":"^0.17.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.0.0","prettier":"^3.7.4","typescript":"^5.0.0","@types/node":"^25.0.3","@types/toposort":"^2.0.7"},"_npmOperationalInternal":{"tmp":"tmp/cooklang-sankey_0.1.4_1767172750607_0.36734205530454433","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@4kk11/cooklang-sankey","version":"0.1.5","description":"Generate Sankey diagram data from Cooklang recipes","type":"module","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","sideEffects":false,"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\""},"dependencies":{"@cooklang/cooklang":"^0.17.2","toposort":"^2.0.2"},"devDependencies":{"@types/node":"^25.0.3","@types/toposort":"^2.0.7","prettier":"^3.7.4","tsup":"^8.0.0","tsx":"^4.21.0","typescript":"^5.0.0"},"keywords":["cooklang","sankey","diagram","recipe","visualization"],"license":"MIT","publishConfig":{"access":"public"},"repository":{"type":"git","url":""},"_id":"@4kk11/cooklang-sankey@0.1.5","gitHead":"2b660c68d11d7710e366f6b3709f17e5e56439af","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-4sLmRPHbiiqI7dA++9YnC3QppkbsYbhqAP5cvt9Wz5UekhP0LxOrxbYnFVtztevGdlWS32xbJpOh7hZnxFJPfQ==","shasum":"b677351a61a6c15e1463146d2167211c6f1962a6","tarball":"https://registry.npmjs.org/@4kk11/cooklang-sankey/-/cooklang-sankey-0.1.5.tgz","fileCount":8,"unpackedSize":152151,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFAGyIAwrvU2KhRWQX3lQJcXQFmtvTRj0r/5qZkqG+FEAiBUJsCZjVMlbIi9ddo0PO4nVslk4TdMBtCmWefMhwTDKQ=="}]},"_npmUser":{"name":"4kk11","email":"akiaki118row@yahoo.co.jp"},"directories":{},"maintainers":[{"name":"4kk11","email":"akiaki118row@yahoo.co.jp"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cooklang-sankey_0.1.5_1767178215977_0.8429663995811985"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-30T15:03:22.490Z","modified":"2025-12-31T10:50:16.318Z","0.1.0":"2025-12-30T15:03:22.803Z","0.1.1":"2025-12-31T07:53:46.144Z","0.1.2":"2025-12-31T08:36:36.951Z","0.1.3":"2025-12-31T08:40:10.192Z","0.1.4":"2025-12-31T09:19:10.754Z","0.1.5":"2025-12-31T10:50:16.119Z"},"license":"MIT","keywords":["cooklang","sankey","diagram","recipe","visualization"],"repository":{"type":"git","url":""},"description":"Generate Sankey diagram data from Cooklang recipes","maintainers":[{"name":"4kk11","email":"akiaki118row@yahoo.co.jp"}],"readme":"# cooklang-sankey\n\nGenerate Sankey diagram data from Cooklang recipes.\n\n## Installation\n\n```bash\nnpm install cooklang-sankey\n```\n\n## Usage\n\n### Browser Environment\n\n```typescript\nimport { CooklangParser, generateSankeyData, optimizeSankeyData } from 'cooklang-sankey';\n\n// Create a parser instance\nconst parser = new CooklangParser();\n\n// Your Cooklang recipe text\nconst recipeText = `\n---\ntitle: カルボナーラ\nservings: 2\n---\n\n@パスタ{200g}を茹でる。\n@卵{2個}と@パルメザンチーズ{50g}を混ぜる。\n@ベーコン{100g}を炒める。\nパスタとソースを合わせて完成。\n`;\n\n// Parse the recipe text\nconst [recipe] = parser.parse(recipeText);\n\n// Generate Sankey data from parsed recipe\nconst data = generateSankeyData(recipe, {\n  finalNodeName: \"完成品\",\n  normalization: \"logarithmic\",\n});\n\n// Optionally optimize the data\nconst optimized = data ? optimizeSankeyData(data) : null;\n\nconsole.log(optimized);\n```\n\n### Node.js Environment\n\n```typescript\nimport { CooklangParser, generateSankeyData, optimizeSankeyData } from 'cooklang-sankey';\n\n// Create parser instance\nconst parser = new CooklangParser();\n\nconst recipeText = `\n@パスタ{200g}を茹でる。\n@卵{2個}と@パルメザンチーズ{50g}を混ぜる。\n`;\n\n// Parse the recipe text\nconst [recipe] = parser.parse(recipeText);\n\n// Generate Sankey data from parsed recipe\nconst data = generateSankeyData(recipe);\nconst optimized = data ? optimizeSankeyData(data) : null;\n\nconsole.log(JSON.stringify(optimized, null, 2));\n```\n\n### API\n\n#### `generateSankeyData(recipe, options?)`\n\nGenerates Sankey diagram data from a parsed Cooklang recipe.\n\n**Parameters:**\n- `recipe: CooklangRecipe` - Parsed Cooklang recipe object\n- `options?: SankeyGeneratorOptions`\n  - `finalNodeName?: string` - Name for the final node (default: \"完成品\")\n  - `normalization?: \"logarithmic\" | \"linear\" | \"none\"` - Value normalization method\n  - `minLinkValue?: number` - Minimum link value (default: 0.1)\n\n**Returns:** `SankeyData | null`\n\n#### `optimizeSankeyData(data)`\n\nValidates and optimizes Sankey data by removing invalid links and orphaned nodes.\n\n**Returns:** `SankeyData`\n\n### Types\n\n```typescript\ninterface SankeyData {\n  nodes: SankeyNode[];\n  links: SankeyLink[];\n}\n\ninterface SankeyNode {\n  id: string;\n  name: string;\n  category: \"ingredient\" | \"process\" | \"final\";\n  value: number;\n  label: string;\n  originalValue?: number;\n  metadata?: BaseNodeMetadata;\n}\n\ninterface SankeyLink {\n  source: string;\n  target: string;\n  value: number;\n  originalValue?: number;\n  metadata?: BaseLinkMetadata;\n}\n```\n\n## React Integration\n\nFor React applications, we recommend creating custom hooks:\n\n```typescript\nimport { useMemo } from 'react';\nimport {\n  CooklangParser,\n  generateSankeyData,\n  optimizeSankeyData,\n  type CooklangRecipe\n} from 'cooklang-sankey';\n\n// Create a singleton parser instance\nconst parser = new CooklangParser();\n\nexport function useSankeyData(recipeText: string) {\n  return useMemo(() => {\n    if (!recipeText) return null;\n\n    // Parse the recipe text\n    const [recipe] = parser.parse(recipeText);\n\n    // Generate Sankey data from parsed recipe\n    const data = generateSankeyData(recipe);\n    return data ? optimizeSankeyData(data) : null;\n  }, [recipeText]);\n}\n\n// Or if you already have a parsed recipe:\nexport function useSankeyDataFromRecipe(recipe: CooklangRecipe | null) {\n  return useMemo(() => {\n    if (!recipe) return null;\n    const data = generateSankeyData(recipe);\n    return data ? optimizeSankeyData(data) : null;\n  }, [recipe]);\n}\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}