{"_id":"@airstrings/web","_rev":"9-0b7d73d5333425a3204079feb4cb7f9f","name":"@airstrings/web","dist-tags":{"latest":"1.3.0"},"versions":{"0.1.0":{"name":"@airstrings/web","version":"0.1.0","keywords":["airstrings","i18n","l10n","localization","internationalization","icu","messageformat","ed25519","cdn","sdk"],"author":{"name":"Symbionix","email":"info@symbionix.io"},"license":"MIT","_id":"@airstrings/web@0.1.0","maintainers":[{"name":"symbionixsl","email":"symbionix.sl@gmail.com"}],"homepage":"https://github.com/symbionix-sl/airstrings-sdk-web#readme","bugs":{"url":"https://github.com/symbionix-sl/airstrings-sdk-web/issues"},"dist":{"shasum":"b3b965f51f1db25e842cec17eb6a4e9d5ce062a6","tarball":"https://registry.npmjs.org/@airstrings/web/-/web-0.1.0.tgz","fileCount":9,"integrity":"sha512-5i/JoRFDJa82st0tG8XZZz6mzrge6GFzLXNK3nqJUk52+6S0JTnwCOoqO+2bKd5/P5MMcdulN4ZikEkzLkOn1g==","signatures":[{"sig":"MEUCICgfP4RUssDumAhOu/9VbQunW/ze89Vs33govY8uxylKAiEAkVMBRv2+BXfmT5RE384fqF1UohH+QrJBHsD9fygPFRM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airstrings%2fweb@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":120981},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"3c893850f6d90a9ca4903d77fd51d389942182ec","scripts":{"lint":"eslint src/ tests/","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"symbionixsl","email":"symbionix.sl@gmail.com"},"repository":{"url":"git+https://github.com/symbionix-sl/airstrings-sdk-web.git","type":"git"},"_npmVersion":"10.8.2","description":"AirStrings Web SDK — fetch, verify, cache, and serve Ed25519-signed localized string bundles","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@noble/ed25519":"^2.1.0","intl-messageformat":"^11.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","@eslint/js":"^9.0.0","typescript":"^5.7.0","fake-indexeddb":"^6.0.0","typescript-eslint":"^8.0.0","@vitest/coverage-v8":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/web_0.1.0_1775553493170_0.47185584539440906","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@airstrings/web","version":"0.1.1","keywords":["airstrings","i18n","l10n","localization","internationalization","icu","messageformat","ed25519","cdn","sdk"],"author":{"name":"Symbionix","email":"info@symbionix.io"},"license":"MIT","_id":"@airstrings/web@0.1.1","maintainers":[{"name":"symbionixsl","email":"symbionix.sl@gmail.com"}],"homepage":"https://github.com/symbionix-sl/airstrings-sdk-web#readme","bugs":{"url":"https://github.com/symbionix-sl/airstrings-sdk-web/issues"},"dist":{"shasum":"0004cccbea6aa3cee9ecda752e60e88ba56ee5cc","tarball":"https://registry.npmjs.org/@airstrings/web/-/web-0.1.1.tgz","fileCount":9,"integrity":"sha512-eT2E+mCGkReBdppwICId9xlKprY8GaVOk+90NYy2/3dZj8NMJGSTELF97/OReP5r2QCLvn1VdTdfYPQ+Kw/swQ==","signatures":[{"sig":"MEUCIDEhk/1KKyYcSAiRWs/5jK/gD5oh+85CKG3+QKpJHyQtAiEA/WfR4gfAurAYdFbOYYZW1yKHk14KZvnbcInBo5x+FwA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airstrings%2fweb@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":120981},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"8c8dfae2fd47c5185a12e2e2590f7455d2ca43a1","scripts":{"lint":"eslint src/ tests/","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:21f6e290-7f28-47bc-b3e6-59c6fa3ab3fb"}},"repository":{"url":"git+https://github.com/symbionix-sl/airstrings-sdk-web.git","type":"git"},"_npmVersion":"11.11.0","description":"AirStrings Web SDK — fetch, verify, cache, and serve Ed25519-signed localized string bundles","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"@noble/ed25519":"^2.1.0","intl-messageformat":"^11.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","@eslint/js":"^9.0.0","typescript":"^5.7.0","fake-indexeddb":"^6.0.0","typescript-eslint":"^8.0.0","@vitest/coverage-v8":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/web_0.1.1_1775554748363_0.8734827349977841","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@airstrings/web","version":"0.1.2","keywords":["airstrings","i18n","l10n","localization","internationalization","icu","messageformat","ed25519","cdn","sdk"],"author":{"name":"Symbionix","email":"info@symbionix.io"},"license":"MIT","_id":"@airstrings/web@0.1.2","maintainers":[{"name":"symbionixsl","email":"symbionix.sl@gmail.com"}],"homepage":"https://github.com/symbionix-sl/airstrings-sdk-web#readme","bugs":{"url":"https://github.com/symbionix-sl/airstrings-sdk-web/issues"},"dist":{"shasum":"c227e7c84e35ab71a488f87f596c6142f0723620","tarball":"https://registry.npmjs.org/@airstrings/web/-/web-0.1.2.tgz","fileCount":9,"integrity":"sha512-vX1hFkr/4D6XMXtdWCvawd5QpnzIOvA86WBCupL1MFTB6YMcMtlWgwgOBx+S2hCjxC3FycR3D9gik0SNEQTKdQ==","signatures":[{"sig":"MEUCIQCuOuwSfXPmpzdDkUhuyzRIkAggPb2835jGOanz0prNqQIgFoPq/5nPQewffEuZL/iLiq8QVAQBWMetW40BgFhbZMc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airstrings%2fweb@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":129049},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"77a90b1d791f0441316cbb26e79b0696e908e5d7","scripts":{"lint":"eslint src/ tests/","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:21f6e290-7f28-47bc-b3e6-59c6fa3ab3fb"}},"repository":{"url":"git+https://github.com/symbionix-sl/airstrings-sdk-web.git","type":"git"},"_npmVersion":"11.11.0","description":"AirStrings Web SDK — fetch, verify, cache, and serve Ed25519-signed localized string bundles","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"@noble/ed25519":"^2.1.0","intl-messageformat":"^11.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","@eslint/js":"^9.0.0","typescript":"^5.7.0","fake-indexeddb":"^6.0.0","typescript-eslint":"^8.0.0","@vitest/coverage-v8":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/web_0.1.2_1775731108725_0.5592384676052213","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@airstrings/web","version":"0.3.0","keywords":["airstrings","i18n","l10n","localization","internationalization","icu","messageformat","ed25519","cdn","sdk"],"author":{"name":"Symbionix","email":"info@symbionix.io"},"license":"MIT","_id":"@airstrings/web@0.3.0","maintainers":[{"name":"symbionixsl","email":"symbionix.sl@gmail.com"}],"homepage":"https://github.com/symbionix-sl/airstrings-sdk-web#readme","bugs":{"url":"https://github.com/symbionix-sl/airstrings-sdk-web/issues"},"dist":{"shasum":"c07a1dbbbc1d644dcf62052657db29d414bf49d8","tarball":"https://registry.npmjs.org/@airstrings/web/-/web-0.3.0.tgz","fileCount":9,"integrity":"sha512-bPU47gAvvxZ5uN+60KK1dVObV4mfbsegcuGIE6h2wbPJDpLJnOamuJcDRpQd2RVKelk45ABKmFSMX/J0Wl7eLQ==","signatures":[{"sig":"MEUCIF4DyfdMXSEMpE65yWHG3JoDzkoADfGYEveANIZXI7i8AiEAhki2zaSbtndf4eUsLorwUlrSrDGZHebiNwmBEP80ZKk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airstrings%2fweb@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":149503},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"d2ab4606dc3ed3c2d7bc2174a6564cc8af8bd28a","scripts":{"lint":"eslint src/ tests/","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:21f6e290-7f28-47bc-b3e6-59c6fa3ab3fb"}},"repository":{"url":"git+https://github.com/symbionix-sl/airstrings-sdk-web.git","type":"git"},"_npmVersion":"11.13.0","description":"AirStrings Web SDK — fetch, verify, cache, and serve Ed25519-signed localized string bundles","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"@noble/ed25519":"^2.1.0","intl-messageformat":"^11.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","@eslint/js":"^9.0.0","typescript":"^5.7.0","@types/node":"^22.19.21","fake-indexeddb":"^6.0.0","typescript-eslint":"^8.0.0","@vitest/coverage-v8":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/web_0.3.0_1781152870740_0.22264866850883913","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@airstrings/web","version":"1.0.0","keywords":["airstrings","i18n","l10n","localization","internationalization","icu","messageformat","ed25519","cdn","sdk"],"author":{"name":"Symbionix","email":"info@symbionix.io"},"license":"MIT","_id":"@airstrings/web@1.0.0","maintainers":[{"name":"symbionixsl","email":"symbionix.sl@gmail.com"}],"homepage":"https://github.com/symbionix-sl/airstrings-sdk-web#readme","bugs":{"url":"https://github.com/symbionix-sl/airstrings-sdk-web/issues"},"dist":{"shasum":"21bdd3fa4724e918d7850b02592cd4e8746885fc","tarball":"https://registry.npmjs.org/@airstrings/web/-/web-1.0.0.tgz","fileCount":9,"integrity":"sha512-VTrprKe5l+s7WrrAhpQDNeAZsllPLUFYyAYO2vHVxkvUUtRUHamHbW0o/TguIRmwahFVekTuG8wtkDUDjpS8fw==","signatures":[{"sig":"MEQCIBGT6PKaZuZQooXsqgt+JxVXNlVlNHuwKElIRQOq1UifAiB3cxPjv6/KqMisObvNK+YYBfQorCiC6YRsqweJ/yINsA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airstrings%2fweb@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":149620},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"46b2f778de5ade1353504cbbc373abf69d2c3617","scripts":{"lint":"eslint src/ tests/","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:21f6e290-7f28-47bc-b3e6-59c6fa3ab3fb"}},"repository":{"url":"git+https://github.com/symbionix-sl/airstrings-sdk-web.git","type":"git"},"_npmVersion":"11.16.0","description":"AirStrings Web SDK — fetch, verify, cache, and serve Ed25519-signed localized string bundles","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@noble/ed25519":"^2.1.0","intl-messageformat":"^11.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","@eslint/js":"^9.0.0","typescript":"^5.7.0","@types/node":"^22.19.21","fake-indexeddb":"^6.0.0","typescript-eslint":"^8.0.0","@vitest/coverage-v8":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/web_1.0.0_1783951661186_0.9858205305199055","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@airstrings/web","version":"1.1.0","keywords":["airstrings","i18n","l10n","localization","internationalization","icu","messageformat","ed25519","cdn","sdk"],"author":{"name":"Symbionix","email":"info@symbionix.io"},"license":"MIT","_id":"@airstrings/web@1.1.0","maintainers":[{"name":"symbionixsl","email":"symbionix.sl@gmail.com"}],"homepage":"https://github.com/symbionix-sl/airstrings-sdk-web#readme","bugs":{"url":"https://github.com/symbionix-sl/airstrings-sdk-web/issues"},"dist":{"shasum":"b58c266a58ac636b9467974e5148f364cf24cf61","tarball":"https://registry.npmjs.org/@airstrings/web/-/web-1.1.0.tgz","fileCount":9,"integrity":"sha512-aqtiFoGXqhem3zGiG8bFPKAyYamBzXgloopTYrMaiV+i37HJmKSZh2RlwSaEG0ZD7T4EKvXdie4wxLrZ7aXGnw==","signatures":[{"sig":"MEYCIQDMXkiC/zkYRLYSy3Z6r7n0LU4GCxtoqkcpsx13BDkkSQIhAIKWZEzl8aCr/qQpge6dG+yxtfLH6osFH9KXd4yLhANh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airstrings%2fweb@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":194794},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"6325c365b9226531e0260191027662d7d9d6919f","scripts":{"lint":"eslint src/ tests/","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:21f6e290-7f28-47bc-b3e6-59c6fa3ab3fb"}},"repository":{"url":"git+https://github.com/symbionix-sl/airstrings-sdk-web.git","type":"git"},"_npmVersion":"11.16.0","description":"AirStrings Web SDK — fetch, verify, cache, and serve Ed25519-signed localized string bundles","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@noble/hashes":"^1.8.0","@noble/ed25519":"^2.1.0","intl-messageformat":"^11.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","@eslint/js":"^9.0.0","typescript":"^5.7.0","@types/node":"^22.19.21","fake-indexeddb":"^6.0.0","typescript-eslint":"^8.0.0","@vitest/coverage-v8":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/web_1.1.0_1784052237201_0.9746421974578741","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@airstrings/web","version":"1.2.0","keywords":["airstrings","i18n","l10n","localization","internationalization","icu","messageformat","ed25519","cdn","sdk"],"author":{"name":"Symbionix","email":"info@symbionix.io"},"license":"MIT","_id":"@airstrings/web@1.2.0","maintainers":[{"name":"symbionixsl","email":"symbionix.sl@gmail.com"}],"homepage":"https://github.com/symbionix-sl/airstrings-sdk-web#readme","bugs":{"url":"https://github.com/symbionix-sl/airstrings-sdk-web/issues"},"dist":{"shasum":"474174b589e74a105ec6f2a2343285688982f983","tarball":"https://registry.npmjs.org/@airstrings/web/-/web-1.2.0.tgz","fileCount":9,"integrity":"sha512-Tmzn/RRGJ7OLzPTFMnCRuFxtQmDFZLWL4GmWaKEuOu7TtOhmkburJj3HoT4ZLabJSyuDpsgdPKm+BIYY2F/QWg==","signatures":[{"sig":"MEYCIQD5LfNa8IOLZiuJcnZ3qXbl8WR+5iu5nK7FBQoWcQ0yqAIhAJaiRiLYCUYO+NF0E5/b+drfWf8Y5YJYqUkyqg+QbGfM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airstrings%2fweb@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":195600},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"e709e6c77c052f10189a7e3a29de0dd487b84208","scripts":{"lint":"eslint src/ tests/","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:21f6e290-7f28-47bc-b3e6-59c6fa3ab3fb"}},"repository":{"url":"git+https://github.com/symbionix-sl/airstrings-sdk-web.git","type":"git"},"_npmVersion":"11.16.0","description":"AirStrings Web SDK — fetch, verify, cache, and serve Ed25519-signed localized string bundles","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@noble/hashes":"^1.8.0","@noble/ed25519":"^2.1.0","intl-messageformat":"^11.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","@eslint/js":"^9.0.0","typescript":"^5.7.0","@types/node":"^22.19.21","fake-indexeddb":"^6.0.0","typescript-eslint":"^8.0.0","@vitest/coverage-v8":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/web_1.2.0_1784068496402_0.435509774337854","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@airstrings/web","version":"1.2.1","keywords":["airstrings","i18n","l10n","localization","internationalization","icu","messageformat","ed25519","cdn","sdk"],"author":{"name":"Symbionix","email":"info@symbionix.io"},"license":"MIT","_id":"@airstrings/web@1.2.1","maintainers":[{"name":"symbionixsl","email":"symbionix.sl@gmail.com"}],"homepage":"https://github.com/symbionix-sl/airstrings-sdk-web#readme","bugs":{"url":"https://github.com/symbionix-sl/airstrings-sdk-web/issues"},"dist":{"shasum":"1c485db744d7038d691da80f44b3c87b9fb1b031","tarball":"https://registry.npmjs.org/@airstrings/web/-/web-1.2.1.tgz","fileCount":9,"integrity":"sha512-vxj5ylRfU/veC2z1+kHtV6l/VjlxJkO1u88G/sOmCN+bq6WVBU09mTnFqKk3rHUmyQNKxLFChIt5wMJQLFPZ5g==","signatures":[{"sig":"MEUCIQCb4tzjpsHweKSZhqwTtvomijCfx2VZ5I4GNdu0DJKIWAIgGcyh/xceMj/ZCZsuIe0ICQkbpPkBujB7lI5WfEt7XMI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airstrings%2fweb@1.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":199853},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"db5e786fc831f4867cc2f67f0735c203fc950014","scripts":{"lint":"eslint src/ tests/","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:21f6e290-7f28-47bc-b3e6-59c6fa3ab3fb"}},"repository":{"url":"git+https://github.com/symbionix-sl/airstrings-sdk-web.git","type":"git"},"_npmVersion":"11.16.0","description":"AirStrings Web SDK — fetch, verify, cache, and serve Ed25519-signed localized string bundles","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@noble/hashes":"^1.8.0","@noble/ed25519":"^2.1.0","intl-messageformat":"^11.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","@eslint/js":"^9.0.0","typescript":"^5.7.0","@types/node":"^22.19.21","fake-indexeddb":"^6.0.0","typescript-eslint":"^8.0.0","@vitest/coverage-v8":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/web_1.2.1_1784095595333_0.7382529788028835","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"_id":"@airstrings/web@1.3.0","bugs":{"url":"https://github.com/symbionix-sl/airstrings-sdk-web/issues"},"dist":{"shasum":"7bcc0b694422d979557e15b31240d493389014c3","tarball":"https://registry.npmjs.org/@airstrings/web/-/web-1.3.0.tgz","fileCount":9,"integrity":"sha512-Ttzi2On8jWB+DX0KmPwxj4p54R8Srx5jaQWSoKModJ1U7FEyexnvCoBrGZSqgKa14yFT+KdhTrxsh45XEzaWZg==","signatures":[{"sig":"MEYCIQDQAku6nuS+/MV0U45dlQIz22ALgagzXKRtgBCLePPfZgIhAMCBx5cG8PqOUzGzzZZjE0qM1gVtWXvziKyKMoBw2b/N","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAZYvz1SVqoYeHfTTCPWd5rnHunkFXvaFLgFF3jWovboAiByYMuX4P4yusKMXHygvgKuA0Pvkg02FTC5xaxi6arcig=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@airstrings%2fweb@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":208073},"main":"./dist/index.cjs","name":"@airstrings/web","type":"module","types":"./dist/index.d.ts","author":{"name":"Symbionix","email":"info@symbionix.io"},"module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"29689e201417105832e18f426a28ac1f08268648","license":"MIT","scripts":{"lint":"eslint src/ tests/","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"version":"1.3.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:21f6e290-7f28-47bc-b3e6-59c6fa3ab3fb"}},"homepage":"https://github.com/symbionix-sl/airstrings-sdk-web#readme","keywords":["airstrings","i18n","l10n","localization","internationalization","icu","messageformat","ed25519","cdn","sdk"],"repository":{"url":"git+https://github.com/symbionix-sl/airstrings-sdk-web.git","type":"git"},"_npmVersion":"11.19.0","description":"AirStrings Web SDK — fetch, verify, cache, and serve Ed25519-signed localized string bundles","directories":{},"maintainers":[{"name":"symbionixsl","email":"symbionix.sl@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@noble/hashes":"^1.8.0","@noble/ed25519":"^2.1.0","intl-messageformat":"^11.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","@eslint/js":"^9.0.0","typescript":"^5.7.0","@types/node":"^22.19.21","fake-indexeddb":"^6.0.0","typescript-eslint":"^8.0.0","@vitest/coverage-v8":"^3.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/web_1.3.0_1789629099391_0.19856765139026034"}}},"time":{"created":"2026-04-07T09:18:13.086Z","modified":"2026-09-17T07:11:39.943Z","0.1.0":"2026-04-07T09:18:13.314Z","0.1.1":"2026-04-07T09:39:08.524Z","0.1.2":"2026-04-09T10:38:28.882Z","0.3.0":"2026-06-11T04:41:10.904Z","1.0.0":"2026-07-13T14:07:41.338Z","1.1.0":"2026-07-14T18:03:57.342Z","1.2.0":"2026-07-14T22:34:56.560Z","1.2.1":"2026-07-15T06:06:35.478Z","1.3.0":"2026-09-17T07:11:39.489Z"},"bugs":{"url":"https://github.com/symbionix-sl/airstrings-sdk-web/issues"},"author":{"name":"Symbionix","email":"info@symbionix.io"},"license":"MIT","homepage":"https://github.com/symbionix-sl/airstrings-sdk-web#readme","keywords":["airstrings","i18n","l10n","localization","internationalization","icu","messageformat","ed25519","cdn","sdk"],"repository":{"url":"git+https://github.com/symbionix-sl/airstrings-sdk-web.git","type":"git"},"description":"AirStrings Web SDK — fetch, verify, cache, and serve Ed25519-signed localized string bundles","maintainers":[{"name":"symbionixsl","email":"symbionix.sl@gmail.com"}],"readme":"# @airstrings/web\n\n[![npm](https://img.shields.io/npm/v/@airstrings/web.svg)](https://www.npmjs.com/package/@airstrings/web)\n[![license](https://img.shields.io/npm/l/@airstrings/web.svg)](./LICENSE)\n\nThe official **AirStrings Web SDK** — a tiny, framework-agnostic TypeScript library that fetches, verifies, caches, and serves Ed25519-signed localized string bundles from the [AirStrings](https://airstrings.com) CDN.\n\n- **Signed bundles.** Every bundle is verified with Ed25519 before strings are exposed. Tampered or unsigned content is rejected, never served.\n- **Cache-first.** Bundles are cached in IndexedDB (browser) or memory (Node.js / SSR). Cached bundles are re-verified on every load.\n- **Anti-downgrade.** A higher-revision bundle is never replaced by a lower one.\n- **ICU MessageFormat.** Plurals, selects, number/date formatting via [`intl-messageformat`](https://www.npmjs.com/package/intl-messageformat).\n- **Tree-shakeable ESM + CJS.** TypeScript declarations included. No DOM dependencies — works in Node 18+ and modern browsers.\n- **Zero ceremony.** One class, one config, one method to format a string.\n\n---\n\n## Install\n\n```bash\nnpm install @airstrings/web\n# or\npnpm add @airstrings/web\n# or\nyarn add @airstrings/web\n```\n\n**Requirements:** Node.js 18+ (uses global `fetch`) or any modern browser supporting ES2020.\n\n---\n\n## Quick start\n\n### Node.js (server-side, e.g. Fastify)\n\n```ts\nimport { AirStrings } from '@airstrings/web'\n\nconst airstrings = new AirStrings({\n  organizationId: 'org_xxx',\n  projectId: 'proj_xxx',\n  environmentId: 'env_xxx',\n  publicKeys: ['BASE64_ED25519_PUBLIC_KEY'],\n  locale: 'en',\n})\n\n// Wait for the first bundle to load\nawait airstrings.refresh()\n\nconsole.log(airstrings.t('greeting'))\n// → \"Hello!\"\n\nconsole.log(airstrings.format('items.count', { count: 3 }))\n// → \"3 items\"\n```\n\nIn Node, `AirStrings` automatically falls back to an in-memory cache (no `IndexedDB` available). The cache lives for the lifetime of the process — fine for long-running servers, gone on restart.\n\n### Browser\n\n```ts\nimport { AirStrings } from '@airstrings/web'\n\nconst airstrings = new AirStrings({\n  organizationId: 'org_xxx',\n  projectId: 'proj_xxx',\n  environmentId: 'env_xxx',\n  publicKeys: ['BASE64_ED25519_PUBLIC_KEY'],\n  locale: navigator.language,\n})\n\nairstrings.on('strings:updated', ({ locale, revision }) => {\n  console.log(`Loaded ${locale} (revision ${revision})`)\n  document.getElementById('greeting')!.textContent = airstrings.t('greeting')\n})\n```\n\nIn the browser, bundles are cached in IndexedDB and the SDK automatically refreshes them when the document becomes visible.\n\n---\n\n## Bundled fallback (offline-safe builds)\n\nShip published, signed bundles inside your app so a cold start with no network — SSG/SSR builds, first launch offline, CI — serves real strings instead of key names. Two steps:\n\n1. Pull the published bundles for your environment:\n\n   ```bash\n   airstrings bundles pull\n   ```\n\n2. Commit the resulting `airstrings/bundles/` seed directory to your repo.\n\n**Node / SSG / SSR — zero config.** The SDK probes `<cwd>/airstrings/bundles/` automatically and seeds from it when present. Override the seed directory with `seedDir: '/path/to/airstrings/bundles'`, or disable seeding entirely with `seedDir: false`.\n\n**Browser — pass bundles via `seed`.** Browsers have no filesystem, so import the committed files at build time and hand them to the SDK:\n\n```ts\nimport { AirStrings } from '@airstrings/web'\nimport enBundle from './airstrings/bundles/en-US.json'\nimport jaBundle from './airstrings/bundles/ja.json'\n\nconst airstrings = new AirStrings({\n  organizationId: 'org_xxx',\n  projectId: 'proj_xxx',\n  environmentId: 'env_xxx',\n  publicKeys: ['BASE64_ED25519_PUBLIC_KEY'],\n  locale: 'en-US',\n  seed: [enBundle, jaBundle],\n})\n```\n\nSeed bundles are untrusted input: every candidate runs the full Ed25519 verification pipeline, plus `project_id` and locale checks. The highest verified revision wins between cache and seed (ties go to the cache), a winning seed is persisted to the cache, and the network refresh still runs in the background afterwards. A tampered or mismatched seed is rejected with a `strings:error` event and never cached; a missing seed directory or file is a silent no-op.\n\nKeep the committed seed fresh by running `airstrings bundles pull` in CI or as a pre-release step. See the bundled fallback contract (`docs/contracts/bundled-fallback.md` in the AirStrings docs) for the full specification.\n\n---\n\n## String variants (experiments)\n\nStrings can carry A/B variants defined in the dashboard. Give the SDK a stable assignment id and it selects each experiment's variant deterministically — no server round-trip, no local state to persist. The same id always resolves to the same variant.\n\n```ts\nimport { AirStrings } from '@airstrings/web'\n\nconst airstrings = new AirStrings({\n  organizationId: 'org_xxx',\n  projectId: 'proj_xxx',\n  environmentId: 'env_xxx',\n  publicKeys: ['BASE64_ED25519_PUBLIC_KEY'],\n  locale: 'en',\n})\n\n// A stable per-user id so each user always sees the same variant.\nairstrings.setAssignmentId(currentUser.id)\n\n// Forward every exposure to your own analytics.\nairstrings.onExposure(({ key, experimentId, variant, locale, assignmentId }) => {\n  analytics.track('experiment_exposure', { key, experimentId, variant, locale, assignmentId })\n})\n\nawait airstrings.refresh()\n```\n\n> **Exposure fires once per session.** `onExposure` is deduped per SDK instance — a user re-entering the same screen won't fire it again; it resets on reload (new instance) or when the assignment id changes. This is deliberate: exposure attributes a user to a variant (join to conversions by `assignmentId`). For per-render impression counts, track your own event where you render.\n\nPass `null` to `setAssignmentId` to clear it and fall back to base values. Experiment definitions are covered by the bundle signature and verified before use — if verification fails, the SDK soft-fails to the base strings and never serves unverified experiment content.\n\n---\n\n## API\n\n### `new AirStrings(config)`\n\n| Field            | Type                       | Required | Description |\n|------------------|----------------------------|----------|-------------|\n| `organizationId` | `string`                   | yes      | Your AirStrings organization id. |\n| `projectId`      | `string`                   | yes      | Project id. |\n| `environmentId`  | `string`                   | yes      | Environment id (e.g. production, staging). |\n| `publicKeys`     | `readonly string[]`        | yes      | One or more standard-base64-encoded Ed25519 public keys, exactly as shown in the dashboard (the bundle's `key_id` must match verbatim). Multiple keys supported for rotation. |\n| `locale`         | `string`                   | yes      | Initial BCP-47 locale (e.g. `\"en\"`, `\"fr-CA\"`). |\n| `apiBaseURL`     | `string`                   | no       | Override the API base URL (defaults to `https://api.airstrings.com`). |\n| `logger`         | `(level, msg, ctx) => void`| no       | Optional logger. Default: no-op. |\n| `store`          | `BundleStore`              | no       | Inject a custom cache backend. |\n| `seed`           | `readonly unknown[]`       | no       | Bundled fallback contents supplied at build time (parsed objects or raw JSON strings). |\n| `seedDir`        | `string \\| false`          | no       | Node only. Seed directory override, or `false` to disable seeding. Default: probe `<cwd>/airstrings/bundles/`. |\n\n### Methods\n\n- **`t(key: string): string`** — Returns the raw localized string for `key`, or `key` itself as fallback.\n- **`format(key: string, args?: Record<string, unknown>): string`** — Formats an ICU MessageFormat string. For plain `text` strings, returns the value as-is. Never throws — falls back to the raw pattern on formatting errors, or to the key name if missing.\n- **`refresh(): Promise<void>`** — Forces a bundle refresh from the CDN. Honors ETag/304.\n- **`setLocale(bcp47: string): Promise<void>`** — Switches to a new locale. Loads from cache immediately if available, then refreshes.\n- **`setAssignmentId(id: string | null): void`** — Sets the stable id used to select experiment variants, or clears it with `null` (falls back to base values).\n- **`destroy(): void`** — Removes browser visibility listeners. Call on unmount in long-lived UIs.\n- **`on(event, handler): () => void`** — Subscribe to events. Returns an unsubscribe function.\n- **`onExposure(handler): () => void`** — Convenience alias for `on('experiment:exposure', handler)`. Returns an unsubscribe function.\n\n### Properties\n\n- **`strings: Readonly<Record<string, string>>`** — Frozen snapshot of the loaded strings.\n- **`locale: string`** — Currently active locale.\n- **`revision: number`** — Revision number of the loaded bundle.\n- **`isReady: boolean`** — `true` once a bundle has loaded (from cache or network).\n\n### Events\n\n```ts\ntype AirStringsEvents = {\n  'strings:updated':     { locale: string; revision: number }\n  'strings:error':       { error: AirStringsError }\n  'experiment:exposure': ExposureEvent\n}\n\ntype ExposureEvent = {\n  key:          string\n  experimentId: string\n  variant:      string\n  locale:       string\n  assignmentId: string\n}\n```\n\n---\n\n## Security model\n\n- Bundles are signed with Ed25519 over a deterministic canonical JSON representation that covers `format_version`, `project_id`, `locale`, `revision`, `created_at`, and `strings`. This prevents tampering, locale swapping, and bundle substitution.\n- Cached bundles are **re-verified on every load** (defense in depth).\n- Unknown `key_id` or `format_version` ⇒ bundle rejected.\n- Signature failures never throw from the public API — the SDK keeps the previous good bundle and emits `strings:error`.\n- Public keys are provided by you at init. The SDK never logs them.\n\nSee the bundle format contract in the AirStrings docs for the full specification.\n\n---\n\n## Framework integration\n\nThe SDK exposes data and events, not UI bindings. Integration with React, Vue, or Svelte is a few lines:\n\n**React (`useSyncExternalStore`):**\n\n```ts\nconst useStrings = (a: AirStrings) =>\n  useSyncExternalStore(\n    cb => a.on('strings:updated', cb),\n    () => a.strings,\n    () => a.strings,\n  )\n```\n\n**Vue:**\n\n```ts\nconst strings = shallowRef(airstrings.strings)\nairstrings.on('strings:updated', () => { strings.value = airstrings.strings })\n```\n\n---\n\n## License\n\nMIT © [Symbionix](https://symbionix.io)\n\n## Links\n\n- **Website:** https://airstrings.com\n- **Repository:** https://github.com/symbionix-sl/airstrings-sdk-web\n- **Issues:** https://github.com/symbionix-sl/airstrings-sdk-web/issues\n- **Changelog:** [CHANGELOG.md](./CHANGELOG.md)\n","readmeFilename":"README.md"}