{"_id":"@bitcoinerlab/miniscript-policies","_rev":"2-8efbc2cf5eb9cbeb52a5d782a1aba417","name":"@bitcoinerlab/miniscript-policies","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"@bitcoinerlab/miniscript-policies","version":"1.0.0","keywords":["miniscript","policy","compiler","bitcoin","asm","descriptors"],"author":{"name":"Jose-Luis Landabaso","email":"landabaso@gmail.com"},"license":"MIT","_id":"@bitcoinerlab/miniscript-policies@1.0.0","maintainers":[{"name":"jl.landabaso","email":"landabaso@gmail.com"}],"homepage":"https://bitcoinerlab.com/modules/miniscript","bugs":{"url":"https://github.com/bitcoinerlab/miniscript-policies/issues"},"dist":{"shasum":"92a2f55ef9e7fd928e7efa17c447337b73293151","tarball":"https://registry.npmjs.org/@bitcoinerlab/miniscript-policies/-/miniscript-policies-1.0.0.tgz","fileCount":14,"integrity":"sha512-UiCfXaZhiFa2qWGllJ1teGkihY4VJXT7Z5rHeg+4iaxTvcmP/HVUzqVVUdcJEX2z59MuxnnItcpylM122dyHrA==","signatures":[{"sig":"MEUCIQD04c45eMH6LZPALArxXd84CgJ/zcTHDuFLNgeKGxMyZAIgRNEjl/fEj6U2i35Dy5sNhim3grv9yN8AuUyF/aca0Y0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":850500},"main":"dist/index.js","babel":{"env":{"test":{"plugins":["@babel/plugin-transform-modules-commonjs","babel-plugin-transform-import-meta"]}}},"types":"types/index.d.ts","gitHead":"e4ed1a1f19c14df38f07582e355700810bb33f8f","scripts":{"test":"make clean && make && npm run build:prod && jest","build":"rollup -c --bundleConfigAsCjs","build:prod":"NODE_ENV=production rollup -c --bundleConfigAsCjs","prepublishOnly":"npm test"},"_npmUser":{"name":"jl.landabaso","email":"landabaso@gmail.com"},"repository":{"url":"git+https://github.com/bitcoinerlab/miniscript-policies.git","type":"git"},"_npmVersion":"10.8.2","description":"Bitcoin Miniscript policy compiler","directories":{},"_nodeVersion":"20.19.4","dependencies":{"bip68":"^1.0.4"},"COMMENT_babel":"Babel plugins are are only needed for the jest testing environment. Jest needs to use commonjs. Also, jest cannot handle ESM converted code, since it uses 'import.meta.url'. See src/bindings.js. babel-plugin-transform-import-meta fixes it.","_hasShrinkwrap":false,"devDependencies":{"rollup":"^3.29.5","@bitcoinerlab/configs":"^2.0.0","@rollup/plugin-commonjs":"^29.0.0","babel-plugin-transform-import-meta":"^2.2.0","@babel/plugin-transform-modules-commonjs":"^7.19.6"},"_npmOperationalInternal":{"tmp":"tmp/miniscript-policies_1.0.0_1769777737263_0.6879337265756353","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bitcoinerlab/miniscript-policies","author":{"name":"Jose-Luis Landabaso","email":"landabaso@gmail.com"},"license":"MIT","keywords":["miniscript","policy","compiler","bitcoin","asm","descriptors"],"homepage":"https://bitcoinerlab.com/modules/miniscript","version":"1.1.0","description":"Bitcoin Miniscript policy compiler","main":"dist/index.js","types":"types/index.d.ts","scripts":{"build":"rollup -c --bundleConfigAsCjs","build:prod":"NODE_ENV=production rollup -c --bundleConfigAsCjs","prepublishOnly":"npm test","test":"make clean && make && npm run build:prod && jest"},"COMMENT_babel":"Babel plugins are are only needed for the jest testing environment. Jest needs to use commonjs. Also, jest cannot handle ESM converted code, since it uses 'import.meta.url'. See src/bindings.js. babel-plugin-transform-import-meta fixes it.","babel":{"env":{"test":{"plugins":["@babel/plugin-transform-modules-commonjs","babel-plugin-transform-import-meta"]}}},"repository":{"type":"git","url":"git+https://github.com/bitcoinerlab/miniscript-policies.git"},"devDependencies":{"@babel/plugin-transform-modules-commonjs":"^7.19.6","@bitcoinerlab/configs":"^2.0.0","@rollup/plugin-commonjs":"^29.0.0","babel-plugin-transform-import-meta":"^2.2.0","rollup":"^3.29.5"},"dependencies":{"@bitcoinerlab/miniscript":"^2.0.0","bip68":"^1.0.4"},"bugs":{"url":"https://github.com/bitcoinerlab/miniscript-policies/issues"},"_id":"@bitcoinerlab/miniscript-policies@1.1.0","gitHead":"06b979a6f28a8b55114224e1236e8a6c6dc48c69","_nodeVersion":"20.19.4","_npmVersion":"10.8.2","dist":{"integrity":"sha512-ufbWulrnZeEFwmh7O6Yy+d8W1RP64H4u1LNEEnpYn8JQCUs4tZm39sb3BSE0h4eO5QuszU0Va8QSLa98/1/4bA==","shasum":"1835a7ce9f0775347ed81d4a3cac4418a97c6ffc","tarball":"https://registry.npmjs.org/@bitcoinerlab/miniscript-policies/-/miniscript-policies-1.1.0.tgz","fileCount":4,"unpackedSize":796850,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFZ7/tYZnjb+ZxEuqBfbVG+jbzQMDJgecP+B6/uIHc4AAiEAvRyMmJibQTkJsdi+0gjZBusmV6DK8g3aOo+tx2JQYAo="}]},"_npmUser":{"name":"jl.landabaso","email":"landabaso@gmail.com"},"directories":{},"maintainers":[{"name":"jl.landabaso","email":"landabaso@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/miniscript-policies_1.1.0_1770988493348_0.029566963306344674"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-30T12:55:37.154Z","modified":"2026-02-13T13:14:53.716Z","1.0.0":"2026-01-30T12:55:37.497Z","1.1.0":"2026-02-13T13:14:53.561Z"},"bugs":{"url":"https://github.com/bitcoinerlab/miniscript-policies/issues"},"author":{"name":"Jose-Luis Landabaso","email":"landabaso@gmail.com"},"license":"MIT","homepage":"https://bitcoinerlab.com/modules/miniscript","keywords":["miniscript","policy","compiler","bitcoin","asm","descriptors"],"repository":{"type":"git","url":"git+https://github.com/bitcoinerlab/miniscript-policies.git"},"description":"Bitcoin Miniscript policy compiler","maintainers":[{"name":"jl.landabaso","email":"landabaso@gmail.com"}],"readme":"# Miniscript Policies\n\n`@bitcoinerlab/miniscript-policies` exposes the reference C++ Miniscript policy\ncompiler from [`sipa/miniscript`](https://github.com/sipa/miniscript) in\nJavaScript via Emscripten.\n\nIt is designed for projects that want to compile human-friendly policies (like\n`or(and(pk(A),older(8640)),pk(B))`) into Miniscript expressions.\n\nUpstream Miniscript reference docs: https://bitcoin.sipa.be/miniscript/\n\n## What this package provides\n\n- `compilePolicy(policy)`: reference policy compiler output (P2WSH-oriented)\n- `compilePolicyTaproot(policy)`: Taproot-focused policy compiler shim\n- `ready`: promise you must await before using compiler functions\n\nFor Miniscript parsing/analysis/satisfier features, use\n[`@bitcoinerlab/miniscript`](https://github.com/bitcoinerlab/miniscript).\n\n## How Taproot support works\n\n`compilePolicyTaproot` is a strict shim built on top of the same reference\ncompiler:\n\n1. Compile policy with the reference C++ compiler.\n2. Rewrite `multi(...)` to `multi_a(...)`.\n3. Validate the rewritten expression in tapscript context using\n   `@bitcoinerlab/miniscript`.\n4. If reference compilation fails, forward the same reference error string\n   (for example `\"[compile error]\"` or `\"[exception: ...]\"`) with\n   `issane=false`.\n5. If rewrite/validation fails, return a Taproot-specific error string with\n   prefix `\"[taproot rewrite error]\"` (or `\"[taproot rewrite exception]\"`)\n   and `issane=false`.\n\nThis gives a practical policy-to-miniscript path for Taproot while preserving\nstrict safety checks.\n\n## Installation\n\n```bash\nnpm install @bitcoinerlab/miniscript-policies\n```\n\n## Quick start\n\n```javascript\nimport {\n  compilePolicy,\n  compilePolicyTaproot,\n  ready\n} from '@bitcoinerlab/miniscript-policies';\n\nawait ready;\n\nconst policy = 'or(and(pk(A),older(8640)),pk(B))';\n\n// Reference compiler (includes asm)\nconst p2wsh = compilePolicy(policy);\nif (!p2wsh.issane) {\n  console.warn('Policy result is not sane for P2WSH:', p2wsh.miniscript);\n} else {\n  console.log(p2wsh.miniscript);\n}\n\n// Taproot shim (no asm)\nconst taproot = compilePolicyTaproot('thresh(2,pk(A),pk(B),pk(C))');\nif (!taproot.issane) {\n  console.warn('Policy result is not sane for tapscript:', taproot.miniscript);\n} else {\n  console.log(taproot.miniscript); // multi_a(2,A,B,C)\n}\n```\n\n## API\n\n### `compilePolicy(policy: string)`\n\nReturns:\n\n```ts\n{\n  miniscript: string;\n  asm: string;\n  issane: boolean;\n  issanesublevel: boolean;\n}\n```\n\nNotes:\n\n- This follows the reference compiler behavior from\n  [`sipa/miniscript`](https://github.com/sipa/miniscript).\n- `asm`, `issane`, and `issanesublevel` are computed by the bundled C++\n  reference implementation and are exposed for informational/compatibility\n  purposes.\n- On failure, `miniscript` and `asm` are `\"[compile error]\"`.\n\n### `compilePolicyTaproot(policy: string)`\n\nReturns:\n\n```ts\n{\n  miniscript: string;\n  issane: boolean;\n}\n```\n\nNotes:\n\n- Same result shape style as `compilePolicy`, but without `asm`.\n- Recommended success check is `issane`.\n- On failure, `issane` is `false` and `miniscript` is an error string:\n\n```ts\n{\n  miniscript:\n    | '[compile error]'\n    | `[exception: ...]`\n    | `[taproot rewrite error] ...`\n    | `[taproot rewrite exception] ...`;\n  issane: false;\n}\n```\n\n### `ready: Promise<void>`\n\nAwait this once before calling any compiler function.\n\n## Related package\n\nIf you need Miniscript analysis, parsing, satisfier, or tapscript checks beyond\npolicy-to-miniscript compilation, use\n[`@bitcoinerlab/miniscript`](https://github.com/bitcoinerlab/miniscript).\n\nFor application-level validation in both P2WSH and Taproot contexts, prefer\nusing `@bitcoinerlab/miniscript` directly. In this package, the reference\n`asm`/sanity fields are returned as informational outputs.\n\n## Upstream credit\n\nThis package is built on top of Pieter Wuille's upstream Miniscript work:\n\n- https://github.com/sipa/miniscript\n- https://bitcoin.sipa.be/miniscript/\n\n## Build\n\nThis package uses Emscripten.\n\n```bash\nmake clean && make\nnpm run build\n```\n\n## Test\n\n```bash\nnpm test\n```\n","readmeFilename":"README.md"}