@oniroproject/oniro-app 0.6.2 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +303 -9
- package/dist/oniro-app.js +488 -15
- package/dist/oniro-app.js.map +1 -1
- package/package.json +4 -3
- package/templates/NativeCpp/AppScope/app.json5 +10 -0
- package/templates/NativeCpp/AppScope/resources/base/element/string.json +8 -0
- package/templates/NativeCpp/AppScope/resources/base/media/background.png +0 -0
- package/templates/NativeCpp/AppScope/resources/base/media/foreground.png +0 -0
- package/templates/NativeCpp/AppScope/resources/base/media/layered_image.json +7 -0
- package/templates/NativeCpp/build-profile.json5 +35 -0
- package/templates/NativeCpp/entry/build-profile.json5 +48 -0
- package/templates/NativeCpp/entry/hvigorfile.ts +6 -0
- package/templates/NativeCpp/entry/obfuscation-rules.txt +23 -0
- package/templates/NativeCpp/entry/oh-package.json5 +12 -0
- package/templates/NativeCpp/entry/src/main/cpp/CMakeLists.txt +15 -0
- package/templates/NativeCpp/entry/src/main/cpp/napi_init.cpp +53 -0
- package/templates/NativeCpp/entry/src/main/cpp/types/libentry/Index.d.ts +1 -0
- package/templates/NativeCpp/entry/src/main/cpp/types/libentry/oh-package.json5 +6 -0
- package/templates/NativeCpp/entry/src/main/ets/entryability/EntryAbility.ets +48 -0
- package/templates/NativeCpp/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets +16 -0
- package/templates/NativeCpp/entry/src/main/ets/pages/Index.ets +26 -0
- package/templates/NativeCpp/entry/src/main/module.json5 +50 -0
- package/templates/NativeCpp/entry/src/main/resources/base/element/color.json +8 -0
- package/templates/NativeCpp/entry/src/main/resources/base/element/float.json +8 -0
- package/templates/NativeCpp/entry/src/main/resources/base/element/string.json +16 -0
- package/templates/NativeCpp/entry/src/main/resources/base/media/background.png +0 -0
- package/templates/NativeCpp/entry/src/main/resources/base/media/foreground.png +0 -0
- package/templates/NativeCpp/entry/src/main/resources/base/media/layered_image.json +7 -0
- package/templates/NativeCpp/entry/src/main/resources/base/media/startIcon.png +0 -0
- package/templates/NativeCpp/entry/src/main/resources/base/profile/backup_config.json +3 -0
- package/templates/NativeCpp/entry/src/main/resources/base/profile/main_pages.json +5 -0
- package/templates/NativeCpp/entry/src/main/resources/dark/element/color.json +8 -0
- package/templates/NativeCpp/entry/src/mock/Libentry.mock.ets +7 -0
- package/templates/NativeCpp/entry/src/mock/mock-config.json5 +5 -0
- package/templates/NativeCpp/entry/src/ohosTest/ets/test/Ability.test.ets +35 -0
- package/templates/NativeCpp/entry/src/ohosTest/ets/test/List.test.ets +5 -0
- package/templates/NativeCpp/entry/src/ohosTest/module.json5 +11 -0
- package/templates/NativeCpp/entry/src/test/List.test.ets +5 -0
- package/templates/NativeCpp/entry/src/test/LocalUnit.test.ets +33 -0
- package/templates/NativeCpp/hvigor/hvigor-config.json5 +23 -0
- package/templates/NativeCpp/hvigorfile.ts +6 -0
- package/templates/NativeCpp/oh-package.json5 +10 -0
- package/templates/NativeCpp/template.json +6 -0
package/dist/oniro-app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bin/oniro-app.ts","../src/commands/sdk.ts","../src/adapters/logger.ts","../src/adapters/progress.ts","../src/adapters/config.ts","../src/lib/runtime.ts","../src/commands/cmdtools.ts","../src/commands/emulator.ts","../src/commands/build.ts","../src/commands/sign.ts","../src/commands/app.ts","../src/commands/create.ts","../src/lib/templateRoot.ts","../src/commands/templates.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { OniroError } from '@oniroproject/core';\nimport { registerSdkCommand } from '../commands/sdk.js';\nimport { registerCmdToolsCommand } from '../commands/cmdtools.js';\nimport { registerEmulatorCommand } from '../commands/emulator.js';\nimport { registerBuildCommand } from '../commands/build.js';\nimport { registerSignCommand } from '../commands/sign.js';\nimport { registerAppCommand } from '../commands/app.js';\nimport { registerCreateCommand } from '../commands/create.js';\nimport { registerTemplatesCommand } from '../commands/templates.js';\n\ndeclare const __CLI_VERSION__: string;\nconst CLI_VERSION = __CLI_VERSION__;\n\nfunction buildProgram(): Command {\n const program = new Command()\n .name('oniro-app')\n .description(\n 'Cross-platform CLI for Oniro/OpenHarmony app development.\\n\\n' +\n 'Designed for non-interactive use (CI, scripts, agents): every command\\n' +\n 'takes explicit flags, results go to stdout, progress/logs go to stderr,\\n' +\n 'and a non-zero exit code indicates failure.',\n )\n .version(CLI_VERSION)\n .showHelpAfterError();\n\n registerSdkCommand(program);\n registerCmdToolsCommand(program);\n registerEmulatorCommand(program);\n registerBuildCommand(program);\n registerSignCommand(program);\n registerAppCommand(program);\n registerCreateCommand(program);\n registerTemplatesCommand(program);\n\n return program;\n}\n\nasync function main(): Promise<void> {\n const program = buildProgram();\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n const message = err instanceof OniroError ? err.message : err instanceof Error ? err.message : String(err);\n process.stderr.write(`[error] ${message}\\n`);\n if (process.env.ONIRO_DEBUG === '1' && err instanceof Error && err.stack) {\n process.stderr.write(`${err.stack}\\n`);\n }\n process.exit(1);\n }\n}\n\nvoid main();\n","import { Command } from 'commander';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport {\n ALL_SDKS,\n downloadAndInstallSdk,\n getOsFolder,\n getSdkRootDir,\n getSupportedSdksForUi,\n removeSdk,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerSdkCommand(program: Command): void {\n const sdk = program.command('sdk').description('Manage OpenHarmony SDK installs.');\n\n sdk\n .command('install <version>')\n .description('Download and install an OpenHarmony SDK. Skips if already installed.')\n .option('--force', 'Reinstall even if the SDK is already present.')\n .action(async (version: string, opts: { force?: boolean }) => {\n const { config, logger, progress } = getRuntime();\n const release = ALL_SDKS.find((s) => s.version === version);\n if (!release) {\n throw new Error(\n `Unknown SDK version \"${version}\". Known: ${ALL_SDKS.map((s) => s.version).join(', ')}`,\n );\n }\n const sdkInstallDir = path.join(getSdkRootDir(config), getOsFolder(), release.api);\n if (fs.existsSync(sdkInstallDir) && !opts.force) {\n logger.info(\n `SDK ${release.version} (api ${release.api}) already installed at ${sdkInstallDir}; pass --force to reinstall.`,\n );\n return;\n }\n logger.info(`Installing OpenHarmony SDK ${release.version} (api ${release.api})...`);\n await downloadAndInstallSdk({ config, version: release.version, api: release.api, progress, logger });\n logger.info('SDK installed.');\n });\n\n sdk\n .command('list')\n .description('List known SDK versions and whether they are installed on this machine.')\n .option('--json', 'Emit machine-readable JSON instead of a table.')\n .action((opts: { json?: boolean }) => {\n const { config } = getRuntime();\n const sdks = getSupportedSdksForUi(config);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(sdks, null, 2)}\\n`);\n return;\n }\n const rows = sdks.map((s) => `${s.installed ? '*' : ' '} ${s.version.padEnd(8)} api ${s.api}`);\n process.stdout.write(`${rows.join('\\n')}\\n`);\n });\n\n sdk\n .command('remove <api>')\n .description('Remove an installed SDK by API level (e.g. 18, 20).')\n .action((api: string) => {\n const { config, logger } = getRuntime();\n const removed = removeSdk(config, api);\n if (!removed) {\n logger.warn(`No SDK with api ${api} found under the configured SDK root.`);\n process.exit(1);\n }\n logger.info(`Removed SDK api ${api}.`);\n });\n}\n","import type { Logger } from '@oniroproject/core';\n\n/**\n * Stderr-only logger. All diagnostic output goes to stderr so command stdout\n * stays clean for machine consumers (json results, paths, etc.).\n *\n * Debug lines are suppressed unless `ONIRO_DEBUG=1`.\n */\nexport function createCliLogger(): Logger {\n const debugEnabled = process.env.ONIRO_DEBUG === '1' || process.env.ONIRO_DEBUG === 'true';\n return {\n debug(m) {\n if (debugEnabled) process.stderr.write(`[debug] ${m}\\n`);\n },\n info(m) {\n process.stderr.write(`${m}\\n`);\n },\n warn(m) {\n process.stderr.write(`[warn] ${m}\\n`);\n },\n error(m) {\n process.stderr.write(`[error] ${m}\\n`);\n },\n };\n}\n","import type { ProgressReporter } from '@oniroproject/core';\n\n/**\n * Line-per-update progress reporter, designed for machine consumers and log scrapers.\n * Format: `[progress NN%] message` (or `[progress] message` if no percent is known).\n * Updates that don't change the percent and don't carry a message are suppressed\n * to keep output volume reasonable on chatty downloads.\n */\nexport function createCliProgress(): ProgressReporter {\n let total = 0;\n let lastEmitted = -1;\n let lastMessage = '';\n return {\n report({ message, increment }) {\n if (typeof increment === 'number') total = Math.min(100, total + increment);\n const pct = total > 0 ? Math.round(total) : null;\n const msg = message ?? lastMessage;\n // Drop redundant updates: same message, same percent.\n if (pct === lastEmitted && msg === lastMessage) return;\n const prefix = pct === null ? '[progress]' : `[progress ${pct}%]`;\n process.stderr.write(`${prefix} ${msg}\\n`);\n lastEmitted = pct ?? lastEmitted;\n if (message) lastMessage = message;\n },\n };\n}\n","import * as os from 'node:os';\nimport type { ConfigKey, ConfigProvider } from '@oniroproject/core';\n\n/**\n * Maps a core ConfigKey to its environment variable name.\n * Convention: ONIRO_<UPPER_SNAKE>.\n */\nconst ENV_VAR_BY_KEY: Record<ConfigKey, string> = {\n sdkRootDir: 'ONIRO_SDK_ROOT_DIR',\n cmdToolsPath: 'ONIRO_CMD_TOOLS_PATH',\n emulatorDir: 'ONIRO_EMULATOR_DIR',\n hapPath: 'ONIRO_HAP_PATH',\n cmdToolsUrlLinux: 'ONIRO_CMD_TOOLS_URL_LINUX',\n cmdToolsUrlWindows: 'ONIRO_CMD_TOOLS_URL_WINDOWS',\n cmdToolsUrlMac: 'ONIRO_CMD_TOOLS_URL_MAC',\n emulatorUrl: 'ONIRO_EMULATOR_URL',\n};\n\n/**\n * Reads configuration from environment variables (ONIRO_*). Returns the fallback\n * when the variable is unset or empty. Expands `${userHome}` to the user's home\n * directory for parity with the VS Code extension's `${userHome}` expansion.\n */\nexport function createEnvConfig(env: NodeJS.ProcessEnv = process.env): ConfigProvider {\n return {\n get<T extends string | number | boolean>(key: ConfigKey, fallback: T): T {\n const envName = ENV_VAR_BY_KEY[key];\n const raw = env[envName];\n if (raw === undefined || raw === '') return fallback;\n const expanded = raw.includes('${userHome}')\n ? raw.replace(/\\$\\{userHome\\}/g, os.homedir())\n : raw;\n return expanded as unknown as T;\n },\n };\n}\n","import type { ConfigProvider, Logger, ProgressReporter } from '@oniroproject/core';\nimport { createCliLogger } from '../adapters/logger.js';\nimport { createCliProgress } from '../adapters/progress.js';\nimport { createEnvConfig } from '../adapters/config.js';\n\nexport interface CliRuntime {\n logger: Logger;\n config: ConfigProvider;\n progress: ProgressReporter;\n}\n\nlet cached: CliRuntime | null = null;\n\n/**\n * Build (and cache) the per-process runtime used by every command. Tests can\n * override the cached runtime via `setRuntime` to inject mocks.\n */\nexport function getRuntime(): CliRuntime {\n if (!cached) {\n cached = {\n logger: createCliLogger(),\n config: createEnvConfig(),\n progress: createCliProgress(),\n };\n }\n return cached;\n}\n\nexport function setRuntime(runtime: CliRuntime | null): void {\n cached = runtime;\n}\n","import { Command } from 'commander';\nimport { getCmdToolsStatus, installCmdTools, isCmdToolsInstalled, removeCmdTools } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerCmdToolsCommand(program: Command): void {\n const cmdtools = program.command('cmdtools').description('Manage OpenHarmony command-line tools.');\n\n cmdtools\n .command('install')\n .description('Install the OpenHarmony command-line tools (hvigorw, ohpm, hdc). Skips if already installed.')\n .option('--from-zip <path>', 'Install from a local ZIP instead of downloading.')\n .option('--force', 'Reinstall even if the tools are already present.')\n .action(async (opts: { fromZip?: string; force?: boolean }) => {\n const { config, logger, progress } = getRuntime();\n if (isCmdToolsInstalled(config) && !opts.force) {\n logger.info('Command-line tools already installed; pass --force to reinstall.');\n return;\n }\n logger.info('Installing OpenHarmony command-line tools...');\n await installCmdTools({ config, progress, logger, localZipPath: opts.fromZip });\n logger.info('Command-line tools installed.');\n });\n\n cmdtools\n .command('status')\n .description('Report whether the command-line tools are installed and their version.')\n .option('--json', 'Emit machine-readable JSON.')\n .action((opts: { json?: boolean }) => {\n const { config } = getRuntime();\n const status = getCmdToolsStatus(config);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(status, null, 2)}\\n`);\n return;\n }\n process.stdout.write(`${status.status}\\n`);\n if (!status.installed) process.exit(1);\n });\n\n cmdtools\n .command('remove')\n .description('Delete the configured command-line tools directory.')\n .action(() => {\n const { config, logger } = getRuntime();\n removeCmdTools(config);\n logger.info('Command-line tools removed.');\n });\n}\n","import { Command } from 'commander';\nimport {\n attemptHdcConnection,\n installEmulator,\n isEmulatorInstalled,\n removeEmulator,\n startEmulator,\n stopEmulator,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerEmulatorCommand(program: Command): void {\n const emu = program.command('emulator').description('Manage the Oniro emulator.');\n\n emu\n .command('install')\n .description('Download and install the Oniro emulator (QEMU-based). Skips if already installed.')\n .option('--force', 'Reinstall even if the emulator is already present.')\n .action(async (opts: { force?: boolean }) => {\n const { config, logger, progress } = getRuntime();\n if (isEmulatorInstalled(config) && !opts.force) {\n logger.info('Emulator already installed; pass --force to reinstall.');\n return;\n }\n logger.info('Installing Oniro emulator...');\n await installEmulator({ config, progress, logger });\n logger.info('Emulator installed.');\n });\n\n emu\n .command('start')\n .description('Start the Oniro emulator via the bundled launcher (run.sh / run.bat). Detaches so the CLI can exit while the emulator keeps running.')\n .option('--headless', 'Launch headless (VNC + telnet serial, no local window). Required in CI.')\n .option('--log <path>', 'Redirect launcher stdout/stderr to this file. Defaults to discarding output.')\n .option('--wait-for-hdc <seconds>', 'Wait up to N seconds for hdc to connect. 0 = do not wait.', (v) => parseInt(v, 10), 0)\n .option('--connect <host:port>', 'Override the launcher\\'s hdc port-forward bind address. Pass 0.0.0.0:55555 on hosts where QEMU refuses to bind 127.0.0.1 (some CI runners).')\n .action(async (opts: { headless?: boolean; log?: string; waitForHdc: number; connect?: string }) => {\n const { config, logger } = getRuntime();\n await startEmulator({\n config,\n logger,\n headless: opts.headless === true,\n logFile: opts.log,\n waitForHdcSeconds: opts.waitForHdc,\n connect: opts.connect,\n });\n logger.info('Emulator start command complete.');\n });\n\n emu\n .command('stop')\n .description('Kill running emulator processes.')\n .action(async () => {\n const { logger } = getRuntime();\n await stopEmulator(logger);\n logger.info('Emulator stopped.');\n });\n\n emu\n .command('connect')\n .description('Attempt to connect hdc to the emulator.')\n .option('--address <addr>', 'hdc address to connect to', '127.0.0.1:55555')\n .action(async (opts: { address: string }) => {\n const { config, logger } = getRuntime();\n const ok = await attemptHdcConnection(config, opts.address, logger);\n if (!ok) {\n logger.error(`Could not connect hdc to ${opts.address}.`);\n process.exit(1);\n }\n logger.info(`hdc connected to ${opts.address}.`);\n });\n\n emu\n .command('remove')\n .description('Delete the configured emulator directory.')\n .action(() => {\n const { config, logger } = getRuntime();\n removeEmulator(config);\n logger.info('Emulator removed.');\n });\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport { runHvigorw } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerBuildCommand(program: Command): void {\n program\n .command('build [project-dir]')\n .description('Build an OpenHarmony app via hvigorw. Defaults to the current directory.')\n .option('--product <product>', 'hvigor product name', 'default')\n .option('--module <module>', 'restrict the build to a specific module')\n .option('--mode <mode>', 'hvigor build mode (e.g. release, debug)')\n .option('--task <task>', 'hvigor task to run', 'assembleHap')\n .action(async (projectDir: string | undefined, opts: { product: string; module?: string; mode?: string; task: string }) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n logger.info(`Building project at ${dir}...`);\n await runHvigorw({\n config,\n projectDir: dir,\n product: opts.product,\n module: opts.module,\n buildMode: opts.mode,\n task: opts.task,\n logger,\n // Forward output as it arrives. We don't double-print since the logger\n // already echoes spawn output; this hook is for streaming to other UIs.\n onOutput: () => {},\n });\n logger.info('Build complete.');\n });\n}\n","import { Command, Option } from 'commander';\nimport * as path from 'node:path';\nimport {\n APL_VALUES,\n APP_FEATURE_VALUES,\n generateSigningConfigs,\n getOhosBaseSdkHome,\n type Apl,\n type AppFeature,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nfunction parseAclsList(value: string): string[] {\n return value\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\nexport function registerSignCommand(program: Command): void {\n program\n .command('sign [project-dir]')\n .description(\n [\n 'Generate signing keys, certificates, and signingConfigs for an OpenHarmony project.',\n 'Requires java on PATH. The generated profile uses the SDK\\'s built-in development',\n 'cert (issuer=pki_internal) and its bundled validity window — dev/local builds only.',\n 'Overwrites the `signingConfigs` block in build-profile.json5 (other keys preserved).',\n ].join(' '),\n )\n .addOption(\n new Option(\n '--apl <level>',\n 'Ability Privilege Level written into the profile. Apps that request permissions above `normal` (e.g. ohos.permission.GET_WIFI_INFO_INTERNAL) need system_basic or system_core, which also switches the HAP-signing key to \"OpenHarmony Application Release\".',\n )\n .choices([...APL_VALUES])\n .default('normal'),\n )\n .addOption(\n new Option(\n '--app-feature <feature>',\n 'App feature written into the profile. Defaults: hos_normal_app for apl=normal; hos_system_app for apl=system_basic/system_core.',\n ).choices([...APP_FEATURE_VALUES]),\n )\n .addOption(\n new Option(\n '--acls <list>',\n 'Comma-separated permission names to write into the profile\\'s acls.allowed-acls. Required for apps that request permissions above their apl (e.g. a system_basic app requesting ohos.permission.CAPTURE_SCREEN). Example: --acls ohos.permission.REBOOT,ohos.permission.INJECT_INPUT_EVENT',\n ).argParser(parseAclsList),\n )\n .action(\n (\n projectDir: string | undefined,\n opts: { apl: Apl; appFeature?: AppFeature; acls?: string[] },\n ) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n const sdkHome = getOhosBaseSdkHome(config);\n logger.info(`Generating signing configs in ${dir} using SDK at ${sdkHome}...`);\n generateSigningConfigs({\n projectDir: dir,\n sdkHome,\n apl: opts.apl,\n appFeature: opts.appFeature,\n acls: opts.acls,\n logger,\n });\n logger.info('Signing configs generated.');\n },\n );\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport { installApp, launchApp } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerAppCommand(program: Command): void {\n const app = program.command('app').description('Install and launch built apps on a connected device/emulator.');\n\n app\n .command('install [project-dir]')\n .description('Install the signed .hap on the connected device/emulator via hdc.')\n .option('--hap <path>', 'Override the .hap path (relative to project-dir or absolute).')\n .action(async (projectDir: string | undefined, opts: { hap?: string }) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n logger.info(`Installing app from ${dir}...`);\n await installApp({ config, projectDir: dir, hapPath: opts.hap, logger });\n logger.info('App installed.');\n });\n\n app\n .command('launch [project-dir]')\n .description('Launch the app on the connected device/emulator via hdc.')\n .option('--module <module>', 'Module folder name', 'entry')\n .action(async (projectDir: string | undefined, opts: { module: string }) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n logger.info(`Launching app from ${dir}...`);\n await launchApp({ config, projectDir: dir, moduleName: opts.module, logger });\n logger.info('App launched.');\n });\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport {\n ALL_SDKS,\n createScaffold,\n isValidBundleName,\n isValidProjectName,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { getBundledTemplateRoot } from '../lib/templateRoot.js';\n\ninterface CreateOpts {\n name: string;\n bundle: string;\n location: string;\n sdk: string;\n template: string;\n module?: string;\n overwrite?: boolean;\n}\n\nexport function registerCreateCommand(program: Command): void {\n program\n .command('create')\n .description('Scaffold a new Oniro/OpenHarmony app from a template. All flags are required (non-interactive).')\n .requiredOption('--name <name>', 'Project folder name (letters, digits, ._- only)')\n .requiredOption('--bundle <bundleName>', 'Bundle name in reverse-DNS form, e.g. com.example.myapp')\n .requiredOption('--location <dir>', 'Parent directory where the new project folder will be created')\n .requiredOption('--sdk <api>', 'Target SDK API level (e.g. 18, 20)')\n .option('--template <id>', 'Template id', 'EmptyAbility')\n .option('--module <name>', 'Module folder name (defaults to the template default, usually `entry`)')\n .option('--overwrite', 'Replace the destination if it already exists')\n .action(async (opts: CreateOpts) => {\n const { config, logger } = getRuntime();\n\n if (!isValidProjectName(opts.name)) {\n throw new Error(`Invalid --name '${opts.name}'. Use letters/numbers/._- and no slashes.`);\n }\n if (!isValidBundleName(opts.bundle)) {\n throw new Error(`Invalid --bundle '${opts.bundle}'. Example: com.example.myapp`);\n }\n const sdkApi = Number(opts.sdk);\n if (!Number.isFinite(sdkApi)) {\n throw new Error(`--sdk must be a numeric api level. Known: ${ALL_SDKS.map((s) => s.api).join(', ')}`);\n }\n\n const templateRoot = getBundledTemplateRoot();\n const result = await createScaffold({\n config,\n templateId: opts.template,\n projectName: opts.name,\n bundleName: opts.bundle,\n location: path.resolve(opts.location),\n sdkApi,\n moduleName: opts.module,\n templateRoot,\n overwrite: opts.overwrite,\n logger,\n });\n\n logger.info(`Project created at ${result.projectDir}`);\n process.stdout.write(`${result.projectDir}\\n`);\n });\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Resolve the bundled `templates/` directory shipped inside this CLI package.\n *\n * The CLI's `dist/oniro-app.js` lives at `<pkg>/dist/oniro-app.js` after build\n * and the templates ship at `<pkg>/templates/`. During development the entrypoint\n * lives at `<pkg>/src/bin/oniro-app.ts` so we also try `../../templates` from there.\n */\nexport function getBundledTemplateRoot(): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, '../templates'), // dist/oniro-app.js → ../templates\n path.resolve(here, '../../templates'), // src/bin/oniro-app.ts → ../../templates\n ];\n for (const c of candidates) {\n if (fs.existsSync(c)) return c;\n }\n // Return the most likely path even if it doesn't exist yet; createScaffold will\n // surface a clear error from there.\n return candidates[0]!;\n}\n","import { Command } from 'commander';\nimport { listTemplates } from '@oniroproject/core';\nimport { getBundledTemplateRoot } from '../lib/templateRoot.js';\n\nexport function registerTemplatesCommand(program: Command): void {\n const templates = program.command('templates').description('Inspect the templates bundled with this CLI.');\n\n templates\n .command('list')\n .description('List available project templates.')\n .option('--json', 'Emit machine-readable JSON.')\n .action((opts: { json?: boolean }) => {\n const root = getBundledTemplateRoot();\n const list = listTemplates(root);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(list, null, 2)}\\n`);\n return;\n }\n if (list.length === 0) {\n process.stdout.write('No templates available.\\n');\n return;\n }\n const rows = list.map((t) => `${t.id.padEnd(20)} ${t.label.padEnd(24)} ${t.description}`);\n process.stdout.write(`${rows.join('\\n')}\\n`);\n });\n}\n"],"mappings":"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","names":["Command","path","path","path","path","ALL_SDKS","fs","path","ALL_SDKS","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/bin/oniro-app.ts","../src/commands/sdk.ts","../src/adapters/logger.ts","../src/adapters/progress.ts","../src/adapters/config.ts","../src/lib/runtime.ts","../src/commands/cmdtools.ts","../src/commands/emulator.ts","../src/commands/build.ts","../src/commands/sign.ts","../src/commands/app.ts","../src/commands/create.ts","../src/lib/templateRoot.ts","../src/commands/templates.ts","../src/commands/reboot.ts","../src/commands/wait.ts","../src/commands/watch.ts","../src/commands/screenshot.ts","../src/lib/screenshotImage.ts","../src/commands/dump.ts","../src/commands/devices.ts","../src/commands/file.ts","../src/commands/lint.ts","../src/commands/input.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { OniroError } from '@oniroproject/core';\nimport { registerSdkCommand } from '../commands/sdk.js';\nimport { registerCmdToolsCommand } from '../commands/cmdtools.js';\nimport { registerEmulatorCommand } from '../commands/emulator.js';\nimport { registerBuildCommand } from '../commands/build.js';\nimport { registerSignCommand } from '../commands/sign.js';\nimport { registerAppCommand } from '../commands/app.js';\nimport { registerCreateCommand } from '../commands/create.js';\nimport { registerTemplatesCommand } from '../commands/templates.js';\nimport { registerRebootCommand } from '../commands/reboot.js';\nimport { registerWaitCommand } from '../commands/wait.js';\nimport { registerWatchCommand } from '../commands/watch.js';\nimport { registerScreenshotCommand } from '../commands/screenshot.js';\nimport { registerDumpCommand } from '../commands/dump.js';\nimport { registerDevicesCommand } from '../commands/devices.js';\nimport { registerFileCommand } from '../commands/file.js';\nimport { registerLintCommand } from '../commands/lint.js';\nimport { registerInputCommand } from '../commands/input.js';\n\ndeclare const __CLI_VERSION__: string;\nconst CLI_VERSION = __CLI_VERSION__;\n\nfunction buildProgram(): Command {\n const program = new Command()\n .name('oniro-app')\n .description(\n 'Cross-platform CLI for Oniro/OpenHarmony app development.\\n\\n' +\n 'Designed for non-interactive use (CI, scripts, agents): every command\\n' +\n 'takes explicit flags, results go to stdout, progress/logs go to stderr,\\n' +\n 'and a non-zero exit code indicates failure.',\n )\n .version(CLI_VERSION)\n .showHelpAfterError();\n\n registerSdkCommand(program);\n registerCmdToolsCommand(program);\n registerEmulatorCommand(program);\n registerBuildCommand(program);\n registerSignCommand(program);\n registerAppCommand(program);\n registerCreateCommand(program);\n registerTemplatesCommand(program);\n registerRebootCommand(program);\n registerWaitCommand(program);\n registerWatchCommand(program);\n registerScreenshotCommand(program);\n registerDumpCommand(program);\n registerDevicesCommand(program);\n registerFileCommand(program);\n registerLintCommand(program);\n registerInputCommand(program);\n\n return program;\n}\n\nasync function main(): Promise<void> {\n const program = buildProgram();\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n const message = err instanceof OniroError ? err.message : err instanceof Error ? err.message : String(err);\n process.stderr.write(`[error] ${message}\\n`);\n if (process.env.ONIRO_DEBUG === '1' && err instanceof Error && err.stack) {\n process.stderr.write(`${err.stack}\\n`);\n }\n process.exit(1);\n }\n}\n\nvoid main();\n","import { Command } from 'commander';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport {\n ALL_SDKS,\n downloadAndInstallSdk,\n getOsFolder,\n getSdkRootDir,\n getSupportedSdksForUi,\n removeSdk,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerSdkCommand(program: Command): void {\n const sdk = program.command('sdk').description('Manage OpenHarmony SDK installs.');\n\n sdk\n .command('install <version>')\n .description('Download and install an OpenHarmony SDK. Skips if already installed.')\n .option('--force', 'Reinstall even if the SDK is already present.')\n .action(async (version: string, opts: { force?: boolean }) => {\n const { config, logger, progress } = getRuntime();\n const release = ALL_SDKS.find((s) => s.version === version);\n if (!release) {\n throw new Error(\n `Unknown SDK version \"${version}\". Known: ${ALL_SDKS.map((s) => s.version).join(', ')}`,\n );\n }\n const sdkInstallDir = path.join(getSdkRootDir(config), getOsFolder(), release.api);\n if (fs.existsSync(sdkInstallDir) && !opts.force) {\n logger.info(\n `SDK ${release.version} (api ${release.api}) already installed at ${sdkInstallDir}; pass --force to reinstall.`,\n );\n return;\n }\n logger.info(`Installing OpenHarmony SDK ${release.version} (api ${release.api})...`);\n await downloadAndInstallSdk({ config, version: release.version, api: release.api, progress, logger });\n logger.info('SDK installed.');\n });\n\n sdk\n .command('list')\n .description('List known SDK versions and whether they are installed on this machine.')\n .option('--json', 'Emit machine-readable JSON instead of a table.')\n .action((opts: { json?: boolean }) => {\n const { config } = getRuntime();\n const sdks = getSupportedSdksForUi(config);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(sdks, null, 2)}\\n`);\n return;\n }\n const rows = sdks.map((s) => `${s.installed ? '*' : ' '} ${s.version.padEnd(8)} api ${s.api}`);\n process.stdout.write(`${rows.join('\\n')}\\n`);\n });\n\n sdk\n .command('remove <api>')\n .description('Remove an installed SDK by API level (e.g. 18, 20).')\n .action((api: string) => {\n const { config, logger } = getRuntime();\n const removed = removeSdk(config, api);\n if (!removed) {\n logger.warn(`No SDK with api ${api} found under the configured SDK root.`);\n process.exit(1);\n }\n logger.info(`Removed SDK api ${api}.`);\n });\n}\n","import type { Logger } from '@oniroproject/core';\n\n/**\n * Stderr-only logger. All diagnostic output goes to stderr so command stdout\n * stays clean for machine consumers (json results, paths, etc.).\n *\n * Debug lines are suppressed unless `ONIRO_DEBUG=1`.\n */\nexport function createCliLogger(): Logger {\n const debugEnabled = process.env.ONIRO_DEBUG === '1' || process.env.ONIRO_DEBUG === 'true';\n return {\n debug(m) {\n if (debugEnabled) process.stderr.write(`[debug] ${m}\\n`);\n },\n info(m) {\n process.stderr.write(`${m}\\n`);\n },\n warn(m) {\n process.stderr.write(`[warn] ${m}\\n`);\n },\n error(m) {\n process.stderr.write(`[error] ${m}\\n`);\n },\n };\n}\n","import type { ProgressReporter } from '@oniroproject/core';\n\n/**\n * Line-per-update progress reporter, designed for machine consumers and log scrapers.\n * Format: `[progress NN%] message` (or `[progress] message` if no percent is known).\n * Updates that don't change the percent and don't carry a message are suppressed\n * to keep output volume reasonable on chatty downloads.\n */\nexport function createCliProgress(): ProgressReporter {\n let total = 0;\n let lastEmitted = -1;\n let lastMessage = '';\n return {\n report({ message, increment }) {\n if (typeof increment === 'number') total = Math.min(100, total + increment);\n const pct = total > 0 ? Math.round(total) : null;\n const msg = message ?? lastMessage;\n // Drop redundant updates: same message, same percent.\n if (pct === lastEmitted && msg === lastMessage) return;\n const prefix = pct === null ? '[progress]' : `[progress ${pct}%]`;\n process.stderr.write(`${prefix} ${msg}\\n`);\n lastEmitted = pct ?? lastEmitted;\n if (message) lastMessage = message;\n },\n };\n}\n","import * as os from 'node:os';\nimport type { ConfigKey, ConfigProvider } from '@oniroproject/core';\n\n/**\n * Maps a core ConfigKey to its environment variable name.\n * Convention: ONIRO_<UPPER_SNAKE>.\n */\nconst ENV_VAR_BY_KEY: Record<ConfigKey, string> = {\n sdkRootDir: 'ONIRO_SDK_ROOT_DIR',\n cmdToolsPath: 'ONIRO_CMD_TOOLS_PATH',\n emulatorDir: 'ONIRO_EMULATOR_DIR',\n hapPath: 'ONIRO_HAP_PATH',\n cmdToolsUrlLinux: 'ONIRO_CMD_TOOLS_URL_LINUX',\n cmdToolsUrlWindows: 'ONIRO_CMD_TOOLS_URL_WINDOWS',\n cmdToolsUrlMac: 'ONIRO_CMD_TOOLS_URL_MAC',\n emulatorUrl: 'ONIRO_EMULATOR_URL',\n sdkUrlBase: 'ONIRO_SDK_URL_BASE',\n applicationCertPath: 'ONIRO_APPLICATION_CERT_PATH',\n};\n\n/**\n * Reads configuration from environment variables (ONIRO_*). Returns the fallback\n * when the variable is unset or empty. Expands `${userHome}` to the user's home\n * directory for parity with the VS Code extension's `${userHome}` expansion.\n */\nexport function createEnvConfig(env: NodeJS.ProcessEnv = process.env): ConfigProvider {\n return {\n get<T extends string | number | boolean>(key: ConfigKey, fallback: T): T {\n const envName = ENV_VAR_BY_KEY[key];\n const raw = env[envName];\n if (raw === undefined || raw === '') return fallback;\n const expanded = raw.includes('${userHome}')\n ? raw.replace(/\\$\\{userHome\\}/g, os.homedir())\n : raw;\n return expanded as unknown as T;\n },\n };\n}\n","import type { ConfigProvider, Logger, ProgressReporter } from '@oniroproject/core';\nimport { createCliLogger } from '../adapters/logger.js';\nimport { createCliProgress } from '../adapters/progress.js';\nimport { createEnvConfig } from '../adapters/config.js';\n\nexport interface CliRuntime {\n logger: Logger;\n config: ConfigProvider;\n progress: ProgressReporter;\n}\n\nlet cached: CliRuntime | null = null;\n\n/**\n * Build (and cache) the per-process runtime used by every command. Tests can\n * override the cached runtime via `setRuntime` to inject mocks.\n */\nexport function getRuntime(): CliRuntime {\n if (!cached) {\n cached = {\n logger: createCliLogger(),\n config: createEnvConfig(),\n progress: createCliProgress(),\n };\n }\n return cached;\n}\n\nexport function setRuntime(runtime: CliRuntime | null): void {\n cached = runtime;\n}\n","import { Command } from 'commander';\nimport { getCmdToolsStatus, installCmdTools, isCmdToolsInstalled, removeCmdTools } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerCmdToolsCommand(program: Command): void {\n const cmdtools = program.command('cmdtools').description('Manage OpenHarmony command-line tools.');\n\n cmdtools\n .command('install')\n .description('Install the OpenHarmony command-line tools (hvigorw, ohpm, hdc). Skips if already installed.')\n .option('--from-zip <path>', 'Install from a local ZIP instead of downloading.')\n .option('--force', 'Reinstall even if the tools are already present.')\n .action(async (opts: { fromZip?: string; force?: boolean }) => {\n const { config, logger, progress } = getRuntime();\n if (isCmdToolsInstalled(config) && !opts.force) {\n logger.info('Command-line tools already installed; pass --force to reinstall.');\n return;\n }\n logger.info('Installing OpenHarmony command-line tools...');\n await installCmdTools({ config, progress, logger, localZipPath: opts.fromZip });\n logger.info('Command-line tools installed.');\n });\n\n cmdtools\n .command('status')\n .description('Report whether the command-line tools are installed and their version.')\n .option('--json', 'Emit machine-readable JSON.')\n .action((opts: { json?: boolean }) => {\n const { config } = getRuntime();\n const status = getCmdToolsStatus(config);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(status, null, 2)}\\n`);\n return;\n }\n process.stdout.write(`${status.status}\\n`);\n if (!status.installed) process.exit(1);\n });\n\n cmdtools\n .command('remove')\n .description('Delete the configured command-line tools directory.')\n .action(() => {\n const { config, logger } = getRuntime();\n removeCmdTools(config);\n logger.info('Command-line tools removed.');\n });\n}\n","import { Command } from 'commander';\nimport {\n attemptHdcConnection,\n installEmulator,\n isEmulatorInstalled,\n removeEmulator,\n startEmulator,\n stopEmulator,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerEmulatorCommand(program: Command): void {\n const emu = program.command('emulator').description('Manage the Oniro emulator.');\n\n emu\n .command('install')\n .description('Download and install the Oniro emulator (QEMU-based). Skips if already installed.')\n .option('--force', 'Reinstall even if the emulator is already present.')\n .action(async (opts: { force?: boolean }) => {\n const { config, logger, progress } = getRuntime();\n if (isEmulatorInstalled(config) && !opts.force) {\n logger.info('Emulator already installed; pass --force to reinstall.');\n return;\n }\n logger.info('Installing Oniro emulator...');\n await installEmulator({ config, progress, logger });\n logger.info('Emulator installed.');\n });\n\n emu\n .command('start')\n .description('Start the Oniro emulator via the bundled launcher (run.sh / run.bat). Detaches so the CLI can exit while the emulator keeps running.')\n .option('--headless', 'Launch headless (VNC + telnet serial, no local window). Required in CI.')\n .option('--log <path>', 'Redirect launcher stdout/stderr to this file. Defaults to discarding output.')\n .option('--wait-for-hdc <seconds>', 'Wait up to N seconds for hdc to connect. 0 = do not wait.', (v) => parseInt(v, 10), 0)\n .option('--connect <host:port>', 'Override the launcher\\'s hdc port-forward bind address. Pass 0.0.0.0:55555 on hosts where QEMU refuses to bind 127.0.0.1 (some CI runners).')\n .action(async (opts: { headless?: boolean; log?: string; waitForHdc: number; connect?: string }) => {\n const { config, logger } = getRuntime();\n await startEmulator({\n config,\n logger,\n headless: opts.headless === true,\n logFile: opts.log,\n waitForHdcSeconds: opts.waitForHdc,\n connect: opts.connect,\n });\n logger.info('Emulator start command complete.');\n });\n\n emu\n .command('stop')\n .description('Kill running emulator processes.')\n .action(async () => {\n const { logger } = getRuntime();\n await stopEmulator(logger);\n logger.info('Emulator stopped.');\n });\n\n emu\n .command('connect')\n .description('Attempt to connect hdc to the emulator.')\n .option('--address <addr>', 'hdc address to connect to', '127.0.0.1:55555')\n .action(async (opts: { address: string }) => {\n const { config, logger } = getRuntime();\n const ok = await attemptHdcConnection(config, opts.address, logger);\n if (!ok) {\n logger.error(`Could not connect hdc to ${opts.address}.`);\n process.exit(1);\n }\n logger.info(`hdc connected to ${opts.address}.`);\n });\n\n emu\n .command('remove')\n .description('Delete the configured emulator directory.')\n .action(() => {\n const { config, logger } = getRuntime();\n removeEmulator(config);\n logger.info('Emulator removed.');\n });\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport { buildHap } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface BuildOpts {\n product: string;\n module?: string;\n mode?: string;\n task: string;\n deps: boolean;\n parallel: boolean;\n json?: boolean;\n}\n\nexport function registerBuildCommand(program: Command): void {\n program\n .command('build [project-dir]')\n .description('Build an OpenHarmony app via hvigorw. Defaults to the current directory.')\n .option('--product <product>', 'hvigor product name', 'default')\n .option('--module <module>', 'restrict the build to a specific module')\n .option('--mode <mode>', 'hvigor build mode (e.g. release, debug)')\n .option('--task <task>', 'hvigor task to run', 'assembleHap')\n .option('--no-deps', 'skip the automatic `ohpm install --all` when oh_modules/ is missing')\n .option('--no-parallel', 'build modules serially (default: parallel)')\n .option('--json', 'emit the build result (discovered HAPs, warnings) as JSON')\n .action(async (projectDir: string | undefined, opts: BuildOpts) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n logger.info(`Building project at ${dir}...`);\n const result = await buildHap({\n config,\n projectDir: dir,\n product: opts.product,\n module: opts.module,\n mode: opts.mode,\n task: opts.task,\n autoInstallDeps: opts.deps,\n parallel: opts.parallel,\n logger,\n // The logger already echoes spawn output; this hook is for streaming to other UIs.\n onOutput: () => {},\n });\n for (const w of result.warnings) logger.warn(w);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n }\n logger.info('Build complete.');\n });\n}\n","import { Command, Option } from 'commander';\nimport * as path from 'node:path';\nimport {\n APL_VALUES,\n APP_FEATURE_VALUES,\n generateSigningConfigs,\n prepareSigning,\n getOhosBaseSdkHome,\n type Apl,\n type AppFeature,\n type SigningPasswords,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nfunction parseAclsList(value: string): string[] {\n return value\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\nexport function registerSignCommand(program: Command): void {\n program\n .command('sign [project-dir]')\n .description(\n [\n 'Generate signing keys, certificates, and signingConfigs for an OpenHarmony project.',\n 'Requires java on PATH. The generated profile uses the SDK\\'s built-in development',\n 'cert (issuer=pki_internal) and its bundled validity window — dev/local builds only.',\n 'Overwrites the `signingConfigs` block in build-profile.json5 (other keys preserved).',\n ].join(' '),\n )\n .addOption(\n new Option(\n '--apl <level>',\n 'Ability Privilege Level written into the profile. Apps that request permissions above `normal` (e.g. ohos.permission.GET_WIFI_INFO_INTERNAL) need system_basic or system_core, which also switches the HAP-signing key to \"OpenHarmony Application Release\".',\n )\n .choices([...APL_VALUES])\n .default('normal'),\n )\n .addOption(\n new Option(\n '--app-feature <feature>',\n 'App feature written into the profile. Defaults: hos_normal_app for apl=normal; hos_system_app for apl=system_basic/system_core.',\n ).choices([...APP_FEATURE_VALUES]),\n )\n .addOption(\n new Option(\n '--acls <list>',\n 'Comma-separated permission names to write into the profile\\'s acls.allowed-acls. Required for apps that request permissions above their apl (e.g. a system_basic app requesting ohos.permission.CAPTURE_SCREEN). Example: --acls ohos.permission.REBOOT,ohos.permission.INJECT_INPUT_EVENT',\n ).argParser(parseAclsList),\n )\n .option('--bootstrap', 'No-op if signing material is already present; otherwise generate it.')\n .option('--store-password <pwd>', 'Keystore store password (default 123456 — the SDK keystore password).')\n .option('--key-password <pwd>', 'Keystore key password (default 123456 — the SDK keystore password).')\n .action(\n (\n projectDir: string | undefined,\n opts: {\n apl: Apl;\n appFeature?: AppFeature;\n acls?: string[];\n bootstrap?: boolean;\n storePassword?: string;\n keyPassword?: string;\n },\n ) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n const passwords: SigningPasswords | undefined =\n opts.storePassword || opts.keyPassword\n ? { store: opts.storePassword ?? '123456', key: opts.keyPassword ?? '123456' }\n : undefined;\n\n if (opts.bootstrap) {\n const result = prepareSigning({\n config,\n projectDir: dir,\n apl: opts.apl,\n appFeature: opts.appFeature,\n acls: opts.acls,\n passwords,\n logger,\n });\n logger.info(result.source === 'present' ? 'Signing material already present.' : 'Signing configs generated.');\n return;\n }\n\n const sdkHome = getOhosBaseSdkHome(config);\n logger.info(`Generating signing configs in ${dir} using SDK at ${sdkHome}...`);\n generateSigningConfigs({\n projectDir: dir,\n sdkHome,\n apl: opts.apl,\n appFeature: opts.appFeature,\n acls: opts.acls,\n passwords,\n logger,\n });\n logger.info('Signing configs generated.');\n },\n );\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport { installApp, launchApp, uninstallApp, forceStop, applyChanges } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface ApplyOpts {\n bundle: string;\n module?: string;\n hap?: string;\n installedHap?: string;\n system?: boolean;\n allowUninstall?: boolean;\n device?: string;\n json?: boolean;\n}\n\nexport function registerAppCommand(program: Command): void {\n const app = program.command('app').description('Install, launch, and manage built apps on a connected device/emulator.');\n\n app\n .command('install [project-dir]')\n .description('Install the signed .hap on the connected device/emulator via hdc.')\n .option('--hap <path>', 'Override the .hap path (relative to project-dir or absolute).')\n .action(async (projectDir: string | undefined, opts: { hap?: string }) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n logger.info(`Installing app from ${dir}...`);\n await installApp({ config, projectDir: dir, hapPath: opts.hap, logger });\n logger.info('App installed.');\n });\n\n app\n .command('launch [project-dir]')\n .description('Launch the app on the connected device/emulator via hdc.')\n .option('--module <module>', 'Module folder name', 'entry')\n .option('--ability <name>', 'Explicit ability to launch (defaults to the module mainElement / first visible).')\n .action(async (projectDir: string | undefined, opts: { module: string; ability?: string }) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n logger.info(`Launching app from ${dir}...`);\n await launchApp({ config, projectDir: dir, moduleName: opts.module, abilityName: opts.ability, logger });\n logger.info('App launched.');\n });\n\n app\n .command('apply [project-dir]')\n .description(\n 'Install a HAP and verify the running process took the change. Handles sign-info mismatch, ' +\n 'asset-cache invalidation, and persistent-bundle restart.',\n )\n .requiredOption('--bundle <bundle>', 'Bundle name to apply changes to.')\n .option('--module <module>', 'Module to resolve the HAP from (multi-module projects).')\n .option('--hap <path>', 'Explicit .hap path (relative to project-dir or absolute).')\n .option('--installed-hap <path>', 'Local path to the currently-installed HAP, to enable the asset-cache reboot.')\n .option('--system', 'Treat as a persistent/system bundle (refuses uninstall on sign-info mismatch).')\n .option('--allow-uninstall', 'Permit uninstalling a system bundle on sign-info mismatch (dangerous).')\n .option('--device <serial>', 'Target device serial.')\n .option('--json', 'Emit the result as JSON.')\n .action(async (projectDir: string | undefined, opts: ApplyOpts) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n const result = await applyChanges({\n config,\n bundle: opts.bundle,\n hapPath: opts.hap,\n projectDir: dir,\n module: opts.module,\n installedHapPath: opts.installedHap,\n isSystemBundle: opts.system,\n allowUninstall: opts.allowUninstall,\n deviceSerial: opts.device,\n logger,\n });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else {\n logger.info(\n `apply: method=${result.method} pid ${result.preInstallPid ?? '-'} -> ${result.postInstallPid ?? '-'}` +\n `${result.cacheCleared ? ' (cache cleared)' : ''}`,\n );\n }\n });\n\n app\n .command('uninstall <bundle>')\n .description('Uninstall an app by bundle name.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (bundle: string, opts: { device?: string }) => {\n const { config, logger } = getRuntime();\n await uninstallApp({ config, bundle, deviceSerial: opts.device, logger });\n logger.info(`Uninstalled ${bundle}.`);\n });\n\n app\n .command('stop <bundle>')\n .description('Force-stop an app by bundle name.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (bundle: string, opts: { device?: string }) => {\n const { config, logger } = getRuntime();\n await forceStop({ config, bundle, deviceSerial: opts.device, logger });\n logger.info(`Stopped ${bundle}.`);\n });\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport {\n ALL_SDKS,\n createScaffold,\n isValidBundleName,\n isValidProjectName,\n} from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { getBundledTemplateRoot } from '../lib/templateRoot.js';\n\ninterface CreateOpts {\n name: string;\n bundle: string;\n location: string;\n sdk: string;\n template: string;\n module?: string;\n overwrite?: boolean;\n}\n\nexport function registerCreateCommand(program: Command): void {\n program\n .command('create')\n .description('Scaffold a new Oniro/OpenHarmony app from a template. All flags are required (non-interactive).')\n .requiredOption('--name <name>', 'Project folder name (letters, digits, ._- only)')\n .requiredOption('--bundle <bundleName>', 'Bundle name in reverse-DNS form, e.g. com.example.myapp')\n .requiredOption('--location <dir>', 'Parent directory where the new project folder will be created')\n .requiredOption('--sdk <api>', 'Target SDK API level (e.g. 18, 20)')\n .option('--template <id>', 'Template id', 'EmptyAbility')\n .option('--module <name>', 'Module folder name (defaults to the template default, usually `entry`)')\n .option('--overwrite', 'Replace the destination if it already exists')\n .action(async (opts: CreateOpts) => {\n const { config, logger } = getRuntime();\n\n if (!isValidProjectName(opts.name)) {\n throw new Error(`Invalid --name '${opts.name}'. Use letters/numbers/._- and no slashes.`);\n }\n if (!isValidBundleName(opts.bundle)) {\n throw new Error(`Invalid --bundle '${opts.bundle}'. Example: com.example.myapp`);\n }\n const sdkApi = Number(opts.sdk);\n if (!Number.isFinite(sdkApi)) {\n throw new Error(`--sdk must be a numeric api level. Known: ${ALL_SDKS.map((s) => s.api).join(', ')}`);\n }\n\n const templateRoot = getBundledTemplateRoot();\n const result = await createScaffold({\n config,\n templateId: opts.template,\n projectName: opts.name,\n bundleName: opts.bundle,\n location: path.resolve(opts.location),\n sdkApi,\n moduleName: opts.module,\n templateRoot,\n overwrite: opts.overwrite,\n logger,\n });\n\n logger.info(`Project created at ${result.projectDir}`);\n process.stdout.write(`${result.projectDir}\\n`);\n });\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Resolve the bundled `templates/` directory shipped inside this CLI package.\n *\n * The CLI's `dist/oniro-app.js` lives at `<pkg>/dist/oniro-app.js` after build\n * and the templates ship at `<pkg>/templates/`. During development the entrypoint\n * lives at `<pkg>/src/bin/oniro-app.ts` so we also try `../../templates` from there.\n */\nexport function getBundledTemplateRoot(): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, '../templates'), // dist/oniro-app.js → ../templates\n path.resolve(here, '../../templates'), // src/bin/oniro-app.ts → ../../templates\n ];\n for (const c of candidates) {\n if (fs.existsSync(c)) return c;\n }\n // Return the most likely path even if it doesn't exist yet; createScaffold will\n // surface a clear error from there.\n return candidates[0]!;\n}\n","import { Command } from 'commander';\nimport { listTemplates } from '@oniroproject/core';\nimport { getBundledTemplateRoot } from '../lib/templateRoot.js';\n\nexport function registerTemplatesCommand(program: Command): void {\n const templates = program.command('templates').description('Inspect the templates bundled with this CLI.');\n\n templates\n .command('list')\n .description('List available project templates.')\n .option('--json', 'Emit machine-readable JSON.')\n .action((opts: { json?: boolean }) => {\n const root = getBundledTemplateRoot();\n const list = listTemplates(root);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(list, null, 2)}\\n`);\n return;\n }\n if (list.length === 0) {\n process.stdout.write('No templates available.\\n');\n return;\n }\n const rows = list.map((t) => `${t.id.padEnd(20)} ${t.label.padEnd(24)} ${t.description}`);\n process.stdout.write(`${rows.join('\\n')}\\n`);\n });\n}\n","import { Command, Option } from 'commander';\nimport { reboot } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerRebootCommand(program: Command): void {\n program\n .command('reboot')\n .description('Reboot the connected device/emulator.')\n .addOption(\n new Option('--mode <mode>', 'Reboot target.').choices(['system', 'bootloader', 'recovery']).default('system'),\n )\n .option('--wait-bundle <bundle>', 'After a system reboot, wait until this bundle is running again.')\n .option('--timeout <ms>', 'Max time to wait for the bundle, ms.', '180000')\n .option('--device <serial>', 'Target device serial.')\n .action(\n async (opts: {\n mode: 'system' | 'bootloader' | 'recovery';\n waitBundle?: string;\n timeout: string;\n device?: string;\n }) => {\n const { config, logger } = getRuntime();\n logger.info(`Rebooting device (${opts.mode})...`);\n await reboot({\n config,\n mode: opts.mode,\n waitForBundle: opts.waitBundle,\n timeoutMs: Number(opts.timeout),\n deviceSerial: opts.device,\n logger,\n });\n logger.info('Reboot complete.');\n },\n );\n}\n","import { Command } from 'commander';\nimport { waitForLog, waitForBoot, waitForBundle } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface WaitOpts {\n log?: string;\n boot?: boolean;\n bundle?: string;\n pidOf?: string;\n domain?: string;\n timeout: string;\n device?: string;\n json?: boolean;\n}\n\nexport function registerWaitCommand(program: Command): void {\n program\n .command('wait')\n .description('Wait for a device condition: a log line (--log), boot (--boot), or a bundle to start (--bundle).')\n .option('--log <pattern>', 'Resolve when a hilog line (tag: message) matches this regex.')\n .option('--boot', 'Resolve when the device is reachable (optionally also --pid-of).')\n .option('--bundle <bundle>', 'With --log: filter to this bundle. Alone: wait until this bundle is running.')\n .option('--pid-of <name>', 'With --boot: also require this process to have a pid.')\n .option('--domain <domain>', 'With --log: hilog domain filter (e.g. 0xD003900).')\n .option('--timeout <ms>', 'Max wait, ms.', '30000')\n .option('--device <serial>', 'Target device serial.')\n .option('--json', 'With --log: emit the matched entry as JSON.')\n .action(async (opts: WaitOpts) => {\n const { config, logger } = getRuntime();\n const timeoutMs = Number(opts.timeout);\n\n if (opts.log) {\n const entry = await waitForLog({\n config,\n pattern: new RegExp(opts.log),\n timeoutMs,\n bundle: opts.bundle,\n domain: opts.domain,\n deviceSerial: opts.device,\n logger,\n });\n if (opts.json) process.stdout.write(`${JSON.stringify(entry, null, 2)}\\n`);\n else logger.info(`matched: ${entry.tag}: ${entry.message}`);\n return;\n }\n if (opts.boot) {\n await waitForBoot({ config, untilPidOf: opts.pidOf, timeoutMs, deviceSerial: opts.device, logger });\n logger.info('Device booted.');\n return;\n }\n if (opts.bundle) {\n await waitForBundle({ config, bundle: opts.bundle, timeoutMs, deviceSerial: opts.device, logger });\n logger.info(`Bundle ${opts.bundle} is running.`);\n return;\n }\n throw new Error('Specify one of --log <pattern>, --boot, or --bundle <bundle>.');\n });\n}\n","import { Command } from 'commander';\nimport { watchLog } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface WatchOpts {\n log?: string;\n for: string;\n bundle?: string;\n domain?: string;\n dedup: boolean;\n device?: string;\n json?: boolean;\n}\n\nexport function registerWatchCommand(program: Command): void {\n program\n .command('watch')\n .description('Collect hilog lines matching a pattern for a fixed duration.')\n .option('--log <pattern>', 'Regex tested against each line (tag: message).')\n .option('--for <ms>', 'Duration to watch, ms.', '10000')\n .option('--bundle <bundle>', 'Filter to this bundle.')\n .option('--domain <domain>', 'hilog domain filter (e.g. 0xD003900).')\n .option('--no-dedup', 'Do not collapse consecutive duplicate lines.')\n .option('--device <serial>', 'Target device serial.')\n .option('--json', 'Emit the entries as JSON.')\n .action(async (opts: WatchOpts) => {\n const { config, logger } = getRuntime();\n if (!opts.log) throw new Error('watch requires --log <pattern>.');\n const entries = await watchLog({\n config,\n pattern: new RegExp(opts.log),\n durationMs: Number(opts.for),\n bundle: opts.bundle,\n domain: opts.domain,\n dedup: opts.dedup,\n deviceSerial: opts.device,\n logger,\n });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(entries, null, 2)}\\n`);\n } else {\n for (const e of entries) process.stdout.write(`${e.time} ${e.level} ${e.tag}: ${e.message}\\n`);\n }\n });\n}\n","import { Command } from 'commander';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { takeScreenshot, captureBurst } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\nimport { renderWithGrid, buildContactSheet, frameDiffs } from '../lib/screenshotImage.js';\n\ninterface ScreenshotOpts {\n output: string;\n grid?: boolean;\n maxDim: string;\n contactSheet?: boolean;\n burst?: string;\n interval: string;\n json?: boolean;\n device?: string;\n}\n\nconst DEFAULT_CONTACT_SHEET_FRAMES = 8;\n\nfunction clampMaxDim(raw: string): number {\n const n = Number(raw);\n if (!Number.isFinite(n)) return 1024;\n return Math.max(256, Math.min(4096, Math.round(n)));\n}\n\nexport function registerScreenshotCommand(program: Command): void {\n program\n .command('screenshot')\n .description(\n 'Capture the screen. Default: full-resolution raw JPEG. ' +\n '--grid: downscaled JPEG with a 10x10 grid (axes 0.0-1.0) for picking tap coordinates. ' +\n '--contact-sheet: capture a burst and tile it into one image with per-frame change diffs.',\n )\n .option('-o, --output <file>', 'Output file path.', 'screenshot.jpeg')\n .option('--grid', 'Downscale (to --max-dim) and overlay a 10x10 coordinate grid.')\n .option('--max-dim <px>', 'Longest-side cap for --grid / --contact-sheet (256-4096).', '1024')\n .option('--contact-sheet', 'Capture a burst and composite it into one tiled contact sheet.')\n .option('--burst <count>', 'Capture N frames; writes <base>-<i><ext> (or feeds --contact-sheet).')\n .option('--interval <ms>', 'Delay between burst frames, ms.', '50')\n .option('--json', 'Emit the full result object as JSON on stdout (with --contact-sheet).')\n .option('--device <serial>', 'Target device serial.')\n .action(async (opts: ScreenshotOpts, command: Command) => {\n const { config, logger } = getRuntime();\n const maxDim = clampMaxDim(opts.maxDim);\n const intervalMs = Number(opts.interval) || 50;\n\n // --- Contact sheet: burst -> one tiled image + per-frame diffs ---\n if (opts.contactSheet) {\n const count = opts.burst ? Math.max(1, Number(opts.burst)) : DEFAULT_CONTACT_SHEET_FRAMES;\n const frames = await captureBurst({ config, count, intervalMs, deviceSerial: opts.device, logger });\n const diffs = await frameDiffs(frames);\n const sheet = await buildContactSheet(frames, { maxDim, diffs });\n fs.writeFileSync(opts.output, sheet.buf);\n\n // Only fan out the individual raw frames when --burst was also requested.\n if (opts.burst) {\n const ext = path.extname(opts.output) || '.jpeg';\n const base = opts.output.slice(0, opts.output.length - ext.length);\n frames.forEach((frame, i) => fs.writeFileSync(`${base}-${i}${ext}`, frame));\n }\n\n const perFrame = frames.map((_, i) => ({ idx: i, t_ms: i * intervalMs, diffVsPrev: diffs[i] ?? 0 }));\n if (opts.json) {\n process.stdout.write(\n `${JSON.stringify(\n {\n sheet: opts.output,\n frameCount: frames.length,\n cols: sheet.cols,\n rows: sheet.rows,\n intervalMs,\n note: 't_ms is nominal (idx*interval); diffVsPrev is 0..1 mean greyscale diff vs the previous frame.',\n frames: perFrame,\n },\n null,\n 2,\n )}\\n`,\n );\n } else {\n process.stdout.write(`${JSON.stringify(perFrame)}\\n`);\n }\n\n let peak = 0;\n for (let i = 1; i < diffs.length; i++) if ((diffs[i] ?? 0) > (diffs[peak] ?? 0)) peak = i;\n logger.info(\n `Wrote contact sheet ${opts.output} (${sheet.cols}x${sheet.rows}, ${frames.length} frames). ` +\n `Biggest change at frame ${peak} (Δ${(diffs[peak] ?? 0).toFixed(2)}).`,\n );\n return;\n }\n\n // --- Burst (raw frames) — unchanged behaviour ---\n if (opts.burst) {\n const frames = await captureBurst({\n config,\n count: Number(opts.burst),\n intervalMs,\n deviceSerial: opts.device,\n logger,\n });\n const ext = path.extname(opts.output) || '.jpeg';\n const base = opts.output.slice(0, opts.output.length - ext.length);\n frames.forEach((frame, i) => fs.writeFileSync(`${base}-${i}${ext}`, frame));\n logger.info(`Wrote ${frames.length} frames to ${base}-<0..${frames.length - 1}>${ext}.`);\n return;\n }\n\n // --- Single shot ---\n const shot = await takeScreenshot({ config, deviceSerial: opts.device, logger });\n const maxDimProvided = command.getOptionValueSource('maxDim') === 'cli';\n if (opts.grid || maxDimProvided) {\n const rendered = await renderWithGrid(shot.pixels, { maxDim, grid: !!opts.grid });\n fs.writeFileSync(opts.output, rendered.buf);\n logger.info(\n `Wrote ${opts.output} (${rendered.width}x${rendered.height} from ` +\n `${rendered.originalWidth}x${rendered.originalHeight}${opts.grid ? ', 10x10 grid' : ''}).`,\n );\n return;\n }\n fs.writeFileSync(opts.output, shot.pixels);\n logger.info(`Wrote ${opts.output} (${shot.width}x${shot.height}).`);\n });\n}\n","import sharp from 'sharp';\n\n/**\n * Agent-facing screenshot image processing for the CLI.\n *\n * `@oniroproject/core` deliberately ships no image dependency — it returns raw\n * JPEG buffers. The grid overlay / downscale and the burst contact-sheet live\n * here (the CLI is the affordance layer), so `oniro-app screenshot` can produce\n * exactly what the ohos-hdc MCP used to. The grid drawing is ported verbatim\n * from that MCP so the output is equivalent.\n */\n\nexport interface RenderResult {\n /** Encoded JPEG. */\n buf: Buffer;\n /** Rendered (post-downscale) dimensions. */\n width: number;\n height: number;\n /** Source dimensions, before downscale. */\n originalWidth: number;\n originalHeight: number;\n}\n\nexport interface RenderWithGridOptions {\n /** Longest-side cap in pixels. The image is downscaled (never upscaled) to fit. */\n maxDim: number;\n /** Overlay the 10x10 grid with 0.0–1.0 axis labels after downscaling. */\n grid?: boolean;\n}\n\n/**\n * Build an SVG overlay: a 10x10 grid with X/Y axis labels (0.0–1.0) sized to the\n * given image dimensions. Ported verbatim from the ohos-hdc MCP so the gridded\n * output matches what agents are used to.\n */\nexport function buildGridSvg(width: number, height: number): string {\n const lineColor = 'rgba(255,80,80,0.55)';\n const labelBg = 'rgba(0,0,0,0.7)';\n const labelFg = '#fff';\n const fontSize = Math.max(10, Math.round(Math.min(width, height) / 60));\n const padding = Math.round(fontSize * 0.4);\n const labels: string[] = [];\n const lines: string[] = [];\n for (let i = 0; i <= 10; i++) {\n const f = i / 10;\n const x = Math.round(f * (width - 1));\n const y = Math.round(f * (height - 1));\n // grid lines (skip 0 and 10 — those are the image edges)\n if (i > 0 && i < 10) {\n lines.push(`<line x1=\"${x}\" y1=\"0\" x2=\"${x}\" y2=\"${height}\" stroke=\"${lineColor}\" stroke-width=\"1\"/>`);\n lines.push(`<line x1=\"0\" y1=\"${y}\" x2=\"${width}\" y2=\"${y}\" stroke=\"${lineColor}\" stroke-width=\"1\"/>`);\n }\n const tag = f.toFixed(1);\n // X-axis labels along the top\n const tx = i === 0 ? padding : i === 10 ? width - padding : x;\n const anchorX = i === 0 ? 'start' : i === 10 ? 'end' : 'middle';\n labels.push(\n `<text x=\"${tx}\" y=\"${fontSize + padding}\" font-family=\"monospace\" font-size=\"${fontSize}\" font-weight=\"bold\" fill=\"${labelFg}\" stroke=\"${labelBg}\" stroke-width=\"3\" paint-order=\"stroke\" text-anchor=\"${anchorX}\">${tag}</text>`,\n );\n // Y-axis labels along the left\n const ty = i === 0 ? fontSize + padding : i === 10 ? height - padding : y + fontSize / 3;\n labels.push(\n `<text x=\"${padding}\" y=\"${ty}\" font-family=\"monospace\" font-size=\"${fontSize}\" font-weight=\"bold\" fill=\"${labelFg}\" stroke=\"${labelBg}\" stroke-width=\"3\" paint-order=\"stroke\" text-anchor=\"start\">${tag}</text>`,\n );\n }\n // Axis title markers in the corners\n labels.push(\n `<text x=\"${width / 2}\" y=\"${fontSize * 2.4 + padding}\" font-family=\"monospace\" font-size=\"${fontSize}\" font-weight=\"bold\" fill=\"${labelFg}\" stroke=\"${labelBg}\" stroke-width=\"3\" paint-order=\"stroke\" text-anchor=\"middle\">X →</text>`,\n );\n labels.push(\n `<text x=\"${padding}\" y=\"${fontSize * 2.6 + padding}\" font-family=\"monospace\" font-size=\"${fontSize}\" font-weight=\"bold\" fill=\"${labelFg}\" stroke=\"${labelBg}\" stroke-width=\"3\" paint-order=\"stroke\" text-anchor=\"start\">Y ↓</text>`,\n );\n return `<svg width=\"${width}\" height=\"${height}\" xmlns=\"http://www.w3.org/2000/svg\">${lines.join('')}${labels.join('')}</svg>`;\n}\n\n/**\n * Downscale a JPEG so its longest side is <= `maxDim` (never upscaling) and,\n * when `grid` is set, overlay the coordinate grid. Returns the encoded JPEG plus\n * rendered and original dimensions.\n */\nexport async function renderWithGrid(jpeg: Buffer, opts: RenderWithGridOptions): Promise<RenderResult> {\n const meta = await sharp(jpeg).metadata();\n const originalWidth = meta.width ?? 0;\n const originalHeight = meta.height ?? 0;\n const longest = Math.max(originalWidth, originalHeight) || 1;\n const scale = Math.min(1, opts.maxDim / longest);\n const width = Math.max(1, Math.round(originalWidth * scale));\n const height = Math.max(1, Math.round(originalHeight * scale));\n const resized = await sharp(jpeg).resize(width, height).jpeg({ quality: 80 }).toBuffer();\n if (!opts.grid) {\n return { buf: resized, width, height, originalWidth, originalHeight };\n }\n const svg = buildGridSvg(width, height);\n const buf = await sharp(resized)\n .composite([{ input: Buffer.from(svg) }])\n .jpeg({ quality: 80 })\n .toBuffer();\n return { buf, width, height, originalWidth, originalHeight };\n}\n\nexport interface ContactSheetOptions {\n /** Longest-side cap for the whole sheet; per-tile size derives from this. */\n maxDim: number;\n /** Tiles per row. Defaults to ceil(sqrt(N)). */\n cols?: number;\n /** Per-frame diff (0..1), index-aligned with `frames`; printed on each tile. */\n diffs?: number[];\n /** Gap between tiles, px. */\n gap?: number;\n}\n\nexport interface ContactSheetResult {\n buf: Buffer;\n width: number;\n height: number;\n cols: number;\n rows: number;\n tileWidth: number;\n tileHeight: number;\n count: number;\n}\n\nfunction buildTileLabelSvg(width: number, height: number, idx: number, diff?: number): string {\n const fontSize = Math.max(12, Math.round(Math.min(width, height) / 16));\n const pad = Math.round(fontSize * 0.4);\n let label = `#${idx}`;\n if (typeof diff === 'number') label += ` Δ${diff.toFixed(2)}`;\n const boxW = Math.round(label.length * fontSize * 0.62) + pad * 2;\n const boxH = fontSize + pad * 2;\n return (\n `<svg width=\"${width}\" height=\"${height}\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<rect x=\"0\" y=\"0\" width=\"${boxW}\" height=\"${boxH}\" fill=\"rgba(0,0,0,0.6)\"/>` +\n `<text x=\"${pad}\" y=\"${fontSize + pad - 1}\" font-family=\"monospace\" font-size=\"${fontSize}\" font-weight=\"bold\" fill=\"#fff\" stroke=\"rgba(0,0,0,0.85)\" stroke-width=\"3\" paint-order=\"stroke\" text-anchor=\"start\">${label}</text>` +\n `</svg>`\n );\n}\n\n/**\n * Composite a burst of JPEG frames into a single tiled contact sheet, each tile\n * labelled with its frame index (and per-frame diff when provided). One image\n * replaces N — a large token saving when verifying transient UI.\n */\nexport async function buildContactSheet(frames: Buffer[], opts: ContactSheetOptions): Promise<ContactSheetResult> {\n if (frames.length === 0) throw new Error('buildContactSheet: no frames');\n const count = frames.length;\n const cols = Math.max(1, opts.cols ?? Math.ceil(Math.sqrt(count)));\n const rows = Math.ceil(count / cols);\n const gap = opts.gap ?? 8;\n\n const meta0 = await sharp(frames[0]).metadata();\n const fw = meta0.width ?? 1;\n const fh = meta0.height ?? 1;\n const longest = Math.max(fw, fh) || 1;\n const tileScale = Math.min(1, opts.maxDim / cols / longest);\n const tileWidth = Math.max(1, Math.round(fw * tileScale));\n const tileHeight = Math.max(1, Math.round(fh * tileScale));\n\n const tiles = await Promise.all(\n frames.map((frame, i) => {\n const label = Buffer.from(buildTileLabelSvg(tileWidth, tileHeight, i, opts.diffs?.[i]));\n return sharp(frame)\n .resize(tileWidth, tileHeight, { fit: 'fill' })\n .composite([{ input: label, top: 0, left: 0 }])\n .png()\n .toBuffer();\n }),\n );\n\n const width = cols * tileWidth + (cols + 1) * gap;\n const height = rows * tileHeight + (rows + 1) * gap;\n const placements = tiles.map((input, i) => {\n const r = Math.floor(i / cols);\n const c = i % cols;\n return { input, left: gap + c * (tileWidth + gap), top: gap + r * (tileHeight + gap) };\n });\n\n const buf = await sharp({\n create: { width, height, channels: 3, background: { r: 20, g: 20, b: 20 } },\n })\n .composite(placements)\n .jpeg({ quality: 80 })\n .toBuffer();\n\n return { buf, width, height, cols, rows, tileWidth, tileHeight, count };\n}\n\n/**\n * Per-frame change metric: mean absolute difference of a downscaled greyscale\n * thumbnail vs. the previous frame, normalised to 0..1. Frame 0 is 0 (no\n * predecessor). Cheap, deterministic, and device-free.\n */\nexport async function frameDiffs(frames: Buffer[], opts: { sample?: number } = {}): Promise<number[]> {\n if (frames.length === 0) return [];\n const sample = opts.sample ?? 32;\n const thumbs = await Promise.all(\n frames.map((f) => sharp(f).greyscale().resize(sample, sample, { fit: 'fill' }).raw().toBuffer()),\n );\n const out: number[] = [0];\n for (let i = 1; i < thumbs.length; i++) {\n const a = thumbs[i - 1];\n const b = thumbs[i];\n if (!a || !b) {\n out.push(0);\n continue;\n }\n const n = Math.min(a.length, b.length) || 1;\n let s = 0;\n for (let k = 0; k < n; k++) s += Math.abs((a[k] ?? 0) - (b[k] ?? 0));\n out.push(+(s / n / 255).toFixed(4));\n }\n return out;\n}\n","import { Command } from 'commander';\nimport { dumpLayout } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface DumpOpts {\n bundle?: string;\n raw?: boolean;\n device?: string;\n}\n\nexport function registerDumpCommand(program: Command): void {\n program\n .command('dump [target]')\n .description('Dump device state as JSON. Currently supports `dump layout` (the default target).')\n .option('--bundle <bundle>', 'Filter the layout to a single window/bundle.')\n .option('--raw', 'Return the unpruned layout tree.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (target: string | undefined, opts: DumpOpts) => {\n const { config, logger } = getRuntime();\n const what = target ?? 'layout';\n if (what !== 'layout') throw new Error(`Unknown dump target \"${what}\". Supported: layout.`);\n const result = await dumpLayout({\n config,\n bundleName: opts.bundle,\n prune: !opts.raw,\n deviceSerial: opts.device,\n logger,\n });\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n });\n}\n","import { Command } from 'commander';\nimport { listDevices } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerDevicesCommand(program: Command): void {\n program\n .command('devices')\n .description('List connected hdc devices.')\n .option('--json', 'Emit machine-readable JSON.')\n .action(async (opts: { json?: boolean }) => {\n const { config } = getRuntime();\n const devices = await listDevices(config);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(devices, null, 2)}\\n`);\n return;\n }\n if (devices.length === 0) {\n process.stdout.write('(no devices)\\n');\n return;\n }\n for (const d of devices) {\n process.stdout.write(`${d.serial}\\t${d.connection ?? ''}\\t${d.status}\\n`);\n }\n });\n}\n","import { Command } from 'commander';\nimport { sendFile, recvFile } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nexport function registerFileCommand(program: Command): void {\n const file = program.command('file').description('Transfer files to/from the device (hdc file send/recv).');\n\n file\n .command('send <local> <remote>')\n .description('Push a local file to the device.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (local: string, remote: string, opts: { device?: string }) => {\n const { config, logger } = getRuntime();\n await sendFile({ config, local, remote, deviceSerial: opts.device, logger });\n logger.info(`Sent ${local} -> ${remote}.`);\n });\n\n file\n .command('recv <remote> <local>')\n .description('Pull a file from the device.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (remote: string, local: string, opts: { device?: string }) => {\n const { config, logger } = getRuntime();\n await recvFile({ config, remote, local, deviceSerial: opts.device, logger });\n logger.info(`Received ${remote} -> ${local}.`);\n });\n}\n","import { Command } from 'commander';\nimport * as path from 'node:path';\nimport { runCodelinter } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\ninterface LintOpts {\n files?: string[];\n json?: boolean;\n}\n\nexport function registerLintCommand(program: Command): void {\n program\n .command('lint [project-dir]')\n .description('Run the OpenHarmony codelinter on a project. Defaults to the current directory.')\n .option('--files <globs...>', 'Specific files/globs to lint (default: the whole project).')\n .option('--json', 'Emit findings as JSON.')\n .action(async (projectDir: string | undefined, opts: LintOpts) => {\n const { config, logger } = getRuntime();\n const dir = path.resolve(projectDir ?? process.cwd());\n const result = await runCodelinter({ config, projectDir: dir, files: opts.files, logger });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else {\n for (const f of result.findings) {\n process.stdout.write(`${f.file}:${f.line} ${f.severity} ${f.message}${f.code ? ` [${f.code}]` : ''}\\n`);\n }\n if (result.findings.length === 0) process.stdout.write('No findings.\\n');\n }\n // Surface a non-zero codelinter exit to the caller (CI), but let output flush.\n if (result.code !== 0) process.exitCode = result.code;\n });\n}\n","import { Command, Option } from 'commander';\nimport { sendInput, sendGesture, type InputType, type Waypoint } from '@oniroproject/core';\nimport { getRuntime } from '../lib/runtime.js';\n\nconst INPUT_TYPES: InputType[] = ['click', 'doubleClick', 'longClick', 'swipe', 'drag', 'fling', 'keyEvent', 'inputText'];\n\nconst num = (v: string | undefined): number | undefined => (v === undefined ? undefined : Number(v));\n\ninterface InputOpts {\n type: InputType;\n x?: string;\n y?: string;\n x2?: string;\n y2?: string;\n speed?: string;\n key?: string;\n text?: string;\n device?: string;\n}\n\ninterface GestureOpts {\n waypoints: string;\n holdStart?: string;\n holdEnd?: string;\n device?: string;\n}\n\nexport function registerInputCommand(program: Command): void {\n program\n .command('input')\n .description('Inject a UI input event (pixel coordinates) via uitest uiInput.')\n .addOption(new Option('--type <type>', 'Input type.').choices(INPUT_TYPES).makeOptionMandatory())\n .option('--x <px>', 'X pixel (click/swipe start).')\n .option('--y <px>', 'Y pixel (click/swipe start).')\n .option('--x2 <px>', 'End X pixel (swipe/drag/fling).')\n .option('--y2 <px>', 'End Y pixel (swipe/drag/fling).')\n .option('--speed <px-per-s>', 'Velocity for swipe/drag/fling.')\n .option('--key <key>', 'Key id or symbolic name (Back/Home/Power) for keyEvent.')\n .option('--text <text>', 'Text for inputText.')\n .option('--device <serial>', 'Target device serial.')\n .action(async (opts: InputOpts) => {\n const { config, logger } = getRuntime();\n await sendInput({\n config,\n type: opts.type,\n pxX: num(opts.x),\n pxY: num(opts.y),\n pxX2: num(opts.x2),\n pxY2: num(opts.y2),\n speed: num(opts.speed),\n key: opts.key,\n text: opts.text,\n deviceSerial: opts.device,\n logger,\n });\n logger.info(`Sent ${opts.type}.`);\n });\n\n program\n .command('gesture')\n .description('Inject a multi-waypoint gesture. Waypoints are pixel JSON: [{\"x\":..,\"y\":..,\"t\":..}].')\n .requiredOption('--waypoints <json>', 'JSON array of {x,y,t} pixel waypoints (t = ms from start).')\n .option('--hold-start <ms>', 'Hold at the first point before moving (routes via uinput).')\n .option('--hold-end <ms>', 'Hold at the last point before lifting (routes via uinput).')\n .option('--device <serial>', 'Target device serial.')\n .action(async (opts: GestureOpts) => {\n const { config, logger } = getRuntime();\n const waypoints = JSON.parse(opts.waypoints) as Waypoint[];\n await sendGesture({\n config,\n waypoints,\n holdStartMs: num(opts.holdStart),\n holdEndMs: num(opts.holdEnd),\n deviceSerial: opts.device,\n logger,\n });\n logger.info('Gesture sent.');\n });\n}\n"],"mappings":";;;AAAA,SAAS,WAAAA,gBAAe;AACxB,SAAS,kBAAkB;;;ACA3B,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACFA,SAAS,kBAA0B;AACxC,QAAM,eAAe,QAAQ,IAAI,gBAAgB,OAAO,QAAQ,IAAI,gBAAgB;AACpF,SAAO;AAAA,IACL,MAAM,GAAG;AACP,UAAI,aAAc,SAAQ,OAAO,MAAM,WAAW,CAAC;AAAA,CAAI;AAAA,IACzD;AAAA,IACA,KAAK,GAAG;AACN,cAAQ,OAAO,MAAM,GAAG,CAAC;AAAA,CAAI;AAAA,IAC/B;AAAA,IACA,KAAK,GAAG;AACN,cAAQ,OAAO,MAAM,UAAU,CAAC;AAAA,CAAI;AAAA,IACtC;AAAA,IACA,MAAM,GAAG;AACP,cAAQ,OAAO,MAAM,WAAW,CAAC;AAAA,CAAI;AAAA,IACvC;AAAA,EACF;AACF;;;AChBO,SAAS,oBAAsC;AACpD,MAAI,QAAQ;AACZ,MAAI,cAAc;AAClB,MAAI,cAAc;AAClB,SAAO;AAAA,IACL,OAAO,EAAE,SAAS,UAAU,GAAG;AAC7B,UAAI,OAAO,cAAc,SAAU,SAAQ,KAAK,IAAI,KAAK,QAAQ,SAAS;AAC1E,YAAM,MAAM,QAAQ,IAAI,KAAK,MAAM,KAAK,IAAI;AAC5C,YAAM,MAAM,WAAW;AAEvB,UAAI,QAAQ,eAAe,QAAQ,YAAa;AAChD,YAAM,SAAS,QAAQ,OAAO,eAAe,aAAa,GAAG;AAC7D,cAAQ,OAAO,MAAM,GAAG,MAAM,IAAI,GAAG;AAAA,CAAI;AACzC,oBAAc,OAAO;AACrB,UAAI,QAAS,eAAc;AAAA,IAC7B;AAAA,EACF;AACF;;;ACzBA,YAAY,QAAQ;AAOpB,IAAM,iBAA4C;AAAA,EAChD,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,qBAAqB;AACvB;AAOO,SAAS,gBAAgB,MAAyB,QAAQ,KAAqB;AACpF,SAAO;AAAA,IACL,IAAyC,KAAgB,UAAgB;AACvE,YAAM,UAAU,eAAe,GAAG;AAClC,YAAM,MAAM,IAAI,OAAO;AACvB,UAAI,QAAQ,UAAa,QAAQ,GAAI,QAAO;AAC5C,YAAM,WAAW,IAAI,SAAS,aAAa,IACvC,IAAI,QAAQ,mBAAsB,WAAQ,CAAC,IAC3C;AACJ,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC1BA,IAAI,SAA4B;AAMzB,SAAS,aAAyB;AACvC,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,MACP,QAAQ,gBAAgB;AAAA,MACxB,QAAQ,gBAAgB;AAAA,MACxB,UAAU,kBAAkB;AAAA,IAC9B;AAAA,EACF;AACA,SAAO;AACT;;;AJbO,SAAS,mBAAmB,SAAwB;AACzD,QAAM,MAAM,QAAQ,QAAQ,KAAK,EAAE,YAAY,kCAAkC;AAEjF,MACG,QAAQ,mBAAmB,EAC3B,YAAY,sEAAsE,EAClF,OAAO,WAAW,+CAA+C,EACjE,OAAO,OAAO,SAAiB,SAA8B;AAC5D,UAAM,EAAE,QAAQ,QAAQ,SAAS,IAAI,WAAW;AAChD,UAAM,UAAU,SAAS,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO;AAC1D,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR,wBAAwB,OAAO,aAAa,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACvF;AAAA,IACF;AACA,UAAM,gBAAqB,UAAK,cAAc,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG;AACjF,QAAO,cAAW,aAAa,KAAK,CAAC,KAAK,OAAO;AAC/C,aAAO;AAAA,QACL,OAAO,QAAQ,OAAO,SAAS,QAAQ,GAAG,0BAA0B,aAAa;AAAA,MACnF;AACA;AAAA,IACF;AACA,WAAO,KAAK,8BAA8B,QAAQ,OAAO,SAAS,QAAQ,GAAG,MAAM;AACnF,UAAM,sBAAsB,EAAE,QAAQ,SAAS,QAAQ,SAAS,KAAK,QAAQ,KAAK,UAAU,OAAO,CAAC;AACpG,WAAO,KAAK,gBAAgB;AAAA,EAC9B,CAAC;AAEH,MACG,QAAQ,MAAM,EACd,YAAY,yEAAyE,EACrF,OAAO,UAAU,gDAAgD,EACjE,OAAO,CAAC,SAA6B;AACpC,UAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,UAAM,OAAO,sBAAsB,MAAM;AACzC,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,CAAI;AACzD;AAAA,IACF;AACA,UAAM,OAAO,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,YAAY,MAAM,GAAG,KAAK,EAAE,QAAQ,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE;AAC9F,YAAQ,OAAO,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,EAC7C,CAAC;AAEH,MACG,QAAQ,cAAc,EACtB,YAAY,qDAAqD,EACjE,OAAO,CAAC,QAAgB;AACvB,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,UAAU,UAAU,QAAQ,GAAG;AACrC,QAAI,CAAC,SAAS;AACZ,aAAO,KAAK,mBAAmB,GAAG,uCAAuC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,WAAO,KAAK,mBAAmB,GAAG,GAAG;AAAA,EACvC,CAAC;AACL;;;AKlEA,SAAS,mBAAmB,iBAAiB,qBAAqB,sBAAsB;AAGjF,SAAS,wBAAwB,SAAwB;AAC9D,QAAM,WAAW,QAAQ,QAAQ,UAAU,EAAE,YAAY,wCAAwC;AAEjG,WACG,QAAQ,SAAS,EACjB,YAAY,8FAA8F,EAC1G,OAAO,qBAAqB,kDAAkD,EAC9E,OAAO,WAAW,kDAAkD,EACpE,OAAO,OAAO,SAAgD;AAC7D,UAAM,EAAE,QAAQ,QAAQ,SAAS,IAAI,WAAW;AAChD,QAAI,oBAAoB,MAAM,KAAK,CAAC,KAAK,OAAO;AAC9C,aAAO,KAAK,kEAAkE;AAC9E;AAAA,IACF;AACA,WAAO,KAAK,8CAA8C;AAC1D,UAAM,gBAAgB,EAAE,QAAQ,UAAU,QAAQ,cAAc,KAAK,QAAQ,CAAC;AAC9E,WAAO,KAAK,+BAA+B;AAAA,EAC7C,CAAC;AAEH,WACG,QAAQ,QAAQ,EAChB,YAAY,wEAAwE,EACpF,OAAO,UAAU,6BAA6B,EAC9C,OAAO,CAAC,SAA6B;AACpC,UAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,UAAM,SAAS,kBAAkB,MAAM;AACvC,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAC3D;AAAA,IACF;AACA,YAAQ,OAAO,MAAM,GAAG,OAAO,MAAM;AAAA,CAAI;AACzC,QAAI,CAAC,OAAO,UAAW,SAAQ,KAAK,CAAC;AAAA,EACvC,CAAC;AAEH,WACG,QAAQ,QAAQ,EAChB,YAAY,qDAAqD,EACjE,OAAO,MAAM;AACZ,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,mBAAe,MAAM;AACrB,WAAO,KAAK,6BAA6B;AAAA,EAC3C,CAAC;AACL;;;AC7CA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGA,SAAS,wBAAwB,SAAwB;AAC9D,QAAM,MAAM,QAAQ,QAAQ,UAAU,EAAE,YAAY,4BAA4B;AAEhF,MACG,QAAQ,SAAS,EACjB,YAAY,mFAAmF,EAC/F,OAAO,WAAW,oDAAoD,EACtE,OAAO,OAAO,SAA8B;AAC3C,UAAM,EAAE,QAAQ,QAAQ,SAAS,IAAI,WAAW;AAChD,QAAI,oBAAoB,MAAM,KAAK,CAAC,KAAK,OAAO;AAC9C,aAAO,KAAK,wDAAwD;AACpE;AAAA,IACF;AACA,WAAO,KAAK,8BAA8B;AAC1C,UAAM,gBAAgB,EAAE,QAAQ,UAAU,OAAO,CAAC;AAClD,WAAO,KAAK,qBAAqB;AAAA,EACnC,CAAC;AAEH,MACG,QAAQ,OAAO,EACf,YAAY,sIAAsI,EAClJ,OAAO,cAAc,yEAAyE,EAC9F,OAAO,gBAAgB,8EAA8E,EACrG,OAAO,4BAA4B,6DAA6D,CAAC,MAAM,SAAS,GAAG,EAAE,GAAG,CAAC,EACzH,OAAO,yBAAyB,4IAA6I,EAC7K,OAAO,OAAO,SAAqF;AAClG,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA,UAAU,KAAK,aAAa;AAAA,MAC5B,SAAS,KAAK;AAAA,MACd,mBAAmB,KAAK;AAAA,MACxB,SAAS,KAAK;AAAA,IAChB,CAAC;AACD,WAAO,KAAK,kCAAkC;AAAA,EAChD,CAAC;AAEH,MACG,QAAQ,MAAM,EACd,YAAY,kCAAkC,EAC9C,OAAO,YAAY;AAClB,UAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,UAAM,aAAa,MAAM;AACzB,WAAO,KAAK,mBAAmB;AAAA,EACjC,CAAC;AAEH,MACG,QAAQ,SAAS,EACjB,YAAY,yCAAyC,EACrD,OAAO,oBAAoB,6BAA6B,iBAAiB,EACzE,OAAO,OAAO,SAA8B;AAC3C,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,KAAK,MAAM,qBAAqB,QAAQ,KAAK,SAAS,MAAM;AAClE,QAAI,CAAC,IAAI;AACP,aAAO,MAAM,4BAA4B,KAAK,OAAO,GAAG;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,WAAO,KAAK,oBAAoB,KAAK,OAAO,GAAG;AAAA,EACjD,CAAC;AAEH,MACG,QAAQ,QAAQ,EAChB,YAAY,2CAA2C,EACvD,OAAO,MAAM;AACZ,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,mBAAe,MAAM;AACrB,WAAO,KAAK,mBAAmB;AAAA,EACjC,CAAC;AACL;;;AC/EA,YAAYC,WAAU;AACtB,SAAS,gBAAgB;AAalB,SAAS,qBAAqB,SAAwB;AAC3D,UACG,QAAQ,qBAAqB,EAC7B,YAAY,0EAA0E,EACtF,OAAO,uBAAuB,uBAAuB,SAAS,EAC9D,OAAO,qBAAqB,yCAAyC,EACrE,OAAO,iBAAiB,yCAAyC,EACjE,OAAO,iBAAiB,sBAAsB,aAAa,EAC3D,OAAO,aAAa,qEAAqE,EACzF,OAAO,iBAAiB,4CAA4C,EACpE,OAAO,UAAU,2DAA2D,EAC5E,OAAO,OAAO,YAAgC,SAAoB;AACjE,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,MAAW,cAAQ,cAAc,QAAQ,IAAI,CAAC;AACpD,WAAO,KAAK,uBAAuB,GAAG,KAAK;AAC3C,UAAM,SAAS,MAAM,SAAS;AAAA,MAC5B;AAAA,MACA,YAAY;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,iBAAiB,KAAK;AAAA,MACtB,UAAU,KAAK;AAAA,MACf;AAAA;AAAA,MAEA,UAAU,MAAM;AAAA,MAAC;AAAA,IACnB,CAAC;AACD,eAAW,KAAK,OAAO,SAAU,QAAO,KAAK,CAAC;AAC9C,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IAC7D;AACA,WAAO,KAAK,iBAAiB;AAAA,EAC/B,CAAC;AACL;;;ACjDA,SAAkB,cAAc;AAChC,YAAYC,WAAU;AACtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAGP,SAAS,cAAc,OAAyB;AAC9C,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC/B;AAEO,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,oBAAoB,EAC5B;AAAA,IACC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,GAAG;AAAA,EACZ,EACC;AAAA,IACC,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IACF,EACG,QAAQ,CAAC,GAAG,UAAU,CAAC,EACvB,QAAQ,QAAQ;AAAA,EACrB,EACC;AAAA,IACC,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IACF,EAAE,QAAQ,CAAC,GAAG,kBAAkB,CAAC;AAAA,EACnC,EACC;AAAA,IACC,IAAI;AAAA,MACF;AAAA,MACA;AAAA,IACF,EAAE,UAAU,aAAa;AAAA,EAC3B,EACC,OAAO,eAAe,sEAAsE,EAC5F,OAAO,0BAA0B,4EAAuE,EACxG,OAAO,wBAAwB,0EAAqE,EACpG;AAAA,IACC,CACE,YACA,SAQG;AACH,YAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,YAAM,MAAW,cAAQ,cAAc,QAAQ,IAAI,CAAC;AACpD,YAAM,YACJ,KAAK,iBAAiB,KAAK,cACvB,EAAE,OAAO,KAAK,iBAAiB,UAAU,KAAK,KAAK,eAAe,SAAS,IAC3E;AAEN,UAAI,KAAK,WAAW;AAClB,cAAM,SAAS,eAAe;AAAA,UAC5B;AAAA,UACA,YAAY;AAAA,UACZ,KAAK,KAAK;AAAA,UACV,YAAY,KAAK;AAAA,UACjB,MAAM,KAAK;AAAA,UACX;AAAA,UACA;AAAA,QACF,CAAC;AACD,eAAO,KAAK,OAAO,WAAW,YAAY,sCAAsC,4BAA4B;AAC5G;AAAA,MACF;AAEA,YAAM,UAAU,mBAAmB,MAAM;AACzC,aAAO,KAAK,iCAAiC,GAAG,iBAAiB,OAAO,KAAK;AAC7E,6BAAuB;AAAA,QACrB,YAAY;AAAA,QACZ;AAAA,QACA,KAAK,KAAK;AAAA,QACV,YAAY,KAAK;AAAA,QACjB,MAAM,KAAK;AAAA,QACX;AAAA,QACA;AAAA,MACF,CAAC;AACD,aAAO,KAAK,4BAA4B;AAAA,IAC1C;AAAA,EACF;AACJ;;;ACrGA,YAAYC,WAAU;AACtB,SAAS,YAAY,WAAW,cAAc,WAAW,oBAAoB;AActE,SAAS,mBAAmB,SAAwB;AACzD,QAAM,MAAM,QAAQ,QAAQ,KAAK,EAAE,YAAY,wEAAwE;AAEvH,MACG,QAAQ,uBAAuB,EAC/B,YAAY,mEAAmE,EAC/E,OAAO,gBAAgB,+DAA+D,EACtF,OAAO,OAAO,YAAgC,SAA2B;AACxE,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,MAAW,cAAQ,cAAc,QAAQ,IAAI,CAAC;AACpD,WAAO,KAAK,uBAAuB,GAAG,KAAK;AAC3C,UAAM,WAAW,EAAE,QAAQ,YAAY,KAAK,SAAS,KAAK,KAAK,OAAO,CAAC;AACvE,WAAO,KAAK,gBAAgB;AAAA,EAC9B,CAAC;AAEH,MACG,QAAQ,sBAAsB,EAC9B,YAAY,0DAA0D,EACtE,OAAO,qBAAqB,sBAAsB,OAAO,EACzD,OAAO,oBAAoB,kFAAkF,EAC7G,OAAO,OAAO,YAAgC,SAA+C;AAC5F,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,MAAW,cAAQ,cAAc,QAAQ,IAAI,CAAC;AACpD,WAAO,KAAK,sBAAsB,GAAG,KAAK;AAC1C,UAAM,UAAU,EAAE,QAAQ,YAAY,KAAK,YAAY,KAAK,QAAQ,aAAa,KAAK,SAAS,OAAO,CAAC;AACvG,WAAO,KAAK,eAAe;AAAA,EAC7B,CAAC;AAEH,MACG,QAAQ,qBAAqB,EAC7B;AAAA,IACC;AAAA,EAEF,EACC,eAAe,qBAAqB,kCAAkC,EACtE,OAAO,qBAAqB,yDAAyD,EACrF,OAAO,gBAAgB,2DAA2D,EAClF,OAAO,0BAA0B,8EAA8E,EAC/G,OAAO,YAAY,gFAAgF,EACnG,OAAO,qBAAqB,wEAAwE,EACpG,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,UAAU,0BAA0B,EAC3C,OAAO,OAAO,YAAgC,SAAoB;AACjE,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,MAAW,cAAQ,cAAc,QAAQ,IAAI,CAAC;AACpD,UAAM,SAAS,MAAM,aAAa;AAAA,MAChC;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,YAAY;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,kBAAkB,KAAK;AAAA,MACvB,gBAAgB,KAAK;AAAA,MACrB,gBAAgB,KAAK;AAAA,MACrB,cAAc,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AACD,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IAC7D,OAAO;AACL,aAAO;AAAA,QACL,iBAAiB,OAAO,MAAM,QAAQ,OAAO,iBAAiB,GAAG,OAAO,OAAO,kBAAkB,GAAG,GAC/F,OAAO,eAAe,qBAAqB,EAAE;AAAA,MACpD;AAAA,IACF;AAAA,EACF,CAAC;AAEH,MACG,QAAQ,oBAAoB,EAC5B,YAAY,kCAAkC,EAC9C,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,QAAgB,SAA8B;AAC3D,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,aAAa,EAAE,QAAQ,QAAQ,cAAc,KAAK,QAAQ,OAAO,CAAC;AACxE,WAAO,KAAK,eAAe,MAAM,GAAG;AAAA,EACtC,CAAC;AAEH,MACG,QAAQ,eAAe,EACvB,YAAY,mCAAmC,EAC/C,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,QAAgB,SAA8B;AAC3D,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,UAAU,EAAE,QAAQ,QAAQ,cAAc,KAAK,QAAQ,OAAO,CAAC;AACrE,WAAO,KAAK,WAAW,MAAM,GAAG;AAAA,EAClC,CAAC;AACL;;;ACrGA,YAAYC,WAAU;AACtB;AAAA,EACE,YAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACPP,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AACtB,SAAS,qBAAqB;AASvB,SAAS,yBAAiC;AAC/C,QAAM,OAAY,cAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,QAAM,aAAa;AAAA,IACZ,cAAQ,MAAM,cAAc;AAAA;AAAA,IAC5B,cAAQ,MAAM,iBAAiB;AAAA;AAAA,EACtC;AACA,aAAW,KAAK,YAAY;AAC1B,QAAO,eAAW,CAAC,EAAG,QAAO;AAAA,EAC/B;AAGA,SAAO,WAAW,CAAC;AACrB;;;ADFO,SAAS,sBAAsB,SAAwB;AAC5D,UACG,QAAQ,QAAQ,EAChB,YAAY,iGAAiG,EAC7G,eAAe,iBAAiB,iDAAiD,EACjF,eAAe,yBAAyB,yDAAyD,EACjG,eAAe,oBAAoB,+DAA+D,EAClG,eAAe,eAAe,oCAAoC,EAClE,OAAO,mBAAmB,eAAe,cAAc,EACvD,OAAO,mBAAmB,wEAAwE,EAClG,OAAO,eAAe,8CAA8C,EACpE,OAAO,OAAO,SAAqB;AAClC,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AAEtC,QAAI,CAAC,mBAAmB,KAAK,IAAI,GAAG;AAClC,YAAM,IAAI,MAAM,mBAAmB,KAAK,IAAI,4CAA4C;AAAA,IAC1F;AACA,QAAI,CAAC,kBAAkB,KAAK,MAAM,GAAG;AACnC,YAAM,IAAI,MAAM,qBAAqB,KAAK,MAAM,+BAA+B;AAAA,IACjF;AACA,UAAM,SAAS,OAAO,KAAK,GAAG;AAC9B,QAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC5B,YAAM,IAAI,MAAM,6CAA6CC,UAAS,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IACtG;AAEA,UAAM,eAAe,uBAAuB;AAC5C,UAAM,SAAS,MAAM,eAAe;AAAA,MAClC;AAAA,MACA,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,MACjB,UAAe,cAAQ,KAAK,QAAQ;AAAA,MACpC;AAAA,MACA,YAAY,KAAK;AAAA,MACjB;AAAA,MACA,WAAW,KAAK;AAAA,MAChB;AAAA,IACF,CAAC;AAED,WAAO,KAAK,sBAAsB,OAAO,UAAU,EAAE;AACrD,YAAQ,OAAO,MAAM,GAAG,OAAO,UAAU;AAAA,CAAI;AAAA,EAC/C,CAAC;AACL;;;AE9DA,SAAS,qBAAqB;AAGvB,SAAS,yBAAyB,SAAwB;AAC/D,QAAM,YAAY,QAAQ,QAAQ,WAAW,EAAE,YAAY,8CAA8C;AAEzG,YACG,QAAQ,MAAM,EACd,YAAY,mCAAmC,EAC/C,OAAO,UAAU,6BAA6B,EAC9C,OAAO,CAAC,SAA6B;AACpC,UAAM,OAAO,uBAAuB;AACpC,UAAM,OAAO,cAAc,IAAI;AAC/B,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,CAAI;AACzD;AAAA,IACF;AACA,QAAI,KAAK,WAAW,GAAG;AACrB,cAAQ,OAAO,MAAM,2BAA2B;AAChD;AAAA,IACF;AACA,UAAM,OAAO,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE;AACxF,YAAQ,OAAO,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,EAC7C,CAAC;AACL;;;ACzBA,SAAkB,UAAAC,eAAc;AAChC,SAAS,cAAc;AAGhB,SAAS,sBAAsB,SAAwB;AAC5D,UACG,QAAQ,QAAQ,EAChB,YAAY,uCAAuC,EACnD;AAAA,IACC,IAAIC,QAAO,iBAAiB,gBAAgB,EAAE,QAAQ,CAAC,UAAU,cAAc,UAAU,CAAC,EAAE,QAAQ,QAAQ;AAAA,EAC9G,EACC,OAAO,0BAA0B,iEAAiE,EAClG,OAAO,kBAAkB,wCAAwC,QAAQ,EACzE,OAAO,qBAAqB,uBAAuB,EACnD;AAAA,IACC,OAAO,SAKD;AACJ,YAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,aAAO,KAAK,qBAAqB,KAAK,IAAI,MAAM;AAChD,YAAM,OAAO;AAAA,QACX;AAAA,QACA,MAAM,KAAK;AAAA,QACX,eAAe,KAAK;AAAA,QACpB,WAAW,OAAO,KAAK,OAAO;AAAA,QAC9B,cAAc,KAAK;AAAA,QACnB;AAAA,MACF,CAAC;AACD,aAAO,KAAK,kBAAkB;AAAA,IAChC;AAAA,EACF;AACJ;;;ACjCA,SAAS,YAAY,aAAa,qBAAqB;AAchD,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,MAAM,EACd,YAAY,kGAAkG,EAC9G,OAAO,mBAAmB,8DAA8D,EACxF,OAAO,UAAU,kEAAkE,EACnF,OAAO,qBAAqB,8EAA8E,EAC1G,OAAO,mBAAmB,uDAAuD,EACjF,OAAO,qBAAqB,mDAAmD,EAC/E,OAAO,kBAAkB,iBAAiB,OAAO,EACjD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,UAAU,6CAA6C,EAC9D,OAAO,OAAO,SAAmB;AAChC,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,YAAY,OAAO,KAAK,OAAO;AAErC,QAAI,KAAK,KAAK;AACZ,YAAM,QAAQ,MAAM,WAAW;AAAA,QAC7B;AAAA,QACA,SAAS,IAAI,OAAO,KAAK,GAAG;AAAA,QAC5B;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,cAAc,KAAK;AAAA,QACnB;AAAA,MACF,CAAC;AACD,UAAI,KAAK,KAAM,SAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,UACpE,QAAO,KAAK,YAAY,MAAM,GAAG,KAAK,MAAM,OAAO,EAAE;AAC1D;AAAA,IACF;AACA,QAAI,KAAK,MAAM;AACb,YAAM,YAAY,EAAE,QAAQ,YAAY,KAAK,OAAO,WAAW,cAAc,KAAK,QAAQ,OAAO,CAAC;AAClG,aAAO,KAAK,gBAAgB;AAC5B;AAAA,IACF;AACA,QAAI,KAAK,QAAQ;AACf,YAAM,cAAc,EAAE,QAAQ,QAAQ,KAAK,QAAQ,WAAW,cAAc,KAAK,QAAQ,OAAO,CAAC;AACjG,aAAO,KAAK,UAAU,KAAK,MAAM,cAAc;AAC/C;AAAA,IACF;AACA,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF,CAAC;AACL;;;ACxDA,SAAS,gBAAgB;AAalB,SAAS,qBAAqB,SAAwB;AAC3D,UACG,QAAQ,OAAO,EACf,YAAY,8DAA8D,EAC1E,OAAO,mBAAmB,gDAAgD,EAC1E,OAAO,cAAc,0BAA0B,OAAO,EACtD,OAAO,qBAAqB,wBAAwB,EACpD,OAAO,qBAAqB,uCAAuC,EACnE,OAAO,cAAc,8CAA8C,EACnE,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,UAAU,2BAA2B,EAC5C,OAAO,OAAO,SAAoB;AACjC,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,QAAI,CAAC,KAAK,IAAK,OAAM,IAAI,MAAM,iCAAiC;AAChE,UAAM,UAAU,MAAM,SAAS;AAAA,MAC7B;AAAA,MACA,SAAS,IAAI,OAAO,KAAK,GAAG;AAAA,MAC5B,YAAY,OAAO,KAAK,GAAG;AAAA,MAC3B,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,cAAc,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AACD,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IAC9D,OAAO;AACL,iBAAW,KAAK,QAAS,SAAQ,OAAO,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,KAAK,KAAK,EAAE,GAAG,KAAK,EAAE,OAAO;AAAA,CAAI;AAAA,IACjG;AAAA,EACF,CAAC;AACL;;;AC3CA,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AACtB,SAAS,gBAAgB,oBAAoB;;;ACH7C,OAAO,WAAW;AAmCX,SAAS,aAAa,OAAe,QAAwB;AAClE,QAAM,YAAY;AAClB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,WAAW,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,IAAI,OAAO,MAAM,IAAI,EAAE,CAAC;AACtE,QAAM,UAAU,KAAK,MAAM,WAAW,GAAG;AACzC,QAAM,SAAmB,CAAC;AAC1B,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,KAAK,IAAI,KAAK;AAC5B,UAAM,IAAI,IAAI;AACd,UAAM,IAAI,KAAK,MAAM,KAAK,QAAQ,EAAE;AACpC,UAAM,IAAI,KAAK,MAAM,KAAK,SAAS,EAAE;AAErC,QAAI,IAAI,KAAK,IAAI,IAAI;AACnB,YAAM,KAAK,aAAa,CAAC,gBAAgB,CAAC,SAAS,MAAM,aAAa,SAAS,sBAAsB;AACrG,YAAM,KAAK,oBAAoB,CAAC,SAAS,KAAK,SAAS,CAAC,aAAa,SAAS,sBAAsB;AAAA,IACtG;AACA,UAAM,MAAM,EAAE,QAAQ,CAAC;AAEvB,UAAM,KAAK,MAAM,IAAI,UAAU,MAAM,KAAK,QAAQ,UAAU;AAC5D,UAAM,UAAU,MAAM,IAAI,UAAU,MAAM,KAAK,QAAQ;AACvD,WAAO;AAAA,MACL,YAAY,EAAE,QAAQ,WAAW,OAAO,wCAAwC,QAAQ,8BAA8B,OAAO,aAAa,OAAO,wDAAwD,OAAO,KAAK,GAAG;AAAA,IAC1N;AAEA,UAAM,KAAK,MAAM,IAAI,WAAW,UAAU,MAAM,KAAK,SAAS,UAAU,IAAI,WAAW;AACvF,WAAO;AAAA,MACL,YAAY,OAAO,QAAQ,EAAE,wCAAwC,QAAQ,8BAA8B,OAAO,aAAa,OAAO,+DAA+D,GAAG;AAAA,IAC1M;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY,QAAQ,CAAC,QAAQ,WAAW,MAAM,OAAO,wCAAwC,QAAQ,8BAA8B,OAAO,aAAa,OAAO;AAAA,EAChK;AACA,SAAO;AAAA,IACL,YAAY,OAAO,QAAQ,WAAW,MAAM,OAAO,wCAAwC,QAAQ,8BAA8B,OAAO,aAAa,OAAO;AAAA,EAC9J;AACA,SAAO,eAAe,KAAK,aAAa,MAAM,wCAAwC,MAAM,KAAK,EAAE,CAAC,GAAG,OAAO,KAAK,EAAE,CAAC;AACxH;AAOA,eAAsB,eAAe,MAAc,MAAoD;AACrG,QAAM,OAAO,MAAM,MAAM,IAAI,EAAE,SAAS;AACxC,QAAM,gBAAgB,KAAK,SAAS;AACpC,QAAM,iBAAiB,KAAK,UAAU;AACtC,QAAM,UAAU,KAAK,IAAI,eAAe,cAAc,KAAK;AAC3D,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,SAAS,OAAO;AAC/C,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,gBAAgB,KAAK,CAAC;AAC3D,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,iBAAiB,KAAK,CAAC;AAC7D,QAAM,UAAU,MAAM,MAAM,IAAI,EAAE,OAAO,OAAO,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,CAAC,EAAE,SAAS;AACvF,MAAI,CAAC,KAAK,MAAM;AACd,WAAO,EAAE,KAAK,SAAS,OAAO,QAAQ,eAAe,eAAe;AAAA,EACtE;AACA,QAAM,MAAM,aAAa,OAAO,MAAM;AACtC,QAAM,MAAM,MAAM,MAAM,OAAO,EAC5B,UAAU,CAAC,EAAE,OAAO,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC,EACvC,KAAK,EAAE,SAAS,GAAG,CAAC,EACpB,SAAS;AACZ,SAAO,EAAE,KAAK,OAAO,QAAQ,eAAe,eAAe;AAC7D;AAwBA,SAAS,kBAAkB,OAAe,QAAgB,KAAa,MAAuB;AAC5F,QAAM,WAAW,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,IAAI,OAAO,MAAM,IAAI,EAAE,CAAC;AACtE,QAAM,MAAM,KAAK,MAAM,WAAW,GAAG;AACrC,MAAI,QAAQ,IAAI,GAAG;AACnB,MAAI,OAAO,SAAS,SAAU,UAAS,WAAM,KAAK,QAAQ,CAAC,CAAC;AAC5D,QAAM,OAAO,KAAK,MAAM,MAAM,SAAS,WAAW,IAAI,IAAI,MAAM;AAChE,QAAM,OAAO,WAAW,MAAM;AAC9B,SACE,eAAe,KAAK,aAAa,MAAM,iEACX,IAAI,aAAa,IAAI,sCACrC,GAAG,QAAQ,WAAW,MAAM,CAAC,wCAAwC,QAAQ,wHAAwH,KAAK;AAG1N;AAOA,eAAsB,kBAAkB,QAAkB,MAAwD;AAChH,MAAI,OAAO,WAAW,EAAG,OAAM,IAAI,MAAM,8BAA8B;AACvE,QAAM,QAAQ,OAAO;AACrB,QAAM,OAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC,CAAC;AACjE,QAAM,OAAO,KAAK,KAAK,QAAQ,IAAI;AACnC,QAAM,MAAM,KAAK,OAAO;AAExB,QAAM,QAAQ,MAAM,MAAM,OAAO,CAAC,CAAC,EAAE,SAAS;AAC9C,QAAM,KAAK,MAAM,SAAS;AAC1B,QAAM,KAAK,MAAM,UAAU;AAC3B,QAAM,UAAU,KAAK,IAAI,IAAI,EAAE,KAAK;AACpC,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,SAAS,OAAO,OAAO;AAC1D,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,SAAS,CAAC;AACxD,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,SAAS,CAAC;AAEzD,QAAM,QAAQ,MAAM,QAAQ;AAAA,IAC1B,OAAO,IAAI,CAAC,OAAO,MAAM;AACvB,YAAM,QAAQ,OAAO,KAAK,kBAAkB,WAAW,YAAY,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC;AACtF,aAAO,MAAM,KAAK,EACf,OAAO,WAAW,YAAY,EAAE,KAAK,OAAO,CAAC,EAC7C,UAAU,CAAC,EAAE,OAAO,OAAO,KAAK,GAAG,MAAM,EAAE,CAAC,CAAC,EAC7C,IAAI,EACJ,SAAS;AAAA,IACd,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,OAAO,aAAa,OAAO,KAAK;AAC9C,QAAM,SAAS,OAAO,cAAc,OAAO,KAAK;AAChD,QAAM,aAAa,MAAM,IAAI,CAAC,OAAO,MAAM;AACzC,UAAM,IAAI,KAAK,MAAM,IAAI,IAAI;AAC7B,UAAM,IAAI,IAAI;AACd,WAAO,EAAE,OAAO,MAAM,MAAM,KAAK,YAAY,MAAM,KAAK,MAAM,KAAK,aAAa,KAAK;AAAA,EACvF,CAAC;AAED,QAAM,MAAM,MAAM,MAAM;AAAA,IACtB,QAAQ,EAAE,OAAO,QAAQ,UAAU,GAAG,YAAY,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE;AAAA,EAC5E,CAAC,EACE,UAAU,UAAU,EACpB,KAAK,EAAE,SAAS,GAAG,CAAC,EACpB,SAAS;AAEZ,SAAO,EAAE,KAAK,OAAO,QAAQ,MAAM,MAAM,WAAW,YAAY,MAAM;AACxE;AAOA,eAAsB,WAAW,QAAkB,OAA4B,CAAC,GAAsB;AACpG,MAAI,OAAO,WAAW,EAAG,QAAO,CAAC;AACjC,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,SAAS,MAAM,QAAQ;AAAA,IAC3B,OAAO,IAAI,CAAC,MAAM,MAAM,CAAC,EAAE,UAAU,EAAE,OAAO,QAAQ,QAAQ,EAAE,KAAK,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC;AAAA,EACjG;AACA,QAAM,MAAgB,CAAC,CAAC;AACxB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,IAAI,OAAO,IAAI,CAAC;AACtB,UAAM,IAAI,OAAO,CAAC;AAClB,QAAI,CAAC,KAAK,CAAC,GAAG;AACZ,UAAI,KAAK,CAAC;AACV;AAAA,IACF;AACA,UAAM,IAAI,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK;AAC1C,QAAI,IAAI;AACR,aAAS,IAAI,GAAG,IAAI,GAAG,IAAK,MAAK,KAAK,KAAK,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,KAAK,EAAE;AACnE,QAAI,KAAK,EAAE,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC;AAAA,EACpC;AACA,SAAO;AACT;;;ADjMA,IAAM,+BAA+B;AAErC,SAAS,YAAY,KAAqB;AACxC,QAAM,IAAI,OAAO,GAAG;AACpB,MAAI,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO;AAChC,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC;AACpD;AAEO,SAAS,0BAA0B,SAAwB;AAChE,UACG,QAAQ,YAAY,EACpB;AAAA,IACC;AAAA,EAGF,EACC,OAAO,uBAAuB,qBAAqB,iBAAiB,EACpE,OAAO,UAAU,+DAA+D,EAChF,OAAO,kBAAkB,6DAA6D,MAAM,EAC5F,OAAO,mBAAmB,gEAAgE,EAC1F,OAAO,mBAAmB,sEAAsE,EAChG,OAAO,mBAAmB,mCAAmC,IAAI,EACjE,OAAO,UAAU,uEAAuE,EACxF,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,MAAsB,YAAqB;AACxD,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,SAAS,YAAY,KAAK,MAAM;AACtC,UAAM,aAAa,OAAO,KAAK,QAAQ,KAAK;AAG5C,QAAI,KAAK,cAAc;AACrB,YAAM,QAAQ,KAAK,QAAQ,KAAK,IAAI,GAAG,OAAO,KAAK,KAAK,CAAC,IAAI;AAC7D,YAAM,SAAS,MAAM,aAAa,EAAE,QAAQ,OAAO,YAAY,cAAc,KAAK,QAAQ,OAAO,CAAC;AAClG,YAAM,QAAQ,MAAM,WAAW,MAAM;AACrC,YAAM,QAAQ,MAAM,kBAAkB,QAAQ,EAAE,QAAQ,MAAM,CAAC;AAC/D,MAAG,kBAAc,KAAK,QAAQ,MAAM,GAAG;AAGvC,UAAI,KAAK,OAAO;AACd,cAAM,MAAW,cAAQ,KAAK,MAAM,KAAK;AACzC,cAAM,OAAO,KAAK,OAAO,MAAM,GAAG,KAAK,OAAO,SAAS,IAAI,MAAM;AACjE,eAAO,QAAQ,CAAC,OAAO,MAAS,kBAAc,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC;AAAA,MAC5E;AAEA,YAAM,WAAW,OAAO,IAAI,CAAC,GAAG,OAAO,EAAE,KAAK,GAAG,MAAM,IAAI,YAAY,YAAY,MAAM,CAAC,KAAK,EAAE,EAAE;AACnG,UAAI,KAAK,MAAM;AACb,gBAAQ,OAAO;AAAA,UACb,GAAG,KAAK;AAAA,YACN;AAAA,cACE,OAAO,KAAK;AAAA,cACZ,YAAY,OAAO;AAAA,cACnB,MAAM,MAAM;AAAA,cACZ,MAAM,MAAM;AAAA,cACZ;AAAA,cACA,MAAM;AAAA,cACN,QAAQ;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA;AAAA,QACH;AAAA,MACF,OAAO;AACL,gBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,CAAC;AAAA,CAAI;AAAA,MACtD;AAEA,UAAI,OAAO;AACX,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAK,MAAK,MAAM,CAAC,KAAK,MAAM,MAAM,IAAI,KAAK,GAAI,QAAO;AACxF,aAAO;AAAA,QACL,uBAAuB,KAAK,MAAM,KAAK,MAAM,IAAI,IAAI,MAAM,IAAI,KAAK,OAAO,MAAM,qCACpD,IAAI,YAAO,MAAM,IAAI,KAAK,GAAG,QAAQ,CAAC,CAAC;AAAA,MACtE;AACA;AAAA,IACF;AAGA,QAAI,KAAK,OAAO;AACd,YAAM,SAAS,MAAM,aAAa;AAAA,QAChC;AAAA,QACA,OAAO,OAAO,KAAK,KAAK;AAAA,QACxB;AAAA,QACA,cAAc,KAAK;AAAA,QACnB;AAAA,MACF,CAAC;AACD,YAAM,MAAW,cAAQ,KAAK,MAAM,KAAK;AACzC,YAAM,OAAO,KAAK,OAAO,MAAM,GAAG,KAAK,OAAO,SAAS,IAAI,MAAM;AACjE,aAAO,QAAQ,CAAC,OAAO,MAAS,kBAAc,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC;AAC1E,aAAO,KAAK,SAAS,OAAO,MAAM,cAAc,IAAI,QAAQ,OAAO,SAAS,CAAC,IAAI,GAAG,GAAG;AACvF;AAAA,IACF;AAGA,UAAM,OAAO,MAAM,eAAe,EAAE,QAAQ,cAAc,KAAK,QAAQ,OAAO,CAAC;AAC/E,UAAM,iBAAiB,QAAQ,qBAAqB,QAAQ,MAAM;AAClE,QAAI,KAAK,QAAQ,gBAAgB;AAC/B,YAAM,WAAW,MAAM,eAAe,KAAK,QAAQ,EAAE,QAAQ,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC;AAChF,MAAG,kBAAc,KAAK,QAAQ,SAAS,GAAG;AAC1C,aAAO;AAAA,QACL,SAAS,KAAK,MAAM,KAAK,SAAS,KAAK,IAAI,SAAS,MAAM,SACrD,SAAS,aAAa,IAAI,SAAS,cAAc,GAAG,KAAK,OAAO,iBAAiB,EAAE;AAAA,MAC1F;AACA;AAAA,IACF;AACA,IAAG,kBAAc,KAAK,QAAQ,KAAK,MAAM;AACzC,WAAO,KAAK,SAAS,KAAK,MAAM,KAAK,KAAK,KAAK,IAAI,KAAK,MAAM,IAAI;AAAA,EACpE,CAAC;AACL;;;AE1HA,SAAS,kBAAkB;AASpB,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,eAAe,EACvB,YAAY,mFAAmF,EAC/F,OAAO,qBAAqB,8CAA8C,EAC1E,OAAO,SAAS,kCAAkC,EAClD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,QAA4B,SAAmB;AAC5D,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,OAAO,UAAU;AACvB,QAAI,SAAS,SAAU,OAAM,IAAI,MAAM,wBAAwB,IAAI,uBAAuB;AAC1F,UAAM,SAAS,MAAM,WAAW;AAAA,MAC9B;AAAA,MACA,YAAY,KAAK;AAAA,MACjB,OAAO,CAAC,KAAK;AAAA,MACb,cAAc,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AACD,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,EAC7D,CAAC;AACL;;;AC7BA,SAAS,mBAAmB;AAGrB,SAAS,uBAAuB,SAAwB;AAC7D,UACG,QAAQ,SAAS,EACjB,YAAY,6BAA6B,EACzC,OAAO,UAAU,6BAA6B,EAC9C,OAAO,OAAO,SAA6B;AAC1C,UAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,UAAM,UAAU,MAAM,YAAY,MAAM;AACxC,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,CAAI;AAC5D;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,OAAO,MAAM,gBAAgB;AACrC;AAAA,IACF;AACA,eAAW,KAAK,SAAS;AACvB,cAAQ,OAAO,MAAM,GAAG,EAAE,MAAM,IAAK,EAAE,cAAc,EAAE,IAAK,EAAE,MAAM;AAAA,CAAI;AAAA,IAC1E;AAAA,EACF,CAAC;AACL;;;ACvBA,SAAS,UAAU,gBAAgB;AAG5B,SAAS,oBAAoB,SAAwB;AAC1D,QAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE,YAAY,yDAAyD;AAE1G,OACG,QAAQ,uBAAuB,EAC/B,YAAY,kCAAkC,EAC9C,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,OAAe,QAAgB,SAA8B;AAC1E,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,SAAS,EAAE,QAAQ,OAAO,QAAQ,cAAc,KAAK,QAAQ,OAAO,CAAC;AAC3E,WAAO,KAAK,QAAQ,KAAK,OAAO,MAAM,GAAG;AAAA,EAC3C,CAAC;AAEH,OACG,QAAQ,uBAAuB,EAC/B,YAAY,8BAA8B,EAC1C,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,QAAgB,OAAe,SAA8B;AAC1E,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,SAAS,EAAE,QAAQ,QAAQ,OAAO,cAAc,KAAK,QAAQ,OAAO,CAAC;AAC3E,WAAO,KAAK,YAAY,MAAM,OAAO,KAAK,GAAG;AAAA,EAC/C,CAAC;AACL;;;ACzBA,YAAYC,WAAU;AACtB,SAAS,qBAAqB;AAQvB,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,oBAAoB,EAC5B,YAAY,iFAAiF,EAC7F,OAAO,sBAAsB,4DAA4D,EACzF,OAAO,UAAU,wBAAwB,EACzC,OAAO,OAAO,YAAgC,SAAmB;AAChE,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,MAAW,cAAQ,cAAc,QAAQ,IAAI,CAAC;AACpD,UAAM,SAAS,MAAM,cAAc,EAAE,QAAQ,YAAY,KAAK,OAAO,KAAK,OAAO,OAAO,CAAC;AACzF,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IAC7D,OAAO;AACL,iBAAW,KAAK,OAAO,UAAU;AAC/B,gBAAQ,OAAO,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,QAAQ,IAAI,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK,EAAE,IAAI,MAAM,EAAE;AAAA,CAAI;AAAA,MACxG;AACA,UAAI,OAAO,SAAS,WAAW,EAAG,SAAQ,OAAO,MAAM,gBAAgB;AAAA,IACzE;AAEA,QAAI,OAAO,SAAS,EAAG,SAAQ,WAAW,OAAO;AAAA,EACnD,CAAC;AACL;;;AC/BA,SAAkB,UAAAC,eAAc;AAChC,SAAS,WAAW,mBAAkD;AAGtE,IAAM,cAA2B,CAAC,SAAS,eAAe,aAAa,SAAS,QAAQ,SAAS,YAAY,WAAW;AAExH,IAAM,MAAM,CAAC,MAA+C,MAAM,SAAY,SAAY,OAAO,CAAC;AAqB3F,SAAS,qBAAqB,SAAwB;AAC3D,UACG,QAAQ,OAAO,EACf,YAAY,iEAAiE,EAC7E,UAAU,IAAIC,QAAO,iBAAiB,aAAa,EAAE,QAAQ,WAAW,EAAE,oBAAoB,CAAC,EAC/F,OAAO,YAAY,8BAA8B,EACjD,OAAO,YAAY,8BAA8B,EACjD,OAAO,aAAa,iCAAiC,EACrD,OAAO,aAAa,iCAAiC,EACrD,OAAO,sBAAsB,gCAAgC,EAC7D,OAAO,eAAe,yDAAyD,EAC/E,OAAO,iBAAiB,qBAAqB,EAC7C,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,SAAoB;AACjC,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,UAAU;AAAA,MACd;AAAA,MACA,MAAM,KAAK;AAAA,MACX,KAAK,IAAI,KAAK,CAAC;AAAA,MACf,KAAK,IAAI,KAAK,CAAC;AAAA,MACf,MAAM,IAAI,KAAK,EAAE;AAAA,MACjB,MAAM,IAAI,KAAK,EAAE;AAAA,MACjB,OAAO,IAAI,KAAK,KAAK;AAAA,MACrB,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,cAAc,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AACD,WAAO,KAAK,QAAQ,KAAK,IAAI,GAAG;AAAA,EAClC,CAAC;AAEH,UACG,QAAQ,SAAS,EACjB,YAAY,sFAAsF,EAClG,eAAe,sBAAsB,4DAA4D,EACjG,OAAO,qBAAqB,4DAA4D,EACxF,OAAO,mBAAmB,4DAA4D,EACtF,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,OAAO,SAAsB;AACnC,UAAM,EAAE,QAAQ,OAAO,IAAI,WAAW;AACtC,UAAM,YAAY,KAAK,MAAM,KAAK,SAAS;AAC3C,UAAM,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,MACA,aAAa,IAAI,KAAK,SAAS;AAAA,MAC/B,WAAW,IAAI,KAAK,OAAO;AAAA,MAC3B,cAAc,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AACD,WAAO,KAAK,eAAe;AAAA,EAC7B,CAAC;AACL;;;AvBzDA,IAAM,cAAc;AAEpB,SAAS,eAAwB;AAC/B,QAAM,UAAU,IAAIC,SAAQ,EACzB,KAAK,WAAW,EAChB;AAAA,IACC;AAAA,EAIF,EACC,QAAQ,WAAW,EACnB,mBAAmB;AAEtB,qBAAmB,OAAO;AAC1B,0BAAwB,OAAO;AAC/B,0BAAwB,OAAO;AAC/B,uBAAqB,OAAO;AAC5B,sBAAoB,OAAO;AAC3B,qBAAmB,OAAO;AAC1B,wBAAsB,OAAO;AAC7B,2BAAyB,OAAO;AAChC,wBAAsB,OAAO;AAC7B,sBAAoB,OAAO;AAC3B,uBAAqB,OAAO;AAC5B,4BAA0B,OAAO;AACjC,sBAAoB,OAAO;AAC3B,yBAAuB,OAAO;AAC9B,sBAAoB,OAAO;AAC3B,sBAAoB,OAAO;AAC3B,uBAAqB,OAAO;AAE5B,SAAO;AACT;AAEA,eAAe,OAAsB;AACnC,QAAM,UAAU,aAAa;AAC7B,MAAI;AACF,UAAM,QAAQ,WAAW,QAAQ,IAAI;AAAA,EACvC,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,aAAa,IAAI,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACzG,YAAQ,OAAO,MAAM,WAAW,OAAO;AAAA,CAAI;AAC3C,QAAI,QAAQ,IAAI,gBAAgB,OAAO,eAAe,SAAS,IAAI,OAAO;AACxE,cAAQ,OAAO,MAAM,GAAG,IAAI,KAAK;AAAA,CAAI;AAAA,IACvC;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,KAAK,KAAK;","names":["Command","path","path","path","path","ALL_SDKS","fs","path","ALL_SDKS","Option","Option","fs","path","path","Option","Option","Command"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oniroproject/oniro-app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Cross-platform CLI for Oniro/OpenHarmony application development.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -24,8 +24,9 @@
|
|
|
24
24
|
"clean": "rm -rf dist"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@oniroproject/core": "0.
|
|
28
|
-
"commander": "^12.1.0"
|
|
27
|
+
"@oniroproject/core": "0.7.0",
|
|
28
|
+
"commander": "^12.1.0",
|
|
29
|
+
"sharp": "^0.34.5"
|
|
29
30
|
},
|
|
30
31
|
"engines": {
|
|
31
32
|
"node": ">=20"
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"app": {
|
|
3
|
+
"products": [
|
|
4
|
+
{
|
|
5
|
+
"name": "default",
|
|
6
|
+
"signingConfig": "default",
|
|
7
|
+
"compileSdkVersion": 20,
|
|
8
|
+
"compatibleSdkVersion": 20,
|
|
9
|
+
"runtimeOS": "OpenHarmony"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"buildModeSet": [
|
|
13
|
+
{
|
|
14
|
+
"name": "debug"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "release"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
"modules": [
|
|
22
|
+
{
|
|
23
|
+
"name": "entry",
|
|
24
|
+
"srcPath": "./entry",
|
|
25
|
+
"targets": [
|
|
26
|
+
{
|
|
27
|
+
"name": "default",
|
|
28
|
+
"applyToProducts": [
|
|
29
|
+
"default"
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"apiType": "stageMode",
|
|
3
|
+
"buildOption": {
|
|
4
|
+
"resOptions": {
|
|
5
|
+
"copyCodeResource": {
|
|
6
|
+
"enable": false
|
|
7
|
+
}
|
|
8
|
+
},
|
|
9
|
+
"externalNativeOptions": {
|
|
10
|
+
"path": "./src/main/cpp/CMakeLists.txt",
|
|
11
|
+
"arguments": "",
|
|
12
|
+
"cppFlags": "",
|
|
13
|
+
"abiFilters": [
|
|
14
|
+
"arm64-v8a",
|
|
15
|
+
"x86_64"
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"buildOptionSet": [
|
|
20
|
+
{
|
|
21
|
+
"name": "release",
|
|
22
|
+
"arkOptions": {
|
|
23
|
+
"obfuscation": {
|
|
24
|
+
"ruleOptions": {
|
|
25
|
+
"enable": false,
|
|
26
|
+
"files": [
|
|
27
|
+
"./obfuscation-rules.txt"
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"nativeLib": {
|
|
33
|
+
"debugSymbol": {
|
|
34
|
+
"strip": true,
|
|
35
|
+
"exclude": []
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"targets": [
|
|
41
|
+
{
|
|
42
|
+
"name": "default"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "ohosTest"
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Define project specific obfuscation rules here.
|
|
2
|
+
# You can include the obfuscation configuration files in the current module's build-profile.json5.
|
|
3
|
+
#
|
|
4
|
+
# For more details, see
|
|
5
|
+
# https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/source-obfuscation-V5
|
|
6
|
+
|
|
7
|
+
# Obfuscation options:
|
|
8
|
+
# -disable-obfuscation: disable all obfuscations
|
|
9
|
+
# -enable-property-obfuscation: obfuscate the property names
|
|
10
|
+
# -enable-toplevel-obfuscation: obfuscate the names in the global scope
|
|
11
|
+
# -compact: remove unnecessary blank spaces and all line feeds
|
|
12
|
+
# -remove-log: remove all console.* statements
|
|
13
|
+
# -print-namecache: print the name cache that contains the mapping from the old names to new names
|
|
14
|
+
# -apply-namecache: reuse the given cache file
|
|
15
|
+
|
|
16
|
+
# Keep options:
|
|
17
|
+
# -keep-property-name: specifies property names that you want to keep
|
|
18
|
+
# -keep-global-name: specifies names that you want to keep in the global scope
|
|
19
|
+
|
|
20
|
+
-enable-property-obfuscation
|
|
21
|
+
-enable-toplevel-obfuscation
|
|
22
|
+
-enable-filename-obfuscation
|
|
23
|
+
-enable-export-obfuscation
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# the minimum version of CMake.
|
|
2
|
+
cmake_minimum_required(VERSION 3.5.0)
|
|
3
|
+
project(NativeCpp)
|
|
4
|
+
|
|
5
|
+
set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
|
|
6
|
+
|
|
7
|
+
if(DEFINED PACKAGE_FIND_FILE)
|
|
8
|
+
include(${PACKAGE_FIND_FILE})
|
|
9
|
+
endif()
|
|
10
|
+
|
|
11
|
+
include_directories(${NATIVERENDER_ROOT_PATH}
|
|
12
|
+
${NATIVERENDER_ROOT_PATH}/include)
|
|
13
|
+
|
|
14
|
+
add_library(entry SHARED napi_init.cpp)
|
|
15
|
+
target_link_libraries(entry PUBLIC libace_napi.z.so)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#include "napi/native_api.h"
|
|
2
|
+
|
|
3
|
+
static napi_value Add(napi_env env, napi_callback_info info)
|
|
4
|
+
{
|
|
5
|
+
size_t argc = 2;
|
|
6
|
+
napi_value args[2] = {nullptr};
|
|
7
|
+
|
|
8
|
+
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
|
|
9
|
+
|
|
10
|
+
napi_valuetype valuetype0;
|
|
11
|
+
napi_typeof(env, args[0], &valuetype0);
|
|
12
|
+
|
|
13
|
+
napi_valuetype valuetype1;
|
|
14
|
+
napi_typeof(env, args[1], &valuetype1);
|
|
15
|
+
|
|
16
|
+
double value0;
|
|
17
|
+
napi_get_value_double(env, args[0], &value0);
|
|
18
|
+
|
|
19
|
+
double value1;
|
|
20
|
+
napi_get_value_double(env, args[1], &value1);
|
|
21
|
+
|
|
22
|
+
napi_value sum;
|
|
23
|
+
napi_create_double(env, value0 + value1, &sum);
|
|
24
|
+
|
|
25
|
+
return sum;
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
EXTERN_C_START
|
|
30
|
+
static napi_value Init(napi_env env, napi_value exports)
|
|
31
|
+
{
|
|
32
|
+
napi_property_descriptor desc[] = {
|
|
33
|
+
{ "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr }
|
|
34
|
+
};
|
|
35
|
+
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
|
|
36
|
+
return exports;
|
|
37
|
+
}
|
|
38
|
+
EXTERN_C_END
|
|
39
|
+
|
|
40
|
+
static napi_module demoModule = {
|
|
41
|
+
.nm_version = 1,
|
|
42
|
+
.nm_flags = 0,
|
|
43
|
+
.nm_filename = nullptr,
|
|
44
|
+
.nm_register_func = Init,
|
|
45
|
+
.nm_modname = "entry",
|
|
46
|
+
.nm_priv = ((void*)0),
|
|
47
|
+
.reserved = { 0 },
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
|
|
51
|
+
{
|
|
52
|
+
napi_module_register(&demoModule);
|
|
53
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const add: (a: number, b: number) => number;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit';
|
|
2
|
+
import { hilog } from '@kit.PerformanceAnalysisKit';
|
|
3
|
+
import { window } from '@kit.ArkUI';
|
|
4
|
+
|
|
5
|
+
const DOMAIN = 0x0000;
|
|
6
|
+
|
|
7
|
+
export default class EntryAbility extends UIAbility {
|
|
8
|
+
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
|
|
9
|
+
try {
|
|
10
|
+
this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
|
|
11
|
+
} catch (err) {
|
|
12
|
+
hilog.error(DOMAIN, 'testTag', 'Failed to set colorMode. Cause: %{public}s', JSON.stringify(err));
|
|
13
|
+
}
|
|
14
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
onDestroy(): void {
|
|
18
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
onWindowStageCreate(windowStage: window.WindowStage): void {
|
|
22
|
+
// Main window is created, set main page for this ability
|
|
23
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
|
|
24
|
+
|
|
25
|
+
windowStage.loadContent('pages/Index', (err) => {
|
|
26
|
+
if (err.code) {
|
|
27
|
+
hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
onWindowStageDestroy(): void {
|
|
35
|
+
// Main window is destroyed, release UI related resources
|
|
36
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
onForeground(): void {
|
|
40
|
+
// Ability has brought to foreground
|
|
41
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
onBackground(): void {
|
|
45
|
+
// Ability has back to background
|
|
46
|
+
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onBackground');
|
|
47
|
+
}
|
|
48
|
+
}
|