Repository: jpudysz/react-native-unistyles
Pull request #789: feat: added the Repack plugin to enable using Babel Unistyles in proj…
Author: login: whydidoo
Created: 2025-05-15T15:29:08Z | Merged: 2025-05-19T06:37:07Z

I'm integrating React Native as SDK (.aar) files using Re.Pack and encountered an issue — the Babel plugin can't be applied. To handle this case, I also wrote a custom Re.Pack plugin.



<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - Introduced a new plugin for integrating unistyles with the Repack bundler, including support for custom plugin options and exclusion paths.
  - Added a loader that applies Babel transformations for unistyles processing in compatible source files.

- **Chores**
  - Updated build scripts and package configuration to support the new plugin and loader.
  - Added new development dependencies for Repack and Rspack integration.
  - Extended code formatting and linting configuration to include the new plugin directory.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/biome.json b/biome.json
index 19f33124..2e7e5d38 100644
--- a/biome.json
+++ b/biome.json
@@ -1,7 +1,7 @@
 {
   "$schema": "https://biomejs.dev/schemas/1.8.3/schema.json",
   "files": {
-    "include": ["src/**/*.ts", "src/**/*.tsx", "plugin/**/*.ts"],
+    "include": ["src/**/*.ts", "src/**/*.tsx", "plugin/**/*.ts", "repack-plugin/**/*.ts"],
     "ignore": ["example", "expo-example", "docs", "lib"]
   },
   "formatter": {
diff --git a/package.json b/package.json
index c0888038..4e4f2a4c 100644
--- a/package.json
+++ b/package.json
@@ -9,10 +9,11 @@
     "lint": "biome lint",
     "check": "biome check --write",
     "check:ci": "biome check",
-    "prepare": "husky && bob build && yarn plugin:build",
+    "prepare": "husky && bob build && yarn plugin:build && yarn repack:plugin:build",
     "precommit": "concurrently 'yarn tsc' 'yarn lint' 'yarn check' 'yarn test' 'yarn circular:check'",
     "release": "release-it",
     "plugin:build": "node plugin/esbuild.js",
+    "repack:plugin:build": "node repack-plugin/esbuild.js",
     "circular:check": "dpdm --no-warning --no-tree -T --exit-code circular:1 src/**/*.ts",
     "components:build": "node build-components.js"
   },
@@ -46,6 +47,11 @@
       "types": "./plugin/index.d.ts",
       "default": "./plugin/index.js"
     },
