realm-js icon indicating copy to clipboard operation
realm-js copied to clipboard

TypeError: Cannot read property 'size' of undefined

Open ronkorland opened this issue 10 months ago • 27 comments

How frequently does the bug occur?

Always

Description

realm: 12.6.2 @realm/react: 0.6.2

I created one react-native page inside react-router; the page uses the useQuery hook to query my model. When I open the page, I always get the following error: TypeError: Cannot read property 'size' of undefined

Stacktrace & log output

get (Results.js:62)
getOwnPropertyDescriptor (OrderedCollection.js:62)
set (OrderedCollection.js:51)
Results (Results.js:33)
objects (Realm.js:691)
getObjects (index.cjs:151)
anonymous (index.cjs:182)
mountMemo (ReactNativeRenderer-dev.js:11819)
useMemo (ReactNativeRenderer-dev.js:12275)
useMemo (react.development.js:1650)
useQuery (index.cjs:181)
RealmDbPage (MainPage.tsx:30)
renderWithHooks (ReactNativeRenderer-dev.js:10867)
mountIndeterminateComponent (ReactNativeRenderer-dev.js:14789)
beginWork (ReactNativeRenderer-dev.js:16628)
beginWork$1 (ReactNativeRenderer-dev.js:22324)
performUnitOfWork (ReactNativeRenderer-dev.js:21471)
workLoopSync (ReactNativeRenderer-dev.js:21398)
renderRootSync (ReactNativeRenderer-dev.js:21369)
performSyncWorkOnRoot (ReactNativeRenderer-dev.js:21020)
flushSyncCallbacks (ReactNativeRenderer-dev.js:6262)
flushSyncCallbacksOnlyInLegacyMode (ReactNativeRenderer-dev.js:6241)
batchedUpdates$1 (ReactNativeRenderer-dev.js:21076)
batchedUpdates (ReactNativeRenderer-dev.js:2750)
_receiveRootNodeIDEvent (ReactNativeRenderer-dev.js:2892)
receiveTouches (ReactNativeRenderer-dev.js:3012)
__callFunction (MessageQueue.js:433)
anonymous (MessageQueue.js:113)
__guard (MessageQueue.js:365)
callFunctionReturnFlushedQueue (MessageQueue.js:112)

Can you reproduce the bug?

Always

Reproduction Steps

No response

Version

12.6.2

What services are you using?

Local Database only

Are you using encryption?

No

Platform OS and version(s)

Android 13

Build environment

Which debugger for React Native: Flipper

Cocoapods version

No response

ronkorland avatar Apr 17 '24 14:04 ronkorland

➤ PM Bot commented:

Jira ticket: RJS-2805

sync-by-unito[bot] avatar Apr 17 '24 14:04 sync-by-unito[bot]

@ronkorland Please provide a reproduction case or at least a stack trace.

kneth avatar Apr 22 '24 09:04 kneth

@kneth the following stack trace is not enough?

get (Results.js:62)
getOwnPropertyDescriptor (OrderedCollection.js:62)
set (OrderedCollection.js:51)
Results (Results.js:33)
objects (Realm.js:691)
getObjects (index.cjs:151)
anonymous (index.cjs:182)
mountMemo (ReactNativeRenderer-dev.js:11819)
useMemo (ReactNativeRenderer-dev.js:12275)
useMemo (react.development.js:1650)
useQuery (index.cjs:181)
RealmDbPage (MainPage.tsx:30)
renderWithHooks (ReactNativeRenderer-dev.js:10867)
mountIndeterminateComponent (ReactNativeRenderer-dev.js:14789)
beginWork (ReactNativeRenderer-dev.js:16628)
beginWork$1 (ReactNativeRenderer-dev.js:22324)
performUnitOfWork (ReactNativeRenderer-dev.js:21471)
workLoopSync (ReactNativeRenderer-dev.js:21398)
renderRootSync (ReactNativeRenderer-dev.js:21369)
performSyncWorkOnRoot (ReactNativeRenderer-dev.js:21020)
flushSyncCallbacks (ReactNativeRenderer-dev.js:6262)
flushSyncCallbacksOnlyInLegacyMode (ReactNativeRenderer-dev.js:6241)
batchedUpdates$1 (ReactNativeRenderer-dev.js:21076)
batchedUpdates (ReactNativeRenderer-dev.js:2750)
_receiveRootNodeIDEvent (ReactNativeRenderer-dev.js:2892)
receiveTouches (ReactNativeRenderer-dev.js:3012)
__callFunction (MessageQueue.js:433)
anonymous (MessageQueue.js:113)
__guard (MessageQueue.js:365)
callFunctionReturnFlushedQueue (MessageQueue.js:112)

