From 839cb6e6c8cc50eb874c0ad631f9de06baa1fdea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E5=BF=97=E9=B9=8F?= Date: Sat, 11 Jan 2025 17:23:57 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20add=20example=20project=20Signed-off-b?= =?UTF-8?q?y:=20=E6=9E=97=E5=BF=97=E9=B9=8F=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + OAT.xml | 9 +- example/.eslintrc | 13 ++ example/.gitignore | 71 +++++++++ example/.node-version | 1 + example/.prettierrc.js | 7 + example/.watchmanconfig | 1 + example/app.json | 4 + example/babel.config.js | 5 + example/contexts.ts | 3 + example/harmony/.gitignore | 24 ++++ example/harmony/AppScope/app.json5 | 10 ++ .../resources/base/element/string.json | 8 ++ .../resources/base/media/app_icon.png | Bin 0 -> 6790 bytes example/harmony/build-profile.template.json5 | 36 +++++ example/harmony/codelinter.json | 32 +++++ example/harmony/entry/.gitignore | 7 + example/harmony/entry/build-profile.json5 | 19 +++ example/harmony/entry/hvigorfile.ts | 17 +++ example/harmony/entry/oh-package.json5 | 10 ++ example/harmony/entry/src/main/cpp/.gitignore | 2 + .../harmony/entry/src/main/cpp/CMakeLists.txt | 32 +++++ .../entry/src/main/cpp/PackageProvider.cpp | 19 +++ .../entry/src/main/ets/RNPackagesFactory.ets | 12 ++ .../main/ets/entryability/EntryAbility.ets | 19 +++ .../entry/src/main/ets/pages/Index.ets | 118 +++++++++++++++ .../main/ets/pages/SurfaceDeadlockTest.ets | 135 ++++++++++++++++++ .../src/main/ets/pages/TouchDisplayer.ets | 37 +++++ example/harmony/entry/src/main/module.json5 | 49 +++++++ .../entry/src/main/resources/.gitignore | 1 + .../main/resources/base/element/color.json | 8 ++ .../main/resources/base/element/string.json | 16 +++ .../src/main/resources/base/media/icon.png | Bin 0 -> 35352 bytes .../resources/base/profile/main_pages.json | 5 + .../entry/src/main/resources/rawfile/1.txt | 1 + example/harmony/format.ps1 | 12 ++ example/harmony/hvigor/.gitignore | 1 + example/harmony/hvigor/hvigor-config.json5 | 21 +++ example/harmony/hvigorfile.ts | 2 + example/harmony/oh-package.json5 | 12 ++ example/index.js | 5 + example/jest.config.js | 5 + example/metro.config.js | 24 ++++ example/package.json | 67 +++++++++ example/react-native.config.js | 5 + example/scripts/create-build-profile.js | 39 +++++ example/src/MapLinkingDemo.tsx | 83 +++++++++++ example/tsconfig.json | 14 ++ package.json | 1 + 49 files changed, 1024 insertions(+), 1 deletion(-) create mode 100644 example/.eslintrc create mode 100644 example/.gitignore create mode 100644 example/.node-version create mode 100644 example/.prettierrc.js create mode 100644 example/.watchmanconfig create mode 100644 example/app.json create mode 100644 example/babel.config.js create mode 100644 example/contexts.ts create mode 100644 example/harmony/.gitignore create mode 100644 example/harmony/AppScope/app.json5 create mode 100644 example/harmony/AppScope/resources/base/element/string.json create mode 100644 example/harmony/AppScope/resources/base/media/app_icon.png create mode 100644 example/harmony/build-profile.template.json5 create mode 100644 example/harmony/codelinter.json create mode 100644 example/harmony/entry/.gitignore create mode 100644 example/harmony/entry/build-profile.json5 create mode 100644 example/harmony/entry/hvigorfile.ts create mode 100644 example/harmony/entry/oh-package.json5 create mode 100644 example/harmony/entry/src/main/cpp/.gitignore create mode 100644 example/harmony/entry/src/main/cpp/CMakeLists.txt create mode 100644 example/harmony/entry/src/main/cpp/PackageProvider.cpp create mode 100644 example/harmony/entry/src/main/ets/RNPackagesFactory.ets create mode 100644 example/harmony/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 example/harmony/entry/src/main/ets/pages/Index.ets create mode 100644 example/harmony/entry/src/main/ets/pages/SurfaceDeadlockTest.ets create mode 100644 example/harmony/entry/src/main/ets/pages/TouchDisplayer.ets create mode 100644 example/harmony/entry/src/main/module.json5 create mode 100644 example/harmony/entry/src/main/resources/.gitignore create mode 100644 example/harmony/entry/src/main/resources/base/element/color.json create mode 100644 example/harmony/entry/src/main/resources/base/element/string.json create mode 100644 example/harmony/entry/src/main/resources/base/media/icon.png create mode 100644 example/harmony/entry/src/main/resources/base/profile/main_pages.json create mode 100644 example/harmony/entry/src/main/resources/rawfile/1.txt create mode 100644 example/harmony/format.ps1 create mode 100644 example/harmony/hvigor/.gitignore create mode 100644 example/harmony/hvigor/hvigor-config.json5 create mode 100644 example/harmony/hvigorfile.ts create mode 100644 example/harmony/oh-package.json5 create mode 100644 example/index.js create mode 100644 example/jest.config.js create mode 100644 example/metro.config.js create mode 100644 example/package.json create mode 100644 example/react-native.config.js create mode 100644 example/scripts/create-build-profile.js create mode 100644 example/src/MapLinkingDemo.tsx create mode 100644 example/tsconfig.json diff --git a/.gitignore b/.gitignore index 7f8b6f9..8eb1acc 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,6 @@ android/app/libs android/keystores/debug.keystore *.tgz +.vscode/ +package-lock.json +.vscode \ No newline at end of file diff --git a/OAT.xml b/OAT.xml index 33c01f8..e87c9aa 100644 --- a/OAT.xml +++ b/OAT.xml @@ -5,9 +5,16 @@ + - + + + + + + + diff --git a/example/.eslintrc b/example/.eslintrc new file mode 100644 index 0000000..76cd1cd --- /dev/null +++ b/example/.eslintrc @@ -0,0 +1,13 @@ +{ + "extends": "@react-native", + "rules": { + "react-native/no-inline-styles": "off", + "react/no-unstable-nested-components": "off", + "react/react-in-jsx-scope": "off", + "@typescript-eslint/no-unused-vars": "warn", + "react-hooks/exhaustive-deps": "off", + "radix": "off", + "prettier/prettier": "warn", + "max-lines": "off" + } +} \ No newline at end of file diff --git a/example/.gitignore b/example/.gitignore new file mode 100644 index 0000000..7613cde --- /dev/null +++ b/example/.gitignore @@ -0,0 +1,71 @@ +.husky +bundle.harmony.js +package-lock.json +*.hbc +lintCppResult.txt + +# --- + +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml +*.hprof +.cxx/ +*.keystore +!debug.keystore +BuildProfile.ets + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/ + +**/fastlane/report.xml +**/fastlane/Preview.html +**/fastlane/screenshots +**/fastlane/test_output + +# Bundle artifact +*.jsbundle + +# Ruby / CocoaPods +/vendor/bundle/ + +# Temporary files created by Metro to check the health of the file watcher +.metro-health-check* +*.htrace \ No newline at end of file diff --git a/example/.node-version b/example/.node-version new file mode 100644 index 0000000..3c03207 --- /dev/null +++ b/example/.node-version @@ -0,0 +1 @@ +18 diff --git a/example/.prettierrc.js b/example/.prettierrc.js new file mode 100644 index 0000000..2ae7b38 --- /dev/null +++ b/example/.prettierrc.js @@ -0,0 +1,7 @@ +module.exports = { + arrowParens: 'avoid', + bracketSameLine: true, + bracketSpacing: true, + singleQuote: true, + trailingComma: 'all', +}; diff --git a/example/.watchmanconfig b/example/.watchmanconfig new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/example/.watchmanconfig @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/example/app.json b/example/app.json new file mode 100644 index 0000000..7586f6f --- /dev/null +++ b/example/app.json @@ -0,0 +1,4 @@ +{ + "name": "app_name", + "displayName": "tester" +} \ No newline at end of file diff --git a/example/babel.config.js b/example/babel.config.js new file mode 100644 index 0000000..4811361 --- /dev/null +++ b/example/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: ['module:metro-react-native-babel-preset'], + plugins: [ + ], +}; diff --git a/example/contexts.ts b/example/contexts.ts new file mode 100644 index 0000000..9437598 --- /dev/null +++ b/example/contexts.ts @@ -0,0 +1,3 @@ +import React from 'react'; + +export const AppParamsContext = React.createContext(undefined); diff --git a/example/harmony/.gitignore b/example/harmony/.gitignore new file mode 100644 index 0000000..72d73fb --- /dev/null +++ b/example/harmony/.gitignore @@ -0,0 +1,24 @@ +# it may cause some issues when building the project when switching branches +package-lock.json +# we add this because we want to keep the signing configs out of git +/build-profile.json5 + +rnoh_modules + +**/oh-package-lock.json5 +# --- + +/node_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +/oh_modules +hvigorw +hvigorw.bat +hvigor/hvigor-wrapper.js + diff --git a/example/harmony/AppScope/app.json5 b/example/harmony/AppScope/app.json5 new file mode 100644 index 0000000..058bd39 --- /dev/null +++ b/example/harmony/AppScope/app.json5 @@ -0,0 +1,10 @@ +{ + "app": { + "bundleName": "com.harmony.wechat.lib.demo", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/example/harmony/AppScope/resources/base/element/string.json b/example/harmony/AppScope/resources/base/element/string.json new file mode 100644 index 0000000..698a720 --- /dev/null +++ b/example/harmony/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "RN Tester" + } + ] +} diff --git a/example/harmony/AppScope/resources/base/media/app_icon.png b/example/harmony/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 PackageProvider::getPackages(Package::Context ctx) +{ + return { + std::make_shared(ctx), // generated by codegen v1 + }; +} \ No newline at end of file diff --git a/example/harmony/entry/src/main/ets/RNPackagesFactory.ets b/example/harmony/entry/src/main/ets/RNPackagesFactory.ets new file mode 100644 index 0000000..a106858 --- /dev/null +++ b/example/harmony/entry/src/main/ets/RNPackagesFactory.ets @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved + * Use of this source code is governed by a MIT license that can be + * found in the LICENSE file. + */ + +import type {RNPackageContext, RNPackage} from '@rnoh/react-native-openharmony/ts'; + +export function createRNPackages(ctx: RNPackageContext): RNPackage[] { + return [ + ]; +} diff --git a/example/harmony/entry/src/main/ets/entryability/EntryAbility.ets b/example/harmony/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..3574649 --- /dev/null +++ b/example/harmony/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved + * Use of this source code is governed by a MIT license that can be + * found in the LICENSE file. + */ + +import {RNAbility} from '@rnoh/react-native-openharmony'; +import { AbilityConstant, Want } from '@kit.AbilityKit'; + +export default class EntryAbility extends RNAbility { + + onCreate(want: Want) { + super.onCreate(want) + } + + getPagePath() { + return 'pages/Index'; + } +} diff --git a/example/harmony/entry/src/main/ets/pages/Index.ets b/example/harmony/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..5d4aa1e --- /dev/null +++ b/example/harmony/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved + * Use of this source code is governed by a MIT license that can be + * found in the LICENSE file. + */ + +import { + AnyJSBundleProvider, + ComponentBuilderContext, + FileJSBundleProvider, + MetroJSBundleProvider, + ResourceJSBundleProvider, + RNApp, + RNOHErrorDialog, + RNOHLogger, + TraceJSBundleProviderDecorator, + RNOHCoreContext +} from '@rnoh/react-native-openharmony'; +import font from '@ohos.font'; +import { createRNPackages } from '../RNPackagesFactory'; + +const arkTsComponentNames: Array = [ +]; + +@Builder +export function buildCustomRNComponent(ctx: ComponentBuilderContext) { + // There seems to be a problem with the placement of ArkTS components in mixed mode. Nested Stack temporarily avoided. + Stack() { + } + .position({ x: 0, y: 0 }) + +} + +const wrappedCustomRNComponentBuilder = wrapBuilder(buildCustomRNComponent) + +/** + * If you want to use custom fonts, you need to register them here. + * We should support react-native-asset to handle registering fonts automatically. + */ +const fonts: font.FontOptions[] = [ + { + familyName: 'Pacifico-Regular', + familySrc: '/assets/fonts/Pacifico-Regular.ttf' + }, + { + familyName: 'StintUltraCondensed-Regular', + familySrc: '/assets/fonts/StintUltraCondensed-Regular.ttf' + } +] + +@Entry +@Component +struct Index { + @StorageLink('RNOHCoreContext') private rnohCoreContext: RNOHCoreContext | undefined = undefined + @State shouldShow: boolean = false + private logger!: RNOHLogger + bundlePath: string = 'bunlde.harmony.js' + @State hasBundle: boolean = false + + aboutToAppear() { + this.logger = this.rnohCoreContext!.logger.clone("Index") + const stopTracing = this.logger.clone("aboutToAppear").startTracing() + for (const customFont of fonts) { + font.registerFont(customFont) + } + + this.shouldShow = true + stopTracing() + } + + onBackPress(): boolean | undefined { + // NOTE: this is required since `Ability`'s `onBackPressed` function always + // terminates or puts the app in the background, but we want Ark to ignore it completely + // when handled by RN + this.rnohCoreContext!.dispatchBackPress() + return true + } + + build() { + Column() { + if (this.rnohCoreContext && this.shouldShow) { + if (this.rnohCoreContext?.isDebugModeEnabled) { + RNOHErrorDialog({ ctx: this.rnohCoreContext }) + } + RNApp({ + rnInstanceConfig: { + createRNPackages, + enableNDKTextMeasuring: true, + enableBackgroundExecutor: false, + enableCAPIArchitecture: true, + arkTsComponentNames: arkTsComponentNames, + }, + initialProps: { "foo": "bar" } as Record, + appKey: "app_name", + wrappedCustomRNComponentBuilder: wrappedCustomRNComponentBuilder, + onSetUp: (rnInstance) => { + rnInstance.enableFeatureFlag("ENABLE_RN_INSTANCE_CLEAN_UP") + }, + jsBundleProvider: new TraceJSBundleProviderDecorator( + new AnyJSBundleProvider([ + new MetroJSBundleProvider(), + // NOTE: to load the bundle from file, place it in + // `/data/app/el2/100/base/com.rnoh.tester/files/bundle.harmony.js` + // on your device. The path mismatch is due to app sandboxing on HarmonyOS + new FileJSBundleProvider('/data/storage/el2/base/files/bundle.harmony.js'), + // new FileJSBundleProvider(context.filesDir + '/' + this.bundlePath), + new ResourceJSBundleProvider(this.rnohCoreContext.uiAbilityContext.resourceManager, 'hermes_bundle.hbc'), + new ResourceJSBundleProvider(this.rnohCoreContext.uiAbilityContext.resourceManager, 'bundle.harmony.js') + ]), + this.rnohCoreContext.logger), + }) + } + Text("1233333333122 1212323") + } + .height('100%') + .width('100%') + } +} diff --git a/example/harmony/entry/src/main/ets/pages/SurfaceDeadlockTest.ets b/example/harmony/entry/src/main/ets/pages/SurfaceDeadlockTest.ets new file mode 100644 index 0000000..88e4439 --- /dev/null +++ b/example/harmony/entry/src/main/ets/pages/SurfaceDeadlockTest.ets @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved + * Use of this source code is governed by a MIT license that can be + * found in the LICENSE file. + */ +import { RNInstance, JSBundleProvider, RNAbility, RNSurface } from '@rnoh/react-native-openharmony' +import { CustomComponentBuilder } from "@rnoh/react-native-openharmony/src/main/ets/RNOHCorePackage" +import { SurfaceConfig2 } from '@rnoh/react-native-openharmony/src/main/ets/RNSurface' + + +@Component +export struct SurfaceDeadlockTest { + public jsBundleProvider: JSBundleProvider | undefined = undefined + public appKeys: string[] = [] + public numberOfIterations: number = 1 + @BuilderParam public buildCustomComponent!: CustomComponentBuilder + // ------------------------------------------------------------------------------------------------------------------- + @StorageLink('RNAbility') private rnAbility: RNAbility = {} as RNAbility + private rnInstance!: RNInstance + @State private shouldShow: boolean = false + private shouldDestroyRNInstance: boolean = false + private cleanUpCallbacks: (() => void)[] = [] + + aboutToAppear() { + this.getOrCreateRNInstance().then(rnInstance => { + this.rnInstance = rnInstance + const jsBundleExecutionStatus = this.rnInstance.getBundleExecutionStatus(this.jsBundleProvider?.getURL()) + if (this.jsBundleProvider && jsBundleExecutionStatus === undefined) { + this.rnInstance.runJSBundle(this.jsBundleProvider).then(() => { + this.shouldShow = true + }) + return; + } + }).catch((reason: string | Error) => { + if (typeof reason === "string") + this.rnAbility.getLogger().error(reason) + else if (reason instanceof Error) { + this.rnAbility.getLogger().error(reason.message) + } else { + this.rnAbility.getLogger().error("Fatal exception") + } + }) + } + + aboutToDisappear() { + if (this.shouldDestroyRNInstance) + this.rnAbility.destroyAndUnregisterRNInstance(this.rnInstance) + this.cleanUpCallbacks.forEach(cleanUp => cleanUp()) + } + + private getOrCreateRNInstance(): Promise { + return this.rnAbility.createAndRegisterRNInstance({ createRNPackages: () => [] }) + } + + build() { + Stack() { + if (this.shouldShow) { + ForEach(this.appKeys, (appKey: string, idx) => { + Stack() { + Blinker({ + minDelayInMs: 1000, + maxDelayInMs: 2000, + blinksCount: this.numberOfIterations, + randomnessPrecisionInMs: 500 + }) { + RNSurface({ + ctx: this.rnAbility.createRNOHContext({ rnInstance: this.rnInstance }), + surfaceConfig: { + initialProps: {}, + appKey: appKey, + } as SurfaceConfig2, + buildCustomComponent: this.buildCustomComponent, + }) + } + }.height(`${100 / this.appKeys.length}%`) + .position({ x: 0, y: `${(idx / this.appKeys.length) * 100}%` }) + }) + } + }.width("100%") + .height("100%") + } +} + + +@Component +struct Blinker { + public minDelayInMs: number = 0 + public maxDelayInMs: number = 1000 + public blinksCount: number = 0 + public randomnessPrecisionInMs: number = 250 + @BuilderParam public renderChildren: () => void + private currentBlinksCount = 0 + @State private isVisible: boolean = false + private timeout: number = 0 + + aboutToAppear() { + this.blink(this.minDelayInMs) + } + + aboutToDisappear() { + clearTimeout(this.timeout) + } + + private blink(ms: number) { + this.isVisible = !this.isVisible + this.currentBlinksCount += 1 + if (this.currentBlinksCount >= this.blinksCount) { + if (this.timeout) { + clearTimeout(this.timeout) + } + this.isVisible = true + return; + } + this.timeout = setTimeout(() => { + this.blink(this.getNextDelay()) + }, ms) + } + + private getNextDelay(): number { + return ((Math.floor(Math.random() * (Number.MAX_VALUE / this.randomnessPrecisionInMs)) * this.randomnessPrecisionInMs) % this.maxDelayInMs) + this.minDelayInMs + } + + build() { + Stack() { + if (this.isVisible) { + this.renderChildren() + } + } + } +} + + + + + diff --git a/example/harmony/entry/src/main/ets/pages/TouchDisplayer.ets b/example/harmony/entry/src/main/ets/pages/TouchDisplayer.ets new file mode 100644 index 0000000..2c62df2 --- /dev/null +++ b/example/harmony/entry/src/main/ets/pages/TouchDisplayer.ets @@ -0,0 +1,37 @@ +@Component +export struct TouchDisplayer { + @State currentTouches: TouchObject[] = [] + @State touchIndicatorOpacity: number = 0 + @BuilderParam buildChildren: () => void + build() { + Stack() { + this.buildChildren() + ForEach(this.currentTouches, (activeTouch: TouchObject) => { + Stack() { + } + .width(64) + .height(64) + .backgroundColor("blue") + .borderWidth(2) + .borderColor("white") + .opacity(this.touchIndicatorOpacity) + .position({ x: activeTouch.x - 32, y: activeTouch.y - 32 }) + .borderRadius(1000) + .hitTestBehavior(HitTestMode.Transparent) + }) + } + .width("100%") + .height("100%") + .hitTestBehavior(HitTestMode.Transparent) + .onTouch(e => { + this.currentTouches = e.touches + this.touchIndicatorOpacity = 0.5 + animateTo({ + duration: 500, + curve: Curve.Linear, + }, () => { + this.touchIndicatorOpacity = 0 + }) + }) + } +} \ No newline at end of file diff --git a/example/harmony/entry/src/main/module.json5 b/example/harmony/entry/src/main/module.json5 new file mode 100644 index 0000000..9f784b3 --- /dev/null +++ b/example/harmony/entry/src/main/module.json5 @@ -0,0 +1,49 @@ +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + // below property is supported from 5.0.0 - it is needed by bundleManager.canOpenLink to check if the app can open some url + // "querySchemes": ["maps", "http", "https", "customDomain"], + "requestPermissions": [ + { + "name": "ohos.permission.INTERNET" + }, + ], + "metadata": [ + { + "name": "OPTLazyForEach", + "value": "true", + } + ], + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:icon", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:icon", + "startWindowBackground": "$color:start_window_background", + "visible": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/example/harmony/entry/src/main/resources/.gitignore b/example/harmony/entry/src/main/resources/.gitignore new file mode 100644 index 0000000..037cea9 --- /dev/null +++ b/example/harmony/entry/src/main/resources/.gitignore @@ -0,0 +1 @@ +rawfile/assets diff --git a/example/harmony/entry/src/main/resources/base/element/color.json b/example/harmony/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/example/harmony/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/example/harmony/entry/src/main/resources/base/element/string.json b/example/harmony/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..074b217 --- /dev/null +++ b/example/harmony/entry/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "RN Tester" + } + ] +} \ No newline at end of file diff --git a/example/harmony/entry/src/main/resources/base/media/icon.png b/example/harmony/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f05abe7eb110a3c4958a48f71ea15b28bae5d3 GIT binary patch literal 35352 zcmagF1z1*Fw+6cCmJaEZknTnrl$4Sdk?s$qySqe68U+LqL_&}b0YPb`yFdy z|D1ErIrl!#_St-E&NXI@IpTfCiqcS1#K9!Tgdhk>XW2JtgS>$`u8F z!yj|e)Bf$^W+y@aOjUzc)(K`oE5Iqh$xSbbNh=O}X({?tPT^lKgI^N#)^2XjqFh`a z9v++?e4I`&D=r=p5fLtKUM^l<4$yl>si|9~p8MuI4ZsXEz%sM_RZ{ zvlmXU+$8AfK|Afggj;yp{HJtB*MBV^Yy=m)g^P!io9n-JceAnlKf1$P{zrFbYbQ4+ zS8FHde=p#_4e{^h|M4Q&zW@CdPc!HLt+T4?|95u>hyS(=S2uZguo3^-)c-c8{}{kk z+soO4>#2pS(<_*{g}l3kqZ`BDoq+F)sD_QFh5a)*8wU$VSFpPh^a4D*|F2g4|EpEj z$=(U31=Pwyf}ZE^OYprDRdz75ve2`6>1O?((*CnS#lq3*f3(17Xa5R*ygH6HU_Jj# z;qOb&{%EX>HTMuvaGBI%*oQm9<;eWRg|Gs zmX{Ue5fK#R;N|>h1aNSo;9VO_FF7+e(2JLwm!E^1hl5v8n}=7FmtT}y@F6#kC^z?C z$$xu;`|#4t&FufLKU}M6#lah@s-j9Zu5L~+ufLD}QFSc~mw$f!^V8nuua48w{yk|? zGjsSRNzgmPoL;^%w|Mz?a3JoVR#zuWHxDzIg|rnoWC?m{OG_KDonEvWaP6h#;pE}w z6#VaRcvxEiY5(`yxc)UWF8HnckEw}s{g26u|LyQ!t|@r$pJ(9u13SX?Z$kop{M!^+ zI0E|v1BON}iZ&X85Q1#LvHXwYfFPEnS4r~^Lo~^{r6@Afi`HadpZOohS=zc3s>pDZ zXB=)@`kX!4?Vi4Jw5iu|BxZ8FZdl-2(5=^vR_Z0F6_NM*ZBq$o}DE#Cui{O-NOtTJsrm zKx*R(+mg;>>yOFwst5@s@*i>%1z5dh6vC4y?^^uEUUxJBcIFSYarXm$S9{L&iU}ZR=K&s-)DZT{72+$j&*O{%hO#JHg|+-wbpz#qlJvu zLLXg#+G-6kBa&g$qCR4Tumbmy0%Fl_HxM=;YXs}jo-{my(MG?Z4BUpYaPnvZS={Dp2xZVWsa35JDoI;Op}ERQ`;)CA zqU#bUF^DCa1o{mL)3j>1neJoIg&rGW1v)^I2$emSUuw#-)Ccns1Cca|a3D@3Zo*a; zH>o=2P`q|^hQN7<9brG`r=@FYmU?R;;-dm2(i

