{"_id":"@aetherpush/react-native-code-push","_rev":"8-3c17853afdc232124368f90ade20601b","name":"@aetherpush/react-native-code-push","dist-tags":{"latest":"1.3.2"},"versions":{"1.0.0":{"name":"@aetherpush/react-native-code-push","version":"1.0.0","keywords":["react-native","aether","aetherpush","ota","push","codepush"],"author":{"name":"Aether"},"license":"MIT","_id":"@aetherpush/react-native-code-push@1.0.0","maintainers":[{"name":"monoradioactivo","email":"adrian@aetherpush.com"}],"homepage":"https://aetherpush.com","bugs":{"url":"https://github.com/Monoradioactivo/aetherpush-sdk/issues"},"dist":{"shasum":"aa95a1a94c1f7c21d316b4d6dab73c4ca6b0da8f","tarball":"https://registry.npmjs.org/@aetherpush/react-native-code-push/-/react-native-code-push-1.0.0.tgz","fileCount":173,"integrity":"sha512-Bfod3Pqz2iqcg0j8FjmTIbd5m0N2IbViRobq2dnIJnv6EqFJPxjwAOX9oXguS298Yw3JK4bfbNrfq/JCMhBDjA==","signatures":[{"sig":"MEYCIQCOto7iMpsZruHtyMw2z7eJNDJgTRVIigNfHqlp0jDJIQIhAPWL9niQtqO1I171FjOKwcdEQHy7NIXddskcxi26j7vX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1289621},"main":"CodePush.js","rnpm":{"ios":{"sharedLibraries":["libz"]},"android":{"packageInstance":"new CodePush(getResources().getString(R.string.CodePushDeploymentKey), getApplicationContext(), BuildConfig.DEBUG)"},"commands":{"postlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postlink/run","postunlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postunlink/run"}},"gitHead":"b65e64c44ddff844fb8872671e3cda6fed174dd5","scripts":{"test":"npm run build:tests && npm run test:setup && npm run test:fast","clean":"shx rm -rf bin","setup":"npm install --quiet --no-progress","tslint":"tslint -c tslint.json test/**/*.ts","test:ios":"npm run build:tests && npm run test:setup:ios && npm run test:fast:ios","test:fast":"mocha --recursive bin/test --android --ios","test:setup":"mocha --recursive bin/test --android --ios --setup","build:tests":"tsc","test:android":"npm run build:tests && npm run test:setup:android && npm run test:fast:android","test:fast:ios":"mocha --recursive bin/test --ios","prebuild:tests":"npm run clean && npm run tslint","test:setup:ios":"mocha --recursive bin/test --ios --setup","test:debugger:ios":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --ios","test:fast:android":"mocha --recursive bin/test --android","test:setup:android":"mocha --recursive bin/test --android --setup","test:debugger:android":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --android"},"typings":"typings/react-native-code-push.d.ts","_npmUser":{"name":"monoradioactivo","email":"adrian@aetherpush.com"},"repository":{"url":"git+https://github.com/Monoradioactivo/aetherpush-sdk.git","type":"git"},"_npmVersion":"11.14.1","description":"Aether OTA update client for React Native","directories":{},"_nodeVersion":"24.14.1","dependencies":{"glob":"^7.1.7","plist":"^3.0.4","xcode":"3.0.1","semver":"^7.3.5","inquirer":"^8.1.5","hoist-non-react-statics":"^3.3.2"},"_hasShrinkwrap":false,"devDependencies":{"q":"^1.5.1","del":"v6.0.0","shx":"^0.3.4","mocha":"^9.2.0","slash":"^3.0.0","mkdirp":"latest","tslint":"^6.1.3","express":"latest","@types/q":"^1.5.4","archiver":"latest","typescript":"^4.4.3","@types/node":"^14.0.27","body-parser":"latest","@types/mocha":"^9.0.0","run-sequence":"latest","@types/assert":"^1.5.2","@types/mkdirp":"^1.0.1","code-push-plugin-testing-framework":"file:./code-push-plugin-testing-framework"},"peerDependencies":{"react-native":">=0.76.0"},"_npmOperationalInternal":{"tmp":"tmp/react-native-code-push_1.0.0_1784395033579_0.5882790802354738","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@aetherpush/react-native-code-push","version":"1.1.0","keywords":["react-native","aether","aetherpush","ota","push","codepush"],"author":{"name":"Aether"},"license":"MIT","_id":"@aetherpush/react-native-code-push@1.1.0","maintainers":[{"name":"monoradioactivo","email":"adrian@aetherpush.com"}],"homepage":"https://aetherpush.com","bugs":{"url":"https://github.com/Monoradioactivo/aetherpush-sdk/issues"},"dist":{"shasum":"2d48fa52d99942387460164f9c4cc01fa1545875","tarball":"https://registry.npmjs.org/@aetherpush/react-native-code-push/-/react-native-code-push-1.1.0.tgz","fileCount":176,"integrity":"sha512-SLBTsXxOiqh+lU4u5bifRpFIOioeXRyYHDP+Uj59NlGYDKqOcAmssEVFRsITz85OH1Xh2se1K36jq6Ila+aDlQ==","signatures":[{"sig":"MEUCIHUaKYF6Mjmcf3CdcgLsL4Zz+xcvk8NkGstVhJTOS7FnAiEA0UolAtrmNSDb4fA0EZsYQpgSpO8BR+WCXX8/eOobi2U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aetherpush%2freact-native-code-push@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1308702},"main":"CodePush.js","rnpm":{"ios":{"sharedLibraries":["libz"]},"android":{"packageInstance":"new CodePush(getResources().getString(R.string.CodePushDeploymentKey), getApplicationContext(), BuildConfig.DEBUG)"},"commands":{"postlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postlink/run","postunlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postunlink/run"}},"gitHead":"5bfa9f778a0fdb0d3a8c5537ee6ffb9a02f3a874","scripts":{"test":"npm run build:tests && npm run test:setup && npm run test:fast","clean":"shx rm -rf bin","setup":"npm install --quiet --no-progress","tslint":"tslint -c tslint.json test/**/*.ts","test:ios":"npm run build:tests && npm run test:setup:ios && npm run test:fast:ios","test:fast":"mocha --recursive bin/test --android --ios","test:setup":"mocha --recursive bin/test --android --ios --setup","build:tests":"tsc","test:android":"npm run build:tests && npm run test:setup:android && npm run test:fast:android","test:fast:ios":"mocha --recursive bin/test --ios","prebuild:tests":"npm run clean && npm run tslint","test:setup:ios":"mocha --recursive bin/test --ios --setup","test:debugger:ios":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --ios","test:fast:android":"mocha --recursive bin/test --android","test:setup:android":"mocha --recursive bin/test --android --setup","test:debugger:android":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --android"},"typings":"typings/react-native-code-push.d.ts","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:243449e4-6862-4878-88b4-6789663aebff"}},"repository":{"url":"git+https://github.com/Monoradioactivo/aetherpush-sdk.git","type":"git"},"_npmVersion":"12.0.1","description":"Aether OTA update client for React Native","directories":{},"_nodeVersion":"22.23.1","dependencies":{"glob":"^7.1.7","plist":"^3.0.4","xcode":"3.0.1","semver":"^7.3.5","inquirer":"^8.1.5","hoist-non-react-statics":"^3.3.2"},"codegenConfig":{"name":"RNAetherCodePushSpec","type":"modules","android":{"javaPackageName":"com.microsoft.codepush.react"},"jsSrcsDir":"src/specs"},"_hasShrinkwrap":false,"devDependencies":{"q":"^1.5.1","del":"v6.0.0","shx":"^0.3.4","mocha":"^9.2.0","slash":"^3.0.0","mkdirp":"latest","tslint":"^6.1.3","express":"latest","@types/q":"^1.5.4","archiver":"latest","typescript":"^4.4.3","@types/node":"^14.0.27","body-parser":"latest","@types/mocha":"^9.0.0","run-sequence":"latest","@types/assert":"^1.5.2","@types/mkdirp":"^1.0.1","code-push-plugin-testing-framework":"file:./code-push-plugin-testing-framework"},"peerDependencies":{"react-native":">=0.76.0"},"_npmOperationalInternal":{"tmp":"tmp/react-native-code-push_1.1.0_1784433118403_0.28458650321714574","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@aetherpush/react-native-code-push","version":"1.2.0","keywords":["react-native","aether","aetherpush","ota","push","codepush"],"author":{"name":"Aether"},"license":"MIT","_id":"@aetherpush/react-native-code-push@1.2.0","maintainers":[{"name":"monoradioactivo","email":"adrian@aetherpush.com"}],"homepage":"https://aetherpush.com","bugs":{"url":"https://github.com/Monoradioactivo/aetherpush-sdk/issues"},"dist":{"shasum":"30833cf27ef7eb2ee3300fed8e68e0a669fc0de1","tarball":"https://registry.npmjs.org/@aetherpush/react-native-code-push/-/react-native-code-push-1.2.0.tgz","fileCount":178,"integrity":"sha512-/L+QttvgLc+T7vnsi7pDSTuVpVEq80uYir3VgliKFB7eEL6U0zFMzMlf2HpOoi3RN/DElT1/2jNM1MKUu895vA==","signatures":[{"sig":"MEQCIEWzK87FOw0p+FMCw1JSXBdqfAY8AXkQ2NWuH7iJyU0cAiATV6mDTa9QyfzMKz09g2QZmnZoCVxY4nRTFuN+VBLJMA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aetherpush%2freact-native-code-push@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1337854},"main":"CodePush.js","rnpm":{"ios":{"sharedLibraries":["libz"]},"android":{"packageInstance":"new CodePush(getResources().getString(R.string.CodePushDeploymentKey), getApplicationContext(), BuildConfig.DEBUG)"},"commands":{"postlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postlink/run","postunlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postunlink/run"}},"gitHead":"1026dc048b4371bac2aa27ea9eba13bb3b748189","scripts":{"test":"npm run build:tests && npm run test:setup && npm run test:fast","clean":"shx rm -rf bin","setup":"npm install --quiet --no-progress","tslint":"tslint -c tslint.json test/**/*.ts","test:ios":"npm run build:tests && npm run test:setup:ios && npm run test:fast:ios","test:fast":"mocha --recursive bin/test --android --ios","test:setup":"mocha --recursive bin/test --android --ios --setup","build:tests":"tsc","test:android":"npm run build:tests && npm run test:setup:android && npm run test:fast:android","test:fast:ios":"mocha --recursive bin/test --ios","prebuild:tests":"npm run clean && npm run tslint","test:setup:ios":"mocha --recursive bin/test --ios --setup","test:debugger:ios":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --ios","test:fast:android":"mocha --recursive bin/test --android","test:setup:android":"mocha --recursive bin/test --android --setup","test:debugger:android":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --android"},"typings":"typings/react-native-code-push.d.ts","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:243449e4-6862-4878-88b4-6789663aebff"}},"repository":{"url":"git+https://github.com/Monoradioactivo/aetherpush-sdk.git","type":"git"},"_npmVersion":"12.0.1","description":"Aether OTA update client for React Native","directories":{},"_nodeVersion":"22.23.1","dependencies":{"glob":"^7.1.7","plist":"^3.0.4","xcode":"3.0.1","semver":"^7.3.5","inquirer":"^8.1.5","hoist-non-react-statics":"^3.3.2"},"codegenConfig":{"name":"RNAetherCodePushSpec","type":"modules","android":{"javaPackageName":"com.microsoft.codepush.react"},"jsSrcsDir":"src/specs"},"_hasShrinkwrap":false,"devDependencies":{"q":"^1.5.1","del":"v6.0.0","shx":"^0.3.4","mocha":"^9.2.0","slash":"^3.0.0","mkdirp":"latest","tslint":"^6.1.3","express":"latest","@types/q":"^1.5.4","archiver":"latest","typescript":"^4.4.3","@types/node":"^14.0.27","body-parser":"latest","@types/mocha":"^9.0.0","run-sequence":"latest","@types/assert":"^1.5.2","@types/mkdirp":"^1.0.1","code-push-plugin-testing-framework":"file:./code-push-plugin-testing-framework"},"peerDependencies":{"react-native":">=0.76.0"},"_npmOperationalInternal":{"tmp":"tmp/react-native-code-push_1.2.0_1784442080648_0.9360352402023762","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@aetherpush/react-native-code-push","version":"1.2.1","keywords":["react-native","aether","aetherpush","ota","push","codepush"],"author":{"name":"Aether"},"license":"MIT","_id":"@aetherpush/react-native-code-push@1.2.1","maintainers":[{"name":"monoradioactivo","email":"adrian@aetherpush.com"}],"homepage":"https://aetherpush.com","bugs":{"url":"https://github.com/Monoradioactivo/aetherpush-sdk/issues"},"dist":{"shasum":"305aef7c7a88406a0dfa63d9ef76584a15b983c7","tarball":"https://registry.npmjs.org/@aetherpush/react-native-code-push/-/react-native-code-push-1.2.1.tgz","fileCount":178,"integrity":"sha512-jmuOSoOnh7tbilNh/GYgYi1+fmUxu3CwHtFEFX0/FCUDyBXDni0Pw9Uaup7kFnLFaB6+HcBpnOHPtH1zYTxguQ==","signatures":[{"sig":"MEUCIB9XjG50JayPBiTcOdE81+ZO/kDReZv9voM9wK9lkB5WAiEAtNgrVzDMxdmU6AM6le8K7mYvRwL1wBIBOiiNOj8kyaU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aetherpush%2freact-native-code-push@1.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1338205},"main":"CodePush.js","rnpm":{"ios":{"sharedLibraries":["libz"]},"android":{"packageInstance":"new CodePush(getResources().getString(R.string.CodePushDeploymentKey), getApplicationContext(), BuildConfig.DEBUG)"},"commands":{"postlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postlink/run","postunlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postunlink/run"}},"gitHead":"57c07f703096a51441f583e986ceda616665b3b7","scripts":{"test":"npm run build:tests && npm run test:setup && npm run test:fast","clean":"shx rm -rf bin","setup":"npm install --quiet --no-progress","tslint":"tslint -c tslint.json test/**/*.ts","test:ios":"npm run build:tests && npm run test:setup:ios && npm run test:fast:ios","test:fast":"mocha --recursive bin/test --android --ios","test:setup":"mocha --recursive bin/test --android --ios --setup","build:tests":"tsc","test:android":"npm run build:tests && npm run test:setup:android && npm run test:fast:android","test:fast:ios":"mocha --recursive bin/test --ios","prebuild:tests":"npm run clean && npm run tslint","test:setup:ios":"mocha --recursive bin/test --ios --setup","test:debugger:ios":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --ios","test:fast:android":"mocha --recursive bin/test --android","test:setup:android":"mocha --recursive bin/test --android --setup","test:debugger:android":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --android"},"typings":"typings/react-native-code-push.d.ts","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:243449e4-6862-4878-88b4-6789663aebff"}},"repository":{"url":"git+https://github.com/Monoradioactivo/aetherpush-sdk.git","type":"git"},"_npmVersion":"12.0.1","description":"Aether OTA update client for React Native","directories":{},"_nodeVersion":"22.23.1","dependencies":{"glob":"^7.1.7","plist":"^3.0.4","xcode":"3.0.1","semver":"^7.3.5","inquirer":"^8.1.5","hoist-non-react-statics":"^3.3.2"},"codegenConfig":{"name":"RNAetherCodePushSpec","type":"modules","android":{"javaPackageName":"com.microsoft.codepush.react"},"jsSrcsDir":"src/specs"},"_hasShrinkwrap":false,"devDependencies":{"q":"^1.5.1","del":"v6.0.0","shx":"^0.3.4","mocha":"^9.2.0","slash":"^3.0.0","mkdirp":"latest","tslint":"^6.1.3","express":"latest","@types/q":"^1.5.4","archiver":"latest","typescript":"^4.4.3","@types/node":"^14.0.27","body-parser":"latest","@types/mocha":"^9.0.0","run-sequence":"latest","@types/assert":"^1.5.2","@types/mkdirp":"^1.0.1","code-push-plugin-testing-framework":"file:./code-push-plugin-testing-framework"},"peerDependencies":{"react-native":">=0.76.0"},"_npmOperationalInternal":{"tmp":"tmp/react-native-code-push_1.2.1_1784498279750_0.6859825144288403","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@aetherpush/react-native-code-push","version":"1.2.2","keywords":["react-native","aether","aetherpush","ota","push","codepush"],"author":{"name":"Aether"},"license":"MIT","_id":"@aetherpush/react-native-code-push@1.2.2","maintainers":[{"name":"monoradioactivo","email":"adrian@aetherpush.com"}],"homepage":"https://aetherpush.com","bugs":{"url":"https://github.com/Monoradioactivo/aetherpush-sdk/issues"},"dist":{"shasum":"c62fac389658bc7ac385b41b66223eae677feeb0","tarball":"https://registry.npmjs.org/@aetherpush/react-native-code-push/-/react-native-code-push-1.2.2.tgz","fileCount":179,"integrity":"sha512-iX2acP4NM3c4lFRN6BlkTMMTYnOnB1PJu4RF2TMuhNP2pER7Rz/Z4P2u6aocqoD10X40/E8NiKFmqioUE51ELQ==","signatures":[{"sig":"MEUCIQDAqhgx4rt5sIcbtADWQBVpGZgevSf+8aX1hNo3FDvrUgIgagfMhYK6PNuQoIog0G3449y99e/Io8tNNFqkYH/Gvzs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aetherpush%2freact-native-code-push@1.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1339341},"main":"CodePush.js","rnpm":{"ios":{"sharedLibraries":["libz"]},"android":{"packageInstance":"new CodePush(getResources().getString(R.string.CodePushDeploymentKey), getApplicationContext(), BuildConfig.DEBUG)"},"commands":{"postlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postlink/run","postunlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postunlink/run"}},"gitHead":"efe63f6b4aec5262b7489abb709f3e974087b280","scripts":{"test":"npm run build:tests && npm run test:setup && npm run test:fast","clean":"shx rm -rf bin","setup":"npm install --quiet --no-progress","tslint":"tslint -c tslint.json test/**/*.ts","test:ios":"npm run build:tests && npm run test:setup:ios && npm run test:fast:ios","test:fast":"mocha --recursive bin/test --android --ios","test:setup":"mocha --recursive bin/test --android --ios --setup","build:tests":"tsc","test:android":"npm run build:tests && npm run test:setup:android && npm run test:fast:android","test:fast:ios":"mocha --recursive bin/test --ios","prebuild:tests":"npm run clean && npm run tslint","test:setup:ios":"mocha --recursive bin/test --ios --setup","test:debugger:ios":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --ios","test:fast:android":"mocha --recursive bin/test --android","test:setup:android":"mocha --recursive bin/test --android --setup","test:debugger:android":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --android"},"typings":"typings/react-native-code-push.d.ts","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:243449e4-6862-4878-88b4-6789663aebff"}},"repository":{"url":"git+https://github.com/Monoradioactivo/aetherpush-sdk.git","type":"git"},"_npmVersion":"12.0.2","description":"Aether OTA update client for React Native","directories":{},"_nodeVersion":"22.23.2","dependencies":{"glob":"^7.1.7","plist":"^3.0.4","xcode":"3.0.1","semver":"^7.3.5","inquirer":"^8.1.5","hoist-non-react-statics":"^3.3.2"},"codegenConfig":{"name":"RNAetherCodePushSpec","type":"modules","android":{"javaPackageName":"com.microsoft.codepush.react"},"jsSrcsDir":"src/specs"},"_hasShrinkwrap":false,"devDependencies":{"q":"^1.5.1","del":"6.1.1","shx":"^0.4.0","mocha":"^9.2.0","slash":"^3.0.0","mkdirp":"latest","tslint":"^6.1.3","express":"latest","@types/q":"^1.5.4","archiver":"latest","typescript":"^4.4.3","@types/node":"^14.0.27","body-parser":"latest","@types/mocha":"^9.0.0","run-sequence":"latest","@types/assert":"^1.5.2","@types/mkdirp":"^1.0.1","code-push-plugin-testing-framework":"file:./code-push-plugin-testing-framework"},"peerDependencies":{"react-native":">=0.76.0"},"_npmOperationalInternal":{"tmp":"tmp/react-native-code-push_1.2.2_1786655507142_0.6825250801992528","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@aetherpush/react-native-code-push","version":"1.3.0","keywords":["react-native","aether","aetherpush","ota","push","codepush"],"author":{"name":"Aether"},"license":"MIT","_id":"@aetherpush/react-native-code-push@1.3.0","maintainers":[{"name":"monoradioactivo","email":"adrian@aetherpush.com"}],"homepage":"https://aetherpush.com","bugs":{"url":"https://github.com/Monoradioactivo/aetherpush-sdk/issues"},"dist":{"shasum":"43017cd356aff487ee57697a7fc663f00bd5a50c","tarball":"https://registry.npmjs.org/@aetherpush/react-native-code-push/-/react-native-code-push-1.3.0.tgz","fileCount":180,"integrity":"sha512-x3lkRtAL9dNyBlJEtCw73cAuhXtngfQtXYIyjoqyLXFzQ1hwKuVFTmpp1XP4RzMqIm259g4UuW5tpzk2oTsOaA==","signatures":[{"sig":"MEUCIQDntkpgjgg6TtORMaZqp17kaSLDuKQ22iyrrFRHDoZlnQIgTjz4A9VoPPFpRyoVtXNhUMlIDMRfS7NQBxJywNSHTNU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGnE5667+UPkwjUZOwtqj1eHwv5UfyHK5lMLmdy66gI0AiEA7tsHJPeDdvsjvZAoeKeCV4JApYOP4ZNqVIKF3y9CpN0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aetherpush%2freact-native-code-push@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1341171},"main":"CodePush.js","rnpm":{"ios":{"sharedLibraries":["libz"]},"android":{"packageInstance":"new CodePush(getResources().getString(R.string.CodePushDeploymentKey), getApplicationContext(), BuildConfig.DEBUG)"},"commands":{"postlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postlink/run","postunlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postunlink/run"}},"gitHead":"7952d1f8039d265a50ebfcad019c9bfbf4660e78","scripts":{"test":"npm run build:tests && npm run test:setup && npm run test:fast","clean":"shx rm -rf bin","setup":"npm install --quiet --no-progress","tslint":"tslint -c tslint.json test/**/*.ts","test:ios":"npm run build:tests && npm run test:setup:ios && npm run test:fast:ios","test:fast":"mocha --recursive bin/test --android --ios","test:setup":"mocha --recursive bin/test --android --ios --setup","build:tests":"tsc","test:android":"npm run build:tests && npm run test:setup:android && npm run test:fast:android","test:fast:ios":"mocha --recursive bin/test --ios","prebuild:tests":"npm run clean && npm run tslint","test:setup:ios":"mocha --recursive bin/test --ios --setup","test:debugger:ios":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --ios","test:fast:android":"mocha --recursive bin/test --android","test:setup:android":"mocha --recursive bin/test --android --setup","test:debugger:android":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --android"},"typings":"typings/react-native-code-push.d.ts","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:243449e4-6862-4878-88b4-6789663aebff"}},"repository":{"url":"git+https://github.com/Monoradioactivo/aetherpush-sdk.git","type":"git"},"_npmVersion":"12.0.2","description":"Aether OTA update client for React Native","directories":{},"_nodeVersion":"22.23.2","dependencies":{"glob":"^7.1.7","plist":"^3.0.4","xcode":"3.0.1","semver":"^7.3.5","inquirer":"^8.1.5","hoist-non-react-statics":"^3.3.2"},"codegenConfig":{"name":"RNAetherCodePushSpec","type":"modules","android":{"javaPackageName":"com.microsoft.codepush.react"},"jsSrcsDir":"src/specs"},"_hasShrinkwrap":false,"devDependencies":{"q":"^1.5.1","del":"6.1.1","shx":"^0.4.0","mocha":"^9.2.0","slash":"^3.0.0","mkdirp":"latest","tslint":"^6.1.3","express":"latest","@types/q":"^1.5.4","archiver":"latest","typescript":"^4.4.3","@types/node":"^14.0.27","body-parser":"latest","@types/mocha":"^9.0.0","run-sequence":"latest","@types/assert":"^1.5.2","@types/mkdirp":"^1.0.1","code-push-plugin-testing-framework":"file:./code-push-plugin-testing-framework"},"peerDependencies":{"react-native":">=0.76.0"},"_npmOperationalInternal":{"tmp":"tmp/react-native-code-push_1.3.0_1788625795694_0.4847562945135291","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@aetherpush/react-native-code-push","version":"1.3.1","keywords":["react-native","aether","aetherpush","ota","push","codepush"],"author":{"name":"Aether"},"license":"MIT","_id":"@aetherpush/react-native-code-push@1.3.1","maintainers":[{"name":"monoradioactivo","email":"adrian@aetherpush.com"}],"homepage":"https://aetherpush.com","bugs":{"url":"https://github.com/Monoradioactivo/aetherpush-sdk/issues"},"dist":{"shasum":"8c09dc94564efd07cc6eb4d7e2ed2084ee8ea5a8","tarball":"https://registry.npmjs.org/@aetherpush/react-native-code-push/-/react-native-code-push-1.3.1.tgz","fileCount":181,"integrity":"sha512-T86Hhwd0syVdsQAT4YcmJq7hGMQ74x0c5CgcES8kCnX0MQhcQHmRA8SOjADBR8O9PH4VWorf9KWzuod2Xmh4Wg==","signatures":[{"sig":"MEQCIGGH4H+TEDxGmOQ5iAQdkNcD16PasZyFb3qbLYChrqbFAiAJr9n9hEEyClm5RSf888hZaq+Ze44Gocifzf8KOtDANw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEZDQ6+Vo5tqxXo7drWvlwRK28gGLDXo7+3sPScvrFMUAiEAyurbwd+rs4hayR1KlYmhOzLzVzbsWZkK68kw4qUqzvE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aetherpush%2freact-native-code-push@1.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1345345},"main":"CodePush.js","rnpm":{"ios":{"sharedLibraries":["libz"]},"android":{"packageInstance":"new CodePush(getResources().getString(R.string.CodePushDeploymentKey), getApplicationContext(), BuildConfig.DEBUG)"},"commands":{"postlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postlink/run","postunlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postunlink/run"}},"gitHead":"69bd43a4c6245fdc27b42bafdddda2b1a42bc555","scripts":{"test":"npm run build:tests && npm run test:setup && npm run test:fast","clean":"shx rm -rf bin","setup":"npm install --quiet --no-progress","tslint":"tslint -c tslint.json test/**/*.ts","test:ios":"npm run build:tests && npm run test:setup:ios && npm run test:fast:ios","test:fast":"mocha --recursive bin/test --android --ios","test:setup":"mocha --recursive bin/test --android --ios --setup","build:tests":"tsc","test:android":"npm run build:tests && npm run test:setup:android && npm run test:fast:android","test:fast:ios":"mocha --recursive bin/test --ios","prebuild:tests":"npm run clean && npm run tslint","test:setup:ios":"mocha --recursive bin/test --ios --setup","test:debugger:ios":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --ios","test:fast:android":"mocha --recursive bin/test --android","test:setup:android":"mocha --recursive bin/test --android --setup","test:debugger:android":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --android"},"typings":"typings/react-native-code-push.d.ts","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:243449e4-6862-4878-88b4-6789663aebff"}},"repository":{"url":"git+https://github.com/Monoradioactivo/aetherpush-sdk.git","type":"git"},"_npmVersion":"12.0.2","description":"Aether OTA update client for React Native","directories":{},"_nodeVersion":"22.23.2","dependencies":{"glob":"^7.1.7","plist":"^3.0.4","xcode":"3.0.1","semver":"^7.3.5","inquirer":"^8.1.5","hoist-non-react-statics":"^3.3.2"},"codegenConfig":{"name":"RNAetherCodePushSpec","type":"modules","android":{"javaPackageName":"com.microsoft.codepush.react"},"jsSrcsDir":"src/specs"},"_hasShrinkwrap":false,"devDependencies":{"q":"^1.5.1","del":"6.1.1","shx":"^0.4.0","mocha":"^9.2.0","slash":"^3.0.0","mkdirp":"latest","tslint":"^6.1.3","express":"latest","@types/q":"^1.5.4","archiver":"latest","typescript":"^4.4.3","@types/node":"^14.0.27","body-parser":"latest","@types/mocha":"^9.0.0","run-sequence":"latest","@types/assert":"^1.5.2","@types/mkdirp":"^1.0.1","code-push-plugin-testing-framework":"file:./code-push-plugin-testing-framework"},"peerDependencies":{"react-native":">=0.76.0"},"_npmOperationalInternal":{"tmp":"tmp/react-native-code-push_1.3.1_1789579919932_0.15105179852956896","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"_id":"@aetherpush/react-native-code-push@1.3.2","bugs":{"url":"https://github.com/Monoradioactivo/aetherpush-sdk/issues"},"dist":{"shasum":"6b5ca830faae5f02f5753eed7d5db2e69aa6d07e","tarball":"https://registry.npmjs.org/@aetherpush/react-native-code-push/-/react-native-code-push-1.3.2.tgz","fileCount":181,"integrity":"sha512-6mRUf/1KCJvH0kTXnzErNMKiWClcgk31tfEHB0+V4BKqGKv9fA7vPBFclDbGbJmrR2sRAUaBczI53KJMPCagPw==","signatures":[{"sig":"MEYCIQDpm6wGqf9G21FSMpUGd6APGkj4GOfhdHQHEOzKVw0R9wIhAOqxbTgN6tM+pFOvFkLTNwhaiA0uKESGk8lh3awXTnOj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDb0thM8HokugzzT6+jO8Vf/bK3dbuHdIwrAcf+0ranuAIhAOJ0cV/2Ald6NNFUcVwIJSA80STHgSLgpkXK31+s0qwR"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aetherpush%2freact-native-code-push@1.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1345676},"main":"CodePush.js","name":"@aetherpush/react-native-code-push","rnpm":{"ios":{"sharedLibraries":["libz"]},"android":{"packageInstance":"new CodePush(getResources().getString(R.string.CodePushDeploymentKey), getApplicationContext(), BuildConfig.DEBUG)"},"commands":{"postlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postlink/run","postunlink":"node node_modules/@aetherpush/react-native-code-push/scripts/postunlink/run"}},"author":{"name":"Aether"},"gitHead":"eb22918755079ebf02308d89d791ecba0a26be77","license":"MIT","scripts":{"test":"npm run build:tests && npm run test:setup && npm run test:fast","clean":"shx rm -rf bin","setup":"npm install --quiet --no-progress","tslint":"tslint -c tslint.json test/**/*.ts","test:ios":"npm run build:tests && npm run test:setup:ios && npm run test:fast:ios","test:fast":"mocha --recursive bin/test --android --ios","test:setup":"mocha --recursive bin/test --android --ios --setup","build:tests":"tsc","test:android":"npm run build:tests && npm run test:setup:android && npm run test:fast:android","test:fast:ios":"mocha --recursive bin/test --ios","prebuild:tests":"npm run clean && npm run tslint","test:setup:ios":"mocha --recursive bin/test --ios --setup","test:debugger:ios":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --ios","test:fast:android":"mocha --recursive bin/test --android","test:setup:android":"mocha --recursive bin/test --android --setup","test:debugger:android":"mocha --recursive --inspect-brk=0.0.0.0 bin/test --android"},"typings":"typings/react-native-code-push.d.ts","version":"1.3.2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:243449e4-6862-4878-88b4-6789663aebff"}},"homepage":"https://aetherpush.com","keywords":["react-native","aether","aetherpush","ota","push","codepush"],"repository":{"url":"git+https://github.com/Monoradioactivo/aetherpush-sdk.git","type":"git"},"_npmVersion":"12.0.2","description":"Aether OTA update client for React Native","directories":{},"maintainers":[{"name":"monoradioactivo","email":"adrian@aetherpush.com"}],"_nodeVersion":"22.23.2","dependencies":{"glob":"^7.1.7","plist":"^3.0.4","xcode":"3.0.1","semver":"^7.3.5","inquirer":"^8.1.5","hoist-non-react-statics":"^3.3.2"},"codegenConfig":{"name":"RNAetherCodePushSpec","type":"modules","android":{"javaPackageName":"com.microsoft.codepush.react"},"jsSrcsDir":"src/specs"},"_hasShrinkwrap":false,"devDependencies":{"q":"^1.5.1","del":"6.1.1","shx":"^0.4.0","mocha":"^9.2.0","slash":"^3.0.0","mkdirp":"latest","tslint":"^6.1.3","express":"latest","@types/q":"^1.5.4","archiver":"latest","typescript":"^4.4.3","@types/node":"^14.0.27","body-parser":"latest","@types/mocha":"^9.0.0","run-sequence":"latest","@types/assert":"^1.5.2","@types/mkdirp":"^1.0.1","code-push-plugin-testing-framework":"file:./code-push-plugin-testing-framework"},"peerDependencies":{"react-native":">=0.76.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-native-code-push_1.3.2_1789582207819_0.7235600930066381"}}},"time":{"created":"2026-07-18T17:17:13.465Z","modified":"2026-09-16T18:10:08.343Z","1.0.0":"2026-07-18T17:17:13.820Z","1.1.0":"2026-07-19T03:51:58.570Z","1.2.0":"2026-07-19T06:21:20.845Z","1.2.1":"2026-07-19T21:57:59.890Z","1.2.2":"2026-08-13T21:11:47.408Z","1.3.0":"2026-09-05T16:29:55.802Z","1.3.1":"2026-09-16T17:32:00.033Z","1.3.2":"2026-09-16T18:10:07.918Z"},"bugs":{"url":"https://github.com/Monoradioactivo/aetherpush-sdk/issues"},"author":{"name":"Aether"},"license":"MIT","homepage":"https://aetherpush.com","keywords":["react-native","aether","aetherpush","ota","push","codepush"],"repository":{"url":"git+https://github.com/Monoradioactivo/aetherpush-sdk.git","type":"git"},"description":"Aether OTA update client for React Native","maintainers":[{"name":"monoradioactivo","email":"adrian@aetherpush.com"}],"readme":"# @aetherpush/react-native-code-push\n\nReact Native client for [Aether](https://aetherpush.com), an over-the-air\nupdate service compatible with the CodePush protocol. It lets you ship\nJavaScript and asset changes to your iOS and Android apps without going through\nthe app stores.\n\nThis package is a drop-in replacement for `react-native-code-push` and\n`@revopush/react-native-code-push`: the JavaScript API, native configuration\nkeys, and integration steps are unchanged. See [ATTRIBUTION.md](./ATTRIBUTION.md)\nfor the full lineage.\n\n## Contents\n\n- [What you can ship over the air](#what-you-can-ship-over-the-air)\n- [Requirements](#requirements)\n- [How it works](#how-it-works)\n- [Installation](#installation)\n- [Configuration](#configuration)\n- [Usage](#usage)\n- [The update lifecycle](#the-update-lifecycle)\n- [JavaScript API](#javascript-api)\n- [Native architecture](#native-architecture)\n- [Releasing updates](#releasing-updates)\n- [Server contract](#server-contract)\n- [Development and testing](#development-and-testing)\n- [Documentation index](#documentation-index)\n- [License](#license)\n\n## What you can ship over the air\n\nAn Aether release contains your app's JavaScript bundle and its bundled assets\n(images, fonts, JSON). Anything that lives inside the JS bundle can change over\nthe air. Native code, native dependencies, and app permissions cannot, because\nthose are compiled into the binary the store already approved. When you change\nnative code you ship a new binary; when you change JS you ship an Aether release.\n\nEach release targets a binary version range (for example `1.0.x`), so an update\nonly reaches the app builds it was written for. That range is how the SDK avoids\nhanding a JS bundle to a binary whose native side cannot run it.\n\n## Requirements\n\n- React Native 0.76 or newer, running the New Architecture (the default since\n  0.76). Tested against 0.76 and 0.86, the latest stable at the time of writing.\n- Apps on the legacy architecture (React Native 0.81 and earlier) should use\n  Microsoft's original `react-native-code-push` SDK against Aether's legacy\n  endpoints instead. See the Aether migration guide.\n\nThe SDK ships a New Architecture TurboModule on both platforms and keeps a\nclassic bridge path as a compile-time fallback, so it also builds for a consumer\nwho has explicitly opted out of the New Architecture. See\n[Native architecture](#native-architecture).\n\n## How it works\n\nAt startup the SDK decides which JavaScript bundle React Native should load. If a\ndownloaded update is installed and has been confirmed, it points React Native at\nthat bundle; otherwise it falls back to the bundle compiled into the binary.\n\nFrom then on the flow is:\n\n1. The app asks the server whether a newer release exists for its deployment key\n   and binary version.\n2. If one does, the SDK downloads it, verifies it, and unpacks it into private\n   storage.\n3. The update is installed according to an install mode, which decides when the\n   app restarts onto the new bundle.\n4. After the restart the app calls back to confirm the update is healthy. If it\n   never confirms, the next restart rolls back to the previous bundle.\n\nThe check, download, install, and restart steps are the same on both platforms.\nWhat differs is how each platform points React Native at the new bundle and how\nit restarts, which is where the native architecture section goes into detail.\n\n## Installation\n\n```\nnpm install @aetherpush/react-native-code-push\n```\n\nOn iOS, set `platform :ios, '15.5'` in your Podfile. The React Native templates\ndefault to a lower version, and the SSZipArchive dependency of this pod requires\n15.5. Then run `pod install`.\n\nFollow the platform setup guides for the full integration:\n\n- [iOS setup](./docs/setup-ios.md)\n- [Android setup](./docs/setup-android.md)\n\n## Configuration\n\n### Deployment key\n\nThe deployment key tells the server which app and environment (Staging,\nProduction) the client belongs to. Every app version reads it from native\nconfiguration.\n\nOn iOS, add the key to `Info.plist`:\n\n```xml\n<key>CodePushDeploymentKey</key>\n<string>YOUR_DEPLOYMENT_KEY</string>\n```\n\nOn Android, add the key to `strings.xml`:\n\n```xml\n<string moduleConfig=\"true\" name=\"CodePushDeploymentKey\">YOUR_DEPLOYMENT_KEY</string>\n```\n\n`Aether`-prefixed keys (`AetherDeploymentKey`, `AetherServerURL`,\n`AetherPublicKey`) are accepted as aliases for the `CodePush`-prefixed ones. If\nboth are present, the `CodePush` key wins.\n\n### Server URL\n\nThe SDK talks to `https://api.aetherpush.com` by default. To point at a\ndifferent server, for example a staging environment, set `CodePushServerURL`\n(iOS) or `CodePushServerUrl` (Android).\n\n### Server path mode\n\nThe `serverPathMode` option controls which URL paths the SDK uses:\n\n- `\"aether\"` (default) uses Aether's canonical paths (`/v1/public/aether/*`).\n- `\"codepush-legacy\"` uses the legacy CodePush paths\n  (`/v0.1/public/codepush/*`). Use this when the server only speaks the legacy\n  CodePush protocol. This mode is wire-compatible on a best-effort basis; it is\n  not a support promise for arbitrary `code-push-server` deployments.\n\n```js\nexport default CodePush({ serverPathMode: \"codepush-legacy\" })(App);\n```\n\nThe mode is static configuration. The SDK never probes or falls back between\npath styles at runtime.\n\n### Code signing\n\nIf you release signed bundles, add the public key as `CodePushPublicKey`: in\n`Info.plist` on iOS, in `strings.xml` on Android. The SDK then verifies the JWT\nsignature on each downloaded update and rejects a bundle that does not match.\n\n## Usage\n\nWrap your root component. By default the app checks for updates on every start.\n\n```js\nimport CodePush from \"@aetherpush/react-native-code-push\";\n\nfunction App() {\n  // ...\n}\n\nexport default CodePush(App);\n```\n\nPass options to change when it checks and how it installs:\n\n```js\nexport default CodePush({\n  checkFrequency: CodePush.CheckFrequency.ON_APP_RESUME,\n  installMode: CodePush.InstallMode.ON_NEXT_RESUME,\n})(App);\n```\n\nTo drive updates yourself instead of on a schedule, set the frequency to\n`MANUAL` and call `CodePush.sync()` when it suits your app, for example behind a\nbutton or after a screen loads.\n\n```js\nexport default CodePush({ checkFrequency: CodePush.CheckFrequency.MANUAL })(App);\n\n// later, in your own code\nCodePush.sync();\n```\n\n## The update lifecycle\n\n### sync\n\n`CodePush.sync()` runs the whole cycle: check, download, install, and report\nprogress. It is the call most apps use. It reports progress through an optional\nstatus callback and resolves once the update is installed or the app is already\nup to date.\n\n```js\nCodePush.sync(\n  { installMode: CodePush.InstallMode.ON_NEXT_RESTART },\n  (status) => {\n    // status is a CodePush.SyncStatus value\n  },\n  ({ receivedBytes, totalBytes }) => {\n    // download progress\n  },\n);\n```\n\nTwo calls into `sync` never overlap. If you call it again while a sync is\nrunning, the second call returns `SYNC_IN_PROGRESS` instead of starting a second\npass.\n\n### Install modes\n\nThe install mode decides when the app moves onto the downloaded bundle. It is the\nmain knob for balancing freshness against interrupting the user.\n\n- `IMMEDIATE` restarts the app as soon as the update is installed.\n- `ON_NEXT_RESTART` waits for the user to close and reopen the app. Nothing\n  restarts on its own. This is the default and the least disruptive.\n- `ON_NEXT_RESUME` restarts the next time the app returns from the background.\n- `ON_NEXT_SUSPEND` restarts while the app sits in the background, after a\n  minimum background duration you can set.\n\nMandatory releases can carry their own install mode (`mandatoryInstallMode`), so\nyou can let optional updates wait while a critical fix installs right away.\n\n### Rollback and the confirmation handshake\n\nAn install is not trusted until the new bundle proves it can start. After the\nrestart, the app must call `CodePush.notifyAppReady()` to confirm the update is\nhealthy. The `CodePush(App)` wrapper calls it for you once your root component\nmounts.\n\nIf the app crashes or is killed before it confirms, the next launch treats the\nupdate as bad and rolls back to the previous bundle. This is why the SDK loads\nthe confirmed bundle at startup rather than the most recently downloaded one. A\nrelease that white-screens on launch backs itself out instead of bricking the\napp.\n\nYou can inspect what is running with `CodePush.getUpdateMetadata()` and control\nrestarts by hand with `CodePush.allowRestart()`, `CodePush.disallowRestart()`,\nand `CodePush.restartApp()`.\n\n## JavaScript API\n\nThe full reference, including every option and type, is in\n[docs/api-js.md](./docs/api-js.md). The surface in short:\n\n| Function | Purpose |\n| --- | --- |\n| `CodePush(options)(App)` | Wrap the root component to check and install on a schedule |\n| `sync(options, statusCb, progressCb)` | Run the full check, download, install cycle |\n| `checkForUpdate(deploymentKey)` | Ask the server for a newer release without downloading it |\n| `getUpdateMetadata(state)` | Read metadata for the running, pending, or latest package |\n| `getCurrentPackage()` | Read the currently installed package (kept for compatibility) |\n| `notifyAppReady()` | Confirm the running update is healthy and cancel the pending rollback |\n| `restartApp(onlyIfUpdateIsPending)` | Restart the app, optionally only when an update is waiting |\n| `allowRestart()` / `disallowRestart()` | Gate programmatic restarts around sensitive screens |\n| `clearUpdates()` | Remove downloaded updates and return to the binary bundle |\n\n### Enums\n\n`InstallMode`: `IMMEDIATE`, `ON_NEXT_RESTART`, `ON_NEXT_RESUME`,\n`ON_NEXT_SUSPEND`. These come from native constants so the JS and native sides\nagree on the numbers.\n\n`CheckFrequency`: `ON_APP_START` (0), `ON_APP_RESUME` (1), `MANUAL` (2).\n\n`SyncStatus`, passed to the `sync` status callback: `UP_TO_DATE` (0),\n`UPDATE_INSTALLED` (1), `UPDATE_IGNORED` (2), `UNKNOWN_ERROR` (3),\n`SYNC_IN_PROGRESS` (4), `CHECKING_FOR_UPDATE` (5), `AWAITING_USER_ACTION` (6),\n`DOWNLOADING_PACKAGE` (7), `INSTALLING_UPDATE` (8).\n\n`UpdateState`, passed to `getUpdateMetadata`: `RUNNING`, `PENDING`, `LATEST`.\n\n## Native architecture\n\nThis section is the technical core, and it is the part that changed most in the\nmove to the New Architecture (internally called M2).\n\n### The typed contract\n\nThe JS-to-native boundary is a Codegen spec, `src/specs/NativeCodePush.ts`,\nregistered in `package.json` as `RNAetherCodePushSpec`. React Native's Codegen\nturns that TypeScript interface into a generated native interface on each\nplatform. The native module implements the generated interface, so the method\nnames, argument types, and constants are checked by the compiler instead of\nmatched by hand at runtime.\n\nFreezing this contract is the point of M2. A private field rename inside React\nNative can break the small piece of code that reaches for it, but it can no\nlonger silently change the shape of the public API.\n\n### How JavaScript resolves the module\n\n`CodePush.js` resolves the native module through\n`TurboModuleRegistry.get(\"CodePush\")` and falls back to\n`NativeModules.CodePush`. The first path is the TurboModule (JSI) binding on the\nNew Architecture; the second is the classic bridge, used when a consumer has\nopted out of the New Architecture. Constants are read the same way: through the\ngenerated `getConstants()` when it exists, and from the module object otherwise.\n\n### Android\n\nCodePush is a `BaseReactPackage`. Its `getModule` returns the TurboModule and its\n`getReactModuleInfoProvider` marks CodePush as a TurboModule so the New\nArchitecture wires it through JSI.\n\nThe autolinking detail is the one that took real work. React Native's CLI only\nemits the C++ TurboModule provider for a library when it can derive a\n`libraryName` from the library's `codegenConfig`, and it does not derive one when\nthe library also supplies a custom `packageInstance`. CodePush used a custom\n`packageInstance` because the package needed the deployment key at construction.\nThe fix was to make CodePush auto-instantiable: give it a no-arg constructor and\nmove context-dependent setup, including reading the deployment key from\n`strings.xml`, into an `ensureInitialized(context)` step that runs when the\nmodule is first created. With the custom `packageInstance` gone, `libraryName`\nderives normally and the C++ provider is emitted, so `TurboModuleRegistry.get`\nreturns the module.\n\nThe native implementation is split by architecture using Gradle source sets. The\nshared logic lives in one plain class, and two thin subclasses adapt it: one\nextends the generated spec for the New Architecture, the other extends\n`ReactContextBaseJavaModule` for the bridge. `build.gradle` selects the\n`newarch` or `oldarch` source directory from the `IS_NEW_ARCHITECTURE_ENABLED`\nflag, so each build compiles exactly one of them.\n\n### iOS\n\nOn iOS the module implements `getTurboModule`, which returns a\n`NativeCodePushSpecJSI`, the generated JSI binding. That method and the\nconformance to the generated `NativeCodePushSpec` protocol are guarded by\n`RCT_NEW_ARCH_ENABLED`, so the bridge build never sees them.\n\nA few concrete details matter for anyone reading the source:\n\n- `CodePush.m` is `CodePush.mm`, because the generated spec header is\n  Objective-C++ and can only be imported from a `.mm`. The protocol conformance\n  lives in a class extension inside the `.mm`, not in the shared header that\n  plain `.m` files include.\n- The generated JSI binding calls specific selectors. Promise methods use\n  `resolve:`/`reject:` labels, and the enum-valued arguments (install mode,\n  minimum background duration, update state) arrive as `double` and are cast back\n  to the CodePush enums in the method bodies.\n- The spec reads constants through `getConstants`, so the module implements it\n  alongside the bridge's `constantsToExport`; both return the same enum map.\n- `CPLog`, defined in the plain-C `CodePushUtils.m`, is declared with C linkage\n  so the Objective-C++ `.mm` links against the unmangled symbol.\n\nThe reload path did not need reworking. iOS already reloads through a supported\nAPI, with the bundle URL coming from CodePush, which is why `restartApp` worked\nunchanged through the migration.\n\n### The bridge fallback\n\nEvery New Architecture addition sits behind a compile-time flag\n(`IS_NEW_ARCHITECTURE_ENABLED` on Android, `RCT_NEW_ARCH_ENABLED` on iOS), and\nthe podspec pulls the codegen dependencies through `install_modules_dependencies`\nonly when that helper exists, falling back to `React-Core` otherwise. The result\nis one package that a New Architecture app runs as a TurboModule and a legacy app\nstill builds as a bridge module, with no change to the public integration.\n\n## Releasing updates\n\nReleases are managed with the [Aether CLI](https://github.com/Monoradioactivo/aether-cli).\n\nBuild and upload a JavaScript bundle for a platform:\n\n```\naether release-react MyApp ios\naether release-react MyApp android -d Production\n```\n\nUseful flags:\n\n- `-d, --deploymentName` picks the deployment (default `Staging`).\n- `-t, --targetBinaryVersion` sets the binary version range the release applies\n  to. Without it, the CLI reads the version from `Info.plist` or `build.gradle`.\n- `-m, --mandatory` marks the release mandatory.\n- `-r, --rollout` releases to a percentage of users.\n- `-h, --useHermes` compiles the bundle to Hermes bytecode. Match the engine your\n  binary uses, or the downloaded bundle will not load.\n\nManage deployments and releases:\n\n```\naether deployment ls MyApp -k     # list deployments and their keys\naether promote MyApp Staging Production\naether rollback MyApp Production\naether patch MyApp Staging -r 50% # change rollout or metadata on the last release\n```\n\n## Server contract\n\nThe client speaks two endpoints, unchanged from the CodePush protocol:\n\n- An update check that asks whether a newer release exists for a deployment key\n  and binary version. The server answers with the release metadata and a\n  download URL, or with \"no update\".\n- A status report that records install and rollback telemetry, so a deployment's\n  active and failed counts reflect what happened on devices.\n\nThe `serverPathMode` option chooses the path prefix for both, as described under\n[Configuration](#server-path-mode). The request and response bodies are the same\nacross modes.\n\n## Development and testing\n\nThe repository ships two sample apps under `samples/`, one on React Native 0.76\n(`AetherSmoke076`) and one on 0.86 (`AetherSmoke086`). CI builds each on both\nplatforms, which is how the SDK stays honest about its supported range.\n\nBuild and run a sample:\n\n```\ncd samples/AetherSmoke076\nnpm install\nnpx pod-install ios        # iOS only\nnpm run ios                # or: npm run android\n```\n\nFor an end-to-end check against a live server, including releasing an update and\nwatching it download, install, and restart, follow the\n[runtime smoke runbook](./docs/runtime-smoke-runbook.md). To exercise switching\nbetween deployments on a device, see the multi-deployment testing guides for\n[iOS](./docs/multi-deployment-testing-ios.md) and\n[Android](./docs/multi-deployment-testing-android.md).\n\n## Documentation index\n\n- [JS API reference](./docs/api-js.md)\n- [iOS setup](./docs/setup-ios.md) and [Android setup](./docs/setup-android.md)\n- [iOS native API](./docs/api-ios.md) and [Android native API](./docs/api-android.md)\n- [Runtime smoke runbook](./docs/runtime-smoke-runbook.md)\n- [Multi-deployment testing: iOS](./docs/multi-deployment-testing-ios.md) and\n  [Android](./docs/multi-deployment-testing-android.md)\n- [M2 TurboModule brief](./docs/m2-turbomodule-brief.md)\n\n## License\n\nMIT. This project descends from Microsoft's CodePush plugin for React Native by\nway of RevoPush's New Architecture fork. The original copyright notice is\npreserved in [LICENSE.md](./LICENSE.md) and the full provenance is recorded in\n[ATTRIBUTION.md](./ATTRIBUTION.md).\n","readmeFilename":"README.md"}