From 3596a97d4031e7114394f09c6daf248012193476 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Tue, 2 Sep 2025 10:21:02 +0200 Subject: [PATCH 001/110] drop sqlite --- package.json | 2 - packages/sqlite-storage/.gitattributes | 3 - packages/sqlite-storage/README.md | 3 - .../RNAsyncStorageSQLite.podspec | 41 - packages/sqlite-storage/android/build.gradle | 94 - .../sqlite-storage/android/gradle.properties | 5 - .../android/src/main/AndroidManifest.xml | 3 - .../android/src/main/AndroidManifestNew.xml | 2 - .../sqlitestorage/SqliteStorageModule.kt | 25 - .../sqlitestorage/SqliteStoragePackage.kt | 17 - packages/sqlite-storage/babel.config.js | 3 - packages/sqlite-storage/eslint.config.js | 1 - .../sqlite-storage/example/.watchmanconfig | 1 - packages/sqlite-storage/example/App.tsx | 70 - .../example/android/build.gradle | 42 - .../example/android/gradle.properties | 53 - .../android/gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 8 - .../sqlite-storage/example/android/gradlew | 249 --- .../example/android/gradlew.bat | 92 - .../example/android/settings.gradle | 21 - packages/sqlite-storage/example/app.json | 23 - .../sqlite-storage/example/babel.config.js | 12 - packages/sqlite-storage/example/index.js | 5 - packages/sqlite-storage/example/ios/Podfile | 19 - .../sqlite-storage/example/ios/Podfile.lock | 1846 ----------------- .../contents.xcworkspacedata | 10 - .../sqlite-storage/example/metro.config.js | 23 - packages/sqlite-storage/example/package.json | 35 - .../example/react-native.config.js | 20 - .../ios/SqliteStorage-Bridging-Header.h | 2 - packages/sqlite-storage/ios/SqliteStorage.mm | 16 - .../sqlite-storage/ios/SqliteStorage.swift | 8 - packages/sqlite-storage/jest.config.js | 5 - packages/sqlite-storage/package.json | 85 - .../sqlite-storage/react-native.config.js | 25 - packages/sqlite-storage/src/index.ts | 22 - packages/sqlite-storage/tests/index.test.ts | 1 - packages/sqlite-storage/tsconfig.build.json | 4 - packages/sqlite-storage/tsconfig.json | 10 - yarn.lock | 762 +------ 41 files changed, 19 insertions(+), 3649 deletions(-) delete mode 100644 packages/sqlite-storage/.gitattributes delete mode 100644 packages/sqlite-storage/README.md delete mode 100644 packages/sqlite-storage/RNAsyncStorageSQLite.podspec delete mode 100644 packages/sqlite-storage/android/build.gradle delete mode 100644 packages/sqlite-storage/android/gradle.properties delete mode 100644 packages/sqlite-storage/android/src/main/AndroidManifest.xml delete mode 100644 packages/sqlite-storage/android/src/main/AndroidManifestNew.xml delete mode 100644 packages/sqlite-storage/android/src/main/java/org/rnasyncstorage/sqlitestorage/SqliteStorageModule.kt delete mode 100644 packages/sqlite-storage/android/src/main/java/org/rnasyncstorage/sqlitestorage/SqliteStoragePackage.kt delete mode 100644 packages/sqlite-storage/babel.config.js delete mode 100644 packages/sqlite-storage/eslint.config.js delete mode 100644 packages/sqlite-storage/example/.watchmanconfig delete mode 100644 packages/sqlite-storage/example/App.tsx delete mode 100644 packages/sqlite-storage/example/android/build.gradle delete mode 100644 packages/sqlite-storage/example/android/gradle.properties delete mode 100644 packages/sqlite-storage/example/android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 packages/sqlite-storage/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 packages/sqlite-storage/example/android/gradlew delete mode 100644 packages/sqlite-storage/example/android/gradlew.bat delete mode 100644 packages/sqlite-storage/example/android/settings.gradle delete mode 100644 packages/sqlite-storage/example/app.json delete mode 100644 packages/sqlite-storage/example/babel.config.js delete mode 100644 packages/sqlite-storage/example/index.js delete mode 100644 packages/sqlite-storage/example/ios/Podfile delete mode 100644 packages/sqlite-storage/example/ios/Podfile.lock delete mode 100644 packages/sqlite-storage/example/ios/SQLiteExample.xcworkspace/contents.xcworkspacedata delete mode 100644 packages/sqlite-storage/example/metro.config.js delete mode 100644 packages/sqlite-storage/example/package.json delete mode 100644 packages/sqlite-storage/example/react-native.config.js delete mode 100644 packages/sqlite-storage/ios/SqliteStorage-Bridging-Header.h delete mode 100644 packages/sqlite-storage/ios/SqliteStorage.mm delete mode 100644 packages/sqlite-storage/ios/SqliteStorage.swift delete mode 100644 packages/sqlite-storage/jest.config.js delete mode 100644 packages/sqlite-storage/package.json delete mode 100644 packages/sqlite-storage/react-native.config.js delete mode 100644 packages/sqlite-storage/src/index.ts delete mode 100644 packages/sqlite-storage/tests/index.test.ts delete mode 100644 packages/sqlite-storage/tsconfig.build.json delete mode 100644 packages/sqlite-storage/tsconfig.json diff --git a/package.json b/package.json index 430b93e9..33097040 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,6 @@ "packages/api", "packages/default-storage", "packages/default-storage/example", - "packages/sqlite-storage", - "packages/sqlite-storage/example", "packages/eslint-config", "packages/website" ] diff --git a/packages/sqlite-storage/.gitattributes b/packages/sqlite-storage/.gitattributes deleted file mode 100644 index 030ef144..00000000 --- a/packages/sqlite-storage/.gitattributes +++ /dev/null @@ -1,3 +0,0 @@ -*.pbxproj -text -# specific for windows script files -*.bat text eol=crlf \ No newline at end of file diff --git a/packages/sqlite-storage/README.md b/packages/sqlite-storage/README.md deleted file mode 100644 index bfe92bdd..00000000 --- a/packages/sqlite-storage/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Async Storage SQLite - -Key-value persistent storage for React Native backed by SQLite. diff --git a/packages/sqlite-storage/RNAsyncStorageSQLite.podspec b/packages/sqlite-storage/RNAsyncStorageSQLite.podspec deleted file mode 100644 index 97000547..00000000 --- a/packages/sqlite-storage/RNAsyncStorageSQLite.podspec +++ /dev/null @@ -1,41 +0,0 @@ -require "json" - -package = JSON.parse(File.read(File.join(__dir__, "package.json"))) -folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32' - -Pod::Spec.new do |s| - s.name = File.basename(__FILE__, '.podspec') - s.version = package["version"] - s.summary = package["description"] - s.homepage = package["homepage"] - s.license = package["license"] - s.authors = package["author"] - - s.platforms = { :ios => min_ios_version_supported } - s.source = { :git => "https://github.com/react-native-async-storage/async-storage.git", :tag => "#{s.version}" } - - s.source_files = "ios/**/*.{h,m,mm,swift}" - - # Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0. - # See https://github.com/facebook/react-native/blob/febf6b7f33fdb4904669f99d795eba4c0f95d7bf/scripts/cocoapods/new_architecture.rb#L79. - if respond_to?(:install_modules_dependencies, true) - install_modules_dependencies(s) - else - s.dependency "React-Core" - - # Don't install the dependencies when we run `pod install` in the old architecture. - if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then - s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1" - s.pod_target_xcconfig = { - "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"", - "OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1", - "CLANG_CXX_LANGUAGE_STANDARD" => "c++17" - } - s.dependency "React-Codegen" - s.dependency "RCT-Folly" - s.dependency "RCTRequired" - s.dependency "RCTTypeSafety" - s.dependency "ReactCommon/turbomodule/core" - end - end -end diff --git a/packages/sqlite-storage/android/build.gradle b/packages/sqlite-storage/android/build.gradle deleted file mode 100644 index a40dce20..00000000 --- a/packages/sqlite-storage/android/build.gradle +++ /dev/null @@ -1,94 +0,0 @@ -buildscript { - // Buildscript is evaluated before everything else so we can't use getExtOrDefault - def kotlin_version = rootProject.ext.has("kotlinVersion") ? rootProject.ext.get("kotlinVersion") : project.properties["SqliteStorage_kotlinVersion"] - - repositories { - google() - mavenCentral() - } - - dependencies { - classpath "com.android.tools.build:gradle:7.2.1" - // noinspection DifferentKotlinGradleVersion - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -def isNewArchitectureEnabled() { - return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true" -} - -apply plugin: "com.android.library" -apply plugin: "kotlin-android" - -if (isNewArchitectureEnabled()) { - apply plugin: "com.facebook.react" -} - -def getExtOrDefault(name) { - return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties["SqliteStorage_" + name] -} - -def getExtOrIntegerDefault(name) { - return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["SqliteStorage_" + name]).toInteger() -} - -def supportsNamespace() { - def parsed = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.') - def major = parsed[0].toInteger() - def minor = parsed[1].toInteger() - - // Namespace support was added in 7.3.0 - return (major == 7 && minor >= 3) || major >= 8 -} - -android { - if (supportsNamespace()) { - namespace "org.rnasyncstorage.sqlitestorage" - - sourceSets { - main { - manifest.srcFile "src/main/AndroidManifestNew.xml" - } - } - } - - compileSdkVersion getExtOrIntegerDefault("compileSdkVersion") - - defaultConfig { - minSdkVersion getExtOrIntegerDefault("minSdkVersion") - targetSdkVersion getExtOrIntegerDefault("targetSdkVersion") - - } - - buildTypes { - release { - minifyEnabled false - } - } - - lintOptions { - disable "GradleCompatible" - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } -} - -repositories { - mavenCentral() - google() -} - -def kotlin_version = getExtOrDefault("kotlinVersion") - -dependencies { - // For < 0.71, this will be from the local maven repo - // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin - //noinspection GradleDynamicVersion - implementation "com.facebook.react:react-native:+" - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" -} - diff --git a/packages/sqlite-storage/android/gradle.properties b/packages/sqlite-storage/android/gradle.properties deleted file mode 100644 index d5ef57fc..00000000 --- a/packages/sqlite-storage/android/gradle.properties +++ /dev/null @@ -1,5 +0,0 @@ -SqliteStorage_kotlinVersion=1.7.0 -SqliteStorage_minSdkVersion=21 -SqliteStorage_targetSdkVersion=31 -SqliteStorage_compileSdkVersion=31 -SqliteStorage_ndkversion=21.4.7075529 diff --git a/packages/sqlite-storage/android/src/main/AndroidManifest.xml b/packages/sqlite-storage/android/src/main/AndroidManifest.xml deleted file mode 100644 index cf9dd4b9..00000000 --- a/packages/sqlite-storage/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/packages/sqlite-storage/android/src/main/AndroidManifestNew.xml b/packages/sqlite-storage/android/src/main/AndroidManifestNew.xml deleted file mode 100644 index a2f47b60..00000000 --- a/packages/sqlite-storage/android/src/main/AndroidManifestNew.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/packages/sqlite-storage/android/src/main/java/org/rnasyncstorage/sqlitestorage/SqliteStorageModule.kt b/packages/sqlite-storage/android/src/main/java/org/rnasyncstorage/sqlitestorage/SqliteStorageModule.kt deleted file mode 100644 index c9cab554..00000000 --- a/packages/sqlite-storage/android/src/main/java/org/rnasyncstorage/sqlitestorage/SqliteStorageModule.kt +++ /dev/null @@ -1,25 +0,0 @@ -package org.rnasyncstorage.sqlitestorage - -import com.facebook.react.bridge.ReactApplicationContext -import com.facebook.react.bridge.ReactContextBaseJavaModule -import com.facebook.react.bridge.ReactMethod -import com.facebook.react.bridge.Promise - -class SqliteStorageModule(reactContext: ReactApplicationContext) : - ReactContextBaseJavaModule(reactContext) { - - override fun getName(): String { - return NAME - } - - // Example method - // See https://reactnative.dev/docs/native-modules-android - @ReactMethod - fun multiply(a: Double, b: Double, promise: Promise) { - promise.resolve(a * b) - } - - companion object { - const val NAME = "SqliteStorage" - } -} diff --git a/packages/sqlite-storage/android/src/main/java/org/rnasyncstorage/sqlitestorage/SqliteStoragePackage.kt b/packages/sqlite-storage/android/src/main/java/org/rnasyncstorage/sqlitestorage/SqliteStoragePackage.kt deleted file mode 100644 index 46bffa3c..00000000 --- a/packages/sqlite-storage/android/src/main/java/org/rnasyncstorage/sqlitestorage/SqliteStoragePackage.kt +++ /dev/null @@ -1,17 +0,0 @@ -package org.rnasyncstorage.sqlitestorage - -import com.facebook.react.ReactPackage -import com.facebook.react.bridge.NativeModule -import com.facebook.react.bridge.ReactApplicationContext -import com.facebook.react.uimanager.ViewManager - - -class SqliteStoragePackage : ReactPackage { - override fun createNativeModules(reactContext: ReactApplicationContext): List { - return listOf(SqliteStorageModule(reactContext)) - } - - override fun createViewManagers(reactContext: ReactApplicationContext): List> { - return emptyList() - } -} diff --git a/packages/sqlite-storage/babel.config.js b/packages/sqlite-storage/babel.config.js deleted file mode 100644 index 3c25e5d9..00000000 --- a/packages/sqlite-storage/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: ["module:@react-native/babel-preset"], -}; diff --git a/packages/sqlite-storage/eslint.config.js b/packages/sqlite-storage/eslint.config.js deleted file mode 100644 index f23036d9..00000000 --- a/packages/sqlite-storage/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@react-native-async-storage/eslint-config"); diff --git a/packages/sqlite-storage/example/.watchmanconfig b/packages/sqlite-storage/example/.watchmanconfig deleted file mode 100644 index 0967ef42..00000000 --- a/packages/sqlite-storage/example/.watchmanconfig +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/packages/sqlite-storage/example/App.tsx b/packages/sqlite-storage/example/App.tsx deleted file mode 100644 index 5d198739..00000000 --- a/packages/sqlite-storage/example/App.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import React, { useState } from "react"; -import { - Button, - SafeAreaView, - ScrollView, - Text, - StatusBar, - StyleSheet, - useColorScheme, - View, -} from "react-native"; -import { Colors } from "react-native/Libraries/NewAppScreen"; -import { multiply } from "@react-native-async-storage/sqlite-storage"; - -function App(): React.JSX.Element { - const isDarkMode = useColorScheme() === "dark"; - const [result, setResult] = useState(null); - - const backgroundStyle = { - backgroundColor: isDarkMode ? Colors.darker : Colors.lighter, - }; - - async function test() { - const random = Math.round(Math.random() * 100); - const result = await multiply(random, 2); - setResult(`${random} * 2 = ${result}`); - } - - return ( - - - - + + + + ); +}; + +export default BasicCrud; diff --git a/examples/example-web/src/assets/react.svg b/examples/example-web/src/assets/react.svg new file mode 100644 index 00000000..6c87de9b --- /dev/null +++ b/examples/example-web/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/example-web/src/index.css b/examples/example-web/src/index.css new file mode 100644 index 00000000..08a3ac9e --- /dev/null +++ b/examples/example-web/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/examples/example-web/src/main.tsx b/examples/example-web/src/main.tsx new file mode 100644 index 00000000..10ed13e0 --- /dev/null +++ b/examples/example-web/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import "./index.css"; +import App from "./App.tsx"; + +createRoot(document.getElementById("root")!).render( + + + +); diff --git a/examples/example-web/src/vite-env.d.ts b/examples/example-web/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/examples/example-web/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/example-web/tsconfig.app.json b/examples/example-web/tsconfig.app.json new file mode 100644 index 00000000..227a6c67 --- /dev/null +++ b/examples/example-web/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/examples/example-web/tsconfig.json b/examples/example-web/tsconfig.json new file mode 100644 index 00000000..1ffef600 --- /dev/null +++ b/examples/example-web/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/examples/example-web/tsconfig.node.json b/examples/example-web/tsconfig.node.json new file mode 100644 index 00000000..f85a3990 --- /dev/null +++ b/examples/example-web/tsconfig.node.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/example-web/vite.config.ts b/examples/example-web/vite.config.ts new file mode 100644 index 00000000..0e43ae8d --- /dev/null +++ b/examples/example-web/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}); diff --git a/package.json b/package.json index 1faf57ee..e288d856 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,10 @@ "packages/async-storage", "packages/eslint-config", "packages/website", - "examples/example-react-native" - ] + "examples/example-react-native", + "examples/example-web" + ], + "dependencies": { + "vite": "^7.1.5" + } } diff --git a/packages/eslint-config/index.js b/packages/eslint-config/index.js index 13105eff..dfe0e47c 100644 --- a/packages/eslint-config/index.js +++ b/packages/eslint-config/index.js @@ -12,6 +12,7 @@ module.exports = [ ...prettierConfig.rules, "prettier/prettier": "error", "no-console": "error", + "react/react-in-jsx-scope": "off", }, }, ]; diff --git a/yarn.lock b/yarn.lock index 229c406e..3cd44c39 100644 --- a/yarn.lock +++ b/yarn.lock @@ -326,6 +326,29 @@ __metadata: languageName: node linkType: hard +"@babel/core@npm:^7.28.0": + version: 7.28.4 + resolution: "@babel/core@npm:7.28.4" + dependencies: + "@babel/code-frame": "npm:^7.27.1" + "@babel/generator": "npm:^7.28.3" + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-module-transforms": "npm:^7.28.3" + "@babel/helpers": "npm:^7.28.4" + "@babel/parser": "npm:^7.28.4" + "@babel/template": "npm:^7.27.2" + "@babel/traverse": "npm:^7.28.4" + "@babel/types": "npm:^7.28.4" + "@jridgewell/remapping": "npm:^2.3.5" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10c0/ef5a6c3c6bf40d3589b5593f8118cfe2602ce737412629fb6e26d595be2fcbaae0807b43027a5c42ec4fba5b895ff65891f2503b5918c8a3ea3542ab44d4c278 + languageName: node + linkType: hard + "@babel/eslint-parser@npm:^7.25.1": version: 7.28.0 resolution: "@babel/eslint-parser@npm:7.28.0" @@ -668,6 +691,16 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/helpers@npm:7.28.4" + dependencies: + "@babel/template": "npm:^7.27.2" + "@babel/types": "npm:^7.28.4" + checksum: 10c0/aaa5fb8098926dfed5f223adf2c5e4c7fbba4b911b73dfec2d7d3083f8ba694d201a206db673da2d9b3ae8c01793e795767654558c450c8c14b4c2175b4fcb44 + languageName: node + linkType: hard + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.12.7, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.18.8, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2, @babel/parser@npm:^7.26.9": version: 7.26.10 resolution: "@babel/parser@npm:7.26.10" @@ -690,6 +723,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/parser@npm:7.28.4" + dependencies: + "@babel/types": "npm:^7.28.4" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/58b239a5b1477ac7ed7e29d86d675cc81075ca055424eba6485872626db2dc556ce63c45043e5a679cd925e999471dba8a3ed4864e7ab1dbf64306ab72c52707 + languageName: node + linkType: hard + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9" @@ -1566,6 +1610,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx-self@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/00a4f917b70a608f9aca2fb39aabe04a60aa33165a7e0105fd44b3a8531630eb85bf5572e9f242f51e6ad2fa38c2e7e780902176c863556c58b5ba6f6e164031 + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx-source@npm:^7.24.7": version: 7.25.9 resolution: "@babel/plugin-transform-react-jsx-source@npm:7.25.9" @@ -1577,6 +1632,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx-source@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5e67b56c39c4d03e59e03ba80692b24c5a921472079b63af711b1d250fc37c1733a17069b63537f750f3e937ec44a42b1ee6a46cd23b1a0df5163b17f741f7f2 + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx@npm:^7.25.2, @babel/plugin-transform-react-jsx@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-react-jsx@npm:7.25.9" @@ -1978,6 +2044,21 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/traverse@npm:7.28.4" + dependencies: + "@babel/code-frame": "npm:^7.27.1" + "@babel/generator": "npm:^7.28.3" + "@babel/helper-globals": "npm:^7.28.0" + "@babel/parser": "npm:^7.28.4" + "@babel/template": "npm:^7.27.2" + "@babel/types": "npm:^7.28.4" + debug: "npm:^4.3.1" + checksum: 10c0/ee678fdd49c9f54a32e07e8455242390d43ce44887cea6567b233fe13907b89240c377e7633478a32c6cf1be0e17c2f7f3b0c59f0666e39c5074cc47b968489c + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.12.7, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.10, @babel/types@npm:^7.26.9, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": version: 7.26.10 resolution: "@babel/types@npm:7.26.10" @@ -1998,6 +2079,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/types@npm:7.28.4" + dependencies: + "@babel/helper-string-parser": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + checksum: 10c0/ac6f909d6191319e08c80efbfac7bd9a25f80cc83b43cd6d82e7233f7a6b9d6e7b90236f3af7400a3f83b576895bcab9188a22b584eb0f224e80e6d4e95f4517 + languageName: node + linkType: hard + "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -2816,6 +2907,188 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/aix-ppc64@npm:0.25.9" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/android-arm64@npm:0.25.9" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/android-arm@npm:0.25.9" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/android-x64@npm:0.25.9" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/darwin-arm64@npm:0.25.9" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/darwin-x64@npm:0.25.9" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/freebsd-arm64@npm:0.25.9" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/freebsd-x64@npm:0.25.9" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-arm64@npm:0.25.9" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-arm@npm:0.25.9" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-ia32@npm:0.25.9" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-loong64@npm:0.25.9" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-mips64el@npm:0.25.9" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-ppc64@npm:0.25.9" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-riscv64@npm:0.25.9" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-s390x@npm:0.25.9" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-x64@npm:0.25.9" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/netbsd-arm64@npm:0.25.9" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/netbsd-x64@npm:0.25.9" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/openbsd-arm64@npm:0.25.9" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/openbsd-x64@npm:0.25.9" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openharmony-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/openharmony-arm64@npm:0.25.9" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/sunos-x64@npm:0.25.9" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/win32-arm64@npm:0.25.9" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/win32-ia32@npm:0.25.9" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/win32-x64@npm:0.25.9" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -3281,6 +3554,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/remapping@npm:^2.3.5": + version: 2.3.5 + resolution: "@jridgewell/remapping@npm:2.3.5" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/3de494219ffeb2c5c38711d0d7bb128097edf91893090a2dbc8ee0b55d092bb7347b1fd0f478486c5eab010e855c73927b1666f2107516d472d24a73017d1194 + languageName: node + linkType: hard + "@jridgewell/resolve-uri@npm:^3.1.0": version: 3.1.1 resolution: "@jridgewell/resolve-uri@npm:3.1.1" @@ -3602,6 +3885,7 @@ __metadata: prettier: "npm:3.6.2" turbo: "npm:2.5.6" typescript: "npm:5.9.2" + vite: "npm:^7.1.5" languageName: unknown linkType: soft @@ -4523,6 +4807,160 @@ __metadata: languageName: node linkType: hard +"@rolldown/pluginutils@npm:1.0.0-beta.30": + version: 1.0.0-beta.30 + resolution: "@rolldown/pluginutils@npm:1.0.0-beta.30" + checksum: 10c0/aff8b532cb9d82d94c9a4101fa12ecb10620ad47d52dbb9135a5c65bde1ad19895b41026b821f4d607083699239a5d0010198401b6a6a54ab6a10d0015302768 + languageName: node + linkType: hard + +"@rollup/rollup-android-arm-eabi@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.50.2" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-android-arm64@npm:4.50.2" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-darwin-arm64@npm:4.50.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-darwin-x64@npm:4.50.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.50.2" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-freebsd-x64@npm:4.50.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.50.2" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.50.2" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.50.2" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.50.2" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-loong64-gnu@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.50.2" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-ppc64-gnu@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.50.2" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.50.2" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-musl@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.50.2" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.50.2" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.50.2" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.50.2" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-openharmony-arm64@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.50.2" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.50.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.50.2" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.50.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@sideway/address@npm:^4.1.3": version: 4.1.4 resolution: "@sideway/address@npm:4.1.4" @@ -4781,6 +5219,19 @@ __metadata: languageName: node linkType: hard +"@types/babel__core@npm:^7.20.5": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" + dependencies: + "@babel/parser": "npm:^7.20.7" + "@babel/types": "npm:^7.20.7" + "@types/babel__generator": "npm:*" + "@types/babel__template": "npm:*" + "@types/babel__traverse": "npm:*" + checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff + languageName: node + linkType: hard + "@types/babel__generator@npm:*": version: 7.6.4 resolution: "@types/babel__generator@npm:7.6.4" @@ -4847,6 +5298,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:1.0.8, @types/estree@npm:^1.0.6": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 + languageName: node + linkType: hard + "@types/estree@npm:^1.0.5": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" @@ -4854,13 +5312,6 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:^1.0.6": - version: 1.0.8 - resolution: "@types/estree@npm:1.0.8" - checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 - languageName: node - linkType: hard - "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": version: 4.17.35 resolution: "@types/express-serve-static-core@npm:4.17.35" @@ -5093,6 +5544,15 @@ __metadata: languageName: node linkType: hard +"@types/react-dom@npm:19.1.7": + version: 19.1.7 + resolution: "@types/react-dom@npm:19.1.7" + peerDependencies: + "@types/react": ^19.0.0 + checksum: 10c0/8db5751c1567552fe4e1ece9f5823b682f2994ec8d30ed34ba0ef984e3c8ace1435f8be93d02f55c350147e78ac8c4dbcd8ed2c3b6a60f575bc5374f588c51c9 + languageName: node + linkType: hard + "@types/react-router-config@npm:*, @types/react-router-config@npm:^5.0.6": version: 5.0.7 resolution: "@types/react-router-config@npm:5.0.7" @@ -5144,6 +5604,15 @@ __metadata: languageName: node linkType: hard +"@types/react@npm:19.1.10": + version: 19.1.10 + resolution: "@types/react@npm:19.1.10" + dependencies: + csstype: "npm:^3.0.2" + checksum: 10c0/fb583deacd0a815e2775dc1b9f764532d8cacb748ddd2c2914805a46c257ce6c237b4078f44009692074db212ab61a390301c6470f07f5aa5bfdeb78a2acfda1 + languageName: node + linkType: hard + "@types/react@npm:^19.0.0": version: 19.1.12 resolution: "@types/react@npm:19.1.12" @@ -5597,6 +6066,22 @@ __metadata: languageName: node linkType: hard +"@vitejs/plugin-react@npm:5.0.0": + version: 5.0.0 + resolution: "@vitejs/plugin-react@npm:5.0.0" + dependencies: + "@babel/core": "npm:^7.28.0" + "@babel/plugin-transform-react-jsx-self": "npm:^7.27.1" + "@babel/plugin-transform-react-jsx-source": "npm:^7.27.1" + "@rolldown/pluginutils": "npm:1.0.0-beta.30" + "@types/babel__core": "npm:^7.20.5" + react-refresh: "npm:^0.17.0" + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + checksum: 10c0/e5813839d319ab5dc1b90cab40b6c08388f26e456166ba9df10ffc3c3f4ecc594cec06715b5c93390bba56140ca5f68a18f2233f7d275d77e5bbfeb979e4fd9b + languageName: node + linkType: hard + "@vscode/sudo-prompt@npm:^9.0.0": version: 9.3.1 resolution: "@vscode/sudo-prompt@npm:9.3.1" @@ -9008,6 +9493,95 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.25.0": + version: 0.25.9 + resolution: "esbuild@npm:0.25.9" + dependencies: + "@esbuild/aix-ppc64": "npm:0.25.9" + "@esbuild/android-arm": "npm:0.25.9" + "@esbuild/android-arm64": "npm:0.25.9" + "@esbuild/android-x64": "npm:0.25.9" + "@esbuild/darwin-arm64": "npm:0.25.9" + "@esbuild/darwin-x64": "npm:0.25.9" + "@esbuild/freebsd-arm64": "npm:0.25.9" + "@esbuild/freebsd-x64": "npm:0.25.9" + "@esbuild/linux-arm": "npm:0.25.9" + "@esbuild/linux-arm64": "npm:0.25.9" + "@esbuild/linux-ia32": "npm:0.25.9" + "@esbuild/linux-loong64": "npm:0.25.9" + "@esbuild/linux-mips64el": "npm:0.25.9" + "@esbuild/linux-ppc64": "npm:0.25.9" + "@esbuild/linux-riscv64": "npm:0.25.9" + "@esbuild/linux-s390x": "npm:0.25.9" + "@esbuild/linux-x64": "npm:0.25.9" + "@esbuild/netbsd-arm64": "npm:0.25.9" + "@esbuild/netbsd-x64": "npm:0.25.9" + "@esbuild/openbsd-arm64": "npm:0.25.9" + "@esbuild/openbsd-x64": "npm:0.25.9" + "@esbuild/openharmony-arm64": "npm:0.25.9" + "@esbuild/sunos-x64": "npm:0.25.9" + "@esbuild/win32-arm64": "npm:0.25.9" + "@esbuild/win32-ia32": "npm:0.25.9" + "@esbuild/win32-x64": "npm:0.25.9" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/openharmony-arm64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/aaa1284c75fcf45c82f9a1a117fe8dc5c45628e3386bda7d64916ae27730910b51c5aec7dd45a6ba19256be30ba2935e64a8f011a3f0539833071e06bf76d5b3 + languageName: node + linkType: hard + "escalade@npm:^3.1.1, escalade@npm:^3.1.2": version: 3.2.0 resolution: "escalade@npm:3.2.0" @@ -9435,6 +10009,23 @@ __metadata: languageName: unknown linkType: soft +"example-web@workspace:examples/example-web": + version: 0.0.0-use.local + resolution: "example-web@workspace:examples/example-web" + dependencies: + "@react-native-async-storage/async-storage": "workspace:*" + "@react-native-async-storage/eslint-config": "workspace:*" + "@types/react": "npm:19.1.10" + "@types/react-dom": "npm:19.1.7" + "@vitejs/plugin-react": "npm:5.0.0" + eslint: "npm:9.34.0" + react: "npm:19.1.1" + react-dom: "npm:19.1.1" + typescript: "npm:5.9.2" + vite: "npm:7.1.5" + languageName: unknown + linkType: soft + "exec-sh@npm:^0.2.0": version: 0.2.2 resolution: "exec-sh@npm:0.2.2" @@ -9725,6 +10316,18 @@ __metadata: languageName: node linkType: hard +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f + languageName: node + linkType: hard + "feed@npm:^4.2.2": version: 4.2.2 resolution: "feed@npm:4.2.2" @@ -10045,6 +10648,16 @@ __metadata: languageName: node linkType: hard +"fsevents@npm:~2.3.3": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + "fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": version: 2.3.2 resolution: "fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1" @@ -10054,6 +10667,15 @@ __metadata: languageName: node linkType: hard +"fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + "function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" @@ -13950,6 +14572,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.11": + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b + languageName: node + linkType: hard + "nanoid@npm:^3.3.6": version: 3.3.6 resolution: "nanoid@npm:3.3.6" @@ -14825,6 +15456,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.3": + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 + languageName: node + linkType: hard + "pify@npm:^3.0.0": version: 3.0.0 resolution: "pify@npm:3.0.0" @@ -15316,6 +15954,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.5.6": + version: 8.5.6 + resolution: "postcss@npm:8.5.6" + dependencies: + nanoid: "npm:^3.3.11" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/5127cc7c91ed7a133a1b7318012d8bfa112da9ef092dddf369ae699a1f10ebbd89b1b9f25f3228795b84585c72aabd5ced5fc11f2ba467eedf7b081a66fad024 + languageName: node + linkType: hard + "preferred-pm@npm:^3.0.0": version: 3.1.4 resolution: "preferred-pm@npm:3.1.4" @@ -15717,6 +16366,17 @@ __metadata: languageName: node linkType: hard +"react-dom@npm:19.1.1": + version: 19.1.1 + resolution: "react-dom@npm:19.1.1" + dependencies: + scheduler: "npm:^0.26.0" + peerDependencies: + react: ^19.1.1 + checksum: 10c0/8c91198510521299c56e4e8d5e3a4508b2734fb5e52f29eeac33811de64e76fe586ad32c32182e2e84e070d98df67125da346c3360013357228172dbcd20bcdd + languageName: node + linkType: hard + "react-dom@npm:^18.2.0": version: 18.3.1 resolution: "react-dom@npm:18.3.1" @@ -16070,6 +16730,13 @@ __metadata: languageName: node linkType: hard +"react-refresh@npm:^0.17.0": + version: 0.17.0 + resolution: "react-refresh@npm:0.17.0" + checksum: 10c0/002cba940384c9930008c0bce26cac97a9d5682bc623112c2268ba0c155127d9c178a9a5cc2212d560088d60dfd503edd808669a25f9b377f316a32361d0b23c + languageName: node + linkType: hard + "react-router-config@npm:^5.1.1": version: 5.1.1 resolution: "react-router-config@npm:5.1.1" @@ -16150,6 +16817,13 @@ __metadata: languageName: node linkType: hard +"react@npm:19.1.1": + version: 19.1.1 + resolution: "react@npm:19.1.1" + checksum: 10c0/8c9769a2dfd02e603af6445058325e6c8a24b47b185d0e461f66a6454765ddcaecb3f0a90184836c68bb509f3c38248359edbc42f0d07c23eb500a5c30c87b4e + languageName: node + linkType: hard + "react@npm:^18.2.0": version: 18.3.1 resolution: "react@npm:18.3.1" @@ -16726,6 +17400,84 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.43.0": + version: 4.50.2 + resolution: "rollup@npm:4.50.2" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.50.2" + "@rollup/rollup-android-arm64": "npm:4.50.2" + "@rollup/rollup-darwin-arm64": "npm:4.50.2" + "@rollup/rollup-darwin-x64": "npm:4.50.2" + "@rollup/rollup-freebsd-arm64": "npm:4.50.2" + "@rollup/rollup-freebsd-x64": "npm:4.50.2" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.50.2" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.50.2" + "@rollup/rollup-linux-arm64-gnu": "npm:4.50.2" + "@rollup/rollup-linux-arm64-musl": "npm:4.50.2" + "@rollup/rollup-linux-loong64-gnu": "npm:4.50.2" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.50.2" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.50.2" + "@rollup/rollup-linux-riscv64-musl": "npm:4.50.2" + "@rollup/rollup-linux-s390x-gnu": "npm:4.50.2" + "@rollup/rollup-linux-x64-gnu": "npm:4.50.2" + "@rollup/rollup-linux-x64-musl": "npm:4.50.2" + "@rollup/rollup-openharmony-arm64": "npm:4.50.2" + "@rollup/rollup-win32-arm64-msvc": "npm:4.50.2" + "@rollup/rollup-win32-ia32-msvc": "npm:4.50.2" + "@rollup/rollup-win32-x64-msvc": "npm:4.50.2" + "@types/estree": "npm:1.0.8" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loong64-gnu": + optional: true + "@rollup/rollup-linux-ppc64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-openharmony-arm64": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/5415d0a5ae6f37fa5f10997b3c5cff20c2ea6bd1636db90e59672969a4f83b29f6168bf9dd26c1276c2e37e1d55674472758da90cbc46c8b08ada5d0ec60eb9b + languageName: node + linkType: hard + "rtl-detect@npm:^1.0.4": version: 1.0.4 resolution: "rtl-detect@npm:1.0.4" @@ -16866,6 +17618,13 @@ __metadata: languageName: node linkType: hard +"scheduler@npm:^0.26.0": + version: 0.26.0 + resolution: "scheduler@npm:0.26.0" + checksum: 10c0/5b8d5bfddaae3513410eda54f2268e98a376a429931921a81b5c3a2873aab7ca4d775a8caac5498f8cbc7d0daeab947cf923dbd8e215d61671f9f4e392d34356 + languageName: node + linkType: hard + "schema-utils@npm:2.7.0": version: 2.7.0 resolution: "schema-utils@npm:2.7.0" @@ -17433,6 +18192,13 @@ __metadata: languageName: node linkType: hard +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + "source-map-support@npm:0.5.13": version: 0.5.13 resolution: "source-map-support@npm:0.5.13" @@ -18112,6 +18878,16 @@ __metadata: languageName: node linkType: hard +"tinyglobby@npm:^0.2.15": + version: 0.2.15 + resolution: "tinyglobby@npm:0.2.15" + dependencies: + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.3" + checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 + languageName: node + linkType: hard + "tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -19006,6 +19782,61 @@ __metadata: languageName: node linkType: hard +"vite@npm:7.1.5, vite@npm:^7.1.5": + version: 7.1.5 + resolution: "vite@npm:7.1.5" + dependencies: + esbuild: "npm:^0.25.0" + fdir: "npm:^6.5.0" + fsevents: "npm:~2.3.3" + picomatch: "npm:^4.0.3" + postcss: "npm:^8.5.6" + rollup: "npm:^4.43.0" + tinyglobby: "npm:^0.2.15" + peerDependencies: + "@types/node": ^20.19.0 || >=22.12.0 + jiti: ">=1.21.0" + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: ">=0.54.8" + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/782d2f20c25541b26d1fb39bef5f194149caff39dc25b7836e25f049ca919f2e2ce186bddb21f3f20f6195354b3579ec637a8ca08d65b117f8b6f81e3e730a9c + languageName: node + linkType: hard + "vlq@npm:^1.0.0": version: 1.0.1 resolution: "vlq@npm:1.0.1" From d4145feaf823efc6f743255d89eb0edf151481aa Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Wed, 17 Sep 2025 20:17:42 +0200 Subject: [PATCH 051/110] feat(async-storage): web storage --- .../src/createAsyncStorage.native.ts | 98 +++++++++++++++++++ packages/eslint-config/index.js | 1 + 2 files changed, 99 insertions(+) create mode 100644 packages/async-storage/src/createAsyncStorage.native.ts diff --git a/packages/async-storage/src/createAsyncStorage.native.ts b/packages/async-storage/src/createAsyncStorage.native.ts new file mode 100644 index 00000000..18635ac4 --- /dev/null +++ b/packages/async-storage/src/createAsyncStorage.native.ts @@ -0,0 +1,98 @@ +import type { AsyncStorage } from "./AsyncStorage"; +import NativeAsyncStorage, { + type Spec as NativeAsyncStorageSpec, +} from "./native-module/NativeAsyncStorage"; +import { AsyncStorageError } from "./AsyncStorageError"; + +class AsyncStorageImpl implements AsyncStorage { + constructor(private readonly dbName: string) {} + + private get db(): NativeAsyncStorageSpec { + const mod = NativeAsyncStorage; + if (!mod) { + throw AsyncStorageError.jsError( + `Native module is null, cannot create db`, + AsyncStorageError.Type.NativeModuleError + ); + } + return mod; + } + + getItem = async (key: string): Promise => { + try { + const result = await this.db.getValues(this.dbName, [key]); + const value = result[0] ?? null; + return value?.value ?? null; + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; + + setItem = async (key: string, value: string): Promise => { + try { + await this.db.setValues(this.dbName, [{ key, value }]); + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; + + removeItem = async (key: string): Promise => { + try { + await this.db.removeValues(this.dbName, [key]); + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; + + getMany = async (keys: string[]): Promise> => { + try { + return await this.db.getValues(this.dbName, keys).then((entries) => + entries.reduce>((values, current) => { + values[current.key] = current.value; + return values; + }, {}) + ); + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; + + setMany = async (entries: Record): Promise => { + try { + await this.db.setValues( + this.dbName, + Object.entries(entries).map(([key, value]) => ({ key, value })) + ); + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; + + removeMany = async (keys: string[]): Promise => { + try { + await this.db.removeValues(this.dbName, keys); + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; + + getAllKeys = async (): Promise => { + try { + return await this.db.getKeys(this.dbName); + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; + + clear = async (): Promise => { + try { + return await this.db.clearStorage(this.dbName); + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; +} + +export function createAsyncStorage(databaseName: string): AsyncStorage { + return new AsyncStorageImpl(databaseName); +} diff --git a/packages/eslint-config/index.js b/packages/eslint-config/index.js index dfe0e47c..0a94a254 100644 --- a/packages/eslint-config/index.js +++ b/packages/eslint-config/index.js @@ -13,6 +13,7 @@ module.exports = [ "prettier/prettier": "error", "no-console": "error", "react/react-in-jsx-scope": "off", + "@typescript-eslint/no-explicit-any": "off", }, }, ]; From 2486865abf5652160cf1d65ec3db67cd000f2144 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Wed, 17 Sep 2025 20:18:43 +0200 Subject: [PATCH 052/110] feat(async-storage): web storage implementation --- .../async-storage/src/createAsyncStorage.ts | 48 ++++++------------- 1 file changed, 14 insertions(+), 34 deletions(-) diff --git a/packages/async-storage/src/createAsyncStorage.ts b/packages/async-storage/src/createAsyncStorage.ts index 18635ac4..23859208 100644 --- a/packages/async-storage/src/createAsyncStorage.ts +++ b/packages/async-storage/src/createAsyncStorage.ts @@ -1,28 +1,13 @@ import type { AsyncStorage } from "./AsyncStorage"; -import NativeAsyncStorage, { - type Spec as NativeAsyncStorageSpec, -} from "./native-module/NativeAsyncStorage"; import { AsyncStorageError } from "./AsyncStorageError"; -class AsyncStorageImpl implements AsyncStorage { +class AsyncStorageWebImpl implements AsyncStorage { constructor(private readonly dbName: string) {} - private get db(): NativeAsyncStorageSpec { - const mod = NativeAsyncStorage; - if (!mod) { - throw AsyncStorageError.jsError( - `Native module is null, cannot create db`, - AsyncStorageError.Type.NativeModuleError - ); - } - return mod; - } - getItem = async (key: string): Promise => { try { - const result = await this.db.getValues(this.dbName, [key]); - const value = result[0] ?? null; - return value?.value ?? null; + // todo: + return null; } catch (e) { throw AsyncStorageError.nativeError(e); } @@ -30,7 +15,7 @@ class AsyncStorageImpl implements AsyncStorage { setItem = async (key: string, value: string): Promise => { try { - await this.db.setValues(this.dbName, [{ key, value }]); + // todo } catch (e) { throw AsyncStorageError.nativeError(e); } @@ -38,7 +23,7 @@ class AsyncStorageImpl implements AsyncStorage { removeItem = async (key: string): Promise => { try { - await this.db.removeValues(this.dbName, [key]); + // todo } catch (e) { throw AsyncStorageError.nativeError(e); } @@ -46,12 +31,8 @@ class AsyncStorageImpl implements AsyncStorage { getMany = async (keys: string[]): Promise> => { try { - return await this.db.getValues(this.dbName, keys).then((entries) => - entries.reduce>((values, current) => { - values[current.key] = current.value; - return values; - }, {}) - ); + // todo + return {}; } catch (e) { throw AsyncStorageError.nativeError(e); } @@ -59,10 +40,7 @@ class AsyncStorageImpl implements AsyncStorage { setMany = async (entries: Record): Promise => { try { - await this.db.setValues( - this.dbName, - Object.entries(entries).map(([key, value]) => ({ key, value })) - ); + // todo } catch (e) { throw AsyncStorageError.nativeError(e); } @@ -70,7 +48,7 @@ class AsyncStorageImpl implements AsyncStorage { removeMany = async (keys: string[]): Promise => { try { - await this.db.removeValues(this.dbName, keys); + // todo } catch (e) { throw AsyncStorageError.nativeError(e); } @@ -78,7 +56,8 @@ class AsyncStorageImpl implements AsyncStorage { getAllKeys = async (): Promise => { try { - return await this.db.getKeys(this.dbName); + // todo + return []; } catch (e) { throw AsyncStorageError.nativeError(e); } @@ -86,7 +65,8 @@ class AsyncStorageImpl implements AsyncStorage { clear = async (): Promise => { try { - return await this.db.clearStorage(this.dbName); + // return await this.db.clearStorage(this.dbName); + // todo } catch (e) { throw AsyncStorageError.nativeError(e); } @@ -94,5 +74,5 @@ class AsyncStorageImpl implements AsyncStorage { } export function createAsyncStorage(databaseName: string): AsyncStorage { - return new AsyncStorageImpl(databaseName); + return new AsyncStorageWebImpl(databaseName); } From 56aeabcb8c47d7fe0e5291fd6700d5bf8f80f944 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Wed, 17 Sep 2025 21:29:54 +0200 Subject: [PATCH 053/110] feat(async-storage): implement web storage with idb --- package.json | 1 + packages/async-storage/package.json | 3 + .../async-storage/src/AsyncStorageError.ts | 6 ++ .../src/createAsyncStorage.native.ts | 2 +- .../async-storage/src/createAsyncStorage.ts | 62 ++++++++---- .../web-module/IndexedDBConnectionRegistry.ts | 67 +++++++++++++ .../src/web-module/IndexedDBStorage.ts | 98 +++++++++++++++++++ packages/async-storage/tsconfig.json | 2 +- .../database/StorageDatabase.kt | 2 +- yarn.lock | 8 ++ 10 files changed, 227 insertions(+), 24 deletions(-) create mode 100644 packages/async-storage/src/web-module/IndexedDBConnectionRegistry.ts create mode 100644 packages/async-storage/src/web-module/IndexedDBStorage.ts diff --git a/package.json b/package.json index e288d856..2ac37e03 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "build": "turbo run build", "build:android": "./scripts/build-native-lib.sh android", "build:apple": "./scripts/build-native-lib.sh apple", + "build:js": "yarn workspace @react-native-async-storage/async-storage build", "format": "concurrently 'yarn:format:*'", "format:c": "clang-format -i $(git ls-files '*.cpp' '*.h' '*.m' '*.mm') --style file:.config/.clang-format", "format:js": "prettier --write $(git ls-files '*.js' '*.json' '*.ts' '*.tsx' '*.yml' 'README.md')", diff --git a/packages/async-storage/package.json b/packages/async-storage/package.json index 68dcb46d..ad5bf78e 100644 --- a/packages/async-storage/package.json +++ b/packages/async-storage/package.json @@ -37,6 +37,9 @@ "!**/__mocks__", "!**/.*" ], + "dependencies": { + "idb": "8.0.3" + }, "devDependencies": { "@react-native-community/cli": "18.0.0", "@types/react": "^19.0.0", diff --git a/packages/async-storage/src/AsyncStorageError.ts b/packages/async-storage/src/AsyncStorageError.ts index 487b8264..c0e95841 100644 --- a/packages/async-storage/src/AsyncStorageError.ts +++ b/packages/async-storage/src/AsyncStorageError.ts @@ -4,6 +4,12 @@ enum AsyncStorageErrorType { */ NativeModuleError = "NativeModuleError", + /** + * Related to web storage (indexedDB) + * https://developer.mozilla.org/en-US/docs/Web/API/IDBRequest/error + */ + WebStorageError = "WebStorageError", + /** * Error thrown from Sqlite itself * https://www.sqlite.org/rescode.html diff --git a/packages/async-storage/src/createAsyncStorage.native.ts b/packages/async-storage/src/createAsyncStorage.native.ts index 18635ac4..a428966c 100644 --- a/packages/async-storage/src/createAsyncStorage.native.ts +++ b/packages/async-storage/src/createAsyncStorage.native.ts @@ -21,7 +21,7 @@ class AsyncStorageImpl implements AsyncStorage { getItem = async (key: string): Promise => { try { const result = await this.db.getValues(this.dbName, [key]); - const value = result[0] ?? null; + const value = result?.[0] ?? null; return value?.value ?? null; } catch (e) { throw AsyncStorageError.nativeError(e); diff --git a/packages/async-storage/src/createAsyncStorage.ts b/packages/async-storage/src/createAsyncStorage.ts index 23859208..83a21d42 100644 --- a/packages/async-storage/src/createAsyncStorage.ts +++ b/packages/async-storage/src/createAsyncStorage.ts @@ -1,76 +1,96 @@ import type { AsyncStorage } from "./AsyncStorage"; import { AsyncStorageError } from "./AsyncStorageError"; +import IndexedDBStorage from "./web-module/IndexedDBStorage"; class AsyncStorageWebImpl implements AsyncStorage { - constructor(private readonly dbName: string) {} + private db: IndexedDBStorage; + + constructor(dbName: string) { + this.db = new IndexedDBStorage(dbName); + } getItem = async (key: string): Promise => { try { - // todo: - return null; + const result = await this.db.getValues([key]); + const value = result?.[0] ?? null; + return value?.value ?? null; } catch (e) { - throw AsyncStorageError.nativeError(e); + throw this.createError(e); } }; setItem = async (key: string, value: string): Promise => { try { - // todo + await this.db.setValues([{ key, value }]); } catch (e) { - throw AsyncStorageError.nativeError(e); + throw this.createError(e); } }; removeItem = async (key: string): Promise => { try { - // todo + await this.db.removeValues([key]); } catch (e) { - throw AsyncStorageError.nativeError(e); + throw this.createError(e); } }; getMany = async (keys: string[]): Promise> => { try { - // todo - return {}; + return await this.db.getValues(keys).then((entries) => + entries.reduce>((values, current) => { + values[current.key] = current.value; + return values; + }, {}) + ); } catch (e) { - throw AsyncStorageError.nativeError(e); + throw this.createError(e); } }; setMany = async (entries: Record): Promise => { try { - // todo + await this.db.setValues( + Object.entries(entries).map(([key, value]) => ({ key, value })) + ); } catch (e) { - throw AsyncStorageError.nativeError(e); + throw this.createError(e); } }; removeMany = async (keys: string[]): Promise => { try { - // todo + await this.db.removeValues(keys); } catch (e) { - throw AsyncStorageError.nativeError(e); + throw this.createError(e); } }; getAllKeys = async (): Promise => { try { - // todo - return []; + return await this.db.getKeys(); } catch (e) { - throw AsyncStorageError.nativeError(e); + throw this.createError(e); } }; clear = async (): Promise => { try { - // return await this.db.clearStorage(this.dbName); - // todo + return await this.db.clearStorage(); } catch (e) { - throw AsyncStorageError.nativeError(e); + throw this.createError(e); } }; + + private createError(e: any): AsyncStorageError { + if (e instanceof AsyncStorageError) { + return e; + } + return AsyncStorageError.jsError( + e?.message ?? `Web storage error: ${e}`, + AsyncStorageError.Type.WebStorageError + ); + } } export function createAsyncStorage(databaseName: string): AsyncStorage { diff --git a/packages/async-storage/src/web-module/IndexedDBConnectionRegistry.ts b/packages/async-storage/src/web-module/IndexedDBConnectionRegistry.ts new file mode 100644 index 00000000..529d75b6 --- /dev/null +++ b/packages/async-storage/src/web-module/IndexedDBConnectionRegistry.ts @@ -0,0 +1,67 @@ +import type { DBSchema, IDBPDatabase } from "idb"; +import { openDB } from "idb"; +import { AsyncStorageError } from "../AsyncStorageError"; + +const WebStorageTableName = "entries" as const; + +export interface AsyncStorageWeb extends DBSchema { + [WebStorageTableName]: { + key: string; + value: string | null; + }; +} + +/** + * Registry to keep one IndexedDB connection per database name. + */ +class IndexedDBConnectionRegistry { + private registry: Map>> = + new Map(); + + public TableName = WebStorageTableName; + + public getOrCreate(dbName: string): Promise> { + if (this.registry.has(dbName)) { + return this.registry.get(dbName)!; + } + const db = openDB(dbName, 1, { + upgrade: (db) => { + if (!db.objectStoreNames.contains(WebStorageTableName)) { + db.createObjectStore(WebStorageTableName); + } + }, + blocked: ( + currentVersion: number, + blockedVersion: number | null, + _: IDBVersionChangeEvent + ) => { + throw AsyncStorageError.jsError( + `New version (${blockedVersion}) is blocked by current one (${currentVersion})`, + AsyncStorageError.Type.WebStorageError + ); + }, + blocking: ( + currentVersion: number, + blockedVersion: number | null, + _: IDBVersionChangeEvent + ) => { + throw AsyncStorageError.jsError( + `Current db version (${currentVersion}) is blocking upgrade to next version (${blockedVersion})`, + AsyncStorageError.Type.WebStorageError + ); + }, + }); + + this.registry.set(dbName, db); + + // in case of error while opening, clear the storage to retry + db.catch((err) => { + this.registry.delete(dbName); + throw err; + }); + + return db; + } +} + +export default new IndexedDBConnectionRegistry(); diff --git a/packages/async-storage/src/web-module/IndexedDBStorage.ts b/packages/async-storage/src/web-module/IndexedDBStorage.ts new file mode 100644 index 00000000..8287e3ad --- /dev/null +++ b/packages/async-storage/src/web-module/IndexedDBStorage.ts @@ -0,0 +1,98 @@ +import { AsyncStorageError } from "../AsyncStorageError"; +import registry from "./IndexedDBConnectionRegistry"; + +class IndexedDBStorage { + constructor(private dbName: string) {} + + getValues = async ( + keys: string[] + ): Promise<{ key: string; value: string | null }[]> => { + try { + const db = await this.db(); + const tx = db.transaction(registry.TableName, "readonly"); + const store = tx.objectStore(registry.TableName); + + const result = await Promise.all( + keys.map(async (key) => { + const entry = await store.get(key); + return { key, value: entry || null }; + }) + ); + + await tx.done; + return result; + } catch (e: any) { + throw this.createError(e); + } + }; + + setValues = async ( + values: { key: string; value: string | null }[] + ): Promise<{ key: string; value: string | null }[]> => { + try { + const db = await this.db(); + const tx = db.transaction(registry.TableName, "readwrite"); + const store = tx.objectStore(registry.TableName); + + const result = await Promise.all( + values.map(async (entry) => { + await store.put(entry.value, entry.key); + return { key: entry.key, value: entry.value }; + }) + ); + + await tx.done; + return result; + } catch (e: any) { + throw this.createError(e); + } + }; + + removeValues = async (keys: string[]): Promise => { + try { + const db = await this.db(); + const tx = db.transaction(registry.TableName, "readwrite"); + const store = tx.objectStore(registry.TableName); + + await Promise.all( + keys.map(async (key) => { + await store.delete(key); + }) + ); + } catch (e: any) { + throw this.createError(e); + } + }; + + clearStorage = async (): Promise => { + try { + const db = await this.db(); + await db.clear(registry.TableName); + } catch (e: any) { + throw this.createError(e); + } + }; + + getKeys = async (): Promise => { + try { + const db = await this.db(); + return await db.getAllKeys(registry.TableName); + } catch (e: any) { + throw this.createError(e); + } + }; + + private db = () => registry.getOrCreate(this.dbName); + + private createError(e: any): AsyncStorageError { + if (e instanceof AsyncStorageError) { + return e; + } + return AsyncStorageError.jsError( + e?.message ?? `IndexedDB error: ${e}`, + AsyncStorageError.Type.WebStorageError + ); + } +} + +export default IndexedDBStorage; diff --git a/packages/async-storage/tsconfig.json b/packages/async-storage/tsconfig.json index 9e3b1fe5..9944b0df 100644 --- a/packages/async-storage/tsconfig.json +++ b/packages/async-storage/tsconfig.json @@ -7,7 +7,7 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "jsx": "react-jsx", - "lib": ["ESNext"], + "lib": ["ESNext", "dom"], "module": "ESNext", "moduleResolution": "bundler", "noEmit": false, diff --git a/shared-storage/src/commonMain/kotlin/org/asyncstorage/shared_storage/database/StorageDatabase.kt b/shared-storage/src/commonMain/kotlin/org/asyncstorage/shared_storage/database/StorageDatabase.kt index 5577162d..9e149285 100644 --- a/shared-storage/src/commonMain/kotlin/org/asyncstorage/shared_storage/database/StorageDatabase.kt +++ b/shared-storage/src/commonMain/kotlin/org/asyncstorage/shared_storage/database/StorageDatabase.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.flow.Flow private const val DATABASE_VERSION = 1 -@Entity(tableName = "storage") +@Entity(tableName = "entries") internal data class StorageEntry(@PrimaryKey val key: String, val value: String?) @Dao diff --git a/yarn.lock b/yarn.lock index 3cd44c39..e8b7b212 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3850,6 +3850,7 @@ __metadata: "@types/react": "npm:^19.0.0" del-cli: "npm:^5.1.0" eslint: "npm:9.34.0" + idb: "npm:8.0.3" prettier: "npm:3.6.2" react: "npm:19.0.0" react-native: "npm:0.79.6" @@ -11739,6 +11740,13 @@ __metadata: languageName: node linkType: hard +"idb@npm:8.0.3": + version: 8.0.3 + resolution: "idb@npm:8.0.3" + checksum: 10c0/421cd9a3281b7564528857031cc33fd9e95753f8191e483054cb25d1ceea7303a0d1462f4f69f5b41606f0f066156999e067478abf2460dfcf9cab80dae2a2b2 + languageName: node + linkType: hard + "ieee754@npm:^1.1.13": version: 1.2.1 resolution: "ieee754@npm:1.2.1" From 24a332b8410b1dc9c799364c9d6b9f5315330cb1 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Wed, 17 Sep 2025 21:56:25 +0200 Subject: [PATCH 054/110] chore: ignore example-web --- .changeset/config.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.changeset/config.json b/.changeset/config.json index 01656df0..f1f85456 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -10,6 +10,7 @@ "ignore": [ "@react-native-async-storage/eslint-config", "async-storage-website", - "example-react-native" + "example-react-native", + "example-web" ] } From de581ac9a281ec1673dac1f1da2bb83ed8a65ef5 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Thu, 18 Sep 2025 09:39:07 +0200 Subject: [PATCH 055/110] fix(shared-storage): update dao after renaming --- .../1.json | 6 +++--- .../shared_storage/database/StorageDatabase.kt | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/shared-storage/schemas/org.asyncstorage.shared_storage.database.StorageDatabase/1.json b/shared-storage/schemas/org.asyncstorage.shared_storage.database.StorageDatabase/1.json index d9f27c26..109935b2 100644 --- a/shared-storage/schemas/org.asyncstorage.shared_storage.database.StorageDatabase/1.json +++ b/shared-storage/schemas/org.asyncstorage.shared_storage.database.StorageDatabase/1.json @@ -2,10 +2,10 @@ "formatVersion": 1, "database": { "version": 1, - "identityHash": "4d8baac8b3ec8e6bbde4d79eb33fbcd9", + "identityHash": "33b0559bdc8fe1befd1a1927fc3f3caa", "entities": [ { - "tableName": "storage", + "tableName": "entries", "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `value` TEXT, PRIMARY KEY(`key`))", "fields": [ { @@ -30,7 +30,7 @@ ], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4d8baac8b3ec8e6bbde4d79eb33fbcd9')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '33b0559bdc8fe1befd1a1927fc3f3caa')" ] } } \ No newline at end of file diff --git a/shared-storage/src/commonMain/kotlin/org/asyncstorage/shared_storage/database/StorageDatabase.kt b/shared-storage/src/commonMain/kotlin/org/asyncstorage/shared_storage/database/StorageDatabase.kt index 9e149285..0149dbac 100644 --- a/shared-storage/src/commonMain/kotlin/org/asyncstorage/shared_storage/database/StorageDatabase.kt +++ b/shared-storage/src/commonMain/kotlin/org/asyncstorage/shared_storage/database/StorageDatabase.kt @@ -11,10 +11,10 @@ internal data class StorageEntry(@PrimaryKey val key: String, val value: String? @Dao internal interface StorageDao { - @Query("SELECT * FROM storage WHERE `key` IN (:keys)") + @Query("SELECT * FROM entries WHERE `key` IN (:keys)") suspend fun getValues(keys: List): List - @Query("SELECT * FROM storage WHERE `key` IN (:keys)") + @Query("SELECT * FROM entries WHERE `key` IN (:keys)") fun getValuesFlow(keys: List): Flow> @Transaction @@ -28,14 +28,14 @@ internal interface StorageDao { } @Transaction - @Query("DELETE FROM storage WHERE `key` in (:keys)") + @Query("DELETE FROM entries WHERE `key` in (:keys)") suspend fun removeValues(keys: List) - @Query("SELECT `key` FROM storage") suspend fun getKeys(): List + @Query("SELECT `key` FROM entries") suspend fun getKeys(): List - @Query("SELECT `key` FROM storage") fun getKeysFlow(): Flow> + @Query("SELECT `key` FROM entries") fun getKeysFlow(): Flow> - @Transaction @Query("DELETE FROM storage") suspend fun clear() + @Transaction @Query("DELETE FROM entries") suspend fun clear() } @Database(entities = [StorageEntry::class], version = DATABASE_VERSION, exportSchema = true) From 3bbbbc7898257bea57e1f5247c6f72c986982632 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Thu, 18 Sep 2025 11:00:02 +0200 Subject: [PATCH 056/110] feat(async-storage): legacy storage for android, example updated --- examples/example-react-native/App.tsx | 61 ++++- .../src/LegacyBasicCrud.tsx | 82 ++++++ packages/async-storage/android/build.gradle | 24 +- .../async-storage/android/gradle.properties | 6 +- .../legacy_storage/LegacyStorageModule.kt | 89 +++++++ .../legacy_storage/LegacyStorageSupplier.kt | 240 ++++++++++++++++++ .../org/asyncstorage/AsyncStorageModule.kt | 27 ++ .../asyncstorage/AsyncStorageModule.kt | 51 +++- .../async-storage/src/AsyncStorageError.ts | 33 ++- .../src/createAsyncStorage.native.ts | 96 ++++++- .../async-storage/src/createAsyncStorage.ts | 4 + packages/async-storage/src/index.tsx | 6 +- .../src/native-module/NativeAsyncStorage.ts | 11 + 13 files changed, 680 insertions(+), 50 deletions(-) create mode 100644 examples/example-react-native/src/LegacyBasicCrud.tsx create mode 100644 packages/async-storage/android/src/main/kotlin/org/asyncstorage/legacy_storage/LegacyStorageModule.kt create mode 100644 packages/async-storage/android/src/main/kotlin/org/asyncstorage/legacy_storage/LegacyStorageSupplier.kt diff --git a/examples/example-react-native/App.tsx b/examples/example-react-native/App.tsx index 839f831b..83f0398d 100644 --- a/examples/example-react-native/App.tsx +++ b/examples/example-react-native/App.tsx @@ -1,22 +1,55 @@ -/** - * Sample React Native App - * https://github.com/facebook/react-native - * - * @format - */ - -import React from "react"; -import { StatusBar, useColorScheme, View } from "react-native"; -import GetSetClear from "./src/BasicCrud"; +import React, { useState } from "react"; +import { + Button, + SafeAreaView, + StatusBar, + useColorScheme, + View, +} from "react-native"; +import BasicCrud from "./src/BasicCrud"; +import LegacyBasicCrud from "./src/LegacyBasicCrud"; function App(): React.JSX.Element { const isDarkMode = useColorScheme() === "dark"; + const [example, setExample] = useState<"basic" | "legacy-basic">("basic"); return ( - - - - + + + + + + + ); +}; + +createRoot(document.getElementById("root")!).render( + + + +); diff --git a/examples/example-web/src/BasicCrud.tsx b/examples/example-web/src/BasicCrud.tsx deleted file mode 100644 index 6038e5bc..00000000 --- a/examples/example-web/src/BasicCrud.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import type { FC } from "react"; -import { useState } from "react"; -import { createAsyncStorage } from "@react-native-async-storage/async-storage"; -import React from "react"; - -const STORAGE_KEY = "testing"; - -const BasicCrud: FC = () => { - const [storedNumber, setStoredNumber] = useState(null); - const [storage] = useState(() => createAsyncStorage("test-web")); - - function reportError(e: unknown) { - alert(JSON.stringify(e, null, 2)); - } - - async function readCurrent() { - try { - const value = await storage.getItem(STORAGE_KEY); - setStoredNumber(value ? Number(value) : null); - } catch (e: any) { - reportError(e); - } - } - - const increaseByTen = async () => { - const newNumber = (storedNumber ?? 0) + 10; - - try { - await storage.setItem(STORAGE_KEY, `${newNumber}`); - setStoredNumber(newNumber); - await readCurrent(); - } catch (e) { - reportError(e); - } - }; - - const removeItem = async () => { - await storage.removeItem(STORAGE_KEY).catch(reportError); - await readCurrent(); - }; - - const listAllKeys = async () => { - try { - const keys = await storage.getAllKeys(); - alert("keys: " + keys.join(", ")); - } catch (e) { - reportError(e); - } - }; - - React.useEffect(() => { - readCurrent(); - }, [storage]); - - return ( -
-

Currently stored:

-

{storedNumber}

- - - -
- ); -}; - -export default BasicCrud; diff --git a/examples/example-web/src/WithAsyncStorage.tsx b/examples/example-web/src/WithAsyncStorage.tsx new file mode 100644 index 00000000..a3da2047 --- /dev/null +++ b/examples/example-web/src/WithAsyncStorage.tsx @@ -0,0 +1,17 @@ +import type { AsyncStorage } from "@react-native-async-storage/async-storage"; +import { createAsyncStorage } from "@react-native-async-storage/async-storage"; +import type React from "react"; +import { useState } from "react"; + +type Props = { + dbName: string; + TestComponent: React.FC<{ storage: AsyncStorage }>; +}; + +const WithAsyncStorage: React.FC = ({ TestComponent, dbName }) => { + const [storage] = useState(() => createAsyncStorage(dbName)); + + return ; +}; + +export default WithAsyncStorage; diff --git a/examples/example-web/src/WithLegacyStorage.tsx b/examples/example-web/src/WithLegacyStorage.tsx new file mode 100644 index 00000000..8b6acc48 --- /dev/null +++ b/examples/example-web/src/WithLegacyStorage.tsx @@ -0,0 +1,13 @@ +import type { AsyncStorage } from "@react-native-async-storage/async-storage"; +import LegacyAsyncStorage from "@react-native-async-storage/async-storage"; +import type React from "react"; + +type Props = { + TestComponent: React.FC<{ storage: AsyncStorage }>; +}; + +const WithLegacyStorage: React.FC = ({ TestComponent }) => { + return ; +}; + +export default WithLegacyStorage; diff --git a/examples/example-web/src/index.css b/examples/example-web/src/index.css deleted file mode 100644 index 08a3ac9e..00000000 --- a/examples/example-web/src/index.css +++ /dev/null @@ -1,68 +0,0 @@ -:root { - font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/examples/example-web/src/main.tsx b/examples/example-web/src/main.tsx deleted file mode 100644 index 10ed13e0..00000000 --- a/examples/example-web/src/main.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { StrictMode } from "react"; -import { createRoot } from "react-dom/client"; -import "./index.css"; -import App from "./App.tsx"; - -createRoot(document.getElementById("root")!).render( - - - -); diff --git a/examples/example-web/src/style.css b/examples/example-web/src/style.css new file mode 100644 index 00000000..f1d8c73c --- /dev/null +++ b/examples/example-web/src/style.css @@ -0,0 +1 @@ +@import "tailwindcss"; diff --git a/examples/example-web/src/tests/BasicTests.tsx b/examples/example-web/src/tests/BasicTests.tsx new file mode 100644 index 00000000..3ccfa976 --- /dev/null +++ b/examples/example-web/src/tests/BasicTests.tsx @@ -0,0 +1,130 @@ +import type { AsyncStorage } from "@react-native-async-storage/async-storage"; +import React, { useState } from "react"; + +type Props = { + storage: AsyncStorage; +}; + +const BasicTests: React.FC = ({ storage }) => { + const [logs, setLogs] = useState([]); + + function addLog(...text: any[]) { + const message = text + .map((t) => { + if (typeof t !== "string") { + return JSON.stringify(t, null, 2); + } + return t; + }) + .join(" "); + + setLogs((l) => [...l, message]); + } + + function clearLog() { + setLogs([]); + } + + function reportError(e: any) { + alert(JSON.stringify(e, null, 2)); + } + + const testSingleSetCrudKey = async () => { + try { + const key = "single-set"; + let value = `value-${Math.round(Math.random() * 1000)}`; + + addLog(`setting ${key} with value ${value}`); + await storage.setItem(key, value); + addLog(`stored ${key} value:`, await storage.getItem(key)); + + let keysToFetch = [key, "missing-key-1", "missing-key-2"]; + addLog( + `fetching keys (${keysToFetch}): `, + await storage.getMany(keysToFetch) + ); + + addLog(`removing ${key}`); + await storage.removeItem(key); + addLog(`current ${key} value:`, await storage.getItem(key)); + + value = `value-${Math.round(Math.random() * 1000)}`; + addLog(`Saving new ${key} value: ${value}`); + await storage.setItem(key, value); + addLog(`current ${key} value:`, await storage.getItem(key)); + + value = `value-${Math.round(Math.random() * 1000)}`; + addLog(`Overriding n ${key} value: ${value}`); + await storage.setItem(key, value); + addLog(`current ${key} value:`, await storage.getItem(key)); + + keysToFetch = [key, "missing-key-1", "missing-key-2"]; + addLog( + `fetching keys (${keysToFetch}): `, + await storage.getMany(keysToFetch) + ); + } catch (e) { + reportError(e); + } + }; + + const testMultiKey = async () => { + try { + const entries = { key1: "value1", key2: "42", key3: "true" }; + addLog("MultiSet test with entries:", entries); + await storage.setMany(entries); + addLog("fetching keys", ["key1", "key2", "key3", "missing"]); + const values = await storage.getMany(["key1", "key2", "key3", "missing"]); + addLog("result", values); + + addLog("removing key1 and key2"); + await storage.removeMany(["key1", "key2"]); + const remainingKeys = await storage.getAllKeys(); + addLog("remaining keys after removing:", remainingKeys); + + const final = await storage.getMany(remainingKeys); + addLog("get many remaining keys:", final); + } catch (e) { + reportError(e); + } + }; + + return ( +
+
+ + + +
+ +
+ +
+ +
+ {logs.map((l, i) => ( +

+ {l} +

+ ))} +
+
+ ); +}; + +export default BasicTests; diff --git a/examples/example-web/vite.config.ts b/examples/example-web/vite.config.ts index 0e43ae8d..5b2578eb 100644 --- a/examples/example-web/vite.config.ts +++ b/examples/example-web/vite.config.ts @@ -1,7 +1,8 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; +import tailwindcss from '@tailwindcss/vite' // https://vite.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [react(), tailwindcss()], }); diff --git a/packages/async-storage/apple/storage/PersistentStorage.swift b/packages/async-storage/apple/storage/PersistentStorage.swift index e5d9057b..348c7167 100644 --- a/packages/async-storage/apple/storage/PersistentStorage.swift +++ b/packages/async-storage/apple/storage/PersistentStorage.swift @@ -1,10 +1,7 @@ import React import SharedAsyncStorage -/** - TODO: - - handle exceptions - */ + @objc public class PersistentStorage: NSObject { private let db: SharedStorage diff --git a/packages/async-storage/src/createAsyncStorage.native.ts b/packages/async-storage/src/createAsyncStorage.native.ts index 4f44b0ff..92572d4f 100644 --- a/packages/async-storage/src/createAsyncStorage.native.ts +++ b/packages/async-storage/src/createAsyncStorage.native.ts @@ -102,10 +102,14 @@ class AsyncStorageImpl implements AsyncStorage { * Usage is highly discouraged and should be used only as a measure to transition v3. */ export function getLegacyStorage(): AsyncStorage { - return new LegacyAsyncStorageImpl(); + return LegacyAsyncStorageImpl.instance; } class LegacyAsyncStorageImpl implements AsyncStorage { + private constructor() {} + + static instance = new LegacyAsyncStorageImpl(); + private get db(): NativeAsyncStorageSpec { const mod = NativeAsyncStorage; if (!mod) { diff --git a/packages/async-storage/src/createAsyncStorage.ts b/packages/async-storage/src/createAsyncStorage.ts index 17bbf209..8c69e446 100644 --- a/packages/async-storage/src/createAsyncStorage.ts +++ b/packages/async-storage/src/createAsyncStorage.ts @@ -98,5 +98,53 @@ export function createAsyncStorage(databaseName: string): AsyncStorage { } export function getLegacyStorage(): AsyncStorage { - throw new Error("todo"); + return LegacyAsyncStorageWebImpl.instance; +} + +class LegacyAsyncStorageWebImpl implements AsyncStorage { + private constructor() {} + static instance = new LegacyAsyncStorageWebImpl(); + + private get storage() { + return window.localStorage; + } + + getItem = async (key: string): Promise => { + return this.storage.getItem(key) ?? null; + }; + + setItem = async (key: string, value: string): Promise => { + this.storage.setItem(key, value); + }; + + removeItem = async (key: string): Promise => { + this.storage.removeItem(key); + }; + + getMany = async (keys: string[]): Promise> => { + return keys.reduce>((entries, current) => { + entries[current] = this.storage.getItem(current) ?? null; + return entries; + }, {}); + }; + + setMany = async (entries: Record): Promise => { + Object.entries(entries).forEach(([key, value]) => { + this.storage.setItem(key, value); + }); + }; + + removeMany = async (keys: string[]): Promise => { + keys.forEach((key) => { + this.storage.removeItem(key); + }); + }; + + getAllKeys = async (): Promise => { + return Object.keys(this.storage); + }; + + clear = async (): Promise => { + this.storage.clear(); + }; } diff --git a/yarn.lock b/yarn.lock index 0fba818e..0dc5f4b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2907,6 +2907,34 @@ __metadata: languageName: node linkType: hard +"@emnapi/core@npm:^1.4.3, @emnapi/core@npm:^1.4.5": + version: 1.5.0 + resolution: "@emnapi/core@npm:1.5.0" + dependencies: + "@emnapi/wasi-threads": "npm:1.1.0" + tslib: "npm:^2.4.0" + checksum: 10c0/52ba3485277706d92fa27d92b37e5b4f6ef0742c03ed68f8096f294c6bfa30f0752c82d4c2bfa14bff4dc30d63c9f71a8f9fb64a92743d00807d9e468fafd5ff + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.4.3, @emnapi/runtime@npm:^1.4.5": + version: 1.5.0 + resolution: "@emnapi/runtime@npm:1.5.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/a85c9fc4e3af49cbe41e5437e5be2551392a931910cd0a5b5d3572532786927810c9cc1db11b232ec8f9657b33d4e6f7c4f985f1a052917d7cd703b5b2a20faa + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.1.0, @emnapi/wasi-threads@npm:^1.0.4": + version: 1.1.0 + resolution: "@emnapi/wasi-threads@npm:1.1.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/e6d54bf2b1e64cdd83d2916411e44e579b6ae35d5def0dea61a3c452d9921373044dff32a8b8473ae60c80692bdc39323e98b96a3f3d87ba6886b24dd0ef7ca1 + languageName: node + linkType: hard + "@esbuild/aix-ppc64@npm:0.25.9": version: 0.25.9 resolution: "@esbuild/aix-ppc64@npm:0.25.9" @@ -3254,6 +3282,15 @@ __metadata: languageName: node linkType: hard +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + "@isaacs/ttlcache@npm:^1.4.1": version: 1.4.1 resolution: "@isaacs/ttlcache@npm:1.4.1" @@ -3554,7 +3591,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/remapping@npm:^2.3.5": +"@jridgewell/remapping@npm:^2.3.4, @jridgewell/remapping@npm:^2.3.5": version: 2.3.5 resolution: "@jridgewell/remapping@npm:2.3.5" dependencies: @@ -3595,7 +3632,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.5.0": +"@jridgewell/sourcemap-codec@npm:^1.5.0, @jridgewell/sourcemap-codec@npm:^1.5.5": version: 1.5.5 resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 @@ -3756,6 +3793,17 @@ __metadata: languageName: node linkType: hard +"@napi-rs/wasm-runtime@npm:^0.2.12": + version: 0.2.12 + resolution: "@napi-rs/wasm-runtime@npm:0.2.12" + dependencies: + "@emnapi/core": "npm:^1.4.3" + "@emnapi/runtime": "npm:^1.4.3" + "@tybys/wasm-util": "npm:^0.10.0" + checksum: 10c0/6d07922c0613aab30c6a497f4df297ca7c54e5b480e00035e0209b872d5c6aab7162fc49477267556109c2c7ed1eb9c65a174e27e9b87568106a87b0a6e3ca7d + languageName: node + linkType: hard + "@nevware21/ts-async@npm:>= 0.5.2 < 2.x": version: 0.5.3 resolution: "@nevware21/ts-async@npm:0.5.3" @@ -5193,6 +5241,172 @@ __metadata: languageName: node linkType: hard +"@tailwindcss/node@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/node@npm:4.1.13" + dependencies: + "@jridgewell/remapping": "npm:^2.3.4" + enhanced-resolve: "npm:^5.18.3" + jiti: "npm:^2.5.1" + lightningcss: "npm:1.30.1" + magic-string: "npm:^0.30.18" + source-map-js: "npm:^1.2.1" + tailwindcss: "npm:4.1.13" + checksum: 10c0/969b2eaefced271655fdf53a07737103736115c6b55fa1559c78147d17871da988c165ab2236bf4da8cdbde1e50a5116b8df2225e20f63de981d43da5b69e3f1 + languageName: node + linkType: hard + +"@tailwindcss/oxide-android-arm64@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.13" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-darwin-arm64@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.13" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-darwin-x64@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.13" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-freebsd-x64@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.13" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.13" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.13" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.13" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-x64-gnu@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.1.13" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-x64-musl@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.1.13" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@tailwindcss/oxide-wasm32-wasi@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.1.13" + dependencies: + "@emnapi/core": "npm:^1.4.5" + "@emnapi/runtime": "npm:^1.4.5" + "@emnapi/wasi-threads": "npm:^1.0.4" + "@napi-rs/wasm-runtime": "npm:^0.2.12" + "@tybys/wasm-util": "npm:^0.10.0" + tslib: "npm:^2.8.0" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.13" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-win32-x64-msvc@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.1.13" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide@npm:4.1.13" + dependencies: + "@tailwindcss/oxide-android-arm64": "npm:4.1.13" + "@tailwindcss/oxide-darwin-arm64": "npm:4.1.13" + "@tailwindcss/oxide-darwin-x64": "npm:4.1.13" + "@tailwindcss/oxide-freebsd-x64": "npm:4.1.13" + "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.1.13" + "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.1.13" + "@tailwindcss/oxide-linux-arm64-musl": "npm:4.1.13" + "@tailwindcss/oxide-linux-x64-gnu": "npm:4.1.13" + "@tailwindcss/oxide-linux-x64-musl": "npm:4.1.13" + "@tailwindcss/oxide-wasm32-wasi": "npm:4.1.13" + "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.1.13" + "@tailwindcss/oxide-win32-x64-msvc": "npm:4.1.13" + detect-libc: "npm:^2.0.4" + tar: "npm:^7.4.3" + dependenciesMeta: + "@tailwindcss/oxide-android-arm64": + optional: true + "@tailwindcss/oxide-darwin-arm64": + optional: true + "@tailwindcss/oxide-darwin-x64": + optional: true + "@tailwindcss/oxide-freebsd-x64": + optional: true + "@tailwindcss/oxide-linux-arm-gnueabihf": + optional: true + "@tailwindcss/oxide-linux-arm64-gnu": + optional: true + "@tailwindcss/oxide-linux-arm64-musl": + optional: true + "@tailwindcss/oxide-linux-x64-gnu": + optional: true + "@tailwindcss/oxide-linux-x64-musl": + optional: true + "@tailwindcss/oxide-wasm32-wasi": + optional: true + "@tailwindcss/oxide-win32-arm64-msvc": + optional: true + "@tailwindcss/oxide-win32-x64-msvc": + optional: true + checksum: 10c0/7cc64827b0c854724a3b371a7f1484535db5cca9f53dda359631bce9c42b043f2822db6c5359f7ed9f1c8adbc48ecb52c414454f9330ffd25a9a679686d2a83e + languageName: node + linkType: hard + +"@tailwindcss/vite@npm:^4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/vite@npm:4.1.13" + dependencies: + "@tailwindcss/node": "npm:4.1.13" + "@tailwindcss/oxide": "npm:4.1.13" + tailwindcss: "npm:4.1.13" + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + checksum: 10c0/4e9b1d54a64655b775f26816a7be52236d4716a35f88af6b835fcb4f7f466db3c9cbb6c052e5550a97b3e5cff821f337cd6d9ddefd480e71db21a2844719b20e + languageName: node + linkType: hard + "@tootallnate/once@npm:2": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" @@ -5207,6 +5421,15 @@ __metadata: languageName: node linkType: hard +"@tybys/wasm-util@npm:^0.10.0": + version: 0.10.1 + resolution: "@tybys/wasm-util@npm:0.10.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/b255094f293794c6d2289300c5fbcafbb5532a3aed3a5ffd2f8dc1828e639b88d75f6a376dd8f94347a44813fd7a7149d8463477a9a49525c8b2dcaa38c2d1e8 + languageName: node + linkType: hard + "@types/babel__core@npm:^7.1.14": version: 7.20.1 resolution: "@types/babel__core@npm:7.20.1" @@ -7632,6 +7855,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + "chrome-launcher@npm:^0.15.2": version: 0.15.2 resolution: "chrome-launcher@npm:0.15.2" @@ -8857,6 +9087,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.3, detect-libc@npm:^2.0.4": + version: 2.1.0 + resolution: "detect-libc@npm:2.1.0" + checksum: 10c0/4d0d36c77fdcb1d3221779d8dfc7d5808dd52530d49db67193fb3cd8149e2d499a1eeb87bb830ad7c442294929992c12e971f88ae492965549f8f83e5336eba6 + languageName: node + linkType: hard + "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -9202,6 +9439,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.18.3": + version: 5.18.3 + resolution: "enhanced-resolve@npm:5.18.3" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10c0/d413c23c2d494e4c1c9c9ac7d60b812083dc6d446699ed495e69c920988af0a3c66bf3f8d0e7a45cb1686c2d4c1df9f4e7352d973f5b56fe63d8d711dd0ccc54 + languageName: node + linkType: hard + "enquirer@npm:^2.3.0": version: 2.4.1 resolution: "enquirer@npm:2.4.1" @@ -10017,12 +10264,14 @@ __metadata: dependencies: "@react-native-async-storage/async-storage": "workspace:*" "@react-native-async-storage/eslint-config": "workspace:*" + "@tailwindcss/vite": "npm:^4.1.13" "@types/react": "npm:19.1.10" "@types/react-dom": "npm:19.1.7" "@vitejs/plugin-react": "npm:5.0.0" eslint: "npm:9.34.0" react: "npm:19.1.1" react-dom: "npm:19.1.1" + tailwindcss: "npm:^4.1.13" typescript: "npm:5.9.2" vite: "npm:7.1.5" languageName: unknown @@ -13263,6 +13512,15 @@ __metadata: languageName: node linkType: hard +"jiti@npm:^2.5.1": + version: 2.5.1 + resolution: "jiti@npm:2.5.1" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10c0/f0a38d7d8842cb35ffe883038166aa2d52ffd21f1a4fc839ae4076ea7301c22a1f11373f8fc52e2667de7acde8f3e092835620dd6f72a0fbe9296b268b0874bb + languageName: node + linkType: hard + "joi@npm:^17.2.1, joi@npm:^17.6.0": version: 17.9.2 resolution: "joi@npm:17.9.2" @@ -13519,6 +13777,116 @@ __metadata: languageName: node linkType: hard +"lightningcss-darwin-arm64@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-darwin-arm64@npm:1.30.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-x64@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-darwin-x64@npm:1.30.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-freebsd-x64@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-freebsd-x64@npm:1.30.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-linux-arm-gnueabihf@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.30.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"lightningcss-linux-arm64-gnu@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-linux-arm64-gnu@npm:1.30.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-arm64-musl@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-linux-arm64-musl@npm:1.30.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-linux-x64-gnu@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-linux-x64-gnu@npm:1.30.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-x64-musl@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-linux-x64-musl@npm:1.30.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-win32-arm64-msvc@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-win32-arm64-msvc@npm:1.30.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-win32-x64-msvc@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-win32-x64-msvc@npm:1.30.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"lightningcss@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss@npm:1.30.1" + dependencies: + detect-libc: "npm:^2.0.3" + lightningcss-darwin-arm64: "npm:1.30.1" + lightningcss-darwin-x64: "npm:1.30.1" + lightningcss-freebsd-x64: "npm:1.30.1" + lightningcss-linux-arm-gnueabihf: "npm:1.30.1" + lightningcss-linux-arm64-gnu: "npm:1.30.1" + lightningcss-linux-arm64-musl: "npm:1.30.1" + lightningcss-linux-x64-gnu: "npm:1.30.1" + lightningcss-linux-x64-musl: "npm:1.30.1" + lightningcss-win32-arm64-msvc: "npm:1.30.1" + lightningcss-win32-x64-msvc: "npm:1.30.1" + dependenciesMeta: + lightningcss-darwin-arm64: + optional: true + lightningcss-darwin-x64: + optional: true + lightningcss-freebsd-x64: + optional: true + lightningcss-linux-arm-gnueabihf: + optional: true + lightningcss-linux-arm64-gnu: + optional: true + lightningcss-linux-arm64-musl: + optional: true + lightningcss-linux-x64-gnu: + optional: true + lightningcss-linux-x64-musl: + optional: true + lightningcss-win32-arm64-msvc: + optional: true + lightningcss-win32-x64-msvc: + optional: true + checksum: 10c0/1e1ad908f3c68bf39d964a6735435a8dd5474fb2765076732d64a7b6aa2af1f084da65a9462443a9adfebf7dcfb02fb532fce1d78697f2a9de29c8f40f09aee3 + languageName: node + linkType: hard + "lilconfig@npm:^2.0.3": version: 2.1.0 resolution: "lilconfig@npm:2.1.0" @@ -13788,6 +14156,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.18": + version: 0.30.19 + resolution: "magic-string@npm:0.30.19" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + checksum: 10c0/db23fd2e2ee98a1aeb88a4cdb2353137fcf05819b883c856dd79e4c7dfb25151e2a5a4d5dbd88add5e30ed8ae5c51bcf4accbc6becb75249d924ec7b4fbcae27 + languageName: node + linkType: hard + "make-dir@npm:^3.0.0, make-dir@npm:^3.0.2, make-dir@npm:^3.1.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" @@ -14488,6 +14865,13 @@ __metadata: languageName: node linkType: hard +"minipass@npm:^7.0.4, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 + languageName: node + linkType: hard + "minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": version: 2.1.2 resolution: "minizlib@npm:2.1.2" @@ -14498,6 +14882,15 @@ __metadata: languageName: node linkType: hard +"minizlib@npm:^3.0.1": + version: 3.0.2 + resolution: "minizlib@npm:3.0.2" + dependencies: + minipass: "npm:^7.1.2" + checksum: 10c0/9f3bd35e41d40d02469cb30470c55ccc21cae0db40e08d1d0b1dff01cc8cc89a6f78e9c5d2b7c844e485ec0a8abc2238111213fdc5b2038e6d1012eacf316f78 + languageName: node + linkType: hard + "mkdirp@npm:0.3.0": version: 0.3.0 resolution: "mkdirp@npm:0.3.0" @@ -14525,6 +14918,15 @@ __metadata: languageName: node linkType: hard +"mkdirp@npm:^3.0.1": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" + bin: + mkdirp: dist/cjs/src/bin.js + checksum: 10c0/9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d + languageName: node + linkType: hard + "mri@npm:^1.2.0": version: 1.2.0 resolution: "mri@npm:1.2.0" @@ -18780,6 +19182,13 @@ __metadata: languageName: node linkType: hard +"tailwindcss@npm:4.1.13, tailwindcss@npm:^4.1.13": + version: 4.1.13 + resolution: "tailwindcss@npm:4.1.13" + checksum: 10c0/2b80b4b11463818fd16063b7cc13fd0f6e18d7e3c3e54bbdc98742981be807884addb1dd657bc6816cb4085197b7d583f5064f619e1039a54221ffa36b7ed4c0 + languageName: node + linkType: hard + "tapable@npm:^1.0.0": version: 1.1.3 resolution: "tapable@npm:1.1.3" @@ -18808,6 +19217,20 @@ __metadata: languageName: node linkType: hard +"tar@npm:^7.4.3": + version: 7.4.3 + resolution: "tar@npm:7.4.3" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.0.1" + mkdirp: "npm:^3.0.1" + yallist: "npm:^5.0.0" + checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d + languageName: node + linkType: hard + "term-size@npm:^2.1.0": version: 2.2.1 resolution: "term-size@npm:2.2.1" @@ -19039,6 +19462,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.8.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 + languageName: node + linkType: hard + "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" @@ -20478,6 +20908,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + "yaml@npm:^1.10.0, yaml@npm:^1.10.2, yaml@npm:^1.7.2": version: 1.10.2 resolution: "yaml@npm:1.10.2" From 1909e12ead0ff6a6902b8df291aeb7e2a48dc6c7 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Sat, 20 Sep 2025 01:27:06 +0200 Subject: [PATCH 063/110] test: saving big data --- .../src/tests/BasicTests.tsx | 20 ++++++++++++++++ examples/example-web/src/tests/BasicTests.tsx | 24 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/examples/example-react-native/src/tests/BasicTests.tsx b/examples/example-react-native/src/tests/BasicTests.tsx index 905f3313..68f86f72 100644 --- a/examples/example-react-native/src/tests/BasicTests.tsx +++ b/examples/example-react-native/src/tests/BasicTests.tsx @@ -90,6 +90,25 @@ const BasicTests: React.FC = ({ storage }) => { } }; + const saveBigData = async () => { + try { + const key = "big-data"; + const data = JSON.stringify( + new Array(500_000).fill("a") + ); + addLog(`Saving ${key} with data size ${data.length}`); + const timeNow = +Date.now(); + await storage.setItem(key, data); + addLog(`saving took ${+Date.now() - timeNow}ms`); + + addLog(`reading ${key}`); + const res = await storage.getItem(key); + addLog(`size of result: ${res?.length}`); + } catch (e) { + reportError(e); + } + }; + return ( @@ -98,6 +117,7 @@ const BasicTests: React.FC = ({ storage }) => { onPress={testSingleSetCrudKey} /> + +
From 1e9646456e8447ecbc01416e78d6401dacd58cce Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Sun, 21 Sep 2025 21:52:57 +0200 Subject: [PATCH 064/110] feat(async-storage): windows is not supported as native target --- examples/example-compose/build.gradle.kts | 19 ------------------- .../example/sharedstorage/main.kt | 8 -------- shared-storage/build.gradle.kts | 9 +++++---- .../shared_storage/Platform.jvm.kt | 3 --- .../shared_storage/SharedStorage.jvm.kt | 9 --------- .../database/DatabaseFiles.jvm.kt | 10 ---------- .../src/jvmTest/kotlin/tests/TestUtils.jvm.kt | 15 --------------- 7 files changed, 5 insertions(+), 68 deletions(-) delete mode 100644 examples/example-compose/src/jvmMain/kotlin/org/asyncstorage/example/sharedstorage/main.kt delete mode 100644 shared-storage/src/jvmMain/kotlin/org/asyncstorage/shared_storage/Platform.jvm.kt delete mode 100644 shared-storage/src/jvmMain/kotlin/org/asyncstorage/shared_storage/SharedStorage.jvm.kt delete mode 100644 shared-storage/src/jvmMain/kotlin/org/asyncstorage/shared_storage/database/DatabaseFiles.jvm.kt delete mode 100644 shared-storage/src/jvmTest/kotlin/tests/TestUtils.jvm.kt diff --git a/examples/example-compose/build.gradle.kts b/examples/example-compose/build.gradle.kts index 099bd49d..13cdbae2 100644 --- a/examples/example-compose/build.gradle.kts +++ b/examples/example-compose/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.compose.desktop.application.dsl.TargetFormat import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { @@ -19,8 +18,6 @@ kotlin { } } - jvm() - sourceSets { androidMain.dependencies { implementation(compose.preview) @@ -39,11 +36,6 @@ kotlin { } commonTest.dependencies { implementation(libs.tests.kotlin) } - - jvmMain.dependencies { - implementation(compose.desktop.currentOs) - implementation(libs.kotlinx.coroutines.swing) - } } } @@ -68,14 +60,3 @@ android { dependencies { debugImplementation(compose.uiTooling) } -compose.desktop { - application { - mainClass = "org.asyncstorage.example.sharedstorage.MainKt" - - nativeDistributions { - targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) - packageName = "org.asyncstorage.example.sharedstorage" - packageVersion = "1.0.0" - } - } -} diff --git a/examples/example-compose/src/jvmMain/kotlin/org/asyncstorage/example/sharedstorage/main.kt b/examples/example-compose/src/jvmMain/kotlin/org/asyncstorage/example/sharedstorage/main.kt deleted file mode 100644 index ead40aff..00000000 --- a/examples/example-compose/src/jvmMain/kotlin/org/asyncstorage/example/sharedstorage/main.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.asyncstorage.example.sharedstorage - -import androidx.compose.ui.window.Window -import androidx.compose.ui.window.application - -fun main() = application { - Window(onCloseRequest = ::exitApplication, title = "sharedstorage") { App() } -} diff --git a/shared-storage/build.gradle.kts b/shared-storage/build.gradle.kts index 7fe6a322..47384735 100644 --- a/shared-storage/build.gradle.kts +++ b/shared-storage/build.gradle.kts @@ -10,6 +10,11 @@ plugins { alias(libs.plugins.skie) } + +/** + * Windows as native target is not currently supported by Room db. + * https://issuetracker.google.com/issues/363195546 + */ kotlin { room { schemaDirectory("$projectDir/schemas") } @@ -41,7 +46,6 @@ kotlin { } } - jvm() sourceSets { commonMain { @@ -57,8 +61,6 @@ kotlin { appleMain { dependencies {} } - jvmMain { dependencies {} } - commonTest { dependencies { implementation(libs.tests.kotlin) @@ -84,7 +86,6 @@ kotlin { add("kspIosArm64", libs.androidx.room.compiler) add("kspMacosX64", libs.androidx.room.compiler) add("kspMacosArm64", libs.androidx.room.compiler) - add("kspJvm", libs.androidx.room.compiler) } } diff --git a/shared-storage/src/jvmMain/kotlin/org/asyncstorage/shared_storage/Platform.jvm.kt b/shared-storage/src/jvmMain/kotlin/org/asyncstorage/shared_storage/Platform.jvm.kt deleted file mode 100644 index dae6e623..00000000 --- a/shared-storage/src/jvmMain/kotlin/org/asyncstorage/shared_storage/Platform.jvm.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.asyncstorage.shared_storage - -actual abstract class PlatformContext diff --git a/shared-storage/src/jvmMain/kotlin/org/asyncstorage/shared_storage/SharedStorage.jvm.kt b/shared-storage/src/jvmMain/kotlin/org/asyncstorage/shared_storage/SharedStorage.jvm.kt deleted file mode 100644 index e6de31d2..00000000 --- a/shared-storage/src/jvmMain/kotlin/org/asyncstorage/shared_storage/SharedStorage.jvm.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.asyncstorage.shared_storage - -actual fun SharedStorage(context: PlatformContext, databaseName: String): SharedStorage { - TODO("JVM Not yet implemented") -} - -internal actual fun sharedStorageInMemory(context: PlatformContext): SharedStorage { - TODO("JVM Not yet implemented") -} \ No newline at end of file diff --git a/shared-storage/src/jvmMain/kotlin/org/asyncstorage/shared_storage/database/DatabaseFiles.jvm.kt b/shared-storage/src/jvmMain/kotlin/org/asyncstorage/shared_storage/database/DatabaseFiles.jvm.kt deleted file mode 100644 index 34460056..00000000 --- a/shared-storage/src/jvmMain/kotlin/org/asyncstorage/shared_storage/database/DatabaseFiles.jvm.kt +++ /dev/null @@ -1,10 +0,0 @@ -package org.asyncstorage.shared_storage.database - -import org.asyncstorage.shared_storage.PlatformContext - -actual fun DatabaseFiles.Companion.of( - context: PlatformContext, - databaseName: String, -): DatabaseFiles { - TODO("JVM Not yet implemented") -} diff --git a/shared-storage/src/jvmTest/kotlin/tests/TestUtils.jvm.kt b/shared-storage/src/jvmTest/kotlin/tests/TestUtils.jvm.kt deleted file mode 100644 index d6a740e4..00000000 --- a/shared-storage/src/jvmTest/kotlin/tests/TestUtils.jvm.kt +++ /dev/null @@ -1,15 +0,0 @@ -package tests - -import org.asyncstorage.shared_storage.SharedStorage - -actual open class TestRunner actual constructor() - -actual class StorageUtils actual constructor() { - actual fun getStorage(): SharedStorage { - TODO("Not yet implemented") - } - - actual fun cleanup() { - TODO("Not yet implemented") - } -} From be2473bed5a48093e304005ec00dbe6839921ea7 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 22 Sep 2025 14:13:28 +0200 Subject: [PATCH 065/110] async-storage(windows): start with windows implementation --- examples/example-react-native/app.json | 4 - examples/example-react-native/package.json | 4 +- .../react-native.config.js | 5 +- .../async-storage/src/AsyncStorageError.ts | 2 +- .../src/createAsyncStorage.native.ts | 2 +- .../src/createAsyncStorage.windows.ts | 147 ++++++++++++++++++ packages/async-storage/windows/.gitignore | 1 + 7 files changed, 157 insertions(+), 8 deletions(-) create mode 100644 packages/async-storage/src/createAsyncStorage.windows.ts diff --git a/examples/example-react-native/app.json b/examples/example-react-native/app.json index e77cd509..dbe4dd35 100644 --- a/examples/example-react-native/app.json +++ b/examples/example-react-native/app.json @@ -20,10 +20,6 @@ "dist/assets", "dist/main.macos.jsbundle" ], - "visionos": [ - "dist/assets", - "dist/main.visionos.jsbundle" - ], "windows": [ "dist/assets", "dist/main.windows.bundle" diff --git a/examples/example-react-native/package.json b/examples/example-react-native/package.json index 10e0af81..d22bd115 100644 --- a/examples/example-react-native/package.json +++ b/examples/example-react-native/package.json @@ -5,10 +5,12 @@ "scripts": { "android": "react-native run-android", "ios": "react-native run-ios", - "windows": "react-native run-windows", + "windows": "install-windows-test-app && react-native run-windows", + "macos": "react-native run-macos", "build:android": "yarn mkdist && react-native bundle --entry-file index.js --platform android --dev true --bundle-output dist/main.android.jsbundle --assets-dest dist/res", "build:ios": "yarn mkdist && react-native bundle --entry-file index.js --platform ios --dev true --bundle-output dist/main.ios.jsbundle --assets-dest dist", "build:windows": "yarn mkdist && react-native bundle --entry-file index.js --platform windows --dev true --bundle-output dist/main.windows.bundle --assets-dest dist", + "build:macos": "yarn mkdist && react-native bundle --entry-file index.js --platform macos --dev true --bundle-output dist/main.macos.bundle --assets-dest dist", "test:lint": "eslint .", "test:ts": "tsc --noEmit", "mkdist": "node -e \"require('node:fs').mkdirSync('dist', { recursive: true, mode: 0o755 })\"", diff --git a/examples/example-react-native/react-native.config.js b/examples/example-react-native/react-native.config.js index 20420a23..3ef5abe5 100644 --- a/examples/example-react-native/react-native.config.js +++ b/examples/example-react-native/react-native.config.js @@ -8,9 +8,12 @@ const project = (() => { ios: { sourceDir: "ios", }, + macos: { + sourceDir: "macos", + }, windows: { sourceDir: "windows", - solutionFile: "windows/Example.sln", + solutionFile: "Example.sln", }, }); } catch (_) { diff --git a/packages/async-storage/src/AsyncStorageError.ts b/packages/async-storage/src/AsyncStorageError.ts index 21e13f7c..7375f8cd 100644 --- a/packages/async-storage/src/AsyncStorageError.ts +++ b/packages/async-storage/src/AsyncStorageError.ts @@ -18,7 +18,7 @@ enum AsyncStorageErrorType { /** * Other errors related to Native Shared Storage or Legacy Storage exception. - * ex. Storage could not be initialized + * ex. Storage could not be initialized or wrongly formatted output is generated */ OtherStorageError = "OtherStorageError", diff --git a/packages/async-storage/src/createAsyncStorage.native.ts b/packages/async-storage/src/createAsyncStorage.native.ts index 92572d4f..d375ed70 100644 --- a/packages/async-storage/src/createAsyncStorage.native.ts +++ b/packages/async-storage/src/createAsyncStorage.native.ts @@ -114,7 +114,7 @@ class LegacyAsyncStorageImpl implements AsyncStorage { const mod = NativeAsyncStorage; if (!mod) { throw AsyncStorageError.jsError( - `Native module is null, access legacy storage`, + `Native module is null, cannot access legacy storage`, AsyncStorageError.Type.NativeModuleError ); } diff --git a/packages/async-storage/src/createAsyncStorage.windows.ts b/packages/async-storage/src/createAsyncStorage.windows.ts new file mode 100644 index 00000000..c3650ad7 --- /dev/null +++ b/packages/async-storage/src/createAsyncStorage.windows.ts @@ -0,0 +1,147 @@ +import type { AsyncStorage } from "./AsyncStorage"; +import { AsyncStorageError } from "./AsyncStorageError"; +import { TurboModuleRegistry, type TurboModule } from "react-native"; + +/** + * Because of missing support for Windows native target by Room KMP, + * Windows target uses v2 implementation of AsyncStorage. + */ +export function createAsyncStorage(_: string): AsyncStorage { + return getLegacyStorage(); +} + +export function getLegacyStorage(): AsyncStorage { + return LegacyAsyncStorageImpl.instance; +} + +class LegacyAsyncStorageImpl implements AsyncStorage { + private constructor() {} + + static instance = new LegacyAsyncStorageImpl(); + + private get db(): NativeAsyncStorageSpec { + const mod = RNCAsyncStorage; + if (!mod) { + throw AsyncStorageError.jsError( + `Native module is null, cannot access storage.`, + AsyncStorageError.Type.NativeModuleError + ); + } + return mod; + } + + getItem = async (key: string): Promise => { + try { + return await new Promise((resolve, reject) => { + this.db.multiGet([key], (errors, result) => { + if (errors?.length) { + const error = errors[0]!; + reject( + AsyncStorageError.jsError( + error.message, + AsyncStorageError.Type.OtherStorageError + ) + ); + } else { + resolve(result?.[0]?.[1] ?? null); + } + }); + }); + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; + + setItem = async (key: string, value: string): Promise => { + try { + throw new Error("todo"); + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; + + removeItem = async (key: string): Promise => { + try { + throw new Error("todo"); + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; + + getMany = async (keys: string[]): Promise> => { + try { + throw new Error("todo"); + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; + + setMany = async (entries: Record): Promise => { + try { + throw new Error("todo"); + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; + + removeMany = async (keys: string[]): Promise => { + try { + throw new Error("todo"); + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; + + getAllKeys = async (): Promise => { + try { + throw new Error("todo"); + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; + + clear = async (): Promise => { + try { + throw new Error("todo"); + } catch (e) { + throw AsyncStorageError.nativeError(e); + } + }; +} + +/** + * + * This is a backward compatibility layer, to support Windows target in v3. + * Room KMP does not support Windows native target currently, so shared-storage cannot be used. + * https://issuetracker.google.com/issues/363195546 + */ +const RNCAsyncStorage = + TurboModuleRegistry.get("RNCAsyncStorage"); + +type ErrorLike = { + message: string; + key?: string; +}; + +interface NativeAsyncStorageSpec extends TurboModule { + multiGet: ( + keys: string[], + callback: (error?: ErrorLike[], result?: [string, string][]) => void + ) => void; + multiSet: ( + kvPairs: [string, string][], + callback: (error?: ErrorLike[]) => void + ) => void; + multiRemove: ( + keys: readonly string[], + callback: (error?: ErrorLike[]) => void + ) => void; + multiMerge: ( + kvPairs: [string, string][], + callback: (error?: ErrorLike[]) => void + ) => void; + getAllKeys: ( + callback: (error?: ErrorLike[], result?: [string, string][]) => void + ) => void; + clear: (callback: (error?: ErrorLike[]) => void) => void; +} diff --git a/packages/async-storage/windows/.gitignore b/packages/async-storage/windows/.gitignore index 5bc72a44..9e73483b 100644 --- a/packages/async-storage/windows/.gitignore +++ b/packages/async-storage/windows/.gitignore @@ -39,3 +39,4 @@ Ankh.NoLoad #Files generated by the VS build **/Generated Files/** +ReactNativeAsyncStorage/packages.json.lock From ff944bfd51755403f2401480fc09c12869674a70 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 22 Sep 2025 19:46:46 +0200 Subject: [PATCH 066/110] feat(async-storage): windows impl --- .../src/createAsyncStorage.windows.ts | 149 ++++++++++++++++-- packages/async-storage/windows/.gitignore | 2 +- 2 files changed, 136 insertions(+), 15 deletions(-) diff --git a/packages/async-storage/src/createAsyncStorage.windows.ts b/packages/async-storage/src/createAsyncStorage.windows.ts index c3650ad7..e7f5883e 100644 --- a/packages/async-storage/src/createAsyncStorage.windows.ts +++ b/packages/async-storage/src/createAsyncStorage.windows.ts @@ -32,19 +32,18 @@ class LegacyAsyncStorageImpl implements AsyncStorage { getItem = async (key: string): Promise => { try { - return await new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { this.db.multiGet([key], (errors, result) => { - if (errors?.length) { - const error = errors[0]!; - reject( + const error = this.getError(errors); + if (error) { + return reject( AsyncStorageError.jsError( error.message, AsyncStorageError.Type.OtherStorageError ) ); - } else { - resolve(result?.[0]?.[1] ?? null); } + resolve(result?.[0]?.[1] ?? null); }); }); } catch (e) { @@ -54,7 +53,20 @@ class LegacyAsyncStorageImpl implements AsyncStorage { setItem = async (key: string, value: string): Promise => { try { - throw new Error("todo"); + await new Promise((resolve, reject) => { + this.db.multiSet([[key, value]], (errors) => { + const error = this.getError(errors); + if (error) { + return reject( + AsyncStorageError.jsError( + error.message, + AsyncStorageError.Type.OtherStorageError + ) + ); + } + resolve(); + }); + }); } catch (e) { throw AsyncStorageError.nativeError(e); } @@ -62,7 +74,20 @@ class LegacyAsyncStorageImpl implements AsyncStorage { removeItem = async (key: string): Promise => { try { - throw new Error("todo"); + await new Promise((resolve, reject) => { + this.db.multiRemove([key], (errors) => { + const error = this.getError(errors); + if (error) { + return reject( + AsyncStorageError.jsError( + error.message, + AsyncStorageError.Type.OtherStorageError + ) + ); + } + resolve(); + }); + }); } catch (e) { throw AsyncStorageError.nativeError(e); } @@ -70,7 +95,25 @@ class LegacyAsyncStorageImpl implements AsyncStorage { getMany = async (keys: string[]): Promise> => { try { - throw new Error("todo"); + return await new Promise((resolve, reject) => { + this.db.multiGet(keys, (errors, result) => { + const error = this.getError(errors); + if (error) { + return reject( + AsyncStorageError.jsError( + error.message, + AsyncStorageError.Type.OtherStorageError + ) + ); + } + const resultMap = new Map(result); + const entries: Record = {}; + for (const key of keys) { + entries[key] = resultMap.get(key) ?? null; + } + resolve(entries); + }); + }); } catch (e) { throw AsyncStorageError.nativeError(e); } @@ -78,7 +121,20 @@ class LegacyAsyncStorageImpl implements AsyncStorage { setMany = async (entries: Record): Promise => { try { - throw new Error("todo"); + await new Promise((resolve, reject) => { + this.db.multiSet(Object.entries(entries), (errors) => { + const error = this.getError(errors); + if (error) { + return reject( + AsyncStorageError.jsError( + error.message, + AsyncStorageError.Type.OtherStorageError + ) + ); + } + resolve(); + }); + }); } catch (e) { throw AsyncStorageError.nativeError(e); } @@ -86,7 +142,20 @@ class LegacyAsyncStorageImpl implements AsyncStorage { removeMany = async (keys: string[]): Promise => { try { - throw new Error("todo"); + await new Promise((resolve, reject) => { + this.db.multiRemove(keys, (errors) => { + const error = this.getError(errors); + if (error) { + return reject( + AsyncStorageError.jsError( + error.message, + AsyncStorageError.Type.OtherStorageError + ) + ); + } + resolve(); + }); + }); } catch (e) { throw AsyncStorageError.nativeError(e); } @@ -94,7 +163,29 @@ class LegacyAsyncStorageImpl implements AsyncStorage { getAllKeys = async (): Promise => { try { - throw new Error("todo"); + return await new Promise((resolve, reject) => { + this.db.getAllKeys((errors, result) => { + const error = this.getError(errors); + if (error) { + return reject( + AsyncStorageError.jsError( + error.message, + AsyncStorageError.Type.OtherStorageError + ) + ); + } + if (!result) { + return reject( + AsyncStorageError.jsError( + "Invalid state, no error and no values returned", + AsyncStorageError.Type.UnknownError + ) + ); + } + + resolve(result); + }); + }); } catch (e) { throw AsyncStorageError.nativeError(e); } @@ -102,11 +193,41 @@ class LegacyAsyncStorageImpl implements AsyncStorage { clear = async (): Promise => { try { - throw new Error("todo"); + await new Promise((resolve, reject) => { + this.db.clear((errors) => { + const error = this.getError(errors); + if (error) { + return reject( + AsyncStorageError.jsError( + error.message, + AsyncStorageError.Type.OtherStorageError + ) + ); + } + resolve(); + }); + }); } catch (e) { throw AsyncStorageError.nativeError(e); } }; + + private getError = (potentialError: any): ErrorLike | null => { + if (!potentialError) { + return null; + } + + if (Array.isArray(potentialError) && potentialError.length) { + const firstError = potentialError.find((e): e is ErrorLike => e?.message); + if (firstError) { + return firstError; + } + return null; + } else if (potentialError?.message) { + return potentialError; + } + return null; + }; } /** @@ -141,7 +262,7 @@ interface NativeAsyncStorageSpec extends TurboModule { callback: (error?: ErrorLike[]) => void ) => void; getAllKeys: ( - callback: (error?: ErrorLike[], result?: [string, string][]) => void + callback: (error?: ErrorLike[], result?: string[]) => void ) => void; clear: (callback: (error?: ErrorLike[]) => void) => void; } diff --git a/packages/async-storage/windows/.gitignore b/packages/async-storage/windows/.gitignore index 9e73483b..3526ccb4 100644 --- a/packages/async-storage/windows/.gitignore +++ b/packages/async-storage/windows/.gitignore @@ -39,4 +39,4 @@ Ankh.NoLoad #Files generated by the VS build **/Generated Files/** -ReactNativeAsyncStorage/packages.json.lock +./ReactNativeAsyncStorage/packages.lock.json From 2acbe103cc24ba8de9b3e9996e0018417fa26da6 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 22 Sep 2025 19:49:13 +0200 Subject: [PATCH 067/110] fix(windows): ignore package.lock.json --- packages/async-storage/windows/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/async-storage/windows/.gitignore b/packages/async-storage/windows/.gitignore index 3526ccb4..20a3c54d 100644 --- a/packages/async-storage/windows/.gitignore +++ b/packages/async-storage/windows/.gitignore @@ -39,4 +39,4 @@ Ankh.NoLoad #Files generated by the VS build **/Generated Files/** -./ReactNativeAsyncStorage/packages.lock.json +**/packages.lock.json From f0ba66357612100ac8e31ee24f66bb2f485e2a74 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 22 Sep 2025 21:36:14 +0200 Subject: [PATCH 068/110] async-storage: scripts --- packages/async-storage/package.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/async-storage/package.json b/packages/async-storage/package.json index ad5bf78e..bb898d68 100644 --- a/packages/async-storage/package.json +++ b/packages/async-storage/package.json @@ -14,11 +14,10 @@ }, "scripts": { "prepare": "yarn build", - "build": "bob build", - "build:watch": "watch 'yarn build' src", + "build": "del-cli lib && bob build", + "build:watch": "watch 'bob build' src", "test:ts": "tsc --noEmit", - "test:lint": "eslint src/*.{js,ts,tsx}", - "clean": "del-cli android/build lib" + "test:lint": "eslint src/*.{js,ts,tsx}" }, "files": [ "src", From 012a04209e82be10fbc735afb90e0fcceefaa6f6 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 22 Sep 2025 22:29:38 +0200 Subject: [PATCH 069/110] chore: more examples --- .../{example-web => common-tests}/.gitignore | 0 .../eslint.config.js | 0 examples/common-tests/package.json | 24 +++ examples/common-tests/src/index.ts | 1 + .../common-tests/src/tests/BasicTests.tsx | 131 +++++++++++++++ examples/common-tests/src/useLogs.ts | 35 ++++ .../tsconfig.json} | 0 .../Configuration/Config.xcconfig | 0 .../iosApp.xcodeproj/project.pbxproj | 0 .../contents.xcworkspacedata | 0 .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/app-icon-1024.png | Bin .../iosApp/Assets.xcassets/Contents.json | 0 .../iosApp/ContentView.swift | 0 .../iosApp/Info.plist | 0 .../Preview Assets.xcassets/Contents.json | 0 .../iosApp/iOSApp.swift | 0 .../build.gradle.kts | 0 .../src/androidMain/AndroidManifest.xml | 0 .../example/sharedstorage/MainActivity.kt | 0 .../drawable-v24/ic_launcher_foreground.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../res/mipmap-hdpi/ic_launcher.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../res/mipmap-mdpi/ic_launcher.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../res/mipmap-xhdpi/ic_launcher.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../res/mipmap-xxhdpi/ic_launcher.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../res/mipmap-xxxhdpi/ic_launcher.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../src/androidMain/res/values/strings.xml | 0 .../drawable/compose-multiplatform.xml | 0 .../asyncstorage/example/sharedstorage/App.kt | 0 .../sharedstorage/MainViewController.kt | 0 examples/example-web/src/tests/BasicTests.tsx | 154 ------------------ .../.bundle/config | 0 .../.gitignore | 0 .../Gemfile | 0 .../Gemfile.lock | 0 .../android/build.gradle | 0 .../android/gradle.properties | 0 .../android/gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../android/gradlew | 0 .../android/gradlew.bat | 0 .../android/settings.gradle | 0 .../app.json | 0 .../babel.config.js | 0 .../eslint.config.js} | 0 .../index.js | 0 .../ios/Podfile | 0 .../ios/Podfile.lock | 0 .../macos/Podfile | 0 .../macos/Podfile.lock | 0 .../metro.config.js | 0 .../package.json | 0 .../react-native.config.js | 0 .../src/App.tsx | 0 .../src/WithAsyncStorage.tsx | 0 .../src/WithLegacyStorage.tsx | 0 .../src/tests/BasicTests.tsx | 6 +- .../tsconfig.json | 0 .../windows/.gitignore | 0 examples/web/.gitignore | 24 +++ examples/web/eslint.config.cjs | 1 + examples/{example-web => web}/index.html | 0 examples/{example-web => web}/package.json | 1 + .../{example-web => web}/public/react.svg | 0 examples/{example-web => web}/src/App.tsx | 0 .../src/WithAsyncStorage.tsx | 0 .../src/WithLegacyStorage.tsx | 0 .../{example-web => web}/src/assets/react.svg | 0 examples/{example-web => web}/src/style.css | 0 examples/web/src/tests/BasicTests.tsx | 48 ++++++ .../{example-web => web}/src/vite-env.d.ts | 0 examples/web/tsconfig.app.json | 27 +++ examples/{example-web => web}/tsconfig.json | 0 .../{example-web => web}/tsconfig.node.json | 0 examples/{example-web => web}/vite.config.ts | 0 package.json | 5 +- settings.gradle.kts | 2 +- yarn.lock | 23 ++- 87 files changed, 318 insertions(+), 164 deletions(-) rename examples/{example-web => common-tests}/.gitignore (100%) rename examples/{example-react-native => common-tests}/eslint.config.js (100%) create mode 100644 examples/common-tests/package.json create mode 100644 examples/common-tests/src/index.ts create mode 100644 examples/common-tests/src/tests/BasicTests.tsx create mode 100644 examples/common-tests/src/useLogs.ts rename examples/{example-web/tsconfig.app.json => common-tests/tsconfig.json} (100%) rename examples/{example-ios => compose-ios}/Configuration/Config.xcconfig (100%) rename examples/{example-ios => compose-ios}/iosApp.xcodeproj/project.pbxproj (100%) rename examples/{example-ios => compose-ios}/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename examples/{example-ios => compose-ios}/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename examples/{example-ios => compose-ios}/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename examples/{example-ios => compose-ios}/iosApp/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png (100%) rename examples/{example-ios => compose-ios}/iosApp/Assets.xcassets/Contents.json (100%) rename examples/{example-ios => compose-ios}/iosApp/ContentView.swift (100%) rename examples/{example-ios => compose-ios}/iosApp/Info.plist (100%) rename examples/{example-ios => compose-ios}/iosApp/Preview Content/Preview Assets.xcassets/Contents.json (100%) rename examples/{example-ios => compose-ios}/iosApp/iOSApp.swift (100%) rename examples/{example-compose => compose}/build.gradle.kts (100%) rename examples/{example-compose => compose}/src/androidMain/AndroidManifest.xml (100%) rename examples/{example-compose => compose}/src/androidMain/kotlin/org/asyncstorage/example/sharedstorage/MainActivity.kt (100%) rename examples/{example-compose => compose}/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml (100%) rename examples/{example-compose => compose}/src/androidMain/res/drawable/ic_launcher_background.xml (100%) rename examples/{example-compose => compose}/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename examples/{example-compose => compose}/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename examples/{example-compose => compose}/src/androidMain/res/mipmap-hdpi/ic_launcher.png (100%) rename examples/{example-compose => compose}/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png (100%) rename examples/{example-compose => compose}/src/androidMain/res/mipmap-mdpi/ic_launcher.png (100%) rename examples/{example-compose => compose}/src/androidMain/res/mipmap-mdpi/ic_launcher_round.png (100%) rename examples/{example-compose => compose}/src/androidMain/res/mipmap-xhdpi/ic_launcher.png (100%) rename examples/{example-compose => compose}/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename examples/{example-compose => compose}/src/androidMain/res/mipmap-xxhdpi/ic_launcher.png (100%) rename examples/{example-compose => compose}/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename examples/{example-compose => compose}/src/androidMain/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename examples/{example-compose => compose}/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename examples/{example-compose => compose}/src/androidMain/res/values/strings.xml (100%) rename examples/{example-compose => compose}/src/commonMain/composeResources/drawable/compose-multiplatform.xml (100%) rename examples/{example-compose => compose}/src/commonMain/kotlin/org/asyncstorage/example/sharedstorage/App.kt (100%) rename examples/{example-compose => compose}/src/iosMain/kotlin/org/asyncstorage/example/sharedstorage/MainViewController.kt (100%) delete mode 100644 examples/example-web/src/tests/BasicTests.tsx rename examples/{example-react-native => react-native}/.bundle/config (100%) rename examples/{example-react-native => react-native}/.gitignore (100%) rename examples/{example-react-native => react-native}/Gemfile (100%) rename examples/{example-react-native => react-native}/Gemfile.lock (100%) rename examples/{example-react-native => react-native}/android/build.gradle (100%) rename examples/{example-react-native => react-native}/android/gradle.properties (100%) rename examples/{example-react-native => react-native}/android/gradle/wrapper/gradle-wrapper.jar (100%) rename examples/{example-react-native => react-native}/android/gradle/wrapper/gradle-wrapper.properties (100%) rename examples/{example-react-native => react-native}/android/gradlew (100%) rename examples/{example-react-native => react-native}/android/gradlew.bat (100%) rename examples/{example-react-native => react-native}/android/settings.gradle (100%) rename examples/{example-react-native => react-native}/app.json (100%) rename examples/{example-react-native => react-native}/babel.config.js (100%) rename examples/{example-web/eslint.config.cjs => react-native/eslint.config.js} (100%) rename examples/{example-react-native => react-native}/index.js (100%) rename examples/{example-react-native => react-native}/ios/Podfile (100%) rename examples/{example-react-native => react-native}/ios/Podfile.lock (100%) rename examples/{example-react-native => react-native}/macos/Podfile (100%) rename examples/{example-react-native => react-native}/macos/Podfile.lock (100%) rename examples/{example-react-native => react-native}/metro.config.js (100%) rename examples/{example-react-native => react-native}/package.json (100%) rename examples/{example-react-native => react-native}/react-native.config.js (100%) rename examples/{example-react-native => react-native}/src/App.tsx (100%) rename examples/{example-react-native => react-native}/src/WithAsyncStorage.tsx (100%) rename examples/{example-react-native => react-native}/src/WithLegacyStorage.tsx (100%) rename examples/{example-react-native => react-native}/src/tests/BasicTests.tsx (97%) rename examples/{example-react-native => react-native}/tsconfig.json (100%) rename examples/{example-react-native => react-native}/windows/.gitignore (100%) create mode 100644 examples/web/.gitignore create mode 100644 examples/web/eslint.config.cjs rename examples/{example-web => web}/index.html (100%) rename examples/{example-web => web}/package.json (95%) rename examples/{example-web => web}/public/react.svg (100%) rename examples/{example-web => web}/src/App.tsx (100%) rename examples/{example-web => web}/src/WithAsyncStorage.tsx (100%) rename examples/{example-web => web}/src/WithLegacyStorage.tsx (100%) rename examples/{example-web => web}/src/assets/react.svg (100%) rename examples/{example-web => web}/src/style.css (100%) create mode 100644 examples/web/src/tests/BasicTests.tsx rename examples/{example-web => web}/src/vite-env.d.ts (100%) create mode 100644 examples/web/tsconfig.app.json rename examples/{example-web => web}/tsconfig.json (100%) rename examples/{example-web => web}/tsconfig.node.json (100%) rename examples/{example-web => web}/vite.config.ts (100%) diff --git a/examples/example-web/.gitignore b/examples/common-tests/.gitignore similarity index 100% rename from examples/example-web/.gitignore rename to examples/common-tests/.gitignore diff --git a/examples/example-react-native/eslint.config.js b/examples/common-tests/eslint.config.js similarity index 100% rename from examples/example-react-native/eslint.config.js rename to examples/common-tests/eslint.config.js diff --git a/examples/common-tests/package.json b/examples/common-tests/package.json new file mode 100644 index 00000000..d6394068 --- /dev/null +++ b/examples/common-tests/package.json @@ -0,0 +1,24 @@ +{ + "name": "example-common-tests", + "version": "0.0.1", + "private": true, + "main": "src/index.ts", + "installConfig": { + "hoistingLimits": "workspaces" + }, + "scripts": { + "test:lint": "eslint .", + "test:ts": "tsc" + }, + "dependencies": { + "@react-native-async-storage/async-storage": "workspace:*", + "react": "19.0.0" + }, + "devDependencies": { + "@react-native-async-storage/eslint-config": "workspace:*", + "@types/react": "^19.0.0", + "eslint": "9.34.0", + "prettier": "3.6.2", + "typescript": "5.9.2" + } +} diff --git a/examples/common-tests/src/index.ts b/examples/common-tests/src/index.ts new file mode 100644 index 00000000..fb6b937a --- /dev/null +++ b/examples/common-tests/src/index.ts @@ -0,0 +1 @@ +export { useBasicTest } from "./tests/BasicTests"; diff --git a/examples/common-tests/src/tests/BasicTests.tsx b/examples/common-tests/src/tests/BasicTests.tsx new file mode 100644 index 00000000..7dbf6902 --- /dev/null +++ b/examples/common-tests/src/tests/BasicTests.tsx @@ -0,0 +1,131 @@ +import type { AsyncStorage } from "@react-native-async-storage/async-storage"; +import { useLogs, type TestLogs } from "../useLogs"; + +type Test = { + run: () => void; + name: string; +}; + +export function useBasicTest(storage: AsyncStorage): { + logs: TestLogs; + tests: Test[]; +} { + const logs = useLogs(); + + const testSingleSetCrudKey = async () => { + try { + const key = "single-set"; + let value = `value-${Math.round(Math.random() * 1000)}`; + + logs.add(`setting ${key} with value ${value}`); + await storage.setItem(key, value); + logs.add(`stored ${key} value:`, await storage.getItem(key)); + + let keysToFetch = [key, "missing-key-1", "missing-key-2"]; + logs.add( + `fetching keys (${keysToFetch}): `, + await storage.getMany(keysToFetch) + ); + + logs.add(`all keys: `, await storage.getAllKeys()); + + logs.add(`removing ${key}`); + await storage.removeItem(key); + logs.add(`current ${key} value:`, await storage.getItem(key)); + + value = `value-${Math.round(Math.random() * 1000)}`; + logs.add(`Saving new ${key} value: ${value}`); + await storage.setItem(key, value); + logs.add(`current ${key} value:`, await storage.getItem(key)); + + value = `value-${Math.round(Math.random() * 1000)}`; + logs.add(`Overriding n ${key} value: ${value}`); + await storage.setItem(key, value); + logs.add(`current ${key} value:`, await storage.getItem(key)); + + keysToFetch = [key, "missing-key-1", "missing-key-2"]; + logs.add( + `fetching keys (${keysToFetch}): `, + await storage.getMany(keysToFetch) + ); + } catch (e) { + logs.report(e); + } + }; + + const testMultiKey = async () => { + try { + const entries = { key1: "value1", key2: "42", key3: "true" }; + logs.add("MultiSet test with entries:", entries); + await storage.setMany(entries); + logs.add("fetching keys", ["key1", "key2", "key3", "missing"]); + const values = await storage.getMany(["key1", "key2", "key3", "missing"]); + logs.add("result", values); + + logs.add("removing key1 and key2"); + await storage.removeMany(["key1", "key2"]); + const remainingKeys = await storage.getAllKeys(); + logs.add("remaining keys after removing:", remainingKeys); + + const final = await storage.getMany(remainingKeys); + logs.add("get many remaining values:", final); + } catch (e) { + logs.report(e); + } + }; + + const saveBigData = async () => { + try { + const key = "big-data"; + const data = JSON.stringify(new Array(500_000).fill("a")); + logs.add(`Saving ${key} with data size ${data.length}`); + const timeNow = +Date.now(); + await storage.setItem(key, data); + logs.add(`saving took ${+Date.now() - timeNow}ms`); + + logs.add(`reading ${key}`); + const res = await storage.getItem(key); + logs.add(`size of result: ${res?.length}`); + } catch (e) { + logs.report(e); + } + }; + + const clearStorage = async () => { + try { + logs.add("Currently stored keys: ", await storage.getAllKeys()); + + logs.add("deleting everything"); + storage.clear(); + logs.add("keys after deletion: ", await storage.getAllKeys()); + logs.add("saving some values"); + + await storage.setItem("key-after-delete", "my item"); + logs.add("keys after saving: ", await storage.getAllKeys()); + } catch (e) { + logs.report(e); + } + }; + + return { + logs, + tests: [ + { + name: "Single key set", + run: testSingleSetCrudKey, + }, + { + name: "Multiple key sets", + run: testMultiKey, + }, + { + name: "Big data set", + run: saveBigData, + }, + { + name: "Storage clearance", + run: clearStorage, + }, + ], + }; +} diff --git a/examples/common-tests/src/useLogs.ts b/examples/common-tests/src/useLogs.ts new file mode 100644 index 00000000..974748a7 --- /dev/null +++ b/examples/common-tests/src/useLogs.ts @@ -0,0 +1,35 @@ +import { useState } from "react"; + +export type TestLogs = ReturnType; + +export function useLogs() { + const [logs, setLogs] = useState([]); + + function addLog(...text: any[]) { + const message = text + .map((t) => { + if (typeof t !== "string") { + return JSON.stringify(t, null, 2); + } + return t; + }) + .join(" "); + + setLogs((l) => [...l, message]); + } + + function clearLog() { + setLogs([]); + } + + function reportError(e: any) { + alert(JSON.stringify(e, null, 2)); + } + + return { + logs, + add: addLog, + clear: clearLog, + report: reportError, + }; +} diff --git a/examples/example-web/tsconfig.app.json b/examples/common-tests/tsconfig.json similarity index 100% rename from examples/example-web/tsconfig.app.json rename to examples/common-tests/tsconfig.json diff --git a/examples/example-ios/Configuration/Config.xcconfig b/examples/compose-ios/Configuration/Config.xcconfig similarity index 100% rename from examples/example-ios/Configuration/Config.xcconfig rename to examples/compose-ios/Configuration/Config.xcconfig diff --git a/examples/example-ios/iosApp.xcodeproj/project.pbxproj b/examples/compose-ios/iosApp.xcodeproj/project.pbxproj similarity index 100% rename from examples/example-ios/iosApp.xcodeproj/project.pbxproj rename to examples/compose-ios/iosApp.xcodeproj/project.pbxproj diff --git a/examples/example-ios/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/compose-ios/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from examples/example-ios/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to examples/compose-ios/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/examples/example-ios/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json b/examples/compose-ios/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from examples/example-ios/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json rename to examples/compose-ios/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/examples/example-ios/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/compose-ios/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from examples/example-ios/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json rename to examples/compose-ios/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/examples/example-ios/iosApp/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png b/examples/compose-ios/iosApp/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png similarity index 100% rename from examples/example-ios/iosApp/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png rename to examples/compose-ios/iosApp/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png diff --git a/examples/example-ios/iosApp/Assets.xcassets/Contents.json b/examples/compose-ios/iosApp/Assets.xcassets/Contents.json similarity index 100% rename from examples/example-ios/iosApp/Assets.xcassets/Contents.json rename to examples/compose-ios/iosApp/Assets.xcassets/Contents.json diff --git a/examples/example-ios/iosApp/ContentView.swift b/examples/compose-ios/iosApp/ContentView.swift similarity index 100% rename from examples/example-ios/iosApp/ContentView.swift rename to examples/compose-ios/iosApp/ContentView.swift diff --git a/examples/example-ios/iosApp/Info.plist b/examples/compose-ios/iosApp/Info.plist similarity index 100% rename from examples/example-ios/iosApp/Info.plist rename to examples/compose-ios/iosApp/Info.plist diff --git a/examples/example-ios/iosApp/Preview Content/Preview Assets.xcassets/Contents.json b/examples/compose-ios/iosApp/Preview Content/Preview Assets.xcassets/Contents.json similarity index 100% rename from examples/example-ios/iosApp/Preview Content/Preview Assets.xcassets/Contents.json rename to examples/compose-ios/iosApp/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/examples/example-ios/iosApp/iOSApp.swift b/examples/compose-ios/iosApp/iOSApp.swift similarity index 100% rename from examples/example-ios/iosApp/iOSApp.swift rename to examples/compose-ios/iosApp/iOSApp.swift diff --git a/examples/example-compose/build.gradle.kts b/examples/compose/build.gradle.kts similarity index 100% rename from examples/example-compose/build.gradle.kts rename to examples/compose/build.gradle.kts diff --git a/examples/example-compose/src/androidMain/AndroidManifest.xml b/examples/compose/src/androidMain/AndroidManifest.xml similarity index 100% rename from examples/example-compose/src/androidMain/AndroidManifest.xml rename to examples/compose/src/androidMain/AndroidManifest.xml diff --git a/examples/example-compose/src/androidMain/kotlin/org/asyncstorage/example/sharedstorage/MainActivity.kt b/examples/compose/src/androidMain/kotlin/org/asyncstorage/example/sharedstorage/MainActivity.kt similarity index 100% rename from examples/example-compose/src/androidMain/kotlin/org/asyncstorage/example/sharedstorage/MainActivity.kt rename to examples/compose/src/androidMain/kotlin/org/asyncstorage/example/sharedstorage/MainActivity.kt diff --git a/examples/example-compose/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml b/examples/compose/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from examples/example-compose/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml rename to examples/compose/src/androidMain/res/drawable-v24/ic_launcher_foreground.xml diff --git a/examples/example-compose/src/androidMain/res/drawable/ic_launcher_background.xml b/examples/compose/src/androidMain/res/drawable/ic_launcher_background.xml similarity index 100% rename from examples/example-compose/src/androidMain/res/drawable/ic_launcher_background.xml rename to examples/compose/src/androidMain/res/drawable/ic_launcher_background.xml diff --git a/examples/example-compose/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml b/examples/compose/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from examples/example-compose/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml rename to examples/compose/src/androidMain/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/examples/example-compose/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml b/examples/compose/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from examples/example-compose/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to examples/compose/src/androidMain/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/examples/example-compose/src/androidMain/res/mipmap-hdpi/ic_launcher.png b/examples/compose/src/androidMain/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from examples/example-compose/src/androidMain/res/mipmap-hdpi/ic_launcher.png rename to examples/compose/src/androidMain/res/mipmap-hdpi/ic_launcher.png diff --git a/examples/example-compose/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png b/examples/compose/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from examples/example-compose/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png rename to examples/compose/src/androidMain/res/mipmap-hdpi/ic_launcher_round.png diff --git a/examples/example-compose/src/androidMain/res/mipmap-mdpi/ic_launcher.png b/examples/compose/src/androidMain/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from examples/example-compose/src/androidMain/res/mipmap-mdpi/ic_launcher.png rename to examples/compose/src/androidMain/res/mipmap-mdpi/ic_launcher.png diff --git a/examples/example-compose/src/androidMain/res/mipmap-mdpi/ic_launcher_round.png b/examples/compose/src/androidMain/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from examples/example-compose/src/androidMain/res/mipmap-mdpi/ic_launcher_round.png rename to examples/compose/src/androidMain/res/mipmap-mdpi/ic_launcher_round.png diff --git a/examples/example-compose/src/androidMain/res/mipmap-xhdpi/ic_launcher.png b/examples/compose/src/androidMain/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from examples/example-compose/src/androidMain/res/mipmap-xhdpi/ic_launcher.png rename to examples/compose/src/androidMain/res/mipmap-xhdpi/ic_launcher.png diff --git a/examples/example-compose/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.png b/examples/compose/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from examples/example-compose/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.png rename to examples/compose/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/examples/example-compose/src/androidMain/res/mipmap-xxhdpi/ic_launcher.png b/examples/compose/src/androidMain/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from examples/example-compose/src/androidMain/res/mipmap-xxhdpi/ic_launcher.png rename to examples/compose/src/androidMain/res/mipmap-xxhdpi/ic_launcher.png diff --git a/examples/example-compose/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png b/examples/compose/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from examples/example-compose/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png rename to examples/compose/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/examples/example-compose/src/androidMain/res/mipmap-xxxhdpi/ic_launcher.png b/examples/compose/src/androidMain/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from examples/example-compose/src/androidMain/res/mipmap-xxxhdpi/ic_launcher.png rename to examples/compose/src/androidMain/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/examples/example-compose/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.png b/examples/compose/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from examples/example-compose/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.png rename to examples/compose/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/examples/example-compose/src/androidMain/res/values/strings.xml b/examples/compose/src/androidMain/res/values/strings.xml similarity index 100% rename from examples/example-compose/src/androidMain/res/values/strings.xml rename to examples/compose/src/androidMain/res/values/strings.xml diff --git a/examples/example-compose/src/commonMain/composeResources/drawable/compose-multiplatform.xml b/examples/compose/src/commonMain/composeResources/drawable/compose-multiplatform.xml similarity index 100% rename from examples/example-compose/src/commonMain/composeResources/drawable/compose-multiplatform.xml rename to examples/compose/src/commonMain/composeResources/drawable/compose-multiplatform.xml diff --git a/examples/example-compose/src/commonMain/kotlin/org/asyncstorage/example/sharedstorage/App.kt b/examples/compose/src/commonMain/kotlin/org/asyncstorage/example/sharedstorage/App.kt similarity index 100% rename from examples/example-compose/src/commonMain/kotlin/org/asyncstorage/example/sharedstorage/App.kt rename to examples/compose/src/commonMain/kotlin/org/asyncstorage/example/sharedstorage/App.kt diff --git a/examples/example-compose/src/iosMain/kotlin/org/asyncstorage/example/sharedstorage/MainViewController.kt b/examples/compose/src/iosMain/kotlin/org/asyncstorage/example/sharedstorage/MainViewController.kt similarity index 100% rename from examples/example-compose/src/iosMain/kotlin/org/asyncstorage/example/sharedstorage/MainViewController.kt rename to examples/compose/src/iosMain/kotlin/org/asyncstorage/example/sharedstorage/MainViewController.kt diff --git a/examples/example-web/src/tests/BasicTests.tsx b/examples/example-web/src/tests/BasicTests.tsx deleted file mode 100644 index f1f3ce06..00000000 --- a/examples/example-web/src/tests/BasicTests.tsx +++ /dev/null @@ -1,154 +0,0 @@ -import type { AsyncStorage } from "@react-native-async-storage/async-storage"; -import React, { useState } from "react"; - -type Props = { - storage: AsyncStorage; -}; - -const BasicTests: React.FC = ({ storage }) => { - const [logs, setLogs] = useState([]); - - function addLog(...text: any[]) { - const message = text - .map((t) => { - if (typeof t !== "string") { - return JSON.stringify(t, null, 2); - } - return t; - }) - .join(" "); - - setLogs((l) => [...l, message]); - } - - function clearLog() { - setLogs([]); - } - - function reportError(e: any) { - alert(JSON.stringify(e, null, 2)); - } - - const testSingleSetCrudKey = async () => { - try { - const key = "single-set"; - let value = `value-${Math.round(Math.random() * 1000)}`; - - addLog(`setting ${key} with value ${value}`); - await storage.setItem(key, value); - addLog(`stored ${key} value:`, await storage.getItem(key)); - - let keysToFetch = [key, "missing-key-1", "missing-key-2"]; - addLog( - `fetching keys (${keysToFetch}): `, - await storage.getMany(keysToFetch) - ); - - addLog(`removing ${key}`); - await storage.removeItem(key); - addLog(`current ${key} value:`, await storage.getItem(key)); - - value = `value-${Math.round(Math.random() * 1000)}`; - addLog(`Saving new ${key} value: ${value}`); - await storage.setItem(key, value); - addLog(`current ${key} value:`, await storage.getItem(key)); - - value = `value-${Math.round(Math.random() * 1000)}`; - addLog(`Overriding n ${key} value: ${value}`); - await storage.setItem(key, value); - addLog(`current ${key} value:`, await storage.getItem(key)); - - keysToFetch = [key, "missing-key-1", "missing-key-2"]; - addLog( - `fetching keys (${keysToFetch}): `, - await storage.getMany(keysToFetch) - ); - } catch (e) { - reportError(e); - } - }; - - const testMultiKey = async () => { - try { - const entries = { key1: "value1", key2: "42", key3: "true" }; - addLog("MultiSet test with entries:", entries); - await storage.setMany(entries); - addLog("fetching keys", ["key1", "key2", "key3", "missing"]); - const values = await storage.getMany(["key1", "key2", "key3", "missing"]); - addLog("result", values); - - addLog("removing key1 and key2"); - await storage.removeMany(["key1", "key2"]); - const remainingKeys = await storage.getAllKeys(); - addLog("remaining keys after removing:", remainingKeys); - - const final = await storage.getMany(remainingKeys); - addLog("get many remaining keys:", final); - } catch (e) { - reportError(e); - } - }; - - const saveBigData = async () => { - try { - const key = "big-data"; - const data = JSON.stringify(new Array(500_000).fill("a")); - addLog(`Saving ${key} with data size ${data.length}`); - const timeNow = +Date.now(); - await storage.setItem(key, data); - addLog(`saving took ${+Date.now() - timeNow}ms`); - - addLog(`reading ${key}`); - const res = await storage.getItem(key); - addLog(`size of result: ${res?.length}`); - } catch (e) { - reportError(e); - } - }; - - return ( -
-
- - - - - -
- -
- -
- -
- {logs.map((l, i) => ( -

- {l} -

- ))} -
-
- ); -}; - -export default BasicTests; diff --git a/examples/example-react-native/.bundle/config b/examples/react-native/.bundle/config similarity index 100% rename from examples/example-react-native/.bundle/config rename to examples/react-native/.bundle/config diff --git a/examples/example-react-native/.gitignore b/examples/react-native/.gitignore similarity index 100% rename from examples/example-react-native/.gitignore rename to examples/react-native/.gitignore diff --git a/examples/example-react-native/Gemfile b/examples/react-native/Gemfile similarity index 100% rename from examples/example-react-native/Gemfile rename to examples/react-native/Gemfile diff --git a/examples/example-react-native/Gemfile.lock b/examples/react-native/Gemfile.lock similarity index 100% rename from examples/example-react-native/Gemfile.lock rename to examples/react-native/Gemfile.lock diff --git a/examples/example-react-native/android/build.gradle b/examples/react-native/android/build.gradle similarity index 100% rename from examples/example-react-native/android/build.gradle rename to examples/react-native/android/build.gradle diff --git a/examples/example-react-native/android/gradle.properties b/examples/react-native/android/gradle.properties similarity index 100% rename from examples/example-react-native/android/gradle.properties rename to examples/react-native/android/gradle.properties diff --git a/examples/example-react-native/android/gradle/wrapper/gradle-wrapper.jar b/examples/react-native/android/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from examples/example-react-native/android/gradle/wrapper/gradle-wrapper.jar rename to examples/react-native/android/gradle/wrapper/gradle-wrapper.jar diff --git a/examples/example-react-native/android/gradle/wrapper/gradle-wrapper.properties b/examples/react-native/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from examples/example-react-native/android/gradle/wrapper/gradle-wrapper.properties rename to examples/react-native/android/gradle/wrapper/gradle-wrapper.properties diff --git a/examples/example-react-native/android/gradlew b/examples/react-native/android/gradlew similarity index 100% rename from examples/example-react-native/android/gradlew rename to examples/react-native/android/gradlew diff --git a/examples/example-react-native/android/gradlew.bat b/examples/react-native/android/gradlew.bat similarity index 100% rename from examples/example-react-native/android/gradlew.bat rename to examples/react-native/android/gradlew.bat diff --git a/examples/example-react-native/android/settings.gradle b/examples/react-native/android/settings.gradle similarity index 100% rename from examples/example-react-native/android/settings.gradle rename to examples/react-native/android/settings.gradle diff --git a/examples/example-react-native/app.json b/examples/react-native/app.json similarity index 100% rename from examples/example-react-native/app.json rename to examples/react-native/app.json diff --git a/examples/example-react-native/babel.config.js b/examples/react-native/babel.config.js similarity index 100% rename from examples/example-react-native/babel.config.js rename to examples/react-native/babel.config.js diff --git a/examples/example-web/eslint.config.cjs b/examples/react-native/eslint.config.js similarity index 100% rename from examples/example-web/eslint.config.cjs rename to examples/react-native/eslint.config.js diff --git a/examples/example-react-native/index.js b/examples/react-native/index.js similarity index 100% rename from examples/example-react-native/index.js rename to examples/react-native/index.js diff --git a/examples/example-react-native/ios/Podfile b/examples/react-native/ios/Podfile similarity index 100% rename from examples/example-react-native/ios/Podfile rename to examples/react-native/ios/Podfile diff --git a/examples/example-react-native/ios/Podfile.lock b/examples/react-native/ios/Podfile.lock similarity index 100% rename from examples/example-react-native/ios/Podfile.lock rename to examples/react-native/ios/Podfile.lock diff --git a/examples/example-react-native/macos/Podfile b/examples/react-native/macos/Podfile similarity index 100% rename from examples/example-react-native/macos/Podfile rename to examples/react-native/macos/Podfile diff --git a/examples/example-react-native/macos/Podfile.lock b/examples/react-native/macos/Podfile.lock similarity index 100% rename from examples/example-react-native/macos/Podfile.lock rename to examples/react-native/macos/Podfile.lock diff --git a/examples/example-react-native/metro.config.js b/examples/react-native/metro.config.js similarity index 100% rename from examples/example-react-native/metro.config.js rename to examples/react-native/metro.config.js diff --git a/examples/example-react-native/package.json b/examples/react-native/package.json similarity index 100% rename from examples/example-react-native/package.json rename to examples/react-native/package.json diff --git a/examples/example-react-native/react-native.config.js b/examples/react-native/react-native.config.js similarity index 100% rename from examples/example-react-native/react-native.config.js rename to examples/react-native/react-native.config.js diff --git a/examples/example-react-native/src/App.tsx b/examples/react-native/src/App.tsx similarity index 100% rename from examples/example-react-native/src/App.tsx rename to examples/react-native/src/App.tsx diff --git a/examples/example-react-native/src/WithAsyncStorage.tsx b/examples/react-native/src/WithAsyncStorage.tsx similarity index 100% rename from examples/example-react-native/src/WithAsyncStorage.tsx rename to examples/react-native/src/WithAsyncStorage.tsx diff --git a/examples/example-react-native/src/WithLegacyStorage.tsx b/examples/react-native/src/WithLegacyStorage.tsx similarity index 100% rename from examples/example-react-native/src/WithLegacyStorage.tsx rename to examples/react-native/src/WithLegacyStorage.tsx diff --git a/examples/example-react-native/src/tests/BasicTests.tsx b/examples/react-native/src/tests/BasicTests.tsx similarity index 97% rename from examples/example-react-native/src/tests/BasicTests.tsx rename to examples/react-native/src/tests/BasicTests.tsx index 68f86f72..b1546876 100644 --- a/examples/example-react-native/src/tests/BasicTests.tsx +++ b/examples/react-native/src/tests/BasicTests.tsx @@ -45,6 +45,8 @@ const BasicTests: React.FC = ({ storage }) => { await storage.getMany(keysToFetch) ); + addLog(`all keys: `, await storage.getAllKeys()); + addLog(`removing ${key}`); await storage.removeItem(key); addLog(`current ${key} value:`, await storage.getItem(key)); @@ -93,9 +95,7 @@ const BasicTests: React.FC = ({ storage }) => { const saveBigData = async () => { try { const key = "big-data"; - const data = JSON.stringify( - new Array(500_000).fill("a") - ); + const data = JSON.stringify(new Array(500_000).fill("a")); addLog(`Saving ${key} with data size ${data.length}`); const timeNow = +Date.now(); await storage.setItem(key, data); diff --git a/examples/example-react-native/tsconfig.json b/examples/react-native/tsconfig.json similarity index 100% rename from examples/example-react-native/tsconfig.json rename to examples/react-native/tsconfig.json diff --git a/examples/example-react-native/windows/.gitignore b/examples/react-native/windows/.gitignore similarity index 100% rename from examples/example-react-native/windows/.gitignore rename to examples/react-native/windows/.gitignore diff --git a/examples/web/.gitignore b/examples/web/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/examples/web/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/examples/web/eslint.config.cjs b/examples/web/eslint.config.cjs new file mode 100644 index 00000000..f23036d9 --- /dev/null +++ b/examples/web/eslint.config.cjs @@ -0,0 +1 @@ +module.exports = require("@react-native-async-storage/eslint-config"); diff --git a/examples/example-web/index.html b/examples/web/index.html similarity index 100% rename from examples/example-web/index.html rename to examples/web/index.html diff --git a/examples/example-web/package.json b/examples/web/package.json similarity index 95% rename from examples/example-web/package.json rename to examples/web/package.json index 5d1d27c9..c6b411d5 100644 --- a/examples/example-web/package.json +++ b/examples/web/package.json @@ -15,6 +15,7 @@ "@react-native-async-storage/async-storage": "workspace:*", "@react-native-async-storage/eslint-config": "workspace:*", "@tailwindcss/vite": "^4.1.13", + "example-common-tests": "workspace:*", "react": "19.1.1", "react-dom": "19.1.1", "tailwindcss": "^4.1.13" diff --git a/examples/example-web/public/react.svg b/examples/web/public/react.svg similarity index 100% rename from examples/example-web/public/react.svg rename to examples/web/public/react.svg diff --git a/examples/example-web/src/App.tsx b/examples/web/src/App.tsx similarity index 100% rename from examples/example-web/src/App.tsx rename to examples/web/src/App.tsx diff --git a/examples/example-web/src/WithAsyncStorage.tsx b/examples/web/src/WithAsyncStorage.tsx similarity index 100% rename from examples/example-web/src/WithAsyncStorage.tsx rename to examples/web/src/WithAsyncStorage.tsx diff --git a/examples/example-web/src/WithLegacyStorage.tsx b/examples/web/src/WithLegacyStorage.tsx similarity index 100% rename from examples/example-web/src/WithLegacyStorage.tsx rename to examples/web/src/WithLegacyStorage.tsx diff --git a/examples/example-web/src/assets/react.svg b/examples/web/src/assets/react.svg similarity index 100% rename from examples/example-web/src/assets/react.svg rename to examples/web/src/assets/react.svg diff --git a/examples/example-web/src/style.css b/examples/web/src/style.css similarity index 100% rename from examples/example-web/src/style.css rename to examples/web/src/style.css diff --git a/examples/web/src/tests/BasicTests.tsx b/examples/web/src/tests/BasicTests.tsx new file mode 100644 index 00000000..a11fe8ea --- /dev/null +++ b/examples/web/src/tests/BasicTests.tsx @@ -0,0 +1,48 @@ +import type { AsyncStorage } from "@react-native-async-storage/async-storage"; +import { useBasicTest } from "example-common-tests"; +import React from "react"; + +type Props = { + storage: AsyncStorage; +}; + +const BasicTests: React.FC = ({ storage }) => { + const { tests, logs } = useBasicTest(storage); + + return ( +
+
+ {tests.map((test) => { + return ( + + ); + })} +
+ +
+ +
+ +
+ {logs.logs.map((l, i) => ( +

+ {l} +

+ ))} +
+
+ ); +}; + +export default BasicTests; diff --git a/examples/example-web/src/vite-env.d.ts b/examples/web/src/vite-env.d.ts similarity index 100% rename from examples/example-web/src/vite-env.d.ts rename to examples/web/src/vite-env.d.ts diff --git a/examples/web/tsconfig.app.json b/examples/web/tsconfig.app.json new file mode 100644 index 00000000..227a6c67 --- /dev/null +++ b/examples/web/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/examples/example-web/tsconfig.json b/examples/web/tsconfig.json similarity index 100% rename from examples/example-web/tsconfig.json rename to examples/web/tsconfig.json diff --git a/examples/example-web/tsconfig.node.json b/examples/web/tsconfig.node.json similarity index 100% rename from examples/example-web/tsconfig.node.json rename to examples/web/tsconfig.node.json diff --git a/examples/example-web/vite.config.ts b/examples/web/vite.config.ts similarity index 100% rename from examples/example-web/vite.config.ts rename to examples/web/vite.config.ts diff --git a/package.json b/package.json index 2ac37e03..7addf686 100644 --- a/package.json +++ b/package.json @@ -32,8 +32,9 @@ "packages/async-storage", "packages/eslint-config", "packages/website", - "examples/example-react-native", - "examples/example-web" + "examples/react-native", + "examples/web", + "examples/common-tests" ], "dependencies": { "vite": "^7.1.5" diff --git a/settings.gradle.kts b/settings.gradle.kts index 0ea4ad03..a509750f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -34,4 +34,4 @@ dependencyResolutionManagement { plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } include(":shared-storage") -include(":examples:example-compose") +include(":examples:compose") diff --git a/yarn.lock b/yarn.lock index 0dc5f4b9..ef0fcd35 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10224,9 +10224,23 @@ __metadata: languageName: node linkType: hard -"example-react-native@workspace:examples/example-react-native": +"example-common-tests@workspace:*, example-common-tests@workspace:examples/common-tests": version: 0.0.0-use.local - resolution: "example-react-native@workspace:examples/example-react-native" + resolution: "example-common-tests@workspace:examples/common-tests" + dependencies: + "@react-native-async-storage/async-storage": "workspace:*" + "@react-native-async-storage/eslint-config": "workspace:*" + "@types/react": "npm:^19.0.0" + eslint: "npm:9.34.0" + prettier: "npm:3.6.2" + react: "npm:19.0.0" + typescript: "npm:5.9.2" + languageName: unknown + linkType: soft + +"example-react-native@workspace:examples/react-native": + version: 0.0.0-use.local + resolution: "example-react-native@workspace:examples/react-native" dependencies: "@babel/core": "npm:^7.25.2" "@babel/preset-env": "npm:^7.25.3" @@ -10258,9 +10272,9 @@ __metadata: languageName: unknown linkType: soft -"example-web@workspace:examples/example-web": +"example-web@workspace:examples/web": version: 0.0.0-use.local - resolution: "example-web@workspace:examples/example-web" + resolution: "example-web@workspace:examples/web" dependencies: "@react-native-async-storage/async-storage": "workspace:*" "@react-native-async-storage/eslint-config": "workspace:*" @@ -10269,6 +10283,7 @@ __metadata: "@types/react-dom": "npm:19.1.7" "@vitejs/plugin-react": "npm:5.0.0" eslint: "npm:9.34.0" + example-common-tests: "workspace:*" react: "npm:19.1.1" react-dom: "npm:19.1.1" tailwindcss: "npm:^4.1.13" From fb21de509cf039aead4fc78fd5c34a3063f6de89 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 22 Sep 2025 22:52:45 +0200 Subject: [PATCH 070/110] tests: common --- examples/common-tests/src/index.ts | 1 + .../common-tests/src/tests/BasicTests.tsx | 12 +- examples/common-tests/src/types.ts | 4 + examples/react-native/package.json | 1 + .../react-native/src/tests/BasicTests.tsx | 122 ++---------------- yarn.lock | 1 + 6 files changed, 24 insertions(+), 117 deletions(-) create mode 100644 examples/common-tests/src/types.ts diff --git a/examples/common-tests/src/index.ts b/examples/common-tests/src/index.ts index fb6b937a..da486b4a 100644 --- a/examples/common-tests/src/index.ts +++ b/examples/common-tests/src/index.ts @@ -1 +1,2 @@ export { useBasicTest } from "./tests/BasicTests"; +export type { RunTest } from "./types"; diff --git a/examples/common-tests/src/tests/BasicTests.tsx b/examples/common-tests/src/tests/BasicTests.tsx index 7dbf6902..4ae70960 100644 --- a/examples/common-tests/src/tests/BasicTests.tsx +++ b/examples/common-tests/src/tests/BasicTests.tsx @@ -1,19 +1,16 @@ import type { AsyncStorage } from "@react-native-async-storage/async-storage"; import { useLogs, type TestLogs } from "../useLogs"; - -type Test = { - run: () => void; - name: string; -}; +import type { RunTest } from "../types"; export function useBasicTest(storage: AsyncStorage): { logs: TestLogs; - tests: Test[]; + tests: RunTest[]; } { const logs = useLogs(); const testSingleSetCrudKey = async () => { try { + logs.clear(); const key = "single-set"; let value = `value-${Math.round(Math.random() * 1000)}`; @@ -55,6 +52,7 @@ export function useBasicTest(storage: AsyncStorage): { const testMultiKey = async () => { try { + logs.clear(); const entries = { key1: "value1", key2: "42", key3: "true" }; logs.add("MultiSet test with entries:", entries); await storage.setMany(entries); @@ -76,6 +74,7 @@ export function useBasicTest(storage: AsyncStorage): { const saveBigData = async () => { try { + logs.clear(); const key = "big-data"; const data = JSON.stringify(new Array(500_000).fill("a")); logs.add(`Saving ${key} with data size ${data.length}`); @@ -93,6 +92,7 @@ export function useBasicTest(storage: AsyncStorage): { const clearStorage = async () => { try { + logs.clear(); logs.add("Currently stored keys: ", await storage.getAllKeys()); logs.add("deleting everything"); diff --git a/examples/common-tests/src/types.ts b/examples/common-tests/src/types.ts new file mode 100644 index 00000000..16f635c0 --- /dev/null +++ b/examples/common-tests/src/types.ts @@ -0,0 +1,4 @@ +export type RunTest = { + run: () => void; + name: string; +}; diff --git a/examples/react-native/package.json b/examples/react-native/package.json index d22bd115..6bc2af64 100644 --- a/examples/react-native/package.json +++ b/examples/react-native/package.json @@ -44,6 +44,7 @@ "@types/react": "^19.0.0", "@types/react-test-renderer": "^19.0.0", "eslint": "9.34.0", + "example-common-tests": "workspace:*", "jest": "^29.6.3", "prettier": "3.6.2", "react-native-test-app": "^4.4.7", diff --git a/examples/react-native/src/tests/BasicTests.tsx b/examples/react-native/src/tests/BasicTests.tsx index b1546876..9cd50820 100644 --- a/examples/react-native/src/tests/BasicTests.tsx +++ b/examples/react-native/src/tests/BasicTests.tsx @@ -1,128 +1,28 @@ import type { AsyncStorage } from "@react-native-async-storage/async-storage"; -import React, { useState } from "react"; -import { Alert, Button, Pressable, ScrollView, Text, View } from "react-native"; +import React from "react"; +import { Button, Pressable, ScrollView, Text, View } from "react-native"; +import { useBasicTest } from "example-common-tests"; type Props = { storage: AsyncStorage; }; const BasicTests: React.FC = ({ storage }) => { - const [logs, setLogs] = useState([]); - - function addLog(...text: any[]) { - const message = text - .map((t) => { - if (typeof t !== "string") { - return JSON.stringify(t, null, 2); - } - return t; - }) - .join(" "); - - setLogs((l) => [...l, message]); - } - - function clearLog() { - setLogs([]); - } - - function reportError(e: any) { - Alert.alert(e?.name ?? "Error", JSON.stringify(e, null, 2)); - } - - const testSingleSetCrudKey = async () => { - try { - const key = "my-test-key"; - let value = `value-${Math.round(Math.random() * 1000)}`; - - addLog(`setting ${key} with value ${value}`); - await storage.setItem(key, value); - addLog(`stored ${key} value:`, await storage.getItem(key)); - - let keysToFetch = [key, "missing-key-1", "missing-key-2"]; - addLog( - `fetching keys (${keysToFetch}): `, - await storage.getMany(keysToFetch) - ); - - addLog(`all keys: `, await storage.getAllKeys()); - - addLog(`removing ${key}`); - await storage.removeItem(key); - addLog(`current ${key} value:`, await storage.getItem(key)); - - value = `value-${Math.round(Math.random() * 1000)}`; - addLog(`Saving new ${key} value: ${value}`); - await storage.setItem(key, value); - addLog(`current ${key} value:`, await storage.getItem(key)); - - value = `value-${Math.round(Math.random() * 1000)}`; - addLog(`Overriding ${key} value: ${value}`); - await storage.setItem(key, value); - addLog(`current ${key} value:`, await storage.getItem(key)); - - keysToFetch = [key, "missing-key-1", "missing-key-2"]; - addLog( - `fetching keys (${keysToFetch}): `, - await storage.getMany(keysToFetch) - ); - } catch (e) { - reportError(e); - } - }; - - const testMultiKey = async () => { - try { - const entries = { key1: "value1", key2: "42", key3: "true" }; - addLog("MultiSet test with entries:", entries); - await storage.setMany(entries); - addLog("fetching keys", ["key1", "key2", "key3", "missing"]); - const values = await storage.getMany(["key1", "key2", "key3", "missing"]); - addLog("result", values); - - addLog("removing key1 and key2"); - await storage.removeMany(["key1", "key2"]); - const remainingKeys = await storage.getAllKeys(); - addLog("remaining keys after removing:", remainingKeys); - - const final = await storage.getMany(remainingKeys); - addLog("get many remaining keys:", final); - } catch (e) { - reportError(e); - } - }; - - const saveBigData = async () => { - try { - const key = "big-data"; - const data = JSON.stringify(new Array(500_000).fill("a")); - addLog(`Saving ${key} with data size ${data.length}`); - const timeNow = +Date.now(); - await storage.setItem(key, data); - addLog(`saving took ${+Date.now() - timeNow}ms`); - - addLog(`reading ${key}`); - const res = await storage.getItem(key); - addLog(`size of result: ${res?.length}`); - } catch (e) { - reportError(e); - } - }; + const { tests, logs } = useBasicTest(storage); return ( -
- {logs.logs.map((l, i) => ( -

- {l} + {logs.map((l, i) => ( +

+ {l.message}

))}
diff --git a/examples/web/vite.config.ts b/examples/web/vite.config.ts index 5b2578eb..4ff4f8fe 100644 --- a/examples/web/vite.config.ts +++ b/examples/web/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; -import tailwindcss from '@tailwindcss/vite' +import tailwindcss from "@tailwindcss/vite"; // https://vite.dev/config/ export default defineConfig({ diff --git a/shared-storage/src/commonTest/kotlin/tests/StorageTests.kt b/shared-storage/src/commonTest/kotlin/tests/StorageTests.kt index bb837e84..a9ea1e5d 100644 --- a/shared-storage/src/commonTest/kotlin/tests/StorageTests.kt +++ b/shared-storage/src/commonTest/kotlin/tests/StorageTests.kt @@ -32,7 +32,7 @@ class SharedStorageTest : TestRunner() { @Test fun `performs basic crud operation`() = runTest { var data = storage.getValues(listOf("key1", "key2")) - assertEquals(0, data.size) + assertEquals(2, data.size, "not returned requested items") val entry1 = Entry("key1", "value1") val entry2 = Entry("key2", "value2") @@ -42,8 +42,11 @@ class SharedStorageTest : TestRunner() { storage.removeValues(listOf("key2")) data = storage.getValues(listOf("key1", "key2")) - assertEquals(1, data.size) + assertEquals(2, data.size) assertEquals("key1", data.first().key) + assertEquals("value1", data.first().value) + assertEquals(data[1].key, "key2") + assertNull(data[1].value, "value 2 not removed") } @Test @@ -98,24 +101,26 @@ class SharedStorageTest : TestRunner() { } @Test - fun `returns only existing entries`() = runTest { + fun `returns all requested entries`() = runTest { val testValues = listOf(Entry("key1", "value1"), Entry("key2", "value2"), Entry("key3", "value3")) val result = storage.setValues(testValues) assertEquals(3, result.size) - assertEquals(0, storage.getValues(listOf("nonex1", "nonex2")).size) + assertEquals(2, storage.getValues(listOf("nonex1", "nonex2")).size) + assertEquals(listOf(null, null), storage.getValues(listOf("nonex1", "nonex2")).map { it.value }) val values = storage.getValues(listOf("key1", "key2", "key3", "not existing", "diff key", "key4")) - assertEquals(3, values.size) + assertEquals(6, values.size) } @Test - fun `emits values when updating them`() = runTest { + fun `emits values when updating`() = runTest { val original = Entry("original", "one") storage.getValuesFlow(listOf(original.key)).test { - assertEquals(0, awaitItem().size) + val item = + assertEquals(1, awaitItem().size, "initial value should be 1") storage.setValues(listOf(original)) var items = awaitItem() @@ -124,12 +129,13 @@ class SharedStorageTest : TestRunner() { storage.setValues(listOf(original.copy(value = "two"))) items = awaitItem() - assertEquals(1, items.size) + assertEquals(1, items.size, "size not matching after set") assertEquals("two", items.first().value) storage.removeValues(listOf(original.key)) items = awaitItem() - assertEquals(0, items.size) + assertEquals(1, items.size, "should be 1, as requested") + assertEquals(null, items.first()?.value, "value not removed") storage.setValues(listOf(original.copy(value = "three"))) items = awaitItem() @@ -178,7 +184,7 @@ class SharedStorageTest : TestRunner() { } @Test - fun `returns requested values, even if not existing`() = runTest { + fun `returns requested values even if not existing`() = runTest { val entry1 = Entry("key1", "value1") val result = storage.setValues(listOf(entry1)) assertEquals(entry1, result.first()) diff --git a/yarn.lock b/yarn.lock index c895ee9e..ed9b6ee8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5666,6 +5666,22 @@ __metadata: languageName: node linkType: hard +"@types/lodash.isequal@npm:^4.5.8": + version: 4.5.8 + resolution: "@types/lodash.isequal@npm:4.5.8" + dependencies: + "@types/lodash": "npm:*" + checksum: 10c0/6db28cacf165d55421fbf2970ccfb1682a7b82b743bb7aba4398fa8ab98f1711fca2fe4afa1aa2b7b4afb3eff76c8aca13b22206f5efeb038d99e41300589bca + languageName: node + linkType: hard + +"@types/lodash@npm:*": + version: 4.17.20 + resolution: "@types/lodash@npm:4.17.20" + checksum: 10c0/98cdd0faae22cbb8079a01a3bb65aa8f8c41143367486c1cbf5adc83f16c9272a2a5d2c1f541f61d0d73da543c16ee1d21cf2ef86cb93cd0cc0ac3bced6dd88f + languageName: node + linkType: hard + "@types/mdast@npm:^3.0.0": version: 3.0.12 resolution: "@types/mdast@npm:3.0.12" @@ -10230,8 +10246,10 @@ __metadata: dependencies: "@react-native-async-storage/async-storage": "workspace:*" "@react-native-async-storage/eslint-config": "workspace:*" + "@types/lodash.isequal": "npm:^4.5.8" "@types/react": "npm:^19.0.0" eslint: "npm:9.34.0" + lodash.isequal: "npm:4.5.0" prettier: "npm:3.6.2" react: "npm:19.0.0" typescript: "npm:5.9.2" @@ -14015,6 +14033,13 @@ __metadata: languageName: node linkType: hard +"lodash.isequal@npm:4.5.0": + version: 4.5.0 + resolution: "lodash.isequal@npm:4.5.0" + checksum: 10c0/dfdb2356db19631a4b445d5f37868a095e2402292d59539a987f134a8778c62a2810c2452d11ae9e6dcac71fc9de40a6fedcb20e2952a15b431ad8b29e50e28f + languageName: node + linkType: hard + "lodash.memoize@npm:^4.1.2": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" From e46e8c6395d1a0cc7c930707886cc1e3a8be6e0d Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Tue, 23 Sep 2025 00:24:05 +0200 Subject: [PATCH 072/110] test: more cases --- .../common-tests/src/tests/BasicTests.tsx | 102 +++++++++++++++++- .../react-native/src/tests/BasicTests.tsx | 58 +++++----- examples/web/src/tests/BasicTests.tsx | 2 +- 3 files changed, 129 insertions(+), 33 deletions(-) diff --git a/examples/common-tests/src/tests/BasicTests.tsx b/examples/common-tests/src/tests/BasicTests.tsx index 9bc8b4e7..0465b9e0 100644 --- a/examples/common-tests/src/tests/BasicTests.tsx +++ b/examples/common-tests/src/tests/BasicTests.tsx @@ -86,7 +86,7 @@ export function useBasicTest(storage: AsyncStorage) { } }; - const saveBigData = async () => { + const testSavingBigData = async () => { try { tests.clear(); const key = "big-data"; @@ -104,7 +104,7 @@ export function useBasicTest(storage: AsyncStorage) { } }; - const clearStorage = async () => { + const testClearingStorage = async () => { try { tests.clear(); await storage.clear(); @@ -122,6 +122,88 @@ export function useBasicTest(storage: AsyncStorage) { } }; + const testRemoveNonExistentKeys = async () => { + try { + tests.clear(); + await storage.clear(); + + const missingKeys = ["missing1", "missing2"]; + tests.info(`Attempting to remove non-existent keys: ${missingKeys}`); + await storage.removeMany(missingKeys); + tests.assert( + [], + await storage.getAllKeys(), + "Removing missing keys is safe" + ); + } catch (e) { + tests.report(e); + } + }; + + const testConcurrentSetAndGet = async () => { + try { + tests.clear(); + await storage.clear(); + + const key1 = "concurrent1"; + const key2 = "concurrent2"; + const key3 = "concurrent3"; + const key4 = "concurrent4"; + const key5 = "concurrent5"; + + tests.info("Setting multiple keys concurrently"); + await Promise.all([ + storage.setItem(key1, key1), + storage.setItem(key2, key2), + storage.setItem(key3, key3), + storage.setItem(key4, key4), + storage.setItem(key5, key5), + ]); + + const values = await storage.getMany([key1, key2, key3, key4, key5]); + tests.assert( + { + [key1]: key1, + [key2]: key2, + [key3]: key3, + [key4]: key4, + [key5]: key5, + }, + values, + "Concurrent set/get works" + ); + } catch (e) { + tests.report(e); + } + }; + + const testLargeNumberOfKeys = async () => { + try { + tests.clear(); + await storage.clear(); + + const entries: Record = {}; + for (let i = 0; i < 1000; i++) { + entries[`key-${i}`] = `value-${i}`; + } + + tests.info("Saving 1000 keys at once"); + await storage.setMany(entries); + + const keys = await storage.getAllKeys(); + tests.assert( + Object.keys(entries).sort(), + keys.sort(), + "All keys are stored" + ); + + const fetched = await storage.getMany(Object.keys(entries)); + tests.assert(entries, fetched, "All values match"); + } catch (e) { + tests.report(e); + } + }; + return { logs: tests.logs, clearLogs: tests.clear, @@ -136,11 +218,23 @@ export function useBasicTest(storage: AsyncStorage) { }, { name: "Big data set", - run: saveBigData, + run: testSavingBigData, }, { name: "Storage clearance", - run: clearStorage, + run: testClearingStorage, + }, + { + name: "Safe removal", + run: testRemoveNonExistentKeys, + }, + { + name: "Concurrent set and get", + run: testConcurrentSetAndGet, + }, + { + name: "Test large number of keys", + run: testLargeNumberOfKeys, }, ], }; diff --git a/examples/react-native/src/tests/BasicTests.tsx b/examples/react-native/src/tests/BasicTests.tsx index e640bcef..51bdfe6d 100644 --- a/examples/react-native/src/tests/BasicTests.tsx +++ b/examples/react-native/src/tests/BasicTests.tsx @@ -12,7 +12,7 @@ const BasicTests: React.FC = ({ storage }) => { return ( - + {tests.map((test) => { return ( - ); -}; - createRoot(document.getElementById("root")!).render( diff --git a/examples/web/src/WithAsyncStorage.tsx b/examples/web/src/WithAsyncStorage.tsx deleted file mode 100644 index a3da2047..00000000 --- a/examples/web/src/WithAsyncStorage.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import type { AsyncStorage } from "@react-native-async-storage/async-storage"; -import { createAsyncStorage } from "@react-native-async-storage/async-storage"; -import type React from "react"; -import { useState } from "react"; - -type Props = { - dbName: string; - TestComponent: React.FC<{ storage: AsyncStorage }>; -}; - -const WithAsyncStorage: React.FC = ({ TestComponent, dbName }) => { - const [storage] = useState(() => createAsyncStorage(dbName)); - - return ; -}; - -export default WithAsyncStorage; diff --git a/examples/web/src/WithLegacyStorage.tsx b/examples/web/src/WithLegacyStorage.tsx deleted file mode 100644 index 8b6acc48..00000000 --- a/examples/web/src/WithLegacyStorage.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import type { AsyncStorage } from "@react-native-async-storage/async-storage"; -import LegacyAsyncStorage from "@react-native-async-storage/async-storage"; -import type React from "react"; - -type Props = { - TestComponent: React.FC<{ storage: AsyncStorage }>; -}; - -const WithLegacyStorage: React.FC = ({ TestComponent }) => { - return ; -}; - -export default WithLegacyStorage; diff --git a/examples/web/src/components/TabButton.tsx b/examples/web/src/components/TabButton.tsx new file mode 100644 index 00000000..9757c483 --- /dev/null +++ b/examples/web/src/components/TabButton.tsx @@ -0,0 +1,14 @@ +export const TabButton: React.FC<{ + active: boolean; + title: string; + onPress: () => void; +}> = ({ active, title, onPress }) => { + return ( + + ); +}; diff --git a/examples/web/src/components/TestRunnerView.tsx b/examples/web/src/components/TestRunnerView.tsx new file mode 100644 index 00000000..2d41e5eb --- /dev/null +++ b/examples/web/src/components/TestRunnerView.tsx @@ -0,0 +1,54 @@ +import { type TestRunner } from "example-common-tests"; +import React from "react"; + +type Props = { + runner: TestRunner; +}; + +const TestRunnerView: React.FC = ({ runner }) => { + const { tests, clearLogs, logs } = runner; + + return ( +
+
+ {tests.map((test) => { + return ( + + ); + })} +
+ +
+ +
+ +
+ {logs.map((log, i) => ( +
+ {log.messages.map((message) => ( + + {message} + + ))} +
+ ))} +
+
+ ); +}; + +export default TestRunnerView; diff --git a/examples/web/src/tests/BasicTests.tsx b/examples/web/src/tests/BasicTests.tsx index 56e417c9..6f9d9969 100644 --- a/examples/web/src/tests/BasicTests.tsx +++ b/examples/web/src/tests/BasicTests.tsx @@ -1,51 +1,15 @@ -import type { AsyncStorage } from "@react-native-async-storage/async-storage"; -import { useBasicTest } from "example-common-tests"; +import { useBasicTest, useTestStorage } from "example-common-tests"; import React from "react"; +import TestRunnerView from "../components/TestRunnerView"; type Props = { - storage: AsyncStorage; + storageName: string | null; }; -const BasicTests: React.FC = ({ storage }) => { - const { tests, clearLogs, logs } = useBasicTest(storage); - - return ( -
-
- {tests.map((test) => { - return ( - - ); - })} -
- -
- -
- -
- {logs.map((l, i) => ( -

- {l.message} -

- ))} -
-
- ); +const BasicTests: React.FC = ({ storageName }) => { + const storage = useTestStorage(storageName); + const runner = useBasicTest(storage); + return ; }; export default BasicTests; diff --git a/examples/web/src/tests/PerformanceTests.tsx b/examples/web/src/tests/PerformanceTests.tsx new file mode 100644 index 00000000..9890c214 --- /dev/null +++ b/examples/web/src/tests/PerformanceTests.tsx @@ -0,0 +1,15 @@ +import { usePerformanceTest, useTestStorage } from "example-common-tests"; +import React from "react"; +import TestRunnerView from "../components/TestRunnerView"; + +type Props = { + storageName: string | null; +}; + +const PerformanceTests: React.FC = ({ storageName }) => { + const storage = useTestStorage(storageName); + const runner = usePerformanceTest(storage); + return ; +}; + +export default PerformanceTests; From f5e351f10c0595c5bcbe07543940bf6e5738e833 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Tue, 23 Sep 2025 10:26:47 +0200 Subject: [PATCH 074/110] fix(async-storage): coalesce values instead using OR --- packages/async-storage/src/web-module/IndexedDBStorage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/async-storage/src/web-module/IndexedDBStorage.ts b/packages/async-storage/src/web-module/IndexedDBStorage.ts index 8287e3ad..1bd16bbc 100644 --- a/packages/async-storage/src/web-module/IndexedDBStorage.ts +++ b/packages/async-storage/src/web-module/IndexedDBStorage.ts @@ -15,7 +15,7 @@ class IndexedDBStorage { const result = await Promise.all( keys.map(async (key) => { const entry = await store.get(key); - return { key, value: entry || null }; + return { key, value: entry ?? null }; }) ); From d1bde8f5ddc74820e6f61ed27a2ff472816ca1ef Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Tue, 23 Sep 2025 11:02:26 +0200 Subject: [PATCH 075/110] fix(async-storage): regressions --- packages/async-storage/src/createAsyncStorage.native.ts | 4 ++-- packages/async-storage/src/createAsyncStorage.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/async-storage/src/createAsyncStorage.native.ts b/packages/async-storage/src/createAsyncStorage.native.ts index d375ed70..6ebc0dc5 100644 --- a/packages/async-storage/src/createAsyncStorage.native.ts +++ b/packages/async-storage/src/createAsyncStorage.native.ts @@ -90,7 +90,7 @@ class AsyncStorageImpl implements AsyncStorage { clear = async (): Promise => { try { - return await this.db.clearStorage(this.dbName); + await this.db.clearStorage(this.dbName); } catch (e) { throw AsyncStorageError.nativeError(e); } @@ -186,7 +186,7 @@ class LegacyAsyncStorageImpl implements AsyncStorage { clear = async (): Promise => { try { - return await this.db.legacy_clear(); + await this.db.legacy_clear(); } catch (e) { throw AsyncStorageError.nativeError(e); } diff --git a/packages/async-storage/src/createAsyncStorage.ts b/packages/async-storage/src/createAsyncStorage.ts index 8c69e446..ec4723db 100644 --- a/packages/async-storage/src/createAsyncStorage.ts +++ b/packages/async-storage/src/createAsyncStorage.ts @@ -76,7 +76,7 @@ class AsyncStorageWebImpl implements AsyncStorage { clear = async (): Promise => { try { - return await this.db.clearStorage(); + await this.db.clearStorage(); } catch (e) { throw this.createError(e); } From 190381cf60c8d02d9c7728f3dc55f60a949a8e56 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Thu, 25 Sep 2025 21:45:12 +0200 Subject: [PATCH 076/110] chore: comment --- packages/async-storage/src/AsyncStorage.ts | 8 ++++++ .../src/createAsyncStorage.native.ts | 17 ++++++++++-- .../async-storage/src/createAsyncStorage.ts | 24 ++++++++++++++--- .../src/createAsyncStorage.windows.ts | 26 ++++++++++++++----- 4 files changed, 64 insertions(+), 11 deletions(-) diff --git a/packages/async-storage/src/AsyncStorage.ts b/packages/async-storage/src/AsyncStorage.ts index b0faedbe..5c813c80 100644 --- a/packages/async-storage/src/AsyncStorage.ts +++ b/packages/async-storage/src/AsyncStorage.ts @@ -7,6 +7,7 @@ export interface AsyncStorage { * @param key - The key identifying the stored value. * @returns A Promise resolving to the stored string value, * or `null` if the key does not exist. + * @throws {@link AsyncStorageError} */ getItem(key: string): Promise; @@ -15,6 +16,7 @@ export interface AsyncStorage { * @param key - The key under which the value will be stored. * @param value - The string value to store. * @returns A Promise that resolves once the value has been written. + * @throws {@link AsyncStorageError} if writing fails. */ setItem(key: string, value: string): Promise; @@ -22,6 +24,7 @@ export interface AsyncStorage { * Removes an item from storage. * @param key - The key of the item to remove. * @returns A Promise that resolves once the key has been removed. + * @throws {@link AsyncStorageError} if removal fails. */ removeItem(key: string): Promise; @@ -30,6 +33,7 @@ export interface AsyncStorage { * @param keys - An array of keys to retrieve. * @returns A Promise resolving to an object mapping each key to its stored value, * or `null` for keys that do not exist. + * @throws {@link AsyncStorageError} if retrieval fails. */ getMany(keys: string[]): Promise>; @@ -37,6 +41,7 @@ export interface AsyncStorage { * Stores multiple items in storage. * @param entries - An object containing key-value pairs to store. * @returns A Promise that resolves once all items have been written. + * @throws {@link AsyncStorageError} if writing fails. */ setMany(entries: Record): Promise; @@ -44,18 +49,21 @@ export interface AsyncStorage { * Removes multiple items from storage. * @param keys - An array of keys to remove. * @returns A Promise that resolves once all keys have been removed. + * @throws {@link AsyncStorageError} if removal fails. */ removeMany(keys: string[]): Promise; /** * Retrieves all keys currently stored. * @returns A Promise resolving to an array of keys. + * @throws {@link AsyncStorageError} if retrieval fails. */ getAllKeys(): Promise; /** * Clears all data from the storage. * @returns A Promise that resolves once the storage has been cleared. + * @throws {@link AsyncStorageError} if clearing fails. */ clear(): Promise; } diff --git a/packages/async-storage/src/createAsyncStorage.native.ts b/packages/async-storage/src/createAsyncStorage.native.ts index 6ebc0dc5..ef46fa6b 100644 --- a/packages/async-storage/src/createAsyncStorage.native.ts +++ b/packages/async-storage/src/createAsyncStorage.native.ts @@ -4,10 +4,18 @@ import NativeAsyncStorage, { } from "./native-module/NativeAsyncStorage"; import { AsyncStorageError } from "./AsyncStorageError"; +/** + * Creates a new AsyncStorage instance bound to a given database name. + * @param databaseName - The name of the database to open or create. + */ export function createAsyncStorage(databaseName: string): AsyncStorage { return new AsyncStorageImpl(databaseName); } +/** + * AsyncStorage implementation backed by the shared-storage module. + * Each instance operates on a separate database identified by `dbName`. + */ class AsyncStorageImpl implements AsyncStorage { constructor(private readonly dbName: string) {} @@ -98,13 +106,18 @@ class AsyncStorageImpl implements AsyncStorage { } /** - * This is a proxy to old storage implementation, to help with migration to v3. - * Usage is highly discouraged and should be used only as a measure to transition v3. + * Returns a singleton instance of the legacy (v2) AsyncStorage implementation. + * + * ⚠️ Usage is discouraged. This is provided only as a migration path to v3. */ export function getLegacyStorage(): AsyncStorage { return LegacyAsyncStorageImpl.instance; } +/** + * Legacy AsyncStorage implementation, backed by the old native module API. + * Singleton to ensure consistent state across calls. + */ class LegacyAsyncStorageImpl implements AsyncStorage { private constructor() {} diff --git a/packages/async-storage/src/createAsyncStorage.ts b/packages/async-storage/src/createAsyncStorage.ts index ec4723db..056c9423 100644 --- a/packages/async-storage/src/createAsyncStorage.ts +++ b/packages/async-storage/src/createAsyncStorage.ts @@ -2,6 +2,18 @@ import type { AsyncStorage } from "./AsyncStorage"; import { AsyncStorageError } from "./AsyncStorageError"; import IndexedDBStorage from "./web-module/IndexedDBStorage"; +/** + * Creates a new AsyncStorage instance bound to a given database name. + * @param databaseName - The name of the database to open or create. + */ +export function createAsyncStorage(databaseName: string): AsyncStorage { + return new AsyncStorageWebImpl(databaseName); +} + +/** + * AsyncStorage implementation for web using IndexedDB. + * Each instance operates on its own IndexedDB database. + */ class AsyncStorageWebImpl implements AsyncStorage { private db: IndexedDBStorage; @@ -93,14 +105,20 @@ class AsyncStorageWebImpl implements AsyncStorage { } } -export function createAsyncStorage(databaseName: string): AsyncStorage { - return new AsyncStorageWebImpl(databaseName); -} +/** + * Returns a singleton instance of the legacy (v2) web AsyncStorage implementation. + * + * ⚠️ Usage is discouraged. This is provided only as a migration path to v3. + */ export function getLegacyStorage(): AsyncStorage { return LegacyAsyncStorageWebImpl.instance; } +/** + * Legacy AsyncStorage implementation, backed by LocalStorage Web API. + * Singleton to ensure consistent state across calls. + */ class LegacyAsyncStorageWebImpl implements AsyncStorage { private constructor() {} static instance = new LegacyAsyncStorageWebImpl(); diff --git a/packages/async-storage/src/createAsyncStorage.windows.ts b/packages/async-storage/src/createAsyncStorage.windows.ts index e7f5883e..2439bf28 100644 --- a/packages/async-storage/src/createAsyncStorage.windows.ts +++ b/packages/async-storage/src/createAsyncStorage.windows.ts @@ -3,13 +3,27 @@ import { AsyncStorageError } from "./AsyncStorageError"; import { TurboModuleRegistry, type TurboModule } from "react-native"; /** - * Because of missing support for Windows native target by Room KMP, - * Windows target uses v2 implementation of AsyncStorage. + * Due to Windows native target not being supported by Room KMP, + * custom storages are not available. Instead, this module falls back + * to the legacy v2 AsyncStorage implementation. + */ +let warned = false; + +/** + * Creates an AsyncStorage instance. + * On Windows, always falls back to legacy storage. */ export function createAsyncStorage(_: string): AsyncStorage { + if (!warned && __DEV__) { + warned = true; + console.warn( + "[AsyncStorage] Warning: Creating custom storages is not supported on Windows. Falling back to the legacy implementation." + ); + } return getLegacyStorage(); } +/** Returns a singleton instance of the legacy (v2) AsyncStorage implementation. */ export function getLegacyStorage(): AsyncStorage { return LegacyAsyncStorageImpl.instance; } @@ -231,10 +245,10 @@ class LegacyAsyncStorageImpl implements AsyncStorage { } /** - * - * This is a backward compatibility layer, to support Windows target in v3. - * Room KMP does not support Windows native target currently, so shared-storage cannot be used. - * https://issuetracker.google.com/issues/363195546 + * Backward compatibility layer to support the Windows target in v3. + * Room KMP does not currently support the Windows native target, + * so shared-storage cannot be used on Windows. + * See: https://issuetracker.google.com/issues/363195546 */ const RNCAsyncStorage = TurboModuleRegistry.get("RNCAsyncStorage"); From e3167f69ef1456db397f3873d0d2a4c85f4ac35e Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Thu, 25 Sep 2025 22:20:19 +0200 Subject: [PATCH 077/110] fix: export error type --- packages/async-storage/src/index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/async-storage/src/index.tsx b/packages/async-storage/src/index.tsx index f29b614c..928d7dfa 100644 --- a/packages/async-storage/src/index.tsx +++ b/packages/async-storage/src/index.tsx @@ -3,5 +3,7 @@ import { getLegacyStorage } from "./createAsyncStorage"; export type { AsyncStorage } from "./AsyncStorage"; export { createAsyncStorage } from "./createAsyncStorage"; +export { AsyncStorageError } from "./AsyncStorageError"; + // Legacy storage that is proxy to an old storage data. export default getLegacyStorage(); From 840d8546957f690882397b180314b04534126aba Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Thu, 25 Sep 2025 23:16:42 +0200 Subject: [PATCH 078/110] fix(async-storage): proper errors on windows --- .../async-storage/src/AsyncStorageError.ts | 5 ++ .../src/createAsyncStorage.windows.ts | 56 +++---------------- .../async-storage/windows/code/DBStorage.cpp | 8 +++ 3 files changed, 21 insertions(+), 48 deletions(-) diff --git a/packages/async-storage/src/AsyncStorageError.ts b/packages/async-storage/src/AsyncStorageError.ts index 7375f8cd..065a06f0 100644 --- a/packages/async-storage/src/AsyncStorageError.ts +++ b/packages/async-storage/src/AsyncStorageError.ts @@ -38,6 +38,11 @@ export class AsyncStorageError extends Error { } static nativeError(e: unknown): AsyncStorageError { + // do not override own error + if(e instanceof AsyncStorageError) { + throw e + } + const error = getNativeError(e); if (!error) { return new AsyncStorageError( diff --git a/packages/async-storage/src/createAsyncStorage.windows.ts b/packages/async-storage/src/createAsyncStorage.windows.ts index 2439bf28..3fbb7fcf 100644 --- a/packages/async-storage/src/createAsyncStorage.windows.ts +++ b/packages/async-storage/src/createAsyncStorage.windows.ts @@ -50,12 +50,7 @@ class LegacyAsyncStorageImpl implements AsyncStorage { this.db.multiGet([key], (errors, result) => { const error = this.getError(errors); if (error) { - return reject( - AsyncStorageError.jsError( - error.message, - AsyncStorageError.Type.OtherStorageError - ) - ); + return reject(error); } resolve(result?.[0]?.[1] ?? null); }); @@ -71,12 +66,7 @@ class LegacyAsyncStorageImpl implements AsyncStorage { this.db.multiSet([[key, value]], (errors) => { const error = this.getError(errors); if (error) { - return reject( - AsyncStorageError.jsError( - error.message, - AsyncStorageError.Type.OtherStorageError - ) - ); + return reject(error); } resolve(); }); @@ -92,12 +82,7 @@ class LegacyAsyncStorageImpl implements AsyncStorage { this.db.multiRemove([key], (errors) => { const error = this.getError(errors); if (error) { - return reject( - AsyncStorageError.jsError( - error.message, - AsyncStorageError.Type.OtherStorageError - ) - ); + return reject(error); } resolve(); }); @@ -113,12 +98,7 @@ class LegacyAsyncStorageImpl implements AsyncStorage { this.db.multiGet(keys, (errors, result) => { const error = this.getError(errors); if (error) { - return reject( - AsyncStorageError.jsError( - error.message, - AsyncStorageError.Type.OtherStorageError - ) - ); + return reject(error); } const resultMap = new Map(result); const entries: Record = {}; @@ -139,12 +119,7 @@ class LegacyAsyncStorageImpl implements AsyncStorage { this.db.multiSet(Object.entries(entries), (errors) => { const error = this.getError(errors); if (error) { - return reject( - AsyncStorageError.jsError( - error.message, - AsyncStorageError.Type.OtherStorageError - ) - ); + return reject(error); } resolve(); }); @@ -160,12 +135,7 @@ class LegacyAsyncStorageImpl implements AsyncStorage { this.db.multiRemove(keys, (errors) => { const error = this.getError(errors); if (error) { - return reject( - AsyncStorageError.jsError( - error.message, - AsyncStorageError.Type.OtherStorageError - ) - ); + return reject(error); } resolve(); }); @@ -181,12 +151,7 @@ class LegacyAsyncStorageImpl implements AsyncStorage { this.db.getAllKeys((errors, result) => { const error = this.getError(errors); if (error) { - return reject( - AsyncStorageError.jsError( - error.message, - AsyncStorageError.Type.OtherStorageError - ) - ); + return reject(error); } if (!result) { return reject( @@ -211,12 +176,7 @@ class LegacyAsyncStorageImpl implements AsyncStorage { this.db.clear((errors) => { const error = this.getError(errors); if (error) { - return reject( - AsyncStorageError.jsError( - error.message, - AsyncStorageError.Type.OtherStorageError - ) - ); + return reject(error); } resolve(); }); diff --git a/packages/async-storage/windows/code/DBStorage.cpp b/packages/async-storage/windows/code/DBStorage.cpp index 87b9bed1..c95e887e 100644 --- a/packages/async-storage/windows/code/DBStorage.cpp +++ b/packages/async-storage/windows/code/DBStorage.cpp @@ -595,5 +595,13 @@ void WriteValue(const winrt::IJSValueWriter &writer, const DBStorage::Error &val { writer.WriteObjectBegin(); winrt::WriteProperty(writer, L"message", value.Message); + winrt::WriteProperty(writer, L"code", "AsyncStorageError"); // from AsyncStorageError.Type + + writer.WritePropertyName(L"userInfo"); + writer.WriteObjectBegin(); + writer.WritePropertyName(L"type"); + writer.WriteString(L"OtherException"); // make sure all Windows errors are treated as "OtherSqliteError" + writer.WriteObjectEnd(); + writer.WriteObjectEnd(); } From 973f283b58881bfba08c32a76e914f1b0d595e37 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Thu, 25 Sep 2025 23:22:17 +0200 Subject: [PATCH 079/110] example: report error --- examples/common-tests/src/useTests.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/common-tests/src/useTests.ts b/examples/common-tests/src/useTests.ts index 72485b66..426bff2b 100644 --- a/examples/common-tests/src/useTests.ts +++ b/examples/common-tests/src/useTests.ts @@ -1,5 +1,6 @@ import { useState } from "react"; import isEqual from "lodash.isequal"; +import { AsyncStorageError } from "@react-native-async-storage/async-storage"; type Log = { type: "info" | "ok" | "err"; messages: string[] }; @@ -47,7 +48,9 @@ export function useTests() { } function reportError(e: any) { - if (e instanceof Error) { + if (e instanceof AsyncStorageError) { + alert("AsyncStorageError" + "\n" + `type: ${e.type}` + "\n" + e.message); + } else if (e instanceof Error) { alert(e.name + "\n" + e.message); } else { alert(JSON.stringify(e, null, 2)); From ff85b78f43a5ccdd95e4bc3f25e0774ed3b856f3 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Fri, 26 Sep 2025 09:28:48 +0200 Subject: [PATCH 080/110] docs: basic website setup --- .github/requirements.in | 3 + .github/requirements.txt | 98 ++++++++++++++++++++++++++++++ .github/workflows/deploy-docs.yml | 42 +++++++++++++ .gitignore | 3 + docs/assets/logo.png | Bin 0 -> 10841 bytes docs/index.md | 3 + docs/stylesheets/extra.css | 19 ++++++ mkdocs.yml | 46 ++++++++++++++ package.json | 4 +- 9 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 .github/requirements.in create mode 100644 .github/requirements.txt create mode 100644 .github/workflows/deploy-docs.yml create mode 100644 docs/assets/logo.png create mode 100644 docs/index.md create mode 100644 docs/stylesheets/extra.css create mode 100644 mkdocs.yml diff --git a/.github/requirements.in b/.github/requirements.in new file mode 100644 index 00000000..0960a733 --- /dev/null +++ b/.github/requirements.in @@ -0,0 +1,3 @@ +mike==2.1.3 +mkdocs==1.6.1 +mkdocs-material==9.6.20 diff --git a/.github/requirements.txt b/.github/requirements.txt new file mode 100644 index 00000000..d8b70ee7 --- /dev/null +++ b/.github/requirements.txt @@ -0,0 +1,98 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile +# +babel==2.17.0 + # via mkdocs-material +backrefs==5.9 + # via mkdocs-material +certifi==2025.8.3 + # via requests +charset-normalizer==3.4.3 + # via requests +click==8.2.1 + # via + # mkdocs + # mkdocs-material +colorama==0.4.6 + # via mkdocs-material +ghp-import==2.1.0 + # via mkdocs +idna==3.10 + # via requests +importlib-metadata==8.7.0 + # via mike +importlib-resources==6.5.2 + # via mike +jinja2==3.1.6 + # via + # mike + # mkdocs + # mkdocs-material +markdown==3.9 + # via + # mkdocs + # mkdocs-material + # pymdown-extensions +markupsafe==3.0.2 + # via + # jinja2 + # mkdocs +mergedeep==1.3.4 + # via + # mkdocs + # mkdocs-get-deps +mike==2.1.3 + # via -r requirements.in +mkdocs==1.6.1 + # via + # -r requirements.in + # mike + # mkdocs-material +mkdocs-get-deps==0.2.0 + # via mkdocs +mkdocs-material==9.6.20 + # via -r requirements.in +mkdocs-material-extensions==1.3.1 + # via mkdocs-material +packaging==25.0 + # via mkdocs +paginate==0.5.7 + # via mkdocs-material +pathspec==0.12.1 + # via mkdocs +platformdirs==4.4.0 + # via mkdocs-get-deps +pygments==2.19.2 + # via mkdocs-material +pymdown-extensions==10.16.1 + # via mkdocs-material +pyparsing==3.2.5 + # via mike +python-dateutil==2.9.0.post0 + # via ghp-import +pyyaml==6.0.3 + # via + # mike + # mkdocs + # mkdocs-get-deps + # pymdown-extensions + # pyyaml-env-tag +pyyaml-env-tag==1.1 + # via + # mike + # mkdocs +requests==2.32.5 + # via mkdocs-material +six==1.17.0 + # via python-dateutil +urllib3==2.5.0 + # via requests +verspec==0.1.0 + # via mike +watchdog==6.0.0 + # via mkdocs +zipp==3.23.0 + # via importlib-metadata diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 00000000..1def9138 --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,42 @@ +name: Deploy docs +on: + push: + branches: + - main + paths: + - 'docs/**' + - 'mkdocs.yml' + - 'CHANGELOG.md' + workflow_dispatch: +jobs: + deploy-docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + with: + token: ${{ secrets.GH_BOT_TOKEN }} + - uses: actions/setup-python@v6 + with: + python-version: 3.11 + - name: Install MkDocs + run: pip install --no-deps -r .github/requirements.txt + - name: Copy changelog + run: | + cp packages/async-storage/CHANGELOG.md docs/changelog.md + - name: Setup git user + run: ./setup-ci-git-user.sh + working-directory: ./.github/scripts + env: + GITHUB_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }} + GITHUB_NAME: ${{ vars.GH_BOT_NAME }} + GITHUB_EMAIL: ${{ vars.GH_BOT_EMAIL }} + GIT_SET_GLOBAL_USER: true + - name: Build docs + run: mkdocs build + - name: Deploy docs + uses: JamesIves/github-pages-deploy-action@v4 + with: + folder: site + token: ${{ secrets.GH_BOT_TOKEN }} + git-config-name: ${{ vars.GH_BOT_NAME }} + git-config-email: ${{ vars.GH_BOT_EMAIL }} diff --git a/.gitignore b/.gitignore index 79ff3739..8204b61f 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,6 @@ captures .turbo /packages/*/lib build/ + +# mkdocs +site/ diff --git a/docs/assets/logo.png b/docs/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5883e35865297a592bfc82912c3d2a16ff151854 GIT binary patch literal 10841 zcmeHtFuASES3cejLeNJ%LwNJ*!}3^_Cmhz#8+F(54r z-OW3{^B0^?XRWi=`{DWU)ZX{L^SZCSW3}EWlM*oy;o#tqs=R)sgM;(n>wgyj7yE=9 zotJ@w!^fubO75*+<_?-L?d?>S_?=f-S<9^CsHpQ3(b3+De2s|Q8bGIck83x_Bc*~^ z6)KCtw6sfZ|D~SRZj}`d|Mv!>e6dtRNh%vzuej+s!qq;lkv=G-!B>1n@tL%jA;m4A zwCsG#Xn)oX?bYIj4lG0FY{r_tZ)nEf65PzZZrM~4m_NXIfFmT=yHACK^NuJCAE*1J z#e)yRKm!~L5Jnq#9Rd9YH=`N?D$JFTup1P2bWQych#Zxc#1J*^~(?1 zM;;7vDJ4&R{OumP`$d-c6!PVJD(I{=7m%k0Kp)xsW`5?V2r!he8Bfp*zQ01QzG=O; zoS*f=e<8*r4}iR@bo>>pTc#v2d(@(jK8rod-b~1nIJ}Eq%mGpJfH+oMVw0ME!Z?9S`qZE?eX zl~N-OS#C0k?Z@FO(H*$bx>uy;BB!+#zU{d+0av5d)0}h>1e-vE+|BxLslLYm@kud* zC7-(5uZDj~aEVU_nMIKq$`{wMH|wb3W7m=qTyE^QdDxZuKOcq>bHx&m4Too91^Vt* zRPxz4M@lRx3DH_?xVX{3rRfMH6euZQtLT^$lK2l z`PW#b@AC7r1Pjn%_7@Ef@G@v?I)6#M5=`B_GGN5 zClkLQ07#YB%s+73T?|HPMlEH$qA@?xyS^dk=5Im5v8!3mBf1A+_&#ndKBY6P!qov6 z>(ldjyc)$cD&jQ&PFMSpfM5m-JUm(+vFRaC>Cc~1wzm3SC#4}&>uZfha%3Xq30_)+ z$p`DfXA1P`&nK6@I@x%*mQRjUELuY5{LlU!c4m^}(c%)X*^!li*LrS`K2{cu^Nn$G z#HOhh>3NFAj}F(L9seAmK7z4101eoDH%q`oH?cdfq0dTm_Nla|eKt(&1C_%xNy4#7 zi1J+1Q^Yn<94&QP>@v?sr6-yJ?E`HlFz>tkRzKk6TRA6u34C8`;H@|@m#pF36g4v= z2FpHI%xEhnqqin4-uV;gb0B@1ABf(%2S(3>87_kj}l#MY^CCD+X7E- zUKPdb;(J+=5Yz3A#{oSzkIR`{QyT$|e(2w_=*t@K+q)K)BvIISDmj0_0ivL&Zg=Oo zuRZZcc?-Ge?;*d@yNwRJ_ipjqrmfeTL+wV0J+^tyz{T;TSy&3JqWaVLE>s7~5v ztdIZ?Y9O=Aa{grjjs5RuRNVx6_hL%_j=zU?nwC-*^urOtxzV=maC?0Uekz52D?Y^F z+2=<^^tU!6*V^DQ&|uUyAT+f=|9O3{=vSC8z;4E90Ms0kaJhA)H$Oum??&(Se1_Df zd!gwe=b5`S>PwW|p`677M_9)C3O!XuhHw1(j^UOYo2}KrcwT{tse{u{+3v_l;MpC2 z^!Z-f>bL%*>_I0d<^b-6Uj@v}yZrFIJG>5R08D2yfFa#{pnq1k5dCr>m!>7LonkXW zq{nT(DiLeWuBLIh^2rwUa{e}ZWi{~A^2TMeP91UkudOQ!i(B<6_Gd2rZCQS-YB>GBWZQctfE;TwbWLCBA@u7r06+n^@Uv0z`<0{;{Lh=pkN@ zqy9r2KJJz~`c920-l#bW1j8Xoc%$)di=`F%e$`*bWv@8jKkZ3cV?fF;)ZMfx0oA-+;FcN+m4Z7boq5)POg zEd$t4ZU0jze7z{yRe{{>HhNj+WUP(+qYCx@ajQOnRBwsfb>T{wp8cq-1fs!%@)}9n zCB(Nq6WvqUI}X1ZEoXW`IRTJG`N*Y8k9euKfnzj6cnn({Uh1wSEG zeJk&;$0}TSBW^r?POAkbax1@!ICde0Zg?@701FfEd1Z<)dYhNeR9_b=NA2l<#E~a1 zUt5r!9eUDwcQPg*9~o;^BP+rzIp3^RPl_t0vEAGnNQS1gP!P_D4cXZ`@k@SGd>E!@ zR8iUV2W9rf)%^bAY!W3Wqjf6@| zNo)dTmO;Mj5hC~1Ra`rS5;^Ep{3{s@=ShXi+v`q~4xZ6WC_A~!#YP+g4LEI--e<+P zL6LWve@JbP!{Rk1 zwn@kD%%z#pOj;a$!i=bSMMb4~qwzwXH5tR9qnf{K8b(v9CF9G0OBSZbw=gu`uzk82 zc`2`3$w>;XE<$~FG)z%rgjy9PW8}anZAV1G!!TO`JgCY$-_5`OSOu$*MV;X2_jxWx zjx$jLIjusqewdzXbE&IrQFx8}EP^sHW^8y^NNH&(vb{d>Z@zzBjU!ycv;@Z3tKqE3 zfqpsEJUXQx>~@C_irqXrFvf%&?SUij@l?dM=61GUEYa>o+;1`xhPt9gOpl$`88L~1 zk)@!*W0vwct#N?YTTnAbguHxsw;Xh@q1d=H)?jW!1`&n9a(=-I5Vt03{`+P>LOK4* zns7owW=NAob#`o7r8QCU?`CPn$2i~bL-dUdW!zCTzJGF-H@kp8YKwL1KRSPe>&_| zxib4(M>h?=?gep~>>j*jd^8)7i$V02tWt+osx~54J3gm&q`KYUnXj*=V&4dL})*6-yD7z5&CB~ zX!17B?KvWvRW5ZpiW2!Jj`h;V1k``)j^SVO2&qpcr9)-gTr~zs5;`U?@=w!~M*SX^ zrMQWrg^taM-e(A$8J%`}rTC5`YR+0pUch6Nj10}qrL5x42uB(tfEkhyTO&@C^_YQZ z@pax`5FXUS36`NpG43WKXm&1CEyFD@*_B=JCvKa@xcXc`_QkOe+ACY!W&9}i7;bNW z`zoVeub7(w)3q*d%~lnc)WYb2t@Ro7R=zI?S=Zy?I|OhZDF@rjnDr!3<8{pdmzjbm znGwZuMc2u^ALQfUQ+(WVKvPC?-di8ilm0B=*FAl#aULf3Y%1W_o{l<0mdM z#9j1M?Jib5Kxf&=>c}q3@5SELM4koEK(QCqst;cBdo!+)^g=<%*rF)tBil8P|LN_Z z`myUZ_kEFm*DV4wz%|$q6yrIn`UBd>Dg0d`4JS;`h2_VQBM3yG-&UQ#Y-P{N{fpd4 zTh((iO7#&O@;=XGeM(l{$bdq?>-2qXibh(F^=Q8&X^@YjQ-L1|Kja~Hx&66u{m&!1 zxAsmWT-&R`=DilvRccW~uA5extUSRm|KD6&*|q=+8` zlWH#kg8;Dnnns`IJ%RhHE2HIbwxw0;GMbC>$e`bGZEU?mJ;RTzR)7_PWN{T0>5bku zFP!0#L%GSLN`+|(&o8h(y;?D*zr9zpKFVU*ueApKU!W3v5qrSBy-eZ`6OG}TRPuQ_+YourJ~ zPmyI@`(a|%qjUqj1|R>d9%>mz?lTcNPE85FvcRXqEq^UKJyfZ}VA zoN`f3t7mIoUFl^4S=8kFWD8TEKs>-FOF0P+(`D~ZMc z0JG9E*DE)kL*A}FT$;Udet(I}S#yL>aK50G7Zk?WpxS08rK^X4f;~G)}C3qrME(`fs46cBpUaXVy0B-A8e{%&#%>O^8Hnlr3j7+Of&D zsVquGKw~@lL)e`)h33X61i-{mPt=u@DT_H{X`x!|RdHeQQUv<0_oi1xYuSu<`3w`i zI-lz8$5qBj*T^r{b_BPxt19l@|0up<>Q}vqsrQY1y!_6vE8xeD>qOeTU@p+0+c>ub65O=_3#H9MIZ|ZFO9qm%S#YYtXK$INVGA0Y- zeP~M>*+e&U>NM9Osi|Bkk@~bCFv$Md+#<^tl>G9$#@0_+YT!enSeh3ANQ9}B_fhZS zLxj&|-*9TiNOsjCEYn)RC)$yd-pU?V@G|F6PfT;@Qs*3r$X;LF6xm9bVRmX_OM_99 zrYeqmaoV^0GPQMnkh7rQkpkVq_XL)f&dh7x>MVH`lo1y-{b!&2$iecy-x|Y4439oh zVi+6c$_EW-NTWJ!OI4mYlzom;f>yCrsf!gYy+fOhQ^j!s^dDXNqAQ4p1T>gL)D@z3 zNbG_fcTCPmI2Crr5)uYao-Wq_NNvSCvLwU8JDyIB3(p;UE!H0XjLpGtLF-R_`fQUmZCrUU|JID3VAlfPg&xh)MC3XTRybm zRSL3Z!vNzrj&9bn{Gh50Qcd&YSwP8^-e=Zjx~u4@M1WZa5)8()c*F`(UnV1RfCd}9 z&?p`j1+S(()<>nIh^Y6qIP?)(#E^$T7g zI3sN-s19f0bp;VEC4c!@F-Wv5&Ivr2u}H&$m*xU}^ZSXB+M%+bWI+JF0k-1F_nNM5 zko?n5Pu*YCm>r0E#Z>tuMUTS}({VzoCvD3E!Anu;hLZVsH1i1noYREXOojZq6MKt>wDe@%~S+%`Be}>=CF33q!WWSC;0BJZyO09gtlXu9&#YXxyW{Df;O;cKt z`)LN|v^ne*j96p0zoHhBECx$dOVvENU&;L!CkLt_E{tN?N&VcDJjJ4A;9yCw;Cs^V zX{+^*vdkvLpZOO~GGim+)Ai5Y_^@#=OmYFDJGevQy20 z>H}DyaN^mA#ew&$Ty}X4=6;I5JH{&7VKaA*D|LgwmQe+pmNv&jiKhd;0LVjZavew8 zqJPckRx(Lvrk4}ih9nh5K*x#0OI>*{``4UJLuWhvR-3P5tw!V8vn`@pj~HgKS)m^*y|qJU$*En@3NpK{mvICr&hS)hTO zuXeko(Y(8KjXUPs?I6CKnvre8s^FtJlIr=XC@v9*h~vPpF;cd48@FMpE>{4~Q0+D> z9h>?+3m&czRnNh7c1(&39^D{e`1#)Bz&jA*DhQj-i5$5Lw{S{s4f>UDnd?r~+o(HH zyVTgv?(mErFO0^4T;mckeWuxdO|ZSOJlMC+fi|Pumgf}Vr3#_RGjG2Lm|2<>^dk6@ zYRaRYh=A9O_8vXN1vk=?q?fd)S;3@#?PW7&eBbUuy6$n{Fw;QQhwbn)^efeYs&TO#3n6qg64mF;5+@G3+}2A+eCWn-OL9x!6~08 zq|jxQ{Q1n=U-bd74@RO^KlTK^wAPs!f>gWW!=}f0P$n~c4 zWMHAlfHtO59xLFtJxDNPhOcy6V1a8jP2VAj97ab^{Hwchk=gADUnom-l5)JVnG8Gt zF$8Sce#F8fga-v~EpFbR^s{?gp_-lC>G9}_KdL@*LdW#eOL|_|$|#$8#M^^@8S<2$ zhYk<=_uu04#`Rw0p!2-S1>N^c(>0^FiIkAOsP4#0d^`Cuw=xJuxZblWf^@9vhzb|{ z&O1XNyl7%C(&cuJb@bvcpO~z73Ogy}O@;R{Qi796VX3OFOA1@p^3E)BY{37@pKrxd zN>^87509cnbo+pT32wPA+xS!eq>4_KHX&Y@(hnV%NBh!e;<7FBGzldDFpDOy!fuY< ztZIkfmB=jz0iOztJ*Q~B%|3@?9TpjF{&b3)0fne7#&!e$i$C18yFPJfq!<@G2_eJC*J8$lM{KD!TJFmpaC!F$cd@VmV7VogWo>yIlyFm)`Ae&_&q7)#w}Co1 z&#}UxYEVXOb?HMT$E-5BV*OfkQcD^R><^>NZ2>Nu#AAL}zx=0<@bit4xhxHobI|k| zMXkW1r$tU(h`X&p`FTDpsFll;Qd{b8pd3l7@|O@mE(oxju1;n1z1fWr zXfI@Eac(pX@?^(*fC~oR37zL4>O*aMu1?ep>u6G;(?v(@K5ofqoa2SOIj`4gy{H#g zS~vj6J(iTjT4FiqTFkxuq&I;yGG+vbAbY#D;FVM!^y_N6OQq7pKu6rzmoJzH2QTFw z%g=_kV$SQ64z#y8f_%;wfE%u7r23y!dn+sMj;hS`+>nJ~CNG+3TR(Oj&3|$k^ zT|+5xGHJar6>m?j-cg5I&qxc*XkXHfqR}$V%$CWIG;BR%`)JW9Iltvi$Vu-o={TZa z55(6rmHrw^p=U%P&k)z3Gnu{T^|C`309k^RWmVMO7DzqgiT-o^7F4EM-ebQoE0jye z)#ho54LcqW02yA2dsmrI35yH@z`q;xM5JOwqF9P8B zk(O$h>i5Y#0Rw;rQBW*CJ{>s?-I+fzdRoT6xOXar>*1Y2NW;e6zZv}EaP zLDyaX^eFY-?-uIqJR51M-g>0k5PJ64d00~-?T4}E?eZ!*BViY_;eoi@>mX*JI+8!% zLdP5*B9)gy*o~2FV5(iWOI%-<3dS_QCcBaHQ2qJ8H;A@rTFipC_focqa-lPpX}7?{ zK1{*CQT+I=tvod$T`Ked55y{6bN-#&)vsgUi-%oE95L`sr685c;toobO_=$boYXv;*HvzaWX`=fs^&e(H6FQ zYmzGGK5K8byI1nPmKVnoJreC{hl-nw;>^-t!SEVlSa}zXXASssB79tMZ|-C*?jtJM zRyr#*>J$1W`M$*Ia&>*}xaQSrPvGKnbmpDJb@T+!glbcDXWRUJZM9oUixvK0()trT zXc&aj^L zX?AKMK=r*v{YJ8RGNz{RxIVc+*^|>)Mc}Ek)BU$oy*dqU^6fnUI=X}JD}f+V(fQg{ z`MjJFT9&9S{ytCMk+$Xg?cqhX{#s7gv<`q3m09-sE;5Kfs`*WMq1d%}vy08Cvc=^? zeL`YO&n0Ye)(oANoJ=mSv_Ix}i*6o0VM`N*!#4Agfb>g;K7zSSwdD!Et=QYj?cJ|c zg>GkxKSFAMZ=^u+`-CojZqkAol62>3+qy|kbS-+R(J?t+n5*^3r22HE;Nu`(?= zeQv2Xc?9{?d`Z$%#S4vJ9<~k_B6UoD zTFC3(#=g~HWz2J`WQt@%n~g0b<|M7Ox&Bra?y4{tc3a_rGi5gO&xjEmT%yf9oT2l5W~V>4jsAv=%5# zEdUVrCfMw^1X>DqxaTwe5((h?hWaGI!DF~*R{VQ8mQFs~fx~l?ov0r$Tm=jNlK(tn ztbCoSk|H3yM!9ePlks|M&TP&1HI|0Q3!Q`PN8(*>4Fxm*Z6Qvd>cSq3<{eA89!&W0^3CXm4k}lYOy;IiYvnWi#E+>T29gz6-u?4l6_GkXEY&hQCGU4HzPG zlcCut8g{HN4*PA%fux3+gzQ|_Ey#xfegKH(NgB{)4_Ac4XbPcebv&X3Fzt_CY zVd_FE0)U!mtrI-d=U9RWC`+-PP9SW;v}g2mfjk#KY&|we@83@A`t|2kD!rpK^h*ri zp8Z)?WBdu5PXx3XgqO^k=nS7x*m-6qQ!{`vE9v9=bTB%eeeN89$M;rkxtv zq33m{lV~pX)mu6;Th?mSH2h-Y_2Km#bkd`mruOp{ncM*QCkU@}qCVLr3ZZEz#653( zm3%thb}N!@*e=mnBu#s|(fYxn{^QN@%41(W#eFOq*u1UEbnRKveDg%1WWDYwe1`$L zmtS@e0p*kR^Sy;XSx~QOZuF7dI6J1s1&@>sTweqe324As(k}&@M(0Q7d{%C|XF|I9 zzk5Httqs^8@HLmv^sP*vdXH6@B?)*$ru0%PbDU#(qMrbM6A$}I=He-Q6{6iv{A}pH zSlk{DFAV?gFN?+MDzJsr*R?24%VsRbktLH1=uLP`Ld6jqa(K5PlI7YrbB}Jl)xwy= zogY4RD5}}*x)yM&DBCx`9w4s|@KP!w3rp6tpJ-1n+A^4*y+7O#nSayjZfGa+jP(Se znv&QIfHg&Q2YN|<=)l#$knaZF?^LfjtM;Z3AK!0A%;X=Yp=HP>_yD&rQ!pw^j2Ju1 z6EraZ_Tsu~z3ag2_Esj|ZPwd+-}vWUqTg&X+YtXxY#wgo8347`V$;XmhIrGRpf@X4 zLm|En(T0j6m<->b)z9YK=9tMSyP1K13oLY>*w0!6_sRrU>Bsz|JNj#jsR&fEmbiaO zPK;fZN6hQk9um$cuvUE%U2oo0Lg~$`)_4dP>y3ZfZkA#%^F_i)FpI_%|=e z!G++<+(=1kzdazuB;Ma0eBPMWO)Ld5p}kg{6={Kjt4=RHQoFAHc% zDT8_??4qO+5VZYM&!GW+6Y#yYy;+v{$r>|OnEt?X7ulIaKb6pvVYM&20kJ@xiE=EH z(+uxfto`_Xai^O@N}GhDzE(h++^BS1wN6+C|5Ldfc)}TEM+W#aMfK9cpPib_eyK22 z;XnB|9&Ql+E<@Dp@NC4m8rd#6lUB!Lc4=orf9z&=7fwZLl9>8$*_VOUv-}ETu#1rU zz3eAyCjx4zdYA!@I~aF1=AF~(w*pT+pFP3L@_9JqU`$$8(s~)LRz7gO=F$K8$)@He zM(abzk*Wk`Z1~Bf`@ZC16hbx2hSrvEr_Y>}y%QKP%W> zWNyV{uWGfs9_SZ`6-Geo2?m0fM=}te{SAm8(Z+j98TWZ; z;4ssy*G5bDl!y9(dgwA-%kUKx$wq0- zqb$@{&~>QydosPz$+%Da(E$tYfbsY7BQt5o7@aL1siFGDF5>8}qeRar%D0|?ygzZ2 z{(NJ53nP#dZMER<%tVByo$`RF-_?Hh;sStX28532x;i}q7l_4QfaRK}3`8RF-$}te zS(d3g<)wnd>TG*QZmk3QBas{;_XK=pI72Q zT!M%_d>W#t*BnfkPn3?I6|TbB8X^N%bxnEV;2oh@h(oN{d^c!4#?$^-d0lsLqCdfu z5!fLMfUrhBreGivZlI5I1siHs@$5G}ct;ktPR>9S)wx{ZlTs^J{z7(d@)9Uzqz~kv z^FG($p(Io6tan^js%R4v0XX8zh0~_w$S(^OiHbeS`Fle`KCT`*z%oF1!i22falHv|XQqaUjPD;Wd@|-uQ9B#1qjSXnh28XFi|kyMD5`dV z)Z&c*@v!Qop%$ekN-es()fz^!wQPRe*vw|^OA5gWe-uUo$$M?!AD!EwZCWxxA`cCF zfNitod57L?e=T5i2$j?FZxG>He(1$sg&VE&qcOOro-u|vTq_Z1@IX*5Yvmz;M*;RQYN%*NH#=$tz*63XkXNvaa@fv57BdJ3#CT=HbG& z!{3iM zfsXhnqA=UFZP$%7AoJkh>{^`+py2J^S6|Irfz3{XLyR?*poFPc-%hM@8|?s|tCG@c#j%a(~nS literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..4ff3dafe --- /dev/null +++ b/docs/index.md @@ -0,0 +1,3 @@ +# Async Storage + +Asynchronous, persistent, key-value storage system for React Native. diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 00000000..9bfb5a21 --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,19 @@ +:root { + --md-primary-fg-color: #32b982; + --md-primary-fg-color--light: #4dcca0; + --md-primary-fg-color--dark: #24986b; + + --md-accent-fg-color: #ff7a59; + --md-accent-fg-color--light: #ff9c85; + --md-accent-fg-color--dark: #cc6046; +} + +a.md-header__button.md-logo { + padding: 0; + margin: 0; +} + +.md-header__button.md-logo img { + height: 48px; /* adjust as needed */ + width: auto; /* keep aspect ratio */ +} diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 00000000..1fdc4afb --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,46 @@ +site_name: Async Storage +repo_url: https://github.com/react-native-async-storage/async-storage +site_url: https://react-native-async-storage.github.io/ + +nav: + - Introduction: index.md + +theme: + name: material + palette: + primary: custom + accent: custom + logo: assets/logo.png + favicon: assets/logo.png + icon: + repo: fontawesome/brands/github + feature: + - navigation.tabs + - navigation.footer + - content.code.copy + +extra_css: + - stylesheets/extra.css + +markdown_extensions: + - admonition + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.details + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - toc: + permalink: true + +extra: + social: + - icon: fontawesome/brands/github + name: Async Storage + link: https://github.com/react-native-async-storage/async-storage + version: + provider: mike diff --git a/package.json b/package.json index 7addf686..70ba5bd4 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,9 @@ "test:ts": "turbo run test:ts", "test:format": "prettier --check --loglevel warn $(git ls-files '*.js' '*.json' '*.ts' '*.tsx' '*.yml' 'README.md')", "release:version": "./.github/scripts/setup-ci-git-user.sh && changeset version", - "release:publish": "./.github/scripts/setup-ci-git-user.sh && changeset publish" + "release:publish": "./.github/scripts/setup-ci-git-user.sh && changeset publish", + "docs:serve": "mkdocs serve", + "docs:build": "mkdocs build" }, "devDependencies": { "@changesets/cli": "^2.27.7", From 47cf28b41ab4ce074cac7a45c447e749cb4282cc Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Fri, 26 Sep 2025 16:15:48 +0200 Subject: [PATCH 081/110] docs: v2 --- docs/API.md | 582 +++++++++++++++++++++++++ docs/Installation.md | 55 +++ docs/Usage.md | 83 ++++ docs/advanced/Backup.md | 23 + docs/advanced/BrownfieldIntegration.md | 224 ++++++++++ docs/advanced/DedicatedExecutor.md | 28 ++ docs/advanced/IncreaseDbSize.md | 24 + docs/advanced/Jest-integration.md | 76 ++++ docs/advanced/Limits.md | 15 + docs/advanced/Next.md | 109 +++++ docs/advanced/Where-data-stored.md | 9 + docs/debugging/communityPackages.md | 15 + docs/help/Troubleshooting.md | 109 +++++ docs/index.md | 16 +- docs/overrides/main.html | 8 + mkdocs.yml | 23 +- 16 files changed, 1394 insertions(+), 5 deletions(-) create mode 100644 docs/API.md create mode 100644 docs/Installation.md create mode 100644 docs/Usage.md create mode 100644 docs/advanced/Backup.md create mode 100644 docs/advanced/BrownfieldIntegration.md create mode 100644 docs/advanced/DedicatedExecutor.md create mode 100644 docs/advanced/IncreaseDbSize.md create mode 100644 docs/advanced/Jest-integration.md create mode 100644 docs/advanced/Limits.md create mode 100644 docs/advanced/Next.md create mode 100644 docs/advanced/Where-data-stored.md create mode 100644 docs/debugging/communityPackages.md create mode 100644 docs/help/Troubleshooting.md create mode 100644 docs/overrides/main.html diff --git a/docs/API.md b/docs/API.md new file mode 100644 index 00000000..8560437c --- /dev/null +++ b/docs/API.md @@ -0,0 +1,582 @@ +--- +id: api +title: API +sidebar_label: API +--- + + + + +## `getItem` + +Gets a string value for given `key`. This function can either return a string value for existing `key` or return `null` otherwise. + +In order to store object value, you need to deserialize it, e.g. using `JSON.parse()`. + +*Note (legacy)*: you can use optional callback as an alternative for returned promise. + +**Signature**: + +```js +static getItem(key: string, [callback]: ?(error: ?Error, result: ?string) => void): Promise +``` + +**Returns**: + +`Promise` resolving with a string value, if entry exists for given `key`, or `null` otherwise. + +`Promise` can also be rejected in case of underlying storage error. + +**Example**: + +```js +getMyStringValue = async () => { + try { + return await AsyncStorage.getItem('@key') + } catch(e) { + // read error + } + + console.log('Done.') +} +``` + +```js +getMyObject = async () => { + try { + const jsonValue = await AsyncStorage.getItem('@key') + return jsonValue != null ? JSON.parse(jsonValue) : null + } catch(e) { + // read error + } + + console.log('Done.') +} +``` + + +
+
+ + + +## `setItem` + +Sets a string `value` for given `key`. This operation can either modify an existing entry, if it did exist for given `key`, or add new one otherwise. + +In order to store object value, you need to serialize it, e.g. using `JSON.stringify()`. + +*Note (legacy)*: you can use optional callback as an alternative for returned promise. + +**Signature**: + +```js +static setItem(key: string, value: string, [callback]: ?(error: ?Error) => void): Promise +``` + +**Returns**: + +`Promise` resolving when the set operation is completed. + +`Promise` can also be rejected in case of underlying storage error. + +**Example**: + +```js +setStringValue = async (value) => { + try { + await AsyncStorage.setItem('key', value) + } catch(e) { + // save error + } + + console.log('Done.') +} +``` + +```js +setObjectValue = async (value) => { + try { + const jsonValue = JSON.stringify(value) + await AsyncStorage.setItem('key', jsonValue) + } catch(e) { + // save error + } + + console.log('Done.') +} +``` + +
+
+ + + +## `mergeItem` + +Merges an existing value stored under `key`, with new `value`, assuming both values are **stringified JSON**. + +**Signature**: + +```js +static mergeItem(key: string, value: string, [callback]: ?(error: ?Error) => void): Promise +``` + +**Returns**: + +`Promise` with merged data, if exists, `null` otherwise. + +**Example**: + +```js +const USER_1 = { + name: 'Tom', + age: 20, + traits: { + hair: 'black', + eyes: 'blue' + } +} + +const USER_2 = { + name: 'Sarah', + age: 21, + hobby: 'cars', + traits: { + eyes: 'green', + } +} + + +mergeUsers = async () => { + try { + //save first user + await AsyncStorage.setItem('@MyApp_user', JSON.stringify(USER_1)) + + // merge USER_2 into saved USER_1 + await AsyncStorage.mergeItem('@MyApp_user', JSON.stringify(USER_2)) + + // read merged item + const currentUser = await AsyncStorage.getItem('@MyApp_user') + + console.log(currentUser) + + // console.log result: + // { + // name: 'Sarah', + // age: 21, + // hobby: 'cars', + // traits: { + // eyes: 'green', + // hair: 'black' + // } + // } + } +} +``` + +
+
+ + + + +## `removeItem` + +Removes item for a `key`, invokes (optional) callback once completed. + +**Signature**: + +```js +static removeItem(key: string, [callback]: ?(error: ?Error) => void): Promise +``` + +**Returns**: + +`Promise` object. + +**Example**: + +```js +removeValue = async () => { + try { + await AsyncStorage.removeItem('@MyApp_key') + } catch(e) { + // remove error + } + + console.log('Done.') +} +``` + + +
+
+ + + + +## `getAllKeys` + +Returns all keys known to your App, for all callers, libraries, etc. Once completed, invokes `callback` with errors (if any) and array of keys. + + +**Signature**: + +```js +static getAllKeys([callback]: ?(error: ?Error, keys: ?Array) => void): Promise +``` + +**Returns**: + +`Promise` object. + +**Example**: + +```js +getAllKeys = async () => { + let keys = [] + try { + keys = await AsyncStorage.getAllKeys() + } catch(e) { + // read key error + } + + console.log(keys) + // example console.log result: + // ['@MyApp_user', '@MyApp_key'] +} +``` + +
+
+ + + +## `multiGet` + +Fetches multiple key-value pairs for given array of `keys` in a batch. Once completed, invokes `callback` with errors (if any) and results. + +**Signature**: + +```js +static multiGet(keys: Array, [callback]: ?(errors: ?Array, result: ?Array>) => void): Promise +``` + +**Returns**: + +`Promise` of array with coresponding key-value pairs found, stored as `[key, value]` array. + + +**Example**: + +```js +getMultiple = async () => { + + let values + try { + values = await AsyncStorage.multiGet(['@MyApp_user', '@MyApp_key']) + } catch(e) { + // read error + } + console.log(values) + + // example console.log output: + // [ ['@MyApp_user', 'myUserValue'], ['@MyApp_key', 'myKeyValue'] ] +} +``` + +
+
+ + + +## `multiSet` + +Stores multiple key-value pairs in a batch. Once completed, `callback` with any errors will be called. + + +**Signature**: + +```js +static multiSet(keyValuePairs: Array>, [callback]: ?(errors: ?Array) => void): Promise +``` + +**Returns**: + +`Promise` object. + +**Example**: + +```js +multiSet = async () => { + const firstPair = ["@MyApp_user", "value_1"] + const secondPair = ["@MyApp_key", "value_2"] + try { + await AsyncStorage.multiSet([firstPair, secondPair]) + } catch(e) { + //save error + } + + console.log("Done.") +} +``` + +
+
+ + + +## `multiMerge` + +Multiple merging of existing and new values in a batch. Assumes that values are *stringified JSON*. Once completed, invokes `callback` with errors (if any). + +**Signature**: + +```js +static multiMerge(keyValuePairs: Array>, [callback]: ?(errors: ?Array) => void): Promise +``` + +**Returns**: + +`Promise` object. + +**Example**: + +```js +const USER_1 = { + name: 'Tom', + age: 30, + traits: {hair: 'brown'}, +}; + +const USER_1_DELTA = { + age: 31, + traits: {eyes: 'blue'}, +}; + +const USER_2 = { + name: 'Sarah', + age: 25, + traits: {hair: 'black'}, +}; + +const USER_2_DELTA = { + age: 26, + traits: {hair: 'green'}, +}; + + +const multiSet = [ + ["@MyApp_USER_1", JSON.stringify(USER_1)], + ["@MyApp_USER_2", JSON.stringify(USER_2)] +] + +const multiMerge = [ + ["@MyApp_USER_1", JSON.stringify(USER_1_DELTA)], + ["@MyApp_USER_2", JSON.stringify(USER_2_DELTA)] +] + + +mergeMultiple = async () => { + let parsedCurrentlyMerged + + try { + await AsyncStorage.multiSet(multiSet) + await AsyncStorage.multiMerge(multiMerge) + const currentlyMerged = await AsyncStorage.multiGet(['@MyApp_USER_1', '@MyApp_USER_2']) + parsedCurrentlyMerged = currentlyMerged.map(([key, value]) => [ + key, + JSON.parse(value), + ]); + } catch(e) { + // error + } + + console.log( + 'parsedCurrentlyMerged', + JSON.stringify(parsedCurrentlyMerged, null, 2), + ); + // console.log output: + /* + [ + [ + "@MyApp_USER_1", + { + "name": "Tom", + "age": 31, + "traits": { + "hair": "brown", + "eyes": "blue" + } + } + ], + [ + "@MyApp_USER_2", + { + "name": "Sarah", + "age": 26, + "traits": { + "hair": "green" + } + } + ] + ] + */ +} +``` + + +
+
+ + + +## `multiRemove` + +Clears multiple key-value entries for given array of `keys` in a batch. Once completed, invokes a `callback` with errors (if any). + +**Signature**: + +```js +static multiRemove(keys: Array, [callback]: ?(errors: ?Array) => void) +``` + +**Returns**: + +`Promise` object. + +**Example**: + +```js +removeFew = async () => { + const keys = ['@MyApp_USER_1', '@MyApp_USER_2'] + try { + await AsyncStorage.multiRemove(keys) + } catch(e) { + // remove error + } + + console.log('Done') +} + +``` + + +
+
+ + + +## `clear` + +Removes **whole** `AsyncStorage` data, for all clients, libraries, etc. You probably want to use [removeItem](#removeitem) or [multiRemove](#multiremove) to clear only your App's keys. + +**Signature**: + +```js +static clear([callback]: ?(error: ?Error) => void): Promise +``` + +**Returns**: + +`Promise` object. + +**Example**: + +```js +clearAll = async () => { + try { + await AsyncStorage.clear() + } catch(e) { + // clear error + } + + console.log('Done.') +} +``` + + + + +## `useAsyncStorage` + +**Note**: A hooks-like interface that we're experimenting with. This will change in the nearest future to fully leverage Hooks API, so feel free to [follow this discussion to learn more](https://github.com/react-native-community/react-native-async-storage/issues/32). + + +The `useAsyncStorage` returns an object that exposes all methods that allow you to interact with the stored value. + +**Signature**: + +```js +static useAsyncStorage(key: string): { + getItem: ( + callback?: ?(error: ?Error, result: string | null) => void, + ) => Promise, + setItem: ( + value: string, + callback?: ?(error: ?Error) => void, + ) => Promise, + mergeItem: ( + value: string, + callback?: ?(error: ?Error) => void, + ) => Promise, + removeItem: (callback?: ?(error: ?Error) => void) => Promise, +} +``` + +**Returns**: + +`object` + +**Specific Example**: + +You can replace your `App.js` with the following to see it in action. + +```jsx +import React, { useState, useEffect } from 'react'; +import { View, Text, TouchableOpacity } from 'react-native'; +import { useAsyncStorage } from '@react-native-async-storage/async-storage'; + +export default function App() { + const [value, setValue] = useState('value'); + const { getItem, setItem } = useAsyncStorage('@storage_key'); + + const readItemFromStorage = async () => { + const item = await getItem(); + setValue(item); + }; + + const writeItemToStorage = async newValue => { + await setItem(newValue); + setValue(newValue); + }; + + useEffect(() => { + readItemFromStorage(); + }, []); + + return ( + + Current value: {value} + + writeItemToStorage( + Math.random() + .toString(36) + .substr(2, 5) + ) + } + > + Update value + + + ); +} +``` + +In this example: + +1. On mount, we read the value at `@storage_key` and save it to the state under `value` +2. When pressing on "update value", a new string gets generated, saved to async storage, and to the component state +3. Try to reload your app - you'll see that the last value is still being read from async storage diff --git a/docs/Installation.md b/docs/Installation.md new file mode 100644 index 00000000..eba8a04e --- /dev/null +++ b/docs/Installation.md @@ -0,0 +1,55 @@ +--- +title: Installation +--- + +### Install + +With npm: + +```shell +npm install @react-native-async-storage/async-storage +``` + +With Yarn: + +```shell +yarn add @react-native-async-storage/async-storage +``` + +With Expo CLI: + +```shell +npx expo install @react-native-async-storage/async-storage +``` + +### Link + +#### Android & iOS + +Requires **React Native 0.60+** + +[CLI autolink feature](https://github.com/react-native-community/cli/blob/master/docs/autolinking.md) +links the module while building the app. + +On iOS, use CocoaPods to add the native `RNAsyncStorage` to your project: + +```shell +npx pod-install +``` + +#### Windows + +Requires **React Native Windows 0.63+** + +[CLI autolink feature](https://microsoft.github.io/react-native-windows/docs/native-modules-autolinking) +links the module while building the app. + +#### macOS + +Requires **React Native macOS 0.63+** + +1. Set `platform :macos, '10.14'` in `macos/Podfile` +2. Install the pods +3. From now on + [CLI autolink feature](https://microsoft.github.io/react-native-windows/docs/native-modules-autolinking) + will link the module while building the app. diff --git a/docs/Usage.md b/docs/Usage.md new file mode 100644 index 00000000..7e7c771c --- /dev/null +++ b/docs/Usage.md @@ -0,0 +1,83 @@ +--- +id: usage +title: Usage +sidebar_label: Usage +--- + +**Async Storage** can only store `string` data. In order to store object data, +you need to serialize it first. For data that can be serialized to JSON, you can +use `JSON.stringify()` when saving the data and `JSON.parse()` when loading the +data. + +### Importing + +```js +import AsyncStorage from '@react-native-async-storage/async-storage'; +``` + +### Storing data + +`setItem()` is used both to add new data item (when no data for given key +exists), and to modify existing item (when previous data for given key exists). + +#### Storing string value + +```jsx +const storeData = async (value) => { + try { + await AsyncStorage.setItem('my-key', value); + } catch (e) { + // saving error + } +}; +``` + +#### Storing object value + +```jsx +const storeData = async (value) => { + try { + const jsonValue = JSON.stringify(value); + await AsyncStorage.setItem('my-key', jsonValue); + } catch (e) { + // saving error + } +}; +``` + +### Reading data + +`getItem` returns a promise that either resolves to stored value when data is +found for given key, or returns `null` otherwise. + +#### Reading string value + +```jsx +const getData = async () => { + try { + const value = await AsyncStorage.getItem('my-key'); + if (value !== null) { + // value previously stored + } + } catch (e) { + // error reading value + } +}; +``` + +#### Reading object value + +```jsx +const getData = async () => { + try { + const jsonValue = await AsyncStorage.getItem('my-key'); + return jsonValue != null ? JSON.parse(jsonValue) : null; + } catch (e) { + // error reading value + } +}; +``` + +### More + +For more examples, [head over to API section.](API.md) diff --git a/docs/advanced/Backup.md b/docs/advanced/Backup.md new file mode 100644 index 00000000..3001c67f --- /dev/null +++ b/docs/advanced/Backup.md @@ -0,0 +1,23 @@ +--- +title: Database backup exclusion +--- + +### Supported platforms: +- **iOS** +- **macOS** + + +--- + +Async Storage stores data in `Application Support` directory, which is backed up by iCloud by default. +This can lead to unintentional behavior where data is persisted even after an app re-installation. + +Async Storage disables that feature by default. + +In order to enable iCloud backup, open your app's `info.plist` in Xcode and add **boolean** entry called **RCTAsyncStorageExcludeFromBackup** and set its value to **NO** (NO as no for exclusion). + +Alternatively, you can open `info.plist` in editor and add new entry: +```diff ++ RCTAsyncStorageExcludeFromBackup ++ +``` diff --git a/docs/advanced/BrownfieldIntegration.md b/docs/advanced/BrownfieldIntegration.md new file mode 100644 index 00000000..fda1f152 --- /dev/null +++ b/docs/advanced/BrownfieldIntegration.md @@ -0,0 +1,224 @@ +--- +title: Brownfield integration +--- + +### Supported platforms: + +- **iOS** +- **macOS** +- **Android** + +--- + +# iOS + +If you're embedding React Native into native application, you can also integrate +Async Storage module, so that both worlds will use one storage solution. + +AsyncStorage can be controlled by the hosting app via the delegate on +`RNCAsyncStorage`: + +```objc +RNCAsyncStorage *asyncStorage = [bridge moduleForClass:[RNCAsyncStorage class]]; +asyncStorage.delegate = self; +``` + +## The protocol + +The delegate must conform to the `RNCAsyncStorageDelegate` protocol: + +### allKeys + +```objc +- (void)allKeys:(RNCAsyncStorageResultCallback)block; +``` + +Returns all keys currently stored. If none, an empty array is returned. +Called by `getAllKeys` in JS. + +### mergeValues + +```objc +- (void)mergeValues:(NSArray *)values + forKeys:(NSArray *)keys + completion:(RNCAsyncStorageResultCallback)block; +``` + +Merges values with the corresponding values stored at specified keys. +Called by `mergeItem` and `multiMerge` in JS. + +### removeAllValues + +```objc +- (void)removeAllValues:(RNCAsyncStorageCompletion)block; +``` + +Removes all values from the store. Called by `clear` in JS. + +### removeValuesForKeys + +```objc +- (void)removeValuesForKeys:(NSArray *)keys + completion:(RNCAsyncStorageResultCallback)block; +``` + +Removes all values associated with specified keys. +Called by `removeItem` and `multiRemove` in JS. + +### setValues + +```objc +- (void)setValues:(NSArray *)values + forKeys:(NSArray *)keys + completion:(RNCAsyncStorageResultCallback)block; +``` + +Sets specified key-value pairs. Called by `setItem` and `multiSet` in JS. + +### valuesForKeys + +```objc +- (void)valuesForKeys:(NSArray *)keys + completion:(RNCAsyncStorageResultCallback)block; +``` + +Returns values associated with specified keys. +Called by `getItem` and `multiGet` in JS. + +### passthrough + +```objc +@optional +@property (nonatomic, readonly, getter=isPassthrough) BOOL passthrough; +``` + +**Optional:** Returns whether the delegate should be treated as a passthrough. +This is useful for monitoring storage usage among other things. Returns `NO` by +default. + +--- + +# Android + +The recommended approach here is to use Kotlin language to leverage coroutines when accessing the storage. +Java is also supported (through Kotlin interop), but the approach is more cumbersome. + +## Prerequisites + +1. [Next storage feature](Next.md) enabled. +2. Add dependency on `coroutines-android` in your app's `build.gradle` + +```diff + +dependencies { + // other dependencies + + + // will work with coroutines 1.3.0 and up ++ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9" + +} +``` + +3. Your library of choice for parsing JSON storage values (since there are strings only) + +## Access storage + +### Kotlin (recommended) + +We use Coroutines to handle asynchronous code. Each method on storage is `suspend` method, so you need to +call it from within a coroutine. + +#### Reading value + +```kotlin +suspend fun readValue(ctx: Context, keys: List) { + // get instance of the Storage by providing context object + val asyncStorage = StorageModule.getStorageInstance(ctx) + + val entries: List = asyncStorage.getValues(keys) + doSomethingWithValues(entries) +} +``` + +#### Saving value + +```kotlin +suspend fun saveValue(ctx: Context) { + val asyncStorage = StorageModule.getStorageInstance(ctx) + + val entries = listOf( + Entry("myKey", "myValue") + ) + asyncStorage.setValues(entries) +} +``` + +### Java + +You can access AsyncStorage form Java, but you're still required to add Kotlin dependencies. +There's no one way of accessing the data and there's more than one way to parse it. + +#### Reading from storage + +```java +void readStorageValue(Context ctx, String key) { + AsyncStorageAccess asyncStorage = StorageModule.getStorageInstance(ctx); + + BuildersKt.launch(GlobalScope.INSTANCE, + Dispatchers.getIO(), + CoroutineStart.DEFAULT, + (scope, continuation) -> { + List keys = new ArrayList<>(); + keys.add(key); + + Continuation> cont = new Continuation() { + @NotNull + @Override + public CoroutineContext getContext() { + return scope.getCoroutineContext(); + } + + @Override + public void resumeWith(@NotNull Object o) { + List entries = (List) o; + doSomethingWithEntries(entries); + } + }; + + asyncStorage.getValues(keys, cont); + return Unit.INSTANCE; + }); + +} +``` + +#### Saving to storage + +```java +void saveStorageValue(Context ctx, String key, String value) { + AsyncStorageAccess asyncStorage = StorageModule.getStorageInstance(ctx); + + BuildersKt.launch(GlobalScope.INSTANCE, + Dispatchers.getIO(), + CoroutineStart.DEFAULT, + (scope, continuation) -> { + Continuation cont = new Continuation() { + @NotNull + @Override + public CoroutineContext getContext() { + return scope.getCoroutineContext(); + } + + @Override + public void resumeWith(@NotNull Object o) {} + }; + + List entries = new ArrayList<>(); + Entry entry = new Entry(key, value); + entries.add(entry); + asyncStorage.setValues(entries, cont); + return Unit.INSTANCE; + }); +} +``` diff --git a/docs/advanced/DedicatedExecutor.md b/docs/advanced/DedicatedExecutor.md new file mode 100644 index 00000000..d35b8e83 --- /dev/null +++ b/docs/advanced/DedicatedExecutor.md @@ -0,0 +1,28 @@ +--- +title: Dedicator Thread Executor +--- + +### Supported platforms: +- **Android** + +--- + +**Note**: This feature is obsolete when [Next storage feature is enabled](Next.md). + +## Motivation + +This feature would be mostly used in brownfield apps and [in edge cases with some android devices.](https://github.com/react-native-async-storage/async-storage/issues/159) +Dedicated thread pool executor makes `AsyncStorage` use separate thread pool for its tasks execution. + +Use this feature if `THREAD_POOL_EXECUTOR` from `AsyncTasks`: + +- Is used in your app, so that background tasks are queued most of the time +- Acts weird on your device (for example, waits for some time before execution) + +## How to use + +Add a `AsyncStorage_dedicatedExecutor` property to your `android/gradle.properties`: + +``` +AsyncStorage_dedicatedExecutor=true +``` diff --git a/docs/advanced/IncreaseDbSize.md b/docs/advanced/IncreaseDbSize.md new file mode 100644 index 00000000..e8a8a0c9 --- /dev/null +++ b/docs/advanced/IncreaseDbSize.md @@ -0,0 +1,24 @@ +--- +title: Increasing Storage size +--- + +### Supported platforms: +- **Android** + +--- + +**Note**: This feature is obsolete when [Next storage feature is enabled](Next.md). + +## Motivation + +Current Async Storage's size is set to 6MB. Going over this limit causes `database or disk is full` error. This 6MB limit is a sane limit to protect the user from the app storing too much data in the database. This also protects the database from filling up the disk cache and becoming malformed (endTransaction() calls will throw an exception, not rollback, and leave the db malformed). You have to be aware of that risk when increasing the database size. We recommend to ensure that your app does not write more data to AsyncStorage than space is left on disk. Since AsyncStorage is based on SQLite on Android you also have to be aware of the [SQLite limits](https://www.sqlite.org/limits.html). + +## Increase limit + +Add a `AsyncStorage_db_size_in_MB` property to your `android/gradle.properties`: + +```bash +AsyncStorage_db_size_in_MB=10 +``` + +Now you can define the new size in MB. In this example, the new limit is 10 MB. diff --git a/docs/advanced/Jest-integration.md b/docs/advanced/Jest-integration.md new file mode 100644 index 00000000..808bb4a7 --- /dev/null +++ b/docs/advanced/Jest-integration.md @@ -0,0 +1,76 @@ +--- +title: Jest integration +--- + +Async Storage module is tightly coupled with its `NativeModule` part - it needs +a running React Native application to work properly. In order to use it in +tests, you have to provide its separate implementation. Follow these steps to +add a mocked `Async Storage` module. + +## Using Async Storage mock + +You can use one of two ways to provide mocked version of `AsyncStorage`: + +### With **mocks** directory + +1. In your project root directory, create + `__mocks__/@react-native-async-storage` directory. +2. Inside that folder, create `async-storage.js` file. +3. Inside that file, export `Async Storage` mock. + +```javascript +export * from "@react-native-async-storage/async-storage/jest/async-storage-mock"; +``` + +### With Jest setup file + +1. In your Jest config (probably in `package.json`) add setup files location: + +```json +"jest": { + "setupFiles": ["./path/to/jestSetupFile.js"] +} +``` + +2. Inside your setup file, set up Async Storage mocking: + +```javascript +jest.mock("@react-native-async-storage/async-storage", () => + require("@react-native-async-storage/async-storage/jest/async-storage-mock") +); +``` + +## Testing with mock + +Each public method available from `Async Storage` is +[a mock function](https://jestjs.io/docs/en/mock-functions), that you can test +for certain condition, for example, if `.getItem` has been called with a +specific arguments: + +```javascript +it("checks if Async Storage is used", async () => { + await asyncOperationOnAsyncStorage(); + + expect(AsyncStorage.getItem).toBeCalledWith("myKey"); +}); +``` + +## Overriding Mock logic + +You can override mock implementation, by replacing its inner functions: + +```javascript +// somewhere in your configuration files +import AsyncStorageMock from "@react-native-async-storage/async-storage/jest/async-storage-mock"; + +AsyncStorageMock.multiGet = jest.fn(([keys], callback) => { + // do something here to retrieve data + callback([]); +}); + +export default AsyncStorageMock; +``` + +You can +[check its implementation](https://github.com/react-native-async-storage/async-storage/blob/main/packages/default-storage/jest/async-storage-mock.js) +to get more insight into methods signatures. diff --git a/docs/advanced/Limits.md b/docs/advanced/Limits.md new file mode 100644 index 00000000..f83df78a --- /dev/null +++ b/docs/advanced/Limits.md @@ -0,0 +1,15 @@ +--- +title: Known storage limits +--- + +## Android + +AsyncStorage for Android uses SQLite for storage backend. While it has [its own size limits](https://www.sqlite.org/limits.html), Android system also have two known limits: total storage size and per-entry size limit. + + +- Total storage size is capped at 6 MB by default. You can increase this size by [specifying a new size using feature flag.](IncreaseDbSize.md) + +- Per-entry is limited by a size of a WindowCursor, a buffer used to read data from SQLite. [Currently it's size is around 2 MB](https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/res/res/values/config.xml;l=2103). + This means that the single item read at one time cannot be larger than 2 MB. There's no supported workaround from AsyncStorage. + We suggest keeping your data lower than that, by chopping it down into many entries, instead of one massive entry. + This is where [`multiGet`](../API.md#multiget) and [`multiSet`](../API.md#multiset) APIs can shine. diff --git a/docs/advanced/Next.md b/docs/advanced/Next.md new file mode 100644 index 00000000..cbcc4b5d --- /dev/null +++ b/docs/advanced/Next.md @@ -0,0 +1,109 @@ +--- +title: Next storage implementation +--- + + +### Supported platforms: +- **Android** + + +--- + +### Motivation + +Current implementation of persistence layer is created using [SQLiteOpenHelper](https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper), +a helper class that manages database creation and migrations. Even if this approach is powerful, the lack of compile time query verification and a big boilerplate of mapping SQLite queries to actual values make this implementation prone to many errors. + +This Async Storage feature improves the persistence layer, using modern approaches to access SQLite (using [Room](https://developer.android.com/training/data-storage/room)), to reduce possible anomalies to the minimum. +On top of that, it allows accessing AsyncStorage from the native side, useful in [Brownfield integration.](BrownfieldIntegration.md#android) + +### Migration + +This feature requires no migration from the developer perspective - the current database will be recreated (based on the current one), meaning user won't lose any data if you decide to opt in. +There's a small drawback to know - the database "recreation" happens **only once**. + +#### How it works + +The new database (the one used by this feature) will be created based on the current database file, if the new one does not exist yet. +If we detect that there's already the new database on the device, recreation will not kick in. + + +#### Why is it important + +Let's say you enabled the feature for the first time - recreation kicks in and the old database file is untouched. +If you decide to disable the feature, your users will be back using old database. No data migrations is happening from new to old database file. +When you enable the feature again, the new database is **not** recreated, because it already exists, and no data is copied over. + + +### Enable + +#### Add config flag + +In your project's `android` directory, locate `gradle.properties` file (if it does not exist, create one) and add the line: +```groovy +AsyncStorage_useNextStorage=true +``` + +#### React Native < 0.73 + +For React Native below version 0.73, you need to apply Kotlin plugin to your project. +In your project's android directory, locate root build.gradle file. Add Kotlin dependency to the buildscript: + +```diff + buildscript { + ext { + // other extensions ++ kotlinVersion = '1.9.24' + } + + dependencies { + // other dependencies ++ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" + } + } + +``` + + +### Configuration + +**Kotlin version** + +Next storage is tested against Kotlin version `1.9.24`. +You can specify different version, in one of two ways: + +- add `kotlinVersion` extension to the `rootProject`: + +```groovy +rootProject.ext.kotlinVersion = '1.9.24' +``` + +- specify `AsyncStorage_kotlinVersion` in `gradle.properties`: + +```groovy +AsyncStorage_kotlinVersion=1.9.24 +``` + +**Room** + +Next AsyncStorage uses [Room persistence library](https://developer.android.com/jetpack/androidx/releases/room) to store data. +Currently, tested version is `2.6.1`. You can specify different version, by adding a flag to `gradle.properties`: + +```groovy +AsyncStorage_next_roomVersion=2.6.1 +``` + +KSP is enabled for symbol processing for the Room library. +KSP version will be selected based on Kotlin version in your project. +If you want to use different KSP version, you can set a property in `gradle.properties`: + +```groovy +AsyncStorage_next_kspVersion=1.9.24-1.0.20 +``` + +### Notable changes + +Alongside of a warning regarding `key`/`value`, errors are thrown when: + +- Your `key` is `null` or `not a string` +- You provide value that is `not a string` diff --git a/docs/advanced/Where-data-stored.md b/docs/advanced/Where-data-stored.md new file mode 100644 index 00000000..3c91f85c --- /dev/null +++ b/docs/advanced/Where-data-stored.md @@ -0,0 +1,9 @@ +--- +title: Where your data is stored +--- + +* **Android** - SQLite +* **iOS** - small values (not exceeding 1024 characters) are serialized and stored in a common `manifest.json` file, while larger values are stored in individual, dedicated files (named as MD5 hashed `key`) +* **macOS** - Same as iOS +* **Web** - window.localStorage +* **Windows** - SQLite diff --git a/docs/debugging/communityPackages.md b/docs/debugging/communityPackages.md new file mode 100644 index 00000000..a5c42ab2 --- /dev/null +++ b/docs/debugging/communityPackages.md @@ -0,0 +1,15 @@ +--- +id: communityPackages +title: Community Packages +sidebar_label: Community Packages +--- + +### Flipper + +For projects that use Flipper, there is a Flipper plugin called [Advanced Async Storage](https://github.com/lbaldy/flipper-plugin-async-storage-advanced). The plugin provides basic CRUD operations on Async Storage. + + +### Non Flipper + +For the projects which aren't using Flipper, you can use the [React Native Debugger](https://github.com/jhen0409/react-native-debugger) which comes with a built-in Async Storage support. The debugger allows to print the Async Storage content to the console, and clear it completely. + diff --git a/docs/help/Troubleshooting.md b/docs/help/Troubleshooting.md new file mode 100644 index 00000000..12d59bb2 --- /dev/null +++ b/docs/help/Troubleshooting.md @@ -0,0 +1,109 @@ +--- +id: troubleshooting +title: Troubleshooting +sidebar_label: Troubleshooting +--- + +## Async await doesn't resolve + +If you're having issues with `getItem()` and friends not resolving, check if +`inlineRequires` is enabled in `metro.config.js`: + +```js +module.exports = { + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: true, + }, + }), + }, +}; +``` + +If disabling it resolves the issue, it's likely that you hit a circular import +chain. You can try excluding `@react-native-async-storage/async-storage` from +being inlined: + +```diff + module.exports = { + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: true, ++ nonInlinedRequires: [ ++ "@react-native-async-storage/async-storage", ++ 'React', ++ 'react', ++ 'react-native', ++ ], + }, + }), + }, + }; +``` + +If this doesn't resolve the issue, you need to figure out what is causing the +cyclic chain. There are tools, such as +[@rnx-kit/metro-plugin-cyclic-dependencies-detector](https://github.com/microsoft/rnx-kit/tree/main/packages/metro-plugin-cyclic-dependencies-detector#rnx-kitmetro-plugin-cyclic-dependencies-detector), +that can help you debug this. + +## [iOS] CocoaPods issues + +1. Delete the `node_modules` folder(s) from your project +2. Run `yarn` or `npm install` +3. If you're using CocoaPods: + 1. Make sure your `Podfile` does _not_ have an entry for `RNCAsyncStorage`. + 2. `pod install` + 3. `pod update RNCAsyncStorage` +4. Open your Xcode project +5. Press ⇧⌥⌘K to clean your build folder +6. Build and run your project + +> Note that every time `@react-native-async-storage/async-storage` gets updated, +> you must also run `pod update RNCAsyncStorage` otherwise you'll still be using +> the previous version. + +## [iOS] fatal error: 'React/RCTBridgeModule.h' file not found + +``` +info In file included from /~/@react-native-async-storage/async-storage/ios/RNCAsyncStorage.m:8: +/~/@react-native-async-storage/async-storage/ios/RNCAsyncStorage.h:8:9: fatal error: 'React/RCTBridgeModule.h' file not found + +info #import + ^~~~~~~~~~~~~~~~~~~~~~~~~ + +info 1 error generated. +``` + +- Make sure that you've run `pod install` or `pod update RNCAsyncStorage` (see + also [CocoaPods issues](#ios-cocoapods-issues)). + +- Make sure that `React` dependencies are _not_ removed from projects. Without + the target dependency set, Xcode may build things out of order and the React + headers will not be installed when AsyncStorage is built. + + ```Podfile + post_install do |installer| + installer.pods_project.targets.each do |target| + if target.name == "React" + target.remove_from_project + end + end + end + ``` + +- Try switching back to the legacy build system in Xcode. You can find it in + File > Project/Workspace Settings sheet. + +## [@RNC/AsyncStorage]: NativeModule: AsyncStorage is null + +### iOS + +This error means that AsyncStorage was unable to find its native module. This +occurs because AsyncStorage was not linked into the final app bundle. + +Make sure that you've run `pod install` or `pod update RNCAsyncStorage` (see +also [CocoaPods issues](#ios-cocoapods-issues)). diff --git a/docs/index.md b/docs/index.md index 4ff3dafe..087eac99 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,3 +1,17 @@ # Async Storage -Asynchronous, persistent, key-value storage system for React Native. +Async Storage is asynchronous, unencrypted, persistent, key-value storage for your React Native application. + +### Supported platform + +- Android +- iOS +- Web +- macOS +- Windows + + +## Installation + + +[See installation instructions](Installation.md) diff --git a/docs/overrides/main.html b/docs/overrides/main.html new file mode 100644 index 00000000..e4c38e21 --- /dev/null +++ b/docs/overrides/main.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} + +{% block outdated %} +You're not viewing the latest version. +
+ Click here to go to latest. + +{% endblock %} diff --git a/mkdocs.yml b/mkdocs.yml index 1fdc4afb..19fbce72 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,7 +3,24 @@ repo_url: https://github.com/react-native-async-storage/async-storage site_url: https://react-native-async-storage.github.io/ nav: - - Introduction: index.md + - Overview: index.md + - Installation: Installation.md + - Usage: Usage.md + - API: API.md + - Advanced: + - Next Storage: advanced/Next.md + - Backup: advanced/Backup.md + - Brownfield Integration: advanced/BrownfieldIntegration.md + - Dedicated Executor: advanced/DedicatedExecutor.md + - Increase Database Size: advanced/IncreaseDbSize.md + - Jest integration: advanced/Jest-integration.md + - Where data is stored: advanced/Where-data-stored.md + - Known limits: advanced/Limits.md + - Debugging: + - Community packages: debugging/communityPackages.md + - Help: + - Troubleshooting: help/Troubleshooting.md + theme: name: material @@ -14,9 +31,7 @@ theme: favicon: assets/logo.png icon: repo: fontawesome/brands/github - feature: - - navigation.tabs - - navigation.footer + features: - content.code.copy extra_css: From 5432f6f70d260a889eec0606c700a129cde262d6 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Fri, 26 Sep 2025 17:02:34 +0200 Subject: [PATCH 082/110] docs v3 --- docs/API.md | 582 ------------------------- docs/Installation.md | 55 --- docs/Usage.md | 83 ---- docs/advanced/Backup.md | 23 - docs/advanced/BrownfieldIntegration.md | 224 ---------- docs/advanced/DedicatedExecutor.md | 28 -- docs/advanced/IncreaseDbSize.md | 24 - docs/advanced/Jest-integration.md | 76 ---- docs/advanced/Limits.md | 15 - docs/advanced/Next.md | 109 ----- docs/advanced/Where-data-stored.md | 9 - docs/debugging/communityPackages.md | 15 - docs/help/Troubleshooting.md | 109 ----- docs/index.md | 76 +++- mkdocs.yml | 17 +- 15 files changed, 69 insertions(+), 1376 deletions(-) delete mode 100644 docs/API.md delete mode 100644 docs/Installation.md delete mode 100644 docs/Usage.md delete mode 100644 docs/advanced/Backup.md delete mode 100644 docs/advanced/BrownfieldIntegration.md delete mode 100644 docs/advanced/DedicatedExecutor.md delete mode 100644 docs/advanced/IncreaseDbSize.md delete mode 100644 docs/advanced/Jest-integration.md delete mode 100644 docs/advanced/Limits.md delete mode 100644 docs/advanced/Next.md delete mode 100644 docs/advanced/Where-data-stored.md delete mode 100644 docs/debugging/communityPackages.md delete mode 100644 docs/help/Troubleshooting.md diff --git a/docs/API.md b/docs/API.md deleted file mode 100644 index 8560437c..00000000 --- a/docs/API.md +++ /dev/null @@ -1,582 +0,0 @@ ---- -id: api -title: API -sidebar_label: API ---- - - - - -## `getItem` - -Gets a string value for given `key`. This function can either return a string value for existing `key` or return `null` otherwise. - -In order to store object value, you need to deserialize it, e.g. using `JSON.parse()`. - -*Note (legacy)*: you can use optional callback as an alternative for returned promise. - -**Signature**: - -```js -static getItem(key: string, [callback]: ?(error: ?Error, result: ?string) => void): Promise -``` - -**Returns**: - -`Promise` resolving with a string value, if entry exists for given `key`, or `null` otherwise. - -`Promise` can also be rejected in case of underlying storage error. - -**Example**: - -```js -getMyStringValue = async () => { - try { - return await AsyncStorage.getItem('@key') - } catch(e) { - // read error - } - - console.log('Done.') -} -``` - -```js -getMyObject = async () => { - try { - const jsonValue = await AsyncStorage.getItem('@key') - return jsonValue != null ? JSON.parse(jsonValue) : null - } catch(e) { - // read error - } - - console.log('Done.') -} -``` - - -
-
- - - -## `setItem` - -Sets a string `value` for given `key`. This operation can either modify an existing entry, if it did exist for given `key`, or add new one otherwise. - -In order to store object value, you need to serialize it, e.g. using `JSON.stringify()`. - -*Note (legacy)*: you can use optional callback as an alternative for returned promise. - -**Signature**: - -```js -static setItem(key: string, value: string, [callback]: ?(error: ?Error) => void): Promise -``` - -**Returns**: - -`Promise` resolving when the set operation is completed. - -`Promise` can also be rejected in case of underlying storage error. - -**Example**: - -```js -setStringValue = async (value) => { - try { - await AsyncStorage.setItem('key', value) - } catch(e) { - // save error - } - - console.log('Done.') -} -``` - -```js -setObjectValue = async (value) => { - try { - const jsonValue = JSON.stringify(value) - await AsyncStorage.setItem('key', jsonValue) - } catch(e) { - // save error - } - - console.log('Done.') -} -``` - -
-
- - - -## `mergeItem` - -Merges an existing value stored under `key`, with new `value`, assuming both values are **stringified JSON**. - -**Signature**: - -```js -static mergeItem(key: string, value: string, [callback]: ?(error: ?Error) => void): Promise -``` - -**Returns**: - -`Promise` with merged data, if exists, `null` otherwise. - -**Example**: - -```js -const USER_1 = { - name: 'Tom', - age: 20, - traits: { - hair: 'black', - eyes: 'blue' - } -} - -const USER_2 = { - name: 'Sarah', - age: 21, - hobby: 'cars', - traits: { - eyes: 'green', - } -} - - -mergeUsers = async () => { - try { - //save first user - await AsyncStorage.setItem('@MyApp_user', JSON.stringify(USER_1)) - - // merge USER_2 into saved USER_1 - await AsyncStorage.mergeItem('@MyApp_user', JSON.stringify(USER_2)) - - // read merged item - const currentUser = await AsyncStorage.getItem('@MyApp_user') - - console.log(currentUser) - - // console.log result: - // { - // name: 'Sarah', - // age: 21, - // hobby: 'cars', - // traits: { - // eyes: 'green', - // hair: 'black' - // } - // } - } -} -``` - -
-
- - - - -## `removeItem` - -Removes item for a `key`, invokes (optional) callback once completed. - -**Signature**: - -```js -static removeItem(key: string, [callback]: ?(error: ?Error) => void): Promise -``` - -**Returns**: - -`Promise` object. - -**Example**: - -```js -removeValue = async () => { - try { - await AsyncStorage.removeItem('@MyApp_key') - } catch(e) { - // remove error - } - - console.log('Done.') -} -``` - - -
-
- - - - -## `getAllKeys` - -Returns all keys known to your App, for all callers, libraries, etc. Once completed, invokes `callback` with errors (if any) and array of keys. - - -**Signature**: - -```js -static getAllKeys([callback]: ?(error: ?Error, keys: ?Array) => void): Promise -``` - -**Returns**: - -`Promise` object. - -**Example**: - -```js -getAllKeys = async () => { - let keys = [] - try { - keys = await AsyncStorage.getAllKeys() - } catch(e) { - // read key error - } - - console.log(keys) - // example console.log result: - // ['@MyApp_user', '@MyApp_key'] -} -``` - -
-
- - - -## `multiGet` - -Fetches multiple key-value pairs for given array of `keys` in a batch. Once completed, invokes `callback` with errors (if any) and results. - -**Signature**: - -```js -static multiGet(keys: Array, [callback]: ?(errors: ?Array, result: ?Array>) => void): Promise -``` - -**Returns**: - -`Promise` of array with coresponding key-value pairs found, stored as `[key, value]` array. - - -**Example**: - -```js -getMultiple = async () => { - - let values - try { - values = await AsyncStorage.multiGet(['@MyApp_user', '@MyApp_key']) - } catch(e) { - // read error - } - console.log(values) - - // example console.log output: - // [ ['@MyApp_user', 'myUserValue'], ['@MyApp_key', 'myKeyValue'] ] -} -``` - -
-
- - - -## `multiSet` - -Stores multiple key-value pairs in a batch. Once completed, `callback` with any errors will be called. - - -**Signature**: - -```js -static multiSet(keyValuePairs: Array>, [callback]: ?(errors: ?Array) => void): Promise -``` - -**Returns**: - -`Promise` object. - -**Example**: - -```js -multiSet = async () => { - const firstPair = ["@MyApp_user", "value_1"] - const secondPair = ["@MyApp_key", "value_2"] - try { - await AsyncStorage.multiSet([firstPair, secondPair]) - } catch(e) { - //save error - } - - console.log("Done.") -} -``` - -
-
- - - -## `multiMerge` - -Multiple merging of existing and new values in a batch. Assumes that values are *stringified JSON*. Once completed, invokes `callback` with errors (if any). - -**Signature**: - -```js -static multiMerge(keyValuePairs: Array>, [callback]: ?(errors: ?Array) => void): Promise -``` - -**Returns**: - -`Promise` object. - -**Example**: - -```js -const USER_1 = { - name: 'Tom', - age: 30, - traits: {hair: 'brown'}, -}; - -const USER_1_DELTA = { - age: 31, - traits: {eyes: 'blue'}, -}; - -const USER_2 = { - name: 'Sarah', - age: 25, - traits: {hair: 'black'}, -}; - -const USER_2_DELTA = { - age: 26, - traits: {hair: 'green'}, -}; - - -const multiSet = [ - ["@MyApp_USER_1", JSON.stringify(USER_1)], - ["@MyApp_USER_2", JSON.stringify(USER_2)] -] - -const multiMerge = [ - ["@MyApp_USER_1", JSON.stringify(USER_1_DELTA)], - ["@MyApp_USER_2", JSON.stringify(USER_2_DELTA)] -] - - -mergeMultiple = async () => { - let parsedCurrentlyMerged - - try { - await AsyncStorage.multiSet(multiSet) - await AsyncStorage.multiMerge(multiMerge) - const currentlyMerged = await AsyncStorage.multiGet(['@MyApp_USER_1', '@MyApp_USER_2']) - parsedCurrentlyMerged = currentlyMerged.map(([key, value]) => [ - key, - JSON.parse(value), - ]); - } catch(e) { - // error - } - - console.log( - 'parsedCurrentlyMerged', - JSON.stringify(parsedCurrentlyMerged, null, 2), - ); - // console.log output: - /* - [ - [ - "@MyApp_USER_1", - { - "name": "Tom", - "age": 31, - "traits": { - "hair": "brown", - "eyes": "blue" - } - } - ], - [ - "@MyApp_USER_2", - { - "name": "Sarah", - "age": 26, - "traits": { - "hair": "green" - } - } - ] - ] - */ -} -``` - - -
-
- - - -## `multiRemove` - -Clears multiple key-value entries for given array of `keys` in a batch. Once completed, invokes a `callback` with errors (if any). - -**Signature**: - -```js -static multiRemove(keys: Array, [callback]: ?(errors: ?Array) => void) -``` - -**Returns**: - -`Promise` object. - -**Example**: - -```js -removeFew = async () => { - const keys = ['@MyApp_USER_1', '@MyApp_USER_2'] - try { - await AsyncStorage.multiRemove(keys) - } catch(e) { - // remove error - } - - console.log('Done') -} - -``` - - -
-
- - - -## `clear` - -Removes **whole** `AsyncStorage` data, for all clients, libraries, etc. You probably want to use [removeItem](#removeitem) or [multiRemove](#multiremove) to clear only your App's keys. - -**Signature**: - -```js -static clear([callback]: ?(error: ?Error) => void): Promise -``` - -**Returns**: - -`Promise` object. - -**Example**: - -```js -clearAll = async () => { - try { - await AsyncStorage.clear() - } catch(e) { - // clear error - } - - console.log('Done.') -} -``` - - - - -## `useAsyncStorage` - -**Note**: A hooks-like interface that we're experimenting with. This will change in the nearest future to fully leverage Hooks API, so feel free to [follow this discussion to learn more](https://github.com/react-native-community/react-native-async-storage/issues/32). - - -The `useAsyncStorage` returns an object that exposes all methods that allow you to interact with the stored value. - -**Signature**: - -```js -static useAsyncStorage(key: string): { - getItem: ( - callback?: ?(error: ?Error, result: string | null) => void, - ) => Promise, - setItem: ( - value: string, - callback?: ?(error: ?Error) => void, - ) => Promise, - mergeItem: ( - value: string, - callback?: ?(error: ?Error) => void, - ) => Promise, - removeItem: (callback?: ?(error: ?Error) => void) => Promise, -} -``` - -**Returns**: - -`object` - -**Specific Example**: - -You can replace your `App.js` with the following to see it in action. - -```jsx -import React, { useState, useEffect } from 'react'; -import { View, Text, TouchableOpacity } from 'react-native'; -import { useAsyncStorage } from '@react-native-async-storage/async-storage'; - -export default function App() { - const [value, setValue] = useState('value'); - const { getItem, setItem } = useAsyncStorage('@storage_key'); - - const readItemFromStorage = async () => { - const item = await getItem(); - setValue(item); - }; - - const writeItemToStorage = async newValue => { - await setItem(newValue); - setValue(newValue); - }; - - useEffect(() => { - readItemFromStorage(); - }, []); - - return ( - - Current value: {value} - - writeItemToStorage( - Math.random() - .toString(36) - .substr(2, 5) - ) - } - > - Update value - - - ); -} -``` - -In this example: - -1. On mount, we read the value at `@storage_key` and save it to the state under `value` -2. When pressing on "update value", a new string gets generated, saved to async storage, and to the component state -3. Try to reload your app - you'll see that the last value is still being read from async storage diff --git a/docs/Installation.md b/docs/Installation.md deleted file mode 100644 index eba8a04e..00000000 --- a/docs/Installation.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: Installation ---- - -### Install - -With npm: - -```shell -npm install @react-native-async-storage/async-storage -``` - -With Yarn: - -```shell -yarn add @react-native-async-storage/async-storage -``` - -With Expo CLI: - -```shell -npx expo install @react-native-async-storage/async-storage -``` - -### Link - -#### Android & iOS - -Requires **React Native 0.60+** - -[CLI autolink feature](https://github.com/react-native-community/cli/blob/master/docs/autolinking.md) -links the module while building the app. - -On iOS, use CocoaPods to add the native `RNAsyncStorage` to your project: - -```shell -npx pod-install -``` - -#### Windows - -Requires **React Native Windows 0.63+** - -[CLI autolink feature](https://microsoft.github.io/react-native-windows/docs/native-modules-autolinking) -links the module while building the app. - -#### macOS - -Requires **React Native macOS 0.63+** - -1. Set `platform :macos, '10.14'` in `macos/Podfile` -2. Install the pods -3. From now on - [CLI autolink feature](https://microsoft.github.io/react-native-windows/docs/native-modules-autolinking) - will link the module while building the app. diff --git a/docs/Usage.md b/docs/Usage.md deleted file mode 100644 index 7e7c771c..00000000 --- a/docs/Usage.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -id: usage -title: Usage -sidebar_label: Usage ---- - -**Async Storage** can only store `string` data. In order to store object data, -you need to serialize it first. For data that can be serialized to JSON, you can -use `JSON.stringify()` when saving the data and `JSON.parse()` when loading the -data. - -### Importing - -```js -import AsyncStorage from '@react-native-async-storage/async-storage'; -``` - -### Storing data - -`setItem()` is used both to add new data item (when no data for given key -exists), and to modify existing item (when previous data for given key exists). - -#### Storing string value - -```jsx -const storeData = async (value) => { - try { - await AsyncStorage.setItem('my-key', value); - } catch (e) { - // saving error - } -}; -``` - -#### Storing object value - -```jsx -const storeData = async (value) => { - try { - const jsonValue = JSON.stringify(value); - await AsyncStorage.setItem('my-key', jsonValue); - } catch (e) { - // saving error - } -}; -``` - -### Reading data - -`getItem` returns a promise that either resolves to stored value when data is -found for given key, or returns `null` otherwise. - -#### Reading string value - -```jsx -const getData = async () => { - try { - const value = await AsyncStorage.getItem('my-key'); - if (value !== null) { - // value previously stored - } - } catch (e) { - // error reading value - } -}; -``` - -#### Reading object value - -```jsx -const getData = async () => { - try { - const jsonValue = await AsyncStorage.getItem('my-key'); - return jsonValue != null ? JSON.parse(jsonValue) : null; - } catch (e) { - // error reading value - } -}; -``` - -### More - -For more examples, [head over to API section.](API.md) diff --git a/docs/advanced/Backup.md b/docs/advanced/Backup.md deleted file mode 100644 index 3001c67f..00000000 --- a/docs/advanced/Backup.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Database backup exclusion ---- - -### Supported platforms: -- **iOS** -- **macOS** - - ---- - -Async Storage stores data in `Application Support` directory, which is backed up by iCloud by default. -This can lead to unintentional behavior where data is persisted even after an app re-installation. - -Async Storage disables that feature by default. - -In order to enable iCloud backup, open your app's `info.plist` in Xcode and add **boolean** entry called **RCTAsyncStorageExcludeFromBackup** and set its value to **NO** (NO as no for exclusion). - -Alternatively, you can open `info.plist` in editor and add new entry: -```diff -+ RCTAsyncStorageExcludeFromBackup -+ -``` diff --git a/docs/advanced/BrownfieldIntegration.md b/docs/advanced/BrownfieldIntegration.md deleted file mode 100644 index fda1f152..00000000 --- a/docs/advanced/BrownfieldIntegration.md +++ /dev/null @@ -1,224 +0,0 @@ ---- -title: Brownfield integration ---- - -### Supported platforms: - -- **iOS** -- **macOS** -- **Android** - ---- - -# iOS - -If you're embedding React Native into native application, you can also integrate -Async Storage module, so that both worlds will use one storage solution. - -AsyncStorage can be controlled by the hosting app via the delegate on -`RNCAsyncStorage`: - -```objc -RNCAsyncStorage *asyncStorage = [bridge moduleForClass:[RNCAsyncStorage class]]; -asyncStorage.delegate = self; -``` - -## The protocol - -The delegate must conform to the `RNCAsyncStorageDelegate` protocol: - -### allKeys - -```objc -- (void)allKeys:(RNCAsyncStorageResultCallback)block; -``` - -Returns all keys currently stored. If none, an empty array is returned. -Called by `getAllKeys` in JS. - -### mergeValues - -```objc -- (void)mergeValues:(NSArray *)values - forKeys:(NSArray *)keys - completion:(RNCAsyncStorageResultCallback)block; -``` - -Merges values with the corresponding values stored at specified keys. -Called by `mergeItem` and `multiMerge` in JS. - -### removeAllValues - -```objc -- (void)removeAllValues:(RNCAsyncStorageCompletion)block; -``` - -Removes all values from the store. Called by `clear` in JS. - -### removeValuesForKeys - -```objc -- (void)removeValuesForKeys:(NSArray *)keys - completion:(RNCAsyncStorageResultCallback)block; -``` - -Removes all values associated with specified keys. -Called by `removeItem` and `multiRemove` in JS. - -### setValues - -```objc -- (void)setValues:(NSArray *)values - forKeys:(NSArray *)keys - completion:(RNCAsyncStorageResultCallback)block; -``` - -Sets specified key-value pairs. Called by `setItem` and `multiSet` in JS. - -### valuesForKeys - -```objc -- (void)valuesForKeys:(NSArray *)keys - completion:(RNCAsyncStorageResultCallback)block; -``` - -Returns values associated with specified keys. -Called by `getItem` and `multiGet` in JS. - -### passthrough - -```objc -@optional -@property (nonatomic, readonly, getter=isPassthrough) BOOL passthrough; -``` - -**Optional:** Returns whether the delegate should be treated as a passthrough. -This is useful for monitoring storage usage among other things. Returns `NO` by -default. - ---- - -# Android - -The recommended approach here is to use Kotlin language to leverage coroutines when accessing the storage. -Java is also supported (through Kotlin interop), but the approach is more cumbersome. - -## Prerequisites - -1. [Next storage feature](Next.md) enabled. -2. Add dependency on `coroutines-android` in your app's `build.gradle` - -```diff - -dependencies { - // other dependencies - - - // will work with coroutines 1.3.0 and up -+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9" - -} -``` - -3. Your library of choice for parsing JSON storage values (since there are strings only) - -## Access storage - -### Kotlin (recommended) - -We use Coroutines to handle asynchronous code. Each method on storage is `suspend` method, so you need to -call it from within a coroutine. - -#### Reading value - -```kotlin -suspend fun readValue(ctx: Context, keys: List) { - // get instance of the Storage by providing context object - val asyncStorage = StorageModule.getStorageInstance(ctx) - - val entries: List = asyncStorage.getValues(keys) - doSomethingWithValues(entries) -} -``` - -#### Saving value - -```kotlin -suspend fun saveValue(ctx: Context) { - val asyncStorage = StorageModule.getStorageInstance(ctx) - - val entries = listOf( - Entry("myKey", "myValue") - ) - asyncStorage.setValues(entries) -} -``` - -### Java - -You can access AsyncStorage form Java, but you're still required to add Kotlin dependencies. -There's no one way of accessing the data and there's more than one way to parse it. - -#### Reading from storage - -```java -void readStorageValue(Context ctx, String key) { - AsyncStorageAccess asyncStorage = StorageModule.getStorageInstance(ctx); - - BuildersKt.launch(GlobalScope.INSTANCE, - Dispatchers.getIO(), - CoroutineStart.DEFAULT, - (scope, continuation) -> { - List keys = new ArrayList<>(); - keys.add(key); - - Continuation> cont = new Continuation() { - @NotNull - @Override - public CoroutineContext getContext() { - return scope.getCoroutineContext(); - } - - @Override - public void resumeWith(@NotNull Object o) { - List entries = (List) o; - doSomethingWithEntries(entries); - } - }; - - asyncStorage.getValues(keys, cont); - return Unit.INSTANCE; - }); - -} -``` - -#### Saving to storage - -```java -void saveStorageValue(Context ctx, String key, String value) { - AsyncStorageAccess asyncStorage = StorageModule.getStorageInstance(ctx); - - BuildersKt.launch(GlobalScope.INSTANCE, - Dispatchers.getIO(), - CoroutineStart.DEFAULT, - (scope, continuation) -> { - Continuation cont = new Continuation() { - @NotNull - @Override - public CoroutineContext getContext() { - return scope.getCoroutineContext(); - } - - @Override - public void resumeWith(@NotNull Object o) {} - }; - - List entries = new ArrayList<>(); - Entry entry = new Entry(key, value); - entries.add(entry); - asyncStorage.setValues(entries, cont); - return Unit.INSTANCE; - }); -} -``` diff --git a/docs/advanced/DedicatedExecutor.md b/docs/advanced/DedicatedExecutor.md deleted file mode 100644 index d35b8e83..00000000 --- a/docs/advanced/DedicatedExecutor.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Dedicator Thread Executor ---- - -### Supported platforms: -- **Android** - ---- - -**Note**: This feature is obsolete when [Next storage feature is enabled](Next.md). - -## Motivation - -This feature would be mostly used in brownfield apps and [in edge cases with some android devices.](https://github.com/react-native-async-storage/async-storage/issues/159) -Dedicated thread pool executor makes `AsyncStorage` use separate thread pool for its tasks execution. - -Use this feature if `THREAD_POOL_EXECUTOR` from `AsyncTasks`: - -- Is used in your app, so that background tasks are queued most of the time -- Acts weird on your device (for example, waits for some time before execution) - -## How to use - -Add a `AsyncStorage_dedicatedExecutor` property to your `android/gradle.properties`: - -``` -AsyncStorage_dedicatedExecutor=true -``` diff --git a/docs/advanced/IncreaseDbSize.md b/docs/advanced/IncreaseDbSize.md deleted file mode 100644 index e8a8a0c9..00000000 --- a/docs/advanced/IncreaseDbSize.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Increasing Storage size ---- - -### Supported platforms: -- **Android** - ---- - -**Note**: This feature is obsolete when [Next storage feature is enabled](Next.md). - -## Motivation - -Current Async Storage's size is set to 6MB. Going over this limit causes `database or disk is full` error. This 6MB limit is a sane limit to protect the user from the app storing too much data in the database. This also protects the database from filling up the disk cache and becoming malformed (endTransaction() calls will throw an exception, not rollback, and leave the db malformed). You have to be aware of that risk when increasing the database size. We recommend to ensure that your app does not write more data to AsyncStorage than space is left on disk. Since AsyncStorage is based on SQLite on Android you also have to be aware of the [SQLite limits](https://www.sqlite.org/limits.html). - -## Increase limit - -Add a `AsyncStorage_db_size_in_MB` property to your `android/gradle.properties`: - -```bash -AsyncStorage_db_size_in_MB=10 -``` - -Now you can define the new size in MB. In this example, the new limit is 10 MB. diff --git a/docs/advanced/Jest-integration.md b/docs/advanced/Jest-integration.md deleted file mode 100644 index 808bb4a7..00000000 --- a/docs/advanced/Jest-integration.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: Jest integration ---- - -Async Storage module is tightly coupled with its `NativeModule` part - it needs -a running React Native application to work properly. In order to use it in -tests, you have to provide its separate implementation. Follow these steps to -add a mocked `Async Storage` module. - -## Using Async Storage mock - -You can use one of two ways to provide mocked version of `AsyncStorage`: - -### With **mocks** directory - -1. In your project root directory, create - `__mocks__/@react-native-async-storage` directory. -2. Inside that folder, create `async-storage.js` file. -3. Inside that file, export `Async Storage` mock. - -```javascript -export * from "@react-native-async-storage/async-storage/jest/async-storage-mock"; -``` - -### With Jest setup file - -1. In your Jest config (probably in `package.json`) add setup files location: - -```json -"jest": { - "setupFiles": ["./path/to/jestSetupFile.js"] -} -``` - -2. Inside your setup file, set up Async Storage mocking: - -```javascript -jest.mock("@react-native-async-storage/async-storage", () => - require("@react-native-async-storage/async-storage/jest/async-storage-mock") -); -``` - -## Testing with mock - -Each public method available from `Async Storage` is -[a mock function](https://jestjs.io/docs/en/mock-functions), that you can test -for certain condition, for example, if `.getItem` has been called with a -specific arguments: - -```javascript -it("checks if Async Storage is used", async () => { - await asyncOperationOnAsyncStorage(); - - expect(AsyncStorage.getItem).toBeCalledWith("myKey"); -}); -``` - -## Overriding Mock logic - -You can override mock implementation, by replacing its inner functions: - -```javascript -// somewhere in your configuration files -import AsyncStorageMock from "@react-native-async-storage/async-storage/jest/async-storage-mock"; - -AsyncStorageMock.multiGet = jest.fn(([keys], callback) => { - // do something here to retrieve data - callback([]); -}); - -export default AsyncStorageMock; -``` - -You can -[check its implementation](https://github.com/react-native-async-storage/async-storage/blob/main/packages/default-storage/jest/async-storage-mock.js) -to get more insight into methods signatures. diff --git a/docs/advanced/Limits.md b/docs/advanced/Limits.md deleted file mode 100644 index f83df78a..00000000 --- a/docs/advanced/Limits.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Known storage limits ---- - -## Android - -AsyncStorage for Android uses SQLite for storage backend. While it has [its own size limits](https://www.sqlite.org/limits.html), Android system also have two known limits: total storage size and per-entry size limit. - - -- Total storage size is capped at 6 MB by default. You can increase this size by [specifying a new size using feature flag.](IncreaseDbSize.md) - -- Per-entry is limited by a size of a WindowCursor, a buffer used to read data from SQLite. [Currently it's size is around 2 MB](https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/res/res/values/config.xml;l=2103). - This means that the single item read at one time cannot be larger than 2 MB. There's no supported workaround from AsyncStorage. - We suggest keeping your data lower than that, by chopping it down into many entries, instead of one massive entry. - This is where [`multiGet`](../API.md#multiget) and [`multiSet`](../API.md#multiset) APIs can shine. diff --git a/docs/advanced/Next.md b/docs/advanced/Next.md deleted file mode 100644 index cbcc4b5d..00000000 --- a/docs/advanced/Next.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Next storage implementation ---- - - -### Supported platforms: -- **Android** - - ---- - -### Motivation - -Current implementation of persistence layer is created using [SQLiteOpenHelper](https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper), -a helper class that manages database creation and migrations. Even if this approach is powerful, the lack of compile time query verification and a big boilerplate of mapping SQLite queries to actual values make this implementation prone to many errors. - -This Async Storage feature improves the persistence layer, using modern approaches to access SQLite (using [Room](https://developer.android.com/training/data-storage/room)), to reduce possible anomalies to the minimum. -On top of that, it allows accessing AsyncStorage from the native side, useful in [Brownfield integration.](BrownfieldIntegration.md#android) - -### Migration - -This feature requires no migration from the developer perspective - the current database will be recreated (based on the current one), meaning user won't lose any data if you decide to opt in. -There's a small drawback to know - the database "recreation" happens **only once**. - -#### How it works - -The new database (the one used by this feature) will be created based on the current database file, if the new one does not exist yet. -If we detect that there's already the new database on the device, recreation will not kick in. - - -#### Why is it important - -Let's say you enabled the feature for the first time - recreation kicks in and the old database file is untouched. -If you decide to disable the feature, your users will be back using old database. No data migrations is happening from new to old database file. -When you enable the feature again, the new database is **not** recreated, because it already exists, and no data is copied over. - - -### Enable - -#### Add config flag - -In your project's `android` directory, locate `gradle.properties` file (if it does not exist, create one) and add the line: -```groovy -AsyncStorage_useNextStorage=true -``` - -#### React Native < 0.73 - -For React Native below version 0.73, you need to apply Kotlin plugin to your project. -In your project's android directory, locate root build.gradle file. Add Kotlin dependency to the buildscript: - -```diff - buildscript { - ext { - // other extensions -+ kotlinVersion = '1.9.24' - } - - dependencies { - // other dependencies -+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" - } - } - -``` - - -### Configuration - -**Kotlin version** - -Next storage is tested against Kotlin version `1.9.24`. -You can specify different version, in one of two ways: - -- add `kotlinVersion` extension to the `rootProject`: - -```groovy -rootProject.ext.kotlinVersion = '1.9.24' -``` - -- specify `AsyncStorage_kotlinVersion` in `gradle.properties`: - -```groovy -AsyncStorage_kotlinVersion=1.9.24 -``` - -**Room** - -Next AsyncStorage uses [Room persistence library](https://developer.android.com/jetpack/androidx/releases/room) to store data. -Currently, tested version is `2.6.1`. You can specify different version, by adding a flag to `gradle.properties`: - -```groovy -AsyncStorage_next_roomVersion=2.6.1 -``` - -KSP is enabled for symbol processing for the Room library. -KSP version will be selected based on Kotlin version in your project. -If you want to use different KSP version, you can set a property in `gradle.properties`: - -```groovy -AsyncStorage_next_kspVersion=1.9.24-1.0.20 -``` - -### Notable changes - -Alongside of a warning regarding `key`/`value`, errors are thrown when: - -- Your `key` is `null` or `not a string` -- You provide value that is `not a string` diff --git a/docs/advanced/Where-data-stored.md b/docs/advanced/Where-data-stored.md deleted file mode 100644 index 3c91f85c..00000000 --- a/docs/advanced/Where-data-stored.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Where your data is stored ---- - -* **Android** - SQLite -* **iOS** - small values (not exceeding 1024 characters) are serialized and stored in a common `manifest.json` file, while larger values are stored in individual, dedicated files (named as MD5 hashed `key`) -* **macOS** - Same as iOS -* **Web** - window.localStorage -* **Windows** - SQLite diff --git a/docs/debugging/communityPackages.md b/docs/debugging/communityPackages.md deleted file mode 100644 index a5c42ab2..00000000 --- a/docs/debugging/communityPackages.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: communityPackages -title: Community Packages -sidebar_label: Community Packages ---- - -### Flipper - -For projects that use Flipper, there is a Flipper plugin called [Advanced Async Storage](https://github.com/lbaldy/flipper-plugin-async-storage-advanced). The plugin provides basic CRUD operations on Async Storage. - - -### Non Flipper - -For the projects which aren't using Flipper, you can use the [React Native Debugger](https://github.com/jhen0409/react-native-debugger) which comes with a built-in Async Storage support. The debugger allows to print the Async Storage content to the console, and clear it completely. - diff --git a/docs/help/Troubleshooting.md b/docs/help/Troubleshooting.md deleted file mode 100644 index 12d59bb2..00000000 --- a/docs/help/Troubleshooting.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -id: troubleshooting -title: Troubleshooting -sidebar_label: Troubleshooting ---- - -## Async await doesn't resolve - -If you're having issues with `getItem()` and friends not resolving, check if -`inlineRequires` is enabled in `metro.config.js`: - -```js -module.exports = { - transformer: { - getTransformOptions: async () => ({ - transform: { - experimentalImportSupport: false, - inlineRequires: true, - }, - }), - }, -}; -``` - -If disabling it resolves the issue, it's likely that you hit a circular import -chain. You can try excluding `@react-native-async-storage/async-storage` from -being inlined: - -```diff - module.exports = { - transformer: { - getTransformOptions: async () => ({ - transform: { - experimentalImportSupport: false, - inlineRequires: true, -+ nonInlinedRequires: [ -+ "@react-native-async-storage/async-storage", -+ 'React', -+ 'react', -+ 'react-native', -+ ], - }, - }), - }, - }; -``` - -If this doesn't resolve the issue, you need to figure out what is causing the -cyclic chain. There are tools, such as -[@rnx-kit/metro-plugin-cyclic-dependencies-detector](https://github.com/microsoft/rnx-kit/tree/main/packages/metro-plugin-cyclic-dependencies-detector#rnx-kitmetro-plugin-cyclic-dependencies-detector), -that can help you debug this. - -## [iOS] CocoaPods issues - -1. Delete the `node_modules` folder(s) from your project -2. Run `yarn` or `npm install` -3. If you're using CocoaPods: - 1. Make sure your `Podfile` does _not_ have an entry for `RNCAsyncStorage`. - 2. `pod install` - 3. `pod update RNCAsyncStorage` -4. Open your Xcode project -5. Press ⇧⌥⌘K to clean your build folder -6. Build and run your project - -> Note that every time `@react-native-async-storage/async-storage` gets updated, -> you must also run `pod update RNCAsyncStorage` otherwise you'll still be using -> the previous version. - -## [iOS] fatal error: 'React/RCTBridgeModule.h' file not found - -``` -info In file included from /~/@react-native-async-storage/async-storage/ios/RNCAsyncStorage.m:8: -/~/@react-native-async-storage/async-storage/ios/RNCAsyncStorage.h:8:9: fatal error: 'React/RCTBridgeModule.h' file not found - -info #import - ^~~~~~~~~~~~~~~~~~~~~~~~~ - -info 1 error generated. -``` - -- Make sure that you've run `pod install` or `pod update RNCAsyncStorage` (see - also [CocoaPods issues](#ios-cocoapods-issues)). - -- Make sure that `React` dependencies are _not_ removed from projects. Without - the target dependency set, Xcode may build things out of order and the React - headers will not be installed when AsyncStorage is built. - - ```Podfile - post_install do |installer| - installer.pods_project.targets.each do |target| - if target.name == "React" - target.remove_from_project - end - end - end - ``` - -- Try switching back to the legacy build system in Xcode. You can find it in - File > Project/Workspace Settings sheet. - -## [@RNC/AsyncStorage]: NativeModule: AsyncStorage is null - -### iOS - -This error means that AsyncStorage was unable to find its native module. This -occurs because AsyncStorage was not linked into the final app bundle. - -Make sure that you've run `pod install` or `pod update RNCAsyncStorage` (see -also [CocoaPods issues](#ios-cocoapods-issues)). diff --git a/docs/index.md b/docs/index.md index 087eac99..45723632 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,17 +1,77 @@ # Async Storage -Async Storage is asynchronous, unencrypted, persistent, key-value storage for your React Native application. +Async Storage is asynchronous, unencrypted, persistent, key-value storage for your React Native application. +It provides a simple API compatible with the [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API), with a few extensions for batch operations and multi-database support. -### Supported platform +--- -- Android -- iOS -- Web -- macOS -- Windows +## Supported platforms +- **Android** (SQLite backend via Room KMP) +- **iOS** (SQLite backend via Room KMP) +- **Web** (IndexedDB backend) +- **macOS** (SQLite backend via Room KMP) +- **Windows** (legacy fallback, single database only) + +--- ## Installation +```shell +# using npm +npm install @react-native-async-storage/async-storage + +# using yarn +yarn add @react-native-async-storage/async-storage +``` + +On iOS/macOS, don’t forget to install pods: + +```shell +# inside macos/ios directory +pod install +``` + +## Usage + +### Basic + +```typescript +import { createAsyncStorage } from "@react-native-async-storage/async-storage"; + +// Create a storage instance +const storage = createAsyncStorage("appDB"); + +async function demo() { + // save value under "userToken" key + await storage.setItem("userToken", "abc123"); + + // read value stored at "userToken" key + const token = await storage.getItem("userToken"); + console.log("Stored token:", token); + + // remove value from storage + await storage.removeItem("userToken"); +} +``` + +### Multi-item operations + +Async Storage supports batch operations for efficiency: + +```typescript +async function demo() { + // save multiple values at once + await storage.setMany({ + theme: "dark", + language: "en", + }); + + // Retrieve multiple values + const values = await storage.getMany(["theme", "language", "different"]); + console.log(values); // { theme: "dark", language: "en", different: null } -[See installation instructions](Installation.md) + // Remove multiple values + await storage.removeMany(["theme", "language"]); +} +``` diff --git a/mkdocs.yml b/mkdocs.yml index 19fbce72..b30c75bf 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -4,22 +4,6 @@ site_url: https://react-native-async-storage.github.io/ nav: - Overview: index.md - - Installation: Installation.md - - Usage: Usage.md - - API: API.md - - Advanced: - - Next Storage: advanced/Next.md - - Backup: advanced/Backup.md - - Brownfield Integration: advanced/BrownfieldIntegration.md - - Dedicated Executor: advanced/DedicatedExecutor.md - - Increase Database Size: advanced/IncreaseDbSize.md - - Jest integration: advanced/Jest-integration.md - - Where data is stored: advanced/Where-data-stored.md - - Known limits: advanced/Limits.md - - Debugging: - - Community packages: debugging/communityPackages.md - - Help: - - Troubleshooting: help/Troubleshooting.md theme: @@ -59,3 +43,4 @@ extra: link: https://github.com/react-native-async-storage/async-storage version: provider: mike + alias: true From d8ae270ab97ad1b4641d724e0fc48c4d7ad50fd4 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Fri, 26 Sep 2025 17:14:58 +0200 Subject: [PATCH 083/110] chore: drop old website --- .changeset/config.json | 4 +- package.json | 1 - packages/website/.gitignore | 4 - packages/website/README.md | 20 - packages/website/docs/API.md | 582 ------------------ packages/website/docs/Installation.md | 57 -- packages/website/docs/Limits.md | 17 - packages/website/docs/Usage.md | 83 --- packages/website/docs/advanced/Backup.md | 24 - .../docs/advanced/BrownfieldIntegration.md | 249 -------- .../docs/advanced/DedicatedExecutor.md | 32 - .../website/docs/advanced/IncreaseDbSize.md | 27 - .../website/docs/advanced/Jest-integration.md | 78 --- packages/website/docs/advanced/Next.md | 110 ---- .../docs/advanced/Where-data-stored.md | 11 - .../docs/debugging/communityPackages.md | 15 - packages/website/docs/help/Troubleshooting.md | 109 ---- packages/website/docusaurus.config.js | 89 --- packages/website/package.json | 34 - packages/website/sidebars.js | 16 - packages/website/src/components/Platform.js | 20 - packages/website/src/css/custom.css | 19 - packages/website/src/pages/index.js | 101 --- packages/website/src/pages/styles.module.css | 50 -- packages/website/static/.nojekyll | 0 packages/website/static/img/favicon.ico | Bin 15086 -> 0 bytes packages/website/static/img/hero_box.svg | 21 - packages/website/static/img/hero_db.svg | 25 - packages/website/static/img/hero_tools.svg | 11 - packages/website/static/img/icon_android.svg | 64 -- packages/website/static/img/icon_ios.svg | 6 - packages/website/static/img/icon_web.svg | 2 - packages/website/static/img/icon_windows.svg | 41 -- packages/website/static/img/logo.svg | 18 - 34 files changed, 2 insertions(+), 1938 deletions(-) delete mode 100644 packages/website/.gitignore delete mode 100644 packages/website/README.md delete mode 100644 packages/website/docs/API.md delete mode 100644 packages/website/docs/Installation.md delete mode 100644 packages/website/docs/Limits.md delete mode 100644 packages/website/docs/Usage.md delete mode 100644 packages/website/docs/advanced/Backup.md delete mode 100644 packages/website/docs/advanced/BrownfieldIntegration.md delete mode 100644 packages/website/docs/advanced/DedicatedExecutor.md delete mode 100644 packages/website/docs/advanced/IncreaseDbSize.md delete mode 100644 packages/website/docs/advanced/Jest-integration.md delete mode 100644 packages/website/docs/advanced/Next.md delete mode 100644 packages/website/docs/advanced/Where-data-stored.md delete mode 100644 packages/website/docs/debugging/communityPackages.md delete mode 100644 packages/website/docs/help/Troubleshooting.md delete mode 100644 packages/website/docusaurus.config.js delete mode 100644 packages/website/package.json delete mode 100644 packages/website/sidebars.js delete mode 100644 packages/website/src/components/Platform.js delete mode 100644 packages/website/src/css/custom.css delete mode 100644 packages/website/src/pages/index.js delete mode 100644 packages/website/src/pages/styles.module.css delete mode 100644 packages/website/static/.nojekyll delete mode 100644 packages/website/static/img/favicon.ico delete mode 100644 packages/website/static/img/hero_box.svg delete mode 100644 packages/website/static/img/hero_db.svg delete mode 100644 packages/website/static/img/hero_tools.svg delete mode 100644 packages/website/static/img/icon_android.svg delete mode 100644 packages/website/static/img/icon_ios.svg delete mode 100644 packages/website/static/img/icon_web.svg delete mode 100644 packages/website/static/img/icon_windows.svg delete mode 100644 packages/website/static/img/logo.svg diff --git a/.changeset/config.json b/.changeset/config.json index f1f85456..9a775e46 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -9,8 +9,8 @@ "updateInternalDependencies": "patch", "ignore": [ "@react-native-async-storage/eslint-config", - "async-storage-website", "example-react-native", - "example-web" + "example-web", + "example-common-tests" ] } diff --git a/package.json b/package.json index 70ba5bd4..d2230d3b 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "workspaces": [ "packages/async-storage", "packages/eslint-config", - "packages/website", "examples/react-native", "examples/web", "examples/common-tests" diff --git a/packages/website/.gitignore b/packages/website/.gitignore deleted file mode 100644 index 6405fd24..00000000 --- a/packages/website/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Production -build -.docusaurus -.cache-loader diff --git a/packages/website/README.md b/packages/website/README.md deleted file mode 100644 index 6729767f..00000000 --- a/packages/website/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Async Storage website - -Built using [Docusaurus 2](https://v2.docusaurus.io/). - - -## Development - -### Installation - -``` -$ yarn install -``` - -### Run locally - -``` -$ yarn start -``` - -This command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server. diff --git a/packages/website/docs/API.md b/packages/website/docs/API.md deleted file mode 100644 index 8560437c..00000000 --- a/packages/website/docs/API.md +++ /dev/null @@ -1,582 +0,0 @@ ---- -id: api -title: API -sidebar_label: API ---- - - - - -## `getItem` - -Gets a string value for given `key`. This function can either return a string value for existing `key` or return `null` otherwise. - -In order to store object value, you need to deserialize it, e.g. using `JSON.parse()`. - -*Note (legacy)*: you can use optional callback as an alternative for returned promise. - -**Signature**: - -```js -static getItem(key: string, [callback]: ?(error: ?Error, result: ?string) => void): Promise -``` - -**Returns**: - -`Promise` resolving with a string value, if entry exists for given `key`, or `null` otherwise. - -`Promise` can also be rejected in case of underlying storage error. - -**Example**: - -```js -getMyStringValue = async () => { - try { - return await AsyncStorage.getItem('@key') - } catch(e) { - // read error - } - - console.log('Done.') -} -``` - -```js -getMyObject = async () => { - try { - const jsonValue = await AsyncStorage.getItem('@key') - return jsonValue != null ? JSON.parse(jsonValue) : null - } catch(e) { - // read error - } - - console.log('Done.') -} -``` - - -
-
- - - -## `setItem` - -Sets a string `value` for given `key`. This operation can either modify an existing entry, if it did exist for given `key`, or add new one otherwise. - -In order to store object value, you need to serialize it, e.g. using `JSON.stringify()`. - -*Note (legacy)*: you can use optional callback as an alternative for returned promise. - -**Signature**: - -```js -static setItem(key: string, value: string, [callback]: ?(error: ?Error) => void): Promise -``` - -**Returns**: - -`Promise` resolving when the set operation is completed. - -`Promise` can also be rejected in case of underlying storage error. - -**Example**: - -```js -setStringValue = async (value) => { - try { - await AsyncStorage.setItem('key', value) - } catch(e) { - // save error - } - - console.log('Done.') -} -``` - -```js -setObjectValue = async (value) => { - try { - const jsonValue = JSON.stringify(value) - await AsyncStorage.setItem('key', jsonValue) - } catch(e) { - // save error - } - - console.log('Done.') -} -``` - -
-
- - - -## `mergeItem` - -Merges an existing value stored under `key`, with new `value`, assuming both values are **stringified JSON**. - -**Signature**: - -```js -static mergeItem(key: string, value: string, [callback]: ?(error: ?Error) => void): Promise -``` - -**Returns**: - -`Promise` with merged data, if exists, `null` otherwise. - -**Example**: - -```js -const USER_1 = { - name: 'Tom', - age: 20, - traits: { - hair: 'black', - eyes: 'blue' - } -} - -const USER_2 = { - name: 'Sarah', - age: 21, - hobby: 'cars', - traits: { - eyes: 'green', - } -} - - -mergeUsers = async () => { - try { - //save first user - await AsyncStorage.setItem('@MyApp_user', JSON.stringify(USER_1)) - - // merge USER_2 into saved USER_1 - await AsyncStorage.mergeItem('@MyApp_user', JSON.stringify(USER_2)) - - // read merged item - const currentUser = await AsyncStorage.getItem('@MyApp_user') - - console.log(currentUser) - - // console.log result: - // { - // name: 'Sarah', - // age: 21, - // hobby: 'cars', - // traits: { - // eyes: 'green', - // hair: 'black' - // } - // } - } -} -``` - -
-
- - - - -## `removeItem` - -Removes item for a `key`, invokes (optional) callback once completed. - -**Signature**: - -```js -static removeItem(key: string, [callback]: ?(error: ?Error) => void): Promise -``` - -**Returns**: - -`Promise` object. - -**Example**: - -```js -removeValue = async () => { - try { - await AsyncStorage.removeItem('@MyApp_key') - } catch(e) { - // remove error - } - - console.log('Done.') -} -``` - - -
-
- - - - -## `getAllKeys` - -Returns all keys known to your App, for all callers, libraries, etc. Once completed, invokes `callback` with errors (if any) and array of keys. - - -**Signature**: - -```js -static getAllKeys([callback]: ?(error: ?Error, keys: ?Array) => void): Promise -``` - -**Returns**: - -`Promise` object. - -**Example**: - -```js -getAllKeys = async () => { - let keys = [] - try { - keys = await AsyncStorage.getAllKeys() - } catch(e) { - // read key error - } - - console.log(keys) - // example console.log result: - // ['@MyApp_user', '@MyApp_key'] -} -``` - -
-
- - - -## `multiGet` - -Fetches multiple key-value pairs for given array of `keys` in a batch. Once completed, invokes `callback` with errors (if any) and results. - -**Signature**: - -```js -static multiGet(keys: Array, [callback]: ?(errors: ?Array, result: ?Array>) => void): Promise -``` - -**Returns**: - -`Promise` of array with coresponding key-value pairs found, stored as `[key, value]` array. - - -**Example**: - -```js -getMultiple = async () => { - - let values - try { - values = await AsyncStorage.multiGet(['@MyApp_user', '@MyApp_key']) - } catch(e) { - // read error - } - console.log(values) - - // example console.log output: - // [ ['@MyApp_user', 'myUserValue'], ['@MyApp_key', 'myKeyValue'] ] -} -``` - -
-
- - - -## `multiSet` - -Stores multiple key-value pairs in a batch. Once completed, `callback` with any errors will be called. - - -**Signature**: - -```js -static multiSet(keyValuePairs: Array>, [callback]: ?(errors: ?Array) => void): Promise -``` - -**Returns**: - -`Promise` object. - -**Example**: - -```js -multiSet = async () => { - const firstPair = ["@MyApp_user", "value_1"] - const secondPair = ["@MyApp_key", "value_2"] - try { - await AsyncStorage.multiSet([firstPair, secondPair]) - } catch(e) { - //save error - } - - console.log("Done.") -} -``` - -
-
- - - -## `multiMerge` - -Multiple merging of existing and new values in a batch. Assumes that values are *stringified JSON*. Once completed, invokes `callback` with errors (if any). - -**Signature**: - -```js -static multiMerge(keyValuePairs: Array>, [callback]: ?(errors: ?Array) => void): Promise -``` - -**Returns**: - -`Promise` object. - -**Example**: - -```js -const USER_1 = { - name: 'Tom', - age: 30, - traits: {hair: 'brown'}, -}; - -const USER_1_DELTA = { - age: 31, - traits: {eyes: 'blue'}, -}; - -const USER_2 = { - name: 'Sarah', - age: 25, - traits: {hair: 'black'}, -}; - -const USER_2_DELTA = { - age: 26, - traits: {hair: 'green'}, -}; - - -const multiSet = [ - ["@MyApp_USER_1", JSON.stringify(USER_1)], - ["@MyApp_USER_2", JSON.stringify(USER_2)] -] - -const multiMerge = [ - ["@MyApp_USER_1", JSON.stringify(USER_1_DELTA)], - ["@MyApp_USER_2", JSON.stringify(USER_2_DELTA)] -] - - -mergeMultiple = async () => { - let parsedCurrentlyMerged - - try { - await AsyncStorage.multiSet(multiSet) - await AsyncStorage.multiMerge(multiMerge) - const currentlyMerged = await AsyncStorage.multiGet(['@MyApp_USER_1', '@MyApp_USER_2']) - parsedCurrentlyMerged = currentlyMerged.map(([key, value]) => [ - key, - JSON.parse(value), - ]); - } catch(e) { - // error - } - - console.log( - 'parsedCurrentlyMerged', - JSON.stringify(parsedCurrentlyMerged, null, 2), - ); - // console.log output: - /* - [ - [ - "@MyApp_USER_1", - { - "name": "Tom", - "age": 31, - "traits": { - "hair": "brown", - "eyes": "blue" - } - } - ], - [ - "@MyApp_USER_2", - { - "name": "Sarah", - "age": 26, - "traits": { - "hair": "green" - } - } - ] - ] - */ -} -``` - - -
-
- - - -## `multiRemove` - -Clears multiple key-value entries for given array of `keys` in a batch. Once completed, invokes a `callback` with errors (if any). - -**Signature**: - -```js -static multiRemove(keys: Array, [callback]: ?(errors: ?Array) => void) -``` - -**Returns**: - -`Promise` object. - -**Example**: - -```js -removeFew = async () => { - const keys = ['@MyApp_USER_1', '@MyApp_USER_2'] - try { - await AsyncStorage.multiRemove(keys) - } catch(e) { - // remove error - } - - console.log('Done') -} - -``` - - -
-
- - - -## `clear` - -Removes **whole** `AsyncStorage` data, for all clients, libraries, etc. You probably want to use [removeItem](#removeitem) or [multiRemove](#multiremove) to clear only your App's keys. - -**Signature**: - -```js -static clear([callback]: ?(error: ?Error) => void): Promise -``` - -**Returns**: - -`Promise` object. - -**Example**: - -```js -clearAll = async () => { - try { - await AsyncStorage.clear() - } catch(e) { - // clear error - } - - console.log('Done.') -} -``` - - - - -## `useAsyncStorage` - -**Note**: A hooks-like interface that we're experimenting with. This will change in the nearest future to fully leverage Hooks API, so feel free to [follow this discussion to learn more](https://github.com/react-native-community/react-native-async-storage/issues/32). - - -The `useAsyncStorage` returns an object that exposes all methods that allow you to interact with the stored value. - -**Signature**: - -```js -static useAsyncStorage(key: string): { - getItem: ( - callback?: ?(error: ?Error, result: string | null) => void, - ) => Promise, - setItem: ( - value: string, - callback?: ?(error: ?Error) => void, - ) => Promise, - mergeItem: ( - value: string, - callback?: ?(error: ?Error) => void, - ) => Promise, - removeItem: (callback?: ?(error: ?Error) => void) => Promise, -} -``` - -**Returns**: - -`object` - -**Specific Example**: - -You can replace your `App.js` with the following to see it in action. - -```jsx -import React, { useState, useEffect } from 'react'; -import { View, Text, TouchableOpacity } from 'react-native'; -import { useAsyncStorage } from '@react-native-async-storage/async-storage'; - -export default function App() { - const [value, setValue] = useState('value'); - const { getItem, setItem } = useAsyncStorage('@storage_key'); - - const readItemFromStorage = async () => { - const item = await getItem(); - setValue(item); - }; - - const writeItemToStorage = async newValue => { - await setItem(newValue); - setValue(newValue); - }; - - useEffect(() => { - readItemFromStorage(); - }, []); - - return ( - - Current value: {value} - - writeItemToStorage( - Math.random() - .toString(36) - .substr(2, 5) - ) - } - > - Update value - - - ); -} -``` - -In this example: - -1. On mount, we read the value at `@storage_key` and save it to the state under `value` -2. When pressing on "update value", a new string gets generated, saved to async storage, and to the component state -3. Try to reload your app - you'll see that the last value is still being read from async storage diff --git a/packages/website/docs/Installation.md b/packages/website/docs/Installation.md deleted file mode 100644 index 774dfd76..00000000 --- a/packages/website/docs/Installation.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -id: install -title: Installation -sidebar_label: Installation ---- - -### Install - -With npm: - -```bash -npm install @react-native-async-storage/async-storage -``` - -With Yarn: - -```bash -yarn add @react-native-async-storage/async-storage -``` - -With Expo CLI: - -```bash -npx expo install @react-native-async-storage/async-storage -``` - -### Link - -#### Android & iOS - -Requires **React Native 0.60+** - -[CLI autolink feature](https://github.com/react-native-community/cli/blob/master/docs/autolinking.md) -links the module while building the app. - -On iOS, use CocoaPods to add the native `RNAsyncStorage` to your project: - -```bash -npx pod-install -``` - -#### Windows - -Requires **React Native Windows 0.63+** - -[CLI autolink feature](https://microsoft.github.io/react-native-windows/docs/native-modules-autolinking) -links the module while building the app. - -#### macOS - -Requires **React Native macOS 0.63+** - -1. Set `platform :macos, '10.14'` in `macos/Podfile` -2. Install the pods -3. From now on - [CLI autolink feature](https://microsoft.github.io/react-native-windows/docs/native-modules-autolinking) - will link the module while building the app. diff --git a/packages/website/docs/Limits.md b/packages/website/docs/Limits.md deleted file mode 100644 index 9ece909c..00000000 --- a/packages/website/docs/Limits.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: limits -title: Known storage limits -sidebar_label: Known limits ---- - -## Android - -AsyncStorage for Android uses SQLite for storage backend. While it has [its own size limits](https://www.sqlite.org/limits.html), Android system also have two known limits: total storage size and per-entry size limit. - - -- Total storage size is capped at 6 MB by default. You can increase this size by [specifying a new size using feature flag.](advanced/IncreaseDbSize.md) - -- Per-entry is limited by a size of a WindowCursor, a buffer used to read data from SQLite. [Currently it's size is around 2 MB](https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/res/res/values/config.xml;l=2103). - This means that the single item read at one time cannot be larger than 2 MB. There's no supported workaround from AsyncStorage. - We suggest keeping your data lower than that, by chopping it down into many entries, instead of one massive entry. - This is where [`multiGet`](API.md#multiget) and [`multiSet`](API.md#multiset) APIs can shine. diff --git a/packages/website/docs/Usage.md b/packages/website/docs/Usage.md deleted file mode 100644 index 7e7c771c..00000000 --- a/packages/website/docs/Usage.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -id: usage -title: Usage -sidebar_label: Usage ---- - -**Async Storage** can only store `string` data. In order to store object data, -you need to serialize it first. For data that can be serialized to JSON, you can -use `JSON.stringify()` when saving the data and `JSON.parse()` when loading the -data. - -### Importing - -```js -import AsyncStorage from '@react-native-async-storage/async-storage'; -``` - -### Storing data - -`setItem()` is used both to add new data item (when no data for given key -exists), and to modify existing item (when previous data for given key exists). - -#### Storing string value - -```jsx -const storeData = async (value) => { - try { - await AsyncStorage.setItem('my-key', value); - } catch (e) { - // saving error - } -}; -``` - -#### Storing object value - -```jsx -const storeData = async (value) => { - try { - const jsonValue = JSON.stringify(value); - await AsyncStorage.setItem('my-key', jsonValue); - } catch (e) { - // saving error - } -}; -``` - -### Reading data - -`getItem` returns a promise that either resolves to stored value when data is -found for given key, or returns `null` otherwise. - -#### Reading string value - -```jsx -const getData = async () => { - try { - const value = await AsyncStorage.getItem('my-key'); - if (value !== null) { - // value previously stored - } - } catch (e) { - // error reading value - } -}; -``` - -#### Reading object value - -```jsx -const getData = async () => { - try { - const jsonValue = await AsyncStorage.getItem('my-key'); - return jsonValue != null ? JSON.parse(jsonValue) : null; - } catch (e) { - // error reading value - } -}; -``` - -### More - -For more examples, [head over to API section.](API.md) diff --git a/packages/website/docs/advanced/Backup.md b/packages/website/docs/advanced/Backup.md deleted file mode 100644 index a7dcc67f..00000000 --- a/packages/website/docs/advanced/Backup.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -id: backup -title: Database backup exclusion -sidebar_label: iCloud backup ---- -import PlatformSupport from "../../src/components/Platform.js" - -**Supported platforms:** - - ---- - -Async Storage stores data in `Application Support` directory, which is backed up by iCloud by default. -This can lead to unintentional behavior where data is persisted even after an app re-installation. - -Async Storage disables that feature by default. - -In order to enable iCloud backup, open your app's `info.plist` in Xcode and add **boolean** entry called **RCTAsyncStorageExcludeFromBackup** and set its value to **NO** (NO as no for exclusion). - -Alternatively, you can open `info.plist` in editor and add new entry: -```diff -+ RCTAsyncStorageExcludeFromBackup -+ -``` diff --git a/packages/website/docs/advanced/BrownfieldIntegration.md b/packages/website/docs/advanced/BrownfieldIntegration.md deleted file mode 100644 index 24b8f4a3..00000000 --- a/packages/website/docs/advanced/BrownfieldIntegration.md +++ /dev/null @@ -1,249 +0,0 @@ ---- -id: brownfield -title: Brownfield integration -sidebar_label: Brownfield integration ---- -import PlatformSupport from "../../src/components/Platform.js" - -**Supported platforms:** - - - ---- - -# iOS - -If you're embedding React Native into native application, you can also integrate -Async Storage module, so that both worlds will use one storage solution. - - -AsyncStorage can be controlled by the hosting app via the delegate on -`RNCAsyncStorage`: - -```objc -RNCAsyncStorage *asyncStorage = [bridge moduleForClass:[RNCAsyncStorage class]]; -asyncStorage.delegate = self; -``` - - - -## The protocol - -The delegate must conform to the `RNCAsyncStorageDelegate` protocol: - - - -### allKeys - -```objc -- (void)allKeys:(RNCAsyncStorageResultCallback)block; -``` - -Returns all keys currently stored. If none, an empty array is returned. -Called by `getAllKeys` in JS. - - - -### mergeValues - -```objc -- (void)mergeValues:(NSArray *)values - forKeys:(NSArray *)keys - completion:(RNCAsyncStorageResultCallback)block; -``` - -Merges values with the corresponding values stored at specified keys. -Called by `mergeItem` and `multiMerge` in JS. - - - -### removeAllValues - -```objc -- (void)removeAllValues:(RNCAsyncStorageCompletion)block; -``` - -Removes all values from the store. Called by `clear` in JS. - - - -### removeValuesForKeys - -```objc -- (void)removeValuesForKeys:(NSArray *)keys - completion:(RNCAsyncStorageResultCallback)block; -``` - -Removes all values associated with specified keys. -Called by `removeItem` and `multiRemove` in JS. - - - -### setValues - -```objc -- (void)setValues:(NSArray *)values - forKeys:(NSArray *)keys - completion:(RNCAsyncStorageResultCallback)block; -``` - -Sets specified key-value pairs. Called by `setItem` and `multiSet` in JS. - - - -### valuesForKeys - -```objc -- (void)valuesForKeys:(NSArray *)keys - completion:(RNCAsyncStorageResultCallback)block; -``` - -Returns values associated with specified keys. -Called by `getItem` and `multiGet` in JS. - - - -### passthrough - -```objc -@optional -@property (nonatomic, readonly, getter=isPassthrough) BOOL passthrough; -``` - -**Optional:** Returns whether the delegate should be treated as a passthrough. -This is useful for monitoring storage usage among other things. Returns `NO` by -default. - ---- - -# Android - -The recommended approach here is to use Kotlin language to leverage coroutines when accessing the storage. -Java is also supported (through Kotlin interop), but the approach is more cumbersome. - - -## Prerequisites - -1. [Next storage feature](Next.md) enabled. -2. Add dependency on `coroutines-android` in your app's `build.gradle` - -```diff - -dependencies { - // other dependencies - - - // will work with coroutines 1.3.0 and up -+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9" - -} -``` - -3. Your library of choice for parsing JSON storage values (since there are strings only) - - -## Access storage - -### Kotlin (recommended) - -We use Coroutines to handle asynchronous code. Each method on storage is `suspend` method, so you need to -call it from within a coroutine. - - -#### Reading value - -```kotlin -suspend fun readValue(ctx: Context, keys: List) { - // get instance of the Storage by providing context object - val asyncStorage = StorageModule.getStorageInstance(ctx) - - val entries: List = asyncStorage.getValues(keys) - doSomethingWithValues(entries) -} -``` - -#### Saving value - -```kotlin -suspend fun saveValue(ctx: Context) { - val asyncStorage = StorageModule.getStorageInstance(ctx) - - val entries = listOf( - Entry("myKey", "myValue") - ) - asyncStorage.setValues(entries) -} -``` - - -### Java - -You can access AsyncStorage form Java, but you're still required to add Kotlin dependencies. -There's no one way of accessing the data and there's more than one way to parse it. - - -#### Reading from storage - -```java -void readStorageValue(Context ctx, String key) { - AsyncStorageAccess asyncStorage = StorageModule.getStorageInstance(ctx); - - BuildersKt.launch(GlobalScope.INSTANCE, - Dispatchers.getIO(), - CoroutineStart.DEFAULT, - (scope, continuation) -> { - List keys = new ArrayList<>(); - keys.add(key); - - Continuation> cont = new Continuation() { - @NotNull - @Override - public CoroutineContext getContext() { - return scope.getCoroutineContext(); - } - - @Override - public void resumeWith(@NotNull Object o) { - List entries = (List) o; - doSomethingWithEntries(entries); - } - }; - - asyncStorage.getValues(keys, cont); - return Unit.INSTANCE; - }); - -} -``` - - -#### Saving to storage - -```java -void saveStorageValue(Context ctx, String key, String value) { - AsyncStorageAccess asyncStorage = StorageModule.getStorageInstance(ctx); - - BuildersKt.launch(GlobalScope.INSTANCE, - Dispatchers.getIO(), - CoroutineStart.DEFAULT, - (scope, continuation) -> { - Continuation cont = new Continuation() { - @NotNull - @Override - public CoroutineContext getContext() { - return scope.getCoroutineContext(); - } - - @Override - public void resumeWith(@NotNull Object o) {} - }; - - List entries = new ArrayList<>(); - Entry entry = new Entry(key, value); - entries.add(entry); - asyncStorage.setValues(entries, cont); - return Unit.INSTANCE; - }); -} -``` - diff --git a/packages/website/docs/advanced/DedicatedExecutor.md b/packages/website/docs/advanced/DedicatedExecutor.md deleted file mode 100644 index 23b09233..00000000 --- a/packages/website/docs/advanced/DedicatedExecutor.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -id: executor -title: Dedicator Thread Executor -sidebar_label: Dedicated Executor ---- -import PlatformSupport from "../../src/components/Platform.js" - -**Supported platforms:** - - ---- - -**Note**: This feature is obsolete when [Next storage feature is enabled](Next.md). - - -## Motivation - -This feature would be mostly used in brownfield apps and [in edge cases with some android devices.](https://github.com/react-native-async-storage/async-storage/issues/159) -Dedicated thread pool executor makes `AsyncStorage` use separate thread pool for its tasks execution. - -Use this feature if `THREAD_POOL_EXECUTOR` from `AsyncTasks`: - -- Is used in your app, so that background tasks are queued most of the time -- Acts weird on your device (for example, waits for some time before execution) - -## How to use - -Add a `AsyncStorage_dedicatedExecutor` property to your `android/gradle.properties`: - -``` -AsyncStorage_dedicatedExecutor=true -``` diff --git a/packages/website/docs/advanced/IncreaseDbSize.md b/packages/website/docs/advanced/IncreaseDbSize.md deleted file mode 100644 index 129c49b3..00000000 --- a/packages/website/docs/advanced/IncreaseDbSize.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -id: db_size -title: Increasing Storage size -sidebar_label: Storage space increase ---- -import PlatformSupport from "../../src/components/Platform.js" - -**Supported platforms:** - - ---- - -**Note**: This feature is obsolete when [Next storage feature is enabled](Next.md). - -## Motivation - -Current Async Storage's size is set to 6MB. Going over this limit causes `database or disk is full` error. This 6MB limit is a sane limit to protect the user from the app storing too much data in the database. This also protects the database from filling up the disk cache and becoming malformed (endTransaction() calls will throw an exception, not rollback, and leave the db malformed). You have to be aware of that risk when increasing the database size. We recommend to ensure that your app does not write more data to AsyncStorage than space is left on disk. Since AsyncStorage is based on SQLite on Android you also have to be aware of the [SQLite limits](https://www.sqlite.org/limits.html). - -## Increase limit - -Add a `AsyncStorage_db_size_in_MB` property to your `android/gradle.properties`: - -```bash -AsyncStorage_db_size_in_MB=10 -``` - -Now you can define the new size in MB. In this example, the new limit is 10 MB. diff --git a/packages/website/docs/advanced/Jest-integration.md b/packages/website/docs/advanced/Jest-integration.md deleted file mode 100644 index 6a5e70a2..00000000 --- a/packages/website/docs/advanced/Jest-integration.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -id: jest -title: Jest integration -sidebar_label: Jest integration ---- - -Async Storage module is tightly coupled with its `NativeModule` part - it needs -a running React Native application to work properly. In order to use it in -tests, you have to provide its separate implementation. Follow these steps to -add a mocked `Async Storage` module. - -## Using Async Storage mock - -You can use one of two ways to provide mocked version of `AsyncStorage`: - -### With **mocks** directory - -1. In your project root directory, create - `__mocks__/@react-native-async-storage` directory. -2. Inside that folder, create `async-storage.js` file. -3. Inside that file, export `Async Storage` mock. - -```javascript -export * from '@react-native-async-storage/async-storage/jest/async-storage-mock'; -``` - -### With Jest setup file - -1. In your Jest config (probably in `package.json`) add setup files location: - -```json -"jest": { - "setupFiles": ["./path/to/jestSetupFile.js"] -} -``` - -2. Inside your setup file, set up Async Storage mocking: - -```javascript -jest.mock('@react-native-async-storage/async-storage', () => - require('@react-native-async-storage/async-storage/jest/async-storage-mock') -); -``` - -## Testing with mock - -Each public method available from `Async Storage` is -[a mock function](https://jestjs.io/docs/en/mock-functions), that you can test -for certain condition, for example, if `.getItem` has been called with a -specific arguments: - -```javascript -it('checks if Async Storage is used', async () => { - await asyncOperationOnAsyncStorage(); - - expect(AsyncStorage.getItem).toBeCalledWith('myKey'); -}); -``` - -## Overriding Mock logic - -You can override mock implementation, by replacing its inner functions: - -```javascript -// somewhere in your configuration files -import AsyncStorageMock from '@react-native-async-storage/async-storage/jest/async-storage-mock'; - -AsyncStorageMock.multiGet = jest.fn(([keys], callback) => { - // do something here to retrieve data - callback([]); -}); - -export default AsyncStorageMock; -``` - -You can -[check its implementation](https://github.com/react-native-async-storage/async-storage/blob/main/packages/default-storage/jest/async-storage-mock.js) -to get more insight into methods signatures. diff --git a/packages/website/docs/advanced/Next.md b/packages/website/docs/advanced/Next.md deleted file mode 100644 index f7cd5eff..00000000 --- a/packages/website/docs/advanced/Next.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -id: next -title: Next storage implementation -sidebar_label: Next storage implementation ---- -import PlatformSupport from "../../src/components/Platform.js" - -**Supported platforms:** - - ---- - -### Motivation - -Current implementation of persistence layer is created using [SQLiteOpenHelper](https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper), -a helper class that manages database creation and migrations. Even if this approach is powerful, the lack of compile time query verification and a big boilerplate of mapping SQLite queries to actual values make this implementation prone to many errors. - -This Async Storage feature improves the persistence layer, using modern approaches to access SQLite (using [Room](https://developer.android.com/training/data-storage/room)), to reduce possible anomalies to the minimum. -On top of that, it allows accessing AsyncStorage from the native side, useful in [Brownfield integration.](BrownfieldIntegration.md#android) - -### Migration - -This feature requires no migration from the developer perspective - the current database will be recreated (based on the current one), meaning user won't lose any data if you decide to opt in. -There's a small drawback to know - the database "recreation" happens **only once**. - -#### How it works - -The new database (the one used by this feature) will be created based on the current database file, if the new one does not exist yet. -If we detect that there's already the new database on the device, recreation will not kick in. - - -#### Why is it important - -Let's say you enabled the feature for the first time - recreation kicks in and the old database file is untouched. -If you decide to disable the feature, your users will be back using old database. No data migrations is happening from new to old database file. -When you enable the feature again, the new database is **not** recreated, because it already exists, and no data is copied over. - - -### Enable - -#### Add config flag - -In your project's `android` directory, locate `gradle.properties` file (if it does not exist, create one) and add the line: -```groovy -AsyncStorage_useNextStorage=true -``` - -#### React Native < 0.73 - -For React Native below version 0.73, you need to apply Kotlin plugin to your project. -In your project's android directory, locate root build.gradle file. Add Kotlin dependency to the buildscript: - -```diff - buildscript { - ext { - // other extensions -+ kotlinVersion = '1.9.24' - } - - dependencies { - // other dependencies -+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" - } - } - -``` - - -### Configuration - -**Kotlin version** - -Next storage is tested against Kotlin version `1.9.24`. -You can specify different version, in one of two ways: - -- add `kotlinVersion` extension to the `rootProject`: - -```groovy -rootProject.ext.kotlinVersion = '1.9.24' -``` - -- specify `AsyncStorage_kotlinVersion` in `gradle.properties`: - -```groovy -AsyncStorage_kotlinVersion=1.9.24 -``` - -**Room** - -Next AsyncStorage uses [Room persistence library](https://developer.android.com/jetpack/androidx/releases/room) to store data. -Currently, tested version is `2.6.1`. You can specify different version, by adding a flag to `gradle.properties`: - -```groovy -AsyncStorage_next_roomVersion=2.6.1 -``` - -KSP is enabled for symbol processing for the Room library. -KSP version will be selected based on Kotlin version in your project. -If you want to use different KSP version, you can set a property in `gradle.properties`: - -```groovy -AsyncStorage_next_kspVersion=1.9.24-1.0.20 -``` - -### Notable changes - -Alongside of a warning regarding `key`/`value`, errors are thrown when: - -- Your `key` is `null` or `not a string` -- You provide value that is `not a string` diff --git a/packages/website/docs/advanced/Where-data-stored.md b/packages/website/docs/advanced/Where-data-stored.md deleted file mode 100644 index 0c5d200b..00000000 --- a/packages/website/docs/advanced/Where-data-stored.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: where_data_stored -title: Where your data is stored -sidebar_label: Where data is stored ---- - -* **Android** - SQLite -* **iOS** - small values (not exceeding 1024 characters) are serialized and stored in a common `manifest.json` file, while larger values are stored in individual, dedicated files (named as MD5 hashed `key`) -* **macOS** - Same as iOS -* **Web** - window.localStorage -* **Windows** - SQLite \ No newline at end of file diff --git a/packages/website/docs/debugging/communityPackages.md b/packages/website/docs/debugging/communityPackages.md deleted file mode 100644 index a5c42ab2..00000000 --- a/packages/website/docs/debugging/communityPackages.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: communityPackages -title: Community Packages -sidebar_label: Community Packages ---- - -### Flipper - -For projects that use Flipper, there is a Flipper plugin called [Advanced Async Storage](https://github.com/lbaldy/flipper-plugin-async-storage-advanced). The plugin provides basic CRUD operations on Async Storage. - - -### Non Flipper - -For the projects which aren't using Flipper, you can use the [React Native Debugger](https://github.com/jhen0409/react-native-debugger) which comes with a built-in Async Storage support. The debugger allows to print the Async Storage content to the console, and clear it completely. - diff --git a/packages/website/docs/help/Troubleshooting.md b/packages/website/docs/help/Troubleshooting.md deleted file mode 100644 index 12d59bb2..00000000 --- a/packages/website/docs/help/Troubleshooting.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -id: troubleshooting -title: Troubleshooting -sidebar_label: Troubleshooting ---- - -## Async await doesn't resolve - -If you're having issues with `getItem()` and friends not resolving, check if -`inlineRequires` is enabled in `metro.config.js`: - -```js -module.exports = { - transformer: { - getTransformOptions: async () => ({ - transform: { - experimentalImportSupport: false, - inlineRequires: true, - }, - }), - }, -}; -``` - -If disabling it resolves the issue, it's likely that you hit a circular import -chain. You can try excluding `@react-native-async-storage/async-storage` from -being inlined: - -```diff - module.exports = { - transformer: { - getTransformOptions: async () => ({ - transform: { - experimentalImportSupport: false, - inlineRequires: true, -+ nonInlinedRequires: [ -+ "@react-native-async-storage/async-storage", -+ 'React', -+ 'react', -+ 'react-native', -+ ], - }, - }), - }, - }; -``` - -If this doesn't resolve the issue, you need to figure out what is causing the -cyclic chain. There are tools, such as -[@rnx-kit/metro-plugin-cyclic-dependencies-detector](https://github.com/microsoft/rnx-kit/tree/main/packages/metro-plugin-cyclic-dependencies-detector#rnx-kitmetro-plugin-cyclic-dependencies-detector), -that can help you debug this. - -## [iOS] CocoaPods issues - -1. Delete the `node_modules` folder(s) from your project -2. Run `yarn` or `npm install` -3. If you're using CocoaPods: - 1. Make sure your `Podfile` does _not_ have an entry for `RNCAsyncStorage`. - 2. `pod install` - 3. `pod update RNCAsyncStorage` -4. Open your Xcode project -5. Press ⇧⌥⌘K to clean your build folder -6. Build and run your project - -> Note that every time `@react-native-async-storage/async-storage` gets updated, -> you must also run `pod update RNCAsyncStorage` otherwise you'll still be using -> the previous version. - -## [iOS] fatal error: 'React/RCTBridgeModule.h' file not found - -``` -info In file included from /~/@react-native-async-storage/async-storage/ios/RNCAsyncStorage.m:8: -/~/@react-native-async-storage/async-storage/ios/RNCAsyncStorage.h:8:9: fatal error: 'React/RCTBridgeModule.h' file not found - -info #import - ^~~~~~~~~~~~~~~~~~~~~~~~~ - -info 1 error generated. -``` - -- Make sure that you've run `pod install` or `pod update RNCAsyncStorage` (see - also [CocoaPods issues](#ios-cocoapods-issues)). - -- Make sure that `React` dependencies are _not_ removed from projects. Without - the target dependency set, Xcode may build things out of order and the React - headers will not be installed when AsyncStorage is built. - - ```Podfile - post_install do |installer| - installer.pods_project.targets.each do |target| - if target.name == "React" - target.remove_from_project - end - end - end - ``` - -- Try switching back to the legacy build system in Xcode. You can find it in - File > Project/Workspace Settings sheet. - -## [@RNC/AsyncStorage]: NativeModule: AsyncStorage is null - -### iOS - -This error means that AsyncStorage was unable to find its native module. This -occurs because AsyncStorage was not linked into the final app bundle. - -Make sure that you've run `pod install` or `pod update RNCAsyncStorage` (see -also [CocoaPods issues](#ios-cocoapods-issues)). diff --git a/packages/website/docusaurus.config.js b/packages/website/docusaurus.config.js deleted file mode 100644 index d9fc3fb2..00000000 --- a/packages/website/docusaurus.config.js +++ /dev/null @@ -1,89 +0,0 @@ -module.exports = { - title: "Async Storage", - tagline: "Data storage system for React Native.", - url: "https://react-native-async-storage.github.io", - baseUrl: "/async-storage/", - favicon: "img/favicon.ico", - organizationName: "react-native-async-storage", - projectName: "async-storage", - themeConfig: { - prism: { - theme: require("prism-react-renderer/themes/vsDark"), - darkTheme: require("prism-react-renderer/themes/vsDark"), - lightTheme: require("prism-react-renderer/themes/vsLight"), - }, - navbar: { - title: "Async Storage", - logo: { - alt: "Async Storage Logo", - src: "img/logo.svg", - }, - items: [ - { - label: "Docs", - to: "docs/install", - activeBasePath: "/docs", - position: "right", - }, - { - href: "https://github.com/react-native-async-storage/async-storage", - label: "GitHub", - position: "right", - }, - ], - }, - footer: { - style: "dark", - links: [ - { - title: "Documentation", - items: [ - { - label: "Installation", - to: "docs/install", - }, - { - label: "API reference", - to: "docs/api", - }, - ], - }, - { - title: "Community", - items: [ - { - label: "Discord", - href: "https://discord.gg/PycDts2", - }, - ], - }, - { - title: "More", - items: [ - { - label: "GitHub", - href: "https://github.com/react-native-async-storage/async-storage", - }, - ], - }, - ], - copyright: `Copyright © ${new Date().getFullYear()} React Native Community. Built with Docusaurus.`, - }, - }, - presets: [ - [ - "@docusaurus/preset-classic", - { - docs: { - sidebarPath: require.resolve("./sidebars.js"), - editUrl: - "https://github.com/react-native-async-storage/async-storage/edit/main/website/", - }, - theme: { - customCss: require.resolve("./src/css/custom.css"), - }, - }, - ], - ], - plugins: [require.resolve("docusaurus-lunr-search")], -}; diff --git a/packages/website/package.json b/packages/website/package.json deleted file mode 100644 index 9bc01d37..00000000 --- a/packages/website/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "private": true, - "name": "async-storage-website", - "version": "1.0.0", - "scripts": { - "build": "docusaurus build", - "deploy": "docusaurus deploy", - "serve": "docusaurus serve", - "start": "docusaurus start" - }, - "installConfig": { - "hoistingLimits": "workspaces" - }, - "dependencies": { - "@docusaurus/core": "^2.4.0", - "@docusaurus/preset-classic": "^2.4.0", - "classnames": "^2.2.6", - "docusaurus-lunr-search": "^3.4.0", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } -} diff --git a/packages/website/sidebars.js b/packages/website/sidebars.js deleted file mode 100644 index 7ecdb136..00000000 --- a/packages/website/sidebars.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - docs: { - "Getting started": ["install", "usage", "api", "limits"], - Advanced: [ - "advanced/next", - "advanced/jest", - "advanced/brownfield", - "advanced/backup", - "advanced/executor", - "advanced/db_size", - "advanced/where_data_stored", - ], - Debugging: ["debugging/communityPackages"], - Help: ["help/troubleshooting"], - }, -}; diff --git a/packages/website/src/components/Platform.js b/packages/website/src/components/Platform.js deleted file mode 100644 index 44cc61aa..00000000 --- a/packages/website/src/components/Platform.js +++ /dev/null @@ -1,20 +0,0 @@ -import React from "react"; - -const PlatformSupport = ({ platformIcon, title }) => ( -
- -

{title}

-
-); - -export default PlatformSupport; diff --git a/packages/website/src/css/custom.css b/packages/website/src/css/custom.css deleted file mode 100644 index 88665388..00000000 --- a/packages/website/src/css/custom.css +++ /dev/null @@ -1,19 +0,0 @@ -:root { - --ifm-color-primary: #ff9800; - --ifm-color-primary-darker: rgb(31, 165, 136); - --ifm-color-primary-darkest: rgb(26, 136, 112); - --ifm-color-primary-light: #ff9800; - --ifm-color-primary-lighter: rgb(102, 212, 189); - --ifm-color-primary-lightest: rgb(146, 224, 208); - - --hero-img-background: #f2f2f2; -} - -html[data-theme='dark'] { - --ifm-background-color: #2b3940; - --ifm-navbar-background-color: #212c32; -} - -footer.footer.footer--dark { - --ifm-footer-background-color: #292b2f; -} diff --git a/packages/website/src/pages/index.js b/packages/website/src/pages/index.js deleted file mode 100644 index b5d0be7c..00000000 --- a/packages/website/src/pages/index.js +++ /dev/null @@ -1,101 +0,0 @@ -import React from "react"; -import classnames from "classnames"; -import Layout from "@theme/Layout"; -import Link from "@docusaurus/Link"; -import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; -import useBaseUrl from "@docusaurus/useBaseUrl"; -import styles from "./styles.module.css"; - -const features = [ - { - title: "Persistent storage", - imageUrl: "img/hero_db.svg", - description: ( - <> - Async Storage is asynchronous, unencrypted, persistent, key-value - storage solution for your React Native application. - - ), - }, - { - title: "Multi-platform support", - imageUrl: "img/hero_box.svg", - description: ( - <> - Data storage solution for Android, iOS - , Web, MacOS and{" "} - Windows. - - ), - }, - { - title: "Simple API", - imageUrl: "img/hero_tools.svg", - description: ( - <> - A handful of tools to simplify your storage flow. Easily save, read, - merge and delete data at will! - - ), - }, -]; - -function Feature({ imageUrl, title, description }) { - const imgUrl = useBaseUrl(imageUrl); - return ( -
- {imgUrl && ( -
-
- {title} -
-
- )} -

{title}

-

{description}

-
- ); -} - -function Home() { - const context = useDocusaurusContext(); - const { siteConfig = {} } = context; - return ( - -
-
-

{siteConfig.title}

-

{siteConfig.tagline}

-
- - Get Started - -
-
-
-
- {features && features.length && ( -
-
-
- {features.map((props, idx) => ( - - ))} -
-
-
- )} -
-
- ); -} - -export default Home; diff --git a/packages/website/src/pages/styles.module.css b/packages/website/src/pages/styles.module.css deleted file mode 100644 index 058b63c6..00000000 --- a/packages/website/src/pages/styles.module.css +++ /dev/null @@ -1,50 +0,0 @@ -/* stylelint-disable docusaurus/copyright-header */ -/** - * CSS files with the .module.css suffix will be treated as CSS modules - * and scoped locally. - */ - -.heroBanner { - padding: 4rem 0; - text-align: center; - position: relative; - overflow: hidden; - - align-items: center; - background-color: var(--ifm-background-color); - display: flex; -} - - -@media screen and (max-width: 966px) { - .heroBanner { - padding: 2rem; - } -} - -.buttons { - display: flex; - align-items: center; - justify-content: center; -} - -.features { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; -} - -.featureImage { - height: 250px; - width: 250px; -} - -.featureImageContainer { - display: flex; - justify-content: center; - align-items: center; - background: var(--hero-img-background); - border-radius: 20px; - margin-bottom: 10px; -} diff --git a/packages/website/static/.nojekyll b/packages/website/static/.nojekyll deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/website/static/img/favicon.ico b/packages/website/static/img/favicon.ico deleted file mode 100644 index 91e61882a4ea8b620e0c4232b10c29b7eecef56a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmeHO2Uu0dw%+?t)d<)XqZAdf03w17P*JH0hl5guh$0FC(!>IIDE4SX1tP|RMh(PX zqGAkSG@wz_lb4r!lbC*QVq(>2T0thOWg!jICzVBz|tTOAL*>h&^S+kKO zS<;b)43VfbmrD9cl9MD!=H|8EO(f|vl9^D+`Z>Ciw44mA$%b5{=>(RGPhU;Z;IFAg zgyb-;Kz5o~_^hjt&1;n~CSJM)6@n{sX6|xo0Tkz{{_0QY8L|XENyjiL?Gz@> zZ)G4(%&li|Cgf8;YB&>jEr036_pl6G3RTvd@Xx-~D#6^CBXbpF-X#AE#QkEcgevR8 zfB64}*XBRt|JVL5{_OEreajge`7JpUFW%#C_g;&xM0pEa;E{}TL` zRKY25C3?7q!N@a;FcUq-OvCV?RYIq^w>;cDeA4`t>hl=nl>~#J6zJ{z5C*4z6VQ8+ z>OrYO$2Jc;pPnRtRqkatN94oMKOP3BZo=>^V6g8C!k3zQ8Oi+PFgkoA*!E%i@Fe;B z^S#|Iik<;qhv6HnzhJ-IM1}Yct<7 zTL8Yt^86R`hsS^OMaZ3cppAjP0N3@4F4T=b+lu>g3t})IRo2C3pP$A4i}p5N^A5u& z^#puUS^%>5j6Z6T@rXA(+x0QGWH> zAN!ZO{V$+fbPnz3<-@4OD1cGS8t6Iu!QkjW#ahGbjbZsM7*-IfsLpFD>DY#CjpmV0 z3*)q(w-LIV&e8st_UqdHZ}@_r6fb`Q#r{trAG`wT;AfByG=cr3+y8me!6R z?>c(wuRX^{qNm&RI+(geqOWHdlG6ubM$#~tO^kqPt-i;&NQ?}ejLe)qQ0JOM6=;nf zHlDBrbyWxW zM<;;W(8lAo;}(RASR9jMYjxVvdd!RqdirfUX?bf)^I^)oq5he0Anx^HM{VS+@Wm%* zx?y~H8tf@Xef_AQ3{)TMgU_iC9@A4XgzSr77!7u`+dU8gv(B%@Z zn`HaL#rBw<6eY%(<8qwg)OP-c@%ZwMjtHI`Qx~T`FMDM=%!W?Rsn5S-uff9xdnEkG z{i|JdhrtpeP7JXd4Y7*Wl>y5Vw zT<3nXj%{|4?S)q?v2)8PaZPw`OpTd~11~z@yYt4#TBdB42XnG=oqmq^8*BT}bMS4 zmTjfJvJKm=S?h^UD!XBEb^!M6945y6t&?Vmqj}H$sXulN>NLhQ*4H}rwi{W?U)OR( z;I5&nCC&TPwkPIiM4A|%vxlwlj|)b){a*?(##=VIf@MFx)eh-70pj`x#>RrdbAe@7 zFF%EINBUvwCKoW*8uH~fDh|?`l&iwHX$zX1GY$9?7kj_O=rzQ95%X_j+}&(|Tl7Z` zwC*&vYwEjpY=;MCVtbLZ7`Kw`!v%L9TmCKl_P!qRGR9Z*n_=+0V;So{JZ&m$_iP(M z>sBWeZyqh?mi8Jo6|*T>Kj-jQiM~v zTZpju+4%2@?)00mz^v3rM5RQExz2NCT0%6&kPX}NI2_tF6i3Owx%Qit(;OP)9{X7iW#^?fAL{#ot>-+n1U4Rt815U3HxKo| z^4u{r7D@H|6T$kdOjlg3*2j<-`G1C?(@Cjk>&*xpJ1@8 ze!J|`KU@Wu_(^E%9@0Qp->!b$klLu@Nu2ep9dF4o%Wue)|AKsmQ28r#b6!Hb*fn@6 zF7Li*6T2R5=}e?4+jit{NO}g>o3dfwHnC0X8rw4`9pc6uHC%}=a}P=WKtbI3{78P| z-!O?1={j=zoT=oNcPRkMd*+S@-m1f5&nwRD zmhZhGbvN@9+%BtnDT*)M5&O!Dn=qd9EZkyt|E2SYxibf2+Aqr$zi8%8@#PwM zxW{uuTfZKEu6B|=!gecmy{qZNE8n7HXpLF&m)(VQnv6+KRT*SO5 zZp@LnHsY@R+C_HpEt2z2{-!whKXguf744D>VH>(itficHRprpS#B0+N0>|)9eg$?R zE72}7UvN;IB`)hu{3bh3E+V2`v}Btp+e&?GX39}n?<=-nyv=zb#g_9hp?grjX)E9~ zqY$ohc3@1*uEz@3**oAESs-GV#I1+og=+CmfMVO5HS$dLds1K9nZ&nkGo0@hD-^vX zEBhE(6?05pSoE2+>cDkLz4LcP?8;lZ(-z#)3rTr=2u``B8&w7`f1Bba_4rnfY1R+|@|($48zT|Dv3{p+Zj0FPG*Q{3+mA zBIeZiopRoZ8pYY)VNg^BqZLPCwDQ=K1;yZ49Ft<-Q52NZTKFRd#uU-JMP=}Q!r&MK z=M+IMqj!ZUwun#f-3*D}i2y!}Zei}erS=?yW6AukPlNcH`{~0yOFj6xGvBj^#P9h3 z5np?)TJZewIQq}eA<8Ayb^9=`Kj?GNqsHero+-!BHz*q>@dW~XgL8!JK{z~Wd|x`_ zG7HXvKEFpm=XM51uZnjHSjM{h&EH3fuX%3WgLdh=VEB3sbUY&j_za6>ZZUiA`&|7< z@#)#nC29){pFIhK17AZn8vxmSAl1JSGS>0)3fKK!Z7?SK! z;@i`jG=-mmX?pHxm5=l3?LCU-+gj8znyAPa>9%0U<;E7T?yMv2hN!_yuREm-%A|o!f}KKgnL&J_4`qA53{(HBRic z1wNz49m2_dwnA36&jv5=aH>0tV_$BA+u}AgXJy&2^G^BJ)Y^4W?NgB4e@x`_4k~qB zzS!PB8}pY0;Y6tooyEnAa|)Nx#i*owKA&?aqZ7nA)=fIwWAND#%lJ&D@?d|shAt95 zs@ZWkNo}NN1~th4Q(pOw<%pm;9N)Nmzpj*XzSKC+&*wVX%l%M(V1PJBS+Uv&hbS+; z_Bl`NpmR9Rb#vaE!F86crL&WRl>1)2#v2>xOpJZibmqftHO_fkyUp51;SHX)^>DMB zoOZ2oe75H?<9_j(%*T{_|KM~_yi#IIIcyU;>u?qQ=Du^CWyeYP{^_Shp8nZ2UhtbW zPqfiEHpjB@PX3~Mf9Jt{Mup_i`Q)9uZ8T>+d^Y1qXH0x1z}IAE@(gjF$LErz#ZELQ zhKn=GWpu{Jx|GadVe3eJX5VJpRi^*j!f8tUfUz^H95~Ofq+ELw7)r9SA@gyfWH7v^ zC&11(3qyR>$jtUdS;;`0EExoK&SW8D9orlyTlQh!rrOlVGGOf*`Krk%|9^G%nS;*W zv(bs(>+9$-gD|rJdQN@@q3Pq%%P*o%-qm|LX63kGcCHJ!uJ!4y3`gkV@h~MHt?Z9- zhKRwjIHvI^<*)M6lACh*4JdZKhpw~Mz$~@^y<_f1ub9HS3QZ!fZKMAErt&NUkAnH*s?M@LviHm z+noQlOe)sIZNc;0z3#Pl>8M{EgJUU6W+|{bv_q@T`YH0s2Q5 zfZNbtb)-fvto&Y1%qx*82F1HqW~7ZYz;T46nv*DnCg(|$A`7JnL4?4TW770ODKsfh zv^Bty$8ts`*_fhP*WK|JoR*w|SLW;Rd_b@*`>?Oxwo7nPS0JFNxk&Sy z=Xm2e%C_vozFL2_Y4H1{IqI{hoKSJs`?qX+FMrmLNjruvxrC+1M7@6d_w}dsuz%)J z=p=3su%fzHe{0v12L9XWJ?JH`Y4p5CGcv2tC;cGWc!a@_z;%`h9qG9(_R%9>oy}F( zd*mLivCKFCEA>9~$)qx~6y4G`QNHJ80j{%5=*Wg`$>+At3spaNQYFsp7o@&1I9!eB zoKOr1%fhtuNW^7MMscy70N2Aareh%KX6J^2ZTkc+`L_L(B>zDZViFzvm)z!OiRAPU zBoQ{QpMcGUW3g_Xhd>dXyXUVTU#DkVx`+QZ&@DRD)+_0__Wcv5scJ;hJ3@Q5j=<)E zvGlHlvjEpw7MU0YC-UWIk74v&Y3rF-+FO}&%`#viEPYd8;hPG(pg5=!f??&Kgt=-j z0W1GR_>+uvY{RzfL%vt#E!EdLuQ(2;ggtOdDis)!Tnb0tZ%|pkuGO<`=at97zEVN? zizeIOgEzfnJViTS?@_W1+nQ{DA5vk(i}X%kKSj~GQ)a79-z$HtEBwt{{k3RE=&Lb diff --git a/packages/website/static/img/hero_box.svg b/packages/website/static/img/hero_box.svg deleted file mode 100644 index d2822bee..00000000 --- a/packages/website/static/img/hero_box.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/website/static/img/hero_db.svg b/packages/website/static/img/hero_db.svg deleted file mode 100644 index 73a42f0f..00000000 --- a/packages/website/static/img/hero_db.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/website/static/img/hero_tools.svg b/packages/website/static/img/hero_tools.svg deleted file mode 100644 index deafdc08..00000000 --- a/packages/website/static/img/hero_tools.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/packages/website/static/img/icon_android.svg b/packages/website/static/img/icon_android.svg deleted file mode 100644 index 7cab842f..00000000 --- a/packages/website/static/img/icon_android.svg +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/website/static/img/icon_ios.svg b/packages/website/static/img/icon_ios.svg deleted file mode 100644 index 872103fc..00000000 --- a/packages/website/static/img/icon_ios.svg +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/packages/website/static/img/icon_web.svg b/packages/website/static/img/icon_web.svg deleted file mode 100644 index bd7f78f2..00000000 --- a/packages/website/static/img/icon_web.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/packages/website/static/img/icon_windows.svg b/packages/website/static/img/icon_windows.svg deleted file mode 100644 index 36a8eb2b..00000000 --- a/packages/website/static/img/icon_windows.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/website/static/img/logo.svg b/packages/website/static/img/logo.svg deleted file mode 100644 index 8cabcb5c..00000000 --- a/packages/website/static/img/logo.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - From 607d3d1b1ccd6a9a31fdbff1d3eafd3c8252f182 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Fri, 26 Sep 2025 18:01:03 +0200 Subject: [PATCH 084/110] docs: deployment --- .github/scripts/prepare-mkdocs.sh | 10 ++++++ .github/workflows/deploy-docs.yml | 32 +++++++++-------- .github/workflows/website-deployment.yml | 37 ------------------- DEVELOPMENT.md | 45 ++++++++++++++++++++++++ mkdocs.yml | 1 + package.json | 1 + 6 files changed, 74 insertions(+), 52 deletions(-) create mode 100755 .github/scripts/prepare-mkdocs.sh delete mode 100644 .github/workflows/website-deployment.yml create mode 100644 DEVELOPMENT.md diff --git a/.github/scripts/prepare-mkdocs.sh b/.github/scripts/prepare-mkdocs.sh new file mode 100755 index 00000000..244ce576 --- /dev/null +++ b/.github/scripts/prepare-mkdocs.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# The website is built using MkDocs with the Material theme. +# https://squidfunk.github.io/mkdocs-material/ +# It requires Python to run. +# Install the packages with the following command: +# pip install --no-deps -r requirements.txt + + +cp packages/async-storage/CHANGELOG.md docs/changelog.md diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 1def9138..1314ba48 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -6,7 +6,7 @@ on: paths: - 'docs/**' - 'mkdocs.yml' - - 'CHANGELOG.md' + - 'packages/async-storage/CHANGELOG.md' workflow_dispatch: jobs: deploy-docs: @@ -18,25 +18,27 @@ jobs: - uses: actions/setup-python@v6 with: python-version: 3.11 - - name: Install MkDocs - run: pip install --no-deps -r .github/requirements.txt - - name: Copy changelog + - name: Read docs version + id: version run: | - cp packages/async-storage/CHANGELOG.md docs/changelog.md + VERSION_DOCS=$(node -p "require('./package.json').versionDocs || ''") + echo "versionDocs=$VERSION_DOCS" >> $GITHUB_OUTPUT + - name: Prepare MkDocs + run: | + pip install --no-deps -r .github/requirements.txt + .github/scripts/prepare-mkdocs.sh + # required for mike - name: Setup git user run: ./setup-ci-git-user.sh - working-directory: ./.github/scripts + working-directory: .github/scripts env: GITHUB_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }} GITHUB_NAME: ${{ vars.GH_BOT_NAME }} GITHUB_EMAIL: ${{ vars.GH_BOT_EMAIL }} GIT_SET_GLOBAL_USER: true - - name: Build docs - run: mkdocs build - - name: Deploy docs - uses: JamesIves/github-pages-deploy-action@v4 - with: - folder: site - token: ${{ secrets.GH_BOT_TOKEN }} - git-config-name: ${{ vars.GH_BOT_NAME }} - git-config-email: ${{ vars.GH_BOT_EMAIL }} + # required for mike + - name: Setup gh-pages remote + run: | + git remote add docs https://github.com/react-native-async-storage/react-native-async-storage.github.io.git + - name: Deploy Docs with mike + run: mike deploy -u -r docs --push ${{ steps.version.outputs.versionDocs }} latest diff --git a/.github/workflows/website-deployment.yml b/.github/workflows/website-deployment.yml deleted file mode 100644 index 8bc714a9..00000000 --- a/.github/workflows/website-deployment.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Website -on: - push: - branches: - - main - paths: - - "packages/website/**" - - ".github/workflows/website-deployment.yml" - -jobs: - deploy: - name: Deploy website - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - persist-credentials: "false" - - name: Setup project - uses: ./.github/actions/setup-project - - name: Install dependencies - run: yarn - working-directory: ./packages/website - - name: Setup git user - run: ./setup-ci-git-user.sh - working-directory: ./.github/scripts - env: - GITHUB_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }} - GITHUB_NAME: ${{ vars.GH_BOT_NAME }} - GITHUB_EMAIL: ${{ vars.GH_BOT_EMAIL }} - GIT_SET_GLOBAL_USER: true - - name: Deploy - env: - GIT_USER: ${{ vars.GH_BOT_NAME }} - run: yarn run deploy - working-directory: ./packages/website diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 00000000..360715e9 --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,45 @@ +# Development Guide + + + +## Documentation + +Documentation should follow major.minor version of Async Storage. Update the documentation version in root's package.json: + +```json +{ + "versionDocs": "3.0" +} +``` + +### Deployment + +Add new remote where docs are hosted: + +```shell +# use https if not using ssh +git remote add docs git@github.com:react-native-async-storage/react-native-async-storage.github.io.git +``` + +Fetch gh-pages branch: + +```shell +git fetch docs gh-pages +``` + +Use python 3 to install dependencies: + +```shell +pip install --no-deps -r .github/requirements.txt +``` + +Run `mike deploy` to deploy docs and mark them as latest: + +```shell +mike deploy -u -r docs --push DOCS_VERSION_FROM_PCK_JSON latest +``` + + + + + diff --git a/mkdocs.yml b/mkdocs.yml index b30c75bf..555d243a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -4,6 +4,7 @@ site_url: https://react-native-async-storage.github.io/ nav: - Overview: index.md + - Changelog: changelog.md theme: diff --git a/package.json b/package.json index d2230d3b..d881997f 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "private": true, "name": "@react-native-async-storage/root", "version": "0.0.1-dev", + "versionDocs": "3.0", "scripts": { "build": "turbo run build", "build:android": "./scripts/build-native-lib.sh android", From 9488aa4fbe9936b9bd2273dcb415838d8863cf4b Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Fri, 26 Sep 2025 18:04:07 +0200 Subject: [PATCH 085/110] docs: update readme --- README.md | 94 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 65 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index d0e92ae4..1627ed2d 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,80 @@ # React Native Async Storage -An asynchronous, unencrypted, persistent, key-value storage system for React -Native. +Async Storage is asynchronous, unencrypted, persistent, key-value storage for your React Native application. +It provides a simple API compatible with the [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API), with a few extensions for batch operations and multi-database support. + +--- ## Supported platforms -- Android -- iOS -- [macOS](https://github.com/react-native-async-storage/async-storage/releases/tag/v1.8.1) -- [visionOS](https://github.com/react-native-async-storage/async-storage/releases/tag/v1.22.0) -- [Web](https://github.com/react-native-async-storage/async-storage/releases/tag/v1.9.0) -- [Windows](https://github.com/react-native-async-storage/async-storage/releases/tag/v1.10.0) +- **Android** (SQLite backend via Room KMP) +- **iOS** (SQLite backend via Room KMP) +- **Web** (IndexedDB backend) +- **macOS** (SQLite backend via Room KMP) +- **Windows** (legacy fallback, single database only) + +--- + +## Installation + +```shell +# using npm +npm install @react-native-async-storage/async-storage + +# using yarn +yarn add @react-native-async-storage/async-storage +``` + +On iOS/macOS, don’t forget to install pods: + +```shell +# inside macos/ios directory +pod install +``` + +## Usage + +### Basic + +```typescript +import { createAsyncStorage } from "@react-native-async-storage/async-storage"; + +// Create a storage instance +const storage = createAsyncStorage("appDB"); + +async function demo() { + // save value under "userToken" key + await storage.setItem("userToken", "abc123"); -## Getting Started + // read value stored at "userToken" key + const token = await storage.getItem("userToken"); + console.log("Stored token:", token); -Head over to the -[documentation](https://react-native-async-storage.github.io/async-storage/docs/install) -to learn more. + // remove value from storage + await storage.removeItem("userToken"); +} +``` -## Running E2E locally +### Multi-item operations -### Android +Async Storage supports batch operations for efficiency: -1. Create and start Android Emulator with Play services, API level 29 -2. Build app and run tests - ```shell - yarn bundle:android - yarn build:e2e:android - yarn test:e2e:android - ``` +```typescript +async function demo() { + // save multiple values at once + await storage.setMany({ + theme: "dark", + language: "en", + }); -### iOS + // Retrieve multiple values + const values = await storage.getMany(["theme", "language", "different"]); + console.log(values); // { theme: "dark", language: "en", different: null } -1. Create and start iPhone 14 simulator with iOS version 16.4 -2. Build app and run tests - ```shell - yarn bundle:ios - yarn build:e2e:ios - yarn test:e2e:ios - ``` + // Remove multiple values + await storage.removeMany(["theme", "language"]); +} +``` ## Contribution From b5a7ea650afa812f3b4cf695de2ae2550a5ecd8b Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Fri, 26 Sep 2025 19:57:08 +0200 Subject: [PATCH 086/110] docs: override outdated --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index 555d243a..f8442f2f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -18,6 +18,7 @@ theme: repo: fontawesome/brands/github features: - content.code.copy + custom_dir: docs/overrides extra_css: - stylesheets/extra.css From 239cf7e90597ef301b1d09ab826a8a9b5b562864 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 29 Sep 2025 22:39:05 +0200 Subject: [PATCH 087/110] docs: migration, usage --- docs/api/errors.md | 4 ++ docs/api/usage.md | 116 +++++++++++++++++++++++++++++++++++++++++ docs/index.md | 31 +++-------- docs/migration-to-3.md | 74 ++++++++++++++++++++++++++ mkdocs.yml | 4 ++ 5 files changed, 205 insertions(+), 24 deletions(-) create mode 100644 docs/api/errors.md create mode 100644 docs/api/usage.md create mode 100644 docs/migration-to-3.md diff --git a/docs/api/errors.md b/docs/api/errors.md new file mode 100644 index 00000000..f70770f0 --- /dev/null +++ b/docs/api/errors.md @@ -0,0 +1,4 @@ +# Error handling + + +todo diff --git a/docs/api/usage.md b/docs/api/usage.md new file mode 100644 index 00000000..827be129 --- /dev/null +++ b/docs/api/usage.md @@ -0,0 +1,116 @@ +--- +title: Usage +--- + +# Using Async Storage + +The [`AsyncStorage`](https://github.com/react-native-async-storage/async-storage/blob/main/packages/async-storage/src/AsyncStorage.ts) interface provides an asynchronous, promise-based API for persistent key-value storage. +Each method is modeled after the Web Storage API, with extensions for batch operations. + +Similar to Web, AsyncStorage deals with data that should be already serialized (strings). If you need to store objects, arrays, or other non-string values, you must serialize them first (for example, using `JSON.stringify`) and deserialize them when retrieving (for example, using `JSON.parse`). + +## Creating a storage + +To create a new storage, call `createAsyncStorage` with your database name: + +```typescript +import { createAsyncStorage } from "@react-native-async-storage/async-storage"; + +// any name is fine, you can even add an extension! +const userStorage = createAsyncStorage("john.db"); +``` + +This returns an instance of `AsyncStorage` and each instance is uniquely identified by the name you provide. +The data in one storage instance is scoped to its name: using different names ensures that data does not leak between storages. + +!!! note "Web platform" + + On Web, AsyncStorage is backed by [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API), which also support scoped storages. + +!!! warning "Windows platform" + + As of AsyncStorage v3.0, Windows platform does not support scoped storages. It fallsback to previous implementation - single storage per application. + +## Using a storage + +Once you have created a storage instance, you can start managing data. + +### Single item operations + +You can store, retrieve, and remove individual keys using `setItem`, `getItem`, and `removeItem`. + +Note that: + +- Calling `setItem` with an existing key will overwrite the current value +- Calling `removeItem` on a key that does not exist has no effect and does not throw an error + +```typescript +await userStorage.setItem("username", "doe_john"); +// previously stored value is overriden +await userStorage.setItem("username", "john_doe"); + +// read current value +let username = await userStorage.getItem("username"); +console.log(username); // "john_doe" + +await userStorage.removeItem("username"); +// does nothing, item is already removed +await userStorage.removeItem("username"); + +username = await userStorage.getItem("username"); +console.log(username); // null +``` + +### Batch operations + +Use convenient batch methods to handle multiple keys at once. Behind the scene, transaction performed to store all of them, or none in case of an error. + +```typescript +// store values +await userStorage.setMany({ + email: "john@example.com", + age: "30", +}); + +// read multiple items +const data = await userStorage.getMany(["email", "age", "username"]); +console.log(data); +// { +// email: "john@example.com", +// age: "30", +// username: null, // key doesn't exist +// } + +// remove multiple items +// non-existing keys are ignored +await userStorage.removeMany(["email", "age", "not-here"]); +``` + +### Reading stored keys + +To retrieve all keys currently stored in a storage instance, use `getAllKeys`: + +```typescript +await userStorage.setMany({ + email: "john@example.com", + age: "30", +}); + +const keys = await userStorage.getAllKeys(); +console.log(keys); // ["email", "age"] +``` + +### Clearing storage + +To remove all data from a storage instance, use `clear`: + +```typescript +await userStorage.setMany({ + email: "john@example.com", + age: "30", +}); + +await userStorage.clear(); +const keys = await userStorage.getAllKeys(); +console.log(keys); // [] +``` diff --git a/docs/index.md b/docs/index.md index 45723632..9f8da1ff 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,3 +1,7 @@ +--- +title: Overview +--- + # Async Storage Async Storage is asynchronous, unencrypted, persistent, key-value storage for your React Native application. @@ -34,12 +38,10 @@ pod install ## Usage -### Basic - ```typescript import { createAsyncStorage } from "@react-native-async-storage/async-storage"; -// Create a storage instance +// create a storage instance const storage = createAsyncStorage("appDB"); async function demo() { @@ -48,30 +50,11 @@ async function demo() { // read value stored at "userToken" key const token = await storage.getItem("userToken"); - console.log("Stored token:", token); + console.log("Stored token:", token); // abc123 // remove value from storage await storage.removeItem("userToken"); } ``` -### Multi-item operations - -Async Storage supports batch operations for efficiency: - -```typescript -async function demo() { - // save multiple values at once - await storage.setMany({ - theme: "dark", - language: "en", - }); - - // Retrieve multiple values - const values = await storage.getMany(["theme", "language", "different"]); - console.log(values); // { theme: "dark", language: "en", different: null } - - // Remove multiple values - await storage.removeMany(["theme", "language"]); -} -``` +Head over to [Usage page](api/usage.md) to learn more. diff --git a/docs/migration-to-3.md b/docs/migration-to-3.md new file mode 100644 index 00000000..14fbac34 --- /dev/null +++ b/docs/migration-to-3.md @@ -0,0 +1,74 @@ +# Migration to v3 + +AsyncStorage v3 introduces some breaking changes to simplify the API and make it more consistent. + +## AsyncStorage instance needs to be created now + +AsyncStorage v3 introduced scoped storages, which needs to be created before use. Head to [Usage page](api/usage.md#creating-a-storage) to learn more. + +## Default export points to v2 storage + +To make transition easier, the default export still points to the v2 storage implementation, ensuring that no existing data is lost. + +## Removed callback arguments + +All methods now return Promises, and callbacks have been removed from all methods. + +## Removed merge functionality + +AsyncStorage's "merge" behavior has historically been inconsistent across platforms. Rather than enforcing a platform-specific merging strategy, the merge API has been removed to avoid ambiguity. + +## Method signature changes + +The core methods + +- `getItem` +- `setItem` +- `removeItem` +- `getAllKeys` +- `clear` + +retain their signatures from v2, ensuring backward compatibility. + +### multiGet + +Renamed to `getMany` and returns a `Record`, following a "what you request is what you get" rule: every key you pass in the request appears in the returned object, with `null` for keys that don’t exist in storage. + +```diff +- multiGet: ( +- keys: readonly string[], +- callback?: MultiGetCallback +- ) => Promise; + ++ getMany(keys: string[]): Promise>; +``` + +### multiSet + +Renamed to `setMany`, accepts a `Record` of key-value entries. + +```diff +- multiSet: ( +- keyValuePairs: ReadonlyArray, +- callback?: MultiCallback +- ) => Promise; + ++ setMany(entries: Record): Promise; +``` + +### multiRemove + +Renamed to `removeMany`, accepts list of keys. + +```diff +- multiRemove: ( +- keys: readonly string[], +- callback?: MultiCallback +- ) => Promise; + ++ removeMany(keys: string[]): Promise; +``` + +## Errors are more predictable now + +All errors now thrown from `AsyncStorage` are instances of `AsyncStorageError` containing `type` of the error it represents. Head over to [Errors page](api/errors.md) to learn more. diff --git a/mkdocs.yml b/mkdocs.yml index f8442f2f..491fb8c0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -4,6 +4,10 @@ site_url: https://react-native-async-storage.github.io/ nav: - Overview: index.md + - API: + - Usage: api/usage.md + - 'Error handling': api/errors.md + - 'Migration to v3': migration-to-3.md - Changelog: changelog.md From 4ad3a341b3b2949a648bc9ec664c970cfeb73160 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Fri, 3 Oct 2025 09:34:14 +0200 Subject: [PATCH 088/110] docs: db naming section --- docs/api/db-naming.md | 81 ++++++++++++++++++ docs/api/usage.md | 7 +- docs/assets/db-naming-web-1.png | Bin 0 -> 5650 bytes mkdocs.yml | 1 + package.json | 2 +- .../shared_storage/database/DatabaseFiles.kt | 2 +- 6 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 docs/api/db-naming.md create mode 100644 docs/assets/db-naming-web-1.png diff --git a/docs/api/db-naming.md b/docs/api/db-naming.md new file mode 100644 index 00000000..d5c3ef07 --- /dev/null +++ b/docs/api/db-naming.md @@ -0,0 +1,81 @@ +## How `databaseName` is used + +When creating a new storage instance with `createAsyncStorage(databaseName)`, the provided `databaseName` determines where and how the underlying database file is stored on each platform. +This ensures that storages are scoped by name and do not leak data between one another. + +### iOS & macOS + +On Apple platforms, the storage is located under the app’s `Application Support` directory. +The `databaseName` is normalized into a file path with the `.sqlite` extension. +Each `databaseName` creates its own subdirectory inside `async-storage/databases`. + +Directory: + +```text +/async-storage/databases// +``` + +File: + +```text +/async-storage/databases//.sqlite +``` + +Example: + +```typescript +const userId = "1234"; +createAsyncStorage(`user-${userId}`); + +// creates: +// /async-storage/databases/user-1234/user-1234.sqlite +``` + +### Android + +On Android, databases are stored inside the app’s internal files directory. +The `databaseName` is normalized into a file path with the `.sqlite` extension. +Each `databaseName` creates its own subdirectory inside `async-storage/databases`. + +Directory: + +```text +/async-storage/databases// +``` + +File: + +```text +/async-storage/databases//.sqlite +``` + +Example: + +```typescript +const userId = "1234"; +createAsyncStorage(`user-${userId}`); + +// creates: +// /async-storage/databases/user-1234/user-1234.sqlite +``` + +### Web + +On Web, `databaseName` corresponds directly to the name of the IndexedDB database. +The `async-storage` grouping is abstracted away, but the uniqueness of the name is still guaranteed. + +Example: + +```typescript +const userId = "1234"; +createAsyncStorage(`user-${userId}`); +``` + +Creates database named `user-1234`: + +![web-db-naming-1.png](/assets/db-naming-web-1.png) + +### Windows + +On Windows, scoped storages are not supported. +The API always falls back to the legacy v2 storage implementation, which ignores `databaseName`. diff --git a/docs/api/usage.md b/docs/api/usage.md index 827be129..cc87119b 100644 --- a/docs/api/usage.md +++ b/docs/api/usage.md @@ -13,11 +13,14 @@ Similar to Web, AsyncStorage deals with data that should be already serialized ( To create a new storage, call `createAsyncStorage` with your database name: +!!! note "About naming" + + It's best to avoid adding an extensions to the name. Read more at [Database naming](db-naming.md) section. + ```typescript import { createAsyncStorage } from "@react-native-async-storage/async-storage"; -// any name is fine, you can even add an extension! -const userStorage = createAsyncStorage("john.db"); +const userStorage = createAsyncStorage("john"); ``` This returns an instance of `AsyncStorage` and each instance is uniquely identified by the name you provide. diff --git a/docs/assets/db-naming-web-1.png b/docs/assets/db-naming-web-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0e0eccc5a1771ea9ceea63799b5ccd3db3a710ca GIT binary patch literal 5650 zcmZWt2Ut@}(}oZ*6ftz9cPWO@q!UU)3DTQ@NReIxgx;h#K~S1t=psRy2+EZvMF_nr zO#~@Yg&;@=`QrWVfA4+%?>x_*nX@zR%EIhI zDkk$!1PlbbSo9``4KQLcAr4u>26VheO(NC_H8sB0W&6S#^(1mt8qT zfMiX7>|3K{@DA#|z14;elHn43wKC5ua_9z|2y0$9 lBb`WmKBjX67ckAT&m_?#y z95hbJO%F-A06H`F41SwBwa>aab#?M!N5{@*-gk_PJR3wy%YV5M$I>dOE+su?!F!vU z1Zszr+H;6?7A&G|hq5`CNO@fx9W7W|)KSpY+SWF_{>XvxgkRnh*=JY5Gh(b=lWWey zCd|;8X1HkG0L`Ma4k?@X_IH#A$*yg8bn7Do&+v;SyX4;^@26Bq?i&+gZ02Z=bkfx& z5+?8Ir6KxqjLQ3Uu~+EYaGH?Q?ukq}-al0c2^eH|UW z&@L!Hjq_B0f~ilgCgy(Tx;paqC{Iy42h@E>(I8Ln-w-0jAbA4o>F8(273AsRg_aLe z;`viUp1}X^hVpRzsp99Z#AB{&zy(M7I&w*iiiwKxz$m!5xDh(gZ^!s09E|mD{tT$ z?CTJa}ylnFGv#0 zU7ZwLUIeka;nxZTJ%T?^@PoD3bUHJ_Ba$K+#(*pln4C5!Rq>d9;vCeIjm6^CyInqx zFnZY58Y1XO4~KHY>#YKqrpxMw!xp}TIuGaiUMe_`$f4JUGY#vAuJZwCqi%vShiEfs zk|Gh2yj-O40ANxi2k^P=IxR=ab&QP>Q&S(F7r7Ixswb)BE(N7=1Jyv$>&JW`dcA`4{6f+%IOjxq@T0_Y zAz@&$y1fCeT<^X2q9UlccPDztxATu+iT;F)~Ig$=uzmkjpSTTXM z*!TQcVSHo6u{R|yL8b1P`Qw-nXefPRn;gQ^psCjqZPr*rI$Wp>Eg>rm+@4J>yPd;2 zSjgEEyuWI{(00+1*xSocB>k{dzc9kQC5U`{d|b+OdV1Pz{lihmm3*JCDlPG%PzuJV z`(w;YjG42Mxx`UtC?<*V`P>7urywF8&m5sBN4Pew28HRL$Ud( zGGV?o^v7v|QfPJ=+jSvk;NH(Wyz;Nw1OyeDVNDW4qtsBTM2XtsslL7`8rJ3{|21g}}~CA!8c$R<6-SWh2gI!@?7IVG*2LgQnsR ziPvfaR|hvz+EQ~>>vnh7pKNGstHNK5jf{1u2F|U~G%V&NCN-gVilcsJ109CRR1Yuq{5zJrcMtk2xPdek>by zth_$CZU24l9bM?rPIPrOL}pn~iI+D<#%^oU69n2#XbnemaEi4*{DEJM7PnIqn{C7= z5|gypIXmMN6i-MpZ-{y+ut(E!y;ph-Ye=<9V-xh(oUVOp^!$9(GKY!4Vpdih zhJCj!X(P_Ifm2)~h03_^_RyJy-pM3ktqSo%^Y>KN}PnC+cJpyi>!LCp{Ft@{kNnM*Va3+bz_5 z${9C2o@&*HMYXi4s)|KoXdZx?Xa?U znIN^X9(m*TX~_aV_l|^{tprWi(bt!hs~j_0su`Fstfi1XGFH?PI!JEa9rjdROwu?f z@aOu2Tuwuo+XY<-*J6JC$XeX|7%u<{?`y*d`JY-ubTTskmI zZcn8>$+i-&iiP+QnN^vSkF&7K)M!4Ft~owgD}0yq>8&TLbg~qaq?1lpsb<S6qod`Bt8Xs5A2R6- zeChns9H>ei7dih?<;EoYn=znUOusZAt@!mz`fnNI<|wT2$~ z!VJyu^WmoMQ#H#Cjsw~5d*D{hwE35)Hj654ef>4R)4I1_m^fT_S-x9$vMEbbi=a6$ z*;6}lJZ$_>JT@K-BOB{`UV^p*p61jTmA$sUkxdSIFs8xMGpaHyenMB+IvdA1q=TMH0i^8XuhPCYRQq}`74@17 z8zXUzqc;nr+jOV**@SB3(9s80)HAKE&vwZDk`e0eE|ky$Ab4VJzN>`e+f zrS}lU>|A70aKb^cU?44kf{@dOF^09mJnPoh@aK`<4l8Ngp!Iz@?YN$zNBa3Np8FhI zyK?R^sjQ{BW=X4IG&FMiEC5TNABqot$(;EeK;J$|EO;+DiN&QE&rF4)*7Fxktvp4m z51x#ub{4Z$3p2pT{QW4@Bv*bCNxbRp!%S-fxBD`jK^)CMvx6&NS5wbgbRS$^&_?}@#n$?~+#tVoNGTzt(ngS{#w^5^& zy~YN%tv{`gH7XWIJj^1bJBc{1N+JH^+k0{wv+QBxfdb#zt6xi@2VPwK5w;UpxjMV(xELH%ZiFN{*6o{$G&@UAzNjbnWft*&2t zjx1Ifjm7y^<>1-X>5KKzfSZ>&1kFc>fPbSi?9E+%{V z%rimE+xy13q{pqDxrjtUtd>6fc*ral#u0!&V{uwVEr#qVMGT&gGnq{uAWSWWFI`+o z>k>x)t8lz=&lUs*XW5q>f!`O))w8x@0$cl zxd`5o{TO+_J?`y&2yF+L-R7=r3Jt}g^NIl5bEOoT6pYwyq@jC4xz6p6jo3KICB@qJ zjluX!yDe3Z3-Rdi9m{8&TWy~o+G~z<)!$_urehl~47{Iwp6yNJn%szdbot6@g3dP~ zqOS!14ln*)@|yLF@$&q%z}q`0q>Oa6&b7Y zb^jcRVfHu<{41^~>9Gh6G!YH2ln3Q6rIJUv(Y*{*meI+RNDt4sNMTwyTNbi-`L3WU zph)P)cB7}*<{CNYg6Q$Z3cpVNIfQX&pnR+Ug3a)p`d9hxqIV`Rz%}AM(64eTado|{W*kq?#w@|OW)vdGLaf;PtO;P47 z^S-p#G2m?QubWsI86Z8mb`h$#mbZEDHrh#4$pJ6i9-g!3p(ISpym!k|?pDu+an29c zeN>q8R)03WBC7D3)2YwKpyuWr?CF^%^`Kt{w==K-Hlq2MQe${%LZ9E0OG?G7lUt+G zcbV>%DR!3yA3KpNsjF#ION~KPp2@u`Hraz%VLnQSJ~T@e3*J=GyYaaoUT-5D5XapG zQ*&RNV=`PGlsm7oIG`&ZPBySYj}-8rck5y5`nsl&llJIwpA=6~b59PpDs2=n zMy>S}|0?%61LC!!a}1HL=AC#WNq&SYtYSzYbSNBjwV3TKe@5~#)m15-vpvVAc|C+w zh^tw}6R#_!G9SOqyn4w!+)(VngLEYn7v z^Qd&Tn^}Akp*ML;pK{J~b3aEO`16E*R)(7t&PsD#Mh@8PAQ2)ClUGY@7!VsW#=b))PR zp$kH13mm0DIg^WxG#|M0KGaK7mQif%qR6 zJ@@Y2OKujb4Z9e}33iIM9}e0-yX{nSTzv1~*Tvb4Q%3GWq5Fhm%Q{%Bk3DPl%~mgs ziI;^2dFRon9#g~du}x50=V`^=DS$%Y&e!HYobG69XplV<7rCr`-Bpeq*F7X(-#VX( z5(Ww=GzFY;KH$5*`?dI0U0wHRao4oK(Ucser~CJWEEy?b*S8=akJzTzx%d+wszEHd%0*zVd~R@t2)1p`&lMa4l7%qkSHhig%ae zNXO+(pyVuBX9LhPso)iLVr~^wn=Ztm(Nw~-R3{;z$TLeQjXUZsGzkBo2x_5 zUKU2oR&0)UXG{zizHc8$PW|#>phTXB2e#IL%;+?M!P;K3%6MTv1oSstyrv>ei0pGq z0h}(33a!q)Lx=5$%ufGmJ(`DW^&&8^@OYH9{@@$;XS`gtd<(&oIA_7b?=xKkuNoRw zoC!6{p{v_!;8Jlh-Qw!xqi>Z%8%qh>l+=Moj|i1bzf}CKo=5C4)6+wk^H|8l(BZW; zN_Hxil~m($z1{5$b?e|^Wq^R3u==Y}t&GD^Dm#g!v5J=Vz>__Of@+`Ts=_(}e*XQR zAqNsuk0m4}?Qaj2ubAr&<)OC92xoIjoh@%k?LHNNctjXjW(tGB*m-&mEf*AUXiEp@ z>jQPn#3%-ESmSc(DGG9OP5&Zirzd)O0RZE}S!BpEyFx%Dp(5lxD~hx#P6;ExuGEl|}yB zs5WoEn41X^Yj|F_M%@!I2MmrJf9Lh(G<@)>cxqZi*^3v^VHst&nb5F3k@E}9IteGY z%?E4wI`7rX#d2+>00Ji*F=3!Zedc6PuJtVH1A5@ulP8@DFU0Zey_qF}4Bvi+yHu5{ zEtQA79K-clMqzeenpXBJNi=v1C1Q~jWW?~{#^R_!QHq{p{`hRjiS`YEfCzKhzE7`N z4n6QW&djJF)mh2?Y@`1Jk1}OB literal 0 HcmV?d00001 diff --git a/mkdocs.yml b/mkdocs.yml index 491fb8c0..6829ab3e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -6,6 +6,7 @@ nav: - Overview: index.md - API: - Usage: api/usage.md + - 'Database naming': api/db-naming.md - 'Error handling': api/errors.md - 'Migration to v3': migration-to-3.md - Changelog: changelog.md diff --git a/package.json b/package.json index d881997f..3c649e72 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "test:format": "prettier --check --loglevel warn $(git ls-files '*.js' '*.json' '*.ts' '*.tsx' '*.yml' 'README.md')", "release:version": "./.github/scripts/setup-ci-git-user.sh && changeset version", "release:publish": "./.github/scripts/setup-ci-git-user.sh && changeset publish", - "docs:serve": "mkdocs serve", + "docs:dev": "mkdocs serve", "docs:build": "mkdocs build" }, "devDependencies": { diff --git a/shared-storage/src/commonMain/kotlin/org/asyncstorage/shared_storage/database/DatabaseFiles.kt b/shared-storage/src/commonMain/kotlin/org/asyncstorage/shared_storage/database/DatabaseFiles.kt index 8d19bb17..913f2a96 100644 --- a/shared-storage/src/commonMain/kotlin/org/asyncstorage/shared_storage/database/DatabaseFiles.kt +++ b/shared-storage/src/commonMain/kotlin/org/asyncstorage/shared_storage/database/DatabaseFiles.kt @@ -9,7 +9,7 @@ internal constructor(val databaseName: String, private val platformDbDirectory: val databaseFileName = databaseName.removeSuffix(".") + ".$EXT_NAME" val directoryAbsolutePath: String - get() = platformDbDirectory.removeSuffix("/") + "/$GROUP_DIR_NAME" + "/$databaseName" + get() = platformDbDirectory.removeSuffix("/") + "/$GROUP_DIR_NAME" + "/databases/$databaseName" val fileAbsolutePath: String get() = directoryAbsolutePath.removeSuffix("/") + "/$databaseFileName" From 75421e339d3916d8bb63ce5359ec99403d37e257 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Fri, 3 Oct 2025 17:01:48 +0200 Subject: [PATCH 089/110] docs: error handling --- docs/api/errors.md | 68 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/docs/api/errors.md b/docs/api/errors.md index f70770f0..3990f49d 100644 --- a/docs/api/errors.md +++ b/docs/api/errors.md @@ -1,4 +1,70 @@ # Error handling +All `AsyncStorage` methods throw a specialized error type, `AsyncStorageError`. +This class extends the standard `Error` class, by adding a `type` property to help identify the issue. -todo +## Error types + +The error type is an enum `AsyncStorageError.Type` with the following possible values: + + +### NativeModuleError + +Raised when the RN native module itself fails — for example, +the module is null at app startup, or not initialized correctly. + + +### WebStorageError + +Web only, when an IndexedDB operation fails. +[See IndexedDB error codes](https://developer.mozilla.org/en-US/docs/Web/API/IDBRequest/error. + + +### SqliteStorageError + +Raised when SQLite itself fails on iOS, macOS, or Android. +[See SQLite error codes](https://www.sqlite.org/rescode.html). + + +### OtherStorageError + +Raised for other storage-related failures that don’t fit into the categories above. +Examples include: + +- Storage not initialized correctly + +- Corrupt or misformatted data returned from native code + +- Legacy storage exceptions (any error thrown by v2 implementation falls here) + +### UnknownError +A catch-all for cases where the system cannot classify the error. + + +## Example of error handling + + +```typescript +import { createAsyncStorage, AsyncStorageError } from "@react-native-async-storage/async-storage"; + +const storage = createAsyncStorage("user"); + +try { + await storage.setItem("email", "john@example.com"); +} catch (e) { + if (e instanceof AsyncStorageError) { + switch (e.type) { + case AsyncStorageError.Type.SqliteStorageError: + console.error("SQLite failure:", e.message); + break; + case AsyncStorageError.Type.WebStorageError: + console.error("IndexedDB failure:", e.message); + break; + default: + console.error("AsyncStorage error:", e.message); + } + } else { + console.error("Unexpected error:", e); + } +} +``` From 3c7c03b4c8ccaee867d23b35b1fe3342cc84bf99 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Fri, 3 Oct 2025 17:18:18 +0200 Subject: [PATCH 090/110] feat: brownfield integration --- .../{PersistentStorage.kt => RNStorage.kt} | 12 ++--- .../asyncstorage/storage/StorageRegistry.kt | 29 ++++++++++-- .../org/asyncstorage/AsyncStorageModule.kt | 10 ++-- .../asyncstorage/AsyncStorageModule.kt | 10 ++-- packages/async-storage/apple/AsyncStorage.mm | 10 ++-- ...ersistentStorage.swift => RNStorage.swift} | 8 ++-- .../apple/storage/StorageRegistry.swift | 47 +++++++++++++++---- 7 files changed, 86 insertions(+), 40 deletions(-) rename packages/async-storage/android/src/main/kotlin/org/asyncstorage/storage/{PersistentStorage.kt => RNStorage.kt} (91%) rename packages/async-storage/apple/storage/{PersistentStorage.swift => RNStorage.swift} (95%) diff --git a/packages/async-storage/android/src/main/kotlin/org/asyncstorage/storage/PersistentStorage.kt b/packages/async-storage/android/src/main/kotlin/org/asyncstorage/storage/RNStorage.kt similarity index 91% rename from packages/async-storage/android/src/main/kotlin/org/asyncstorage/storage/PersistentStorage.kt rename to packages/async-storage/android/src/main/kotlin/org/asyncstorage/storage/RNStorage.kt index 8e585bd2..9fea71eb 100644 --- a/packages/async-storage/android/src/main/kotlin/org/asyncstorage/storage/PersistentStorage.kt +++ b/packages/async-storage/android/src/main/kotlin/org/asyncstorage/storage/RNStorage.kt @@ -1,6 +1,5 @@ package org.asyncstorage.storage -import android.content.Context import com.facebook.react.bridge.Arguments import com.facebook.react.bridge.Promise import com.facebook.react.bridge.ReadableArray @@ -20,17 +19,12 @@ private val createStorageScope = { name: String -> CoroutineScope(SupervisorJob() + CoroutineName(name)) } -/** - * todo: - * - handle exceptions via coroutine exception handler or via try catch - */ -class PersistentStorage( - ctx: Context, +class RNStorage( + private val db: SharedStorage, dbName: String, coroutineContext: CoroutineContext = EmptyCoroutineContext, ) { private val scope = createStorageScope(dbName) + coroutineContext - private val db = SharedStorage(ctx, dbName) fun get(rnKeys: ReadableArray, promise: Promise) = scope.lunchWithRejection(promise) { @@ -65,7 +59,7 @@ class PersistentStorage( } } -private fun CoroutineScope.lunchWithRejection(promise: Promise, block: suspend () -> T): Unit { +private fun CoroutineScope.lunchWithRejection(promise: Promise, block: suspend () -> T) { launch { try { block() diff --git a/packages/async-storage/android/src/main/kotlin/org/asyncstorage/storage/StorageRegistry.kt b/packages/async-storage/android/src/main/kotlin/org/asyncstorage/storage/StorageRegistry.kt index 6b6e440a..6de6ab06 100644 --- a/packages/async-storage/android/src/main/kotlin/org/asyncstorage/storage/StorageRegistry.kt +++ b/packages/async-storage/android/src/main/kotlin/org/asyncstorage/storage/StorageRegistry.kt @@ -1,11 +1,34 @@ package org.asyncstorage.storage import android.content.Context +import org.asyncstorage.shared_storage.SharedStorage +/** + * StorageRegistry is a singleton responsible for managing and providing access to SharedStorage and + * RNStorage instances in a thread-safe manner. + */ object StorageRegistry { + /** + * Cache for Shared Storages instances. These instances are shared by native and RN + * implementation. + */ + private val storages = mutableMapOf() - private val storages = mutableMapOf() + /** + * Cache for PersistentStorage used by RN module. It uses shared storage singleton instances. + */ + private val rnStorages = mutableMapOf() - fun getOrCreate(ctx: Context, name: String): PersistentStorage = - storages.getOrPut(name) { PersistentStorage(ctx, name) } + fun getRNStorage(ctx: Context, name: String): RNStorage = + synchronized(this) { + rnStorages.getOrPut(name) { + val storage = storages.getOrPut(name) { SharedStorage(ctx, name) } + RNStorage(storage, name) + } + } + + fun getStorage(ctx: Context, name: String): SharedStorage = + synchronized(this) { + return storages.getOrPut(name) { SharedStorage(ctx, name) } + } } diff --git a/packages/async-storage/android/src/newarch/org/asyncstorage/AsyncStorageModule.kt b/packages/async-storage/android/src/newarch/org/asyncstorage/AsyncStorageModule.kt index 786bd987..fd056754 100644 --- a/packages/async-storage/android/src/newarch/org/asyncstorage/AsyncStorageModule.kt +++ b/packages/async-storage/android/src/newarch/org/asyncstorage/AsyncStorageModule.kt @@ -16,23 +16,23 @@ class AsyncStorageModule(private val reactContext: ReactApplicationContext) : override fun getName() = NAME override fun getValues(db: String, keys: ReadableArray, promise: Promise) { - StorageRegistry.getOrCreate(reactContext, db).run { get(keys, promise) } + StorageRegistry.getRNStorage(reactContext, db).run { get(keys, promise) } } override fun setValues(db: String, values: ReadableArray, promise: Promise) { - StorageRegistry.getOrCreate(reactContext, db).run { set(values, promise) } + StorageRegistry.getRNStorage(reactContext, db).run { set(values, promise) } } override fun removeValues(db: String, keys: ReadableArray, promise: Promise) { - StorageRegistry.getOrCreate(reactContext, db).run { remove(keys, promise) } + StorageRegistry.getRNStorage(reactContext, db).run { remove(keys, promise) } } override fun getKeys(db: String, promise: Promise) { - StorageRegistry.getOrCreate(reactContext, db).run { allKeys(promise) } + StorageRegistry.getRNStorage(reactContext, db).run { allKeys(promise) } } override fun clearStorage(db: String, promise: Promise) { - StorageRegistry.getOrCreate(reactContext, db).run { clear(promise) } + StorageRegistry.getRNStorage(reactContext, db).run { clear(promise) } } override fun legacy_multiGet(keys: ReadableArray, promise: Promise) { diff --git a/packages/async-storage/android/src/oldarch/asyncstorage/AsyncStorageModule.kt b/packages/async-storage/android/src/oldarch/asyncstorage/AsyncStorageModule.kt index e5b1b12f..c9051735 100644 --- a/packages/async-storage/android/src/oldarch/asyncstorage/AsyncStorageModule.kt +++ b/packages/async-storage/android/src/oldarch/asyncstorage/AsyncStorageModule.kt @@ -19,27 +19,27 @@ class AsyncStorageModule(private val reactContext: ReactApplicationContext) : @ReactMethod fun getValues(db: String, keys: ReadableArray, promise: Promise) { - StorageRegistry.getOrCreate(reactContext, db).run { get(keys, promise) } + StorageRegistry.getRNStorage(reactContext, db).run { get(keys, promise) } } @ReactMethod fun setValues(db: String, values: ReadableArray, promise: Promise) { - StorageRegistry.getOrCreate(reactContext, db).run { set(values, promise) } + StorageRegistry.getRNStorage(reactContext, db).run { set(values, promise) } } @ReactMethod fun removeValues(db: String, keys: ReadableArray, promise: Promise) { - StorageRegistry.getOrCreate(reactContext, db).run { remove(keys, promise) } + StorageRegistry.getRNStorage(reactContext, db).run { remove(keys, promise) } } @ReactMethod fun getKeys(db: String, promise: Promise) { - StorageRegistry.getOrCreate(reactContext, db).run { allKeys(promise) } + StorageRegistry.getRNStorage(reactContext, db).run { allKeys(promise) } } @ReactMethod fun clearStorage(db: String, promise: Promise) { - StorageRegistry.getOrCreate(reactContext, db).run { clear(promise) } + StorageRegistry.getRNStorage(reactContext, db).run { clear(promise) } } @ReactMethod diff --git a/packages/async-storage/apple/AsyncStorage.mm b/packages/async-storage/apple/AsyncStorage.mm index d6570555..fb626e07 100644 --- a/packages/async-storage/apple/AsyncStorage.mm +++ b/packages/async-storage/apple/AsyncStorage.mm @@ -7,33 +7,33 @@ @implementation AsyncStorage - (void)getValues:(nonnull NSString *)dbName keys:(nonnull NSArray *)keys resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - PersistentStorage* db = [StorageRegistry.shared getOrCreateWithDbName:dbName]; + RNStorage* db = [StorageRegistry.shared getRNStorageWithDbName:dbName]; [db getWithKeys:keys resolver:resolve rejecter:reject]; } - (void)setValues:(nonnull NSString *)dbName values:(nonnull NSArray *)values resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - PersistentStorage* db = [StorageRegistry.shared getOrCreateWithDbName:dbName]; + RNStorage* db = [StorageRegistry.shared getRNStorageWithDbName:dbName]; [db setWithValues:values resolver:resolve rejecter:reject]; } - (void)removeValues:(nonnull NSString *)dbName keys:(nonnull NSArray *)keys resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - PersistentStorage* db = [StorageRegistry.shared getOrCreateWithDbName:dbName]; + RNStorage* db = [StorageRegistry.shared getRNStorageWithDbName:dbName]; [db removeWithKeys:keys resolver:resolve rejecter:reject]; } - (void)clearStorage:(nonnull NSString *)dbName resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - PersistentStorage* db = [StorageRegistry.shared getOrCreateWithDbName:dbName]; + RNStorage* db = [StorageRegistry.shared getRNStorageWithDbName:dbName]; [db clearWithResolver:resolve rejecter:reject]; } - (void)getKeys:(nonnull NSString *)dbName resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - PersistentStorage* db = [StorageRegistry.shared getOrCreateWithDbName:dbName]; + RNStorage* db = [StorageRegistry.shared getRNStorageWithDbName:dbName]; [db allKeysWithResolver:resolve rejecter:reject]; } diff --git a/packages/async-storage/apple/storage/PersistentStorage.swift b/packages/async-storage/apple/storage/RNStorage.swift similarity index 95% rename from packages/async-storage/apple/storage/PersistentStorage.swift rename to packages/async-storage/apple/storage/RNStorage.swift index 348c7167..53cfe5c8 100644 --- a/packages/async-storage/apple/storage/PersistentStorage.swift +++ b/packages/async-storage/apple/storage/RNStorage.swift @@ -3,11 +3,11 @@ import SharedAsyncStorage @objc -public class PersistentStorage: NSObject { +public class RNStorage: NSObject { private let db: SharedStorage - - init(databaseName: String) { - db = SharedStorage(context: PlatformContext.Instance(), databaseName: databaseName) + + init(db: SharedStorage) { + self.db = db } @objc diff --git a/packages/async-storage/apple/storage/StorageRegistry.swift b/packages/async-storage/apple/storage/StorageRegistry.swift index 5bc9a19f..86857247 100644 --- a/packages/async-storage/apple/storage/StorageRegistry.swift +++ b/packages/async-storage/apple/storage/StorageRegistry.swift @@ -1,22 +1,51 @@ +import SharedAsyncStorage + +/** + * StorageRegistry is a singleton responsible for managing and providing access to SharedStorage and + * RNStorage instances in a thread-safe manner. + */ @objc public class StorageRegistry: NSObject { + @objc + public static let shared = StorageRegistry() + + private let lock = NSLock() + private var storages: [String: SharedStorage] = [:] + private var rnStorages: [String: RNStorage] = [:] + override private init() { super.init() } @objc - public static let shared = StorageRegistry() + public func getRNStorage(dbName: String) -> RNStorage { + lock.lock() + defer { + lock.unlock() + } - private var databases: [String: PersistentStorage] = [:] + return rnStorages[dbName] ?? { + let storage = storages[dbName] ?? { + let s = SharedStorage(context: PlatformContext.Instance(), databaseName: dbName) + storages[dbName] = s + return s + }() + let rnStorage = RNStorage(db: storage) + rnStorages[dbName] = rnStorage + return rnStorage + }() + } - @objc - public func getOrCreate(dbName: String) -> PersistentStorage { - if let storage = databases[dbName] { - return storage + public func getStorage(dbName: String) -> SharedStorage { + lock.lock() + defer { + lock.unlock() } - let db = PersistentStorage(databaseName: dbName) - databases[dbName] = db - return db + return storages[dbName] ?? { + let s = SharedStorage(context: PlatformContext.Instance(), databaseName: dbName) + storages[dbName] = s + return s + }() } } From 3c49ba1d5f2cd1bdabf0b04746c873efaef4ba49 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Sun, 5 Oct 2025 13:33:23 +0200 Subject: [PATCH 091/110] docs: brownfield --- docs/api/brownfield.md | 47 ++++++++++++++++++++++++++++++++++++++++++ mkdocs.yml | 1 + 2 files changed, 48 insertions(+) create mode 100644 docs/api/brownfield.md diff --git a/docs/api/brownfield.md b/docs/api/brownfield.md new file mode 100644 index 00000000..4e305807 --- /dev/null +++ b/docs/api/brownfield.md @@ -0,0 +1,47 @@ +!!! info + + Brownfield integration is supported on **Android**, **iOS** and **macOS**. + +`AsyncStorage` is built on a shared storage layer (`SharedStorage`) that can also be accessed directly from native code. +This is useful in brownfield scenarios, where your app combines React Native and native code, and you want both layers to read/write from the same storage consistently. + +All platforms provide a thread-safe singleton registry called `StorageRegistry` to manage storage instances. + +### Android + +On Android, `StorageRegistry` is public singleton, which is used to share `SharedStorage` instances with Native module. +Multiple calls with the same name return the same singleton instance, ensuring consistent access. + +```kotlin +import android.content.Context +import org.asyncstorage.shared_storage.SharedStorage +import org.asyncstorage.storage.StorageRegistry +import kotlinx.coroutines.runBlocking + +// access shared storage via StorageRegistry +val storage: SharedStorage = StorageRegistry.getStorage(ctx, "my-users") + +runBlocking { + storage.setValues(listOf(Entry("email", "john@example.com"))) + val values = storage.getValues(listOf("email")) + println("Stored email: ${values.firstOrNull()?.value}") +} +``` + + +### iOS / macOS + +On iOS/macOS, the `StorageRegistry` singleton provides the same functionality in Swift/Objc. + +```swift +import SharedAsyncStorage + +// access shared storage via StorageRegistry +let storage: SharedStorage = StorageRegistry.shared.getStorage(dbName: "my-users") + +Task { + storage.setValues([Entry(key: "email", value: "john@example.com")]) + let values = storage.getValues(keys: ["email"]) + print("Stored email: \(values.first?.value ?? "none")") +} +``` diff --git a/mkdocs.yml b/mkdocs.yml index 6829ab3e..d994777e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -8,6 +8,7 @@ nav: - Usage: api/usage.md - 'Database naming': api/db-naming.md - 'Error handling': api/errors.md + - 'Brownfield integration': api/brownfield.md - 'Migration to v3': migration-to-3.md - Changelog: changelog.md From 54e0da3c1d23b2755005b45dfe79b3f3e19d8385 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 13 Oct 2025 19:03:21 +0200 Subject: [PATCH 092/110] docs: contribution --- .github/CONTRIBUTING.md | 21 ++++++++------------- .github/scripts/prepare-mkdocs.sh | 1 + mkdocs.yml | 1 + 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index bd45e932..9350c20c 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,22 +1,18 @@ # Contributing to React Native Async Storage Thank you for helping out with Async Storage! We'd like to make contributions as -pleasent as possible, so here's a small guide of how we see it. Happy to hear +pleasant as possible, so here's a small guide of how we see it. Happy to hear your feedback about anything, so please let us know. ## Tests We use TypeScript for type check, `eslint` with `prettier` for -linting/formatting, `jest/detox` for tests (unit and e2e). All tests are run on -CircleCI for all opened pull requests, but you should use them locally when +linting/formatting. All tests are run on Github Actions for all opened pull requests, but you should use them locally when making changes. -- `yarn test`: Run all tests, except for e2e (see note below). - `yarn test:lint`: Run `eslint` check. - `yarn test:ts`: Run `tsc` type check. -- `yarn test:e2e:`: Runs e2e tests. Before you can run it, - you should build the app that can be run, by using - `yarn build:e2e:`. +- `yarn test:format`: Run `prettier` check for formatting mistakes. ## Sending a pull request @@ -65,16 +61,15 @@ Most notably prefixes you'll see: ## Release process -We use [Semantic Release](http://semantic-release.org) to automatically release -new versions of the library when changes are merged into `main` branch, which -we plan to keep stable. Bug fixes take priority in the release order. +We use [Changeset](https://github.com/changesets/changesets) to manage releases. +In your PR, run `yarn changeset` to create a new changeset, describing your changes. +The Changeset Bot will help you out during opening a PR. ## Reporting issues You can report issues on our -[bug tracker](https://github.com/react-native-community/react-native-async-storage/issues). -Please search for existing issues and follow the issue template when opening an -one. +[bug tracker](https://github.com/react-native-async-storage/async-storage/issues). +Please search for existing issues and follow the issue template when opening a one. ## License diff --git a/.github/scripts/prepare-mkdocs.sh b/.github/scripts/prepare-mkdocs.sh index 244ce576..b484a893 100755 --- a/.github/scripts/prepare-mkdocs.sh +++ b/.github/scripts/prepare-mkdocs.sh @@ -8,3 +8,4 @@ cp packages/async-storage/CHANGELOG.md docs/changelog.md +cp .github/CONTRIBUTING.md docs/contributing.md diff --git a/mkdocs.yml b/mkdocs.yml index d994777e..b654d702 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -10,6 +10,7 @@ nav: - 'Error handling': api/errors.md - 'Brownfield integration': api/brownfield.md - 'Migration to v3': migration-to-3.md + - Contributing: contributing.md - Changelog: changelog.md From e1831976e96d24dc542559ab28db7568e0459e2d Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 13 Oct 2025 19:13:56 +0200 Subject: [PATCH 093/110] docs: development --- DEVELOPMENT.md | 31 ++++++++++++++++++++++++++----- scripts/build-native-lib.sh | 1 - 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 360715e9..2af56965 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -1,6 +1,32 @@ # Development Guide +## shared-storage +The **shared-storage** module is a **Kotlin Multiplatform (KMP)** library that encapsulates the storage logic. +It is used as the core backend for android and apple platforms. + +### Android + +Android's `shared-storage` is distributed via maven local repo, which is then consumed by React Native module. +To build the sdk, run: + +```shell +yarn build:android +``` + +The artifact is then moved to `packages/async-storage/android/local_repo` for distribution. + +### Apple (iOS/macOS) + +`shared-storage` for apple platforms is distributed as `xcframework` containing both Debug and Release binaries. + +To build it: + +```shell +yarn build:apple +``` + +The artifact is then moved to `packages/async-storage/apple/Frameworks` for distribution. ## Documentation @@ -38,8 +64,3 @@ Run `mike deploy` to deploy docs and mark them as latest: ```shell mike deploy -u -r docs --push DOCS_VERSION_FROM_PCK_JSON latest ``` - - - - - diff --git a/scripts/build-native-lib.sh b/scripts/build-native-lib.sh index 73317a2c..37b0af68 100755 --- a/scripts/build-native-lib.sh +++ b/scripts/build-native-lib.sh @@ -36,7 +36,6 @@ build_apple() { echo "👷 Assembling apple shared-storage" ./gradlew :$MODULE_NAME:$APPLE_BUILD_TASK - echo "recreate Frameworks dir" rm -rf $APPLE_RN_OUTPUT_DIR mkdir $APPLE_RN_OUTPUT_DIR From b3e8cbcfa855e23032b641e09664b2b54d75d36e Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 13 Oct 2025 19:29:50 +0200 Subject: [PATCH 094/110] ci: run shared storage tests on PR --- .github/workflows/pull-request.yml | 28 +++++++++++++++++++ .../asyncstorage/example/sharedstorage/App.kt | 5 ---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 0292a60b..9971976f 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -17,3 +17,31 @@ jobs: run: yarn - name: test ${{ matrix.test-name }} run: yarn test:${{ matrix.test-name }} + + shared-storage-tests: + name: shared-storage tests + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [macos-15-xlarge, ubuntu-24.04] + testName: + [cleanTestAndroidHostTest, macosArm64Test, iosSimulatorArm64Test] + exclude: + - testName: cleanTestAndroidHostTest + os: macos-15-xlarge + - testName: macosArm64Test + os: ubuntu-24.04 + - testName: iosSimulatorArm64Test + os: ubuntu-24.04 + + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 + with: + distribution: "temurin" + java-version: "21" + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v5 + - name: Run test ${{ matrix.testName }} + run: | + ./gradlew ${{ matrix.testName }} diff --git a/examples/compose/src/commonMain/kotlin/org/asyncstorage/example/sharedstorage/App.kt b/examples/compose/src/commonMain/kotlin/org/asyncstorage/example/sharedstorage/App.kt index b545d69a..579a90c5 100644 --- a/examples/compose/src/commonMain/kotlin/org/asyncstorage/example/sharedstorage/App.kt +++ b/examples/compose/src/commonMain/kotlin/org/asyncstorage/example/sharedstorage/App.kt @@ -1,7 +1,6 @@ package org.asyncstorage.example.sharedstorage import androidx.compose.animation.AnimatedVisibility -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize @@ -13,10 +12,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.ui.tooling.preview.Preview -import rnasyncstorage.examples.example_compose.generated.resources.Res -import rnasyncstorage.examples.example_compose.generated.resources.compose_multiplatform @Composable @Preview @@ -36,7 +32,6 @@ fun App() { modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, ) { - Image(painterResource(Res.drawable.compose_multiplatform), null) Text("Hello world") } } From 2c3c3e8f3712a416e274470a10f936eb0f4a8d77 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 13 Oct 2025 19:37:10 +0200 Subject: [PATCH 095/110] ci: run bundle --- .github/workflows/default-storage.yml | 91 ++++++++------------------- examples/react-native/package.json | 8 +-- 2 files changed, 30 insertions(+), 69 deletions(-) diff --git a/.github/workflows/default-storage.yml b/.github/workflows/default-storage.yml index d7c81743..f6fe743f 100644 --- a/.github/workflows/default-storage.yml +++ b/.github/workflows/default-storage.yml @@ -8,7 +8,7 @@ jobs: outputs: changed: ${{ steps.filter.outputs.storage }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: dorny/paths-filter@v3 id: filter with: @@ -18,37 +18,29 @@ jobs: - 'packages/async-storage/**' android: - name: Android + name: Android RN needs: changes if: ${{ needs.changes.outputs.changed == 'true' }} runs-on: ubuntu-22.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup project uses: ./.github/actions/setup-project - name: Install JS dependencies - run: | - yarn - - name: Test Next Storage - uses: gradle/gradle-build-action@v2 - with: - gradle-version: wrapper - arguments: react-native-async-storage_async-storage:test - build-root-directory: packages/async-storage/example/android - - name: Build e2e binary - run: | - yarn build:e2e:android - working-directory: packages/async-storage/example + run: yarn + - name: Bundle JS + run: yarn bundle:android + working-directory: examples/react-native ios: - name: iOS + name: iOS RN needs: changes if: ${{ needs.changes.outputs.changed == 'true' }} runs-on: macos-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup project uses: ./.github/actions/setup-project - name: Cache /.ccache @@ -58,60 +50,35 @@ jobs: key: ccache-ios-${{ hashFiles('yarn.lock') }} restore-keys: ccache-ios- - name: Install JS dependencies - run: | - yarn + run: yarn - name: Bundle JS - run: | - yarn bundle:ios - working-directory: packages/async-storage/example - - name: Install Pods - run: | - RCT_NEW_ARCH_ENABLED=1 pod install - working-directory: packages/async-storage/example/ios - - name: Build e2e binary - run: | - yarn build:e2e:ios - working-directory: packages/async-storage/example + run: yarn bundle:ios + working-directory: examples/react-native - macos: - name: macOS + macOS: + name: macOS RN needs: changes if: ${{ needs.changes.outputs.changed == 'true' }} runs-on: macos-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup project uses: ./.github/actions/setup-project - name: Cache /.ccache uses: actions/cache@v3 with: path: packages/async-storage/.ccache - key: ccache-macos-${{ hashFiles('yarn.lock') }} - restore-keys: ccache-macos- + key: ccache-ios-${{ hashFiles('yarn.lock') }} + restore-keys: ccache-ios- - name: Install JS dependencies - run: | - yarn + run: yarn - name: Bundle JS - run: | - yarn bundle:macos - working-directory: packages/async-storage/example - - name: Install Pods - run: | - RCT_NEW_ARCH_ENABLED=1 pod install - working-directory: packages/async-storage/example/macos - - name: Build - run: | - yarn build:e2e:macos - working-directory: packages/async-storage/example - - name: Test - if: false - run: | - yarn test:e2e:macos - working-directory: packages/async-storage/example + run: yarn bundle:macos + working-directory: examples/react-native windows: - name: Windows + name: Windows RN needs: changes if: ${{ needs.changes.outputs.changed == 'true' }} runs-on: windows-2022 @@ -121,19 +88,13 @@ jobs: - name: Setup VSTest.console.exe uses: darenm/Setup-VSTest@v1.2 - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup project uses: ./.github/actions/setup-project with: windows-fix: true - name: Install JS dependencies - run: | - yarn - - name: Install Windows test app - run: | - yarn install-windows-test-app -p windows - working-directory: packages/async-storage/example - - name: Build - run: | - yarn react-native run-windows --release --arch x64 --logging --no-packager --no-launch --no-deploy --msbuildprops "BundleEntryFile=index.ts,UseBundle=false" --no-telemetry - working-directory: packages/async-storage/example + run: yarn + - name: Bundle JS + run: yarn bundle:windows + working-directory: examples/react-native diff --git a/examples/react-native/package.json b/examples/react-native/package.json index 6bc2af64..dccf8a78 100644 --- a/examples/react-native/package.json +++ b/examples/react-native/package.json @@ -7,10 +7,10 @@ "ios": "react-native run-ios", "windows": "install-windows-test-app && react-native run-windows", "macos": "react-native run-macos", - "build:android": "yarn mkdist && react-native bundle --entry-file index.js --platform android --dev true --bundle-output dist/main.android.jsbundle --assets-dest dist/res", - "build:ios": "yarn mkdist && react-native bundle --entry-file index.js --platform ios --dev true --bundle-output dist/main.ios.jsbundle --assets-dest dist", - "build:windows": "yarn mkdist && react-native bundle --entry-file index.js --platform windows --dev true --bundle-output dist/main.windows.bundle --assets-dest dist", - "build:macos": "yarn mkdist && react-native bundle --entry-file index.js --platform macos --dev true --bundle-output dist/main.macos.bundle --assets-dest dist", + "bundle:android": "yarn mkdist && react-native bundle --entry-file index.js --platform android --dev true --bundle-output dist/main.android.jsbundle --assets-dest dist/res", + "bundle:ios": "yarn mkdist && react-native bundle --entry-file index.js --platform ios --dev true --bundle-output dist/main.ios.jsbundle --assets-dest dist", + "bundle:windows": "yarn mkdist && react-native bundle --entry-file index.js --platform windows --dev true --bundle-output dist/main.windows.bundle --assets-dest dist", + "bundle:macos": "yarn mkdist && react-native bundle --entry-file index.js --platform macos --dev true --bundle-output dist/main.macos.bundle --assets-dest dist", "test:lint": "eslint .", "test:ts": "tsc --noEmit", "mkdist": "node -e \"require('node:fs').mkdirSync('dist', { recursive: true, mode: 0o755 })\"", From 9ae0d99d47c8b7a8fdc51c611f55a66d68256f32 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 13 Oct 2025 19:38:22 +0200 Subject: [PATCH 096/110] chore: rename actions --- ...{default-storage.yml => async-storage.yml} | 2 +- yarn.lock | 7167 +---------------- 2 files changed, 311 insertions(+), 6858 deletions(-) rename .github/workflows/{default-storage.yml => async-storage.yml} (99%) diff --git a/.github/workflows/default-storage.yml b/.github/workflows/async-storage.yml similarity index 99% rename from .github/workflows/default-storage.yml rename to .github/workflows/async-storage.yml index f6fe743f..3bc520cd 100644 --- a/.github/workflows/default-storage.yml +++ b/.github/workflows/async-storage.yml @@ -1,4 +1,4 @@ -name: Default storage +name: Async storage on: pull_request: jobs: diff --git a/yarn.lock b/yarn.lock index ed9b6ee8..59f37505 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,188 +12,6 @@ __metadata: languageName: node linkType: hard -"@algolia/autocomplete-core@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-core@npm:1.9.3" - dependencies: - "@algolia/autocomplete-plugin-algolia-insights": "npm:1.9.3" - "@algolia/autocomplete-shared": "npm:1.9.3" - checksum: 10c0/a751b20f15c9a30b8b2d5a4f1f62fb4dbd012fb7ffec1b12308d6e7388b5a4dc83af52176634f17facb57a7727204843c5aa2f6e80efafaaf244275f44af11d9 - languageName: node - linkType: hard - -"@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3" - dependencies: - "@algolia/autocomplete-shared": "npm:1.9.3" - peerDependencies: - search-insights: ">= 1 < 3" - checksum: 10c0/574196f66fe828be1029439032376685020524d6c729dea99caef336cc7be244d2539fa91b3fe80db80efe3420c2c05063cab3534514be6c637bf1914b17a6f6 - languageName: node - linkType: hard - -"@algolia/autocomplete-preset-algolia@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-preset-algolia@npm:1.9.3" - dependencies: - "@algolia/autocomplete-shared": "npm:1.9.3" - peerDependencies: - "@algolia/client-search": ">= 4.9.1 < 6" - algoliasearch: ">= 4.9.1 < 6" - checksum: 10c0/38c1872db4dae69b4eec622db940c7a992d8530e33fbac7df593473ef404312076d9933b4a7ea25c2d401ea5b62ebd64b56aa25b5cdd8e8ba3fd309a39d9d816 - languageName: node - linkType: hard - -"@algolia/autocomplete-shared@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-shared@npm:1.9.3" - peerDependencies: - "@algolia/client-search": ">= 4.9.1 < 6" - algoliasearch: ">= 4.9.1 < 6" - checksum: 10c0/1aa926532c32be6bb5384c8c0ae51a312c9d79ed7486371218dfcb61c8ea1ed46171bdc9f9b596a266aece104a0ef76d6aac2f9a378a5a6eb4460e638d59f6ae - languageName: node - linkType: hard - -"@algolia/cache-browser-local-storage@npm:4.19.1": - version: 4.19.1 - resolution: "@algolia/cache-browser-local-storage@npm:4.19.1" - dependencies: - "@algolia/cache-common": "npm:4.19.1" - checksum: 10c0/55b8553351186efba46742eafebd4ef3bc26093e45b8afda1741550e63600b5ad95835ebd9a875b571e3f481de0df43925165c7e403f581c1e7c2f2d2525c3b2 - languageName: node - linkType: hard - -"@algolia/cache-common@npm:4.19.1": - version: 4.19.1 - resolution: "@algolia/cache-common@npm:4.19.1" - checksum: 10c0/33de0609f8c2d499dc559ed75e5101e03de2dc084f72c722d173c7ef64af3ca5e8886f79163676047764101510f2c543286545711b0b2e5ccff2a52dfa962ae7 - languageName: node - linkType: hard - -"@algolia/cache-in-memory@npm:4.19.1": - version: 4.19.1 - resolution: "@algolia/cache-in-memory@npm:4.19.1" - dependencies: - "@algolia/cache-common": "npm:4.19.1" - checksum: 10c0/fd8deed75c0cf2d8b983d5957eaf809233cd9caaa661d7b6b80a50ce6cd09a7b339c2f7072916c7afb88b557638f6e4d3194bc8424e38126752602a04bf11ec5 - languageName: node - linkType: hard - -"@algolia/client-account@npm:4.19.1": - version: 4.19.1 - resolution: "@algolia/client-account@npm:4.19.1" - dependencies: - "@algolia/client-common": "npm:4.19.1" - "@algolia/client-search": "npm:4.19.1" - "@algolia/transporter": "npm:4.19.1" - checksum: 10c0/ca809f59ca3118244ce86480cd5060be206c07ad8564f8e5f557a38f165a0f49211058bd7ad31839835180bbbb5cc4a9da0afe8df91569e701e9a9c9ba59e7b4 - languageName: node - linkType: hard - -"@algolia/client-analytics@npm:4.19.1": - version: 4.19.1 - resolution: "@algolia/client-analytics@npm:4.19.1" - dependencies: - "@algolia/client-common": "npm:4.19.1" - "@algolia/client-search": "npm:4.19.1" - "@algolia/requester-common": "npm:4.19.1" - "@algolia/transporter": "npm:4.19.1" - checksum: 10c0/a618d252e06cfa6b16f9d3ac887c07d81c4eb84060e51501300fbff0c81c37325d0b847ec99959239b24575c0ceb8409f16fad69b703015271a9f1c7796c88ba - languageName: node - linkType: hard - -"@algolia/client-common@npm:4.19.1": - version: 4.19.1 - resolution: "@algolia/client-common@npm:4.19.1" - dependencies: - "@algolia/requester-common": "npm:4.19.1" - "@algolia/transporter": "npm:4.19.1" - checksum: 10c0/17a330c70a32c08b4fc778c309a53e7c1e4a5273555f764fe1952e5a6db334eb5a7d777cd35b00ab510a3e1e6cf239f93b1911d23aa498ef9672d473ee6ab360 - languageName: node - linkType: hard - -"@algolia/client-personalization@npm:4.19.1": - version: 4.19.1 - resolution: "@algolia/client-personalization@npm:4.19.1" - dependencies: - "@algolia/client-common": "npm:4.19.1" - "@algolia/requester-common": "npm:4.19.1" - "@algolia/transporter": "npm:4.19.1" - checksum: 10c0/3691a264568f3ca130c996e34ce1e3006117a940a98bbe3340c4cced8786c1ae4209bf0cd5c178a21f0c3c912d3876c6977b4b76ec44d452666ad5bb90facf6b - languageName: node - linkType: hard - -"@algolia/client-search@npm:4.19.1": - version: 4.19.1 - resolution: "@algolia/client-search@npm:4.19.1" - dependencies: - "@algolia/client-common": "npm:4.19.1" - "@algolia/requester-common": "npm:4.19.1" - "@algolia/transporter": "npm:4.19.1" - checksum: 10c0/d062ed6ce1359ee513e076afe928241cc932f7ea6a7dc317361aa502fcd2c08d253d9dd25c28ed03afb86c69e37ef1a7b9b4d5926e87278ac2b9ed6e4ee350dd - languageName: node - linkType: hard - -"@algolia/events@npm:^4.0.1": - version: 4.0.1 - resolution: "@algolia/events@npm:4.0.1" - checksum: 10c0/f398d815c6ed21ac08f6caadf1e9155add74ac05d99430191c3b1f1335fd91deaf468c6b304e6225c9885d3d44c06037c53def101e33d9c22daff175b2a65ca9 - languageName: node - linkType: hard - -"@algolia/logger-common@npm:4.19.1": - version: 4.19.1 - resolution: "@algolia/logger-common@npm:4.19.1" - checksum: 10c0/26b5cfb7116971f73be792be475e743a6ac69f58726fd29376382a7b0d1b4aefeafbcff505a1f780b176e003b955e9a2ee455807eecaed2626418ba5dbc156f1 - languageName: node - linkType: hard - -"@algolia/logger-console@npm:4.19.1": - version: 4.19.1 - resolution: "@algolia/logger-console@npm:4.19.1" - dependencies: - "@algolia/logger-common": "npm:4.19.1" - checksum: 10c0/2992eca07ee1d2c527dc1e60eb51bcc90a38769c76ce484c3a294db60b1382ae2b3c9ee7618b04d52b029ca7169ffc69f7aaa4e07a7ce0616e32878cd0c0cd19 - languageName: node - linkType: hard - -"@algolia/requester-browser-xhr@npm:4.19.1": - version: 4.19.1 - resolution: "@algolia/requester-browser-xhr@npm:4.19.1" - dependencies: - "@algolia/requester-common": "npm:4.19.1" - checksum: 10c0/98602ad54dc2fdf2c5dce00886cbef2c0b629d9beff147f651821301c63bd49bb27ce9cd4cd2c810a503b7569f245ac910daa2b954a3489d936aa799ff8e5163 - languageName: node - linkType: hard - -"@algolia/requester-common@npm:4.19.1": - version: 4.19.1 - resolution: "@algolia/requester-common@npm:4.19.1" - checksum: 10c0/d61a765dd23a2c0abc79c786c45bcd26f03f18fd2be1ea5a119105981e1bd15a1f4fe3234d320f421b5b73c8459e1e3f1e5c2afd8dd79bddfdec1282a9a1c5d9 - languageName: node - linkType: hard - -"@algolia/requester-node-http@npm:4.19.1": - version: 4.19.1 - resolution: "@algolia/requester-node-http@npm:4.19.1" - dependencies: - "@algolia/requester-common": "npm:4.19.1" - checksum: 10c0/3856f1e7afba99cd218fbcaccd919259f91cbb09c32a294b2f63ba6623e75fdafd4d99e40ea057ec0d2c5a46c92edbf4e07c301d982669ed0729edc7d0f9009a - languageName: node - linkType: hard - -"@algolia/transporter@npm:4.19.1": - version: 4.19.1 - resolution: "@algolia/transporter@npm:4.19.1" - dependencies: - "@algolia/cache-common": "npm:4.19.1" - "@algolia/logger-common": "npm:4.19.1" - "@algolia/requester-common": "npm:4.19.1" - checksum: 10c0/0d0badfd996b6b42a162e67f13a2e3a1396b7f88fe2136e0e32a2d8adb123a06343537b058903b88f27b0702ce35cd172c3009bc159db79406ead35ad8f25010 - languageName: node - linkType: hard - "@ampproject/remapping@npm:^2.2.0": version: 2.2.1 resolution: "@ampproject/remapping@npm:2.2.1" @@ -220,7 +38,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.24.7, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.26.2, @babel/code-frame@npm:^7.8.3": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.24.7, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.26.2": version: 7.26.2 resolution: "@babel/code-frame@npm:7.26.2" dependencies: @@ -256,31 +74,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:7.12.9": - version: 7.12.9 - resolution: "@babel/core@npm:7.12.9" - dependencies: - "@babel/code-frame": "npm:^7.10.4" - "@babel/generator": "npm:^7.12.5" - "@babel/helper-module-transforms": "npm:^7.12.1" - "@babel/helpers": "npm:^7.12.5" - "@babel/parser": "npm:^7.12.7" - "@babel/template": "npm:^7.12.7" - "@babel/traverse": "npm:^7.12.9" - "@babel/types": "npm:^7.12.7" - convert-source-map: "npm:^1.7.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.1" - json5: "npm:^2.1.2" - lodash: "npm:^4.17.19" - resolve: "npm:^1.3.2" - semver: "npm:^5.4.1" - source-map: "npm:^0.5.0" - checksum: 10c0/c11d26f5a33a29c94fdd1c492dfd723f48926c51e975448dda57c081c0d74c7b03298642b2651559e0d330ec868b5757b60f9648c71cf7f89fddf79a17cf006f - languageName: node - linkType: hard - -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.18.6, @babel/core@npm:^7.19.6, @babel/core@npm:^7.25.2": +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.25.2": version: 7.26.0 resolution: "@babel/core@npm:7.26.0" dependencies: @@ -363,7 +157,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.12.5, @babel/generator@npm:^7.18.7, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0": +"@babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0": version: 7.26.2 resolution: "@babel/generator@npm:7.26.2" dependencies: @@ -516,7 +310,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.12.1, @babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.26.0": +"@babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.26.0": version: 7.26.0 resolution: "@babel/helper-module-transforms@npm:7.26.0" dependencies: @@ -551,13 +345,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:7.10.4": - version: 7.10.4 - resolution: "@babel/helper-plugin-utils@npm:7.10.4" - checksum: 10c0/113d0405281f5490658f7c1c3a81b4a37927375e1ebcccd2fd90be538a102da0c2d6024561aaf26bd1c71ef7688b5a8b96a87d938db8d9774454ab635011fc7f - languageName: node - linkType: hard - "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.8.0": version: 7.25.9 resolution: "@babel/helper-plugin-utils@npm:7.25.9" @@ -671,7 +458,7 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.26.0": +"@babel/helpers@npm:^7.26.0": version: 7.26.10 resolution: "@babel/helpers@npm:7.26.10" dependencies: @@ -701,7 +488,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.12.7, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.18.8, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2, @babel/parser@npm:^7.26.9": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2, @babel/parser@npm:^7.26.9": version: 7.26.10 resolution: "@babel/parser@npm:7.26.10" dependencies: @@ -804,19 +591,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-object-rest-spread@npm:7.12.1": - version: 7.12.1 - resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.12.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.0" - "@babel/plugin-transform-parameters": "npm:^7.12.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/f773d59ead8b056b646d585e95d610cca2f0aeaa2eeaad74b3eb9e25821b06f27e361dd0aac9a088a10c22fee1ead8863f82a2be073e28eb04ca9a330a00941e - languageName: node - linkType: hard - "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": version: 7.21.0-placeholder-for-preset-env.2 resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" @@ -947,17 +721,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:7.12.1": - version: 7.12.1 - resolution: "@babel/plugin-syntax-jsx@npm:7.12.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/11d435f9e4e71c0f00e5bc295b40747c2c42341b7f38ddc5f8ac41d49ddfa247514dbe91932fa3dabd65581b4c7a9fe5b3d1c2b285e5ca32f4e5296cc185d40c - languageName: node - linkType: hard - "@babel/plugin-syntax-jsx@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" @@ -1013,7 +776,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-object-rest-spread@npm:7.8.3, @babel/plugin-syntax-object-rest-spread@npm:^7.8.0, @babel/plugin-syntax-object-rest-spread@npm:^7.8.3": +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": version: 7.8.3 resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" dependencies: @@ -1519,7 +1282,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.12.1, @babel/plugin-transform-parameters@npm:^7.24.7, @babel/plugin-transform-parameters@npm:^7.25.9": +"@babel/plugin-transform-parameters@npm:^7.24.7, @babel/plugin-transform-parameters@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-parameters@npm:7.25.9" dependencies: @@ -1566,17 +1329,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-constant-elements@npm:^7.18.12": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-constant-elements@npm:7.22.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/3a54802058ed3eef9c98efcc9ec4888763dce552f117db9a62fc2cdca30d9de0218cf7722a748d4b715a8bd833b9725d7ee018d01a18209b44434d15f719b173 - languageName: node - linkType: hard - "@babel/plugin-transform-react-display-name@npm:^7.24.7, @babel/plugin-transform-react-display-name@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-react-display-name@npm:7.25.9" @@ -1705,7 +1457,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:^7.18.6, @babel/plugin-transform-runtime@npm:^7.24.7": +"@babel/plugin-transform-runtime@npm:^7.24.7": version: 7.25.9 resolution: "@babel/plugin-transform-runtime@npm:7.25.9" dependencies: @@ -1850,7 +1602,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:^7.18.6, @babel/preset-env@npm:^7.19.4, @babel/preset-env@npm:^7.25.2, @babel/preset-env@npm:^7.25.3": +"@babel/preset-env@npm:^7.25.2, @babel/preset-env@npm:^7.25.3": version: 7.26.0 resolution: "@babel/preset-env@npm:7.26.0" dependencies: @@ -1942,7 +1694,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-react@npm:^7.18.6, @babel/preset-react@npm:^7.24.7": +"@babel/preset-react@npm:^7.24.7": version: 7.25.9 resolution: "@babel/preset-react@npm:7.25.9" dependencies: @@ -1958,7 +1710,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.18.6, @babel/preset-typescript@npm:^7.24.7": +"@babel/preset-typescript@npm:^7.24.7": version: 7.26.0 resolution: "@babel/preset-typescript@npm:7.26.0" dependencies: @@ -1973,17 +1725,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime-corejs3@npm:^7.18.6": - version: 7.26.10 - resolution: "@babel/runtime-corejs3@npm:7.26.10" - dependencies: - core-js-pure: "npm:^3.30.2" - regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/897b61d84809d6e63e08566d436cd08a3a78f218283641bb53533948d4bcd5524c6a1f83613e20485cf7fa8d054da20dd9039d17e06c92cf282f25d4d4f57250 - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.25.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.4": +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.25.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.4": version: 7.26.0 resolution: "@babel/runtime@npm:7.26.0" dependencies: @@ -1992,7 +1734,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.12.7, @babel/template@npm:^7.25.0, @babel/template@npm:^7.25.9, @babel/template@npm:^7.26.9, @babel/template@npm:^7.3.3": +"@babel/template@npm:^7.25.0, @babel/template@npm:^7.25.9, @babel/template@npm:^7.26.9, @babel/template@npm:^7.3.3": version: 7.26.9 resolution: "@babel/template@npm:7.26.9" dependencies: @@ -2014,7 +1756,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3, @babel/traverse@npm:^7.12.9, @babel/traverse@npm:^7.18.8, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.25.9": +"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.25.9": version: 7.25.9 resolution: "@babel/traverse@npm:7.25.9" dependencies: @@ -2059,7 +1801,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.12.7, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.10, @babel/types@npm:^7.26.9, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.10, @babel/types@npm:^7.26.9, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": version: 7.26.10 resolution: "@babel/types@npm:7.26.10" dependencies: @@ -2344,671 +2086,108 @@ __metadata: languageName: node linkType: hard -"@colors/colors@npm:1.5.0": +"@emnapi/core@npm:^1.4.3, @emnapi/core@npm:^1.4.5": version: 1.5.0 - resolution: "@colors/colors@npm:1.5.0" - checksum: 10c0/eb42729851adca56d19a08e48d5a1e95efd2a32c55ae0323de8119052be0510d4b7a1611f2abcbf28c044a6c11e6b7d38f99fccdad7429300c37a8ea5fb95b44 - languageName: node - linkType: hard - -"@discoveryjs/json-ext@npm:0.5.7": - version: 0.5.7 - resolution: "@discoveryjs/json-ext@npm:0.5.7" - checksum: 10c0/e10f1b02b78e4812646ddf289b7d9f2cb567d336c363b266bd50cd223cf3de7c2c74018d91cd2613041568397ef3a4a2b500aba588c6e5bd78c38374ba68f38c - languageName: node - linkType: hard - -"@docsearch/css@npm:3.5.1": - version: 3.5.1 - resolution: "@docsearch/css@npm:3.5.1" - checksum: 10c0/532374e8edf3cf2f571dd9c99737d81b656d16f2e7bff1a1b0a35d35f5c7275627d5350d61af52c3d6ad2911a4fc8dba6df0476c63e174ea2e4466ab15440093 - languageName: node - linkType: hard - -"@docsearch/react@npm:^3.1.1": - version: 3.5.1 - resolution: "@docsearch/react@npm:3.5.1" - dependencies: - "@algolia/autocomplete-core": "npm:1.9.3" - "@algolia/autocomplete-preset-algolia": "npm:1.9.3" - "@docsearch/css": "npm:3.5.1" - algoliasearch: "npm:^4.0.0" - peerDependencies: - "@types/react": ">= 16.8.0 < 19.0.0" - react: ">= 16.8.0 < 19.0.0" - react-dom: ">= 16.8.0 < 19.0.0" - peerDependenciesMeta: - "@types/react": - optional: true - react: - optional: true - react-dom: - optional: true - checksum: 10c0/506c6d4f22f1e24d99e0ec368993a9c20479b79ca5fd42f803338722ab2e1536256bf8a22cf1c1fd0af3c9925b8f5d01a87913af6d47e22bf46bec408f09c9ee - languageName: node - linkType: hard - -"@docusaurus/core@npm:2.4.1, @docusaurus/core@npm:^2.4.0": - version: 2.4.1 - resolution: "@docusaurus/core@npm:2.4.1" + resolution: "@emnapi/core@npm:1.5.0" dependencies: - "@babel/core": "npm:^7.18.6" - "@babel/generator": "npm:^7.18.7" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-transform-runtime": "npm:^7.18.6" - "@babel/preset-env": "npm:^7.18.6" - "@babel/preset-react": "npm:^7.18.6" - "@babel/preset-typescript": "npm:^7.18.6" - "@babel/runtime": "npm:^7.18.6" - "@babel/runtime-corejs3": "npm:^7.18.6" - "@babel/traverse": "npm:^7.18.8" - "@docusaurus/cssnano-preset": "npm:2.4.1" - "@docusaurus/logger": "npm:2.4.1" - "@docusaurus/mdx-loader": "npm:2.4.1" - "@docusaurus/react-loadable": "npm:5.5.2" - "@docusaurus/utils": "npm:2.4.1" - "@docusaurus/utils-common": "npm:2.4.1" - "@docusaurus/utils-validation": "npm:2.4.1" - "@slorber/static-site-generator-webpack-plugin": "npm:^4.0.7" - "@svgr/webpack": "npm:^6.2.1" - autoprefixer: "npm:^10.4.7" - babel-loader: "npm:^8.2.5" - babel-plugin-dynamic-import-node: "npm:^2.3.3" - boxen: "npm:^6.2.1" - chalk: "npm:^4.1.2" - chokidar: "npm:^3.5.3" - clean-css: "npm:^5.3.0" - cli-table3: "npm:^0.6.2" - combine-promises: "npm:^1.1.0" - commander: "npm:^5.1.0" - copy-webpack-plugin: "npm:^11.0.0" - core-js: "npm:^3.23.3" - css-loader: "npm:^6.7.1" - css-minimizer-webpack-plugin: "npm:^4.0.0" - cssnano: "npm:^5.1.12" - del: "npm:^6.1.1" - detect-port: "npm:^1.3.0" - escape-html: "npm:^1.0.3" - eta: "npm:^2.0.0" - file-loader: "npm:^6.2.0" - fs-extra: "npm:^10.1.0" - html-minifier-terser: "npm:^6.1.0" - html-tags: "npm:^3.2.0" - html-webpack-plugin: "npm:^5.5.0" - import-fresh: "npm:^3.3.0" - leven: "npm:^3.1.0" - lodash: "npm:^4.17.21" - mini-css-extract-plugin: "npm:^2.6.1" - postcss: "npm:^8.4.14" - postcss-loader: "npm:^7.0.0" - prompts: "npm:^2.4.2" - react-dev-utils: "npm:^12.0.1" - react-helmet-async: "npm:^1.3.0" - react-loadable: "npm:@docusaurus/react-loadable@5.5.2" - react-loadable-ssr-addon-v5-slorber: "npm:^1.0.1" - react-router: "npm:^5.3.3" - react-router-config: "npm:^5.1.1" - react-router-dom: "npm:^5.3.3" - rtl-detect: "npm:^1.0.4" - semver: "npm:^7.3.7" - serve-handler: "npm:^6.1.3" - shelljs: "npm:^0.8.5" - terser-webpack-plugin: "npm:^5.3.3" + "@emnapi/wasi-threads": "npm:1.1.0" tslib: "npm:^2.4.0" - update-notifier: "npm:^5.1.0" - url-loader: "npm:^4.1.1" - wait-on: "npm:^6.0.1" - webpack: "npm:^5.73.0" - webpack-bundle-analyzer: "npm:^4.5.0" - webpack-dev-server: "npm:^4.9.3" - webpack-merge: "npm:^5.8.0" - webpackbar: "npm:^5.0.2" - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - bin: - docusaurus: bin/docusaurus.mjs - checksum: 10c0/a3d41217c4135eb129a2114df58fa79b017219637e7ceab0d3b911cd5a0e0cad8b42bb09a4d9f1232c91a1fec100c93d2a6e07c88af7fe3b3a62ae7058768240 + checksum: 10c0/52ba3485277706d92fa27d92b37e5b4f6ef0742c03ed68f8096f294c6bfa30f0752c82d4c2bfa14bff4dc30d63c9f71a8f9fb64a92743d00807d9e468fafd5ff languageName: node linkType: hard -"@docusaurus/cssnano-preset@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/cssnano-preset@npm:2.4.1" +"@emnapi/runtime@npm:^1.4.3, @emnapi/runtime@npm:^1.4.5": + version: 1.5.0 + resolution: "@emnapi/runtime@npm:1.5.0" dependencies: - cssnano-preset-advanced: "npm:^5.3.8" - postcss: "npm:^8.4.14" - postcss-sort-media-queries: "npm:^4.2.1" tslib: "npm:^2.4.0" - checksum: 10c0/69a779b6ff8cdef38405cb8ac254a355b972994de9436c5f7e21db9593bb76972dc8c9f5dd3a511ca59ff380bc20ce13cc9df523b914b5ff3d210121b5e4b1e9 + checksum: 10c0/a85c9fc4e3af49cbe41e5437e5be2551392a931910cd0a5b5d3572532786927810c9cc1db11b232ec8f9657b33d4e6f7c4f985f1a052917d7cd703b5b2a20faa languageName: node linkType: hard -"@docusaurus/logger@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/logger@npm:2.4.1" +"@emnapi/wasi-threads@npm:1.1.0, @emnapi/wasi-threads@npm:^1.0.4": + version: 1.1.0 + resolution: "@emnapi/wasi-threads@npm:1.1.0" dependencies: - chalk: "npm:^4.1.2" tslib: "npm:^2.4.0" - checksum: 10c0/973a8d5177fd5ea422c665a87dac0f8c805149871af766b2647f0da513efe5a95f50bba56062f7660ff218f014be34de26d2caedba38f2a6fc2d74e33ad2dd2c + checksum: 10c0/e6d54bf2b1e64cdd83d2916411e44e579b6ae35d5def0dea61a3c452d9921373044dff32a8b8473ae60c80692bdc39323e98b96a3f3d87ba6886b24dd0ef7ca1 languageName: node linkType: hard -"@docusaurus/mdx-loader@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/mdx-loader@npm:2.4.1" - dependencies: - "@babel/parser": "npm:^7.18.8" - "@babel/traverse": "npm:^7.18.8" - "@docusaurus/logger": "npm:2.4.1" - "@docusaurus/utils": "npm:2.4.1" - "@mdx-js/mdx": "npm:^1.6.22" - escape-html: "npm:^1.0.3" - file-loader: "npm:^6.2.0" - fs-extra: "npm:^10.1.0" - image-size: "npm:^1.0.1" - mdast-util-to-string: "npm:^2.0.0" - remark-emoji: "npm:^2.2.0" - stringify-object: "npm:^3.3.0" - tslib: "npm:^2.4.0" - unified: "npm:^9.2.2" - unist-util-visit: "npm:^2.0.3" - url-loader: "npm:^4.1.1" - webpack: "npm:^5.73.0" - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 10c0/4fb70c0cbf682dba129ea753a92b751c1d9d1a3e88652b36c72ec540e8a2b7567e9e94ec7a4d1a0de8965aaeb76fb6c46e675de206681f19ac535721fcb15dcb +"@esbuild/aix-ppc64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/aix-ppc64@npm:0.25.9" + conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@docusaurus/module-type-aliases@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/module-type-aliases@npm:2.4.1" - dependencies: - "@docusaurus/react-loadable": "npm:5.5.2" - "@docusaurus/types": "npm:2.4.1" - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - "@types/react-router-config": "npm:*" - "@types/react-router-dom": "npm:*" - react-helmet-async: "npm:*" - react-loadable: "npm:@docusaurus/react-loadable@5.5.2" - peerDependencies: - react: "*" - react-dom: "*" - checksum: 10c0/678f6e64091881f1d2ad1f2f4282e763158bd0883c8336107c1beb5ed26f061af4c27223d34927f943a232085a384081b27fe958cbc3fc7f87fc23c3d9ac3ab4 +"@esbuild/android-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/android-arm64@npm:0.25.9" + conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@docusaurus/plugin-content-blog@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-content-blog@npm:2.4.1" - dependencies: - "@docusaurus/core": "npm:2.4.1" - "@docusaurus/logger": "npm:2.4.1" - "@docusaurus/mdx-loader": "npm:2.4.1" - "@docusaurus/types": "npm:2.4.1" - "@docusaurus/utils": "npm:2.4.1" - "@docusaurus/utils-common": "npm:2.4.1" - "@docusaurus/utils-validation": "npm:2.4.1" - cheerio: "npm:^1.0.0-rc.12" - feed: "npm:^4.2.2" - fs-extra: "npm:^10.1.0" - lodash: "npm:^4.17.21" - reading-time: "npm:^1.5.0" - tslib: "npm:^2.4.0" - unist-util-visit: "npm:^2.0.3" - utility-types: "npm:^3.10.0" - webpack: "npm:^5.73.0" - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 10c0/80ecc55a03cde9f1b593f79c2cab6c7a1e6f369b58537ac520c835be06677fd8b5db5f6562e218e79449e7b441eb2908a680bc295351d34c1b71181a35411822 +"@esbuild/android-arm@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/android-arm@npm:0.25.9" + conditions: os=android & cpu=arm languageName: node linkType: hard -"@docusaurus/plugin-content-docs@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-content-docs@npm:2.4.1" - dependencies: - "@docusaurus/core": "npm:2.4.1" - "@docusaurus/logger": "npm:2.4.1" - "@docusaurus/mdx-loader": "npm:2.4.1" - "@docusaurus/module-type-aliases": "npm:2.4.1" - "@docusaurus/types": "npm:2.4.1" - "@docusaurus/utils": "npm:2.4.1" - "@docusaurus/utils-validation": "npm:2.4.1" - "@types/react-router-config": "npm:^5.0.6" - combine-promises: "npm:^1.1.0" - fs-extra: "npm:^10.1.0" - import-fresh: "npm:^3.3.0" - js-yaml: "npm:^4.1.0" - lodash: "npm:^4.17.21" - tslib: "npm:^2.4.0" - utility-types: "npm:^3.10.0" - webpack: "npm:^5.73.0" - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 10c0/ad90dcceb7a32f89196522406e0c03cef211b14f9ff275dea8fbed89ea03b843e152925b95c9554309344a074a928ede1dd568d178b7fbe3c6c3bf7c2dbf2093 +"@esbuild/android-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/android-x64@npm:0.25.9" + conditions: os=android & cpu=x64 languageName: node linkType: hard -"@docusaurus/plugin-content-pages@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-content-pages@npm:2.4.1" - dependencies: - "@docusaurus/core": "npm:2.4.1" - "@docusaurus/mdx-loader": "npm:2.4.1" - "@docusaurus/types": "npm:2.4.1" - "@docusaurus/utils": "npm:2.4.1" - "@docusaurus/utils-validation": "npm:2.4.1" - fs-extra: "npm:^10.1.0" - tslib: "npm:^2.4.0" - webpack: "npm:^5.73.0" - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 10c0/2df9262d6586ddba9f523e279bd029b67974ec128be757f446064dd9ce7ab9c86e7f1df5b48a7b2b05b4bfdfdc2075d94eaf76d19fd119d974169ccc813fd7ff +"@esbuild/darwin-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/darwin-arm64@npm:0.25.9" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@docusaurus/plugin-debug@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-debug@npm:2.4.1" - dependencies: - "@docusaurus/core": "npm:2.4.1" - "@docusaurus/types": "npm:2.4.1" - "@docusaurus/utils": "npm:2.4.1" - fs-extra: "npm:^10.1.0" - react-json-view: "npm:^1.21.3" - tslib: "npm:^2.4.0" - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 10c0/535d908b76839d9d15ba5e0752725488106f9b1a9fcd737823fd9afc7b8e14c79eedb2e1ba46947b77f051dd723b36c66518ea73084c8833ea9e0600e2860f9c +"@esbuild/darwin-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/darwin-x64@npm:0.25.9" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@docusaurus/plugin-google-analytics@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-google-analytics@npm:2.4.1" - dependencies: - "@docusaurus/core": "npm:2.4.1" - "@docusaurus/types": "npm:2.4.1" - "@docusaurus/utils-validation": "npm:2.4.1" - tslib: "npm:^2.4.0" - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 10c0/a26162d24a7b2a0f06a8dbe8f76b66f65687d0af2eadb9c672760a0a8d260e3b0370f531d7a8f8c27dcb15ddffb8ce5db2c86ff03a1bb160e15044ed05c464d2 +"@esbuild/freebsd-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/freebsd-arm64@npm:0.25.9" + conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@docusaurus/plugin-google-gtag@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-google-gtag@npm:2.4.1" - dependencies: - "@docusaurus/core": "npm:2.4.1" - "@docusaurus/types": "npm:2.4.1" - "@docusaurus/utils-validation": "npm:2.4.1" - tslib: "npm:^2.4.0" - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 10c0/ec60d15c39886c87e12db6690ea8b5dc33e42c48ec3a22eb47168721ec776eb87f3f2e23054b33088e65e11dd1741ee88a3054242a587bf17b5cc349d4878e59 +"@esbuild/freebsd-x64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/freebsd-x64@npm:0.25.9" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@docusaurus/plugin-google-tag-manager@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-google-tag-manager@npm:2.4.1" - dependencies: - "@docusaurus/core": "npm:2.4.1" - "@docusaurus/types": "npm:2.4.1" - "@docusaurus/utils-validation": "npm:2.4.1" - tslib: "npm:^2.4.0" - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 10c0/da366b2c37337548f85c39224ef95fb6f01ccaec54850ed2af32c0389850a35b78428668af45b4cb2e13408db23e23ba81db38bc764568a32976c1393c9c2d8d +"@esbuild/linux-arm64@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-arm64@npm:0.25.9" + conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@docusaurus/plugin-sitemap@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-sitemap@npm:2.4.1" - dependencies: - "@docusaurus/core": "npm:2.4.1" - "@docusaurus/logger": "npm:2.4.1" - "@docusaurus/types": "npm:2.4.1" - "@docusaurus/utils": "npm:2.4.1" - "@docusaurus/utils-common": "npm:2.4.1" - "@docusaurus/utils-validation": "npm:2.4.1" - fs-extra: "npm:^10.1.0" - sitemap: "npm:^7.1.1" - tslib: "npm:^2.4.0" - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 10c0/50ebfbdef0da8b0e8723c20d33e9be3f09b108f4667d9c12c1fdae3a90588c2277b1a21d72c761d2bc70901aff447b1e2dbd03df4f03dffde05226c0741fc937 +"@esbuild/linux-arm@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-arm@npm:0.25.9" + conditions: os=linux & cpu=arm languageName: node linkType: hard -"@docusaurus/preset-classic@npm:^2.4.0": - version: 2.4.1 - resolution: "@docusaurus/preset-classic@npm:2.4.1" - dependencies: - "@docusaurus/core": "npm:2.4.1" - "@docusaurus/plugin-content-blog": "npm:2.4.1" - "@docusaurus/plugin-content-docs": "npm:2.4.1" - "@docusaurus/plugin-content-pages": "npm:2.4.1" - "@docusaurus/plugin-debug": "npm:2.4.1" - "@docusaurus/plugin-google-analytics": "npm:2.4.1" - "@docusaurus/plugin-google-gtag": "npm:2.4.1" - "@docusaurus/plugin-google-tag-manager": "npm:2.4.1" - "@docusaurus/plugin-sitemap": "npm:2.4.1" - "@docusaurus/theme-classic": "npm:2.4.1" - "@docusaurus/theme-common": "npm:2.4.1" - "@docusaurus/theme-search-algolia": "npm:2.4.1" - "@docusaurus/types": "npm:2.4.1" - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 10c0/4e7ca4622b51583c6d160e69381bb5e9570bfd2ca756633d2291a4f9a30c459b43cb9c40bca06012f55057efd83e5342622e108f0ea3ca54ff025b25d5e21fe3 - languageName: node - linkType: hard - -"@docusaurus/react-loadable@npm:5.5.2, react-loadable@npm:@docusaurus/react-loadable@5.5.2": - version: 5.5.2 - resolution: "@docusaurus/react-loadable@npm:5.5.2" - dependencies: - "@types/react": "npm:*" - prop-types: "npm:^15.6.2" - peerDependencies: - react: "*" - checksum: 10c0/3f6a335d55c811c4fd40300ff0d87ae88f44f96e9c43a4c3f54f1c19b7a55bae601e43d66f797074e204699fd6abb69affa65fc4c5a819e8f1c2adb8a912da46 - languageName: node - linkType: hard - -"@docusaurus/theme-classic@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/theme-classic@npm:2.4.1" - dependencies: - "@docusaurus/core": "npm:2.4.1" - "@docusaurus/mdx-loader": "npm:2.4.1" - "@docusaurus/module-type-aliases": "npm:2.4.1" - "@docusaurus/plugin-content-blog": "npm:2.4.1" - "@docusaurus/plugin-content-docs": "npm:2.4.1" - "@docusaurus/plugin-content-pages": "npm:2.4.1" - "@docusaurus/theme-common": "npm:2.4.1" - "@docusaurus/theme-translations": "npm:2.4.1" - "@docusaurus/types": "npm:2.4.1" - "@docusaurus/utils": "npm:2.4.1" - "@docusaurus/utils-common": "npm:2.4.1" - "@docusaurus/utils-validation": "npm:2.4.1" - "@mdx-js/react": "npm:^1.6.22" - clsx: "npm:^1.2.1" - copy-text-to-clipboard: "npm:^3.0.1" - infima: "npm:0.2.0-alpha.43" - lodash: "npm:^4.17.21" - nprogress: "npm:^0.2.0" - postcss: "npm:^8.4.14" - prism-react-renderer: "npm:^1.3.5" - prismjs: "npm:^1.28.0" - react-router-dom: "npm:^5.3.3" - rtlcss: "npm:^3.5.0" - tslib: "npm:^2.4.0" - utility-types: "npm:^3.10.0" - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 10c0/fcef781196f7901627c5d2134e341bcef8e22cc6307c5e8503661fa00e2a1e17bbe5a227a576202ca7a5e7edd2f6359568d619de77d9004493d6f74a64212aaf - languageName: node - linkType: hard - -"@docusaurus/theme-common@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/theme-common@npm:2.4.1" - dependencies: - "@docusaurus/mdx-loader": "npm:2.4.1" - "@docusaurus/module-type-aliases": "npm:2.4.1" - "@docusaurus/plugin-content-blog": "npm:2.4.1" - "@docusaurus/plugin-content-docs": "npm:2.4.1" - "@docusaurus/plugin-content-pages": "npm:2.4.1" - "@docusaurus/utils": "npm:2.4.1" - "@docusaurus/utils-common": "npm:2.4.1" - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - "@types/react-router-config": "npm:*" - clsx: "npm:^1.2.1" - parse-numeric-range: "npm:^1.3.0" - prism-react-renderer: "npm:^1.3.5" - tslib: "npm:^2.4.0" - use-sync-external-store: "npm:^1.2.0" - utility-types: "npm:^3.10.0" - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 10c0/88dc6713735b8e395920b595de02ca2a2a259ca634791d3c734fef65efa335c445b08e2a77b3aba38994d5e2986443fabb8ddda17acaffa2dc64f74cab07ea52 - languageName: node - linkType: hard - -"@docusaurus/theme-search-algolia@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/theme-search-algolia@npm:2.4.1" - dependencies: - "@docsearch/react": "npm:^3.1.1" - "@docusaurus/core": "npm:2.4.1" - "@docusaurus/logger": "npm:2.4.1" - "@docusaurus/plugin-content-docs": "npm:2.4.1" - "@docusaurus/theme-common": "npm:2.4.1" - "@docusaurus/theme-translations": "npm:2.4.1" - "@docusaurus/utils": "npm:2.4.1" - "@docusaurus/utils-validation": "npm:2.4.1" - algoliasearch: "npm:^4.13.1" - algoliasearch-helper: "npm:^3.10.0" - clsx: "npm:^1.2.1" - eta: "npm:^2.0.0" - fs-extra: "npm:^10.1.0" - lodash: "npm:^4.17.21" - tslib: "npm:^2.4.0" - utility-types: "npm:^3.10.0" - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 10c0/ed64695a7f60071d18b7e1bdb65b53dcb28cd04141aa319f76f4cb5f46b8491536db9c76d60e52b2d3af6a24d4762a1a95b377ef78fe661895d5d551df18863d - languageName: node - linkType: hard - -"@docusaurus/theme-translations@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/theme-translations@npm:2.4.1" - dependencies: - fs-extra: "npm:^10.1.0" - tslib: "npm:^2.4.0" - checksum: 10c0/c483541a1f1235e4cb69228f105490bf90f74ac1099cee6b823b836572eefbabf4634e31429e906f8f58371547df474e47c1bd503ccd3aad25f2d8c65a2fa99e - languageName: node - linkType: hard - -"@docusaurus/types@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/types@npm:2.4.1" - dependencies: - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - commander: "npm:^5.1.0" - joi: "npm:^17.6.0" - react-helmet-async: "npm:^1.3.0" - utility-types: "npm:^3.10.0" - webpack: "npm:^5.73.0" - webpack-merge: "npm:^5.8.0" - peerDependencies: - react: ^16.8.4 || ^17.0.0 - react-dom: ^16.8.4 || ^17.0.0 - checksum: 10c0/176157bd54b139e14d51846d1dce1102ecbb880dab16240050d972dc941022ec5cb60cbf267e71345cc7902d3932b14e632043ae1739ef1b43babac4e3950092 - languageName: node - linkType: hard - -"@docusaurus/utils-common@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/utils-common@npm:2.4.1" - dependencies: - tslib: "npm:^2.4.0" - peerDependencies: - "@docusaurus/types": "*" - peerDependenciesMeta: - "@docusaurus/types": - optional: true - checksum: 10c0/7aebef735596d2041a3343781126e65ec8c7ac2adeabdd094f66d0aacc9b104999a9fcd920aa30739383bacb6480c51d727febde636e424005ec56ff81936708 - languageName: node - linkType: hard - -"@docusaurus/utils-validation@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/utils-validation@npm:2.4.1" - dependencies: - "@docusaurus/logger": "npm:2.4.1" - "@docusaurus/utils": "npm:2.4.1" - joi: "npm:^17.6.0" - js-yaml: "npm:^4.1.0" - tslib: "npm:^2.4.0" - checksum: 10c0/690efc892c1ad20ee0172dae4eb9ec9cd6aaced6f9271cf5e8bb997592158f458b7726e8557157c2770cabe97512e896c1b2974d07e399498fcdd2662445b6e2 - languageName: node - linkType: hard - -"@docusaurus/utils@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/utils@npm:2.4.1" - dependencies: - "@docusaurus/logger": "npm:2.4.1" - "@svgr/webpack": "npm:^6.2.1" - escape-string-regexp: "npm:^4.0.0" - file-loader: "npm:^6.2.0" - fs-extra: "npm:^10.1.0" - github-slugger: "npm:^1.4.0" - globby: "npm:^11.1.0" - gray-matter: "npm:^4.0.3" - js-yaml: "npm:^4.1.0" - lodash: "npm:^4.17.21" - micromatch: "npm:^4.0.5" - resolve-pathname: "npm:^3.0.0" - shelljs: "npm:^0.8.5" - tslib: "npm:^2.4.0" - url-loader: "npm:^4.1.1" - webpack: "npm:^5.73.0" - peerDependencies: - "@docusaurus/types": "*" - peerDependenciesMeta: - "@docusaurus/types": - optional: true - checksum: 10c0/d8e5a50cff900eb39399fe6ecfe0189b41a32db565f1e67794bb0853462a67142376df095cc42f1d886109c43dc135d8e9b67fbf6b0b0cd324f099f15723ec80 - languageName: node - linkType: hard - -"@emnapi/core@npm:^1.4.3, @emnapi/core@npm:^1.4.5": - version: 1.5.0 - resolution: "@emnapi/core@npm:1.5.0" - dependencies: - "@emnapi/wasi-threads": "npm:1.1.0" - tslib: "npm:^2.4.0" - checksum: 10c0/52ba3485277706d92fa27d92b37e5b4f6ef0742c03ed68f8096f294c6bfa30f0752c82d4c2bfa14bff4dc30d63c9f71a8f9fb64a92743d00807d9e468fafd5ff - languageName: node - linkType: hard - -"@emnapi/runtime@npm:^1.4.3, @emnapi/runtime@npm:^1.4.5": - version: 1.5.0 - resolution: "@emnapi/runtime@npm:1.5.0" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/a85c9fc4e3af49cbe41e5437e5be2551392a931910cd0a5b5d3572532786927810c9cc1db11b232ec8f9657b33d4e6f7c4f985f1a052917d7cd703b5b2a20faa - languageName: node - linkType: hard - -"@emnapi/wasi-threads@npm:1.1.0, @emnapi/wasi-threads@npm:^1.0.4": - version: 1.1.0 - resolution: "@emnapi/wasi-threads@npm:1.1.0" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/e6d54bf2b1e64cdd83d2916411e44e579b6ae35d5def0dea61a3c452d9921373044dff32a8b8473ae60c80692bdc39323e98b96a3f3d87ba6886b24dd0ef7ca1 - languageName: node - linkType: hard - -"@esbuild/aix-ppc64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/aix-ppc64@npm:0.25.9" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/android-arm64@npm:0.25.9" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/android-arm@npm:0.25.9" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/android-x64@npm:0.25.9" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/darwin-arm64@npm:0.25.9" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/darwin-x64@npm:0.25.9" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/freebsd-arm64@npm:0.25.9" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/freebsd-x64@npm:0.25.9" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-arm64@npm:0.25.9" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-arm@npm:0.25.9" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-ia32@npm:0.25.9" - conditions: os=linux & cpu=ia32 +"@esbuild/linux-ia32@npm:0.25.9": + version: 0.25.9 + resolution: "@esbuild/linux-ia32@npm:0.25.9" + conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -3649,7 +2828,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.9": +"@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -3659,13 +2838,6 @@ __metadata: languageName: node linkType: hard -"@leichtgewicht/ip-codec@npm:^2.0.1": - version: 2.0.4 - resolution: "@leichtgewicht/ip-codec@npm:2.0.4" - checksum: 10c0/3b0d8844d1d47c0a5ed7267c2964886adad3a642b85d06f95c148eeefd80cdabbd6aa0d63ccde8239967a2e9b6bb734a16bd57e1fda3d16bf56d50a7e7ec131b - languageName: node - linkType: hard - "@manypkg/find-root@npm:^1.1.0": version: 1.1.0 resolution: "@manypkg/find-root@npm:1.1.0" @@ -3692,49 +2864,6 @@ __metadata: languageName: node linkType: hard -"@mdx-js/mdx@npm:^1.6.22": - version: 1.6.22 - resolution: "@mdx-js/mdx@npm:1.6.22" - dependencies: - "@babel/core": "npm:7.12.9" - "@babel/plugin-syntax-jsx": "npm:7.12.1" - "@babel/plugin-syntax-object-rest-spread": "npm:7.8.3" - "@mdx-js/util": "npm:1.6.22" - babel-plugin-apply-mdx-type-prop: "npm:1.6.22" - babel-plugin-extract-import-names: "npm:1.6.22" - camelcase-css: "npm:2.0.1" - detab: "npm:2.0.4" - hast-util-raw: "npm:6.0.1" - lodash.uniq: "npm:4.5.0" - mdast-util-to-hast: "npm:10.0.1" - remark-footnotes: "npm:2.0.0" - remark-mdx: "npm:1.6.22" - remark-parse: "npm:8.0.3" - remark-squeeze-paragraphs: "npm:4.0.0" - style-to-object: "npm:0.3.0" - unified: "npm:9.2.0" - unist-builder: "npm:2.0.3" - unist-util-visit: "npm:2.0.3" - checksum: 10c0/7f4c38911fc269159834240d3cc9279839145022a992bd61657530750c7ab5d0f674e8d6319b6e2e426d0e1adc6cc5ab1876e57548208783d8a3d1b8ef73ebca - languageName: node - linkType: hard - -"@mdx-js/react@npm:^1.6.22": - version: 1.6.22 - resolution: "@mdx-js/react@npm:1.6.22" - peerDependencies: - react: ^16.13.1 || ^17.0.0 - checksum: 10c0/ed896671ffab04c1f11cdba45bfb2786acff58cd0b749b0a13d9b7a7022ac75cc036bec067ca946e6540e2934727e0ba8bf174e4ae10c916f30cda6aecac8992 - languageName: node - linkType: hard - -"@mdx-js/util@npm:1.6.22": - version: 1.6.22 - resolution: "@mdx-js/util@npm:1.6.22" - checksum: 10c0/2ee8da6afea0f42297ea31f52b1d50d228744d2895cce7cc9571b7d5ce97c7c96037c80b6dbcded9caa8099c9a994eda62980099eabe1c000aaa792816c66f10 - languageName: node - linkType: hard - "@microsoft/1ds-core-js@npm:4.3.4, @microsoft/1ds-core-js@npm:^4.3.0": version: 4.3.4 resolution: "@microsoft/1ds-core-js@npm:4.3.4" @@ -3883,13 +3012,6 @@ __metadata: languageName: node linkType: hard -"@polka/url@npm:^1.0.0-next.20": - version: 1.0.0-next.21 - resolution: "@polka/url@npm:1.0.0-next.21" - checksum: 10c0/53c1f28683a075aac41f8ce2a54eb952b6bc67a03494b2dca1cb63d833a6da898cea6a92df8e1e6b680db985fb7f9c16e11c20afa6584bcdda68a16fb4c18737 - languageName: node - linkType: hard - "@react-native-async-storage/async-storage@workspace:*, @react-native-async-storage/async-storage@workspace:packages/async-storage": version: 0.0.0-use.local resolution: "@react-native-async-storage/async-storage@workspace:packages/async-storage" @@ -5040,13 +4162,6 @@ __metadata: languageName: node linkType: hard -"@sindresorhus/is@npm:^0.14.0": - version: 0.14.0 - resolution: "@sindresorhus/is@npm:0.14.0" - checksum: 10c0/7247aa9314d4fc3df9b3f63d8b5b962a89c7600a5db1f268546882bfc4d31a975a899f5f42a09dd41a11e58636e6402f7c40f92df853aee417247bb11faee9a0 - languageName: node - linkType: hard - "@sinonjs/commons@npm:^2.0.0": version: 2.0.0 resolution: "@sinonjs/commons@npm:2.0.0" @@ -5065,243 +4180,67 @@ __metadata: languageName: node linkType: hard -"@slorber/static-site-generator-webpack-plugin@npm:^4.0.7": - version: 4.0.7 - resolution: "@slorber/static-site-generator-webpack-plugin@npm:4.0.7" +"@tailwindcss/node@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/node@npm:4.1.13" dependencies: - eval: "npm:^0.1.8" - p-map: "npm:^4.0.0" - webpack-sources: "npm:^3.2.2" - checksum: 10c0/6ba8abc2d99e8c513bb955502f9cd219c78b2c7b9b76668bf05067cf369cfa838089b52ee51c957e1e6e8442f9dd4f2bbd8df706a3c3388e9a0d41b09a895f97 - languageName: node - linkType: hard - -"@svgr/babel-plugin-add-jsx-attribute@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/a13ed0797189d5497890530449029bec388310e260a96459e304e2729e7a2cf4d20d34f882d9a77ccce73dd3d36065afbb6987258fdff618d7d57955065a8ad4 + "@jridgewell/remapping": "npm:^2.3.4" + enhanced-resolve: "npm:^5.18.3" + jiti: "npm:^2.5.1" + lightningcss: "npm:1.30.1" + magic-string: "npm:^0.30.18" + source-map-js: "npm:^1.2.1" + tailwindcss: "npm:4.1.13" + checksum: 10c0/969b2eaefced271655fdf53a07737103736115c6b55fa1559c78147d17871da988c165ab2236bf4da8cdbde1e50a5116b8df2225e20f63de981d43da5b69e3f1 languageName: node linkType: hard -"@svgr/babel-plugin-remove-jsx-attribute@npm:*": - version: 8.0.0 - resolution: "@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/8a98e59bd9971e066815b4129409932f7a4db4866834fe75677ea6d517972fb40b380a69a4413189f20e7947411f9ab1b0f029dd5e8068686a5a0188d3ccd4c7 +"@tailwindcss/oxide-android-arm64@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.13" + conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@svgr/babel-plugin-remove-jsx-empty-expression@npm:*": - version: 8.0.0 - resolution: "@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/517dcca75223bd05d3f056a8514dbba3031278bea4eadf0842c576d84f4651e7a4e0e7082d3ee4ef42456de0f9c4531d8a1917c04876ca64b014b859ca8f1bde +"@tailwindcss/oxide-darwin-arm64@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.13" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@svgr/babel-plugin-replace-jsx-attribute-value@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/318786787c9a217c33a7340c8856436858e1fffa5a6df635fedc6b9a371f3afea080ea074b9e3cfbbd9dd962ead924fde8bc9855a394c38dd60e391883a58c81 +"@tailwindcss/oxide-darwin-x64@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.13" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@svgr/babel-plugin-svg-dynamic-title@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/16ef228c793b909fec47dd7dc05c1c3c2d77a824f42055df37e141e0534081b1bc4aec6dcc51be50c221df9f262f59270fc1c379923bfd4f5db302abafabfd8d +"@tailwindcss/oxide-freebsd-x64@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.13" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@svgr/babel-plugin-svg-em-dimensions@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/dfdd5cbe6ae543505eaa0da69df0735b7407294c4b0504b3e74c0e7e371f1acb914eb99fd21ff39ef5bd626b3474f064a4cccc50f41b7c556ee834f9a6d6610a +"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.13" + conditions: os=linux & cpu=arm languageName: node linkType: hard -"@svgr/babel-plugin-transform-react-native-svg@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/332fbf3bbc19d938b744440dbab9c8acd8f7a2ed6bf9c4e23f40e3f2c25615a60b3bf00902a4f1f6c20b5f382a1547b3acc6f2b2d70d80e532b5d45945f1b979 +"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.13" + conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@svgr/babel-plugin-transform-svg-component@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-plugin-transform-svg-component@npm:6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/8d9e1c7c62abce23837e53cdacc6d09bc1f1f2b0ad7322105001c097995e9aa8dca4fa41acf39148af69f342e40081c438106949fb083e997ca497cb0448f27d - languageName: node - linkType: hard - -"@svgr/babel-preset@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/babel-preset@npm:6.5.1" - dependencies: - "@svgr/babel-plugin-add-jsx-attribute": "npm:^6.5.1" - "@svgr/babel-plugin-remove-jsx-attribute": "npm:*" - "@svgr/babel-plugin-remove-jsx-empty-expression": "npm:*" - "@svgr/babel-plugin-replace-jsx-attribute-value": "npm:^6.5.1" - "@svgr/babel-plugin-svg-dynamic-title": "npm:^6.5.1" - "@svgr/babel-plugin-svg-em-dimensions": "npm:^6.5.1" - "@svgr/babel-plugin-transform-react-native-svg": "npm:^6.5.1" - "@svgr/babel-plugin-transform-svg-component": "npm:^6.5.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/8e8d7a0049279152f9ac308fbfd4ce74063d8a376154718cba6309bae4316318804a32201c75c5839c629f8e1e5d641a87822764000998161d0fc1de24b0374a - languageName: node - linkType: hard - -"@svgr/core@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/core@npm:6.5.1" - dependencies: - "@babel/core": "npm:^7.19.6" - "@svgr/babel-preset": "npm:^6.5.1" - "@svgr/plugin-jsx": "npm:^6.5.1" - camelcase: "npm:^6.2.0" - cosmiconfig: "npm:^7.0.1" - checksum: 10c0/60cce11e13391171132115dcc8da592d23e51f155ebadf9b819bd1836b8c13d40aa5c30a03a7d429f65e70a71c50669b2e10c94e4922de4e58bc898275f46c05 - languageName: node - linkType: hard - -"@svgr/hast-util-to-babel-ast@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/hast-util-to-babel-ast@npm:6.5.1" - dependencies: - "@babel/types": "npm:^7.20.0" - entities: "npm:^4.4.0" - checksum: 10c0/18fa37b36581ba1678f5cc5a05ce0411e08df4db267f3cd900af7ffdf5bd90522f3a46465f315cd5d7345264949479133930aafdd27ce05c474e63756196256f - languageName: node - linkType: hard - -"@svgr/plugin-jsx@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/plugin-jsx@npm:6.5.1" - dependencies: - "@babel/core": "npm:^7.19.6" - "@svgr/babel-preset": "npm:^6.5.1" - "@svgr/hast-util-to-babel-ast": "npm:^6.5.1" - svg-parser: "npm:^2.0.4" - peerDependencies: - "@svgr/core": ^6.0.0 - checksum: 10c0/365da6e43ceeff6b49258fa2fbb3c880210300e4a85ba74831e92d2dc9c53e6ab8dda422dc33fb6a339803227cf8d9a0024ce769401c46fd87209abe36d5ae43 - languageName: node - linkType: hard - -"@svgr/plugin-svgo@npm:^6.5.1": - version: 6.5.1 - resolution: "@svgr/plugin-svgo@npm:6.5.1" - dependencies: - cosmiconfig: "npm:^7.0.1" - deepmerge: "npm:^4.2.2" - svgo: "npm:^2.8.0" - peerDependencies: - "@svgr/core": "*" - checksum: 10c0/da40e461145af1a92fd2ec50ea64626681fa73786f218497a4b4fb85393a58812999ca2744ee33bb7ab771aa5ce9ab1dbd08a189cb3d7a89fb58fd96913ddf91 - languageName: node - linkType: hard - -"@svgr/webpack@npm:^6.2.1": - version: 6.5.1 - resolution: "@svgr/webpack@npm:6.5.1" - dependencies: - "@babel/core": "npm:^7.19.6" - "@babel/plugin-transform-react-constant-elements": "npm:^7.18.12" - "@babel/preset-env": "npm:^7.19.4" - "@babel/preset-react": "npm:^7.18.6" - "@babel/preset-typescript": "npm:^7.18.6" - "@svgr/core": "npm:^6.5.1" - "@svgr/plugin-jsx": "npm:^6.5.1" - "@svgr/plugin-svgo": "npm:^6.5.1" - checksum: 10c0/3e9edfbc2ef3dc07b5f50c9c5ff5c951048511dff9dffb0407e6d15343849dfb36099fc7e1e3911429382cab81f7735a86ba1d6f77d21bb8f9ca33a5dec4824a - languageName: node - linkType: hard - -"@szmarczak/http-timer@npm:^1.1.2": - version: 1.1.2 - resolution: "@szmarczak/http-timer@npm:1.1.2" - dependencies: - defer-to-connect: "npm:^1.0.1" - checksum: 10c0/0594140e027ce4e98970c6d176457fcbff80900b1b3101ac0d08628ca6d21d70e0b94c6aaada94d4f76c1423fcc7195af83da145ce0fd556fc0595ca74a17b8b - languageName: node - linkType: hard - -"@tailwindcss/node@npm:4.1.13": - version: 4.1.13 - resolution: "@tailwindcss/node@npm:4.1.13" - dependencies: - "@jridgewell/remapping": "npm:^2.3.4" - enhanced-resolve: "npm:^5.18.3" - jiti: "npm:^2.5.1" - lightningcss: "npm:1.30.1" - magic-string: "npm:^0.30.18" - source-map-js: "npm:^1.2.1" - tailwindcss: "npm:4.1.13" - checksum: 10c0/969b2eaefced271655fdf53a07737103736115c6b55fa1559c78147d17871da988c165ab2236bf4da8cdbde1e50a5116b8df2225e20f63de981d43da5b69e3f1 - languageName: node - linkType: hard - -"@tailwindcss/oxide-android-arm64@npm:4.1.13": - version: 4.1.13 - resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.13" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@tailwindcss/oxide-darwin-arm64@npm:4.1.13": - version: 4.1.13 - resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.13" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@tailwindcss/oxide-darwin-x64@npm:4.1.13": - version: 4.1.13 - resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.13" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@tailwindcss/oxide-freebsd-x64@npm:4.1.13": - version: 4.1.13 - resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.13" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.13": - version: 4.1.13 - resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.13" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.13": - version: 4.1.13 - resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.13" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.13": - version: 4.1.13 - resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.13" - conditions: os=linux & cpu=arm64 & libc=musl +"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.13": + version: 4.1.13 + resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.13" + conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard @@ -5414,13 +4353,6 @@ __metadata: languageName: node linkType: hard -"@trysound/sax@npm:0.2.0": - version: 0.2.0 - resolution: "@trysound/sax@npm:0.2.0" - checksum: 10c0/44907308549ce775a41c38a815f747009ac45929a45d642b836aa6b0a536e4978d30b8d7d680bbd116e9dd73b7dbe2ef0d1369dcfc2d09e83ba381e485ecbe12 - languageName: node - linkType: hard - "@tybys/wasm-util@npm:^0.10.0": version: 0.10.1 resolution: "@tybys/wasm-util@npm:0.10.1" @@ -5484,44 +4416,6 @@ __metadata: languageName: node linkType: hard -"@types/body-parser@npm:*": - version: 1.19.2 - resolution: "@types/body-parser@npm:1.19.2" - dependencies: - "@types/connect": "npm:*" - "@types/node": "npm:*" - checksum: 10c0/c2dd533e1d4af958d656bdba7f376df68437d8dfb7e4522c88b6f3e6f827549e4be5bf0be68a5f1878accf5752ea37fba7e8a4b6dda53d0d122d77e27b69c750 - languageName: node - linkType: hard - -"@types/bonjour@npm:^3.5.9": - version: 3.5.10 - resolution: "@types/bonjour@npm:3.5.10" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/5a3d70695a8dfe79c020579fcbf18d7dbb89b8f061dd388c76b68c4797c0fccd71f3e8a9e2bea00afffdb9b37a49dd0ac0a192829d5b655a5b49c66f313a7be8 - languageName: node - linkType: hard - -"@types/connect-history-api-fallback@npm:^1.3.5": - version: 1.5.0 - resolution: "@types/connect-history-api-fallback@npm:1.5.0" - dependencies: - "@types/express-serve-static-core": "npm:*" - "@types/node": "npm:*" - checksum: 10c0/176362698eb68cfbd0517c015fc089fd764d5d35f07230238bb57f833d24a4737f46b4d78dfc225809e7324729d360b831567d1dff17639d576ad85f5b86743d - languageName: node - linkType: hard - -"@types/connect@npm:*": - version: 3.4.35 - resolution: "@types/connect@npm:3.4.35" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/f11a1ccfed540723dddd7cb496543ad40a2f663f22ff825e9b220f0bae86db8b1ced2184ee41d3fb358b019ad6519e39481b06386db91ebb859003ad1d54fe6a - languageName: node - linkType: hard - "@types/estree@npm:1.0.8, @types/estree@npm:^1.0.6": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" @@ -5529,37 +4423,6 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:^1.0.5": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d - languageName: node - linkType: hard - -"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": - version: 4.17.35 - resolution: "@types/express-serve-static-core@npm:4.17.35" - dependencies: - "@types/node": "npm:*" - "@types/qs": "npm:*" - "@types/range-parser": "npm:*" - "@types/send": "npm:*" - checksum: 10c0/08db6ffff07b5d53d852bb0a078ea5ee6dc3eb581d8c8fdf0d65f48c641db2830658074c797844e618b0933ce4ca2ddd08191f9d79b12eb2ec3d66f8551716ec - languageName: node - linkType: hard - -"@types/express@npm:*, @types/express@npm:^4.17.13": - version: 4.17.21 - resolution: "@types/express@npm:4.17.21" - dependencies: - "@types/body-parser": "npm:*" - "@types/express-serve-static-core": "npm:^4.17.33" - "@types/qs": "npm:*" - "@types/serve-static": "npm:*" - checksum: 10c0/12e562c4571da50c7d239e117e688dc434db1bac8be55613294762f84fd77fbd0658ccd553c7d3ab02408f385bc93980992369dd30e2ecd2c68c358e6af8fabf - languageName: node - linkType: hard - "@types/graceful-fs@npm:^4.1.3": version: 4.1.6 resolution: "@types/graceful-fs@npm:4.1.6" @@ -5569,45 +4432,6 @@ __metadata: languageName: node linkType: hard -"@types/hast@npm:^2.0.0": - version: 2.3.5 - resolution: "@types/hast@npm:2.3.5" - dependencies: - "@types/unist": "npm:^2" - checksum: 10c0/3fc5185e7fb5139a4f60f0d4450179c1f88b7e288a054415b273e4a32f0c4cfe825a4cad075824dcdf3984609b47f13141f8900dedb3aeab482ae5a16275e807 - languageName: node - linkType: hard - -"@types/history@npm:^4.7.11": - version: 4.7.11 - resolution: "@types/history@npm:4.7.11" - checksum: 10c0/3facf37c2493d1f92b2e93a22cac7ea70b06351c2ab9aaceaa3c56aa6099fb63516f6c4ec1616deb5c56b4093c026a043ea2d3373e6c0644d55710364d02c934 - languageName: node - linkType: hard - -"@types/html-minifier-terser@npm:^6.0.0": - version: 6.1.0 - resolution: "@types/html-minifier-terser@npm:6.1.0" - checksum: 10c0/a62fb8588e2f3818d82a2d7b953ad60a4a52fd767ae04671de1c16f5788bd72f1ed3a6109ed63fd190c06a37d919e3c39d8adbc1793a005def76c15a3f5f5dab - languageName: node - linkType: hard - -"@types/http-errors@npm:*": - version: 2.0.1 - resolution: "@types/http-errors@npm:2.0.1" - checksum: 10c0/3bbc8c84fb02b381737e2eec563b434121384b1aef4e070edec4479a1bc74f27373edc09162680cd3ea1035ef8e5ab6d606bd7c99e3855c424045fb74376cb66 - languageName: node - linkType: hard - -"@types/http-proxy@npm:^1.17.8": - version: 1.17.11 - resolution: "@types/http-proxy@npm:1.17.11" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/0af1bed7c1eaace924b8a316a718a702d40882dc541320ca1629c7f4ee852ef4dbef1963d4cb9e523b59dbe4d7f07e37def38b15e8ebb92d5b569b800b1c2bf7 - languageName: node - linkType: hard - "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0": version: 2.0.4 resolution: "@types/istanbul-lib-coverage@npm:2.0.4" @@ -5650,22 +4474,13 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db languageName: node linkType: hard -"@types/keyv@npm:^3.1.1": - version: 3.1.4 - resolution: "@types/keyv@npm:3.1.4" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/ff8f54fc49621210291f815fe5b15d809fd7d032941b3180743440bd507ecdf08b9e844625fa346af568c84bf34114eb378dcdc3e921a08ba1e2a08d7e3c809c - languageName: node - linkType: hard - "@types/lodash.isequal@npm:^4.5.8": version: 4.5.8 resolution: "@types/lodash.isequal@npm:4.5.8" @@ -5682,29 +4497,6 @@ __metadata: languageName: node linkType: hard -"@types/mdast@npm:^3.0.0": - version: 3.0.12 - resolution: "@types/mdast@npm:3.0.12" - dependencies: - "@types/unist": "npm:^2" - checksum: 10c0/b5af41e4f19a149eba58cde8ccacc36117640aefe28966637c54c27a8fbcfa3972e88cafd859c7bf39cd5c4e965e4196169001beac4a1980cfee6b08eea896a6 - languageName: node - linkType: hard - -"@types/mime@npm:*": - version: 3.0.1 - resolution: "@types/mime@npm:3.0.1" - checksum: 10c0/c4c0fc89042822a3b5ffd6ef0da7006513454ee8376ffa492372d17d2925a4e4b1b194c977b718c711df38b33eb9d06deb5dbf9f851bcfb7e5e65f06b2a87f97 - languageName: node - linkType: hard - -"@types/mime@npm:^1": - version: 1.3.2 - resolution: "@types/mime@npm:1.3.2" - checksum: 10c0/61d144e5170c6cdf6de334ec0ee4bb499b1a0fb0233834a9e8cec6d289b0e3042bedf35cbc1c995d71a247635770dae3f13a9ddae69098bb54b933429bc08d35 - languageName: node - linkType: hard - "@types/minimist@npm:^1.2.2": version: 1.2.5 resolution: "@types/minimist@npm:1.2.5" @@ -5712,15 +4504,6 @@ __metadata: languageName: node linkType: hard -"@types/node-forge@npm:^1.3.0": - version: 1.3.11 - resolution: "@types/node-forge@npm:1.3.11" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/3d7d23ca0ba38ac0cf74028393bd70f31169ab9aba43f21deb787840170d307d662644bac07287495effe2812ddd7ac8a14dbd43f16c2936bbb06312e96fc3b9 - languageName: node - linkType: hard - "@types/node@npm:*": version: 20.3.2 resolution: "@types/node@npm:20.3.2" @@ -5735,13 +4518,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^17.0.5": - version: 17.0.45 - resolution: "@types/node@npm:17.0.45" - checksum: 10c0/0db377133d709b33a47892581a21a41cd7958f22723a3cc6c71d55ac018121382de42fbfc7970d5ae3e7819dbe5f40e1c6a5174aedf7e7964e9cb8fa72b580b0 - languageName: node - linkType: hard - "@types/normalize-package-data@npm:^2.4.0": version: 2.4.1 resolution: "@types/normalize-package-data@npm:2.4.1" @@ -5749,20 +4525,6 @@ __metadata: languageName: node linkType: hard -"@types/parse-json@npm:^4.0.0": - version: 4.0.0 - resolution: "@types/parse-json@npm:4.0.0" - checksum: 10c0/1d3012ab2fcdad1ba313e1d065b737578f6506c8958e2a7a5bdbdef517c7e930796cb1599ee067d5dee942fb3a764df64b5eef7e9ae98548d776e86dcffba985 - languageName: node - linkType: hard - -"@types/parse5@npm:^5.0.0": - version: 5.0.3 - resolution: "@types/parse5@npm:5.0.3" - checksum: 10c0/7d7ebbcb704a0ef438aa0de43ea1fd9723dfa802b8fa459628ceaf063f092bd19791b2a2580265244898dcc9d40f7345588a76cf752847d29540539f802711ed - languageName: node - linkType: hard - "@types/prop-types@npm:*": version: 15.7.4 resolution: "@types/prop-types@npm:15.7.4" @@ -5770,20 +4532,6 @@ __metadata: languageName: node linkType: hard -"@types/qs@npm:*": - version: 6.9.7 - resolution: "@types/qs@npm:6.9.7" - checksum: 10c0/157eb05f4c75790b0ebdcf7b0547ff117feabc8cda03c3cac3d3ea82bb19a1912e76a411df3eb0bdd01026a9770f07bc0e7e3fbe39ebb31c1be4564c16be35f1 - languageName: node - linkType: hard - -"@types/range-parser@npm:*": - version: 1.2.4 - resolution: "@types/range-parser@npm:1.2.4" - checksum: 10c0/8e3c3cda88675efd9145241bcb454449715b7d015a7fb80d018dcb3d441fa1938b302242cc0dfa6b02c5d014dd8bc082ae90091e62b1e816cae3ec36c2a7dbcb - languageName: node - linkType: hard - "@types/react-dom@npm:19.1.7": version: 19.1.7 resolution: "@types/react-dom@npm:19.1.7" @@ -5793,38 +4541,6 @@ __metadata: languageName: node linkType: hard -"@types/react-router-config@npm:*, @types/react-router-config@npm:^5.0.6": - version: 5.0.7 - resolution: "@types/react-router-config@npm:5.0.7" - dependencies: - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - "@types/react-router": "npm:^5.1.0" - checksum: 10c0/d340af8d9f68ee27f2f900e4d28ea116072728ab6db4a81e2488ff29bdd166973f2777124923c04d31c040cdeaa155f213c619caf75925e123a6a3982553d0aa - languageName: node - linkType: hard - -"@types/react-router-dom@npm:*": - version: 5.3.3 - resolution: "@types/react-router-dom@npm:5.3.3" - dependencies: - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - "@types/react-router": "npm:*" - checksum: 10c0/a9231a16afb9ed5142678147eafec9d48582809295754fb60946e29fcd3757a4c7a3180fa94b45763e4c7f6e3f02379e2fcb8dd986db479dcab40eff5fc62a91 - languageName: node - linkType: hard - -"@types/react-router@npm:*, @types/react-router@npm:^5.1.0": - version: 5.1.20 - resolution: "@types/react-router@npm:5.1.20" - dependencies: - "@types/history": "npm:^4.7.11" - "@types/react": "npm:*" - checksum: 10c0/1f7eee61981d2f807fa01a34a0ef98ebc0774023832b6611a69c7f28fdff01de5a38cabf399f32e376bf8099dcb7afaf724775bea9d38870224492bea4cb5737 - languageName: node - linkType: hard - "@types/react-test-renderer@npm:^19.0.0": version: 19.1.0 resolution: "@types/react-test-renderer@npm:19.1.0" @@ -5862,31 +4578,6 @@ __metadata: languageName: node linkType: hard -"@types/responselike@npm:^1.0.0": - version: 1.0.0 - resolution: "@types/responselike@npm:1.0.0" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/474ac2402e6d43c007eee25f50d01eb1f67255ca83dd8e036877292bbe8dd5d2d1e50b54b408e233b50a8c38e681ff3ebeaf22f18b478056eddb65536abb003a - languageName: node - linkType: hard - -"@types/retry@npm:0.12.0": - version: 0.12.0 - resolution: "@types/retry@npm:0.12.0" - checksum: 10c0/7c5c9086369826f569b83a4683661557cab1361bac0897a1cefa1a915ff739acd10ca0d62b01071046fe3f5a3f7f2aec80785fe283b75602dc6726781ea3e328 - languageName: node - linkType: hard - -"@types/sax@npm:^1.2.1": - version: 1.2.4 - resolution: "@types/sax@npm:1.2.4" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/68beed153fce3bbae0f36b2c083d5a9dc82ae3460592c7f7d087ac07003be181fe03856821169ce6d3f83790448625b74c7ac4422303d003c76b95a50170de2f - languageName: node - linkType: hard - "@types/semver@npm:^7.3.12": version: 7.7.0 resolution: "@types/semver@npm:7.7.0" @@ -5901,90 +4592,35 @@ __metadata: languageName: node linkType: hard -"@types/send@npm:*": - version: 0.17.1 - resolution: "@types/send@npm:0.17.1" - dependencies: - "@types/mime": "npm:^1" - "@types/node": "npm:*" - checksum: 10c0/1aad6bfafdaa3a3cadad1b441843dfd166821c0e93513daabe979de85b552a1298cfb6f07d40f80b5ecf14a3194dc148deb138605039841f1dadc7132c73e634 +"@types/stack-utils@npm:^2.0.0": + version: 2.0.1 + resolution: "@types/stack-utils@npm:2.0.1" + checksum: 10c0/3327ee919a840ffe907bbd5c1d07dfd79137dd9732d2d466cf717ceec5bb21f66296173c53bb56cff95fae4185b9cd6770df3e9745fe4ba528bbc4975f54d13f languageName: node linkType: hard -"@types/serve-index@npm:^1.9.1": - version: 1.9.1 - resolution: "@types/serve-index@npm:1.9.1" - dependencies: - "@types/express": "npm:*" - checksum: 10c0/ed1ac8407101a787ebf09164a81bc24248ccf9d9789cd4eaa360a9a06163e5d2168c46ab0ddf2007e47b455182ecaa7632a886639919d9d409a27f7aef4e847a +"@types/yargs-parser@npm:*": + version: 20.2.1 + resolution: "@types/yargs-parser@npm:20.2.1" + checksum: 10c0/9171590c7f6762fa753cfe25b3d61f468ed4eebc011c3856fffc4937b14bff03b6b02fe93246ae7e01c4e09a6c3aa980a1637d7171869e32041992340f5445bc languageName: node linkType: hard -"@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10": - version: 1.15.2 - resolution: "@types/serve-static@npm:1.15.2" +"@types/yargs@npm:^15.0.0": + version: 15.0.14 + resolution: "@types/yargs@npm:15.0.14" dependencies: - "@types/http-errors": "npm:*" - "@types/mime": "npm:*" - "@types/node": "npm:*" - checksum: 10c0/5e7b3e17b376f8910d5c9a0b1def38d7841c8939713940098f1b80a330d5caa9cfe9b632c122252cd70165052439e18fafa46635dc55b1d6058343901eec22eb + "@types/yargs-parser": "npm:*" + checksum: 10c0/49eb8ad456c218a6dc8abd90a6f635a3ef44bb59161fbee2e9208f86fcb931668bb3559cad8cfe9a84d9c32b98034e37fefc2d728c3a077784b51971f0766b2e languageName: node linkType: hard -"@types/sockjs@npm:^0.3.33": - version: 0.3.33 - resolution: "@types/sockjs@npm:0.3.33" +"@types/yargs@npm:^17.0.8": + version: 17.0.24 + resolution: "@types/yargs@npm:17.0.24" dependencies: - "@types/node": "npm:*" - checksum: 10c0/75b9b2839970ebab3e557955b9e2b1091d87cefabee1023e566bccc093411acc4a1402f3da4fde18aca44f5b9c42fe0626afd073a2140002b9b53eb71a084e4d - languageName: node - linkType: hard - -"@types/stack-utils@npm:^2.0.0": - version: 2.0.1 - resolution: "@types/stack-utils@npm:2.0.1" - checksum: 10c0/3327ee919a840ffe907bbd5c1d07dfd79137dd9732d2d466cf717ceec5bb21f66296173c53bb56cff95fae4185b9cd6770df3e9745fe4ba528bbc4975f54d13f - languageName: node - linkType: hard - -"@types/unist@npm:^2, @types/unist@npm:^2.0.0, @types/unist@npm:^2.0.2, @types/unist@npm:^2.0.3": - version: 2.0.7 - resolution: "@types/unist@npm:2.0.7" - checksum: 10c0/ecfb4ad9909ba9390fc3b6923a1d783e99753b0687f5cd99a0e56b6c05e1c72bf4e55cb1b8c0ffda49c6cbead4636de351a130f63d7648c554dc526038733b25 - languageName: node - linkType: hard - -"@types/ws@npm:^8.5.5": - version: 8.5.9 - resolution: "@types/ws@npm:8.5.9" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/678bdd6461c4653f2975c537fb673cb1918c331558e2d2422b69761c9ced67200bb07c664e2593f3864077a891cb7c13ef2a40d303b4aacb06173d095d8aa3ce - languageName: node - linkType: hard - -"@types/yargs-parser@npm:*": - version: 20.2.1 - resolution: "@types/yargs-parser@npm:20.2.1" - checksum: 10c0/9171590c7f6762fa753cfe25b3d61f468ed4eebc011c3856fffc4937b14bff03b6b02fe93246ae7e01c4e09a6c3aa980a1637d7171869e32041992340f5445bc - languageName: node - linkType: hard - -"@types/yargs@npm:^15.0.0": - version: 15.0.14 - resolution: "@types/yargs@npm:15.0.14" - dependencies: - "@types/yargs-parser": "npm:*" - checksum: 10c0/49eb8ad456c218a6dc8abd90a6f635a3ef44bb59161fbee2e9208f86fcb931668bb3559cad8cfe9a84d9c32b98034e37fefc2d728c3a077784b51971f0766b2e - languageName: node - linkType: hard - -"@types/yargs@npm:^17.0.8": - version: 17.0.24 - resolution: "@types/yargs@npm:17.0.24" - dependencies: - "@types/yargs-parser": "npm:*" - checksum: 10c0/fbebf57e1d04199e5e7eb0c67a402566fa27177ee21140664e63da826408793d203d262b48f8f41d4a7665126393d2e952a463e960e761226def247d9bbcdbd0 + "@types/yargs-parser": "npm:*" + checksum: 10c0/fbebf57e1d04199e5e7eb0c67a402566fa27177ee21140664e63da826408793d203d262b48f8f41d4a7665126393d2e952a463e960e761226def247d9bbcdbd0 languageName: node linkType: hard @@ -6329,157 +4965,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/ast@npm:1.12.1" - dependencies: - "@webassemblyjs/helper-numbers": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - checksum: 10c0/ba7f2b96c6e67e249df6156d02c69eb5f1bd18d5005303cdc42accb053bebbbde673826e54db0437c9748e97abd218366a1d13fa46859b23cde611b6b409998c - languageName: node - linkType: hard - -"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" - checksum: 10c0/37fe26f89e18e4ca0e7d89cfe3b9f17cfa327d7daf906ae01400416dbb2e33c8a125b4dc55ad7ff405e5fcfb6cf0d764074c9bc532b9a31a71e762be57d2ea0a - languageName: node - linkType: hard - -"@webassemblyjs/helper-api-error@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" - checksum: 10c0/a681ed51863e4ff18cf38d223429f414894e5f7496856854d9a886eeddcee32d7c9f66290f2919c9bb6d2fc2b2fae3f989b6a1e02a81e829359738ea0c4d371a - languageName: node - linkType: hard - -"@webassemblyjs/helper-buffer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" - checksum: 10c0/0270724afb4601237410f7fd845ab58ccda1d5456a8783aadfb16eaaf3f2c9610c28e4a5bcb6ad880cde5183c82f7f116d5ccfc2310502439d33f14b6888b48a - languageName: node - linkType: hard - -"@webassemblyjs/helper-numbers@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" - dependencies: - "@webassemblyjs/floating-point-hex-parser": "npm:1.11.6" - "@webassemblyjs/helper-api-error": "npm:1.11.6" - "@xtuc/long": "npm:4.2.2" - checksum: 10c0/c7d5afc0ff3bd748339b466d8d2f27b908208bf3ff26b2e8e72c39814479d486e0dca6f3d4d776fd9027c1efe05b5c0716c57a23041eb34473892b2731c33af3 - languageName: node - linkType: hard - -"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" - checksum: 10c0/79d2bebdd11383d142745efa32781249745213af8e022651847382685ca76709f83e1d97adc5f0d3c2b8546bf02864f8b43a531fdf5ca0748cb9e4e0ef2acaa5 - languageName: node - linkType: hard - -"@webassemblyjs/helper-wasm-section@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - checksum: 10c0/0546350724d285ae3c26e6fc444be4c3b5fb824f3be0ec8ceb474179dc3f4430336dd2e36a44b3e3a1a6815960e5eec98cd9b3a8ec66dc53d86daedd3296a6a2 - languageName: node - linkType: hard - -"@webassemblyjs/ieee754@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/ieee754@npm:1.11.6" - dependencies: - "@xtuc/ieee754": "npm:^1.2.0" - checksum: 10c0/59de0365da450322c958deadade5ec2d300c70f75e17ae55de3c9ce564deff5b429e757d107c7ec69bd0ba169c6b6cc2ff66293ab7264a7053c829b50ffa732f - languageName: node - linkType: hard - -"@webassemblyjs/leb128@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/leb128@npm:1.11.6" - dependencies: - "@xtuc/long": "npm:4.2.2" - checksum: 10c0/cb344fc04f1968209804de4da018679c5d4708a03b472a33e0fa75657bb024978f570d3ccf9263b7f341f77ecaa75d0e051b9cd4b7bb17a339032cfd1c37f96e - languageName: node - linkType: hard - -"@webassemblyjs/utf8@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/utf8@npm:1.11.6" - checksum: 10c0/14d6c24751a89ad9d801180b0d770f30a853c39f035a15fbc96266d6ac46355227abd27a3fd2eeaa97b4294ced2440a6b012750ae17bafe1a7633029a87b6bee - languageName: node - linkType: hard - -"@webassemblyjs/wasm-edit@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/helper-wasm-section": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-opt": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - "@webassemblyjs/wast-printer": "npm:1.12.1" - checksum: 10c0/972f5e6c522890743999e0ed45260aae728098801c6128856b310dd21f1ee63435fc7b518e30e0ba1cdafd0d1e38275829c1e4451c3536a1d9e726e07a5bba0b - languageName: node - linkType: hard - -"@webassemblyjs/wasm-gen@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 10c0/1e257288177af9fa34c69cab94f4d9036ebed611f77f3897c988874e75182eeeec759c79b89a7a49dd24624fc2d3d48d5580b62b67c4a1c9bfbdcd266b281c16 - languageName: node - linkType: hard - -"@webassemblyjs/wasm-opt@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - checksum: 10c0/992a45e1f1871033c36987459436ab4e6430642ca49328e6e32a13de9106fe69ae6c0ac27d7050efd76851e502d11cd1ac0e06b55655dfa889ad82f11a2712fb - languageName: node - linkType: hard - -"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-api-error": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 10c0/e85cec1acad07e5eb65b92d37c8e6ca09c6ca50d7ca58803a1532b452c7321050a0328c49810c337cc2dfd100c5326a54d5ebd1aa5c339ebe6ef10c250323a0e - languageName: node - linkType: hard - -"@webassemblyjs/wast-printer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wast-printer@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@xtuc/long": "npm:4.2.2" - checksum: 10c0/39bf746eb7a79aa69953f194943bbc43bebae98bd7cadd4d8bc8c0df470ca6bf9d2b789effaa180e900fab4e2691983c1f7d41571458bd2a26267f2f0c73705a - languageName: node - linkType: hard - "@xmldom/xmldom@npm:^0.7.7": version: 0.7.10 resolution: "@xmldom/xmldom@npm:0.7.10" @@ -6487,21 +4972,7 @@ __metadata: languageName: node linkType: hard -"@xtuc/ieee754@npm:^1.2.0": - version: 1.2.0 - resolution: "@xtuc/ieee754@npm:1.2.0" - checksum: 10c0/a8565d29d135039bd99ae4b2220d3e167d22cf53f867e491ed479b3f84f895742d0097f935b19aab90265a23d5d46711e4204f14c479ae3637fbf06c4666882f - languageName: node - linkType: hard - -"@xtuc/long@npm:4.2.2": - version: 4.2.2 - resolution: "@xtuc/long@npm:4.2.2" - checksum: 10c0/8582cbc69c79ad2d31568c412129bf23d2b1210a1dfb60c82d5a1df93334da4ee51f3057051658569e2c196d8dc33bc05ae6b974a711d0d16e801e1d0647ccd1 - languageName: node - linkType: hard - -"abbrev@npm:1, abbrev@npm:^1.0.0": +"abbrev@npm:^1.0.0": version: 1.1.1 resolution: "abbrev@npm:1.1.1" checksum: 10c0/3f762677702acb24f65e813070e306c61fafe25d4b2583f9dfc935131f774863f3addd5741572ed576bd69cabe473c5af18e1e108b829cb7b6b4747884f726e6 @@ -6517,7 +4988,7 @@ __metadata: languageName: node linkType: hard -"accepts@npm:^1.3.7, accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.7, accepts@npm:~1.3.8": +"accepts@npm:^1.3.7, accepts@npm:~1.3.5, accepts@npm:~1.3.7": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -6527,15 +4998,6 @@ __metadata: languageName: node linkType: hard -"acorn-import-attributes@npm:^1.9.5": - version: 1.9.5 - resolution: "acorn-import-attributes@npm:1.9.5" - peerDependencies: - acorn: ^8 - checksum: 10c0/5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d - languageName: node - linkType: hard - "acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -6545,22 +5007,6 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.0.0": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 10c0/dbe92f5b2452c93e960c5594e666dd1fae141b965ff2cb4a1e1d0381e3e4db4274c5ce4ffa3d681a86ca2a8d4e29d5efc0670a08e23fd2800051ea387df56ca2 - languageName: node - linkType: hard - -"acorn@npm:^8.0.4, acorn@npm:^8.7.1, acorn@npm:^8.8.2": - version: 8.11.2 - resolution: "acorn@npm:8.11.2" - bin: - acorn: bin/acorn - checksum: 10c0/a3ed76c761b75ec54b1ec3068fb7f113a182e95aea7f322f65098c2958d232e3d211cb6dac35ff9c647024b63714bc528a26d54a925d1fef2c25585b4c8e4017 - languageName: node - linkType: hard - "acorn@npm:^8.15.0": version: 8.15.0 resolution: "acorn@npm:8.15.0" @@ -6570,10 +5016,12 @@ __metadata: languageName: node linkType: hard -"address@npm:^1.0.1, address@npm:^1.1.2": - version: 1.2.2 - resolution: "address@npm:1.2.2" - checksum: 10c0/1c8056b77fb124456997b78ed682ecc19d2fd7ea8bd5850a2aa8c3e3134c913847c57bcae418622efd32ba858fa1e242a40a251ac31da0515664fc0ac03a047d +"acorn@npm:^8.8.2": + version: 8.11.2 + resolution: "acorn@npm:8.11.2" + bin: + acorn: bin/acorn + checksum: 10c0/a3ed76c761b75ec54b1ec3068fb7f113a182e95aea7f322f65098c2958d232e3d211cb6dac35ff9c647024b63714bc528a26d54a925d1fef2c25585b4c8e4017 languageName: node linkType: hard @@ -6624,41 +5072,7 @@ __metadata: languageName: node linkType: hard -"ajv-formats@npm:^2.1.1": - version: 2.1.1 - resolution: "ajv-formats@npm:2.1.1" - dependencies: - ajv: "npm:^8.0.0" - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - checksum: 10c0/e43ba22e91b6a48d96224b83d260d3a3a561b42d391f8d3c6d2c1559f9aa5b253bfb306bc94bbeca1d967c014e15a6efe9a207309e95b3eaae07fcbcdc2af662 - languageName: node - linkType: hard - -"ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2": - version: 3.5.2 - resolution: "ajv-keywords@npm:3.5.2" - peerDependencies: - ajv: ^6.9.1 - checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 - languageName: node - linkType: hard - -"ajv-keywords@npm:^5.1.0": - version: 5.1.0 - resolution: "ajv-keywords@npm:5.1.0" - dependencies: - fast-deep-equal: "npm:^3.1.3" - peerDependencies: - ajv: ^8.8.2 - checksum: 10c0/18bec51f0171b83123ba1d8883c126e60c6f420cef885250898bf77a8d3e65e3bfb9e8564f497e30bdbe762a83e0d144a36931328616a973ee669dc74d4a9590 - languageName: node - linkType: hard - -"ajv@npm:^6.12.2, ajv@npm:^6.12.4, ajv@npm:^6.12.5": +"ajv@npm:^6.12.4": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -6670,7 +5084,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.9.0": +"ajv@npm:^8.0.0": version: 8.12.0 resolution: "ajv@npm:8.12.0" dependencies: @@ -6682,39 +5096,6 @@ __metadata: languageName: node linkType: hard -"algoliasearch-helper@npm:^3.10.0": - version: 3.14.0 - resolution: "algoliasearch-helper@npm:3.14.0" - dependencies: - "@algolia/events": "npm:^4.0.1" - peerDependencies: - algoliasearch: ">= 3.1 < 6" - checksum: 10c0/8c60aae2bcaa3f8eb547fd48cec0089a329dc5fec05e6c7364642fb2353256f11e4402ea3cec58c4a2bdad6a1720980fbd7dbab51be0b37b13a26b78705ddcc9 - languageName: node - linkType: hard - -"algoliasearch@npm:^4.0.0, algoliasearch@npm:^4.13.1": - version: 4.19.1 - resolution: "algoliasearch@npm:4.19.1" - dependencies: - "@algolia/cache-browser-local-storage": "npm:4.19.1" - "@algolia/cache-common": "npm:4.19.1" - "@algolia/cache-in-memory": "npm:4.19.1" - "@algolia/client-account": "npm:4.19.1" - "@algolia/client-analytics": "npm:4.19.1" - "@algolia/client-common": "npm:4.19.1" - "@algolia/client-personalization": "npm:4.19.1" - "@algolia/client-search": "npm:4.19.1" - "@algolia/logger-common": "npm:4.19.1" - "@algolia/logger-console": "npm:4.19.1" - "@algolia/requester-browser-xhr": "npm:4.19.1" - "@algolia/requester-common": "npm:4.19.1" - "@algolia/requester-node-http": "npm:4.19.1" - "@algolia/transporter": "npm:4.19.1" - checksum: 10c0/f88f08113e0e852daf3613d1cf35d166aafcbd1505c0c8ef4f04e1041cf51240e463b22a900b9fb7b6fb5b4567159c8368a3c794e95c7ea26ae7f83d56069f83 - languageName: node - linkType: hard - "anser@npm:^1.4.9": version: 1.4.10 resolution: "anser@npm:1.4.10" @@ -6722,15 +5103,6 @@ __metadata: languageName: node linkType: hard -"ansi-align@npm:^3.0.0, ansi-align@npm:^3.0.1": - version: 3.0.1 - resolution: "ansi-align@npm:3.0.1" - dependencies: - string-width: "npm:^4.1.0" - checksum: 10c0/ad8b755a253a1bc8234eb341e0cec68a857ab18bf97ba2bda529e86f6e30460416523e0ec58c32e5c21f0ca470d779503244892873a5895dbd0c39c788e82467 - languageName: node - linkType: hard - "ansi-colors@npm:^4.1.1, ansi-colors@npm:^4.1.3": version: 4.1.3 resolution: "ansi-colors@npm:4.1.3" @@ -6758,15 +5130,6 @@ __metadata: languageName: node linkType: hard -"ansi-html-community@npm:^0.0.8": - version: 0.0.8 - resolution: "ansi-html-community@npm:0.0.8" - bin: - ansi-html: bin/ansi-html - checksum: 10c0/45d3a6f0b4f10b04fdd44bef62972e2470bfd917bf00439471fa7473d92d7cbe31369c73db863cc45dda115cb42527f39e232e9256115534b8ee5806b0caeed4 - languageName: node - linkType: hard - "ansi-regex@npm:^4.1.0": version: 4.1.1 resolution: "ansi-regex@npm:4.1.1" @@ -6781,13 +5144,6 @@ __metadata: languageName: node linkType: hard -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 - languageName: node - linkType: hard - "ansi-styles@npm:^3.2.0, ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" @@ -6813,14 +5169,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c - languageName: node - linkType: hard - -"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": +"anymatch@npm:^3.0.3": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -6854,13 +5203,6 @@ __metadata: languageName: node linkType: hard -"arg@npm:^5.0.0": - version: 5.0.2 - resolution: "arg@npm:5.0.2" - checksum: 10c0/ccaf86f4e05d342af6666c569f844bec426595c567d32a8289715087825c2ca7edd8a3d204e4d2fb2aa4602e09a57d0c13ea8c9eea75aac3dbb4af5514e6800e - languageName: node - linkType: hard - "argparse@npm:^1.0.7": version: 1.0.10 resolution: "argparse@npm:1.0.10" @@ -6907,20 +5249,6 @@ __metadata: languageName: node linkType: hard -"array-flatten@npm:1.1.1": - version: 1.1.1 - resolution: "array-flatten@npm:1.1.1" - checksum: 10c0/806966c8abb2f858b08f5324d9d18d7737480610f3bd5d3498aaae6eb5efdc501a884ba019c9b4a8f02ff67002058749d05548fd42fa8643f02c9c7f22198b91 - languageName: node - linkType: hard - -"array-flatten@npm:^2.1.2": - version: 2.1.2 - resolution: "array-flatten@npm:2.1.2" - checksum: 10c0/bdc1cee68e41bec9cfc1161408734e2269428ef371445606bce4e6241001e138a94b9a617cc9a5b4b7fe6a3a51e3d5a942646975ce82a2e202ccf3e9b478c82f - languageName: node - linkType: hard - "array-includes@npm:^3.1.2": version: 3.1.7 resolution: "array-includes@npm:3.1.7" @@ -7049,7 +5377,7 @@ __metadata: languageName: node linkType: hard -"asap@npm:~2.0.3, asap@npm:~2.0.6": +"asap@npm:~2.0.6": version: 2.0.6 resolution: "asap@npm:2.0.6" checksum: 10c0/c6d5e39fe1f15e4b87677460bd66b66050cd14c772269cee6688824c1410a08ab20254bb6784f9afb75af9144a9f9a7692d49547f4d19d715aeb7c0318f3136d @@ -7070,53 +5398,6 @@ __metadata: languageName: node linkType: hard -"async-storage-website@workspace:packages/website": - version: 0.0.0-use.local - resolution: "async-storage-website@workspace:packages/website" - dependencies: - "@docusaurus/core": "npm:^2.4.0" - "@docusaurus/preset-classic": "npm:^2.4.0" - classnames: "npm:^2.2.6" - docusaurus-lunr-search: "npm:^3.4.0" - react: "npm:^18.2.0" - react-dom: "npm:^18.2.0" - languageName: unknown - linkType: soft - -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 10c0/4c058baf6df1bc5a1697cf182e2029c58cd99975288a13f9e70068ef5d6f4e1f1fd7c4d2c3c4912eae44797d1725be9700995736deca441b39f3e66d8dee97ef - languageName: node - linkType: hard - -"autocomplete.js@npm:^0.37.0": - version: 0.37.1 - resolution: "autocomplete.js@npm:0.37.1" - dependencies: - immediate: "npm:^3.2.3" - checksum: 10c0/89fe763d43afb528387d7eb1a7ecba6bfec09721be3a961c0f044765a878ea1fc4202f20e32af042191a0c260ede50d7619087a2e57a0480b84c9035c67cbee3 - languageName: node - linkType: hard - -"autoprefixer@npm:^10.4.12, autoprefixer@npm:^10.4.7": - version: 10.4.15 - resolution: "autoprefixer@npm:10.4.15" - dependencies: - browserslist: "npm:^4.21.10" - caniuse-lite: "npm:^1.0.30001520" - fraction.js: "npm:^4.2.0" - normalize-range: "npm:^0.1.2" - picocolors: "npm:^1.0.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.1.0 - bin: - autoprefixer: bin/autoprefixer - checksum: 10c0/38f1eddd131c380b49cc664785635ee6505ef3e62140402b921a8d394fe99b74404689f9d0a27026791dc1683b59c08d99339178c48ba54e27d8f994a992b5b2 - languageName: node - linkType: hard - "available-typed-arrays@npm:^1.0.5": version: 1.0.5 resolution: "available-typed-arrays@npm:1.0.5" @@ -7133,15 +5414,6 @@ __metadata: languageName: node linkType: hard -"axios@npm:^0.25.0": - version: 0.25.0 - resolution: "axios@npm:0.25.0" - dependencies: - follow-redirects: "npm:^1.14.7" - checksum: 10c0/33475dc847e8494341db5ff5d3ce3a830e511d9698eda1e2507618a0a875ca774e7c59b9194c70664e886699b5917416175da2ea5ccb67a2945f7cdc939d7c56 - languageName: node - linkType: hard - "babel-jest@npm:^29.7.0": version: 29.7.0 resolution: "babel-jest@npm:29.7.0" @@ -7159,51 +5431,6 @@ __metadata: languageName: node linkType: hard -"babel-loader@npm:^8.2.5": - version: 8.3.0 - resolution: "babel-loader@npm:8.3.0" - dependencies: - find-cache-dir: "npm:^3.3.1" - loader-utils: "npm:^2.0.0" - make-dir: "npm:^3.1.0" - schema-utils: "npm:^2.6.5" - peerDependencies: - "@babel/core": ^7.0.0 - webpack: ">=2" - checksum: 10c0/7b83bae35a12fbc5cdf250e2d36a288305fe5b6d20ab044ab7c09bbf456c8895b80af7a4f1e8b64b5c07a4fd48d4b5144dab40b4bc72a4fed532dc000362f38f - languageName: node - linkType: hard - -"babel-plugin-apply-mdx-type-prop@npm:1.6.22": - version: 1.6.22 - resolution: "babel-plugin-apply-mdx-type-prop@npm:1.6.22" - dependencies: - "@babel/helper-plugin-utils": "npm:7.10.4" - "@mdx-js/util": "npm:1.6.22" - peerDependencies: - "@babel/core": ^7.11.6 - checksum: 10c0/d1fd88f2eee87f3d709373cfac5165f8407793b123e1c7061308311f7e6b0778e093a4a93e7130b47c5a742f2515d0c1d4f3da5097ff195ef91011688ec17ddc - languageName: node - linkType: hard - -"babel-plugin-dynamic-import-node@npm:^2.3.3": - version: 2.3.3 - resolution: "babel-plugin-dynamic-import-node@npm:2.3.3" - dependencies: - object.assign: "npm:^4.1.0" - checksum: 10c0/1bd80df981e1fc1aff0cd4e390cf27aaa34f95f7620cd14dff07ba3bad56d168c098233a7d2deb2c9b1dc13643e596a6b94fc608a3412ee3c56e74a25cd2167e - languageName: node - linkType: hard - -"babel-plugin-extract-import-names@npm:1.6.22": - version: 1.6.22 - resolution: "babel-plugin-extract-import-names@npm:1.6.22" - dependencies: - "@babel/helper-plugin-utils": "npm:7.10.4" - checksum: 10c0/c7b7206222f7b70f2c9852caa621cc3742b5d9f7dd4229a6e3c560d7683b82f835a8ea46db632df5dab5ad91b1439ead3771a8576a7a14e418248c16fd1f0cc4 - languageName: node - linkType: hard - "babel-plugin-istanbul@npm:^6.1.1": version: 6.1.1 resolution: "babel-plugin-istanbul@npm:6.1.1" @@ -7326,13 +5553,6 @@ __metadata: languageName: node linkType: hard -"bail@npm:^1.0.0": - version: 1.0.5 - resolution: "bail@npm:1.0.5" - checksum: 10c0/4cf7d0b5c82fdc69590b3fe85c17c4ec37647681b20875551fd6187a85c122b20178dc118001d3ebd5d0ab3dc0e95637c71f889f481882ee761db43c6b16fa05 - languageName: node - linkType: hard - "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -7340,13 +5560,6 @@ __metadata: languageName: node linkType: hard -"base16@npm:^1.0.0": - version: 1.0.0 - resolution: "base16@npm:1.0.0" - checksum: 10c0/af1aee7b297d968528ef47c8de2c5274029743e8a4a5f61ec823e36b673781691d124168cb22936c7997f53d89b344c58bf7ecf93eeb148cffa7e3fb4e4b8b18 - languageName: node - linkType: hard - "base64-js@npm:^1.3.1, base64-js@npm:^1.5.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" @@ -7354,20 +5567,6 @@ __metadata: languageName: node linkType: hard -"batch@npm:0.6.1": - version: 0.6.1 - resolution: "batch@npm:0.6.1" - checksum: 10c0/925a13897b4db80d4211082fe287bcf96d297af38e26448c857cee3e095c9792e3b8f26b37d268812e7f38a589f694609de8534a018b1937d7dc9f84e6b387c5 - languageName: node - linkType: hard - -"bcp-47-match@npm:^1.0.0": - version: 1.0.3 - resolution: "bcp-47-match@npm:1.0.3" - checksum: 10c0/f48377b5a0511ff77926ef9cb41befc6c006b562f83da80b3bdd32be45b07aeb9d0e315293407600eaa7211d8ab178c953043b17436b9ebaee22b882d573a31a - languageName: node - linkType: hard - "better-path-resolve@npm:1.0.0": version: 1.0.0 resolution: "better-path-resolve@npm:1.0.0" @@ -7377,20 +5576,6 @@ __metadata: languageName: node linkType: hard -"big.js@npm:^5.2.2": - version: 5.2.2 - resolution: "big.js@npm:5.2.2" - checksum: 10c0/230520f1ff920b2d2ce3e372d77a33faa4fa60d802fe01ca4ffbc321ee06023fe9a741ac02793ee778040a16b7e497f7d60c504d1c402b8fdab6f03bb785a25f - languageName: node - linkType: hard - -"binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: 10c0/d73d8b897238a2d3ffa5f59c0241870043aa7471335e89ea5e1ff48edb7c2d0bb471517a3e4c5c3f4c043615caa2717b5f80a5e61e07503d51dc85cb848e665d - languageName: node - linkType: hard - "bl@npm:^4.1.0": version: 4.1.0 resolution: "bl@npm:4.1.0" @@ -7402,94 +5587,23 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.1": - version: 1.20.1 - resolution: "body-parser@npm:1.20.1" +"body-parser@npm:^1.20.3": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" dependencies: bytes: "npm:3.1.2" - content-type: "npm:~1.0.4" + content-type: "npm:~1.0.5" debug: "npm:2.6.9" depd: "npm:2.0.0" destroy: "npm:1.2.0" http-errors: "npm:2.0.0" iconv-lite: "npm:0.4.24" on-finished: "npm:2.4.1" - qs: "npm:6.11.0" - raw-body: "npm:2.5.1" + qs: "npm:6.13.0" + raw-body: "npm:2.5.2" type-is: "npm:~1.6.18" unpipe: "npm:1.0.0" - checksum: 10c0/a202d493e2c10a33fb7413dac7d2f713be579c4b88343cd814b6df7a38e5af1901fc31044e04de176db56b16d9772aa25a7723f64478c20f4d91b1ac223bf3b8 - languageName: node - linkType: hard - -"body-parser@npm:^1.20.3": - version: 1.20.3 - resolution: "body-parser@npm:1.20.3" - dependencies: - bytes: "npm:3.1.2" - content-type: "npm:~1.0.5" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - on-finished: "npm:2.4.1" - qs: "npm:6.13.0" - raw-body: "npm:2.5.2" - type-is: "npm:~1.6.18" - unpipe: "npm:1.0.0" - checksum: 10c0/0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310 - languageName: node - linkType: hard - -"bonjour-service@npm:^1.0.11": - version: 1.1.1 - resolution: "bonjour-service@npm:1.1.1" - dependencies: - array-flatten: "npm:^2.1.2" - dns-equal: "npm:^1.0.0" - fast-deep-equal: "npm:^3.1.3" - multicast-dns: "npm:^7.2.5" - checksum: 10c0/8dd3fef3ff8a11678d8f586be03c85004a45bae4353c55d7dbffe288cad73ddb38dee08b57425b9945c9a3a840d50bd40ae5aeda0066186dabe4b84a315b4e05 - languageName: node - linkType: hard - -"boolbase@npm:^1.0.0": - version: 1.0.0 - resolution: "boolbase@npm:1.0.0" - checksum: 10c0/e4b53deb4f2b85c52be0e21a273f2045c7b6a6ea002b0e139c744cb6f95e9ec044439a52883b0d74dedd1ff3da55ed140cfdddfed7fb0cccbed373de5dce1bcf - languageName: node - linkType: hard - -"boxen@npm:^5.0.0": - version: 5.1.2 - resolution: "boxen@npm:5.1.2" - dependencies: - ansi-align: "npm:^3.0.0" - camelcase: "npm:^6.2.0" - chalk: "npm:^4.1.0" - cli-boxes: "npm:^2.2.1" - string-width: "npm:^4.2.2" - type-fest: "npm:^0.20.2" - widest-line: "npm:^3.1.0" - wrap-ansi: "npm:^7.0.0" - checksum: 10c0/71f31c2eb3dcacd5fce524ae509e0cc90421752e0bfbd0281fd3352871d106c462a0f810c85f2fdb02f3a9fab2d7a84e9718b4999384d651b76104ebe5d2c024 - languageName: node - linkType: hard - -"boxen@npm:^6.2.1": - version: 6.2.1 - resolution: "boxen@npm:6.2.1" - dependencies: - ansi-align: "npm:^3.0.1" - camelcase: "npm:^6.2.0" - chalk: "npm:^4.1.2" - cli-boxes: "npm:^3.0.0" - string-width: "npm:^5.0.1" - type-fest: "npm:^2.5.0" - widest-line: "npm:^4.0.1" - wrap-ansi: "npm:^8.0.1" - checksum: 10c0/2a50d059c950a50d9f3c873093702747740814ce8819225c4f8cbe92024c9f5a9219d2b7128f5cfa17c022644d929bbbc88b9591de67249c6ebe07f7486bdcfd + checksum: 10c0/0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310 languageName: node linkType: hard @@ -7512,7 +5626,7 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.3, braces@npm:~3.0.2": +"braces@npm:^3.0.3": version: 3.0.3 resolution: "braces@npm:3.0.3" dependencies: @@ -7521,7 +5635,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.20.4, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0": +"browserslist@npm:^4.20.4, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0": version: 4.24.0 resolution: "browserslist@npm:4.24.0" dependencies: @@ -7601,21 +5715,6 @@ __metadata: languageName: node linkType: hard -"cacheable-request@npm:^6.0.0": - version: 6.1.0 - resolution: "cacheable-request@npm:6.1.0" - dependencies: - clone-response: "npm:^1.0.2" - get-stream: "npm:^5.1.0" - http-cache-semantics: "npm:^4.0.0" - keyv: "npm:^3.0.0" - lowercase-keys: "npm:^2.0.0" - normalize-url: "npm:^4.1.0" - responselike: "npm:^1.0.2" - checksum: 10c0/e92f2b2078c014ba097647ab4ff6a6149dc2974a65670ee97ec593ec9f4148ecc988e86b9fcd8ebf7fe255774a53d5dc3db6b01065d44f09a7452c7a7d8e4844 - languageName: node - linkType: hard - "call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": version: 1.0.2 resolution: "call-bind-apply-helpers@npm:1.0.2" @@ -7691,23 +5790,6 @@ __metadata: languageName: node linkType: hard -"camel-case@npm:^4.1.2": - version: 4.1.2 - resolution: "camel-case@npm:4.1.2" - dependencies: - pascal-case: "npm:^3.1.2" - tslib: "npm:^2.0.3" - checksum: 10c0/bf9eefaee1f20edbed2e9a442a226793bc72336e2b99e5e48c6b7252b6f70b080fc46d8246ab91939e2af91c36cdd422e0af35161e58dd089590f302f8f64c8a - languageName: node - linkType: hard - -"camelcase-css@npm:2.0.1": - version: 2.0.1 - resolution: "camelcase-css@npm:2.0.1" - checksum: 10c0/1a1a3137e8a781e6cbeaeab75634c60ffd8e27850de410c162cce222ea331cd1ba5364e8fb21c95e5ca76f52ac34b81a090925ca00a87221355746d049c6e273 - languageName: node - linkType: hard - "camelcase-keys@npm:^7.0.0": version: 7.0.2 resolution: "camelcase-keys@npm:7.0.2" @@ -7734,32 +5816,13 @@ __metadata: languageName: node linkType: hard -"caniuse-api@npm:^3.0.0": - version: 3.0.0 - resolution: "caniuse-api@npm:3.0.0" - dependencies: - browserslist: "npm:^4.0.0" - caniuse-lite: "npm:^1.0.0" - lodash.memoize: "npm:^4.1.2" - lodash.uniq: "npm:^4.5.0" - checksum: 10c0/60f9e85a3331e6d761b1b03eec71ca38ef7d74146bece34694853033292156b815696573ed734b65583acf493e88163618eda915c6c826d46a024c71a9572b4c - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001520, caniuse-lite@npm:^1.0.30001663": +"caniuse-lite@npm:^1.0.30001663": version: 1.0.30001663 resolution: "caniuse-lite@npm:1.0.30001663" checksum: 10c0/6508e27bf7fdec657f26f318b1ab64ace6e1208ef9fedaf0975bc89046e0c683bfba837f108840ada1686ff09b8ffd01e05ac791dcf598b8f16eefb636875cf2 languageName: node linkType: hard -"ccount@npm:^1.0.0": - version: 1.1.0 - resolution: "ccount@npm:1.1.0" - checksum: 10c0/9ccfddfa45c8d6d01411b8e30d2ce03c55c33f32a69bdb84ee44d743427cdb01b03159954917023d0dac960c34973ba42626bb9fa883491ebb663a53a6713d43 - languageName: node - linkType: hard - "chalk@npm:^2.0.1, chalk@npm:^2.1.0, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -7788,27 +5851,6 @@ __metadata: languageName: node linkType: hard -"character-entities-legacy@npm:^1.0.0": - version: 1.1.4 - resolution: "character-entities-legacy@npm:1.1.4" - checksum: 10c0/ea4ca9c29887335eed86d78fc67a640168342b1274da84c097abb0575a253d1265281a5052f9a863979e952bcc267b4ecaaf4fe233a7e1e0d8a47806c65b96c7 - languageName: node - linkType: hard - -"character-entities@npm:^1.0.0": - version: 1.2.4 - resolution: "character-entities@npm:1.2.4" - checksum: 10c0/ad015c3d7163563b8a0ee1f587fb0ef305ef344e9fd937f79ca51cccc233786a01d591d989d5bf7b2e66b528ac9efba47f3b1897358324e69932f6d4b25adfe1 - languageName: node - linkType: hard - -"character-reference-invalid@npm:^1.0.0": - version: 1.1.4 - resolution: "character-reference-invalid@npm:1.1.4" - checksum: 10c0/29f05081c5817bd1e975b0bf61e77b60a40f62ad371d0f0ce0fdb48ab922278bc744d1fbe33771dced751887a8403f265ff634542675c8d7375f6ff4811efd0e - languageName: node - linkType: hard - "chardet@npm:^0.7.0": version: 0.7.0 resolution: "chardet@npm:0.7.0" @@ -7816,54 +5858,6 @@ __metadata: languageName: node linkType: hard -"cheerio-select@npm:^2.1.0": - version: 2.1.0 - resolution: "cheerio-select@npm:2.1.0" - dependencies: - boolbase: "npm:^1.0.0" - css-select: "npm:^5.1.0" - css-what: "npm:^6.1.0" - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - domutils: "npm:^3.0.1" - checksum: 10c0/2242097e593919dba4aacb97d7b8275def8b9ec70b00aa1f43335456870cfc9e284eae2080bdc832ed232dabb9eefcf56c722d152da4a154813fb8814a55d282 - languageName: node - linkType: hard - -"cheerio@npm:^1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "cheerio@npm:1.0.0-rc.12" - dependencies: - cheerio-select: "npm:^2.1.0" - dom-serializer: "npm:^2.0.0" - domhandler: "npm:^5.0.3" - domutils: "npm:^3.0.1" - htmlparser2: "npm:^8.0.1" - parse5: "npm:^7.0.0" - parse5-htmlparser2-tree-adapter: "npm:^7.0.0" - checksum: 10c0/c85d2f2461e3f024345b78e0bb16ad8e41492356210470dd1e7d5a91391da9fcf6c0a7cb48a9ba8820330153f0cedb4d0a60c7af15d96ecdb3092299b9d9c0cc - languageName: node - linkType: hard - -"chokidar@npm:^3.4.2, chokidar@npm:^3.5.3": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" - dependencies: - anymatch: "npm:~3.1.2" - braces: "npm:~3.0.2" - fsevents: "npm:~2.3.2" - glob-parent: "npm:~5.1.2" - is-binary-path: "npm:~2.1.0" - is-glob: "npm:~4.0.1" - normalize-path: "npm:~3.0.0" - readdirp: "npm:~3.6.0" - dependenciesMeta: - fsevents: - optional: true - checksum: 10c0/1076953093e0707c882a92c66c0f56ba6187831aa51bb4de878c1fec59ae611a3bf02898f190efec8e77a086b8df61c2b2a3ea324642a0558bdf8ee6c5dc9ca1 - languageName: node - linkType: hard - "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -7892,13 +5886,6 @@ __metadata: languageName: node linkType: hard -"chrome-trace-event@npm:^1.0.2": - version: 1.0.3 - resolution: "chrome-trace-event@npm:1.0.3" - checksum: 10c0/080ce2d20c2b9e0f8461a380e9585686caa768b1c834a464470c9dc74cda07f27611c7b727a2cd768a9cecd033297fdec4ce01f1e58b62227882c1059dec321c - languageName: node - linkType: hard - "chromium-edge-launcher@npm:^0.2.0": version: 0.2.0 resolution: "chromium-edge-launcher@npm:0.2.0" @@ -7934,22 +5921,6 @@ __metadata: languageName: node linkType: hard -"classnames@npm:^2.2.6": - version: 2.3.2 - resolution: "classnames@npm:2.3.2" - checksum: 10c0/cd50ead57b4f97436aaa9f9885c6926323efc7c2bea8e3d4eb10e4e972aa6a1cfca1c7a0e06f8a199ca7498d4339e30bb6002e589e61c9f21248cbf3e8b0b18d - languageName: node - linkType: hard - -"clean-css@npm:^5.2.2, clean-css@npm:^5.3.0": - version: 5.3.2 - resolution: "clean-css@npm:5.3.2" - dependencies: - source-map: "npm:~0.6.0" - checksum: 10c0/315e0e81306524bd2c1905fa6823bf7658be40799b78f446e5e6922808718d2b80266fb3e96842a06176fa683bc2c1a0d2827b08d154e2f9cf136d7bda909d33 - languageName: node - linkType: hard - "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -7966,20 +5937,6 @@ __metadata: languageName: node linkType: hard -"cli-boxes@npm:^2.2.1": - version: 2.2.1 - resolution: "cli-boxes@npm:2.2.1" - checksum: 10c0/6111352edbb2f62dbc7bfd58f2d534de507afed7f189f13fa894ce5a48badd94b2aa502fda28f1d7dd5f1eb456e7d4033d09a76660013ef50c7f66e7a034f050 - languageName: node - linkType: hard - -"cli-boxes@npm:^3.0.0": - version: 3.0.0 - resolution: "cli-boxes@npm:3.0.0" - checksum: 10c0/4db3e8fbfaf1aac4fb3a6cbe5a2d3fa048bee741a45371b906439b9ffc821c6e626b0f108bdcd3ddf126a4a319409aedcf39a0730573ff050fdd7b6731e99fb9 - languageName: node - linkType: hard - "cli-cursor@npm:^2.1.0": version: 2.1.0 resolution: "cli-cursor@npm:2.1.0" @@ -8005,19 +5962,6 @@ __metadata: languageName: node linkType: hard -"cli-table3@npm:^0.6.2": - version: 0.6.2 - resolution: "cli-table3@npm:0.6.2" - dependencies: - "@colors/colors": "npm:1.5.0" - string-width: "npm:^4.2.0" - dependenciesMeta: - "@colors/colors": - optional: true - checksum: 10c0/aaa87929d86ba36e651e0280ab34cc28660e13da9dd2b6f8aa36e800c40e331c32bff53597cb9126e8a2e88e7a9025aff9c240350fe69876207d51ba452ef5e0 - languageName: node - linkType: hard - "cliui@npm:^6.0.0": version: 6.0.0 resolution: "cliui@npm:6.0.0" @@ -8051,26 +5995,6 @@ __metadata: languageName: node linkType: hard -"clone-deep@npm:^4.0.1": - version: 4.0.1 - resolution: "clone-deep@npm:4.0.1" - dependencies: - is-plain-object: "npm:^2.0.4" - kind-of: "npm:^6.0.2" - shallow-clone: "npm:^3.0.0" - checksum: 10c0/637753615aa24adf0f2d505947a1bb75e63964309034a1cf56ba4b1f30af155201edd38d26ffe26911adaae267a3c138b344a4947d39f5fc1b6d6108125aa758 - languageName: node - linkType: hard - -"clone-response@npm:^1.0.2": - version: 1.0.3 - resolution: "clone-response@npm:1.0.3" - dependencies: - mimic-response: "npm:^1.0.0" - checksum: 10c0/06a2b611824efb128810708baee3bd169ec9a1bf5976a5258cd7eb3f7db25f00166c6eee5961f075c7e38e194f373d4fdf86b8166ad5b9c7e82bbd2e333a6087 - languageName: node - linkType: hard - "clone@npm:^1.0.2": version: 1.0.4 resolution: "clone@npm:1.0.4" @@ -8078,13 +6002,6 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^1.2.1": - version: 1.2.1 - resolution: "clsx@npm:1.2.1" - checksum: 10c0/34dead8bee24f5e96f6e7937d711978380647e936a22e76380290e35486afd8634966ce300fc4b74a32f3762c7d4c0303f442c3e259f4ce02374eb0c82834f27 - languageName: node - linkType: hard - "co@npm:^4.6.0": version: 4.6.0 resolution: "co@npm:4.6.0" @@ -8092,13 +6009,6 @@ __metadata: languageName: node linkType: hard -"collapse-white-space@npm:^1.0.2": - version: 1.0.6 - resolution: "collapse-white-space@npm:1.0.6" - checksum: 10c0/7fd27a883eee1ddd5e39c53fbcd4a42dfe2a65dfac70e2c442d20827f5258202b360a12e99b4f0128c3addd2d64796bb2eb1bb8a3b75d5a2e9c061adb549c36b - languageName: node - linkType: hard - "collect-v8-coverage@npm:^1.0.0": version: 1.0.2 resolution: "collect-v8-coverage@npm:1.0.2" @@ -8138,7 +6048,7 @@ __metadata: languageName: node linkType: hard -"color-support@npm:^1.1.2, color-support@npm:^1.1.3": +"color-support@npm:^1.1.3": version: 1.1.3 resolution: "color-support@npm:1.1.3" bin: @@ -8147,13 +6057,6 @@ __metadata: languageName: node linkType: hard -"colord@npm:^2.9.1": - version: 2.9.3 - resolution: "colord@npm:2.9.3" - checksum: 10c0/9699e956894d8996b28c686afe8988720785f476f59335c80ce852ded76ab3ebe252703aec53d9bef54f6219aea6b960fb3d9a8300058a1d0c0d4026460cd110 - languageName: node - linkType: hard - "colorette@npm:^1.0.7": version: 1.2.2 resolution: "colorette@npm:1.2.2" @@ -8161,27 +6064,6 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.10": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 - languageName: node - linkType: hard - -"combine-promises@npm:^1.1.0": - version: 1.1.0 - resolution: "combine-promises@npm:1.1.0" - checksum: 10c0/67f2a0383d5836d59ad12bab1a08462e4b8de1127e3a16c58612978eb0265d39ffd4ec6dce520566b4535f523a8af458117bee3556ab6f645d130cfd1a7e30e2 - languageName: node - linkType: hard - -"comma-separated-tokens@npm:^1.0.0": - version: 1.0.8 - resolution: "comma-separated-tokens@npm:1.0.8" - checksum: 10c0/c3bcfeaa6d50313528a006a40bcc0f9576086665c9b48d4b3a76ddd63e7d6174734386c98be1881cbf6ecfc25e1db61cd775a7b896d2ea7a65de28f83a0f9b17 - languageName: node - linkType: hard - "command-exists@npm:^1.2.8": version: 1.2.9 resolution: "command-exists@npm:1.2.9" @@ -8203,27 +6085,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^5.1.0": - version: 5.1.0 - resolution: "commander@npm:5.1.0" - checksum: 10c0/da9d71dbe4ce039faf1fe9eac3771dca8c11d66963341f62602f7b66e36d2a3f8883407af4f9a37b1db1a55c59c0c1325f186425764c2e963dc1d67aec2a4b6d - languageName: node - linkType: hard - -"commander@npm:^7.2.0": - version: 7.2.0 - resolution: "commander@npm:7.2.0" - checksum: 10c0/8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a - languageName: node - linkType: hard - -"commander@npm:^8.3.0": - version: 8.3.0 - resolution: "commander@npm:8.3.0" - checksum: 10c0/8b043bb8322ea1c39664a1598a95e0495bfe4ca2fad0d84a92d7d1d8d213e2a155b441d2470c8e08de7c4a28cf2bc6e169211c49e1b21d9f7edc6ae4d9356060 - languageName: node - linkType: hard - "commander@npm:^9.4.1": version: 9.5.0 resolution: "commander@npm:9.5.0" @@ -8231,13 +6092,6 @@ __metadata: languageName: node linkType: hard -"commondir@npm:^1.0.1": - version: 1.0.1 - resolution: "commondir@npm:1.0.1" - checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 - languageName: node - linkType: hard - "compressible@npm:~2.0.16": version: 2.0.18 resolution: "compressible@npm:2.0.18" @@ -8247,7 +6101,7 @@ __metadata: languageName: node linkType: hard -"compression@npm:^1.7.1, compression@npm:^1.7.4": +"compression@npm:^1.7.1": version: 1.7.4 resolution: "compression@npm:1.7.4" dependencies: @@ -8289,27 +6143,6 @@ __metadata: languageName: node linkType: hard -"configstore@npm:^5.0.1": - version: 5.0.1 - resolution: "configstore@npm:5.0.1" - dependencies: - dot-prop: "npm:^5.2.0" - graceful-fs: "npm:^4.1.2" - make-dir: "npm:^3.0.0" - unique-string: "npm:^2.0.0" - write-file-atomic: "npm:^3.0.0" - xdg-basedir: "npm:^4.0.0" - checksum: 10c0/5af23830e78bdc56cbe92a2f81e87f1d3a39e96e51a0ab2a8bc79bbbc5d4440a48d92833b3fd9c6d34b4a9c4c5853c8487b8e6e68593e7ecbc7434822f7aced3 - languageName: node - linkType: hard - -"connect-history-api-fallback@npm:^2.0.0": - version: 2.0.0 - resolution: "connect-history-api-fallback@npm:2.0.0" - checksum: 10c0/90fa8b16ab76e9531646cc70b010b1dbd078153730c510d3142f6cf07479ae8a812c5a3c0e40a28528dd1681a62395d0cfdef67da9e914c4772ac85d69a3ed87 - languageName: node - linkType: hard - "connect@npm:^3.6.5": version: 3.7.0 resolution: "connect@npm:3.7.0" @@ -8322,50 +6155,20 @@ __metadata: languageName: node linkType: hard -"consola@npm:^2.15.3": - version: 2.15.3 - resolution: "consola@npm:2.15.3" - checksum: 10c0/34a337e6b4a1349ee4d7b4c568484344418da8fdb829d7d71bfefcd724f608f273987633b6eef465e8de510929907a092e13cb7a28a5d3acb3be446fcc79fd5e - languageName: node - linkType: hard - -"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0": +"console-control-strings@npm:^1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" checksum: 10c0/7ab51d30b52d461412cd467721bb82afe695da78fff8f29fe6f6b9cbaac9a2328e27a22a966014df9532100f6dd85370460be8130b9c677891ba36d96a343f50 languageName: node linkType: hard -"content-disposition@npm:0.5.2": - version: 0.5.2 - resolution: "content-disposition@npm:0.5.2" - checksum: 10c0/49eebaa0da1f9609b192e99d7fec31d1178cb57baa9d01f5b63b29787ac31e9d18b5a1033e854c68c9b6cce790e700a6f7fa60e43f95e2e416404e114a8f2f49 - languageName: node - linkType: hard - -"content-disposition@npm:0.5.4": - version: 0.5.4 - resolution: "content-disposition@npm:0.5.4" - dependencies: - safe-buffer: "npm:5.2.1" - checksum: 10c0/bac0316ebfeacb8f381b38285dc691c9939bf0a78b0b7c2d5758acadad242d04783cee5337ba7d12a565a19075af1b3c11c728e1e4946de73c6ff7ce45f3f1bb - languageName: node - linkType: hard - -"content-type@npm:~1.0.4, content-type@npm:~1.0.5": +"content-type@npm:~1.0.5": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af languageName: node linkType: hard -"convert-source-map@npm:^1.7.0": - version: 1.9.0 - resolution: "convert-source-map@npm:1.9.0" - checksum: 10c0/281da55454bf8126cbc6625385928c43479f2060984180c42f3a86c8b8c12720a24eac260624a7d1e090004028d2dee78602330578ceec1a08e27cb8bb0a8a5b - languageName: node - linkType: hard - "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -8373,43 +6176,6 @@ __metadata: languageName: node linkType: hard -"cookie-signature@npm:1.0.6": - version: 1.0.6 - resolution: "cookie-signature@npm:1.0.6" - checksum: 10c0/b36fd0d4e3fef8456915fcf7742e58fbfcc12a17a018e0eb9501c9d5ef6893b596466f03b0564b81af29ff2538fd0aa4b9d54fe5ccbfb4c90ea50ad29fe2d221 - languageName: node - linkType: hard - -"cookie@npm:0.5.0": - version: 0.5.0 - resolution: "cookie@npm:0.5.0" - checksum: 10c0/c01ca3ef8d7b8187bae434434582288681273b5a9ed27521d4d7f9f7928fe0c920df0decd9f9d3bbd2d14ac432b8c8cf42b98b3bdd5bfe0e6edddeebebe8b61d - languageName: node - linkType: hard - -"copy-text-to-clipboard@npm:^3.0.1": - version: 3.2.0 - resolution: "copy-text-to-clipboard@npm:3.2.0" - checksum: 10c0/d60fdadc59d526e19d56ad23cec2b292d33c771a5091621bd322d138804edd3c10eb2367d46ec71b39f5f7f7116a2910b332281aeb36a5b679199d746a8a5381 - languageName: node - linkType: hard - -"copy-webpack-plugin@npm:^11.0.0": - version: 11.0.0 - resolution: "copy-webpack-plugin@npm:11.0.0" - dependencies: - fast-glob: "npm:^3.2.11" - glob-parent: "npm:^6.0.1" - globby: "npm:^13.1.1" - normalize-path: "npm:^3.0.0" - schema-utils: "npm:^4.0.0" - serialize-javascript: "npm:^6.0.0" - peerDependencies: - webpack: ^5.1.0 - checksum: 10c0/a667dd226b26f148584a35fb705f5af926d872584912cf9fd203c14f2b3a68f473a1f5cf768ec1dd5da23820823b850e5d50458b685c468e4a224b25c12a15b4 - languageName: node - linkType: hard - "core-js-compat@npm:^3.38.0, core-js-compat@npm:^3.38.1": version: 3.38.1 resolution: "core-js-compat@npm:3.38.1" @@ -8419,27 +6185,6 @@ __metadata: languageName: node linkType: hard -"core-js-pure@npm:^3.30.2": - version: 3.32.0 - resolution: "core-js-pure@npm:3.32.0" - checksum: 10c0/c75718c38d00609bbf0e14d7f8116c811d745b1b168c9f36a46e8b99110a29ca9d061426f7c14a11f8bc7658240ddc6470dcbc497249e70ca0476b3ef22e323a - languageName: node - linkType: hard - -"core-js@npm:^3.23.3": - version: 3.32.0 - resolution: "core-js@npm:3.32.0" - checksum: 10c0/8839b9a5cfff4999cf5e3277072c7c581b29618c6dbc2f9d0170c529a701310ec78843bd97bede0742cf6899b526bdb062bb1d148c6e9a40f3d19173b7ee8e88 - languageName: node - linkType: hard - -"core-util-is@npm:~1.0.0": - version: 1.0.2 - resolution: "core-util-is@npm:1.0.2" - checksum: 10c0/980a37a93956d0de8a828ce508f9b9e3317039d68922ca79995421944146700e4aaf490a6dbfebcb1c5292a7184600c7710b957d724be1e37b8254c6bc0fe246 - languageName: node - linkType: hard - "cosmiconfig@npm:^5.0.5": version: 5.2.1 resolution: "cosmiconfig@npm:5.2.1" @@ -8452,44 +6197,6 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^6.0.0": - version: 6.0.0 - resolution: "cosmiconfig@npm:6.0.0" - dependencies: - "@types/parse-json": "npm:^4.0.0" - import-fresh: "npm:^3.1.0" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - yaml: "npm:^1.7.2" - checksum: 10c0/666ed8732d0bf7d7fe6f8516c8ee6041e0622032e8fa26201577b883d2767ad105d03f38b34b93d1f02f26b22a89e7bab4443b9d2e7f931f48d0e944ffa038b5 - languageName: node - linkType: hard - -"cosmiconfig@npm:^7.0.1": - version: 7.0.1 - resolution: "cosmiconfig@npm:7.0.1" - dependencies: - "@types/parse-json": "npm:^4.0.0" - import-fresh: "npm:^3.2.1" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - yaml: "npm:^1.10.0" - checksum: 10c0/3cd38525ba22e13da0ef9f4be131df226c94f5b96fb50f6297eb17baeedefe15cf5819f8c73cde69f71cc5034e712c86bd20c7756883dd8094087680ecc25932 - languageName: node - linkType: hard - -"cosmiconfig@npm:^8.2.0": - version: 8.2.0 - resolution: "cosmiconfig@npm:8.2.0" - dependencies: - import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - checksum: 10c0/4180aa6d1881b75ba591b2fc04b022741a3a4b67e9e243c0eb8d169b6e1efbd3cdf7e8ca19243c0f2e53a9d59ac3eccd5cad5f95f487fcbf4e740f9e86745747 - languageName: node - linkType: hard - "cosmiconfig@npm:^9.0.0": version: 9.0.0 resolution: "cosmiconfig@npm:9.0.0" @@ -8524,15 +6231,6 @@ __metadata: languageName: node linkType: hard -"cross-fetch@npm:^3.1.5": - version: 3.1.6 - resolution: "cross-fetch@npm:3.1.6" - dependencies: - node-fetch: "npm:^2.6.11" - checksum: 10c0/39cdd0e16603e43b66fe187bb2a14fb7b4a0b35322ff61d7b08bf48b29a2a7fe835423b27eece46348ab92c45719054e49c4de52de89f279e0935f36a301a5a5 - languageName: node - linkType: hard - "cross-spawn@npm:^5.1.0": version: 5.1.0 resolution: "cross-spawn@npm:5.1.0" @@ -8579,218 +6277,10 @@ __metadata: languageName: node linkType: hard -"crypto-random-string@npm:^2.0.0": - version: 2.0.0 - resolution: "crypto-random-string@npm:2.0.0" - checksum: 10c0/288589b2484fe787f9e146f56c4be90b940018f17af1b152e4dde12309042ff5a2bf69e949aab8b8ac253948381529cc6f3e5a2427b73643a71ff177fa122b37 - languageName: node - linkType: hard - -"css-declaration-sorter@npm:^6.3.1": - version: 6.4.1 - resolution: "css-declaration-sorter@npm:6.4.1" - peerDependencies: - postcss: ^8.0.9 - checksum: 10c0/b8b664338dac528266a1ed9b27927ac51a907fb16bc1954fa9038b5286c442603bd494cc920c6a3616111309d18ee6b5a85b6d9927938efc942af452a5145160 - languageName: node - linkType: hard - -"css-loader@npm:^6.7.1": - version: 6.8.1 - resolution: "css-loader@npm:6.8.1" - dependencies: - icss-utils: "npm:^5.1.0" - postcss: "npm:^8.4.21" - postcss-modules-extract-imports: "npm:^3.0.0" - postcss-modules-local-by-default: "npm:^4.0.3" - postcss-modules-scope: "npm:^3.0.0" - postcss-modules-values: "npm:^4.0.0" - postcss-value-parser: "npm:^4.2.0" - semver: "npm:^7.3.8" - peerDependencies: - webpack: ^5.0.0 - checksum: 10c0/a6e23de4ec1d2832f10b8ca3cfec6b6097a97ca3c73f64338ae5cd110ac270f1b218ff0273d39f677a7a561f1a9d9b0d332274664d0991bcfafaae162c2669c4 - languageName: node - linkType: hard - -"css-minimizer-webpack-plugin@npm:^4.0.0": - version: 4.2.2 - resolution: "css-minimizer-webpack-plugin@npm:4.2.2" - dependencies: - cssnano: "npm:^5.1.8" - jest-worker: "npm:^29.1.2" - postcss: "npm:^8.4.17" - schema-utils: "npm:^4.0.0" - serialize-javascript: "npm:^6.0.0" - source-map: "npm:^0.6.1" - peerDependencies: - webpack: ^5.0.0 - peerDependenciesMeta: - "@parcel/css": - optional: true - "@swc/css": - optional: true - clean-css: - optional: true - csso: - optional: true - esbuild: - optional: true - lightningcss: - optional: true - checksum: 10c0/05cd1460b83d9a5f8878fd63d3a80fd100cbb10f48e295a6ad52519761f3390e1e1bc0e269ff28d15b062a1b11379e04608d50ee30424e177c281bd845fef9fb - languageName: node - linkType: hard - -"css-select@npm:^4.1.3": - version: 4.3.0 - resolution: "css-select@npm:4.3.0" - dependencies: - boolbase: "npm:^1.0.0" - css-what: "npm:^6.0.1" - domhandler: "npm:^4.3.1" - domutils: "npm:^2.8.0" - nth-check: "npm:^2.0.1" - checksum: 10c0/a489d8e5628e61063d5a8fe0fa1cc7ae2478cb334a388a354e91cf2908154be97eac9fa7ed4dffe87a3e06cf6fcaa6016553115335c4fd3377e13dac7bd5a8e1 - languageName: node - linkType: hard - -"css-select@npm:^5.1.0": - version: 5.1.0 - resolution: "css-select@npm:5.1.0" - dependencies: - boolbase: "npm:^1.0.0" - css-what: "npm:^6.1.0" - domhandler: "npm:^5.0.2" - domutils: "npm:^3.0.1" - nth-check: "npm:^2.0.1" - checksum: 10c0/551c60dba5b54054741032c1793b5734f6ba45e23ae9e82761a3c0ed1acbb8cfedfa443aaba3a3c1a54cac12b456d2012a09d2cd5f0e82e430454c1b9d84d500 - languageName: node - linkType: hard - -"css-selector-parser@npm:^1.0.0": - version: 1.4.1 - resolution: "css-selector-parser@npm:1.4.1" - checksum: 10c0/4a89a7b61072cf0e4d09e8abbb9a77bc661232b6fe6a6fe51ba775757bae0e3fc462b0db4c9a857da55afb89a1c1746a7b2ec1200f639c539556ebdc758b0101 - languageName: node - linkType: hard - -"css-tree@npm:^1.1.2, css-tree@npm:^1.1.3": - version: 1.1.3 - resolution: "css-tree@npm:1.1.3" - dependencies: - mdn-data: "npm:2.0.14" - source-map: "npm:^0.6.1" - checksum: 10c0/499a507bfa39b8b2128f49736882c0dd636b0cd3370f2c69f4558ec86d269113286b7df469afc955de6a68b0dba00bc533e40022a73698081d600072d5d83c1c - languageName: node - linkType: hard - -"css-what@npm:^6.0.1, css-what@npm:^6.1.0": - version: 6.1.0 - resolution: "css-what@npm:6.1.0" - checksum: 10c0/a09f5a6b14ba8dcf57ae9a59474722e80f20406c53a61e9aedb0eedc693b135113ffe2983f4efc4b5065ae639442e9ae88df24941ef159c218b231011d733746 - languageName: node - linkType: hard - -"cssesc@npm:^3.0.0": - version: 3.0.0 - resolution: "cssesc@npm:3.0.0" - bin: - cssesc: bin/cssesc - checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 - languageName: node - linkType: hard - -"cssnano-preset-advanced@npm:^5.3.8": - version: 5.3.10 - resolution: "cssnano-preset-advanced@npm:5.3.10" - dependencies: - autoprefixer: "npm:^10.4.12" - cssnano-preset-default: "npm:^5.2.14" - postcss-discard-unused: "npm:^5.1.0" - postcss-merge-idents: "npm:^5.1.1" - postcss-reduce-idents: "npm:^5.2.0" - postcss-zindex: "npm:^5.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/abfa870a6e3ab52cddfea7cac83f49b510efb941c7f2960ca9d41ae11fabbe03e9453cad7f81fd1b35cf6080c94094cd7bb1b58c07fad4cf0453f6e4bb9a07ae - languageName: node - linkType: hard - -"cssnano-preset-default@npm:^5.2.14": - version: 5.2.14 - resolution: "cssnano-preset-default@npm:5.2.14" - dependencies: - css-declaration-sorter: "npm:^6.3.1" - cssnano-utils: "npm:^3.1.0" - postcss-calc: "npm:^8.2.3" - postcss-colormin: "npm:^5.3.1" - postcss-convert-values: "npm:^5.1.3" - postcss-discard-comments: "npm:^5.1.2" - postcss-discard-duplicates: "npm:^5.1.0" - postcss-discard-empty: "npm:^5.1.1" - postcss-discard-overridden: "npm:^5.1.0" - postcss-merge-longhand: "npm:^5.1.7" - postcss-merge-rules: "npm:^5.1.4" - postcss-minify-font-values: "npm:^5.1.0" - postcss-minify-gradients: "npm:^5.1.1" - postcss-minify-params: "npm:^5.1.4" - postcss-minify-selectors: "npm:^5.2.1" - postcss-normalize-charset: "npm:^5.1.0" - postcss-normalize-display-values: "npm:^5.1.0" - postcss-normalize-positions: "npm:^5.1.1" - postcss-normalize-repeat-style: "npm:^5.1.1" - postcss-normalize-string: "npm:^5.1.0" - postcss-normalize-timing-functions: "npm:^5.1.0" - postcss-normalize-unicode: "npm:^5.1.1" - postcss-normalize-url: "npm:^5.1.0" - postcss-normalize-whitespace: "npm:^5.1.1" - postcss-ordered-values: "npm:^5.1.3" - postcss-reduce-initial: "npm:^5.1.2" - postcss-reduce-transforms: "npm:^5.1.0" - postcss-svgo: "npm:^5.1.0" - postcss-unique-selectors: "npm:^5.1.1" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/d125bdb9ac007f97f920e30be953c550a8e7de0cb9298f67e0bc9744f4b920039046b5a6b817e345872836b08689af747f82fbf2189c8bd48da3e6f0c1087b89 - languageName: node - linkType: hard - -"cssnano-utils@npm:^3.1.0": - version: 3.1.0 - resolution: "cssnano-utils@npm:3.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/057508645a3e7584decede1045daa5b362dbfa2f5df96c3527c7d52e41e787a3442a56a8ea0c0af6a757f518e79a459ee580a35c323ad0d0eec912afd67d7630 - languageName: node - linkType: hard - -"cssnano@npm:^5.1.12, cssnano@npm:^5.1.8": - version: 5.1.15 - resolution: "cssnano@npm:5.1.15" - dependencies: - cssnano-preset-default: "npm:^5.2.14" - lilconfig: "npm:^2.0.3" - yaml: "npm:^1.10.2" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/4252e4f4edd7a0fbdd4017825c0f8632b7a12ecbfdd432d2ff7ec268d48eb956a0a10bbf209602181f9f84ceeecea4a864719ecde03aa2cc48f5d9636fcf5f9a - languageName: node - linkType: hard - -"csso@npm:^4.2.0": - version: 4.2.0 - resolution: "csso@npm:4.2.0" - dependencies: - css-tree: "npm:^1.1.2" - checksum: 10c0/f8c6b1300efaa0f8855a7905ae3794a29c6496e7f16a71dec31eb6ca7cfb1f058a4b03fd39b66c4deac6cb06bf6b4ba86da7b67d7320389cb9994d52b924b903 - languageName: node - linkType: hard - -"csstype@npm:^3.0.2": - version: 3.0.10 - resolution: "csstype@npm:3.0.10" - checksum: 10c0/f0fff671ab368a863946859ad96be0be66afeb83566215d6494be840ffedfaef4945b48d1b0ce1a19f9983af772e0ce38c7be91a1ad46fe7ecd641937c5a99f7 +"csstype@npm:^3.0.2": + version: 3.0.10 + resolution: "csstype@npm:3.0.10" + checksum: 10c0/f0fff671ab368a863946859ad96be0be66afeb83566215d6494be840ffedfaef4945b48d1b0ce1a19f9983af772e0ce38c7be91a1ad46fe7ecd641937c5a99f7 languageName: node linkType: hard @@ -8843,7 +6333,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.6.0, debug@npm:^2.6.9": +"debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -8900,15 +6390,6 @@ __metadata: languageName: node linkType: hard -"decompress-response@npm:^3.3.0": - version: 3.3.0 - resolution: "decompress-response@npm:3.3.0" - dependencies: - mimic-response: "npm:^1.0.0" - checksum: 10c0/5ffaf1d744277fd51c68c94ddc3081cd011b10b7de06637cccc6ecba137d45304a09ba1a776dee1c47fccc60b4a056c4bc74468eeea798ff1f1fca0024b45c9d - languageName: node - linkType: hard - "dedent@npm:^0.7.0": version: 0.7.0 resolution: "dedent@npm:0.7.0" @@ -8928,13 +6409,6 @@ __metadata: languageName: node linkType: hard -"deep-extend@npm:^0.6.0": - version: 0.6.0 - resolution: "deep-extend@npm:0.6.0" - checksum: 10c0/1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566 - languageName: node - linkType: hard - "deep-is@npm:^0.1.3": version: 0.1.3 resolution: "deep-is@npm:0.1.3" @@ -8949,15 +6423,6 @@ __metadata: languageName: node linkType: hard -"default-gateway@npm:^6.0.3": - version: 6.0.3 - resolution: "default-gateway@npm:6.0.3" - dependencies: - execa: "npm:^5.0.0" - checksum: 10c0/5184f9e6e105d24fb44ade9e8741efa54bb75e84625c1ea78c4ef8b81dff09ca52d6dbdd1185cf0dc655bb6b282a64fffaf7ed2dd561b8d9ad6f322b1f039aba - languageName: node - linkType: hard - "defaults@npm:^1.0.3": version: 1.0.3 resolution: "defaults@npm:1.0.3" @@ -8967,13 +6432,6 @@ __metadata: languageName: node linkType: hard -"defer-to-connect@npm:^1.0.1": - version: 1.1.3 - resolution: "defer-to-connect@npm:1.1.3" - checksum: 10c0/9feb161bd7d21836fdff31eba79c2b11b7aaf844be58faf727121f8b0d9c2e82b494560df0903f41b52dd75027dc7c9455c11b3739f3202b28ca92b56c8f960e - languageName: node - linkType: hard - "define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": version: 1.1.1 resolution: "define-data-property@npm:1.1.1" @@ -8996,13 +6454,6 @@ __metadata: languageName: node linkType: hard -"define-lazy-prop@npm:^2.0.0": - version: 2.0.0 - resolution: "define-lazy-prop@npm:2.0.0" - checksum: 10c0/db6c63864a9d3b7dc9def55d52764968a5af296de87c1b2cc71d8be8142e445208071953649e0386a8cc37cfcf9a2067a47207f1eb9ff250c2a269658fdae422 - languageName: node - linkType: hard - "define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" @@ -9073,7 +6524,7 @@ __metadata: languageName: node linkType: hard -"depd@npm:^1.1.2, depd@npm:~1.1.2": +"depd@npm:^1.1.2": version: 1.1.2 resolution: "depd@npm:1.1.2" checksum: 10c0/acb24aaf936ef9a227b6be6d495f0d2eb20108a9a6ad40585c5bda1a897031512fef6484e4fdbb80bd249fdaa82841fa1039f416ece03188e677ba11bcfda249 @@ -9087,15 +6538,6 @@ __metadata: languageName: node linkType: hard -"detab@npm:2.0.4": - version: 2.0.4 - resolution: "detab@npm:2.0.4" - dependencies: - repeat-string: "npm:^1.5.4" - checksum: 10c0/969c7f5a04fc3f8c52eb3b9db2fd4ba20b9b9ce56c5659ebf4cf93ba6c1be68b651665d053affbe99e76733cf7d134546cdd6be038af368f8365f42a646d5fb8 - languageName: node - linkType: hard - "detect-indent@npm:^6.0.0": version: 6.1.0 resolution: "detect-indent@npm:6.1.0" @@ -9117,39 +6559,6 @@ __metadata: languageName: node linkType: hard -"detect-node@npm:^2.0.4": - version: 2.1.0 - resolution: "detect-node@npm:2.1.0" - checksum: 10c0/f039f601790f2e9d4654e499913259a798b1f5246ae24f86ab5e8bd4aaf3bce50484234c494f11fb00aecb0c6e2733aa7b1cf3f530865640b65fbbd65b2c4e09 - languageName: node - linkType: hard - -"detect-port-alt@npm:^1.1.6": - version: 1.1.6 - resolution: "detect-port-alt@npm:1.1.6" - dependencies: - address: "npm:^1.0.1" - debug: "npm:^2.6.0" - bin: - detect: ./bin/detect-port - detect-port: ./bin/detect-port - checksum: 10c0/7269e6aef7b782d98c77505c07a7a0f5e2ee98a9607dc791035fc0192fc58aa03cc833fae605e10eaf239a2a5a55cd938e0bb141dea764ac6180ca082fd62b23 - languageName: node - linkType: hard - -"detect-port@npm:^1.3.0": - version: 1.5.1 - resolution: "detect-port@npm:1.5.1" - dependencies: - address: "npm:^1.0.1" - debug: "npm:4" - bin: - detect: bin/detect-port.js - detect-port: bin/detect-port.js - checksum: 10c0/f2b204ad3a9f8e8b53fea35fcc97469f31a8e3e786a2f59fbc886397e33b5f130c5f964bf001b9a64d990047c3824f6a439308461ff19801df04ab48a754639e - languageName: node - linkType: hard - "diff-sequences@npm:^29.6.3": version: 29.6.3 resolution: "diff-sequences@npm:29.6.3" @@ -9175,31 +6584,6 @@ __metadata: languageName: node linkType: hard -"direction@npm:^1.0.0": - version: 1.0.4 - resolution: "direction@npm:1.0.4" - bin: - direction: cli.js - checksum: 10c0/2257006edba01b3294322311a212a3f0e7c656d710ab164fd95123a2a9daaec536252c60da6a9df5be2bb89e9030684e9d1c7804fe82c9b3f510c2f737adeada - languageName: node - linkType: hard - -"dns-equal@npm:^1.0.0": - version: 1.0.0 - resolution: "dns-equal@npm:1.0.0" - checksum: 10c0/da966e5275ac50546e108af6bc29aaae2164d2ae96d60601b333c4a3aff91f50b6ca14929cf91f20a9cad1587b356323e300cea3ff6588a6a816988485f445f1 - languageName: node - linkType: hard - -"dns-packet@npm:^5.2.2": - version: 5.6.0 - resolution: "dns-packet@npm:5.6.0" - dependencies: - "@leichtgewicht/ip-codec": "npm:^2.0.1" - checksum: 10c0/b458d9c8c9f346fdf1d6e88998dc29815f1eac51c05061510b903b9b882d48cac95b132c5c33eeb330665a7c85227a922767a3eb72ce7be143964a1cce63b770 - languageName: node - linkType: hard - "doctrine@npm:^2.1.0": version: 2.1.0 resolution: "doctrine@npm:2.1.0" @@ -9209,129 +6593,6 @@ __metadata: languageName: node linkType: hard -"docusaurus-lunr-search@npm:^3.4.0": - version: 3.4.0 - resolution: "docusaurus-lunr-search@npm:3.4.0" - dependencies: - autocomplete.js: "npm:^0.37.0" - clsx: "npm:^1.2.1" - gauge: "npm:^3.0.0" - hast-util-select: "npm:^4.0.0" - hast-util-to-text: "npm:^2.0.0" - hogan.js: "npm:^3.0.2" - lunr: "npm:^2.3.8" - lunr-languages: "npm:^1.4.0" - mark.js: "npm:^8.11.1" - minimatch: "npm:^3.0.4" - rehype-parse: "npm:^7.0.1" - to-vfile: "npm:^6.1.0" - unified: "npm:^9.0.0" - unist-util-is: "npm:^4.0.2" - peerDependencies: - "@docusaurus/core": ^2.0.0-alpha.60 || ^2.0.0 || ^3.0.0 - react: ^16.8.4 || ^17 || ^18 - react-dom: ^16.8.4 || ^17 || ^18 - checksum: 10c0/81aac7d8aa4a8be2f54c83198978d5a2a9a8a88eb798f54c075fe10860fd0b52b35f5943b5b2e18f24bdb96a97fe386349837905b386477a5d635177e4ed7f68 - languageName: node - linkType: hard - -"dom-converter@npm:^0.2.0": - version: 0.2.0 - resolution: "dom-converter@npm:0.2.0" - dependencies: - utila: "npm:~0.4" - checksum: 10c0/e96aa63bd8c6ee3cd9ce19c3aecfc2c42e50a460e8087114794d4f5ecf3a4f052b34ea3bf2d73b5d80b4da619073b49905e6d7d788ceb7814ca4c29be5354a11 - languageName: node - linkType: hard - -"dom-serializer@npm:^1.0.1": - version: 1.4.1 - resolution: "dom-serializer@npm:1.4.1" - dependencies: - domelementtype: "npm:^2.0.1" - domhandler: "npm:^4.2.0" - entities: "npm:^2.0.0" - checksum: 10c0/67d775fa1ea3de52035c98168ddcd59418356943b5eccb80e3c8b3da53adb8e37edb2cc2f885802b7b1765bf5022aec21dfc32910d7f9e6de4c3148f095ab5e0 - languageName: node - linkType: hard - -"dom-serializer@npm:^2.0.0": - version: 2.0.0 - resolution: "dom-serializer@npm:2.0.0" - dependencies: - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.2" - entities: "npm:^4.2.0" - checksum: 10c0/d5ae2b7110ca3746b3643d3ef60ef823f5f078667baf530cec096433f1627ec4b6fa8c072f09d079d7cda915fd2c7bc1b7b935681e9b09e591e1e15f4040b8e2 - languageName: node - linkType: hard - -"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0, domelementtype@npm:^2.3.0": - version: 2.3.0 - resolution: "domelementtype@npm:2.3.0" - checksum: 10c0/686f5a9ef0fff078c1412c05db73a0dce096190036f33e400a07e2a4518e9f56b1e324f5c576a0a747ef0e75b5d985c040b0d51945ce780c0dd3c625a18cd8c9 - languageName: node - linkType: hard - -"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.3.1": - version: 4.3.1 - resolution: "domhandler@npm:4.3.1" - dependencies: - domelementtype: "npm:^2.2.0" - checksum: 10c0/5c199c7468cb052a8b5ab80b13528f0db3d794c64fc050ba793b574e158e67c93f8336e87fd81e9d5ee43b0e04aea4d8b93ed7be4899cb726a1601b3ba18538b - languageName: node - linkType: hard - -"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": - version: 5.0.3 - resolution: "domhandler@npm:5.0.3" - dependencies: - domelementtype: "npm:^2.3.0" - checksum: 10c0/bba1e5932b3e196ad6862286d76adc89a0dbf0c773e5ced1eb01f9af930c50093a084eff14b8de5ea60b895c56a04d5de8bbc4930c5543d029091916770b2d2a - languageName: node - linkType: hard - -"domutils@npm:^2.5.2, domutils@npm:^2.8.0": - version: 2.8.0 - resolution: "domutils@npm:2.8.0" - dependencies: - dom-serializer: "npm:^1.0.1" - domelementtype: "npm:^2.2.0" - domhandler: "npm:^4.2.0" - checksum: 10c0/d58e2ae01922f0dd55894e61d18119924d88091837887bf1438f2327f32c65eb76426bd9384f81e7d6dcfb048e0f83c19b222ad7101176ad68cdc9c695b563db - languageName: node - linkType: hard - -"domutils@npm:^3.0.1": - version: 3.1.0 - resolution: "domutils@npm:3.1.0" - dependencies: - dom-serializer: "npm:^2.0.0" - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - checksum: 10c0/342d64cf4d07b8a0573fb51e0a6312a88fb520c7fefd751870bf72fa5fc0f2e0cb9a3958a573610b1d608c6e2a69b8e9b4b40f0bfb8f87a71bce4f180cca1887 - languageName: node - linkType: hard - -"dot-case@npm:^3.0.4": - version: 3.0.4 - resolution: "dot-case@npm:3.0.4" - dependencies: - no-case: "npm:^3.0.4" - tslib: "npm:^2.0.3" - checksum: 10c0/5b859ea65097a7ea870e2c91b5768b72ddf7fa947223fd29e167bcdff58fe731d941c48e47a38ec8aa8e43044c8fbd15cd8fa21689a526bc34b6548197cd5b05 - languageName: node - linkType: hard - -"dot-prop@npm:^5.2.0": - version: 5.3.0 - resolution: "dot-prop@npm:5.3.0" - dependencies: - is-obj: "npm:^2.0.0" - checksum: 10c0/93f0d343ef87fe8869320e62f2459f7e70f49c6098d948cc47e060f4a3f827d0ad61e83cb82f2bd90cd5b9571b8d334289978a43c0f98fea4f0e99ee8faa0599 - languageName: node - linkType: hard - "dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": version: 1.0.1 resolution: "dunder-proto@npm:1.0.1" @@ -9343,27 +6604,6 @@ __metadata: languageName: node linkType: hard -"duplexer3@npm:^0.1.4": - version: 0.1.5 - resolution: "duplexer3@npm:0.1.5" - checksum: 10c0/02195030d61c4d6a2a34eca71639f2ea5e05cb963490e5bd9527623c2ac7f50c33842a34d14777ea9cbfd9bc2be5a84065560b897d9fabb99346058a5b86ca98 - languageName: node - linkType: hard - -"duplexer@npm:^0.1.2": - version: 0.1.2 - resolution: "duplexer@npm:0.1.2" - checksum: 10c0/c57bcd4bdf7e623abab2df43a7b5b23d18152154529d166c1e0da6bee341d84c432d157d7e97b32fecb1bf3a8b8857dd85ed81a915789f550637ed25b8e64fc2 - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 - languageName: node - linkType: hard - "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" @@ -9392,27 +6632,6 @@ __metadata: languageName: node linkType: hard -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 - languageName: node - linkType: hard - -"emojis-list@npm:^3.0.0": - version: 3.0.0 - resolution: "emojis-list@npm:3.0.0" - checksum: 10c0/7dc4394b7b910444910ad64b812392159a21e1a7ecc637c775a440227dcb4f80eff7fe61f4453a7d7603fa23d23d30cc93fe9e4b5ed985b88d6441cd4a35117b - languageName: node - linkType: hard - -"emoticon@npm:^3.2.0": - version: 3.2.0 - resolution: "emoticon@npm:3.2.0" - checksum: 10c0/ee0078d81f64fd1b5ce928ea88cbc3f7a1b3c4d731de1cabb53e2411eba412ad3b152b0982a184c7d0818b01d704ac5a238f3b9aaf8c187ddc51d8c17a9881b8 - languageName: node - linkType: hard - "encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -9445,23 +6664,23 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.17.1, enhanced-resolve@npm:^5.8.3": - version: 5.17.1 - resolution: "enhanced-resolve@npm:5.17.1" +"enhanced-resolve@npm:^5.18.3": + version: 5.18.3 + resolution: "enhanced-resolve@npm:5.18.3" dependencies: graceful-fs: "npm:^4.2.4" tapable: "npm:^2.2.0" - checksum: 10c0/81a0515675eca17efdba2cf5bad87abc91a528fc1191aad50e275e74f045b41506167d420099022da7181c8d787170ea41e4a11a0b10b7a16f6237daecb15370 + checksum: 10c0/d413c23c2d494e4c1c9c9ac7d60b812083dc6d446699ed495e69c920988af0a3c66bf3f8d0e7a45cb1686c2d4c1df9f4e7352d973f5b56fe63d8d711dd0ccc54 languageName: node linkType: hard -"enhanced-resolve@npm:^5.18.3": - version: 5.18.3 - resolution: "enhanced-resolve@npm:5.18.3" +"enhanced-resolve@npm:^5.8.3": + version: 5.17.1 + resolution: "enhanced-resolve@npm:5.17.1" dependencies: graceful-fs: "npm:^4.2.4" tapable: "npm:^2.2.0" - checksum: 10c0/d413c23c2d494e4c1c9c9ac7d60b812083dc6d446699ed495e69c920988af0a3c66bf3f8d0e7a45cb1686c2d4c1df9f4e7352d973f5b56fe63d8d711dd0ccc54 + checksum: 10c0/81a0515675eca17efdba2cf5bad87abc91a528fc1191aad50e275e74f045b41506167d420099022da7181c8d787170ea41e4a11a0b10b7a16f6237daecb15370 languageName: node linkType: hard @@ -9475,20 +6694,6 @@ __metadata: languageName: node linkType: hard -"entities@npm:^2.0.0": - version: 2.2.0 - resolution: "entities@npm:2.2.0" - checksum: 10c0/7fba6af1f116300d2ba1c5673fc218af1961b20908638391b4e1e6d5850314ee2ac3ec22d741b3a8060479911c99305164aed19b6254bde75e7e6b1b2c3f3aa3 - languageName: node - linkType: hard - -"entities@npm:^4.2.0, entities@npm:^4.4.0": - version: 4.5.0 - resolution: "entities@npm:4.5.0" - checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 - languageName: node - linkType: hard - "env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -9687,13 +6892,6 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^1.2.1": - version: 1.3.0 - resolution: "es-module-lexer@npm:1.3.0" - checksum: 10c0/cbd9bdc65458d4c4bd0d22a1c792926bfdf7bb6a96a9ed04da7d31f317159bd4945d2dbeb318717f9214f9695ee85a8fae64a5d25bf360baa82b58079032fc7a - languageName: node - linkType: hard - "es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": version: 1.1.1 resolution: "es-object-atoms@npm:1.1.1" @@ -9853,14 +7051,7 @@ __metadata: languageName: node linkType: hard -"escape-goat@npm:^2.0.0": - version: 2.1.1 - resolution: "escape-goat@npm:2.1.1" - checksum: 10c0/fc0ad656f89c05e86a9641a21bdc5ea37b258714c057430b68a834854fa3e5770cda7d41756108863fc68b1e36a0946463017b7553ac39eaaf64815be07816fc - languageName: node - linkType: hard - -"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": +"escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 @@ -10195,13 +7386,6 @@ __metadata: languageName: node linkType: hard -"eta@npm:^2.0.0": - version: 2.2.0 - resolution: "eta@npm:2.2.0" - checksum: 10c0/643b54d9539d2761bf6c5f4f48df1a5ea2d46c7f5a5fdc47a7d4802a8aa2b6262d4d61f724452e226c18cf82db02d48e65293fcc548f26a3f9d75a5ba7c3b859 - languageName: node - linkType: hard - "etag@npm:~1.8.1": version: 1.8.1 resolution: "etag@npm:1.8.1" @@ -10209,16 +7393,6 @@ __metadata: languageName: node linkType: hard -"eval@npm:^0.1.8": - version: 0.1.8 - resolution: "eval@npm:0.1.8" - dependencies: - "@types/node": "npm:*" - require-like: "npm:>= 0.1.1" - checksum: 10c0/258e700bff09e3ce3344273d5b6691b8ec5b043538d84f738f14d8b0aded33d64c00c15b380de725b1401b15f428ab35a9e7ca19a7d25f162c4f877c71586be9 - languageName: node - linkType: hard - "event-target-shim@npm:^5.0.0, event-target-shim@npm:^5.0.1": version: 5.0.1 resolution: "event-target-shim@npm:5.0.1" @@ -10226,20 +7400,6 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^4.0.0": - version: 4.0.7 - resolution: "eventemitter3@npm:4.0.7" - checksum: 10c0/5f6d97cbcbac47be798e6355e3a7639a84ee1f7d9b199a07017f1d2f1e2fe236004d14fa5dfaeba661f94ea57805385e326236a6debbc7145c8877fbc0297c6b - languageName: node - linkType: hard - -"events@npm:^3.2.0": - version: 3.3.0 - resolution: "events@npm:3.3.0" - checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 - languageName: node - linkType: hard - "example-common-tests@workspace:*, example-common-tests@workspace:examples/common-tests": version: 0.0.0-use.local resolution: "example-common-tests@workspace:examples/common-tests" @@ -10396,61 +7556,6 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.17.3": - version: 4.18.2 - resolution: "express@npm:4.18.2" - dependencies: - accepts: "npm:~1.3.8" - array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.1" - content-disposition: "npm:0.5.4" - content-type: "npm:~1.0.4" - cookie: "npm:0.5.0" - cookie-signature: "npm:1.0.6" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - finalhandler: "npm:1.2.0" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" - merge-descriptors: "npm:1.0.1" - methods: "npm:~1.1.2" - on-finished: "npm:2.4.1" - parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.7" - proxy-addr: "npm:~2.0.7" - qs: "npm:6.11.0" - range-parser: "npm:~1.2.1" - safe-buffer: "npm:5.2.1" - send: "npm:0.18.0" - serve-static: "npm:1.15.0" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - type-is: "npm:~1.6.18" - utils-merge: "npm:1.0.1" - vary: "npm:~1.1.2" - checksum: 10c0/75af556306b9241bc1d7bdd40c9744b516c38ce50ae3210658efcbf96e3aed4ab83b3432f06215eae5610c123bc4136957dc06e50dfc50b7d4d775af56c4c59c - languageName: node - linkType: hard - -"extend-shallow@npm:^2.0.1": - version: 2.0.1 - resolution: "extend-shallow@npm:2.0.1" - dependencies: - is-extendable: "npm:^0.1.0" - checksum: 10c0/ee1cb0a18c9faddb42d791b2d64867bd6cfd0f3affb711782eb6e894dd193e2934a7f529426aac7c8ddb31ac5d38000a00aa2caf08aa3dfc3e1c8ff6ba340bd9 - languageName: node - linkType: hard - -"extend@npm:^3.0.0": - version: 3.0.2 - resolution: "extend@npm:3.0.2" - checksum: 10c0/73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 - languageName: node - linkType: hard - "extendable-error@npm:^0.1.5": version: 0.1.7 resolution: "extendable-error@npm:0.1.7" @@ -10483,7 +7588,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": +"fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -10523,15 +7628,6 @@ __metadata: languageName: node linkType: hard -"fast-url-parser@npm:1.1.3": - version: 1.1.3 - resolution: "fast-url-parser@npm:1.1.3" - dependencies: - punycode: "npm:^1.3.2" - checksum: 10c0/d85c5c409cf0215417380f98a2d29c23a95004d93ff0d8bdf1af5f1a9d1fc608ac89ac6ffe863783d2c73efb3850dd35390feb1de3296f49877bfee0392eb5d3 - languageName: node - linkType: hard - "fast-xml-parser@npm:^4.0.0, fast-xml-parser@npm:^4.4.1": version: 4.5.0 resolution: "fast-xml-parser@npm:4.5.0" @@ -10552,15 +7648,6 @@ __metadata: languageName: node linkType: hard -"faye-websocket@npm:^0.11.3": - version: 0.11.4 - resolution: "faye-websocket@npm:0.11.4" - dependencies: - websocket-driver: "npm:>=0.5.1" - checksum: 10c0/c6052a0bb322778ce9f89af92890f6f4ce00d5ec92418a35e5f4c6864a4fe736fec0bcebd47eac7c0f0e979b01530746b1c85c83cb04bae789271abf19737420 - languageName: node - linkType: hard - "fb-watchman@npm:^2.0.0": version: 2.0.1 resolution: "fb-watchman@npm:2.0.1" @@ -10570,37 +7657,6 @@ __metadata: languageName: node linkType: hard -"fbemitter@npm:^3.0.0": - version: 3.0.0 - resolution: "fbemitter@npm:3.0.0" - dependencies: - fbjs: "npm:^3.0.0" - checksum: 10c0/f130dd8e15dc3fc6709a26586b7a589cd994e1d1024b624f2cc8ef1b12401536a94bb30038e68150a24f9ba18863e9a3fe87941ade2c87667bfbd17f4848d5c7 - languageName: node - linkType: hard - -"fbjs-css-vars@npm:^1.0.0": - version: 1.0.2 - resolution: "fbjs-css-vars@npm:1.0.2" - checksum: 10c0/dfb64116b125a64abecca9e31477b5edb9a2332c5ffe74326fe36e0a72eef7fc8a49b86adf36c2c293078d79f4524f35e80f5e62546395f53fb7c9e69821f54f - languageName: node - linkType: hard - -"fbjs@npm:^3.0.0, fbjs@npm:^3.0.1": - version: 3.0.5 - resolution: "fbjs@npm:3.0.5" - dependencies: - cross-fetch: "npm:^3.1.5" - fbjs-css-vars: "npm:^1.0.0" - loose-envify: "npm:^1.0.0" - object-assign: "npm:^4.1.0" - promise: "npm:^7.1.1" - setimmediate: "npm:^1.0.5" - ua-parser-js: "npm:^1.0.35" - checksum: 10c0/66d0a2fc9a774f9066e35ac2ac4bf1245931d27f3ac287c7d47e6aa1fc152b243c2109743eb8f65341e025621fb51a12038fadb9fd8fda2e3ddae04ebab06f91 - languageName: node - linkType: hard - "fdir@npm:^6.5.0": version: 6.5.0 resolution: "fdir@npm:6.5.0" @@ -10613,15 +7669,6 @@ __metadata: languageName: node linkType: hard -"feed@npm:^4.2.2": - version: 4.2.2 - resolution: "feed@npm:4.2.2" - dependencies: - xml-js: "npm:^1.6.11" - checksum: 10c0/c0849bde569da94493224525db00614fd1855a5d7c2e990f6e8637bd0298e85c3d329efe476cba77e711e438c3fb48af60cd5ef0c409da5bcd1f479790b0a372 - languageName: node - linkType: hard - "file-entry-cache@npm:^8.0.0": version: 8.0.0 resolution: "file-entry-cache@npm:8.0.0" @@ -10631,25 +7678,6 @@ __metadata: languageName: node linkType: hard -"file-loader@npm:^6.2.0": - version: 6.2.0 - resolution: "file-loader@npm:6.2.0" - dependencies: - loader-utils: "npm:^2.0.0" - schema-utils: "npm:^3.0.0" - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - checksum: 10c0/e176a57c2037ab0f78e5755dbf293a6b7f0f8392350a120bd03cc2ce2525bea017458ba28fea14ca535ff1848055e86d1a3a216bdb2561ef33395b27260a1dd3 - languageName: node - linkType: hard - -"filesize@npm:^8.0.6": - version: 8.0.7 - resolution: "filesize@npm:8.0.7" - checksum: 10c0/82072d94816484df5365d4d5acbb2327a65dc49704c64e403e8c40d8acb7364de1cf1e65cb512c77a15d353870f73e4fed46dad5c6153d0618d9ce7a64d09cfc - languageName: node - linkType: hard - "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -10674,41 +7702,6 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:1.2.0": - version: 1.2.0 - resolution: "finalhandler@npm:1.2.0" - dependencies: - debug: "npm:2.6.9" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - on-finished: "npm:2.4.1" - parseurl: "npm:~1.3.3" - statuses: "npm:2.0.1" - unpipe: "npm:~1.0.0" - checksum: 10c0/64b7e5ff2ad1fcb14931cd012651631b721ce657da24aedb5650ddde9378bf8e95daa451da43398123f5de161a81e79ff5affe4f9f2a6d2df4a813d6d3e254b7 - languageName: node - linkType: hard - -"find-cache-dir@npm:^3.3.1": - version: 3.3.2 - resolution: "find-cache-dir@npm:3.3.2" - dependencies: - commondir: "npm:^1.0.1" - make-dir: "npm:^3.0.2" - pkg-dir: "npm:^4.1.0" - checksum: 10c0/92747cda42bff47a0266b06014610981cfbb71f55d60f2c8216bc3108c83d9745507fb0b14ecf6ab71112bed29cd6fb1a137ee7436179ea36e11287e3159e587 - languageName: node - linkType: hard - -"find-up@npm:^3.0.0": - version: 3.0.0 - resolution: "find-up@npm:3.0.0" - dependencies: - locate-path: "npm:^3.0.0" - checksum: 10c0/2c2e7d0a26db858e2f624f39038c74739e38306dee42b45f404f770db357947be9d0d587f1cac72d20c114deb38aa57316e879eb0a78b17b46da7dab0a3bd6e3 - languageName: node - linkType: hard - "find-up@npm:^4.0.0, find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" @@ -10763,28 +7756,6 @@ __metadata: languageName: node linkType: hard -"flux@npm:^4.0.1": - version: 4.0.4 - resolution: "flux@npm:4.0.4" - dependencies: - fbemitter: "npm:^3.0.0" - fbjs: "npm:^3.0.1" - peerDependencies: - react: ^15.0.2 || ^16.0.0 || ^17.0.0 - checksum: 10c0/948bc01b97ff21babc8bfe5c40543d643ca126b71edd447a9ac051b05d20fd549a6bcc4afe043bcde56201782e688a5eaeda1bd8e3e58915641abdd5b3ea21e0 - languageName: node - linkType: hard - -"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.7": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" - peerDependenciesMeta: - debug: - optional: true - checksum: 10c0/9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071 - languageName: node - linkType: hard - "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -10803,51 +7774,6 @@ __metadata: languageName: node linkType: hard -"fork-ts-checker-webpack-plugin@npm:^6.5.0": - version: 6.5.3 - resolution: "fork-ts-checker-webpack-plugin@npm:6.5.3" - dependencies: - "@babel/code-frame": "npm:^7.8.3" - "@types/json-schema": "npm:^7.0.5" - chalk: "npm:^4.1.0" - chokidar: "npm:^3.4.2" - cosmiconfig: "npm:^6.0.0" - deepmerge: "npm:^4.2.2" - fs-extra: "npm:^9.0.0" - glob: "npm:^7.1.6" - memfs: "npm:^3.1.2" - minimatch: "npm:^3.0.4" - schema-utils: "npm:2.7.0" - semver: "npm:^7.3.2" - tapable: "npm:^1.0.0" - peerDependencies: - eslint: ">= 6" - typescript: ">= 2.7" - vue-template-compiler: "*" - webpack: ">= 4" - peerDependenciesMeta: - eslint: - optional: true - vue-template-compiler: - optional: true - checksum: 10c0/0885ea75474de011d4068ca3e2d3ca6e4cd318f5cfa018e28ff8fef23ef3a1f1c130160ef192d3e5d31ef7b6fe9f8fb1d920eab5e9e449fb30ce5cc96647245c - languageName: node - linkType: hard - -"forwarded@npm:0.2.0": - version: 0.2.0 - resolution: "forwarded@npm:0.2.0" - checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 - languageName: node - linkType: hard - -"fraction.js@npm:^4.2.0": - version: 4.2.0 - resolution: "fraction.js@npm:4.2.0" - checksum: 10c0/b16c0a6a7f045b3416c1afbb174b7afca73bd7eb0c62598a0c734a8b1f888cb375684174daf170abfba314da9f366b7d6445e396359d5fae640883bdb2ed18cb - languageName: node - linkType: hard - "fresh@npm:0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" @@ -10888,18 +7814,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^9.0.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: "npm:^1.0.0" - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10c0/9b808bd884beff5cb940773018179a6b94a966381d005479f00adda6b44e5e3d4abf765135773d849cc27efe68c349e4a7b86acd7d3306d5932c14f3a4b17a92 - languageName: node - linkType: hard - "fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -10909,13 +7823,6 @@ __metadata: languageName: node linkType: hard -"fs-monkey@npm:^1.0.4": - version: 1.0.4 - resolution: "fs-monkey@npm:1.0.4" - checksum: 10c0/eeb2457ec50f7202c44273de2a42b50868c8e6b2ab4825d517947143d4e727c028e24f6d0f46e6f3e7a149a1c9e7d8b3ca28243c3b10366d280a08016483e829 - languageName: node - linkType: hard - "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" @@ -11001,23 +7908,6 @@ __metadata: languageName: node linkType: hard -"gauge@npm:^3.0.0": - version: 3.0.2 - resolution: "gauge@npm:3.0.2" - dependencies: - aproba: "npm:^1.0.3 || ^2.0.0" - color-support: "npm:^1.1.2" - console-control-strings: "npm:^1.0.0" - has-unicode: "npm:^2.0.1" - object-assign: "npm:^4.1.1" - signal-exit: "npm:^3.0.0" - string-width: "npm:^4.2.3" - strip-ansi: "npm:^6.0.1" - wide-align: "npm:^1.1.2" - checksum: 10c0/75230ccaf216471e31025c7d5fcea1629596ca20792de50c596eb18ffb14d8404f927cd55535aab2eeecd18d1e11bd6f23ec3c2e9878d2dda1dc74bccc34b913 - languageName: node - linkType: hard - "gauge@npm:^4.0.3": version: 4.0.4 resolution: "gauge@npm:4.0.4" @@ -11034,7 +7924,7 @@ __metadata: languageName: node linkType: hard -"gensync@npm:^1.0.0-beta.1, gensync@npm:^1.0.0-beta.2": +"gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 @@ -11088,13 +7978,6 @@ __metadata: languageName: node linkType: hard -"get-own-enumerable-property-symbols@npm:^3.0.0": - version: 3.0.2 - resolution: "get-own-enumerable-property-symbols@npm:3.0.2" - checksum: 10c0/103999855f3d1718c631472437161d76962cbddcd95cc642a34c07bfb661ed41b6c09a9c669ccdff89ee965beb7126b80eec7b2101e20e31e9cc6c4725305e10 - languageName: node - linkType: hard - "get-package-type@npm:^0.1.0": version: 0.1.0 resolution: "get-package-type@npm:0.1.0" @@ -11112,7 +7995,7 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^4.0.0, get-stream@npm:^4.1.0": +"get-stream@npm:^4.0.0": version: 4.1.0 resolution: "get-stream@npm:4.1.0" dependencies: @@ -11121,7 +8004,7 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^5.0.0, get-stream@npm:^5.1.0": +"get-stream@npm:^5.0.0": version: 5.2.0 resolution: "get-stream@npm:5.2.0" dependencies: @@ -11158,14 +8041,7 @@ __metadata: languageName: node linkType: hard -"github-slugger@npm:^1.4.0": - version: 1.5.0 - resolution: "github-slugger@npm:1.5.0" - checksum: 10c0/116f99732925f939cbfd6f2e57db1aa7e111a460db0d103e3b3f2fce6909d44311663d4542350706cad806345b9892358cc3b153674f88eeae77f43380b3bfca - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": +"glob-parent@npm:^5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" dependencies: @@ -11174,7 +8050,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^6.0.1, glob-parent@npm:^6.0.2": +"glob-parent@npm:^6.0.2": version: 6.0.2 resolution: "glob-parent@npm:6.0.2" dependencies: @@ -11183,14 +8059,7 @@ __metadata: languageName: node linkType: hard -"glob-to-regexp@npm:^0.4.1": - version: 0.4.1 - resolution: "glob-to-regexp@npm:0.4.1" - checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 - languageName: node - linkType: hard - -"glob@npm:^7.0.0, glob@npm:^7.1.1, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": +"glob@npm:^7.0.0, glob@npm:^7.1.1, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -11217,35 +8086,6 @@ __metadata: languageName: node linkType: hard -"global-dirs@npm:^3.0.0": - version: 3.0.1 - resolution: "global-dirs@npm:3.0.1" - dependencies: - ini: "npm:2.0.0" - checksum: 10c0/ef65e2241a47ff978f7006a641302bc7f4c03dfb98783d42bf7224c136e3a06df046e70ee3a010cf30214114755e46c9eb5eb1513838812fbbe0d92b14c25080 - languageName: node - linkType: hard - -"global-modules@npm:^2.0.0": - version: 2.0.0 - resolution: "global-modules@npm:2.0.0" - dependencies: - global-prefix: "npm:^3.0.0" - checksum: 10c0/43b770fe24aa6028f4b9770ea583a47f39750be15cf6e2578f851e4ccc9e4fa674b8541928c0b09c21461ca0763f0d36e4068cec86c914b07fd6e388e66ba5b9 - languageName: node - linkType: hard - -"global-prefix@npm:^3.0.0": - version: 3.0.0 - resolution: "global-prefix@npm:3.0.0" - dependencies: - ini: "npm:^1.3.5" - kind-of: "npm:^6.0.2" - which: "npm:^1.3.1" - checksum: 10c0/510f489fb68d1cc7060f276541709a0ee6d41356ef852de48f7906c648ac223082a1cc8fce86725ca6c0e032bcdc1189ae77b4744a624b29c34a9d0ece498269 - languageName: node - linkType: hard - "globals@npm:^11.1.0": version: 11.12.0 resolution: "globals@npm:11.12.0" @@ -11279,7 +8119,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.0.0, globby@npm:^11.0.1, globby@npm:^11.0.4, globby@npm:^11.1.0": +"globby@npm:^11.0.0, globby@npm:^11.0.1, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -11293,7 +8133,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^13.1.1, globby@npm:^13.1.2": +"globby@npm:^13.1.2": version: 13.2.2 resolution: "globby@npm:13.2.2" dependencies: @@ -11336,26 +8176,7 @@ __metadata: languageName: node linkType: hard -"got@npm:^9.6.0": - version: 9.6.0 - resolution: "got@npm:9.6.0" - dependencies: - "@sindresorhus/is": "npm:^0.14.0" - "@szmarczak/http-timer": "npm:^1.1.2" - cacheable-request: "npm:^6.0.0" - decompress-response: "npm:^3.3.0" - duplexer3: "npm:^0.1.4" - get-stream: "npm:^4.1.0" - lowercase-keys: "npm:^1.0.1" - mimic-response: "npm:^1.0.1" - p-cancelable: "npm:^1.0.0" - to-readable-stream: "npm:^1.0.0" - url-parse-lax: "npm:^3.0.0" - checksum: 10c0/5cb3111e14b48bf4fb8b414627be481ebfb14151ec867e80a74b6d1472489965b9c4f4ac5cf4f3b1f9b90c60a2ce63584d9072b16efd9a3171553e00afc5abc8 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.3, graceful-fs@npm:^4.1.5, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.8, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.3, graceful-fs@npm:^4.1.5, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.8, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -11369,34 +8190,6 @@ __metadata: languageName: node linkType: hard -"gray-matter@npm:^4.0.3": - version: 4.0.3 - resolution: "gray-matter@npm:4.0.3" - dependencies: - js-yaml: "npm:^3.13.1" - kind-of: "npm:^6.0.2" - section-matter: "npm:^1.0.0" - strip-bom-string: "npm:^1.0.0" - checksum: 10c0/e38489906dad4f162ca01e0dcbdbed96d1a53740cef446b9bf76d80bec66fa799af07776a18077aee642346c5e1365ed95e4c91854a12bf40ba0d4fb43a625a6 - languageName: node - linkType: hard - -"gzip-size@npm:^6.0.0": - version: 6.0.0 - resolution: "gzip-size@npm:6.0.0" - dependencies: - duplexer: "npm:^0.1.2" - checksum: 10c0/4ccb924626c82125897a997d1c84f2377846a6ef57fbee38f7c0e6b41387fba4d00422274440747b58008b5d60114bac2349c2908e9aba55188345281af40a3f - languageName: node - linkType: hard - -"handle-thing@npm:^2.0.0": - version: 2.0.1 - resolution: "handle-thing@npm:2.0.1" - checksum: 10c0/7ae34ba286a3434f1993ebd1cc9c9e6b6d8ea672182db28b1afc0a7119229552fa7031e3e5f3cd32a76430ece4e94b7da6f12af2eb39d6239a7693e4bd63a998 - languageName: node - linkType: hard - "hard-rejection@npm:^2.1.0": version: 2.1.0 resolution: "hard-rejection@npm:2.1.0" @@ -11498,13 +8291,6 @@ __metadata: languageName: node linkType: hard -"has-yarn@npm:^2.1.0": - version: 2.1.0 - resolution: "has-yarn@npm:2.1.0" - checksum: 10c0/b5cab61b4129c2fc0474045b59705371b7f5ddf2aab8ba8725011e52269f017e06f75059a2c8a1d8011e9779c2885ad987263cfc6d1280f611c396b45fd5d74a - languageName: node - linkType: hard - "hasown@npm:^2.0.0": version: 2.0.0 resolution: "hasown@npm:2.0.0" @@ -11523,156 +8309,6 @@ __metadata: languageName: node linkType: hard -"hast-to-hyperscript@npm:^9.0.0": - version: 9.0.1 - resolution: "hast-to-hyperscript@npm:9.0.1" - dependencies: - "@types/unist": "npm:^2.0.3" - comma-separated-tokens: "npm:^1.0.0" - property-information: "npm:^5.3.0" - space-separated-tokens: "npm:^1.0.0" - style-to-object: "npm:^0.3.0" - unist-util-is: "npm:^4.0.0" - web-namespaces: "npm:^1.0.0" - checksum: 10c0/630f0db8e1c78d8d6e4f8bd19dec4b6ff6c3048ba0b07b8e34bb812dfbbdc96f4c16abca16c3bfc64e7757921f42790a7bd4a693d6ce99375f99dead65a19a12 - languageName: node - linkType: hard - -"hast-util-from-parse5@npm:^6.0.0": - version: 6.0.1 - resolution: "hast-util-from-parse5@npm:6.0.1" - dependencies: - "@types/parse5": "npm:^5.0.0" - hastscript: "npm:^6.0.0" - property-information: "npm:^5.0.0" - vfile: "npm:^4.0.0" - vfile-location: "npm:^3.2.0" - web-namespaces: "npm:^1.0.0" - checksum: 10c0/c5e7ee40347c3850ece717e37c3e277ca233848ebca341f68c2afbefdb912da415a2fd06940edc3ea4882ad520e1cac7bf3fcf66c31ae97e1bcf953fcb6a7db5 - languageName: node - linkType: hard - -"hast-util-has-property@npm:^1.0.0": - version: 1.0.4 - resolution: "hast-util-has-property@npm:1.0.4" - checksum: 10c0/dcad2e0fc6e2e13b42028ccec40cea5f607ea5fd0c38706467e546df52a5ed5db95c94ba29028855a6024d7a571d7d3dc55403fc16e370f580187716d48865ef - languageName: node - linkType: hard - -"hast-util-is-element@npm:^1.0.0": - version: 1.1.0 - resolution: "hast-util-is-element@npm:1.1.0" - checksum: 10c0/9f95b1e356af3d891a293c1e63560480cb9c2aa33c14e0da3abfaf76aa3f2de8e178643f8459b10e1e2d11a0bc4553c628b57e5afa607791073b61d456f77926 - languageName: node - linkType: hard - -"hast-util-parse-selector@npm:^2.0.0": - version: 2.2.5 - resolution: "hast-util-parse-selector@npm:2.2.5" - checksum: 10c0/29b7ee77960ded6a99d30c287d922243071cc07b39f2006f203bd08ee54eb8f66bdaa86ef6527477c766e2382d520b60ee4e4087f189888c35d8bcc020173648 - languageName: node - linkType: hard - -"hast-util-raw@npm:6.0.1": - version: 6.0.1 - resolution: "hast-util-raw@npm:6.0.1" - dependencies: - "@types/hast": "npm:^2.0.0" - hast-util-from-parse5: "npm:^6.0.0" - hast-util-to-parse5: "npm:^6.0.0" - html-void-elements: "npm:^1.0.0" - parse5: "npm:^6.0.0" - unist-util-position: "npm:^3.0.0" - vfile: "npm:^4.0.0" - web-namespaces: "npm:^1.0.0" - xtend: "npm:^4.0.0" - zwitch: "npm:^1.0.0" - checksum: 10c0/0ed0a2731251a4853710eda38e0bb79ee1ad8ccea69b391c16eb20895895818bced1c2c9eaf8853280f0aa6dc71d22b9eb6c9aab770dd1a225bb44d522eef1ef - languageName: node - linkType: hard - -"hast-util-select@npm:^4.0.0": - version: 4.0.2 - resolution: "hast-util-select@npm:4.0.2" - dependencies: - bcp-47-match: "npm:^1.0.0" - comma-separated-tokens: "npm:^1.0.0" - css-selector-parser: "npm:^1.0.0" - direction: "npm:^1.0.0" - hast-util-has-property: "npm:^1.0.0" - hast-util-is-element: "npm:^1.0.0" - hast-util-to-string: "npm:^1.0.0" - hast-util-whitespace: "npm:^1.0.0" - not: "npm:^0.1.0" - nth-check: "npm:^2.0.0" - property-information: "npm:^5.0.0" - space-separated-tokens: "npm:^1.0.0" - unist-util-visit: "npm:^2.0.0" - zwitch: "npm:^1.0.0" - checksum: 10c0/feade6701f7659f938d22172b0a8166ee82d0897c4bda4850f4f48a1d2de878379c579d58607bcc5f1c8ec235a34f16d7458e4ebbe554e6f0b2d61e3a1b20cf0 - languageName: node - linkType: hard - -"hast-util-to-parse5@npm:^6.0.0": - version: 6.0.0 - resolution: "hast-util-to-parse5@npm:6.0.0" - dependencies: - hast-to-hyperscript: "npm:^9.0.0" - property-information: "npm:^5.0.0" - web-namespaces: "npm:^1.0.0" - xtend: "npm:^4.0.0" - zwitch: "npm:^1.0.0" - checksum: 10c0/49d6c2389fd3170741cdb0483666bccd7e9e436fe386bcbd3931b019e4c006b5bb48022e07967e1021336e744e901082d6479cfa4bc2082efa3b1e5bdab2a36f - languageName: node - linkType: hard - -"hast-util-to-string@npm:^1.0.0": - version: 1.0.4 - resolution: "hast-util-to-string@npm:1.0.4" - checksum: 10c0/02f4631ae5e597ade64653a35205ebd2c378fe373f7c9d9d00cf37f753e0d89d74949d8e1df6e5f7bfae6b2c350d8069faede9a014018a03ce4a168e3864cb15 - languageName: node - linkType: hard - -"hast-util-to-text@npm:^2.0.0": - version: 2.0.1 - resolution: "hast-util-to-text@npm:2.0.1" - dependencies: - hast-util-is-element: "npm:^1.0.0" - repeat-string: "npm:^1.0.0" - unist-util-find-after: "npm:^3.0.0" - checksum: 10c0/213b8f6fc1f137933fe52a386f99dbcc306c6c4e1bf0d5d3fc686cb75c844ab6e932956aaf1222dd414867ab714566c27a6b41bf3ab5176f57e9ee9c0f5ffb40 - languageName: node - linkType: hard - -"hast-util-whitespace@npm:^1.0.0": - version: 1.0.4 - resolution: "hast-util-whitespace@npm:1.0.4" - checksum: 10c0/434771896f151bca2954d3946f113dfbb8902e6305fa49d470ff2422c2b8c04b784490ecfacc26b2412c5dabfbc2ae1a1051c0ed0ca1c587e41204b5c0105d61 - languageName: node - linkType: hard - -"hastscript@npm:^6.0.0": - version: 6.0.0 - resolution: "hastscript@npm:6.0.0" - dependencies: - "@types/hast": "npm:^2.0.0" - comma-separated-tokens: "npm:^1.0.0" - hast-util-parse-selector: "npm:^2.0.0" - property-information: "npm:^5.0.0" - space-separated-tokens: "npm:^1.0.0" - checksum: 10c0/f76d9cf373cb075c8523c8ad52709f09f7e02b7c9d3152b8d35c65c265b9f1878bed6023f215a7d16523921036d40a7da292cb6f4399af9b5eccac2a5a5eb330 - languageName: node - linkType: hard - -"he@npm:^1.2.0": - version: 1.2.0 - resolution: "he@npm:1.2.0" - bin: - he: bin/he - checksum: 10c0/a27d478befe3c8192f006cdd0639a66798979dfa6e2125c6ac582a19a5ebfec62ad83e8382e6036170d873f46e4536a7e795bf8b95bf7c247f4cc0825ccc8c17 - languageName: node - linkType: hard - "hermes-estree@npm:0.25.1": version: 0.25.1 resolution: "hermes-estree@npm:0.25.1" @@ -11721,66 +8357,12 @@ __metadata: languageName: node linkType: hard -"history@npm:^4.9.0": - version: 4.10.1 - resolution: "history@npm:4.10.1" +"hosted-git-info@npm:^4.0.1": + version: 4.1.0 + resolution: "hosted-git-info@npm:4.1.0" dependencies: - "@babel/runtime": "npm:^7.1.2" - loose-envify: "npm:^1.2.0" - resolve-pathname: "npm:^3.0.0" - tiny-invariant: "npm:^1.0.2" - tiny-warning: "npm:^1.0.0" - value-equal: "npm:^1.0.1" - checksum: 10c0/35377694e4f10f2cf056a9cb1a8ee083e04e4b4717a63baeee4afd565658a62c7e73700bf9e82aa53dbe1ec94e0a25a83c080d63bad8ee6b274a98d2fbc5ed4c - languageName: node - linkType: hard - -"hogan.js@npm:^3.0.2": - version: 3.0.2 - resolution: "hogan.js@npm:3.0.2" - dependencies: - mkdirp: "npm:0.3.0" - nopt: "npm:1.0.10" - bin: - hulk: ./bin/hulk - checksum: 10c0/fa5c9d2eaf3fa712e72e67cce5e3435a1c5823282b81051514aefdca7d4b706cc4dbef7a34be19ee320c6ebaf3687d5781f12bc0aac04d3d902aa26861493679 - languageName: node - linkType: hard - -"hoist-non-react-statics@npm:^3.1.0": - version: 3.3.2 - resolution: "hoist-non-react-statics@npm:3.3.2" - dependencies: - react-is: "npm:^16.7.0" - checksum: 10c0/fe0889169e845d738b59b64badf5e55fa3cf20454f9203d1eb088df322d49d4318df774828e789898dcb280e8a5521bb59b3203385662ca5e9218a6ca5820e74 - languageName: node - linkType: hard - -"hosted-git-info@npm:^4.0.1": - version: 4.1.0 - resolution: "hosted-git-info@npm:4.1.0" - dependencies: - lru-cache: "npm:^6.0.0" - checksum: 10c0/150fbcb001600336d17fdbae803264abed013548eea7946c2264c49ebe2ebd8c4441ba71dd23dd8e18c65de79d637f98b22d4760ba5fb2e0b15d62543d0fff07 - languageName: node - linkType: hard - -"hpack.js@npm:^2.1.6": - version: 2.1.6 - resolution: "hpack.js@npm:2.1.6" - dependencies: - inherits: "npm:^2.0.1" - obuf: "npm:^1.0.0" - readable-stream: "npm:^2.0.1" - wbuf: "npm:^1.1.0" - checksum: 10c0/55b9e824430bab82a19d079cb6e33042d7d0640325678c9917fcc020c61d8a08ca671b6c942c7f0aae9bb6e4b67ffb50734a72f9e21d66407c3138c1983b70f0 - languageName: node - linkType: hard - -"html-entities@npm:^2.3.2": - version: 2.4.0 - resolution: "html-entities@npm:2.4.0" - checksum: 10c0/42bbd5d91f451625d7e35aaed41c8cd110054c0d0970764cb58df467b3f27f20199e8cf7b4aebc8d4eeaf17a27c0d1fb165f2852db85de200995d0f009c9011d + lru-cache: "npm:^6.0.0" + checksum: 10c0/150fbcb001600336d17fdbae803264abed013548eea7946c2264c49ebe2ebd8c4441ba71dd23dd8e18c65de79d637f98b22d4760ba5fb2e0b15d62543d0fff07 languageName: node linkType: hard @@ -11791,90 +8373,13 @@ __metadata: languageName: node linkType: hard -"html-minifier-terser@npm:^6.0.2, html-minifier-terser@npm:^6.1.0": - version: 6.1.0 - resolution: "html-minifier-terser@npm:6.1.0" - dependencies: - camel-case: "npm:^4.1.2" - clean-css: "npm:^5.2.2" - commander: "npm:^8.3.0" - he: "npm:^1.2.0" - param-case: "npm:^3.0.4" - relateurl: "npm:^0.2.7" - terser: "npm:^5.10.0" - bin: - html-minifier-terser: cli.js - checksum: 10c0/1aa4e4f01cf7149e3ac5ea84fb7a1adab86da40d38d77a6fff42852b5ee3daccb78b615df97264e3a6a5c33e57f0c77f471d607ca1e1debd1dab9b58286f4b5a - languageName: node - linkType: hard - -"html-tags@npm:^3.2.0": - version: 3.3.1 - resolution: "html-tags@npm:3.3.1" - checksum: 10c0/680165e12baa51bad7397452d247dbcc5a5c29dac0e6754b1187eee3bf26f514bc1907a431dd2f7eb56207611ae595ee76a0acc8eaa0d931e72c791dd6463d79 - languageName: node - linkType: hard - -"html-void-elements@npm:^1.0.0": - version: 1.0.5 - resolution: "html-void-elements@npm:1.0.5" - checksum: 10c0/97b6c108d7d6b31a45deddf95a65eb074bd0f358b55a61f3a031e055812eec368076ca23f0181674c5212166168988f35312756a3b376490e31e73d9a51f5549 - languageName: node - linkType: hard - -"html-webpack-plugin@npm:^5.5.0": - version: 5.5.3 - resolution: "html-webpack-plugin@npm:5.5.3" - dependencies: - "@types/html-minifier-terser": "npm:^6.0.0" - html-minifier-terser: "npm:^6.0.2" - lodash: "npm:^4.17.21" - pretty-error: "npm:^4.0.0" - tapable: "npm:^2.0.0" - peerDependencies: - webpack: ^5.20.0 - checksum: 10c0/7ba0d0f87d08f5c4c51f821842d736ec1762940bc39798932528adaec1e9cca8f52944987b88789007f5706d15110edbdfa30df445d61c6628b02ebe163c4f42 - languageName: node - linkType: hard - -"htmlparser2@npm:^6.1.0": - version: 6.1.0 - resolution: "htmlparser2@npm:6.1.0" - dependencies: - domelementtype: "npm:^2.0.1" - domhandler: "npm:^4.0.0" - domutils: "npm:^2.5.2" - entities: "npm:^2.0.0" - checksum: 10c0/3058499c95634f04dc66be8c2e0927cd86799413b2d6989d8ae542ca4dbf5fa948695d02c27d573acf44843af977aec6d9a7bdd0f6faa6b2d99e2a729b2a31b6 - languageName: node - linkType: hard - -"htmlparser2@npm:^8.0.1": - version: 8.0.2 - resolution: "htmlparser2@npm:8.0.2" - dependencies: - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - domutils: "npm:^3.0.1" - entities: "npm:^4.4.0" - checksum: 10c0/609cca85886d0bf2c9a5db8c6926a89f3764596877492e2caa7a25a789af4065bc6ee2cdc81807fe6b1d03a87bf8a373b5a754528a4cc05146b713c20575aab4 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0": +"http-cache-semantics@npm:^4.1.0": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc languageName: node linkType: hard -"http-deceiver@npm:^1.2.7": - version: 1.2.7 - resolution: "http-deceiver@npm:1.2.7" - checksum: 10c0/8bb9b716f5fc55f54a451da7f49b9c695c3e45498a789634daec26b61e4add7c85613a4a9e53726c39d09de7a163891ecd6eb5809adb64500a840fd86fe81d03 - languageName: node - linkType: hard - "http-errors@npm:2.0.0": version: 2.0.0 resolution: "http-errors@npm:2.0.0" @@ -11888,25 +8393,6 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:~1.6.2": - version: 1.6.3 - resolution: "http-errors@npm:1.6.3" - dependencies: - depd: "npm:~1.1.2" - inherits: "npm:2.0.3" - setprototypeof: "npm:1.1.0" - statuses: "npm:>= 1.4.0 < 2" - checksum: 10c0/17ec4046ee974477778bfdd525936c254b872054703ec2caa4d6f099566b8adade636ae6aeeacb39302c5cd6e28fb407ebd937f500f5010d0b6850750414ff78 - languageName: node - linkType: hard - -"http-parser-js@npm:>=0.5.1": - version: 0.5.8 - resolution: "http-parser-js@npm:0.5.8" - checksum: 10c0/4ed89f812c44f84c4ae5d43dd3a0c47942b875b63be0ed2ccecbe6b0018af867d806495fc6e12474aff868721163699c49246585bddea4f0ecc6d2b02e19faf1 - languageName: node - linkType: hard - "http-proxy-agent@npm:^5.0.0": version: 5.0.0 resolution: "http-proxy-agent@npm:5.0.0" @@ -11918,35 +8404,6 @@ __metadata: languageName: node linkType: hard -"http-proxy-middleware@npm:^2.0.3": - version: 2.0.9 - resolution: "http-proxy-middleware@npm:2.0.9" - dependencies: - "@types/http-proxy": "npm:^1.17.8" - http-proxy: "npm:^1.18.1" - is-glob: "npm:^4.0.1" - is-plain-obj: "npm:^3.0.0" - micromatch: "npm:^4.0.2" - peerDependencies: - "@types/express": ^4.17.13 - peerDependenciesMeta: - "@types/express": - optional: true - checksum: 10c0/8e9032af625f7c9f2f0d318f6cdb14eb725cc16ffe7b4ccccea25cf591fa819bb7c3bb579e0b543e0ae9c73059b505a6d728290c757bff27bae526a6ed11c05e - languageName: node - linkType: hard - -"http-proxy@npm:^1.18.1": - version: 1.18.1 - resolution: "http-proxy@npm:1.18.1" - dependencies: - eventemitter3: "npm:^4.0.0" - follow-redirects: "npm:^1.0.0" - requires-port: "npm:^1.0.0" - checksum: 10c0/148dfa700a03fb421e383aaaf88ac1d94521dfc34072f6c59770528c65250983c2e4ec996f2f03aa9f3fe46cd1270a593126068319311e3e8d9e610a37533e94 - languageName: node - linkType: hard - "https-proxy-agent@npm:^5.0.0": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" @@ -12015,15 +8472,6 @@ __metadata: languageName: node linkType: hard -"icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": - version: 5.1.0 - resolution: "icss-utils@npm:5.1.0" - peerDependencies: - postcss: ^8.1.0 - checksum: 10c0/39c92936fabd23169c8611d2b5cc39e39d10b19b0d223352f20a7579f75b39d5f786114a6b8fc62bee8c5fed59ba9e0d38f7219a4db383e324fb3061664b043d - languageName: node - linkType: hard - "idb@npm:8.0.3": version: 8.0.3 resolution: "idb@npm:8.0.3" @@ -12059,7 +8507,7 @@ __metadata: languageName: node linkType: hard -"image-size@npm:^1.0.1, image-size@npm:^1.0.2": +"image-size@npm:^1.0.2": version: 1.2.1 resolution: "image-size@npm:1.2.1" dependencies: @@ -12070,20 +8518,6 @@ __metadata: languageName: node linkType: hard -"immediate@npm:^3.2.3": - version: 3.3.0 - resolution: "immediate@npm:3.3.0" - checksum: 10c0/40eab095d5944ad79af054700beee97000271fde8743720932d8eb41ccbf2cb8c855ff95b128cf9a7fec523a4f11ee2e392b9f2fa6456b055b1160f1b4ad3e3b - languageName: node - linkType: hard - -"immer@npm:^9.0.7": - version: 9.0.21 - resolution: "immer@npm:9.0.21" - checksum: 10c0/03ea3ed5d4d72e8bd428df4a38ad7e483ea8308e9a113d3b42e0ea2cc0cc38340eb0a6aca69592abbbf047c685dbda04e3d34bf2ff438ab57339ed0a34cc0a05 - languageName: node - linkType: hard - "import-fresh@npm:^2.0.0": version: 2.0.0 resolution: "import-fresh@npm:2.0.0" @@ -12094,7 +8528,7 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": +"import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: @@ -12104,13 +8538,6 @@ __metadata: languageName: node linkType: hard -"import-lazy@npm:^2.1.0": - version: 2.1.0 - resolution: "import-lazy@npm:2.1.0" - checksum: 10c0/c5e5f507d26ee23c5b2ed64577155810361ac37863b322cae0c17f16b6a8cdd15adf370288384ddd95ef9de05602fb8d87bf76ff835190eb037333c84db8062c - languageName: node - linkType: hard - "import-local@npm:^3.0.2": version: 3.2.0 resolution: "import-local@npm:3.2.0" @@ -12151,13 +8578,6 @@ __metadata: languageName: node linkType: hard -"infima@npm:0.2.0-alpha.43": - version: 0.2.0-alpha.43 - resolution: "infima@npm:0.2.0-alpha.43" - checksum: 10c0/d248958713a97e1c9f73ace27ceff726ba86a9b534efb0ebdec3e72b785d8edb36db922e38ce09bbeb98a17b657e61357f22edc3a58f02ad51b7ae2ebd96e4e4 - languageName: node - linkType: hard - "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -12168,41 +8588,13 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.0, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 languageName: node linkType: hard -"inherits@npm:2.0.3": - version: 2.0.3 - resolution: "inherits@npm:2.0.3" - checksum: 10c0/6e56402373149ea076a434072671f9982f5fad030c7662be0332122fe6c0fa490acb3cc1010d90b6eff8d640b1167d77674add52dfd1bb85d545cf29e80e73e7 - languageName: node - linkType: hard - -"ini@npm:2.0.0": - version: 2.0.0 - resolution: "ini@npm:2.0.0" - checksum: 10c0/2e0c8f386369139029da87819438b20a1ff3fe58372d93fb1a86e9d9344125ace3a806b8ec4eb160a46e64cbc422fe68251869441676af49b7fc441af2389c25 - languageName: node - linkType: hard - -"ini@npm:^1.3.5, ini@npm:~1.3.0": - version: 1.3.8 - resolution: "ini@npm:1.3.8" - checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a - languageName: node - linkType: hard - -"inline-style-parser@npm:0.1.1": - version: 0.1.1 - resolution: "inline-style-parser@npm:0.1.1" - checksum: 10c0/08832a533f51a1e17619f2eabf2f5ec5e956d6dcba1896351285c65df022c9420de61d73256e1dca8015a52abf96cc84ddc3b73b898b22de6589d3962b5e501b - languageName: node - linkType: hard - "internal-slot@npm:^1.0.5": version: 1.0.6 resolution: "internal-slot@npm:1.0.6" @@ -12255,20 +8647,6 @@ __metadata: languageName: node linkType: hard -"ipaddr.js@npm:1.9.1": - version: 1.9.1 - resolution: "ipaddr.js@npm:1.9.1" - checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a - languageName: node - linkType: hard - -"ipaddr.js@npm:^2.0.1": - version: 2.1.0 - resolution: "ipaddr.js@npm:2.1.0" - checksum: 10c0/9aa43ff99771e3d14ab3683df3909b3b033fe81337646bc63780b00ec9bc51d4a696a047c0b261c05867c0a25086ab03f0ce32ea444a6b39e10fac1315d53cab - languageName: node - linkType: hard - "is-absolute@npm:^1.0.0": version: 1.0.0 resolution: "is-absolute@npm:1.0.0" @@ -12279,23 +8657,6 @@ __metadata: languageName: node linkType: hard -"is-alphabetical@npm:1.0.4, is-alphabetical@npm:^1.0.0": - version: 1.0.4 - resolution: "is-alphabetical@npm:1.0.4" - checksum: 10c0/1505b1de5a1fd74022c05fb21b0e683a8f5229366bac8dc4d34cf6935bcfd104d1125a5e6b083fb778847629f76e5bdac538de5367bdf2b927a1356164e23985 - languageName: node - linkType: hard - -"is-alphanumerical@npm:^1.0.0": - version: 1.0.4 - resolution: "is-alphanumerical@npm:1.0.4" - dependencies: - is-alphabetical: "npm:^1.0.0" - is-decimal: "npm:^1.0.0" - checksum: 10c0/d623abae7130a7015c6bf33d99151d4e7005572fd170b86568ff4de5ae86ac7096608b87dd4a1d4dbbd497e392b6396930ba76c9297a69455909cebb68005905 - languageName: node - linkType: hard - "is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": version: 3.0.2 resolution: "is-array-buffer@npm:3.0.2" @@ -12350,15 +8711,6 @@ __metadata: languageName: node linkType: hard -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: "npm:^2.0.0" - checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 - languageName: node - linkType: hard - "is-boolean-object@npm:^1.1.0": version: 1.1.2 resolution: "is-boolean-object@npm:1.1.2" @@ -12379,13 +8731,6 @@ __metadata: languageName: node linkType: hard -"is-buffer@npm:^2.0.0": - version: 2.0.5 - resolution: "is-buffer@npm:2.0.5" - checksum: 10c0/e603f6fced83cf94c53399cff3bda1a9f08e391b872b64a73793b0928be3e5f047f2bcece230edb7632eaea2acdbfcb56c23b33d8a20c820023b230f1485679a - languageName: node - linkType: hard - "is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" @@ -12393,17 +8738,6 @@ __metadata: languageName: node linkType: hard -"is-ci@npm:^2.0.0": - version: 2.0.0 - resolution: "is-ci@npm:2.0.0" - dependencies: - ci-info: "npm:^2.0.0" - bin: - is-ci: bin.js - checksum: 10c0/17de4e2cd8f993c56c86472dd53dd9e2c7f126d0ee55afe610557046cdd64de0e8feadbad476edc9eeff63b060523b8673d9094ed2ab294b59efb5a66dd05a9a - languageName: node - linkType: hard - "is-core-module@npm:^2.13.0": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" @@ -12452,13 +8786,6 @@ __metadata: languageName: node linkType: hard -"is-decimal@npm:^1.0.0": - version: 1.0.4 - resolution: "is-decimal@npm:1.0.4" - checksum: 10c0/a4ad53c4c5c4f5a12214e7053b10326711f6a71f0c63ba1314a77bd71df566b778e4ebd29f9fb6815f07a4dc50c3767fb19bd6fc9fa05e601410f1d64ffeac48 - languageName: node - linkType: hard - "is-directory@npm:^0.3.1": version: 0.3.1 resolution: "is-directory@npm:0.3.1" @@ -12466,7 +8793,7 @@ __metadata: languageName: node linkType: hard -"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": +"is-docker@npm:^2.0.0": version: 2.2.1 resolution: "is-docker@npm:2.2.1" bin: @@ -12475,13 +8802,6 @@ __metadata: languageName: node linkType: hard -"is-extendable@npm:^0.1.0": - version: 0.1.1 - resolution: "is-extendable@npm:0.1.1" - checksum: 10c0/dd5ca3994a28e1740d1e25192e66eed128e0b2ff161a7ea348e87ae4f616554b486854de423877a2a2c171d5f7cd6e8093b91f54533bc88a59ee1c9838c43879 - languageName: node - linkType: hard - "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -12548,7 +8868,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -12557,23 +8877,6 @@ __metadata: languageName: node linkType: hard -"is-hexadecimal@npm:^1.0.0": - version: 1.0.4 - resolution: "is-hexadecimal@npm:1.0.4" - checksum: 10c0/ec4c64e5624c0f240922324bc697e166554f09d3ddc7633fc526084502626445d0a871fbd8cae52a9844e83bd0bb414193cc5a66806d7b2867907003fc70c5ea - languageName: node - linkType: hard - -"is-installed-globally@npm:^0.4.0": - version: 0.4.0 - resolution: "is-installed-globally@npm:0.4.0" - dependencies: - global-dirs: "npm:^3.0.0" - is-path-inside: "npm:^3.0.2" - checksum: 10c0/f3e6220ee5824b845c9ed0d4b42c24272701f1f9926936e30c0e676254ca5b34d1b92c6205cae11b283776f9529212c0cdabb20ec280a6451677d6493ca9c22d - languageName: node - linkType: hard - "is-interactive@npm:^1.0.0": version: 1.0.0 resolution: "is-interactive@npm:1.0.0" @@ -12609,13 +8912,6 @@ __metadata: languageName: node linkType: hard -"is-npm@npm:^5.0.0": - version: 5.0.0 - resolution: "is-npm@npm:5.0.0" - checksum: 10c0/8ded3ae1119bbbda22395fe1c64d2d79d3b3baeb2635c90f9a9dca4b8ce19a67b55fda178269b63421b257b361892fd545807fb5ac212f06776f544d9fcc3ab0 - languageName: node - linkType: hard - "is-number-object@npm:^1.0.4": version: 1.0.6 resolution: "is-number-object@npm:1.0.6" @@ -12642,20 +8938,6 @@ __metadata: languageName: node linkType: hard -"is-obj@npm:^1.0.1": - version: 1.0.1 - resolution: "is-obj@npm:1.0.1" - checksum: 10c0/5003acba0af7aa47dfe0760e545a89bbac89af37c12092c3efadc755372cdaec034f130e7a3653a59eb3c1843cfc72ca71eaf1a6c3bafe5a0bab3611a47f9945 - languageName: node - linkType: hard - -"is-obj@npm:^2.0.0": - version: 2.0.0 - resolution: "is-obj@npm:2.0.0" - checksum: 10c0/85044ed7ba8bd169e2c2af3a178cacb92a97aa75de9569d02efef7f443a824b5e153eba72b9ae3aca6f8ce81955271aa2dc7da67a8b720575d3e38104208cb4e - languageName: node - linkType: hard - "is-path-cwd@npm:^2.2.0": version: 2.2.0 resolution: "is-path-cwd@npm:2.2.0" @@ -12691,29 +8973,6 @@ __metadata: languageName: node linkType: hard -"is-plain-obj@npm:^2.0.0": - version: 2.1.0 - resolution: "is-plain-obj@npm:2.1.0" - checksum: 10c0/e5c9814cdaa627a9ad0a0964ded0e0491bfd9ace405c49a5d63c88b30a162f1512c069d5b80997893c4d0181eadc3fed02b4ab4b81059aba5620bfcdfdeb9c53 - languageName: node - linkType: hard - -"is-plain-obj@npm:^3.0.0": - version: 3.0.0 - resolution: "is-plain-obj@npm:3.0.0" - checksum: 10c0/8e6483bfb051d42ec9c704c0ede051a821c6b6f9a6c7a3e3b55aa855e00981b0580c8f3b1f5e2e62649b39179b1abfee35d6f8086d999bfaa32c1908d29b07bc - languageName: node - linkType: hard - -"is-plain-object@npm:^2.0.4": - version: 2.0.4 - resolution: "is-plain-object@npm:2.0.4" - dependencies: - isobject: "npm:^3.0.1" - checksum: 10c0/f050fdd5203d9c81e8c4df1b3ff461c4bc64e8b5ca383bcdde46131361d0a678e80bcf00b5257646f6c636197629644d53bd8e2375aea633de09a82d57e942f4 - languageName: node - linkType: hard - "is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" @@ -12736,13 +8995,6 @@ __metadata: languageName: node linkType: hard -"is-regexp@npm:^1.0.0": - version: 1.0.0 - resolution: "is-regexp@npm:1.0.0" - checksum: 10c0/34cacda1901e00f6e44879378f1d2fa96320ea956c1bec27713130aaf1d44f6e7bd963eed28945bfe37e600cb27df1cf5207302680dad8bdd27b9baff8ecf611 - languageName: node - linkType: hard - "is-relative@npm:^1.0.0": version: 1.0.0 resolution: "is-relative@npm:1.0.0" @@ -12752,13 +9004,6 @@ __metadata: languageName: node linkType: hard -"is-root@npm:^2.1.0": - version: 2.1.0 - resolution: "is-root@npm:2.1.0" - checksum: 10c0/83d3f5b052c3f28fbdbdf0d564bdd34fa14933f5694c78704f85cd1871255bc017fbe3fe2bc2fff2d227c6be5927ad2149b135c0a7c0060e7ac4e610d81a4f01 - languageName: node - linkType: hard - "is-set@npm:^2.0.3": version: 2.0.3 resolution: "is-set@npm:2.0.3" @@ -12864,13 +9109,6 @@ __metadata: languageName: node linkType: hard -"is-typedarray@npm:^1.0.0": - version: 1.0.0 - resolution: "is-typedarray@npm:1.0.0" - checksum: 10c0/4c096275ba041a17a13cca33ac21c16bc4fd2d7d7eb94525e7cd2c2f2c1a3ab956e37622290642501ff4310601e413b675cf399ad6db49855527d2163b3eeeec - languageName: node - linkType: hard - "is-unc-path@npm:^1.0.0": version: 1.0.0 resolution: "is-unc-path@npm:1.0.0" @@ -12922,13 +9160,6 @@ __metadata: languageName: node linkType: hard -"is-whitespace-character@npm:^1.0.0": - version: 1.0.4 - resolution: "is-whitespace-character@npm:1.0.4" - checksum: 10c0/20f02cf42eafb44ff1706a04338dc45095cd691ae6984adb9a211b6b6df8d01e91722129ce55555e4c7c7b0b7d48e217553767f22eb7ec019b9f8dd3bc12cdfb - languageName: node - linkType: hard - "is-windows@npm:^1.0.0, is-windows@npm:^1.0.1": version: 1.0.2 resolution: "is-windows@npm:1.0.2" @@ -12936,13 +9167,6 @@ __metadata: languageName: node linkType: hard -"is-word-character@npm:^1.0.0": - version: 1.0.4 - resolution: "is-word-character@npm:1.0.4" - checksum: 10c0/2247844064532986dc70869d961dccd1366932a147b52d4ec7f567f87edf7f9855a27b75f66b781db3b3175bbe05a76acbc6392a1a5c64c4c99fe3459dae33bd - languageName: node - linkType: hard - "is-wsl@npm:^1.1.0": version: 1.1.0 resolution: "is-wsl@npm:1.1.0" @@ -12959,20 +9183,6 @@ __metadata: languageName: node linkType: hard -"is-yarn-global@npm:^0.3.0": - version: 0.3.0 - resolution: "is-yarn-global@npm:0.3.0" - checksum: 10c0/9f1ab6f28e6e7961c4b97e564791d1decf2886a0dbe9b92b2176d76156adbb42b4c06c0f33d7107b270c207cbcfe0b2293b7cc4a0ec6774ac6d37af9503d51e1 - languageName: node - linkType: hard - -"isarray@npm:0.0.1": - version: 0.0.1 - resolution: "isarray@npm:0.0.1" - checksum: 10c0/ed1e62da617f71fe348907c71743b5ed550448b455f8d269f89a7c7ddb8ae6e962de3dab6a74a237b06f5eb7f6ece7a45ada8ce96d87fe972926530f91ae3311 - languageName: node - linkType: hard - "isarray@npm:^2.0.5": version: 2.0.5 resolution: "isarray@npm:2.0.5" @@ -12980,13 +9190,6 @@ __metadata: languageName: node linkType: hard -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d - languageName: node - linkType: hard - "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -12994,13 +9197,6 @@ __metadata: languageName: node linkType: hard -"isobject@npm:^3.0.1": - version: 3.0.1 - resolution: "isobject@npm:3.0.1" - checksum: 10c0/03344f5064a82f099a0cd1a8a407f4c0d20b7b8485e8e816c39f249e9416b06c322e8dec5b842b6bb8a06de0af9cb48e7bc1b5352f0fadc2f0abac033db3d4db - languageName: node - linkType: hard - "istanbul-lib-coverage@npm:^3.0.0": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" @@ -13495,18 +9691,7 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^27.4.5": - version: 27.5.1 - resolution: "jest-worker@npm:27.5.1" - dependencies: - "@types/node": "npm:*" - merge-stream: "npm:^2.0.0" - supports-color: "npm:^8.0.0" - checksum: 10c0/8c4737ffd03887b3c6768e4cc3ca0269c0336c1e4b1b120943958ddb035ed2a0fc6acab6dc99631720a3720af4e708ff84fb45382ad1e83c27946adf3623969b - languageName: node - linkType: hard - -"jest-worker@npm:^29.1.2, jest-worker@npm:^29.7.0": +"jest-worker@npm:^29.7.0": version: 29.7.0 resolution: "jest-worker@npm:29.7.0" dependencies: @@ -13537,15 +9722,6 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^1.18.2": - version: 1.19.1 - resolution: "jiti@npm:1.19.1" - bin: - jiti: bin/jiti.js - checksum: 10c0/c09f15b3ef81f0fcda45f96aaecd130213c81d8a9b8a92f5eb4f8d21972b833b2ef494db8fb3e819b258ceb569b9d5cfa3facbd2d786ecf0bc0fd0e98cc862f7 - languageName: node - linkType: hard - "jiti@npm:^2.5.1": version: 2.5.1 resolution: "jiti@npm:2.5.1" @@ -13555,7 +9731,7 @@ __metadata: languageName: node linkType: hard -"joi@npm:^17.2.1, joi@npm:^17.6.0": +"joi@npm:^17.2.1": version: 17.9.2 resolution: "joi@npm:17.9.2" dependencies: @@ -13614,13 +9790,6 @@ __metadata: languageName: node linkType: hard -"json-buffer@npm:3.0.0": - version: 3.0.0 - resolution: "json-buffer@npm:3.0.0" - checksum: 10c0/118c060d84430a8ad8376d0c60250830f350a6381bd56541a1ef257ce7ba82d109d1f71a4c4e92e0be0e7ab7da568fad8f7bf02905910a76e8e0aa338621b944 - languageName: node - linkType: hard - "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -13635,7 +9804,7 @@ __metadata: languageName: node linkType: hard -"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": +"json-parse-even-better-errors@npm:^2.3.0": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 @@ -13663,7 +9832,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.2.1, json5@npm:^2.2.3": +"json5@npm:^2.2.1, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -13707,15 +9876,6 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^3.0.0": - version: 3.1.0 - resolution: "keyv@npm:3.1.0" - dependencies: - json-buffer: "npm:3.0.0" - checksum: 10c0/6ad784361b4c0213333a8c5bc0bcc59cf46cb7cbbe21fb2f1539ffcc8fe18b8f1562ff913b40552278fdea5f152a15996dfa61ce24ce1a22222560c650be4a1b - languageName: node - linkType: hard - "keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" @@ -13725,7 +9885,7 @@ __metadata: languageName: node linkType: hard -"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": +"kind-of@npm:^6.0.3": version: 6.0.3 resolution: "kind-of@npm:6.0.3" checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 @@ -13746,25 +9906,6 @@ __metadata: languageName: node linkType: hard -"latest-version@npm:^5.1.0": - version: 5.1.0 - resolution: "latest-version@npm:5.1.0" - dependencies: - package-json: "npm:^6.3.0" - checksum: 10c0/6219631d8651467c54c58ef1b5d5c5c53e146f5ae2b0ecbb78b202da3eaad55b05b043db2d2d6f1d4230ee071b2ae8c2f85089e01377e4338bad97fa76a963b7 - languageName: node - linkType: hard - -"launch-editor@npm:^2.6.0": - version: 2.6.0 - resolution: "launch-editor@npm:2.6.0" - dependencies: - picocolors: "npm:^1.0.0" - shell-quote: "npm:^1.7.3" - checksum: 10c0/4802b9569d8a1d477f8279a994094b415d89eb39dadbc568193bc366d64ac13827c8860539ee336fa6135a06596a9b8c8265cebac35c3fa36a2214d0eea38890 - languageName: node - linkType: hard - "launch-editor@npm:^2.9.1": version: 2.11.1 resolution: "launch-editor@npm:2.11.1" @@ -13921,13 +10062,6 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:^2.0.3": - version: 2.1.0 - resolution: "lilconfig@npm:2.1.0" - checksum: 10c0/64645641aa8d274c99338e130554abd6a0190533c0d9eb2ce7ebfaf2e05c7d9961f3ffe2bfa39efd3b60c521ba3dd24fa236fe2775fc38501bf82bf49d4678b8 - languageName: node - linkType: hard - "lines-and-columns@npm:^1.1.6": version: 1.1.6 resolution: "lines-and-columns@npm:1.1.6" @@ -13959,41 +10093,6 @@ __metadata: languageName: node linkType: hard -"loader-runner@npm:^4.2.0": - version: 4.3.0 - resolution: "loader-runner@npm:4.3.0" - checksum: 10c0/a44d78aae0907a72f73966fe8b82d1439c8c485238bd5a864b1b9a2a3257832effa858790241e6b37876b5446a78889adf2fcc8dd897ce54c089ecc0a0ce0bf0 - languageName: node - linkType: hard - -"loader-utils@npm:^2.0.0": - version: 2.0.4 - resolution: "loader-utils@npm:2.0.4" - dependencies: - big.js: "npm:^5.2.2" - emojis-list: "npm:^3.0.0" - json5: "npm:^2.1.2" - checksum: 10c0/d5654a77f9d339ec2a03d88221a5a695f337bf71eb8dea031b3223420bb818964ba8ed0069145c19b095f6c8b8fd386e602a3fc7ca987042bd8bb1dcc90d7100 - languageName: node - linkType: hard - -"loader-utils@npm:^3.2.0": - version: 3.2.1 - resolution: "loader-utils@npm:3.2.1" - checksum: 10c0/d3e1f217d160e8e894a0385a33500d4ce14065e8ffb250f5a81ae65bc2c3baa50625ec34182ba4417b46b4ac6725aed64429e1104d6401e074af2aa1dd018394 - languageName: node - linkType: hard - -"locate-path@npm:^3.0.0": - version: 3.0.0 - resolution: "locate-path@npm:3.0.0" - dependencies: - p-locate: "npm:^3.0.0" - path-exists: "npm:^3.0.0" - checksum: 10c0/3db394b7829a7fe2f4fbdd25d3c4689b85f003c318c5da4052c7e56eed697da8f1bce5294f685c69ff76e32cba7a33629d94396976f6d05fb7f4c755c5e2ae8b - languageName: node - linkType: hard - "locate-path@npm:^5.0.0": version: 5.0.0 resolution: "locate-path@npm:5.0.0" @@ -14012,13 +10111,6 @@ __metadata: languageName: node linkType: hard -"lodash.curry@npm:^4.0.1": - version: 4.1.1 - resolution: "lodash.curry@npm:4.1.1" - checksum: 10c0/f0431947dc9236df879fc13eb40c31a2839c958bd0eaa39170a5758c25a7d85d461716a851ab45a175371950b283480615cdd4b07fb0dd1afff7a2914a90696f - languageName: node - linkType: hard - "lodash.debounce@npm:^4.0.8": version: 4.0.8 resolution: "lodash.debounce@npm:4.0.8" @@ -14026,13 +10118,6 @@ __metadata: languageName: node linkType: hard -"lodash.flow@npm:^3.3.0": - version: 3.5.0 - resolution: "lodash.flow@npm:3.5.0" - checksum: 10c0/b3202ddbb79e5aab41719806d0d5ae969f64ae6b59e6bdaaecaa96ec68d6ba429e544017fe0e71ecf5b7ee3cea7b45d43c46b7d67ca159d6cca86fca76c61a31 - languageName: node - linkType: hard - "lodash.isequal@npm:4.5.0": version: 4.5.0 resolution: "lodash.isequal@npm:4.5.0" @@ -14040,13 +10125,6 @@ __metadata: languageName: node linkType: hard -"lodash.memoize@npm:^4.1.2": - version: 4.1.2 - resolution: "lodash.memoize@npm:4.1.2" - checksum: 10c0/c8713e51eccc650422716a14cece1809cfe34bc5ab5e242b7f8b4e2241c2483697b971a604252807689b9dd69bfe3a98852e19a5b89d506b000b4187a1285df8 - languageName: node - linkType: hard - "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -14068,14 +10146,7 @@ __metadata: languageName: node linkType: hard -"lodash.uniq@npm:4.5.0, lodash.uniq@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.uniq@npm:4.5.0" - checksum: 10c0/262d400bb0952f112162a320cc4a75dea4f66078b9e7e3075ffbc9c6aa30b3e9df3cf20e7da7d566105e1ccf7804e4fbd7d804eee0b53de05d83f16ffbf41c5e - languageName: node - linkType: hard - -"lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21": +"lodash@npm:^4.17.15, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c @@ -14114,7 +10185,7 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.2.0, loose-envify@npm:^1.3.1, loose-envify@npm:^1.4.0": +"loose-envify@npm:^1.0.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -14125,29 +10196,6 @@ __metadata: languageName: node linkType: hard -"lower-case@npm:^2.0.2": - version: 2.0.2 - resolution: "lower-case@npm:2.0.2" - dependencies: - tslib: "npm:^2.0.3" - checksum: 10c0/3d925e090315cf7dc1caa358e0477e186ffa23947740e4314a7429b6e62d72742e0bbe7536a5ae56d19d7618ce998aba05caca53c2902bd5742fdca5fc57fd7b - languageName: node - linkType: hard - -"lowercase-keys@npm:^1.0.0, lowercase-keys@npm:^1.0.1": - version: 1.0.1 - resolution: "lowercase-keys@npm:1.0.1" - checksum: 10c0/56776a8e1ef1aca98ecf6c19b30352ae1cf257b65b8ac858b7d8a0e8b348774d12a9b41aa7f59bfea51bff44bc7a198ab63ba4406bfba60dba008799618bef66 - languageName: node - linkType: hard - -"lowercase-keys@npm:^2.0.0": - version: 2.0.0 - resolution: "lowercase-keys@npm:2.0.0" - checksum: 10c0/f82a2b3568910509da4b7906362efa40f5b54ea14c2584778ddb313226f9cbf21020a5db35f9b9a0e95847a9b781d548601f31793d736b22a2b8ae8eb9ab1082 - languageName: node - linkType: hard - "lru-cache@npm:^4.0.1": version: 4.1.5 resolution: "lru-cache@npm:4.1.5" @@ -14183,20 +10231,6 @@ __metadata: languageName: node linkType: hard -"lunr-languages@npm:^1.4.0": - version: 1.14.0 - resolution: "lunr-languages@npm:1.14.0" - checksum: 10c0/5dc26fa75c8f3f14a69b3d54ae1228907b3552bc26727a14c5f302aab05d2547a924d095f075c9d3439756a38e2dafb78d1b74fc862dc290a13ddce236a55e87 - languageName: node - linkType: hard - -"lunr@npm:^2.3.8": - version: 2.3.9 - resolution: "lunr@npm:2.3.9" - checksum: 10c0/77d7dbb4fbd602aac161e2b50887d8eda28c0fa3b799159cee380fbb311f1e614219126ecbbd2c3a9c685f1720a8109b3c1ca85cc893c39b6c9cc6a62a1d8a8b - languageName: node - linkType: hard - "magic-string@npm:^0.30.18": version: 0.30.19 resolution: "magic-string@npm:0.30.19" @@ -14206,15 +10240,6 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^3.0.0, make-dir@npm:^3.0.2, make-dir@npm:^3.1.0": - version: 3.1.0 - resolution: "make-dir@npm:3.1.0" - dependencies: - semver: "npm:^6.0.0" - checksum: 10c0/56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa - languageName: node - linkType: hard - "make-dir@npm:^4.0.0": version: 4.0.0 resolution: "make-dir@npm:4.0.0" @@ -14280,20 +10305,6 @@ __metadata: languageName: node linkType: hard -"mark.js@npm:^8.11.1": - version: 8.11.1 - resolution: "mark.js@npm:8.11.1" - checksum: 10c0/5e69e776db61abdd857b5cbb7070c8a3b1b0e5c12bf077fcd5a8c6f17b1f85ed65275aba5662b57136d1b9f82b54bb34d4ef4220f7703c9a7ab806ae1e208cff - languageName: node - linkType: hard - -"markdown-escapes@npm:^1.0.0": - version: 1.0.4 - resolution: "markdown-escapes@npm:1.0.4" - checksum: 10c0/cf3f2231191d9df61cd1d02a50a55a5c89ab9cebfe75572950f4844b93a41d561eed2d82e42732d55f2c55fa0d426b51df3a7f378b4068ae1e2923bb758a9cc8 - languageName: node - linkType: hard - "marky@npm:^1.2.2": version: 1.2.5 resolution: "marky@npm:1.2.5" @@ -14308,61 +10319,6 @@ __metadata: languageName: node linkType: hard -"mdast-squeeze-paragraphs@npm:^4.0.0": - version: 4.0.0 - resolution: "mdast-squeeze-paragraphs@npm:4.0.0" - dependencies: - unist-util-remove: "npm:^2.0.0" - checksum: 10c0/0b44a85d7e6d98772b1dbb28a46a35c74c2791c6cf057bfd2e590a4e011d626627e5bf82d4497706f0dae03da02a63a9279aca17c4c23a9c7173792adba8e6fc - languageName: node - linkType: hard - -"mdast-util-definitions@npm:^4.0.0": - version: 4.0.0 - resolution: "mdast-util-definitions@npm:4.0.0" - dependencies: - unist-util-visit: "npm:^2.0.0" - checksum: 10c0/d81bb0b702f99878c8e8e4f66dd7f6f673ab341f061b3d9487ba47dad28b584e02f16b4c42df23714eaac8a7dd8544ba7d77308fad8d4a9fd0ac92e2a7f56be9 - languageName: node - linkType: hard - -"mdast-util-to-hast@npm:10.0.1": - version: 10.0.1 - resolution: "mdast-util-to-hast@npm:10.0.1" - dependencies: - "@types/mdast": "npm:^3.0.0" - "@types/unist": "npm:^2.0.0" - mdast-util-definitions: "npm:^4.0.0" - mdurl: "npm:^1.0.0" - unist-builder: "npm:^2.0.0" - unist-util-generated: "npm:^1.0.0" - unist-util-position: "npm:^3.0.0" - unist-util-visit: "npm:^2.0.0" - checksum: 10c0/08d0977c60ee951cb5e2e84bc821a842da463c37f7bbb79abf0be0894120ed5e2fc1d003d072d3bb968d8e813a916e132a094166d5562deb424acc45e1c661f4 - languageName: node - linkType: hard - -"mdast-util-to-string@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-to-string@npm:2.0.0" - checksum: 10c0/a4231085133cdfec24644b694c13661e5a01d26716be0105b6792889faa04b8030e4abbf72d4be3363098b2b38b2b98f1f1f1f0858eb6580dc04e2aca1436a37 - languageName: node - linkType: hard - -"mdn-data@npm:2.0.14": - version: 2.0.14 - resolution: "mdn-data@npm:2.0.14" - checksum: 10c0/67241f8708c1e665a061d2b042d2d243366e93e5bf1f917693007f6d55111588b952dcbfd3ea9c2d0969fb754aad81b30fdcfdcc24546495fc3b24336b28d4bd - languageName: node - linkType: hard - -"mdurl@npm:^1.0.0": - version: 1.0.1 - resolution: "mdurl@npm:1.0.1" - checksum: 10c0/ea8534341eb002aaa532a722daef6074cd8ca66202e10a2b4cda46722c1ebdb1da92197ac300bc953d3ef1bf41cd6561ef2cc69d82d5d0237dae00d4a61a4eee - languageName: node - linkType: hard - "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -14392,15 +10348,6 @@ __metadata: languageName: node linkType: hard -"memfs@npm:^3.1.2, memfs@npm:^3.4.3": - version: 3.5.3 - resolution: "memfs@npm:3.5.3" - dependencies: - fs-monkey: "npm:^1.0.4" - checksum: 10c0/038fc81bce17ea92dde15aaa68fa0fdaf4960c721ce3ffc7c2cb87a259333f5159784ea48b3b72bf9e054254d9d0d0d5209d0fdc3d07d08653a09933b168fbd7 - languageName: node - linkType: hard - "memoize-one@npm:^5.0.0": version: 5.2.1 resolution: "memoize-one@npm:5.2.1" @@ -14428,13 +10375,6 @@ __metadata: languageName: node linkType: hard -"merge-descriptors@npm:1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: 10c0/b67d07bd44cfc45cebdec349bb6e1f7b077ee2fd5beb15d1f7af073849208cb6f144fe403e29a36571baf3f4e86469ac39acf13c318381e958e186b2766f54ec - languageName: node - linkType: hard - "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -14456,13 +10396,6 @@ __metadata: languageName: node linkType: hard -"methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 - languageName: node - linkType: hard - "metro-babel-transformer@npm:0.82.5": version: 0.82.5 resolution: "metro-babel-transformer@npm:0.82.5" @@ -14688,7 +10621,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -14705,23 +10638,7 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:~1.33.0": - version: 1.33.0 - resolution: "mime-db@npm:1.33.0" - checksum: 10c0/79172ce5468c8503b49dddfdddc18d3f5fe2599f9b5fe1bc321a8cbee14c96730fc6db22f907b23701b05b2936f865795f62ec3a78a7f3c8cb2450bb68c6763e - languageName: node - linkType: hard - -"mime-types@npm:2.1.18": - version: 2.1.18 - resolution: "mime-types@npm:2.1.18" - dependencies: - mime-db: "npm:~1.33.0" - checksum: 10c0/a96a8d12f4bb98bc7bfac6a8ccbd045f40368fc1030d9366050c3613825d3715d1c1f393e10a75a885d2cdc1a26cd6d5e11f3a2a0d5c4d361f00242139430a0f - languageName: node - linkType: hard - -"mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.27, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -14762,13 +10679,6 @@ __metadata: languageName: node linkType: hard -"mimic-response@npm:^1.0.0, mimic-response@npm:^1.0.1": - version: 1.0.1 - resolution: "mimic-response@npm:1.0.1" - checksum: 10c0/c5381a5eae997f1c3b5e90ca7f209ed58c3615caeee850e85329c598f0c000ae7bec40196580eef1781c60c709f47258131dab237cad8786f8f56750594f27fa - languageName: node - linkType: hard - "min-indent@npm:^1.0.1": version: 1.0.1 resolution: "min-indent@npm:1.0.1" @@ -14776,25 +10686,7 @@ __metadata: languageName: node linkType: hard -"mini-css-extract-plugin@npm:^2.6.1": - version: 2.7.6 - resolution: "mini-css-extract-plugin@npm:2.7.6" - dependencies: - schema-utils: "npm:^4.0.0" - peerDependencies: - webpack: ^5.0.0 - checksum: 10c0/4862da928f52c18b37daa52d548c9f2a1ac65c900a48b63f7faa3354d8cfcd21618c049696559e73e2e27fc12d46748e6a490e0b885e54276429607d0d08c156 - languageName: node - linkType: hard - -"minimalistic-assert@npm:^1.0.0": - version: 1.0.1 - resolution: "minimalistic-assert@npm:1.0.1" - checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd - languageName: node - linkType: hard - -"minimatch@npm:3.1.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -14832,7 +10724,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 @@ -14932,13 +10824,6 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:0.3.0": - version: 0.3.0 - resolution: "mkdirp@npm:0.3.0" - checksum: 10c0/cd9e54878490571df79770de1cdceba48ab6682c004616666d23a38315feaf5822d443aeb500ac298a12d7f6f5e11dc05cea3207d500e547d938218bf22d8629 - languageName: node - linkType: hard - "mkdirp@npm:^0.5.1": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" @@ -14975,13 +10860,6 @@ __metadata: languageName: node linkType: hard -"mrmime@npm:^1.0.0": - version: 1.0.1 - resolution: "mrmime@npm:1.0.1" - checksum: 10c0/ab071441da76fd23b3b0d1823d77aacf8679d379a4a94cacd83e487d3d906763b277f3203a594c613602e31ab5209c26a8119b0477c4541ef8555b293a9db6d3 - languageName: node - linkType: hard - "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -15003,18 +10881,6 @@ __metadata: languageName: node linkType: hard -"multicast-dns@npm:^7.2.5": - version: 7.2.5 - resolution: "multicast-dns@npm:7.2.5" - dependencies: - dns-packet: "npm:^5.2.2" - thunky: "npm:^1.0.2" - bin: - multicast-dns: cli.js - checksum: 10c0/5120171d4bdb1577764c5afa96e413353bff530d1b37081cb29cccc747f989eb1baf40574fe8e27060fc1aef72b59c042f72b9b208413de33bcf411343c69057 - languageName: node - linkType: hard - "mustache@npm:^4.0.1": version: 4.2.0 resolution: "mustache@npm:4.2.0" @@ -15033,15 +10899,6 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.6": - version: 3.3.6 - resolution: "nanoid@npm:3.3.6" - bin: - nanoid: bin/nanoid.cjs - checksum: 10c0/606b355960d0fcbe3d27924c4c52ef7d47d3b57208808ece73279420d91469b01ec1dce10fae512b6d4a8c5a5432b352b228336a8b2202a6ea68e67fa348e2ee - languageName: node - linkType: hard - "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -15056,13 +10913,6 @@ __metadata: languageName: node linkType: hard -"neo-async@npm:^2.6.2": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: 10c0/c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d - languageName: node - linkType: hard - "nice-try@npm:^1.0.4": version: 1.0.5 resolution: "nice-try@npm:1.0.5" @@ -15070,16 +10920,6 @@ __metadata: languageName: node linkType: hard -"no-case@npm:^3.0.4": - version: 3.0.4 - resolution: "no-case@npm:3.0.4" - dependencies: - lower-case: "npm:^2.0.2" - tslib: "npm:^2.0.3" - checksum: 10c0/8ef545f0b3f8677c848f86ecbd42ca0ff3cd9dd71c158527b344c69ba14710d816d8489c746b6ca225e7b615108938a0bda0a54706f8c255933703ac1cf8e703 - languageName: node - linkType: hard - "nocache@npm:^3.0.1": version: 3.0.4 resolution: "nocache@npm:3.0.4" @@ -15087,36 +10927,6 @@ __metadata: languageName: node linkType: hard -"node-emoji@npm:^1.10.0": - version: 1.11.0 - resolution: "node-emoji@npm:1.11.0" - dependencies: - lodash: "npm:^4.17.21" - checksum: 10c0/5dac6502dbef087092d041fcc2686d8be61168593b3a9baf964d62652f55a3a9c2277f171b81cccb851ccef33f2d070f45e633fab1fda3264f8e1ae9041c673f - languageName: node - linkType: hard - -"node-fetch@npm:^2.6.11": - version: 2.7.0 - resolution: "node-fetch@npm:2.7.0" - dependencies: - whatwg-url: "npm:^5.0.0" - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 - languageName: node - linkType: hard - -"node-forge@npm:^1": - version: 1.3.1 - resolution: "node-forge@npm:1.3.1" - checksum: 10c0/e882819b251a4321f9fc1d67c85d1501d3004b4ee889af822fd07f64de3d1a8e272ff00b689570af0465d65d6bf5074df9c76e900e0aff23e60b847f2a46fbe8 - languageName: node - linkType: hard - "node-gyp@npm:latest": version: 9.3.1 resolution: "node-gyp@npm:9.3.1" @@ -15158,17 +10968,6 @@ __metadata: languageName: node linkType: hard -"nopt@npm:1.0.10": - version: 1.0.10 - resolution: "nopt@npm:1.0.10" - dependencies: - abbrev: "npm:1" - bin: - nopt: ./bin/nopt.js - checksum: 10c0/ddfbd892116a125fd68849ef564dd5b1f0a5ba0dbbf18782e9499e2efad8f4d3790635b47c6b5d3f7e014069e7b3ce5b8112687e9ae093fcd2678188c866fe28 - languageName: node - linkType: hard - "nopt@npm:^6.0.0": version: 6.0.0 resolution: "nopt@npm:6.0.0" @@ -15192,41 +10991,13 @@ __metadata: languageName: node linkType: hard -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": +"normalize-path@npm:^3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 languageName: node linkType: hard -"normalize-range@npm:^0.1.2": - version: 0.1.2 - resolution: "normalize-range@npm:0.1.2" - checksum: 10c0/bf39b73a63e0a42ad1a48c2bd1bda5a07ede64a7e2567307a407674e595bcff0fa0d57e8e5f1e7fa5e91000797c7615e13613227aaaa4d6d6e87f5bd5cc95de6 - languageName: node - linkType: hard - -"normalize-url@npm:^4.1.0": - version: 4.5.1 - resolution: "normalize-url@npm:4.5.1" - checksum: 10c0/6362e9274fdcc310f8b17e20de29754c94e1820d864114f03d3bfd6286a0028fc51705fb3fd4e475013357b5cd7421fc17f3aba93f2289056779a9bb23bccf59 - languageName: node - linkType: hard - -"normalize-url@npm:^6.0.1": - version: 6.1.0 - resolution: "normalize-url@npm:6.1.0" - checksum: 10c0/95d948f9bdd2cfde91aa786d1816ae40f8262946e13700bf6628105994fe0ff361662c20af3961161c38a119dc977adeb41fc0b41b1745eb77edaaf9cb22db23 - languageName: node - linkType: hard - -"not@npm:^0.1.0": - version: 0.1.0 - resolution: "not@npm:0.1.0" - checksum: 10c0/b75d7b2e41d73e2e1cb3327826d53667b41bc6ff7d7ff1d8014ad3bf410d4ecd46f512683b22a4c043e03cbb2b0a483aa69232d4bf9c0e2ee1a9127fe02f047a - languageName: node - linkType: hard - "npm-run-path@npm:^2.0.0": version: 2.0.2 resolution: "npm-run-path@npm:2.0.2" @@ -15257,22 +11028,6 @@ __metadata: languageName: node linkType: hard -"nprogress@npm:^0.2.0": - version: 0.2.0 - resolution: "nprogress@npm:0.2.0" - checksum: 10c0/eab9a923a1ad1eed71a455ecfbc358442dd9bcd71b9fa3fa1c67eddf5159360b182c218f76fca320c97541a1b45e19ced04e6dcb044a662244c5419f8ae9e821 - languageName: node - linkType: hard - -"nth-check@npm:^2.0.0, nth-check@npm:^2.0.1": - version: 2.1.1 - resolution: "nth-check@npm:2.1.1" - dependencies: - boolbase: "npm:^1.0.0" - checksum: 10c0/5fee7ff309727763689cfad844d979aedd2204a817fbaaf0e1603794a7c20db28548d7b024692f953557df6ce4a0ee4ae46cd8ebd9b36cfb300b9226b567c479 - languageName: node - linkType: hard - "nullthrows@npm:^1.1.1": version: 1.1.1 resolution: "nullthrows@npm:1.1.1" @@ -15289,7 +11044,7 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": +"object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 @@ -15317,7 +11072,7 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.0, object.assign@npm:^4.1.2, object.assign@npm:^4.1.4": +"object.assign@npm:^4.1.2, object.assign@npm:^4.1.4": version: 4.1.4 resolution: "object.assign@npm:4.1.4" dependencies: @@ -15379,13 +11134,6 @@ __metadata: languageName: node linkType: hard -"obuf@npm:^1.0.0, obuf@npm:^1.1.2": - version: 1.1.2 - resolution: "obuf@npm:1.1.2" - checksum: 10c0/520aaac7ea701618eacf000fc96ae458e20e13b0569845800fc582f81b386731ab22d55354b4915d58171db00e79cfcd09c1638c02f89577ef092b38c65b7d81 - languageName: node - linkType: hard - "on-finished@npm:2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" @@ -15457,26 +11205,6 @@ __metadata: languageName: node linkType: hard -"open@npm:^8.0.9, open@npm:^8.4.0": - version: 8.4.2 - resolution: "open@npm:8.4.2" - dependencies: - define-lazy-prop: "npm:^2.0.0" - is-docker: "npm:^2.1.1" - is-wsl: "npm:^2.2.0" - checksum: 10c0/bb6b3a58401dacdb0aad14360626faf3fb7fba4b77816b373495988b724fb48941cad80c1b65d62bb31a17609b2cd91c41a181602caea597ca80dfbcc27e84c9 - languageName: node - linkType: hard - -"opener@npm:^1.5.2": - version: 1.5.2 - resolution: "opener@npm:1.5.2" - bin: - opener: bin/opener-bin.js - checksum: 10c0/dd56256ab0cf796585617bc28e06e058adf09211781e70b264c76a1dbe16e90f868c974e5bf5309c93469157c7d14b89c35dc53fe7293b0e40b4d2f92073bc79 - languageName: node - linkType: hard - "optionator@npm:^0.9.3": version: 0.9.3 resolution: "optionator@npm:0.9.3" @@ -15558,13 +11286,6 @@ __metadata: languageName: node linkType: hard -"p-cancelable@npm:^1.0.0": - version: 1.1.0 - resolution: "p-cancelable@npm:1.1.0" - checksum: 10c0/9f16d7d58897edb07b1a9234b2bfce3665c747f0f13886e25e2144ecab4595412017cc8cc3b0042f89864b997d6dba76c130724e1c0923fc41ff3c9399b87449 - languageName: node - linkType: hard - "p-defer@npm:^1.0.0": version: 1.0.0 resolution: "p-defer@npm:1.0.0" @@ -15595,7 +11316,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^2.0.0, p-limit@npm:^2.2.0": +"p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" dependencies: @@ -15613,15 +11334,6 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^3.0.0": - version: 3.0.0 - resolution: "p-locate@npm:3.0.0" - dependencies: - p-limit: "npm:^2.0.0" - checksum: 10c0/7b7f06f718f19e989ce6280ed4396fb3c34dabdee0df948376483032f9d5ec22fdf7077ec942143a75827bb85b11da72016497fc10dac1106c837ed593969ee8 - languageName: node - linkType: hard - "p-locate@npm:^4.1.0": version: 4.1.0 resolution: "p-locate@npm:4.1.0" @@ -15665,16 +11377,6 @@ __metadata: languageName: node linkType: hard -"p-retry@npm:^4.5.0": - version: 4.6.2 - resolution: "p-retry@npm:4.6.2" - dependencies: - "@types/retry": "npm:0.12.0" - retry: "npm:^0.13.1" - checksum: 10c0/d58512f120f1590cfedb4c2e0c42cb3fa66f3cea8a4646632fcb834c56055bb7a6f138aa57b20cc236fb207c9d694e362e0b5c2b14d9b062f67e8925580c73b0 - languageName: node - linkType: hard - "p-try@npm:^2.0.0": version: 2.2.0 resolution: "p-try@npm:2.2.0" @@ -15682,28 +11384,6 @@ __metadata: languageName: node linkType: hard -"package-json@npm:^6.3.0": - version: 6.5.0 - resolution: "package-json@npm:6.5.0" - dependencies: - got: "npm:^9.6.0" - registry-auth-token: "npm:^4.0.0" - registry-url: "npm:^5.0.0" - semver: "npm:^6.2.0" - checksum: 10c0/60c29fe357af43f96c92c334aa0160cebde44e8e65c1e5f9b065efb3f501af812f268ec967a07757b56447834ef7f71458ebbab94425a9f09c271f348f9b764f - languageName: node - linkType: hard - -"param-case@npm:^3.0.4": - version: 3.0.4 - resolution: "param-case@npm:3.0.4" - dependencies: - dot-case: "npm:^3.0.4" - tslib: "npm:^2.0.3" - checksum: 10c0/ccc053f3019f878eca10e70ec546d92f51a592f762917dafab11c8b532715dcff58356118a6f350976e4ab109e321756f05739643ed0ca94298e82291e6f9e76 - languageName: node - linkType: hard - "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -15713,20 +11393,6 @@ __metadata: languageName: node linkType: hard -"parse-entities@npm:^2.0.0": - version: 2.0.0 - resolution: "parse-entities@npm:2.0.0" - dependencies: - character-entities: "npm:^1.0.0" - character-entities-legacy: "npm:^1.0.0" - character-reference-invalid: "npm:^1.0.0" - is-alphanumerical: "npm:^1.0.0" - is-decimal: "npm:^1.0.0" - is-hexadecimal: "npm:^1.0.0" - checksum: 10c0/f85a22c0ea406ff26b53fdc28641f01cc36fa49eb2e3135f02693286c89ef0bcefc2262d99b3688e20aac2a14fd10b75c518583e875c1b9fe3d1f937795e0854 - languageName: node - linkType: hard - "parse-json@npm:^4.0.0": version: 4.0.0 resolution: "parse-json@npm:4.0.0" @@ -15737,7 +11403,7 @@ __metadata: languageName: node linkType: hard -"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": +"parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" dependencies: @@ -15749,88 +11415,31 @@ __metadata: languageName: node linkType: hard -"parse-numeric-range@npm:^1.3.0": - version: 1.3.0 - resolution: "parse-numeric-range@npm:1.3.0" - checksum: 10c0/53465afaa92111e86697281b684aa4574427360889cc23a1c215488c06b72441febdbf09f47ab0bef9a0c701e059629f3eebd2fe6fb241a254ad7a7a642aebe8 +"parseurl@npm:~1.3.3": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 languageName: node linkType: hard -"parse5-htmlparser2-tree-adapter@npm:^7.0.0": - version: 7.0.0 - resolution: "parse5-htmlparser2-tree-adapter@npm:7.0.0" - dependencies: - domhandler: "npm:^5.0.2" - parse5: "npm:^7.0.0" - checksum: 10c0/e820cacb8486e6f7ede403327d18480df086d70e32ede2f6654d8c3a8b4b8dc4a4d5c21c03c18a92ba2466c513b93ca63be4a138dd73cd0995f384eb3b9edf11 +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b languageName: node linkType: hard -"parse5@npm:^6.0.0": - version: 6.0.1 - resolution: "parse5@npm:6.0.1" - checksum: 10c0/595821edc094ecbcfb9ddcb46a3e1fe3a718540f8320eff08b8cf6742a5114cce2d46d45f95c26191c11b184dcaf4e2960abcd9c5ed9eb9393ac9a37efcfdecb +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 languageName: node linkType: hard -"parse5@npm:^7.0.0": - version: 7.1.2 - resolution: "parse5@npm:7.1.2" - dependencies: - entities: "npm:^4.4.0" - checksum: 10c0/297d7af8224f4b5cb7f6617ecdae98eeaed7f8cbd78956c42785e230505d5a4f07cef352af10d3006fa5c1544b76b57784d3a22d861ae071bbc460c649482bf4 - languageName: node - linkType: hard - -"parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": - version: 1.3.3 - resolution: "parseurl@npm:1.3.3" - checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 - languageName: node - linkType: hard - -"pascal-case@npm:^3.1.2": - version: 3.1.2 - resolution: "pascal-case@npm:3.1.2" - dependencies: - no-case: "npm:^3.0.4" - tslib: "npm:^2.0.3" - checksum: 10c0/05ff7c344809fd272fc5030ae0ee3da8e4e63f36d47a1e0a4855ca59736254192c5a27b5822ed4bae96e54048eec5f6907713cfcfff7cdf7a464eaf7490786d8 - languageName: node - linkType: hard - -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 10c0/17d6a5664bc0a11d48e2b2127d28a0e58822c6740bde30403f08013da599182289c56518bec89407e3f31d3c2b6b296a4220bc3f867f0911fee6952208b04167 - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 - languageName: node - linkType: hard - -"path-is-inside@npm:1.0.2": - version: 1.0.2 - resolution: "path-is-inside@npm:1.0.2" - checksum: 10c0/7fdd4b41672c70461cce734fc222b33e7b447fa489c7c4377c95e7e6852d83d69741f307d88ec0cc3b385b41cb4accc6efac3c7c511cd18512e95424f5fa980c - languageName: node - linkType: hard - -"path-key@npm:^2.0.0, path-key@npm:^2.0.1": - version: 2.0.1 - resolution: "path-key@npm:2.0.1" - checksum: 10c0/dd2044f029a8e58ac31d2bf34c34b93c3095c1481942960e84dd2faa95bbb71b9b762a106aead0646695330936414b31ca0bd862bf488a937ad17c8c5d73b32b +"path-key@npm:^2.0.0, path-key@npm:^2.0.1": + version: 2.0.1 + resolution: "path-key@npm:2.0.1" + checksum: 10c0/dd2044f029a8e58ac31d2bf34c34b93c3095c1481942960e84dd2faa95bbb71b9b762a106aead0646695330936414b31ca0bd862bf488a937ad17c8c5d73b32b languageName: node linkType: hard @@ -15848,29 +11457,6 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:0.1.7": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 10c0/50a1ddb1af41a9e68bd67ca8e331a705899d16fb720a1ea3a41e310480948387daf603abb14d7b0826c58f10146d49050a1291ba6a82b78a382d1c02c0b8f905 - languageName: node - linkType: hard - -"path-to-regexp@npm:2.2.1": - version: 2.2.1 - resolution: "path-to-regexp@npm:2.2.1" - checksum: 10c0/f4b51090a73dad5ce0720f13ce8528ac77914bc927d72cc4ba05ab32770ad3a8d2e431962734b688b9ed863d4098d858da6ff4746037e4e24259cbd3b2c32b79 - languageName: node - linkType: hard - -"path-to-regexp@npm:^1.7.0": - version: 1.8.0 - resolution: "path-to-regexp@npm:1.8.0" - dependencies: - isarray: "npm:0.0.1" - checksum: 10c0/7b25d6f27a8de03f49406d16195450f5ced694398adea1510b0f949d9660600d1769c5c6c83668583b7e6b503f3caf1ede8ffc08135dbe3e982f034f356fbb5c - languageName: node - linkType: hard - "path-type@npm:^3.0.0": version: 3.0.0 resolution: "path-type@npm:3.0.0" @@ -15901,7 +11487,7 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be @@ -15936,7 +11522,7 @@ __metadata: languageName: node linkType: hard -"pkg-dir@npm:^4.1.0, pkg-dir@npm:^4.2.0": +"pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" dependencies: @@ -15945,15 +11531,6 @@ __metadata: languageName: node linkType: hard -"pkg-up@npm:^3.1.0": - version: 3.1.0 - resolution: "pkg-up@npm:3.1.0" - dependencies: - find-up: "npm:^3.0.0" - checksum: 10c0/ecb60e1f8e1f611c0bdf1a0b6a474d6dfb51185567dc6f29cdef37c8d480ecba5362e006606bb290519bbb6f49526c403fabea93c3090c20368d98bb90c999ab - languageName: node - linkType: hard - "possible-typed-array-names@npm:^1.0.0": version: 1.1.0 resolution: "possible-typed-array-names@npm:1.1.0" @@ -15961,451 +11538,6 @@ __metadata: languageName: node linkType: hard -"postcss-calc@npm:^8.2.3": - version: 8.2.4 - resolution: "postcss-calc@npm:8.2.4" - dependencies: - postcss-selector-parser: "npm:^6.0.9" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.2 - checksum: 10c0/8518a429488c3283ff1560c83a511f6f772329bc61d88875eb7c83e13a8683b7ccbdccaa9946024cf1553da3eacd2f40fcbcebf1095f7fdeb432bf86bc6ba6ba - languageName: node - linkType: hard - -"postcss-colormin@npm:^5.3.1": - version: 5.3.1 - resolution: "postcss-colormin@npm:5.3.1" - dependencies: - browserslist: "npm:^4.21.4" - caniuse-api: "npm:^3.0.0" - colord: "npm:^2.9.1" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/c4ca6f335dd992dc8e3df24bffc3495c4e504eba8489c81cb6836fdce3203f423cf4c0b640c4b63c586f588c59d82adb5313c3c5d1a68113896d18ed71caa462 - languageName: node - linkType: hard - -"postcss-convert-values@npm:^5.1.3": - version: 5.1.3 - resolution: "postcss-convert-values@npm:5.1.3" - dependencies: - browserslist: "npm:^4.21.4" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/cd10a81781a12487b2921ff84a1a068e948a1956b9539a284c202abecf4cacdd3e106eb026026b22dbf70933f4315c824c111f6b71f56c355e47b842ca9b1dec - languageName: node - linkType: hard - -"postcss-discard-comments@npm:^5.1.2": - version: 5.1.2 - resolution: "postcss-discard-comments@npm:5.1.2" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/cb5ba81623c498e18d406138e7d27d69fc668802a1139a8de69d28e80b3fe222cda7b634940512cae78d04f0c78afcd15d92bcf80e537c6c85fa8ff9cd61d00f - languageName: node - linkType: hard - -"postcss-discard-duplicates@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-discard-duplicates@npm:5.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/3d3a49536c56097c06b4f085412e0cda0854fac1c559563ccb922d9fab6305ff13058cd6fee422aa66c1d7e466add4e7672d7ae2ff551a4af6f1a8d2142d471f - languageName: node - linkType: hard - -"postcss-discard-empty@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-discard-empty@npm:5.1.1" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/36c8b2197af836dbd93168c72cde4edc1f10fe00e564824119da076d3764909745bb60e4ada04052322e26872d1bce6a37c56815f1c48c813a21adca1a41fbdc - languageName: node - linkType: hard - -"postcss-discard-overridden@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-discard-overridden@npm:5.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/7d3fc0b0d90599606fc083327a7c24390f90270a94a0119af4b74815d518948581579281f63b9bfa62e2644edf59bc9e725dc04ea5ba213f697804f3fb4dd8dc - languageName: node - linkType: hard - -"postcss-discard-unused@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-discard-unused@npm:5.1.0" - dependencies: - postcss-selector-parser: "npm:^6.0.5" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/eb7649eae1ef9987c397f4f533eb83f4245686317a5a0b468affd875d4d22778b62134e638198750efbaa41b7b7767995a91e5eb58d5fbbfe097506a3311102b - languageName: node - linkType: hard - -"postcss-loader@npm:^7.0.0": - version: 7.3.3 - resolution: "postcss-loader@npm:7.3.3" - dependencies: - cosmiconfig: "npm:^8.2.0" - jiti: "npm:^1.18.2" - semver: "npm:^7.3.8" - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 - checksum: 10c0/d039654273f858be1f75dfdf8b550869d88905b73a7684b3e48a2937a6087619e84fd1a3551cdef78685a965a2573e985b29a532c3878d834071ecd2da0eb304 - languageName: node - linkType: hard - -"postcss-merge-idents@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-merge-idents@npm:5.1.1" - dependencies: - cssnano-utils: "npm:^3.1.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/97552b831330a8055641d3aea7b9840c60922d22d7fefdaf109daa7dee543e48a93ea6189a5549798b3f29e66657bc5c520e76493a04f8f999b94a2c8fee6060 - languageName: node - linkType: hard - -"postcss-merge-longhand@npm:^5.1.7": - version: 5.1.7 - resolution: "postcss-merge-longhand@npm:5.1.7" - dependencies: - postcss-value-parser: "npm:^4.2.0" - stylehacks: "npm:^5.1.1" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/4d9f44b03f19522cc81ae4f5b1f2a9ef2db918dbd8b3042d4f1b2461b2230b8ec1269334db6a67a863ba68f64cabd712e6e45340ddb22a3fc03cd34df69d2bf0 - languageName: node - linkType: hard - -"postcss-merge-rules@npm:^5.1.4": - version: 5.1.4 - resolution: "postcss-merge-rules@npm:5.1.4" - dependencies: - browserslist: "npm:^4.21.4" - caniuse-api: "npm:^3.0.0" - cssnano-utils: "npm:^3.1.0" - postcss-selector-parser: "npm:^6.0.5" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/e7686cdda052071bf98810ad381e26145c43a2286f9540f04f97ef93101604b78d478dd555db91e5f73751bb353c283ba75c2fcb16a3751ac7d93dc6a0130c41 - languageName: node - linkType: hard - -"postcss-minify-font-values@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-minify-font-values@npm:5.1.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/7aa4f93a853b657f79a8b28d0e924cafce3720086d9da02ce04b8b2f8de42e18ce32c8f7f1078390fb5ec82468e2d8e771614387cea3563f05fd9fa1798e1c59 - languageName: node - linkType: hard - -"postcss-minify-gradients@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-minify-gradients@npm:5.1.1" - dependencies: - colord: "npm:^2.9.1" - cssnano-utils: "npm:^3.1.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/bcb2802d7c8f0f76c7cff089884844f26c24b95f35c3ec951d7dec8c212495d1873d6ba62d6225ce264570e8e0668e271f9bc79bb6f5d2429c1f8933f4e3021d - languageName: node - linkType: hard - -"postcss-minify-params@npm:^5.1.4": - version: 5.1.4 - resolution: "postcss-minify-params@npm:5.1.4" - dependencies: - browserslist: "npm:^4.21.4" - cssnano-utils: "npm:^3.1.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/debce6f0f7dd9af69b4bb9e467ea1ccccff2d849b6020461a2b9741c0c137340e6076c245dc2e83880180eb2e82936280fa31dfe8608e5a2e3618f3d864314c5 - languageName: node - linkType: hard - -"postcss-minify-selectors@npm:^5.2.1": - version: 5.2.1 - resolution: "postcss-minify-selectors@npm:5.2.1" - dependencies: - postcss-selector-parser: "npm:^6.0.5" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/f3f4ec110f5f697cfc9dde3e491ff10aa07509bf33cc940aa539e4b5b643d1b9f8bb97f8bb83d05fc96f5eeb220500ebdeffbde513bd176c0671e21c2c96fab9 - languageName: node - linkType: hard - -"postcss-modules-extract-imports@npm:^3.0.0": - version: 3.0.0 - resolution: "postcss-modules-extract-imports@npm:3.0.0" - peerDependencies: - postcss: ^8.1.0 - checksum: 10c0/f8879d66d8162fb7a3fcd916d37574006c584ea509107b1cfb798a5e090175ef9470f601e46f0a305070d8ff2500e07489a5c1ac381c29a1dc1120e827ca7943 - languageName: node - linkType: hard - -"postcss-modules-local-by-default@npm:^4.0.3": - version: 4.0.3 - resolution: "postcss-modules-local-by-default@npm:4.0.3" - dependencies: - icss-utils: "npm:^5.0.0" - postcss-selector-parser: "npm:^6.0.2" - postcss-value-parser: "npm:^4.1.0" - peerDependencies: - postcss: ^8.1.0 - checksum: 10c0/be49b86efbfb921f42287e227584aac91af9826fc1083db04958ae283dfe215ca539421bfba71f9da0f0b10651f28e95a64b5faca7166f578a1933b8646051f7 - languageName: node - linkType: hard - -"postcss-modules-scope@npm:^3.0.0": - version: 3.0.0 - resolution: "postcss-modules-scope@npm:3.0.0" - dependencies: - postcss-selector-parser: "npm:^6.0.4" - peerDependencies: - postcss: ^8.1.0 - checksum: 10c0/60af503910363689568c2c3701cb019a61b58b3d739391145185eec211bea5d50ccb6ecbe6955b39d856088072fd50ea002e40a52b50e33b181ff5c41da0308a - languageName: node - linkType: hard - -"postcss-modules-values@npm:^4.0.0": - version: 4.0.0 - resolution: "postcss-modules-values@npm:4.0.0" - dependencies: - icss-utils: "npm:^5.0.0" - peerDependencies: - postcss: ^8.1.0 - checksum: 10c0/dd18d7631b5619fb9921b198c86847a2a075f32e0c162e0428d2647685e318c487a2566cc8cc669fc2077ef38115cde7a068e321f46fb38be3ad49646b639dbc - languageName: node - linkType: hard - -"postcss-normalize-charset@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-normalize-charset@npm:5.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/aa481584d4db48e0dbf820f992fa235e6c41ff3d4701a62d349f33c1ad4c5c7dcdea3096db9ff2a5c9497e9bed2186d594ccdb1b42d57b30f58affba5829ad9c - languageName: node - linkType: hard - -"postcss-normalize-display-values@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-normalize-display-values@npm:5.1.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/70b164fda885c097c02c98914fba4cd19b2382ff5f85f77e5315d88a1d477b4803f0f271d95a38e044e2a6c3b781c5c9bfb83222fc577199f2aeb0b8f4254e2f - languageName: node - linkType: hard - -"postcss-normalize-positions@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-normalize-positions@npm:5.1.1" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/910d58991fd38a7cf6ed6471e6fa4a96349690ad1a99a02e8cac46d76ba5045f2fca453088b68b05ff665afd96dc617c4674c68acaeabbe83f502e4963fb78b1 - languageName: node - linkType: hard - -"postcss-normalize-repeat-style@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-normalize-repeat-style@npm:5.1.1" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/57c3817a2107ebb17e4ceee3831d230c72a3ccc7650f4d5f12aa54f6ea766777401f4f63b2615b721350b2e8c7ae0b0bbc3f1c5ad4e7fa737c9efb92cfa0cbb0 - languageName: node - linkType: hard - -"postcss-normalize-string@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-normalize-string@npm:5.1.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/a5e9979998f478d385ddff865bdd8a4870af69fa8c91c9398572a299ff39b39a6bda922a48fab0d2cddc639f30159c39baaed880ed7d13cd27cc64eaa9400b3b - languageName: node - linkType: hard - -"postcss-normalize-timing-functions@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-normalize-timing-functions@npm:5.1.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/afb34d8e313004ae8cd92910bf1a6eb9885f29ae803cd9032b6dfe7b67a9ad93f800976f10e55170b2b08fe9484825e9272629971186812c2764c73843268237 - languageName: node - linkType: hard - -"postcss-normalize-unicode@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-normalize-unicode@npm:5.1.1" - dependencies: - browserslist: "npm:^4.21.4" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/c102888d488d05c53ab10ffcd4e0efb892ef0cc2f9b0abe9c9b175a2d7a9c226981ca6806ed9e5c1b82a8190f2b3a8342a6de800f019b417130661b0787ff6d7 - languageName: node - linkType: hard - -"postcss-normalize-url@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-normalize-url@npm:5.1.0" - dependencies: - normalize-url: "npm:^6.0.1" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/a016cefd1ef80f74ef9dbed50593d3b533101e93aaadfc292896fddd8d6c3eb732a9fc5cb2e0d27f79c1f60f0fdfc40b045a494b514451e9610c6acf9392eb98 - languageName: node - linkType: hard - -"postcss-normalize-whitespace@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-normalize-whitespace@npm:5.1.1" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/d7b53dd90fe369bfb9838a40096db904a41f50dadfd04247ec07d7ab5588c3d4e70d1c7f930523bd061cb74e6683cef45c6e6c4eb57ea174ee3fc99f3de222d1 - languageName: node - linkType: hard - -"postcss-ordered-values@npm:^5.1.3": - version: 5.1.3 - resolution: "postcss-ordered-values@npm:5.1.3" - dependencies: - cssnano-utils: "npm:^3.1.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/55abfbd2c7267eefed62a881ed0b5c0c98409c50a589526a3ebb9f8d879979203e523b8888fa84732bdd1ac887f721287a037002fa70c27c8d33f1bcbae9d9c6 - languageName: node - linkType: hard - -"postcss-reduce-idents@npm:^5.2.0": - version: 5.2.0 - resolution: "postcss-reduce-idents@npm:5.2.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/f7a6bc0caa531e7983c98a79d796e078ff8d02df1bb38357a5d7f11ddb5842d6777ab090fd811e889ab1a5e92ba2644c9a9e5e353f7c9f7ce85dbf1e07001c29 - languageName: node - linkType: hard - -"postcss-reduce-initial@npm:^5.1.2": - version: 5.1.2 - resolution: "postcss-reduce-initial@npm:5.1.2" - dependencies: - browserslist: "npm:^4.21.4" - caniuse-api: "npm:^3.0.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/ddb2ce61c8d0997184f08200eafdf32b3c67e88228fee960f5e2010c32da0c1d8ea07712585bf2b3aaa15f583066401d45db2c1131527c5116ca6794ebebd865 - languageName: node - linkType: hard - -"postcss-reduce-transforms@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-reduce-transforms@npm:5.1.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/caefaeb78652ad8701b94e91500e38551255e4899fa298a7357519a36cbeebae088eab4535e00f17675a1230f448c4a7077045639d496da4614a46bc41df4add - languageName: node - linkType: hard - -"postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.0.5, postcss-selector-parser@npm:^6.0.9": - version: 6.0.13 - resolution: "postcss-selector-parser@npm:6.0.13" - dependencies: - cssesc: "npm:^3.0.0" - util-deprecate: "npm:^1.0.2" - checksum: 10c0/51f099b27f7c7198ea1826470ef0adfa58b3bd3f59b390fda123baa0134880a5fa9720137b6009c4c1373357b144f700b0edac73335d0067422063129371444e - languageName: node - linkType: hard - -"postcss-sort-media-queries@npm:^4.2.1": - version: 4.4.1 - resolution: "postcss-sort-media-queries@npm:4.4.1" - dependencies: - sort-css-media-queries: "npm:2.1.0" - peerDependencies: - postcss: ^8.4.16 - checksum: 10c0/8bbc604daee29dc3e1f5090df972599c3c0eb08b37650e16c134a040cc1357484a48bbe03dac2977d616be1d490cde2934226fa1e6f7e52f4f5e7bf8f57e98d6 - languageName: node - linkType: hard - -"postcss-svgo@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-svgo@npm:5.1.0" - dependencies: - postcss-value-parser: "npm:^4.2.0" - svgo: "npm:^2.7.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/309634a587e38fef244648bc9cd1817e12144868d24f1173d87b1edc14a4a7fca614962b2cb9d93f4801e11bd8d676083986ad40ebab4438cb84731ce1571994 - languageName: node - linkType: hard - -"postcss-unique-selectors@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-unique-selectors@npm:5.1.1" - dependencies: - postcss-selector-parser: "npm:^6.0.5" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/484f6409346d6244c134c5cdcd62f4f2751b269742f95222f13d8bac5fb224471ffe04e28a354670cbe0bdc2707778ead034fc1b801b473ffcbea5436807de30 - languageName: node - linkType: hard - -"postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": - version: 4.2.0 - resolution: "postcss-value-parser@npm:4.2.0" - checksum: 10c0/f4142a4f56565f77c1831168e04e3effd9ffcc5aebaf0f538eee4b2d465adfd4b85a44257bb48418202a63806a7da7fe9f56c330aebb3cac898e46b4cbf49161 - languageName: node - linkType: hard - -"postcss-zindex@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-zindex@npm:5.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/f739d3c0dec3875c770d6a101bc6ac1ccf545b0121e75b7fade911ad6ce454a2af87e6c3587c80a76a00f217e1761778f2083c2807eb78c17bfc53624b625ded - languageName: node - linkType: hard - -"postcss@npm:^8.3.11, postcss@npm:^8.4.14, postcss@npm:^8.4.17, postcss@npm:^8.4.21": - version: 8.4.31 - resolution: "postcss@npm:8.4.31" - dependencies: - nanoid: "npm:^3.3.6" - picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.0.2" - checksum: 10c0/748b82e6e5fc34034dcf2ae88ea3d11fd09f69b6c50ecdd3b4a875cfc7cdca435c958b211e2cb52355422ab6fccb7d8f2f2923161d7a1b281029e4a913d59acf - languageName: node - linkType: hard - "postcss@npm:^8.5.6": version: 8.5.6 resolution: "postcss@npm:8.5.6" @@ -16436,13 +11568,6 @@ __metadata: languageName: node linkType: hard -"prepend-http@npm:^2.0.0": - version: 2.0.0 - resolution: "prepend-http@npm:2.0.0" - checksum: 10c0/b023721ffd967728e3a25e3a80dd73827e9444e586800ab90a21b3a8e67f362d28023085406ad53a36db1e4d98cb10e43eb37d45c6b733140a9165ead18a0987 - languageName: node - linkType: hard - "prettier-linter-helpers@npm:^1.0.0": version: 1.0.0 resolution: "prettier-linter-helpers@npm:1.0.0" @@ -16470,16 +11595,6 @@ __metadata: languageName: node linkType: hard -"pretty-error@npm:^4.0.0": - version: 4.0.0 - resolution: "pretty-error@npm:4.0.0" - dependencies: - lodash: "npm:^4.17.20" - renderkid: "npm:^3.0.0" - checksum: 10c0/dc292c087e2857b2e7592784ab31e37a40f3fa918caa11eba51f9fb2853e1d4d6e820b219917e35f5721d833cfd20fdf4f26ae931a90fd1ad0cae2125c345138 - languageName: node - linkType: hard - "pretty-format@npm:^26.6.2": version: 26.6.2 resolution: "pretty-format@npm:26.6.2" @@ -16503,36 +11618,6 @@ __metadata: languageName: node linkType: hard -"pretty-time@npm:^1.1.0": - version: 1.1.0 - resolution: "pretty-time@npm:1.1.0" - checksum: 10c0/ba9d7af19cd43838fb2b147654990949575e400dc2cc24bf71ec4a6c4033a38ba8172b1014b597680c6d4d3c075e94648b2c13a7206c5f0c90b711c7388726f3 - languageName: node - linkType: hard - -"prism-react-renderer@npm:^1.3.5": - version: 1.3.5 - resolution: "prism-react-renderer@npm:1.3.5" - peerDependencies: - react: ">=0.14.9" - checksum: 10c0/9caada97fa7325fc99484cff409a84ed947a061615851bd0aedf4fcfd4b3496e2eff4b252dbfd4465dd6ea7310134ed67d737cabf0c78b192969c3c7da383237 - languageName: node - linkType: hard - -"prismjs@npm:^1.28.0": - version: 1.30.0 - resolution: "prismjs@npm:1.30.0" - checksum: 10c0/f56205bfd58ef71ccfcbcb691fd0eb84adc96c6ff21b0b69fc6fdcf02be42d6ef972ba4aed60466310de3d67733f6a746f89f2fb79c00bf217406d465b3e8f23 - languageName: node - linkType: hard - -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 - languageName: node - linkType: hard - "promise-inflight@npm:^1.0.1": version: 1.0.1 resolution: "promise-inflight@npm:1.0.1" @@ -16550,15 +11635,6 @@ __metadata: languageName: node linkType: hard -"promise@npm:^7.1.1": - version: 7.3.1 - resolution: "promise@npm:7.3.1" - dependencies: - asap: "npm:~2.0.3" - checksum: 10c0/742e5c0cc646af1f0746963b8776299701ad561ce2c70b49365d62c8db8ea3681b0a1bf0d4e2fe07910bf72f02d39e51e8e73dc8d7503c3501206ac908be107f - languageName: node - linkType: hard - "promise@npm:^8.3.0": version: 8.3.0 resolution: "promise@npm:8.3.0" @@ -16578,7 +11654,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": +"prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -16589,25 +11665,6 @@ __metadata: languageName: node linkType: hard -"property-information@npm:^5.0.0, property-information@npm:^5.3.0": - version: 5.6.0 - resolution: "property-information@npm:5.6.0" - dependencies: - xtend: "npm:^4.0.0" - checksum: 10c0/d54b77c31dc13bb6819559080b2c67d37d94be7dc271f404f139a16a57aa96fcc0b3ad806d4a5baef9e031744853e4afe3df2e37275aacb1f78079bbb652c5af - languageName: node - linkType: hard - -"proxy-addr@npm:~2.0.7": - version: 2.0.7 - resolution: "proxy-addr@npm:2.0.7" - dependencies: - forwarded: "npm:0.2.0" - ipaddr.js: "npm:1.9.1" - checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 - languageName: node - linkType: hard - "pseudomap@npm:^1.0.2": version: 1.0.2 resolution: "pseudomap@npm:1.0.2" @@ -16625,13 +11682,6 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^1.3.2": - version: 1.4.1 - resolution: "punycode@npm:1.4.1" - checksum: 10c0/354b743320518aef36f77013be6e15da4db24c2b4f62c5f1eb0529a6ed02fbaf1cb52925785f6ab85a962f2b590d9cd5ad730b70da72b5f180e2556b8bd3ca08 - languageName: node - linkType: hard - "punycode@npm:^2.1.0": version: 2.1.1 resolution: "punycode@npm:2.1.1" @@ -16639,22 +11689,6 @@ __metadata: languageName: node linkType: hard -"pupa@npm:^2.1.1": - version: 2.1.1 - resolution: "pupa@npm:2.1.1" - dependencies: - escape-goat: "npm:^2.0.0" - checksum: 10c0/d2346324780ebae4be847cad052b830e004d816851dd4750fc73faa6cd360f443e358f6b1c83641fd4c904c6055dcb545807f55259a20a52ad86d9477746c724 - languageName: node - linkType: hard - -"pure-color@npm:^1.2.0": - version: 1.3.0 - resolution: "pure-color@npm:1.3.0" - checksum: 10c0/50d0e088ad0349bdd508cddf7c7afbb2d14ba3c047628dbfcfddf467a98f10462caf91f3227172ada88f64afaf761c499ecba0d4053b06926f0f914769be24b9 - languageName: node - linkType: hard - "pure-rand@npm:^6.0.0": version: 6.1.0 resolution: "pure-rand@npm:6.1.0" @@ -16662,15 +11696,6 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.11.0": - version: 6.11.0 - resolution: "qs@npm:6.11.0" - dependencies: - side-channel: "npm:^1.0.4" - checksum: 10c0/4e4875e4d7c7c31c233d07a448e7e4650f456178b9dd3766b7cfa13158fdb24ecb8c4f059fa91e820dc6ab9f2d243721d071c9c0378892dcdad86e9e9a27c68f - languageName: node - linkType: hard - "qs@npm:6.13.0": version: 6.13.0 resolution: "qs@npm:6.13.0" @@ -16703,175 +11728,47 @@ __metadata: languageName: node linkType: hard -"randombytes@npm:^2.1.0": - version: 2.1.0 - resolution: "randombytes@npm:2.1.0" - dependencies: - safe-buffer: "npm:^5.1.0" - checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 - languageName: node - linkType: hard - -"range-parser@npm:1.2.0": - version: 1.2.0 - resolution: "range-parser@npm:1.2.0" - checksum: 10c0/c7aef4f6588eb974c475649c157f197d07437d8c6c8ff7e36280a141463fb5ab7a45918417334ebd7b665c6b8321cf31c763f7631dd5f5db9372249261b8b02a - languageName: node - linkType: hard - -"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": +"range-parser@npm:~1.2.1": version: 1.2.1 resolution: "range-parser@npm:1.2.1" checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 languageName: node linkType: hard -"raw-body@npm:2.5.1": - version: 2.5.1 - resolution: "raw-body@npm:2.5.1" - dependencies: - bytes: "npm:3.1.2" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - unpipe: "npm:1.0.0" - checksum: 10c0/5dad5a3a64a023b894ad7ab4e5c7c1ce34d3497fc7138d02f8c88a3781e68d8a55aa7d4fd3a458616fa8647cc228be314a1c03fb430a07521de78b32c4dd09d2 - languageName: node - linkType: hard - "raw-body@npm:2.5.2": version: 2.5.2 resolution: "raw-body@npm:2.5.2" dependencies: bytes: "npm:3.1.2" http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - unpipe: "npm:1.0.0" - checksum: 10c0/b201c4b66049369a60e766318caff5cb3cc5a900efd89bdac431463822d976ad0670912c931fdbdcf5543207daf6f6833bca57aa116e1661d2ea91e12ca692c4 - languageName: node - linkType: hard - -"rc@npm:^1.2.8": - version: 1.2.8 - resolution: "rc@npm:1.2.8" - dependencies: - deep-extend: "npm:^0.6.0" - ini: "npm:~1.3.0" - minimist: "npm:^1.2.0" - strip-json-comments: "npm:~2.0.1" - bin: - rc: ./cli.js - checksum: 10c0/24a07653150f0d9ac7168e52943cc3cb4b7a22c0e43c7dff3219977c2fdca5a2760a304a029c20811a0e79d351f57d46c9bde216193a0f73978496afc2b85b15 - languageName: node - linkType: hard - -"react-base16-styling@npm:^0.6.0": - version: 0.6.0 - resolution: "react-base16-styling@npm:0.6.0" - dependencies: - base16: "npm:^1.0.0" - lodash.curry: "npm:^4.0.1" - lodash.flow: "npm:^3.3.0" - pure-color: "npm:^1.2.0" - checksum: 10c0/4887ac57b36fedc7e1ebc99ae431c5feb07d60a9150770d0ca3a59f4ae7059434ea8813ca4f915e7434d4d8d8529b9ba072ceb85041fd52ca1cd6289c57c9621 - languageName: node - linkType: hard - -"react-dev-utils@npm:^12.0.1": - version: 12.0.1 - resolution: "react-dev-utils@npm:12.0.1" - dependencies: - "@babel/code-frame": "npm:^7.16.0" - address: "npm:^1.1.2" - browserslist: "npm:^4.18.1" - chalk: "npm:^4.1.2" - cross-spawn: "npm:^7.0.3" - detect-port-alt: "npm:^1.1.6" - escape-string-regexp: "npm:^4.0.0" - filesize: "npm:^8.0.6" - find-up: "npm:^5.0.0" - fork-ts-checker-webpack-plugin: "npm:^6.5.0" - global-modules: "npm:^2.0.0" - globby: "npm:^11.0.4" - gzip-size: "npm:^6.0.0" - immer: "npm:^9.0.7" - is-root: "npm:^2.1.0" - loader-utils: "npm:^3.2.0" - open: "npm:^8.4.0" - pkg-up: "npm:^3.1.0" - prompts: "npm:^2.4.2" - react-error-overlay: "npm:^6.0.11" - recursive-readdir: "npm:^2.2.2" - shell-quote: "npm:^1.7.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" - checksum: 10c0/94bc4ee5014290ca47a025e53ab2205c5dc0299670724d46a0b1bacbdd48904827b5ae410842d0a3a92481509097ae032e4a9dc7ca70db437c726eaba6411e82 - languageName: node - linkType: hard - -"react-devtools-core@npm:^6.1.1": - version: 6.1.5 - resolution: "react-devtools-core@npm:6.1.5" - dependencies: - shell-quote: "npm:^1.6.1" - ws: "npm:^7" - checksum: 10c0/7ef95213d06ad4b294f5dca73736641e2d8ff46861d3deacdc56a143b27de60ac6310898a52c7efd9fbd1bdef20c09305d05be80e6beb560f0f975aad6afbc5e - languageName: node - linkType: hard - -"react-dom@npm:19.1.1": - version: 19.1.1 - resolution: "react-dom@npm:19.1.1" - dependencies: - scheduler: "npm:^0.26.0" - peerDependencies: - react: ^19.1.1 - checksum: 10c0/8c91198510521299c56e4e8d5e3a4508b2734fb5e52f29eeac33811de64e76fe586ad32c32182e2e84e070d98df67125da346c3360013357228172dbcd20bcdd - languageName: node - linkType: hard - -"react-dom@npm:^18.2.0": - version: 18.3.1 - resolution: "react-dom@npm:18.3.1" - dependencies: - loose-envify: "npm:^1.1.0" - scheduler: "npm:^0.23.2" - peerDependencies: - react: ^18.3.1 - checksum: 10c0/a752496c1941f958f2e8ac56239172296fcddce1365ce45222d04a1947e0cc5547df3e8447f855a81d6d39f008d7c32eab43db3712077f09e3f67c4874973e85 - languageName: node - linkType: hard - -"react-error-overlay@npm:^6.0.11": - version: 6.0.11 - resolution: "react-error-overlay@npm:6.0.11" - checksum: 10c0/8fc93942976e0c704274aec87dbc8e21f62a2cc78d1c93f9bcfff9f7494b00c60f7a2f0bd48d832bcd3190627c0255a1df907373f61f820371373a65ec4b2d64 + iconv-lite: "npm:0.4.24" + unpipe: "npm:1.0.0" + checksum: 10c0/b201c4b66049369a60e766318caff5cb3cc5a900efd89bdac431463822d976ad0670912c931fdbdcf5543207daf6f6833bca57aa116e1661d2ea91e12ca692c4 languageName: node linkType: hard -"react-fast-compare@npm:^3.2.0": - version: 3.2.2 - resolution: "react-fast-compare@npm:3.2.2" - checksum: 10c0/0bbd2f3eb41ab2ff7380daaa55105db698d965c396df73e6874831dbafec8c4b5b08ba36ff09df01526caa3c61595247e3269558c284e37646241cba2b90a367 +"react-devtools-core@npm:^6.1.1": + version: 6.1.5 + resolution: "react-devtools-core@npm:6.1.5" + dependencies: + shell-quote: "npm:^1.6.1" + ws: "npm:^7" + checksum: 10c0/7ef95213d06ad4b294f5dca73736641e2d8ff46861d3deacdc56a143b27de60ac6310898a52c7efd9fbd1bdef20c09305d05be80e6beb560f0f975aad6afbc5e languageName: node linkType: hard -"react-helmet-async@npm:*, react-helmet-async@npm:^1.3.0": - version: 1.3.0 - resolution: "react-helmet-async@npm:1.3.0" +"react-dom@npm:19.1.1": + version: 19.1.1 + resolution: "react-dom@npm:19.1.1" dependencies: - "@babel/runtime": "npm:^7.12.5" - invariant: "npm:^2.2.4" - prop-types: "npm:^15.7.2" - react-fast-compare: "npm:^3.2.0" - shallowequal: "npm:^1.1.0" + scheduler: "npm:^0.26.0" peerDependencies: - react: ^16.6.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/8f3e6d26beff61d2ed18f7b41561df3e4d83a7582914c7196aa65158c7f3cce939276547d7a0b8987952d9d44131406df74efba02d1f8fa8a3940b49e6ced70b + react: ^19.1.1 + checksum: 10c0/8c91198510521299c56e4e8d5e3a4508b2734fb5e52f29eeac33811de64e76fe586ad32c32182e2e84e070d98df67125da346c3360013357228172dbcd20bcdd languageName: node linkType: hard -"react-is@npm:^16.13.1, react-is@npm:^16.6.0, react-is@npm:^16.7.0": +"react-is@npm:^16.13.1": version: 16.13.1 resolution: "react-is@npm:16.13.1" checksum: 10c0/33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1 @@ -16899,40 +11796,6 @@ __metadata: languageName: node linkType: hard -"react-json-view@npm:^1.21.3": - version: 1.21.3 - resolution: "react-json-view@npm:1.21.3" - dependencies: - flux: "npm:^4.0.1" - react-base16-styling: "npm:^0.6.0" - react-lifecycles-compat: "npm:^3.0.4" - react-textarea-autosize: "npm:^8.3.2" - peerDependencies: - react: ^17.0.0 || ^16.3.0 || ^15.5.4 - react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 - checksum: 10c0/f41b38e599f148cf922f60390e56bb821f17a091373b08310fd82ebc526428683011751aa023687041481a46b20aeb1c47f660979d43db77674486aec9dc1d3f - languageName: node - linkType: hard - -"react-lifecycles-compat@npm:^3.0.4": - version: 3.0.4 - resolution: "react-lifecycles-compat@npm:3.0.4" - checksum: 10c0/1d0df3c85af79df720524780f00c064d53a9dd1899d785eddb7264b378026979acbddb58a4b7e06e7d0d12aa1494fd5754562ee55d32907b15601068dae82c27 - languageName: node - linkType: hard - -"react-loadable-ssr-addon-v5-slorber@npm:^1.0.1": - version: 1.0.1 - resolution: "react-loadable-ssr-addon-v5-slorber@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.10.3" - peerDependencies: - react-loadable: "*" - webpack: ">=4.41.1 || 5.x" - checksum: 10c0/7b0645f66adec56646f985ba8094c66a1c0a4627d96ad80eea32431d773ef1f79aa47d3247a8f21db3b064a0c6091653c5b5d3483b7046722eb64e55bffe635c - languageName: node - linkType: hard - "react-native-builder-bob@npm:^0.40.13": version: 0.40.13 resolution: "react-native-builder-bob@npm:0.40.13" @@ -17199,54 +12062,6 @@ __metadata: languageName: node linkType: hard -"react-router-config@npm:^5.1.1": - version: 5.1.1 - resolution: "react-router-config@npm:5.1.1" - dependencies: - "@babel/runtime": "npm:^7.1.2" - peerDependencies: - react: ">=15" - react-router: ">=5" - checksum: 10c0/1f8f4e55ca68b7b012293e663eb0ee4d670a3df929b78928f713ef98cd9d62c7f5c30a098d6668e64bbb11c7d6bb24e9e6b9c985a8b82465a1858dc7ba663f2b - languageName: node - linkType: hard - -"react-router-dom@npm:^5.3.3": - version: 5.3.4 - resolution: "react-router-dom@npm:5.3.4" - dependencies: - "@babel/runtime": "npm:^7.12.13" - history: "npm:^4.9.0" - loose-envify: "npm:^1.3.1" - prop-types: "npm:^15.6.2" - react-router: "npm:5.3.4" - tiny-invariant: "npm:^1.0.2" - tiny-warning: "npm:^1.0.0" - peerDependencies: - react: ">=15" - checksum: 10c0/f04f727e2ed2e9d1d3830af02cc61690ff67b1524c0d18690582bfba0f4d14142ccc88fb6da6befad644fddf086f5ae4c2eb7048c67da8a0b0929c19426421b0 - languageName: node - linkType: hard - -"react-router@npm:5.3.4, react-router@npm:^5.3.3": - version: 5.3.4 - resolution: "react-router@npm:5.3.4" - dependencies: - "@babel/runtime": "npm:^7.12.13" - history: "npm:^4.9.0" - hoist-non-react-statics: "npm:^3.1.0" - loose-envify: "npm:^1.3.1" - path-to-regexp: "npm:^1.7.0" - prop-types: "npm:^15.6.2" - react-is: "npm:^16.6.0" - tiny-invariant: "npm:^1.0.2" - tiny-warning: "npm:^1.0.0" - peerDependencies: - react: ">=15" - checksum: 10c0/e15c00dfef199249b4c6e6d98e5e76cc352ce66f3270f13df37cc069ddf7c05e43281e8c308fc407e4435d72924373baef1d2890e0f6b0b1eb423cf47315a053 - languageName: node - linkType: hard - "react-test-renderer@npm:19.0.0": version: 19.0.0 resolution: "react-test-renderer@npm:19.0.0" @@ -17259,19 +12074,6 @@ __metadata: languageName: node linkType: hard -"react-textarea-autosize@npm:^8.3.2": - version: 8.5.2 - resolution: "react-textarea-autosize@npm:8.5.2" - dependencies: - "@babel/runtime": "npm:^7.20.13" - use-composed-ref: "npm:^1.3.0" - use-latest: "npm:^1.2.1" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/c93f9ae320af990f2adadb6c55c5040d6e61cb649027b00c88c8679237c9dbffd3909c7114f2d68f420db9f7a641ec304561f28bb0b53dc2e0a1e9efea10685b - languageName: node - linkType: hard - "react@npm:19.0.0": version: 19.0.0 resolution: "react@npm:19.0.0" @@ -17286,15 +12088,6 @@ __metadata: languageName: node linkType: hard -"react@npm:^18.2.0": - version: 18.3.1 - resolution: "react@npm:18.3.1" - dependencies: - loose-envify: "npm:^1.1.0" - checksum: 10c0/283e8c5efcf37802c9d1ce767f302dd569dd97a70d9bb8c7be79a789b9902451e0d16334b05d73299b20f048cbc3c7d288bbbde10b701fa194e2089c237dbea3 - languageName: node - linkType: hard - "read-pkg-up@npm:^8.0.0": version: 8.0.0 resolution: "read-pkg-up@npm:8.0.0" @@ -17340,22 +12133,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.1": - version: 2.3.8 - resolution: "readable-stream@npm:2.3.8" - dependencies: - core-util-is: "npm:~1.0.0" - inherits: "npm:~2.0.3" - isarray: "npm:~1.0.0" - process-nextick-args: "npm:~2.0.0" - safe-buffer: "npm:~5.1.1" - string_decoder: "npm:~1.1.1" - util-deprecate: "npm:~1.0.1" - checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa - languageName: node - linkType: hard - -"readable-stream@npm:^3.0.6, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -17366,22 +12144,6 @@ __metadata: languageName: node linkType: hard -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: "npm:^2.2.1" - checksum: 10c0/6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b - languageName: node - linkType: hard - -"reading-time@npm:^1.5.0": - version: 1.5.0 - resolution: "reading-time@npm:1.5.0" - checksum: 10c0/0f730852fd4fb99e5f78c5b0cf36ab8c3fa15db96f87d9563843f6fd07a47864273ade539ebb184b785b728cde81a70283aa2d9b80cba5ca03b81868be03cabc - languageName: node - linkType: hard - "rechoir@npm:^0.6.2": version: 0.6.2 resolution: "rechoir@npm:0.6.2" @@ -17391,15 +12153,6 @@ __metadata: languageName: node linkType: hard -"recursive-readdir@npm:^2.2.2": - version: 2.2.3 - resolution: "recursive-readdir@npm:2.2.3" - dependencies: - minimatch: "npm:^3.0.5" - checksum: 10c0/d0238f137b03af9cd645e1e0b40ae78b6cda13846e3ca57f626fcb58a66c79ae018a10e926b13b3a460f1285acc946a4e512ea8daa2e35df4b76a105709930d1 - languageName: node - linkType: hard - "redent@npm:^4.0.0": version: 4.0.0 resolution: "redent@npm:4.0.0" @@ -17504,24 +12257,6 @@ __metadata: languageName: node linkType: hard -"registry-auth-token@npm:^4.0.0": - version: 4.2.1 - resolution: "registry-auth-token@npm:4.2.1" - dependencies: - rc: "npm:^1.2.8" - checksum: 10c0/ae23c68b8cd9d3afc99e160791f83a1e74aae9e3229a2a602b849c91164567fc6a3c31b7f2c1ac0e1e622be0d6671773439a55923e3bc1062d55a5c8dd843b65 - languageName: node - linkType: hard - -"registry-url@npm:^5.0.0": - version: 5.1.0 - resolution: "registry-url@npm:5.1.0" - dependencies: - rc: "npm:^1.2.8" - checksum: 10c0/c2c455342b5836cbed5162092eba075c7a02c087d9ce0fde8aeb4dc87a8f4a34a542e58bf4d8ec2d4cb73f04408cb3148ceb1f76647f76b978cfec22047dc6d6 - languageName: node - linkType: hard - "regjsgen@npm:^0.8.0": version: 0.8.0 resolution: "regjsgen@npm:0.8.0" @@ -17540,110 +12275,6 @@ __metadata: languageName: node linkType: hard -"rehype-parse@npm:^7.0.1": - version: 7.0.1 - resolution: "rehype-parse@npm:7.0.1" - dependencies: - hast-util-from-parse5: "npm:^6.0.0" - parse5: "npm:^6.0.0" - checksum: 10c0/1ce080b4ed125fdf5de89e43f8f4a658b366951fb4207ae7d949bc404b0d9af2ebdf403df4e62119736f6eeddfe939e535a969d717553aa7557b64e74a04aa30 - languageName: node - linkType: hard - -"relateurl@npm:^0.2.7": - version: 0.2.7 - resolution: "relateurl@npm:0.2.7" - checksum: 10c0/c248b4e3b32474f116a804b537fa6343d731b80056fb506dffd91e737eef4cac6be47a65aae39b522b0db9d0b1011d1a12e288d82a109ecd94a5299d82f6573a - languageName: node - linkType: hard - -"remark-emoji@npm:^2.2.0": - version: 2.2.0 - resolution: "remark-emoji@npm:2.2.0" - dependencies: - emoticon: "npm:^3.2.0" - node-emoji: "npm:^1.10.0" - unist-util-visit: "npm:^2.0.3" - checksum: 10c0/f7b98c7879ebf289e277e8a2a5f6c75da6a0447efde56a347ad6bb67084da6de8605b3ae9eb9244f02ef0c47755e2c5288222ef12a93c2ba1dec3ba02b0342f5 - languageName: node - linkType: hard - -"remark-footnotes@npm:2.0.0": - version: 2.0.0 - resolution: "remark-footnotes@npm:2.0.0" - checksum: 10c0/45b55b3440b74bfeed11fba5ed6b31f2fd35ab4e9ba169061b76a19f5ff4d16d851c9f3c423c7fa54eb0fa5e6043b89098cb9478e9b5b417cf4bdef5571b0236 - languageName: node - linkType: hard - -"remark-mdx@npm:1.6.22": - version: 1.6.22 - resolution: "remark-mdx@npm:1.6.22" - dependencies: - "@babel/core": "npm:7.12.9" - "@babel/helper-plugin-utils": "npm:7.10.4" - "@babel/plugin-proposal-object-rest-spread": "npm:7.12.1" - "@babel/plugin-syntax-jsx": "npm:7.12.1" - "@mdx-js/util": "npm:1.6.22" - is-alphabetical: "npm:1.0.4" - remark-parse: "npm:8.0.3" - unified: "npm:9.2.0" - checksum: 10c0/3a964048e58cba7848d59fc920baa330a9b7f619fedb44d4d7985d84875eba8d92e0d0dd0617e28326c6086e21ef441664748526a2517a42555d44c648453b0a - languageName: node - linkType: hard - -"remark-parse@npm:8.0.3": - version: 8.0.3 - resolution: "remark-parse@npm:8.0.3" - dependencies: - ccount: "npm:^1.0.0" - collapse-white-space: "npm:^1.0.2" - is-alphabetical: "npm:^1.0.0" - is-decimal: "npm:^1.0.0" - is-whitespace-character: "npm:^1.0.0" - is-word-character: "npm:^1.0.0" - markdown-escapes: "npm:^1.0.0" - parse-entities: "npm:^2.0.0" - repeat-string: "npm:^1.5.4" - state-toggle: "npm:^1.0.0" - trim: "npm:0.0.1" - trim-trailing-lines: "npm:^1.0.0" - unherit: "npm:^1.0.4" - unist-util-remove-position: "npm:^2.0.0" - vfile-location: "npm:^3.0.0" - xtend: "npm:^4.0.1" - checksum: 10c0/cbb859e2585864942823ce4d23a1b1514168a066ba91d47ca09ff45a5563b81bf17160c182ac7efed718712291c35a117db89b6ce603d04a845497ae7041c185 - languageName: node - linkType: hard - -"remark-squeeze-paragraphs@npm:4.0.0": - version: 4.0.0 - resolution: "remark-squeeze-paragraphs@npm:4.0.0" - dependencies: - mdast-squeeze-paragraphs: "npm:^4.0.0" - checksum: 10c0/61b39acfde3bebb1e9364a6991957f83ab0d878c0fd1de0e86e9bf9e060574cefb7a76057d64e7422e2a2bcf6e3c54635a4ae43f00b3dda38812ae4b6f4342f4 - languageName: node - linkType: hard - -"renderkid@npm:^3.0.0": - version: 3.0.0 - resolution: "renderkid@npm:3.0.0" - dependencies: - css-select: "npm:^4.1.3" - dom-converter: "npm:^0.2.0" - htmlparser2: "npm:^6.1.0" - lodash: "npm:^4.17.21" - strip-ansi: "npm:^6.0.1" - checksum: 10c0/24a9fae4cc50e731d059742d1b3eec163dc9e3872b12010d120c3fcbd622765d9cda41f79a1bbb4bf63c1d3442f18a08f6e1642cb5d7ebf092a0ce3f7a3bd143 - languageName: node - linkType: hard - -"repeat-string@npm:^1.0.0, repeat-string@npm:^1.5.4": - version: 1.6.1 - resolution: "repeat-string@npm:1.6.1" - checksum: 10c0/87fa21bfdb2fbdedc44b9a5b118b7c1239bdd2c2c1e42742ef9119b7d412a5137a1d23f1a83dc6bb686f4f27429ac6f542e3d923090b44181bafa41e8ac0174d - languageName: node - linkType: hard - "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -17658,13 +12289,6 @@ __metadata: languageName: node linkType: hard -"require-like@npm:>= 0.1.1": - version: 0.1.2 - resolution: "require-like@npm:0.1.2" - checksum: 10c0/9035ff6c4000a56ede6fc51dd5c56541fafa5a7dddc9b1c3a5f9148d95ee21c603c9bf5c6e37b19fc7de13d9294260842d8590b2ffd6c7c773e78603d1af8050 - languageName: node - linkType: hard - "require-main-filename@npm:^2.0.0": version: 2.0.0 resolution: "require-main-filename@npm:2.0.0" @@ -17672,13 +12296,6 @@ __metadata: languageName: node linkType: hard -"requires-port@npm:^1.0.0": - version: 1.0.0 - resolution: "requires-port@npm:1.0.0" - checksum: 10c0/b2bfdd09db16c082c4326e573a82c0771daaf7b53b9ce8ad60ea46aa6e30aaf475fe9b164800b89f93b748d2c234d8abff945d2551ba47bf5698e04cd7713267 - languageName: node - linkType: hard - "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -17709,13 +12326,6 @@ __metadata: languageName: node linkType: hard -"resolve-pathname@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-pathname@npm:3.0.0" - checksum: 10c0/c6ec49b670dc35b9a303c47fa83ba9348a71e92d64a4c4bb85e1b659a29b407aa1ac1cb14a9b5b502982132ca77482bd80534bca147439d66880d35a137fe723 - languageName: node - linkType: hard - "resolve.exports@npm:^2.0.0": version: 2.0.3 resolution: "resolve.exports@npm:2.0.3" @@ -17723,7 +12333,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.14.2, resolve@npm:^1.3.2": +"resolve@npm:^1.1.6, resolve@npm:^1.14.2": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -17762,7 +12372,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.3.2#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -17801,15 +12411,6 @@ __metadata: languageName: node linkType: hard -"responselike@npm:^1.0.2": - version: 1.0.2 - resolution: "responselike@npm:1.0.2" - dependencies: - lowercase-keys: "npm:^1.0.0" - checksum: 10c0/1c2861d1950790da96159ca490eda645130eaf9ccc4d76db20f685ba944feaf30f45714b4318f550b8cd72990710ad68355ff15c41da43ed9a93c102c0ffa403 - languageName: node - linkType: hard - "restore-cursor@npm:^2.0.0": version: 2.0.0 resolution: "restore-cursor@npm:2.0.0" @@ -17837,13 +12438,6 @@ __metadata: languageName: node linkType: hard -"retry@npm:^0.13.1": - version: 0.13.1 - resolution: "retry@npm:0.13.1" - checksum: 10c0/9ae822ee19db2163497e074ea919780b1efa00431d197c7afdb950e42bf109196774b92a49fc9821f0b8b328a98eea6017410bfc5e8a0fc19c85c6d11adb3772 - languageName: node - linkType: hard - "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" @@ -17940,27 +12534,6 @@ __metadata: languageName: node linkType: hard -"rtl-detect@npm:^1.0.4": - version: 1.0.4 - resolution: "rtl-detect@npm:1.0.4" - checksum: 10c0/5004b328a52fcd75869a9bf4e75db38ae9f9cd8878ed0dfed9f027e0e6558d38ac971c4bb2c2542bb360bbe9a7dffef97450fedc21abbd6c5655c172233ce7ab - languageName: node - linkType: hard - -"rtlcss@npm:^3.5.0": - version: 3.5.0 - resolution: "rtlcss@npm:3.5.0" - dependencies: - find-up: "npm:^5.0.0" - picocolors: "npm:^1.0.0" - postcss: "npm:^8.3.11" - strip-json-comments: "npm:^3.1.1" - bin: - rtlcss: bin/rtlcss.js - checksum: 10c0/c50f61bf7315be5677a75464e7457661687e321f714cae51be8b6f7b7ab89c4203b25fae15951eceb79f6d551eae65e42eabde55087fd5aa07ad1e05698793d0 - languageName: node - linkType: hard - "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -17970,7 +12543,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.5.4, rxjs@npm:^7.8.1": +"rxjs@npm:^7.8.1": version: 7.8.1 resolution: "rxjs@npm:7.8.1" dependencies: @@ -18004,14 +12577,14 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": +"safe-buffer@npm:5.1.2": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 @@ -18057,13 +12630,6 @@ __metadata: languageName: node linkType: hard -"sax@npm:^1.2.4": - version: 1.2.4 - resolution: "sax@npm:1.2.4" - checksum: 10c0/6e9b05ff443ee5e5096ce92d31c0740a20d33002fad714ebcb8fc7a664d9ee159103ebe8f7aef0a1f7c5ecacdd01f177f510dff95611c589399baf76437d3fe3 - languageName: node - linkType: hard - "scheduler@npm:0.25.0, scheduler@npm:^0.25.0": version: 0.25.0 resolution: "scheduler@npm:0.25.0" @@ -18071,15 +12637,6 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.23.2": - version: 0.23.2 - resolution: "scheduler@npm:0.23.2" - dependencies: - loose-envify: "npm:^1.1.0" - checksum: 10c0/26383305e249651d4c58e6705d5f8425f153211aef95f15161c151f7b8de885f24751b377e4a0b3dd42cce09aad3f87a61dab7636859c0d89b7daf1a1e2a5c78 - languageName: node - linkType: hard - "scheduler@npm:^0.26.0": version: 0.26.0 resolution: "scheduler@npm:0.26.0" @@ -18087,88 +12644,7 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:2.7.0": - version: 2.7.0 - resolution: "schema-utils@npm:2.7.0" - dependencies: - "@types/json-schema": "npm:^7.0.4" - ajv: "npm:^6.12.2" - ajv-keywords: "npm:^3.4.1" - checksum: 10c0/723c3c856a0313a89aa81c5fb2c93d4b11225f5cdd442665fddd55d3c285ae72e079f5286a3a9a1a973affe888f6c33554a2cf47b79b24cd8de2f1f756a6fb1b - languageName: node - linkType: hard - -"schema-utils@npm:^2.6.5": - version: 2.7.1 - resolution: "schema-utils@npm:2.7.1" - dependencies: - "@types/json-schema": "npm:^7.0.5" - ajv: "npm:^6.12.4" - ajv-keywords: "npm:^3.5.2" - checksum: 10c0/f484f34464edd8758712d5d3ba25a306e367dac988aecaf4ce112e99baae73f33a807b5cf869240bb6648c80720b36af2d7d72be3a27faa49a2d4fc63fa3f85f - languageName: node - linkType: hard - -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": - version: 3.3.0 - resolution: "schema-utils@npm:3.3.0" - dependencies: - "@types/json-schema": "npm:^7.0.8" - ajv: "npm:^6.12.5" - ajv-keywords: "npm:^3.5.2" - checksum: 10c0/fafdbde91ad8aa1316bc543d4b61e65ea86970aebbfb750bfb6d8a6c287a23e415e0e926c2498696b242f63af1aab8e585252637fabe811fd37b604351da6500 - languageName: node - linkType: hard - -"schema-utils@npm:^4.0.0": - version: 4.2.0 - resolution: "schema-utils@npm:4.2.0" - dependencies: - "@types/json-schema": "npm:^7.0.9" - ajv: "npm:^8.9.0" - ajv-formats: "npm:^2.1.1" - ajv-keywords: "npm:^5.1.0" - checksum: 10c0/8dab7e7800316387fd8569870b4b668cfcecf95ac551e369ea799bbcbfb63fb0365366d4b59f64822c9f7904d8c5afcfaf5a6124a4b08783e558cd25f299a6b4 - languageName: node - linkType: hard - -"section-matter@npm:^1.0.0": - version: 1.0.0 - resolution: "section-matter@npm:1.0.0" - dependencies: - extend-shallow: "npm:^2.0.1" - kind-of: "npm:^6.0.0" - checksum: 10c0/8007f91780adc5aaa781a848eaae50b0f680bbf4043b90cf8a96778195b8fab690c87fe7a989e02394ce69890e330811ec8dab22397d384673ce59f7d750641d - languageName: node - linkType: hard - -"select-hose@npm:^2.0.0": - version: 2.0.0 - resolution: "select-hose@npm:2.0.0" - checksum: 10c0/01cc52edd29feddaf379efb4328aededa633f0ac43c64b11a8abd075ff34f05b0d280882c4fbcbdf1a0658202c9cd2ea8d5985174dcf9a2dac7e3a4996fa9b67 - languageName: node - linkType: hard - -"selfsigned@npm:^2.1.1": - version: 2.4.1 - resolution: "selfsigned@npm:2.4.1" - dependencies: - "@types/node-forge": "npm:^1.3.0" - node-forge: "npm:^1" - checksum: 10c0/521829ec36ea042f7e9963bf1da2ed040a815cf774422544b112ec53b7edc0bc50a0f8cc2ae7aa6cc19afa967c641fd96a15de0fc650c68651e41277d2e1df09 - languageName: node - linkType: hard - -"semver-diff@npm:^3.1.1": - version: 3.1.1 - resolution: "semver-diff@npm:3.1.1" - dependencies: - semver: "npm:^6.3.0" - checksum: 10c0/7d350f1450b9577d538ef866a9bc4cd97bfbf1f1d92070291495a31d0ec3aa808e826c223e5454ea9877cc06eaa886ffd71bb3a1f331b44bc210f9ff525c68d2 - languageName: node - linkType: hard - -"semver@npm:^5.4.1, semver@npm:^5.5.0": +"semver@npm:^5.5.0": version: 5.7.2 resolution: "semver@npm:5.7.2" bin: @@ -18177,7 +12653,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.2.0, semver@npm:^6.3.0, semver@npm:^6.3.1": +"semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -18186,7 +12662,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": +"semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -18244,47 +12720,7 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.1": - version: 6.0.1 - resolution: "serialize-javascript@npm:6.0.1" - dependencies: - randombytes: "npm:^2.1.0" - checksum: 10c0/1af427f4fee3fee051f54ffe15f77068cff78a3c96d20f5c1178d20630d3ab122d8350e639d5e13cde8111ef9db9439b871305ffb185e24be0a2149cec230988 - languageName: node - linkType: hard - -"serve-handler@npm:^6.1.3": - version: 6.1.5 - resolution: "serve-handler@npm:6.1.5" - dependencies: - bytes: "npm:3.0.0" - content-disposition: "npm:0.5.2" - fast-url-parser: "npm:1.1.3" - mime-types: "npm:2.1.18" - minimatch: "npm:3.1.2" - path-is-inside: "npm:1.0.2" - path-to-regexp: "npm:2.2.1" - range-parser: "npm:1.2.0" - checksum: 10c0/6fd393ae37a0305107e634ca545322b00605322189fe70d8f1a4a90a101c4e354768c610efe5a7ef1af3820cec5c33d97467c88151f35a3cb41d8ff2075ef802 - languageName: node - linkType: hard - -"serve-index@npm:^1.9.1": - version: 1.9.1 - resolution: "serve-index@npm:1.9.1" - dependencies: - accepts: "npm:~1.3.4" - batch: "npm:0.6.1" - debug: "npm:2.6.9" - escape-html: "npm:~1.0.3" - http-errors: "npm:~1.6.2" - mime-types: "npm:~2.1.17" - parseurl: "npm:~1.3.2" - checksum: 10c0/a666471a24196f74371edf2c3c7bcdd82adbac52f600804508754b5296c3567588bf694258b19e0cb23a567acfa20d9721bfdaed3286007b81f9741ada8a3a9c - languageName: node - linkType: hard - -"serve-static@npm:1.15.0, serve-static@npm:^1.13.1": +"serve-static@npm:^1.13.1": version: 1.15.0 resolution: "serve-static@npm:1.15.0" dependencies: @@ -18375,20 +12811,6 @@ __metadata: languageName: node linkType: hard -"setimmediate@npm:^1.0.5": - version: 1.0.5 - resolution: "setimmediate@npm:1.0.5" - checksum: 10c0/5bae81bfdbfbd0ce992893286d49c9693c82b1bcc00dcaaf3a09c8f428fdeacf4190c013598b81875dfac2b08a572422db7df779a99332d0fce186d15a3e4d49 - languageName: node - linkType: hard - -"setprototypeof@npm:1.1.0": - version: 1.1.0 - resolution: "setprototypeof@npm:1.1.0" - checksum: 10c0/a77b20876689c6a89c3b42f0c3596a9cae02f90fc902570cbd97198e9e8240382086c9303ad043e88cee10f61eae19f1004e51d885395a1e9bf49f9ebed12872 - languageName: node - linkType: hard - "setprototypeof@npm:1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" @@ -18396,22 +12818,6 @@ __metadata: languageName: node linkType: hard -"shallow-clone@npm:^3.0.0": - version: 3.0.1 - resolution: "shallow-clone@npm:3.0.1" - dependencies: - kind-of: "npm:^6.0.2" - checksum: 10c0/7bab09613a1b9f480c85a9823aebec533015579fa055ba6634aa56ba1f984380670eaf33b8217502931872aa1401c9fcadaa15f9f604d631536df475b05bcf1e - languageName: node - linkType: hard - -"shallowequal@npm:^1.1.0": - version: 1.1.0 - resolution: "shallowequal@npm:1.1.0" - checksum: 10c0/b926efb51cd0f47aa9bc061add788a4a650550bbe50647962113a4579b60af2abe7b62f9b02314acc6f97151d4cf87033a2b15fc20852fae306d1a095215396c - languageName: node - linkType: hard - "shebang-command@npm:^1.2.0": version: 1.2.0 resolution: "shebang-command@npm:1.2.0" @@ -18458,7 +12864,7 @@ __metadata: languageName: node linkType: hard -"shelljs@npm:^0.8.4, shelljs@npm:^0.8.5": +"shelljs@npm:^0.8.4": version: 0.8.5 resolution: "shelljs@npm:0.8.5" dependencies: @@ -18536,36 +12942,11 @@ __metadata: checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 languageName: node linkType: hard - -"sirv@npm:^1.0.7": - version: 1.0.19 - resolution: "sirv@npm:1.0.19" - dependencies: - "@polka/url": "npm:^1.0.0-next.20" - mrmime: "npm:^1.0.0" - totalist: "npm:^1.0.0" - checksum: 10c0/393cc0471e82d3e754a8c1b2b348a86249db1f686aeb11c17e4217326a8b1a96029d9f1b58362ebb3e511b7b98c47cd43c4305dde98322bb1259d07dec2d4908 - languageName: node - linkType: hard - -"sisteransi@npm:^1.0.5": - version: 1.0.5 - resolution: "sisteransi@npm:1.0.5" - checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 - languageName: node - linkType: hard - -"sitemap@npm:^7.1.1": - version: 7.1.1 - resolution: "sitemap@npm:7.1.1" - dependencies: - "@types/node": "npm:^17.0.5" - "@types/sax": "npm:^1.2.1" - arg: "npm:^5.0.0" - sax: "npm:^1.2.4" - bin: - sitemap: dist/cli.js - checksum: 10c0/d25abe5c78f08e6014792e0f4d59353042a5a795788decdd87cb03bda736d248426a618e5028e18325f04b3e9d0ecb02d126ed6177365aa2703fa77df8f4f4e0 + +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 languageName: node linkType: hard @@ -18608,17 +12989,6 @@ __metadata: languageName: node linkType: hard -"sockjs@npm:^0.3.24": - version: 0.3.24 - resolution: "sockjs@npm:0.3.24" - dependencies: - faye-websocket: "npm:^0.11.3" - uuid: "npm:^8.3.2" - websocket-driver: "npm:^0.7.4" - checksum: 10c0/aa102c7d921bf430215754511c81ea7248f2dcdf268fbdb18e4d8183493a86b8793b164c636c52f474a886f747447c962741df2373888823271efdb9d2594f33 - languageName: node - linkType: hard - "socks-proxy-agent@npm:^6.1.1": version: 6.2.1 resolution: "socks-proxy-agent@npm:6.2.1" @@ -18640,20 +13010,6 @@ __metadata: languageName: node linkType: hard -"sort-css-media-queries@npm:2.1.0": - version: 2.1.0 - resolution: "sort-css-media-queries@npm:2.1.0" - checksum: 10c0/6b39dd2503d8279688fee837c63bdf3b49eea14d10d5ae09d9e99e4a0b3da1b702c3931e8f793b702b9ea8929a9389ba8d6345b58b5d1f0ec3e84920685a724a - languageName: node - linkType: hard - -"source-map-js@npm:^1.0.2": - version: 1.0.2 - resolution: "source-map-js@npm:1.0.2" - checksum: 10c0/32f2dfd1e9b7168f9a9715eb1b4e21905850f3b50cf02cf476e47e4eebe8e6b762b63a64357896aa29b37e24922b4282df0f492e0d2ace572b43d15525976ff8 - languageName: node - linkType: hard - "source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" @@ -18681,27 +13037,20 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.5.0, source-map@npm:^0.5.6": +"source-map@npm:^0.5.6": version: 0.5.7 resolution: "source-map@npm:0.5.7" checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 languageName: node linkType: hard -"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0": +"source-map@npm:^0.6.0, source-map@npm:^0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 languageName: node linkType: hard -"space-separated-tokens@npm:^1.0.0": - version: 1.1.5 - resolution: "space-separated-tokens@npm:1.1.5" - checksum: 10c0/3ee0a6905f89e1ffdfe474124b1ade9fe97276a377a0b01350bc079b6ec566eb5b219e26064cc5b7f3899c05bde51ffbc9154290b96eaf82916a1e2c2c13ead9 - languageName: node - linkType: hard - "spawn-command@npm:0.0.2": version: 0.0.2 resolution: "spawn-command@npm:0.0.2" @@ -18753,33 +13102,6 @@ __metadata: languageName: node linkType: hard -"spdy-transport@npm:^3.0.0": - version: 3.0.0 - resolution: "spdy-transport@npm:3.0.0" - dependencies: - debug: "npm:^4.1.0" - detect-node: "npm:^2.0.4" - hpack.js: "npm:^2.1.6" - obuf: "npm:^1.1.2" - readable-stream: "npm:^3.0.6" - wbuf: "npm:^1.7.3" - checksum: 10c0/eaf7440fa90724fffc813c386d4a8a7427d967d6e46d7c51d8f8a533d1a6911b9823ea9218703debbae755337e85f110185d7a00ae22ec5c847077b908ce71bb - languageName: node - linkType: hard - -"spdy@npm:^4.0.2": - version: 4.0.2 - resolution: "spdy@npm:4.0.2" - dependencies: - debug: "npm:^4.1.0" - handle-thing: "npm:^2.0.0" - http-deceiver: "npm:^1.2.7" - select-hose: "npm:^2.0.0" - spdy-transport: "npm:^3.0.0" - checksum: 10c0/983509c0be9d06fd00bb9dff713c5b5d35d3ffd720db869acdd5ad7aa6fc0e02c2318b58f75328957d8ff772acdf1f7d19382b6047df342044ff3e2d6805ccdf - languageName: node - linkType: hard - "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -18796,13 +13118,6 @@ __metadata: languageName: node linkType: hard -"stable@npm:^0.1.8": - version: 0.1.8 - resolution: "stable@npm:0.1.8" - checksum: 10c0/df74b5883075076e78f8e365e4068ecd977af6c09da510cfc3148a303d4b87bc9aa8f7c48feb67ed4ef970b6140bd9eabba2129e28024aa88df5ea0114cba39d - languageName: node - linkType: hard - "stack-utils@npm:^2.0.3": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" @@ -18828,13 +13143,6 @@ __metadata: languageName: node linkType: hard -"state-toggle@npm:^1.0.0": - version: 1.0.3 - resolution: "state-toggle@npm:1.0.3" - checksum: 10c0/6051ee5654b39b0006911ae3130fa7f47675e07db16a711d8cd23d43b63f383e98f3bd9fa80e118a3f5964a11284d8eee180baef27a556146e628f8da74aba12 - languageName: node - linkType: hard - "statuses@npm:2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" @@ -18842,20 +13150,13 @@ __metadata: languageName: node linkType: hard -"statuses@npm:>= 1.4.0 < 2, statuses@npm:~1.5.0": +"statuses@npm:~1.5.0": version: 1.5.0 resolution: "statuses@npm:1.5.0" checksum: 10c0/e433900956357b3efd79b1c547da4d291799ac836960c016d10a98f6a810b1b5c0dcc13b5a7aa609a58239b5190e1ea176ad9221c2157d2fd1c747393e6b2940 languageName: node linkType: hard -"std-env@npm:^3.0.1": - version: 3.3.3 - resolution: "std-env@npm:3.3.3" - checksum: 10c0/d80656542889958982427a5891b4d266f0e531060b249c3fc882e1c1b1cec58160b9e3cab9cf5635d58a2c23692237170b3fa45be738866518b8be77a7658b89 - languageName: node - linkType: hard - "stop-iteration-iterator@npm:^1.1.0": version: 1.1.0 resolution: "stop-iteration-iterator@npm:1.1.0" @@ -18883,7 +13184,7 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.0.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.2, string-width@npm:^4.2.3": +"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -18894,17 +13195,6 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^5.0.1": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: "npm:^0.2.0" - emoji-regex: "npm:^9.2.2" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca - languageName: node - linkType: hard - "string.prototype.matchall@npm:^4.0.12": version: 4.0.12 resolution: "string.prototype.matchall@npm:4.0.12" @@ -19016,26 +13306,6 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" - dependencies: - safe-buffer: "npm:~5.1.0" - checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e - languageName: node - linkType: hard - -"stringify-object@npm:^3.3.0": - version: 3.3.0 - resolution: "stringify-object@npm:3.3.0" - dependencies: - get-own-enumerable-property-symbols: "npm:^3.0.0" - is-obj: "npm:^1.0.1" - is-regexp: "npm:^1.0.0" - checksum: 10c0/ba8078f84128979ee24b3de9a083489cbd3c62cb8572a061b47d4d82601a8ae4b4d86fa8c54dd955593da56bb7c16a6de51c27221fdc6b7139bb4f29d815f35b - languageName: node - linkType: hard - "strip-ansi@npm:^5.0.0, strip-ansi@npm:^5.2.0": version: 5.2.0 resolution: "strip-ansi@npm:5.2.0" @@ -19054,22 +13324,6 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 - languageName: node - linkType: hard - -"strip-bom-string@npm:^1.0.0": - version: 1.0.0 - resolution: "strip-bom-string@npm:1.0.0" - checksum: 10c0/5c5717e2643225aa6a6d659d34176ab2657037f1fe2423ac6fcdb488f135e14fef1022030e426d8b4d0989e09adbd5c3288d5d3b9c632abeefd2358dfc512bca - languageName: node - linkType: hard - "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" @@ -19114,13 +13368,6 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:~2.0.1": - version: 2.0.1 - resolution: "strip-json-comments@npm:2.0.1" - checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 - languageName: node - linkType: hard - "strnum@npm:^1.0.5": version: 1.0.5 resolution: "strnum@npm:1.0.5" @@ -19128,27 +13375,6 @@ __metadata: languageName: node linkType: hard -"style-to-object@npm:0.3.0, style-to-object@npm:^0.3.0": - version: 0.3.0 - resolution: "style-to-object@npm:0.3.0" - dependencies: - inline-style-parser: "npm:0.1.1" - checksum: 10c0/afe9b96ba077a9068baf8887091870f50298157c0ebf5378151792cf2a2ce084fec9b34fc544da0d9f8e6c22ca0c9e23aa6f075bb8eb051aa1d64363e9987600 - languageName: node - linkType: hard - -"stylehacks@npm:^5.1.1": - version: 5.1.1 - resolution: "stylehacks@npm:5.1.1" - dependencies: - browserslist: "npm:^4.21.4" - postcss-selector-parser: "npm:^6.0.4" - peerDependencies: - postcss: ^8.2.15 - checksum: 10c0/402c2b545eeda0e972f125779adddc88df11bcf3a89de60c92026bd98cd49c1abffcd5bfe41766398835e0a1c7e5e72bdb6905809ecbb60716cd8d3a32ea7cd3 - languageName: node - linkType: hard - "sudo-prompt@npm:^9.0.0": version: 9.2.1 resolution: "sudo-prompt@npm:9.2.1" @@ -19190,30 +13416,6 @@ __metadata: languageName: node linkType: hard -"svg-parser@npm:^2.0.4": - version: 2.0.4 - resolution: "svg-parser@npm:2.0.4" - checksum: 10c0/02f6cb155dd7b63ebc2f44f36365bc294543bebb81b614b7628f1af3c54ab64f7e1cec20f06e252bf95bdde78441ae295a412c68ad1678f16a6907d924512b7a - languageName: node - linkType: hard - -"svgo@npm:^2.7.0, svgo@npm:^2.8.0": - version: 2.8.0 - resolution: "svgo@npm:2.8.0" - dependencies: - "@trysound/sax": "npm:0.2.0" - commander: "npm:^7.2.0" - css-select: "npm:^4.1.3" - css-tree: "npm:^1.1.3" - csso: "npm:^4.2.0" - picocolors: "npm:^1.0.0" - stable: "npm:^0.1.8" - bin: - svgo: bin/svgo - checksum: 10c0/0741f5d5cad63111a90a0ce7a1a5a9013f6d293e871b75efe39addb57f29a263e45294e485a4d2ff9cc260a5d142c8b5937b2234b4ef05efdd2706fb2d360ecc - languageName: node - linkType: hard - "synckit@npm:^0.11.7": version: 0.11.11 resolution: "synckit@npm:0.11.11" @@ -19230,14 +13432,7 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^1.0.0": - version: 1.1.3 - resolution: "tapable@npm:1.1.3" - checksum: 10c0/c9f0265e55e45821ec672b9b9ee8a35d95bf3ea6b352199f8606a2799018e89cfe4433c554d424b31fc67c4be26b05d4f36dc3c607def416fdb2514cd63dba50 - languageName: node - linkType: hard - -"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0": +"tapable@npm:^2.2.0": version: 2.2.1 resolution: "tapable@npm:2.2.1" checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 @@ -19279,29 +13474,7 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.3.10, terser-webpack-plugin@npm:^5.3.3": - version: 5.3.10 - resolution: "terser-webpack-plugin@npm:5.3.10" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.20" - jest-worker: "npm:^27.4.5" - schema-utils: "npm:^3.1.1" - serialize-javascript: "npm:^6.0.1" - terser: "npm:^5.26.0" - peerDependencies: - webpack: ^5.1.0 - peerDependenciesMeta: - "@swc/core": - optional: true - esbuild: - optional: true - uglify-js: - optional: true - checksum: 10c0/66d1ed3174542560911cf96f4716aeea8d60e7caab212291705d50072b6ba844c7391442541b13c848684044042bea9ec87512b8506528c12854943da05faf91 - languageName: node - linkType: hard - -"terser@npm:^5.10.0, terser@npm:^5.15.0, terser@npm:^5.26.0": +"terser@npm:^5.15.0": version: 5.31.6 resolution: "terser@npm:5.31.6" dependencies: @@ -19326,13 +13499,6 @@ __metadata: languageName: node linkType: hard -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c - languageName: node - linkType: hard - "throat@npm:^5.0.0": version: 5.0.0 resolution: "throat@npm:5.0.0" @@ -19340,27 +13506,6 @@ __metadata: languageName: node linkType: hard -"thunky@npm:^1.0.2": - version: 1.1.0 - resolution: "thunky@npm:1.1.0" - checksum: 10c0/369764f39de1ce1de2ba2fa922db4a3f92e9c7f33bcc9a713241bc1f4a5238b484c17e0d36d1d533c625efb00e9e82c3e45f80b47586945557b45abb890156d2 - languageName: node - linkType: hard - -"tiny-invariant@npm:^1.0.2": - version: 1.3.1 - resolution: "tiny-invariant@npm:1.3.1" - checksum: 10c0/5b87c1d52847d9452b60d0dcb77011b459044e0361ca8253bfe7b43d6288106e12af926adb709a6fc28900e3864349b91dad9a4ac93c39aa15f360b26c2ff4db - languageName: node - linkType: hard - -"tiny-warning@npm:^1.0.0": - version: 1.0.3 - resolution: "tiny-warning@npm:1.0.3" - checksum: 10c0/ef8531f581b30342f29670cb41ca248001c6fd7975ce22122bd59b8d62b4fc84ad4207ee7faa95cde982fa3357cd8f4be650142abc22805538c3b1392d7084fa - languageName: node - linkType: hard - "tinyglobby@npm:^0.2.15": version: 0.2.15 resolution: "tinyglobby@npm:0.2.15" @@ -19387,13 +13532,6 @@ __metadata: languageName: node linkType: hard -"to-readable-stream@npm:^1.0.0": - version: 1.0.0 - resolution: "to-readable-stream@npm:1.0.0" - checksum: 10c0/79cb836e2fb4f2885745a8c212eab7ebc52e93758ff0737feceaed96df98e4d04b8903fe8c27f2e9f3f856a5068ac332918b235c5d801b3efe02a51a3fa0eb36 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -19403,16 +13541,6 @@ __metadata: languageName: node linkType: hard -"to-vfile@npm:^6.1.0": - version: 6.1.0 - resolution: "to-vfile@npm:6.1.0" - dependencies: - is-buffer: "npm:^2.0.0" - vfile: "npm:^4.0.0" - checksum: 10c0/769591736463332c8c99c418fd94ef0810cf53ae24bdcb7e78b7ce7b0daff5ddf8425e02045e47a722afef538b8986307cf32aee4e36b2568a727b5b6514f81e - languageName: node - linkType: hard - "toidentifier@npm:1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" @@ -19420,20 +13548,6 @@ __metadata: languageName: node linkType: hard -"totalist@npm:^1.0.0": - version: 1.1.0 - resolution: "totalist@npm:1.1.0" - checksum: 10c0/2adbd4501c8290c2a96617a83dc67dfdd02bcbd360032017e27ccf27bbb09649bbe8dad1c45d97be6874281178aca5b3f62ed059d1eeda77c479cfb8eb3a9266 - languageName: node - linkType: hard - -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 10c0/047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 - languageName: node - linkType: hard - "tree-kill@npm:^1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" @@ -19450,27 +13564,6 @@ __metadata: languageName: node linkType: hard -"trim-trailing-lines@npm:^1.0.0": - version: 1.1.4 - resolution: "trim-trailing-lines@npm:1.1.4" - checksum: 10c0/95c35ece5fc806e626e7a93a2135c52932d1dee584963138dbefb1df6cb7adcb7a7c68e2c63f05c536f0681c9260e1d5262cb2e234242d23b9a31617b2c1d53c - languageName: node - linkType: hard - -"trim@npm:0.0.1": - version: 0.0.1 - resolution: "trim@npm:0.0.1" - checksum: 10c0/d974971fc8b8629d13286f20ec6ccc48f480494ca9df358d452beb1fd7eea1b802be41cc7ee157be4abbdf1b3ca79cc6d04c34b14a7026037d437e8de9dacecb - languageName: node - linkType: hard - -"trough@npm:^1.0.0": - version: 1.0.5 - resolution: "trough@npm:1.0.5" - checksum: 10c0/f036d0d7f9bc7cfe5ee650d70b57bb1f048f3292adf6c81bb9b228e546b2b2e5b74ea04a060d21472108a8cda05ec4814bbe86f87ee35c182c50cb41b5c1810a - languageName: node - linkType: hard - "ts-api-utils@npm:^1.3.0": version: 1.4.3 resolution: "ts-api-utils@npm:1.4.3" @@ -19496,7 +13589,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.4.0": +"tslib@npm:^2.1.0, tslib@npm:^2.4.0": version: 2.6.3 resolution: "tslib@npm:2.6.3" checksum: 10c0/2598aef53d9dbe711af75522464b2104724d6467b26a60f2bdac8297d2b5f1f6b86a71f61717384aa8fd897240467aaa7bcc36a0700a0faf751293d1331db39a @@ -19608,13 +13701,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 10c0/dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 - languageName: node - linkType: hard - "type-fest@npm:^0.21.3": version: 0.21.3 resolution: "type-fest@npm:0.21.3" @@ -19636,13 +13722,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^2.5.0": - version: 2.19.0 - resolution: "type-fest@npm:2.19.0" - checksum: 10c0/a5a7ecf2e654251613218c215c7493574594951c08e52ab9881c9df6a6da0aeca7528c213c622bc374b4e0cb5c443aa3ab758da4e3c959783ce884c3194e12cb - languageName: node - linkType: hard - "type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" @@ -19753,15 +13832,6 @@ __metadata: languageName: node linkType: hard -"typedarray-to-buffer@npm:^3.1.5": - version: 3.1.5 - resolution: "typedarray-to-buffer@npm:3.1.5" - dependencies: - is-typedarray: "npm:^1.0.0" - checksum: 10c0/4ac5b7a93d604edabf3ac58d3a2f7e07487e9f6e98195a080e81dbffdc4127817f470f219d794a843b87052cedef102b53ac9b539855380b8c2172054b7d5027 - languageName: node - linkType: hard - "typescript-eslint@npm:^8.0.0": version: 8.41.0 resolution: "typescript-eslint@npm:8.41.0" @@ -19797,13 +13867,6 @@ __metadata: languageName: node linkType: hard -"ua-parser-js@npm:^1.0.35": - version: 1.0.35 - resolution: "ua-parser-js@npm:1.0.35" - checksum: 10c0/4641332fdf163ecdec4810cc2335932754f1b71527097f06005a658de256e22f5836a4a7860619c9e611d578e0451ff39dbff1a9b83c6615e3b0b3dd29588c30 - languageName: node - linkType: hard - "unbox-primitive@npm:^1.0.2": version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2" @@ -19819,200 +13882,68 @@ __metadata: "unbox-primitive@npm:^1.1.0": version: 1.1.0 resolution: "unbox-primitive@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.3" - has-bigints: "npm:^1.0.2" - has-symbols: "npm:^1.1.0" - which-boxed-primitive: "npm:^1.1.1" - checksum: 10c0/7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982 - languageName: node - linkType: hard - -"unc-path-regex@npm:^0.1.2": - version: 0.1.2 - resolution: "unc-path-regex@npm:0.1.2" - checksum: 10c0/bf9c781c4e2f38e6613ea17a51072e4b416840fbe6eeb244597ce9b028fac2fb6cfd3dde1f14111b02c245e665dc461aab8168ecc30b14364d02caa37f812996 - languageName: node - linkType: hard - -"unherit@npm:^1.0.4": - version: 1.1.3 - resolution: "unherit@npm:1.1.3" - dependencies: - inherits: "npm:^2.0.0" - xtend: "npm:^4.0.0" - checksum: 10c0/f953b548e56ef347b14c0897484ff22187acfeeb599afe2994cfdbfaddffe8731b999029e243fd40966b597bdffd541f3b5a54254797b98aebb760bb39dd8456 - languageName: node - linkType: hard - -"unicode-canonical-property-names-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" - checksum: 10c0/0fe812641bcfa3ae433025178a64afb5d9afebc21a922dafa7cba971deebb5e4a37350423890750132a85c936c290fb988146d0b1bd86838ad4897f4fc5bd0de - languageName: node - linkType: hard - -"unicode-match-property-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-match-property-ecmascript@npm:2.0.0" - dependencies: - unicode-canonical-property-names-ecmascript: "npm:^2.0.0" - unicode-property-aliases-ecmascript: "npm:^2.0.0" - checksum: 10c0/4d05252cecaf5c8e36d78dc5332e03b334c6242faf7cf16b3658525441386c0a03b5f603d42cbec0f09bb63b9fd25c9b3b09667aee75463cac3efadae2cd17ec - languageName: node - linkType: hard - -"unicode-match-property-value-ecmascript@npm:^2.1.0": - version: 2.1.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.1.0" - checksum: 10c0/f5b9499b9e0ffdc6027b744d528f17ec27dd7c15da03254ed06851feec47e0531f20d410910c8a49af4a6a190f4978413794c8d75ce112950b56d583b5d5c7f2 - languageName: node - linkType: hard - -"unicode-property-aliases-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-property-aliases-ecmascript@npm:2.0.0" - checksum: 10c0/db7f7ae188ce1a59b133a2c97021aebe30acc18a55f41074d126dcce5ac9d789dbd3ce7947e391b23db27f969251037b6ae05871d036aaa6cc0a6510c429aa1c - languageName: node - linkType: hard - -"unified@npm:9.2.0": - version: 9.2.0 - resolution: "unified@npm:9.2.0" - dependencies: - bail: "npm:^1.0.0" - extend: "npm:^3.0.0" - is-buffer: "npm:^2.0.0" - is-plain-obj: "npm:^2.0.0" - trough: "npm:^1.0.0" - vfile: "npm:^4.0.0" - checksum: 10c0/53aedb794b0ada002b72593d74633f45742e3dfe771a8091c0f51b59119f74f3f1bba0a24c5d72a35629793f992cf9e1debf21aa4689dc718482ffec3a633623 - languageName: node - linkType: hard - -"unified@npm:^9.0.0, unified@npm:^9.2.2": - version: 9.2.2 - resolution: "unified@npm:9.2.2" - dependencies: - bail: "npm:^1.0.0" - extend: "npm:^3.0.0" - is-buffer: "npm:^2.0.0" - is-plain-obj: "npm:^2.0.0" - trough: "npm:^1.0.0" - vfile: "npm:^4.0.0" - checksum: 10c0/a66d71b039c24626802a4664a1f3210f29ab1f75b89fd41933e6ab00561e1ec43a5bec6de32c7ebc86544e5f00ef5836e8fe79a823e81e35825de4e35823eda9 - languageName: node - linkType: hard - -"unique-filename@npm:^1.1.1": - version: 1.1.1 - resolution: "unique-filename@npm:1.1.1" - dependencies: - unique-slug: "npm:^2.0.0" - checksum: 10c0/d005bdfaae6894da8407c4de2b52f38b3c58ec86e79fc2ee19939da3085374413b073478ec54e721dc8e32b102cf9e50d0481b8331abdc62202e774b789ea874 - languageName: node - linkType: hard - -"unique-slug@npm:^2.0.0": - version: 2.0.2 - resolution: "unique-slug@npm:2.0.2" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/9eabc51680cf0b8b197811a48857e41f1364b25362300c1ff636c0eca5ec543a92a38786f59cf0697e62c6f814b11ecbe64e8093db71246468a1f03b80c83970 - languageName: node - linkType: hard - -"unique-string@npm:^2.0.0": - version: 2.0.0 - resolution: "unique-string@npm:2.0.0" - dependencies: - crypto-random-string: "npm:^2.0.0" - checksum: 10c0/11820db0a4ba069d174bedfa96c588fc2c96b083066fafa186851e563951d0de78181ac79c744c1ed28b51f9d82ac5b8196ff3e4560d0178046ef455d8c2244b - languageName: node - linkType: hard - -"unist-builder@npm:2.0.3, unist-builder@npm:^2.0.0": - version: 2.0.3 - resolution: "unist-builder@npm:2.0.3" - checksum: 10c0/d8b13ffd774bfe6175ca988d63cbaf6d85882a0701d6158597134ce1c3acf665a09421461a4036704f77edb8a6a2792d09eb55382428c2a9a60488b44909eeae - languageName: node - linkType: hard - -"unist-util-find-after@npm:^3.0.0": - version: 3.0.0 - resolution: "unist-util-find-after@npm:3.0.0" - dependencies: - unist-util-is: "npm:^4.0.0" - checksum: 10c0/667e43a675a2f8bc8e7ed2b5f1c2d5f8750c70488cb6655f6d4689230005c07b73d3453876b21ad1b1bd401a7972015779e0b95db7cc0456be4676a6f6e8afb8 - languageName: node - linkType: hard - -"unist-util-generated@npm:^1.0.0": - version: 1.1.6 - resolution: "unist-util-generated@npm:1.1.6" - checksum: 10c0/ee04a58a6711145ec5c8c6f10dfd3335ac93d9039dc35e7410ffc1299d6f3671b27d9b7aa486f826bd66ec15807ad6d0bf9348b34a1046440e1617abcf42903f + dependencies: + call-bound: "npm:^1.0.3" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + which-boxed-primitive: "npm:^1.1.1" + checksum: 10c0/7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982 languageName: node linkType: hard -"unist-util-is@npm:^4.0.0, unist-util-is@npm:^4.0.2": - version: 4.1.0 - resolution: "unist-util-is@npm:4.1.0" - checksum: 10c0/21ca3d7bacc88853b880b19cb1b133a056c501617d7f9b8cce969cd8b430ed7e1bc416a3a11b02540d5de6fb86807e169d00596108a459d034cf5faec97c055e +"unc-path-regex@npm:^0.1.2": + version: 0.1.2 + resolution: "unc-path-regex@npm:0.1.2" + checksum: 10c0/bf9c781c4e2f38e6613ea17a51072e4b416840fbe6eeb244597ce9b028fac2fb6cfd3dde1f14111b02c245e665dc461aab8168ecc30b14364d02caa37f812996 languageName: node linkType: hard -"unist-util-position@npm:^3.0.0": - version: 3.1.0 - resolution: "unist-util-position@npm:3.1.0" - checksum: 10c0/a89d4095560f01e0ddfdab3deae6abd250ee6b91c3b23922de05297227a4aede076d96cb0e22e9962d0e85f54d11f719d1e11388233d0936631b8527485a02a8 +"unicode-canonical-property-names-ecmascript@npm:^2.0.0": + version: 2.0.0 + resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" + checksum: 10c0/0fe812641bcfa3ae433025178a64afb5d9afebc21a922dafa7cba971deebb5e4a37350423890750132a85c936c290fb988146d0b1bd86838ad4897f4fc5bd0de languageName: node linkType: hard -"unist-util-remove-position@npm:^2.0.0": - version: 2.0.1 - resolution: "unist-util-remove-position@npm:2.0.1" +"unicode-match-property-ecmascript@npm:^2.0.0": + version: 2.0.0 + resolution: "unicode-match-property-ecmascript@npm:2.0.0" dependencies: - unist-util-visit: "npm:^2.0.0" - checksum: 10c0/9aadc8e9fafc4eeb04462454ab084184b84b397a367cab3787c59411b16c8f03d13e80e9ffd6bdae68bf8e5175f42008f410288a041a6ee53bcac8ced45a12ed + unicode-canonical-property-names-ecmascript: "npm:^2.0.0" + unicode-property-aliases-ecmascript: "npm:^2.0.0" + checksum: 10c0/4d05252cecaf5c8e36d78dc5332e03b334c6242faf7cf16b3658525441386c0a03b5f603d42cbec0f09bb63b9fd25c9b3b09667aee75463cac3efadae2cd17ec languageName: node linkType: hard -"unist-util-remove@npm:^2.0.0": +"unicode-match-property-value-ecmascript@npm:^2.1.0": version: 2.1.0 - resolution: "unist-util-remove@npm:2.1.0" - dependencies: - unist-util-is: "npm:^4.0.0" - checksum: 10c0/f7dea56fb720ddab5e406af12ce37453b028273e23a7cc3e4c9f3f1ec85e1f72c6943a1ebb907120c9be0b1d08b209d7b8c7d2191a5012e16081056edf638df9 + resolution: "unicode-match-property-value-ecmascript@npm:2.1.0" + checksum: 10c0/f5b9499b9e0ffdc6027b744d528f17ec27dd7c15da03254ed06851feec47e0531f20d410910c8a49af4a6a190f4978413794c8d75ce112950b56d583b5d5c7f2 languageName: node linkType: hard -"unist-util-stringify-position@npm:^2.0.0": - version: 2.0.3 - resolution: "unist-util-stringify-position@npm:2.0.3" - dependencies: - "@types/unist": "npm:^2.0.2" - checksum: 10c0/46fa03f840df173b7f032cbfffdb502fb05b79b3fb5451681c796cf4985d9087a537833f5afb75d55e79b46bbbe4b3d81dd75a1062f9289091c526aebe201d5d +"unicode-property-aliases-ecmascript@npm:^2.0.0": + version: 2.0.0 + resolution: "unicode-property-aliases-ecmascript@npm:2.0.0" + checksum: 10c0/db7f7ae188ce1a59b133a2c97021aebe30acc18a55f41074d126dcce5ac9d789dbd3ce7947e391b23db27f969251037b6ae05871d036aaa6cc0a6510c429aa1c languageName: node linkType: hard -"unist-util-visit-parents@npm:^3.0.0": - version: 3.1.1 - resolution: "unist-util-visit-parents@npm:3.1.1" +"unique-filename@npm:^1.1.1": + version: 1.1.1 + resolution: "unique-filename@npm:1.1.1" dependencies: - "@types/unist": "npm:^2.0.0" - unist-util-is: "npm:^4.0.0" - checksum: 10c0/231c80c5ba8e79263956fcaa25ed2a11ad7fe77ac5ba0d322e9d51bbc4238501e3bb52f405e518bcdc5471e27b33eff520db0aa4a3b1feb9fb6e2de6ae385d49 + unique-slug: "npm:^2.0.0" + checksum: 10c0/d005bdfaae6894da8407c4de2b52f38b3c58ec86e79fc2ee19939da3085374413b073478ec54e721dc8e32b102cf9e50d0481b8331abdc62202e774b789ea874 languageName: node linkType: hard -"unist-util-visit@npm:2.0.3, unist-util-visit@npm:^2.0.0, unist-util-visit@npm:^2.0.3": - version: 2.0.3 - resolution: "unist-util-visit@npm:2.0.3" +"unique-slug@npm:^2.0.0": + version: 2.0.2 + resolution: "unique-slug@npm:2.0.2" dependencies: - "@types/unist": "npm:^2.0.0" - unist-util-is: "npm:^4.0.0" - unist-util-visit-parents: "npm:^3.0.0" - checksum: 10c0/7b11303d82271ca53a2ced2d56c87a689dd518596c99ff4a11cdff750f5cc5c0e4b64b146bd2363557cb29443c98713bfd1e8dc6d1c3f9d474b9eb1f23a60888 + imurmurhash: "npm:^0.1.4" + checksum: 10c0/9eabc51680cf0b8b197811a48857e41f1364b25362300c1ff636c0eca5ec543a92a38786f59cf0697e62c6f814b11ecbe64e8093db71246468a1f03b80c83970 languageName: node linkType: hard @@ -20051,28 +13982,6 @@ __metadata: languageName: node linkType: hard -"update-notifier@npm:^5.1.0": - version: 5.1.0 - resolution: "update-notifier@npm:5.1.0" - dependencies: - boxen: "npm:^5.0.0" - chalk: "npm:^4.1.0" - configstore: "npm:^5.0.1" - has-yarn: "npm:^2.1.0" - import-lazy: "npm:^2.1.0" - is-ci: "npm:^2.0.0" - is-installed-globally: "npm:^0.4.0" - is-npm: "npm:^5.0.0" - is-yarn-global: "npm:^0.3.0" - latest-version: "npm:^5.1.0" - pupa: "npm:^2.1.1" - semver: "npm:^7.3.4" - semver-diff: "npm:^3.1.1" - xdg-basedir: "npm:^4.0.0" - checksum: 10c0/0dde6db5ac1e5244e1f8bf5b26895a0d53c00797ea2bdbc1302623dd1aecab5cfb88b4f324d482cbd4c8b089464383d8c83db64dec5798ec0136820e22478e47 - languageName: node - linkType: hard - "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -20082,76 +13991,6 @@ __metadata: languageName: node linkType: hard -"url-loader@npm:^4.1.1": - version: 4.1.1 - resolution: "url-loader@npm:4.1.1" - dependencies: - loader-utils: "npm:^2.0.0" - mime-types: "npm:^2.1.27" - schema-utils: "npm:^3.0.0" - peerDependencies: - file-loader: "*" - webpack: ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - file-loader: - optional: true - checksum: 10c0/71b6300e02ce26c70625eae1a2297c0737635038c62691bb3007ac33e85c0130efc74bfb444baf5c6b3bad5953491159d31d66498967d1417865d0c7e7cd1a64 - languageName: node - linkType: hard - -"url-parse-lax@npm:^3.0.0": - version: 3.0.0 - resolution: "url-parse-lax@npm:3.0.0" - dependencies: - prepend-http: "npm:^2.0.0" - checksum: 10c0/16f918634d41a4fab9e03c5f9702968c9930f7c29aa1a8c19a6dc01f97d02d9b700ab9f47f8da0b9ace6e0c0e99c27848994de1465b494bced6940c653481e55 - languageName: node - linkType: hard - -"use-composed-ref@npm:^1.3.0": - version: 1.3.0 - resolution: "use-composed-ref@npm:1.3.0" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/e64ce52f4b18c020407636784192726807404a2552609acf7497b66a2b7070674fb5d2b950d426c4aa85f353e2bbecb02ebf9c5b865cd06797938c70bcbf5d26 - languageName: node - linkType: hard - -"use-isomorphic-layout-effect@npm:^1.1.1": - version: 1.1.2 - resolution: "use-isomorphic-layout-effect@npm:1.1.2" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/d8deea8b85e55ac6daba237a889630bfdbf0ebf60e9e22b6a78a78c26fabe6025e04ada7abef1e444e6786227d921e648b2707db8b3564daf757264a148a6e23 - languageName: node - linkType: hard - -"use-latest@npm:^1.2.1": - version: 1.2.1 - resolution: "use-latest@npm:1.2.1" - dependencies: - use-isomorphic-layout-effect: "npm:^1.1.1" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/1958886fc35262d973f5cd4ce16acd6ce3a66707a72761c93abd1b5ae64e1a11efa83f68e6c8c9bf1647628037980ce59df64cba50adb36bd4071851e70527d2 - languageName: node - linkType: hard - -"use-sync-external-store@npm:^1.2.0": - version: 1.2.0 - resolution: "use-sync-external-store@npm:1.2.0" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/ac4814e5592524f242921157e791b022efe36e451fe0d4fd4d204322d5433a4fc300d63b0ade5185f8e0735ded044c70bcf6d2352db0f74d097a238cebd2da02 - languageName: node - linkType: hard - "username@npm:^5.1.0": version: 5.1.0 resolution: "username@npm:5.1.0" @@ -20162,27 +14001,13 @@ __metadata: languageName: node linkType: hard -"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": +"util-deprecate@npm:^1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 languageName: node linkType: hard -"utila@npm:~0.4": - version: 0.4.0 - resolution: "utila@npm:0.4.0" - checksum: 10c0/2791604e09ca4f77ae314df83e80d1805f867eb5c7e13e7413caee01273c278cf2c9a3670d8d25c889a877f7b149d892fe61b0181a81654b425e9622ab23d42e - languageName: node - linkType: hard - -"utility-types@npm:^3.10.0": - version: 3.10.0 - resolution: "utility-types@npm:3.10.0" - checksum: 10c0/79a6f7ea0cdd4fcafcec8c6e68e1e0cfa657e414b6f1696552d89ae70a3634b12ac6c16b7a0a3bfdb0a222ebc3d9a7649f2de434a78f2d65d318b50f314a85e4 - languageName: node - linkType: hard - "utils-merge@npm:1.0.1": version: 1.0.1 resolution: "utils-merge@npm:1.0.1" @@ -20199,15 +14024,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 - languageName: node - linkType: hard - "v8-to-istanbul@npm:^9.0.1": version: 9.3.0 resolution: "v8-to-istanbul@npm:9.3.0" @@ -20229,13 +14045,6 @@ __metadata: languageName: node linkType: hard -"value-equal@npm:^1.0.1": - version: 1.0.1 - resolution: "value-equal@npm:1.0.1" - checksum: 10c0/79068098355483ef29f4d3753999ad880875b87625d7e9055cad9346ea4b7662aad3a66f87976801b0dd7a6f828ba973d28b1669ebcd37eaf88cc5f687c1a691 - languageName: node - linkType: hard - "vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" @@ -20243,35 +14052,6 @@ __metadata: languageName: node linkType: hard -"vfile-location@npm:^3.0.0, vfile-location@npm:^3.2.0": - version: 3.2.0 - resolution: "vfile-location@npm:3.2.0" - checksum: 10c0/d9513c738fcac26388f4ee04337663514434df718201309088377b53be3fdcfdb01a4a8f02f5a21ebf33690a670f31229e4c7c3991fb7af63f549fda3ec36836 - languageName: node - linkType: hard - -"vfile-message@npm:^2.0.0": - version: 2.0.4 - resolution: "vfile-message@npm:2.0.4" - dependencies: - "@types/unist": "npm:^2.0.0" - unist-util-stringify-position: "npm:^2.0.0" - checksum: 10c0/ce50d90e0e5dc8f995f39602dd2404f1756388a54209c983d259b17c15e6f262a53546977a638065bc487d0657799fa96f4c1ba6b2915d9724a4968e9c7ff1c8 - languageName: node - linkType: hard - -"vfile@npm:^4.0.0": - version: 4.2.1 - resolution: "vfile@npm:4.2.1" - dependencies: - "@types/unist": "npm:^2.0.0" - is-buffer: "npm:^2.0.0" - unist-util-stringify-position: "npm:^2.0.0" - vfile-message: "npm:^2.0.0" - checksum: 10c0/4816aecfedc794ba4d3131abff2032ef0e825632cfa8cd20dd9d83819ef260589924f4f3e8fa30e06da2d8e60d7ec8ef7d0af93e0483df62890738258daf098a - languageName: node - linkType: hard - "vite@npm:7.1.5, vite@npm:^7.1.5": version: 7.1.5 resolution: "vite@npm:7.1.5" @@ -20334,21 +14114,6 @@ __metadata: languageName: node linkType: hard -"wait-on@npm:^6.0.1": - version: 6.0.1 - resolution: "wait-on@npm:6.0.1" - dependencies: - axios: "npm:^0.25.0" - joi: "npm:^17.6.0" - lodash: "npm:^4.17.21" - minimist: "npm:^1.2.5" - rxjs: "npm:^7.5.4" - bin: - wait-on: bin/wait-on - checksum: 10c0/99772bc85d17f7e6ff8b0e40bd2c90a2c2025b0e9a5a3f8edcf39af0c367d8a5bbdd3d4f1190588be8b09745e80bbdf59c2c4059053a7d180e29b8711cc4a840 - languageName: node - linkType: hard - "walker@npm:^1.0.7, walker@npm:^1.0.8": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -20370,25 +14135,6 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:^2.4.1": - version: 2.4.2 - resolution: "watchpack@npm:2.4.2" - dependencies: - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.1.2" - checksum: 10c0/ec60a5f0e9efaeca0102fd9126346b3b2d523e01c34030d3fddf5813a7125765121ebdc2552981136dcd2c852deb1af0b39340f2fcc235f292db5399d0283577 - languageName: node - linkType: hard - -"wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": - version: 1.7.3 - resolution: "wbuf@npm:1.7.3" - dependencies: - minimalistic-assert: "npm:^1.0.0" - checksum: 10c0/56edcc5ef2b3d30913ba8f1f5cccc364d180670b24d5f3f8849c1e6fb514e5c7e3a87548ae61227a82859eba6269c11393ae24ce12a2ea1ecb9b465718ddced7 - languageName: node - linkType: hard - "wcwidth@npm:^1.0.1": version: 1.0.1 resolution: "wcwidth@npm:1.0.1" @@ -20398,187 +14144,6 @@ __metadata: languageName: node linkType: hard -"web-namespaces@npm:^1.0.0": - version: 1.1.4 - resolution: "web-namespaces@npm:1.1.4" - checksum: 10c0/05b5782c32a33ef94fa7a412afdebc9d0d3cc7b59db31d2cc7bd80de3e237d4b6309cb5f156d06e3a837b9826c9414448c25111ec1d4407d2025ffeb7bea4f62 - languageName: node - linkType: hard - -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: 10c0/5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db - languageName: node - linkType: hard - -"webpack-bundle-analyzer@npm:^4.5.0": - version: 4.9.0 - resolution: "webpack-bundle-analyzer@npm:4.9.0" - dependencies: - "@discoveryjs/json-ext": "npm:0.5.7" - acorn: "npm:^8.0.4" - acorn-walk: "npm:^8.0.0" - chalk: "npm:^4.1.0" - commander: "npm:^7.2.0" - gzip-size: "npm:^6.0.0" - lodash: "npm:^4.17.20" - opener: "npm:^1.5.2" - sirv: "npm:^1.0.7" - ws: "npm:^7.3.1" - bin: - webpack-bundle-analyzer: lib/bin/analyzer.js - checksum: 10c0/fe7ab4fd129bf9e3291345c8e9db889b10df36cbc3bb58add5bddef078429336d1066395a605e6948bd7af91f604ae229de9ef2dcd4aa95e5ab3d49934d67368 - languageName: node - linkType: hard - -"webpack-dev-middleware@npm:^5.3.1": - version: 5.3.4 - resolution: "webpack-dev-middleware@npm:5.3.4" - dependencies: - colorette: "npm:^2.0.10" - memfs: "npm:^3.4.3" - mime-types: "npm:^2.1.31" - range-parser: "npm:^1.2.1" - schema-utils: "npm:^4.0.0" - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - checksum: 10c0/257df7d6bc5494d1d3cb66bba70fbdf5a6e0423e39b6420f7631aeb52435afbfbff8410a62146dcdf3d2f945c62e03193aae2ac1194a2f7d5a2523b9d194e9e1 - languageName: node - linkType: hard - -"webpack-dev-server@npm:^4.9.3": - version: 4.15.1 - resolution: "webpack-dev-server@npm:4.15.1" - dependencies: - "@types/bonjour": "npm:^3.5.9" - "@types/connect-history-api-fallback": "npm:^1.3.5" - "@types/express": "npm:^4.17.13" - "@types/serve-index": "npm:^1.9.1" - "@types/serve-static": "npm:^1.13.10" - "@types/sockjs": "npm:^0.3.33" - "@types/ws": "npm:^8.5.5" - ansi-html-community: "npm:^0.0.8" - bonjour-service: "npm:^1.0.11" - chokidar: "npm:^3.5.3" - colorette: "npm:^2.0.10" - compression: "npm:^1.7.4" - connect-history-api-fallback: "npm:^2.0.0" - default-gateway: "npm:^6.0.3" - express: "npm:^4.17.3" - graceful-fs: "npm:^4.2.6" - html-entities: "npm:^2.3.2" - http-proxy-middleware: "npm:^2.0.3" - ipaddr.js: "npm:^2.0.1" - launch-editor: "npm:^2.6.0" - open: "npm:^8.0.9" - p-retry: "npm:^4.5.0" - rimraf: "npm:^3.0.2" - schema-utils: "npm:^4.0.0" - selfsigned: "npm:^2.1.1" - serve-index: "npm:^1.9.1" - sockjs: "npm:^0.3.24" - spdy: "npm:^4.0.2" - webpack-dev-middleware: "npm:^5.3.1" - ws: "npm:^8.13.0" - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true - bin: - webpack-dev-server: bin/webpack-dev-server.js - checksum: 10c0/2cf3edf556dcafdfc938e0adeac3dadf97fb959ed66b88bdd70acdb0b77b0f25be5e2d4b30cca2da8732548451418cadf00eb09e751e7674ff914fd9ab646b26 - languageName: node - linkType: hard - -"webpack-merge@npm:^5.8.0": - version: 5.9.0 - resolution: "webpack-merge@npm:5.9.0" - dependencies: - clone-deep: "npm:^4.0.1" - wildcard: "npm:^2.0.0" - checksum: 10c0/74935a4b03612ee65c0867ca1050788ccfec3efa6d17bb5acceacbd4fbbd0356a073997723eff7380deccd88f13a55c52cb004e80e34f3a67808ac455da6ad64 - languageName: node - linkType: hard - -"webpack-sources@npm:^3.2.2, webpack-sources@npm:^3.2.3": - version: 3.2.3 - resolution: "webpack-sources@npm:3.2.3" - checksum: 10c0/2ef63d77c4fad39de4a6db17323d75eb92897b32674e97d76f0a1e87c003882fc038571266ad0ef581ac734cbe20952912aaa26155f1905e96ce251adbb1eb4e - languageName: node - linkType: hard - -"webpack@npm:^5.73.0": - version: 5.94.0 - resolution: "webpack@npm:5.94.0" - dependencies: - "@types/estree": "npm:^1.0.5" - "@webassemblyjs/ast": "npm:^1.12.1" - "@webassemblyjs/wasm-edit": "npm:^1.12.1" - "@webassemblyjs/wasm-parser": "npm:^1.12.1" - acorn: "npm:^8.7.1" - acorn-import-attributes: "npm:^1.9.5" - browserslist: "npm:^4.21.10" - chrome-trace-event: "npm:^1.0.2" - enhanced-resolve: "npm:^5.17.1" - es-module-lexer: "npm:^1.2.1" - eslint-scope: "npm:5.1.1" - events: "npm:^3.2.0" - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.2.11" - json-parse-even-better-errors: "npm:^2.3.1" - loader-runner: "npm:^4.2.0" - mime-types: "npm:^2.1.27" - neo-async: "npm:^2.6.2" - schema-utils: "npm:^3.2.0" - tapable: "npm:^2.1.1" - terser-webpack-plugin: "npm:^5.3.10" - watchpack: "npm:^2.4.1" - webpack-sources: "npm:^3.2.3" - peerDependenciesMeta: - webpack-cli: - optional: true - bin: - webpack: bin/webpack.js - checksum: 10c0/b4d1b751f634079bd177a89eef84d80fa5bb8d6fc15d72ab40fc2b9ca5167a79b56585e1a849e9e27e259803ee5c4365cb719e54af70a43c06358ec268ff4ebf - languageName: node - linkType: hard - -"webpackbar@npm:^5.0.2": - version: 5.0.2 - resolution: "webpackbar@npm:5.0.2" - dependencies: - chalk: "npm:^4.1.0" - consola: "npm:^2.15.3" - pretty-time: "npm:^1.1.0" - std-env: "npm:^3.0.1" - peerDependencies: - webpack: 3 || 4 || 5 - checksum: 10c0/336568a6ed1c1ad743c8d20a5cab5875a7ebe1e96181f49ae0a1a897f1a59d1661d837574a25d8ba9dfa4f2f705bd46ca0cd037ff60286ff70fb8d9db2b0c123 - languageName: node - linkType: hard - -"websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": - version: 0.7.4 - resolution: "websocket-driver@npm:0.7.4" - dependencies: - http-parser-js: "npm:>=0.5.1" - safe-buffer: "npm:>=5.1.0" - websocket-extensions: "npm:>=0.1.1" - checksum: 10c0/5f09547912b27bdc57bac17b7b6527d8993aa4ac8a2d10588bb74aebaf785fdcf64fea034aae0c359b7adff2044dd66f3d03866e4685571f81b13e548f9021f1 - languageName: node - linkType: hard - -"websocket-extensions@npm:>=0.1.1": - version: 0.1.4 - resolution: "websocket-extensions@npm:0.1.4" - checksum: 10c0/bbc8c233388a0eb8a40786ee2e30d35935cacbfe26ab188b3e020987e85d519c2009fe07cfc37b7f718b85afdba7e54654c9153e6697301f72561bfe429177e0 - languageName: node - linkType: hard - "whatwg-fetch@npm:^3.0.0": version: 3.6.2 resolution: "whatwg-fetch@npm:3.6.2" @@ -20586,16 +14151,6 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^5.0.0": - version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: "npm:~0.0.3" - webidl-conversions: "npm:^3.0.0" - checksum: 10c0/1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 - languageName: node - linkType: hard - "which-boxed-primitive@npm:^1.0.2": version: 1.0.2 resolution: "which-boxed-primitive@npm:1.0.2" @@ -20700,7 +14255,7 @@ __metadata: languageName: node linkType: hard -"which@npm:^1.2.9, which@npm:^1.3.1": +"which@npm:^1.2.9": version: 1.3.1 resolution: "which@npm:1.3.1" dependencies: @@ -20722,7 +14277,7 @@ __metadata: languageName: node linkType: hard -"wide-align@npm:^1.1.2, wide-align@npm:^1.1.5": +"wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" dependencies: @@ -20731,31 +14286,6 @@ __metadata: languageName: node linkType: hard -"widest-line@npm:^3.1.0": - version: 3.1.0 - resolution: "widest-line@npm:3.1.0" - dependencies: - string-width: "npm:^4.0.0" - checksum: 10c0/b1e623adcfb9df35350dd7fc61295d6d4a1eaa65a406ba39c4b8360045b614af95ad10e05abf704936ed022569be438c4bfa02d6d031863c4166a238c301119f - languageName: node - linkType: hard - -"widest-line@npm:^4.0.1": - version: 4.0.1 - resolution: "widest-line@npm:4.0.1" - dependencies: - string-width: "npm:^5.0.1" - checksum: 10c0/7da9525ba45eaf3e4ed1a20f3dcb9b85bd9443962450694dae950f4bdd752839747bbc14713522b0b93080007de8e8af677a61a8c2114aa553ad52bde72d0f9c - languageName: node - linkType: hard - -"wildcard@npm:^2.0.0": - version: 2.0.1 - resolution: "wildcard@npm:2.0.1" - checksum: 10c0/08f70cd97dd9a20aea280847a1fe8148e17cae7d231640e41eb26d2388697cbe65b67fd9e68715251c39b080c5ae4f76d71a9a69fa101d897273efdfb1b58bf7 - languageName: node - linkType: hard - "wrap-ansi@npm:^6.2.0": version: 6.2.0 resolution: "wrap-ansi@npm:6.2.0" @@ -20778,17 +14308,6 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^8.0.1": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: "npm:^6.1.0" - string-width: "npm:^5.0.1" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 - languageName: node - linkType: hard - "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" @@ -20796,18 +14315,6 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^3.0.0": - version: 3.0.3 - resolution: "write-file-atomic@npm:3.0.3" - dependencies: - imurmurhash: "npm:^0.1.4" - is-typedarray: "npm:^1.0.0" - signal-exit: "npm:^3.0.2" - typedarray-to-buffer: "npm:^3.1.5" - checksum: 10c0/7fb67affd811c7a1221bed0c905c26e28f0041e138fb19ccf02db57a0ef93ea69220959af3906b920f9b0411d1914474cdd90b93a96e5cd9e8368d9777caac0e - languageName: node - linkType: hard - "write-file-atomic@npm:^4.0.2": version: 4.0.2 resolution: "write-file-atomic@npm:4.0.2" @@ -20827,7 +14334,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7, ws@npm:^7.3.1, ws@npm:^7.5.10": +"ws@npm:^7, ws@npm:^7.5.10": version: 7.5.10 resolution: "ws@npm:7.5.10" peerDependencies: @@ -20842,28 +14349,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.13.0": - version: 8.13.0 - resolution: "ws@npm:8.13.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/579817dbbab3ee46669129c220cfd81ba6cdb9ab5c3e9a105702dd045743c4ab72e33bb384573827c0c481213417cc880e41bc097e0fc541a0b79fa3eb38207d - languageName: node - linkType: hard - -"xdg-basedir@npm:^4.0.0": - version: 4.0.0 - resolution: "xdg-basedir@npm:4.0.0" - checksum: 10c0/1b5d70d58355af90363a4e0a51c992e77fc5a1d8de5822699c7d6e96a6afea9a1e048cb93312be6870f338ca45ebe97f000425028fa149c1e87d1b5b8b212a06 - languageName: node - linkType: hard - "xml-formatter@npm:^2.4.0": version: 2.6.1 resolution: "xml-formatter@npm:2.6.1" @@ -20873,17 +14358,6 @@ __metadata: languageName: node linkType: hard -"xml-js@npm:^1.6.11": - version: 1.6.11 - resolution: "xml-js@npm:1.6.11" - dependencies: - sax: "npm:^1.2.4" - bin: - xml-js: ./bin/cli.js - checksum: 10c0/c83631057f10bf90ea785cee434a8a1a0030c7314fe737ad9bf568a281083b565b28b14c9e9ba82f11fc9dc582a3a907904956af60beb725be1c9ad4b030bc5a - languageName: node - linkType: hard - "xml-parser-xo@npm:^3.2.0": version: 3.2.0 resolution: "xml-parser-xo@npm:3.2.0" @@ -20907,13 +14381,6 @@ __metadata: languageName: node linkType: hard -"xtend@npm:^4.0.0, xtend@npm:^4.0.1": - version: 4.0.2 - resolution: "xtend@npm:4.0.2" - checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e - languageName: node - linkType: hard - "y18n@npm:^4.0.0": version: 4.0.3 resolution: "y18n@npm:4.0.3" @@ -20956,13 +14423,6 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^1.10.0, yaml@npm:^1.10.2, yaml@npm:^1.7.2": - version: 1.10.2 - resolution: "yaml@npm:1.10.2" - checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f - languageName: node - linkType: hard - "yaml@npm:^2.2.1": version: 2.4.3 resolution: "yaml@npm:2.4.3" @@ -21051,10 +14511,3 @@ __metadata: checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f languageName: node linkType: hard - -"zwitch@npm:^1.0.0": - version: 1.0.5 - resolution: "zwitch@npm:1.0.5" - checksum: 10c0/26dc7d32e5596824b565db1da9650d00d32659c1211195bef50c25c60820f9c942aa7abefe678fc1ed0b97c1755036ac1bde5f97881d7d0e73e04e02aca56957 - languageName: node - linkType: hard From 4f0061ca816c9fd1e7d7d647529fa9fb9a2d7c9b Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 13 Oct 2025 21:12:54 +0200 Subject: [PATCH 097/110] ci: build js first --- .github/workflows/async-storage.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/async-storage.yml b/.github/workflows/async-storage.yml index 3bc520cd..a1952e7c 100644 --- a/.github/workflows/async-storage.yml +++ b/.github/workflows/async-storage.yml @@ -29,6 +29,8 @@ jobs: uses: ./.github/actions/setup-project - name: Install JS dependencies run: yarn + - name: Build async-storage js + run: yarn build:js - name: Bundle JS run: yarn bundle:android working-directory: examples/react-native @@ -51,6 +53,8 @@ jobs: restore-keys: ccache-ios- - name: Install JS dependencies run: yarn + - name: Build async-storage js + run: yarn build:js - name: Bundle JS run: yarn bundle:ios working-directory: examples/react-native @@ -73,6 +77,8 @@ jobs: restore-keys: ccache-ios- - name: Install JS dependencies run: yarn + - name: Build async-storage js + run: yarn build:js - name: Bundle JS run: yarn bundle:macos working-directory: examples/react-native @@ -95,6 +101,8 @@ jobs: windows-fix: true - name: Install JS dependencies run: yarn + - name: Build async-storage js + run: yarn build:js - name: Bundle JS run: yarn bundle:windows working-directory: examples/react-native From 2986e2ca00a6e1f94a43bf780a1220c4a02ab054 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 13 Oct 2025 21:28:54 +0200 Subject: [PATCH 098/110] chore: formatting --- .github/workflows/deploy-docs.yml | 6 +- docs/api/brownfield.md | 1 - docs/api/errors.md | 12 +- .../Preview Assets.xcassets/Contents.json | 6 - examples/react-native/app.json | 20 +- examples/react-native/src/App.tsx | 4 +- mkdocs.yml | 9 +- package.json | 4 +- packages/async-storage/apple/AsyncStorage.h | 7 +- packages/async-storage/apple/AsyncStorage.mm | 219 ++++++++++-------- .../apple/legacy_storage/RNCAsyncStorage.h | 8 +- .../apple/legacy_storage/RNCAsyncStorage.mm | 44 ++-- .../async-storage/src/AsyncStorageError.ts | 4 +- .../async-storage/src/createAsyncStorage.ts | 1 - .../async-storage/windows/code/DBStorage.cpp | 5 +- .../1.json | 6 +- 16 files changed, 178 insertions(+), 178 deletions(-) delete mode 100644 examples/compose-ios/iosApp/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 1314ba48..de45b80b 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -4,9 +4,9 @@ on: branches: - main paths: - - 'docs/**' - - 'mkdocs.yml' - - 'packages/async-storage/CHANGELOG.md' + - "docs/**" + - "mkdocs.yml" + - "packages/async-storage/CHANGELOG.md" workflow_dispatch: jobs: deploy-docs: diff --git a/docs/api/brownfield.md b/docs/api/brownfield.md index 4e305807..6543aeab 100644 --- a/docs/api/brownfield.md +++ b/docs/api/brownfield.md @@ -28,7 +28,6 @@ runBlocking { } ``` - ### iOS / macOS On iOS/macOS, the `StorageRegistry` singleton provides the same functionality in Swift/Objc. diff --git a/docs/api/errors.md b/docs/api/errors.md index 3990f49d..1e503c75 100644 --- a/docs/api/errors.md +++ b/docs/api/errors.md @@ -7,25 +7,21 @@ This class extends the standard `Error` class, by adding a `type` property to he The error type is an enum `AsyncStorageError.Type` with the following possible values: - ### NativeModuleError Raised when the RN native module itself fails — for example, the module is null at app startup, or not initialized correctly. - ### WebStorageError Web only, when an IndexedDB operation fails. [See IndexedDB error codes](https://developer.mozilla.org/en-US/docs/Web/API/IDBRequest/error. - ### SqliteStorageError Raised when SQLite itself fails on iOS, macOS, or Android. [See SQLite error codes](https://www.sqlite.org/rescode.html). - ### OtherStorageError Raised for other storage-related failures that don’t fit into the categories above. @@ -38,14 +34,16 @@ Examples include: - Legacy storage exceptions (any error thrown by v2 implementation falls here) ### UnknownError -A catch-all for cases where the system cannot classify the error. +A catch-all for cases where the system cannot classify the error. ## Example of error handling - ```typescript -import { createAsyncStorage, AsyncStorageError } from "@react-native-async-storage/async-storage"; +import { + createAsyncStorage, + AsyncStorageError, +} from "@react-native-async-storage/async-storage"; const storage = createAsyncStorage("user"); diff --git a/examples/compose-ios/iosApp/Preview Content/Preview Assets.xcassets/Contents.json b/examples/compose-ios/iosApp/Preview Content/Preview Assets.xcassets/Contents.json deleted file mode 100644 index 74d6a722..00000000 --- a/examples/compose-ios/iosApp/Preview Content/Preview Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info": { - "author": "xcode", - "version": 1 - } -} diff --git a/examples/react-native/app.json b/examples/react-native/app.json index dbe4dd35..f8f99d42 100644 --- a/examples/react-native/app.json +++ b/examples/react-native/app.json @@ -8,21 +8,9 @@ } ], "resources": { - "android": [ - "dist/res", - "dist/main.android.jsbundle" - ], - "ios": [ - "dist/assets", - "dist/main.ios.jsbundle" - ], - "macos": [ - "dist/assets", - "dist/main.macos.jsbundle" - ], - "windows": [ - "dist/assets", - "dist/main.windows.bundle" - ] + "android": ["dist/res", "dist/main.android.jsbundle"], + "ios": ["dist/assets", "dist/main.ios.jsbundle"], + "macos": ["dist/assets", "dist/main.macos.jsbundle"], + "windows": ["dist/assets", "dist/main.windows.bundle"] } } diff --git a/examples/react-native/src/App.tsx b/examples/react-native/src/App.tsx index 36988a9f..7e989bf8 100644 --- a/examples/react-native/src/App.tsx +++ b/examples/react-native/src/App.tsx @@ -56,7 +56,9 @@ function App(): React.JSX.Element { case "legacy-basic": return ; case "perf": - return ; + return ( + + ); case "legacy-perf": return ; } diff --git a/mkdocs.yml b/mkdocs.yml index b654d702..ca87f1a9 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -6,14 +6,13 @@ nav: - Overview: index.md - API: - Usage: api/usage.md - - 'Database naming': api/db-naming.md - - 'Error handling': api/errors.md - - 'Brownfield integration': api/brownfield.md - - 'Migration to v3': migration-to-3.md + - "Database naming": api/db-naming.md + - "Error handling": api/errors.md + - "Brownfield integration": api/brownfield.md + - "Migration to v3": migration-to-3.md - Contributing: contributing.md - Changelog: changelog.md - theme: name: material palette: diff --git a/package.json b/package.json index 3c649e72..a1006bd3 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,10 @@ "build:js": "yarn workspace @react-native-async-storage/async-storage build", "format": "concurrently 'yarn:format:*'", "format:c": "clang-format -i $(git ls-files '*.cpp' '*.h' '*.m' '*.mm') --style file:.config/.clang-format", - "format:js": "prettier --write $(git ls-files '*.js' '*.json' '*.ts' '*.tsx' '*.yml' 'README.md')", + "format:js": "prettier --write $(git ls-files '*.ts' '*.tsx' '*.json' '*.yml' 'README.md' docs/*.md)", "test:lint": "turbo run test:lint", "test:ts": "turbo run test:ts", - "test:format": "prettier --check --loglevel warn $(git ls-files '*.js' '*.json' '*.ts' '*.tsx' '*.yml' 'README.md')", + "test:format": "prettier --check --loglevel warn $(git ls-files '*.ts' '*.tsx' '*.json' '*.yml' 'README.md' docs/*.md)", "release:version": "./.github/scripts/setup-ci-git-user.sh && changeset version", "release:publish": "./.github/scripts/setup-ci-git-user.sh && changeset publish", "docs:dev": "mkdocs serve", diff --git a/packages/async-storage/apple/AsyncStorage.h b/packages/async-storage/apple/AsyncStorage.h index 27e9ecbb..324e68cf 100644 --- a/packages/async-storage/apple/AsyncStorage.h +++ b/packages/async-storage/apple/AsyncStorage.h @@ -1,12 +1,13 @@ #import + #import @interface AsyncStorage : NSObject < #ifdef RCT_NEW_ARCH_ENABLED - NativeAsyncStorageSpec + NativeAsyncStorageSpec #else - RCTBridgeModule + RCTBridgeModule #endif -> + > @end diff --git a/packages/async-storage/apple/AsyncStorage.mm b/packages/async-storage/apple/AsyncStorage.mm index fb626e07..b091f5bf 100644 --- a/packages/async-storage/apple/AsyncStorage.mm +++ b/packages/async-storage/apple/AsyncStorage.mm @@ -1,161 +1,188 @@ #import "AsyncStorage.h" + #import "AsyncStorage-Swift.h" -#import "RNCAsyncStorage.h" // legacy storage +#import "RNCAsyncStorage.h" // legacy storage @implementation AsyncStorage RCT_EXPORT_MODULE(RNAsyncStorage) -- (void)getValues:(nonnull NSString *)dbName keys:(nonnull NSArray *)keys resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - - RNStorage* db = [StorageRegistry.shared getRNStorageWithDbName:dbName]; +- (void)getValues:(nonnull NSString *)dbName + keys:(nonnull NSArray *)keys + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject +{ + + RNStorage *db = [StorageRegistry.shared getRNStorageWithDbName:dbName]; [db getWithKeys:keys resolver:resolve rejecter:reject]; } -- (void)setValues:(nonnull NSString *)dbName values:(nonnull NSArray *)values resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - - RNStorage* db = [StorageRegistry.shared getRNStorageWithDbName:dbName]; +- (void)setValues:(nonnull NSString *)dbName + values:(nonnull NSArray *)values + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject +{ + + RNStorage *db = [StorageRegistry.shared getRNStorageWithDbName:dbName]; [db setWithValues:values resolver:resolve rejecter:reject]; } +- (void)removeValues:(nonnull NSString *)dbName + keys:(nonnull NSArray *)keys + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject +{ -- (void)removeValues:(nonnull NSString *)dbName keys:(nonnull NSArray *)keys resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - - RNStorage* db = [StorageRegistry.shared getRNStorageWithDbName:dbName]; + RNStorage *db = [StorageRegistry.shared getRNStorageWithDbName:dbName]; [db removeWithKeys:keys resolver:resolve rejecter:reject]; } +- (void)clearStorage:(nonnull NSString *)dbName + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject +{ -- (void)clearStorage:(nonnull NSString *)dbName resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - - RNStorage* db = [StorageRegistry.shared getRNStorageWithDbName:dbName]; + RNStorage *db = [StorageRegistry.shared getRNStorageWithDbName:dbName]; [db clearWithResolver:resolve rejecter:reject]; } -- (void)getKeys:(nonnull NSString *)dbName resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - - RNStorage* db = [StorageRegistry.shared getRNStorageWithDbName:dbName]; +- (void)getKeys:(nonnull NSString *)dbName + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject +{ + + RNStorage *db = [StorageRegistry.shared getRNStorageWithDbName:dbName]; [db allKeysWithResolver:resolve rejecter:reject]; } - #pragma mark - Legacy Storage - -- (void)legacy_multiGet:(nonnull NSArray *)keys resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { +- (void)legacy_multiGet:(nonnull NSArray *)keys + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject +{ RNCAsyncStorage *legacy = [RNCAsyncStorage sharedInstance]; - dispatch_async([legacy methodQueue], ^{ - NSError *error = nil; - NSDictionary *result = [legacy multiGet:keys error:&error]; - if (error) { - dispatch_async(dispatch_get_main_queue(), ^{ - reject(@"AsyncStorageError", @"Failed to get values for keys", error); - }); - return; - } - - NSMutableArray *formatted = [NSMutableArray arrayWithCapacity:keys.count]; - for (NSString *key in keys) { - id value = result[key]; - if (value == [NSNull null] || value == nil) { - value = (id)kCFNull; - } - [formatted addObject:@[key, value]]; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - resolve(formatted); - }); - + NSError *error = nil; + NSDictionary *result = [legacy multiGet:keys error:&error]; + if (error) { + dispatch_async(dispatch_get_main_queue(), ^{ + reject(@"AsyncStorageError", @"Failed to get values for keys", error); + }); + return; + } + + NSMutableArray *formatted = [NSMutableArray arrayWithCapacity:keys.count]; + for (NSString *key in keys) { + id value = result[key]; + if (value == [NSNull null] || value == nil) { + value = (id)kCFNull; + } + [formatted addObject:@[key, value]]; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + resolve(formatted); + }); }); } -- (void)legacy_multiSet:(nonnull NSArray *)kvPairs resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { +- (void)legacy_multiSet:(nonnull NSArray *)kvPairs + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject +{ RNCAsyncStorage *legacy = [RNCAsyncStorage sharedInstance]; dispatch_async([legacy methodQueue], ^{ - NSError *error = nil; - BOOL success = [legacy multiSet:kvPairs error:&error]; - - if (!success) { - dispatch_async(dispatch_get_main_queue(), ^{ - reject(@"AsyncStorageError", @"Failed to set key-value pairs", error); - }); - return; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - resolve(nil); - }); + NSError *error = nil; + BOOL success = [legacy multiSet:kvPairs error:&error]; + + if (!success) { + dispatch_async(dispatch_get_main_queue(), ^{ + reject(@"AsyncStorageError", @"Failed to set key-value pairs", error); + }); + return; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + resolve(nil); + }); }); } -- (void)legacy_multiRemove:(nonnull NSArray *)keys resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { +- (void)legacy_multiRemove:(nonnull NSArray *)keys + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject +{ RNCAsyncStorage *legacy = [RNCAsyncStorage sharedInstance]; dispatch_async([legacy methodQueue], ^{ - NSError *error = nil; - BOOL success = [legacy multiRemove:keys error:&error]; - - - dispatch_async(dispatch_get_main_queue(), ^{ - if (!success) { - reject(@"AsyncStorageError", @"Failed to remove keys", error); - } else { - resolve(nil); - } - }); + NSError *error = nil; + BOOL success = [legacy multiRemove:keys error:&error]; + + dispatch_async(dispatch_get_main_queue(), ^{ + if (!success) { + reject(@"AsyncStorageError", @"Failed to remove keys", error); + } else { + resolve(nil); + } + }); }); } -- (void)legacy_getAllKeys:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { +- (void)legacy_getAllKeys:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject +{ RNCAsyncStorage *legacy = [RNCAsyncStorage sharedInstance]; - + dispatch_async([legacy methodQueue], ^{ - NSError *error = nil; - NSArray *keys = [legacy getAllKeys:&error]; - - dispatch_async(dispatch_get_main_queue(), ^{ - if (!keys) { - reject(@"AsyncStorageError", @"Failed to get all keys", error); - } else { - resolve(keys); - } - }); + NSError *error = nil; + NSArray *keys = [legacy getAllKeys:&error]; + + dispatch_async(dispatch_get_main_queue(), ^{ + if (!keys) { + reject(@"AsyncStorageError", @"Failed to get all keys", error); + } else { + resolve(keys); + } + }); }); } -- (void)legacy_clear:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { - +- (void)legacy_clear:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject +{ + RNCAsyncStorage *legacy = [RNCAsyncStorage sharedInstance]; - + dispatch_async([legacy methodQueue], ^{ - NSError *error = nil; - BOOL success = [legacy clear:&error]; - - dispatch_async(dispatch_get_main_queue(), ^{ - if (!success) { - reject(@"AsyncStorageError", @"Failed to clear storage", error); - } else { - resolve(nil); - } - }); + NSError *error = nil; + BOOL success = [legacy clear:&error]; + + dispatch_async(dispatch_get_main_queue(), ^{ + if (!success) { + reject(@"AsyncStorageError", @"Failed to clear storage", error); + } else { + resolve(nil); + } + }); }); } -- (void)legacy_multiMerge:(nonnull NSArray *)kvPairs resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject { +- (void)legacy_multiMerge:(nonnull NSArray *)kvPairs + resolve:(nonnull RCTPromiseResolveBlock)resolve + reject:(nonnull RCTPromiseRejectBlock)reject +{ // merge is removed resolve(nil); } #ifdef RCT_NEW_ARCH_ENABLED - (std::shared_ptr)getTurboModule: -(const facebook::react::ObjCTurboModule::InitParams &)params + (const facebook::react::ObjCTurboModule::InitParams &)params { return std::make_shared(params); } #endif - @end diff --git a/packages/async-storage/apple/legacy_storage/RNCAsyncStorage.h b/packages/async-storage/apple/legacy_storage/RNCAsyncStorage.h index 313d273f..676a1e7a 100644 --- a/packages/async-storage/apple/legacy_storage/RNCAsyncStorage.h +++ b/packages/async-storage/apple/legacy_storage/RNCAsyncStorage.h @@ -24,7 +24,7 @@ NS_ASSUME_NONNULL_BEGIN -@interface RNCAsyncStorage : NSObject +@interface RNCAsyncStorage : NSObject @property (nonatomic, assign) BOOL clearOnInvalidate; @@ -43,11 +43,9 @@ NS_ASSUME_NONNULL_BEGIN - (nullable NSDictionary *)multiGet:(NSArray *)keys error:(NSError **)error; -- (BOOL)multiSet:(NSArray *> *)kvPairs - error:(NSError **)error; +- (BOOL)multiSet:(NSArray *> *)kvPairs error:(NSError **)error; -- (BOOL)multiRemove:(NSArray *)keys - error:(NSError **)error; +- (BOOL)multiRemove:(NSArray *)keys error:(NSError **)error; - (nullable NSArray *)getAllKeys:(NSError **)error; diff --git a/packages/async-storage/apple/legacy_storage/RNCAsyncStorage.mm b/packages/async-storage/apple/legacy_storage/RNCAsyncStorage.mm index 0218aa94..d9f3dc82 100644 --- a/packages/async-storage/apple/legacy_storage/RNCAsyncStorage.mm +++ b/packages/async-storage/apple/legacy_storage/RNCAsyncStorage.mm @@ -426,11 +426,12 @@ + (BOOL)requiresMainQueueSetup return NO; } -+ (instancetype)sharedInstance { ++ (instancetype)sharedInstance +{ static RNCAsyncStorage *sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - sharedInstance = [[RNCAsyncStorage alloc] init]; + sharedInstance = [[RNCAsyncStorage alloc] init]; }); return sharedInstance; } @@ -666,7 +667,6 @@ - (void)_multiGet:(NSArray *)keys callback(@[RCTNullIfNil(errors), result]); } - #pragma mark - Async Storage main functions // clang-format off @@ -683,29 +683,26 @@ - (void)_multiGet:(NSArray *)keys } return nil; } - + NSMutableDictionary *results = [NSMutableDictionary dictionary]; for (NSString *key in keys) { NSDictionary *keyError = nil; NSString *value = [self _getValueForKey:key errorOut:&keyError]; - + if (keyError) { if (error) { - *error = [NSError errorWithDomain:@"AsyncStorageError" - code:1 - userInfo:keyError]; + *error = [NSError errorWithDomain:@"AsyncStorageError" code:1 userInfo:keyError]; } return nil; } results[key] = value ?: (NSString *)[NSNull null]; } - + return [results copy]; } -- (BOOL)multiSet:(NSArray *> *)kvPairs - error:(NSError **)error; +- (BOOL)multiSet:(NSArray *> *)kvPairs error:(NSError **)error; { NSDictionary *ensureSetupErrorOut = [self _ensureSetup]; if (ensureSetupErrorOut) { @@ -725,21 +722,20 @@ - (BOOL)multiSet:(NSArray *> *)kvPairs if (changedManifest) { [self _writeManifest:&errors]; } - - if(errors.count > 0) { + + if (errors.count > 0) { if (error) { *error = [NSError errorWithDomain:@"AsyncStorageError" code:1 - userInfo:@{ @"errors": errors }]; + userInfo:@{@"errors": errors}]; } return NO; } - + return YES; } -- (BOOL)multiRemove:(NSArray *)keys - error:(NSError **)error; +- (BOOL)multiRemove:(NSArray *)keys error:(NSError **)error; { NSDictionary *ensureSetupErrorOut = [self _ensureSetup]; @@ -771,16 +767,16 @@ - (BOOL)multiRemove:(NSArray *)keys if (changedManifest) { [self _writeManifest:&errors]; } - + if (errors.count > 0) { if (error) { *error = [NSError errorWithDomain:@"AsyncStorageError" code:1 - userInfo:@{ @"errors": errors }]; + userInfo:@{@"errors": errors}]; } return NO; } - + return YES; } @@ -795,12 +791,12 @@ - (BOOL)clear:(NSError **)error } return NO; } - + [_manifest removeAllObjects]; [RCTGetCache() removeAllObjects]; NSDictionary *errors = RCTDeleteStorageDirectory(); - - if(errors.count > 0) { + + if (errors.count > 0) { return NO; } else { return YES; @@ -818,7 +814,7 @@ - (BOOL)clear:(NSError **)error } return nil; } - + NSArray *keys = [_manifest allKeys]; return keys ?: @[]; } diff --git a/packages/async-storage/src/AsyncStorageError.ts b/packages/async-storage/src/AsyncStorageError.ts index 065a06f0..7b1bd987 100644 --- a/packages/async-storage/src/AsyncStorageError.ts +++ b/packages/async-storage/src/AsyncStorageError.ts @@ -39,8 +39,8 @@ export class AsyncStorageError extends Error { static nativeError(e: unknown): AsyncStorageError { // do not override own error - if(e instanceof AsyncStorageError) { - throw e + if (e instanceof AsyncStorageError) { + throw e; } const error = getNativeError(e); diff --git a/packages/async-storage/src/createAsyncStorage.ts b/packages/async-storage/src/createAsyncStorage.ts index 056c9423..ba6f4ecb 100644 --- a/packages/async-storage/src/createAsyncStorage.ts +++ b/packages/async-storage/src/createAsyncStorage.ts @@ -105,7 +105,6 @@ class AsyncStorageWebImpl implements AsyncStorage { } } - /** * Returns a singleton instance of the legacy (v2) web AsyncStorage implementation. * diff --git a/packages/async-storage/windows/code/DBStorage.cpp b/packages/async-storage/windows/code/DBStorage.cpp index c95e887e..db2c4cf1 100644 --- a/packages/async-storage/windows/code/DBStorage.cpp +++ b/packages/async-storage/windows/code/DBStorage.cpp @@ -595,12 +595,13 @@ void WriteValue(const winrt::IJSValueWriter &writer, const DBStorage::Error &val { writer.WriteObjectBegin(); winrt::WriteProperty(writer, L"message", value.Message); - winrt::WriteProperty(writer, L"code", "AsyncStorageError"); // from AsyncStorageError.Type + winrt::WriteProperty(writer, L"code", "AsyncStorageError"); // from AsyncStorageError.Type writer.WritePropertyName(L"userInfo"); writer.WriteObjectBegin(); writer.WritePropertyName(L"type"); - writer.WriteString(L"OtherException"); // make sure all Windows errors are treated as "OtherSqliteError" + writer.WriteString( + L"OtherException"); // make sure all Windows errors are treated as "OtherSqliteError" writer.WriteObjectEnd(); writer.WriteObjectEnd(); diff --git a/shared-storage/schemas/org.asyncstorage.shared_storage.database.StorageDatabase/1.json b/shared-storage/schemas/org.asyncstorage.shared_storage.database.StorageDatabase/1.json index 109935b2..3c465d74 100644 --- a/shared-storage/schemas/org.asyncstorage.shared_storage.database.StorageDatabase/1.json +++ b/shared-storage/schemas/org.asyncstorage.shared_storage.database.StorageDatabase/1.json @@ -22,9 +22,7 @@ ], "primaryKey": { "autoGenerate": false, - "columnNames": [ - "key" - ] + "columnNames": ["key"] } } ], @@ -33,4 +31,4 @@ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '33b0559bdc8fe1befd1a1927fc3f3caa')" ] } -} \ No newline at end of file +} From 175f726275bca6a69aa2c4d7978e3f1642d5e00d Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 13 Oct 2025 21:33:06 +0200 Subject: [PATCH 099/110] chore: unify actions --- .github/workflows/async-storage.yml | 108 ------------------ .github/workflows/pull-request.yml | 108 ++++++++++++++++++ .../iosApp.xcodeproj/project.pbxproj | 4 +- 3 files changed, 109 insertions(+), 111 deletions(-) delete mode 100644 .github/workflows/async-storage.yml diff --git a/.github/workflows/async-storage.yml b/.github/workflows/async-storage.yml deleted file mode 100644 index a1952e7c..00000000 --- a/.github/workflows/async-storage.yml +++ /dev/null @@ -1,108 +0,0 @@ -name: Async storage -on: - pull_request: -jobs: - changes: - name: report changed files - runs-on: ubuntu-latest - outputs: - changed: ${{ steps.filter.outputs.storage }} - steps: - - uses: actions/checkout@v5 - - uses: dorny/paths-filter@v3 - id: filter - with: - token: ${{ secrets.GH_RELEASE_TOKEN }} - filters: | - storage: - - 'packages/async-storage/**' - - android: - name: Android RN - needs: changes - if: ${{ needs.changes.outputs.changed == 'true' }} - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v5 - - name: Setup project - uses: ./.github/actions/setup-project - - name: Install JS dependencies - run: yarn - - name: Build async-storage js - run: yarn build:js - - name: Bundle JS - run: yarn bundle:android - working-directory: examples/react-native - - ios: - name: iOS RN - needs: changes - if: ${{ needs.changes.outputs.changed == 'true' }} - runs-on: macos-latest - steps: - - name: Checkout - uses: actions/checkout@v5 - - name: Setup project - uses: ./.github/actions/setup-project - - name: Cache /.ccache - uses: actions/cache@v3 - with: - path: packages/async-storage/.ccache - key: ccache-ios-${{ hashFiles('yarn.lock') }} - restore-keys: ccache-ios- - - name: Install JS dependencies - run: yarn - - name: Build async-storage js - run: yarn build:js - - name: Bundle JS - run: yarn bundle:ios - working-directory: examples/react-native - - macOS: - name: macOS RN - needs: changes - if: ${{ needs.changes.outputs.changed == 'true' }} - runs-on: macos-latest - steps: - - name: Checkout - uses: actions/checkout@v5 - - name: Setup project - uses: ./.github/actions/setup-project - - name: Cache /.ccache - uses: actions/cache@v3 - with: - path: packages/async-storage/.ccache - key: ccache-ios-${{ hashFiles('yarn.lock') }} - restore-keys: ccache-ios- - - name: Install JS dependencies - run: yarn - - name: Build async-storage js - run: yarn build:js - - name: Bundle JS - run: yarn bundle:macos - working-directory: examples/react-native - - windows: - name: Windows RN - needs: changes - if: ${{ needs.changes.outputs.changed == 'true' }} - runs-on: windows-2022 - steps: - - name: Set up MSBuild - uses: microsoft/setup-msbuild@v1.3 - - name: Setup VSTest.console.exe - uses: darenm/Setup-VSTest@v1.2 - - name: Checkout - uses: actions/checkout@v5 - - name: Setup project - uses: ./.github/actions/setup-project - with: - windows-fix: true - - name: Install JS dependencies - run: yarn - - name: Build async-storage js - run: yarn build:js - - name: Bundle JS - run: yarn bundle:windows - working-directory: examples/react-native diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 9971976f..76939add 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -45,3 +45,111 @@ jobs: - name: Run test ${{ matrix.testName }} run: | ./gradlew ${{ matrix.testName }} + + changes: + name: report changed files + runs-on: ubuntu-latest + needs: + - code-quality + - shared-storage-tests + outputs: + changed: ${{ steps.filter.outputs.storage }} + steps: + - uses: actions/checkout@v5 + - uses: dorny/paths-filter@v3 + id: filter + with: + token: ${{ secrets.GH_RELEASE_TOKEN }} + filters: | + storage: + - 'packages/async-storage/**' + + android: + name: Android RN + needs: changes + if: ${{ needs.changes.outputs.changed == 'true' }} + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v5 + - name: Setup project + uses: ./.github/actions/setup-project + - name: Install JS dependencies + run: yarn + - name: Build async-storage js + run: yarn build:js + - name: Bundle JS + run: yarn bundle:android + working-directory: examples/react-native + + ios: + name: iOS RN + needs: changes + if: ${{ needs.changes.outputs.changed == 'true' }} + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + - name: Setup project + uses: ./.github/actions/setup-project + - name: Cache /.ccache + uses: actions/cache@v3 + with: + path: packages/async-storage/.ccache + key: ccache-ios-${{ hashFiles('yarn.lock') }} + restore-keys: ccache-ios- + - name: Install JS dependencies + run: yarn + - name: Build async-storage js + run: yarn build:js + - name: Bundle JS + run: yarn bundle:ios + working-directory: examples/react-native + + macOS: + name: macOS RN + needs: changes + if: ${{ needs.changes.outputs.changed == 'true' }} + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + - name: Setup project + uses: ./.github/actions/setup-project + - name: Cache /.ccache + uses: actions/cache@v3 + with: + path: packages/async-storage/.ccache + key: ccache-ios-${{ hashFiles('yarn.lock') }} + restore-keys: ccache-ios- + - name: Install JS dependencies + run: yarn + - name: Build async-storage js + run: yarn build:js + - name: Bundle JS + run: yarn bundle:macos + working-directory: examples/react-native + + windows: + name: Windows RN + needs: changes + if: ${{ needs.changes.outputs.changed == 'true' }} + runs-on: windows-2022 + steps: + - name: Set up MSBuild + uses: microsoft/setup-msbuild@v1.3 + - name: Setup VSTest.console.exe + uses: darenm/Setup-VSTest@v1.2 + - name: Checkout + uses: actions/checkout@v5 + - name: Setup project + uses: ./.github/actions/setup-project + with: + windows-fix: true + - name: Install JS dependencies + run: yarn + - name: Build async-storage js + run: yarn build:js + - name: Bundle JS + run: yarn bundle:windows + working-directory: examples/react-native diff --git a/examples/compose-ios/iosApp.xcodeproj/project.pbxproj b/examples/compose-ios/iosApp.xcodeproj/project.pbxproj index ab34b3e3..87170fe5 100644 --- a/examples/compose-ios/iosApp.xcodeproj/project.pbxproj +++ b/examples/compose-ios/iosApp.xcodeproj/project.pbxproj @@ -152,7 +152,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \\\"YES\\\"\"\n exit 0\nfi\ncd \"$SRCROOT/../..\"\n./gradlew :example:example-compose:embedAndSignAppleFrameworkForXcode\n"; + shellScript = "if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \\\"YES\\\"\"\n exit 0\nfi\ncd \"$SRCROOT/../..\"\n./gradlew :examples:compose:embedAndSignAppleFrameworkForXcode\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -175,7 +175,6 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; DEVELOPMENT_TEAM = "${TEAM_ID}"; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -326,7 +325,6 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; DEVELOPMENT_TEAM = "${TEAM_ID}"; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; From 48a33770acc1c96e88f56fd5880ee6351ee38537 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 13 Oct 2025 21:34:08 +0200 Subject: [PATCH 100/110] ci: use macos-latest --- .github/workflows/pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 76939add..ab12ab48 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -23,12 +23,12 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [macos-15-xlarge, ubuntu-24.04] + os: [macos-latest, ubuntu-24.04] testName: [cleanTestAndroidHostTest, macosArm64Test, iosSimulatorArm64Test] exclude: - testName: cleanTestAndroidHostTest - os: macos-15-xlarge + os: macos-latest - testName: macosArm64Test os: ubuntu-24.04 - testName: iosSimulatorArm64Test From d0b3de9ea70fa5beee5e62b1fd60ca690ce15043 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 13 Oct 2025 21:37:53 +0200 Subject: [PATCH 101/110] ci: build js before test --- .github/workflows/pull-request.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index ab12ab48..a5d635c6 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -15,6 +15,8 @@ jobs: uses: ./.github/actions/setup-project - name: Install dependencies run: yarn + - name: Build async-storage js + run: yarn build:js - name: test ${{ matrix.test-name }} run: yarn test:${{ matrix.test-name }} From 34e733442309228c48465f07b9857dbd2953a5c6 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 13 Oct 2025 21:45:21 +0200 Subject: [PATCH 102/110] ci: fix tests --- examples/common-tests/src/useTests.ts | 4 ++++ examples/react-native/src/components/TestRunnerView.tsx | 2 +- packages/async-storage/src/createAsyncStorage.windows.ts | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/common-tests/src/useTests.ts b/examples/common-tests/src/useTests.ts index 426bff2b..ec9a40a7 100644 --- a/examples/common-tests/src/useTests.ts +++ b/examples/common-tests/src/useTests.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ import { useState } from "react"; import isEqual from "lodash.isequal"; import { AsyncStorageError } from "@react-native-async-storage/async-storage"; @@ -49,10 +50,13 @@ export function useTests() { function reportError(e: any) { if (e instanceof AsyncStorageError) { + // @ts-ignore alert("AsyncStorageError" + "\n" + `type: ${e.type}` + "\n" + e.message); } else if (e instanceof Error) { + // @ts-ignore alert(e.name + "\n" + e.message); } else { + // @ts-ignore alert(JSON.stringify(e, null, 2)); } } diff --git a/examples/react-native/src/components/TestRunnerView.tsx b/examples/react-native/src/components/TestRunnerView.tsx index af475403..e966f8c5 100644 --- a/examples/react-native/src/components/TestRunnerView.tsx +++ b/examples/react-native/src/components/TestRunnerView.tsx @@ -1,4 +1,4 @@ -import { TestRunner } from "example-common-tests"; +import type { TestRunner } from "example-common-tests"; import React from "react"; import { Button, Pressable, ScrollView, Text, View } from "react-native"; diff --git a/packages/async-storage/src/createAsyncStorage.windows.ts b/packages/async-storage/src/createAsyncStorage.windows.ts index 3fbb7fcf..1eca760c 100644 --- a/packages/async-storage/src/createAsyncStorage.windows.ts +++ b/packages/async-storage/src/createAsyncStorage.windows.ts @@ -16,6 +16,7 @@ let warned = false; export function createAsyncStorage(_: string): AsyncStorage { if (!warned && __DEV__) { warned = true; + // eslint-disable-next-line console.warn( "[AsyncStorage] Warning: Creating custom storages is not supported on Windows. Falling back to the legacy implementation." ); From 4f23938bf18692f1b724409c36be2c2d2f5db505 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 13 Oct 2025 21:50:18 +0200 Subject: [PATCH 103/110] ci: proper name for android test --- .github/workflows/pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index a5d635c6..3e614ba9 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -27,9 +27,9 @@ jobs: matrix: os: [macos-latest, ubuntu-24.04] testName: - [cleanTestAndroidHostTest, macosArm64Test, iosSimulatorArm64Test] + [testAndroidHostTest, macosArm64Test, iosSimulatorArm64Test] exclude: - - testName: cleanTestAndroidHostTest + - testName: testAndroidHostTest os: macos-latest - testName: macosArm64Test os: ubuntu-24.04 From 2d6f81b09bd5c805725c089656cc34ff483af73c Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Mon, 13 Oct 2025 22:02:41 +0200 Subject: [PATCH 104/110] chore: remove unused dep --- package.json | 5 +---- yarn.lock | 3 +-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index a1006bd3..57671407 100644 --- a/package.json +++ b/package.json @@ -37,8 +37,5 @@ "examples/react-native", "examples/web", "examples/common-tests" - ], - "dependencies": { - "vite": "^7.1.5" - } + ] } diff --git a/yarn.lock b/yarn.lock index 59f37505..7c289d18 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3056,7 +3056,6 @@ __metadata: prettier: "npm:3.6.2" turbo: "npm:2.5.6" typescript: "npm:5.9.2" - vite: "npm:^7.1.5" languageName: unknown linkType: soft @@ -14052,7 +14051,7 @@ __metadata: languageName: node linkType: hard -"vite@npm:7.1.5, vite@npm:^7.1.5": +"vite@npm:7.1.5": version: 7.1.5 resolution: "vite@npm:7.1.5" dependencies: From 945debaa5d5726316297086c83752f4937941355 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Wed, 15 Oct 2025 10:45:51 +0200 Subject: [PATCH 105/110] update local maven for android --- docs/api/usage.md | 2 +- docs/index.md | 21 +++++++- docs/migration-to-3.md | 54 +++++++++++++++------ examples/react-native/android/build.gradle | 3 ++ packages/async-storage/android/build.gradle | 13 ----- 5 files changed, 64 insertions(+), 29 deletions(-) diff --git a/docs/api/usage.md b/docs/api/usage.md index cc87119b..a56d5640 100644 --- a/docs/api/usage.md +++ b/docs/api/usage.md @@ -32,7 +32,7 @@ The data in one storage instance is scoped to its name: using different names en !!! warning "Windows platform" - As of AsyncStorage v3.0, Windows platform does not support scoped storages. It fallsback to previous implementation - single storage per application. + As of AsyncStorage v3.0, Windows platform does not support scoped storages. It falls back to previous implementation - single storage per application. ## Using a storage diff --git a/docs/index.md b/docs/index.md index 9f8da1ff..f02e0480 100644 --- a/docs/index.md +++ b/docs/index.md @@ -29,7 +29,26 @@ npm install @react-native-async-storage/async-storage yarn add @react-native-async-storage/async-storage ``` -On iOS/macOS, don’t forget to install pods: +### Android + +Inside your `android/build.gradle(.kts)` file, add link to local maven repo: + +```groovy +allprojects { + repositories { + // ... others like google(), mavenCenterl() + + maven { + // or uri("path/to/node_modules/@react-native-async-storage/async-storage/android/local_repo") + url = uri(project(":react-native-async-storage_async-storage").file("local_repo")) + } + } +} +``` + +### iOS/macOS + +Install cocoapods dependencies: ```shell # inside macos/ios directory diff --git a/docs/migration-to-3.md b/docs/migration-to-3.md index 14fbac34..44d221f7 100644 --- a/docs/migration-to-3.md +++ b/docs/migration-to-3.md @@ -2,23 +2,52 @@ AsyncStorage v3 introduces some breaking changes to simplify the API and make it more consistent. -## AsyncStorage instance needs to be created now +## Key changes: -AsyncStorage v3 introduced scoped storages, which needs to be created before use. Head to [Usage page](api/usage.md#creating-a-storage) to learn more. +### Installation changes -## Default export points to v2 storage +Android requires local maven repo to be added in your `build.gradle(.kts)` file. Head over to [Installation step for Android](index.md#android) to learn more. -To make transition easier, the default export still points to the v2 storage implementation, ensuring that no existing data is lost. -## Removed callback arguments +### `AsyncStorage` is now instance-based -All methods now return Promises, and callbacks have been removed from all methods. +In v3, AsyncStorage is no longer a singleton. +Each instance represents an **isolated storage area**, providing separation between data sets. Head over to [Usage page](api/usage.md#creating-a-storage) to learn more. -## Removed merge functionality +```typescript +// create seperate storages +const userStorage = createAsyncStorage('user'); +const cacheStorage = createAsyncStorage('cache'); +``` + +### Default export still points to v2 storage + +To make upgrading smoother, the default export continues to reference the v2 implementation. +This ensures that: + +- Your app continues to access previously stored data. +- You can migrate incrementally to v3 instances. + +```typescript +// Still works (uses v2 backend) +import AsyncStorage from '@react-native-async-storage/async-storage'; +await AsyncStorage.setItem('foo', 'bar'); +``` + +### Callbacks removed — Promises only + +All methods are now Promise-based. +The old callback arguments have been removed to make the API simpler and more consistent. + +### Removed merge functionality AsyncStorage's "merge" behavior has historically been inconsistent across platforms. Rather than enforcing a platform-specific merging strategy, the merge API has been removed to avoid ambiguity. -## Method signature changes +### Errors are more predictable now + +All errors now thrown from `AsyncStorage` are instances of `AsyncStorageError` containing `type` of the error it represents. Head over to [Errors page](api/errors.md) to learn more. + +### Method signature changes The core methods @@ -30,7 +59,7 @@ The core methods retain their signatures from v2, ensuring backward compatibility. -### multiGet +#### multiGet Renamed to `getMany` and returns a `Record`, following a "what you request is what you get" rule: every key you pass in the request appears in the returned object, with `null` for keys that don’t exist in storage. @@ -43,7 +72,7 @@ Renamed to `getMany` and returns a `Record`, following a + getMany(keys: string[]): Promise>; ``` -### multiSet +#### multiSet Renamed to `setMany`, accepts a `Record` of key-value entries. @@ -56,7 +85,7 @@ Renamed to `setMany`, accepts a `Record` of key-value entries. + setMany(entries: Record): Promise; ``` -### multiRemove +#### multiRemove Renamed to `removeMany`, accepts list of keys. @@ -69,6 +98,3 @@ Renamed to `removeMany`, accepts list of keys. + removeMany(keys: string[]): Promise; ``` -## Errors are more predictable now - -All errors now thrown from `AsyncStorage` are instances of `AsyncStorageError` containing `type` of the error it represents. Head over to [Errors page](api/errors.md) to learn more. diff --git a/examples/react-native/android/build.gradle b/examples/react-native/android/build.gradle index 602e4cc7..487a730a 100644 --- a/examples/react-native/android/build.gradle +++ b/examples/react-native/android/build.gradle @@ -39,5 +39,8 @@ allprojects { }() mavenCentral() google() + maven { + url = uri(project(":react-native-async-storage_async-storage").file("local_repo")) + } } } diff --git a/packages/async-storage/android/build.gradle b/packages/async-storage/android/build.gradle index 7e5a244c..c04d147a 100644 --- a/packages/async-storage/android/build.gradle +++ b/packages/async-storage/android/build.gradle @@ -84,18 +84,6 @@ android { } } -project.afterEvaluate { - rootProject.allprojects { - println "projectname: ${it.name}" - repositories { - def proj = project(":react-native-async-storage_async-storage") - maven { - url = uri("${proj.projectDir}/local_repo") - } - } - } -} - repositories { mavenCentral() google() @@ -107,7 +95,6 @@ dependencies { def room_version = getExtOrDefault("ROOM_VERSION") - implementation "androidx.room:room-runtime:$room_version" implementation "androidx.room:room-ktx:$room_version" ksp "androidx.room:room-compiler:$room_version" From a7bddb0137caca0ba88554545929f5138056e719 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:15:54 +0200 Subject: [PATCH 106/110] docs: improvements --- docs/api/brownfield.md | 12 +++++----- docs/api/db-naming.md | 25 +++++++++++---------- docs/api/errors.md | 23 ++++++++++--------- docs/api/usage.md | 44 +++++++++++++++++++++--------------- docs/index.md | 14 ++++++------ docs/migration-to-3.md | 51 +++++++++++++++++++++++++++++------------- 6 files changed, 100 insertions(+), 69 deletions(-) diff --git a/docs/api/brownfield.md b/docs/api/brownfield.md index 6543aeab..a0953e3a 100644 --- a/docs/api/brownfield.md +++ b/docs/api/brownfield.md @@ -1,15 +1,17 @@ !!! info - Brownfield integration is supported on **Android**, **iOS** and **macOS**. + Brownfield integration is supported on **Android**, **iOS**, and **macOS**. -`AsyncStorage` is built on a shared storage layer (`SharedStorage`) that can also be accessed directly from native code. -This is useful in brownfield scenarios, where your app combines React Native and native code, and you want both layers to read/write from the same storage consistently. +`AsyncStorage` is built on a shared storage layer (`SharedStorage`) that can also be accessed directly from native +code. +This is especially useful in brownfield scenarios, where your app combines React Native and native code, allowing both +layers to read from and write to the same storage consistently. All platforms provide a thread-safe singleton registry called `StorageRegistry` to manage storage instances. ### Android -On Android, `StorageRegistry` is public singleton, which is used to share `SharedStorage` instances with Native module. +On Android, `StorageRegistry` is a public singleton, which is used to share `SharedStorage` instances with the native module. Multiple calls with the same name return the same singleton instance, ensuring consistent access. ```kotlin @@ -30,7 +32,7 @@ runBlocking { ### iOS / macOS -On iOS/macOS, the `StorageRegistry` singleton provides the same functionality in Swift/Objc. +On iOS and macOS, the `StorageRegistry` singleton provides the same functionality in Swift and Objective-C. ```swift import SharedAsyncStorage diff --git a/docs/api/db-naming.md b/docs/api/db-naming.md index d5c3ef07..53432c20 100644 --- a/docs/api/db-naming.md +++ b/docs/api/db-naming.md @@ -1,13 +1,14 @@ ## How `databaseName` is used -When creating a new storage instance with `createAsyncStorage(databaseName)`, the provided `databaseName` determines where and how the underlying database file is stored on each platform. -This ensures that storages are scoped by name and do not leak data between one another. +When creating a new storage instance with `createAsyncStorage(databaseName)`, the provided `databaseName` determines the +location and structure of the underlying database file on each platform. +This ensures that each storage instance is scoped by name and prevents data from leaking between instances. ### iOS & macOS -On Apple platforms, the storage is located under the app’s `Application Support` directory. -The `databaseName` is normalized into a file path with the `.sqlite` extension. -Each `databaseName` creates its own subdirectory inside `async-storage/databases`. +On Apple platforms, storage is located in the app’s `Application Support` directory. +The `databaseName` is normalized into a file path with the `.sqlite` extension, and each `databaseName` creates its own +subdirectory inside `async-storage/databases`. Directory: @@ -33,9 +34,9 @@ createAsyncStorage(`user-${userId}`); ### Android -On Android, databases are stored inside the app’s internal files directory. -The `databaseName` is normalized into a file path with the `.sqlite` extension. -Each `databaseName` creates its own subdirectory inside `async-storage/databases`. +On Android, databases are stored in the app’s internal files directory. +The `databaseName` is normalized into a file path with the `.sqlite` extension, and each `databaseName` creates its own +subdirectory inside `async-storage/databases`. Directory: @@ -61,8 +62,8 @@ createAsyncStorage(`user-${userId}`); ### Web -On Web, `databaseName` corresponds directly to the name of the IndexedDB database. -The `async-storage` grouping is abstracted away, but the uniqueness of the name is still guaranteed. +On the Web, `databaseName` corresponds directly to the name of the IndexedDB database. +Although the `async-storage` grouping is abstracted away, the name remains unique across instances. Example: @@ -77,5 +78,5 @@ Creates database named `user-1234`: ### Windows -On Windows, scoped storages are not supported. -The API always falls back to the legacy v2 storage implementation, which ignores `databaseName`. +On the Web, `databaseName` corresponds directly to the name of the IndexedDB database. +Although the `async-storage` grouping is abstracted away, the name remains unique across instances. \ No newline at end of file diff --git a/docs/api/errors.md b/docs/api/errors.md index 1e503c75..63777c78 100644 --- a/docs/api/errors.md +++ b/docs/api/errors.md @@ -1,30 +1,31 @@ # Error handling -All `AsyncStorage` methods throw a specialized error type, `AsyncStorageError`. -This class extends the standard `Error` class, by adding a `type` property to help identify the issue. +All `AsyncStorage` methods throw a specialized error type called `AsyncStorageError`. +This class extends the standard `Error` class and adds a `type` property to make it easier to identify the specific +issue. ## Error types -The error type is an enum `AsyncStorageError.Type` with the following possible values: +Errors are categorized using the `AsyncStorageError.Type` enum, which includes the following values: ### NativeModuleError -Raised when the RN native module itself fails — for example, -the module is null at app startup, or not initialized correctly. +Occurs when the React Native native module fails - for example, if the module is null at app startup or not initialized +correctly. ### WebStorageError -Web only, when an IndexedDB operation fails. -[See IndexedDB error codes](https://developer.mozilla.org/en-US/docs/Web/API/IDBRequest/error. +Occurs on the Web when an IndexedDB operation fails. +[See IndexedDB error codes](https://developer.mozilla.org/en-US/docs/Web/API/IDBRequest/errori) ### SqliteStorageError -Raised when SQLite itself fails on iOS, macOS, or Android. -[See SQLite error codes](https://www.sqlite.org/rescode.html). +Occurs when SQLite itself fails on iOS, macOS, or Android. +[See SQLite error codes](https://www.sqlite.org/rescode.html) ### OtherStorageError -Raised for other storage-related failures that don’t fit into the categories above. +Used for storage-related failures that don’t fall into the other categories. Examples include: - Storage not initialized correctly @@ -35,7 +36,7 @@ Examples include: ### UnknownError -A catch-all for cases where the system cannot classify the error. +A catch-all for errors that cannot be classified into any of the defined categories. ## Example of error handling diff --git a/docs/api/usage.md b/docs/api/usage.md index a56d5640..5b9b823c 100644 --- a/docs/api/usage.md +++ b/docs/api/usage.md @@ -4,18 +4,21 @@ title: Usage # Using Async Storage -The [`AsyncStorage`](https://github.com/react-native-async-storage/async-storage/blob/main/packages/async-storage/src/AsyncStorage.ts) interface provides an asynchronous, promise-based API for persistent key-value storage. -Each method is modeled after the Web Storage API, with extensions for batch operations. +The [ +`AsyncStorage`](https://github.com/react-native-async-storage/async-storage/blob/main/packages/async-storage/src/AsyncStorage.ts) +interface provides a promise-based API for persistent key-value storage. +It mirrors the Web Storage API, with additional support for batch operations. -Similar to Web, AsyncStorage deals with data that should be already serialized (strings). If you need to store objects, arrays, or other non-string values, you must serialize them first (for example, using `JSON.stringify`) and deserialize them when retrieving (for example, using `JSON.parse`). +**Note:** AsyncStorage only stores strings. To save objects, arrays, or other non-string values, serialize them with +`JSON.stringify` before storing, and use `JSON.parse` when reading them back. ## Creating a storage -To create a new storage, call `createAsyncStorage` with your database name: +Create a new storage instance by calling `createAsyncStorage` with a unique database name: -!!! note "About naming" +!!! note "Naming" - It's best to avoid adding an extensions to the name. Read more at [Database naming](db-naming.md) section. + Avoid including file extensions in the database name (like "user.db"). See [Database naming](db-naming.md) for details. ```typescript import { createAsyncStorage } from "@react-native-async-storage/async-storage"; @@ -23,20 +26,20 @@ import { createAsyncStorage } from "@react-native-async-storage/async-storage"; const userStorage = createAsyncStorage("john"); ``` -This returns an instance of `AsyncStorage` and each instance is uniquely identified by the name you provide. -The data in one storage instance is scoped to its name: using different names ensures that data does not leak between storages. +Each instance is uniquely identified by its name. +Data in one storage instance is isolated, ensuring that different names do not share data. -!!! note "Web platform" +!!! note "Web" - On Web, AsyncStorage is backed by [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API), which also support scoped storages. + On the Web, AsyncStorage uses [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API), which supports scoped storages. -!!! warning "Windows platform" +!!! warning "Windows" - As of AsyncStorage v3.0, Windows platform does not support scoped storages. It falls back to previous implementation - single storage per application. + Windows does not support scoped storages. It falls back to the previous v2 implementation, which provides a single storage per application. ## Using a storage -Once you have created a storage instance, you can start managing data. +After creating a storage instance, the storage is ready to use. ### Single item operations @@ -44,8 +47,8 @@ You can store, retrieve, and remove individual keys using `setItem`, `getItem`, Note that: -- Calling `setItem` with an existing key will overwrite the current value -- Calling `removeItem` on a key that does not exist has no effect and does not throw an error +- `setItem` overwrites the current value if the key already exists. +- `removeItem` does nothing if the key does not exist; it does not throw an error. ```typescript await userStorage.setItem("username", "doe_john"); @@ -66,7 +69,12 @@ console.log(username); // null ### Batch operations -Use convenient batch methods to handle multiple keys at once. Behind the scene, transaction performed to store all of them, or none in case of an error. +Use batch methods to handle multiple keys at once. These operations are performed atomically: either all changes are +applied, or none if an error occurs. + +- `setMany` stores multiple key-value pairs. +- `getMany` retrieves multiple keys at once, returning `null` for any keys that don’t exist. +- `removeMany` deletes multiple keys; non-existing keys are ignored without errors. ```typescript // store values @@ -89,9 +97,9 @@ console.log(data); await userStorage.removeMany(["email", "age", "not-here"]); ``` -### Reading stored keys +### Read all keys -To retrieve all keys currently stored in a storage instance, use `getAllKeys`: +To retrieve all keys currently used in the storage instance, use `getAllKeys`: ```typescript await userStorage.setMany({ diff --git a/docs/index.md b/docs/index.md index f02e0480..2cfd5630 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,28 +4,28 @@ title: Overview # Async Storage -Async Storage is asynchronous, unencrypted, persistent, key-value storage for your React Native application. -It provides a simple API compatible with the [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API), with a few extensions for batch operations and multi-database support. +Async Storage is an asynchronous, unencrypted, persistent key-value storage solution for your React Native application. +It provides a simple API compatible with the [Web Storage API]((https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API)), with additional extensions for batch operations and multi-database support. --- -## Supported platforms +## Supported Platforms - **Android** (SQLite backend via Room KMP) - **iOS** (SQLite backend via Room KMP) - **Web** (IndexedDB backend) - **macOS** (SQLite backend via Room KMP) -- **Windows** (legacy fallback, single database only) +- **Windows** (legacy fallback, single-database only) --- ## Installation ```shell -# using npm +# Using npm npm install @react-native-async-storage/async-storage -# using yarn +# Using yarn yarn add @react-native-async-storage/async-storage ``` @@ -36,7 +36,7 @@ Inside your `android/build.gradle(.kts)` file, add link to local maven repo: ```groovy allprojects { repositories { - // ... others like google(), mavenCenterl() + // ... others like google(), mavenCentral() maven { // or uri("path/to/node_modules/@react-native-async-storage/async-storage/android/local_repo") diff --git a/docs/migration-to-3.md b/docs/migration-to-3.md index 44d221f7..b9bba2db 100644 --- a/docs/migration-to-3.md +++ b/docs/migration-to-3.md @@ -1,21 +1,20 @@ # Migration to v3 -AsyncStorage v3 introduces some breaking changes to simplify the API and make it more consistent. +AsyncStorage v3 introduces a few breaking changes to simplify the API and make it more consistent. ## Key changes: ### Installation changes -Android requires local maven repo to be added in your `build.gradle(.kts)` file. Head over to [Installation step for Android](index.md#android) to learn more. - +Android requires a local Maven repository to be added to your `build.gradle(.kts)` file. Head over to the [Installation step for Android](index.md#android) to learn more. ### `AsyncStorage` is now instance-based In v3, AsyncStorage is no longer a singleton. -Each instance represents an **isolated storage area**, providing separation between data sets. Head over to [Usage page](api/usage.md#creating-a-storage) to learn more. +Each instance represents an **isolated storage area**, providing separation between data sets. Head over to the [Usage page](api/usage.md#creating-a-storage) to learn more. ```typescript -// create seperate storages +// create separate storages const userStorage = createAsyncStorage('user'); const cacheStorage = createAsyncStorage('cache'); ``` @@ -25,31 +24,51 @@ const cacheStorage = createAsyncStorage('cache'); To make upgrading smoother, the default export continues to reference the v2 implementation. This ensures that: -- Your app continues to access previously stored data. +- Your app can continue to access previously stored data. - You can migrate incrementally to v3 instances. ```typescript -// Still works (uses v2 backend) +// Still works (uses the v2 backend) import AsyncStorage from '@react-native-async-storage/async-storage'; await AsyncStorage.setItem('foo', 'bar'); ``` -### Callbacks removed — Promises only +### Callbacks removed - Promises only -All methods are now Promise-based. +All methods are now promise-based. The old callback arguments have been removed to make the API simpler and more consistent. ### Removed merge functionality -AsyncStorage's "merge" behavior has historically been inconsistent across platforms. Rather than enforcing a platform-specific merging strategy, the merge API has been removed to avoid ambiguity. +AsyncStorage's "merge" behavior has historically been inconsistent across platforms. +Rather than enforcing a platform-specific merging strategy, the merge API has been removed to avoid ambiguity. + +### Removed `useAsyncStorage` hook + +The `useAsyncStorage` hook has been removed due to implementation issues. +It will be reintroduced in a future release with an improved design. + +If you need it, here's the old version: + +```typescript +export function useAsyncStorage(key: string): AsyncStorageHook { + return { + getItem: (...args) => AsyncStorage.getItem(key, ...args), + setItem: (...args) => AsyncStorage.setItem(key, ...args), + mergeItem: (...args) => AsyncStorage.mergeItem(key, ...args), + removeItem: (...args) => AsyncStorage.removeItem(key, ...args), + }; +} +``` ### Errors are more predictable now -All errors now thrown from `AsyncStorage` are instances of `AsyncStorageError` containing `type` of the error it represents. Head over to [Errors page](api/errors.md) to learn more. +All errors thrown by `AsyncStorage` are now instances of `AsyncStorageError`, each containing a `type` property that indicates the kind of error. +For more details, head over to the [Errors page](api/errors.md). ### Method signature changes -The core methods +The core methods: - `getItem` - `setItem` @@ -57,11 +76,11 @@ The core methods - `getAllKeys` - `clear` -retain their signatures from v2, ensuring backward compatibility. +retain their signatures as in v2, ensuring backward compatibility. #### multiGet -Renamed to `getMany` and returns a `Record`, following a "what you request is what you get" rule: every key you pass in the request appears in the returned object, with `null` for keys that don’t exist in storage. +Renamed to `getMany`, this method returns a `Record` and follows a "what you request is what you get" rule: every key provided in the request appears in the returned object, with `null` for keys that don’t exist, or have `null` value, in storage. ```diff - multiGet: ( @@ -74,7 +93,7 @@ Renamed to `getMany` and returns a `Record`, following a #### multiSet -Renamed to `setMany`, accepts a `Record` of key-value entries. +Renamed to `setMany`, this method accepts a `Record` containing key-value pairs. ```diff - multiSet: ( @@ -87,7 +106,7 @@ Renamed to `setMany`, accepts a `Record` of key-value entries. #### multiRemove -Renamed to `removeMany`, accepts list of keys. +Renamed to `removeMany`, this method accepts a list of keys to remove. ```diff - multiRemove: ( From 33e24b7ee556a829cd769b0cd41f908a25a714fb Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Wed, 15 Oct 2025 19:28:21 +0200 Subject: [PATCH 107/110] fix: macos symlink issue because osx is using symlinks for versioning, distributing its framework via npm won't work - compression via tar breaks the link. therefore this script resolves the symlinks into actual folders, to match expected structure by macos. --- scripts/build-native-lib.sh | 46 ++++++++++++++++++++++++++------- shared-storage/build.gradle.kts | 3 +-- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/scripts/build-native-lib.sh b/scripts/build-native-lib.sh index 37b0af68..796619df 100755 --- a/scripts/build-native-lib.sh +++ b/scripts/build-native-lib.sh @@ -1,5 +1,6 @@ #!/bin/sh +set -e MODULE_NAME="shared-storage" RN_MODULE_DIR="packages/async-storage" @@ -18,31 +19,58 @@ APPLE_RN_OUTPUT_DIR="$RN_MODULE_DIR/apple/Frameworks" build_android() { - echo "👷 Assembling android shared-storage" + log "👷 Assembling android shared-storage" ./gradlew :$MODULE_NAME:$ANDROID_BUILD_TASK - echo "Publishing binaries to local repo" + log "Publishing binaries to local repo" ./gradlew :$MODULE_NAME:$ANDROID_PUBLISH_TASK - echo "Remove old local repo" + log "Remove old local repo" rm -rf $ANDROID_RN_OUTPUT_DIR/$ANDROID_OUTPUT_NAME - echo "Moving local repo to RN target" + log "Moving local repo to RN target" mv $ANDROID_OUTPUT_DIR/$ANDROID_OUTPUT_NAME $ANDROID_RN_OUTPUT_DIR/$ANDROID_OUTPUT_NAME - echo "all done" + + log "🚀 all done" } build_apple() { - echo "👷 Assembling apple shared-storage" + log "👷 Assembling apple shared-storage" ./gradlew :$MODULE_NAME:$APPLE_BUILD_TASK - echo "recreate Frameworks dir" + log "recreate Frameworks dir" rm -rf $APPLE_RN_OUTPUT_DIR mkdir $APPLE_RN_OUTPUT_DIR - echo "move xcframework to RN module" + log "move xcframework to RN module" mv $APPLE_OUTPUT_DIR/$APPLE_OUTPUT_NAME $APPLE_RN_OUTPUT_DIR/$APPLE_OUTPUT_NAME - echo "all done" + + + # because osx is using symlinks for versioning, distributing its framework via + # npm won't work - compression via tar breaks the link. + # therefore this script resolves the symlinks into actual folders, to match + # expected structure by macos. + MAC_OS_FRAMEWORK="$APPLE_RN_OUTPUT_DIR/SharedAsyncStorage.xcframework/macos-arm64_x86_64/SharedAsyncStorage.framework" + + log "fixing macos symlinks" + + # symlinks + rm "$MAC_OS_FRAMEWORK/Headers" "$MAC_OS_FRAMEWORK/Modules" "$MAC_OS_FRAMEWORK/Resources" "$MAC_OS_FRAMEWORK/SharedAsyncStorage" + + cp -r --copy-content "$MAC_OS_FRAMEWORK/Versions/A/Headers" -t "$MAC_OS_FRAMEWORK/" + cp -r --copy-content "$MAC_OS_FRAMEWORK/Versions/A/Modules" -t "$MAC_OS_FRAMEWORK/" + cp -r --copy-content "$MAC_OS_FRAMEWORK/Versions/A/Resources" -t "$MAC_OS_FRAMEWORK/" + cp --copy-content "$MAC_OS_FRAMEWORK/Versions/A/SharedAsyncStorage" -t "$MAC_OS_FRAMEWORK/" + + # clear versions, not needed + rm -r "$MAC_OS_FRAMEWORK/Versions" + + log "🚀 all done" +} + +log() { + local message="$1" + echo "[AsyncStorage] $message" } TARGET=$1 diff --git a/shared-storage/build.gradle.kts b/shared-storage/build.gradle.kts index 47384735..337349e2 100644 --- a/shared-storage/build.gradle.kts +++ b/shared-storage/build.gradle.kts @@ -10,7 +10,6 @@ plugins { alias(libs.plugins.skie) } - /** * Windows as native target is not currently supported by Room db. * https://issuetracker.google.com/issues/363195546 @@ -41,12 +40,12 @@ kotlin { listOf(iosX64(), iosArm64(), iosSimulatorArm64(), macosArm64(), macosX64()).forEach { it.binaries.framework { baseName = xcfName + isStatic = true xcf.add(this) binaryOption("bundleId", "org.asyncstorage.shared_storage") } } - sourceSets { commonMain { dependencies { From 37480d87f487fc0549b2e910828a49b8246099ab Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Wed, 15 Oct 2025 22:43:36 +0200 Subject: [PATCH 108/110] docs: info about min version --- README.md | 76 +++++++++++---------- docs/index.md | 23 +++++-- packages/async-storage/android/build.gradle | 3 +- packages/async-storage/package.json | 6 +- 4 files changed, 65 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 1627ed2d..5d1737c2 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ # React Native Async Storage -Async Storage is asynchronous, unencrypted, persistent, key-value storage for your React Native application. -It provides a simple API compatible with the [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API), with a few extensions for batch operations and multi-database support. +Async Storage is an asynchronous, unencrypted, persistent key-value storage solution for your React Native application. +It provides a simple API compatible with the [Web Storage API]((https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API)), with additional extensions for batch operations and multi-database support. ---- ## Supported platforms @@ -13,19 +12,49 @@ It provides a simple API compatible with the [Web Storage API](https://developer - **macOS** (SQLite backend via Room KMP) - **Windows** (legacy fallback, single database only) + +## Supported versions + +| Component | Minimum Version | +|-----------------|-----------------| +| React Native | 0.76 | +| Kotlin | 2.1.0 | +| KSP | 2.1.0-1.0.28 | +| Android min sdk | 24 | + + --- ## Installation ```shell -# using npm +# Using npm npm install @react-native-async-storage/async-storage -# using yarn +# Using yarn yarn add @react-native-async-storage/async-storage ``` -On iOS/macOS, don’t forget to install pods: +### Android + +Inside your `android/build.gradle(.kts)` file, add link to local maven repo: + +```groovy +allprojects { + repositories { + // ... others like google(), mavenCentral() + + maven { + // or uri("path/to/node_modules/@react-native-async-storage/async-storage/android/local_repo") + url = uri(project(":react-native-async-storage_async-storage").file("local_repo")) + } + } +} +``` + +### iOS/macOS + +Install cocoapods dependencies: ```shell # inside macos/ios directory @@ -34,12 +63,10 @@ pod install ## Usage -### Basic - ```typescript import { createAsyncStorage } from "@react-native-async-storage/async-storage"; -// Create a storage instance +// create a storage instance const storage = createAsyncStorage("appDB"); async function demo() { @@ -48,41 +75,16 @@ async function demo() { // read value stored at "userToken" key const token = await storage.getItem("userToken"); - console.log("Stored token:", token); + console.log("Stored token:", token); // abc123 // remove value from storage await storage.removeItem("userToken"); } ``` -### Multi-item operations - -Async Storage supports batch operations for efficiency: - -```typescript -async function demo() { - // save multiple values at once - await storage.setMany({ - theme: "dark", - language: "en", - }); - - // Retrieve multiple values - const values = await storage.getMany(["theme", "language", "different"]); - console.log(values); // { theme: "dark", language: "en", different: null } - - // Remove multiple values - await storage.removeMany(["theme", "language"]); -} -``` - -## Contribution - -Pull requests are welcome. Please open an issue first to discuss what you would -like to change. +Head over to [Usage page](api/usage.md) to learn more. -See the [CONTRIBUTING](.github/CONTRIBUTING.md) file for more information. ## License -MIT +MIT \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 2cfd5630..ccb33129 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,20 +2,30 @@ title: Overview --- -# Async Storage +# React Native Async Storage Async Storage is an asynchronous, unencrypted, persistent key-value storage solution for your React Native application. It provides a simple API compatible with the [Web Storage API]((https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API)), with additional extensions for batch operations and multi-database support. ---- -## Supported Platforms +## Supported platforms - **Android** (SQLite backend via Room KMP) - **iOS** (SQLite backend via Room KMP) - **Web** (IndexedDB backend) - **macOS** (SQLite backend via Room KMP) -- **Windows** (legacy fallback, single-database only) +- **Windows** (legacy fallback, single database only) + + +## Supported versions + +| Component | Minimum Version | +|-----------------|-----------------| +| React Native | 0.76 | +| Kotlin | 2.1.0 | +| KSP | 2.1.0-1.0.28 | +| Android min sdk | 24 | + --- @@ -77,3 +87,8 @@ async function demo() { ``` Head over to [Usage page](api/usage.md) to learn more. + + +## License + +MIT \ No newline at end of file diff --git a/packages/async-storage/android/build.gradle b/packages/async-storage/android/build.gradle index c04d147a..302a52da 100644 --- a/packages/async-storage/android/build.gradle +++ b/packages/async-storage/android/build.gradle @@ -21,7 +21,7 @@ apply plugin: "com.android.library" apply plugin: "kotlin-android" apply plugin: "com.facebook.react" -// to support migration from old storage +// ksp/room is required to support legacy storage apply plugin: 'com.google.devtools.ksp' def getExtOrDefault(name) { @@ -94,6 +94,7 @@ dependencies { implementation "org.asyncstorage.shared_storage:storage-android:1.0.0" + // ksp/room is required to support legacy storage def room_version = getExtOrDefault("ROOM_VERSION") implementation "androidx.room:room-runtime:$room_version" implementation "androidx.room:room-ktx:$room_version" diff --git a/packages/async-storage/package.json b/packages/async-storage/package.json index bb898d68..737f0926 100644 --- a/packages/async-storage/package.json +++ b/packages/async-storage/package.json @@ -34,7 +34,11 @@ "!**/__tests__", "!**/__fixtures__", "!**/__mocks__", - "!**/.*" + "!**/.*", + "!docs", + "!examples", + "!scripts", + "!shared-storage" ], "dependencies": { "idb": "8.0.3" From 21d14d4dc0ecfdaf2a37ab006e401b507cc4c93b Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Wed, 15 Oct 2025 23:34:11 +0200 Subject: [PATCH 109/110] docs: improvements --- .github/CONTRIBUTING.md | 7 +++ .github/scripts/prepare-mkdocs.sh | 11 ---- .github/workflows/deploy-docs.yml | 1 - README.md | 2 +- docs/api/db-naming.md | 2 +- docs/changelog.md | 1 + docs/contributing.md | 1 + docs/index.md | 95 +------------------------------ mkdocs.yml | 1 + 9 files changed, 13 insertions(+), 108 deletions(-) delete mode 100755 .github/scripts/prepare-mkdocs.sh create mode 120000 docs/changelog.md create mode 120000 docs/contributing.md mode change 100644 => 120000 docs/index.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 9350c20c..84273ff5 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -14,6 +14,13 @@ making changes. - `yarn test:ts`: Run `tsc` type check. - `yarn test:format`: Run `prettier` check for formatting mistakes. + +You can also run unit tests for `shared-storage`, using one of gradle task: + +- `./gradlew testAndroidHostTest` +- `./gradlew macosArm64Test` +- `./gradlew iosSimulatorArm64Test` + ## Sending a pull request When you're sending a pull request: diff --git a/.github/scripts/prepare-mkdocs.sh b/.github/scripts/prepare-mkdocs.sh deleted file mode 100755 index b484a893..00000000 --- a/.github/scripts/prepare-mkdocs.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -# The website is built using MkDocs with the Material theme. -# https://squidfunk.github.io/mkdocs-material/ -# It requires Python to run. -# Install the packages with the following command: -# pip install --no-deps -r requirements.txt - - -cp packages/async-storage/CHANGELOG.md docs/changelog.md -cp .github/CONTRIBUTING.md docs/contributing.md diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index de45b80b..1c268852 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -26,7 +26,6 @@ jobs: - name: Prepare MkDocs run: | pip install --no-deps -r .github/requirements.txt - .github/scripts/prepare-mkdocs.sh # required for mike - name: Setup git user run: ./setup-ci-git-user.sh diff --git a/README.md b/README.md index 5d1737c2..f83c53af 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # React Native Async Storage Async Storage is an asynchronous, unencrypted, persistent key-value storage solution for your React Native application. -It provides a simple API compatible with the [Web Storage API]((https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API)), with additional extensions for batch operations and multi-database support. +It provides a simple API compatible with the [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API), with additional extensions for batch operations and multi-database support. ## Supported platforms diff --git a/docs/api/db-naming.md b/docs/api/db-naming.md index 53432c20..241d1510 100644 --- a/docs/api/db-naming.md +++ b/docs/api/db-naming.md @@ -74,7 +74,7 @@ createAsyncStorage(`user-${userId}`); Creates database named `user-1234`: -![web-db-naming-1.png](/assets/db-naming-web-1.png) +![web-db-naming-1.png](../assets/db-naming-web-1.png) ### Windows diff --git a/docs/changelog.md b/docs/changelog.md new file mode 120000 index 00000000..e0fc7210 --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1 @@ +../packages/async-storage/CHANGELOG.md \ No newline at end of file diff --git a/docs/contributing.md b/docs/contributing.md new file mode 120000 index 00000000..e6afed18 --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1 @@ +../.github/CONTRIBUTING.md \ No newline at end of file diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index ccb33129..00000000 --- a/docs/index.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: Overview ---- - -# React Native Async Storage - -Async Storage is an asynchronous, unencrypted, persistent key-value storage solution for your React Native application. -It provides a simple API compatible with the [Web Storage API]((https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API)), with additional extensions for batch operations and multi-database support. - - -## Supported platforms - -- **Android** (SQLite backend via Room KMP) -- **iOS** (SQLite backend via Room KMP) -- **Web** (IndexedDB backend) -- **macOS** (SQLite backend via Room KMP) -- **Windows** (legacy fallback, single database only) - - -## Supported versions - -| Component | Minimum Version | -|-----------------|-----------------| -| React Native | 0.76 | -| Kotlin | 2.1.0 | -| KSP | 2.1.0-1.0.28 | -| Android min sdk | 24 | - - ---- - -## Installation - -```shell -# Using npm -npm install @react-native-async-storage/async-storage - -# Using yarn -yarn add @react-native-async-storage/async-storage -``` - -### Android - -Inside your `android/build.gradle(.kts)` file, add link to local maven repo: - -```groovy -allprojects { - repositories { - // ... others like google(), mavenCentral() - - maven { - // or uri("path/to/node_modules/@react-native-async-storage/async-storage/android/local_repo") - url = uri(project(":react-native-async-storage_async-storage").file("local_repo")) - } - } -} -``` - -### iOS/macOS - -Install cocoapods dependencies: - -```shell -# inside macos/ios directory -pod install -``` - -## Usage - -```typescript -import { createAsyncStorage } from "@react-native-async-storage/async-storage"; - -// create a storage instance -const storage = createAsyncStorage("appDB"); - -async function demo() { - // save value under "userToken" key - await storage.setItem("userToken", "abc123"); - - // read value stored at "userToken" key - const token = await storage.getItem("userToken"); - console.log("Stored token:", token); // abc123 - - // remove value from storage - await storage.removeItem("userToken"); -} -``` - -Head over to [Usage page](api/usage.md) to learn more. - - -## License - -MIT \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 120000 index 00000000..32d46ee8 --- /dev/null +++ b/docs/index.md @@ -0,0 +1 @@ +../README.md \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index ca87f1a9..c92dc078 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -2,6 +2,7 @@ site_name: Async Storage repo_url: https://github.com/react-native-async-storage/async-storage site_url: https://react-native-async-storage.github.io/ +# note: index, contributing and changelog are symlinked nav: - Overview: index.md - API: From 898ec0ad1133e3487d10a575e870451a0668b87c Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy <6444719+krizzu@users.noreply.github.com> Date: Wed, 15 Oct 2025 23:50:56 +0200 Subject: [PATCH 110/110] chore: revert version --- packages/async-storage/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/async-storage/package.json b/packages/async-storage/package.json index 737f0926..8c01893d 100644 --- a/packages/async-storage/package.json +++ b/packages/async-storage/package.json @@ -1,6 +1,6 @@ { "name": "@react-native-async-storage/async-storage", - "version": "3.0.0", + "version": "2.2.0", "description": "Asynchronous, persistent, key-value storage system for React Native.", "main": "./lib/module/index.js", "types": "./lib/typescript/index.d.ts",