8tD=0#(XlKOv)0H2Ihh)q^`+B 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 z zbS7ZaZabd)qJY-Xd1nfY27I``g(WnbB5ct0qxLAP=jYd5v#;G>j$dCX*x&tLoe;gE z=XbnRKD~|anjIhZyH_ta1kUNw1M7*3{FIm8<3FSuIp=jwZAL|8@6Jv+JP82gq!l~r zT9J6&5JfHi7}f%u1y4oZBA|}d;nM6|u3+FEX`bE!rRMRyeZiR3&AAs?_KP1~t?>(pla&{S~s8Em$PtPH=2INk9 zi%!v6^G8y%`N`zvjkS>x&TkKej(*`%Jg#&}zT)t@BX--Fe^@W!lwCtya&f9v{bwqC zKUR|a`-7hGw7fAo|8^qJ9fuu7NkUF*2HF~Q#Llw49sfBl21R*{==qEUkmp>x)5n8C zA(xnd)N7+LO`Yht-zu92d!!=H!r=pk{nc`%06?Lr5X-($)4sQ8Gg%p*iN0Ow5=k!J z@SCtj{L~$8byTPQr9s`Q85dV7tJWsS92B_DF+mtP90KAx@AWPT8cb5;Sg#|y^r!C} zh<7*L7Sdu8BD&iGPNhhL13_+<=r=}{9MGM^W_XEeACq%5J@8HgQ2T6n{07IlH^NT` znpJ8gXQ&)l{MWtUc@cp9lFDhQeH}>wq5Z5AA$e+>p1DTezyp26YhLn3(7S2<3KS>!CrX+?bX&~SGHCq|$`4Y;xe^p6CzAr^qc58ZuYPICKEf9M8S>&v$mJ-MzA zGiyJhHJW%`F7|@}hQ6aEYG7TqBYdp;y8fI{-OB%T9;o`noNqWQDi^99B`?=EVx+qh z_NDLH?0tBjcmxqZ<;9~P8EG=4_@E$EqUxjB9*57SB&b;G;KzI(`y?2kcRLco+mc7a zaM(s2W?GA)j{3d9v!c$YZ*NaBY>ois$uCG>kf>?}JCs$V(B}@D4N+S<0ZL&+-|(0Y zNCe56e!B;NS?5S;6t+1nEYDy}*4(GFW8B}FpVPp{vEH#dL960Kcw_Shu>pq)BLIh#j7iQx!fFY zUunO2G4iUoZQY&bz^b~)Iri##)5>nax2@93#pvEZE^f?2DR{l&jpH3||KyEDlxYo& z6)*;P#0YG8_z=pfQ9v$x$1MovuI7C(zU4MW^a&Pk?Mu^G$dA(6@O>2UmH-?B_1BbXad z%RC>;UHfKfKgkp>9}0NXL3NdIbIpqf$Gm2nRAE<<{vq*SCzUQQem|n2dMF|YrT8_1 zOx>V}?CJd%OFTQ1XWy9fSv_0(crXx$f3=`?I zcm-hZXG0ICb(r-VDNt+MIWER2b5T`Sk2`5)DnM~SSnLv~91mcdjEparW&rPi-3+=5 z2tDtX{cS!UTrXXR;_%ZWm#0Q*rui0J1~6JUt0Mqde@Obru!d^`ELB0gg$O{eABF?e zL3K~wBgvpXC0vrg?S#`t;#RCuNByFE5F%;nzf zZ`ox|1Qn*q%uZC=*QdTZOx1Gg>Zhm&kv z=9ua8Y2&oKvgS-fl>qoR1GDPGzaMY+<3~y@9!oU~GFef+a(tv-4WQ%GaGXO5zukl5M_{L|mB>AOOOt_!6V8A~ik| zrytLFl67Zlll1Chx1Vs--bteHoPfzs8#`R`hBMa1o`U2<8<WRWPbUPu=p|%O0`3@GKJ<JKl%C0!?KY!xSnM`%9vdr|odeBB@=(`!oFB zGcO($EF9=N3ywWWpo5pK@^FbAp%txQpZl6rvp7%9W=r; zr$4g3G8!k~mPq^o+Q7fbj7<$x6|;J8x{Ii=4)9+R9)Ia1)aauk4eCe4@(ZlBJIfv)WwfrDZF$|E zfOy(+BtA``Fa11I>}ks_1*o!oe@3&gHSQnRo4hCZJ?jd`2{}-lI z$@%UDNE=dQ6@toPVcv#+bp7kevIU5vPc!%}F7btUF<+);88PN~=M?z4gQ9xa#Z~m_ zh1DBVPTg{+08QW~j)qmB%6k+M8+7KvFXe8dF`@WjtGQOnLieATDV)ZwbZ=XKR~-p~ zXsXP!h1y5#F=(Ui`&=W9(hx{(v<4u)cDeZ1!8L?D%p6}!| z{8OLtTmT~0NbOG(F_U?UQcawU8rw&_!H_w#VqXN?aStG8QLiTjZ&Xx{9XAEv^{`3WQ@#<)+Kx}U{Q)S+l9|Qm)6LIy4=TO_RFm0l%&7d;4kU=2~Z|cb#pn z*kJVB_+hiBX+{&JucQt$_2oD40uR*$V4RnDdo!;A3@;o><-x0U1wVq-yo^U6+EiFh zJ*hg=YFK&IwKs>H&H1iYJPs&**WOa2@x2s(mOHh~IK%M{O?`SFsh}UztF5i0$^>x?{8SSpY$45G;R0^jwnAuEE5B$dpzQ~or zKDvzkV5*`iU^=toCj)i9lmLTCo;Hm5qFVhR0xUL(P7ndqxg<~P`CcG^z_dFySPM+A zGL58{q{Z!^tdz2vNW%W(l3yuD5cLP@|ELA<-f)RN+kEAozY=oygJj;s;9U=kPTrB1 zI8b;w*j43<8~9XC*pdh^`OiD6^n`suQPIOJv0U8M+-8O+8=o$1#}v#)zf$NL0!+B{ z*zo2juN$v;h-BuW`h5QCHwo=8-XaS}j~xe&GoIX&Mu8YyQ;$i_`+oi0C@ot`S9LDC zxW&>RUr+NtZ?G-o25eR7aaqy6+be%7kf8D2*F}bxK_A_a&Mc#r0a&|wC#6}FpwEg^ zgoqf51z{LtorCUqO7)}lSMCKclz9%_Y@C{s+cm;ZJU)-jx#`*I^xrg(5v8UVoPP>L z(+Rl2Xdt)!`u!uQ4FqA}@AS6#)h`LFd})+G2Ne{;arXgG3$N8V|g-)urQgQ^0kUo*07<+CXvM*Ur)#7nHhZ`JE>8elitp z0S`U)7r!ynkbZ~H6 zm5L#mZlOKr*0}NzvRdONrCZza2hGA3L(P^PU$Y`{LSNg&bhwt553@F?};@tEADl#dDIGGztg|nx%$G7&c$h& zUq_~7|BtL2pD%YEIif7~;w&ReX7+089U776Jfr@5KP|2Xm;hqQ&5+c~iFY?KgU1!u8J!+<^xamn4G}Iid47N;3GsKx zaJt0egl6%JB{J}d*M)B!pddP$Ul9^y2d!6Y#0<8|0P2)~M zllkNPUthld?xF|2$pFC!e0=vJcK#D2Kfs(@>DKr|{>b@S*Jw2uK50lYX~^h3xSfL3 znegz_ywIC*Gy%K{63)kfs>mPWpeZ8_4DoUF495A%UC~)7v8Q{bwYMdxW~yy?2+To= z^=D#9wiz&Gw)z1A#elVQ&di@{nqYZ%rg`o8;W zr0MQatwzI7J`>}xkKKosd7@*E$cngASQ#_O&;s<3AY2uWc zzxHlESTZmpc7#?mM4r}M0($4iYVLS0p9)k}btNF(C-zGTEedB6i~(pw5T$_q3x=jj zP;2vbr%dU>6+8{{5`FXGekB}ldgr>$07q}+d7U;;lB3U4%KH#o!RL;?=MQ?lV{dw1 z>p&_x5L8uuKX@fF zt2dmrRHC$f@CWtT?`E~s7(_UO~b<8XfwG;mxk|$u;qoG9sOsi>NQMxoki5n>*|;)>%ssF@}*nmZ`i4)gEIBt?fPar^Fk^!o|&RZlaic zm4NO3AysC&n9c6p-PCe=bXf7zu8+O{u@PBhQIR?D+5mP_$}ef?@#Vn}wl z!p`ma@pgk+e`)U@Ex1;#E6c-Q6QezZax_GNG7s)pfTgc)fK-;pwkc;WP&iuaHkckk zbMne_cP7hdWzG4qndh#7g&2`QPxH09#f`YMIjZ@KU20A@?<82&%KhWHL88avVDKl? zb6O{DzNxE#N<%7c2?y{_Yy%`#8R?U^k92kyzbw#%vt*W9WrB1ht6`P&h~y{Dn%8im z#eIbPkB-->b!VpjWUY-^vI`v#(`*mm!I}Ul(1tz}&8;xw(10d95%fj3OdnIp0`0>W z5WdD=408;J6n;P{sR86RH5%%e2z)2Oao+Vf=T1(L$pL|ZE^r|xYWhCODIHUPu(w>t{f}cju;~KA zRF>^~~q*FLn2?G&lLq;RPB6n!cU0>VW`qsTM zp-)Nt`^m4M)ZHvX>*SA3!R3mt8ef7&X79Kp?lxyUDZeXTPAGLZ(_%A{1}MS&5Uy|! z!elZ5Tm5K&;nj6S{Hx=1kKI0slFqG`r}xPLmQx&C4A2lLbpcLpBK*bu_-TYx#5Rb! z0dR?OUIY?so*N6XfS{w$Fp%#_If}b6KUBeTH0NBI)(|d4d=#RZa zFsK{rMJeZ9&xs6^y~eCzQhNrRW`Dp0W?SUp0Tfehi>a1VvMD(lvO&V!wL3lF;V#=d zC=6O}Q;@vHG=oK&-;Cgq4u@C)7Z&}c`$tvI_pd=z+yUy;B>o<(x{#10r9^-X9%gu{ zqCu!SM~l&I_e1&B!K00_c2EaSsn|tl!S*DXQ@WGn5cFBxw|>)!pxMtynUhvmmAe@)%6plt$fCb|KE@n0EI}Fsc zL03As(vlC!&U$iPh_&L6ekk2dY>FBZ$^RBPL7>~dG!Mi|~ZJ%0I%22+th@zz_iYw=!0 zEs534kz>&Z`)SKPDyza{_%e z&JyI$_kE|;&NdwiBPb#~;e%Kh&41-2^Lib8l1&y9Dt{SVrI&;nsnlc+m&I4!9sLVs zBiB5iQ{W&jJk)gOQ6}wn7(r0iL?WNK>_qCmy^`3D@1DDc_f>ExQ8yAqib?7`1HUlo zqStuLLpbmIRJttG#dTWi-Gd;juiPCqX$0(vE4!ixyR}WvX2l&}0DlijxOesXyi_mx zn#Z8tI&LXREHvgD8)N*Hwef-6P2!;WrJ8I7bcCSiNl`QJ9DKxAS}{#WT6?6jws4}X zyhoYhHeFft=IIpo!AqUN@5VVx5f@( z^0ycQ*2B${TFQj{p=aKvI;%VDR$TgXs~7Vz*yBDIl`GR5TcnKCE+s4H{`8#OaPGC@ z0gf1%^7^)o!_y0ZHTr&Y{oRjRv}jczre&6xqW89qXYfzCk3O2KcYe2&Qi$kN%JNVZ zJ8;t7x49OH*YY{mn#knNi?km<8~c)555HUf@W@5{FJ$DBX766NC$#6b0awyu&rLZ& zRKIS9i4p2_{Iuwmn}mH2kL2vG&2@dvb%M)0S<&q7)BYvCvU4F=e{>WDBdsYbtE-2T zV&QE$4PWs}(|i^Bv{-(T5_1dGu#E<+ZL`n{xx&xZI0O`z>RNe$TQFGYJQt05Nk2{G zol_yPdfL4$FWV}J_ocD%<=9mh*Racy|$fV}*xh#X1! zF@CMPE5moL>`QvmI7v}|dK#|GUZ;OZWo}5Q7u%a|JbE@Ai4oNOt+^69ss=IOcYA}t zHHJL<@0^a)an=rE~p<;#< zjk~ZE=WD5ljJ=;%#pzk9eU;F#45%acJXJ0`idQXg6>P`*8CTdIeNpVfuWl^hl)P+N-po9Xt0irW`Y6NdZsm#q?uwZa6F{?_7}(Wl-k& zLg+TA59dD6#ht>GmzJJS;Y>5Q-(GHYXes-4f<^PT!x+pEKjU}nOpb`>VtSa?&yKQ{ zQp=IL>p7pMNiAdlfk*e)fhsfj^I<`+b-au0U&0NNMJY?%JFP99@i3}MJgZ*sTBsqm zt>2f`RpnHX2xL_8_qIee(=y2Ay}#eoJv3ZQKChzx*xV>$T08L_1eWV>*Tu>v%5U+5 zFJ6uvPNmUviChMkNBH@($#QcEk~ zY$_x0_(B3>mvw!0)H|FyKJd2T0m<->2RKRrlUz0eyQ<-9WYxMq%I`J;;hGi~wxzfG zBjY{W>DSZAF-g7GWlPe0T}&4lo2b7Nk!0=Tm=|{)p$2t!wc`>am(O9jhEkQec$(f* zVRx8zY;lkjnVjogpRB+w+`=vW`1TD_mfTtMu|-LLzfnpU);2NTvx4^3ytatcJl33B=5Kd>FEJ_XZ!sM1;etK@8o<>0 z$wg4n) zsFJ8GwA7ReA3Fmsu}@;~hJl|6q41H0!pSMY^7esZ_wR(I{lEj9_TTmT6DHf8s)zp7 z1~V)Xzw4jqf8`4!7kc9O@J$&*4UbqsgU)I>FVdj{n6;vak%}FgJ+IBjo%;=jG|@(f8%e=`Bsf!?(zYLR>Lhr%c&AVyNVwi zD?Jl}x&3WuQR>bUr&^)xoiSmpv*X=gG5iOg+QQmR9<+{Ak@wd-^*>y(6+NrKq>3pV z^2)JhOPyNnsxKZ2Xv)*n8aO;8n_bThFXS}9}s-5 z|Hk`}d7#B=$aWR_%5?4hy=^wM>i_n#Vn5z+SXXa-%BS$*5|I}AIX9{!_;7BG8+u2N>4vM`Vr6cv&c}ZAXetjhP-Tq2f7rU(Hc?x|l zZnBhuBW7S5Dj3qZ*A+Fq_fLyqep0@J-(SPjo?rAjZ-T23d^$Ia#`wBB=zJ2YSnz;? zd{KKF@tYh;4)=~w*oQn1qg?6t?G3Kfw&qiz5H1-{XDo;z)2waJKY&{-TPcJwRkIB zEO^gty2hK~S*#So25a#ODW1w(fb_SUG%7etes4KV90H>GS@ggZWM7T%TFqMhE|JizA&EC=;_2RBr(Wk^RDKHQ!EF^i3fpn};Yfs$Kv&JYBe zPzYQcAr23=rXc^O5o(}8=BG4jOA_+uKEbo=G&$}I>}M=4WKkk}EgXan_hZk$Bkh*q z2_s0Yr)bB!_A`J%z^(!L%97piLq+pB;w5%=>iPU8Y9v(-`|nBL`7lwU(Cga~nb?-x z%doA3B*l`?V#a5@er;B=w=$s&&Kqx)Kl=pOZ|b-ibML)4$L}-oOdxm_h?)r@!j;cO zZ=4kmSL{&8$5ICNd~|BrH04dj1HvnO^bmAPFr+B|3LT(u5y|qM(U}q1zSqSoUM@`+ z^tOhbcE83l=xa`|d3Lem^cX^Ou<3zNCKa{zYwxOz#IAw7#Bh zLJNgoAGiBv6&15BR;@ebY=IXW2Uet~=|JZ77k<}^d~a__%J0M_?MV&g(hIIMH{SSs zh3za*TbHT)wTh)2(1yB7n-QZX^;AFlrDX3Sc#s9YJ>IE8f}N@=^(N{PNnd7=$Nls} z3c^bqSU!8z{?r$%ZZIi8*XUkH&Erx~*Jjf@QDBI$8BRm~6+5=~zNhq`ss-c2mVg9b zsp-QhrEeDWS3LyrqJK5Qs8fpzG~$h1DAq`56o9vjvS5P0)(%gr3|t_yHKZwq{h&vL z5AgV!bbS_Me^LP~ z(UFrFl7*lMS^F=(^+FunPhY)KnIRqT6Xb~GMK0z-sg%p3Vp4vS8SC`lvrlesFH)PD zyAm>j^B64Yu6h!26D8EOq<*S*z z`9pTo@#*okVcHi{;?9eaN|eB?^7x(W^u-O68I=UK!KP7BU8ZrriR|3@Q|qyPt+^U3 z&(%QJl0e_>_RM9G!rBQrVA0gEI00^FPQ?`m@e7gV_J);`347;FN*EKp}+ zhfdUPIhy0VXxbU~nrHDd3b8z=5;>D$4y4N{opOZh4&u=f!WnIGXebQF!>KR_O#bq1 zVut@#!L)yZCC$kVvSJ<=F+|s4%1;N*MbBqX1!-}-t?-61a1xwbwYRTFYrGQ=A!;tN zsDI9c7$Lm0P1_6Gx?>){WQR&PK2qN8KT|-p>FScsO`hrd-Wd)0-X|tEf@_ZYYLH!i z)V7)O-#Dk=ON$h7XdW;5X1iR4epx070PFLl(PVnPwBUNJWvgT+cq{%fYGnABSn(3y z=XM<~-J;tgsS2Vpf)p){Mk^jR`Pp#GLeXS8V4oJau&g*%79oUqK2L6b^}FgKQj=N= zqzj|%|m)bup4@Qai%LQev=Sn2YQ>yCngH!#Ng;E`r5UQCchJU1n{2zqBf@va~JXAzX z?{tdh+P!J}Obp;H&C`oWnNXX7yr^A`l(o{s3WfPu#(wA)9k@Nce`rGfKfHdg}&TzObnF&k0ax<70$ z^!`MP#ca<`Ri}IAehYrwt4U2-F`Hxm@^Md-S^SPjFwTGy&=iQT#~&p!q4UjLg^@kN zt2Ae(a~Y8DM0v5@w=2_L2|&o6Rp@dnc32*YqFPrFA5G^8+)|BvkrAhZa1Cv)=`$%vq^%R z7PJ5^9E9)8|NdQt z-6X++y94v_ha)nheLD|JdAJB9=!~7;oAg=iW1_W#b!Z}EcR~3@K4p;u$@D2@gQ>Y z0P^Z-qUwS>M0Y#LJm>iTdlAI z+iVxbLhNH=j_oWc%w$poiMzs-Ng3$n-t(s~itZK-*X>Y%!6XQKda3mDaVoMr>#-UE3L&lN;$nac_RDCcF|_3wt&@E_(xk4CFrZPLfh|W~#h}G+ zvhpu@74>lm*u~yIYc+?H{v1IitZ+ye7VyMKa_P|;4JV|m?Z}Sq2ile1=1_$hvUflB zrHa#8ZCrnF`4jHxZ)WM-eI;hc9>y~b3sJwWVOi%|mL zo4(S&C!B3}^Jcon;Uv9e^K7tCUE;v0lSR2JTCAt`t|s|!wTdC= z{gGBXBZw~&!3oR>jxFN zcHIYwOp&#%+ztv#!HpO5{uux;$*pUtn0AB3*}!#;FvkU#Y(k@Iwu`Sj?Hb5!Zsv#P zK{VA=Lb`9!=@|(ws;|hy3IwVID3yJQZ7%CAWzvDh`R&$5ZW2*;)r$<$87(b%&)(-E z)-KqWV{WjBU2u|~o=;bcyV5-otkT9MMZ5q(@yeR`T+$EkmI4+N9)MiE)6u&u1u>CO}?a(Q>e?saptkza((<4++gUjPmR3PJ8%xLzG%q z_wZBjMh+_>+NU5AHYTRBw#Rld_X463dqHU`)B7L~*LH;(=x<7jTn!x50*pKTS^ zYs%lozTQ@27l@pScU1wp>?k08s7{e4F^Rvd|*q!mNE$~33v%y z39WaBx*qx25mWmiO|L0lb+e~oQY4D`BSCM0E`3YSY>99= zx_o1;eoa}pvjEoy+IhwTh4 z5r0hA-)6~VS=+!VCz+#eCIgS2Rl@sywlNs=3@ebTBjQD~`}ecp(A>nxcD}ko;+FZ?HaPLkl+QU-s^npXyQ=T2HQtOu%&LE z$_4DU@Tba_U&}d(`IBrgV_T<#RS~S$W%O;uySR4_h8T^2rS7zwQ;kG?gD(P0FrC(= zgxei!e>3m6nnDf#+7jKyU}TfOXkh!9%8;X0T`e0BiqzUPyED z!6w_MGa2Ug%D%DyIh%wS5gBDpCLm!DfS7PIKA&K5060K05DLBEl+&p)F_cFI20)n! z?&t2U#%ber(5C4zl|DGbp=Vchul%Z`GikN9coetu2@5g>4$<0-0(=#^QBekjIYgX- z_V18n1FTs-FAu0j6XIDUzwVh}kcZ&NAg$r~;DmW{=tKU-ro?aHdM00Ra%%Iy8)Y0s zMOv4ww^`E@8dzWyub+s57W`*$@BSH|-kxXTGNr|3eYGQMVIOpo%x+fZf;wO-d@-QY zCza5O_j6pWDIX_UdvM2G^QDl8tZk=~2Jj@dtV?t!r%egZ|1w`QfJuF1l2CP=(=@!F zO1ma{nR62OfExaZ*FqE^Nrd>t!ocUIml@7$0U;^==<2=ic%}C9`N;%HHB)B!7GU{h z4fsEjKpDt88WYT zG~rUOfd!V-<5KZ)${)0HxLl{*+%SHX9c;I126-c@o!Tj=CEs6 zAWwl(;5@MIGRuzKC?9#cS=~}28^-Oqbq+B>=`y+#cR8xcya?6bh z>h22q?P2Z*M(@|AM$$Q&2En!8ZltKO)fm4w6cy~ACb6dElmtAYe+4HEufWLukT*J! z^)B5B)e*S4?+(SyJm~<+K?1@G&2js!?M;l{wu!}%0ME^~{ViO4o)qUvT{ipTjV1*r zT5yt6!tw+3eVMy@gDd2oEP+zxIZaTC{qpTtnRHTM-LN%j%iwoRob~ z?)!IKhvIPn4ehie!YRc&3jnK4kdb$r{Bb3HR917WTq0e%g0S7cuW!{0Q>D%P&X4hxDca&0Nj;T?6zw#&h?}V z3GF%DB+P*bPD{B2ENN8B!%ynu)3b94CfhloSKv=5XL&6dAjl)C)&09jFNzC}i<-XL zmz5fB&*D}!*+6iJfw&6E#TJv9%te?bPfrfdQGqjS3et~3`$AKoXbb!u>wt&~C2NCR z?|<8fdi>%lpHMIDsVQ@IJHYS)Jj;Ue`{@`>PJ4`^4C@F%ZVDWA*iX;jM#W8MaHF6f z{CqaSvY`3x|J%yv58KB3oDg;%z zA-EGm!Me;5s6Qky^(a32XO4!Fa9f6*hC?|!iNdGq=2E(ujs6j}853gBe)<2u!RhwZghXO0`fzGFZe zlypb1D3>TSxILLlLSCarY*Re`ac~^=Gzb+OFIo+jsgvEp+aF&)@8J!9clr9Q6X|Sl z-)c$>30(&Ko%E~NMB2~ZaNM`mzh!UN+Jm~IGrdSh-=s5%ADHHyzPLECvKWP6GFmXx zn;bUvV;iLxN|j+={rIz|>D-4jiuq3^mLkFX@+KOx`~f0rPhLKS7f@gomv`L~{9E7> zp{*Wh-lvSd4ku3OT~2U5SntVjOwJnkMK~B9-@3(n63VwE7A^Lr91$uG2Mvw#Ca23bM zn>cIpLLJq@9dP5o>$Z?X9{l`+HM5Rughq-Y3hu_9G*Q&g-T zg(#U04B{}jUvnnrG zmRAM+fzu0AKBab)0@p|rJQd0 z;$_5@xU!=VX2eCQ#5Trs$XS9RwnmU=l-AjSV8uTb7v}Yv0nRIt25O|T`lbmaL3*9v zLJw?O(1Yy@jLDoIrlrFv0N3hT_(=$KIw83*VG8F+n3}rY_~h!ItR6!sq%01OaSW)L zwn(k2K}INfRyOPuklJRe_*?M8^z;)(Fi)+`Oa*zGLklVRr++!pjGT*>%iTcqcxn+R zFf}sjyyD5vhzs?1I!SQz=qUoQWwkD!&aSglJCFwsKsnH&YHmkNd6`}rN7Eqh8#(A| zg6x`)aG;JNwB$}k?sNUzO=_DZBN{A8&w6@8;m?|h|FxS{hpamDLP8Ezt!e?w&k4^b0G)Xwn2;hR|v>c$qbF0=EjJh>qJ z&yJt3z<1iMp5$ZhaJ?Ce$qZD9ZT3eEHt%dIyxkJC^}KxJws3IQyy@Ifx&J5aUs~%X zTDiA1PiaYd$1xuxmP!Bxo zP)%Qj_T98IEtSD%nz|ys8V#C%VRiQTA6&A5G#(S zoniE?m-J_Tzkh&dx$K#x19qJq_&;ZPv3PkKTzt>L%tE7`;X%`@l))04UbBv(!`kJ?6ZH>de{QnyN8R9bq=r0O9Py;>n}=%~IPhMTi`Z)>&gj^xFHJUZ;mFxM61DakJFAv-@aQm{K9Nv>8 z#EPn1n%sNViS4m^9lZdV(lX{_&(RkZ#ODd6$|*u}i4quq=M|zRLJGWvP=G@N)&kmL zJI&~uL7Do9?uY%abAmI8{#Gx+LOcS_4E{Ivms2#rkGF32(mO^A^gsov-t!4p^V4+< z9lQI{oUmrps46H{TCPAP9Z??Q1@m71ig{ zT%>A2;?)B$bY|6$E2KmYcNBJWLg)h#R=#a_QJ>&nES$vZN+e+e4h$eOpbsdEfidt8 zHKLAX+)x&FXMEdE>HDNURBIMaBdOh{#OO~M+6`$>>J59 zou|^EUEiAdEKa=C4sa?!ZqaHyrFLsb|9m!f=vALy@NoR7byacx@-45GfMq*~RD#&X z;@_Xzf;@X}Q=@*OkG%5Z4V|dVIl-b=00K^B4t<1o7cY~*NG3%8?x3N2e(SSlGH^KiR=Y9oD?_>2(YDf1(vtG^ShlV!FkURi% z0wj6M{w-ljdctc=W$`uAwS`+=;1-b4Cp;58tO735^!H`i@5x99EK49u2!w?SOKzz3 zkAE)*@J}AKCpmuppkH;NNp*AtGCc^1n8h#Q2SzH3R$#P=^uuOaR*sxSfF}()PfXG7 z2R$x&l|s*@EO{dTow!U+&pSG6;Ccv%3dEF3u+aO%?_i&w$DRxJA0IB*2)TYD*ef+` z+!d}L>`5;iC`~!8erq)ycZtxFf5!eS<}r~wJl*3C*7iPw?fDoyd16n66OS`eX9T~zIPXv*qi!51)wj@yQ{f^`xPpu$-U8Lxj;Cw>djZ<>li_l zALhTiFbOUBRQh#a%OW)HMZACOhe*OL*rBBM(@T*j5y+1%L)dts^#~I zl!Ev|jCeD8-0~pJw*6Vj)rP>kOni{H!4*`K1rb#TDB$U6 ze`Ecu12|r<28r?!C*CL#k^^n~5-ar`FSGb*)tkB1d*Bx7HBe>Pvw)}pgm6|%o6zGl z3QcfqVQkAL?c>P2_E;sLwQekaE=&KModX$$Hd12j58o$vEVTfy(YF2!{=4ny#&?CB z#dk!|l`i=9u}0X%MpQ-KmdFUOW({%#7P6G^%1H!YaQBJThqvj=H- zVC&KYAWO2`Uc1p$8*ElYCzzc{55KHk3AE6X^i|Ai~1t&N9r+YU&f|*ix9i~p4 zCg0aejnV+CYwYHQ4^C#I!!!LbE8wJBluPv*u#=we~PXw^2!Qnc^ia_}zxN|#1^Sc`EW9Rc>F7?Cba zVsrP74BfYESs?w_YQ{^yJKxW{;xL6cB~mdJ7&5VBHs#5achzM-Hj zdP>?-GDOk|GTJa7?Rc^p;5n|M@-5)B!N-8S#QQRD2>7X|>R=WqI-gN9n9@y(;-n)$ZQ>@e zHJr)?+zx@;Q>+WOEYk_QIL1N*Y15%^bfS>C8)HfCU);p>*a9VHOOCo<657e+<NKww& zZxda`=?NX7a=^N2gS&OXeAfiNIT8;q{$U)Ug$Vj8$}9`syVpj)eGa{2`qy^_*<~rD z|J9rx)}Yh_f)5AOJi&(t8%w4GTx-Q9hf0DGq*nh`4m|MULw}VmvX3XY54}{B3HHf- z<%LO$1Ds}_+!fLcbXzy!Ot&ux{1$kOmc}l?2w1I3b^(9&^d9ZOEIQ%eFfTX#n@3i0Td5NmA4Br! z8lm8^?~`o(RqN7Adp1!I6m7k*rSbJzm=nHXhltVtXSOkm%`>~W5Tu+i4$*4q|0gA6 zgQP@HPZ{5&t0pei|Ar-5dv>S+_l~7bkQWb6tK#UF>*0ZJCXyd#KNjSJ9}nb@_tyRs zXa7_0rh*o+JL3ZW|K5wd{+r_in>7iXem*-DY}T{03m1EmSg*?;R0)~?E$hgkr*mdM zbit(Z49>3-LH*z0pVRig_wjuxK0J2MO|!fk4z{BdH$_h*3QSy#Dzk8=H1HO{Dq#KfELR1relDN zI_hOq7!)+X@2Ei3=umJKXRP+9<~I0p^h*LLHsTz%ZN8wivOS^T;D%lsaKjx{jsE+v zPqm6Oncc2r18f5$^ww|u$e;_XC@ch{iwC75bjTn{0^)v75C}R!-utz1VcJQk0Y9J2 zsIm*G5#vRIk3D{Cb$#L+~N$b{-szL{lSq_57 z`wIy@K{`3e6RZ>}t;}mR@G(3j&{y?^kv*k=&QD?kIzo?8k(U>kc8B}I#-F9~x?*Ev zPTV`aSicrBrO`!%xV;T{Awa-(!0qyOgzLNx6K+E^7&_N5&AO?_-A@l|NHwqB^ zP9#a|+XnEZ^P{%dt<9g)(o{jA1{M@^uH*|kmDw>dNP2myq~yZ}L0Lb4UfqCMsX-`L z#Tr01v?nE;{leG9j|N%b?&BF%GT}vLmhSNJ@Q^ArEDVU>1GMC-34HIpO2Q7B#} zhJdQi(0?M}>$(%G3rRdCl`d5G1~W!NCllRI&g};L;3pWn7Ap0vDt_7Ixs^?_$*nNu3Vkx~Mq1%f_GYmqBAm?(Kg`$g}|i!>=*@C7K~ zOnyW(Dq6}lKP|xItng@TxaokoK$2n85y}JzO8EvjlLQNW4#AGf^fHg9Z{Ut~i#eoc%kPdh<>U$X8jsS+KE!kOD|oOFD7yuUfpe1p&0{SaK`Pg8z;qDCp=B<}wXbSE z&z0Xl3`tr_IY9uf^$v8#4EV96AB5GQl+Q&J%(oub?9#P?W@`wf1H`sk(LBC zMEbY13coaE_mlU21UB;HXlSxkxa>jH;d%#D6!|f#Jcmf&MF?6MA;;@CKy*$o;7U-A zxc&5A8`SK6(daRQTSjTnBQ(NXc7h%s5g{@gCxT`u?Jw;w6(C9Ih|==FCKkz09V|NB zJ5IlLC<=uaUz*>KRpKu&Sz#o82+|UM&!9B8Tb$O~Do)|8)M?XBcv>JF0jyR`h~SUd zZxLcYB545#!%G#f-SxpT App); \ No newline at end of file diff --git a/example/jest.config.js b/example/jest.config.js new file mode 100644 index 0000000..3745fc2 --- /dev/null +++ b/example/jest.config.js @@ -0,0 +1,5 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', +}; diff --git a/example/metro.config.js b/example/metro.config.js new file mode 100644 index 0000000..f33c325 --- /dev/null +++ b/example/metro.config.js @@ -0,0 +1,24 @@ +const {mergeConfig, getDefaultConfig} = require('@react-native/metro-config'); +const {createHarmonyMetroConfig} = require('react-native-harmony/metro.config'); + +/** + * @type {import("metro-config").ConfigT} + */ +const config = { + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: true, + }, + }), + }, +}; + +module.exports = mergeConfig( + getDefaultConfig(__dirname), + createHarmonyMetroConfig({ + reactNativeHarmonyPackageName: 'react-native-harmony', + }), + config, +); diff --git a/example/package.json b/example/package.json new file mode 100644 index 0000000..01bf25b --- /dev/null +++ b/example/package.json @@ -0,0 +1,67 @@ +{ + "name": "react-native-harmony-tester", + "version": "1.0.0", + "private": true, + "scripts": { + "fast-install-project": "cd ../ && npm i --legacy-peer-deps && npm run pack && cd ./example && npm i --legacy-peer-deps", + "fast:pkg":"npm run fast-install-project && npm run dev", + "reStart": "npm run install:pkg && npm run codegen && hdc rport tcp:8081 tcp:8081 && react-native start", + "start": "hdc rport tcp:8081 tcp:8081 && react-native start", + "codegen": "react-native codegen-harmony --rnoh-module-path ./harmony/entry/oh_modules/@rnoh/react-native-openharmony", + "pack:pkg": "cd ../ && npm run pack && cd ./example", + "install:pkg": "npm uninstall @react-native-ohos/react-native-map-linking && npm run pack:pkg && npm i @react-native-ohos/react-native-map-linking@file:../react-native-ohos-react-native-map-linking-1.0.2.tgz", + "dev": "npm run codegen && react-native bundle-harmony --dev --minify=false", + "prod": "npm run codegen && react-native bundle-harmony --dev=false --minify=true", + "postinstall": "node ./scripts/create-build-profile" + }, + "dependencies": { + "@gorhom/portal": "^1.0.14", + "@react-native-ohos/react-native-map-linking": "file:../react-native-ohos-react-native-map-linking-1.0.2.tgz", + "@rnoh/testerino": "npm:@react-native-oh-tpl/testerino@0.0.9", + "react": "18.2.0", + "react-native": "0.72.5", + "react-native-harmony": "npm:@react-native-oh/react-native-harmony@^0.72.32" + }, + "devDependencies": { + "@babel/core": "^7.20.0", + "@babel/preset-env": "^7.20.0", + "@babel/runtime": "^7.20.0", + "@react-native-community/eslint-config": "^3.2.0", + "@react-native/eslint-config": "^0.74.0", + "@react-native/metro-config": "^0.72.6", + "@tsconfig/react-native": "^2.0.2", + "@types/chai": "^4.3.4", + "@types/d3-scale-chromatic": "^3.0.0", + "@types/fs-extra": "^11.0.1", + "@types/jest": "^29.5.5", + "@types/metro-config": "^0.76.2", + "@types/react": "17.0.14", + "@types/react-dom": "17.0.14", + "@types/react-test-renderer": "^18.0.0", + "babel-jest": "^29.2.1", + "csv-parser": "^3.0.0", + "eslint": "^8.19.0", + "eslint-plugin-prettier": "^5.0.1", + "fs-extra": "^11.1.1", + "husky": "^8.0.3", + "jest": "^29.7.0", + "json5": "^2.2.3", + "metro": "^0.76.3", + "metro-config": "^0.76.3", + "metro-react-native-babel-preset": "0.73.9", + "prettier": "3.2.4", + "react-test-renderer": "18.2.0", + "simple-statistics": "^7.8.3", + "ts-jest": "^29.1.1", + "typescript": "^5.3.2", + "yargs": "^17.7.2" + }, + "overrides": { + "@rnoh/react-native-harmony-cli": "npm:@react-native-oh/react-native-harmony-cli@^0.0.27", + "@react-native-community/cli": "11.3.6", + "@react-native/codegen": "0.74.0" + }, + "resolutions": { + "@react-native-community/cli": "11.3.6" + } +} diff --git a/example/react-native.config.js b/example/react-native.config.js new file mode 100644 index 0000000..4a038ab --- /dev/null +++ b/example/react-native.config.js @@ -0,0 +1,5 @@ +module.exports = { + project: { + }, + assets: ['./assets/fonts/'], +}; diff --git a/example/scripts/create-build-profile.js b/example/scripts/create-build-profile.js new file mode 100644 index 0000000..a7841d0 --- /dev/null +++ b/example/scripts/create-build-profile.js @@ -0,0 +1,39 @@ +const fs = require('fs'); +const JSON5 = require('json5'); +const path = require('path'); + +const templatePath = path.join( + __dirname, + '..', + 'harmony', + 'build-profile.template.json5', +); +const existingProfilePath = path.join( + __dirname, + '..', + 'harmony', + 'build-profile.json5', +); + +if (fs.existsSync(existingProfilePath)) { + let existingProfile = JSON5.parse( + fs.readFileSync(existingProfilePath, 'utf-8'), + ); + let template = JSON5.parse(fs.readFileSync(templatePath, 'utf-8')); + let signingConfigs = + existingProfile.app && existingProfile.app.signingConfigs; + + existingProfile = {...template}; + + if (signingConfigs) { + existingProfile.app.signingConfigs = signingConfigs; + } + + fs.writeFileSync( + existingProfilePath, + JSON5.stringify(existingProfile, null, 2), + ); +} else { + // File doesn't exist, create a copy from the template + fs.copyFileSync(templatePath, existingProfilePath); +} \ No newline at end of file diff --git a/example/src/MapLinkingDemo.tsx b/example/src/MapLinkingDemo.tsx new file mode 100644 index 0000000..6022c48 --- /dev/null +++ b/example/src/MapLinkingDemo.tsx @@ -0,0 +1,83 @@ +/* +* +* Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved +* Use of this source code is governed by a MIT license that can be +* found in the LICENSE file +* +*/ + +import React, { Component } from "react"; +import { + AppRegistry, + StyleSheet, + Text, + View, + TouchableOpacity, +} from "react-native"; +import App from "react-native-map-linking"; + +class MapLinkingDemo extends Component { + render() { + return ( + + { + MapLinking.markLocation( + { lat: 39.9901079, lng: 116.1887467 }, + "香山公园", + "bbb" + ); + }} + > + + 在地图上标记位置 + + + { + MapLinking.planRoute( + { lat: 39.9901079, lng: 116.1887467, title: "香山公园" }, + { lat: 40.0382556, lng: 116.3144536, title: "清河站" }, + "drive" + ); + }} + > + + 规划线路 + + + { + MapLinking.navigate({ + lat: 40.0382556, + lng: 116.3144536, + title: "清河站", + }); + }} + > + + 导航 + + + + ); + } +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: "center", + alignItems: "center", + backgroundColor: "#F5FCFF", + }, + button: { + padding: 10, + backgroundColor: "#3B5998", + marginBottom: 10, + }, + text: { + color: "white", + }, +}); +export default App; \ No newline at end of file diff --git a/example/tsconfig.json b/example/tsconfig.json new file mode 100644 index 0000000..9a2c8c2 --- /dev/null +++ b/example/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "@tsconfig/react-native/tsconfig.json", + "compilerOptions": { + "jsx": "react-native", + "paths": { + "react-native": [ + "./node_modules/react-native-harmony" + ], + }, + }, + "exclude": [ + "harmony" + ] +} \ No newline at end of file diff --git a/package.json b/package.json index 88a855e..2503fe8 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "linking" ], "scripts": { + "pack": "npm pack", "release": "release-it" }, "publishConfig": { -- Gitee