diff --git a/arkoala-arkts/shopping/arktsconfig-run-unmemoized.json b/arkoala-arkts/shopping/arktsconfig-run-unmemoized.json index 20e3c0651ba086394c410c809a0bd0fe4e56853d..fc053c3b0ebb109705b7de916e591036a4ba5fd4 100644 --- a/arkoala-arkts/shopping/arktsconfig-run-unmemoized.json +++ b/arkoala-arkts/shopping/arktsconfig-run-unmemoized.json @@ -5,7 +5,7 @@ "baseUrl": ".", "paths": { "app": [ - "./build/unmemoized/build/generated" + "./build/unmemoized/build/generated/src/ets" ], "@koalaui/compat": [ "../../incremental/compat/src/arkts" diff --git a/arkoala-arkts/shopping/src/ets/etsconfig.json b/arkoala-arkts/shopping/etsconfig.json similarity index 50% rename from arkoala-arkts/shopping/src/ets/etsconfig.json rename to arkoala-arkts/shopping/etsconfig.json index 306a68d206743409f712837d4e88af38c2c5cc35..cdb97ea253ef2eda700fd7055e1309bff99b5115 100644 --- a/arkoala-arkts/shopping/src/ets/etsconfig.json +++ b/arkoala-arkts/shopping/etsconfig.json @@ -1,28 +1,25 @@ { - "extends": "../../../arkui/config/etsconfig-base.json", + "extends": "../arkui/config/etsconfig-base.json", "include": [ - "./**/*.ets" + "./src/ets/**/*.ets" ], "compilerOptions": { "types": [], "baseUrl": ".", - "rootDirs": [ - "." - ], - "outDir": "../../build/ets-junk", + "outDir": "./build/ets-junk", "plugins": [ { "transform": "@koalaui/ets-plugin/build/lib/src/ArkExpander.js", - "destination": "../../build/generated", + "destination": "./build/generated", "arkui": "@koalaui/arkts-arkui" } ], "paths": { "@ohos.*": [ - "../../../../arkoala/arkui-common/interface_sdk-js/api/@ohos.*" + "../../arkoala/arkui-common/interface_sdk-js/api/@ohos.*" ], "@system.*": [ - "../../../../arkoala/arkui-common/interface_sdk-js/api/@system.*" + "../../arkoala/arkui-common/interface_sdk-js/api/@system.*" ] } } diff --git a/arkoala-arkts/shopping/package.json b/arkoala-arkts/shopping/package.json index e6abfb108caef156081e798d168dfaab4786493d..41e451f2512009bdc9403566e7d42fdb7ad947a1 100644 --- a/arkoala-arkts/shopping/package.json +++ b/arkoala-arkts/shopping/package.json @@ -5,7 +5,7 @@ "scripts": { "clean": "rimraf build generated unmemoized js_output abc lib app/shopping/build app/shopping/libs", "compile:plugin": "cd ../../arkoala/ets-plugin && npm run compile", - "compile:ets": "npm run compile:plugin && cd src/ets && ets-tsc -p ./etsconfig.json", + "compile:ets": "npm run compile:plugin && ets-tsc -p ./etsconfig.json", "unmemoize": "npm run compile:ets && ets-tsc -p tsconfig-unmemoize.json", "unmemoize:runtime": "npm run unmemoize --prefix ../../incremental/runtime", "unmemoize:arkui-no-common": "npm run unmemoize --prefix ../arkui", diff --git a/arkoala-arkts/shopping/tsconfig-unmemoize.json b/arkoala-arkts/shopping/tsconfig-unmemoize.json index 7ae54a23cebec07ba8cb48694ea30d443968f145..99d3453239b5361e56768f19033ee195a3e0889c 100644 --- a/arkoala-arkts/shopping/tsconfig-unmemoize.json +++ b/arkoala-arkts/shopping/tsconfig-unmemoize.json @@ -36,7 +36,7 @@ "../arkui/src/ohos.router.ts" ], "app/*": [ - "./build/generated/*" + "./build/generated/src/ets/*" ] } }, diff --git a/arkoala-arkts/user/arktsconfig-run-unmemoized.json b/arkoala-arkts/user/arktsconfig-run-unmemoized.json index 663efbf66c71f1adf9550edc258d81801d296317..b682444a9c5721173493f12eb3a35825e782b073 100644 --- a/arkoala-arkts/user/arktsconfig-run-unmemoized.json +++ b/arkoala-arkts/user/arktsconfig-run-unmemoized.json @@ -5,7 +5,7 @@ "baseUrl": ".", "paths": { "app": [ - "./build/unmemoized/build/generated" + "./build/unmemoized/build/generated/src/ets" ], "@koalaui/compat": [ "../../incremental/compat/src/arkts" diff --git a/arkoala-arkts/user/src/ets/etsconfig.json b/arkoala-arkts/user/etsconfig.json similarity index 65% rename from arkoala-arkts/user/src/ets/etsconfig.json rename to arkoala-arkts/user/etsconfig.json index 2e88d85ca28eddbc4e88c859887a1235d1275d80..3b706c4e1ee6035cb5f2b1cecaf3c27fed1e6d44 100644 --- a/arkoala-arkts/user/src/ets/etsconfig.json +++ b/arkoala-arkts/user/etsconfig.json @@ -1,7 +1,7 @@ { - "extends": "../../../arkui/config/etsconfig-base.json", + "extends": "../arkui/config/etsconfig-base.json", "include": [ - "./**/*.ets" + "src/ets/**/*.ets" ], "compilerOptions": { "types": [], @@ -9,11 +9,11 @@ "rootDirs": [ "." ], - "outDir": "../../build/ets-junk", + "outDir": "./build/ets-junk", "plugins": [ { "transform": "@koalaui/ets-plugin/build/lib/src/ArkExpander.js", - "destination": "../../build/generated", + "destination": "./build/generated", "arkui": "@koalaui/arkts-arkui" } ] diff --git a/arkoala-arkts/user/package.json b/arkoala-arkts/user/package.json index e11160f60080ac9ae29578d83500a702c705136a..b629b5e27bf3cb6c96f5e8cd6db25e7a0fd48f0a 100644 --- a/arkoala-arkts/user/package.json +++ b/arkoala-arkts/user/package.json @@ -5,7 +5,7 @@ "scripts": { "clean": "rimraf build generated unmemoized js_output abc lib app/user/build", "compile:plugin": "cd ../../arkoala/ets-plugin && npm run compile", - "compile:ets": "npm run compile:plugin && cd src/ets && ets-tsc -p ./etsconfig.json", + "compile:ets": "npm run compile:plugin && ../../incremental/tools/ui2abc/lib/ui2abc.js --config ui2abc.json", "unmemoize": "npm run compile:ets && ets-tsc -p tsconfig-unmemoize.json", "unmemoize:runtime": "npm run unmemoize --prefix ../../incremental/runtime", "unmemoize:arkui-no-common": "npm run unmemoize --prefix ../arkui", diff --git a/arkoala-arkts/user/tsconfig-unmemoize.json b/arkoala-arkts/user/tsconfig-unmemoize.json index cc086dbc06db9cd854c4d70b92c7335a3e0c4674..d95a7d90e2be2333b41d950440ea2f9d102d0042 100644 --- a/arkoala-arkts/user/tsconfig-unmemoize.json +++ b/arkoala-arkts/user/tsconfig-unmemoize.json @@ -29,7 +29,7 @@ "../arkui/src/ohos.router.ts" ], "app/*": [ - "./build/generated/*" + "./build/generated/src/ets/*" ] } }, diff --git a/arkoala-arkts/user/ui2abc.json b/arkoala-arkts/user/ui2abc.json new file mode 100644 index 0000000000000000000000000000000000000000..403ce30235225158239fc8de8c32b270f045fa1b --- /dev/null +++ b/arkoala-arkts/user/ui2abc.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "package": "@koalaui/user", + "outDir": "build/abc", + "baseUrl": "." + }, + "include": [ + "./src/ets/**/*.ets" + ] +} diff --git a/arkoala/ets-plugin/src/ArkExpander.ts b/arkoala/ets-plugin/src/ArkExpander.ts index 500f863177816828069c28274ed2202b81d5ce65..79ee945109d341b4796af8bb55980a71214ed4c6 100644 --- a/arkoala/ets-plugin/src/ArkExpander.ts +++ b/arkoala/ets-plugin/src/ArkExpander.ts @@ -179,15 +179,18 @@ export default function arkExpander(program: ts.Program, userPluginOptions: ArkT moduleInfo: userPluginOptions.moduleInfo } const typeChecker = program.getTypeChecker() - prepareDestination(pluginOptions.destination) const entryTracker = new EntryTracker(pluginOptions.source) return (ctx: ts.TransformationContext) => { + const configFile = ctx.getCompilerOptions().configFilePath as string + const destination = path.join(path.dirname(configFile), pluginOptions.destination) + prepareDestination(destination) + return (sourceFile: ts.SourceFile) => { if (!fileIsEligible(sourceFile.fileName)) { console.log("Verbatim TS: ", sourceFile.fileName) - printSourceFile(sourceFile, pluginOptions.source, pluginOptions.destination, ".ts") + printSourceFile(sourceFile, pluginOptions.source, destination, ".ts") return sourceFile } else { console.log("ETS->TS: " + path.normalize(sourceFile.fileName)) @@ -195,9 +198,9 @@ export default function arkExpander(program: ts.Program, userPluginOptions: ArkT let final = arkExpandFile(sourceFile, pluginOptions.arkui, typeChecker, ctx, extras, entryTracker, pluginOptions.moduleInfo) - printSourceFile(final, pluginOptions.source, pluginOptions.destination) + printSourceFile(final, pluginOptions.source, destination) if (pluginOptions.arkui != "@koalaui/arkts-arkui") { - updateRouterDestinationsFile(pluginOptions.destination, entryTracker) + updateRouterDestinationsFile(destination, entryTracker) } // if (structTranslator.entryFile) { diff --git a/incremental/tools/ui2abc/package.json b/incremental/tools/ui2abc/package.json new file mode 100644 index 0000000000000000000000000000000000000000..cab955f219a3f7a19abdaa51f7a40f6361ef5872 --- /dev/null +++ b/incremental/tools/ui2abc/package.json @@ -0,0 +1,24 @@ +{ + "name": "@koalaui/ui2abc", + "version": "1.5.0+devel", + "description": "", + "main": "lib/ui2abc.js", + "bin": "lib/ui2abc.js", + "scripts": { + "clean": "rimraf out lib", + "compile": "npx tsc ui2abc.ts --target esnext --module commonjs --outDir lib && chmod a+x lib/ui2abc.js" + }, + "keywords": [], + "dependencies": { + "commander": "^10.0.0", + "minimatch": "10.0.1" + }, + "devDependencies": { + "@types/node": "^18.0.0", + "typescript": "^4.9.5", + "webpack": "5.95.0", + "copy-webpack-plugin": "12.0.2", + "webpack-cli": "5.1.4", + "rimraf": "^6.0.1" + } +} diff --git a/incremental/tools/ui2abc/ui2abc.ts b/incremental/tools/ui2abc/ui2abc.ts new file mode 100644 index 0000000000000000000000000000000000000000..78ceb39e5fab372021a0308ec35a69433e24de65 --- /dev/null +++ b/incremental/tools/ui2abc/ui2abc.ts @@ -0,0 +1,154 @@ +#!/usr/bin/env node + +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { program } from "commander" +import * as fs from "fs" +import * as path from "path" +import { spawnSync } from "child_process" +import { minimatch } from 'minimatch' + + +const readdirSyncRecursive: (dir: string) => string[] = (dir: string) => + fs.readdirSync(dir).reduce((files: string[], file: string) => { + const name = path.join(dir, file) + return fs.lstatSync(name).isDirectory() ? [...files, ...readdirSyncRecursive(name)] : [...files, name] + }, []) + + +function findMatching(base: string, include: string[], exclude: string[]): string[] { + return readdirSyncRecursive(base) + .map(it => path.resolve(it)) + .filter(it => include.some(value => minimatch(it, path.join(base, value), { matchBase: true }))) + .filter(it => !exclude.some(value => minimatch(it, path.join(base, value), { matchBase: true }))) +} + +function findFiles(uiConfigFile: string): string[] { + const config = JSON.parse(fs.readFileSync(uiConfigFile, 'utf8')) + const baseDir = path.resolve(path.dirname(uiConfigFile)) + const include = (config.include as string[]).map(it => it.replace('\\.', '.')) + console.log("include", include) + const exclude = config.exclude ? (config.exclude as string[]).map(it => it.replace('\\.', '.')) : [] + const files = findMatching(baseDir, include, exclude) + return files +} + +function buildDir(configFile: string): string { + const configDir = path.dirname(configFile) + const build = path.resolve(path.join(configDir, "build")) + fs.mkdirSync(build, { recursive: true }) + return build +} + +function generateEtsConfig(inputFile: string, userConfigFile: string, outputFile: string): string { + console.log("userConfigFile", userConfigFile) + const etsConfigDir = buildDir(userConfigFile) + console.log("etsConfigDir", etsConfigDir) + const build = "." + console.log("build", build) + const includeFile = path.relative(etsConfigDir, inputFile) + console.log("includeFile", includeFile) + const baseUrl = "." + console.log("baseUrl", baseUrl) + const destination = `${build}/generated/` + console.log("destination", destination) + + + const etsConfig = { + extends: "@koalaui/arkts-arkui/config/etsconfig-base.json", + include: [ + includeFile + ], + compilerOptions: { + types: [], + baseUrl: baseUrl, + rootDirs: [ + baseUrl + ], + outDir: `${build}/ets-junk`, + plugins: [ + { + transform: "@koalaui/ets-plugin/build/lib/src/ArkExpander.js", + destination: destination, + arkui: "@koalaui/arkts-arkui" + } + ] + } + } + + return JSON.stringify(etsConfig, undefined, 4) +} + +function createEtsConfig(file: string, config: string, output: string): string { + const etsConfigFile = path.join(buildDir(config), "etsconfig.json") + console.log(`Producing ${etsConfigFile}`) + fs.writeFileSync(etsConfigFile, generateEtsConfig(file, config, output)) + return etsConfigFile +} + +function runCmd(command: string, args: string[]) { + + console.log(`${command} ${args.join(" ")}`) + const result = spawnSync(command, args) + console.log(result.stdout.toString()) + console.log(result.stderr.toString()) + if (result.signal) { + console.log(`${command}: signal ${result.signal}`) + return false + } + if (result.status != 0) { + console.log(`${command} returned ${result.status}`) + return false + } + if (result.error) { + console.log("${command} error:", result.error) + return false + } + return true +} +function etsTsc(file: string, etsConfig: string) { + let npx = process.platform === "win32" ? "npx.cmd" : "npx" + return runCmd(npx, ["ets-tsc", "-p", etsConfig]) +} + +function ui2abc(file: string, config: string, output: string) { + const files = findFiles(config) + console.log(files) + files.forEach(file => { + const etsConfig = createEtsConfig(file, config, output) + etsTsc(file, etsConfig) + + /* + const memoConfig = generateMemoConfig(file, config, output) + memoTsc(file, memoConfig, output) + const arktsConfig = generateArktsConfig(file, config, output) + es2panda(file, arktsConfig, output) + */ + }) +} + +export function main() { + const options = program + .option('--file ', 'Path to input .ets file') + .option('--config ', 'Path to arktsconfig.json file') + .option('--output ', 'Path to output .abc file') + .parse() + .opts() + + ui2abc(options.file, options.config, options.output) +} + +main() \ No newline at end of file