ronkorland avatar Apr 22 '24 10:04 ronkorland

I have the same issue. Seems to have happened after upgrading to react-native 0.74.

Mitch528 avatar Apr 23 '24 17:04 Mitch528

I'm using react-native: 0.73.6 but I have the same issue

ronkorland avatar Apr 25 '24 09:04 ronkorland

I'm using react-native: 0.73.6 but I have the same issue

@ronkorland

do you have this@babel/plugin-transform-private-methods in your babel config? That seems to have been the cause, at least it was for me.

I fixed it by removing it and adding this to my config instead:

  overrides: [
    {
      exclude: /node_modules\/realm\//,
      plugins: [['@babel/plugin-transform-private-methods', { loose: true }]],
    },
  ],

Mitch528 avatar Apr 26 '24 17:04 Mitch528

I'm using react-native: 0.73.6 but I have the same issue

@ronkorland

do you have this@babel/plugin-transform-private-methods in your babel config? That seems to have been the cause, at least it was for me.

I fixed it by removing it and adding this to my config instead:

  overrides: [
    {
      exclude: /node_modules\/realm\//,
      plugins: [['@babel/plugin-transform-private-methods', { loose: true }]],
    },
  ],

Thanks for reply, me babel config looks like this:

module.exports = {
  presets: [["module:@react-native/babel-preset"]],
  env: {
    production: {
      plugins: ["react-native-paper/babel"],
    },
  },
  plugins: [
    "@realm/babel-plugin",
    "babel-plugin-transform-typescript-metadata",
    ["@babel/plugin-proposal-decorators", { legacy: true }],
    ["@babel/plugin-transform-class-properties", { loose: true }],
    ["@babel/plugin-transform-private-property-in-object", { loose: true }],
  ],
  overrides: [
    {
      exclude: /node_modules\/realm\//,
      plugins: [["@babel/plugin-transform-private-methods", { loose: true }]],
    },
  ],
};

But I still have the same error. untitled

ronkorland avatar Apr 30 '24 09:04 ronkorland

@ronkorland

did you reset the cache after editing the config file?

react-native start --reset-cache

Mitch528 avatar Apr 30 '24 17:04 Mitch528

@Mitch528 I try now with the reset cache but I still have the same error

ronkorland avatar May 01 '24 08:05 ronkorland

Hello @ronkorland did you happen to resolve this issue?

vijaykharage7 avatar May 10 '24 11:05 vijaykharage7

No

ronkorland avatar May 10 '24 14:05 ronkorland

Hello. Is any update on this issue?

alexandrubichis avatar May 23 '24 11:05 alexandrubichis

Hello. After upgrading react-native from 0.73.5 to 0.74.1 I encounter the same error. My error was because of module:metro-react-native-babel-preset from babel config preset instead of module:@react-native/babel-preset. No need to install @babel/plugin-transform-private-methods package because is installed as dependency from @babel/preset-env.

package.json:

