diff --git a/examples/expo-example/.storybook/index.tsx b/examples/expo-example/.storybook/index.tsx index 0ae2e77234..465d5dabc0 100644 --- a/examples/expo-example/.storybook/index.tsx +++ b/examples/expo-example/.storybook/index.tsx @@ -1,3 +1,4 @@ +import { Text } from 'react-native'; import { view } from './storybook.requires'; import AsyncStorage from '@react-native-async-storage/async-storage'; @@ -14,6 +15,15 @@ const StorybookUIRoot = view.getStorybookUI({ // initialSelection: { kind: 'TextInput', name: 'Basic' }, // onDeviceUI: false, // host: '192.168.1.69', + /* theme: { + brand: { + image: { + uri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/React-icon.svg/512px-React-icon.svg.png', + width: 25, + height: 25, + } , + }, + }, */ }); export default StorybookUIRoot; diff --git a/examples/expo-example/package.json b/examples/expo-example/package.json index 7e770e2be5..a753c2d7cc 100644 --- a/examples/expo-example/package.json +++ b/examples/expo-example/package.json @@ -21,7 +21,7 @@ "dependencies": { "@babel/preset-env": "^7.25.4", "@expo/metro-runtime": "~4.0.0", - "@gorhom/bottom-sheet": "^5.0.5", + "@gorhom/bottom-sheet": "^5.0.6", "@react-native-async-storage/async-storage": "1.23.1", "@react-native-community/datetimepicker": "8.2.0", "@react-native-community/slider": "4.5.5", @@ -33,7 +33,7 @@ "@storybook/addon-ondevice-controls": "^8.4.3-alpha.1", "@storybook/addon-ondevice-notes": "^8.4.3-alpha.1", "@storybook/addon-react-native-server": "0.0.6", - "@storybook/addon-react-native-web": "^0.0.22", + "@storybook/addon-react-native-web": "^0.0.26", "@storybook/addon-webpack5-compiler-babel": "^3.0.3", "@storybook/blocks": "^8.4.2", "@storybook/builder-webpack5": "^8.4.2", @@ -43,12 +43,12 @@ "@storybook/react-native-theming": "^8.4.3-alpha.1", "@storybook/react-webpack5": "^8.4.2", "@storybook/test": "^8.4.2", - "expo": "~52.0.5", + "expo": "~52.0.11", "history": "^5.3.0", "querystring": "^0.2.1", "react": "18.3.1", "react-dom": "18.3.1", - "react-native": "0.76.1", + "react-native": "0.76.3", "react-native-gesture-handler": "~2.20.2", "react-native-reanimated": "~3.16.1", "react-native-safe-area-context": "4.12.0", @@ -70,7 +70,7 @@ "babel-loader": "^9.1.3", "babel-plugin-react-docgen-typescript": "^1.5.1", "jest": "^29.7.0", - "jest-expo": "~52.0.0", + "jest-expo": "~52.0.2", "metro-react-native-babel-preset": "^0.77.0", "typescript": "^5.3.3" } diff --git a/packages/react-native-theming/src/theme.ts b/packages/react-native-theming/src/theme.ts index b989bfdf7c..8d9417830d 100644 --- a/packages/react-native-theming/src/theme.ts +++ b/packages/react-native-theming/src/theme.ts @@ -114,12 +114,7 @@ export const theme: StorybookThemeWeb = { barBg: light.barBg, // Brand logo/text - brand: { - title: light.brandTitle, - url: light.brandUrl, - image: light.brandImage || (light.brandTitle ? null : undefined), - target: light.brandTarget, - }, + brand: undefined, }; export const darkTheme: StorybookThemeWeb = { @@ -215,10 +210,5 @@ export const darkTheme: StorybookThemeWeb = { barBg: dark.barBg, // Brand logo/text - brand: { - title: dark.brandTitle, - url: dark.brandUrl, - image: dark.brandImage || (dark.brandTitle ? null : undefined), - target: dark.brandTarget, - }, + brand: undefined, }; diff --git a/packages/react-native-theming/src/web-theme.ts b/packages/react-native-theming/src/web-theme.ts index c1d488f94a..c14927b1c6 100644 --- a/packages/react-native-theming/src/web-theme.ts +++ b/packages/react-native-theming/src/web-theme.ts @@ -1,5 +1,6 @@ -import type { TextStyle } from 'react-native'; +import type { ImageProps, ImageSourcePropType, TextStyle } from 'react-native'; import { transparentize } from 'polished'; +import { ReactElement } from 'react'; export const color = { // Official color palette @@ -171,10 +172,14 @@ export type Typography = typeof typography; export type TextSize = number | string; export interface Brand { - title: string | undefined; - url: string | null | undefined; - image: string | null | undefined; - target: string | null | undefined; + // Will replace the storybook logo with this title + title?: string | undefined; + // This url we be opened when clicking the branded logo or title + url?: string | null | undefined; + // Define a an image source to replace storybook logo with + image?: ImageSourcePropType | ReactElement | null | undefined; + resizeMode?: ImageProps['resizeMode'] | null | undefined; + target?: string | null | undefined; } export interface StorybookThemeWeb { @@ -215,7 +220,7 @@ export interface StorybookThemeWeb { barSelectedColor: string; barBg: string; - brand: Brand; + brand?: Brand; // [key: string]: any; } diff --git a/packages/react-native-ui/src/Layout.tsx b/packages/react-native-ui/src/Layout.tsx index 922cd0ec16..7c31f9d064 100644 --- a/packages/react-native-ui/src/Layout.tsx +++ b/packages/react-native-ui/src/Layout.tsx @@ -13,9 +13,9 @@ import { MobileMenuDrawer, MobileMenuDrawerRef } from './MobileMenuDrawer'; import { Sidebar } from './Sidebar'; import { DEFAULT_REF_ID } from './constants'; import { BottomBarToggleIcon } from './icon/BottomBarToggleIcon'; -import { DarkLogo } from './icon/DarkLogo'; -import { Logo } from './icon/Logo'; + import { MenuIcon } from './icon/MenuIcon'; +import { StorybookLogo } from './StorybookLogo'; import { useStoreBooleanState } from './hooks/useStoreState'; export const Layout = ({ @@ -79,11 +79,7 @@ export const Layout = ({ justifyContent: 'space-between', }} > - {theme.base === 'light' ? ( - - ) : ( - - )} + setDesktopSidebarOpen(false)} Icon={MenuIcon} /> @@ -164,11 +160,7 @@ export const Layout = ({ - {theme.base === 'light' ? ( - - ) : ( - - )} + ; + +export default meta; + +type Story = StoryObj; + +export const TitleLogo: Story = { + args: { + theme: { + ...theme, + brand: { title: 'React Native' }, + } satisfies Theme, + }, +}; + +export const ImageLogo: Story = { + args: { + theme: { + ...theme, + brand: { + image: { + uri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/React-icon.svg/512px-React-icon.svg.png', + height: 25, + width: 25, + }, + }, + } satisfies Theme, + }, +}; + +export const ImageUrlLogo: Story = { + args: { + theme: { + ...theme, + brand: { + image: { + uri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/React-icon.svg/512px-React-icon.svg.png', + width: 25, + height: 25, + }, + title: 'React Native', + url: 'https://reactnative.dev', + }, + } satisfies Theme, + }, +}; + +export const ImageSourceLogo: Story = { + args: { + theme: { + ...theme, + brand: { + image: require('./assets/react-native-logo.png'), + resizeMode: 'contain', + url: 'https://reactnative.dev', + }, + } satisfies Theme, + }, +}; + +export const ImageElementLogo: Story = { + args: { + theme: { ...theme, brand: { image: Element } } satisfies Theme, + }, +}; diff --git a/packages/react-native-ui/src/StorybookLogo.tsx b/packages/react-native-ui/src/StorybookLogo.tsx new file mode 100644 index 0000000000..4441110cf0 --- /dev/null +++ b/packages/react-native-ui/src/StorybookLogo.tsx @@ -0,0 +1,106 @@ +import { Theme } from '@storybook/react-native-theming'; +import { FC, isValidElement, ReactElement, useEffect, useMemo } from 'react'; +import { Image, Linking, StyleProp, Text, TextStyle, TouchableOpacity } from 'react-native'; +import { DarkLogo } from './icon/DarkLogo'; +import { Logo } from './icon/Logo'; + +const WIDTH = 125; +const HEIGHT = 25; + +const NoBrandLogo: FC<{ theme: Theme }> = ({ theme }) => + theme.base === 'light' ? ( + + ) : ( + + ); + +function isElement(value: unknown): value is ReactElement { + return isValidElement(value); +} + +const BrandLogo: FC<{ theme: Theme }> = ({ theme }) => { + const imageHasNoWidthOrHeight = + typeof theme.brand.image === 'object' && + typeof theme.brand.image === 'object' && + 'uri' in theme.brand.image && + (!('height' in theme.brand.image) || !('width' in theme.brand.image)); + + useEffect(() => { + if (imageHasNoWidthOrHeight) { + console.warn( + "STORYBOOK: When using a remote image as the brand logo, you must also set the width and height.\nFor example: brand: { image: { uri: 'https://sb.com/img.png', height: 25, width: 25}}" + ); + } + }, [imageHasNoWidthOrHeight]); + + if (!theme.brand.image) { + return null; + } + + if (isElement(theme.brand.image)) { + return theme.brand.image; + } + + const image = ( + + ); + + if (theme.brand.url) { + return ( + { + if (theme.brand.url) Linking.openURL(theme.brand.url); + }} + > + {image} + + ); + } else { + return image; + } +}; + +const BrandTitle: FC<{ theme: Theme }> = ({ theme }) => { + const brandTitleStyle = useMemo>(() => { + return { + width: WIDTH, + height: HEIGHT, + color: theme.color.defaultText, + fontSize: theme.typography.size.m1, + }; + }, [theme]); + + const title = ( + + {theme.brand.title} + + ); + + if (theme.brand.url) { + return ( + { + if (theme.brand.url) Linking.openURL(theme.brand.url); + }} + > + {title} + + ); + } else { + return title; + } +}; + +export const StorybookLogo: FC<{ theme: Theme }> = ({ theme }) => { + if (theme.brand?.image) { + return ; + } else if (theme.brand?.title) { + return ; + } else { + return ; + } +}; diff --git a/packages/react-native-ui/src/assets/react-native-logo.png b/packages/react-native-ui/src/assets/react-native-logo.png new file mode 100644 index 0000000000..5c125de5d8 Binary files /dev/null and b/packages/react-native-ui/src/assets/react-native-logo.png differ diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 15b2bf13d8..da6b8a3692 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -73,7 +73,7 @@ "jest": "^29.7.0", "jotai": "^2.6.2", "react": "18.3.1", - "react-native": "0.76.1", + "react-native": "0.76.3", "react-test-renderer": "^18.3.1", "tsup": "^7.2.0", "typescript": "^5.3.3" diff --git a/yarn.lock b/yarn.lock index 4e923f4409..281a433605 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3063,15 +3063,15 @@ __metadata: languageName: node linkType: hard -"@expo/cli@npm:0.21.2": - version: 0.21.2 - resolution: "@expo/cli@npm:0.21.2" +"@expo/cli@npm:0.21.8": + version: 0.21.8 + resolution: "@expo/cli@npm:0.21.8" dependencies: "@0no-co/graphql.web": "npm:^1.0.8" "@babel/runtime": "npm:^7.20.0" "@expo/code-signing-certificates": "npm:^0.0.5" - "@expo/config": "npm:~10.0.2" - "@expo/config-plugins": "npm:~9.0.3" + "@expo/config": "npm:~10.0.4" + "@expo/config-plugins": "npm:~9.0.10" "@expo/devcert": "npm:^1.1.2" "@expo/env": "npm:~0.4.0" "@expo/image-utils": "npm:^0.6.0" @@ -3080,11 +3080,11 @@ __metadata: "@expo/osascript": "npm:^2.0.31" "@expo/package-manager": "npm:^1.5.0" "@expo/plist": "npm:^0.2.0" - "@expo/prebuild-config": "npm:^8.0.9" + "@expo/prebuild-config": "npm:^8.0.17" "@expo/rudder-sdk-node": "npm:^1.1.1" "@expo/spawn-async": "npm:^1.7.2" "@expo/xcpretty": "npm:^4.3.0" - "@react-native/dev-middleware": "npm:0.76.1" + "@react-native/dev-middleware": "npm:0.76.3" "@urql/core": "npm:^5.0.6" "@urql/exchange-retry": "npm:^1.3.0" accepts: "npm:^1.3.8" @@ -3140,7 +3140,7 @@ __metadata: ws: "npm:^8.12.1" bin: expo-internal: build/bin/cli - checksum: 10/fe442d2138e6d8de6a8339d67fd39062be2917a6660ed4186f50afb76a695751fa552202cb8713231cce979b7a2f26fd2b68cb6e6ce103a90cfa2085e8e034e6 + checksum: 10/0060fda1a040769db71a6b0fd9a13bd90fdf1000302ca7a0e103a1acf7c9653d1ece1a984ac0db12f843c4cf4b525c9b65e7d7f23a5c91ee18f18a6dcd1a74dd languageName: node linkType: hard @@ -3154,28 +3154,6 @@ __metadata: languageName: node linkType: hard -"@expo/config-plugins@npm:9.0.9": - version: 9.0.9 - resolution: "@expo/config-plugins@npm:9.0.9" - dependencies: - "@expo/config-types": "npm:^52.0.0" - "@expo/json-file": "npm:~9.0.0" - "@expo/plist": "npm:^0.2.0" - "@expo/sdk-runtime-versions": "npm:^1.0.0" - chalk: "npm:^4.1.2" - debug: "npm:^4.3.5" - getenv: "npm:^1.0.0" - glob: "npm:^10.4.2" - resolve-from: "npm:^5.0.0" - semver: "npm:^7.5.4" - slash: "npm:^3.0.0" - slugify: "npm:^1.6.6" - xcode: "npm:^3.0.1" - xml2js: "npm:0.6.0" - checksum: 10/e0f5cec54999e6cd46f435d0996c294072716ce7efe553679fec4fcbf63d65f151e37fd50ff9f459c5db4edda095d25dcaa12cc6872aa45ada5a9128c34ee31d - languageName: node - linkType: hard - "@expo/config-plugins@npm:~9.0.0": version: 9.0.2 resolution: "@expo/config-plugins@npm:9.0.2" @@ -3198,11 +3176,11 @@ __metadata: languageName: node linkType: hard -"@expo/config-plugins@npm:~9.0.3": - version: 9.0.4 - resolution: "@expo/config-plugins@npm:9.0.4" +"@expo/config-plugins@npm:~9.0.10": + version: 9.0.10 + resolution: "@expo/config-plugins@npm:9.0.10" dependencies: - "@expo/config-types": "npm:^52.0.0-preview.0" + "@expo/config-types": "npm:^52.0.0" "@expo/json-file": "npm:~9.0.0" "@expo/plist": "npm:^0.2.0" "@expo/sdk-runtime-versions": "npm:^1.0.0" @@ -3216,7 +3194,7 @@ __metadata: slugify: "npm:^1.6.6" xcode: "npm:^3.0.1" xml2js: "npm:0.6.0" - checksum: 10/432184e96ec2759a5931a4d5ad9f3a1fe29907bed4e60d4c76502f8ac2469d2d0cd5f31527d575d85abb40db166b7cfb85fabc5585f4dd67d93943dbb1b9eb34 + checksum: 10/c2212c4362183996199e6bb9c57e43759fed293e228d780250e95bf75f2c6ccb70d263aa1c4a54b479be33786ea3a338ecd3e708d5132a9fe5016ed0327d3654 languageName: node linkType: hard @@ -3234,27 +3212,6 @@ __metadata: languageName: node linkType: hard -"@expo/config@npm:10.0.3": - version: 10.0.3 - resolution: "@expo/config@npm:10.0.3" - dependencies: - "@babel/code-frame": "npm:~7.10.4" - "@expo/config-plugins": "npm:~9.0.0" - "@expo/config-types": "npm:^52.0.0" - "@expo/json-file": "npm:^9.0.0" - deepmerge: "npm:^4.3.1" - getenv: "npm:^1.0.0" - glob: "npm:^10.4.2" - require-from-string: "npm:^2.0.2" - resolve-from: "npm:^5.0.0" - resolve-workspace-root: "npm:^2.0.0" - semver: "npm:^7.6.0" - slugify: "npm:^1.3.4" - sucrase: "npm:3.35.0" - checksum: 10/f84be296fd6ab2ac721601ad1bfbff8f7ef1a96a3641515a23e71543e11c578fbaa87dbd896756c55a4f0d8767e560703b1d85ac45c1bac3aaf948c99fe8b20f - languageName: node - linkType: hard - "@expo/config@npm:~10.0.0": version: 10.0.1 resolution: "@expo/config@npm:10.0.1" @@ -3276,13 +3233,13 @@ __metadata: languageName: node linkType: hard -"@expo/config@npm:~10.0.2": - version: 10.0.2 - resolution: "@expo/config@npm:10.0.2" +"@expo/config@npm:~10.0.4, @expo/config@npm:~10.0.5": + version: 10.0.5 + resolution: "@expo/config@npm:10.0.5" dependencies: "@babel/code-frame": "npm:~7.10.4" - "@expo/config-plugins": "npm:~9.0.0" - "@expo/config-types": "npm:^52.0.0-preview.0" + "@expo/config-plugins": "npm:~9.0.10" + "@expo/config-types": "npm:^52.0.0" "@expo/json-file": "npm:^9.0.0" deepmerge: "npm:^4.3.1" getenv: "npm:^1.0.0" @@ -3293,7 +3250,7 @@ __metadata: semver: "npm:^7.6.0" slugify: "npm:^1.3.4" sucrase: "npm:3.35.0" - checksum: 10/13df32bb75b77a5781390dad2a2a9dfdd5c5b2217bf0b0df99a811170dcbaf874539b96eb01562e0caba1b09fa5bb01ddbbabbc95484689d31ea7aecc90f6317 + checksum: 10/d74b73b367a549c5b7fa4920680f2f2635f261f1e5a63533684ceeb08599ce91ded487eb187d5994bb1e95e0af1842ea9dd490899a7197501bc978227ea13b0b languageName: node linkType: hard @@ -3390,15 +3347,15 @@ __metadata: languageName: node linkType: hard -"@expo/metro-config@npm:0.19.3": - version: 0.19.3 - resolution: "@expo/metro-config@npm:0.19.3" +"@expo/metro-config@npm:0.19.4": + version: 0.19.4 + resolution: "@expo/metro-config@npm:0.19.4" dependencies: "@babel/core": "npm:^7.20.0" "@babel/generator": "npm:^7.20.5" "@babel/parser": "npm:^7.20.0" "@babel/types": "npm:^7.20.0" - "@expo/config": "npm:~10.0.0" + "@expo/config": "npm:~10.0.4" "@expo/env": "npm:~0.4.0" "@expo/json-file": "npm:~9.0.0" "@expo/spawn-async": "npm:^1.7.2" @@ -3412,7 +3369,7 @@ __metadata: minimatch: "npm:^3.0.4" postcss: "npm:~8.4.32" resolve-from: "npm:^5.0.0" - checksum: 10/890b7a7f20b90d06b3d5e647f9aeacb0661adefb0634ca82294dd29e88793c7d39eaa4954c4c4885cca09b7edd3eb17178f415a9e247c3d8447ac8fe143c3ccc + checksum: 10/6320148c414669ccaf269648596f5d43fb0e3e9e64b93da5f38213748279c8ae6a835ea907fff2d940d91594dba22396f5c32b20db592504f8deb4dc375d0e4d languageName: node linkType: hard @@ -3492,24 +3449,22 @@ __metadata: languageName: node linkType: hard -"@expo/prebuild-config@npm:^8.0.9": - version: 8.0.9 - resolution: "@expo/prebuild-config@npm:8.0.9" +"@expo/prebuild-config@npm:^8.0.17": + version: 8.0.20 + resolution: "@expo/prebuild-config@npm:8.0.20" dependencies: - "@expo/config": "npm:~10.0.0" - "@expo/config-plugins": "npm:~9.0.0" - "@expo/config-types": "npm:^52.0.0-preview.0" + "@expo/config": "npm:~10.0.4" + "@expo/config-plugins": "npm:~9.0.10" + "@expo/config-types": "npm:^52.0.0" "@expo/image-utils": "npm:^0.6.0" "@expo/json-file": "npm:^9.0.0" - "@react-native/normalize-colors": "npm:0.76.1" + "@react-native/normalize-colors": "npm:0.76.3" debug: "npm:^4.3.1" fs-extra: "npm:^9.0.0" resolve-from: "npm:^5.0.0" semver: "npm:^7.6.0" xml2js: "npm:0.6.0" - peerDependencies: - expo-modules-autolinking: 2.0.0-preview.3 - checksum: 10/ec08f99c80ab911208c941582662cccef457bdd5ddae084b9807b9bf01066dadd36652f854492eb102710d12973374a60bcf7cb952ed44d9d2b65486e3c8907f + checksum: 10/4b0c3842c09be147607084e26361a0046e0638f3c8beb67f49d35accaeb6b63878ea408ef0ad29eb5701dd9c902eac254eb2b511bd09044d096b99a514a14acc languageName: node linkType: hard @@ -3567,9 +3522,9 @@ __metadata: languageName: node linkType: hard -"@gorhom/bottom-sheet@npm:^5.0.5": - version: 5.0.5 - resolution: "@gorhom/bottom-sheet@npm:5.0.5" +"@gorhom/bottom-sheet@npm:^5.0.6": + version: 5.0.6 + resolution: "@gorhom/bottom-sheet@npm:5.0.6" dependencies: "@gorhom/portal": "npm:1.0.14" invariant: "npm:^2.2.4" @@ -3579,13 +3534,13 @@ __metadata: react: "*" react-native: "*" react-native-gesture-handler: ">=2.16.1" - react-native-reanimated: ">=3.10.1" + react-native-reanimated: ">=3.16.0" peerDependenciesMeta: "@types/react": optional: true "@types/react-native": optional: true - checksum: 10/4c972e5c4459dce02858c4b5af691e412e8075e1cbfe049ae7d308746173ba27c3802d867eb54a94a804987d3d9e78f5886dc5a3f4163fb19ca2a91b4ad44864 + checksum: 10/b8beb6bb4d80828deed5c74c8b19926cbb4887d530d07c19eaaa1d8faae6c79f942f83baad076c84d065f357f6666cbc257799fe8fc58cb375e6cbebf52b6227 languageName: node linkType: hard @@ -4627,10 +4582,10 @@ __metadata: languageName: node linkType: hard -"@react-native/assets-registry@npm:0.76.1": - version: 0.76.1 - resolution: "@react-native/assets-registry@npm:0.76.1" - checksum: 10/da78a53ee18889ba3c229dcc0f99496e99debe7e0143cbcb413277355bdbc8fbfa3f7459e9b85de2730bd902a5190cffa90fb6a92602290401543d915264dd06 +"@react-native/assets-registry@npm:0.76.3": + version: 0.76.3 + resolution: "@react-native/assets-registry@npm:0.76.3" + checksum: 10/e56bf32d5900933474ff77b5441a285d6494fa8762eefcb3d3d1ffac85bade6464437142eb156f9c7214bff1a4107ff2054fe96d6e33f74b9b26001868706678 languageName: node linkType: hard @@ -4643,18 +4598,18 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-plugin-codegen@npm:0.76.1": - version: 0.76.1 - resolution: "@react-native/babel-plugin-codegen@npm:0.76.1" +"@react-native/babel-plugin-codegen@npm:0.76.3": + version: 0.76.3 + resolution: "@react-native/babel-plugin-codegen@npm:0.76.3" dependencies: - "@react-native/codegen": "npm:0.76.1" - checksum: 10/209965e16ca144d1bfcab09431aadf0086ea6263f6779efa55431560c72bfd6216e97fc15b84a4c38c79c3a43c9a143a897655c53188b0443a27277e892d5a40 + "@react-native/codegen": "npm:0.76.3" + checksum: 10/7edff369085919470c60da81b86c589d67dd94fdceda44dcf28cd18d21be0bb77c66428796205b23c9c6e440ea15effd12596197235cef81a4e50252804dc1ec languageName: node linkType: hard -"@react-native/babel-preset@npm:0.76.1": - version: 0.76.1 - resolution: "@react-native/babel-preset@npm:0.76.1" +"@react-native/babel-preset@npm:0.76.3": + version: 0.76.3 + resolution: "@react-native/babel-preset@npm:0.76.3" dependencies: "@babel/core": "npm:^7.25.2" "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" @@ -4697,13 +4652,13 @@ __metadata: "@babel/plugin-transform-typescript": "npm:^7.25.2" "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" "@babel/template": "npm:^7.25.0" - "@react-native/babel-plugin-codegen": "npm:0.76.1" - babel-plugin-syntax-hermes-parser: "npm:^0.23.1" + "@react-native/babel-plugin-codegen": "npm:0.76.3" + babel-plugin-syntax-hermes-parser: "npm:^0.25.1" babel-plugin-transform-flow-enums: "npm:^0.0.2" react-refresh: "npm:^0.14.0" peerDependencies: "@babel/core": "*" - checksum: 10/45935580c722ebec0aea75f760f5f5ee3b93d1f824d91f3811d028416e2844aea7787d87b6986b019ae2bda46f9a1b7ee4493d705b4c6578f4ce3904493429e2 + checksum: 10/adbe03b9915430c5174769589a96999fa43f1db5ee6229b0e78780787f262d861d842e9376ece2d4215d299dbf81df814e3c23c548b83bf1fc0afd05296b2e11 languageName: node linkType: hard @@ -4778,9 +4733,9 @@ __metadata: languageName: node linkType: hard -"@react-native/codegen@npm:0.76.1": - version: 0.76.1 - resolution: "@react-native/codegen@npm:0.76.1" +"@react-native/codegen@npm:0.76.3": + version: 0.76.3 + resolution: "@react-native/codegen@npm:0.76.3" dependencies: "@babel/parser": "npm:^7.25.3" glob: "npm:^7.1.1" @@ -4792,16 +4747,16 @@ __metadata: yargs: "npm:^17.6.2" peerDependencies: "@babel/preset-env": ^7.1.6 - checksum: 10/ae0032f6ef556dee0ec24190ef43a46c680ac8e6a5a8130ccc2b1e5348b2764e4f369e867299266580071bcd20d999fbdf44203ff68dfe5ef518dbd39f25809c + checksum: 10/2bc81548059095acff0d775a4f6b101b3b559992aaca8dd979faf83177a2d2d4f8653efd970a3b6563a339649d5d0e3f856ad5980c30f99861c0f948e6b34942 languageName: node linkType: hard -"@react-native/community-cli-plugin@npm:0.76.1": - version: 0.76.1 - resolution: "@react-native/community-cli-plugin@npm:0.76.1" +"@react-native/community-cli-plugin@npm:0.76.3": + version: 0.76.3 + resolution: "@react-native/community-cli-plugin@npm:0.76.3" dependencies: - "@react-native/dev-middleware": "npm:0.76.1" - "@react-native/metro-babel-transformer": "npm:0.76.1" + "@react-native/dev-middleware": "npm:0.76.3" + "@react-native/metro-babel-transformer": "npm:0.76.3" chalk: "npm:^4.0.0" execa: "npm:^5.1.1" invariant: "npm:^2.2.4" @@ -4810,28 +4765,29 @@ __metadata: metro-core: "npm:^0.81.0" node-fetch: "npm:^2.2.0" readline: "npm:^1.3.0" + semver: "npm:^7.1.3" peerDependencies: "@react-native-community/cli-server-api": "*" peerDependenciesMeta: "@react-native-community/cli-server-api": optional: true - checksum: 10/6263c971c377fec9e6e675ee8710bd6dc92a38e90071325f96f0f5422d20eacdc7b18f436c27665769bedee5d315e08365b01bacef3574a3ab66ec07ad098945 + checksum: 10/c415f26bdebb9c32230423879ca206a34343a644c307e4efc07d09a677b1394ef945b1b65d615c84913227cd03bf205315728c8cd9188e5cb51c5cb3b12b589d languageName: node linkType: hard -"@react-native/debugger-frontend@npm:0.76.1": - version: 0.76.1 - resolution: "@react-native/debugger-frontend@npm:0.76.1" - checksum: 10/02811e0840a6afccb0817e7b9f44f726087ef64a1c72b75454ea40a8e3b4f83f38f122196f8d8e31afeefa5f56b4a92fd688b2b7e2a848fdfa64bb654007c32c +"@react-native/debugger-frontend@npm:0.76.3": + version: 0.76.3 + resolution: "@react-native/debugger-frontend@npm:0.76.3" + checksum: 10/6a652a3c18fad1850ec369588e60c4503306ff307404028019d34b31789e9ccb63343d4e8c6b6263dd994f609579380e827e1f42daaacd770d3be636de1ef836 languageName: node linkType: hard -"@react-native/dev-middleware@npm:0.76.1": - version: 0.76.1 - resolution: "@react-native/dev-middleware@npm:0.76.1" +"@react-native/dev-middleware@npm:0.76.3": + version: 0.76.3 + resolution: "@react-native/dev-middleware@npm:0.76.3" dependencies: "@isaacs/ttlcache": "npm:^1.4.1" - "@react-native/debugger-frontend": "npm:0.76.1" + "@react-native/debugger-frontend": "npm:0.76.3" chrome-launcher: "npm:^0.15.2" chromium-edge-launcher: "npm:^0.2.0" connect: "npm:^3.6.5" @@ -4841,7 +4797,7 @@ __metadata: selfsigned: "npm:^2.4.1" serve-static: "npm:^1.13.1" ws: "npm:^6.2.3" - checksum: 10/83d767ce00058b3f249fa9c6b8ee0b3886e24cbe745d27eb4ffec90987b2e2cc120ae9ec4fadf40395d3ed63a8a63c1d3dc7dd0e7ed84fa7d1a2a1908a49e44a + checksum: 10/d104275f7276837b92cc230dfdeeb8406f834518516bac99c82e81e54487540407627b670705f9b7f8e8a3a506bf7ee86043b4c4b37d6ce970d58309d8f5d251 languageName: node linkType: hard @@ -4876,38 +4832,38 @@ __metadata: languageName: node linkType: hard -"@react-native/gradle-plugin@npm:0.76.1": - version: 0.76.1 - resolution: "@react-native/gradle-plugin@npm:0.76.1" - checksum: 10/19486fb1dfb3e0dd41938b8a88a673de845a6cc7671df3b1d7cc0e746b916eb0ed807015f5e62b506389924a0e3490ae08082a91f57d114e8368293461118e72 +"@react-native/gradle-plugin@npm:0.76.3": + version: 0.76.3 + resolution: "@react-native/gradle-plugin@npm:0.76.3" + checksum: 10/331263f289418b5416f298328d8ef7b1cf7cc4fcb13707d941f666414c4628d59b2fba988ec4dc38b3a9dbcd2e937053e2259aec7dbdcac890017914ea24516d languageName: node linkType: hard -"@react-native/js-polyfills@npm:0.76.1": - version: 0.76.1 - resolution: "@react-native/js-polyfills@npm:0.76.1" - checksum: 10/64e565de7feaee213a2e0db35d101fd0c0ec8fa4e8336e4097372604f3a3c79d9b7218a5dd79b608033012f4675bbc65ff7089738f9c9802583af89e3834a13d +"@react-native/js-polyfills@npm:0.76.3": + version: 0.76.3 + resolution: "@react-native/js-polyfills@npm:0.76.3" + checksum: 10/6bf86f6003a26fcee796a5e6642eea0c8b8f49016d5fb8c39a5c13397b7c3c26cc0e3c96c9dc40ac8983148a252904ec6fa2201fcbe6c47819bde891d2db0a77 languageName: node linkType: hard -"@react-native/metro-babel-transformer@npm:0.76.1": - version: 0.76.1 - resolution: "@react-native/metro-babel-transformer@npm:0.76.1" +"@react-native/metro-babel-transformer@npm:0.76.3": + version: 0.76.3 + resolution: "@react-native/metro-babel-transformer@npm:0.76.3" dependencies: "@babel/core": "npm:^7.25.2" - "@react-native/babel-preset": "npm:0.76.1" + "@react-native/babel-preset": "npm:0.76.3" hermes-parser: "npm:0.23.1" nullthrows: "npm:^1.1.1" peerDependencies: "@babel/core": "*" - checksum: 10/a88ca81edea5cb61720960241975cabf54536e482746a4ad37fadc52606990590b96f3bb55e4acd76f3ed3704436628c6aae56112f7ec525c40f240ffa6955ff + checksum: 10/00cc1092042a530665ceadae6315441de8efb41448f2011fdfa7f586c8787346ec90c68f740980b56b1271cea2436497d82b78f5f1551b8df83eab032d05b251 languageName: node linkType: hard -"@react-native/normalize-colors@npm:0.76.1": - version: 0.76.1 - resolution: "@react-native/normalize-colors@npm:0.76.1" - checksum: 10/18fcab73b04e1b38794f7bd9d1172bb7f1b0d336df7d8ce669ec6b40eabbc254a58954330fdcae8fb3c7eef384368988fb3d7864a3668f12499c1f1c84a05989 +"@react-native/normalize-colors@npm:0.76.3": + version: 0.76.3 + resolution: "@react-native/normalize-colors@npm:0.76.3" + checksum: 10/5675856bba8184f2049249cc217dc417857408fba6c4043d8ad2c941a33eba00af2574fa9e884c1f8073c99bd945308a310bbf89f63e67f17f4e6c11fdebf4fa languageName: node linkType: hard @@ -4918,9 +4874,9 @@ __metadata: languageName: node linkType: hard -"@react-native/virtualized-lists@npm:0.76.1": - version: 0.76.1 - resolution: "@react-native/virtualized-lists@npm:0.76.1" +"@react-native/virtualized-lists@npm:0.76.3": + version: 0.76.3 + resolution: "@react-native/virtualized-lists@npm:0.76.3" dependencies: invariant: "npm:^2.2.4" nullthrows: "npm:^1.1.1" @@ -4931,7 +4887,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/100920545f6c91778c0cc64c377f126f85145f66410c91de2f55c1545e042addeab37c022c7a382a28987056740bf3f6d33194cbc9a2c88c65f5e0eab8474c1a + checksum: 10/e3a43d669ff00379f93a03c8de4fddc88c0eafd30b1da9927c9613208e8b04bb1a41d1c955c29a2a7a0390ec318bc14aca6364541c9e29e0f803cedc8c0d2542 languageName: node linkType: hard @@ -5255,9 +5211,9 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-react-native-web@npm:^0.0.22": - version: 0.0.22 - resolution: "@storybook/addon-react-native-web@npm:0.0.22" +"@storybook/addon-react-native-web@npm:^0.0.26": + version: 0.0.26 + resolution: "@storybook/addon-react-native-web@npm:0.0.26" peerDependencies: "@babel/preset-react": "*" "@react-native/babel-preset": "*" @@ -5274,7 +5230,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 10/5bcb1040a0d52cb2a98a8589b3b951b773ca90392a95616c3f9032ac41c2ebf691339cd427875d222fed3d121a42ba5b7fe64a0aabb0e13b10c4b0749f708807 + checksum: 10/35195eb648783dae1cf94dcbade40fbc2cb77e2a7fce37aabf7d5f77694ff6592ea0441da41849d56423d61497dd24348d1970a42a38b8f85a165cf6dd2f8f7e languageName: node linkType: hard @@ -5601,7 +5557,7 @@ __metadata: jotai: "npm:^2.6.2" prettier: "npm:^2.4.1" react: "npm:18.3.1" - react-native: "npm:0.76.1" + react-native: "npm:0.76.3" react-native-swipe-gestures: "npm:^1.0.5" react-native-url-polyfill: "npm:^2.0.0" react-test-renderer: "npm:^18.3.1" @@ -7207,6 +7163,15 @@ __metadata: languageName: node linkType: hard +"babel-plugin-syntax-hermes-parser@npm:^0.25.1": + version: 0.25.1 + resolution: "babel-plugin-syntax-hermes-parser@npm:0.25.1" + dependencies: + hermes-parser: "npm:0.25.1" + checksum: 10/dc80fafde1aed8e60cf86ecd2e9920e7f35ffe02b33bd4e772daaa786167bcf508aac3fc1aea425ff4c7a0be94d82528f3fe8619b7f41dac853264272d640c04 + languageName: node + linkType: hard + "babel-plugin-transform-flow-enums@npm:^0.0.2": version: 0.0.2 resolution: "babel-plugin-transform-flow-enums@npm:0.0.2" @@ -7241,9 +7206,9 @@ __metadata: languageName: node linkType: hard -"babel-preset-expo@npm:~12.0.0": - version: 12.0.0 - resolution: "babel-preset-expo@npm:12.0.0" +"babel-preset-expo@npm:~12.0.2": + version: 12.0.2 + resolution: "babel-preset-expo@npm:12.0.2" dependencies: "@babel/plugin-proposal-decorators": "npm:^7.12.9" "@babel/plugin-transform-export-namespace-from": "npm:^7.22.11" @@ -7251,7 +7216,7 @@ __metadata: "@babel/plugin-transform-parameters": "npm:^7.22.15" "@babel/preset-react": "npm:^7.22.15" "@babel/preset-typescript": "npm:^7.23.0" - "@react-native/babel-preset": "npm:0.76.1" + "@react-native/babel-preset": "npm:0.76.3" babel-plugin-react-native-web: "npm:~0.19.13" react-refresh: "npm:^0.14.2" peerDependencies: @@ -7262,7 +7227,7 @@ __metadata: optional: true react-compiler-runtime: optional: true - checksum: 10/9efa358bb7e56e9d7f0abcef35551ec334a1d72444f53008e2209196aec3c1f1738e2fc7e4a1f55ea420991dc8d9db9fc15f6c25771075b4f913c0073e616f89 + checksum: 10/e3f56940e1e11193ba2c8c8c25db0973918f52b464f674de8f352ab82d38957f5abdfdf9a22af0de295f1f3bae50c4e39ca77282d9ea6b21e2e62eefbf504112 languageName: node linkType: hard @@ -9981,16 +9946,16 @@ __metadata: languageName: node linkType: hard -"expo-constants@npm:~17.0.2": - version: 17.0.2 - resolution: "expo-constants@npm:17.0.2" +"expo-constants@npm:~17.0.3": + version: 17.0.3 + resolution: "expo-constants@npm:17.0.3" dependencies: - "@expo/config": "npm:~10.0.0" + "@expo/config": "npm:~10.0.4" "@expo/env": "npm:~0.4.0" peerDependencies: expo: "*" react-native: "*" - checksum: 10/0f80837d98a6a3fd24ac368f6ec83f94e01d1ce027d5996749a4783e3360a35395d91912a53c25fd2c90ac3e75f229eef0eca5a672a66d3dbada39bf67527ed8 + checksum: 10/25487b469010c57ffbb1bf5e052d5e546db0bc7af9a68acd0e359a2f3978c99fc28b49527514da862dfcaf6b7915674b16d70a3c63d31a64cbdb0d27c6294a69 languageName: node linkType: hard @@ -10002,7 +9967,7 @@ __metadata: "@babel/plugin-proposal-export-namespace-from": "npm:^7.18.9" "@babel/preset-env": "npm:^7.25.4" "@expo/metro-runtime": "npm:~4.0.0" - "@gorhom/bottom-sheet": "npm:^5.0.5" + "@gorhom/bottom-sheet": "npm:^5.0.6" "@react-native-async-storage/async-storage": "npm:1.23.1" "@react-native-community/datetimepicker": "npm:8.2.0" "@react-native-community/slider": "npm:4.5.5" @@ -10015,7 +9980,7 @@ __metadata: "@storybook/addon-ondevice-controls": "npm:^8.4.3-alpha.1" "@storybook/addon-ondevice-notes": "npm:^8.4.3-alpha.1" "@storybook/addon-react-native-server": "npm:0.0.6" - "@storybook/addon-react-native-web": "npm:^0.0.22" + "@storybook/addon-react-native-web": "npm:^0.0.26" "@storybook/addon-webpack5-compiler-babel": "npm:^3.0.3" "@storybook/blocks": "npm:^8.4.2" "@storybook/builder-webpack5": "npm:^8.4.2" @@ -10031,15 +9996,15 @@ __metadata: "@types/ws": "npm:^8.5.10" babel-loader: "npm:^9.1.3" babel-plugin-react-docgen-typescript: "npm:^1.5.1" - expo: "npm:~52.0.5" + expo: "npm:~52.0.11" history: "npm:^5.3.0" jest: "npm:^29.7.0" - jest-expo: "npm:~52.0.0" + jest-expo: "npm:~52.0.2" metro-react-native-babel-preset: "npm:^0.77.0" querystring: "npm:^0.2.1" react: "npm:18.3.1" react-dom: "npm:18.3.1" - react-native: "npm:0.76.1" + react-native: "npm:0.76.3" react-native-gesture-handler: "npm:~2.20.2" react-native-reanimated: "npm:~3.16.1" react-native-safe-area-context: "npm:4.12.0" @@ -10053,15 +10018,15 @@ __metadata: languageName: unknown linkType: soft -"expo-file-system@npm:~18.0.3": - version: 18.0.3 - resolution: "expo-file-system@npm:18.0.3" +"expo-file-system@npm:~18.0.4": + version: 18.0.4 + resolution: "expo-file-system@npm:18.0.4" dependencies: web-streams-polyfill: "npm:^3.3.2" peerDependencies: expo: "*" react-native: "*" - checksum: 10/f97f199a2d0e4c4354dbf4f33b3d7dc6c0c26bf0c83640c4ad83f6fd29fc2b639ec251d3fa79bcd2aef0f8fdcda511d9cd41bfd802a417f8715099f3a325f58b + checksum: 10/cd4092f70224ca611936d0225491124d57c32dde9a515bb12f3d396bba1717cd16f0eeda3c7a721b29cf21412bfb3fb8bd8c5c7f78fcca226044d53be17a7fa3 languageName: node linkType: hard @@ -10105,34 +10070,34 @@ __metadata: languageName: node linkType: hard -"expo-modules-core@npm:2.0.2": - version: 2.0.2 - resolution: "expo-modules-core@npm:2.0.2" +"expo-modules-core@npm:2.0.6": + version: 2.0.6 + resolution: "expo-modules-core@npm:2.0.6" dependencies: invariant: "npm:^2.2.4" - checksum: 10/b3f07b7936efba61b6b31d01dd8834a364e4fac7ad15bcdbc0d7c91af8746a40718a89d58eb8328a72ebdb50ecc39eb48bbbcc49c274846d7be2d3234bc9ba86 + checksum: 10/4488350ef81d2552a0467f5841bb19f9751f39f59c1791f850312bfe9cb37f49fd285c828396c578383b216886fdd4e1a9ef54676d936047de4686ae8ba4d949 languageName: node linkType: hard -"expo@npm:~52.0.5": - version: 52.0.5 - resolution: "expo@npm:52.0.5" +"expo@npm:~52.0.11": + version: 52.0.11 + resolution: "expo@npm:52.0.11" dependencies: "@babel/runtime": "npm:^7.20.0" - "@expo/cli": "npm:0.21.2" - "@expo/config": "npm:10.0.3" - "@expo/config-plugins": "npm:9.0.9" + "@expo/cli": "npm:0.21.8" + "@expo/config": "npm:~10.0.5" + "@expo/config-plugins": "npm:~9.0.10" "@expo/fingerprint": "npm:0.11.2" - "@expo/metro-config": "npm:0.19.3" + "@expo/metro-config": "npm:0.19.4" "@expo/vector-icons": "npm:^14.0.0" - babel-preset-expo: "npm:~12.0.0" + babel-preset-expo: "npm:~12.0.2" expo-asset: "npm:~11.0.1" - expo-constants: "npm:~17.0.2" - expo-file-system: "npm:~18.0.3" + expo-constants: "npm:~17.0.3" + expo-file-system: "npm:~18.0.4" expo-font: "npm:~13.0.1" expo-keep-awake: "npm:~14.0.1" expo-modules-autolinking: "npm:2.0.2" - expo-modules-core: "npm:2.0.2" + expo-modules-core: "npm:2.0.6" fbemitter: "npm:^3.0.0" web-streams-polyfill: "npm:^3.3.2" whatwg-url-without-unicode: "npm:8.0.0-3" @@ -10151,7 +10116,7 @@ __metadata: optional: true bin: expo: bin/cli - checksum: 10/33eeb53c5be6070847cf3b2d296496c879b142b14d75568f6e87cfbe221b5cedbdaeb5b6fc211888b073b75eb333a5ed6d53beca7b75441a31de9ec12535c036 + checksum: 10/c88e8cc1e7ab7f2b94761005761124c0ff819d867afe5c1db142cf339fafcf1f0236bf743d5666687ebb1bbd0968aad6079f6a9011cce0dc038820620468bcf3 languageName: node linkType: hard @@ -11179,6 +11144,13 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.25.1": + version: 0.25.1 + resolution: "hermes-estree@npm:0.25.1" + checksum: 10/7b1eca98b264a25632064cffa5771360d30cf452e77db1e191f9913ee45cf78c292b2dbca707e92fb71b0870abb97e94b506a5ab80abd96ba237fee169b601fe + languageName: node + linkType: hard + "hermes-parser@npm:0.19.1": version: 0.19.1 resolution: "hermes-parser@npm:0.19.1" @@ -11215,6 +11187,15 @@ __metadata: languageName: node linkType: hard +"hermes-parser@npm:0.25.1": + version: 0.25.1 + resolution: "hermes-parser@npm:0.25.1" + dependencies: + hermes-estree: "npm:0.25.1" + checksum: 10/805efc05691420f236654349872c70731121791fa54de521c7ee51059eae34f84dd19f22ee846741dcb60372f8fb5335719b96b4ecb010d2aed7d872f2eff9cc + languageName: node + linkType: hard + "history@npm:^5.3.0": version: 5.3.0 resolution: "history@npm:5.3.0" @@ -12395,11 +12376,11 @@ __metadata: languageName: node linkType: hard -"jest-expo@npm:~52.0.0": - version: 52.0.0 - resolution: "jest-expo@npm:52.0.0" +"jest-expo@npm:~52.0.2": + version: 52.0.2 + resolution: "jest-expo@npm:52.0.2" dependencies: - "@expo/config": "npm:~10.0.0" + "@expo/config": "npm:~10.0.4" "@expo/json-file": "npm:^9.0.0" "@jest/create-cache-key-function": "npm:^29.2.1" "@jest/globals": "npm:^29.2.1" @@ -12421,7 +12402,7 @@ __metadata: react-native: "*" bin: jest: bin/jest.js - checksum: 10/2b1c8a847b30c63c3a7d9ef346880de5482fc39f8648f5608e17c3d48703c85be0b230f140c3161e251595b558c5119d0d5a97677c266a4d0d3486929799cea0 + checksum: 10/772421d867497cd20e73ffc6b56e432156da378213d411f48ce3a864ceef3f7ad783cc954f27c74bd071bec109399d8f965d68ecb0d512f868338a7dc254133e languageName: node linkType: hard @@ -16220,18 +16201,18 @@ __metadata: languageName: node linkType: hard -"react-native@npm:0.76.1": - version: 0.76.1 - resolution: "react-native@npm:0.76.1" +"react-native@npm:0.76.3": + version: 0.76.3 + resolution: "react-native@npm:0.76.3" dependencies: "@jest/create-cache-key-function": "npm:^29.6.3" - "@react-native/assets-registry": "npm:0.76.1" - "@react-native/codegen": "npm:0.76.1" - "@react-native/community-cli-plugin": "npm:0.76.1" - "@react-native/gradle-plugin": "npm:0.76.1" - "@react-native/js-polyfills": "npm:0.76.1" - "@react-native/normalize-colors": "npm:0.76.1" - "@react-native/virtualized-lists": "npm:0.76.1" + "@react-native/assets-registry": "npm:0.76.3" + "@react-native/codegen": "npm:0.76.3" + "@react-native/community-cli-plugin": "npm:0.76.3" + "@react-native/gradle-plugin": "npm:0.76.3" + "@react-native/js-polyfills": "npm:0.76.3" + "@react-native/normalize-colors": "npm:0.76.3" + "@react-native/virtualized-lists": "npm:0.76.3" abort-controller: "npm:^3.0.0" anser: "npm:^1.4.9" ansi-regex: "npm:^5.0.0" @@ -16270,7 +16251,7 @@ __metadata: optional: true bin: react-native: cli.js - checksum: 10/423578b05f6cce87fefb2e47f4ae5d30ccb9a9b72f86c4f93b580280df784592be23ab803e3b435ab15c1e1ccf5d5d4df498a7d62818fe05f3715d9d0654dc58 + checksum: 10/973f0310ebb56eae4025de7eebf100c83b8e82cd23dd7c51767f004bdff0ed7eac3b6ddf19630376edaaefd3108953b4e3be728b59b3825b67426e02b7fb724b languageName: node linkType: hard