diff --git a/filestoraging/README.md b/filestoraging/README.md new file mode 100644 index 0000000..6453aab --- /dev/null +++ b/filestoraging/README.md @@ -0,0 +1,21 @@ +# minesweeping +### 1、项目说明 +总体思路:扫雷程序项目开发的总体思路如图1.1示意,拟实现交互界面与交互控制、数据结构和扫雷算法等。 + 图1.1 项目开发的总体思路图 + + + +### 2、开发环境说明 +(1)系统版本:OpenHarmony 4.0 Release +(2)SDK版本:API 10 +(3)Model类型:Stage +(4)DevEco Studio版本:Deveco Studio 4.0 release +(5)硬件环境:Unionpi Whale、RK3566开发板 +(6)预览器参数:(1)DeviceType:default;(2)Resolution:560-1280;(3)DPI:240;其余参数自定。 +### 3、项目主要函数调用关系图与项目输出界面演进图 + 图3.1 项目主要函数调用关系图 + + + + 图3.2 项目输出界面演进图 + \ No newline at end of file diff --git a/filestoraging/figs/evolution.png b/filestoraging/figs/evolution.png new file mode 100644 index 0000000..eb2bf91 Binary files /dev/null and b/filestoraging/figs/evolution.png differ diff --git a/filestoraging/figs/overall.png b/filestoraging/figs/overall.png new file mode 100644 index 0000000..3367536 Binary files /dev/null and b/filestoraging/figs/overall.png differ diff --git a/filestoraging/figs/relation.png b/filestoraging/figs/relation.png new file mode 100644 index 0000000..3dc8a07 Binary files /dev/null and b/filestoraging/figs/relation.png differ diff --git a/filestoraging/filestorage/.gitignore b/filestoraging/filestorage/.gitignore new file mode 100644 index 0000000..fbabf77 --- /dev/null +++ b/filestoraging/filestorage/.gitignore @@ -0,0 +1,11 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test \ No newline at end of file diff --git a/filestoraging/filestorage/AppScope/app.json5 b/filestoraging/filestorage/AppScope/app.json5 new file mode 100644 index 0000000..a305ebc --- /dev/null +++ b/filestoraging/filestorage/AppScope/app.json5 @@ -0,0 +1,10 @@ +{ + "app": { + "bundleName": "com.example.filereality", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/filestoraging/filestorage/AppScope/resources/base/element/string.json b/filestoraging/filestorage/AppScope/resources/base/element/string.json new file mode 100644 index 0000000..dc1fdc0 --- /dev/null +++ b/filestoraging/filestorage/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "FileReality" + } + ] +} diff --git a/filestoraging/filestorage/AppScope/resources/base/media/app_icon.png b/filestoraging/filestorage/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000..cd45acc Binary files /dev/null and b/filestoraging/filestorage/AppScope/resources/base/media/app_icon.png differ diff --git a/filestoraging/filestorage/build-profile.json5 b/filestoraging/filestorage/build-profile.json5 new file mode 100644 index 0000000..cc9434a --- /dev/null +++ b/filestoraging/filestorage/build-profile.json5 @@ -0,0 +1,36 @@ +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compileSdkVersion": 10, + "compatibleSdkVersion": 9, + "runtimeOS": "OpenHarmony", + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/.gitignore b/filestoraging/filestorage/entry/.gitignore new file mode 100644 index 0000000..e2713a2 --- /dev/null +++ b/filestoraging/filestorage/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/filestoraging/filestorage/entry/build-profile.json5 b/filestoraging/filestorage/entry/build-profile.json5 new file mode 100644 index 0000000..197e83c --- /dev/null +++ b/filestoraging/filestorage/entry/build-profile.json5 @@ -0,0 +1,31 @@ +{ + "apiType": "stageMode", + "buildOption": { + "arkOptions": { + // "apPath": "./modules.ap" /* Profile used for profile-guided optimization (PGO), a compiler optimization technique to improve app runtime performance. */ + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": true, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/hvigorfile.ts b/filestoraging/filestorage/entry/hvigorfile.ts new file mode 100644 index 0000000..c6edcd9 --- /dev/null +++ b/filestoraging/filestorage/entry/hvigorfile.ts @@ -0,0 +1,6 @@ +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/filestoraging/filestorage/entry/obfuscation-rules.txt b/filestoraging/filestorage/entry/obfuscation-rules.txt new file mode 100644 index 0000000..985b2ae --- /dev/null +++ b/filestoraging/filestorage/entry/obfuscation-rules.txt @@ -0,0 +1,18 @@ +# Define project specific obfuscation rules here. +# You can include the obfuscation configuration files in the current module's build-profile.json5. +# +# For more details, see +# https://gitee.com/openharmony/arkcompiler_ets_frontend/blob/master/arkguard/README.md + +# Obfuscation options: +# -disable-obfuscation: disable all obfuscations +# -enable-property-obfuscation: obfuscate the property names +# -enable-toplevel-obfuscation: obfuscate the names in the global scope +# -compact: remove unnecessary blank spaces and all line feeds +# -remove-log: remove all console.* statements +# -print-namecache: print the name cache that contains the mapping from the old names to new names +# -apply-namecache: reuse the given cache file + +# Keep options: +# -keep-property-name: specifies property names that you want to keep +# -keep-global-name: specifies names that you want to keep in the global scope \ No newline at end of file diff --git a/filestoraging/filestorage/entry/oh-package.json5 b/filestoraging/filestorage/entry/oh-package.json5 new file mode 100644 index 0000000..225946c --- /dev/null +++ b/filestoraging/filestorage/entry/oh-package.json5 @@ -0,0 +1,10 @@ +{ + "license": "", + "devDependencies": {}, + "author": "", + "name": "entry", + "description": "Please describe the basic information.", + "main": "", + "version": "1.0.0", + "dependencies": {} +} diff --git a/filestoraging/filestorage/entry/src/main/ets/common/constants/CommonConstants.ets b/filestoraging/filestorage/entry/src/main/ets/common/constants/CommonConstants.ets new file mode 100644 index 0000000..414f58d --- /dev/null +++ b/filestoraging/filestorage/entry/src/main/ets/common/constants/CommonConstants.ets @@ -0,0 +1,34 @@ +//公共常量 +export const boardNum: number = 11 // 行列数 +export const gridSize: number = 19 // 格子大小 +export const blockSize: number = 17 // 方块大小 + +// 绘制Fat区域背景 +export const settings: RenderingContextSettings = new RenderingContextSettings(true) +export const context: CanvasRenderingContext2D = new CanvasRenderingContext2D(settings) + +// 绘制Fat区域信息 +export const settings2: RenderingContextSettings = new RenderingContextSettings(true) +export const context2: CanvasRenderingContext2D = new CanvasRenderingContext2D(settings2) + +// 绘制Disk区域背景 +export const settings3: RenderingContextSettings = new RenderingContextSettings(true) +export const context3: CanvasRenderingContext2D = new CanvasRenderingContext2D(settings3) + +// 绘制Disk区域信息 +export const settings4: RenderingContextSettings = new RenderingContextSettings(true) +export const context4: CanvasRenderingContext2D = new CanvasRenderingContext2D(settings4) + +// 绘制模拟区域信息 +export const settings5: RenderingContextSettings = new RenderingContextSettings(true) +export const context5: CanvasRenderingContext2D = new CanvasRenderingContext2D(settings5) + +// 绘制文件夹区域信息 +export const settings6: RenderingContextSettings = new RenderingContextSettings(true); +export const context6: CanvasRenderingContext2D = new CanvasRenderingContext2D(settings6); + +export const img1:ImageBitmap = new ImageBitmap("/common/image/fk1.png") +export const img2:ImageBitmap = new ImageBitmap("/common/image/fk2.png") +export const img3:ImageBitmap = new ImageBitmap("/common/image/fk3.png") + + diff --git a/filestoraging/filestorage/entry/src/main/ets/common/image/fk1.png b/filestoraging/filestorage/entry/src/main/ets/common/image/fk1.png new file mode 100644 index 0000000..52794ac Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/ets/common/image/fk1.png differ diff --git a/filestoraging/filestorage/entry/src/main/ets/common/image/fk11.png b/filestoraging/filestorage/entry/src/main/ets/common/image/fk11.png new file mode 100644 index 0000000..f7a3a7c Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/ets/common/image/fk11.png differ diff --git a/filestoraging/filestorage/entry/src/main/ets/common/image/fk2.png b/filestoraging/filestorage/entry/src/main/ets/common/image/fk2.png new file mode 100644 index 0000000..86b4edb Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/ets/common/image/fk2.png differ diff --git a/filestoraging/filestorage/entry/src/main/ets/common/image/fk3.png b/filestoraging/filestorage/entry/src/main/ets/common/image/fk3.png new file mode 100644 index 0000000..808ea7f Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/ets/common/image/fk3.png differ diff --git a/filestoraging/filestorage/entry/src/main/ets/components/InterfaceFile.ets b/filestoraging/filestorage/entry/src/main/ets/components/InterfaceFile.ets new file mode 100644 index 0000000..fcc8a3e --- /dev/null +++ b/filestoraging/filestorage/entry/src/main/ets/components/InterfaceFile.ets @@ -0,0 +1,744 @@ +import {initialize_simdisk,initialize_simfat,drawFatMessage,clearEmulation,draw_blocks,drawDiskText,clearFatMessage,clearBlock,clearDiskText,read_sim_fat,draw_blocks_emulation, + draw_files, + clearFiles +} from '../utils/functions' + +// 文件项的唯一集合 +let file_name_set: Set = new Set() + +// 文件标签的唯一集合 +let blocks_label_set: Set = new Set() + +// 获取唯一字母标签 +function get_unique_tag(): string | null { + for (let ascii_code = 65; ascii_code <= 90; ascii_code++) { + let character = String.fromCharCode(ascii_code) + if (!blocks_label_set.has(character)) { + blocks_label_set.add(character) + return character + } + } + return null +} + +function initialize_fileblock(block_num: string, code: string): string[] { + let files: string[] = [] + for (let n = 0; n < parseInt(block_num); n++) { + files.push(`${code}${n + 1}`) + } + if (code === "Z") { + blocks_label_set.clear() // 确保blocks_label_set已经声明 + } + return files +} + +export class InterfaceFile { + messages: string[] // 系统消息队列 + sim_fat_copy: string[][] // 拷贝simFAT + ex_disk_oc: boolean // 交替显示保存占用和添加占用标志 + ex_disk_la: boolean // 修改保存标签和清除标签的标志 + sim_disk_copy: string[][] // 拷贝simDisk + block_modi_tag: boolean // 磁盘块修改标志 + block_modi_lb: string // 磁盘块标签值初始化 + old_key: number[] // FAT表上一次的记录值 + fat_modi_num: string // 打开下一个FAT单元格之前的修改数值 + fat_modi_tag: boolean // 修改状态标签,为True时进入修改状态 + clear_tag: boolean // 清除标签,让标签清理和fat清理操作互斥 + check: boolean // 检查磁盘条件 + code: string // 当前磁盘块标签字母 + creating: boolean // 正在创建的状态 + simFAT: string[][] // SimFAT 表初始化 + simDisk: string[][] // SimDisk 区域初始化 + folder_items: any[] // 文件项临时储存 + fat_unique_set: Set // fat表去重集合,防止在一个位置建立多个磁盘块 + file_name_label: string // 输入文件名输入框 + blocks_num_label: string // 块数输入框 + path_name_label: string // 创建目录项输入框 + file_label:string[] + fat_tags: string[][] // FAT删除标志 + fat_disks: string[][] // Disk方块删除标志 + label_disks: string[][] // Disk标签删除标志 + default: string // MessageDialog传参 + + constructor(len: number) { + this. messages = [] + this.sim_fat_copy = null + this.ex_disk_oc = true + this.ex_disk_la = true + this.sim_disk_copy = null + this.block_modi_tag = false + this.block_modi_lb = '' + this.old_key = null + this.fat_modi_num = null + this.fat_modi_tag = false + this.clear_tag = true // 清除标签,让标签清理和FAT清理操作互斥 + this.check = false // 检查磁盘条件 + this.code = null // 当前磁盘块标签字母 + this.creating = true // 正在创建的状态 + this.simFAT = initialize_simfat() // SimFAT 表初始化 + this.simDisk = initialize_simdisk() // SimDisk 区域初始化 + this.folder_items = [] + this.fat_unique_set = new Set(['0']) + this.file_name_label = '' + this.blocks_num_label = '' + this.path_name_label = '' + this.default = '' + this.file_label= new Array(0) + this.fat_tags = new Array(len) + this.fat_disks = new Array(len) + this.label_disks = new Array(len) + for (let i = 0; i < len; i++) { + this.fat_tags[i] = new Array(len) + this.fat_disks[i] = new Array(len) + this.label_disks[i] = new Array(len) + + for (let j = 0; j < 10; j++) { + this.fat_tags[i][j] = '' + this.fat_disks[i][j] = '' + this.label_disks[i][j] = '' + + } + } + } + + + create_file(file_name?: string, f_block?: string, block_num?: string) { + console.log("创建文件") + file_name = file_name ?? this.file_name_label // 输入文件名 + block_num = block_num ?? this.blocks_num_label // 块数 + f_block = f_block ?? this.select_fat_unique() + + this.check = this.check_condition(file_name, f_block, block_num) // 执行数据合规检查 + + if (this.check) { // 合规时执行 + if (this.creating) { // 初始时获取字母 + this.code = get_unique_tag() + this.creating = false // 获取后除非触发保存,下次创建不更新字母 + } + this.file_label = initialize_fileblock(block_num, this.code!) + this.creat_file_blocks() + this.sys_info("创建文件成功!") + } + } + + // 获取唯一的FAT表编号 + select_fat_unique(): string | null { + while (true) { + const unique_num = Math.floor(Math.random() * 99).toString() + if (!this.fat_unique_set.has(unique_num)) { + return unique_num + } + if (this.fat_unique_set.size >= 100) { + return null + } + } + } + + // 检查创建和保存条件 + check_condition(file_name: string, start_block_num: string, block_num: string): boolean { + // 更新唯一SimFAT表 + this.simFAT.forEach(row => { // 更新唯一SimFAT表 + row.forEach(item => this.fat_unique_set.add(item)) + }) + + if (this.fat_unique_set.has('FF')) { // 判断磁盘空间时,排除掉非位置字符 + this.fat_unique_set.delete('FF') + } + this.fat_unique_set.delete('100') // 收藏判断需要删除100这个非位置值 + + if (this.clear_tag) { + if (file_name !== "" && block_num !== "") { // 文件名和块数不为空才能保存 + if (/^\d+$/.test(block_num)) { // 检查块数为正整数 + if (!file_name_set.has(file_name)) { // 文件名不重复 + if (this.fat_unique_set.size + parseInt(block_num) <= 100) { + if (start_block_num) { + if (!this.fat_unique_set.has(start_block_num)) { + return true + } else { + this.sys_info("首块位置已被占用!") + } + } else { + this.sys_info("磁盘已满!") + } + } else { + this.sys_info("磁盘空间不足!") + } + } else { + this.sys_info("文件名不能重复!") + } + } else { + this.sys_info("请输入正整数!") + } + } else { + this.sys_info("文件名或块数不能为空!") + } + } else { + this.sys_info("正在执行磁盘修改任务!") + } + } + + creat_file_start_end_label() { + + } + + creat_file_blocks(): void { + const left_x: number = 210 + const left_y: number = 40 + const side: number = 20 // 元素边 + const n: number = this.file_label.length + + if (n <= 11) { + for (let i = 0; i < n; i++) { + const x: number = left_x - i * side + const y: number = left_y + draw_blocks_emulation(x,y,this.file_label[i]) + } + } + else { + let end_i: number = n - 11 // 取最后5块 + for (let i = 0; i < n; i++) { // i < 11 确保循环在最后5块内 + const x: number = left_x - i * side + const y: number = left_y + + if (i < 5) { + draw_blocks_emulation(x,y,this.file_label[i]) + } else if (i === 5) { + draw_blocks_emulation(x,y,'...') + } else if (i < 11) { + draw_blocks_emulation(x,y,this.file_label[i+end_i]) + } + } + } + } + + + //显示文件夹 + show_files(path_name: any[]){ + draw_files(path_name) + } + + + // 映射显示FAT表 + show_fat(row: number, column: number): void { + // 获取FAT表中的值 + const num = this.simFAT[row][column] + if (num !== "0") { // 检查FAT表中的值是否为非零 + // 定义删除标志 + this.fat_tags[row][column] = "fat_tag" + drawFatMessage(num, row, column) + } + } + + // 显示整个FAT表 + show_all_fat(): void { + // 清空画布上所有的"FAT_tag"标签 + for (let i = 0; i < 10; i++) { + for (let n = 0; n < 10; n++) { + if (this.fat_tags[i][n] == "fat_tag") { + clearFatMessage(i,n) + } + } + } + // 遍历FAT表的行和列,显示FAT表中的所有元素 + for (let i = 0; i < 10; i++) { + for (let n = 0; n < 10; n++) { + this.show_fat(i, n) + } + } + } + + show_disk(row: number, column: number, color_tag: boolean | null = null): void { + // 获取磁盘块上的文本内容 + const text = this.simDisk[row][column] + if (text !== "0") { // 检查磁盘块内容是否为非零值 + console.log("text="+text+"+row="+row+"+column="+column) + // 定义删除标志 + this.fat_disks[row][column] = 'fat_disk' + this.label_disks[row][column] = "label_disk" + if (color_tag) { + // 根据颜色标签绘制磁盘块 黄色 初始创建 + draw_blocks(row, column, true) + } else { + // 绘制普通磁盘块 灰色 占用 + draw_blocks(row, column, false) + } + drawDiskText(text,row,column) + } + } + + // 显示所有磁盘块 + show_all_disk(): void { + // 清除之前的磁盘块和标签 + for (let i = 0; i < 10; i++) { + for (let n = 0; n < 10; n++) { + if (this.fat_disks[i][n] == 'fat_disk') { + clearBlock(i,n) + } + if (this.label_disks[i][n] == "label_disk") { + clearDiskText(i,n) + } + } + } + + // 遍历所有行和列,显示每个磁盘块 + for (let row = 0; row < 10; row++) { + for (let column = 0; column < 10; column++) { + this.show_disk(row, column) + } + } + } + + save_file(file_name: string | null = null, f_block: string | null = null, blocks: string | null = null) { + console.log("保存文件") + + file_name = file_name ?? this.file_name_label // 输入文件名 + blocks = blocks ?? this.blocks_num_label // 块数 + + if (this.creating) { + this.create_file(file_name, f_block, blocks) + } + + if (this.check) { + let fat_block = f_block ? f_block : this.select_fat_unique() + let fat_arr = this.generate_fat_array(fat_block, parseInt(blocks)) // 生成fat表 + this.folder_items.push([file_name, fat_block, blocks, this.code]) // 添加到文件夹 + file_name_set.add(file_name) // 添加唯一性文件名集合 + fat_arr.forEach((block) => this.fat_unique_set.add(block)) // 将占用的磁盘位置信息添加进唯一集合,防止重复取数 + this.load_files_list(fat_arr, this.code) // 根据fat表向磁盘装载文件数据并显示 + this.show_path_info() // 保存后显示文件夹 + this.creating = true // 上一次保存执行完成后才能开始二次执行 + this.sys_info("保存成功") + } + } + + generate_fat_array(first_block: string, blockNum: number): string[] { + const fat_arr = [first_block] + + // 放入首块信息 + this.fat_unique_set.add(first_block) + + for (let i = 0; i < blockNum - 1; i++) { + let num: number | null + while (true) { + num = Math.floor(Math.random() * 99) + 1 + if (this.fat_unique_set.size >= 101) { + num = null + break + } + if (!this.fat_unique_set.has(num.toString())) { + this.fat_unique_set.add(num.toString()) + break + } + } + if (num !== null) { + fat_arr.push(num.toString()) + } else { + break + } + } + return fat_arr + } + + load_files_list(fat_ls: string[], block_label: string = "default") { + this.show_all_disk() // 更新磁盘显示 + + fat_ls.forEach((value, index) => { + const row = Math.floor(parseInt(value) / 10) + const column = parseInt(value) % 10 + + if (block_label == "default") { + block_label = this.simDisk[row][column][0] + + } + if (index < fat_ls.length - 1) { + this.simFAT[row][column] = fat_ls[index + 1] + } else { + this.simFAT[row][column] = "FF" + } + + this.simDisk[row][column] = `${block_label}${index + 1}` + this.show_disk(row, column, true) // 最后创建颜色才为黄色 + }) + + this.show_all_fat() // 更新fat表显示 + } + + // 查询文件功能 + query_file() { + const file_name = this.file_name_label + if(file_name_set.has(file_name)) { + console.log('folder_items='+this.folder_items) + this.folder_items.forEach((item) => { + if (file_name === item[0]) { + this.file_label = initialize_fileblock(item[2], item[3]) + this.creat_file_blocks() + const block_nums = read_sim_fat(item[1], this.simFAT) // 通过首块fat获取全部文件fat + this.load_files_list(block_nums) + } + }) + this.sys_info('查询成功') + } else { + console.log('文件夹中无该文件') + this.sys_info('文件夹中无该文件') + } + } + + // FAT校验功能 + fat_checkout() { + console.log('FAT校验') + if (this.sim_fat_copy) { + let num = 0 + let tag = false + for (let i = 0; i < 10; i++) { + for (let n = 0; n < 10; n++) { + num++ + if (this.simFAT[i][n] !== this.sim_fat_copy[i][n]) { + this.sys_info(`校验失败\n${i}行${n}列错误`) + tag = true + break + } + } + if (tag) { + break + } + } + + if (num === 100) { + this.sys_info('校验正确') + } + } else { + this.sys_info('未进行修改操作,不可校验') + } + } + + // 清除表单项 + clear_fat_label() { + console.log('清除表单项') + if (this.clear_tag) { + // 清空画布上所有的"fat_tag"标签 + for (let i = 0; i < 10; i++) { + for (let n = 0; n < 10; n++) { + if (this.fat_tags[i][n] == "fat_tag") { + clearFatMessage(i,n) + } + } + } + this.clear_tag = false + if (!this.sim_fat_copy) { + this.sim_fat_copy = JSON.parse(JSON.stringify(this.simFAT)) // # 深拷贝simFAT复制一份原正确列表并保存为复制对象 + } + this.simFAT = initialize_simfat() // 清空原FAT表 + this.sys_info("清除成功!") + } else { + this.sys_info("正在执行标注任务, 无法清除表单项!") + } + } + + // 保存表单项 + modi_fat_save() { + console.log("保存表单项") + this.fat_modi_tag = false // 关闭修改模式 + this.clear_tag = true // 保存后可以清除 + if (this.fat_modi_num && this.old_key) { + if (this.fat_modi_num.match(/^\d+$/) || this.fat_modi_num === "FF") { + this.simFAT[this.old_key[0]][this.old_key[1]] = this.fat_modi_num.match(/^\d+$/) ? this.fat_modi_num : "FF" + } else { + this.sys_info("请输入正整数或FF!") + } + } + + this.show_all_fat() + this.old_key = null + + for(let i = 0; i < 10; i++) { + for (let n = 0; n < 10; n++) { + if (this.simFAT[i][n] != '0') { + let num = i * 10 + n + this.fat_unique_set.add(num.toString()) + } + } + } + this.sys_info("保存表单成功!") + } + + // 修改表单项 + modi_fat() { + this.sys_info("正在修改表单项!") + this.fat_modi_tag = true + if (!this.sim_fat_copy) { + this.sim_fat_copy = JSON.parse(JSON.stringify(this.simFAT)) // # 深拷贝simFAT复制一份原正确列表并保存为复制对象 + } + } + + modi_fat_entry(row: number, column: number) { + if (this.fat_modi_num && this.old_key) { + if (/^\d+$/.test(this.fat_modi_num) || this.fat_modi_num === "FF") { + if (/^\d+$/.test(this.fat_modi_num)) { + this.simFAT[this.old_key[0]][this.old_key[1]] = this.fat_modi_num + } else { + this.simFAT[this.old_key[0]][this.old_key[1]] = "FF" + } + } else { + this.sys_info("请输入正整数,或FF!") + } + } + this.old_key = [column, row] + this.show_all_fat() + } + + + + // Disk校验方法 + disk_checkout() { + console.log("Disk校验") + if (this.sim_disk_copy) { + let num = 0 + let tag = false + + for (let i = 0; i < 10; i++) { + for (let n = 0; n < 10; n++) { + num ++ + const diskValue = this.simDisk[i][n] + + // 匹配 [A-Za-z]开头,后面跟数字的字符串 + if (/^[A-Za-z]\d+$/.test(diskValue)) { + if (this.simDisk[i][n] !== this.sim_disk_copy[i][n]) { + this.sys_info(`校验失败\n${i}行${n}列错误`) + tag = true + break + } + } + } + if (tag) { + break + } + } + + if (num === 100) { + this.sys_info("校验正确") + } + } else { + this.sys_info("未进行修改操作,不可校验") + } + } + + // 添加占用 + add_occupy() { + console.log("添加占用") + this.sys_info("正在添加占用...") + } + + // 点击添加占用 + add_occupy_click(row: number, col: number) { + if (!this.ex_disk_oc) { + this.simDisk[col][row] = '' // 清空simDisk中对应位置的值 + console.log(col.toString(), row.toString()) + this.show_all_disk() // 假设 show_all_disk 是更新磁盘显示的方法 + this.sys_info(`(${[col, row]}) 添加成功`) + } + } + + // 保存占用 + save_occupy() { + console.log("保存占用") + + for (let i = 0; i < 10; i++) { + for (let n = 0; n < 10; n++) { + if (this.simDisk[i][n] != '0') { + let num = i * 10 + n + this.fat_unique_set.add(num.toString()) // 将占用块号添加到 fat_unique_set 中 + } + } + } + this.sys_info("保存占用成功!") + } + + // 修改标签 + modi_block_lb() { + console.info("修改标签") + this.sys_info("正在修改标签...") + this.block_modi_tag = true // 磁盘块修改标志 + this.clear_tag = false // 修改磁盘标签时冻结文件分配表的按钮 + if (!this.sim_disk_copy) { + this.sim_disk_copy = JSON.parse(JSON.stringify(this.simDisk)) // 深拷贝数组 + } + } + + // 修改标签条目 + modi_block_entry(row: number, column: number) { + let label = this.block_modi_lb + + if (this.block_modi_lb) { + if (label !== "0") { + const regex = /^[A-Za-z]\d+$/ // 正则表达式将匹配如 "A1"、"b2"、"Z9" 等形式的字符串 + if (regex.test(label)) { + this.simDisk[this.old_key[0]][this.old_key[1]] = label + this.sys_info(`${this.old_key} -> ${label}添加成功!`) + } else { + this.sys_info("请输入正确格式,如:A1!") + } + } + } + + this.old_key = [column, row] + this.show_all_disk() + } + + // 保存标签 + modi_block_save() { + console.info("保存标签") + + if (this.block_modi_lb) { + let label = this.block_modi_lb + if (label !== "0") { + const regex = /^[A-Za-z]\d+$/ + if (regex.test(label)) { + this.simDisk[this.old_key[0]][this.old_key[1]] = label + this.sys_info(`${this.old_key} -> ${label}添加成功!`) + } else { + this.sys_info("请输入正确格式,如:A1!") + } + + for (let i = 0; i < 10; i++) { + for (let n = 0; n < 10; n++) { + if (this.simDisk[i][n] !== '0' && this.simDisk[i][n] !== '') { + let num = i * 10 + n + let code = this.simDisk[i][n][0] // 取第一个字母 + blocks_label_set.add(code) // 添加到唯一集合 + this.fat_unique_set.add(num.toString()) // 添加到FAT表 + } + } + } + } + } + + this.block_modi_lb = '' // 重置 block_modi_lb + this.show_all_disk() + this.block_modi_tag = false // 关闭标签修改状态 + this.clear_tag = true + this.sys_info("保存标签成功!") + } + + // 清除标签 + clear_disk_label() { + console.info("清除标签") + + if (this.clear_tag) { + // 清除之前的标签 + for (let i = 0; i < 10; i++) { + for (let n = 0; n < 10; n++) { + if (this.label_disks[i][n] == "label_disk") { + clearDiskText(i,n) + } + } + } + this.clear_tag = false // 将清除标志置否,防止其他模块改动 + + if (!this.sim_disk_copy) { + this.sim_disk_copy = JSON.parse(JSON.stringify(this.simDisk)) // 深拷贝原列表 + } + + for (let i = 0; i < 10; i++) { + for (let j = 0; j < 10; j++) { + if (this.simDisk[i][j] !== '0') { + this.simDisk[i][j] = "" // 清除标签 + } + } + } + + this.sys_info("清除成功!") + } else { + this.sys_info("正在执行标注任务,无法清除标签") + } + } + + show_path_info() { + + } + + //创建目录项 + create_path(path_name:string){ + if(this.clear_tag){ + const text_list = path_name.split(',') + if(!file_name_set.has(text_list[0])){ + if(text_list.length===3 && !isNaN(parseInt(text_list[1])) && !isNaN(parseInt(text_list[2]))){ + if(this.check_condition(text_list[0],text_list[1],text_list[2])){ + this.save_file(text_list[0],text_list[1],text_list[2]) + this.show_files(this.folder_items) + this.sys_info('创建目录成功!') + } + }else{ + this.sys_info('请检查输入格式{\'str\',\'int\',\'int\'}!') + } + }else{ + this.sys_info('文件名重复') + } + }else{ + this.sys_info('目前正在执行磁盘修复任务!') + } + } + + // 重置功能 + reset_path(len:number) { + for (let i = 0; i < 10; i++) { + for (let n = 0; n < 10; n++) { + clearFatMessage(i, n) + clearDiskText(i, n) + clearBlock(i, n) + } + } + clearEmulation() + clearFiles() + + file_name_set = new Set() + blocks_label_set = new Set() + + this. messages = [] + this.sim_fat_copy = null + this.ex_disk_oc = true + this.ex_disk_la = true + this.sim_disk_copy = null + this.block_modi_tag = false + this.block_modi_lb = '' + this.old_key = null + this.fat_modi_num = null + this.fat_modi_tag = false + this.clear_tag = true // 清除标签,让标签清理和FAT清理操作互斥 + this.check = null // 检查磁盘条件 + this.code = null // 当前磁盘块标签字母 + this.creating = true // 正在创建的状态 + this.simFAT = initialize_simfat() // SimFAT 表初始化 + this.simDisk = initialize_simdisk() // SimDisk 区域初始化 + this.folder_items = [] + this.fat_unique_set = new Set(['0']) + this.default = '' + this.file_label = new Array(0) + this.fat_tags = new Array(len) + this.fat_disks = new Array(len) + this.label_disks = new Array(len) + for (let i = 0; i < len; i++) { + this.fat_tags[i] = new Array(len) + this.fat_disks[i] = new Array(len) + this.label_disks[i] = new Array(len) + + for (let j = 0; j < 10; j++) { + this.fat_tags[i][j] = '' + this.fat_disks[i][j] = '' + this.label_disks[i][j] = '' + + } + } + this.sys_info('重置成功!') + } + + sys_info(message:string) { + if(this.messages.length < 9){ + this.messages.unshift(message) + }else{ + this.messages.pop() + this.messages.unshift(message) + } + this.messages = [...this.messages] + } +} + diff --git a/filestoraging/filestorage/entry/src/main/ets/components/MessageDialog.ets b/filestoraging/filestorage/entry/src/main/ets/components/MessageDialog.ets new file mode 100644 index 0000000..82ac463 --- /dev/null +++ b/filestoraging/filestorage/entry/src/main/ets/components/MessageDialog.ets @@ -0,0 +1,48 @@ +//信息提示弹窗 +import { InterfaceFile } from './InterfaceFile' + +@CustomDialog +export default struct MessageDialog { + controller: CustomDialogController + @Link File:InterfaceFile + build(){ + Column({space:5}){ + Text(`${this.File.old_key[0]}行${this.File.old_key[1]}列`) + .fontSize(20) + .height(45) + .textAlign(TextAlign.Center) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + + TextInput({placeholder:this.File.default}) + .fontSize(20) + .height(45) + .placeholderColor(Color.White) + .placeholderFont({size:20, weight:FontWeight.Bold}) + .textAlign(TextAlign.Center) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .onChange((value: string) => { + if(this.File.fat_modi_tag) { + this.File.fat_modi_num = value + } + else if (this.File.block_modi_tag) { + this.File.block_modi_lb = value + } + }) + + Text('确定') + .fontSize(20) + .textAlign(TextAlign.Center) + .fontWeight(FontWeight.Bold) + .fontColor(Color.White) + .onClick(()=>{ + this.controller.close() + }) + } + .backgroundColor('#00a5df') + .justifyContent(FlexAlign.Center) + .width(500) + .height(150) + } +} diff --git a/filestoraging/filestorage/entry/src/main/ets/components/five.ets b/filestoraging/filestorage/entry/src/main/ets/components/five.ets new file mode 100644 index 0000000..853a348 --- /dev/null +++ b/filestoraging/filestorage/entry/src/main/ets/components/five.ets @@ -0,0 +1,159 @@ +// 第五章 +// 编程7.15 +// 产生一个FAT表 +function create_sim_fat(): string[][] { + let sim_fat: string[][] = [ + ['00', '01', 'FF', '03', 'FF', '05', '06', '07', '08', '09'], + ['0A', '0B', '0C', '0D', '0E', '0F', '10', '11', '12', '13'], + ['14', '15', '16', '17', '18', '19', '1A', '1B', '1C', '1D'], + ['1E', '1F', '20', '21', '22', '23', '24', '25', '26', '27'], + ['28', '29', '2A', '2B', '2C', '2D', '2E', '2F', '30', '31'], + ['32', '33', '34', '35', '36', '37', '38', '39', '3A', '3B'], + ['3C', '3D', '3E', '3F', '40', '41', '42', '43', '44', '45'], + ['46', '47', '48', '49', '4A', '4B', '4C', '4D', '4E', '4F'], + ['50', '51', '52', '53', '54', '55', '56', '57', '58', '59'], + ['5A', '5B', '5C', '5D', '5E', '5F', '60', '61', '62', '63'] + ]; + return sim_fat; +} + +// 恢复文件夹信息根据FAT表 +function restore_folder_by_fat(): string[] { + let sim_fat = create_sim_fat(); // 创建模拟的FAT表 + let folder_item: string[] = []; // 用于存储文件夹信息的列表 + let last_item: Set = new Set(); // 用于跟踪已经处理过的磁盘块 + + for (let num = 0; num < 100; num++) { // 主循环,用于分析文件个数 + let sim_fat_array: string[] = []; // 清除单个文件的磁盘块 + let data: number | null = null; // 用于跟踪当前磁盘块 + + // 寻找下一个可用的磁盘块作为文件的起始磁盘块 + for (let ab = 0; ab < 100; ab++) { + let y = ab % 10; + let x = Math.floor(ab / 10); + if (sim_fat[x][y] === 'FF' && !last_item.has(ab)) { + data = ab; + last_item.add(ab); + break; + } + } + + if (data === null) { + break; + } + + // 遍历链接的磁盘块,构建文件 + while (data !== null) { + let x = Math.floor(data / 10); + let y = data % 10; + sim_fat_array.push(sim_fat[x][y]); + let next_data = parseInt(sim_fat[x][y], 16); + // 如果下一个磁盘块是0xFF,表示文件结束 + if (next_data === 0xFF) { + break; + } + data = next_data; + } + + // 构建文件项,并将其添加到文件夹列表 + let fileName = `test${num}`; + let filestr = `<${fileName},${sim_fat_array[0]},${sim_fat_array.length + 1}>`; + folder_item.push(filestr); + } + return folder_item; +} + +let folder_item = restore_folder_by_fat(); +folder_item.forEach(item => console.log(item)); + + +// ———————————————————————————————————————————————————————————————————————————————— + + +// 编程7.16 +// 模拟一个虚拟的磁盘扇区 +let virtual_sector_data: number[] = Array.from("This is a simulated disk sector.").map(c => c.charCodeAt(0)); + +// 将数字数组转换为字符串 +function decodeToString(data: number[]): string { + return data.map(byte => String.fromCharCode(byte)).join(''); +} + +// 读取虚拟扇区内容 +function read_zero(data: number[]): void { + // 将二进制数据(数字数组)转换为字符串 + let sector_content = decodeToString(data); + // 读取并打印扇区内容 + console.log(sector_content); +} + +// 主程序执行 +read_zero(virtual_sector_data); + + +// ———————————————————————————————————————————————————————————————————————————————— + + +// 编程7.17 +// 模拟一个简单的FAT表的二进制数据 +let fat_table_data: Uint8Array = new Uint8Array([ + 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +]); + +// 读取FAT表数据并转换为十六进制编号字符串 +function read_fat_table(data: Uint8Array): string { + let hex_values: string[] = [] + for (let i = 0; i < data.length; i += 2) { + // 从二进制数据中提取两个字节作为一个FAT项 + let fat_entry = (data[i] | (data[i + 1] << 8)) + // 将FAT项转换成十六进制编号并添加到列表中 + let hex_value = `0x${fat_entry.toString(16).toUpperCase().padStart(4, '0')}` + hex_values.push(hex_value) + } + // 将十六进制编号字符串列表连接为一个输出字符串 + let output_string = hex_values.join(' ') + return output_string +} + +let output = read_fat_table(fat_table_data) +console.log(output) + + +// ———————————————————————————————————————————————————————————————————————————————— + + +// 编程7.18 +// 模拟文件夹数据 +let folder_data: string[] = [ + "File1 TXT 07 1B 00 0A 15 21 02 3E 01 00 00 00 0E 00 00 00", // 文件1 + "File2 TXT 07 1B 00 0A 15 21 02 3E 01 00 00 00 0F 00 00 00", // 文件2 + "Folder1 DIR 07 1B 00 0A 15 21 02 3E 01 00 00 00 10 00 00 00", // 文件夹1 + "File3 TXT 07 1B 00 0A 15 21 02 3E 01 00 00 00 12 00 00 00", // 文件3 + "Folder2 DIR 07 1B 00 0A 15 21 02 3E 01 00 00 00 14 00 00 00", // 文件夹2 +]; + +// 读取文件夹数据并解析 +function read_folder_parse(data: string[]): void { + data.forEach(line => { + // 解析每一行的信息 + // 获取文件名,前20个字符为文件名,使用trim()去掉额外空白字符 + let filename = line.substring(0, 20).trim(); + // 获取文件类型,接下来的11个字符为文件类型,使用trim()去掉额外空白字符 + let filetype = line.substring(21, 32).trim(); + // 获取创建时间,接下来的14个字符为创建时间,使用trim()去掉额外空白字符 + let create_time = line.substring(32, 46).trim(); + // 获取修改时间,接下来的14个字符为修改时间,使用trim()去掉额外空白字符 + let update_time = line.substring(46, 60).trim(); + // 打印可读信息 + console.log("文件名: " + filename); + console.log("类型: " + filetype); + console.log("创建时间: " + create_time); + console.log("修改时间: " + update_time); + }); +} + +read_folder_parse(folder_data); + diff --git a/filestoraging/filestorage/entry/src/main/ets/components/one.ets b/filestoraging/filestorage/entry/src/main/ets/components/one.ets new file mode 100644 index 0000000..6213908 --- /dev/null +++ b/filestoraging/filestorage/entry/src/main/ets/components/one.ets @@ -0,0 +1,204 @@ +// 第一章 +// 编程7.1 +// 定义文件块数组 +let FOLDER_ITEM: any[] = [] +let SIM_FAT: string[][] = Array.from({ length: 3 }, () => Array(5).fill("0")) + +// 初始化基本数组 +export function init_base_array(): string[] { + let xy: number = Math.floor(Math.random() * 101) + let num: number = Math.floor(Math.random() * 28) + let sim_fat_back: string[] = [xy.toString()] + let flag: number = 0 + for (let i = 0; i < num; i++) { + xy = Math.floor(Math.random() * 101) + let ab = xy.toString() + if (!sim_fat_back.includes(ab)) { + sim_fat_back.push(ab) + flag += 1 + if (sim_fat_back.length === num) { + break + } + } + } + return sim_fat_back +} + +// 生成数据块 +export function create_file_block(): string[] { + let num = Math.floor(Math.random() * 28) // 取随机数据 + const zm: string[] = ['A', 'B', 'C', 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] // 定义字母数组 + let file_block: string[] = zm.slice(0, num) // 截取数组字符串 + return file_block +} + +// 生成仿真目录/文件夹 +export function create_folder_item(): any[] { + let file_name: string = "测试文件" // 定义文件名称 + let xy: number = Math.floor(Math.random() * 101) // 定义100以内的随机数据 + let num: number = Math.floor(Math.random() * 28) // 定义字符串标签数组 + let folder_item: any[] = [file_name, xy, num] // 定义文件目录项 + return folder_item +} + +// 仿真磁盘区域 +export function create_sim_disk(): string[][] { + const zm: string[] = ['A', 'B', 'C', 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] // 定义字母数组 + let base_array: string[] = init_base_array() // 初始生成数组 + let sim_disk: string[][] = [] // 定义磁盘仿真区域数组 + let flag: number = 0 // 定义数组序号 + for (let i = 0; i < 10; i++) { // 定义数组序号 + let element: string[] = [] + for (let j = 0; j < 10; j++) { + let ab: string = i.toString() + j.toString() + if (base_array.includes(ab)) { + element.push(zm[flag]) + flag += 1 + } + else { + element.push("0") + } + } + sim_disk.push(element) + } + return sim_disk +} + +// 仿真文件分配表 +export function create_sim_fat(): string[][] { + let sim_fat: string[][] = [] + let base_array: string[] = init_base_array() // 初始生成数组 + for (let i = 0; i < 10; i++) { // 循环仿真文件分配二维数组 + let element: string[] = [] + for (let j = 0; j < 10; j++) { + let ab: string = i.toString() + j.toString() + if (base_array.includes(ab)) { + if (base_array.indexOf(ab) + 1 === base_array.length) { + element.push("FF") + } else { + element.push(base_array[base_array.indexOf(ab) + 1]) + } + } else { + element.push("0") + } + } + sim_fat.push(element) + } + return sim_fat +} + +// 总函数创建 +export function createData(): void { + console.log('create_file_block()='+create_file_block()) // 文件块 + console.log('create_folder_item()='+create_folder_item()) // 文件目录项 + console.log('create_sim_disk()='+create_sim_disk()) // 文件磁盘区域 + console.log('create_sim_fat()='+create_sim_fat()) // 仿真文件分配表 +} + + +// —————————————————————————————————————————————————————————————————————————————————— + + +// 编程7.2 +// 统计磁盘空间大小 +export function count_sim_fat_size(): void { + let n: number = 0 + for (let element of SIM_FAT) { + console.log('element='+element) // 打印每一行的内容 + for (let i of element) { + if (i === "0") { + n += 1 // 统计空闲扇区数量 + } + } + } + let size: string = (64 * n) + " KB" // 计算总的空闲磁盘空间大小 + console.log(size) +} + + +// —————————————————————————————————————————————————————————————————————————————————— + + +// 编程7.3 +// 创建FAT表 +export function create_fat(): string[][] { + let sim_fat_array = init_base_array() + console.log('sim_fat_array='+sim_fat_array) + for (let i = 0; i < 10; i++) { + for (let j = 0; j < 10; j++) { + let ab: string = i.toString() + j.toString() + if (sim_fat_array.includes(ab)) { + if (sim_fat_array.indexOf(ab) + 1 === sim_fat_array.length) { + SIM_FAT[i][j] = "FF" // 注意数组越界问题 + } + else { + SIM_FAT[i][j] = sim_fat_array[sim_fat_array.indexOf(ab) + 1] + } + } + } + } + return SIM_FAT +} + + +// —————————————————————————————————————————————————————————————————————————————————— + + +// 编程7.4 +// 定义FAT链表和第一块FAT位置 +let sim_fat_chain: { [key: string]: string }[] = [ + { '08': '02' }, + { '02': '56' }, + { '56': '31' }, + { '31': '55' }, + { '55': '67' }, + { '67': '74' }, + { '74': 'FF' } +] +const FIRST_BLOCK: string = '08' + +// 获取磁盘块顺序 +export function get_disk_block_order(): string[] { + let disk_order: string[] = [FIRST_BLOCK] + let current_block: string = FIRST_BLOCK + + while (current_block !== 'FF') { + let next_block: string = null + for (let item of sim_fat_chain) { + if (current_block in item) { + next_block = item[current_block] + break + } + } + if (next_block === null) { + break + } + disk_order.push(next_block) + current_block = next_block + } + return disk_order +} + + +// —————————————————————————————————————————————————————————————————————————————————— + + +// 编程7.5 +// 插入一个目录项 +export function add_folder_item(item: any): any[] { + FOLDER_ITEM.push(item) + return FOLDER_ITEM +} + +// 删除一个目录项 +export function del_folder_item(item: any): any[] { + const index = FOLDER_ITEM.indexOf(item) + if (index !== -1) { + FOLDER_ITEM.splice(index, 1) + console.log("删除成功") + } + else { + console.log("删除失败,元素不在目录项中") + } + return FOLDER_ITEM +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/src/main/ets/entryability/EntryAbility.ets b/filestoraging/filestorage/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000..1c7aa63 --- /dev/null +++ b/filestoraging/filestorage/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,43 @@ +import AbilityConstant from '@ohos.app.ability.AbilityConstant'; +import hilog from '@ohos.hilog'; +import UIAbility from '@ohos.app.ability.UIAbility'; +import Want from '@ohos.app.ability.Want'; +import window from '@ohos.window'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err, data) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} diff --git a/filestoraging/filestorage/entry/src/main/ets/pages/Index.ets b/filestoraging/filestorage/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000..a0753eb --- /dev/null +++ b/filestoraging/filestorage/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,468 @@ +import *as CommonConstant from '../common/constants/CommonConstants' +import {drawFatLine,drawFatLabels,drawDiskLabels,draw_blocks_background} from '../utils/functions' +import {InterfaceFile} from '../components/InterfaceFile' +import MessageDialog from '../components/MessageDialog' +import {createData,count_sim_fat_size,create_fat,get_disk_block_order, init_base_array,create_folder_item,add_folder_item,del_folder_item} from '../components/one' + + +@Entry +@Component +struct Index { + @State File:InterfaceFile=new InterfaceFile(10) + + //弹窗控制器 + MessageDialogController: CustomDialogController = new CustomDialogController({ + builder: MessageDialog({ + File: $File + }) + }) + + build() { + Row() { + Column() { + Row() { + Column() { + Row({space:4}) { + Text('输入文件名') + .fontSize(8) + .fontColor(Color.White) + + TextInput() + .height(20) + .width(35) + .backgroundColor(Color.White) + .fontColor('#000') + .textAlign(TextAlign.Start) + .align(Alignment.Center) + .fontSize(12) + .borderRadius(0) + .padding({ + top: 0 + , right: 0 + , bottom: 0 + , left: 0 + }) + .onChange((value: string) => { + this.File.file_name_label = value; + }) + + Text('块数') + .fontSize(8) + .fontColor(Color.White) + + TextInput() + .height(20) + .width(35) + .backgroundColor(Color.White) + .fontColor('#000') + .textAlign(TextAlign.Start) + .align(Alignment.Center) + .fontSize(12) + .borderRadius(0) + .padding({ + top: 0 + , right: 0 + , bottom: 0 + , left: 0 + }) + .onChange((value: string) => { + this.File.blocks_num_label = value; + }) + + Image($r('app.media.createFile')) + .width(30) + .height(15) + .onClick(()=>{ + this.File.create_file() + }) + + Image($r('app.media.save')) + .width(30) + .height(15) + .onClick(()=>{ + this.File.save_file() + this.File.show_files(this.File.folder_items) + }) + + Image($r('app.media.query')) + .width(30) + .height(15) + .onClick(()=>{ + this.File.query_file() + }) + } + .height(12) + .width('100%') + .margin({top:6,left:5}) + + Column() { + // 文字区域 + Row() { + Text('初始文件模拟区:') + .fontSize(8) + .fontColor(Color.White) + } + .width('100%') + .height('20%') + .margin({left:5}) + + // 绘制区域 + Column() { + Stack() { + Canvas(CommonConstant.context5) // 初始文件模拟区域 + .width('100%') + .height('100%') + .margin({top: 15}) + .onReady(() => { + // 方块部分 + this.File.creat_file_blocks() + }) + } + } + .width('100%') + } + } + .width('47%') + .height('100%') + .margin({top:5,left:10 }) + .backgroundImage($r('app.media.pink_bg')) + .backgroundImageSize({width:270, height:140}) + + // 文件夹(目录) + Column() { + Row({space:2}) { + Text('文件夹(目录)') + .fontSize(8) + .fontColor(Color.White) + + TextInput() + .height(20) + .width(60) + .backgroundColor(Color.White) + .fontColor('#000') + .textAlign(TextAlign.Start) + .align(Alignment.Center) + .fontSize(12) + .borderRadius(0) + .padding({ + top: 0 + , right: 0 + , bottom: 0 + , left: 0 + }) + .onChange((value:string)=>{ + this.File.path_name_label = value + }) + + Image($r('app.media.createDirectory')) + .width(50) + .height(20) + .margin({left:5,right:5}) + .onClick(()=>{ + this.File.create_path(this.File.path_name_label) + }) + + Image($r('app.media.reset')) + .width(30) + .height(20) + .margin({left:5}) + .onClick(()=>{ + this.File.reset_path(10) + }) + + } + .height(12) + .width('100%') + .margin({top:4,left:10}) + + Column() { + // 文字区域 + Row({space:10}) { + Text('文件名') + .fontSize(8) + .fontColor(Color.White) + + Text('首块') + .fontSize(8) + .fontColor(Color.White) + + Text('块数') + .fontSize(8) + .fontColor(Color.White) + + Text('标签') + .fontSize(8) + .fontColor(Color.White) + } + .width('100%') + .height('15%') + .margin({left:5}) + // .backgroundColor(Color.Black) + .alignItems(VerticalAlign.Bottom) + + // 绘制区域 + Row(){ + Canvas(CommonConstant.context6) // 初始文件模拟区域 + .width('100%') + .height('100%') + // .margin({top: 15}) + // .backgroundColor(Color.Black) + .onReady(() => { + // 方块部分 + this.File.show_files(this.File.folder_items) + }) + } + .width('100%') + .height('75%') + } + .justifyContent(FlexAlign.Center) + + } + .width('47%') + .height('100%') + .margin({top:5,left:10 }) + .backgroundImage($r('app.media.purple_bg')) + .backgroundImageSize({width:270, height:140}) + + } + .height('35%') + .width('100%') + + Row() { + // 文件分配表FAT + Column() { + Row({space:2}) { + Text('文件分配表FAT') + .fontSize(8) + .fontColor(Color.White) + + + Image($r("app.media.check1")) + .width(30) + .height(15) + .onClick(()=>{ + this.File.fat_checkout() + }) + + Image($r('app.media.clearFormItem')) + .width(45) + .height(15) + .onClick(()=>{ + this.File.clear_fat_label() + }) + + Image($r('app.media.saveFormItem')) + .width(45) + .height(15) + .onClick(()=>{ + this.File.modi_fat_save() + }) + + Image($r('app.media.changeFormItem')) + .width(45) + .height(15) + .onClick(()=>{ + this.File.modi_fat() + }) + } + .height(15) + .width('100%') + .margin({top:4,left:5}) + + Column() { + Stack() { + Canvas(CommonConstant.context) // Fat区域 + .width('100%') + .height('100%') + .margin({top: 15}) + .onReady(() => { + // Fat区域背景 + drawFatLine() + + // 数字标签 + drawFatLabels() + }) + + Canvas(CommonConstant.context2) // 文字 + .width('100%') + .height('100%') + .margin({top: 15}) + + .onClick((event)=>{ + //计算点击的的画布横纵坐标 + let playX = event.x - CommonConstant.gridSize + let playY = event.y - CommonConstant.gridSize + //计算行列数 横纵坐标/格子大小 + let row: number = Math.floor(playX / CommonConstant.gridSize) + let col: number = Math.floor(playY / CommonConstant.gridSize) + + if (this.File.fat_modi_tag) { + this.File.modi_fat_entry(row, col) + this.File.default = this.File.simFAT[this.File.old_key[0]][this.File.old_key[1]] + this.MessageDialogController.open() + } + }) + } + + } + .width('100%') + .padding({left:10}) + } + .width('47%') + .height('100%') + .margin({top:10,left:10 }) + .backgroundImage($r('app.media.jade_blue_bg')) + .backgroundImageSize({width:270, height:240}) + + + // 磁盘模块 + Column() { + Row({space:2}) { + Text('磁盘模块') + .fontSize(8) + .fontColor(Color.White) + + Image($r("app.media.check2")) + .width(30) + .height(15) + .onClick(()=>{ + this.File.disk_checkout() + }) + + Image(this.File.ex_disk_oc ? $r('app.media.add') : $r("app.media.saveOccupy")) + .width(45) + .height(15) + .onClick(()=>{ + if (this.File.ex_disk_oc) { + this.File.ex_disk_oc = false + } + else { + this.File.ex_disk_oc = true + } + if (this.File.ex_disk_oc == false) { + this.File.add_occupy() + } + else { + this.File.save_occupy() + } + }) + Image(this.File.ex_disk_la ? $r("app.media.changeLabel") : $r("app.media.saveLabel")) + .width(45) + .height(15) + .onClick(()=>{ + if (this.File.ex_disk_la) { + this.File.ex_disk_la = false + } + else { + this.File.ex_disk_la = true + } + if (this.File.ex_disk_la == false) { + this.File.modi_block_lb() + } + else { + this.File.modi_block_save() + } + }) + + Image($r('app.media.clearLabel')) + .width(45) + .height(15) + .onClick(()=>{ + this.File.clear_disk_label() + }) + } + .height(12) + .width('100%') + .margin({top:4,left:5}) + + Column() { + Stack() { + Canvas(CommonConstant.context3) // Disk区域 + .width('100%') + .height('100%') + .margin({top: 15}) + .onReady(() => { + // 数字标签部分 + drawDiskLabels() + + // 方块部分 + draw_blocks_background() + }) + + Canvas(CommonConstant.context4) // 编号 + .width('100%') + .height('100%') + .margin({top: 5}) + + .onClick((event)=>{ + //计算点击的的画布横纵坐标 + let playX = event.x - CommonConstant.blockSize + let playY = event.y - CommonConstant.blockSize + //计算行列数 横纵坐标/格子大小 + let row: number = Math.floor(playX / CommonConstant.gridSize) + let col: number = Math.floor(playY / CommonConstant.gridSize) + + this.File.add_occupy_click(row, col) + + if (this.File.block_modi_tag) { + this.File.modi_block_entry(row, col) + this.File.default = this.File.simDisk[this.File.old_key[0]][this.File.old_key[1]] + this.MessageDialogController.open() + } + }) + } + } + .width('100%') + .padding({left:15}) + } + .width('47%') + .height('100%') + .margin({top:10,left:10 }) + .backgroundImage($r('app.media.sky_blue_bg')) + .backgroundImageSize({width:270, height:240}) + } + .height('65%') + .width('100%') + + } + .width('80%') + .height('100%') + + Column() { + Column() { + Text('系统消息框') + .fontSize(12) + .fontColor(Color.White) + .margin({top:3}) + } + .width('100%') + .height('6%') + .margin({top:2}) + .backgroundImage($r('app.media.rightbgtop')) + + Column() { + ForEach(this.File.messages,message=>{ + Text(message) + .fontSize(10).textAlign(TextAlign.Center) + .fontColor(Color.White) + .margin({top:4}) + .backgroundImage($r('app.media.messagebg')) + .width('100%') + .height('11%') + }) + } + .width('100%') + .height('90%') + .backgroundImage($r('app.media.rightbg')) + + } + .width('20%') + .height('100%') + + } + .width('100%') + .height('100%') + .backgroundImage($r('app.media.bg2')) + .backgroundImageSize(ImageSize.Cover) + } +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/src/main/ets/utils/functions.ets b/filestoraging/filestorage/entry/src/main/ets/utils/functions.ets new file mode 100644 index 0000000..4c7f233 --- /dev/null +++ b/filestoraging/filestorage/entry/src/main/ets/utils/functions.ets @@ -0,0 +1,198 @@ +// 功能函数 +import * as CommonConstant from '../common/constants/CommonConstants' + +// 初始化FAT矩阵 +export function initialize_simfat(): string[][] { + // 创建一个10x10的二维数组,每个元素都初始化为字符串 "0" + const simFat: string[][] = Array.from({ length: 10 }, () => Array(10).fill("0")) + simFat[0][0] = "100"; // 将第一个元素(第一行第一列)设置为字符串 "100" + return simFat; // 返回初始化的FAT矩阵 +} + +// 初始化磁盘矩阵 +export function initialize_simdisk(): string[][] { + // 创建一个10x10的二维数组,每个元素都初始化为字符串 "0" + const simDisk: string[][] = Array.from({ length: 10 }, () => Array(10).fill("0")) + return simDisk // 返回初始化的磁盘矩阵 +} + +// 绘制Fat区域线条 +export function drawFatLine() { + CommonConstant.context.strokeStyle = '#fff' //线条颜色 + CommonConstant.context.lineWidth = 1 //线条宽 + + for (let i = 0; i < CommonConstant.boardNum; i++) { + // 横线 + CommonConstant.context.beginPath() + CommonConstant.context.moveTo(CommonConstant.gridSize, i * CommonConstant.gridSize + CommonConstant.gridSize) + CommonConstant.context.lineTo(CommonConstant.gridSize * (CommonConstant.boardNum - 1) + CommonConstant.gridSize, i * CommonConstant.gridSize + CommonConstant.gridSize) + CommonConstant.context.stroke() + + // 竖线 + CommonConstant.context.beginPath() + CommonConstant.context.moveTo(i * CommonConstant.gridSize + CommonConstant.gridSize, CommonConstant.gridSize) + CommonConstant.context.lineTo(i * CommonConstant.gridSize + CommonConstant.gridSize, CommonConstant.gridSize * (CommonConstant.boardNum - 1) + CommonConstant.gridSize) + CommonConstant.context.stroke() + } +} + +// 绘制Fat区域边框外侧数字 +export function drawFatLabels() { + CommonConstant.context.fillStyle = 'white' // 设置文字颜色为白色 + CommonConstant.context.font = '25px Arial' // 设置字体和大小 + CommonConstant.context.textAlign = 'center' // 设置文字对齐方式为居中 + CommonConstant.context.textBaseline = 'middle' // 设置文字基线为居中 + + // 绘制数字标签 + for (let i = 0; i < CommonConstant.boardNum - 1; i++) { + CommonConstant.context.fillText(i.toString(), i * CommonConstant.gridSize + CommonConstant.gridSize + CommonConstant.gridSize / 2, CommonConstant.gridSize / 2) // 上边标签 + CommonConstant.context.fillText(i.toString(), CommonConstant.gridSize / 2, i * CommonConstant.gridSize + CommonConstant.gridSize + CommonConstant.gridSize / 2) // 左边标签 + } +} + +// 绘制Disk区域边框外侧数字 +export function drawDiskLabels() { + CommonConstant.context3.fillStyle = 'white' // 设置文字颜色为白色 + CommonConstant.context3.font = '25px Arial' // 设置字体和大小 + CommonConstant.context3.textAlign = 'center' // 设置文字对齐方式为居中 + CommonConstant.context3.textBaseline = 'middle' // 设置文字基线为居中 + + // 绘制数字标签 + for (let i = 0; i < CommonConstant.boardNum - 1; i++) { + CommonConstant.context3.fillText(i.toString(), i * CommonConstant.gridSize + CommonConstant.blockSize * 1.5, CommonConstant.blockSize / 2) // 上边标签 + CommonConstant.context3.fillText(i.toString(), CommonConstant.blockSize / 2, i * CommonConstant.gridSize + CommonConstant.blockSize * 1.5) // 左边标签 + } +} + +//绘制模拟区方块 +export function draw_blocks_emulation(x:number,y:number,list_label:string) { + CommonConstant.context5.fillStyle = 'black' // 设置文字颜色为黑色 + CommonConstant.context5.font = '20px Arial' // 设置字体和大小 + CommonConstant.context5.textAlign = 'center' // 设置文字对齐方式为居中 + CommonConstant.context5.textBaseline = 'middle' // 设置文字基线为居中 + CommonConstant.context5.clearRect(0,0,x,y+20) + CommonConstant.context5.drawImage(CommonConstant.img3, x, y, CommonConstant.gridSize, CommonConstant.gridSize) + CommonConstant.context5.fillText(list_label, x + CommonConstant.gridSize / 2, y + CommonConstant.gridSize / 2) + CommonConstant.context5.fillStyle = 'white' + CommonConstant.context5.fillText('起始', x + CommonConstant.gridSize / 2, y - CommonConstant.gridSize) + CommonConstant.context5.clearRect(0,0, 210, 40) + CommonConstant.context5.fillText('尾部',x + CommonConstant.gridSize / 2,y - CommonConstant.gridSize/2) + CommonConstant.context5.clearRect(x + CommonConstant.gridSize+2,y - 13, 210, CommonConstant.gridSize/2) + for (let index = 0; index < (230-x)/20; index++) { + CommonConstant.context5.fillText('—', 230-index*4, y - CommonConstant.gridSize/2) + } + CommonConstant.context5.fillText('<',230-(230-x)/5 , y - CommonConstant.gridSize/2) +} + +export function clearEmulation(){ + CommonConstant.context5.clearRect(0,0,300,300) +} + +export function draw_files(text_list:any[]){ + CommonConstant.context6.fillStyle = 'white'; // 设置文字颜色为白色 + CommonConstant.context6.font = '30px Arial'; // 设置字体和大小 + CommonConstant.context6.textAlign = 'center'; // 设置文字对齐方式为居中 + CommonConstant.context6.textBaseline = 'middle'; // 设置文字基线为居中 + CommonConstant.context6.clearRect(0,0,300,300) + console.log('text_list.length='+text_list.length) + for (let index = 0; index < text_list.length; index++) { + const x = 10 + const y = 10 + CommonConstant.context6.fillText(text_list[index][0],x,y+index*20) + CommonConstant.context6.fillText(text_list[index][1],x+30,y+index*20) + CommonConstant.context6.fillText(text_list[index][2],x+60,y+index*20) + CommonConstant.context6.fillText(text_list[index][3],x+90,y+index*20) + } +} + +export function clearFiles(){ + CommonConstant.context6.clearRect(0,0,300,300) +} +// 绘制Disk区域初始方块 +export function draw_blocks_background() { + for (let row = 0; row < CommonConstant.boardNum - 1; row++) { + for (let col = 0; col < CommonConstant.boardNum - 1; col++) { + const x = col * CommonConstant.gridSize + CommonConstant.blockSize + const y = row * CommonConstant.gridSize + CommonConstant.blockSize + CommonConstant.context3.clearRect(x,y, CommonConstant.blockSize, CommonConstant.blockSize) + CommonConstant.context3.drawImage(CommonConstant.img1, x, y, CommonConstant.blockSize, CommonConstant.blockSize) + } + } +} + +// 绘制Disk区域方块 +export function draw_blocks(row:number, col:number, color_tag:boolean) { + const x = col * CommonConstant.gridSize + CommonConstant.blockSize + const y = row * CommonConstant.gridSize + CommonConstant.blockSize + + CommonConstant.context3.clearRect(x,y, CommonConstant.blockSize, CommonConstant.blockSize) + + if (color_tag) { + CommonConstant.context3.drawImage(CommonConstant.img3, x, y, CommonConstant.blockSize, CommonConstant.blockSize) + } + else { + CommonConstant.context3.drawImage(CommonConstant.img2, x, y, CommonConstant.blockSize, CommonConstant.blockSize) + } +} + +export function drawFatMessage(num: string, row: number, clown: number) { + CommonConstant.context2.fillStyle = 'white' // 设置文字颜色为白色 + CommonConstant.context2.font = '20px Arial' // 设置字体和大小 + CommonConstant.context2.textAlign = 'center' // 设置文字对齐方式为居中 + CommonConstant.context2.textBaseline = 'middle' // 设置文字基线为居中 + + const x = clown * CommonConstant.gridSize + 1.5 * CommonConstant.gridSize + const y = row * CommonConstant.gridSize + 1.5 * CommonConstant.gridSize + + CommonConstant.context2.fillText(num, x, y) +} + +export function clearFatMessage(row: number, clown: number) { + const x = clown * CommonConstant.gridSize + CommonConstant.gridSize + const y = row * CommonConstant.gridSize + CommonConstant.gridSize + + CommonConstant.context2.clearRect(x, y, CommonConstant.gridSize, CommonConstant.blockSize) +} + +export function drawDiskText(text: string, row: number, clown: number) { + CommonConstant.context4.fillStyle = 'black' // 设置文字颜色为白色 + CommonConstant.context4.font = '20px Arial' // 设置字体和大小 + + const x = clown * CommonConstant.gridSize + CommonConstant.gridSize + const y = row * CommonConstant.gridSize + 2 * CommonConstant.blockSize + + CommonConstant.context4.clearRect(x,y, CommonConstant.gridSize, CommonConstant.gridSize) + CommonConstant.context4.fillText(text, x, y) +} + +export function clearBlock(row: number, col: number) { + const x = col * CommonConstant.gridSize + CommonConstant.blockSize; + const y = row * CommonConstant.gridSize + CommonConstant.blockSize; + CommonConstant.context3.clearRect(x,y, CommonConstant.blockSize, CommonConstant.blockSize) + CommonConstant.context3.drawImage(CommonConstant.img1, x, y, CommonConstant.blockSize, CommonConstant.blockSize) +} + +export function clearDiskText(row: number, col: number) { + const x = col * CommonConstant.gridSize + CommonConstant.gridSize; + const y = row * CommonConstant.gridSize + CommonConstant.gridSize; + CommonConstant.context4.clearRect(x,y, CommonConstant.gridSize, CommonConstant.gridSize) +} + +export function read_sim_fat(first_block: string, sim_fat: string[][]): string[] { + const block_nums: Array = []; // 创建一个空数组来存储块号 + block_nums.push(first_block) + + while (true) { + const row = Math.floor(parseInt(first_block) / 10); + const clown = parseInt(first_block) % 10; + const b_num = sim_fat[row][clown]; + + if (b_num !== "FF") { + block_nums.push(b_num) // 添加下一个块号 + first_block = b_num // 更新 first_block 以继续查找下一个块 + } else { + break; // 如果找到 "FF",则退出循环 + } + } + return block_nums +} diff --git a/filestoraging/filestorage/entry/src/main/module.json5 b/filestoraging/filestorage/entry/src/main/module.json5 new file mode 100644 index 0000000..f2ff2c7 --- /dev/null +++ b/filestoraging/filestorage/entry/src/main/module.json5 @@ -0,0 +1,37 @@ +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:icon", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/src/main/resources/base/element/color.json b/filestoraging/filestorage/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/filestoraging/filestorage/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/src/main/resources/base/element/string.json b/filestoraging/filestorage/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000..f945955 --- /dev/null +++ b/filestoraging/filestorage/entry/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/add.png b/filestoraging/filestorage/entry/src/main/resources/base/media/add.png new file mode 100644 index 0000000..f776c49 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/add.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/bg2.png b/filestoraging/filestorage/entry/src/main/resources/base/media/bg2.png new file mode 100644 index 0000000..21de35f Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/bg2.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/changeFormItem.png b/filestoraging/filestorage/entry/src/main/resources/base/media/changeFormItem.png new file mode 100644 index 0000000..4dc44bd Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/changeFormItem.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/changeLabel.png b/filestoraging/filestorage/entry/src/main/resources/base/media/changeLabel.png new file mode 100644 index 0000000..cabac96 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/changeLabel.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/check1.png b/filestoraging/filestorage/entry/src/main/resources/base/media/check1.png new file mode 100644 index 0000000..f9aa602 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/check1.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/check2.png b/filestoraging/filestorage/entry/src/main/resources/base/media/check2.png new file mode 100644 index 0000000..e04acb6 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/check2.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/clearFormItem.png b/filestoraging/filestorage/entry/src/main/resources/base/media/clearFormItem.png new file mode 100644 index 0000000..7310295 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/clearFormItem.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/clearLabel.png b/filestoraging/filestorage/entry/src/main/resources/base/media/clearLabel.png new file mode 100644 index 0000000..40edffe Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/clearLabel.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/createDirectory.png b/filestoraging/filestorage/entry/src/main/resources/base/media/createDirectory.png new file mode 100644 index 0000000..7bacfbf Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/createDirectory.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/createFile.png b/filestoraging/filestorage/entry/src/main/resources/base/media/createFile.png new file mode 100644 index 0000000..5db7844 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/createFile.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/fk11.png b/filestoraging/filestorage/entry/src/main/resources/base/media/fk11.png new file mode 100644 index 0000000..f7a3a7c Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/fk11.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/icon.png b/filestoraging/filestorage/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000..cd45acc Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/icon.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/jade_blue_bg.png b/filestoraging/filestorage/entry/src/main/resources/base/media/jade_blue_bg.png new file mode 100644 index 0000000..7cf0cdf Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/jade_blue_bg.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/messagebg.png b/filestoraging/filestorage/entry/src/main/resources/base/media/messagebg.png new file mode 100644 index 0000000..f8b3eb1 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/messagebg.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/pink_bg.png b/filestoraging/filestorage/entry/src/main/resources/base/media/pink_bg.png new file mode 100644 index 0000000..67b2517 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/pink_bg.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/purple_bg.png b/filestoraging/filestorage/entry/src/main/resources/base/media/purple_bg.png new file mode 100644 index 0000000..acd7ff5 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/purple_bg.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/query.png b/filestoraging/filestorage/entry/src/main/resources/base/media/query.png new file mode 100644 index 0000000..5e3282c Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/query.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/reset.png b/filestoraging/filestorage/entry/src/main/resources/base/media/reset.png new file mode 100644 index 0000000..708c046 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/reset.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/rightbg.png b/filestoraging/filestorage/entry/src/main/resources/base/media/rightbg.png new file mode 100644 index 0000000..70b9826 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/rightbg.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/rightbgtop.png b/filestoraging/filestorage/entry/src/main/resources/base/media/rightbgtop.png new file mode 100644 index 0000000..6055fe3 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/rightbgtop.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/save.png b/filestoraging/filestorage/entry/src/main/resources/base/media/save.png new file mode 100644 index 0000000..031ebb6 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/save.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/saveFormItem.png b/filestoraging/filestorage/entry/src/main/resources/base/media/saveFormItem.png new file mode 100644 index 0000000..77d2d04 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/saveFormItem.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/saveLabel.png b/filestoraging/filestorage/entry/src/main/resources/base/media/saveLabel.png new file mode 100644 index 0000000..09a6003 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/saveLabel.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/saveOccupy.png b/filestoraging/filestorage/entry/src/main/resources/base/media/saveOccupy.png new file mode 100644 index 0000000..af529f2 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/saveOccupy.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/sky_blue_bg.png b/filestoraging/filestorage/entry/src/main/resources/base/media/sky_blue_bg.png new file mode 100644 index 0000000..47abb3e Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/sky_blue_bg.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/media/startIcon.png b/filestoraging/filestorage/entry/src/main/resources/base/media/startIcon.png new file mode 100644 index 0000000..366f764 Binary files /dev/null and b/filestoraging/filestorage/entry/src/main/resources/base/media/startIcon.png differ diff --git a/filestoraging/filestorage/entry/src/main/resources/base/profile/main_pages.json b/filestoraging/filestorage/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000..1898d94 --- /dev/null +++ b/filestoraging/filestorage/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/Index" + ] +} diff --git a/filestoraging/filestorage/entry/src/main/resources/en_US/element/string.json b/filestoraging/filestorage/entry/src/main/resources/en_US/element/string.json new file mode 100644 index 0000000..f945955 --- /dev/null +++ b/filestoraging/filestorage/entry/src/main/resources/en_US/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/src/main/resources/zh_CN/element/string.json b/filestoraging/filestorage/entry/src/main/resources/zh_CN/element/string.json new file mode 100644 index 0000000..597ecf9 --- /dev/null +++ b/filestoraging/filestorage/entry/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "模块描述" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/src/ohosTest/ets/test/Ability.test.ets b/filestoraging/filestorage/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000..8aa3749 --- /dev/null +++ b/filestoraging/filestorage/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,35 @@ +import hilog from '@ohos.hilog'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/src/ohosTest/ets/test/List.test.ets b/filestoraging/filestorage/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000..794c7dc --- /dev/null +++ b/filestoraging/filestorage/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,5 @@ +import abilityTest from './Ability.test'; + +export default function testsuite() { + abilityTest(); +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/src/ohosTest/ets/testability/TestAbility.ets b/filestoraging/filestorage/entry/src/ohosTest/ets/testability/TestAbility.ets new file mode 100644 index 0000000..9484761 --- /dev/null +++ b/filestoraging/filestorage/entry/src/ohosTest/ets/testability/TestAbility.ets @@ -0,0 +1,50 @@ +import UIAbility from '@ohos.app.ability.UIAbility'; +import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; +import hilog from '@ohos.hilog'; +import { Hypium } from '@ohos/hypium'; +import testsuite from '../test/List.test'; +import window from '@ohos.window'; +import Want from '@ohos.app.ability.Want'; +import AbilityConstant from '@ohos.app.ability.AbilityConstant'; + +export default class TestAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onCreate'); + hilog.info(0x0000, 'testTag', '%{public}s', 'want param:' + JSON.stringify(want) ?? ''); + hilog.info(0x0000, 'testTag', '%{public}s', 'launchParam:' + JSON.stringify(launchParam) ?? ''); + let abilityDelegator: AbilityDelegatorRegistry.AbilityDelegator; + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator(); + let abilityDelegatorArguments: AbilityDelegatorRegistry.AbilityDelegatorArgs; + abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments(); + hilog.info(0x0000, 'testTag', '%{public}s', 'start run testcase!!!'); + Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite); + } + + onDestroy() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage) { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageCreate'); + windowStage.loadContent('testability/pages/Index', (err, data) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', + JSON.stringify(data) ?? ''); + }); + } + + onWindowStageDestroy() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageDestroy'); + } + + onForeground() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onForeground'); + } + + onBackground() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onBackground'); + } +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/src/ohosTest/ets/testability/pages/Index.ets b/filestoraging/filestorage/entry/src/ohosTest/ets/testability/pages/Index.ets new file mode 100644 index 0000000..423b427 --- /dev/null +++ b/filestoraging/filestorage/entry/src/ohosTest/ets/testability/pages/Index.ets @@ -0,0 +1,17 @@ +@Entry +@Component +struct Index { + @State message: string = 'Hello World'; + + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + .width('100%') + } + .height('100%') + } +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ets b/filestoraging/filestorage/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ets new file mode 100644 index 0000000..917d27a --- /dev/null +++ b/filestoraging/filestorage/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ets @@ -0,0 +1,47 @@ +import hilog from '@ohos.hilog'; +import TestRunner from '@ohos.application.testRunner'; +import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; +import Want from '@ohos.app.ability.Want'; + +let abilityDelegator: AbilityDelegatorRegistry.AbilityDelegator | undefined = undefined +let abilityDelegatorArguments: AbilityDelegatorRegistry.AbilityDelegatorArgs | undefined = undefined + +async function onAbilityCreateCallback() { + hilog.info(0x0000, 'testTag', '%{public}s', 'onAbilityCreateCallback'); +} + +async function addAbilityMonitorCallback(err : Error) { + hilog.info(0x0000, 'testTag', 'addAbilityMonitorCallback : %{public}s', JSON.stringify(err) ?? ''); +} + +export default class OpenHarmonyTestRunner implements TestRunner { + constructor() { + } + + onPrepare() { + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner OnPrepare '); + } + + async onRun() { + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun run'); + abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments() + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator() + const bundleName = abilityDelegatorArguments.bundleName; + const testAbilityName = 'TestAbility'; + let lMonitor: AbilityDelegatorRegistry.AbilityMonitor = { + abilityName: testAbilityName, + onAbilityCreate: onAbilityCreateCallback, + }; + abilityDelegator.addAbilityMonitor(lMonitor, addAbilityMonitorCallback) + const want: Want = { + bundleName: bundleName, + abilityName: testAbilityName + }; + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator(); + abilityDelegator.startAbility(want, (err, data) => { + hilog.info(0x0000, 'testTag', 'startAbility : err : %{public}s', JSON.stringify(err) ?? ''); + hilog.info(0x0000, 'testTag', 'startAbility : data : %{public}s',JSON.stringify(data) ?? ''); + }) + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun end'); + } +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/src/ohosTest/module.json5 b/filestoraging/filestorage/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000..4fc9701 --- /dev/null +++ b/filestoraging/filestorage/entry/src/ohosTest/module.json5 @@ -0,0 +1,37 @@ +{ + "module": { + "name": "entry_test", + "type": "feature", + "description": "$string:module_test_desc", + "mainElement": "TestAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:test_pages", + "abilities": [ + { + "name": "TestAbility", + "srcEntry": "./ets/testability/TestAbility.ets", + "description": "$string:TestAbility_desc", + "icon": "$media:icon", + "label": "$string:TestAbility_label", + "exported": true, + "startWindowIcon": "$media:icon", + "startWindowBackground": "$color:start_window_background", + "skills": [ + { + "actions": [ + "action.system.home" + ], + "entities": [ + "entity.system.home" + ] + } + ] + } + ] + } +} diff --git a/filestoraging/filestorage/entry/src/ohosTest/resources/base/element/color.json b/filestoraging/filestorage/entry/src/ohosTest/resources/base/element/color.json new file mode 100644 index 0000000..3c71296 --- /dev/null +++ b/filestoraging/filestorage/entry/src/ohosTest/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/src/ohosTest/resources/base/element/string.json b/filestoraging/filestorage/entry/src/ohosTest/resources/base/element/string.json new file mode 100644 index 0000000..65d8fa5 --- /dev/null +++ b/filestoraging/filestorage/entry/src/ohosTest/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_test_desc", + "value": "test ability description" + }, + { + "name": "TestAbility_desc", + "value": "the test ability" + }, + { + "name": "TestAbility_label", + "value": "test label" + } + ] +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/src/ohosTest/resources/base/media/icon.png b/filestoraging/filestorage/entry/src/ohosTest/resources/base/media/icon.png new file mode 100644 index 0000000..ce307a8 Binary files /dev/null and b/filestoraging/filestorage/entry/src/ohosTest/resources/base/media/icon.png differ diff --git a/filestoraging/filestorage/entry/src/ohosTest/resources/base/profile/test_pages.json b/filestoraging/filestorage/entry/src/ohosTest/resources/base/profile/test_pages.json new file mode 100644 index 0000000..b7e7343 --- /dev/null +++ b/filestoraging/filestorage/entry/src/ohosTest/resources/base/profile/test_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "testability/pages/Index" + ] +} diff --git a/filestoraging/filestorage/entry/src/test/List.test.ets b/filestoraging/filestorage/entry/src/test/List.test.ets new file mode 100644 index 0000000..bb5b5c3 --- /dev/null +++ b/filestoraging/filestorage/entry/src/test/List.test.ets @@ -0,0 +1,5 @@ +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/filestoraging/filestorage/entry/src/test/LocalUnit.test.ets b/filestoraging/filestorage/entry/src/test/LocalUnit.test.ets new file mode 100644 index 0000000..ed22d4d --- /dev/null +++ b/filestoraging/filestorage/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,33 @@ +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest',() => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/filestoraging/filestorage/hvigor/hvigor-config.json5 b/filestoraging/filestorage/hvigor/hvigor-config.json5 new file mode 100644 index 0000000..1a47490 --- /dev/null +++ b/filestoraging/filestorage/hvigor/hvigor-config.json5 @@ -0,0 +1,18 @@ +{ + "hvigorVersion": "3.0.9", + "dependencies": { + "@ohos/hvigor-ohos-plugin": "3.0.9" + }, + "execution": { + // "daemon": true, /* Enable daemon compilation. Default: true */ + // "incremental": true, /* Enable incremental compilation. Default: true */ + // "parallel": true, /* Enable parallel compilation. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Default: false */ + } +} diff --git a/filestoraging/filestorage/hvigor/hvigor-wrapper.js b/filestoraging/filestorage/hvigor/hvigor-wrapper.js new file mode 100644 index 0000000..372eae8 --- /dev/null +++ b/filestoraging/filestorage/hvigor/hvigor-wrapper.js @@ -0,0 +1 @@ +"use strict";var u=require("path"),D=require("os"),e=require("fs"),t=require("crypto"),r=require("child_process"),n="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},i={},C={},F=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(C,"__esModule",{value:!0}),C.maxPathLength=C.isMac=C.isLinux=C.isWindows=void 0;const E=F(D),A="Windows_NT",o="Darwin";function a(){return E.default.type()===A}function c(){return E.default.type()===o}C.isWindows=a,C.isLinux=function(){return"Linux"===E.default.type()},C.isMac=c,C.maxPathLength=function(){return c()?1016:a()?259:4095},function(e){var t=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),r=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),i=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&t(D,u,e);return r(D,u),D};Object.defineProperty(e,"__esModule",{value:!0}),e.WORK_SPACE=e.HVIGOR_PROJECT_WRAPPER_HOME=e.HVIGOR_PROJECT_ROOT_DIR=e.HVIGOR_PROJECT_CACHES_HOME=e.HVIGOR_PNPM_STORE_PATH=e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=e.PROJECT_CACHES=e.HVIGOR_WRAPPER_TOOLS_HOME=e.HVIGOR_USER_HOME=e.DEFAULT_PACKAGE_JSON=e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME=e.PNPM=e.HVIGOR=e.NPM_TOOL=e.PNPM_TOOL=e.HVIGOR_ENGINE_PACKAGE_NAME=void 0;const F=i(D),E=i(u),A=C;e.HVIGOR_ENGINE_PACKAGE_NAME="@ohos/hvigor",e.PNPM_TOOL=(0,A.isWindows)()?"pnpm.cmd":"pnpm",e.NPM_TOOL=(0,A.isWindows)()?"npm.cmd":"npm",e.HVIGOR="hvigor",e.PNPM="pnpm",e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME="hvigor-config.json5",e.DEFAULT_PACKAGE_JSON="package.json",e.HVIGOR_USER_HOME=E.resolve(F.homedir(),".hvigor"),e.HVIGOR_WRAPPER_TOOLS_HOME=E.resolve(e.HVIGOR_USER_HOME,"wrapper","tools"),e.PROJECT_CACHES="project_caches",e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=E.resolve(e.HVIGOR_WRAPPER_TOOLS_HOME,"node_modules",".bin",e.PNPM_TOOL),e.HVIGOR_PNPM_STORE_PATH=E.resolve(e.HVIGOR_USER_HOME,"caches"),e.HVIGOR_PROJECT_CACHES_HOME=E.resolve(e.HVIGOR_USER_HOME,e.PROJECT_CACHES),e.HVIGOR_PROJECT_ROOT_DIR=process.cwd(),e.HVIGOR_PROJECT_WRAPPER_HOME=E.resolve(e.HVIGOR_PROJECT_ROOT_DIR,e.HVIGOR),e.WORK_SPACE="workspace"}(i);var s={},l={};Object.defineProperty(l,"__esModule",{value:!0}),l.logInfoPrintConsole=l.logErrorAndExit=void 0,l.logErrorAndExit=function(u){u instanceof Error?console.error(u.message):console.error(u),process.exit(-1)},l.logInfoPrintConsole=function(u){console.log(u)};var B=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),d=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),f=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&B(D,u,e);return d(D,u),D};Object.defineProperty(s,"__esModule",{value:!0});var _=s.executeBuild=void 0;const p=f(e),O=f(u),h=l;_=s.executeBuild=function(u){const D=O.resolve(u,"node_modules","@ohos","hvigor","bin","hvigor.js");try{const u=p.realpathSync(D);require(u)}catch(e){(0,h.logErrorAndExit)(`Error: ENOENT: no such file ${D},delete ${u} and retry.`)}};var P={},v={};!function(u){var D=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(u,"__esModule",{value:!0}),u.hashFile=u.hash=u.createHash=void 0;const r=D(t),i=D(e);u.createHash=(u="MD5")=>r.default.createHash(u);u.hash=(D,e)=>(0,u.createHash)(e).update(D).digest("hex");u.hashFile=(D,e)=>{if(i.default.existsSync(D))return(0,u.hash)(i.default.readFileSync(D,"utf-8"),e)}}(v);var g={},m={},R={};Object.defineProperty(R,"__esModule",{value:!0}),R.Unicode=void 0;class y{}R.Unicode=y,y.SPACE_SEPARATOR=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,y.ID_START=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,y.ID_CONTINUE=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/,Object.defineProperty(m,"__esModule",{value:!0}),m.JudgeUtil=void 0;const I=R;m.JudgeUtil=class{static isIgnoreChar(u){return"string"==typeof u&&("\t"===u||"\v"===u||"\f"===u||" "===u||" "===u||"\ufeff"===u||"\n"===u||"\r"===u||"\u2028"===u||"\u2029"===u)}static isSpaceSeparator(u){return"string"==typeof u&&I.Unicode.SPACE_SEPARATOR.test(u)}static isIdStartChar(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||I.Unicode.ID_START.test(u))}static isIdContinueChar(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"‌"===u||"‍"===u||I.Unicode.ID_CONTINUE.test(u))}static isDigitWithoutZero(u){return/[1-9]/.test(u)}static isDigit(u){return"string"==typeof u&&/[0-9]/.test(u)}static isHexDigit(u){return"string"==typeof u&&/[0-9A-Fa-f]/.test(u)}};var N=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(g,"__esModule",{value:!0}),g.parseJsonText=g.parseJsonFile=void 0;const b=N(e),S=N(D),w=N(u),H=m;var x;!function(u){u[u.Char=0]="Char",u[u.EOF=1]="EOF",u[u.Identifier=2]="Identifier"}(x||(x={}));let M,T,V,G,j,J,W="start",U=[],L=0,$=1,k=0,K=!1,z="default",q="'",Z=1;function X(u,D=!1){T=String(u),W="start",U=[],L=0,$=1,k=0,G=void 0,K=D;do{M=Q(),nu[W]()}while("eof"!==M.type);return G}function Q(){for(z="default",j="",q="'",Z=1;;){J=Y();const u=Du[z]();if(u)return u}}function Y(){if(T[L])return String.fromCodePoint(T.codePointAt(L))}function uu(){const u=Y();return"\n"===u?($++,k=0):u?k+=u.length:k++,u&&(L+=u.length),u}g.parseJsonFile=function(u,D=!1,e="utf-8"){const t=b.default.readFileSync(w.default.resolve(u),{encoding:e});try{return X(t,D)}catch(D){if(D instanceof SyntaxError){const e=D.message.split("at");if(2===e.length)throw new Error(`${e[0].trim()}${S.default.EOL}\t at ${u}:${e[1].trim()}`)}throw new Error(`${u} is not in valid JSON/JSON5 format.`)}},g.parseJsonText=X;const Du={default(){switch(J){case"/":return uu(),void(z="comment");case void 0:return uu(),eu("eof")}if(!H.JudgeUtil.isIgnoreChar(J)&&!H.JudgeUtil.isSpaceSeparator(J))return Du[W]();uu()},start(){z="value"},beforePropertyName(){switch(J){case"$":case"_":return j=uu(),void(z="identifierName");case"\\":return uu(),void(z="identifierNameStartEscape");case"}":return eu("punctuator",uu());case'"':case"'":return q=J,uu(),void(z="string")}if(H.JudgeUtil.isIdStartChar(J))return j+=uu(),void(z="identifierName");throw Eu(x.Char,uu())},afterPropertyName(){if(":"===J)return eu("punctuator",uu());throw Eu(x.Char,uu())},beforePropertyValue(){z="value"},afterPropertyValue(){switch(J){case",":case"}":return eu("punctuator",uu())}throw Eu(x.Char,uu())},beforeArrayValue(){if("]"===J)return eu("punctuator",uu());z="value"},afterArrayValue(){switch(J){case",":case"]":return eu("punctuator",uu())}throw Eu(x.Char,uu())},end(){throw Eu(x.Char,uu())},comment(){switch(J){case"*":return uu(),void(z="multiLineComment");case"/":return uu(),void(z="singleLineComment")}throw Eu(x.Char,uu())},multiLineComment(){switch(J){case"*":return uu(),void(z="multiLineCommentAsterisk");case void 0:throw Eu(x.Char,uu())}uu()},multiLineCommentAsterisk(){switch(J){case"*":return void uu();case"/":return uu(),void(z="default");case void 0:throw Eu(x.Char,uu())}uu(),z="multiLineComment"},singleLineComment(){switch(J){case"\n":case"\r":case"\u2028":case"\u2029":return uu(),void(z="default");case void 0:return uu(),eu("eof")}uu()},value(){switch(J){case"{":case"[":return eu("punctuator",uu());case"n":return uu(),tu("ull"),eu("null",null);case"t":return uu(),tu("rue"),eu("boolean",!0);case"f":return uu(),tu("alse"),eu("boolean",!1);case"-":case"+":return"-"===uu()&&(Z=-1),void(z="numerical");case".":case"0":case"I":case"N":return void(z="numerical");case'"':case"'":return q=J,uu(),j="",void(z="string")}if(void 0===J||!H.JudgeUtil.isDigitWithoutZero(J))throw Eu(x.Char,uu());z="numerical"},numerical(){switch(J){case".":return j=uu(),void(z="decimalPointLeading");case"0":return j=uu(),void(z="zero");case"I":return uu(),tu("nfinity"),eu("numeric",Z*(1/0));case"N":return uu(),tu("aN"),eu("numeric",NaN)}if(void 0!==J&&H.JudgeUtil.isDigitWithoutZero(J))return j=uu(),void(z="decimalInteger");throw Eu(x.Char,uu())},zero(){switch(J){case".":case"e":case"E":return void(z="decimal");case"x":case"X":return j+=uu(),void(z="hexadecimal")}return eu("numeric",0)},decimalInteger(){switch(J){case".":case"e":case"E":return void(z="decimal")}if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},decimal(){switch(J){case".":j+=uu(),z="decimalFraction";break;case"e":case"E":j+=uu(),z="decimalExponent"}},decimalPointLeading(){if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalFraction");throw Eu(x.Char,uu())},decimalFraction(){switch(J){case"e":case"E":return j+=uu(),void(z="decimalExponent")}if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},decimalExponent(){switch(J){case"+":case"-":return j+=uu(),void(z="decimalExponentSign")}if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalExponentInteger");throw Eu(x.Char,uu())},decimalExponentSign(){if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalExponentInteger");throw Eu(x.Char,uu())},decimalExponentInteger(){if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},hexadecimal(){if(H.JudgeUtil.isHexDigit(J))return j+=uu(),void(z="hexadecimalInteger");throw Eu(x.Char,uu())},hexadecimalInteger(){if(!H.JudgeUtil.isHexDigit(J))return eu("numeric",Z*Number(j));j+=uu()},identifierNameStartEscape(){if("u"!==J)throw Eu(x.Char,uu());uu();const u=ru();switch(u){case"$":case"_":break;default:if(!H.JudgeUtil.isIdStartChar(u))throw Eu(x.Identifier)}j+=u,z="identifierName"},identifierName(){switch(J){case"$":case"_":case"‌":case"‍":return void(j+=uu());case"\\":return uu(),void(z="identifierNameEscape")}if(!H.JudgeUtil.isIdContinueChar(J))return eu("identifier",j);j+=uu()},identifierNameEscape(){if("u"!==J)throw Eu(x.Char,uu());uu();const u=ru();switch(u){case"$":case"_":case"‌":case"‍":break;default:if(!H.JudgeUtil.isIdContinueChar(u))throw Eu(x.Identifier)}j+=u,z="identifierName"},string(){switch(J){case"\\":return uu(),void(j+=function(){const u=Y(),D=function(){switch(Y()){case"b":return uu(),"\b";case"f":return uu(),"\f";case"n":return uu(),"\n";case"r":return uu(),"\r";case"t":return uu(),"\t";case"v":return uu(),"\v"}return}();if(D)return D;switch(u){case"0":if(uu(),H.JudgeUtil.isDigit(Y()))throw Eu(x.Char,uu());return"\0";case"x":return uu(),function(){let u="",D=Y();if(!H.JudgeUtil.isHexDigit(D))throw Eu(x.Char,uu());if(u+=uu(),D=Y(),!H.JudgeUtil.isHexDigit(D))throw Eu(x.Char,uu());return u+=uu(),String.fromCodePoint(parseInt(u,16))}();case"u":return uu(),ru();case"\n":case"\u2028":case"\u2029":return uu(),"";case"\r":return uu(),"\n"===Y()&&uu(),""}if(void 0===u||H.JudgeUtil.isDigitWithoutZero(u))throw Eu(x.Char,uu());return uu()}());case'"':case"'":if(J===q){const u=eu("string",j);return uu(),u}return void(j+=uu());case"\n":case"\r":case void 0:throw Eu(x.Char,uu());case"\u2028":case"\u2029":!function(u){console.warn(`JSON5: '${Fu(u)}' in strings is not valid ECMAScript; consider escaping.`)}(J)}j+=uu()}};function eu(u,D){return{type:u,value:D,line:$,column:k}}function tu(u){for(const D of u){if(Y()!==D)throw Eu(x.Char,uu());uu()}}function ru(){let u="",D=4;for(;D-- >0;){const D=Y();if(!H.JudgeUtil.isHexDigit(D))throw Eu(x.Char,uu());u+=uu()}return String.fromCodePoint(parseInt(u,16))}const nu={start(){if("eof"===M.type)throw Eu(x.EOF);iu()},beforePropertyName(){switch(M.type){case"identifier":case"string":return V=M.value,void(W="afterPropertyName");case"punctuator":return void Cu();case"eof":throw Eu(x.EOF)}},afterPropertyName(){if("eof"===M.type)throw Eu(x.EOF);W="beforePropertyValue"},beforePropertyValue(){if("eof"===M.type)throw Eu(x.EOF);iu()},afterPropertyValue(){if("eof"===M.type)throw Eu(x.EOF);switch(M.value){case",":return void(W="beforePropertyName");case"}":Cu()}},beforeArrayValue(){if("eof"===M.type)throw Eu(x.EOF);"punctuator"!==M.type||"]"!==M.value?iu():Cu()},afterArrayValue(){if("eof"===M.type)throw Eu(x.EOF);switch(M.value){case",":return void(W="beforeArrayValue");case"]":Cu()}},end(){}};function iu(){const u=function(){let u;switch(M.type){case"punctuator":switch(M.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=M.value}return u}();if(K&&"object"==typeof u&&(u._line=$,u._column=k),void 0===G)G=u;else{const D=U[U.length-1];Array.isArray(D)?K&&"object"!=typeof u?D.push({value:u,_line:$,_column:k}):D.push(u):D[V]=K&&"object"!=typeof u?{value:u,_line:$,_column:k}:u}!function(u){if(u&&"object"==typeof u)U.push(u),W=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{const u=U[U.length-1];W=u?Array.isArray(u)?"afterArrayValue":"afterPropertyValue":"end"}}(u)}function Cu(){U.pop();const u=U[U.length-1];W=u?Array.isArray(u)?"afterArrayValue":"afterPropertyValue":"end"}function Fu(u){const D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){const D=u.charCodeAt(0).toString(16);return`\\x${`00${D}`.substring(D.length)}`}return u}function Eu(u,D){let e="";switch(u){case x.Char:e=void 0===D?`JSON5: invalid end of input at ${$}:${k}`:`JSON5: invalid character '${Fu(D)}' at ${$}:${k}`;break;case x.EOF:e=`JSON5: invalid end of input at ${$}:${k}`;break;case x.Identifier:k-=5,e=`JSON5: invalid identifier character at ${$}:${k}`}const t=new Au(e);return t.lineNumber=$,t.columnNumber=k,t}class Au extends SyntaxError{}var ou={},au=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),cu=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),su=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&au(D,u,e);return cu(D,u),D},lu=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(ou,"__esModule",{value:!0}),ou.isFileExists=ou.offlinePluginConversion=ou.executeCommand=ou.getNpmPath=ou.hasNpmPackInPaths=void 0;const Bu=r,du=lu(e),fu=su(u),_u=i,pu=l;ou.hasNpmPackInPaths=function(u,D){try{return require.resolve(u,{paths:[...D]}),!0}catch(u){return!1}},ou.getNpmPath=function(){const u=process.execPath;return fu.join(fu.dirname(u),_u.NPM_TOOL)},ou.executeCommand=function(u,D,e){0!==(0,Bu.spawnSync)(u,D,e).status&&(0,pu.logErrorAndExit)(`Error: ${u} ${D} execute failed.See above for details.`)},ou.offlinePluginConversion=function(u,D){return D.startsWith("file:")||D.endsWith(".tgz")?fu.resolve(u,_u.HVIGOR,D.replace("file:","")):D},ou.isFileExists=function(u){return du.default.existsSync(u)&&du.default.statSync(u).isFile()};var Ou=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),hu=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),Pu=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&Ou(D,u,e);return hu(D,u),D},vu=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(P,"__esModule",{value:!0});var gu=P.initProjectWorkSpace=void 0;const mu=Pu(e),Ru=vu(D),yu=Pu(u),Iu=v,Nu=i,bu=g,Su=l,wu=ou;let Hu,xu,Mu;function Tu(u,D,e){return void 0!==e.dependencies&&(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,D.dependencies[u])===yu.normalize(e.dependencies[u])}function Vu(){const u=yu.join(Mu,Nu.WORK_SPACE);if((0,Su.logInfoPrintConsole)("Hvigor cleaning..."),!mu.existsSync(u))return;const D=mu.readdirSync(u);if(!D||0===D.length)return;const e=yu.resolve(Mu,"node_modules","@ohos","hvigor","bin","hvigor.js");mu.existsSync(e)&&(0,wu.executeCommand)(process.argv[0],[e,"--stop-daemon"],{});try{D.forEach((D=>{mu.rmSync(yu.resolve(u,D),{recursive:!0})}))}catch(D){(0,Su.logErrorAndExit)(`The hvigor build tool cannot be installed. Please manually clear the workspace directory and synchronize the project again.\n\n Workspace Path: ${u}.`)}}gu=P.initProjectWorkSpace=function(){if(Hu=function(){const u=yu.resolve(Nu.HVIGOR_PROJECT_WRAPPER_HOME,Nu.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME);mu.existsSync(u)||(0,Su.logErrorAndExit)(`Error: Hvigor config file ${u} does not exist.`);return(0,bu.parseJsonFile)(u)}(),Mu=function(u){let D;D=function(u){let D=u.hvigorVersion;if(D.startsWith("file:")||D.endsWith(".tgz"))return!1;const e=u.dependencies,t=Object.getOwnPropertyNames(e);for(const u of t){const D=e[u];if(D.startsWith("file:")||D.endsWith(".tgz"))return!1}if(1===t.length&&"@ohos/hvigor-ohos-plugin"===t[0])return D>"2.5.0";return!1}(u)?function(u){let D=`${Nu.HVIGOR_ENGINE_PACKAGE_NAME}@${u.hvigorVersion}`;const e=u.dependencies;if(e){Object.getOwnPropertyNames(e).sort().forEach((u=>{D+=`,${u}@${e[u]}`}))}return(0,Iu.hash)(D)}(u):(0,Iu.hash)(process.cwd());return yu.resolve(Ru.default.homedir(),".hvigor","project_caches",D)}(Hu),xu=function(){const u=yu.resolve(Mu,Nu.WORK_SPACE,Nu.DEFAULT_PACKAGE_JSON);return mu.existsSync(u)?(0,bu.parseJsonFile)(u):{dependencies:{}}}(),!(0,wu.hasNpmPackInPaths)(Nu.HVIGOR_ENGINE_PACKAGE_NAME,[yu.join(Mu,Nu.WORK_SPACE)])||(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,Hu.hvigorVersion)!==xu.dependencies[Nu.HVIGOR_ENGINE_PACKAGE_NAME]||!function(){function u(u){const D=null==u?void 0:u.dependencies;return void 0===D?0:Object.getOwnPropertyNames(D).length}const D=u(Hu),e=u(xu);if(D+1!==e)return!1;for(const u in null==Hu?void 0:Hu.dependencies)if(!(0,wu.hasNpmPackInPaths)(u,[yu.join(Mu,Nu.WORK_SPACE)])||!Tu(u,Hu,xu))return!1;return!0}()){Vu();try{!function(){(0,Su.logInfoPrintConsole)("Hvigor installing...");for(const u in Hu.dependencies)Hu.dependencies[u]&&(Hu.dependencies[u]=(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,Hu.dependencies[u]));const u={dependencies:{...Hu.dependencies}};u.dependencies[Nu.HVIGOR_ENGINE_PACKAGE_NAME]=(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,Hu.hvigorVersion);const D=yu.join(Mu,Nu.WORK_SPACE);try{mu.mkdirSync(D,{recursive:!0});const e=yu.resolve(D,Nu.DEFAULT_PACKAGE_JSON);mu.writeFileSync(e,JSON.stringify(u))}catch(u){(0,Su.logErrorAndExit)(u)}(function(){const u=["config","set","store-dir",Nu.HVIGOR_PNPM_STORE_PATH],D={cwd:yu.join(Mu,Nu.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,wu.executeCommand)(Nu.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,u,D)})(),function(){const u=["install"],D={cwd:yu.join(Mu,Nu.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,wu.executeCommand)(Nu.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,u,D)}(),(0,Su.logInfoPrintConsole)("Hvigor install success.")}()}catch(u){Vu()}}return Mu};var Gu={};!function(t){var C=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),F=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),E=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&C(D,u,e);return F(D,u),D},A=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(t,"__esModule",{value:!0}),t.executeInstallPnpm=t.isPnpmInstalled=t.environmentHandler=t.checkNpmConifg=t.PNPM_VERSION=void 0;const o=r,a=E(e),c=A(D),s=E(u),B=i,d=l,f=ou;t.PNPM_VERSION="7.30.0",t.checkNpmConifg=function(){const u=s.resolve(B.HVIGOR_PROJECT_ROOT_DIR,".npmrc"),D=s.resolve(c.default.homedir(),".npmrc");if((0,f.isFileExists)(u)||(0,f.isFileExists)(D))return;const e=(0,f.getNpmPath)(),t=(0,o.spawnSync)(e,["config","get","prefix"],{cwd:B.HVIGOR_PROJECT_ROOT_DIR});if(0!==t.status||!t.stdout)return void(0,d.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.");const r=s.resolve(`${t.stdout}`.replace(/[\r\n]/gi,""),".npmrc");(0,f.isFileExists)(r)||(0,d.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.")},t.environmentHandler=function(){process.env["npm_config_update-notifier"]="false"},t.isPnpmInstalled=function(){return!!a.existsSync(B.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH)&&(0,f.hasNpmPackInPaths)("pnpm",[B.HVIGOR_WRAPPER_TOOLS_HOME])},t.executeInstallPnpm=function(){(0,d.logInfoPrintConsole)(`Installing pnpm@${t.PNPM_VERSION}...`);const u=(0,f.getNpmPath)();!function(){const u=s.resolve(B.HVIGOR_WRAPPER_TOOLS_HOME,B.DEFAULT_PACKAGE_JSON);try{a.existsSync(B.HVIGOR_WRAPPER_TOOLS_HOME)||a.mkdirSync(B.HVIGOR_WRAPPER_TOOLS_HOME,{recursive:!0});const D={dependencies:{}};D.dependencies[B.PNPM]=t.PNPM_VERSION,a.writeFileSync(u,JSON.stringify(D))}catch(D){(0,d.logErrorAndExit)(`Error: EPERM: operation not permitted,create ${u} failed.`)}}(),(0,f.executeCommand)(u,["install","pnpm"],{cwd:B.HVIGOR_WRAPPER_TOOLS_HOME,stdio:["inherit","inherit","inherit"],env:process.env}),(0,d.logInfoPrintConsole)("Pnpm install success.")}}(Gu),function(){Gu.checkNpmConifg(),Gu.environmentHandler(),Gu.isPnpmInstalled()||Gu.executeInstallPnpm();const D=gu();_(u.join(D,i.WORK_SPACE))}(); \ No newline at end of file diff --git a/filestoraging/filestorage/hvigorfile.ts b/filestoraging/filestorage/hvigorfile.ts new file mode 100644 index 0000000..f3cb9f1 --- /dev/null +++ b/filestoraging/filestorage/hvigorfile.ts @@ -0,0 +1,6 @@ +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/filestoraging/filestorage/hvigorw b/filestoraging/filestorage/hvigorw new file mode 100644 index 0000000..ff6a29a --- /dev/null +++ b/filestoraging/filestorage/hvigorw @@ -0,0 +1,48 @@ +#!/bin/bash + +# ---------------------------------------------------------------------------- +# Hvigor startup script, version 1.0.0 +# +# Required ENV vars: +# ------------------ +# NODE_HOME - location of a Node home dir +# or +# Add /usr/local/nodejs/bin to the PATH environment variable +# ---------------------------------------------------------------------------- + +HVIGOR_APP_HOME="`pwd -P`" +HVIGOR_WRAPPER_SCRIPT=${HVIGOR_APP_HOME}/hvigor/hvigor-wrapper.js +warn() { + echo "" + echo -e "\033[1;33m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m" +} + +error() { + echo "" + echo -e "\033[1;31m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m" +} + +fail() { + error "$@" + exit 1 +} + +# Determine node to start hvigor wrapper script +if [ -n "${NODE_HOME}" ];then + EXECUTABLE_NODE="${NODE_HOME}/bin/node" + if [ ! -x "$EXECUTABLE_NODE" ];then + fail "ERROR: NODE_HOME is set to an invalid directory,check $NODE_HOME\n\nPlease set NODE_HOME in your environment to the location where your nodejs installed" + fi +else + EXECUTABLE_NODE="node" + which ${EXECUTABLE_NODE} > /dev/null 2>&1 || fail "ERROR: NODE_HOME is not set and not 'node' command found in your path" +fi + +# Check hvigor wrapper script +if [ ! -r "$HVIGOR_WRAPPER_SCRIPT" ];then + fail "ERROR: Couldn't find hvigor/hvigor-wrapper.js in ${HVIGOR_APP_HOME}" +fi + +# start hvigor-wrapper script +exec "${EXECUTABLE_NODE}" \ + "${HVIGOR_WRAPPER_SCRIPT}" "$@" diff --git a/filestoraging/filestorage/hvigorw.bat b/filestoraging/filestorage/hvigorw.bat new file mode 100644 index 0000000..d570007 --- /dev/null +++ b/filestoraging/filestorage/hvigorw.bat @@ -0,0 +1,64 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Hvigor startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +set WRAPPER_MODULE_PATH=%APP_HOME%\hvigor\hvigor-wrapper.js +set NODE_EXE=node.exe + +goto start + +:start +@rem Find node.exe +if defined NODE_HOME goto findNodeFromNodeHome + +%NODE_EXE% --version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH. +echo. +echo Please set the NODE_HOME variable in your environment to match the +echo location of your NodeJs installation. + +goto fail + +:findNodeFromNodeHome +set NODE_HOME=%NODE_HOME:"=% +set NODE_EXE_PATH=%NODE_HOME%/%NODE_EXE% + +if exist "%NODE_EXE_PATH%" goto execute +echo. +echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH. +echo. +echo Please set the NODE_HOME variable in your environment to match the +echo location of your NodeJs installation. + +goto fail + +:execute +@rem Execute hvigor +"%NODE_EXE%" "%WRAPPER_MODULE_PATH%" %* + +if "%ERRORLEVEL%" == "0" goto hvigorwEnd + +:fail +exit /b 1 + +:hvigorwEnd +if "%OS%" == "Windows_NT" endlocal + +:end diff --git a/filestoraging/filestorage/oh-package-lock.json5 b/filestoraging/filestorage/oh-package-lock.json5 new file mode 100644 index 0000000..ddc8a54 --- /dev/null +++ b/filestoraging/filestorage/oh-package-lock.json5 @@ -0,0 +1,13 @@ +{ + "lockfileVersion": 1, + "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", + "specifiers": { + "@ohos/hypium@1.0.11": "@ohos/hypium@1.0.11" + }, + "packages": { + "@ohos/hypium@1.0.11": { + "resolved": "https://repo.harmonyos.com/ohpm/@ohos/hypium/-/hypium-1.0.11.tgz", + "integrity": "sha512-KawcLnv43C3QIYv1UbDnKCFX3MohtDxGuFvzlUxT/qf2DBilR56Ws6zrj90LdH6PjloJQwOPESuBQIHBACAK7w==" + } + } +} \ No newline at end of file diff --git a/filestoraging/filestorage/oh-package.json5 b/filestoraging/filestorage/oh-package.json5 new file mode 100644 index 0000000..705bed2 --- /dev/null +++ b/filestoraging/filestorage/oh-package.json5 @@ -0,0 +1,12 @@ +{ + "license": "", + "devDependencies": { + "@ohos/hypium": "1.0.11" + }, + "author": "", + "name": "filereality", + "description": "Please describe the basic information.", + "main": "", + "version": "1.0.0", + "dependencies": {} +}