{
  "name": "Test",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "android": "react-native run-android",
    "ios": "react-native run-ios",
    "lint": "eslint .",
    "start": "react-native start",
    "test": "jest"
  },
  "dependencies": {
    "react": "18.2.0",
    "react-native": "0.74.1",
    "realm": "12.6.2"
  },
  "devDependencies": {
    "@babel/core": "^7.20.0",
    "@babel/preset-env": "^7.20.0",
    "@babel/runtime": "^7.20.0",
    "@react-native/babel-preset": "0.74.83",
    "@react-native/eslint-config": "0.74.83",
    "@react-native/metro-config": "0.74.83",
    "@react-native/typescript-config": "0.74.83",
    "@types/react": "^18.2.6",
    "@types/react-test-renderer": "^18.0.0",
    "babel-jest": "^29.6.3",
    "eslint": "^8.19.0",
    "jest": "^29.6.3",
    "prettier": "2.8.8",
    "react-test-renderer": "18.2.0",
    "typescript": "5.0.4"
  },
  "engines": {
    "node": ">=18"
  }
}

babel.config.js:

module.exports = {
  presets: ['module:@react-native/babel-preset'],
};

alexandrubichis avatar May 28 '24 10:05 alexandrubichis

Hello everyone, I've tried to figure it out this problem in last days but without success so far. The only thing that did work for me was to modify the code of the module from:

...
get length() {
    return this.internal.size();
}
...

to:

...
get length() {
    return this.internal ? this.internal.size() : 0;
}
...