+    "./repack-plugin": {
+      "import": "./repack-plugin/index.js",
+      "types": "./repack-plugin/index.d.ts",
+      "default": "./repack-plugin/index.js"
+    },
     "./package.json": "./package.json",
     "./server": {
       "types": "./lib/typescript/src/server/index.d.ts",
@@ -84,6 +90,10 @@
     "reanimated",
     "react-native.config.js",
     "Unistyles.podspec",
+    "repack-plugin",
+    "!repack-plugin/__tests__",
+    "!repack-plugin/src",
+    "!repack-plugin/esbuild.js",
     "!plugin/__tests__",
     "!plugin/src",
     "!plugin/esbuild.js",
@@ -122,9 +132,11 @@
     "@babel/preset-typescript": "7.26.0",
     "@babel/types": "7.26.9",
     "@biomejs/biome": "1.9.4",
+    "@callstack/repack": "5.1.0",
     "@commitlint/config-conventional": "19.7.1",
     "@react-native/normalize-colors": "0.78.0",
     "@release-it/conventional-changelog": "8.0.2",
+    "@rspack/core": "1.3.10",
     "@types/jest": "29.5.14",
     "@types/react": "19.0.10",
     "babel-plugin-tester": "11.0.4",
diff --git a/repack-plugin/esbuild.js b/repack-plugin/esbuild.js
new file mode 100644
index 00000000..b2af714d
--- /dev/null
+++ b/repack-plugin/esbuild.js
@@ -0,0 +1,13 @@
+const esbuild = require('esbuild')
+
+esbuild.build({
+    entryPoints: ['./repack-plugin/src/index.ts'],
+    bundle: true,
+    outdir: './repack-plugin',
+    packages: 'external',
+    external: ['../package.json'],
+    allowOverwrite: true,
+    logLevel: 'warning',
+    platform: 'node',
+    minify: false,
+})
diff --git a/repack-plugin/index.d.ts b/repack-plugin/index.d.ts
new file mode 100644
index 00000000..2fdb2d6c
--- /dev/null
+++ b/repack-plugin/index.d.ts
@@ -0,0 +1,19 @@
+import type {Compiler,LoaderContext,RspackPluginInstance } from '@rspack/core'
+import type { UnistylesPluginOptions } from 'react-native-unistyles/plugin'
+
+export declare const BASE_REPACK_EXCLUDE_PATHS: Array<RegExp>
+interface ConstructorParams {
+    ruleExcludePaths?: Array<RegExp>
+    unistylesPluginOptions?: UnistylesPluginOptions
+}
+
+export declare class RepackUnistylePlugin implements RspackPluginInstance {
+    private ruleExcludePaths
+    private unistylesPluginOptions
+    constructor({ ruleExcludePaths, unistylesPluginOptions }?: ConstructorParams)
+    apply(compiler: Compiler): void
+}
+
+declare function unistylesLoader(this: LoaderContext<UnistylesLoaderOptions>, source: string): void;
+
+export default unistylesLoader
diff --git a/repack-plugin/index.js b/repack-plugin/index.js
new file mode 100644
index 00000000..a5aa8ccf
--- /dev/null
+++ b/repack-plugin/index.js
@@ -0,0 +1,152 @@
+"use strict";
+var __defProp = Object.defineProperty;
+var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
+var __getOwnPropNames = Object.getOwnPropertyNames;
+var __hasOwnProp = Object.prototype.hasOwnProperty;
+var __export = (target, all) => {
+  for (var name in all)
+    __defProp(target, name, { get: all[name], enumerable: true });
+};
+var __copyProps = (to, from, except, desc) => {
+  if (from && typeof from === "object" || typeof from === "function") {
+    for (let key of __getOwnPropNames(from))
+      if (!__hasOwnProp.call(to, key) && key !== except)
+        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
+  }
+  return to;
+};
+var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
+
+// repack-plugin/src/index.ts
+var index_exports = {};
+__export(index_exports, {
+  BASE_REPACK_EXCLUDE_PATHS: () => BASE_REPACK_EXCLUDE_PATHS,
+  RepackUnistylePlugin: () => RepackUnistylePlugin,
+  default: () => index_default
+});
+module.exports = __toCommonJS(index_exports);
+var import_repack = require("@callstack/repack");
+
+// repack-plugin/src/loader.ts
+var import_core = require("@babel/core");
+
+// plugin/src/consts.ts
+var REACT_NATIVE_COMPONENT_NAMES = [
+  "ActivityIndicator",
+  "View",
+  "Text",
+  "Image",
+  "ImageBackground",
+  "KeyboardAvoidingView",
+  "Pressable",
+  "ScrollView",
+  "FlatList",
+  "SectionList",
+  "Switch",
+  "TextInput",
+  "RefreshControl",
+  "TouchableHighlight",
+  "TouchableOpacity",
+  "VirtualizedList",
+  "Animated"
+  // Modal - there is no exposed native handle
+  // TouchableWithoutFeedback - can't accept a ref
+];
+var REPLACE_WITH_UNISTYLES_PATHS = [
+  "react-native-reanimated/src/component",
+  "react-native-reanimated/lib/module/component",
+  "react-native-gesture-handler/lib/module/components",
+  "react-native-gesture-handler/lib/commonjs/components",
+  "react-native-gesture-handler/src/components"
+];
+
+// repack-plugin/src/loader.ts
+var importName = "react-native-unistyles";
+var UNISTYLES_REGEX = new RegExp(
+  [...REACT_NATIVE_COMPONENT_NAMES, ...REPLACE_WITH_UNISTYLES_PATHS, importName].join("|")
+);
+function unistylesLoader(source) {
+  this.cacheable();
+  const callback = this.async();
+  const options = this.getOptions();
+  if (!UNISTYLES_REGEX.test(source)) {
+    callback(null, source);
+    return;
+  }
+  const unistylesOptions = options.unistylesPluginOptions;
+  const unistylesPlugin = unistylesOptions ? ["react-native-unistyles/plugin", unistylesOptions] : "react-native-unistyles/plugin";
+  const babelPlugins = options.babelPlugins ?? [];
+  (0, import_core.transform)(
+    source,
+    {
+      filename: this.resourcePath,
+      babelrc: false,
+      configFile: false,
+      compact: false,
+      comments: true,
+      plugins: [...babelPlugins, unistylesPlugin]
+    },
+    (err, result) => {
+      if (err) {
+        callback(err);
+        return;
+      }
+      callback(null, result.code, result.map);
+      return;
+    }
+  );
+}
+
+// repack-plugin/src/index.ts
+var BASE_REPACK_EXCLUDE_PATHS = (0, import_repack.getModulePaths)([
+  "react",
+  "react-native",
+  "@react-native",
+  "react-native-macos",
+  "react-native-windows",
+  "react-native-tvos",
+  "@callstack/react-native-visionos",
+  "@module-federation",
+  "react-native-unistyles",
+  "whatwg-fetch",
+  "@callstack",
+  "react-native-nitro-modules",
+  "@callstack/repack"
+]);
+var getUnistyleModuleRules = (excludePathLoader, unistylesPluginOptions) => {
+  const createRule = (test, babelPlugins) => ({
+    test,
+    use: {
+      loader: "react-native-unistyles/repack-plugin",
+      options: {
+        babelPlugins,
+        unistylesPluginOptions
+      }
+    }
+  });
+  return {
+    exclude: excludePathLoader,
+    oneOf: [
+      createRule(/\.[cm]?ts$/, [["@babel/plugin-syntax-typescript", { isTSX: false, allowNamespaces: true }]]),
+      createRule(/\.[cm]?tsx$/, [["@babel/plugin-syntax-typescript", { isTSX: true, allowNamespaces: true }]]),
+      createRule(/\.[cm]?jsx?$/, ["babel-plugin-syntax-hermes-parser"])
+    ]
+  };
+};
+var RepackUnistylePlugin = class {
+  ruleExcludePaths;
+  unistylesPluginOptions;
+  constructor({ ruleExcludePaths = BASE_REPACK_EXCLUDE_PATHS, unistylesPluginOptions } = {}) {
+    this.ruleExcludePaths = ruleExcludePaths;
+    this.unistylesPluginOptions = unistylesPluginOptions;
+  }
+  apply(compiler) {
+    compiler.options.module.rules.push(getUnistyleModuleRules(this.ruleExcludePaths, this.unistylesPluginOptions));
+  }
+};
+var index_default = unistylesLoader;
+// Annotate the CommonJS export names for ESM import in node:
+0 && (module.exports = {
+  BASE_REPACK_EXCLUDE_PATHS,
+  RepackUnistylePlugin
+});
diff --git a/repack-plugin/src/index.ts b/repack-plugin/src/index.ts
new file mode 100644
index 00000000..a32108e2
--- /dev/null
+++ b/repack-plugin/src/index.ts
@@ -0,0 +1,65 @@
+import { getModulePaths } from '@callstack/repack'
+import type { Compiler, RspackPluginInstance } from '@rspack/core'
+import type { UnistylesPluginOptions } from 'react-native-unistyles/plugin'
+import { unistylesLoader } from './loader'
+
+export const BASE_REPACK_EXCLUDE_PATHS = getModulePaths([
+    'react',
+    'react-native',
+    '@react-native',
+    'react-native-macos',
+    'react-native-windows',
+    'react-native-tvos',
+    '@callstack/react-native-visionos',
+    '@module-federation',
+    'react-native-unistyles',
+    'whatwg-fetch',
+    '@callstack',
+    'react-native-nitro-modules',
+    '@callstack/repack',
+])
+
+type RuleExcludePaths = ReturnType<typeof getModulePaths>
+
+interface ConstructorParams {
+    ruleExcludePaths?: RuleExcludePaths
+    unistylesPluginOptions?: UnistylesPluginOptions
+}
+
+const getUnistyleModuleRules = (excludePathLoader: Array<RegExp>, unistylesPluginOptions?: UnistylesPluginOptions) => {
+    const createRule = (test: RegExp, babelPlugins: Array<any>) => ({
+        test,
+        use: {
+            loader: 'react-native-unistyles/repack-plugin',
+            options: {
+                babelPlugins,
+                unistylesPluginOptions,
+            },
+        },
+    })
+
+    return ({
+        exclude: excludePathLoader,
+        oneOf: [
+            createRule(/\.[cm]?ts$/, [['@babel/plugin-syntax-typescript', { isTSX: false, allowNamespaces: true }]]),
+            createRule(/\.[cm]?tsx$/, [['@babel/plugin-syntax-typescript', { isTSX: true, allowNamespaces: true }]]),
+            createRule(/\.[cm]?jsx?$/, ['babel-plugin-syntax-hermes-parser']),
+        ],
+    })
+} 
+
+export class RepackUnistylePlugin implements RspackPluginInstance {
+    private ruleExcludePaths
+    private unistylesPluginOptions
+
+    constructor({ ruleExcludePaths = BASE_REPACK_EXCLUDE_PATHS, unistylesPluginOptions }: ConstructorParams = {}) {
+        this.ruleExcludePaths = ruleExcludePaths
+        this.unistylesPluginOptions = unistylesPluginOptions
+    }
+
+    apply(compiler: Compiler) {
+        compiler.options.module.rules.push(getUnistyleModuleRules(this.ruleExcludePaths, this.unistylesPluginOptions))
+    }
+}
+
+export default unistylesLoader
diff --git a/repack-plugin/src/loader.ts b/repack-plugin/src/loader.ts
new file mode 100644
index 00000000..29736392
--- /dev/null
+++ b/repack-plugin/src/loader.ts
@@ -0,0 +1,56 @@
+import { transform } from '@babel/core'
+import type { LoaderContext } from '@rspack/core'
+import type { UnistylesPluginOptions } from '../../plugin'
+import { REACT_NATIVE_COMPONENT_NAMES, REPLACE_WITH_UNISTYLES_PATHS } from '../../plugin/src/consts'
+
+const importName = 'react-native-unistyles'
+
+interface UnistylesLoaderOptions {
+    babelPlugins?: string[]
+    unistylesPluginOptions?: UnistylesPluginOptions
+}
+
+const UNISTYLES_REGEX = new RegExp(
+    [...REACT_NATIVE_COMPONENT_NAMES, ...REPLACE_WITH_UNISTYLES_PATHS, importName].join('|')
+)
+
+export function unistylesLoader(this: LoaderContext<UnistylesLoaderOptions>, source: string) {
+    this.cacheable()
+    const callback = this.async()
+    const options = this.getOptions()
+
+    if (!UNISTYLES_REGEX.test(source)) {
+        callback(null, source)
+        return
+    }
+
+    const unistylesOptions = options.unistylesPluginOptions
+
+    const unistylesPlugin = unistylesOptions
+        ? ['react-native-unistyles/plugin', unistylesOptions]
+        : 'react-native-unistyles/plugin'
+
+    const babelPlugins = options.babelPlugins ?? []
+
+    transform(
+        source,
+        {
+            filename: this.resourcePath,
+            babelrc: false,
+            configFile: false,
+            compact: false,
+            comments: true,
+            plugins: [...babelPlugins, unistylesPlugin],
+        },
+        (err, result) => {
+            if (err) {
+                callback(err)
+                return
+            }
+
+            //@ts-ignore
+            callback(null, result.code, result.map)
+            return
+        }
+    )
+}
diff --git a/yarn.lock b/yarn.lock
index 0446f906..9a9e4449 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2498,6 +2498,70 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@callstack/repack-dev-server@npm:5.1.0":
+  version: 5.1.0
+  resolution: "@callstack/repack-dev-server@npm:5.1.0"
+  dependencies:
+    "@babel/code-frame": ^7.26.2
+    "@fastify/middie": ^8.3.0
+    "@fastify/sensible": ^5.5.0
+    "@react-native/dev-middleware": ^0.78.0
+    fastify: ^4.24.3
+    fastify-favicon: ^4.3.0
+    fastify-plugin: ^4.5.1
+    http-proxy-middleware: ^3.0.3
+    launch-editor: ^2.10.0
+    open: ^10.1.0
+    pretty-format: ^28.1.0
+    source-map: ^0.7.4
+    ws: ^8.18.1
+  checksum: 067f2986b6e687acb4e8ce2e4d1a78e9971de1248c6ed3c3bab6e60967578851c5ce70778f33e06215501424e868334a5a43774c99b25ea0918f87bf3af94853
+  languageName: node
+  linkType: hard
+
+"@callstack/repack@npm:5.1.0":
+  version: 5.1.0
+  resolution: "@callstack/repack@npm:5.1.0"
+  dependencies:
+    "@callstack/repack-dev-server": 5.1.0
+    "@discoveryjs/json-ext": ^0.5.7
+    "@rspack/plugin-react-refresh": 1.0.0
+    babel-loader: ^9.2.1
+    colorette: ^2.0.20
+    dedent: ^0.7.0
+    estree-util-is-identifier-name: ^1.1.0
+    events: ^3.3.0
+    execa: ^5.0.0
+    exit-hook: ^4.0.0
+    flow-remove-types: ^2.268.0
+    gradient-string: ^2.0.2
+    image-size: ^1.1.1
+    jsonwebtoken: ^9.0.2
+    memfs: ^4.11.1
+    mime-types: ^2.1.35
+    pretty-format: ^26.6.2
+    react-refresh: ^0.14.0
+    schema-utils: ^4.2.0
+    shallowequal: ^1.1.0
+    tapable: ^2.2.1
+    throttleit: ^2.1.0
+    webpack-merge: ^6.0.1
+  peerDependencies:
+    "@module-federation/enhanced": ">=0.6.10"
+    "@rspack/core": ">=1"
+    react-native: ">=0.74"
+    webpack: ">=5.90"
+  peerDependenciesMeta:
+    "@module-federation/enhanced":
+      optional: true
+    "@rspack/core":
+      optional: true
+    webpack:
+      optional: true
+  checksum: f58d8825260e2b506fa5bfe85ada53309fe6f01ecf83e158193fc1e3751b692f8517396c48ee7b760529fd0b536fbaa960f3a027a217a639d732e7d11d23586d
+  languageName: node
+  linkType: hard
+
 "@commitlint/cli@npm:^19.7.1":
   version: 19.7.1
   resolution: "@commitlint/cli@npm:19.7.1"
@@ -2714,6 +2778,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@discoveryjs/json-ext@npm:^0.5.7":
+  version: 0.5.7
+  resolution: "@discoveryjs/json-ext@npm:0.5.7"
+  checksum: 2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918
+  languageName: node
+  linkType: hard
+
 "@egjs/hammerjs@npm:^2.0.17":
   version: 2.0.17
   resolution: "@egjs/hammerjs@npm:2.0.17"
@@ -3671,6 +3742,69 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@fastify/ajv-compiler@npm:^3.5.0":
+  version: 3.6.0
+  resolution: "@fastify/ajv-compiler@npm:3.6.0"
+  dependencies:
+    ajv: ^8.11.0
+    ajv-formats: ^2.1.1
+    fast-uri: ^2.0.0
+  checksum: 05504cf27289479373f8dcdc8e27e31e9cf4fa20a4b64c3888587c18baf55ae8249f2ec510290565b8bf45a4d9e31dd3da8c90881812468757456e28bda67d80
+  languageName: node
+  linkType: hard
+
+"@fastify/error@npm:^3.2.0, @fastify/error@npm:^3.3.0, @fastify/error@npm:^3.4.0":
+  version: 3.4.1
+  resolution: "@fastify/error@npm:3.4.1"
+  checksum: 2c2e98c33327884c0927a73e8c3b8f162acbf1e4d058bacb68bca0c3607f36d6fde8c376fde45b2097e724d450266f8bb29134305fa24aabd200f83f087c7321
+  languageName: node
+  linkType: hard
+
+"@fastify/fast-json-stringify-compiler@npm:^4.3.0":
+  version: 4.3.0
+  resolution: "@fastify/fast-json-stringify-compiler@npm:4.3.0"
+  dependencies:
+    fast-json-stringify: ^5.7.0
+  checksum: 2734afabe2539d3e15d2bd9f8dfee756d9cd969f7303dc085dd91c744ff61742bb0d3ebd3b561cf3c32be54567048a634b4962f943eb6bd9ed3fbd71cbf6a4fa
+  languageName: node
+  linkType: hard
+
+"@fastify/merge-json-schemas@npm:^0.1.0":
+  version: 0.1.1
+  resolution: "@fastify/merge-json-schemas@npm:0.1.1"
+  dependencies:
+    fast-deep-equal: ^3.1.3
+  checksum: d5b976f82e6d5d30a603345a29edb176a14866b98dd4d30aabe6e58a91dfc34fb1c2dd97289bdd7f4d1e11675c9dbb9382138968742d2ac8c6fdcc5f7bd08b97
+  languageName: node
+  linkType: hard
+
+"@fastify/middie@npm:^8.3.0":
+  version: 8.3.3
+  resolution: "@fastify/middie@npm:8.3.3"
+  dependencies:
+    "@fastify/error": ^3.2.0
+    fastify-plugin: ^4.0.0
+    path-to-regexp: ^6.3.0
+    reusify: ^1.0.4
+  checksum: 5d45156de42663194cbbf8afd9281bbbc65f33ec2bdc49e44c960cf3ea565f0e97b863c43131865989bad49db9bb82864ae9d669a0fb5f46255c54690630307c
+  languageName: node
+  linkType: hard
+
+"@fastify/sensible@npm:^5.5.0":
+  version: 5.6.0
+  resolution: "@fastify/sensible@npm:5.6.0"
+  dependencies:
+    "@lukeed/ms": ^2.0.1
+    fast-deep-equal: ^3.1.1
+    fastify-plugin: ^4.0.0
+    forwarded: ^0.2.0
+    http-errors: ^2.0.0
+    type-is: ^1.6.18
+    vary: ^1.1.2
+  checksum: af667cc48a3bcd4d82810ceb6e130b48ce3baea18389634e01b011ef15ef7eef3fbaaae3a8ed25f8e91b1baa90803b1187434e2db4638b6898381b73c61bdbae
+  languageName: node
+  linkType: hard
+
 "@fontsource-variable/nunito@npm:5.1.1":
   version: 5.1.1
   resolution: "@fontsource-variable/nunito@npm:5.1.1"
@@ -4098,6 +4232,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@jest/schemas@npm:^28.1.3":
+  version: 28.1.3
+  resolution: "@jest/schemas@npm:28.1.3"
+  dependencies:
+    "@sinclair/typebox": ^0.24.1
+  checksum: 3cf1d4b66c9c4ffda58b246de1ddcba8e6ad085af63dccdf07922511f13b68c0cc480a7bc620cb4f3099a6f134801c747e1df7bfc7a4ef4dceefbdea3e31e1de
+  languageName: node
+  linkType: hard
+
 "@jest/schemas@npm:^29.6.3":
   version: 29.6.3
   resolution: "@jest/schemas@npm:29.6.3"
@@ -4244,6 +4387,45 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@jsonjoy.com/base64@npm:^1.1.1":
+  version: 1.1.2
+  resolution: "@jsonjoy.com/base64@npm:1.1.2"
+  peerDependencies:
+    tslib: 2
+  checksum: 00dbf9cbc6ecb3af0e58288a305cc4ee3dfca9efa24443d98061756e8f6de4d6d2d3764bdfde07f2b03e6ce56db27c8a59b490bd134bf3d8122b4c6b394c7010
+  languageName: node
+  linkType: hard
+
+"@jsonjoy.com/json-pack@npm:^1.0.3":
+  version: 1.2.0
+  resolution: "@jsonjoy.com/json-pack@npm:1.2.0"
+  dependencies:
+    "@jsonjoy.com/base64": ^1.1.1
+    "@jsonjoy.com/util": ^1.1.2
+    hyperdyperid: ^1.2.0
+    thingies: ^1.20.0
+  peerDependencies:
+    tslib: 2
+  checksum: 9c698ad85e176b44aafb6dff0f15bbe2a2f147c1d9a3f68127e0a7bd59653ab29584fbbe2795b73926783f1299562784fc252e3b6296fb47fb5e4df5d3ea22b2
+  languageName: node
+  linkType: hard
+
+"@jsonjoy.com/util@npm:^1.1.2, @jsonjoy.com/util@npm:^1.3.0":
+  version: 1.6.0
+  resolution: "@jsonjoy.com/util@npm:1.6.0"
+  peerDependencies:
+    tslib: 2
+  checksum: 7134c7d1a7500c78b8faba509bfd6eb3c96cba4c717b1d9153b0ff12bd1eaa32a44c2038cd271b17fb04f3be59813034e8cdad2eaacd6db72d5696bd269fe2c5
+  languageName: node
+  linkType: hard
+
+"@lukeed/ms@npm:^2.0.1":
+  version: 2.0.2
+  resolution: "@lukeed/ms@npm:2.0.2"
+  checksum: 6ae47ed3ebc857ffc0283cfe46129947209c770d0974eb86626138b6c194a760d08863ec593ec75a645aec133b3237b37af500739b030293e4d9a81130f4e2ae
+  languageName: node
+  linkType: hard
+
 "@mdx-js/mdx@npm:^3.1.0":
   version: 3.1.0
   resolution: "@mdx-js/mdx@npm:3.1.0"
@@ -4276,6 +4458,61 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@module-federation/error-codes@npm:0.13.1":
+  version: 0.13.1
+  resolution: "@module-federation/error-codes@npm:0.13.1"
+  checksum: dabdcd99613af8273f9d051a27490dee35b714a8208117b69182cedcb74091e15ea05c083ded7919fca4aa95d144625361545767b7450b0e290e7e21796995ba
+  languageName: node
+  linkType: hard
+
+"@module-federation/runtime-core@npm:0.13.1":
+  version: 0.13.1
+  resolution: "@module-federation/runtime-core@npm:0.13.1"
+  dependencies:
+    "@module-federation/error-codes": 0.13.1
+    "@module-federation/sdk": 0.13.1
+  checksum: 42304eebdb4744c85b8e3f0304d82d1516b50ce25242dce3c07d8f1ae5ce6e4675e42084360ca4e933b026e9b60b9de1c9b3893d0bcffe708cfb00d74be5a7e3
+  languageName: node
+  linkType: hard
+
+"@module-federation/runtime-tools@npm:0.13.1":
+  version: 0.13.1
+  resolution: "@module-federation/runtime-tools@npm:0.13.1"
+  dependencies:
+    "@module-federation/runtime": 0.13.1
+    "@module-federation/webpack-bundler-runtime": 0.13.1
+  checksum: 75e3204dd325e29468e552e779bbc8e597fec1b4c01606f972595f9fe9b0061bb69b49420edf791cbc687cf04ff4dbda35c741b29e21637169b4283296a73ecc
+  languageName: node
+  linkType: hard
+
+"@module-federation/runtime@npm:0.13.1":
+  version: 0.13.1
+  resolution: "@module-federation/runtime@npm:0.13.1"
+  dependencies:
+    "@module-federation/error-codes": 0.13.1
+    "@module-federation/runtime-core": 0.13.1
+    "@module-federation/sdk": 0.13.1
+  checksum: e32cee811ce30028eed130c0492cd5e40da71e8aadff865de367f25a09f6581907c89a4c762c38b74f0d7c85822e565c9f085772a06a874d13a3100391005ab9
+  languageName: node
+  linkType: hard
+
+"@module-federation/sdk@npm:0.13.1":
+  version: 0.13.1
+  resolution: "@module-federation/sdk@npm:0.13.1"
+  checksum: 8e97be0c62a2c5ba60683e1cd1e8966ea8b573dd5c19f9ceaba8fab677cf5c512c87b0c8a82c5f59e5a605d62d9a7289039f3e03ee7c746eab325f1f5d0dccd4
+  languageName: node
+  linkType: hard
+
+"@module-federation/webpack-bundler-runtime@npm:0.13.1":
+  version: 0.13.1
+  resolution: "@module-federation/webpack-bundler-runtime@npm:0.13.1"
+  dependencies:
+    "@module-federation/runtime": 0.13.1
+    "@module-federation/sdk": 0.13.1
+  checksum: f3c565673ebedc84151fe031261f69bb01ccc8b68f6248c1cd9ad774f138d2debef62de62e5c1ac4eb69dbdc60e3897e7c5bb331b189dc6379c56f8992ecd3fa
+  languageName: node
+  linkType: hard
+
 "@nodelib/fs.scandir@npm:2.1.5":
   version: 2.1.5
   resolution: "@nodelib/fs.scandir@npm:2.1.5"
@@ -5059,6 +5296,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@react-native/debugger-frontend@npm:0.78.2":
+  version: 0.78.2
+  resolution: "@react-native/debugger-frontend@npm:0.78.2"
+  checksum: 7f8a905589c03af301f4e262d4c8f5f78d3f47a2655d7c31ea92431afd980abf04197a078be6e57c87584edc94c9cd1a918df91a637ec9f7dd5b122577013d24
+  languageName: node
+  linkType: hard
+
 "@react-native/debugger-frontend@npm:0.79.1":
   version: 0.79.1
   resolution: "@react-native/debugger-frontend@npm:0.79.1"
@@ -5125,6 +5369,26 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@react-native/dev-middleware@npm:^0.78.0":
+  version: 0.78.2
+  resolution: "@react-native/dev-middleware@npm:0.78.2"
+  dependencies:
+    "@isaacs/ttlcache": ^1.4.1
+    "@react-native/debugger-frontend": 0.78.2
+    chrome-launcher: ^0.15.2
+    chromium-edge-launcher: ^0.2.0
+    connect: ^3.6.5
+    debug: ^2.2.0
+    invariant: ^2.2.4
+    nullthrows: ^1.1.1
+    open: ^7.0.3
+    selfsigned: ^2.4.1
+    serve-static: ^1.16.2
+    ws: ^6.2.3
+  checksum: 92836695737a4ab6d0fe52b77dfdf78778e5ceb10a8f575f4aae582850bc1704fcad78312c3c4b1e2384bf9fbdb86083ca23fd28d40d914c9a6b8419492fe8f8
+  languageName: node
+  linkType: hard
+
 "@react-native/gradle-plugin@npm:0.77.1":
   version: 0.77.1
   resolution: "@react-native/gradle-plugin@npm:0.77.1"
@@ -5625,6 +5889,144 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@rspack/binding-darwin-arm64@npm:1.3.10":
+  version: 1.3.10
+  resolution: "@rspack/binding-darwin-arm64@npm:1.3.10"
+  conditions: os=darwin & cpu=arm64
+  languageName: node
+  linkType: hard
+
+"@rspack/binding-darwin-x64@npm:1.3.10":
+  version: 1.3.10
+  resolution: "@rspack/binding-darwin-x64@npm:1.3.10"
+  conditions: os=darwin & cpu=x64
+  languageName: node
+  linkType: hard
+
+"@rspack/binding-linux-arm64-gnu@npm:1.3.10":
+  version: 1.3.10
+  resolution: "@rspack/binding-linux-arm64-gnu@npm:1.3.10"
+  conditions: os=linux & cpu=arm64 & libc=glibc
+  languageName: node
+  linkType: hard
+
+"@rspack/binding-linux-arm64-musl@npm:1.3.10":
+  version: 1.3.10
+  resolution: "@rspack/binding-linux-arm64-musl@npm:1.3.10"
+  conditions: os=linux & cpu=arm64 & libc=musl
+  languageName: node
+  linkType: hard
+
+"@rspack/binding-linux-x64-gnu@npm:1.3.10":
+  version: 1.3.10
+  resolution: "@rspack/binding-linux-x64-gnu@npm:1.3.10"
+  conditions: os=linux & cpu=x64 & libc=glibc
+  languageName: node
+  linkType: hard
+
+"@rspack/binding-linux-x64-musl@npm:1.3.10":
+  version: 1.3.10
+  resolution: "@rspack/binding-linux-x64-musl@npm:1.3.10"
+  conditions: os=linux & cpu=x64 & libc=musl
+  languageName: node
+  linkType: hard
+
+"@rspack/binding-win32-arm64-msvc@npm:1.3.10":
+  version: 1.3.10
+  resolution: "@rspack/binding-win32-arm64-msvc@npm:1.3.10"
+  conditions: os=win32 & cpu=arm64
+  languageName: node
+  linkType: hard
+
+"@rspack/binding-win32-ia32-msvc@npm:1.3.10":
+  version: 1.3.10
+  resolution: "@rspack/binding-win32-ia32-msvc@npm:1.3.10"
+  conditions: os=win32 & cpu=ia32
+  languageName: node
+  linkType: hard
+
+"@rspack/binding-win32-x64-msvc@npm:1.3.10":
+  version: 1.3.10
+  resolution: "@rspack/binding-win32-x64-msvc@npm:1.3.10"
+  conditions: os=win32 & cpu=x64
+  languageName: node
+  linkType: hard
+
+"@rspack/binding@npm:1.3.10":
+  version: 1.3.10
+  resolution: "@rspack/binding@npm:1.3.10"
+  dependencies:
+    "@rspack/binding-darwin-arm64": 1.3.10
+    "@rspack/binding-darwin-x64": 1.3.10
+    "@rspack/binding-linux-arm64-gnu": 1.3.10
+    "@rspack/binding-linux-arm64-musl": 1.3.10
+    "@rspack/binding-linux-x64-gnu": 1.3.10
+    "@rspack/binding-linux-x64-musl": 1.3.10
+    "@rspack/binding-win32-arm64-msvc": 1.3.10
+    "@rspack/binding-win32-ia32-msvc": 1.3.10
+    "@rspack/binding-win32-x64-msvc": 1.3.10
+  dependenciesMeta:
+    "@rspack/binding-darwin-arm64":
+      optional: true
+    "@rspack/binding-darwin-x64":
+      optional: true
+    "@rspack/binding-linux-arm64-gnu":
+      optional: true
+    "@rspack/binding-linux-arm64-musl":
+      optional: true
+    "@rspack/binding-linux-x64-gnu":
+      optional: true
+    "@rspack/binding-linux-x64-musl":
+      optional: true
+    "@rspack/binding-win32-arm64-msvc":
+      optional: true
+    "@rspack/binding-win32-ia32-msvc":
+      optional: true
+    "@rspack/binding-win32-x64-msvc":
+      optional: true
+  checksum: bcca29c29a417d7540c3cfd9d55bebfe003ea5a213445b6925c8c42636f0907dfc9a35f75392bb38c3d476337d2743aac9578de35b61f618342b5ccbb7abe6fa
+  languageName: node
+  linkType: hard
+
+"@rspack/core@npm:1.3.10":
+  version: 1.3.10
+  resolution: "@rspack/core@npm:1.3.10"
+  dependencies:
+    "@module-federation/runtime-tools": 0.13.1
+    "@rspack/binding": 1.3.10
+    "@rspack/lite-tapable": 1.0.1
+    caniuse-lite: ^1.0.30001717
+  peerDependencies:
+    "@swc/helpers": ">=0.5.1"
+  peerDependenciesMeta:
+    "@swc/helpers":
+      optional: true
+  checksum: 3bd1b8050ad4a1b5c9c6c4537f370227f7863f3e26afdba5a809cd7377f1c6ae18153e4e8c0bf6e171ff15c132f4462362d56f2710737074f5c553c3eb15332f
+  languageName: node
+  linkType: hard
+
+"@rspack/lite-tapable@npm:1.0.1":
+  version: 1.0.1
+  resolution: "@rspack/lite-tapable@npm:1.0.1"
+  checksum: a490aa7868178e7277573293a2b81191513d451c72f4118173f080b5c65a19618e1d37083cffa049b563433a3f772ab2f4424c0a920b04b1347ddb12fe3bcbf8
+  languageName: node
+  linkType: hard
+
+"@rspack/plugin-react-refresh@npm:1.0.0":
+  version: 1.0.0
+  resolution: "@rspack/plugin-react-refresh@npm:1.0.0"
+  dependencies:
+    error-stack-parser: ^2.0.6
+    html-entities: ^2.1.0
+  peerDependencies:
+    react-refresh: ">=0.10.0 <1.0.0"
+  peerDependenciesMeta:
+    react-refresh:
+      optional: true
+  checksum: 88212e66da7e51d99228c7d77b683ef020ba2f70ea7ed546158167eaa4d6e3fa228da2f7d660c3f7a74ad69a47bc98c67a2d11e4a403f3e1ff8523cded67c6c0
+  languageName: node
+  linkType: hard
+
 "@segment/loosely-validate-event@npm:^2.0.0":
   version: 2.0.0
   resolution: "@segment/loosely-validate-event@npm:2.0.0"
@@ -5791,6 +6193,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@sinclair/typebox@npm:^0.24.1":
+  version: 0.24.51
+  resolution: "@sinclair/typebox@npm:0.24.51"
+  checksum: fd0d855e748ef767eb19da1a60ed0ab928e91e0f358c1dd198d600762c0015440b15755e96d1176e2a0db7e09c6a64ed487828ee10dd0c3e22f61eb09c478cd0
+  languageName: node
+  linkType: hard
+
 "@sinclair/typebox@npm:^0.27.8":
   version: 0.27.8
   resolution: "@sinclair/typebox@npm:0.27.8"
@@ -5998,6 +6407,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/http-proxy@npm:^1.17.15":
+  version: 1.17.16
+  resolution: "@types/http-proxy@npm:1.17.16"
+  dependencies:
+    "@types/node": "*"
+  checksum: f5ab4afe7e3feba9d87bdddbf44e03d9a836bd2cdab679a794badbff7c4bfb6bebf46bfe22d9964eb1820e1349f2ff7807cccb20fd27cb17f03db849289e5892
+  languageName: node
+  linkType: hard
+
 "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1":
   version: 2.0.6
   resolution: "@types/istanbul-lib-coverage@npm:2.0.6"
@@ -6189,6 +6607,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/tinycolor2@npm:^1.4.0":
+  version: 1.4.6
+  resolution: "@types/tinycolor2@npm:1.4.6"
+  checksum: 50179851b32dcf78e0b4b691350a61043d8a00c3a8176d8155a257b34bb937136ff5d7950c814dca3c832673c7b6dc835f89dd154e85ccec3a4d4eac3993ed84
+  languageName: node
+  linkType: hard
+
 "@types/tough-cookie@npm:*":
   version: 4.0.5
   resolution: "@types/tough-cookie@npm:4.0.5"
@@ -6425,6 +6850,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"abstract-logging@npm:^2.0.1":
+  version: 2.0.1
+  resolution: "abstract-logging@npm:2.0.1"
+  checksum: 6967d15e5abbafd17f56eaf30ba8278c99333586fa4f7935fd80e93cfdc006c37fcc819c5d63ee373a12e6cb2d0417f7c3c6b9e42b957a25af9937d26749415e
+  languageName: node
+  linkType: hard
+
 "accepts@npm:^1.3.7, accepts@npm:^1.3.8, accepts@npm:~1.3.7":
   version: 1.3.8
   resolution: "accepts@npm:1.3.8"
@@ -6537,6 +6969,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"ajv-formats@npm:^3.0.1":
+  version: 3.0.1
+  resolution: "ajv-formats@npm:3.0.1"
+  dependencies:
+    ajv: ^8.0.0
+  peerDependencies:
+    ajv: ^8.0.0
+  peerDependenciesMeta:
+    ajv:
+      optional: true
+  checksum: f4e1fe232d67fcafc02eafe373a7a9962351e0439dd0736647ca75c93c3da23b430b6502c255ab4315410ae330d4f3013ac9fe226c40b2524ca93a58e786d086
+  languageName: node
+  linkType: hard
+
 "ajv-keywords@npm:^5.1.0":
   version: 5.1.0
   resolution: "ajv-keywords@npm:5.1.0"
@@ -6548,7 +6994,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ajv@npm:^8.0.0, ajv@npm:^8.11.0, ajv@npm:^8.9.0":
+"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.11.0, ajv@npm:^8.9.0":
   version: 8.17.1
   resolution: "ajv@npm:8.17.1"
   dependencies:
@@ -6911,6 +7357,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"atomic-sleep@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "atomic-sleep@npm:1.0.0"
+  checksum: b95275afb2f80732f22f43a60178430c468906a415a7ff18bcd0feeebc8eec3930b51250aeda91a476062a90e07132b43a1794e8d8ffcf9b650e8139be75fa36
+  languageName: node
+  linkType: hard
+
 "atomically@npm:^2.0.3":
   version: 2.0.3
   resolution: "atomically@npm:2.0.3"
@@ -6948,6 +7401,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"avvio@npm:^8.3.0":
+  version: 8.4.0
+  resolution: "avvio@npm:8.4.0"
+  dependencies:
+    "@fastify/error": ^3.3.0
+    fastq: ^1.17.1
+  checksum: 2a7fe42c41691408155752e1a3dcc52d8f1c157476869d05c0a902c73f839cebb7dea93b6bd4833d9b4c4d61d63f080517d8ce159aa5a564eba763491446489d
+  languageName: node
+  linkType: hard
+
 "axobject-query@npm:^4.1.0":
   version: 4.1.0
   resolution: "axobject-query@npm:4.1.0"
@@ -6981,6 +7444,19 @@ __metadata:
   languageName: node
   linkType: hard
 
+"babel-loader@npm:^9.2.1":
+  version: 9.2.1
+  resolution: "babel-loader@npm:9.2.1"
+  dependencies:
+    find-cache-dir: ^4.0.0
+    schema-utils: ^4.0.0
+  peerDependencies:
+    "@babel/core": ^7.12.0
+    webpack: ">=5"
+  checksum: e1858d7625ad7cc8cabe6bbb8657f957041ffb1308375f359e92aa1654f413bfbb86a281bbf7cd4f7fff374d571c637b117551deac0231d779a198d4e4e78331
+  languageName: node
+  linkType: hard
+
 "babel-plugin-istanbul@npm:^6.1.1":
   version: 6.1.1
   resolution: "babel-plugin-istanbul@npm:6.1.1"
@@ -7401,6 +7877,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"buffer-equal-constant-time@npm:^1.0.1":
+  version: 1.0.1
+  resolution: "buffer-equal-constant-time@npm:1.0.1"
+  checksum: 80bb945f5d782a56f374b292770901065bad21420e34936ecbe949e57724b4a13874f735850dd1cc61f078773c4fb5493a41391e7bda40d1fa388d6bd80daaab
+  languageName: node
+  linkType: hard
+
 "buffer-fill@npm:^1.0.0":
   version: 1.0.0
   resolution: "buffer-fill@npm:1.0.0"
@@ -7583,6 +8066,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"caniuse-lite@npm:^1.0.30001717":
+  version: 1.0.30001718
+  resolution: "caniuse-lite@npm:1.0.30001718"
+  checksum: c6598b6eb2c4358fc9f8ead8982bf5f9efdc1f29bb74948b9481d314ced10675bd0beb99771094ac52d56c2cec121049d1f18e9405cab7d81807816d1836b38a
+  languageName: node
+  linkType: hard
+
 "ccount@npm:^2.0.0":
   version: 2.0.1
   resolution: "ccount@npm:2.0.1"
@@ -7985,6 +8475,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"colorette@npm:^2.0.20":
+  version: 2.0.20
+  resolution: "colorette@npm:2.0.20"
+  checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d
+  languageName: node
+  linkType: hard
+
 "combined-stream@npm:^1.0.8":
   version: 1.0.8
   resolution: "combined-stream@npm:1.0.8"
@@ -8062,6 +8559,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"common-path-prefix@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "common-path-prefix@npm:3.0.0"
+  checksum: fdb3c4f54e51e70d417ccd950c07f757582de800c0678ca388aedefefc84982039f346f9fd9a1252d08d2da9e9ef4019f580a1d1d3a10da031e4bb3c924c5818
+  languageName: node
+  linkType: hard
+
 "commondir@npm:^1.0.1":
   version: 1.0.1
   resolution: "commondir@npm:1.0.1"
@@ -8389,7 +8893,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"cookie@npm:^0.7.2":
+"cookie@npm:^0.7.0, cookie@npm:^0.7.2":
   version: 0.7.2
   resolution: "cookie@npm:0.7.2"
   checksum: 9bf8555e33530affd571ea37b615ccad9b9a34febbf2c950c86787088eb00a8973690833b0f8ebd6b69b753c62669ea60cec89178c1fb007bf0749abed74f93e
@@ -8658,6 +9162,18 @@ __metadata:
   languageName: node
   linkType: hard
 
+"debug@npm:^4.3.6":
+  version: 4.4.1
+  resolution: "debug@npm:4.4.1"
+  dependencies:
+    ms: ^2.1.3
+  peerDependenciesMeta:
+    supports-color:
+      optional: true
+  checksum: a43826a01cda685ee4cec00fb2d3322eaa90ccadbef60d9287debc2a886be3e835d9199c80070ede75a409ee57828c4c6cd80e4b154f2843f0dc95a570dc0729
+  languageName: node
+  linkType: hard
+
 "decamelize@npm:^1.2.0":
   version: 1.2.0
   resolution: "decamelize@npm:1.2.0"
@@ -9044,6 +9560,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"ecdsa-sig-formatter@npm:1.0.11":
+  version: 1.0.11
+  resolution: "ecdsa-sig-formatter@npm:1.0.11"
+  dependencies:
+    safe-buffer: ^5.0.1
+  checksum: 207f9ab1c2669b8e65540bce29506134613dd5f122cccf1e6a560f4d63f2732d427d938f8481df175505aad94583bcb32c688737bb39a6df0625f903d6d93c03
+  languageName: node
+  linkType: hard
+
 "ee-first@npm:1.1.1":
   version: 1.1.1
   resolution: "ee-first@npm:1.1.1"
@@ -9557,6 +10082,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"estree-util-is-identifier-name@npm:^1.1.0":
+  version: 1.1.0
+  resolution: "estree-util-is-identifier-name@npm:1.1.0"
+  checksum: ec55a74708b2fdac7de8d5a1dd82caf36783993608f11b8bc0dcd3b426746ccf21ee7da86ab94e4500c292dc1dde48b7ce65e5dc41f3dc4363a499ea15db32cc
+  languageName: node
+  linkType: hard
+
 "estree-util-is-identifier-name@npm:^3.0.0":
   version: 3.0.0
   resolution: "estree-util-is-identifier-name@npm:3.0.0"
@@ -9632,6 +10164,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"eventemitter3@npm:^4.0.0":
+  version: 4.0.7
+  resolution: "eventemitter3@npm:4.0.7"
+  checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374
+  languageName: node
+  linkType: hard
+
 "eventemitter3@npm:^5.0.1":
   version: 5.0.1
   resolution: "eventemitter3@npm:5.0.1"
@@ -9639,6 +10178,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"events@npm:^3.3.0":
+  version: 3.3.0
+  resolution: "events@npm:3.3.0"
+  checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780
+  languageName: node
+  linkType: hard
+
 "example@workspace:example":
   version: 0.0.0-use.local
   resolution: "example@workspace:example"
@@ -9739,6 +10285,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"exit-hook@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "exit-hook@npm:4.0.0"
+  checksum: 5aa8b4e45fa943e7e174c25329750a0ffefb593ccc2eafd5d67e1d734b114c93cb36b5714548fb1c2a1dd90f3e9cdc606b5e788f428f780708774da444021fdc
+  languageName: node
+  linkType: hard
+
 "exit@npm:^0.1.2":
   version: 0.1.2
   resolution: "exit@npm:0.1.2"
@@ -10045,7 +10598,21 @@ __metadata:
   languageName: node
   linkType: hard
 
-"fast-deep-equal@npm:^3.1.3":
+"fast-content-type-parse@npm:^1.1.0":
+  version: 1.1.0
+  resolution: "fast-content-type-parse@npm:1.1.0"
+  checksum: c8c995b60ed30c4914aa255f012347f63fffa0c258039977b2080bb5c951dc6ef68a9243eac8ab456190642be44a31a7ada6e74d846e04f4667d40ebf778b94e
+  languageName: node
+  linkType: hard
+
+"fast-decode-uri-component@npm:^1.0.1":
+  version: 1.0.1
+  resolution: "fast-decode-uri-component@npm:1.0.1"
+  checksum: 427a48fe0907e76f0e9a2c228e253b4d8a8ab21d130ee9e4bb8339c5ba4086235cf9576831f7b20955a752eae4b525a177ff9d5825dd8d416e7726939194fbee
+  languageName: node
+  linkType: hard
+
+"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3":
   version: 3.1.3
   resolution: "fast-deep-equal@npm:3.1.3"
   checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d
@@ -10072,6 +10639,21 @@ __metadata:
   languageName: node
   linkType: hard
 
+"fast-json-stringify@npm:^5.7.0, fast-json-stringify@npm:^5.8.0":
+  version: 5.16.1
+  resolution: "fast-json-stringify@npm:5.16.1"
+  dependencies:
+    "@fastify/merge-json-schemas": ^0.1.0
+    ajv: ^8.10.0
+    ajv-formats: ^3.0.1
+    fast-deep-equal: ^3.1.3
+    fast-uri: ^2.1.0
+    json-schema-ref-resolver: ^1.0.1
+    rfdc: ^1.2.0
+  checksum: 68bdd3ec7396c8a3b760bcc5b80e10b083da51955bbb506077b9b34c7e8f79396726179f7d1afe86a3ade3ce5ad460aae1240cf4861a422fb0ccf4d3586dee5c
+  languageName: node
+  linkType: hard
+
 "fast-loops@npm:^1.1.3":
   version: 1.1.4
   resolution: "fast-loops@npm:1.1.4"
@@ -10079,6 +10661,29 @@ __metadata:
   languageName: node
   linkType: hard
 
+"fast-querystring@npm:^1.0.0":
+  version: 1.1.2
+  resolution: "fast-querystring@npm:1.1.2"
+  dependencies:
+    fast-decode-uri-component: ^1.0.1
+  checksum: 7149f82ee9ac39a9c08c7ffe435b9f6deade76ae5e3675fe1835720513e8c4bc541e666b4b7b1c0c07e08f369dcf4828d00f2bee39889a90a168e1439cf27b0b
+  languageName: node
+  linkType: hard
+
+"fast-redact@npm:^3.1.1":
+  version: 3.5.0
+  resolution: "fast-redact@npm:3.5.0"
+  checksum: ef03f0d1849da074a520a531ad299bf346417b790a643931ab4e01cb72275c8d55b60dc8512fb1f1818647b696790edefaa96704228db9f012da935faa1940af
+  languageName: node
+  linkType: hard
+
+"fast-uri@npm:^2.0.0, fast-uri@npm:^2.1.0":
+  version: 2.4.0
+  resolution: "fast-uri@npm:2.4.0"
+  checksum: 027633ccff61122bcfc2c3f45741a9e41fd68c365eb85ff8f69b305aa3918c25283daba86687e7c938aa0b0c7134c7142330722ee9fd5e0a9702fbff031fa569
+  languageName: node
+  linkType: hard
+
 "fast-uri@npm:^3.0.1":
   version: 3.0.5
   resolution: "fast-uri@npm:3.0.5"
@@ -10097,6 +10702,55 @@ __metadata:
   languageName: node
   linkType: hard
 
+"fastify-favicon@npm:^4.3.0":
+  version: 4.3.0
+  resolution: "fastify-favicon@npm:4.3.0"
+  dependencies:
+    fastify-plugin: ^4.5.0
+  checksum: c24c24c0e1d8bf5903eb3cb10ed0a36dfb26772a0f3d00a09038595990b73c999117d8aa93d44affbfc8fbe6e63d6949fc19c9437c86ffdd2f980db7ac7cf36e
+  languageName: node
+  linkType: hard
+
+"fastify-plugin@npm:^4.0.0, fastify-plugin@npm:^4.5.0, fastify-plugin@npm:^4.5.1":
+  version: 4.5.1
+  resolution: "fastify-plugin@npm:4.5.1"
+  checksum: ddd1b2d470c3acd9397c2617b5842dcf71a6f9a32f05d02be1c12e8d37b8fc03af656900cec38e2afef5e9a3dfe5f994317810f4c5e9960b127b1ca179b56f73
+  languageName: node
+  linkType: hard
+
+"fastify@npm:^4.24.3":
+  version: 4.29.1
+  resolution: "fastify@npm:4.29.1"
+  dependencies:
+    "@fastify/ajv-compiler": ^3.5.0
+    "@fastify/error": ^3.4.0
+    "@fastify/fast-json-stringify-compiler": ^4.3.0
+    abstract-logging: ^2.0.1
+    avvio: ^8.3.0
+    fast-content-type-parse: ^1.1.0
+    fast-json-stringify: ^5.8.0
+    find-my-way: ^8.0.0
+    light-my-request: ^5.11.0
+    pino: ^9.0.0
+    process-warning: ^3.0.0
+    proxy-addr: ^2.0.7
+    rfdc: ^1.3.0
+    secure-json-parse: ^2.7.0
+    semver: ^7.5.4
+    toad-cache: ^3.3.0
+  checksum: d0a4f4e47393bdddf7e183c260aa7fe489e61436558ee2e4b95b8289e694757a722c3a969cd0495e35d04a46aaf8a9947c40e450c32c96e903220895f8637c4b
+  languageName: node
+  linkType: hard
+
+"fastq@npm:^1.17.1":
+  version: 1.19.1
+  resolution: "fastq@npm:1.19.1"
+  dependencies:
+    reusify: ^1.0.4
+  checksum: 7691d1794fb84ad0ec2a185f10e00f0e1713b894e2c9c4d42f0bc0ba5f8c00e6e655a202074ca0b91b9c3d977aab7c30c41a8dc069fb5368576ac0054870a0e6
+  languageName: node
+  linkType: hard
+
 "fastq@npm:^1.6.0":
   version: 1.18.0
   resolution: "fastq@npm:1.18.0"
@@ -10216,6 +10870,27 @@ __metadata:
   languageName: node
   linkType: hard
 
+"find-cache-dir@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "find-cache-dir@npm:4.0.0"
+  dependencies:
+    common-path-prefix: ^3.0.0
+    pkg-dir: ^7.0.0
+  checksum: 52a456a80deeb27daa3af6e06059b63bdb9cc4af4d845fc6d6229887e505ba913cd56000349caa60bc3aa59dacdb5b4c37903d4ba34c75102d83cab330b70d2f
+  languageName: node
+  linkType: hard
+
+"find-my-way@npm:^8.0.0":
+  version: 8.2.2
+  resolution: "find-my-way@npm:8.2.2"
+  dependencies:
+    fast-deep-equal: ^3.1.3
+    fast-querystring: ^1.0.0
+    safe-regex2: ^3.1.0
+  checksum: bba4feafece3ef012180e561d904ead38e1f2e089bd97dbcb2c628d38cb869918626c673b08b698d22ef46265a886aa535a650574801ecab9c8eb8db5437736a
+  languageName: node
+  linkType: hard
+
 "find-up-simple@npm:^1.0.0":
   version: 1.0.0
   resolution: "find-up-simple@npm:1.0.0"
@@ -10283,6 +10958,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"flat@npm:^5.0.2":
+  version: 5.0.2
+  resolution: "flat@npm:5.0.2"
+  bin:
+    flat: cli.js
+  checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d
+  languageName: node
+  linkType: hard
+
 "flattie@npm:^1.1.1":
   version: 1.1.1
   resolution: "flattie@npm:1.1.1"
@@ -10304,6 +10988,30 @@ __metadata:
   languageName: node
   linkType: hard
 
+"flow-remove-types@npm:^2.268.0":
+  version: 2.270.0
+  resolution: "flow-remove-types@npm:2.270.0"
+  dependencies:
+    hermes-parser: 0.28.0
+    pirates: ^3.0.2
+    vlq: ^0.2.1
+  bin:
+    flow-node: flow-node
+    flow-remove-types: flow-remove-types
+  checksum: 49fb8fffd76a88f77f6345dbde12650428eba6d997b8faf42b97f858c2a3c1bb66cdd93758e1106788dafda2c56ba8c55465e58135cd346239b80db510954834
+  languageName: node
+  linkType: hard
+
+"follow-redirects@npm:^1.0.0":
+  version: 1.15.9
+  resolution: "follow-redirects@npm:1.15.9"
+  peerDependenciesMeta:
+    debug:
+      optional: true
+  checksum: 859e2bacc7a54506f2bf9aacb10d165df78c8c1b0ceb8023f966621b233717dab56e8d08baadc3ad3b9db58af290413d585c999694b7c146aaf2616340c3d2a6
+  languageName: node
+  linkType: hard
+
 "fontfaceobserver@npm:^2.1.0":
   version: 2.3.0
   resolution: "fontfaceobserver@npm:2.3.0"
@@ -10353,6 +11061,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"forwarded@npm:0.2.0, forwarded@npm:^0.2.0":
+  version: 0.2.0
+  resolution: "forwarded@npm:0.2.0"
+  checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6
+  languageName: node
+  linkType: hard
+
 "fraction.js@npm:^4.3.7":
   version: 4.3.7
   resolution: "fraction.js@npm:4.3.7"
@@ -10805,6 +11520,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"gradient-string@npm:^2.0.2":
+  version: 2.0.2
+  resolution: "gradient-string@npm:2.0.2"
+  dependencies:
+    chalk: ^4.1.2
+    tinygradient: ^1.1.5
+  checksum: 3b3cdfff83df0a82060bd3c3f32b911a0cdb22fb211a61f24ddf76660d670e79487db2a99fc0c2402c54cd7fe83cd224bf916a712e199c7f210f480313b4ce45
+  languageName: node
+  linkType: hard
+
 "h3@npm:^1.13.0":
   version: 1.13.1
   resolution: "h3@npm:1.13.1"
@@ -11240,6 +11965,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"hermes-estree@npm:0.28.0":
+  version: 0.28.0
+  resolution: "hermes-estree@npm:0.28.0"
+  checksum: d4cf9dd2b718bb0ac0681b015befb96c9a3d3709735ebb5e191bbca559cae06215fac37949cb67e3e8d2dd1af829779d2bfe389763759416dac28129b2462ffe
+  languageName: node
+  linkType: hard
+
 "hermes-parser@npm:0.23.1":
   version: 0.23.1
   resolution: "hermes-parser@npm:0.23.1"
@@ -11267,6 +11999,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"hermes-parser@npm:0.28.0":
+  version: 0.28.0
+  resolution: "hermes-parser@npm:0.28.0"
+  dependencies:
+    hermes-estree: 0.28.0
+  checksum: 42aa969f4afb29bb76f0df44f7a672c0ce67814e639882091e1c94f579f2e158dcb761885080c66af89287845073f8a115e72a143bc28e5f6ab9814397524930
+  languageName: node
+  linkType: hard
+
 "hoist-non-react-statics@npm:^3.3.0":
   version: 3.3.2
   resolution: "hoist-non-react-statics@npm:3.3.2"
@@ -11294,6 +12035,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"html-entities@npm:^2.1.0":
+  version: 2.6.0
+  resolution: "html-entities@npm:2.6.0"
+  checksum: 720643f7954019c80911430a7df2728524c07080edfe812610bfc5d8191cd772b470bee0ee151bf7426679314ae53cf28a1c845d702123714e625a8565b26567
+  languageName: node
+  linkType: hard
+
 "html-escaper@npm:3.0.3":
   version: 3.0.3
   resolution: "html-escaper@npm:3.0.3"
@@ -11329,7 +12077,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"http-errors@npm:2.0.0":
+"http-errors@npm:2.0.0, http-errors@npm:^2.0.0":
   version: 2.0.0
   resolution: "http-errors@npm:2.0.0"
   dependencies:
@@ -11363,6 +12111,31 @@ __metadata:
   languageName: node
   linkType: hard
 
+"http-proxy-middleware@npm:^3.0.3":
+  version: 3.0.5
+  resolution: "http-proxy-middleware@npm:3.0.5"
+  dependencies:
+    "@types/http-proxy": ^1.17.15
+    debug: ^4.3.6
+    http-proxy: ^1.18.1
+    is-glob: ^4.0.3
+    is-plain-object: ^5.0.0
+    micromatch: ^4.0.8
+  checksum: 1644271324a26dfe6b917c80039865177b167a66068f6f004814a39e73c0e167018034f7b8ad66683a2ea093357edfcf2c8bb13d2023d011673fa766e698f799
+  languageName: node
+  linkType: hard
+
+"http-proxy@npm:^1.18.1":
+  version: 1.18.1
+  resolution: "http-proxy@npm:1.18.1"
+  dependencies:
+    eventemitter3: ^4.0.0
+    follow-redirects: ^1.0.0
+    requires-port: ^1.0.0
+  checksum: f5bd96bf83e0b1e4226633dbb51f8b056c3e6321917df402deacec31dd7fe433914fc7a2c1831cf7ae21e69c90b3a669b8f434723e9e8b71fd68afe30737b6a5
+  languageName: node
+  linkType: hard
+
 "https-proxy-agent@npm:^5.0.1":
   version: 5.0.1
   resolution: "https-proxy-agent@npm:5.0.1"
@@ -11413,6 +12186,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"hyperdyperid@npm:^1.2.0":
+  version: 1.2.0
+  resolution: "hyperdyperid@npm:1.2.0"
+  checksum: 210029d1c86926f09109f6317d143f8b056fc38e8dd11b0c3e3205fc6c6ff8429fb55b4b9c2bce065462719ed9d34366eced387aaa0035d93eb76b306a8547ef
+  languageName: node
+  linkType: hard
+
 "hyphenate-style-name@npm:^1.0.3":
   version: 1.1.0
   resolution: "hyphenate-style-name@npm:1.1.0"
@@ -11472,6 +12252,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"image-size@npm:^1.1.1":
+  version: 1.2.1
+  resolution: "image-size@npm:1.2.1"
+  dependencies:
+    queue: 6.0.2
+  bin:
+    image-size: bin/image-size.js
+  checksum: 8601ddd4edc1db16f097f5cf585c23214e29c3b8f4d8a8f8d59b8e3bae2338c8a5073236bfff421d8541091a98a38b802ed049203c745286a69d1aac4e5bc4c7
+  languageName: node
+  linkType: hard
+
 "import-fresh@npm:^2.0.0":
   version: 2.0.0
   resolution: "import-fresh@npm:2.0.0"
@@ -11636,7 +12427,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"ipaddr.js@npm:^1.9.0":
+"ipaddr.js@npm:1.9.1, ipaddr.js@npm:^1.9.0":
   version: 1.9.1
   resolution: "ipaddr.js@npm:1.9.1"
   checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77
@@ -11825,7 +12616,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"is-glob@npm:^4.0.1, is-glob@npm:~4.0.1":
+"is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1":
   version: 4.0.3
   resolution: "is-glob@npm:4.0.3"
   dependencies:
@@ -11943,6 +12734,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"is-plain-object@npm:^5.0.0":
+  version: 5.0.0
+  resolution: "is-plain-object@npm:5.0.0"
+  checksum: e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c
+  languageName: node
+  linkType: hard
+
 "is-potential-custom-element-name@npm:^1.0.1":
   version: 1.0.1
   resolution: "is-potential-custom-element-name@npm:1.0.1"
@@ -12947,6 +13745,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"json-schema-ref-resolver@npm:^1.0.1":
+  version: 1.0.1
+  resolution: "json-schema-ref-resolver@npm:1.0.1"
+  dependencies:
+    fast-deep-equal: ^3.1.3
+  checksum: b4215cd58b2f5233d433c9f110e91b29d41c1efcb24534a0493be3cdded35acbba7f0b04e53848e6d5c748981dcddb3d09b1cdc3ec8806fce861694a2a94bec3
+  languageName: node
+  linkType: hard
+
 "json-schema-traverse@npm:^1.0.0":
   version: 1.0.0
   resolution: "json-schema-traverse@npm:1.0.0"
@@ -13016,6 +13823,45 @@ __metadata:
   languageName: node
   linkType: hard
 
+"jsonwebtoken@npm:^9.0.2":
+  version: 9.0.2
+  resolution: "jsonwebtoken@npm:9.0.2"
+  dependencies:
+    jws: ^3.2.2
+    lodash.includes: ^4.3.0
+    lodash.isboolean: ^3.0.3
+    lodash.isinteger: ^4.0.4
+    lodash.isnumber: ^3.0.3
+    lodash.isplainobject: ^4.0.6
+    lodash.isstring: ^4.0.1
+    lodash.once: ^4.0.0
+    ms: ^2.1.1
+    semver: ^7.5.4
+  checksum: fc739a6a8b33f1974f9772dca7f8493ca8df4cc31c5a09dcfdb7cff77447dcf22f4236fb2774ef3fe50df0abeb8e1c6f4c41eba82f500a804ab101e2fbc9d61a
+  languageName: node
+  linkType: hard
+
+"jwa@npm:^1.4.1":
+  version: 1.4.2
+  resolution: "jwa@npm:1.4.2"
+  dependencies:
+    buffer-equal-constant-time: ^1.0.1
+    ecdsa-sig-formatter: 1.0.11
+    safe-buffer: ^5.0.1
+  checksum: fd1a6de6c649a4b16f0775439ac9173e4bc9aa0162c7f3836699af47736ae000fafe89f232a2345170de6c14021029cb94b488f7882c6caf61e6afef5fce6494
+  languageName: node
+  linkType: hard
+
+"jws@npm:^3.2.2":
+  version: 3.2.2
+  resolution: "jws@npm:3.2.2"
+  dependencies:
+    jwa: ^1.4.1
+    safe-buffer: ^5.0.1
+  checksum: f0213fe5b79344c56cd443428d8f65c16bf842dc8cb8f5aed693e1e91d79c20741663ad6eff07a6d2c433d1831acc9814e8d7bada6a0471fbb91d09ceb2bf5c2
+  languageName: node
+  linkType: hard
+
 "kind-of@npm:^6.0.2":
   version: 6.0.3
   resolution: "kind-of@npm:6.0.3"
@@ -13060,7 +13906,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"launch-editor@npm:^2.9.1":
+"launch-editor@npm:^2.10.0, launch-editor@npm:^2.9.1":
   version: 2.10.0
   resolution: "launch-editor@npm:2.10.0"
   dependencies:
@@ -13077,6 +13923,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"light-my-request@npm:^5.11.0":
+  version: 5.14.0
+  resolution: "light-my-request@npm:5.14.0"
+  dependencies:
+    cookie: ^0.7.0
+    process-warning: ^3.0.0
+    set-cookie-parser: ^2.4.1
+  checksum: 36b251dfbdd46769e49f917338d301a3fab9e65d1aa3e732b020a4d12f36f4f7e2043b2ffeecc179c6b09211dc89fcfa3eeb3634a4e8b841c737fe02e95ce2c6
+  languageName: node
+  linkType: hard
+
 "lighthouse-logger@npm:^1.0.0":
   version: 1.4.2
   resolution: "lighthouse-logger@npm:1.4.2"
@@ -13288,6 +14145,34 @@ __metadata:
   languageName: node
   linkType: hard
 
+"lodash.includes@npm:^4.3.0":
+  version: 4.3.0
+  resolution: "lodash.includes@npm:4.3.0"
+  checksum: 71092c130515a67ab3bd928f57f6018434797c94def7f46aafa417771e455ce3a4834889f4267b17887d7f75297dfabd96231bf704fd2b8c5096dc4a913568b6
+  languageName: node
+  linkType: hard
+
+"lodash.isboolean@npm:^3.0.3":
+  version: 3.0.3
+  resolution: "lodash.isboolean@npm:3.0.3"
+  checksum: b70068b4a8b8837912b54052557b21fc4774174e3512ed3c5b94621e5aff5eb6c68089d0a386b7e801d679cd105d2e35417978a5e99071750aa2ed90bffd0250
+  languageName: node
+  linkType: hard
+
+"lodash.isinteger@npm:^4.0.4":
+  version: 4.0.4
+  resolution: "lodash.isinteger@npm:4.0.4"
+  checksum: 6034821b3fc61a2ffc34e7d5644bb50c5fd8f1c0121c554c21ac271911ee0c0502274852845005f8651d51e199ee2e0cfebfe40aaa49c7fe617f603a8a0b1691
+  languageName: node
+  linkType: hard
+
+"lodash.isnumber@npm:^3.0.3":
+  version: 3.0.3
+  resolution: "lodash.isnumber@npm:3.0.3"
+  checksum: 913784275b565346255e6ae6a6e30b760a0da70abc29f3e1f409081585875105138cda4a429ff02577e1bc0a7ae2a90e0a3079a37f3a04c3d6c5aaa532f4cab2
+  languageName: node
+  linkType: hard
+
 "lodash.isplainobject@npm:^4.0.6":
   version: 4.0.6
   resolution: "lodash.isplainobject@npm:4.0.6"
@@ -13323,6 +14208,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"lodash.once@npm:^4.0.0":
+  version: 4.1.1
+  resolution: "lodash.once@npm:4.1.1"
+  checksum: d768fa9f9b4e1dc6453be99b753906f58990e0c45e7b2ca5a3b40a33111e5d17f6edf2f768786e2716af90a8e78f8f91431ab8435f761fef00f9b0c256f6d245
+  languageName: node
+  linkType: hard
+
 "lodash.snakecase@npm:^4.1.1":
   version: 4.1.1
   resolution: "lodash.snakecase@npm:4.1.1"
@@ -13836,6 +14728,18 @@ __metadata:
   languageName: node
   linkType: hard
 
+"memfs@npm:^4.11.1":
+  version: 4.17.1
+  resolution: "memfs@npm:4.17.1"
+  dependencies:
+    "@jsonjoy.com/json-pack": ^1.0.3
+    "@jsonjoy.com/util": ^1.3.0
+    tree-dump: ^1.0.1
+    tslib: ^2.0.0
+  checksum: 33615bb45171682ba7df97ab3333b060497abe6b95c62f4c800e37a6ba437a9dbf10e5daf8bebd1e394c4e06d4c008d1b56d2930d50a22b4a8564857c6483551
+  languageName: node
+  linkType: hard
+
 "memoize-one@npm:^5.0.0":
   version: 5.2.1
   resolution: "memoize-one@npm:5.2.1"
@@ -15094,7 +15998,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"mime-types@npm:2.1.35, mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34":
+"mime-types@npm:2.1.35, mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.35, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34":
   version: 2.1.35
   resolution: "mime-types@npm:2.1.35"
   dependencies:
@@ -15574,6 +16478,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"node-modules-regexp@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "node-modules-regexp@npm:1.0.0"
+  checksum: 99541903536c5ce552786f0fca7f06b88df595e62e423c21fa86a1674ee2363dad1f7482d1bec20b4bd9fa5f262f88e6e5cb788fc56411113f2fe2e97783a3a7
+  languageName: node
+  linkType: hard
+
 "node-releases@npm:^2.0.19":
   version: 2.0.19
   resolution: "node-releases@npm:2.0.19"
@@ -15745,6 +16656,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"on-exit-leak-free@npm:^2.1.0":
+  version: 2.1.2
+  resolution: "on-exit-leak-free@npm:2.1.2"
+  checksum: 6ce7acdc7b9ceb51cf029b5239cbf41937ee4c8dcd9d4e475e1777b41702564d46caa1150a744e00da0ac6d923ab83471646a39a4470f97481cf6e2d8d253c3f
+  languageName: node
+  linkType: hard
+
 "on-finished@npm:2.4.1":
   version: 2.4.1
   resolution: "on-finished@npm:2.4.1"
@@ -15838,6 +16756,18 @@ __metadata:
   languageName: node
   linkType: hard
 
+"open@npm:^10.1.0":
+  version: 10.1.2
+  resolution: "open@npm:10.1.2"
+  dependencies:
+    default-browser: ^5.2.1
+    define-lazy-prop: ^3.0.0
+    is-inside-container: ^1.0.0
+    is-wsl: ^3.1.0
+  checksum: cb40d9786e8c679a1c647c62ad3642bbf1a8cc986c3ec970e99ed13d279c93328ea46bf756db64ea465d2d707815d4e792e7ba906830c3439cc8577cdefb8610
+  languageName: node
+  linkType: hard
+
 "open@npm:^6.2.0":
   version: 6.4.0
   resolution: "open@npm:6.4.0"
@@ -16331,6 +17261,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"path-to-regexp@npm:^6.3.0":
+  version: 6.3.0
+  resolution: "path-to-regexp@npm:6.3.0"
+  checksum: eca78602e6434a1b6799d511d375ec044e8d7e28f5a48aa5c28d57d8152fb52f3fc62fb1cfc5dfa2198e1f041c2a82ed14043d75740a2fe60e91b5089a153250
+  languageName: node
+  linkType: hard
+
 "path-type@npm:^4.0.0":
   version: 4.0.0
   resolution: "path-type@npm:4.0.0"
@@ -16394,6 +17331,52 @@ __metadata:
   languageName: node
   linkType: hard
 
+"pino-abstract-transport@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "pino-abstract-transport@npm:2.0.0"
+  dependencies:
+    split2: ^4.0.0
+  checksum: 4db0cd8a1a7b6d13e76dbb58e6adc057c39e4591c70f601f4a427c030d57dff748ab53954e1ecd3aa6e21c1a22dd38de96432606c6d906a7b9f610543bf1d6e2
+  languageName: node
+  linkType: hard
+
+"pino-std-serializers@npm:^7.0.0":
+  version: 7.0.0
+  resolution: "pino-std-serializers@npm:7.0.0"
+  checksum: 08cd1d7b7adc4cfca39e42c2d5fd21bcf4513153734e7b8fa278b0e9e9f62df78c4c202886343fe882a462539c931cb8110b661775ad7f7217c96856795b5a86
+  languageName: node
+  linkType: hard
+
+"pino@npm:^9.0.0":
+  version: 9.6.0
+  resolution: "pino@npm:9.6.0"
+  dependencies:
+    atomic-sleep: ^1.0.0
+    fast-redact: ^3.1.1
+    on-exit-leak-free: ^2.1.0
+    pino-abstract-transport: ^2.0.0
+    pino-std-serializers: ^7.0.0
+    process-warning: ^4.0.0
+    quick-format-unescaped: ^4.0.3
+    real-require: ^0.2.0
+    safe-stable-stringify: ^2.3.1
+    sonic-boom: ^4.0.1
+    thread-stream: ^3.0.0
+  bin:
+    pino: bin.js
+  checksum: ccecc1a1264dd222192d89954f22eb308ae4df4f1124e23c83758a1464933c91670fbe5e20496538ec23c430f135dd9868688309c9bf952b77f68b3adc3fc45f
+  languageName: node
+  linkType: hard
+
+"pirates@npm:^3.0.2":
+  version: 3.0.2
+  resolution: "pirates@npm:3.0.2"
+  dependencies:
+    node-modules-regexp: ^1.0.0
+  checksum: 73bc9d8a1859c0854740541d1afd0c87b62d3d63fdaec38c3ac7f57d9d70b9f6f325f5ffcac11b8935c8d9249ead41c9c59632ed098b225a96219274ca6248c8
+  languageName: node
+  linkType: hard
+
 "pirates@npm:^4.0.1, pirates@npm:^4.0.4, pirates@npm:^4.0.6":
   version: 4.0.6
   resolution: "pirates@npm:4.0.6"
@@ -16419,6 +17402,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"pkg-dir@npm:^7.0.0":
+  version: 7.0.0
+  resolution: "pkg-dir@npm:7.0.0"
+  dependencies:
+    find-up: ^6.3.0
+  checksum: 94298b20a446bfbbd66604474de8a0cdd3b8d251225170970f15d9646f633e056c80520dd5b4c1d1050c9fed8f6a9e5054b141c93806439452efe72e57562c03
+  languageName: node
+  linkType: hard
+
 "pkg-up@npm:^3.1.0":
   version: 3.1.0
   resolution: "pkg-up@npm:3.1.0"
@@ -16612,6 +17604,18 @@ __metadata:
   languageName: node
   linkType: hard
 
+"pretty-format@npm:^28.1.0":
+  version: 28.1.3
+  resolution: "pretty-format@npm:28.1.3"
+  dependencies:
+    "@jest/schemas": ^28.1.3
+    ansi-regex: ^5.0.1
+    ansi-styles: ^5.0.0
+    react-is: ^18.0.0
+  checksum: e69f857358a3e03d271252d7524bec758c35e44680287f36c1cb905187fbc82da9981a6eb07edfd8a03bc3cbeebfa6f5234c13a3d5b59f2bbdf9b4c4053e0a7f
+  languageName: node
+  linkType: hard
+
 "pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0":
   version: 29.7.0
   resolution: "pretty-format@npm:29.7.0"
@@ -16651,6 +17655,20 @@ __metadata:
   languageName: node
   linkType: hard
 
+"process-warning@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "process-warning@npm:3.0.0"
+  checksum: 1fc2eb4524041de3c18423334cc8b4e36bec5ad5472640ca1a936122c6e01da0864c1a4025858ef89aea93eabe7e77db93ccea225b10858617821cb6a8719efe
+  languageName: node
+  linkType: hard
+
+"process-warning@npm:^4.0.0":
+  version: 4.0.1
+  resolution: "process-warning@npm:4.0.1"
+  checksum: b5dca75a0b200c6d1ccd7a7ee552c627f9f40a91f3848ce5dda037ba8cf4f947a6066f4ec7a9f482817953bd018298c79a0f10507be6836090bcf69ad3061df1
+  languageName: node
+  linkType: hard
+
 "progress@npm:^2.0.3":
   version: 2.0.3
   resolution: "progress@npm:2.0.3"
@@ -16735,6 +17753,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"proxy-addr@npm:^2.0.7":
+  version: 2.0.7
+  resolution: "proxy-addr@npm:2.0.7"
+  dependencies:
+    forwarded: 0.2.0
+    ipaddr.js: 1.9.1
+  checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74
+  languageName: node
+  linkType: hard
+
 "proxy-agent@npm:6.5.0":
   version: 6.5.0
   resolution: "proxy-agent@npm:6.5.0"
@@ -16853,6 +17881,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"quick-format-unescaped@npm:^4.0.3":
+  version: 4.0.4
+  resolution: "quick-format-unescaped@npm:4.0.4"
+  checksum: 7bc32b99354a1aa46c089d2a82b63489961002bb1d654cee3e6d2d8778197b68c2d854fd23d8422436ee1fdfd0abaddc4d4da120afe700ade68bd357815b26fd
+  languageName: node
+  linkType: hard
+
 "radix3@npm:^1.1.2":
   version: 1.1.2
   resolution: "radix3@npm:1.1.2"
@@ -17206,9 +18241,11 @@ __metadata:
     "@babel/preset-typescript": 7.26.0
     "@babel/types": 7.26.9
     "@biomejs/biome": 1.9.4
+    "@callstack/repack": 5.1.0
     "@commitlint/config-conventional": 19.7.1
     "@react-native/normalize-colors": 0.78.0
     "@release-it/conventional-changelog": 8.0.2
+    "@rspack/core": 1.3.10
     "@types/jest": 29.5.14
     "@types/react": 19.0.10
     babel-plugin-tester: 11.0.4
@@ -17530,6 +18567,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"real-require@npm:^0.2.0":
+  version: 0.2.0
+  resolution: "real-require@npm:0.2.0"
+  checksum: fa060f19f2f447adf678d1376928c76379dce5f72bd334da301685ca6cdcb7b11356813332cc243c88470796bc2e2b1e2917fc10df9143dd93c2ea608694971d
+  languageName: node
+  linkType: hard
+
 "recast@npm:^0.21.0":
   version: 0.21.5
   resolution: "recast@npm:0.21.5"
@@ -18138,6 +19182,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"ret@npm:~0.4.0":
+  version: 0.4.3
+  resolution: "ret@npm:0.4.3"
+  checksum: 621c73c86db7537d91a2c47f602c7db71e11cd6f131fedb24aa2818b4d35a23377e0bc22bfa6f12295706d5b06035cf6e8d92fbd75f8f37d73b65e188b7f3fa9
+  languageName: node
+  linkType: hard
+
 "retext-latin@npm:^4.0.0":
   version: 4.0.0
   resolution: "retext-latin@npm:4.0.0"
@@ -18204,6 +19255,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"rfdc@npm:^1.2.0, rfdc@npm:^1.3.0":
+  version: 1.4.1
+  resolution: "rfdc@npm:1.4.1"
+  checksum: 3b05bd55062c1d78aaabfcea43840cdf7e12099968f368e9a4c3936beb744adb41cbdb315eac6d4d8c6623005d6f87fdf16d8a10e1ff3722e84afea7281c8d13
+  languageName: node
+  linkType: hard
+
 "rimraf@npm:^3.0.2":
   version: 3.0.2
   resolution: "rimraf@npm:3.0.2"
@@ -18341,7 +19399,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"safe-buffer@npm:5.2.1, safe-buffer@npm:~5.2.0":
+"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0":
   version: 5.2.1
   resolution: "safe-buffer@npm:5.2.1"
   checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491
@@ -18366,6 +19424,22 @@ __metadata:
   languageName: node
   linkType: hard
 
+"safe-regex2@npm:^3.1.0":
+  version: 3.1.0
+  resolution: "safe-regex2@npm:3.1.0"
+  dependencies:
+    ret: ~0.4.0
+  checksum: 4f9f7172662763619052a45599e515efc5dd10a932690f610c8ab808a4baa41be3feafefa444f7532651d721d12871a1c9a85330626cdd013b804e8f4240dff1
+  languageName: node
+  linkType: hard
+
+"safe-stable-stringify@npm:^2.3.1":
+  version: 2.5.0
+  resolution: "safe-stable-stringify@npm:2.5.0"
+  checksum: d3ce103ed43c6c2f523e39607208bfb1c73aa48179fc5be53c3aa97c118390bffd4d55e012f5393b982b65eb3e0ee954dd57b547930d3f242b0053dcdb923d17
+  languageName: node
+  linkType: hard
+
 "safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0":
   version: 2.1.2
   resolution: "safer-buffer@npm:2.1.2"
@@ -18421,6 +19495,18 @@ __metadata:
   languageName: node
   linkType: hard
 
+"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0":
+  version: 4.3.2
+  resolution: "schema-utils@npm:4.3.2"
+  dependencies:
+    "@types/json-schema": ^7.0.9
+    ajv: ^8.9.0
+    ajv-formats: ^2.1.1
+    ajv-keywords: ^5.1.0
+  checksum: d798b341ffa1371f8471629e8861af3aa99e8e15b89da2c0db28c5a80a02ee8c6ffc7daefbe28a2b8c1bc8e3f3e02d028775145d7ab3d9d1a413a9651a835466
+  languageName: node
+  linkType: hard
+
 "schema-utils@npm:^4.0.1":
   version: 4.3.0
   resolution: "schema-utils@npm:4.3.0"
@@ -18433,6 +19519,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"secure-json-parse@npm:^2.7.0":
+  version: 2.7.0
+  resolution: "secure-json-parse@npm:2.7.0"
+  checksum: d9d7d5a01fc6db6115744ba23cf9e67ecfe8c524d771537c062ee05ad5c11b64c730bc58c7f33f60bd6877f96b86f0ceb9ea29644e4040cb757f6912d4dd6737
+  languageName: node
+  linkType: hard
+
 "selfsigned@npm:^2.4.1":
   version: 2.4.1
   resolution: "selfsigned@npm:2.4.1"
@@ -18554,7 +19647,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"set-cookie-parser@npm:^2.4.8":
+"set-cookie-parser@npm:^2.4.1, set-cookie-parser@npm:^2.4.8":
   version: 2.7.1
   resolution: "set-cookie-parser@npm:2.7.1"
   checksum: 2ef8b351094712f8f7df6d63ed4b10350b24a5b515772690e7dec227df85fcef5bc451c7765f484fd9f36694ece5438d1456407d017f237d0d3351d7dbbd3587
@@ -18928,6 +20021,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"sonic-boom@npm:^4.0.1":
+  version: 4.2.0
+  resolution: "sonic-boom@npm:4.2.0"
+  dependencies:
+    atomic-sleep: ^1.0.0
+  checksum: e5e1ffdd3bcb0dee3bf6f7b2ff50dd3ffa2df864dc9d53463f33e225021a28601e91d0ec7e932739824bafd6f4ff3b7090939ac3e34ab1022e01692b41f7e8a3
+  languageName: node
+  linkType: hard
+
 "source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1":
   version: 1.2.1
   resolution: "source-map-js@npm:1.2.1"
@@ -19492,6 +20594,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"tapable@npm:^2.2.1":
+  version: 2.2.1
+  resolution: "tapable@npm:2.2.1"
+  checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51
+  languageName: node
+  linkType: hard
+
 "tar@npm:^6.1.11, tar@npm:^6.2.1":
   version: 6.2.1
   resolution: "tar@npm:6.2.1"
@@ -19609,6 +20718,24 @@ __metadata:
   languageName: node
   linkType: hard
 
+"thingies@npm:^1.20.0":
+  version: 1.21.0
+  resolution: "thingies@npm:1.21.0"
+  peerDependencies:
+    tslib: ^2
+  checksum: 283a2785e513dc892822dd0bbadaa79e873a7fc90b84798164717bf7cf837553e0b4518d8027b2307d8f6fc6caab088fa717112cd9196c6222763cc3cc1b7e79
+  languageName: node
+  linkType: hard
+
+"thread-stream@npm:^3.0.0":
+  version: 3.1.0
+  resolution: "thread-stream@npm:3.1.0"
+  dependencies:
+    real-require: ^0.2.0
+  checksum: 3c5b494ce776f832dfd696792cc865f78c1e850db93e07979349bbc1a5845857cd447aea95808892906cc0178a2fd3233907329f3376e7fc9951e2833f5b7896
+  languageName: node
+  linkType: hard
+
 "throat@npm:^5.0.0":
   version: 5.0.0
   resolution: "throat@npm:5.0.0"
@@ -19616,6 +20743,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"throttleit@npm:^2.1.0":
+  version: 2.1.0
+  resolution: "throttleit@npm:2.1.0"
+  checksum: a2003947aafc721c4a17e6f07db72dc88a64fa9bba0f9c659f7997d30f9590b3af22dadd6a41851e0e8497d539c33b2935c2c7919cf4255922509af6913c619b
+  languageName: node
+  linkType: hard
+
 "through2@npm:^2.0.1":
   version: 2.0.5
   resolution: "through2@npm:2.0.5"
@@ -19640,6 +20774,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"tinycolor2@npm:^1.0.0":
+  version: 1.6.0
+  resolution: "tinycolor2@npm:1.6.0"
+  checksum: 6df4d07fceeedc0a878d7bac47e2cd47c1ceeb1078340a9eb8a295bc0651e17c750f73d47b3028d829f30b85c15e0572c0fd4142083e4c21a30a597e47f47230
+  languageName: node
+  linkType: hard
+
 "tinyexec@npm:^0.3.0, tinyexec@npm:^0.3.2":
   version: 0.3.2
   resolution: "tinyexec@npm:0.3.2"
@@ -19657,6 +20798,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"tinygradient@npm:^1.1.5":
+  version: 1.1.5
+  resolution: "tinygradient@npm:1.1.5"
+  dependencies:
+    "@types/tinycolor2": ^1.4.0
+    tinycolor2: ^1.0.0
+  checksum: d41771d553fff884830f60029ba32163066221f1c6ea28ddf9751b10d54015fa47597bdefa164e20434ba3018e499dbd17b465fd43a095c587cac28bb7de5a0e
+  languageName: node
+  linkType: hard
+
 "tmp@npm:^0.0.33":
   version: 0.0.33
   resolution: "tmp@npm:0.0.33"
@@ -19689,6 +20840,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"toad-cache@npm:^3.3.0":
+  version: 3.7.0
+  resolution: "toad-cache@npm:3.7.0"
+  checksum: d0f2092ab2c0f3355d3537c41b13888a12996f38080e6c39907e715eb382d997ccf61baab9e8eda3f202b6c07e304728106be3631c9fe3b6c001aaf15b7bdb8f
+  languageName: node
+  linkType: hard
+
 "toidentifier@npm:1.0.1":
   version: 1.0.1
   resolution: "toidentifier@npm:1.0.1"
@@ -19724,6 +20882,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"tree-dump@npm:^1.0.1":
+  version: 1.0.2
+  resolution: "tree-dump@npm:1.0.2"
+  peerDependencies:
+    tslib: 2
+  checksum: 3b0cae6cd74c208da77dac1c65e6a212f5678fe181f1dfffbe05752be188aa88e56d5d5c33f5701d1f603ffcf33403763f722c9e8e398085cde0c0994323cb8d
+  languageName: node
+  linkType: hard
+
 "tree-kill@npm:^1.2.2":
   version: 1.2.2
   resolution: "tree-kill@npm:1.2.2"
@@ -19785,7 +20952,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2":
+"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2":
   version: 2.8.1
   resolution: "tslib@npm:2.8.1"
   checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a
@@ -19855,7 +21022,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"type-is@npm:~1.6.18":
+"type-is@npm:^1.6.18, type-is@npm:~1.6.18":
   version: 1.6.18
   resolution: "type-is@npm:1.6.18"
   dependencies:
@@ -20460,7 +21627,7 @@ __metadata:
   languageName: node
   linkType: hard
 
-"vary@npm:~1.1.2":
+"vary@npm:^1.1.2, vary@npm:~1.1.2":
   version: 1.1.2
   resolution: "vary@npm:1.1.2"
   checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b
@@ -20561,6 +21728,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"vlq@npm:^0.2.1":
+  version: 0.2.3
+  resolution: "vlq@npm:0.2.3"
+  checksum: 2231d8caeb5b2c1a438677ab029e9a94aa6fb61ab05819c72691b792aea0456dab29576aff5ae29309ee45bad0a309e832dc45173119bca1393f3b87709d8f8d
+  languageName: node
+  linkType: hard
+
 "vlq@npm:^1.0.0":
   version: 1.0.1
   resolution: "vlq@npm:1.0.1"
@@ -20892,6 +22066,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"webpack-merge@npm:^6.0.1":
+  version: 6.0.1
+  resolution: "webpack-merge@npm:6.0.1"
+  dependencies:
+    clone-deep: ^4.0.1
+    flat: ^5.0.2
+    wildcard: ^2.0.1
+  checksum: e8a604c686b944605a1c57cc7b75e886ab902dc5ffdd15259a092c5c2dd5f58868fe39f995ea4bad4f189e38843b061c4ae1eb22822d7169813f4adab571dc3d
+  languageName: node
+  linkType: hard
+
 "whatwg-encoding@npm:^2.0.0":
   version: 2.0.0
   resolution: "whatwg-encoding@npm:2.0.0"
@@ -21039,6 +22224,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"wildcard@npm:^2.0.1":
+  version: 2.0.1
+  resolution: "wildcard@npm:2.0.1"
+  checksum: e0c60a12a219e4b12065d1199802d81c27b841ed6ad6d9d28240980c73ceec6f856771d575af367cbec2982d9ae7838759168b551776577f155044f5a5ba843c
+  languageName: node
+  linkType: hard
+
 "windows-release@npm:^5.0.1":
   version: 5.1.1
   resolution: "windows-release@npm:5.1.1"
@@ -21198,6 +22390,21 @@ __metadata:
   languageName: node
   linkType: hard
 
+"ws@npm:^8.18.1":
+  version: 8.18.2
+  resolution: "ws@npm:8.18.2"
+  peerDependencies:
+    bufferutil: ^4.0.1
+    utf-8-validate: ">=5.0.2"
+  peerDependenciesMeta:
+    bufferutil:
+      optional: true
+    utf-8-validate:
+      optional: true
+  checksum: e38beae19ba4d68577ec24eb34fbfab376333fedd10f99b07511a8e842e22dbc102de39adac333a18e4c58868d0703cd5f239b04b345e22402d0ed8c34ea0aa0
+  languageName: node
+  linkType: hard
+
 "xcode@npm:^3.0.1":
   version: 3.0.1
   resolution: "xcode@npm:3.0.1"


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🔭 Outside diff range comments (1)</summary><blockquote>

<details>
<summary>package.json (1)</summary><blockquote>

`82-108`: _⚠️ Potential issue_

**Missing "repack-plugin" in the "files" array may prevent publishing.**

While the Repack plugin is built and exported, the "repack-plugin" directory isn't included in the "files" array, which determines what gets published to npm.


Add "repack-plugin" to the "files" array to ensure it's included in the published package:

```diff
  "files": [
    "src",
    "lib",
    "ios",
    "android",
    "cxx",
    "nitrogen",
    "plugin",
+   "repack-plugin",
    "web",
    "components",
    "server",
    "web-only",
    "reanimated",
    "react-native.config.js",
    "Unistyles.podspec",
    "!plugin/__tests__",
    "!plugin/src",
    "!plugin/esbuild.js",
+   "!repack-plugin/__tests__",
+   "!repack-plugin/src",
+   "!repack-plugin/esbuild.js",
    "!ios/build",
    "!android/build",
    "!android/gradle",
    "!android/gradlew",
    "!android/gradlew.bat",
    "!android/local.properties",
    "!**/*.spec.ts",
    "!**/*.spec.tsx",
    "!**/.*"
  ],
```

</blockquote></details>

</blockquote></details>

<details>
<summary>🧹 Nitpick comments (8)</summary><blockquote>

<details>
<summary>example/package.json (1)</summary><blockquote>

`22-22`: **Dependencies look good, consider version pinning for reproducibility.**

The added development dependencies for `@callstack/repack` and `@rspack/core` are appropriate for implementing the Repack plugin as described in the PR objectives. 



Consider using exact versions instead of caret ranges (`5.1.0` instead of `^5.1.0`) for better build reproducibility, especially for tooling dependencies like these.


Also applies to: 29-29

</blockquote></details>
<details>
<summary>repack-plugin/esbuild.js (1)</summary><blockquote>

`1-14`: **Build script looks good, consider adding error handling.**

The esbuild configuration is well-structured for bundling the Repack plugin's TypeScript files. The settings are appropriate for a Node.js library that will be used as a bundler plugin.



Consider adding error handling to report build failures more clearly:

```diff
-esbuild.build({
+esbuild.build({
     entryPoints: ["./repack-plugin/src/index.ts", "./repack-plugin/src/loader.ts"],
     bundle: true,
     outdir: "./repack-plugin",
     packages: "external",
     external: ["../package.json"],
     allowOverwrite: true,
     logLevel: "warning",
     platform: "node",
     minify: false,
-});
+})
+.catch(error => {
+    console.error('Build failed:', error);
+    process.exit(1);
+});
```

</blockquote></details>
<details>
<summary>repack-plugin/loader.js (1)</summary><blockquote>

`60-62`: **Consider improving the regex construction for better readability.**

The UNISTYLES_REGEX construction works but could be more explicit for better readability.


```diff
-var UNISTYLES_REGEX = new RegExp(
-  [...REACT_NATIVE_COMPONENT_NAMES, ...REPLACE_WITH_UNISTYLES_PATHS].concat(importName).join("|")
-);
+var UNISTYLES_REGEX = new RegExp(
+  [...REACT_NATIVE_COMPONENT_NAMES, ...REPLACE_WITH_UNISTYLES_PATHS, importName].join("|")
+);
```

</blockquote></details>
<details>
<summary>repack-plugin/src/loader.ts (1)</summary><blockquote>

`51-53`: **Consider handling the source map type more explicitly.**

The `@ts-ignore` comment suggests a potential type issue with `result.map`. Consider using a more type-safe approach:

```diff
- // @ts-ignore
- callback(null, result.code, result.map);
+ callback(null, result?.code || source, result?.map);
```

This ensures the callback receives valid values even if the result structure isn't exactly as expected.

</blockquote></details>
<details>
<summary>repack-plugin/index.d.ts (1)</summary><blockquote>

`13-13`: **Align constructor declaration with implementation.**

The constructor declaration here doesn't specify the default value for `ruleExcludePaths`, but the implementation in src/index.ts (line 78) provides `BASE_REPACK_EXCLUDE_PATHS` as the default. Consider updating this to align with the implementation:

```diff
- constructor({ ruleExcludePaths, unistylesPluginOptions }?: ConstructorParams);
+ constructor({ ruleExcludePaths = BASE_REPACK_EXCLUDE_PATHS, unistylesPluginOptions }?: ConstructorParams);
```

</blockquote></details>
<details>
<summary>repack-plugin/src/index.ts (3)</summary><blockquote>

`43-50`: **Remove TypeScript syntax plugin for JS files.**

The `.js` files rule is currently using the TypeScript syntax plugin, which appears unnecessary for JavaScript files:

```diff
{
    test: /\.[cm]?js$/,
    use: {
        loader: "react-native-unistyles/repack-plugin/loader.js",
        options: {
-           babelPlugins: [["@babel/plugin-syntax-typescript", { isTSX: false, allowNamespaces: true }]],
+           babelPlugins: [],
            unistylesPluginOptions,
        },
    },
},
```

---

`28-72`: **Consider a more DRY approach for module rules.**

The module rules configuration has some duplication. Consider refactoring to reduce repetition:

```typescript
const getUnistyleModuleRules = (excludePathLoader: RegExp[], unistylesPluginOptions?: UnistylesPluginOptions) => {
    const createRule = (test: RegExp, babelPlugins: any[]) => ({
        test,
        use: {
            loader: "react-native-unistyles/repack-plugin/loader.js",
            options: {
                babelPlugins,
                unistylesPluginOptions,
            },
        },
    });

    return {
        exclude: excludePathLoader,
        oneOf: [
            createRule(/\.[cm]?ts$/, [["@babel/plugin-syntax-typescript", { isTSX: false, allowNamespaces: true }]]),
            createRule(/\.[cm]?js$/, []),
            createRule(/\.[cm]?tsx$/, [["@babel/plugin-syntax-typescript", { isTSX: true, allowNamespaces: true }]]),
            createRule(/\.[cm]?jsx?$/, ["babel-plugin-syntax-hermes-parser"]),
        ],
    };
};
```

---

`88-90`: **Improve regex readability.**

The regex for the warning message uses single quotes inside a string that's already using single quotes. Consider using a template string or double quotes for better readability:

```diff
compiler.options.ignoreWarnings.push((warning) =>
-   /'`setUpTests` is available only in Jest environment\.'/.test(warning.message)
+   /`setUpTests` is available only in Jest environment\./.test(warning.message)
);
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 30bfeb1bc5e5c2ab1914eb70b96e8b44968c8c18 and e0dcc783f1f7b6242f9a26e249f9c320e5cfddaf.

</details>

<details>
<summary>⛔ Files ignored due to path filters (1)</summary>

* `yarn.lock` is excluded by `!**/yarn.lock`, `!**/*.lock`

</details>

<details>
<summary>📒 Files selected for processing (8)</summary>

* `example/package.json` (1 hunks)
* `package.json` (3 hunks)
* `repack-plugin/esbuild.js` (1 hunks)
* `repack-plugin/index.d.ts` (1 hunks)
* `repack-plugin/index.js` (1 hunks)
* `repack-plugin/loader.js` (1 hunks)
* `repack-plugin/src/index.ts` (1 hunks)
* `repack-plugin/src/loader.ts` (1 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Graph Analysis (5)</summary>

<details>
<summary>repack-plugin/src/loader.ts (3)</summary><blockquote>

<details>
<summary>plugin/index.d.ts (1)</summary>

* `UnistylesPluginOptions` (38-122)

</details>
<details>
<summary>plugin/src/consts.ts (1)</summary>

* `REPLACE_WITH_UNISTYLES_PATHS` (30-36)

</details>
<details>
<summary>repack-plugin/loader.js (5)</summary>

* `callback` (65-65)
* `options` (66-66)
* `unistylesOptions` (71-71)
* `unistylesPlugin` (72-72)
* `babelPlugins` (73-73)

</details>

</blockquote></details>
<details>
<summary>repack-plugin/loader.js (4)</summary><blockquote>

<details>
<summary>repack-plugin/src/loader.ts (1)</summary>

* `unistylesLoader` (17-56)

</details>
<details>
<summary>plugin/src/consts.ts (1)</summary>

* `REPLACE_WITH_UNISTYLES_PATHS` (30-36)

</details>
<details>
<summary>plugin/index.js (1)</summary>

* `source` (88-88)

</details>
<details>
<summary>plugin/__tests__/playground.js (1)</summary>

* `result` (6-10)

</details>

</blockquote></details>
<details>
<summary>repack-plugin/src/index.ts (2)</summary><blockquote>

<details>
<summary>plugin/index.d.ts (1)</summary>

* `UnistylesPluginOptions` (38-122)

</details>
<details>
<summary>example/babel.config.js (1)</summary>

* `unistylesPluginOptions` (5-9)

</details>

</blockquote></details>
<details>
<summary>repack-plugin/index.d.ts (2)</summary><blockquote>

<details>
<summary>repack-plugin/src/index.ts (2)</summary>

* `BASE_REPACK_EXCLUDE_PATHS` (5-19)
* `RepackUnistylePlugin` (74-92)

</details>
<details>
<summary>plugin/index.d.ts (1)</summary>

* `UnistylesPluginOptions` (38-122)

</details>

</blockquote></details>
<details>
<summary>repack-plugin/index.js (2)</summary><blockquote>

<details>
<summary>repack-plugin/src/index.ts (2)</summary>

* `BASE_REPACK_EXCLUDE_PATHS` (5-19)
* `RepackUnistylePlugin` (74-92)

</details>
<details>
<summary>example/babel.config.js (1)</summary>

* `unistylesPluginOptions` (5-9)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>🔇 Additional comments (13)</summary><blockquote>

<details>
<summary>package.json (3)</summary>

`12-16`: **Scripts for building the Repack plugin properly integrated.**

The script changes correctly include the Repack plugin build process in the prepare lifecycle.

---

`50-58`: **Export configuration for the Repack plugin and loader looks good.**

The exports are correctly configured to expose both the main plugin and the loader with their respective JavaScript and TypeScript definition files.

---

`135-135`: **Dependencies for Repack plugin development added correctly.**

The devDependencies for `@callstack/repack` and `@rspack/core` have been properly added to support the development of the Repack plugin.




Also applies to: 139-139

</details>
<details>
<summary>repack-plugin/loader.js (1)</summary>

`63-93`: **Loader implementation looks correct and follows best practices.**

The unistylesLoader function correctly implements a Repack/webpack loader pattern with proper caching, async handling, and Babel transformation configuration. The conditional application of the transform based on the regex test is efficient.

</details>
<details>
<summary>repack-plugin/src/loader.ts (3)</summary>

`13-15`: **Good optimization with the regex pre-check.**

The regex pattern efficiently combines component names and replacement paths to quickly determine if a file needs transformation, avoiding unnecessary Babel processing for files that don't require it.

---

`22-25`: **Nice performance optimization with early return.**

The early return when a file doesn't match the regex pattern is an excellent optimization that avoids unnecessary Babel processing.

---

`35-55`: **Babel transformation setup looks good.**

The Babel configuration is properly set up with the necessary options:
- Disables external configuration with `babelrc: false` and `configFile: false`
- Preserves comments with `comments: true`
- Correctly combines user-provided plugins with the unistyles plugin

This ensures consistent and isolated transformation behavior.

</details>
<details>
<summary>repack-plugin/index.js (3)</summary>

`28-42`: **Comprehensive module exclusion list.**

The `BASE_REPACK_EXCLUDE_PATHS` includes a thorough list of modules that should be excluded from processing, which helps optimize build performance by avoiding unnecessary transformations of core libraries.

---

`43-87`: **Well-structured module rules for different file types.**

The module rules configuration properly handles various file extensions (.ts, .js, .tsx, .jsx) with appropriate Babel plugin configurations for each type. The inclusion of `[cm]?` in the regex patterns ensures support for CommonJS and ES modules.

---

`97-100`: **Good warning suppression for irrelevant messages.**

The plugin correctly suppresses the "`setUpTests` is available only in Jest environment" warning, which improves the developer experience by avoiding irrelevant warnings during builds.

</details>
<details>
<summary>repack-plugin/index.d.ts (1)</summary>

`1-16`: **Declaration file structure looks good.**

The type definitions are comprehensive and correctly represent the structure of the plugin. The imports, exported types, and class declaration all match the implementation in the source file.

</details>
<details>
<summary>repack-plugin/src/index.ts (2)</summary>

`5-19`: **Comprehensive module exclusion list.**

The `BASE_REPACK_EXCLUDE_PATHS` includes all the relevant React Native and related modules that should be excluded from processing. This helps optimize build performance and avoids transformation conflicts.

---

`74-92`: **Well-structured plugin implementation.**

The `RepackUnistylePlugin` class is well-implemented with proper parameter handling, defaults, and compiler configuration. The warning ignore pattern is a nice touch to improve developer experience.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-15T15:31:33Z
user: login: jpudysz
state: CHANGES_REQUESTED
author_association: OWNER
submitted_at: 2025-05-16T12:41:16Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T13:51:51Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T13:52:04Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T14:13:56Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T14:13:59Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T14:14:03Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T14:14:06Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T14:14:18Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T14:14:41Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T14:14:46Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T14:14:59Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 2**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>repack-plugin/loader.js (1)</summary><blockquote>

`60-62`: **Consider separating regex components for maintainability.**

The regex combines multiple array sources, which is efficient but could be challenging to maintain if the component lists change. Consider adding a comment explaining the regex construction.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Lite**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 4188b7ad09151c60c75b855435a065756ea75158 and f409be565674319314eefc1f67ebbd0ffa191411.

</details>

<details>
<summary>📒 Files selected for processing (2)</summary>

* `repack-plugin/index.js` (1 hunks)
* `repack-plugin/loader.js` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* repack-plugin/index.js

</details>

<details>
<summary>🔇 Additional comments (4)</summary><blockquote>

<details>
<summary>repack-plugin/loader.js (4)</summary>

`67-70`: **Good performance optimization.**

The early return when the source doesn't match the regex is an excellent optimization. This prevents unnecessary Babel transformations when they aren't needed, improving build performance.

---

`71-73`: **Good handling of optional plugin options.**

The code properly handles optional unistyles plugin options using a conditional expression. This provides flexibility for users to configure the plugin according to their needs.

---

`74-83`: **Correctly configured Babel transformation.**

The Babel transformation is properly configured with appropriate parameters. Setting `babelrc` and `configFile` to false ensures that the transformation only uses the specified plugins without interference from project-wide configurations.

---

`63-66`: **Good loader practices implementation.**

The loader follows Webpack loader best practices by using `cacheable()` for performance optimization and `async()` for asynchronous processing. These techniques will help maintain build performance.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-16T14:18:46Z
user: login: jpudysz
state: CHANGES_REQUESTED
author_association: OWNER
submitted_at: 2025-05-17T05:14:20Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 2**

<details>
<summary>♻️ Duplicate comments (1)</summary><blockquote>

<details>
<summary>repack-plugin/esbuild.js (1)</summary><blockquote>

`1-13`: **Respect established code-style – drop the semicolons.**  

Previous reviews (see history) already asked to follow the repository rule “single quotes, no semicolons”.  
The new build script re-introduces semicolons on every line.

```diff
-const esbuild = require('esbuild');
+const esbuild = require('esbuild')

 ...
-    minify: false,
-});
+    minify: false,
+})
```

Keeping a consistent style prevents noisy diffs and makes automated linting simpler.

</blockquote></details>

</blockquote></details>

<details>
<summary>🧹 Nitpick comments (3)</summary><blockquote>

<details>
<summary>repack-plugin/esbuild.js (2)</summary><blockquote>

`7-9`: **`external` entry is ineffective – use module names, not relative paths.**

`esbuild` treats items in `external` as *package identifiers* (e.g. `"react"`, `"@babel/core"`).  
`'../package.json'` is a relative file path and will never match anything that appears in the bundle graph, so it can be removed.

```diff
-    external: ['../package.json'],
+    // No need for a custom external entry – nothing inside the plugin imports package.json
```

This avoids a misleading configuration knob.

---

`3-13`: **Add debuggability – generate a source-map.**

Because this file produces distributed code (see committed `index.js`), having `sourcemap: true` greatly eases debugging and consumer bug reports.

```diff
     bundle: true,
     outdir: './repack-plugin',
+    sourcemap: true,
```

Tiny overhead, big win in DX.

</blockquote></details>
<details>
<summary>repack-plugin/index.js (1)</summary><blockquote>

`1-152`: **Consider excluding the built artifact from the repo.**

`index.js` is a generated bundle. Checking it in yields large, noisy diffs and doubles review surface.  
Publishing via npm already includes the compiled output after the `prepare` script runs.

Recommend adding `repack-plugin/*.js` to `.gitignore` (except the TypeScript sources) and only ship it to the registry.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Lite**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between de3f33d3d712260e461483fc0e2d28d4f327ef1a and 1de1176f6be066d432ebd5f4ff07bd5ea9fcf4c9.

</details>

<details>
<summary>📒 Files selected for processing (6)</summary>

* `package.json` (4 hunks)
* `repack-plugin/esbuild.js` (1 hunks)
* `repack-plugin/index.d.ts` (1 hunks)
* `repack-plugin/index.js` (1 hunks)
* `repack-plugin/src/index.ts` (1 hunks)
* `repack-plugin/src/loader.ts` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (4)</summary>

* repack-plugin/src/loader.ts
* repack-plugin/src/index.ts
* repack-plugin/index.d.ts
* package.json

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Graph Analysis (1)</summary>

<details>
<summary>repack-plugin/index.js (3)</summary><blockquote>

<details>
<summary>repack-plugin/src/index.ts (2)</summary>

* `BASE_REPACK_EXCLUDE_PATHS` (6-20)
* `RepackUnistylePlugin` (51-63)

</details>
<details>
<summary>plugin/src/consts.ts (1)</summary>

* `REPLACE_WITH_UNISTYLES_PATHS` (30-36)

</details>
<details>
<summary>repack-plugin/src/loader.ts (1)</summary>

* `unistylesLoader` (17-56)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>🔇 Additional comments (1)</summary><blockquote>

<details>
<summary>repack-plugin/index.js (1)</summary>

`101-115`: _🛠️ Refactor suggestion_

**Ensure `compiler.options.module.rules` exists before mutating.**

When users compose multiple plugins they sometimes start with an empty `module` config.  
Defensive check avoids a runtime error:

```diff
  apply(compiler) {
-    compiler.options.module.rules.push(getUnistyleModuleRules(this.ruleExcludePaths, this.unistylesPluginOptions));
+    const rules = compiler.options.module?.rules ?? (compiler.options.module = { rules: [] }).rules
+    rules.push(getUnistyleModuleRules(this.ruleExcludePaths, this.unistylesPluginOptions))
  }
```

Keeps the plugin plug-and-play in more configs.  




> Likely an incorrect or invalid review comment.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-17T12:04:18Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-17T13:32:49Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-17T13:32:53Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-17T13:32:57Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-17T13:33:02Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-17T13:33:07Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-17T13:33:12Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-17T13:33:15Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-17T13:33:20Z
user: login: jpudysz
state: CHANGES_REQUESTED
author_association: OWNER
submitted_at: 2025-05-17T14:25:08Z
user: login: whydidoo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-17T15:21:38Z
user: login: jpudysz
state: APPROVED
author_association: OWNER
submitted_at: 2025-05-18T05:21:51Z

Review comments:
diff_hunk: @@ -19,12 +19,14 @@
     "@babel/core": "7.26.10",
     "@babel/preset-env": "7.26.9",
     "@babel/runtime": "7.27.0",
+    "@callstack/repack": "^5.1.0",
     "@react-native-community/cli": "18.0.0",
     "@react-native-community/cli-platform-android": "18.0.0",
     "@react-native-community/cli-platform-ios": "18.0.0",
     "@react-native/babel-preset": "0.79.1",
     "@react-native/metro-config": "0.79.1",
     "@react-native/typescript-config": "0.79.1",
+    "@rspack/core": "^1.3.10",
path: example/package.json
user: login: jpudysz
body: as above
created_at: 2025-05-16T12:35:58Z
author_association: OWNER
diff_hunk: @@ -19,12 +19,14 @@
     "@babel/core": "7.26.10",
     "@babel/preset-env": "7.26.9",
     "@babel/runtime": "7.27.0",
+    "@callstack/repack": "^5.1.0",
path: example/package.json
user: login: jpudysz
body: remove it from example
created_at: 2025-05-16T12:36:39Z
author_association: OWNER
diff_hunk: @@ -122,9 +132,11 @@
     "@babel/preset-typescript": "7.26.0",
     "@babel/types": "7.26.9",
     "@biomejs/biome": "1.9.4",
+    "@callstack/repack": "^5.1.0",
path: package.json
user: login: jpudysz
body: use fixed version
created_at: 2025-05-16T12:36:59Z
author_association: OWNER
diff_hunk: @@ -122,9 +132,11 @@
     "@babel/preset-typescript": "7.26.0",
     "@babel/types": "7.26.9",
     "@biomejs/biome": "1.9.4",
+    "@callstack/repack": "^5.1.0",
     "@commitlint/config-conventional": "19.7.1",
     "@react-native/normalize-colors": "0.78.0",
     "@release-it/conventional-changelog": "8.0.2",
+    "@rspack/core": "^1.3.10",
path: package.json
user: login: jpudysz
body: as above
created_at: 2025-05-16T12:37:03Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,13 @@
+const esbuild = require("esbuild");
path: repack-plugin/esbuild.js
user: login: jpudysz
body: in this repo we use single quoutes and no semicolons
created_at: 2025-05-16T12:38:16Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,16 @@
+import type { Compiler, RspackPluginInstance } from "@rspack/core";
path: repack-plugin/index.d.ts
user: login: jpudysz
body: same here, align with the repo style
created_at: 2025-05-16T12:38:48Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,92 @@
+import { getModulePaths } from "@callstack/repack";
path: repack-plugin/src/index.ts
user: login: jpudysz
body: use codebase style
created_at: 2025-05-16T12:39:24Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,92 @@
+import { getModulePaths } from "@callstack/repack";
+import type { Compiler, RspackPluginInstance } from "@rspack/core";
+import type { UnistylesPluginOptions } from "react-native-unistyles/plugin";
+
+export const BASE_REPACK_EXCLUDE_PATHS = getModulePaths([
path: repack-plugin/src/index.ts
user: login: jpudysz
body: what is it for?
created_at: 2025-05-16T12:39:44Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,92 @@
+import { getModulePaths } from "@callstack/repack";
+import type { Compiler, RspackPluginInstance } from "@rspack/core";
+import type { UnistylesPluginOptions } from "react-native-unistyles/plugin";
+
+export const BASE_REPACK_EXCLUDE_PATHS = getModulePaths([
+    "react",
+    "react-native",
+    "@react-native",
+    "react-native-macos",
+    "react-native-windows",
+    "react-native-tvos",
+    "@callstack/react-native-visionos",
+    "@module-federation",
+    "react-native-unistyles",
+    "whatwg-fetch",
+    "@callstack",
+    "react-native-nitro-modules",
+    "@callstack/repack",
+]);
+
+type RuleExcludePaths = ReturnType<typeof getModulePaths>;
+
+interface ConstructorParams {
+    ruleExcludePaths?: RuleExcludePaths;
+    unistylesPluginOptions?: UnistylesPluginOptions;
+}
+
+const getUnistyleModuleRules = (excludePathLoader: RegExp[], unistylesPluginOptions?: UnistylesPluginOptions) => ({
+    exclude: excludePathLoader,
+    oneOf: [
+        {
+            test: /\.[cm]?ts$/,
+            use: {
+                loader: "react-native-unistyles/repack-plugin/loader.js",
+                options: {
+                    babelPlugins: [["@babel/plugin-syntax-typescript", { isTSX: false, allowNamespaces: true }]],
+                    unistylesPluginOptions,
+                },
+            },
+        },
+        {
+            test: /\.[cm]?js$/,
+            use: {
+                loader: "react-native-unistyles/repack-plugin/loader.js",
+                options: {
+                    babelPlugins: [["@babel/plugin-syntax-typescript", { isTSX: false, allowNamespaces: true }]],
+                    unistylesPluginOptions,
+                },
+            },
+        },
+        {
+            test: /\.[cm]?tsx$/,
+            use: {
+                loader: "react-native-unistyles/repack-plugin/loader.js",
+                options: {
+                    babelPlugins: [["@babel/plugin-syntax-typescript", { isTSX: true, allowNamespaces: true }]],
+                    unistylesPluginOptions,
+                },
+            },
+        },
+        {
+            test: /\.[cm]?jsx?$/,
+            use: {
+                loader: "react-native-unistyles/repack-plugin/loader.js",
+                options: {
+                    babelPlugins: ["babel-plugin-syntax-hermes-parser"],
+                    unistylesPluginOptions,
+                },
+            },
+        },
+    ],
+});
+
+export class RepackUnistylePlugin implements RspackPluginInstance {
+    private ruleExcludePaths;
+    private unistylesPluginOptions;
+
+    constructor({ ruleExcludePaths = BASE_REPACK_EXCLUDE_PATHS, unistylesPluginOptions }: ConstructorParams = {}) {
+        this.ruleExcludePaths = ruleExcludePaths;
+        this.unistylesPluginOptions = unistylesPluginOptions;
+    }
+
+    apply(compiler: Compiler) {
+        compiler.options.module.rules.push(getUnistyleModuleRules(this.ruleExcludePaths, this.unistylesPluginOptions));
+
+        // ignore the 'setUpTests' warning from reanimated which is not relevant
path: repack-plugin/src/index.ts
user: login: jpudysz
body: how is it relevant to unistyles?
created_at: 2025-05-16T12:40:38Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,56 @@
+import { transform } from "@babel/core";
path: repack-plugin/src/loader.ts
user: login: jpudysz
body: use codebase style
created_at: 2025-05-16T12:40:50Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,92 @@
+import { getModulePaths } from "@callstack/repack";
+import type { Compiler, RspackPluginInstance } from "@rspack/core";
+import type { UnistylesPluginOptions } from "react-native-unistyles/plugin";
+
+export const BASE_REPACK_EXCLUDE_PATHS = getModulePaths([
path: repack-plugin/src/index.ts
user: login: whydidoo
body: https://re-pack.dev/api/utils/get-module-paths for it https://rspack.dev/config/module#ruleexclude
created_at: 2025-05-16T13:51:51Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,92 @@
+import { getModulePaths } from "@callstack/repack";
+import type { Compiler, RspackPluginInstance } from "@rspack/core";
+import type { UnistylesPluginOptions } from "react-native-unistyles/plugin";
+
+export const BASE_REPACK_EXCLUDE_PATHS = getModulePaths([
+    "react",
+    "react-native",
+    "@react-native",
+    "react-native-macos",
+    "react-native-windows",
+    "react-native-tvos",
+    "@callstack/react-native-visionos",
+    "@module-federation",
+    "react-native-unistyles",
+    "whatwg-fetch",
+    "@callstack",
+    "react-native-nitro-modules",
+    "@callstack/repack",
+]);
+
+type RuleExcludePaths = ReturnType<typeof getModulePaths>;
+
+interface ConstructorParams {
+    ruleExcludePaths?: RuleExcludePaths;
+    unistylesPluginOptions?: UnistylesPluginOptions;
+}
+
+const getUnistyleModuleRules = (excludePathLoader: RegExp[], unistylesPluginOptions?: UnistylesPluginOptions) => ({
+    exclude: excludePathLoader,
+    oneOf: [
+        {
+            test: /\.[cm]?ts$/,
+            use: {
+                loader: "react-native-unistyles/repack-plugin/loader.js",
+                options: {
+                    babelPlugins: [["@babel/plugin-syntax-typescript", { isTSX: false, allowNamespaces: true }]],
+                    unistylesPluginOptions,
+                },
+            },
+        },
+        {
+            test: /\.[cm]?js$/,
+            use: {
+                loader: "react-native-unistyles/repack-plugin/loader.js",
+                options: {
+                    babelPlugins: [["@babel/plugin-syntax-typescript", { isTSX: false, allowNamespaces: true }]],
+                    unistylesPluginOptions,
+                },
+            },
+        },
+        {
+            test: /\.[cm]?tsx$/,
+            use: {
+                loader: "react-native-unistyles/repack-plugin/loader.js",
+                options: {
+                    babelPlugins: [["@babel/plugin-syntax-typescript", { isTSX: true, allowNamespaces: true }]],
+                    unistylesPluginOptions,
+                },
+            },
+        },
+        {
+            test: /\.[cm]?jsx?$/,
+            use: {
+                loader: "react-native-unistyles/repack-plugin/loader.js",
+                options: {
+                    babelPlugins: ["babel-plugin-syntax-hermes-parser"],
+                    unistylesPluginOptions,
+                },
+            },
+        },
+    ],
+});
+
+export class RepackUnistylePlugin implements RspackPluginInstance {
+    private ruleExcludePaths;
+    private unistylesPluginOptions;
+
+    constructor({ ruleExcludePaths = BASE_REPACK_EXCLUDE_PATHS, unistylesPluginOptions }: ConstructorParams = {}) {
+        this.ruleExcludePaths = ruleExcludePaths;
+        this.unistylesPluginOptions = unistylesPluginOptions;
+    }
+
+    apply(compiler: Compiler) {
+        compiler.options.module.rules.push(getUnistyleModuleRules(this.ruleExcludePaths, this.unistylesPluginOptions));
+
+        // ignore the 'setUpTests' warning from reanimated which is not relevant
path: repack-plugin/src/index.ts
user: login: whydidoo
body: It is not relevant 
created_at: 2025-05-16T13:52:04Z
author_association: CONTRIBUTOR
diff_hunk: @@ -122,9 +132,11 @@
     "@babel/preset-typescript": "7.26.0",
     "@babel/types": "7.26.9",
     "@biomejs/biome": "1.9.4",
+    "@callstack/repack": "^5.1.0",
     "@commitlint/config-conventional": "19.7.1",
     "@react-native/normalize-colors": "0.78.0",
     "@release-it/conventional-changelog": "8.0.2",
+    "@rspack/core": "^1.3.10",
path: package.json
user: login: whydidoo
body: it has been fixed
created_at: 2025-05-16T14:13:55Z
author_association: CONTRIBUTOR
diff_hunk: @@ -122,9 +132,11 @@
     "@babel/preset-typescript": "7.26.0",
     "@babel/types": "7.26.9",
     "@biomejs/biome": "1.9.4",
+    "@callstack/repack": "^5.1.0",
path: package.json
user: login: whydidoo
body: it has been fixed
created_at: 2025-05-16T14:13:59Z
author_association: CONTRIBUTOR
diff_hunk: @@ -19,12 +19,14 @@
     "@babel/core": "7.26.10",
     "@babel/preset-env": "7.26.9",
     "@babel/runtime": "7.27.0",
+    "@callstack/repack": "^5.1.0",
path: example/package.json
user: login: whydidoo
body: it has been fixed
created_at: 2025-05-16T14:14:03Z
author_association: CONTRIBUTOR
diff_hunk: @@ -19,12 +19,14 @@
     "@babel/core": "7.26.10",
     "@babel/preset-env": "7.26.9",
     "@babel/runtime": "7.27.0",
+    "@callstack/repack": "^5.1.0",
     "@react-native-community/cli": "18.0.0",
     "@react-native-community/cli-platform-android": "18.0.0",
     "@react-native-community/cli-platform-ios": "18.0.0",
     "@react-native/babel-preset": "0.79.1",
     "@react-native/metro-config": "0.79.1",
     "@react-native/typescript-config": "0.79.1",
+    "@rspack/core": "^1.3.10",
path: example/package.json
user: login: whydidoo
body: it has been fixed
created_at: 2025-05-16T14:14:05Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,13 @@
+const esbuild = require("esbuild");
path: repack-plugin/esbuild.js
user: login: whydidoo
body: it has been fixed
created_at: 2025-05-16T14:14:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,16 @@
+import type { Compiler, RspackPluginInstance } from "@rspack/core";
path: repack-plugin/index.d.ts
user: login: whydidoo
body: it has been fixed
created_at: 2025-05-16T14:14:41Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,92 @@
+import { getModulePaths } from "@callstack/repack";
path: repack-plugin/src/index.ts
user: login: whydidoo
body: it has been fixed
created_at: 2025-05-16T14:14:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,56 @@
+import { transform } from "@babel/core";
path: repack-plugin/src/loader.ts
user: login: whydidoo
body: it has been fixed
created_at: 2025-05-16T14:14:59Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,95 @@
+"use strict";
+var __defProp = Object.defineProperty;
+var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
+var __getOwnPropNames = Object.getOwnPropertyNames;
+var __hasOwnProp = Object.prototype.hasOwnProperty;
+var __export = (target, all) => {
+  for (var name in all)
+    __defProp(target, name, { get: all[name], enumerable: true });
+};
+var __copyProps = (to, from, except, desc) => {
+  if (from && typeof from === "object" || typeof from === "function") {
+    for (let key of __getOwnPropNames(from))
+      if (!__hasOwnProp.call(to, key) && key !== except)
+        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
+  }
+  return to;
+};
+var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
+
+// repack-plugin/src/loader.ts
+var loader_exports = {};
+__export(loader_exports, {
+  default: () => unistylesLoader
+});
+module.exports = __toCommonJS(loader_exports);
+var import_core = require("@babel/core");
+
+// plugin/src/consts.ts
+var REACT_NATIVE_COMPONENT_NAMES = [
+  "ActivityIndicator",
+  "View",
+  "Text",
+  "Image",
+  "ImageBackground",
+  "KeyboardAvoidingView",
+  "Pressable",
+  "ScrollView",
+  "FlatList",
+  "SectionList",
+  "Switch",
+  "TextInput",
+  "RefreshControl",
+  "TouchableHighlight",
+  "TouchableOpacity",
+  "VirtualizedList",
+  "Animated"
+  // Modal - there is no exposed native handle
+  // TouchableWithoutFeedback - can't accept a ref
+];
+var REPLACE_WITH_UNISTYLES_PATHS = [
+  "react-native-reanimated/src/component",
+  "react-native-reanimated/lib/module/component",
+  "react-native-gesture-handler/lib/module/components",
+  "react-native-gesture-handler/lib/commonjs/components",
+  "react-native-gesture-handler/src/components"
+];
+
+// repack-plugin/src/loader.ts
+var importName = "react-native-unistyles";
+var UNISTYLES_REGEX = new RegExp(
+  [...REACT_NATIVE_COMPONENT_NAMES, ...REPLACE_WITH_UNISTYLES_PATHS, importName].join("|")
+);
+function unistylesLoader(source) {
+  this.cacheable();
+  const callback = this.async();
+  const options = this.getOptions();
+  if (!UNISTYLES_REGEX.test(source)) {
+    callback(null, source);
+    return;
+  }
+  const unistylesOptions = options.unistylesPluginOptions;
+  const unistylesPlugin = unistylesOptions ? ["react-native-unistyles/plugin", unistylesOptions] : "react-native-unistyles/plugin";
+  const babelPlugins = options.babelPlugins ?? [];
+  (0, import_core.transform)(
+    source,
+    {
+      filename: this.resourcePath,
+      babelrc: false,
+      configFile: false,
+      compact: false,
+      comments: true,
+      plugins: [...babelPlugins, unistylesPlugin]
+    },
+    (err, result) => {
+      if (err) {
+        callback(err);
+        return;
+      }
+      if (result?.code && result.map) {
+        callback(null, result.code, result.map);
+      }
+      return;
+    }
path: repack-plugin/loader.js
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Fix potential callback issue where the loader might hang.**

There's a potential issue in the error handling logic where the callback might not be called in certain scenarios. If `result` exists but either `result.code` or `result.map` is falsy, the function returns without calling the callback, which could cause the loader to hang.

```diff
if (result?.code && result.map) {
  callback(null, result.code, result.map);
+} else {
+  callback(null, source);
}
-return;
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
      if (result?.code && result.map) {
        callback(null, result.code, result.map);
      } else {
        callback(null, source);
      }
    }
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In repack-plugin/loader.js around lines 89 to 93, the callback is only called if
both result.code and result.map are truthy, but if either is falsy, the function
returns without calling the callback, potentially causing the loader to hang.
Modify the logic to ensure the callback is always called regardless of the
presence of result.code or result.map, passing appropriate arguments or errors
to prevent hanging.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-16T14:18:46Z
author_association: NONE
diff_hunk: @@ -0,0 +1,95 @@
+"use strict";
+var __defProp = Object.defineProperty;
+var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
+var __getOwnPropNames = Object.getOwnPropertyNames;
+var __hasOwnProp = Object.prototype.hasOwnProperty;
+var __export = (target, all) => {
+  for (var name in all)
+    __defProp(target, name, { get: all[name], enumerable: true });
+};
+var __copyProps = (to, from, except, desc) => {
+  if (from && typeof from === "object" || typeof from === "function") {
+    for (let key of __getOwnPropNames(from))
+      if (!__hasOwnProp.call(to, key) && key !== except)
+        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
+  }
+  return to;
+};
+var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
+
+// repack-plugin/src/loader.ts
+var loader_exports = {};
+__export(loader_exports, {
+  default: () => unistylesLoader
+});
+module.exports = __toCommonJS(loader_exports);
+var import_core = require("@babel/core");
+
+// plugin/src/consts.ts
+var REACT_NATIVE_COMPONENT_NAMES = [
+  "ActivityIndicator",
+  "View",
+  "Text",
+  "Image",
+  "ImageBackground",
+  "KeyboardAvoidingView",
+  "Pressable",
+  "ScrollView",
+  "FlatList",
+  "SectionList",
+  "Switch",
+  "TextInput",
+  "RefreshControl",
+  "TouchableHighlight",
+  "TouchableOpacity",
+  "VirtualizedList",
+  "Animated"
+  // Modal - there is no exposed native handle
+  // TouchableWithoutFeedback - can't accept a ref
+];
+var REPLACE_WITH_UNISTYLES_PATHS = [
+  "react-native-reanimated/src/component",
+  "react-native-reanimated/lib/module/component",
+  "react-native-gesture-handler/lib/module/components",
+  "react-native-gesture-handler/lib/commonjs/components",
+  "react-native-gesture-handler/src/components"
+];
path: repack-plugin/loader.js
user: login: coderabbitai[bot]
body: _💡 Verification agent_

<details>
<summary>🧩 Analysis chain</summary>

**Verify component list completeness.**

The list of React Native components appears comprehensive but may need updates as new components are added to React Native. Ensure there's a process to keep this list in sync with React Native's component library.

---

🏁 Script executed:

```shell
#!/bin/bash
# Check if there are React Native components missing from the list
# This is a basic check that looks for common patterns in the project

echo "Searching for potential React Native components in the codebase..."
# Look for import patterns that might indicate React Native components being used
rg "import \{.*\} from 'react-native'" -g "*.{ts,tsx,js,jsx}" | grep -v "repack-plugin"
```

Length of output: 6472

---



</details>

**Include missing React Native components in REACT_NATIVE_COMPONENT_NAMES**

We’ve identified two components imported from `react-native` that aren’t in this list:

• StatusBar  
• Button  

Please update `repack-plugin/loader.js` (lines 29–56) accordingly and consider adding a note or automation to keep this list in sync with React Native’s official component API.

Files/locations to update:
- repack-plugin/loader.js (around `REACT_NATIVE_COMPONENT_NAMES`)

Suggested diff:
```diff
 var REACT_NATIVE_COMPONENT_NAMES = [
+  "Button",
+  "StatusBar",
   "ActivityIndicator",
   "View",
   "Text",
   "Image",
   "ImageBackground",
   "KeyboardAvoidingView",
   "Pressable",
   "ScrollView",
   "FlatList",
   "SectionList",
   "Switch",
   "TextInput",
   "RefreshControl",
   "TouchableHighlight",
   "TouchableOpacity",
   "VirtualizedList",
   "Animated"
   // Modal - there is no exposed native handle
   // TouchableWithoutFeedback - can't accept a ref
 ];
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
var REACT_NATIVE_COMPONENT_NAMES = [
  "Button",
  "StatusBar",
  "ActivityIndicator",
  "View",
  "Text",
  "Image",
  "ImageBackground",
  "KeyboardAvoidingView",
  "Pressable",
  "ScrollView",
  "FlatList",
  "SectionList",
  "Switch",
  "TextInput",
  "RefreshControl",
  "TouchableHighlight",
  "TouchableOpacity",
  "VirtualizedList",
  "Animated"
  // Modal - there is no exposed native handle
  // TouchableWithoutFeedback - can't accept a ref
];
var REPLACE_WITH_UNISTYLES_PATHS = [
  "react-native-reanimated/src/component",
  "react-native-reanimated/lib/module/component",
  "react-native-gesture-handler/lib/module/components",
  "react-native-gesture-handler/lib/commonjs/components",
  "react-native-gesture-handler/src/components"
];
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In repack-plugin/loader.js around lines 29 to 56, the
REACT_NATIVE_COMPONENT_NAMES array is missing the StatusBar and Button
components which are imported from react-native. Add "StatusBar" and "Button" to
the REACT_NATIVE_COMPONENT_NAMES list to ensure completeness. Additionally,
consider adding a comment or implementing a process to regularly update this
list to stay in sync with React Native's official components.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-16T14:18:46Z
author_association: NONE
diff_hunk: @@ -0,0 +1,15 @@
+import type { getModulePaths } from '@callstack/repack';
path: repack-plugin/index.d.ts
user: login: jpudysz
body: remove semicolons
created_at: 2025-05-17T05:10:26Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,13 @@
+const esbuild = require('esbuild');
path: repack-plugin/esbuild.js
user: login: jpudysz
body: remove semicolons
created_at: 2025-05-17T05:10:36Z
author_association: OWNER
diff_hunk: @@ -46,6 +47,15 @@
       "types": "./plugin/index.d.ts",
       "default": "./plugin/index.js"
     },
+    "./repack-plugin": {
+      "import": "./repack-plugin/index.js",
+      "types": "./repack-plugin/index.d.ts",
+      "default": "./repack-plugin/index.js"
+    },
+    "./repack-plugin/loader.js": {
path: package.json
user: login: jpudysz
body: I would prefer to add index.js and export here loader like in babel plugin
created_at: 2025-05-17T05:11:04Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,15 @@
+import type { getModulePaths } from '@callstack/repack';
+import type { Compiler, RspackPluginInstance } from '@rspack/core';
+import type { UnistylesPluginOptions } from 'react-native-unistyles/plugin';
+export declare const BASE_REPACK_EXCLUDE_PATHS: RegExp[];
path: repack-plugin/index.d.ts
user: login: jpudysz
body: add one enter between each type
created_at: 2025-05-17T05:11:33Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,15 @@
+import type { getModulePaths } from '@callstack/repack';
+import type { Compiler, RspackPluginInstance } from '@rspack/core';
+import type { UnistylesPluginOptions } from 'react-native-unistyles/plugin';
+export declare const BASE_REPACK_EXCLUDE_PATHS: RegExp[];
path: repack-plugin/index.d.ts
user: login: jpudysz
body: Also in this repo we use `Array<RegExp>` instead of `RegExp[]`
created_at: 2025-05-17T05:11:59Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,64 @@
+import { getModulePaths } from '@callstack/repack';
path: repack-plugin/src/index.ts
user: login: jpudysz
body: remove semicolons
created_at: 2025-05-17T05:13:05Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,64 @@
+import { getModulePaths } from '@callstack/repack';
+import type { Compiler, RspackPluginInstance } from '@rspack/core';
+import type { UnistylesPluginOptions } from 'react-native-unistyles/plugin';
+
+export const BASE_REPACK_EXCLUDE_PATHS = getModulePaths([
+    'react',
+    'react-native',
+    '@react-native',
+    'react-native-macos',
+    'react-native-windows',
+    'react-native-tvos',
+    '@callstack/react-native-visionos',
+    '@module-federation',
+    'react-native-unistyles',
+    'whatwg-fetch',
+    '@callstack',
+    'react-native-nitro-modules',
+    '@callstack/repack',
+]);
+
+type RuleExcludePaths = ReturnType<typeof getModulePaths>;
+
+interface ConstructorParams {
+    ruleExcludePaths?: RuleExcludePaths;
+    unistylesPluginOptions?: UnistylesPluginOptions;
+}
+
+
path: repack-plugin/src/index.ts
user: login: jpudysz
body: remove extra enter
created_at: 2025-05-17T05:13:20Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,64 @@
+import { getModulePaths } from '@callstack/repack';
+import type { Compiler, RspackPluginInstance } from '@rspack/core';
+import type { UnistylesPluginOptions } from 'react-native-unistyles/plugin';
+
+export const BASE_REPACK_EXCLUDE_PATHS = getModulePaths([
+    'react',
+    'react-native',
+    '@react-native',
+    'react-native-macos',
+    'react-native-windows',
+    'react-native-tvos',
+    '@callstack/react-native-visionos',
+    '@module-federation',
+    'react-native-unistyles',
+    'whatwg-fetch',
+    '@callstack',
+    'react-native-nitro-modules',
+    '@callstack/repack',
+]);
+
+type RuleExcludePaths = ReturnType<typeof getModulePaths>;
+
+interface ConstructorParams {
+    ruleExcludePaths?: RuleExcludePaths;
+    unistylesPluginOptions?: UnistylesPluginOptions;
+}
+
+
+
+const getUnistyleModuleRules = (excludePathLoader: RegExp[], unistylesPluginOptions?: UnistylesPluginOptions) => {
path: repack-plugin/src/index.ts
user: login: jpudysz
body: `Array<T>`
created_at: 2025-05-17T05:13:29Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,57 @@
+import { transform } from '@babel/core';
path: repack-plugin/src/loader.ts
user: login: jpudysz
body: remove semicolons
created_at: 2025-05-17T05:13:48Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,57 @@
+import { transform } from '@babel/core';
+import type { LoaderContext } from '@rspack/core';
+import type { UnistylesPluginOptions } from '../../plugin';
+import { REACT_NATIVE_COMPONENT_NAMES, REPLACE_WITH_UNISTYLES_PATHS } from '../../plugin/src/consts';
+
+const importName = 'react-native-unistyles';
+
+interface UnistylesLoaderOptions {
+    babelPlugins?: string[];
path: repack-plugin/src/loader.ts
user: login: jpudysz
body: `Array<T>`
created_at: 2025-05-17T05:14:00Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,152 @@
+"use strict";
+var __defProp = Object.defineProperty;
+var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
+var __getOwnPropNames = Object.getOwnPropertyNames;
+var __hasOwnProp = Object.prototype.hasOwnProperty;
+var __export = (target, all) => {
+  for (var name in all)
+    __defProp(target, name, { get: all[name], enumerable: true });
+};
+var __copyProps = (to, from, except, desc) => {
+  if (from && typeof from === "object" || typeof from === "function") {
+    for (let key of __getOwnPropNames(from))
+      if (!__hasOwnProp.call(to, key) && key !== except)
+        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
+  }
+  return to;
+};
+var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
+
+// repack-plugin/src/index.ts
+var index_exports = {};
+__export(index_exports, {
+  BASE_REPACK_EXCLUDE_PATHS: () => BASE_REPACK_EXCLUDE_PATHS,
+  RepackUnistylePlugin: () => RepackUnistylePlugin,
+  default: () => index_default
+});
+module.exports = __toCommonJS(index_exports);
+var import_repack = require("@callstack/repack");
+
+// repack-plugin/src/loader.ts
+var import_core = require("@babel/core");
+
+// plugin/src/consts.ts
+var REACT_NATIVE_COMPONENT_NAMES = [
+  "ActivityIndicator",
+  "View",
+  "Text",
+  "Image",
+  "ImageBackground",
+  "KeyboardAvoidingView",
+  "Pressable",
+  "ScrollView",
+  "FlatList",
+  "SectionList",
+  "Switch",
+  "TextInput",
+  "RefreshControl",
+  "TouchableHighlight",
+  "TouchableOpacity",
+  "VirtualizedList",
+  "Animated"
+  // Modal - there is no exposed native handle
+  // TouchableWithoutFeedback - can't accept a ref
+];
+var REPLACE_WITH_UNISTYLES_PATHS = [
+  "react-native-reanimated/src/component",
+  "react-native-reanimated/lib/module/component",
+  "react-native-gesture-handler/lib/module/components",
+  "react-native-gesture-handler/lib/commonjs/components",
+  "react-native-gesture-handler/src/components"
+];
+
+// repack-plugin/src/loader.ts
+var importName = "react-native-unistyles";
+var UNISTYLES_REGEX = new RegExp(
+  [...REACT_NATIVE_COMPONENT_NAMES, ...REPLACE_WITH_UNISTYLES_PATHS, importName].join("|")
+);
path: repack-plugin/index.js
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Escape the dynamic RegExp pieces to avoid false positives.**

`.` and other meta-characters in the joined strings (`react-native-reanimated/src/component`, etc.) are interpreted by RegExp, so  
`react-native-reanimatedXsrcXcomponent` would also match.

A safer construction:

```diff
-const UNISTYLES_REGEX = new RegExp(
-  [...REACT_NATIVE_COMPONENT_NAMES, ...REPLACE_WITH_UNISTYLES_PATHS, importName].join("|")
-);
+const escape = (s) => s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
+const UNISTYLES_REGEX = new RegExp(
+  [...REACT_NATIVE_COMPONENT_NAMES, ...REPLACE_WITH_UNISTYLES_PATHS, importName]
+    .map(escape)
+    .join('|')
+)
```

Prevents accidental matches and keeps the loader fast.  



<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
// repack-plugin/src/loader.ts
var importName = "react-native-unistyles";

const escape = (s) => s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');

const UNISTYLES_REGEX = new RegExp(
  [...REACT_NATIVE_COMPONENT_NAMES, ...REPLACE_WITH_UNISTYLES_PATHS, importName]
    .map(escape)
    .join("|")
);
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In repack-plugin/index.js around lines 63 to 67, the dynamic parts used to build
the RegExp are not escaped, causing meta-characters like '.' to be interpreted
and potentially matching unintended strings. To fix this, escape all special
RegExp characters in each string before joining them into the pattern. This
ensures the RegExp matches only the exact intended strings and avoids false
positives.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-17T12:04:16Z
author_association: NONE
diff_hunk: @@ -0,0 +1,152 @@
+"use strict";
+var __defProp = Object.defineProperty;
+var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
+var __getOwnPropNames = Object.getOwnPropertyNames;
+var __hasOwnProp = Object.prototype.hasOwnProperty;
+var __export = (target, all) => {
+  for (var name in all)
+    __defProp(target, name, { get: all[name], enumerable: true });
+};
+var __copyProps = (to, from, except, desc) => {
+  if (from && typeof from === "object" || typeof from === "function") {
+    for (let key of __getOwnPropNames(from))
+      if (!__hasOwnProp.call(to, key) && key !== except)
+        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
+  }
+  return to;
+};
+var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
+
+// repack-plugin/src/index.ts
+var index_exports = {};
+__export(index_exports, {
+  BASE_REPACK_EXCLUDE_PATHS: () => BASE_REPACK_EXCLUDE_PATHS,
+  RepackUnistylePlugin: () => RepackUnistylePlugin,
+  default: () => index_default
+});
+module.exports = __toCommonJS(index_exports);
+var import_repack = require("@callstack/repack");
+
+// repack-plugin/src/loader.ts
+var import_core = require("@babel/core");
+
+// plugin/src/consts.ts
+var REACT_NATIVE_COMPONENT_NAMES = [
+  "ActivityIndicator",
+  "View",
+  "Text",
+  "Image",
+  "ImageBackground",
+  "KeyboardAvoidingView",
+  "Pressable",
+  "ScrollView",
+  "FlatList",
+  "SectionList",
+  "Switch",
+  "TextInput",
+  "RefreshControl",
+  "TouchableHighlight",
+  "TouchableOpacity",
+  "VirtualizedList",
+  "Animated"
+  // Modal - there is no exposed native handle
+  // TouchableWithoutFeedback - can't accept a ref
+];
+var REPLACE_WITH_UNISTYLES_PATHS = [
+  "react-native-reanimated/src/component",
+  "react-native-reanimated/lib/module/component",
+  "react-native-gesture-handler/lib/module/components",
+  "react-native-gesture-handler/lib/commonjs/components",
+  "react-native-gesture-handler/src/components"
+];
+
+// repack-plugin/src/loader.ts
+var importName = "react-native-unistyles";
+var UNISTYLES_REGEX = new RegExp(
+  [...REACT_NATIVE_COMPONENT_NAMES, ...REPLACE_WITH_UNISTYLES_PATHS, importName].join("|")
+);
+function unistylesLoader(source) {
+  this.cacheable();
+  const callback = this.async();
+  const options = this.getOptions();
+  if (!UNISTYLES_REGEX.test(source)) {
+    callback(null, source);
+    return;
+  }
+  const unistylesOptions = options.unistylesPluginOptions;
+  const unistylesPlugin = unistylesOptions ? ["react-native-unistyles/plugin", unistylesOptions] : "react-native-unistyles/plugin";
+  const babelPlugins = options.babelPlugins ?? [];
+  (0, import_core.transform)(
+    source,
+    {
+      filename: this.resourcePath,
+      babelrc: false,
+      configFile: false,
+      compact: false,
+      comments: true,
+      plugins: [...babelPlugins, unistylesPlugin]
+    },
+    (err, result) => {
+      if (err) {
+        callback(err);
+        return;
+      }
+      callback(null, result.code, result.map);
+      return;
+    }
path: repack-plugin/index.js
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Guard against `result === null` to avoid a crash.**

`@babel/core.transform` can return `null` when the file is ignored; dereferencing `result.code` in that case will throw.

```diff
-      callback(null, result.code, result.map);
+      if (!result) {
+        callback(null, source)          // fall back to original
+        return
+      }
+      callback(null, result.code, result.map);
```

This makes the loader resilient when Babel decides not to transform.  



<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
    (err, result) => {
      if (err) {
        callback(err);
        return;
      }
      if (!result) {
        // Babel chose not to transform; fall back to original source
        callback(null, source);
        return;
      }
      callback(null, result.code, result.map);
      return;
    }
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In repack-plugin/index.js around lines 89 to 96, the callback dereferences
result.code and result.map without checking if result is null, which can cause a
crash if Babel returns null for ignored files. Add a guard to check if result is
null before accessing its properties; if result is null, call the callback with
null values or handle it gracefully to prevent errors.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-17T12:04:16Z
author_association: NONE
diff_hunk: @@ -0,0 +1,15 @@
+import type { getModulePaths } from '@callstack/repack';
path: repack-plugin/index.d.ts
user: login: whydidoo
body: it has been fixed
created_at: 2025-05-17T13:32:49Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,13 @@
+const esbuild = require('esbuild');
path: repack-plugin/esbuild.js
user: login: whydidoo
body: it has been fixed
created_at: 2025-05-17T13:32:53Z
author_association: CONTRIBUTOR
diff_hunk: @@ -46,6 +47,15 @@
       "types": "./plugin/index.d.ts",
       "default": "./plugin/index.js"
     },
+    "./repack-plugin": {
+      "import": "./repack-plugin/index.js",
+      "types": "./repack-plugin/index.d.ts",
+      "default": "./repack-plugin/index.js"
+    },
+    "./repack-plugin/loader.js": {
path: package.json
user: login: whydidoo
body: it has been fixed
created_at: 2025-05-17T13:32:57Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,15 @@
+import type { getModulePaths } from '@callstack/repack';
+import type { Compiler, RspackPluginInstance } from '@rspack/core';
+import type { UnistylesPluginOptions } from 'react-native-unistyles/plugin';
+export declare const BASE_REPACK_EXCLUDE_PATHS: RegExp[];
path: repack-plugin/index.d.ts
user: login: whydidoo
body: it has been fixed
created_at: 2025-05-17T13:33:02Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,64 @@
+import { getModulePaths } from '@callstack/repack';
+import type { Compiler, RspackPluginInstance } from '@rspack/core';
+import type { UnistylesPluginOptions } from 'react-native-unistyles/plugin';
+
+export const BASE_REPACK_EXCLUDE_PATHS = getModulePaths([
+    'react',
+    'react-native',
+    '@react-native',
+    'react-native-macos',
+    'react-native-windows',
+    'react-native-tvos',
+    '@callstack/react-native-visionos',
+    '@module-federation',
+    'react-native-unistyles',
+    'whatwg-fetch',
+    '@callstack',
+    'react-native-nitro-modules',
+    '@callstack/repack',
+]);
+
+type RuleExcludePaths = ReturnType<typeof getModulePaths>;
+
+interface ConstructorParams {
+    ruleExcludePaths?: RuleExcludePaths;
+    unistylesPluginOptions?: UnistylesPluginOptions;
+}
+
+
path: repack-plugin/src/index.ts
user: login: whydidoo
body: it has been fixed
created_at: 2025-05-17T13:33:07Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,64 @@
+import { getModulePaths } from '@callstack/repack';
+import type { Compiler, RspackPluginInstance } from '@rspack/core';
+import type { UnistylesPluginOptions } from 'react-native-unistyles/plugin';
+
+export const BASE_REPACK_EXCLUDE_PATHS = getModulePaths([
+    'react',
+    'react-native',
+    '@react-native',
+    'react-native-macos',
+    'react-native-windows',
+    'react-native-tvos',
+    '@callstack/react-native-visionos',
+    '@module-federation',
+    'react-native-unistyles',
+    'whatwg-fetch',
+    '@callstack',
+    'react-native-nitro-modules',
+    '@callstack/repack',
+]);
+
+type RuleExcludePaths = ReturnType<typeof getModulePaths>;
+
+interface ConstructorParams {
+    ruleExcludePaths?: RuleExcludePaths;
+    unistylesPluginOptions?: UnistylesPluginOptions;
+}
+
+
+
+const getUnistyleModuleRules = (excludePathLoader: RegExp[], unistylesPluginOptions?: UnistylesPluginOptions) => {
path: repack-plugin/src/index.ts
user: login: whydidoo
body: done
created_at: 2025-05-17T13:33:12Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,57 @@
+import { transform } from '@babel/core';
path: repack-plugin/src/loader.ts
user: login: whydidoo
body: done
created_at: 2025-05-17T13:33:15Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,57 @@
+import { transform } from '@babel/core';
+import type { LoaderContext } from '@rspack/core';
+import type { UnistylesPluginOptions } from '../../plugin';
+import { REACT_NATIVE_COMPONENT_NAMES, REPLACE_WITH_UNISTYLES_PATHS } from '../../plugin/src/consts';
+
+const importName = 'react-native-unistyles';
+
+interface UnistylesLoaderOptions {
+    babelPlugins?: string[];
path: repack-plugin/src/loader.ts
user: login: whydidoo
body: done
created_at: 2025-05-17T13:33:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,13 @@
+const esbuild = require('esbuild');
path: repack-plugin/esbuild.js
user: login: jpudysz
body: i still can see semicolons
created_at: 2025-05-17T14:24:53Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,56 @@
+import { transform } from "@babel/core"
path: repack-plugin/src/loader.ts
user: login: jpudysz
body: singlequotes
created_at: 2025-05-17T14:25:00Z
author_association: OWNER
diff_hunk: @@ -0,0 +1,56 @@
+import { transform } from "@babel/core"
path: repack-plugin/src/loader.ts
user: login: whydidoo
body: done, probably it was fixed by my IDE
created_at: 2025-05-17T15:21:38Z
author_association: CONTRIBUTOR

PR comments:
user: login: vercel[bot]
created_at: 2025-05-15T15:29:13Z
body: [vc]: #WUWzuO6QAFag3bTDRzqmqMFUX0FW0bAoIF+UV0rH/j4=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJyZWFjdC1uYXRpdmUtdW5pc3R5bGVzLTIuMCIsInJvb3REaXJlY3RvcnkiOiJkb2NzIiwiaW5zcGVjdG9yVXJsIjoiaHR0cHM6Ly92ZXJjZWwuY29tL2phY2VrLXMtdGVhbS9yZWFjdC1uYXRpdmUtdW5pc3R5bGVzLTIuMC9INjNtRlZCa3AxWUZmVnhiNkFwMVhnc2ExcGRyIiwicHJldmlld1VybCI6InJlYWN0LW5hdGl2ZS11bmlzdHlsZXMtMjAtZ2l0LWZvcmstd2h5ZGlkb28tMzBkZTUyLWphY2VrLXMtdGVhbS52ZXJjZWwuYXBwIiwibmV4dENvbW1pdFN0YXR1cyI6IkRFUExPWUVEIiwibGl2ZUZlZWRiYWNrIjp7InJlc29sdmVkIjowLCJ1bnJlc29sdmVkIjowLCJ0b3RhbCI6MCwibGluayI6InJlYWN0LW5hdGl2ZS11bmlzdHlsZXMtMjAtZ2l0LWZvcmstd2h5ZGlkb28tMzBkZTUyLWphY2VrLXMtdGVhbS52ZXJjZWwuYXBwIn19LHsibmFtZSI6InJlYWN0LW5hdGl2ZS11bmlzdHlsZXMtZG9jcyIsInJvb3REaXJlY3RvcnkiOiJkb2NzIiwiaW5zcGVjdG9yVXJsIjoiaHR0cHM6Ly92ZXJjZWwuY29tL2phY2VrLXMtdGVhbS9yZWFjdC1uYXRpdmUtdW5pc3R5bGVzLWRvY3MvR0FWSzJHRDNKSm9INUxQcm1iZmpFWmpVUkY0eiIsInByZXZpZXdVcmwiOiJyZWFjdC1uYXRpdmUtdW5pc3R5bGVzLWRvY3MtZ2l0LWZvcmstd2h5ZGlkLWRhMmEyNC1qYWNlay1zLXRlYW0udmVyY2VsLmFwcCIsIm5leHRDb21taXRTdGF0dXMiOiJERVBMT1lFRCIsImxpdmVGZWVkYmFjayI6eyJyZXNvbHZlZCI6MCwidW5yZXNvbHZlZCI6MCwidG90YWwiOjAsImxpbmsiOiJyZWFjdC1uYXRpdmUtdW5pc3R5bGVzLWRvY3MtZ2l0LWZvcmstd2h5ZGlkLWRhMmEyNC1qYWNlay1zLXRlYW0udmVyY2VsLmFwcCJ9fV19
**The latest updates on your projects**. Learn more about [Vercel for Git ↗︎](https://vercel.link/github-learn-more)

| Name | Status | Preview | Comments | Updated (UTC) |
| :--- | :----- | :------ | :------- | :------ |
| **react-native-unistyles-2.0** | ✅ Ready ([Inspect](https://vercel.com/jacek-s-team/react-native-unistyles-2.0/H63mFVBkp1YFfVxb6Ap1Xgsa1pdr)) | [Visit Preview](https://react-native-unistyles-20-git-fork-whydidoo-30de52-jacek-s-team.vercel.app) | 💬 [**Add feedback**](https://vercel.live/open-feedback/react-native-unistyles-20-git-fork-whydidoo-30de52-jacek-s-team.vercel.app?via=pr-comment-feedback-link) | May 18, 2025 7:36am |
| **react-native-unistyles-docs** | ✅ Ready ([Inspect](https://vercel.com/jacek-s-team/react-native-unistyles-docs/GAVK2GD3JJoH5LPrmbfjEZjURF4z)) | [Visit Preview](https://react-native-unistyles-docs-git-fork-whydid-da2a24-jacek-s-team.vercel.app) | 💬 [**Add feedback**](https://vercel.live/open-feedback/react-native-unistyles-docs-git-fork-whydid-da2a24-jacek-s-team.vercel.app?via=pr-comment-feedback-link) | May 18, 2025 7:36am |



author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-05-15T15:29:15Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

```markdown
## Walkthrough

This update introduces a new `repack-plugin` directory containing a plugin and loader for integrating `react-native-unistyles` with the Rspack bundler. The build process is automated using a new esbuild script. TypeScript types, loader logic, and plugin configuration are provided. Package and configuration files are updated to support these additions.

## Changes

| File(s)                               | Change Summary                                                                                                                                                                                                                           |
|-------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `package.json`                      | Added build script for repack plugin, updated `prepare` script, included `repack-plugin` in exports and files, and added devDependencies for `@callstack/repack` and `@rspack/core`.                                                     |
| `repack-plugin/esbuild.js`          | New script to bundle TypeScript source in `repack-plugin` using esbuild with Node.js target and external package handling.                                                                         |
| `repack-plugin/index.d.ts`           | New TypeScript declaration file exporting plugin types, loader types, and configuration interfaces for the repack plugin.                                                                          |
| `repack-plugin/index.js`             | New CommonJS module exporting constant exclusion paths, plugin class, loader function, and helper functions for unistyles integration with Repack bundler.                                         |
| `repack-plugin/src/index.ts`         | New TypeScript plugin implementation for Rspack bundler, defining exclusion paths, plugin class, loader import, and module rules for unistyles integration.                                          |
| `repack-plugin/src/loader.ts`        | New loader module implementing Babel-based transformation for relevant source files, with configuration for unistyles and Babel plugins.                                                           |
| `biome.json`                        | Updated Biome configuration to include `repack-plugin/**/*.ts` in files to be processed.                                                                                                           |
```

<!-- walkthrough_end -->

<!-- announcements_start -->

> [!NOTE]
> <details>
> <summary>⚡️ AI Code Reviews for VS Code, Cursor, Windsurf</summary>
> 
> CodeRabbit now has a plugin for VS Code, Cursor and Windsurf. This brings AI code reviews directly in the code editor. Each commit is reviewed immediately, finding bugs before the PR is raised. Seamless context handoff to your AI code agent ensures that you can easily incorporate review feedback.
> Learn more [here](http://coderabbit.ai/ide).
> 
> </details>

---

> [!NOTE]
> <details>
> <summary>⚡️ Faster reviews with caching</summary>
> 
> CodeRabbit now supports caching for code and dependencies, helping speed up reviews. This means quicker feedback, reduced wait times, and a smoother review experience overall. Cached data is encrypted and stored securely. This feature will be automatically enabled for all accounts on May 16th. To opt out, configure `Review - Disable Cache` at either the organization or repository level. If you prefer to disable all data retention across your organization, simply turn off the `Data Retention` setting under your Organization Settings.
> Enjoy the performance boost—your workflow just got faster.
> 
> </details>

<!-- announcements_end -->

---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Lite**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 523c04049813ad67f789620abc8906de94538cc2 and 30a5259e95cc024d17652866411c9bf905a6d6b5.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `repack-plugin/index.d.ts` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* repack-plugin/index.d.ts

</details>

</details>
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=jpudysz/react-native-unistyles&utm_content=789):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE
user: login: jpudysz
created_at: 2025-05-16T12:42:37Z
body: Thank for the the PR 🙏🏼 , can you show me a screenshot of the working app?

Please also check Code Rabbit comments. Some of them makes sense.
author_association: OWNER
user: login: whydidoo
created_at: 2025-05-16T19:36:19Z
body: > Thank for the the PR 🙏🏼 , can you show me a screenshot of the working app?
> 
> Please also check Code Rabbit comments. Some of them makes sense.

This video is with integration RN in android as SDK(.aar) files

https://github.com/user-attachments/assets/69bd16e0-24aa-417f-9226-3cd9cf3a0e1f


author_association: CONTRIBUTOR
user: login: jpudysz
created_at: 2025-05-18T05:32:13Z
body: One more error from CI 
author_association: OWNER
user: login: whydidoo
created_at: 2025-05-18T07:41:13Z
body: > One more error from CI

fixed
author_association: CONTRIBUTOR
user: login: jpudysz
created_at: 2025-05-20T07:19:22Z
body: Released in `3.0.0-nightly-20250520`
author_association: OWNER