[{"data":1,"prerenderedAt":4115},["ShallowReactive",2],{"navigation":3,"\u002Fservices\u002Fmoney":927,"mdc-8bt02u-key":4082,"mdc--3sqwl6-key":4099},[4,40,114,446,474,498,596,903],{"title":5,"path":6,"stem":7,"children":8},"Architecture","\u002Farchitecture","architecture",[9,14,28,32,36],{"title":10,"path":6,"stem":11,"access":12,"icon":13},"Overview","architecture\u002Findex","public","i-lucide-network",{"title":10,"path":15,"stem":16,"children":17,"access":12,"icon":19},"\u002Farchitecture\u002Fkernel","architecture\u002F1.kernel\u002Findex",[18,20,24],{"title":10,"path":15,"stem":16,"access":12,"icon":19},"i-lucide-box",{"title":21,"path":22,"stem":23,"access":12},"Enclave","\u002Farchitecture\u002Fkernel\u002Fenclave","architecture\u002F1.kernel\u002Fenclave",{"title":25,"path":26,"stem":27,"access":12},"Forking the enclave","\u002Farchitecture\u002Fkernel\u002Fforking-the-enclave","architecture\u002F1.kernel\u002Fforking-the-enclave",{"title":29,"path":30,"stem":31,"access":12},"Ports","\u002Farchitecture\u002Fports","architecture\u002F2.ports",{"title":33,"path":34,"stem":35,"access":12},"Service layers","\u002Farchitecture\u002Fservice-layers","architecture\u002F3.service-layers",{"title":37,"path":38,"stem":39,"access":12},"Families","\u002Farchitecture\u002Ffamilies","architecture\u002F4.families",{"title":41,"path":42,"stem":43,"children":44},"Core","\u002Fcore","core",[45,47,50,53,56,88,97],{"title":10,"path":42,"stem":46,"access":12,"icon":19},"core\u002Findex",{"title":10,"path":48,"stem":49,"access":12},"\u002Fcore\u002F01-overview","core\u002F01-overview",{"title":10,"path":51,"stem":52,"access":12},"\u002Fcore\u002F05-stores","core\u002F05-stores",{"title":10,"path":54,"stem":55,"access":12},"\u002Fcore\u002F06-permissions-and-keyring","core\u002F06-permissions-and-keyring",{"title":10,"path":57,"stem":58,"children":59,"access":12},"\u002Fcore\u002Fnoydb","core\u002F2.noydb\u002Findex",[60,61,65,68,72,76,80,84],{"title":10,"path":57,"stem":58,"access":12},{"title":62,"path":63,"stem":64,"access":12},"Noydb","\u002Fcore\u002Fnoydb\u002Fmethods","core\u002F2.noydb\u002F1.methods",{"title":21,"path":66,"stem":67,"access":12},"\u002Fcore\u002Fnoydb\u002Fenclave","core\u002F2.noydb\u002F2.enclave",{"title":69,"path":70,"stem":71,"access":12},"Secret & keyring","\u002Fcore\u002Fnoydb\u002Fkeyring","core\u002F2.noydb\u002F3.keyring",{"title":73,"path":74,"stem":75,"access":12},"Authentication","\u002Fcore\u002Fnoydb\u002Fauthentication","core\u002F2.noydb\u002F4.authentication",{"title":77,"path":78,"stem":79,"access":12},"Auth recovery","\u002Fcore\u002Fnoydb\u002Frecovery","core\u002F2.noydb\u002F5.recovery",{"title":81,"path":82,"stem":83,"access":12},"Configuration","\u002Fcore\u002Fnoydb\u002Fconfiguration","core\u002F2.noydb\u002F6.configuration",{"title":85,"path":86,"stem":87,"access":12},"Strategies","\u002Fcore\u002Fnoydb\u002Fstrategies","core\u002F2.noydb\u002F7.strategies",{"title":10,"path":89,"stem":90,"children":91,"access":12},"\u002Fcore\u002Fvault","core\u002F3.vault\u002Findex",[92,93],{"title":10,"path":89,"stem":90,"access":12},{"title":94,"path":95,"stem":96,"access":12},"Vault","\u002Fcore\u002Fvault\u002Fmethods","core\u002F3.vault\u002F1.methods",{"title":10,"path":98,"stem":99,"children":100,"access":12},"\u002Fcore\u002Fcollection","core\u002F4.collection\u002Findex",[101,102,106,110],{"title":10,"path":98,"stem":99,"access":12},{"title":103,"path":104,"stem":105,"access":12},"Collection","\u002Fcore\u002Fcollection\u002Fmethods","core\u002F4.collection\u002F1.methods",{"title":107,"path":108,"stem":109,"access":12},"Querying","\u002Fcore\u002Fcollection\u002Fquerying","core\u002F4.collection\u002F2.querying",{"title":111,"path":112,"stem":113,"access":12},"Schema","\u002Fcore\u002Fcollection\u002Fschema","core\u002F4.collection\u002F3.schema",{"title":37,"path":115,"stem":116,"children":117},"\u002Ffamilies","families",[118,121,168,194,208,212,216,294,340],{"title":10,"path":115,"stem":119,"access":12,"icon":120},"families\u002Findex","i-lucide-plug",{"title":122,"path":123,"stem":124,"children":125,"access":12,"icon":127},"as-Exports","\u002Ffamilies\u002Fas","families\u002Fas\u002Findex",[126,128,132,136,140,144,148,152,156,160,164],{"title":122,"path":123,"stem":124,"access":12,"icon":127},"i-lucide-book-open",{"title":129,"path":130,"stem":131,"access":12},"aws-s3","\u002Ffamilies\u002Fas\u002Faws-s3","families\u002Fas\u002Faws-s3",{"title":133,"path":134,"stem":135,"access":12},"blob","\u002Ffamilies\u002Fas\u002Fblob","families\u002Fas\u002Fblob",{"title":137,"path":138,"stem":139,"access":12},"csv","\u002Ffamilies\u002Fas\u002Fcsv","families\u002Fas\u002Fcsv",{"title":141,"path":142,"stem":143,"access":12},"json","\u002Ffamilies\u002Fas\u002Fjson","families\u002Fas\u002Fjson",{"title":145,"path":146,"stem":147,"access":12},"ndjson","\u002Ffamilies\u002Fas\u002Fndjson","families\u002Fas\u002Fndjson",{"title":149,"path":150,"stem":151,"access":12},"noydb","\u002Ffamilies\u002Fas\u002Fnoydb","families\u002Fas\u002Fnoydb",{"title":153,"path":154,"stem":155,"access":12},"sql","\u002Ffamilies\u002Fas\u002Fsql","families\u002Fas\u002Fsql",{"title":157,"path":158,"stem":159,"access":12},"xlsx","\u002Ffamilies\u002Fas\u002Fxlsx","families\u002Fas\u002Fxlsx",{"title":161,"path":162,"stem":163,"access":12},"xml","\u002Ffamilies\u002Fas\u002Fxml","families\u002Fas\u002Fxml",{"title":165,"path":166,"stem":167,"access":12},"zip","\u002Ffamilies\u002Fas\u002Fzip","families\u002Fas\u002Fzip",{"title":169,"path":170,"stem":171,"children":172,"access":12,"icon":127},"at-Seals","\u002Ffamilies\u002Fat","families\u002Fat\u002Findex",[173,174,178,182,186,190],{"title":169,"path":170,"stem":171,"access":12,"icon":127},{"title":175,"path":176,"stem":177,"access":12},"aws-kms","\u002Ffamilies\u002Fat\u002Faws-kms","families\u002Fat\u002Faws-kms",{"title":179,"path":180,"stem":181,"access":12},"azure-keyvault","\u002Ffamilies\u002Fat\u002Fazure-keyvault","families\u002Fat\u002Fazure-keyvault",{"title":183,"path":184,"stem":185,"access":12},"env","\u002Ffamilies\u002Fat\u002Fenv","families\u002Fat\u002Fenv",{"title":187,"path":188,"stem":189,"access":12},"gcp-kms","\u002Ffamilies\u002Fat\u002Fgcp-kms","families\u002Fat\u002Fgcp-kms",{"title":191,"path":192,"stem":193,"access":12},"macos-keychain","\u002Ffamilies\u002Fat\u002Fmacos-keychain","families\u002Fat\u002Fmacos-keychain",{"title":195,"path":196,"stem":197,"children":198,"access":12,"icon":127},"by-Sessions","\u002Ffamilies\u002Fby","families\u002Fby\u002Findex",[199,200,204],{"title":195,"path":196,"stem":197,"access":12,"icon":127},{"title":201,"path":202,"stem":203,"access":12},"peer","\u002Ffamilies\u002Fby\u002Fpeer","families\u002Fby\u002Fpeer",{"title":205,"path":206,"stem":207,"access":12},"tabs","\u002Ffamilies\u002Fby\u002Ftabs","families\u002Fby\u002Ftabs",{"title":209,"path":210,"stem":211,"access":12},"Classifying a package","\u002Ffamilies\u002Fclassification","families\u002Fclassification",{"title":213,"path":214,"stem":215,"access":12},"Command-line tools","\u002Ffamilies\u002Fcli","families\u002Fcli",{"title":217,"path":218,"stem":219,"children":220,"access":12,"icon":127},"in-Frameworks","\u002Ffamilies\u002Fin","families\u002Fin\u002Findex",[221,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290],{"title":217,"path":218,"stem":219,"access":12,"icon":127},{"title":223,"path":224,"stem":225,"access":12},"ai","\u002Ffamilies\u002Fin\u002Fai","families\u002Fin\u002Fai",{"title":227,"path":228,"stem":229,"access":12},"devtools","\u002Ffamilies\u002Fin\u002Fdevtools","families\u002Fin\u002Fdevtools",{"title":231,"path":232,"stem":233,"access":12},"devtools-tui","\u002Ffamilies\u002Fin\u002Fdevtools-tui","families\u002Fin\u002Fdevtools-tui",{"title":235,"path":236,"stem":237,"access":12},"liff","\u002Ffamilies\u002Fin\u002Fliff","families\u002Fin\u002Fliff",{"title":239,"path":240,"stem":241,"access":12},"nextjs","\u002Ffamilies\u002Fin\u002Fnextjs","families\u002Fin\u002Fnextjs",{"title":243,"path":244,"stem":245,"access":12},"nuxt","\u002Ffamilies\u002Fin\u002Fnuxt","families\u002Fin\u002Fnuxt",{"title":247,"path":248,"stem":249,"access":12},"pinia","\u002Ffamilies\u002Fin\u002Fpinia","families\u002Fin\u002Fpinia",{"title":251,"path":252,"stem":253,"access":12},"pwa","\u002Ffamilies\u002Fin\u002Fpwa","families\u002Fin\u002Fpwa",{"title":255,"path":256,"stem":257,"access":12},"react","\u002Ffamilies\u002Fin\u002Freact","families\u002Fin\u002Freact",{"title":259,"path":260,"stem":261,"access":12},"relay","\u002Ffamilies\u002Fin\u002Frelay","families\u002Fin\u002Frelay",{"title":263,"path":264,"stem":265,"access":12},"rest","\u002Ffamilies\u002Fin\u002Frest","families\u002Fin\u002Frest",{"title":267,"path":268,"stem":269,"access":12},"solid","\u002Ffamilies\u002Fin\u002Fsolid","families\u002Fin\u002Fsolid",{"title":271,"path":272,"stem":273,"access":12},"svelte","\u002Ffamilies\u002Fin\u002Fsvelte","families\u002Fin\u002Fsvelte",{"title":275,"path":276,"stem":277,"access":12},"tanstack-query","\u002Ffamilies\u002Fin\u002Ftanstack-query","families\u002Fin\u002Ftanstack-query",{"title":279,"path":280,"stem":281,"access":12},"tanstack-table","\u002Ffamilies\u002Fin\u002Ftanstack-table","families\u002Fin\u002Ftanstack-table",{"title":283,"path":284,"stem":285,"access":12},"vue","\u002Ffamilies\u002Fin\u002Fvue","families\u002Fin\u002Fvue",{"title":287,"path":288,"stem":289,"access":12},"yjs","\u002Ffamilies\u002Fin\u002Fyjs","families\u002Fin\u002Fyjs",{"title":291,"path":292,"stem":293,"access":12},"zustand","\u002Ffamilies\u002Fin\u002Fzustand","families\u002Fin\u002Fzustand",{"title":295,"path":296,"stem":297,"children":298,"access":12,"icon":127},"on-Auth","\u002Ffamilies\u002Fon","families\u002Fon\u002Findex",[299,300,304,308,312,316,320,324,328,332,336],{"title":295,"path":296,"stem":297,"access":12,"icon":127},{"title":301,"path":302,"stem":303,"access":12},"email-otp","\u002Ffamilies\u002Fon\u002Femail-otp","families\u002Fon\u002Femail-otp",{"title":305,"path":306,"stem":307,"access":12},"magic-link","\u002Ffamilies\u002Fon\u002Fmagic-link","families\u002Fon\u002Fmagic-link",{"title":309,"path":310,"stem":311,"access":12},"oidc","\u002Ffamilies\u002Fon\u002Foidc","families\u002Fon\u002Foidc",{"title":313,"path":314,"stem":315,"access":12},"password","\u002Ffamilies\u002Fon\u002Fpassword","families\u002Fon\u002Fpassword",{"title":317,"path":318,"stem":319,"access":12},"pin","\u002Ffamilies\u002Fon\u002Fpin","families\u002Fon\u002Fpin",{"title":321,"path":322,"stem":323,"access":12},"recovery","\u002Ffamilies\u002Fon\u002Frecovery","families\u002Fon\u002Frecovery",{"title":325,"path":326,"stem":327,"access":12},"shamir","\u002Ffamilies\u002Fon\u002Fshamir","families\u002Fon\u002Fshamir",{"title":329,"path":330,"stem":331,"access":12},"threat","\u002Ffamilies\u002Fon\u002Fthreat","families\u002Fon\u002Fthreat",{"title":333,"path":334,"stem":335,"access":12},"totp","\u002Ffamilies\u002Fon\u002Ftotp","families\u002Fon\u002Ftotp",{"title":337,"path":338,"stem":339,"access":12},"webauthn","\u002Ffamilies\u002Fon\u002Fwebauthn","families\u002Fon\u002Fwebauthn",{"title":341,"path":342,"stem":343,"children":344,"access":12,"icon":127},"to-Stores","\u002Ffamilies\u002Fto","families\u002Fto\u002Findex",[345,346,350,353,357,361,365,370,374,378,382,386,390,394,398,402,406,410,414,417,421,425,429,434,438,442],{"title":341,"path":342,"stem":343,"access":12,"icon":127},{"title":347,"path":348,"stem":349,"access":12},"aws-dynamo","\u002Ffamilies\u002Fto\u002Faws-dynamo","families\u002Fto\u002Faws-dynamo",{"title":129,"path":351,"stem":352,"access":12},"\u002Ffamilies\u002Fto\u002Faws-s3","families\u002Fto\u002Faws-s3",{"title":354,"path":355,"stem":356,"access":12},"browser-fs","\u002Ffamilies\u002Fto\u002Fbrowser-fs","families\u002Fto\u002Fbrowser-fs",{"title":358,"path":359,"stem":360,"access":12},"browser-idb","\u002Ffamilies\u002Fto\u002Fbrowser-idb","families\u002Fto\u002Fbrowser-idb",{"title":362,"path":363,"stem":364,"access":12},"browser-local","\u002Ffamilies\u002Fto\u002Fbrowser-local","families\u002Fto\u002Fbrowser-local",{"title":366,"path":367,"stem":368,"access":12,"icon":369},"Choosing a store","\u002Ffamilies\u002Fto\u002Fchoosing-a-store","families\u002Fto\u002Fchoosing-a-store","i-lucide-split",{"title":371,"path":372,"stem":373,"access":12},"cloudflare-d1","\u002Ffamilies\u002Fto\u002Fcloudflare-d1","families\u002Fto\u002Fcloudflare-d1",{"title":375,"path":376,"stem":377,"access":12},"cloudflare-r2","\u002Ffamilies\u002Fto\u002Fcloudflare-r2","families\u002Fto\u002Fcloudflare-r2",{"title":379,"path":380,"stem":381,"access":12},"drive","\u002Ffamilies\u002Fto\u002Fdrive","families\u002Fto\u002Fdrive",{"title":383,"path":384,"stem":385,"access":12},"file","\u002Ffamilies\u002Fto\u002Ffile","families\u002Fto\u002Ffile",{"title":387,"path":388,"stem":389,"access":12},"icloud","\u002Ffamilies\u002Fto\u002Ficloud","families\u002Fto\u002Ficloud",{"title":391,"path":392,"stem":393,"access":12},"memory","\u002Ffamilies\u002Fto\u002Fmemory","families\u002Fto\u002Fmemory",{"title":395,"path":396,"stem":397,"access":12},"meter","\u002Ffamilies\u002Fto\u002Fmeter","families\u002Fto\u002Fmeter",{"title":399,"path":400,"stem":401,"access":12},"mysql","\u002Ffamilies\u002Fto\u002Fmysql","families\u002Fto\u002Fmysql",{"title":403,"path":404,"stem":405,"access":12},"nfs","\u002Ffamilies\u002Fto\u002Fnfs","families\u002Fto\u002Fnfs",{"title":407,"path":408,"stem":409,"access":12},"postgres","\u002Ffamilies\u002Fto\u002Fpostgres","families\u002Fto\u002Fpostgres",{"title":411,"path":412,"stem":413,"access":12},"probe","\u002Ffamilies\u002Fto\u002Fprobe","families\u002Fto\u002Fprobe",{"title":263,"path":415,"stem":416,"access":12},"\u002Ffamilies\u002Fto\u002Frest","families\u002Fto\u002Frest",{"title":418,"path":419,"stem":420,"access":12},"smb","\u002Ffamilies\u002Fto\u002Fsmb","families\u002Fto\u002Fsmb",{"title":422,"path":423,"stem":424,"access":12},"sqlite","\u002Ffamilies\u002Fto\u002Fsqlite","families\u002Fto\u002Fsqlite",{"title":426,"path":427,"stem":428,"access":12},"ssh","\u002Ffamilies\u002Fto\u002Fssh","families\u002Fto\u002Fssh",{"title":430,"path":431,"stem":432,"access":12,"icon":433},"Store-locator descriptors","\u002Ffamilies\u002Fto\u002Fstore-locator","families\u002Fto\u002Fstore-locator","i-lucide-map-pin",{"title":435,"path":436,"stem":437,"access":12},"supabase","\u002Ffamilies\u002Fto\u002Fsupabase","families\u002Fto\u002Fsupabase",{"title":439,"path":440,"stem":441,"access":12},"turso","\u002Ffamilies\u002Fto\u002Fturso","families\u002Fto\u002Fturso",{"title":443,"path":444,"stem":445,"access":12},"webdav","\u002Ffamilies\u002Fto\u002Fwebdav","families\u002Fto\u002Fwebdav",{"title":447,"path":448,"stem":449,"children":450},"Faq","\u002Ffaq","faq",[451,454,458,462,466,470],{"title":10,"path":448,"stem":452,"access":12,"icon":453},"faq\u002Findex","i-lucide-circle-help",{"title":455,"path":456,"stem":457,"access":12},"Where can noy-db run?","\u002Ffaq\u002Fwhere-can-noy-db-run","faq\u002F1.where-can-noy-db-run",{"title":459,"path":460,"stem":461,"access":12},"Native mobile & PWA","\u002Ffaq\u002Fmobile-and-pwa","faq\u002F2.mobile-and-pwa",{"title":463,"path":464,"stem":465,"access":12},"Threat model","\u002Ffaq\u002Fthreat-model","faq\u002F3.threat-model",{"title":467,"path":468,"stem":469,"access":12},"Community & ecosystem","\u002Ffaq\u002Fcommunity-and-ecosystem","faq\u002F4.community-and-ecosystem",{"title":471,"path":472,"stem":473,"access":12},"Licensing","\u002Ffaq\u002Flicensing","faq\u002F5.licensing",{"title":475,"path":476,"stem":477,"children":478},"Glossary","\u002Fglossary","glossary",[479,482,486,490,494],{"title":10,"path":476,"stem":480,"access":12,"icon":481},"glossary\u002Findex","i-lucide-book-a",{"title":483,"path":484,"stem":485,"access":12},"Core vocabulary","\u002Fglossary\u002Fcore-vocabulary","glossary\u002Fcore-vocabulary",{"title":487,"path":488,"stem":489,"access":12},"Deletion vocabulary","\u002Fglossary\u002Fdeletion","glossary\u002Fdeletion",{"title":491,"path":492,"stem":493,"access":12},"Satellite collection vocabulary","\u002Fglossary\u002Fsatellite-collections","glossary\u002Fsatellite-collections",{"title":495,"path":496,"stem":497,"access":12},"Schema migration vocabulary","\u002Fglossary\u002Fschema-migration","glossary\u002Fschema-migration",{"title":499,"path":500,"stem":501,"children":502},"Recipes","\u002Frecipes","recipes",[503,506,510,514,518,522,526,530,534,538,542,546,550,554,558,562,567,571,575,580,584,588,592],{"title":10,"path":500,"stem":504,"access":12,"icon":505},"recipes\u002Findex","i-lucide-play",{"title":507,"path":508,"stem":509,"access":12},"Accounting app","\u002Frecipes\u002Faccounting-app","recipes\u002Faccounting-app",{"title":511,"path":512,"stem":513,"access":12},"Analytics app","\u002Frecipes\u002Fanalytics-app","recipes\u002Fanalytics-app",{"title":515,"path":516,"stem":517,"access":12},"Attestation verifier","\u002Frecipes\u002Fattestation-verifier","recipes\u002Fattestation-verifier",{"title":519,"path":520,"stem":521,"access":12},"AWS-KMS attestation","\u002Frecipes\u002Faws-kms-pdf-attestation","recipes\u002Faws-kms-pdf-attestation",{"title":523,"path":524,"stem":525,"access":12},"Browser durability","\u002Frecipes\u002Fbrowser-durability","recipes\u002Fbrowser-durability",{"title":527,"path":528,"stem":529,"access":12},"Production cloud store","\u002Frecipes\u002Fcloud-store","recipes\u002Fcloud-store",{"title":531,"path":532,"stem":533,"access":12},"Compose your own setup","\u002Frecipes\u002Fcompose-your-own","recipes\u002Fcompose-your-own",{"title":535,"path":536,"stem":537,"access":12},"Confidential HR records","\u002Frecipes\u002Fconfidential-hr","recipes\u002Fconfidential-hr",{"title":539,"path":540,"stem":541,"access":12},"Composing an echo secret","\u002Frecipes\u002Fecho-secret-enrollment","recipes\u002Fecho-secret-enrollment",{"title":543,"path":544,"stem":545,"access":12},"Email archive","\u002Frecipes\u002Femail-archive","recipes\u002Femail-archive",{"title":547,"path":548,"stem":549,"access":12},"Email archive — threads & revisions","\u002Frecipes\u002Femail-archive-threads-revisions","recipes\u002Femail-archive-threads-revisions",{"title":551,"path":552,"stem":553,"access":12},"Export & portability","\u002Frecipes\u002Fexport-portability","recipes\u002Fexport-portability",{"title":555,"path":556,"stem":557,"access":12},"Passwordless OIDC (AWS Cognito)","\u002Frecipes\u002Fpasswordless-oidc","recipes\u002Fpasswordless-oidc",{"title":559,"path":560,"stem":561,"access":12},"Personal notebook","\u002Frecipes\u002Fpersonal-notebook","recipes\u002Fpersonal-notebook",{"title":563,"path":564,"stem":565,"access":12,"icon":566},"Playgrounds","\u002Frecipes\u002Fplaygrounds","recipes\u002Fplaygrounds","i-lucide-gamepad-2",{"title":568,"path":569,"stem":570,"access":12},"React invoice app","\u002Frecipes\u002Freact-invoices","recipes\u002Freact-invoices",{"title":572,"path":573,"stem":574,"access":12},"Collaborative app","\u002Frecipes\u002Frealtime-crdt-app","recipes\u002Frealtime-crdt-app",{"title":576,"path":577,"stem":578,"access":12,"icon":579},"Run the showcases","\u002Frecipes\u002Frun-the-showcases","recipes\u002Frun-the-showcases","i-lucide-flask-conical",{"title":581,"path":582,"stem":583,"access":12},"Search & RAG","\u002Frecipes\u002Fsearch-rag","recipes\u002Fsearch-rag",{"title":585,"path":586,"stem":587,"access":12},"Team vault topology","\u002Frecipes\u002Fteam-vault-topology","recipes\u002Fteam-vault-topology",{"title":589,"path":590,"stem":591,"access":12},"Unlock ceremonies","\u002Frecipes\u002Funlock-ceremonies","recipes\u002Funlock-ceremonies",{"title":593,"path":594,"stem":595,"access":12},"User preferences","\u002Frecipes\u002Fuser-preferences","recipes\u002Fuser-preferences",{"title":597,"path":598,"stem":599,"children":600},"Services","\u002Fservices","services",[601,604,608,612,616,620,624,628,632,636,640,644,648,652,656,660,664,668,672,676,680,684,688,692,696,700,704,710,714,718,722,726,730,734,738,742,746,750,755,759,763,767,771,775,779,783,787,791,795,799,803,807,811,815,819,823,827,831,835,839,843,847,851,855,859,863,867,871,875,879,883,887,891,895,899],{"title":10,"path":598,"stem":602,"access":12,"icon":603},"services\u002Findex","i-lucide-layers",{"title":605,"path":606,"stem":607,"access":12},"archive","\u002Fservices\u002Farchive","services\u002Farchive",{"title":609,"path":610,"stem":611,"access":12},"attestation","\u002Fservices\u002Fattestation","services\u002Fattestation",{"title":613,"path":614,"stem":615,"access":12},"auth-introspection","\u002Fservices\u002Fauth-introspection","services\u002Fauth-introspection",{"title":617,"path":618,"stem":619,"access":12},"auth-landscape","\u002Fservices\u002Fauth-landscape","services\u002Fauth-landscape",{"title":621,"path":622,"stem":623,"access":12},"blobs","\u002Fservices\u002Fblobs","services\u002Fblobs",{"title":625,"path":626,"stem":627,"access":12},"broker","\u002Fservices\u002Fbroker","services\u002Fbroker",{"title":629,"path":630,"stem":631,"access":12},"bundle","\u002Fservices\u002Fbundle","services\u002Fbundle",{"title":633,"path":634,"stem":635,"access":12},"classified","\u002Fservices\u002Fclassified","services\u002Fclassified",{"title":637,"path":638,"stem":639,"access":12},"computed","\u002Fservices\u002Fcomputed","services\u002Fcomputed",{"title":641,"path":642,"stem":643,"access":12},"consent","\u002Fservices\u002Fconsent","services\u002Fconsent",{"title":645,"path":646,"stem":647,"access":12},"cover","\u002Fservices\u002Fcover","services\u002Fcover",{"title":649,"path":650,"stem":651,"access":12},"coverage","\u002Fservices\u002Fcoverage","services\u002Fcoverage",{"title":653,"path":654,"stem":655,"access":12},"crdt","\u002Fservices\u002Fcrdt","services\u002Fcrdt",{"title":657,"path":658,"stem":659,"access":12},"cross-join","\u002Fservices\u002Fcross-join","services\u002Fcross-join",{"title":661,"path":662,"stem":663,"access":12},"custody","\u002Fservices\u002Fcustody","services\u002Fcustody",{"title":665,"path":666,"stem":667,"access":12},"derivations","\u002Fservices\u002Fderivations","services\u002Fderivations",{"title":669,"path":670,"stem":671,"access":12},"directory","\u002Fservices\u002Fdirectory","services\u002Fdirectory",{"title":673,"path":674,"stem":675,"access":12},"search — AI","\u002Fservices\u002Fembeddings","services\u002Fembeddings",{"title":677,"path":678,"stem":679,"access":12},"Field metadata","\u002Fservices\u002Ffield-metadata","services\u002Ffield-metadata",{"title":681,"path":682,"stem":683,"access":12},"Foreign refs","\u002Fservices\u002Fforeign-refs","services\u002Fforeign-refs",{"title":685,"path":686,"stem":687,"access":12},"forget","\u002Fservices\u002Fforget","services\u002Fforget",{"title":689,"path":690,"stem":691,"access":12},"governance","\u002Fservices\u002Fgovernance","services\u002Fgovernance",{"title":693,"path":694,"stem":695,"access":12},"guards","\u002Fservices\u002Fguards","services\u002Fguards",{"title":697,"path":698,"stem":699,"access":12},"history","\u002Fservices\u002Fhistory","services\u002Fhistory",{"title":701,"path":702,"stem":703,"access":12},"i18n","\u002Fservices\u002Fi18n","services\u002Fi18n",{"title":705,"path":706,"stem":707,"children":708,"access":12},"indexing","\u002Fservices\u002Findexing","services\u002Findexing",[709],{"title":705,"path":706,"stem":707,"access":12},{"title":711,"path":712,"stem":713,"access":12},"introspection","\u002Fservices\u002Fintrospection","services\u002Fintrospection",{"title":715,"path":716,"stem":717,"access":12},"joins","\u002Fservices\u002Fjoins","services\u002Fjoins",{"title":719,"path":720,"stem":721,"access":12},"lazy","\u002Fservices\u002Flazy","services\u002Flazy",{"title":723,"path":724,"stem":725,"access":12},"links","\u002Fservices\u002Flinks","services\u002Flinks",{"title":727,"path":728,"stem":729,"access":12},"live","\u002Fservices\u002Flive","services\u002Flive",{"title":731,"path":732,"stem":733,"access":12},"lookup","\u002Fservices\u002Flookup","services\u002Flookup",{"title":735,"path":736,"stem":737,"access":12},"manifest","\u002Fservices\u002Fmanifest","services\u002Fmanifest",{"title":739,"path":740,"stem":741,"access":12},"materialized-views","\u002Fservices\u002Fmaterialized-views","services\u002Fmaterialized-views",{"title":743,"path":744,"stem":745,"access":12},"Metadata ladder","\u002Fservices\u002Fmetadata-ladder","services\u002Fmetadata-ladder",{"title":747,"path":748,"stem":749,"access":12},"Metadata riders","\u002Fservices\u002Fmetadata-riders","services\u002Fmetadata-riders",{"title":751,"path":752,"stem":753,"access":12,"badge":754},"metrics","\u002Fservices\u002Fmetrics","services\u002Fmetrics","Planned",{"title":756,"path":757,"stem":758,"access":12,"badge":754},"migrations","\u002Fservices\u002Fmigrations","services\u002Fmigrations",{"title":760,"path":761,"stem":762,"access":12},"money","\u002Fservices\u002Fmoney","services\u002Fmoney",{"title":764,"path":765,"stem":766,"access":12},"numbering","\u002Fservices\u002Fnumbering","services\u002Fnumbering",{"title":768,"path":769,"stem":770,"access":12},"overlay-views","\u002Fservices\u002Foverlay-views","services\u002Foverlay-views",{"title":772,"path":773,"stem":774,"access":12,"badge":754},"partitioning","\u002Fservices\u002Fpartitioning","services\u002Fpartitioning",{"title":776,"path":777,"stem":778,"access":12},"periods","\u002Fservices\u002Fperiods","services\u002Fperiods",{"title":780,"path":781,"stem":782,"access":12},"persisted-schemas","\u002Fservices\u002Fpersisted-schemas","services\u002Fpersisted-schemas",{"title":784,"path":785,"stem":786,"access":12},"plaintext-bypass","\u002Fservices\u002Fplaintext-bypass","services\u002Fplaintext-bypass",{"title":788,"path":789,"stem":790,"access":12},"pod-redirect","\u002Fservices\u002Fpod-redirect","services\u002Fpod-redirect",{"title":792,"path":793,"stem":794,"access":12},"pod-signature","\u002Fservices\u002Fpod-signature","services\u002Fpod-signature",{"title":796,"path":797,"stem":798,"access":12},"policy","\u002Fservices\u002Fpolicy","services\u002Fpolicy",{"title":800,"path":801,"stem":802,"access":12},"portability","\u002Fservices\u002Fportability","services\u002Fportability",{"title":804,"path":805,"stem":806,"access":12},"reduce","\u002Fservices\u002Freduce","services\u002Freduce",{"title":808,"path":809,"stem":810,"access":12},"routing","\u002Fservices\u002Frouting","services\u002Frouting",{"title":812,"path":813,"stem":814,"access":12},"satellites","\u002Fservices\u002Fsatellites","services\u002Fsatellites",{"title":816,"path":817,"stem":818,"access":12},"schema-identifiers","\u002Fservices\u002Fschema-identifiers","services\u002Fschema-identifiers",{"title":820,"path":821,"stem":822,"access":12},"schema-update","\u002Fservices\u002Fschema-update","services\u002Fschema-update",{"title":824,"path":825,"stem":826,"access":12},"sealed-record","\u002Fservices\u002Fsealed-record","services\u002Fsealed-record",{"title":828,"path":829,"stem":830,"access":12},"sealing provider id","\u002Fservices\u002Fsealing-pid-stability","services\u002Fsealing-pid-stability",{"title":832,"path":833,"stem":834,"access":12},"search — full-text","\u002Fservices\u002Fsearch","services\u002Fsearch",{"title":836,"path":837,"stem":838,"access":12},"sequence","\u002Fservices\u002Fsequence","services\u002Fsequence",{"title":840,"path":841,"stem":842,"access":12},"session","\u002Fservices\u002Fsession","services\u002Fsession",{"title":844,"path":845,"stem":846,"access":12},"session-tiers","\u002Fservices\u002Fsession-tiers","services\u002Fsession-tiers",{"title":848,"path":849,"stem":850,"access":12},"shadow","\u002Fservices\u002Fshadow","services\u002Fshadow",{"title":852,"path":853,"stem":854,"access":12},"share-link","\u002Fservices\u002Fshare-link","services\u002Fshare-link",{"title":856,"path":857,"stem":858,"access":12},"snapshots","\u002Fservices\u002Fsnapshots","services\u002Fsnapshots",{"title":860,"path":861,"stem":862,"access":12},"store capabilities","\u002Fservices\u002Fstorage-capability-matrix","services\u002Fstorage-capability-matrix",{"title":864,"path":865,"stem":866,"access":12},"sync","\u002Fservices\u002Fsync","services\u002Fsync",{"title":868,"path":869,"stem":870,"access":12},"team","\u002Fservices\u002Fteam","services\u002Fteam",{"title":872,"path":873,"stem":874,"access":12},"tiers","\u002Fservices\u002Ftiers","services\u002Ftiers",{"title":876,"path":877,"stem":878,"access":12},"transactions","\u002Fservices\u002Ftransactions","services\u002Ftransactions",{"title":880,"path":881,"stem":882,"access":12},"partitions","\u002Fservices\u002Ftransferable-partitions","services\u002Ftransferable-partitions",{"title":884,"path":885,"stem":886,"access":12},"user-envelope","\u002Fservices\u002Fuser-envelope","services\u002Fuser-envelope",{"title":888,"path":889,"stem":890,"access":12,"badge":754},"validation","\u002Fservices\u002Fvalidation","services\u002Fvalidation",{"title":892,"path":893,"stem":894,"access":12},"vault-head","\u002Fservices\u002Fvault-head","services\u002Fvault-head",{"title":896,"path":897,"stem":898,"access":12},"via","\u002Fservices\u002Fvia","services\u002Fvia",{"title":900,"path":901,"stem":902,"access":12},"withdrawal","\u002Fservices\u002Fwithdrawal","services\u002Fwithdrawal",{"title":904,"path":905,"stem":906,"children":907},"Start","\u002Fstart","start",[908,911,915,919,923],{"title":10,"path":905,"stem":909,"access":12,"icon":910},"start\u002Findex","i-lucide-flag",{"title":912,"path":913,"stem":914,"access":12},"Install","\u002Fstart\u002Finstall","start\u002F1.install",{"title":916,"path":917,"stem":918,"access":12},"Your first vault","\u002Fstart\u002Ffirst-vault","start\u002F2.first-vault",{"title":920,"path":921,"stem":922,"access":12},"Your first service","\u002Fstart\u002Ffirst-service","start\u002F3.first-service",{"title":924,"path":925,"stem":926,"access":12},"See the ciphertext","\u002Fstart\u002Fsee-the-ciphertext","start\u002F4.see-the-ciphertext",{"id":928,"title":760,"access":12,"apiToc":929,"body":930,"category":4072,"description":4073,"extension":4074,"meta":4075,"navigation":4072,"nest":4076,"path":761,"seo":4077,"sinceVersion":4078,"status":4079,"stem":762,"subtitle":4072,"tier":4080,"tocExternal":4072,"__hash__":4081},"docs\u002Fservices\u002Fmoney.md",false,{"type":931,"value":932,"toc":4045},"minimark",[933,936,940,945,974,985,1013,1017,1031,1492,1516,1522,1554,1558,1563,1581,1740,1763,1769,1775,1873,1879,1885,1988,1992,2006,2070,2117,2128,2150,2546,2570,2597,2601,2612,3016,3057,3061,3067,3072,3105,3129,3208,3279,3287,3316,3322,3353,3358,3363,3415,3467,3472,3530,3561,3568,3574,3603,3634,3647,3730,3758,3762,3771,3830,3834,3987,3991,4041],[934,935,760],"h1",{"id":760},[937,938],"service-meta",{":rows":939},"[{\"label\":\"Subpath\",\"value\":\"`@noy-db\u002Fhub` (root export)\"},{\"label\":\"Type\",\"value\":\"Core feature — activated per field by declaring a `money()` field descriptor.\"}]",[941,942,944],"h2",{"id":943},"what-it-does","What it does",[946,947,948,949,953,954,957,958,961,962,965,966,969,970,973],"p",{},"Storing prices, balances, or totals as a JavaScript ",[950,951,952],"code",{},"number"," is a well-known trap: ",[950,955,956],{},"0.1 + 0.2"," doesn't equal ",[950,959,960],{},"0.3",", and floats lose precision entirely past ",[950,963,964],{},"Number.MAX_SAFE_INTEGER",". The ",[950,967,968],{},"money()"," field descriptor closes that gap. It marks a schema field as currency-safe: values are quantized to a scaled integer (cents, for a 2-decimal currency) and stored as a digit string, so arithmetic never touches floating point and stays exact past 2^53. On read, the field decodes back to an exact decimal string (",[950,971,972],{},"'123.45'","), with optional locale-formatted and plain-number sibling fields for display.",[946,975,976,977,980,981,984],{},"It also ships two arithmetic helpers that solve the two places floating-point money math typically breaks: ",[950,978,979],{},"mulRate()"," (apply a rate — VAT, a fee percentage — with one controlled rounding step) and ",[950,982,983],{},"allocate()"," (split an amount across buckets so the parts always sum back to the original, to the cent).",[946,986,987,989,990,996,997,1000,1001,1004,1005,1008,1009,1012],{},[950,988,968],{}," is a sibling of the ",[991,992,994],"a",{"href":993},".\u002Fi18n",[950,995,701],{}," service's ",[950,998,999],{},"dictKey()","\u002F",[950,1002,1003],{},"i18nText()"," field descriptors: a schema-layer declaration, not a ",[950,1006,1007],{},"with*()"," strategy passed to ",[950,1010,1011],{},"createNoydb()",".",[941,1014,1016],{"id":1015},"setup","Setup",[946,1018,1019,1020,1022,1023,1026,1027,1030],{},"Import ",[950,1021,760],{}," and declare it in a collection's ",[950,1024,1025],{},"moneyFields"," map — the field's underlying schema type stays a plain ",[950,1028,1029],{},"number | string"," union (money accepts either on write):",[1032,1033,1038],"pre",{"className":1034,"code":1035,"language":1036,"meta":1037,"style":1037},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createNoydb, money } from '@noy-db\u002Fhub'\nimport { toMemory } from '@noy-db\u002Fto-memory'\nimport { z } from 'zod'\n\nconst db = await createNoydb({\n  store: toMemory(),\n  user: 'alice',\n  secret: 'a-strong-secret',\n})\n\ninterface Invoice extends Record\u003Cstring, unknown> {\n  id: string\n  total: number | string\n}\n\nconst vault = await db.openVault('books')\nconst invoices = vault.collection\u003CInvoice>('invoices', {\n  schema: z.object({ id: z.string(), total: z.union([z.number(), z.string()]) }),\n  moneyFields: { total: money({ currency: 'EUR', scale: 2 }) },\n})\n","ts","",[950,1039,1040,1079,1100,1121,1128,1153,1171,1189,1206,1215,1220,1253,1264,1280,1286,1291,1322,1360,1434,1485],{"__ignoreMap":1037},[1041,1042,1045,1049,1053,1057,1060,1063,1066,1069,1072,1076],"span",{"class":1043,"line":1044},"line",1,[1041,1046,1048],{"class":1047},"s7zQu","import",[1041,1050,1052],{"class":1051},"sMK4o"," {",[1041,1054,1056],{"class":1055},"sTEyZ"," createNoydb",[1041,1058,1059],{"class":1051},",",[1041,1061,1062],{"class":1055}," money",[1041,1064,1065],{"class":1051}," }",[1041,1067,1068],{"class":1047}," from",[1041,1070,1071],{"class":1051}," '",[1041,1073,1075],{"class":1074},"sfazB","@noy-db\u002Fhub",[1041,1077,1078],{"class":1051},"'\n",[1041,1080,1082,1084,1086,1089,1091,1093,1095,1098],{"class":1043,"line":1081},2,[1041,1083,1048],{"class":1047},[1041,1085,1052],{"class":1051},[1041,1087,1088],{"class":1055}," toMemory",[1041,1090,1065],{"class":1051},[1041,1092,1068],{"class":1047},[1041,1094,1071],{"class":1051},[1041,1096,1097],{"class":1074},"@noy-db\u002Fto-memory",[1041,1099,1078],{"class":1051},[1041,1101,1103,1105,1107,1110,1112,1114,1116,1119],{"class":1043,"line":1102},3,[1041,1104,1048],{"class":1047},[1041,1106,1052],{"class":1051},[1041,1108,1109],{"class":1055}," z",[1041,1111,1065],{"class":1051},[1041,1113,1068],{"class":1047},[1041,1115,1071],{"class":1051},[1041,1117,1118],{"class":1074},"zod",[1041,1120,1078],{"class":1051},[1041,1122,1124],{"class":1043,"line":1123},4,[1041,1125,1127],{"emptyLinePlaceholder":1126},true,"\n",[1041,1129,1131,1135,1138,1141,1144,1147,1150],{"class":1043,"line":1130},5,[1041,1132,1134],{"class":1133},"spNyl","const",[1041,1136,1137],{"class":1055}," db ",[1041,1139,1140],{"class":1051},"=",[1041,1142,1143],{"class":1047}," await",[1041,1145,1056],{"class":1146},"s2Zo4",[1041,1148,1149],{"class":1055},"(",[1041,1151,1152],{"class":1051},"{\n",[1041,1154,1156,1160,1163,1165,1168],{"class":1043,"line":1155},6,[1041,1157,1159],{"class":1158},"swJcz","  store",[1041,1161,1162],{"class":1051},":",[1041,1164,1088],{"class":1146},[1041,1166,1167],{"class":1055},"()",[1041,1169,1170],{"class":1051},",\n",[1041,1172,1174,1177,1179,1181,1184,1187],{"class":1043,"line":1173},7,[1041,1175,1176],{"class":1158},"  user",[1041,1178,1162],{"class":1051},[1041,1180,1071],{"class":1051},[1041,1182,1183],{"class":1074},"alice",[1041,1185,1186],{"class":1051},"'",[1041,1188,1170],{"class":1051},[1041,1190,1192,1195,1197,1199,1202,1204],{"class":1043,"line":1191},8,[1041,1193,1194],{"class":1158},"  secret",[1041,1196,1162],{"class":1051},[1041,1198,1071],{"class":1051},[1041,1200,1201],{"class":1074},"a-strong-secret",[1041,1203,1186],{"class":1051},[1041,1205,1170],{"class":1051},[1041,1207,1209,1212],{"class":1043,"line":1208},9,[1041,1210,1211],{"class":1051},"}",[1041,1213,1214],{"class":1055},")\n",[1041,1216,1218],{"class":1043,"line":1217},10,[1041,1219,1127],{"emptyLinePlaceholder":1126},[1041,1221,1223,1226,1230,1233,1236,1239,1242,1244,1247,1250],{"class":1043,"line":1222},11,[1041,1224,1225],{"class":1133},"interface",[1041,1227,1229],{"class":1228},"sBMFI"," Invoice",[1041,1231,1232],{"class":1133}," extends",[1041,1234,1235],{"class":1228}," Record",[1041,1237,1238],{"class":1051},"\u003C",[1041,1240,1241],{"class":1228},"string",[1041,1243,1059],{"class":1051},[1041,1245,1246],{"class":1228}," unknown",[1041,1248,1249],{"class":1051},">",[1041,1251,1252],{"class":1051}," {\n",[1041,1254,1256,1259,1261],{"class":1043,"line":1255},12,[1041,1257,1258],{"class":1158},"  id",[1041,1260,1162],{"class":1051},[1041,1262,1263],{"class":1228}," string\n",[1041,1265,1267,1270,1272,1275,1278],{"class":1043,"line":1266},13,[1041,1268,1269],{"class":1158},"  total",[1041,1271,1162],{"class":1051},[1041,1273,1274],{"class":1228}," number",[1041,1276,1277],{"class":1051}," |",[1041,1279,1263],{"class":1228},[1041,1281,1283],{"class":1043,"line":1282},14,[1041,1284,1285],{"class":1051},"}\n",[1041,1287,1289],{"class":1043,"line":1288},15,[1041,1290,1127],{"emptyLinePlaceholder":1126},[1041,1292,1294,1296,1299,1301,1303,1306,1308,1311,1313,1315,1318,1320],{"class":1043,"line":1293},16,[1041,1295,1134],{"class":1133},[1041,1297,1298],{"class":1055}," vault ",[1041,1300,1140],{"class":1051},[1041,1302,1143],{"class":1047},[1041,1304,1305],{"class":1055}," db",[1041,1307,1012],{"class":1051},[1041,1309,1310],{"class":1146},"openVault",[1041,1312,1149],{"class":1055},[1041,1314,1186],{"class":1051},[1041,1316,1317],{"class":1074},"books",[1041,1319,1186],{"class":1051},[1041,1321,1214],{"class":1055},[1041,1323,1325,1327,1330,1332,1335,1337,1340,1342,1345,1347,1349,1351,1354,1356,1358],{"class":1043,"line":1324},17,[1041,1326,1134],{"class":1133},[1041,1328,1329],{"class":1055}," invoices ",[1041,1331,1140],{"class":1051},[1041,1333,1334],{"class":1055}," vault",[1041,1336,1012],{"class":1051},[1041,1338,1339],{"class":1146},"collection",[1041,1341,1238],{"class":1051},[1041,1343,1344],{"class":1228},"Invoice",[1041,1346,1249],{"class":1051},[1041,1348,1149],{"class":1055},[1041,1350,1186],{"class":1051},[1041,1352,1353],{"class":1074},"invoices",[1041,1355,1186],{"class":1051},[1041,1357,1059],{"class":1051},[1041,1359,1252],{"class":1051},[1041,1361,1363,1366,1368,1370,1372,1375,1377,1380,1383,1385,1387,1389,1391,1393,1395,1398,1400,1402,1404,1407,1410,1412,1414,1416,1418,1420,1422,1424,1427,1429,1432],{"class":1043,"line":1362},18,[1041,1364,1365],{"class":1158},"  schema",[1041,1367,1162],{"class":1051},[1041,1369,1109],{"class":1055},[1041,1371,1012],{"class":1051},[1041,1373,1374],{"class":1146},"object",[1041,1376,1149],{"class":1055},[1041,1378,1379],{"class":1051},"{",[1041,1381,1382],{"class":1158}," id",[1041,1384,1162],{"class":1051},[1041,1386,1109],{"class":1055},[1041,1388,1012],{"class":1051},[1041,1390,1241],{"class":1146},[1041,1392,1167],{"class":1055},[1041,1394,1059],{"class":1051},[1041,1396,1397],{"class":1158}," total",[1041,1399,1162],{"class":1051},[1041,1401,1109],{"class":1055},[1041,1403,1012],{"class":1051},[1041,1405,1406],{"class":1146},"union",[1041,1408,1409],{"class":1055},"([z",[1041,1411,1012],{"class":1051},[1041,1413,952],{"class":1146},[1041,1415,1167],{"class":1055},[1041,1417,1059],{"class":1051},[1041,1419,1109],{"class":1055},[1041,1421,1012],{"class":1051},[1041,1423,1241],{"class":1146},[1041,1425,1426],{"class":1055},"()]) ",[1041,1428,1211],{"class":1051},[1041,1430,1431],{"class":1055},")",[1041,1433,1170],{"class":1051},[1041,1435,1437,1440,1442,1444,1446,1448,1450,1452,1454,1457,1459,1461,1464,1466,1468,1471,1473,1477,1479,1482],{"class":1043,"line":1436},19,[1041,1438,1439],{"class":1158},"  moneyFields",[1041,1441,1162],{"class":1051},[1041,1443,1052],{"class":1051},[1041,1445,1397],{"class":1158},[1041,1447,1162],{"class":1051},[1041,1449,1062],{"class":1146},[1041,1451,1149],{"class":1055},[1041,1453,1379],{"class":1051},[1041,1455,1456],{"class":1158}," currency",[1041,1458,1162],{"class":1051},[1041,1460,1071],{"class":1051},[1041,1462,1463],{"class":1074},"EUR",[1041,1465,1186],{"class":1051},[1041,1467,1059],{"class":1051},[1041,1469,1470],{"class":1158}," scale",[1041,1472,1162],{"class":1051},[1041,1474,1476],{"class":1475},"sbssI"," 2",[1041,1478,1065],{"class":1051},[1041,1480,1481],{"class":1055},") ",[1041,1483,1484],{"class":1051},"},\n",[1041,1486,1488,1490],{"class":1043,"line":1487},20,[1041,1489,1211],{"class":1051},[1041,1491,1214],{"class":1055},[946,1493,1494,1495,1498,1499,1501,1502,1505,1506,1509,1510,1512,1513,1012],{},"Since ",[950,1496,1497],{},"0.3.0-pre.9",", the same declaration can be spelled\nthrough the ",[991,1500,896],{"href":897}," field-feature composer — ",[950,1503,1504],{},"viaFields: { total: via(money({ currency: 'EUR', scale: 2 })) }",". Both spellings compile to the same internal\nbinding, with byte-identical stored envelopes and identical ",[950,1507,1508],{},"describe()"," output; ",[950,1511,1025],{},"\nremains fully supported. Declaring the same field under both spellings throws ",[950,1514,1515],{},"ValidationError",[946,1517,1518,1521],{},[950,1519,1520],{},"money(options)"," has two mutually exclusive modes:",[1523,1524,1525,1537],"ul",{},[1526,1527,1528,1532,1533,1536],"li",{},[1529,1530,1531],"strong",{},"Fixed"," — ",[950,1534,1535],{},"money({ currency: 'EUR' })",": the field always holds one currency. The stored\u002Fread value is a bare amount.",[1526,1538,1539,1532,1542,1545,1546,1549,1550,1553],{},[1529,1540,1541],{},"Multi",[950,1543,1544],{},"money({ currencies: ['EUR', 'USD'] })"," (or ",[950,1547,1548],{},"currencies: 'any'","): the currency travels with the record. The value is ",[950,1551,1552],{},"{ amount, currency }"," on write; reads decode the same shape.",[941,1555,1557],{"id":1556},"usage","Usage",[1559,1560,1562],"h3",{"id":1561},"write-and-read-exact-decimals-locale-formatting","Write and read — exact decimals, locale formatting",[946,1564,1565,1566,1569,1570,1573,1574,1577,1578,1162],{},"Writing accepts a plain number or a decimal string; reading returns the canonical decimal string, plus ",[950,1567,1568],{},"\u003Cfield>Formatted"," and ",[950,1571,1572],{},"\u003Cfield>Number"," virtuals when a ",[950,1575,1576],{},"locale"," is passed to ",[950,1579,1580],{},"get()",[1032,1582,1584],{"className":1034,"code":1583,"language":1036,"meta":1037,"style":1037},"await invoices.put('a', { id: 'a', total: 123.45 })\n\nconst read = await invoices.get('a', { locale: 'de-DE' }) as Record\u003Cstring, unknown>\n\u002F\u002F → {\n\u002F\u002F   id: 'a',\n\u002F\u002F   total: '123.45',            \u002F\u002F exact decimal string\n\u002F\u002F   totalFormatted: '123,45 €', \u002F\u002F Intl.NumberFormat at the given locale\n\u002F\u002F   totalNumber: 123.45,        \u002F\u002F convenience JS number (lossy past 2^53 — display only)\n\u002F\u002F }\n",[950,1585,1586,1634,1638,1700,1706,1711,1719,1727,1735],{"__ignoreMap":1037},[1041,1587,1588,1591,1594,1596,1599,1601,1603,1605,1607,1609,1611,1613,1615,1617,1619,1621,1623,1625,1627,1630,1632],{"class":1043,"line":1044},[1041,1589,1590],{"class":1047},"await",[1041,1592,1593],{"class":1055}," invoices",[1041,1595,1012],{"class":1051},[1041,1597,1598],{"class":1146},"put",[1041,1600,1149],{"class":1055},[1041,1602,1186],{"class":1051},[1041,1604,991],{"class":1074},[1041,1606,1186],{"class":1051},[1041,1608,1059],{"class":1051},[1041,1610,1052],{"class":1051},[1041,1612,1382],{"class":1158},[1041,1614,1162],{"class":1051},[1041,1616,1071],{"class":1051},[1041,1618,991],{"class":1074},[1041,1620,1186],{"class":1051},[1041,1622,1059],{"class":1051},[1041,1624,1397],{"class":1158},[1041,1626,1162],{"class":1051},[1041,1628,1629],{"class":1475}," 123.45",[1041,1631,1065],{"class":1051},[1041,1633,1214],{"class":1055},[1041,1635,1636],{"class":1043,"line":1081},[1041,1637,1127],{"emptyLinePlaceholder":1126},[1041,1639,1640,1642,1645,1647,1649,1651,1653,1656,1658,1660,1662,1664,1666,1668,1671,1673,1675,1678,1680,1682,1684,1687,1689,1691,1693,1695,1697],{"class":1043,"line":1102},[1041,1641,1134],{"class":1133},[1041,1643,1644],{"class":1055}," read ",[1041,1646,1140],{"class":1051},[1041,1648,1143],{"class":1047},[1041,1650,1593],{"class":1055},[1041,1652,1012],{"class":1051},[1041,1654,1655],{"class":1146},"get",[1041,1657,1149],{"class":1055},[1041,1659,1186],{"class":1051},[1041,1661,991],{"class":1074},[1041,1663,1186],{"class":1051},[1041,1665,1059],{"class":1051},[1041,1667,1052],{"class":1051},[1041,1669,1670],{"class":1158}," locale",[1041,1672,1162],{"class":1051},[1041,1674,1071],{"class":1051},[1041,1676,1677],{"class":1074},"de-DE",[1041,1679,1186],{"class":1051},[1041,1681,1065],{"class":1051},[1041,1683,1481],{"class":1055},[1041,1685,1686],{"class":1047},"as",[1041,1688,1235],{"class":1228},[1041,1690,1238],{"class":1051},[1041,1692,1241],{"class":1228},[1041,1694,1059],{"class":1051},[1041,1696,1246],{"class":1228},[1041,1698,1699],{"class":1051},">\n",[1041,1701,1702],{"class":1043,"line":1123},[1041,1703,1705],{"class":1704},"sHwdD","\u002F\u002F → {\n",[1041,1707,1708],{"class":1043,"line":1130},[1041,1709,1710],{"class":1704},"\u002F\u002F   id: 'a',\n",[1041,1712,1713,1716],{"class":1043,"line":1155},[1041,1714,1715],{"class":1704},"\u002F\u002F   total: '123.45',",[1041,1717,1718],{"class":1704},"            \u002F\u002F exact decimal string\n",[1041,1720,1721,1724],{"class":1043,"line":1173},[1041,1722,1723],{"class":1704},"\u002F\u002F   totalFormatted: '123,45 €',",[1041,1725,1726],{"class":1704}," \u002F\u002F Intl.NumberFormat at the given locale\n",[1041,1728,1729,1732],{"class":1043,"line":1191},[1041,1730,1731],{"class":1704},"\u002F\u002F   totalNumber: 123.45,",[1041,1733,1734],{"class":1704},"        \u002F\u002F convenience JS number (lossy past 2^53 — display only)\n",[1041,1736,1737],{"class":1043,"line":1208},[1041,1738,1739],{"class":1704},"\u002F\u002F }\n",[946,1741,1742,1743,1745,1746,1000,1748,1751,1752,1755,1756,1000,1759,1762],{},"Without a ",[950,1744,1576],{}," option, ",[950,1747,1580],{},[950,1749,1750],{},"list()"," still return the exact decimal string for ",[950,1753,1754],{},"total"," — only the ",[950,1757,1758],{},"Formatted",[950,1760,1761],{},"Number"," siblings are omitted.",[1559,1764,1766,1768],{"id":1765},"mulrate-apply-a-rate-exactly",[950,1767,979],{}," — apply a rate exactly",[946,1770,1771,1774],{},[950,1772,1773],{},"mulRate(amount, rate, opts?)"," multiplies a money amount by a decimal rate (e.g. a VAT rate) with a single controlled rounding step at the end, instead of the repeated float rounding that produces off-by-a-cent totals:",[1032,1776,1778],{"className":1034,"code":1777,"language":1036,"meta":1037,"style":1037},"import { mulRate } from '@noy-db\u002Fhub'\n\nmulRate('10000.00', 0.07)                     \u002F\u002F → '700.00'   (7% VAT)\nmulRate('33.33', '0.07', { rounding: 'floor' }) \u002F\u002F → '2.33'\n",[950,1779,1780,1799,1803,1828],{"__ignoreMap":1037},[1041,1781,1782,1784,1786,1789,1791,1793,1795,1797],{"class":1043,"line":1044},[1041,1783,1048],{"class":1047},[1041,1785,1052],{"class":1051},[1041,1787,1788],{"class":1055}," mulRate",[1041,1790,1065],{"class":1051},[1041,1792,1068],{"class":1047},[1041,1794,1071],{"class":1051},[1041,1796,1075],{"class":1074},[1041,1798,1078],{"class":1051},[1041,1800,1801],{"class":1043,"line":1081},[1041,1802,1127],{"emptyLinePlaceholder":1126},[1041,1804,1805,1808,1810,1812,1815,1817,1819,1822,1825],{"class":1043,"line":1102},[1041,1806,1807],{"class":1146},"mulRate",[1041,1809,1149],{"class":1055},[1041,1811,1186],{"class":1051},[1041,1813,1814],{"class":1074},"10000.00",[1041,1816,1186],{"class":1051},[1041,1818,1059],{"class":1051},[1041,1820,1821],{"class":1475}," 0.07",[1041,1823,1824],{"class":1055},")                     ",[1041,1826,1827],{"class":1704},"\u002F\u002F → '700.00'   (7% VAT)\n",[1041,1829,1830,1832,1834,1836,1839,1841,1843,1845,1848,1850,1852,1854,1857,1859,1861,1864,1866,1868,1870],{"class":1043,"line":1123},[1041,1831,1807],{"class":1146},[1041,1833,1149],{"class":1055},[1041,1835,1186],{"class":1051},[1041,1837,1838],{"class":1074},"33.33",[1041,1840,1186],{"class":1051},[1041,1842,1059],{"class":1051},[1041,1844,1071],{"class":1051},[1041,1846,1847],{"class":1074},"0.07",[1041,1849,1186],{"class":1051},[1041,1851,1059],{"class":1051},[1041,1853,1052],{"class":1051},[1041,1855,1856],{"class":1158}," rounding",[1041,1858,1162],{"class":1051},[1041,1860,1071],{"class":1051},[1041,1862,1863],{"class":1074},"floor",[1041,1865,1186],{"class":1051},[1041,1867,1065],{"class":1051},[1041,1869,1481],{"class":1055},[1041,1871,1872],{"class":1704},"\u002F\u002F → '2.33'\n",[1559,1874,1876,1878],{"id":1875},"allocate-split-with-zero-drift",[950,1877,983],{}," — split with zero drift",[946,1880,1881,1884],{},[950,1882,1883],{},"allocate(amount, weights, opts?)"," splits an amount across weighted buckets using the largest-remainder method: the returned parts always sum back to the input exactly, with no leftover cent unaccounted for:",[1032,1886,1888],{"className":1034,"code":1887,"language":1036,"meta":1037,"style":1037},"import { allocate } from '@noy-db\u002Fhub'\n\nallocate('100.00', [1, 1, 1])\n\u002F\u002F → ['33.34', '33.33', '33.33']   (sums to '100.00')\n\nallocate('0.05', [3, 7])\n\u002F\u002F → ['0.02', '0.03']\n",[950,1889,1890,1909,1913,1947,1952,1956,1983],{"__ignoreMap":1037},[1041,1891,1892,1894,1896,1899,1901,1903,1905,1907],{"class":1043,"line":1044},[1041,1893,1048],{"class":1047},[1041,1895,1052],{"class":1051},[1041,1897,1898],{"class":1055}," allocate",[1041,1900,1065],{"class":1051},[1041,1902,1068],{"class":1047},[1041,1904,1071],{"class":1051},[1041,1906,1075],{"class":1074},[1041,1908,1078],{"class":1051},[1041,1910,1911],{"class":1043,"line":1081},[1041,1912,1127],{"emptyLinePlaceholder":1126},[1041,1914,1915,1918,1920,1922,1925,1927,1929,1932,1935,1937,1940,1942,1944],{"class":1043,"line":1102},[1041,1916,1917],{"class":1146},"allocate",[1041,1919,1149],{"class":1055},[1041,1921,1186],{"class":1051},[1041,1923,1924],{"class":1074},"100.00",[1041,1926,1186],{"class":1051},[1041,1928,1059],{"class":1051},[1041,1930,1931],{"class":1055}," [",[1041,1933,1934],{"class":1475},"1",[1041,1936,1059],{"class":1051},[1041,1938,1939],{"class":1475}," 1",[1041,1941,1059],{"class":1051},[1041,1943,1939],{"class":1475},[1041,1945,1946],{"class":1055},"])\n",[1041,1948,1949],{"class":1043,"line":1123},[1041,1950,1951],{"class":1704},"\u002F\u002F → ['33.34', '33.33', '33.33']   (sums to '100.00')\n",[1041,1953,1954],{"class":1043,"line":1130},[1041,1955,1127],{"emptyLinePlaceholder":1126},[1041,1957,1958,1960,1962,1964,1967,1969,1971,1973,1976,1978,1981],{"class":1043,"line":1155},[1041,1959,1917],{"class":1146},[1041,1961,1149],{"class":1055},[1041,1963,1186],{"class":1051},[1041,1965,1966],{"class":1074},"0.05",[1041,1968,1186],{"class":1051},[1041,1970,1059],{"class":1051},[1041,1972,1931],{"class":1055},[1041,1974,1975],{"class":1475},"3",[1041,1977,1059],{"class":1051},[1041,1979,1980],{"class":1475}," 7",[1041,1982,1946],{"class":1055},[1041,1984,1985],{"class":1043,"line":1173},[1041,1986,1987],{"class":1704},"\u002F\u002F → ['0.02', '0.03']\n",[1559,1989,1991],{"id":1990},"querying-and-summing-a-money-field","Querying and summing a money field",[946,1993,1994,1997,1998,2001,2002,2005],{},[950,1995,1996],{},"where()"," on a declared money field accepts operands in major units (",[950,1999,2000],{},"100",", ",[950,2003,2004],{},"'100.00'",") and compares exactly in scaled-integer space — no manual cents conversion needed:",[1032,2007,2009],{"className":1034,"code":2008,"language":1036,"meta":1037,"style":1037},"const over100 = invoices.query().where('total', '>', 100).toArray()\n\u002F\u002F → [ { id: 'a', total: '123.45' } ]   (the invoice put earlier, 123.45 > 100)\n",[950,2010,2011,2065],{"__ignoreMap":1037},[1041,2012,2013,2015,2018,2020,2022,2024,2027,2029,2031,2034,2036,2038,2040,2042,2044,2046,2048,2050,2052,2055,2057,2059,2062],{"class":1043,"line":1044},[1041,2014,1134],{"class":1133},[1041,2016,2017],{"class":1055}," over100 ",[1041,2019,1140],{"class":1051},[1041,2021,1593],{"class":1055},[1041,2023,1012],{"class":1051},[1041,2025,2026],{"class":1146},"query",[1041,2028,1167],{"class":1055},[1041,2030,1012],{"class":1051},[1041,2032,2033],{"class":1146},"where",[1041,2035,1149],{"class":1055},[1041,2037,1186],{"class":1051},[1041,2039,1754],{"class":1074},[1041,2041,1186],{"class":1051},[1041,2043,1059],{"class":1051},[1041,2045,1071],{"class":1051},[1041,2047,1249],{"class":1074},[1041,2049,1186],{"class":1051},[1041,2051,1059],{"class":1051},[1041,2053,2054],{"class":1475}," 100",[1041,2056,1431],{"class":1055},[1041,2058,1012],{"class":1051},[1041,2060,2061],{"class":1146},"toArray",[1041,2063,2064],{"class":1055},"()\n",[1041,2066,2067],{"class":1043,"line":1081},[1041,2068,2069],{"class":1704},"\u002F\u002F → [ { id: 'a', total: '123.45' } ]   (the invoice put earlier, 123.45 > 100)\n",[946,2071,2072,2073,2077,2078,2081,2082,2085,2086,1000,2089,1000,2092,2095,2096,1000,2099,1000,2102,2105,2106,2109,2110,2112,2113,1012],{},"Summing, averaging, or taking the min\u002Fmax of a money field is part of the separate ",[991,2074,2076],{"href":2075},".\u002Freduce","aggregate"," service: pass ",[950,2079,2080],{},"withReduce()"," to ",[950,2083,2084],{},"createNoydb",", then use ",[950,2087,2088],{},"moneySum",[950,2090,2091],{},"moneyMin",[950,2093,2094],{},"moneyMax"," (or plain ",[950,2097,2098],{},"sum",[950,2100,2101],{},"min",[950,2103,2104],{},"max",", which are auto-rewritten to the exact ",[950,2107,2108],{},"BigInt"," reducer for any field declared in ",[950,2111,1025],{},") — see ",[991,2114,2116],{"href":2115},".\u002Freduce#reducer-factories","aggregate → exact money aggregation",[1559,2118,2120,2121,1000,2124,2127],{"id":2119},"indexing-a-money-field-for-in-lookups","Indexing a money field for ",[950,2122,2123],{},"==",[950,2125,2126],{},"in"," lookups",[946,2129,2130,2131,2134,2135,2138,2139,1569,2142,2145,2146,2149],{},"If you add the ",[991,2132,705],{"href":2133},".\u002Findexing"," service and declare a money field in ",[950,2136,2137],{},"indexes",", an equality or membership query on that field skips the linear scan and resolves through the index. The fast path covers ",[950,2140,2141],{},"where(field, '==', …)",[950,2143,2144],{},"where(field, 'in', […])"," on a ",[1529,2147,2148],{},"fixed-mode"," field:",[1032,2151,2153],{"className":1034,"code":2152,"language":1036,"meta":1037,"style":1037},"import { withIndexing } from '@noy-db\u002Fhub\u002Findexing'\n\nconst db = await createNoydb({\n  store: toMemory(),\n  user: 'alice',\n  secret: 'a-strong-secret',\n  indexingStrategy: withIndexing(),\n})\nconst vault = await db.openVault('books')\nconst invoices = vault.collection\u003CInvoice>('invoices', {\n  schema: z.object({ id: z.string(), total: z.union([z.number(), z.string()]) }),\n  moneyFields: { total: money({ currency: 'EUR', scale: 2 }) },\n  indexes: ['total'],\n})\n\nawait invoices.put('a', { id: 'a', total: 123.45 })\nconst exact = invoices.query().where('total', '==', 123.45).toArray()\n\u002F\u002F → [ { id: 'a', total: '123.45' } ]   (index lookup, no scan)\n",[950,2154,2155,2175,2179,2195,2207,2221,2235,2248,2254,2280,2312,2376,2418,2438,2444,2448,2492,2541],{"__ignoreMap":1037},[1041,2156,2157,2159,2161,2164,2166,2168,2170,2173],{"class":1043,"line":1044},[1041,2158,1048],{"class":1047},[1041,2160,1052],{"class":1051},[1041,2162,2163],{"class":1055}," withIndexing",[1041,2165,1065],{"class":1051},[1041,2167,1068],{"class":1047},[1041,2169,1071],{"class":1051},[1041,2171,2172],{"class":1074},"@noy-db\u002Fhub\u002Findexing",[1041,2174,1078],{"class":1051},[1041,2176,2177],{"class":1043,"line":1081},[1041,2178,1127],{"emptyLinePlaceholder":1126},[1041,2180,2181,2183,2185,2187,2189,2191,2193],{"class":1043,"line":1102},[1041,2182,1134],{"class":1133},[1041,2184,1137],{"class":1055},[1041,2186,1140],{"class":1051},[1041,2188,1143],{"class":1047},[1041,2190,1056],{"class":1146},[1041,2192,1149],{"class":1055},[1041,2194,1152],{"class":1051},[1041,2196,2197,2199,2201,2203,2205],{"class":1043,"line":1123},[1041,2198,1159],{"class":1158},[1041,2200,1162],{"class":1051},[1041,2202,1088],{"class":1146},[1041,2204,1167],{"class":1055},[1041,2206,1170],{"class":1051},[1041,2208,2209,2211,2213,2215,2217,2219],{"class":1043,"line":1130},[1041,2210,1176],{"class":1158},[1041,2212,1162],{"class":1051},[1041,2214,1071],{"class":1051},[1041,2216,1183],{"class":1074},[1041,2218,1186],{"class":1051},[1041,2220,1170],{"class":1051},[1041,2222,2223,2225,2227,2229,2231,2233],{"class":1043,"line":1155},[1041,2224,1194],{"class":1158},[1041,2226,1162],{"class":1051},[1041,2228,1071],{"class":1051},[1041,2230,1201],{"class":1074},[1041,2232,1186],{"class":1051},[1041,2234,1170],{"class":1051},[1041,2236,2237,2240,2242,2244,2246],{"class":1043,"line":1173},[1041,2238,2239],{"class":1158},"  indexingStrategy",[1041,2241,1162],{"class":1051},[1041,2243,2163],{"class":1146},[1041,2245,1167],{"class":1055},[1041,2247,1170],{"class":1051},[1041,2249,2250,2252],{"class":1043,"line":1191},[1041,2251,1211],{"class":1051},[1041,2253,1214],{"class":1055},[1041,2255,2256,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278],{"class":1043,"line":1208},[1041,2257,1134],{"class":1133},[1041,2259,1298],{"class":1055},[1041,2261,1140],{"class":1051},[1041,2263,1143],{"class":1047},[1041,2265,1305],{"class":1055},[1041,2267,1012],{"class":1051},[1041,2269,1310],{"class":1146},[1041,2271,1149],{"class":1055},[1041,2273,1186],{"class":1051},[1041,2275,1317],{"class":1074},[1041,2277,1186],{"class":1051},[1041,2279,1214],{"class":1055},[1041,2281,2282,2284,2286,2288,2290,2292,2294,2296,2298,2300,2302,2304,2306,2308,2310],{"class":1043,"line":1217},[1041,2283,1134],{"class":1133},[1041,2285,1329],{"class":1055},[1041,2287,1140],{"class":1051},[1041,2289,1334],{"class":1055},[1041,2291,1012],{"class":1051},[1041,2293,1339],{"class":1146},[1041,2295,1238],{"class":1051},[1041,2297,1344],{"class":1228},[1041,2299,1249],{"class":1051},[1041,2301,1149],{"class":1055},[1041,2303,1186],{"class":1051},[1041,2305,1353],{"class":1074},[1041,2307,1186],{"class":1051},[1041,2309,1059],{"class":1051},[1041,2311,1252],{"class":1051},[1041,2313,2314,2316,2318,2320,2322,2324,2326,2328,2330,2332,2334,2336,2338,2340,2342,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368,2370,2372,2374],{"class":1043,"line":1222},[1041,2315,1365],{"class":1158},[1041,2317,1162],{"class":1051},[1041,2319,1109],{"class":1055},[1041,2321,1012],{"class":1051},[1041,2323,1374],{"class":1146},[1041,2325,1149],{"class":1055},[1041,2327,1379],{"class":1051},[1041,2329,1382],{"class":1158},[1041,2331,1162],{"class":1051},[1041,2333,1109],{"class":1055},[1041,2335,1012],{"class":1051},[1041,2337,1241],{"class":1146},[1041,2339,1167],{"class":1055},[1041,2341,1059],{"class":1051},[1041,2343,1397],{"class":1158},[1041,2345,1162],{"class":1051},[1041,2347,1109],{"class":1055},[1041,2349,1012],{"class":1051},[1041,2351,1406],{"class":1146},[1041,2353,1409],{"class":1055},[1041,2355,1012],{"class":1051},[1041,2357,952],{"class":1146},[1041,2359,1167],{"class":1055},[1041,2361,1059],{"class":1051},[1041,2363,1109],{"class":1055},[1041,2365,1012],{"class":1051},[1041,2367,1241],{"class":1146},[1041,2369,1426],{"class":1055},[1041,2371,1211],{"class":1051},[1041,2373,1431],{"class":1055},[1041,2375,1170],{"class":1051},[1041,2377,2378,2380,2382,2384,2386,2388,2390,2392,2394,2396,2398,2400,2402,2404,2406,2408,2410,2412,2414,2416],{"class":1043,"line":1255},[1041,2379,1439],{"class":1158},[1041,2381,1162],{"class":1051},[1041,2383,1052],{"class":1051},[1041,2385,1397],{"class":1158},[1041,2387,1162],{"class":1051},[1041,2389,1062],{"class":1146},[1041,2391,1149],{"class":1055},[1041,2393,1379],{"class":1051},[1041,2395,1456],{"class":1158},[1041,2397,1162],{"class":1051},[1041,2399,1071],{"class":1051},[1041,2401,1463],{"class":1074},[1041,2403,1186],{"class":1051},[1041,2405,1059],{"class":1051},[1041,2407,1470],{"class":1158},[1041,2409,1162],{"class":1051},[1041,2411,1476],{"class":1475},[1041,2413,1065],{"class":1051},[1041,2415,1481],{"class":1055},[1041,2417,1484],{"class":1051},[1041,2419,2420,2423,2425,2427,2429,2431,2433,2436],{"class":1043,"line":1266},[1041,2421,2422],{"class":1158},"  indexes",[1041,2424,1162],{"class":1051},[1041,2426,1931],{"class":1055},[1041,2428,1186],{"class":1051},[1041,2430,1754],{"class":1074},[1041,2432,1186],{"class":1051},[1041,2434,2435],{"class":1055},"]",[1041,2437,1170],{"class":1051},[1041,2439,2440,2442],{"class":1043,"line":1282},[1041,2441,1211],{"class":1051},[1041,2443,1214],{"class":1055},[1041,2445,2446],{"class":1043,"line":1288},[1041,2447,1127],{"emptyLinePlaceholder":1126},[1041,2449,2450,2452,2454,2456,2458,2460,2462,2464,2466,2468,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488,2490],{"class":1043,"line":1293},[1041,2451,1590],{"class":1047},[1041,2453,1593],{"class":1055},[1041,2455,1012],{"class":1051},[1041,2457,1598],{"class":1146},[1041,2459,1149],{"class":1055},[1041,2461,1186],{"class":1051},[1041,2463,991],{"class":1074},[1041,2465,1186],{"class":1051},[1041,2467,1059],{"class":1051},[1041,2469,1052],{"class":1051},[1041,2471,1382],{"class":1158},[1041,2473,1162],{"class":1051},[1041,2475,1071],{"class":1051},[1041,2477,991],{"class":1074},[1041,2479,1186],{"class":1051},[1041,2481,1059],{"class":1051},[1041,2483,1397],{"class":1158},[1041,2485,1162],{"class":1051},[1041,2487,1629],{"class":1475},[1041,2489,1065],{"class":1051},[1041,2491,1214],{"class":1055},[1041,2493,2494,2496,2499,2501,2503,2505,2507,2509,2511,2513,2515,2517,2519,2521,2523,2525,2527,2529,2531,2533,2535,2537,2539],{"class":1043,"line":1324},[1041,2495,1134],{"class":1133},[1041,2497,2498],{"class":1055}," exact ",[1041,2500,1140],{"class":1051},[1041,2502,1593],{"class":1055},[1041,2504,1012],{"class":1051},[1041,2506,2026],{"class":1146},[1041,2508,1167],{"class":1055},[1041,2510,1012],{"class":1051},[1041,2512,2033],{"class":1146},[1041,2514,1149],{"class":1055},[1041,2516,1186],{"class":1051},[1041,2518,1754],{"class":1074},[1041,2520,1186],{"class":1051},[1041,2522,1059],{"class":1051},[1041,2524,1071],{"class":1051},[1041,2526,2123],{"class":1074},[1041,2528,1186],{"class":1051},[1041,2530,1059],{"class":1051},[1041,2532,1629],{"class":1475},[1041,2534,1431],{"class":1055},[1041,2536,1012],{"class":1051},[1041,2538,2061],{"class":1146},[1041,2540,2064],{"class":1055},[1041,2542,2543],{"class":1043,"line":1362},[1041,2544,2545],{"class":1704},"\u002F\u002F → [ { id: 'a', total: '123.45' } ]   (index lookup, no scan)\n",[946,2547,2548,2549,2552,2553,1569,2555,2557,2558,2001,2561,2001,2563,2565,2566,2569],{},"The index is probed with the field's stored scaled-integer form, so an operand written in major units (",[950,2550,2551],{},"123.45",") matches the stored value without a floating-point round-trip. Only ",[950,2554,2123],{},[950,2556,2126],{}," take the fast path: ",[950,2559,2560],{},"between",[950,2562,1249],{},[950,2564,1238],{},", and the other range operators — and any query on a ",[1529,2567,2568],{},"multi-currency"," field — always fall back to a full scan, because a hash index has no single stored value to serve for those.",[946,2571,2572,2575,2576,2579,2580,2583,2584,1000,2586,2588,2589,2592,2593,2596],{},[1529,2573,2574],{},"Mixed-era records still match."," A record written before its field was declared money (or that otherwise skipped the money write path) can carry a non-canonical stored string — ",[950,2577,2578],{},"'0100'"," where a canonical write would store ",[950,2581,2582],{},"'100'",". The eager-mode index normalizes every money bucket key as it writes it, so a legacy record lands in the same bucket a canonical write produces: an ",[950,2585,2123],{},[950,2587,2126],{}," probe for the canonical amount finds it, and the indexed result matches a forced scan exactly. This holds when the index is first built, when a record is upserted with ",[950,2590,2591],{},"put()",", and when one is removed with ",[950,2594,2595],{},"delete()",", so updating or deleting a legacy record leaves its bucket correct.",[1559,2598,2600],{"id":2599},"formatting-a-virtual-computed-field","Formatting a virtual computed field",[946,2602,2603,2604,2608,2609,1162],{},"A ",[991,2605,2607],{"href":2606},".\u002Fcomputed","virtual computed"," field — one whose value is recomputed on every read and never stored — can be declared as money on the same field, and money formats its output exactly like a stored money field. Compose the two with ",[950,2610,2611],{},"via()",[1032,2613,2615],{"className":1034,"code":2614,"language":1036,"meta":1037,"style":1037},"import { via, computed } from '@noy-db\u002Fhub'\n\ninterface Priced extends Record\u003Cstring, unknown> { id: string; base: number }\n\nconst priced = vault.collection\u003CPriced>('priced', {\n  viaFields: {\n    doubledPrice: via(\n      computed((r) => (r.base as number) * 2, { deps: ['base'], mode: 'virtual' }),\n      money({ currency: 'EUR', scale: 2 }),\n    ),\n  },\n})\n\nawait priced.put('a', { id: 'a', base: 10.5 })\nconst read = await priced.get('a', { locale: 'de-DE' }) as Record\u003Cstring, unknown>\n\u002F\u002F → {\n\u002F\u002F   id: 'a',\n\u002F\u002F   doubledPrice: '21.00',            \u002F\u002F the fn's 21 quantized to the field's scale\n\u002F\u002F   doubledPriceFormatted: '21,00 €', \u002F\u002F dressed like any stored money field\n\u002F\u002F   doubledPriceNumber: 21,\n\u002F\u002F }\n",[950,2616,2617,2641,2645,2688,2692,2727,2736,2748,2825,2858,2865,2870,2876,2880,2926,2982,2986,2990,2998,3006,3011],{"__ignoreMap":1037},[1041,2618,2619,2621,2623,2626,2628,2631,2633,2635,2637,2639],{"class":1043,"line":1044},[1041,2620,1048],{"class":1047},[1041,2622,1052],{"class":1051},[1041,2624,2625],{"class":1055}," via",[1041,2627,1059],{"class":1051},[1041,2629,2630],{"class":1055}," computed",[1041,2632,1065],{"class":1051},[1041,2634,1068],{"class":1047},[1041,2636,1071],{"class":1051},[1041,2638,1075],{"class":1074},[1041,2640,1078],{"class":1051},[1041,2642,2643],{"class":1043,"line":1081},[1041,2644,1127],{"emptyLinePlaceholder":1126},[1041,2646,2647,2649,2652,2654,2656,2658,2660,2662,2664,2666,2668,2670,2672,2675,2678,2681,2683,2685],{"class":1043,"line":1102},[1041,2648,1225],{"class":1133},[1041,2650,2651],{"class":1228}," Priced",[1041,2653,1232],{"class":1133},[1041,2655,1235],{"class":1228},[1041,2657,1238],{"class":1051},[1041,2659,1241],{"class":1228},[1041,2661,1059],{"class":1051},[1041,2663,1246],{"class":1228},[1041,2665,1249],{"class":1051},[1041,2667,1052],{"class":1051},[1041,2669,1382],{"class":1158},[1041,2671,1162],{"class":1051},[1041,2673,2674],{"class":1228}," string",[1041,2676,2677],{"class":1051},";",[1041,2679,2680],{"class":1158}," base",[1041,2682,1162],{"class":1051},[1041,2684,1274],{"class":1228},[1041,2686,2687],{"class":1051}," }\n",[1041,2689,2690],{"class":1043,"line":1123},[1041,2691,1127],{"emptyLinePlaceholder":1126},[1041,2693,2694,2696,2699,2701,2703,2705,2707,2709,2712,2714,2716,2718,2721,2723,2725],{"class":1043,"line":1130},[1041,2695,1134],{"class":1133},[1041,2697,2698],{"class":1055}," priced ",[1041,2700,1140],{"class":1051},[1041,2702,1334],{"class":1055},[1041,2704,1012],{"class":1051},[1041,2706,1339],{"class":1146},[1041,2708,1238],{"class":1051},[1041,2710,2711],{"class":1228},"Priced",[1041,2713,1249],{"class":1051},[1041,2715,1149],{"class":1055},[1041,2717,1186],{"class":1051},[1041,2719,2720],{"class":1074},"priced",[1041,2722,1186],{"class":1051},[1041,2724,1059],{"class":1051},[1041,2726,1252],{"class":1051},[1041,2728,2729,2732,2734],{"class":1043,"line":1155},[1041,2730,2731],{"class":1158},"  viaFields",[1041,2733,1162],{"class":1051},[1041,2735,1252],{"class":1051},[1041,2737,2738,2741,2743,2745],{"class":1043,"line":1173},[1041,2739,2740],{"class":1158},"    doubledPrice",[1041,2742,1162],{"class":1051},[1041,2744,2625],{"class":1146},[1041,2746,2747],{"class":1055},"(\n",[1041,2749,2750,2753,2755,2757,2761,2763,2766,2769,2771,2774,2776,2778,2780,2783,2785,2787,2789,2792,2794,2796,2798,2801,2803,2805,2807,2810,2812,2814,2817,2819,2821,2823],{"class":1043,"line":1191},[1041,2751,2752],{"class":1146},"      computed",[1041,2754,1149],{"class":1055},[1041,2756,1149],{"class":1051},[1041,2758,2760],{"class":2759},"sHdIc","r",[1041,2762,1431],{"class":1051},[1041,2764,2765],{"class":1133}," =>",[1041,2767,2768],{"class":1055}," (r",[1041,2770,1012],{"class":1051},[1041,2772,2773],{"class":1055},"base ",[1041,2775,1686],{"class":1047},[1041,2777,1274],{"class":1228},[1041,2779,1481],{"class":1055},[1041,2781,2782],{"class":1051},"*",[1041,2784,1476],{"class":1475},[1041,2786,1059],{"class":1051},[1041,2788,1052],{"class":1051},[1041,2790,2791],{"class":1158}," deps",[1041,2793,1162],{"class":1051},[1041,2795,1931],{"class":1055},[1041,2797,1186],{"class":1051},[1041,2799,2800],{"class":1074},"base",[1041,2802,1186],{"class":1051},[1041,2804,2435],{"class":1055},[1041,2806,1059],{"class":1051},[1041,2808,2809],{"class":1158}," mode",[1041,2811,1162],{"class":1051},[1041,2813,1071],{"class":1051},[1041,2815,2816],{"class":1074},"virtual",[1041,2818,1186],{"class":1051},[1041,2820,1065],{"class":1051},[1041,2822,1431],{"class":1055},[1041,2824,1170],{"class":1051},[1041,2826,2827,2830,2832,2834,2836,2838,2840,2842,2844,2846,2848,2850,2852,2854,2856],{"class":1043,"line":1208},[1041,2828,2829],{"class":1146},"      money",[1041,2831,1149],{"class":1055},[1041,2833,1379],{"class":1051},[1041,2835,1456],{"class":1158},[1041,2837,1162],{"class":1051},[1041,2839,1071],{"class":1051},[1041,2841,1463],{"class":1074},[1041,2843,1186],{"class":1051},[1041,2845,1059],{"class":1051},[1041,2847,1470],{"class":1158},[1041,2849,1162],{"class":1051},[1041,2851,1476],{"class":1475},[1041,2853,1065],{"class":1051},[1041,2855,1431],{"class":1055},[1041,2857,1170],{"class":1051},[1041,2859,2860,2863],{"class":1043,"line":1217},[1041,2861,2862],{"class":1055},"    )",[1041,2864,1170],{"class":1051},[1041,2866,2867],{"class":1043,"line":1222},[1041,2868,2869],{"class":1051},"  },\n",[1041,2871,2872,2874],{"class":1043,"line":1255},[1041,2873,1211],{"class":1051},[1041,2875,1214],{"class":1055},[1041,2877,2878],{"class":1043,"line":1266},[1041,2879,1127],{"emptyLinePlaceholder":1126},[1041,2881,2882,2884,2887,2889,2891,2893,2895,2897,2899,2901,2903,2905,2907,2909,2911,2913,2915,2917,2919,2922,2924],{"class":1043,"line":1282},[1041,2883,1590],{"class":1047},[1041,2885,2886],{"class":1055}," priced",[1041,2888,1012],{"class":1051},[1041,2890,1598],{"class":1146},[1041,2892,1149],{"class":1055},[1041,2894,1186],{"class":1051},[1041,2896,991],{"class":1074},[1041,2898,1186],{"class":1051},[1041,2900,1059],{"class":1051},[1041,2902,1052],{"class":1051},[1041,2904,1382],{"class":1158},[1041,2906,1162],{"class":1051},[1041,2908,1071],{"class":1051},[1041,2910,991],{"class":1074},[1041,2912,1186],{"class":1051},[1041,2914,1059],{"class":1051},[1041,2916,2680],{"class":1158},[1041,2918,1162],{"class":1051},[1041,2920,2921],{"class":1475}," 10.5",[1041,2923,1065],{"class":1051},[1041,2925,1214],{"class":1055},[1041,2927,2928,2930,2932,2934,2936,2938,2940,2942,2944,2946,2948,2950,2952,2954,2956,2958,2960,2962,2964,2966,2968,2970,2972,2974,2976,2978,2980],{"class":1043,"line":1288},[1041,2929,1134],{"class":1133},[1041,2931,1644],{"class":1055},[1041,2933,1140],{"class":1051},[1041,2935,1143],{"class":1047},[1041,2937,2886],{"class":1055},[1041,2939,1012],{"class":1051},[1041,2941,1655],{"class":1146},[1041,2943,1149],{"class":1055},[1041,2945,1186],{"class":1051},[1041,2947,991],{"class":1074},[1041,2949,1186],{"class":1051},[1041,2951,1059],{"class":1051},[1041,2953,1052],{"class":1051},[1041,2955,1670],{"class":1158},[1041,2957,1162],{"class":1051},[1041,2959,1071],{"class":1051},[1041,2961,1677],{"class":1074},[1041,2963,1186],{"class":1051},[1041,2965,1065],{"class":1051},[1041,2967,1481],{"class":1055},[1041,2969,1686],{"class":1047},[1041,2971,1235],{"class":1228},[1041,2973,1238],{"class":1051},[1041,2975,1241],{"class":1228},[1041,2977,1059],{"class":1051},[1041,2979,1246],{"class":1228},[1041,2981,1699],{"class":1051},[1041,2983,2984],{"class":1043,"line":1293},[1041,2985,1705],{"class":1704},[1041,2987,2988],{"class":1043,"line":1324},[1041,2989,1710],{"class":1704},[1041,2991,2992,2995],{"class":1043,"line":1362},[1041,2993,2994],{"class":1704},"\u002F\u002F   doubledPrice: '21.00',",[1041,2996,2997],{"class":1704},"            \u002F\u002F the fn's 21 quantized to the field's scale\n",[1041,2999,3000,3003],{"class":1043,"line":1436},[1041,3001,3002],{"class":1704},"\u002F\u002F   doubledPriceFormatted: '21,00 €',",[1041,3004,3005],{"class":1704}," \u002F\u002F dressed like any stored money field\n",[1041,3007,3008],{"class":1043,"line":1487},[1041,3009,3010],{"class":1704},"\u002F\u002F   doubledPriceNumber: 21,\n",[1041,3012,3014],{"class":1043,"line":3013},21,[1041,3015,1739],{"class":1704},[946,3017,3018,3019,3022,3023,3026,3027,1000,3029,3031,3032,3035,3036,3038,3039,3041,3042,3044,3045,3048,3049,3051,3052,1000,3054,3056],{},"Money takes the function's major-units result, quantizes it to the field's ",[950,3020,3021],{},"scale"," (applying any declared ",[950,3024,3025],{},"rounding","), and adds the ",[950,3028,1758],{},[950,3030,1761],{}," virtuals under a non-",[950,3033,3034],{},"'raw'"," locale. If the function returns more precision than ",[950,3037,3021],{}," allows and no ",[950,3040,3025],{}," is declared, the value is left raw and untouched rather than throwing — read-time formatting must never break a read; declaring a ",[950,3043,3025],{}," policy makes it quantize instead. This dressing is ",[1529,3046,3047],{},"fixed-mode only",": a virtual field's plain number has no ",[950,3050,1552],{}," shape for multi-currency mode. A materialized computed field declared as money is already formatted the same way. If the field is redacted by a taint policy, its ",[950,3053,1758],{},[950,3055,1761],{}," companions are stripped along with it, never left exposing the pre-redaction value.",[941,3058,3060],{"id":3059},"api","API",[946,3062,3063,3064,3066],{},"All exports below are available from the ",[950,3065,1075],{}," root.",[1559,3068,3070],{"id":3069},"moneyoptions",[950,3071,1520],{},[1032,3073,3075],{"className":1034,"code":3074,"language":1036,"meta":1037,"style":1037},"function money(options: MoneyOptionsFixed | MoneyOptionsMulti): MoneyDescriptor\n",[950,3076,3077],{"__ignoreMap":1037},[1041,3078,3079,3082,3084,3086,3089,3091,3094,3096,3099,3102],{"class":1043,"line":1044},[1041,3080,3081],{"class":1133},"function",[1041,3083,1062],{"class":1146},[1041,3085,1149],{"class":1051},[1041,3087,3088],{"class":2759},"options",[1041,3090,1162],{"class":1051},[1041,3092,3093],{"class":1228}," MoneyOptionsFixed",[1041,3095,1277],{"class":1051},[1041,3097,3098],{"class":1228}," MoneyOptionsMulti",[1041,3100,3101],{"class":1051},"):",[1041,3103,3104],{"class":1228}," MoneyDescriptor\n",[946,3106,3107,3108,3111,3112,1000,3115,3118,3119,3122,3123,1000,3125,3128],{},"Builds the field descriptor. Throws ",[950,3109,3110],{},"TypeError"," if both or neither of ",[950,3113,3114],{},"currency",[950,3116,3117],{},"currencies"," are given, and throws ",[950,3120,3121],{},"MoneyCurrencyError"," at construction if a currency has no resolvable scale (unlisted ISO-4217 code with no explicit ",[950,3124,3021],{},[950,3126,3127],{},"scaleOverrides",").",[3130,3131,3132,3151],"table",{},[3133,3134,3135],"thead",{},[3136,3137,3138,3142,3145,3148],"tr",{},[3139,3140,3141],"th",{},"Option (fixed mode)",[3139,3143,3144],{},"Type",[3139,3146,3147],{},"Default",[3139,3149,3150],{},"Purpose",[3152,3153,3154,3171,3189],"tbody",{},[3136,3155,3156,3161,3165,3168],{},[3157,3158,3159],"td",{},[950,3160,3114],{},[3157,3162,3163],{},[950,3164,1241],{},[3157,3166,3167],{},"— (required)",[3157,3169,3170],{},"The one currency this field holds",[3136,3172,3173,3177,3181,3186],{},[3157,3174,3175],{},[950,3176,3021],{},[3157,3178,3179],{},[950,3180,952],{},[3157,3182,3183,3184],{},"ISO-4217 minor-unit count for ",[950,3185,3114],{},[3157,3187,3188],{},"Override the decimal places; required for a currency code not in the built-in ISO-4217 table",[3136,3190,3191,3195,3200,3203],{},[3157,3192,3193],{},[950,3194,3025],{},[3157,3196,3197],{},[950,3198,3199],{},"RoundingMode",[3157,3201,3202],{},"none (excess precision throws)",[3157,3204,3205,3206],{},"Rounding applied when a written value carries more precision than ",[950,3207,3021],{},[3130,3209,3210,3223],{},[3133,3211,3212],{},[3136,3213,3214,3217,3219,3221],{},[3139,3215,3216],{},"Option (multi mode)",[3139,3218,3144],{},[3139,3220,3147],{},[3139,3222,3150],{},[3152,3224,3225,3245,3264],{},[3136,3226,3227,3231,3236,3238],{},[3157,3228,3229],{},[950,3230,3117],{},[3157,3232,3233],{},[950,3234,3235],{},"'any' | readonly string[]",[3157,3237,3167],{},[3157,3239,3240,3241,3244],{},"Allow-list of currencies, or ",[950,3242,3243],{},"'any'"," for every ISO-4217-known code",[3136,3246,3247,3251,3256,3261],{},[3157,3248,3249],{},[950,3250,3127],{},[3157,3252,3253],{},[950,3254,3255],{},"Record\u003Cstring, number>",[3157,3257,3258],{},[950,3259,3260],{},"{}",[3157,3262,3263],{},"Per-currency decimal-place overrides; required for a currency not in the built-in table",[3136,3265,3266,3270,3274,3276],{},[3157,3267,3268],{},[950,3269,3025],{},[3157,3271,3272],{},[950,3273,3199],{},[3157,3275,3202],{},[3157,3277,3278],{},"Same as fixed mode",[946,3280,3281,3283,3284,1012],{},[950,3282,3199],{}," is one of ",[950,3285,3286],{},"'half-up' | 'half-even' | 'half-down' | 'up' | 'down' | 'ceil' | 'floor'",[946,3288,3289,3292,3293,3296,3297,3300,3301,3304,3305,2001,3308,3311,3312,3315],{},[950,3290,3291],{},"MoneyDescriptor"," (the return value) exposes ",[950,3294,3295],{},"mode"," (",[950,3298,3299],{},"'fixed' | 'multi'","), ",[950,3302,3303],{},"fixedCurrency"," (set in fixed mode), ",[950,3306,3307],{},"scaleFor(currency)",[950,3309,3310],{},"allows(currency)",", and ",[950,3313,3314],{},"soleCurrency()"," (the one currency implied by the descriptor, if any).",[1559,3317,3319],{"id":3318},"ismoneydescriptorx",[950,3320,3321],{},"isMoneyDescriptor(x)",[1032,3323,3325],{"className":1034,"code":3324,"language":1036,"meta":1037,"style":1037},"function isMoneyDescriptor(x: unknown): x is MoneyDescriptor\n",[950,3326,3327],{"__ignoreMap":1037},[1041,3328,3329,3331,3334,3336,3339,3341,3343,3345,3348,3351],{"class":1043,"line":1044},[1041,3330,3081],{"class":1133},[1041,3332,3333],{"class":1146}," isMoneyDescriptor",[1041,3335,1149],{"class":1051},[1041,3337,3338],{"class":2759},"x",[1041,3340,1162],{"class":1051},[1041,3342,1246],{"class":1228},[1041,3344,3101],{"class":1051},[1041,3346,3347],{"class":2759}," x",[1041,3349,3350],{"class":1051}," is",[1041,3352,3104],{"class":1228},[946,3354,3355,3356,1012],{},"Runtime predicate for detecting a value built by ",[950,3357,968],{},[1559,3359,3361],{"id":3360},"mulrateamount-rate-opts",[950,3362,1773],{},[1032,3364,3366],{"className":1034,"code":3365,"language":1036,"meta":1037,"style":1037},"function mulRate(amount: number | string, rate: number | string, opts?: MulRateOptions): string\n",[950,3367,3368],{"__ignoreMap":1037},[1041,3369,3370,3372,3374,3376,3379,3381,3383,3385,3387,3389,3392,3394,3396,3398,3400,3402,3405,3408,3411,3413],{"class":1043,"line":1044},[1041,3371,3081],{"class":1133},[1041,3373,1788],{"class":1146},[1041,3375,1149],{"class":1051},[1041,3377,3378],{"class":2759},"amount",[1041,3380,1162],{"class":1051},[1041,3382,1274],{"class":1228},[1041,3384,1277],{"class":1051},[1041,3386,2674],{"class":1228},[1041,3388,1059],{"class":1051},[1041,3390,3391],{"class":2759}," rate",[1041,3393,1162],{"class":1051},[1041,3395,1274],{"class":1228},[1041,3397,1277],{"class":1051},[1041,3399,2674],{"class":1228},[1041,3401,1059],{"class":1051},[1041,3403,3404],{"class":2759}," opts",[1041,3406,3407],{"class":1051},"?:",[1041,3409,3410],{"class":1228}," MulRateOptions",[1041,3412,3101],{"class":1051},[1041,3414,1263],{"class":1228},[3130,3416,3417,3431],{},[3133,3418,3419],{},[3136,3420,3421,3424,3426,3428],{},[3139,3422,3423],{},"Option",[3139,3425,3144],{},[3139,3427,3147],{},[3139,3429,3430],{},"Effect",[3152,3432,3433,3449],{},[3136,3434,3435,3439,3443,3446],{},[3157,3436,3437],{},[950,3438,3021],{},[3157,3440,3441],{},[950,3442,952],{},[3157,3444,3445],{},"the amount's own fractional digits",[3157,3447,3448],{},"Output scale",[3136,3450,3451,3455,3459,3464],{},[3157,3452,3453],{},[950,3454,3025],{},[3157,3456,3457],{},[950,3458,3199],{},[3157,3460,3461],{},[950,3462,3463],{},"'half-up'",[3157,3465,3466],{},"Rounding for the final re-scale",[1559,3468,3470],{"id":3469},"allocateamount-weights-opts",[950,3471,1883],{},[1032,3473,3475],{"className":1034,"code":3474,"language":1036,"meta":1037,"style":1037},"function allocate(amount: number | string, weights: ReadonlyArray\u003Cnumber | string>, opts?: AllocateOptions): string[]\n",[950,3476,3477],{"__ignoreMap":1037},[1041,3478,3479,3481,3483,3485,3487,3489,3491,3493,3495,3497,3500,3502,3505,3507,3509,3511,3513,3516,3518,3520,3523,3525,3527],{"class":1043,"line":1044},[1041,3480,3081],{"class":1133},[1041,3482,1898],{"class":1146},[1041,3484,1149],{"class":1051},[1041,3486,3378],{"class":2759},[1041,3488,1162],{"class":1051},[1041,3490,1274],{"class":1228},[1041,3492,1277],{"class":1051},[1041,3494,2674],{"class":1228},[1041,3496,1059],{"class":1051},[1041,3498,3499],{"class":2759}," weights",[1041,3501,1162],{"class":1051},[1041,3503,3504],{"class":1228}," ReadonlyArray",[1041,3506,1238],{"class":1051},[1041,3508,952],{"class":1228},[1041,3510,1277],{"class":1051},[1041,3512,2674],{"class":1228},[1041,3514,3515],{"class":1051},">,",[1041,3517,3404],{"class":2759},[1041,3519,3407],{"class":1051},[1041,3521,3522],{"class":1228}," AllocateOptions",[1041,3524,3101],{"class":1051},[1041,3526,2674],{"class":1228},[1041,3528,3529],{"class":1055},"[]\n",[3130,3531,3532,3544],{},[3133,3533,3534],{},[3136,3535,3536,3538,3540,3542],{},[3139,3537,3423],{},[3139,3539,3144],{},[3139,3541,3147],{},[3139,3543,3430],{},[3152,3545,3546],{},[3136,3547,3548,3552,3556,3558],{},[3157,3549,3550],{},[950,3551,3021],{},[3157,3553,3554],{},[950,3555,952],{},[3157,3557,3445],{},[3157,3559,3560],{},"Working scale",[946,3562,3563,3564,3567],{},"Weights must be non-negative decimals with a positive sum; throws ",[950,3565,3566],{},"MoneyUnsupportedError"," otherwise. Negative amounts allocate the magnitude and negate every part, so the parts still sum to the (negative) input exactly.",[1559,3569,3571],{"id":3570},"scaleforcurrencycode",[950,3572,3573],{},"scaleForCurrency(code)",[1032,3575,3577],{"className":1034,"code":3576,"language":1036,"meta":1037,"style":1037},"function scaleForCurrency(code: string): number | null\n",[950,3578,3579],{"__ignoreMap":1037},[1041,3580,3581,3583,3586,3588,3590,3592,3594,3596,3598,3600],{"class":1043,"line":1044},[1041,3582,3081],{"class":1133},[1041,3584,3585],{"class":1146}," scaleForCurrency",[1041,3587,1149],{"class":1051},[1041,3589,950],{"class":2759},[1041,3591,1162],{"class":1051},[1041,3593,2674],{"class":1228},[1041,3595,3101],{"class":1051},[1041,3597,1274],{"class":1228},[1041,3599,1277],{"class":1051},[1041,3601,3602],{"class":1228}," null\n",[946,3604,3605,3606,3609,3610,2001,3613,3609,3616,2001,3619,3609,3622,3624,3625,3628,3629,1000,3631,3633],{},"Looks up the ISO-4217 minor-unit count for a currency code (",[950,3607,3608],{},"'EUR'"," → ",[950,3611,3612],{},"2",[950,3614,3615],{},"'JPY'",[950,3617,3618],{},"0",[950,3620,3621],{},"'BHD'",[950,3623,1975],{},"); returns ",[950,3626,3627],{},"null"," for a code outside the built-in table, which is what forces an explicit ",[950,3630,3021],{},[950,3632,3127],{}," for exotic currencies.",[1559,3635,3637,3640,3641,3640,3644],{"id":3636},"asmoneyvalue-ismoneystringvalue-moneynumbervalue",[950,3638,3639],{},"asMoney(value)"," \u002F ",[950,3642,3643],{},"isMoneyString(value)",[950,3645,3646],{},"moneyNumber(value)",[1032,3648,3650],{"className":1034,"code":3649,"language":1036,"meta":1037,"style":1037},"function asMoney(value: string | number): MoneyString\nfunction isMoneyString(value: unknown): value is MoneyString\nfunction moneyNumber(value: MoneyString | string | number): number\n",[950,3651,3652,3677,3701],{"__ignoreMap":1037},[1041,3653,3654,3656,3659,3661,3664,3666,3668,3670,3672,3674],{"class":1043,"line":1044},[1041,3655,3081],{"class":1133},[1041,3657,3658],{"class":1146}," asMoney",[1041,3660,1149],{"class":1051},[1041,3662,3663],{"class":2759},"value",[1041,3665,1162],{"class":1051},[1041,3667,2674],{"class":1228},[1041,3669,1277],{"class":1051},[1041,3671,1274],{"class":1228},[1041,3673,3101],{"class":1051},[1041,3675,3676],{"class":1228}," MoneyString\n",[1041,3678,3679,3681,3684,3686,3688,3690,3692,3694,3697,3699],{"class":1043,"line":1081},[1041,3680,3081],{"class":1133},[1041,3682,3683],{"class":1146}," isMoneyString",[1041,3685,1149],{"class":1051},[1041,3687,3663],{"class":2759},[1041,3689,1162],{"class":1051},[1041,3691,1246],{"class":1228},[1041,3693,3101],{"class":1051},[1041,3695,3696],{"class":2759}," value",[1041,3698,3350],{"class":1051},[1041,3700,3676],{"class":1228},[1041,3702,3703,3705,3708,3710,3712,3714,3717,3719,3721,3723,3725,3727],{"class":1043,"line":1102},[1041,3704,3081],{"class":1133},[1041,3706,3707],{"class":1146}," moneyNumber",[1041,3709,1149],{"class":1051},[1041,3711,3663],{"class":2759},[1041,3713,1162],{"class":1051},[1041,3715,3716],{"class":1228}," MoneyString",[1041,3718,1277],{"class":1051},[1041,3720,2674],{"class":1228},[1041,3722,1277],{"class":1051},[1041,3724,1274],{"class":1228},[1041,3726,3101],{"class":1051},[1041,3728,3729],{"class":1228}," number\n",[946,3731,3732,3735,3736,3738,3739,3742,3743,3745,3746,3749,3750,3752,3753,1000,3755,3757],{},[950,3733,3734],{},"MoneyString"," is a branded ",[950,3737,1241],{}," type (zero runtime cost) marking a value that has been through the money decode path, so a validator or read site can distinguish \"already-canonical decimal\" from a plain user-typed string. ",[950,3740,3741],{},"asMoney()"," is a runtime-guarded cast for trust boundaries (deserialized JSON, route params) — it throws ",[950,3744,3566],{}," on a non-finite\u002Fnon-decimal input. ",[950,3747,3748],{},"moneyNumber()"," is the one sanctioned escape hatch to a plain JS ",[950,3751,952],{},", for display math and chart axes — explicitly lossy past 2^53; never feed the result back into a stored amount, use ",[950,3754,1807],{},[950,3756,1917],{}," instead.",[1559,3759,3761],{"id":3760},"errors","Errors",[946,3763,3764,3765,3768,3769,1012],{},"All extend ",[950,3766,3767],{},"NoydbError"," and are exported from ",[950,3770,1075],{},[3130,3772,3773,3783],{},[3133,3774,3775],{},[3136,3776,3777,3780],{},[3139,3778,3779],{},"Error",[3139,3781,3782],{},"Thrown when",[3152,3784,3785,3800,3809],{},[3136,3786,3787,3792],{},[3157,3788,3789],{},[950,3790,3791],{},"MoneyPrecisionError",[3157,3793,3794,3795,3038,3797,3799],{},"A written value carries more decimal precision than the field's ",[950,3796,3021],{},[950,3798,3025],{}," mode is configured",[3136,3801,3802,3806],{},[3157,3803,3804],{},[950,3805,3121],{},[3157,3807,3808],{},"A currency is disallowed for the field, or has no resolvable scale (unlisted ISO-4217 code with no explicit scale)",[3136,3810,3811,3815],{},[3157,3812,3813],{},[950,3814,3566],{},[3157,3816,3817,3818,1000,3820,3822,3823,3825,3826,3829],{},"An unsupported operation is attempted on a money field or value — e.g. a non-decimal amount\u002Fweight passed to ",[950,3819,1807],{},[950,3821,1917],{},", an empty ",[950,3824,1917],{}," weight list, or ",[950,3827,3828],{},"avg()"," over a declared money field (see Limits below)",[941,3831,3833],{"id":3832},"limits-gotchas","Limits & gotchas",[1523,3835,3836,3857,3873,3894,3908,3921,3934],{},[1526,3837,3838,3843,3844,3846,3847,1569,3850,3853,3854,3856],{},[1529,3839,3840,3842],{},[950,3841,3828],{}," is unsupported on money fields"," — it throws ",[950,3845,3566],{}," rather than silently returning a lossy figure. Use ",[950,3848,3849],{},"moneySum()",[950,3851,3852],{},"count()"," from the ",[991,3855,2076],{"href":2075}," service and divide at the boundary.",[1526,3858,3859,3866,3867,3869,3870,3872],{},[1529,3860,3861,1569,3863,3865],{},[950,3862,3114],{},[950,3864,3117],{}," are mutually exclusive"," — passing both, or neither, throws a ",[950,3868,3110],{}," at ",[950,3871,968],{}," construction.",[1526,3874,3875,1532,3878,3881,3882,3884,3885,3887,3888,3890,3891,3893],{},[1529,3876,3877],{},"Unlisted currencies need an explicit scale",[950,3879,3880],{},"scaleForCurrency()"," only covers the common ISO-4217 set; a code outside it (or a non-standard unit like a precious-metal ticker) must pass ",[950,3883,3021],{}," (fixed mode) or ",[950,3886,3127],{}," (multi mode), or ",[950,3889,968],{}," throws ",[950,3892,3121],{}," at construction.",[1526,3895,3896,3903,3904,3907],{},[1529,3897,3898,1000,3900,3902],{},[950,3899,1807],{},[950,3901,1917],{}," are pure functions"," — they take and return plain decimal strings\u002Fnumbers with no vault or descriptor dependency; they don't read or write a field, and the working scale is inferred from the amount's own fractional digits unless ",[950,3905,3906],{},"opts.scale"," is given.",[1526,3909,3910,3913,3914,3916,3917,3920],{},[1529,3911,3912],{},"Cross-currency comparisons are undefined"," — in multi-currency mode, a ",[950,3915,1996],{}," operand carries one currency; a record in a different currency matches ",[950,3918,3919],{},"!="," and nothing else (no implied ordering across currencies).",[1526,3922,3923,3930,3931,3933],{},[1529,3924,3925,1000,3927,3929],{},[950,3926,3748],{},[950,3928,1572],{}," are display-only"," — both are explicitly lossy past ",[950,3932,964],{},"; never write the result back into a stored money field.",[1526,3935,3936,3939,3940,3943,3944,1000,3946,3948,3949,3952,3953,3955,3956,3963,3964,3966,3967,3971,3972,3975,3976,3979,3980,1000,3983,3986],{},[1529,3937,3938],{},"Lazy-mode money queries are Via-aware (since 0.3.0-pre.12)"," — a lazy-mode collection (",[950,3941,3942],{},"prefetch: false",") keeps its own durable side-car indexes, and these now canonicalize each money bucket key exactly as the eager index does; the lazy ",[950,3945,2123],{},[950,3947,2126],{}," post-filter also runs Via-aware against the raw stored record, so an indexed ",[950,3950,3951],{},"lazyQuery()"," no longer diverges from a forced scan at any ",[950,3954,3021],{},". Two narrower limits remain: ",[1529,3957,3958,3959,3962],{},"lazy ",[950,3960,3961],{},"orderBy"," on a money field doesn't yet sort in scaled space"," — equality\u002F",[950,3965,2126],{}," filtering is correct, but ordering parity with eager is still pending; and a legacy record written ",[3968,3969,3970],"em",{},"before"," the field's ",[950,3973,3974],{},"indexes: [...]"," declaration has no side-car until backfilled, so it needs ",[950,3977,3978],{},"reconcileOnOpen: 'auto'"," (or an explicit ",[950,3981,3982],{},"reconcileIndex()",[950,3984,3985],{},"rebuildIndexes()"," call) to become visible to the fast path.",[941,3988,3990],{"id":3989},"see-also","See also",[1523,3992,3993,4002,4016,4026,4031],{},[1526,3994,3995,3998,3999,4001],{},[991,3996,896],{"href":3997},".\u002Fvia"," — the field-feature composer ",[950,4000,968],{}," plugs into",[1526,4003,4004,1532,4006,1000,4008,1000,4010,4012,4013,4015],{},[991,4005,2076],{"href":2075},[950,4007,2088],{},[950,4009,2091],{},[950,4011,2094],{}," and exact ",[950,4014,2108],{}," summation over declared money fields",[1526,4017,4018,4020,4021,1000,4023,4025],{},[991,4019,701],{"href":993}," — the sibling field-descriptor pattern (",[950,4022,999],{},[950,4024,1003],{},") money follows",[1526,4027,4028,4030],{},[991,4029,637],{"href":2606}," — derived fields, which compose with money-typed fields",[1526,4032,4033,4036,4037],{},[991,4034,4035],{"href":598},"Services overview"," · ",[991,4038,4040],{"href":4039},"\u002Forientation","Orientation map",[4042,4043,4044],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":1037,"searchDepth":1102,"depth":1102,"links":4046},[4047,4048,4049,4060,4070,4071],{"id":943,"depth":1081,"text":944},{"id":1015,"depth":1081,"text":1016},{"id":1556,"depth":1081,"text":1557,"children":4050},[4051,4052,4054,4056,4057,4059],{"id":1561,"depth":1102,"text":1562},{"id":1765,"depth":1102,"text":4053},"mulRate() — apply a rate exactly",{"id":1875,"depth":1102,"text":4055},"allocate() — split with zero drift",{"id":1990,"depth":1102,"text":1991},{"id":2119,"depth":1102,"text":4058},"Indexing a money field for ==\u002Fin lookups",{"id":2599,"depth":1102,"text":2600},{"id":3059,"depth":1081,"text":3060,"children":4061},[4062,4063,4064,4065,4066,4067,4069],{"id":3069,"depth":1102,"text":1520},{"id":3318,"depth":1102,"text":3321},{"id":3360,"depth":1102,"text":1773},{"id":3469,"depth":1102,"text":1883},{"id":3570,"depth":1102,"text":3573},{"id":3636,"depth":1102,"text":4068},"asMoney(value) \u002F isMoneyString(value) \u002F moneyNumber(value)",{"id":3760,"depth":1102,"text":3761},{"id":3832,"depth":1081,"text":3833},{"id":3989,"depth":1081,"text":3990},null,"The `money()` field descriptor: exact-decimal currency storage with no floating-point drift, plus allocate()\u002FmulRate() helpers that always add back up.","md",{},"service",{"title":760,"description":4073},"0.2.0-pre.12","stable","important","gAIJr72M53VHqEvoPhbCkZwU3I346jOdqJhuMWEeQBo",{"data":4083,"body":4084},{},{"type":4085,"children":4086},"root",[4087],{"type":4088,"tag":946,"props":4089,"children":4090},"element",{},[4091,4097],{"type":4088,"tag":950,"props":4092,"children":4094},{"className":4093},[],[4095],{"type":4096,"value":1075},"text",{"type":4096,"value":4098}," (root export)",{"data":4100,"body":4101},{},{"type":4085,"children":4102},[4103],{"type":4088,"tag":946,"props":4104,"children":4105},{},[4106,4108,4113],{"type":4096,"value":4107},"Core feature — activated per field by declaring a ",{"type":4088,"tag":950,"props":4109,"children":4111},{"className":4110},[],[4112],{"type":4096,"value":968},{"type":4096,"value":4114}," field descriptor.",1791896572726]