in node_modules/realm/dist/bundle.react-native.js file. Strangely enough, trying the official expo-example (https://github.com/realm/realm-js/tree/main/templates/expo-template), the library does work without issues. I've tried to configure my project with the exact same packages but the issue was still there until I made this change. I don't know if the issue is really code-related, but I think the target file to update to make this change is this one https://github.com/realm/realm-js/blob/v12.0.0/packages/realm/src/Results.ts (lines 78 to 80). Let me know what you think about it.

davide-ciraolo avatar May 29 '24 17:05 davide-ciraolo

@davide-ciraolo You have a couple of interesting observations, and I am curious to understand the impact of Babel is (https://github.com/realm/realm-js/issues/6626#issuecomment-2079834900 is hinting that Babel might have a negative impact). Can you share your Babel configuration?

kneth avatar May 30 '24 08:05 kneth

Hello @kneth yesterday after putting in place my "temporary fix" I continued developing my application and had another problem with the FlastList component that I ended up fixing following this answer: https://github.com/facebook/react-native/issues/36828#issuecomment-1589462227. Today I removed my "temporary fix" and after resetting the cache with npx expo start --reset-cache I tested the app again, and Realm worked without problems. Probably, this means that installing @babel/plugin-transform-flow-strip-types (with npm install @babel/plugin-transform-flow-strip-types --save-dev or yarn add -D @babel/plugin-transform-flow-strip-types) and putting it on the first line of babel plugins configuration fixed this issue. Here is my actual babel configuration:

module.exports = function(api) {
  api.cache(true);
  return {
    presets: ['babel-preset-expo'],
    plugins: [
      '@babel/plugin-transform-flow-strip-types',
      ["@babel/plugin-transform-private-methods", { "loose": true }],
      ["@babel/plugin-transform-class-properties", { "loose": true }],
      ["@babel/plugin-transform-private-property-in-object", { "loose": true }],
      "@realm/babel-plugin", ["@babel/plugin-proposal-decorators", { legacy: true}],
      [
        'module-resolver',
          {
            alias: {
              'rn-crypto': 'react-native-quick-crypto',
              'stream': 'stream-browserify',
              'buffer': '@craftzdog/react-native-buffer',
            }
          }
      ]
    ]
  };
};

I hope it will be helpful for anyone having the same issue, although I'm not sure what's going on with babel under the hood. In fact, the expo-realm example works without using the @babel/plugin-transform-flow-strip-types as you can see in the example's babel configuration:

module.exports = function (api) {
  api.cache(true);
  return {
    presets: ["babel-preset-expo"],
    plugins: ["@realm/babel-plugin", ["@babel/plugin-proposal-decorators", { legacy: true }]],
  };
};

davide-ciraolo avatar May 30 '24 18:05 davide-ciraolo

Olá a todos, tentei resolver esse problema nos últimos dias, mas sem sucesso até agora. A única coisa que funcionou para mim foi modificar o código do módulo de:

...
get length() {
    return this.internal.size();
}
...

pára:

...
get length() {
    return this.internal ? this.internal.size() : 0;
}
...

no arquivo node_modules/realm/dist/bundle.react-native.js. Estranhamente, tentando o expo-example oficial ( https://github.com/realm/realm-js/tree/main/templates/expo-template ), a biblioteca funciona sem problemas. Tentei configurar meu projeto exatamente com os mesmos pacotes, mas o problema ainda persistia até que fiz essa alteração. Não sei se o problema está realmente relacionado ao código, mas acho que o arquivo de destino está atualizado para fazer essa alteração é este https://github.com/realm/realm-js/blob/v12.0.0/packages /realm /src/Results.ts (linhas 78 a 80). Deixe-me saber o que você pensa sobre isso.

solution valid for min using react-native-cli in version v0.74.2 🚀

Weverson-Luan avatar Jun 14 '24 02:06 Weverson-Luan

hmm, facing the same issue

I've resolved it by adding exclude: /node_modules\/realm\// into babel config

as I see, the main issue was having this plugin'@babel/plugin-proposal-private-methods'

ApacheEx avatar Jun 24 '24 07:06 ApacheEx

hmm, facing the same issue

I've resolved it by adding exclude: /node_modules\/realm\// into babel config

as I see, the main issue was having this plugin'@babel/plugin-proposal-private-methods'

can you please share your babel config settings?

ronkorland avatar Jun 24 '24 07:06 ronkorland

@ronkorland here it is

module.exports = {
  presets: [
    '@babel/preset-env',
    '@babel/preset-typescript',
    '@babel/preset-react',
    'module:@react-native/babel-preset',
    '@babel/preset-flow',
  ],
  plugins: [
    '@babel/plugin-transform-react-jsx',
    '@babel/plugin-syntax-class-properties',
    '@babel/plugin-proposal-nullish-coalescing-operator',
    ['@babel/plugin-proposal-private-methods', { loose: true }],
    ['@babel/plugin-transform-private-property-in-object', { loose: true }],
  ],
  exclude: /node_modules\/realm\//,
};

ApacheEx avatar Jun 24 '24 07:06 ApacheEx

@ApacheEx after adding exclude: /node_modules/realm//, into babel config when I run my application my app is crashing can you please help me

ShaileshRajesh avatar Jul 26 '24 12:07 ShaileshRajesh

@ShaileshRajesh

my app is crashing

Can you provide the error message and a stack trace?

kneth avatar Aug 05 '24 08:08 kneth

@kneth On excluding realm from babel.config.js I get the below error

Error: ReferenceError: Property 'RealmInExpoGoError' doesn't exist, js engine: hermes

Babel Config:

  presets: [
    'module:@react-native/babel-preset',
  ],
  plugins: [
    [
      'module:react-native-dotenv',
      {
        moduleName: '@env',
        path: '.env',
      },
    ],
    '@babel/plugin-transform-react-jsx',
    '@babel/plugin-syntax-class-properties',
    '@babel/plugin-proposal-nullish-coalescing-operator',
    ['@babel/plugin-proposal-private-methods', { loose: true }],
    ['@babel/plugin-transform-private-property-in-object', { loose: true }],
  ],
  exclude: /node_modules\/realm\//,
};```

tekvyy avatar Aug 07 '24 00:08 tekvyy

Removing the plugin

['@babel/plugin-proposal-private-methods', { loose: true }],

Fixed my issue.

tekvyy avatar Aug 07 '24 00:08 tekvyy

@tekvyy

The plugin is deprecated so I assume it is safe to remove it 😄

kneth avatar Aug 07 '24 09:08 kneth

Hi everyone,

I encountered a similar issue with Babel configuration in my React Native project using Realm, and I found a solution that worked for me:

module.exports = {
  presets: ['module:metro-react-native-babel-preset'],
  plugins: [
    ['@babel/plugin-proposal-decorators', { legacy: true }],
    ['@babel/plugin-transform-private-methods', { loose: true }],
],
};

arthurkaizer avatar Aug 09 '24 18:08 arthurkaizer

Hi everyone, are there any updates on this one?

ohhyunjin avatar Sep 24 '24 21:09 ohhyunjin