diff --git a/.gitignore b/.gitignore index fd58715a10be52e996476d92986e2588d7e1bfe6..a4a85d06e68c04eba4739baa6e7d518e8aa33980 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,11 @@ /node_modules +/oh_modules /local.properties /.idea **/build /signature /.hvigor -/package.json \ No newline at end of file +/package.json +/.clang-format +**/oh-package-lock.json5 +**/BuildProfile.ets \ No newline at end of file diff --git a/OAT.xml b/OAT.xml index 38f00bed8622a633a4a40fe77dedbda997452180..7dc37cd8b708b5567cb92925e58cebcc5c410dfc 100644 --- a/OAT.xml +++ b/OAT.xml @@ -74,6 +74,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/README_zh.md b/README_zh.md index b4acd1ab7046378130edf9f1da8c6b2218e66adc..9eedf67ebaa7021ad432ff15585aa6d2386b9c50 100644 --- a/README_zh.md +++ b/README_zh.md @@ -136,6 +136,14 @@ hilog | grep 过滤信息 hilog | grep Label ``` +## 5.约束与限制 + +1.本示例仅支持标准系统上运行,支持设备RK3568。 + +2.本示例已适配API14版本SDK,SDK版本号(API Version 14 5.0.2),镜像版本号(5.0.2)。 + +3.本示例需要使用DevEco Studio 5.0.2 Release版本才可编译运行。 + ## 相关仓 系统应用 diff --git a/build-profile.json5 b/build-profile.json5 index 4912ee0b9357ada8e67cdf105e884f615028a2f0..1adbdc0a47768a34efb0340309ca7b2da0affbec 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -20,8 +20,9 @@ { "name": "default", "signingConfig": "default", - "compileSdkVersion": 10, - "compatibleSdkVersion": 9 + "compileSdkVersion": 14, + "compatibleSdkVersion": 14, + "runtimeOS": "OpenHarmony" } ], "signingConfigs": [ diff --git a/common/resources/.gitignore b/common/resources/.gitignore index a5c564ae6da6b5e2336628d9f9e2155bddfc399d..725ae7072d7e7c2ab5b266c3012221ada16e2552 100644 --- a/common/resources/.gitignore +++ b/common/resources/.gitignore @@ -1,4 +1,5 @@ /node_modules +/oh_modules /.preview /build /package.json \ No newline at end of file diff --git a/common/resources/src/main/resources/rawfile/editor_style.css b/common/resources/src/main/resources/rawfile/editor_style.css index d1b0ec660b7e8ca942bea9702b559e03684403cd..65144b1ac953053087cf0f239e7782f3678707c9 100644 --- a/common/resources/src/main/resources/rawfile/editor_style.css +++ b/common/resources/src/main/resources/rawfile/editor_style.css @@ -98,7 +98,7 @@ body { background-color: white; display: none; justify-content: space-around; - padding-bottom: 6px; + padding-bottom: 50px; } .button-box div { diff --git a/common/resources/src/main/resources/rawfile/rich_editor.js b/common/resources/src/main/resources/rawfile/rich_editor.js index 3da5dbf9cc10205baddf7682b7e4341f18cd0c5f..79e28e522714cc032c3c6a3f476e5ddaa69850a2 100644 --- a/common/resources/src/main/resources/rawfile/rich_editor.js +++ b/common/resources/src/main/resources/rawfile/rich_editor.js @@ -13,7 +13,7 @@ * limitations under the License. */ -var RICH_EDITOR = {}; +let RICH_EDITOR = {}; let storage = window.localStorage; RICH_EDITOR.editor = document.getElementById('editorjs_box'); @@ -22,7 +22,7 @@ RICH_EDITOR.setHtml = function (contents) { if (contents) { RICH_EDITOR.editor.style.paddingLeft = paddingLeft + 'px'; } - var base64regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/; + let base64regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/; if (base64regex.test(contents)) { RICH_EDITOR.editor.innerHTML = decodeURIComponent(escape(atob(contents))); } else { @@ -67,18 +67,18 @@ RICH_EDITOR.setUnderline = function () { }; RICH_EDITOR.getListStyle = function () { - var selection; - var type; + let selection; + let type; if (window.getSelection) { selection = getSelection(); } if (!selection) { return; } - var range = selection.getRangeAt ? selection.getRangeAt(0) : selection.createRange(); + let range = selection.getRangeAt ? selection.getRangeAt(0) : selection.createRange(); try { - var child = range.commonAncestorContainer; - for (var i = 0; i < 10; i++) { + let child = range.commonAncestorContainer; + for (let i = 0; i < 10; i++) { if (child.nodeName === 'OL') { console.info('insertOrderedList'); document.execCommand('insertOrderedList', false, null); @@ -104,19 +104,21 @@ RICH_EDITOR.setNumbers = function () { if (listStyle === 'decimal') { return; } + let fontSize = document.queryCommandValue('fontSize'); document.execCommand('insertOrderedList', false, null); - var selection; - var type; + document.execCommand('fontSize', false, fontSize); + let selection; + let type; if (window.getSelection) { selection = getSelection(); } if (!selection) { return; } - var range = selection.getRangeAt ? selection.getRangeAt(0) : selection.createRange(); + let range = selection.getRangeAt ? selection.getRangeAt(0) : selection.createRange(); try { - var child = range.commonAncestorContainer; - for (var i = 0; i < 10; i++) { + let child = range.commonAncestorContainer; + for (let i = 0; i < 10; i++) { if (child.nodeName === 'OL') { child.style['list-style'] = 'decimal'; break; @@ -135,19 +137,21 @@ RICH_EDITOR.setABC = function () { if (listStyle === 'lower-alpha') { return; } + let fontSize = document.queryCommandValue('fontSize'); document.execCommand('insertOrderedList', false, null); - var selection; - var type; + document.execCommand('fontSize', false, fontSize); + let selection; + let type; if (window.getSelection) { selection = getSelection(); } if (!selection) { return; } - var range = selection.getRangeAt ? selection.getRangeAt(0) : selection.createRange(); + let range = selection.getRangeAt ? selection.getRangeAt(0) : selection.createRange(); try { - var child = range.commonAncestorContainer; - for (var i = 0; i < 10; i++) { + let child = range.commonAncestorContainer; + for (let i = 0; i < 10; i++) { if (child.nodeName === 'OL') { child.style['list-style'] = 'lower-alpha'; break; @@ -166,19 +170,21 @@ RICH_EDITOR.setBullets = function () { if (listStyle === 'disc') { return; } + let fontSize = document.queryCommandValue('fontSize'); document.execCommand('insertUnorderedList', false, null); - var selection; - var type; + document.execCommand('fontSize', false, fontSize); + let selection; + let type; if (window.getSelection) { selection = getSelection(); } if (!selection) { return; } - var range = selection.getRangeAt ? selection.getRangeAt(0) : selection.createRange(); + let range = selection.getRangeAt ? selection.getRangeAt(0) : selection.createRange(); try { - var child = range.commonAncestorContainer; - for (var i = 0; i < 10; i++) { + let child = range.commonAncestorContainer; + for (let i = 0; i < 10; i++) { if (child.nodeName === 'UL') { child.style['list-style'] = 'disc'; break; @@ -197,19 +203,21 @@ RICH_EDITOR.setSquare = function () { if (listStyle === 'square') { return; } + let fontSize = document.queryCommandValue('fontSize'); document.execCommand('insertUnorderedList', false, null); - var selection; - var type; + document.execCommand('fontSize', false, fontSize); + let selection; + let type; if (window.getSelection) { selection = getSelection(); } if (!selection) { return; } - var range = selection.getRangeAt ? selection.getRangeAt(0) : selection.createRange(); + let range = selection.getRangeAt ? selection.getRangeAt(0) : selection.createRange(); try { - var child = range.commonAncestorContainer; - for (var i = 0; i < 10; i++) { + let child = range.commonAncestorContainer; + for (let i = 0; i < 10; i++) { if (child.nodeName === 'UL') { child.style['list-style'] = 'square'; break; @@ -245,9 +253,9 @@ RICH_EDITOR.execFontSize = function (size, unit) { } }; -var pad = 24; +let pad = 24; RICH_EDITOR.setIndent = function () { - var parents = document.getElementById('editorjs_box'); + let parents = document.getElementById('editorjs_box'); parents.removeAttribute('padding-left'); if (pad >= 408) { return; @@ -261,7 +269,7 @@ RICH_EDITOR.setIndent = function () { }; RICH_EDITOR.setOutdent = function () { - var parents = document.getElementById('editorjs_box'); + let parents = document.getElementById('editorjs_box'); parents.removeAttribute('padding-left'); if (pad === 24) { parents.style.paddingLeft = 24 + 'px'; @@ -292,7 +300,7 @@ RICH_EDITOR.setJustifyRight = function () { }; RICH_EDITOR.insertImage = function (url) { - var html = '

picvision

'; document.getElementById('editorjs_box').innerHTML += html; @@ -304,15 +312,15 @@ RICH_EDITOR.insertHTML = function (html) { }; RICH_EDITOR.setDone = function () { - var html = '  '; + let html = '  '; document.execCommand('insertHTML', false, html); }; RICH_EDITOR.addTodo = function (e) { - var KEY_ENTER; + let KEY_ENTER; KEY_ENTER = 13; if (e.which === KEY_ENTER) { - var node = RICH_EDITOR.getSelectedAnchorNode(); + let node = RICH_EDITOR.getSelectedAnchorNode(); if (node && node.nodeName === '#text') { node = node.parentElement; } @@ -325,9 +333,9 @@ RICH_EDITOR.addTodo = function (e) { }; RICH_EDITOR.setTodo = function () { - var parent = document.getElementById('editorjs_box'); - var isContentEmpty = parent.innerHTML.trim().length === 0 || parent.innerHTML === '
'; - var html = (isContentEmpty ? '' : '
') + + let parent = document.getElementById('editorjs_box'); + let isContentEmpty = parent.innerHTML.trim().length === 0 || parent.innerHTML === '
'; + let html = (isContentEmpty ? '' : '
') + ' ' + '' + ' '; @@ -343,9 +351,9 @@ function onCheckChange(checkbox) { } RICH_EDITOR.restorerange = function () { - var selection = window.getSelection(); + let selection = window.getSelection(); selection.removeAllRanges(); - var range = document.createRange(); + let range = document.createRange(); range.setStart(RICH_EDITOR.currentSelection.startContainer, RICH_EDITOR.currentSelection.startOffset); range.setEnd(RICH_EDITOR.currentSelection.endContainer, RICH_EDITOR.currentSelection.endOffset); selection.addRange(range); @@ -354,15 +362,15 @@ RICH_EDITOR.restorerange = function () { // 获取光标开始位置归属节点 RICH_EDITOR.getSelectedAnchorNode = function () { - var node; - var selection; + let node; + let selection; if (window.getSelection) { selection = getSelection(); node = selection.anchorNode; } if (!node && document.selection) { selection = document.selection; - var range = selection.getRangeAt ? selection.getRangeAt(0) : selection.createRange(); + let range = selection.getRangeAt ? selection.getRangeAt(0) : selection.createRange(); node = range.commonAncestorContainer ? range.commonAncestorContainer : range.parentElement ? range.parentElement() : range.item(0); } @@ -370,30 +378,30 @@ RICH_EDITOR.getSelectedAnchorNode = function () { }; RICH_EDITOR.cancelSelection = function () { - var selection = window.getSelection(); + let selection = window.getSelection(); selection.removeAllRanges(); }; -var callBackToApp; +let callBackToApp = window.callBackToApp; function getHtmlContent() { console.log('getHtmlContent'); - var htmlString = RICH_EDITOR.getHtml(); + let htmlString = RICH_EDITOR.getHtml(); let imgName = getImagePathFromContent(htmlString); htmlString = window.btoa(unescape(encodeURIComponent(htmlString))); callBackToApp.callbackImagePath(imgName); - var str = callBackToApp.callbackhtml(htmlString); + let str = callBackToApp.callbackhtml(htmlString); console.log('getHtmlContent end'); } function saveHtmlContent() { console.log('saveHtmlContent'); - var htmlString = RICH_EDITOR.getHtml(); + let htmlString = RICH_EDITOR.getHtml(); let imgName = getImagePathFromContent(htmlString); htmlString = window.btoa(unescape(encodeURIComponent(htmlString))); callBackToApp.callbackImagePath(imgName); - var str = callBackToApp.callbackhtmlSave(htmlString); + let str = callBackToApp.callbackhtmlSave(htmlString); console.log('saveHtmlContent end'); } @@ -418,11 +426,11 @@ function getImagePathFromContent(contentInfo) { function scheduledSaveContent() { if (callBackToApp !== undefined) { console.info('scheduledSaveContent'); - var htmlString = RICH_EDITOR.getHtml(); + let htmlString = RICH_EDITOR.getHtml(); let imgName = getImagePathFromContent(htmlString); htmlString = window.btoa(unescape(encodeURIComponent(htmlString))); callBackToApp.callbackImagePath(imgName); - var str = callBackToApp.callbackScheduledSave(htmlString); + let str = callBackToApp.callbackScheduledSave(htmlString); console.info('scheduledSaveContent end'); } } @@ -442,9 +450,9 @@ document.body.addEventListener('paste', (event) => { RICH_EDITOR.getFontSizes = function () { document.execCommand('fontSize', false, null); - var fontElements = window.getSelection().anchorNode.parentNode; - var getSize = parseInt(window.getComputedStyle(fontElements, null).fontSize); - var str = callBackToApp.callbackGetSize(getSize); + let fontElements = window.getSelection().anchorNode.parentNode; + let getSize = parseInt(window.getComputedStyle(fontElements, null).fontSize); + let str = callBackToApp.callbackGetSize(getSize); }; RICH_EDITOR.insertImageHtml = function (contents) { @@ -456,11 +464,12 @@ RICH_EDITOR.insertImageHtml = function (contents) { let img = document.createElement('img'); img.src = contents; selection.getRangeAt(0).insertNode(img); + return true; }; document.addEventListener('click', (e) => { console.info(`lsq: e is ${JSON.stringify(e)}`); - var parent = document.getElementById('editorjs_box'); + let parent = document.getElementById('editorjs_box'); if (parent.id !== 'editorjs_box') { e.preventDefault(); } diff --git a/common/utils/.gitignore b/common/utils/.gitignore index a5c564ae6da6b5e2336628d9f9e2155bddfc399d..725ae7072d7e7c2ab5b266c3012221ada16e2552 100644 --- a/common/utils/.gitignore +++ b/common/utils/.gitignore @@ -1,4 +1,5 @@ /node_modules +/oh_modules /.preview /build /package.json \ No newline at end of file diff --git a/common/utils/src/main/ets/default/access/MediaLibraryAccess.ets b/common/utils/src/main/ets/default/access/MediaLibraryAccess.ets index fbfdcf37db8bb1d75bd262b8c6c0defc0b1cd2d5..17b4ed357a230ca69e44a90314557139a3b7783c 100644 --- a/common/utils/src/main/ets/default/access/MediaLibraryAccess.ets +++ b/common/utils/src/main/ets/default/access/MediaLibraryAccess.ets @@ -13,14 +13,20 @@ * limitations under the License. */ -import {LogUtil} from '../baseUtil/LogUtil' import photoAccessHelper from '@ohos.file.photoAccessHelper'; +import common from '@ohos.app.ability.common'; +import { LogUtil } from '../baseUtil/LogUtil'; -const TAG = "MediaLibraryAccess" -export class MediaLibraryAccess { +const TAG: string = 'MediaLibraryAccess'; + +interface albumType { + count: number; + obj: photoAccessHelper.PhotoAsset | null; +} - static async getFirstObject(fetchOpt, context) { - let album = { +export class MediaLibraryAccess { + static async getFirstObject(fetchOpt: photoAccessHelper.FetchOptions, context: common.UIAbilityContext) { + let album: albumType = { count: 0, obj: null, } @@ -51,7 +57,7 @@ export class MediaLibraryAccess { } } - static async openAsset(mode: string, fileAsset: any) { + static async openAsset(mode: string, fileAsset: photoAccessHelper.PhotoAsset) { LogUtil.info(TAG, 'openAsset start') let fd = await fileAsset.open(mode); LogUtil.info(TAG, `openAsset end. fd: ${fd}`) @@ -64,7 +70,7 @@ export class MediaLibraryAccess { return fd; } - static async closeAsset(fd: number, fileAsset: any) { + static async closeAsset(fd: number, fileAsset: photoAccessHelper.PhotoAsset) { LogUtil.info(TAG, 'closeAsset start') if (fd <= 0) { diff --git a/common/utils/src/main/ets/default/baseUtil/DateUtil.ets b/common/utils/src/main/ets/default/baseUtil/DateUtil.ets index 75a1864a85cd8b2ecd876f56ce37a61c6c56fc70..f5c29dcb6d3ed7939ee7b43cdf01b6d335c6182c 100644 --- a/common/utils/src/main/ets/default/baseUtil/DateUtil.ets +++ b/common/utils/src/main/ets/default/baseUtil/DateUtil.ets @@ -13,15 +13,15 @@ * limitations under the License. */ -import {LogUtil} from './LogUtil' +import { LogUtil } from './LogUtil'; -const TAG = "DateUtil" +const TAG: string = 'DateUtil'; /** * 日期和时间均显示为2位数 * @param time */ -function getUnifiedTime(time: number): any { +function getUnifiedTime(time: number): string | number { return time > 9 ? time : "0" + time } @@ -33,7 +33,7 @@ export class DateUtil { * 获取笔记标题的格式化时间 * @param date note modified time */ - formateDateForNoteTitle(date: Date): string{ + formateDateForNoteTitle(date: Date): string { let nowDate = new Date() let diffMin = Math.floor((nowDate.getTime() - date.getTime()) / 1000 / 60) if (diffMin < 0) { @@ -88,7 +88,7 @@ export class DateUtil { * 获取笔记内容的格式化时间 * @param date note modified time */ - formateDateForNoteContent(date: Date): string{ + formateDateForNoteContent(date: Date): string { // formatted time let noteContentTime = "" // note modified time diff --git a/common/utils/src/main/ets/default/baseUtil/FolderUtil.ets b/common/utils/src/main/ets/default/baseUtil/FolderUtil.ets index 966f41411364fd383660a156abbcb0b01167266b..41607256014c925282f3f0b024d72ce1a2e42b8a 100644 --- a/common/utils/src/main/ets/default/baseUtil/FolderUtil.ets +++ b/common/utils/src/main/ets/default/baseUtil/FolderUtil.ets @@ -119,12 +119,12 @@ export class FolderUtil { if (folderData === undefined || folderData === null) { LogUtil.info(TAG, "isFolderMoveIn folderData undefined") } - if (folderData!.uuid === undefined || folderData!.uuid === null) { + if (folderData.uuid! === undefined || folderData.uuid! === null) { LogUtil.info(TAG, "isFolderMoveIn folderData uuid undefined") - folderData.uuid = 'sys_def_unClassified_uuid'; + folderData.uuid! == 'sys_def_unClassified_uuid'; } - LogUtil.info(TAG, "isFolderMoveIn folderDataUuid " + folderData.uuid) - return (folderData.uuid == SysDefFolderUuid.UnClassified || folderData.folder_type == FolderType.CusDef) + LogUtil.info(TAG, "isFolderMoveIn folderDataUuid " + folderData.uuid!); + return (folderData.uuid! == SysDefFolderUuid.UnClassified || folderData!.folder_type == FolderType.CusDef); } /** @@ -155,18 +155,18 @@ export class FolderUtil { */ getNoteCount(noteDataArray: NoteData[], folderUuid: string): number { let count = 0; - const folderTextMap = { - "sys_def_allNotes_uuid": (noteData) => { - noteData.is_deleted == Delete.No ? ++count : count + const folderTextMap: Record void> = { + "sys_def_allNotes_uuid": (noteData: NoteData) => { + noteData.is_deleted == Delete.No ? ++count : count; }, - "sys_def_recentDeletes_uuid": (noteData) => { - noteData.is_deleted == Delete.Yes ? ++count : count + "sys_def_recentDeletes_uuid": (noteData: NoteData) => { + noteData.is_deleted == Delete.Yes ? ++count : count; }, - "sys_def_myFavorites_uuid": (noteData) => { - noteData.is_favorite == Favorite.Yes && noteData.is_deleted == Delete.No ? ++count : count + "sys_def_myFavorites_uuid": (noteData: NoteData) => { + noteData.is_favorite == Favorite.Yes && noteData.is_deleted == Delete.No ? ++count : count; }, - "sys_def_other_uuid": (noteData) => { - noteData.folder_uuid == folderUuid && noteData.is_deleted == Delete.No ? ++count : count + "sys_def_other_uuid": (noteData: NoteData) => { + noteData.folder_uuid == folderUuid && noteData.is_deleted == Delete.No ? ++count : count; }, } if (folderUuid == SysDefFolderUuid.AllNotes || folderUuid == SysDefFolderUuid.RecentDeletes || folderUuid == SysDefFolderUuid.MyFavorites) { @@ -185,12 +185,12 @@ export class FolderUtil { * @param selectedNoteArray - Selected note data list * @return FolderData - return folder when note data list belong to the same folder, else return null */ - getCommonFolder(folderDataArray: FolderData[], selectedNoteArray: NoteData[]): FolderData { + getCommonFolder(folderDataArray: FolderData[], selectedNoteArray: NoteData[]): FolderData | null { if (selectedNoteArray.length == 0) { return null } let folderData: FolderData = this.getFolderData(folderDataArray, selectedNoteArray[0].folder_uuid) - let currentFolderData = null + let currentFolderData: string | null = null; selectedNoteArray.forEach((noteItem) => { if (folderData != this.getFolderData(folderDataArray, noteItem.folder_uuid)) { currentFolderData = this.getFolderData(folderDataArray, noteItem.folder_uuid).name @@ -211,11 +211,12 @@ export class FolderUtil { if (folderDataArray[index].folder_type == FolderType.CusDef && folderDataArray[index].name == inputStr) { return true } else { - let temp = GlobalResourceManager.getStringByResource(this.getFolderText(folderDataArray[index])) + let temp = GlobalResourceManager.getStringByResource(this.getFolderText(folderDataArray[index]) as Resource); temp.then(result => { if (result == inputStr) { return true } + return false; }) } } diff --git a/common/utils/src/main/ets/default/baseUtil/GlobalResourceManager.ets b/common/utils/src/main/ets/default/baseUtil/GlobalResourceManager.ets index 1676f3f03814c6974e3410c6743663e1f55cd7ef..317f8091d7b8021c99230dd1a3499d126a22c702 100644 --- a/common/utils/src/main/ets/default/baseUtil/GlobalResourceManager.ets +++ b/common/utils/src/main/ets/default/baseUtil/GlobalResourceManager.ets @@ -13,34 +13,34 @@ * limitations under the License. */ -import Rsm from '@ohos.resourceManager'; -import {LogUtil} from './LogUtil' +import common from '@ohos.app.ability.common'; +import { BusinessError } from '@ohos.base'; +import { LogUtil } from './LogUtil'; -const TAG = "Note_GlobalResourceManager" +const TAG: string = 'Note_GlobalResourceManager'; +let context = getContext(this) as common.UIAbilityContext; export class GlobalResourceManager { - public async getStringByResource(res: any): Promise { - let json = JSON.parse(JSON.stringify(res)); - let id = json.id; + public async getStringByResource(res: Resource): Promise { + let json: Resource = JSON.parse(JSON.stringify(res)); + let id: number = json.id; LogUtil.info(TAG, "ResourceID = " + id) return await this.getStringById(id); } - public getStringById(id: number): Promise{ + public getStringById(id: number): Promise { let promise = new Promise(resolve => { - let resourceMgr = Rsm.getResourceManager("com.example.note"); - resourceMgr.then((result) => { - result.getString(id) - .then((resource) => { - resolve(resource); - LogUtil.info(TAG, 'getStringById resolve(resource) : ' + resolve(resource)); - LogUtil.info(TAG, 'getStringById resource : ' + resource); - LogUtil.info(TAG, 'getStringById resource2 : ' + JSON.stringify(resource)); - }) - .catch((err) => { - LogUtil.info(TAG, 'getStringById err : ' + JSON.stringify(err)); - }); - }); + let resourceMgr = context.resourceManager; + resourceMgr.getStringValue(id) + .then((resource) => { + resolve(resource); + LogUtil.info(TAG, 'getStringById resolve(resource) : ' + resolve(resource)); + LogUtil.info(TAG, 'getStringById resource : ' + resource); + LogUtil.info(TAG, 'getStringById resource2 : ' + JSON.stringify(resource)); + }) + .catch((err: BusinessError) => { + LogUtil.error(TAG, 'getStringById err : ' + JSON.stringify(err)); + }); }); LogUtil.info(TAG, 'getStringById promise: ' + JSON.stringify(promise)); return promise; diff --git a/common/utils/src/main/ets/default/baseUtil/LogUtil.ets b/common/utils/src/main/ets/default/baseUtil/LogUtil.ts similarity index 100% rename from common/utils/src/main/ets/default/baseUtil/LogUtil.ets rename to common/utils/src/main/ets/default/baseUtil/LogUtil.ts diff --git a/common/utils/src/main/ets/default/baseUtil/NoteUtil.ets b/common/utils/src/main/ets/default/baseUtil/NoteUtil.ets index 5f1e0728b5f5f5eb0bb3b3d93c3dd398d6d96fba..8b477f9c7af20e56551c76e169a6c6ef2cdc579e 100644 --- a/common/utils/src/main/ets/default/baseUtil/NoteUtil.ets +++ b/common/utils/src/main/ets/default/baseUtil/NoteUtil.ets @@ -13,18 +13,24 @@ * limitations under the License. */ -import {unSelectedNoteBgColorMap, selectedNoteBgColorMap} from '../model/NoteBaseData' -import FolderData from '../model/databaseModel/FolderData' -import NoteData from '../model/databaseModel/NoteData' -import {SysDefFolderUuid, FolderType, Favorite, Delete, TableName, NoteTableColumn, -} from '../model/databaseModel/EnumData' -import StyleConstants from '../constants/StyleConstants' -import {LogUtil} from './LogUtil' -import FolderUtil from './FolderUtil' -import RdbStoreUtil from './RdbStoreUtil' +import { unSelectedNoteBgColorMap, selectedNoteBgColorMap } from '../model/NoteBaseData'; +import FolderData from '../model/databaseModel/FolderData'; +import NoteData from '../model/databaseModel/NoteData'; +import { + SysDefFolderUuid, + FolderType, + Favorite, + Delete, + TableName, + NoteTableColumn +} from '../model/databaseModel/EnumData'; +import StyleConstants from '../constants/StyleConstants'; +import { LogUtil } from './LogUtil'; +import FolderUtil from './FolderUtil'; +import RdbStoreUtil from './RdbStoreUtil'; import buffer from '@ohos.buffer'; -const TAG = "NoteUtil" +const TAG: string = 'NoteUtil'; export class NoteUtil { /** @@ -105,18 +111,18 @@ export class NoteUtil { */ getNoteCount(noteDataArray: NoteData[], folderData: FolderData): number { let count = 0; - const folderTextMap = { - "sys_def_allNotes_uuid": (noteData) => { - noteData.is_deleted == Delete.No ? ++count : count + const folderTextMap: Record void> = { + "sys_def_allNotes_uuid": (noteData: NoteData) => { + noteData.is_deleted == Delete.No ? ++count : count; }, - "sys_def_recentDeletes_uuid": (noteData) => { - noteData.is_deleted == Delete.Yes ? ++count : count + "sys_def_recentDeletes_uuid": (noteData: NoteData) => { + noteData.is_deleted == Delete.Yes ? ++count : count; }, - "sys_def_myFavorites_uuid": (noteData) => { - noteData.is_favorite == Favorite.Yes && noteData.is_deleted == Delete.No ? ++count : count + "sys_def_myFavorites_uuid": (noteData: NoteData) => { + noteData.is_favorite == Favorite.Yes && noteData.is_deleted == Delete.No ? ++count : count; }, - "sys_def_other_uuid": (noteData) => { - noteData.folder_uuid == folderData.uuid && noteData.is_deleted == Delete.No ? ++count : count + "sys_def_other_uuid": (noteData: NoteData) => { + noteData.folder_uuid == folderData.uuid && noteData.is_deleted == Delete.No ? ++count : count; } } if (folderData.uuid == SysDefFolderUuid.AllNotes || folderData.folder_type == FolderType.FeatureDef) { @@ -185,7 +191,7 @@ export class NoteUtil { // delete note from db let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, allNoteDataArray[index].uuid) - RdbStoreUtil.delete(predicates_note, null) + RdbStoreUtil.delete(predicates_note, null); allNoteDataArray.splice(index, 1); } index++ @@ -203,25 +209,25 @@ export class NoteUtil { LogUtil.info(TAG, "folderUuid " + folderUuid) this.autoDeleteNote(allNoteDataArray) let noteDataArray: NoteData[] = []; - let func = (noteData) => noteDataArray.push(noteData) - const folderTextMap = { - "sys_def_allNotes_uuid": (noteData) => { - noteData.is_deleted == Delete.No ? func(noteData) : null + let func = (noteData: NoteData) => noteDataArray.push(noteData); + const folderTextMap: Record void> = { + "sys_def_allNotes_uuid": (noteData: NoteData) => { + noteData.is_deleted == Delete.No ? func(noteData) : null; }, - "sys_def_recentDeletes_uuid": (noteData) => { - noteData.is_deleted == Delete.Yes ? func(noteData) : null + "sys_def_recentDeletes_uuid": (noteData: NoteData) => { + noteData.is_deleted == Delete.Yes ? func(noteData) : null; }, - "sys_def_myFavorites_uuid": (noteData) => { - noteData.is_favorite == Favorite.Yes && noteData.is_deleted == Delete.No ? func(noteData) : null + "sys_def_myFavorites_uuid": (noteData: NoteData) => { + noteData.is_favorite == Favorite.Yes && noteData.is_deleted == Delete.No ? func(noteData) : null; }, - "sys_def_other_uuid": (noteData) => { - noteData.folder_uuid == folderUuid && noteData.is_deleted == Delete.No ? func(noteData) : null + "sys_def_other_uuid": (noteData: NoteData) => { + noteData.folder_uuid == folderUuid && noteData.is_deleted == Delete.No ? func(noteData) : null; }, } if (folderUuid == SysDefFolderUuid.AllNotes || folderUuid == SysDefFolderUuid.RecentDeletes || folderUuid == SysDefFolderUuid.MyFavorites) { - allNoteDataArray.forEach(folderTextMap[folderUuid]) + allNoteDataArray.forEach(folderTextMap[folderUuid]); } else { - allNoteDataArray.forEach(folderTextMap["sys_def_other_uuid"]) + allNoteDataArray.forEach(folderTextMap.sys_def_other_uuid); } // Sort priority: 1、Top or not 2、created time noteDataArray.sort((noteItemLeft: NoteData, noteItemRight: NoteData) => { @@ -241,14 +247,14 @@ export class NoteUtil { * @param folderUuid * @return NoteData */ - getFirstNoteData(allNoteDataArray: NoteData[], folderUuid: string): NoteData { + getFirstNoteData(allNoteDataArray: NoteData[], folderUuid: string): NoteData | undefined { let noteDataArray: NoteData[] = this.getNoteDataArray(allNoteDataArray, folderUuid); - LogUtil.info(TAG, "get noteDataArray size " + noteDataArray.length.toString()) + LogUtil.info(TAG, "get noteDataArray size " + noteDataArray.length.toString()); if (noteDataArray.length == 0) { - LogUtil.info(TAG, "get noteDataArray empty") - return undefined; + LogUtil.info(TAG, "get noteDataArray empty"); + return; } - return noteDataArray == undefined ? null : noteDataArray[0] + return noteDataArray == undefined ? undefined : noteDataArray[0]; } /** @@ -268,37 +274,36 @@ export class NoteUtil { deleteEmptyNote(selectedNoteData: NoteData, AllNoteArray: NoteData[], controllerShow: WebController): boolean { if (selectedNoteData.title == "标题" && selectedNoteData.content_text == "") { // delete note from db - noteUtil.removeNoteData(AllNoteArray, selectedNoteData.uuid) - LogUtil.info(TAG, "delete note:" + selectedNoteData.uuid) - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, selectedNoteData.uuid) - RdbStoreUtil.delete(predicates_note, null) - LogUtil.info(TAG, "delete note success:" + selectedNoteData.uuid) - return true + noteUtil.removeNoteData(AllNoteArray, selectedNoteData.uuid); + LogUtil.info(TAG, "delete note:" + selectedNoteData.uuid); + let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicates_note.equalTo(NoteTableColumn.Uuid, selectedNoteData.uuid); + RdbStoreUtil.delete(predicates_note, null); + LogUtil.info(TAG, "delete note success:" + selectedNoteData.uuid); + return true; } - return false + return false; } refreshAll() { - let isRefresh = AppStorage.Get('isUpdate') - AppStorage.Set('isUpdate',!isRefresh) + let isRefresh: boolean = AppStorage.Get('isUpdate')!; + AppStorage.Set('isUpdate',!isRefresh); } /** * Format conversion * @param initContent */ - contrastInitType(initContent:string):string { - let base64regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/; - if(!base64regex.test(initContent)) { - const inputBuffer = buffer.from(initContent,'utf-8'); + contrastInitType(initContent: string): string { + let base64regex = new RegExp('/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/'); + if (!base64regex.test(initContent)) { + const inputBuffer = buffer.from(initContent, 'utf-8'); initContent = inputBuffer.toString('base64'); } return initContent; }; - } -let noteUtil = new NoteUtil() +let noteUtil = new NoteUtil(); -export default noteUtil as NoteUtil \ No newline at end of file +export default noteUtil as NoteUtil; \ No newline at end of file diff --git a/common/utils/src/main/ets/default/baseUtil/OperationUtils.ets b/common/utils/src/main/ets/default/baseUtil/OperationUtils.ets index 04628882cdb1e2496efefb1063ef8dabdfb9e8ae..10b3b673aef68247216b0f2500a01739e811dce6 100644 --- a/common/utils/src/main/ets/default/baseUtil/OperationUtils.ets +++ b/common/utils/src/main/ets/default/baseUtil/OperationUtils.ets @@ -13,126 +13,124 @@ * limitations under the License. */ -import {LogUtil} from './LogUtil' -import {MediaLibraryAccess} from '../access/MediaLibraryAccess'; +import { LogUtil } from './LogUtil'; +import { MediaLibraryAccess } from '../access/MediaLibraryAccess'; import dataSharePredicates from '@ohos.data.dataSharePredicates'; import fileio from '@ohos.fileio'; +import photoAccessHelper from '@ohos.file.photoAccessHelper'; +import common from '@ohos.app.ability.common'; -const TAG = "OperationUtils" -export class OperationUtils { - - - async copy(uri: string):Promise { - try { - var context = globalThis.noteContext - let fileAsset = await this.getFileAssetById(uri, context); - if (fileAsset == null || fileAsset == undefined) { - LogUtil.warn(TAG, "Failed to get fileAsset") - return; - } - - let fd = await MediaLibraryAccess.openAsset('RW', fileAsset); - if (fd <= 0) { - LogUtil.warn(TAG, "fd is invaild") - return; - } - LogUtil.info(TAG, 'copyAsset read end!') +const TAG: string = 'OperationUtils'; +let noteContext = AppStorage.Get('noteContext')!; - // 通过Uri拷贝图片到指定指定的包路径下 - // 1、获取本地路径 - var dir = context.filesDir - // 2、生成本地文件名 - var time = new Date().getTime() - var imagePath = dir + "/" + time.toString() + "_note" + ".jpg" - // 3、拷贝 - await fileio.copyFile(fd, imagePath) - // 4、关闭安fd,Asset - await MediaLibraryAccess.closeAsset(fd, fileAsset); - } catch (error) { - LogUtil.info(TAG, "create error: " + error); - return; - } - LogUtil.debug(TAG, 'copy end'); - - return imagePath.toString() +export class OperationUtils { + async copy(uri: string): Promise { + let imagePath: string = ''; + try { + let context = noteContext; + let fileAsset = await this.getFileAssetById(uri, context); + if (fileAsset == null || fileAsset == undefined) { + LogUtil.warn(TAG, "Failed to get fileAsset"); + return; + } + + let fd = await MediaLibraryAccess.openAsset('RW', fileAsset); + if (fd !== undefined && fd <= 0) { + LogUtil.warn(TAG, "fd is invaild"); + return; + } + LogUtil.info(TAG, 'copyAsset read end!'); + + // 通过Uri拷贝图片到指定指定的包路径下 + // 1、获取本地路径 + let dir = context.filesDir; + // 2、生成本地文件名 + let time = new Date().getTime(); + imagePath = dir + '/' + time.toString() + '_note' + '.jpg'; + // 3、拷贝 + await fileio.copyFile(fd, imagePath); + // 4、关闭fd,Asset + await MediaLibraryAccess.closeAsset(fd!, fileAsset); + } catch (error) { + LogUtil.error(TAG, "create error: " + error); } - - saveImageData(dataArray: Uint8Array, imageType: string): string { - try { - var context = globalThis.noteContext - // 1、获取本地路径 - var dir = context.filesDir - var time = new Date().getTime() - var imagePath = dir + "/" + time.toString() + "_note" + "." + imageType - let fd = fileio.openSync(imagePath, 0o100 | 0o2, 0o666) - // 3、把image数据写入本地图片文件中 - fileio.writeSync(fd, dataArray.buffer) - } catch (error) { - LogUtil.info(TAG, "create error: " + error); - return; - } - LogUtil.info(TAG, 'save image end'); - - return imagePath.toString() + LogUtil.debug(TAG, 'copy end'); + return imagePath.toString(); + } + + saveImageData(dataArray: Uint8Array, imageType: string): string { + let imagePath: string = ''; + try { + let context = noteContext; + // 1、获取本地路径 + let dir = context.filesDir; + let time = new Date().getTime(); + imagePath = dir + '/' + time.toString() + '_note' + '.' + imageType; + let fd = fileio.openSync(imagePath, 0o100 | 0o2, 0o666); + // 3、把image数据写入本地图片文件中 + fileio.writeSync(fd, dataArray.buffer); + } catch (error) { + LogUtil.error(TAG, "create error: " + error); } - - saveImage(imageData: string, imageType: string): string { - try { - var context = globalThis.noteContext - // 1、获取本地路径 - var dir = context.filesDir - // 2、生成本地文件名 - var time = new Date().getTime() - var imagePath = dir + "/" + time.toString() + "_note" + "." + imageType - let fd = fileio.openSync(imagePath, 0o100 | 0o2, 0o666) - let arrayBuffer = new ArrayBuffer(imageData.length) - let ia = new Uint8Array(arrayBuffer) - for(let i = 0; i < imageData.length; i++) { - ia[i] = imageData.charCodeAt(i) - } - - // 3、把image数据写入本地图片文件中 - fileio.writeSync(fd, ia.buffer) - - } catch (error) { - LogUtil.info(TAG, "create error: " + error); - return; - } - LogUtil.debug(TAG, 'save image end'); - - return imagePath.toString() + LogUtil.info(TAG, 'save image end'); + return imagePath.toString(); + } + + saveImage(imageData: string, imageType: string): string { + let imagePath: string = ''; + try { + let context = noteContext; + // 1、获取本地路径 + let dir = context.filesDir; + // 2、生成本地文件名 + let time = new Date().getTime(); + imagePath = dir + '/' + time.toString() + '_note' + '.' + imageType; + let fd = fileio.openSync(imagePath, 0o100 | 0o2, 0o666); + let arrayBuffer = new ArrayBuffer(imageData.length); + let ia = new Uint8Array(arrayBuffer); + for (let i = 0; i < imageData.length; i++) { + ia[i] = imageData.charCodeAt(i); + } + // 3、把image数据写入本地图片文件中 + fileio.writeSync(fd, ia.buffer); + } catch (error) { + LogUtil.error(TAG, "create error: " + error); } - - getIdByUri(uri:string): number { - let srcIndex = uri.lastIndexOf('/'); - let srcEnd = uri.length; - let srcId = uri.substring(srcIndex + 1, srcEnd); - let numId = new Number(srcId); - LogUtil.debug(TAG, `getIdByUri numId: ${numId}`); - return numId.valueOf(); + LogUtil.debug(TAG, 'save image end'); + return imagePath.toString(); + } + + getIdByUri(uri: string): number { + let srcIndex = uri.lastIndexOf('/'); + let srcEnd = uri.length; + let srcId = uri.substring(srcIndex + 1, srcEnd); + let numId = new Number(srcId); + LogUtil.debug(TAG, `getIdByUri numId: ${numId}`); + return numId.valueOf(); + } + + async getFileAssetById(imagePath: string, context: common.UIAbilityContext) { + LogUtil.info(TAG, 'getFileAssetById', imagePath); + let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); + let fetchOpt: photoAccessHelper.FetchOptions = { + fetchColumns: [], + predicates: predicates.equalTo('uri', imagePath) } - async getFileAssetById(imagePath, context){ - LogUtil.info(TAG, 'getFileAssetById', imagePath); - let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); - let fetchOpt = { - fetchColumns: [], - predicates: predicates.equalTo('uri',imagePath) - } - - try { - let result = await MediaLibraryAccess.getFirstObject(fetchOpt, context); - if (result == null) { - LogUtil.info(TAG, 'getFileAssetByUri fail'); - return null; - } - return result.obj; - } catch (error) { - LogUtil.info(TAG, 'getFileAssetById error'); - return null; - } + try { + let result = await MediaLibraryAccess.getFirstObject(fetchOpt, context); + if (result == null) { + LogUtil.info(TAG, 'getFileAssetByUri fail'); + return null; + } + return result.obj; + } catch (error) { + LogUtil.error(TAG, 'getFileAssetById error'); + return null; } + } } let mOperationUtils = new OperationUtils(); + export default mOperationUtils as OperationUtils; diff --git a/common/utils/src/main/ets/default/baseUtil/RdbStoreUtil.ets b/common/utils/src/main/ets/default/baseUtil/RdbStoreUtil.ets index 93302419a491d7dcd4572ef45ca456cb561a1f57..2ddf915881fcb42867d4235b353a27434436005d 100644 --- a/common/utils/src/main/ets/default/baseUtil/RdbStoreUtil.ets +++ b/common/utils/src/main/ets/default/baseUtil/RdbStoreUtil.ets @@ -25,48 +25,55 @@ import { TableName, FolderTableColumn, NoteTableColumn, - SysDefFolderUuid -} from '../model/databaseModel/EnumData' -import relationalStore from '@ohos.data.relationalStore' + SysDefFolderUuid, + FolderType, + Delete, + Favorite, + NoteType, + Top +} from '../model/databaseModel/EnumData'; +import relationalStore from '@ohos.data.relationalStore'; import util from '@ohos.util'; +import { BusinessError, Callback } from '@ohos.base'; +import common from '@ohos.app.ability.common'; -const TAG = "RdbStoreUtil" +const TAG: string = 'RdbStoreUtil'; -const FileMaxSize: number = 20 * 1024 * 1024 +const FileMaxSize: number = 20 * 1024 * 1024; +let rdbStore = AppStorage.Get('rdbStore'); /** * db instance */ - -export default { +class RdbStoreUtil { /** * create db and table */ - createRdbStore(context) { + createRdbStore(context: common.UIAbilityContext) { try { relationalStore.getRdbStore(context, SysDefData.dbInfo.db_name) .then(async (store) => { // add sys-def folder and note to AppStorage - let folderDataArray = [] + let folderDataArray: FolderData[] = []; let sysDefFolderArray = [SysDefData.sys_def_allNotes, SysDefData.sys_def_unClassified, - SysDefData.sys_def_myFavorites, SysDefData.sys_def_recentDeletes, - SysDefData.sys_def_personal, SysDefData.sys_def_life, SysDefData.sys_def_work] + SysDefData.sys_def_myFavorites, SysDefData.sys_def_recentDeletes, + SysDefData.sys_def_personal, SysDefData.sys_def_life, SysDefData.sys_def_work]; sysDefFolderArray.forEach((sysDefFolder) => { - let folderData = new FolderData(sysDefFolder.id, sysDefFolder.name, sysDefFolder.uuid, sysDefFolder.color, - sysDefFolder.folder_type, sysDefFolder.is_deleted, sysDefFolder.created_time, - sysDefFolder.modified_time) - folderDataArray.push(folderData) + let folderData = new FolderData(sysDefFolder.id as number, sysDefFolder.name as string, sysDefFolder.uuid as string, sysDefFolder.color as string, + sysDefFolder.folder_type as FolderType, sysDefFolder.is_deleted as Delete, sysDefFolder.created_time as number, + sysDefFolder.modified_time as number); + folderDataArray.push(folderData); }) - LogUtil.info(TAG, "folderDataArray[sysdef] : " + folderDataArray.length) + LogUtil.info(TAG, "folderDataArray[sysdef] : " + folderDataArray.length); - let noteDataArray = [] + let noteDataArray: NoteData[] = []; let sysDefNoteArray = [SysDefData.sys_def_note1, SysDefData.sys_def_note2, - SysDefData.sys_def_note3, SysDefData.sys_def_note4] + SysDefData.sys_def_note3, SysDefData.sys_def_note4]; sysDefNoteArray.forEach((sysDefNote) => { - let noteData = new NoteData(sysDefNote.id, sysDefNote.title, sysDefNote.uuid, sysDefNote.folder_uuid, sysDefNote.content_text, - sysDefNote.content_img, sysDefNote.note_type, sysDefNote.is_top, sysDefNote.is_favorite, - sysDefNote.is_deleted, sysDefNote.created_time, sysDefNote.modified_time, sysDefNote.deleted_time, sysDefNote.slider_value) - noteDataArray.push(noteData) + let noteData = new NoteData(sysDefNote.id as number, sysDefNote.title as string, sysDefNote.uuid as string, sysDefNote.folder_uuid as string, sysDefNote.content_text as string, + sysDefNote.content_img as string, sysDefNote.note_type as NoteType, sysDefNote.is_top as Top, sysDefNote.is_favorite as Favorite, + sysDefNote.is_deleted as Delete, sysDefNote.created_time as number, sysDefNote.modified_time as number, sysDefNote.deleted_time as number, sysDefNote.slider_value as number); + noteDataArray.push(noteData); }) LogUtil.info(TAG, "noteDataArray[sysdef] : " + noteDataArray.length) @@ -78,12 +85,12 @@ export default { let isContinue = AppStorage.Get('IsContinue'); LogUtil.info(TAG, "createRdbStore, isContinue is " + isContinue) if (isContinue) { - let continueNote: string = AppStorage.Get('ContinueNote') - let continueSection = AppStorage.Get('ContinueSection') - let noteObj = JSON.parse(continueNote) - let noteData = new NoteData(noteObj.uuid, noteObj.title, noteObj.uuid, noteObj.folder_uuid, + let continueNote: string = AppStorage.Get('ContinueNote')!; + let continueSection: number = AppStorage.Get('ContinueSection')!; + let noteObj: NoteData = JSON.parse(continueNote); + let noteData: NoteData = new NoteData(noteObj.id, noteObj.title, noteObj.uuid, noteObj.folder_uuid, noteObj.content_text, noteObj.content_img, noteObj.note_type, noteObj.is_top, noteObj.is_favorite, - noteObj.is_deleted, noteObj.created_time, noteObj.modified_time, noteObj.deleted_time, noteObj.slider_value) + noteObj.is_deleted, noteObj.created_time, noteObj.modified_time, noteObj.deleted_time, noteObj.slider_value); // save img to FileDir LogUtil.info(TAG, "createRdbStore, save img to FileDir") @@ -108,7 +115,7 @@ export default { noteData.folder_uuid = SysDefFolderUuid.UnClassified noteDataArray.push(noteData) AppStorage.SetOrCreate('AllNoteArray', noteDataArray) - this.insert(TableName.NoteTable, noteData.toNoteObject(), null) + this.insert(TableName.NoteTable, noteData.toNoteObject(), null); AppStorage.SetOrCreate('Folder', FolderUtil.getFolderData(folderDataArray, SysDefFolderUuid.UnClassified)) } else { // 迁移过来的笔记在本地存在,则进行修改 @@ -121,7 +128,7 @@ export default { } let predicates_note = this.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.CreatedTime, noteData.created_time) - this.update(noteData.toNoteObject(), predicates_note, null) + this.update(noteData.toNoteObject(), predicates_note, null); AppStorage.SetOrCreate('Folder', FolderUtil.getFolderData(folderDataArray, folderUuid)) } AppStorage.SetOrCreate('Note', noteData) @@ -130,8 +137,8 @@ export default { AppStorage.SetOrCreate('NewNote', noteData) } else { LogUtil.info(TAG, "createRdbStore, IsContinue false") - AppStorage.SetOrCreate('Folder', AppStorage.Get('AllFolderArray')[0]) - let note = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray'), SysDefFolderUuid.AllNotes) + AppStorage.SetOrCreate('Folder', (AppStorage.Get('AllFolderArray') as FolderData[])[0]); + let note = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray')!, SysDefFolderUuid.AllNotes); AppStorage.SetOrCreate('Note', note) if (note) { AppStorage.SetOrCreate('ContinueNote', JSON.stringify(note.toNoteObject())) @@ -141,49 +148,50 @@ export default { AppStorage.SetOrCreate('DBQueryFinished', 1) LogUtil.info(TAG, "createRdbStore, set DBQueryFinished 1") LogUtil.info(TAG, "createRdbStore, store is " + store) - globalThis.rdbStore = store + rdbStore = store; + // create table - await globalThis.rdbStore.executeSql(TableSql.FolderTableSQL, null) - await globalThis.rdbStore.executeSql(TableSql.NoteTableSQL, null) - await globalThis.rdbStore.executeSql(TableSql.AttachmentTableSQL, null) - await globalThis.rdbStore.executeSql(TableSql.FormTableSQL, null) + rdbStore.executeSql(TableSql.FolderTableSQL.toString(), null); + rdbStore.executeSql(TableSql.NoteTableSQL.toString(), null); + rdbStore.executeSql(TableSql.AttachmentTableSQL.toString(), null); + rdbStore.executeSql(TableSql.FormTableSQL.toString(), null); LogUtil.info(TAG, "create table success") // insert system defined folder - await globalThis.rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_allNotes) - await globalThis.rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_unClassified) - await globalThis.rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_myFavorites) - await globalThis.rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_recentDeletes) - await globalThis.rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_personal) - await globalThis.rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_life) - await globalThis.rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_work) + await rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_allNotes); + await rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_unClassified); + await rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_myFavorites); + await rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_recentDeletes); + await rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_personal); + await rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_life); + await rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_work); LogUtil.info(TAG, "insert system defined folder success") // insert system defined note and attachment - await globalThis.rdbStore.insert(TableName.NoteTable, SysDefData.sys_def_note1) - await globalThis.rdbStore.insert(TableName.NoteTable, SysDefData.sys_def_note2) - await globalThis.rdbStore.insert(TableName.NoteTable, SysDefData.sys_def_note3) - await globalThis.rdbStore.insert(TableName.NoteTable, SysDefData.sys_def_note4) + await rdbStore.insert(TableName.NoteTable, SysDefData.sys_def_note1); + await rdbStore.insert(TableName.NoteTable, SysDefData.sys_def_note2); + await rdbStore.insert(TableName.NoteTable, SysDefData.sys_def_note3); + await rdbStore.insert(TableName.NoteTable, SysDefData.sys_def_note4); LogUtil.info(TAG, "insert system defined note and attachment success") }) } catch (err) { LogUtil.warn(TAG, "createRdbStore, error : " + err) } - }, + } /** * query folders and notes from the database, then save them to the AppStorage. */ - initAppStorage(context) { - let folderDataArray = [] - let noteDataArray = [] + initAppStorage(context: common.UIAbilityContext) { + let folderDataArray: FolderData[] = []; + let noteDataArray: NoteData[] = []; try { relationalStore.getRdbStore(context, SysDefData.dbInfo.db_name) .then(async (store) => { LogUtil.info(TAG, "initAppStorage, store is " + store) - globalThis.rdbStore = store + rdbStore = store; // query folder - let columns_folder = [] + let columns_folder: string[] = []; let predicates_folder = new relationalStore.RdbPredicates(TableName.FolderTable) - let resultSet_folder = await globalThis.rdbStore.query(predicates_folder, columns_folder) + let resultSet_folder: relationalStore.ResultSet = await rdbStore.query(predicates_folder, columns_folder); while (resultSet_folder.goToNextRow()) { let id = resultSet_folder.getLong(resultSet_folder.getColumnIndex(FolderTableColumn.Id)) let name = resultSet_folder.getString(resultSet_folder.getColumnIndex(FolderTableColumn.Name)) @@ -199,9 +207,9 @@ export default { resultSet_folder.close(); LogUtil.info(TAG, "folderDataArray[query] : " + folderDataArray.length) // query note - let columns_note = [] - let predicates_note = new relationalStore.RdbPredicates(TableName.NoteTable) - let resultSet_note = await globalThis.rdbStore.query(predicates_note, columns_note) + let columns_note: string[] = []; + let predicates_note = new relationalStore.RdbPredicates(TableName.NoteTable); + let resultSet_note: relationalStore.ResultSet = await rdbStore.query(predicates_note, columns_note); while (resultSet_note.goToNextRow()) { let id = resultSet_note.getLong(resultSet_note.getColumnIndex(NoteTableColumn.Id)) let title = resultSet_note.getString(resultSet_note.getColumnIndex(NoteTableColumn.Title)) @@ -232,12 +240,12 @@ export default { if (folderDataArray === null || folderDataArray === undefined || folderDataArray.length === 0) { LogUtil.info(TAG, "folderDataArray is null") let sysDefFolderArray = [SysDefData.sys_def_allNotes, SysDefData.sys_def_unClassified, - SysDefData.sys_def_myFavorites, SysDefData.sys_def_recentDeletes, - SysDefData.sys_def_personal, SysDefData.sys_def_life, SysDefData.sys_def_work] + SysDefData.sys_def_myFavorites, SysDefData.sys_def_recentDeletes, + SysDefData.sys_def_personal, SysDefData.sys_def_life, SysDefData.sys_def_work]; sysDefFolderArray.forEach((sysDefFolder) => { - let folderData = new FolderData(sysDefFolder.id, sysDefFolder.name, sysDefFolder.uuid, sysDefFolder.color, - sysDefFolder.folder_type, sysDefFolder.is_deleted, sysDefFolder.created_time, - sysDefFolder.modified_time) + let folderData = new FolderData(sysDefFolder.id as number, sysDefFolder.name as string, sysDefFolder.uuid as string, sysDefFolder.color as string, + sysDefFolder.folder_type as FolderType, sysDefFolder.is_deleted as Delete, sysDefFolder.created_time as number, + sysDefFolder.modified_time as number); folderDataArray.push(folderData) }) LogUtil.info(TAG, "folderDataArray[query] : " + folderDataArray.length) @@ -250,13 +258,13 @@ export default { let isContinue = AppStorage.Get('IsContinue'); LogUtil.info(TAG, "initAppStorage, isContinue is " + isContinue) if (isContinue) { - let continueNote: string = AppStorage.Get('ContinueNote') - let continueSection = AppStorage.Get('ContinueSection') + let continueNote: string = AppStorage.Get('ContinueNote')!; + let continueSection: number = AppStorage.Get('ContinueSection')!; - let noteObj = JSON.parse(continueNote) - let noteData = new NoteData(noteObj.uuid, noteObj.title, noteObj.uuid, noteObj.folder_uuid, + let noteObj: NoteData = JSON.parse(continueNote); + let noteData: NoteData = new NoteData(noteObj.id, noteObj.title, noteObj.uuid, noteObj.folder_uuid, noteObj.content_text, noteObj.content_img, noteObj.note_type, noteObj.is_top, noteObj.is_favorite, - noteObj.is_deleted, noteObj.created_time, noteObj.modified_time, noteObj.deleted_time, noteObj.slider_value) + noteObj.is_deleted, noteObj.created_time, noteObj.modified_time, noteObj.deleted_time, noteObj.slider_value); // save img to FileDir LogUtil.info(TAG, "initAppStorage, save img to FileDir") @@ -281,7 +289,7 @@ export default { noteData.folder_uuid = SysDefFolderUuid.UnClassified noteDataArray.push(noteData) AppStorage.SetOrCreate('AllNoteArray', noteDataArray) - this.insert(TableName.NoteTable, noteData.toNoteObject(), null) + this.insert(TableName.NoteTable, noteData.toNoteObject(), null); AppStorage.SetOrCreate('Folder', FolderUtil.getFolderData(folderDataArray, SysDefFolderUuid.UnClassified)) } else { // 迁移过来的笔记在本地存在,则进行修改 @@ -294,7 +302,7 @@ export default { } let predicates_note = this.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.CreatedTime, noteData.created_time) - this.update(noteData.toNoteObject(), predicates_note, null) + this.update(noteData.toNoteObject(), predicates_note, null); AppStorage.SetOrCreate('Folder', FolderUtil.getFolderData(folderDataArray, folderUuid)) } AppStorage.SetOrCreate('Note', noteData) @@ -303,8 +311,8 @@ export default { AppStorage.SetOrCreate('NewNote', noteData) } else { LogUtil.info(TAG, "initAppStorage, IsContinue false") - AppStorage.SetOrCreate('Folder', AppStorage.Get('AllFolderArray')[0]) - let note = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray'), SysDefFolderUuid.AllNotes) + AppStorage.SetOrCreate('Folder', (AppStorage.Get('AllFolderArray') as FolderData[])[0]); + let note = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray')!, SysDefFolderUuid.AllNotes); AppStorage.SetOrCreate('Note', note) if (note) { AppStorage.SetOrCreate('ContinueNote', JSON.stringify(note.toNoteObject())) @@ -317,17 +325,18 @@ export default { } catch (err) { LogUtil.error(TAG, "initAppStorage, error : " + err) } - }, + } - getImgNameFromHtml(noteData: NoteData): any { - let newModuleName = "file://" + globalThis.noteContext.filesDir - let imgNameArray = [] + getImgNameFromHtml(noteData: NoteData): string[] { + let noteContext = AppStorage.Get('noteContext')!; + let newModuleName = 'file://' + noteContext.filesDir; + let imgNameArray: string[] = []; if (noteData.content_text == undefined || noteData.content_text == null || noteData.content_text == "") { LogUtil.info(TAG, "noteData.content_text is null or undefined") return imgNameArray } - let base64regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/ - let html + let base64regex = new RegExp('/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/'); + let html: string = ''; if (base64regex.test(noteData.content_text)) { let base64 = new util.Base64Helper html = base64.decodeSync(noteData.content_text).toString() @@ -337,8 +346,8 @@ export default { if (html == undefined || html == null || html == "") { return imgNameArray } - let imgReg = /]+>/g - let srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i + let imgReg = new RegExp('/]+>/g'); + let srcReg = new RegExp('/src=[\'\"]?([^\'\"]*)[\'\"]?/i'); let imgArray = html.match(imgReg) if (imgArray != null) { let hasFirstImg: boolean = false @@ -361,12 +370,12 @@ export default { } } return imgNameArray - }, + } writeToFileDir(fileName: string) { LogUtil.info(TAG, "writeToFileDir fileName : " + fileName) - - let desPath = globalThis.noteContext.filesDir + "/" + fileName + let noteContext = AppStorage.Get('noteContext')!; + let desPath = noteContext.filesDir + '/' + fileName; LogUtil.info(TAG, "desPath : " + desPath) try { fileio.accessSync(desPath) @@ -375,10 +384,10 @@ export default { } catch (err) { LogUtil.warn(TAG, "desPath has not existed, need to write") } - let srcPath - let size + let srcPath: string = ''; + let size: number = 0; try { - srcPath = globalThis.noteContext.distributedFilesDir + "/" + fileName + srcPath = noteContext.distributedFilesDir + '/' + fileName; LogUtil.info(TAG, "srcPath : " + srcPath) size = fileio.statSync(srcPath).size LogUtil.info(TAG, "srcPath size : " + size) @@ -393,7 +402,7 @@ export default { } - let srcFd + let srcFd: number = 0; try { srcFd = fileio.openSync(srcPath, 0o0) LogUtil.info(TAG, "open srcPath success : " + srcFd) @@ -402,7 +411,7 @@ export default { return } - let desFd + let desFd: number = 0; try { desFd = fileio.openSync(desPath, 0o2 | 0o100, 0o400 | 0o200 | 0o040 | 0o020) LogUtil.info(TAG, "open desPath success : " + srcFd) @@ -420,7 +429,7 @@ export default { } catch (err) { LogUtil.warn(TAG, "read or write error : " + err) } - }, + } /** * insert @@ -428,32 +437,32 @@ export default { * @param valueBucket * @param callback */ - insert(tableName, valueBucket, callback) { - globalThis.rdbStore.insert(tableName, valueBucket).then((rowId) => { + insert(tableName: string, valueBucket: relationalStore.ValuesBucket, callback: Callback | null) { + rdbStore!.insert(tableName, valueBucket).then((rowId: number) => { LogUtil.info(TAG, "insert success, rowId is " + rowId) if (callback != null) { callback(rowId) } - }).catch((err) => { - LogUtil.warn(TAG, "insert error : " + err) + }).catch((err: BusinessError) => { + LogUtil.error(TAG, 'insert error:' + err); }) - }, + } /** * delete * @param predicates * @param callback */ - delete(predicates, callback) { - globalThis.rdbStore.delete(predicates).then((affectedRowCount) => { + delete(predicates: relationalStore.RdbPredicates, callback: Callback | null) { + rdbStore!.delete(predicates).then((affectedRowCount: number) => { LogUtil.info(TAG, "delete success, affectedRowCount is " + affectedRowCount) if (callback != null) { callback(affectedRowCount) } - }).catch((err) => { + }).catch((err: BusinessError) => { LogUtil.warn(TAG, "delete error : " + err) }) - }, + } /** * update @@ -461,19 +470,20 @@ export default { * @param predicates * @param callback */ - update(valueBucket, predicates, callback) { - if (!globalThis.rdbStore) { + update(valueBucket: relationalStore.ValuesBucket, predicates: relationalStore.RdbPredicates, + callback: Callback | null) { + if (!rdbStore) { return; } - globalThis.rdbStore.update(valueBucket, predicates).then((affectedRowCount) => { + rdbStore!.update(valueBucket, predicates).then((affectedRowCount: number) => { LogUtil.info(TAG, "update success, affectedRowCount is " + affectedRowCount) if (callback != null) { callback(affectedRowCount) } - }).catch((err) => { + }).catch((err: BusinessError) => { LogUtil.warn(TAG, "update error : " + err) }) - }, + } /** * query @@ -481,24 +491,24 @@ export default { * @param predicates * @param callback */ - query(columns, predicates, callback) { - globalThis.rdbStore.query(predicates, columns).then((resultSet) => { + query(columns: string[], predicates: relationalStore.RdbPredicates, callback: Callback) { + rdbStore!.query(predicates, columns).then((resultSet: relationalStore.ResultSet) => { LogUtil.info(TAG, "query success, row count : " + resultSet.rowCount) if (callback != null) { callback(resultSet) } - }).catch((err) => { + }).catch((err: BusinessError) => { LogUtil.warn(TAG, "query error : " + err) }) - }, + } /** * get RdbPredicates by table name * @param tableName */ - getRdbPredicates(tableName) { + getRdbPredicates(tableName: string) { return new relationalStore.RdbPredicates(tableName) - }, + } updataNoteImage(noteData: NoteData): string { let content_img = "" @@ -514,4 +524,6 @@ export default { LogUtil.info(TAG, "updataNoteImage, content_img : " + content_img) return content_img } -} \ No newline at end of file +} + +export default new RdbStoreUtil(); \ No newline at end of file diff --git a/common/utils/src/main/ets/default/model/NoteBaseData.ets b/common/utils/src/main/ets/default/model/NoteBaseData.ets index 3c2de8f7e435db1e59151f12060b787e92f100ef..c24c3ab55a6e20620378efd4b776a79ee3ba0c69 100644 --- a/common/utils/src/main/ets/default/model/NoteBaseData.ets +++ b/common/utils/src/main/ets/default/model/NoteBaseData.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import NoteData from '../model/databaseModel/NoteData' +import NoteData from '../model/databaseModel/NoteData'; export const circleColorArray: string[] = [ "#f86d05", // 深红 @@ -36,7 +36,7 @@ export const fontColorArray: string[] = [ "#182431", //黑色 ] -export const unSelectedNoteBgColorMap = { +export const unSelectedNoteBgColorMap: Record = { "#f86d05": "#fff8eceb", "#ff7500": "#f3d9c4", "#ffbf00": "#f3e8c4", @@ -48,7 +48,7 @@ export const unSelectedNoteBgColorMap = { "#ffffff": "#ffffff" } -export const selectedNoteBgColorMap = { +export const selectedNoteBgColorMap: Record = { "#f86d05": "#eec4b8", "#ff7500": "#f1d8c7", "#ffbf00": "#f3cdb1", @@ -60,14 +60,14 @@ export const selectedNoteBgColorMap = { "#ffffff": "#19007dff" } -export const folderTextMap = { +export const folderTextMap: Record = { "sys_def_allNotes_uuid": $r('app.string.allNotes'), "sys_def_unClassified_uuid": $r('app.string.unClassified'), "sys_def_myFavorites_uuid": $r('app.string.myFavorites'), "sys_def_recentDeletes_uuid": $r('app.string.recentDeletes'), } -export const folderIconMap = { +export const folderIconMap: Record = { "sys_def_allNotes_uuid": $r('app.media.allNotes'), "sys_def_unClassified_uuid": $r('app.media.unClassified'), "sys_def_myFavorites_uuid": $r('app.media.favorite_cancel'), @@ -101,7 +101,7 @@ let widthWeightOneSection: WidthWeightMessage = new WidthWeightMessage("0%", 0, let widthWeightTwoSection = new WidthWeightMessage("0%", 0, "34%", 1, "66%", 1) let widthWeightThreeSection = new WidthWeightMessage("16%", 1, "34%", 1, "50%", 1) -export const widthWeightMessageMap = { +export const widthWeightMessageMap: Record = { 1: widthWeightOneSection, 2: widthWeightTwoSection, 3: widthWeightThreeSection diff --git a/common/utils/src/main/ets/default/model/databaseModel/FolderData.ets b/common/utils/src/main/ets/default/model/databaseModel/FolderData.ets index fdf5ad41c8052d55d7667cfcf936f78fab9f8a9f..24089e75981846696e838db446a0d7da57212395 100644 --- a/common/utils/src/main/ets/default/model/databaseModel/FolderData.ets +++ b/common/utils/src/main/ets/default/model/databaseModel/FolderData.ets @@ -14,6 +14,7 @@ */ import {FolderType, Delete} from './EnumData' +import relationalStore from '@ohos.data.relationalStore'; /** * 文件夹类 @@ -43,7 +44,7 @@ export default class FolderData { /** * 转化为folder_table表的valueBucket */ - toFolderObject(): any{ + toFolderObject(): relationalStore.ValuesBucket { return { "name": this.name, "uuid": this.uuid, diff --git a/common/utils/src/main/ets/default/model/databaseModel/NoteData.ets b/common/utils/src/main/ets/default/model/databaseModel/NoteData.ets index 4edcb198ac20cecc30f3a251c579318c4842aa8a..16c1223cd1eb63da69b4e9ef6bdfe6697063b86f 100644 --- a/common/utils/src/main/ets/default/model/databaseModel/NoteData.ets +++ b/common/utils/src/main/ets/default/model/databaseModel/NoteData.ets @@ -14,6 +14,7 @@ */ import { NoteType, Favorite, Delete, Top } from './EnumData' +import relationalStore from '@ohos.data.relationalStore'; /** * 笔记类 @@ -56,7 +57,7 @@ export default class NoteData { /** * 转化为note_table表的valueBucket */ - toNoteObject(): any{ + toNoteObject(): relationalStore.ValuesBucket { return { "title": this.title, "uuid": this.uuid, diff --git a/common/utils/src/main/ets/default/model/databaseModel/SysDefData.ets b/common/utils/src/main/ets/default/model/databaseModel/SysDefData.ets index 538a4eeece0247ba4ebda5a03f77f1a287d0e087..2ebd7627e10eca21b1ee9ab94fa1a50ccc9115b7 100644 --- a/common/utils/src/main/ets/default/model/databaseModel/SysDefData.ets +++ b/common/utils/src/main/ets/default/model/databaseModel/SysDefData.ets @@ -13,168 +13,179 @@ * limitations under the License. */ -import {SysDefFolder, SysDefFolderUuid, FolderType, NoteType, Favorite, Top, Delete} from './EnumData' -import relationalStore from '@ohos.data.relationalStore' +import { SysDefFolder, SysDefFolderUuid, FolderType, NoteType, Favorite, Top, Delete } from './EnumData'; +import relationalStore from '@ohos.data.relationalStore'; -export default { +interface DbInfoType { + db_name: DbNameType; + db_verison: number; +} + +interface DbNameType { + name: string; + securityLevel: relationalStore.SecurityLevel; +} + +class SysDefData { /** * db info */ - dbInfo: { + public dbInfo: DbInfoType = { db_name: { name: "note.db", // 数据库名称 securityLevel: relationalStore.SecurityLevel.S1 }, db_verison: 1 // 数据库版本 - }, + }; /** * system defined folder */ - sys_def_allNotes: { - "id": 1, - "name": SysDefFolder.AllNotes, - "uuid": SysDefFolderUuid.AllNotes, - "color": "#ffffff", - "folder_type": FolderType.SysDef, - "is_deleted": Delete.No, - "created_time": 1641863695000, - "modified_time": 1641863695000 - }, - - sys_def_unClassified: { - "id": 2, - "name": SysDefFolder.UnClassified, - "uuid": SysDefFolderUuid.UnClassified, - "color": "#ffffff", - "folder_type": FolderType.SysDef, - "is_deleted": Delete.No, - "created_time": 1641860095000, - "modified_time": 1641860095000 - }, - - sys_def_myFavorites: { - "id": 3, - "name": SysDefFolder.MyFavorites, - "uuid": SysDefFolderUuid.MyFavorites, - "color": "#ffffff", - "folder_type": FolderType.FeatureDef, - "is_deleted": Delete.No, - "created_time": 1641856088000, - "modified_time": 1641856088000 - }, + public sys_def_allNotes: relationalStore.ValuesBucket = { + "id": 1, + "name": SysDefFolder.AllNotes, + "uuid": SysDefFolderUuid.AllNotes, + "color": "#ffffff", + "folder_type": FolderType.SysDef, + "is_deleted": Delete.No, + "created_time": 1641863695000, + "modified_time": 1641863695000 + }; - sys_def_recentDeletes: { - "id": 4, - "name": SysDefFolder.RecentDeletes, - "uuid": SysDefFolderUuid.RecentDeletes, - "color": "#ffffff", - "folder_type": FolderType.FeatureDef, - "is_deleted": Delete.No, - "created_time": 1641848898000, - "modified_time": 1641848898000 - }, - - sys_def_personal: { - "id": 5, - "name": "个人", - "uuid": SysDefFolderUuid.Personal, - "color": "#41ba41", - "folder_type": FolderType.CusDef, - "is_deleted": Delete.No, - "created_time": 1641677288000, - "modified_time": 1641677288000 - }, - - sys_def_life: { - "id": 6, - "name": "生活", - "uuid": SysDefFolderUuid.Life, - "color": "#00aaee", - "folder_type": FolderType.CusDef, - "is_deleted": Delete.No, - "created_time": 1641676108000, - "modified_time": 1641676108000 - }, - - sys_def_work: { - "id": 7, - "name": "工作", - "uuid": SysDefFolderUuid.Work, - "color": "#f86d05", - "folder_type": FolderType.CusDef, - "is_deleted": Delete.No, - "created_time": 1641636508000, - "modified_time": 1641636508000 - }, + public sys_def_unClassified: relationalStore.ValuesBucket = { + "id": 2, + "name": SysDefFolder.UnClassified, + "uuid": SysDefFolderUuid.UnClassified, + "color": "#ffffff", + "folder_type": FolderType.SysDef, + "is_deleted": Delete.No, + "created_time": 1641860095000, + "modified_time": 1641860095000 + }; + + public sys_def_myFavorites: relationalStore.ValuesBucket = { + "id": 3, + "name": SysDefFolder.MyFavorites, + "uuid": SysDefFolderUuid.MyFavorites, + "color": "#ffffff", + "folder_type": FolderType.FeatureDef, + "is_deleted": Delete.No, + "created_time": 1641856088000, + "modified_time": 1641856088000 + }; + + public sys_def_recentDeletes: relationalStore.ValuesBucket = { + "id": 4, + "name": SysDefFolder.RecentDeletes, + "uuid": SysDefFolderUuid.RecentDeletes, + "color": "#ffffff", + "folder_type": FolderType.FeatureDef, + "is_deleted": Delete.No, + "created_time": 1641848898000, + "modified_time": 1641848898000 + }; + + public sys_def_personal: relationalStore.ValuesBucket = { + "id": 5, + "name": "个人", + "uuid": SysDefFolderUuid.Personal, + "color": "#41ba41", + "folder_type": FolderType.CusDef, + "is_deleted": Delete.No, + "created_time": 1641677288000, + "modified_time": 1641677288000 + }; + + public sys_def_life: relationalStore.ValuesBucket = { + "id": 6, + "name": "生活", + "uuid": SysDefFolderUuid.Life, + "color": "#00aaee", + "folder_type": FolderType.CusDef, + "is_deleted": Delete.No, + "created_time": 1641676108000, + "modified_time": 1641676108000 + }; + + public sys_def_work: relationalStore.ValuesBucket = { + "id": 7, + "name": "工作", + "uuid": SysDefFolderUuid.Work, + "color": "#f86d05", + "folder_type": FolderType.CusDef, + "is_deleted": Delete.No, + "created_time": 1641636508000, + "modified_time": 1641636508000 + }; /** * system defined note */ - sys_def_note1: { - "id": 1, - "title": "数学公式", - "uuid": "note1_uuid", - "folder_uuid": SysDefFolderUuid.UnClassified, - "content_text": '好好学习,天天向上', - "content_img": "", - "note_type": NoteType.SysDef, - "is_top": Top.Yes, - "is_favorite": Favorite.Yes, - "is_deleted": Delete.No, - "created_time": 1641869573000, - "modified_time": 1641869573000, - "deleted_time": 0, - "slider_value":0 - }, - - sys_def_note2: { - "id": 2, - "title": "UX会议纪要", - "uuid": "note2_uuid", - "folder_uuid": SysDefFolderUuid.Work, - "content_text": "", - "content_img": "", - "note_type": NoteType.SysDef, - "is_top": Top.Yes, - "is_favorite": Favorite.No, - "is_deleted": Delete.No, - "created_time": 1640999288000, - "modified_time": 1640999288000, - "deleted_time": 0, - "slider_value":0 - }, - - sys_def_note3: { - "id": 3, - "title": "旅游心得", - "uuid": "note3_uuid", - "folder_uuid": SysDefFolderUuid.Work, - "content_text": '
要想整个旅程无遗憾,关键是心态,首先要对即将到的目的地有一个正确的认识和恰当的期望。
', - "content_img": "", - "note_type": NoteType.SysDef, - "is_top": Top.No, - "is_favorite": Favorite.No, - "is_deleted": Delete.No, - "created_time": 1641385708000, - "modified_time": 1641385708000, - "deleted_time": 0, - "slider_value":0 - }, + public sys_def_note1: relationalStore.ValuesBucket = { + "id": 1, + "title": "数学公式", + "uuid": "note1_uuid", + "folder_uuid": SysDefFolderUuid.UnClassified, + "content_text": '好好学习,天天向上', + "content_img": "", + "note_type": NoteType.SysDef, + "is_top": Top.Yes, + "is_favorite": Favorite.Yes, + "is_deleted": Delete.No, + "created_time": 1641869573000, + "modified_time": 1641869573000, + "deleted_time": 0, + "slider_value": 0 + }; - sys_def_note4: { + public sys_def_note2: relationalStore.ValuesBucket = { + "id": 2, + "title": "UX会议纪要", + "uuid": "note2_uuid", + "folder_uuid": SysDefFolderUuid.Work, + "content_text": "", + "content_img": "", + "note_type": NoteType.SysDef, + "is_top": Top.Yes, + "is_favorite": Favorite.No, + "is_deleted": Delete.No, + "created_time": 1640999288000, + "modified_time": 1640999288000, + "deleted_time": 0, + "slider_value": 0 + }; + + public sys_def_note3: relationalStore.ValuesBucket = { + "id": 3, + "title": "旅游心得", + "uuid": "note3_uuid", + "folder_uuid": SysDefFolderUuid.Work, + "content_text": '
要想整个旅程无遗憾,关键是心态,首先要对即将到的目的地有一个正确的认识和恰当的期望。
', + "content_img": "", + "note_type": NoteType.SysDef, + "is_top": Top.No, + "is_favorite": Favorite.No, + "is_deleted": Delete.No, + "created_time": 1641385708000, + "modified_time": 1641385708000, + "deleted_time": 0, + "slider_value": 0 + }; + + public sys_def_note4: relationalStore.ValuesBucket = { "id": 4, "title": "蛋糕做法", "uuid": "note4_uuid", "folder_uuid": SysDefFolderUuid.Life, - "content_text": '
' + - '' + - '糖60g
' + - '' + - '玉米油40g
' + - '
 1.   添加鸡蛋、盐、糖、蛋糕粉
' + - ' 2.   加入玉米油、牛奶,烤箱预热15分钟
' + - ' 3.   加入葡萄干、核桃仁,烤箱定时40分钟

', + "content_text": ' ' + + '' + + '糖60g
' + + ' ' + + '' + + '玉米油40g
' + + '
 1.   添加鸡蛋、盐、糖、蛋糕粉
' + + ' 2.   加入玉米油、牛奶,烤箱预热15分钟
' + + ' 3.   加入葡萄干、核桃仁,烤箱定时40分钟

', "content_img": "", "note_type": NoteType.CusDef, "is_top": Top.No, @@ -183,6 +194,8 @@ export default { "created_time": 1640909288000, "modified_time": 1640909288000, "deleted_time": 0, - "slider_value":0 - } -} \ No newline at end of file + "slider_value": 0 + }; +} + +export default new SysDefData(); \ No newline at end of file diff --git a/common/utils/src/main/ets/default/model/searchModel/SearchModel.ets b/common/utils/src/main/ets/default/model/searchModel/SearchModel.ets index 891ef4f92580b7dcb0a6f4b03e6c83ca0fdf1a10..d4d8fbd9c6cdfb1e25c6c5f4f2e49247be613f50 100644 --- a/common/utils/src/main/ets/default/model/searchModel/SearchModel.ets +++ b/common/utils/src/main/ets/default/model/searchModel/SearchModel.ets @@ -16,14 +16,20 @@ import { LogUtil } from '../../baseUtil/LogUtil' import NoteData from '../../model/databaseModel/NoteData' import util from '@ohos.util' +import relationalStore from '@ohos.data.relationalStore'; -const TAG = "SearchModel" +const TAG: string = 'SearchModel'; + +interface TextSpan { + type: 0 | 1; // 0 表示正常文本,1 表示高亮关键词 + text: string; +} /** * Search service class */ export class SearchModel { - private rdbStore; + private rdbStore: relationalStore.RdbStore | undefined = undefined; /** * Search @@ -38,7 +44,7 @@ export class SearchModel { } let searchData: NoteData[] = []; noteDataArray.forEach((noteData) => { - let base64regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/ + let base64regex = new RegExp('/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/'); let contentTextValue: string if (base64regex.test(noteData.content_text) && noteData.content_text.length > 0) { let Base64 = new util.Base64() @@ -48,8 +54,8 @@ export class SearchModel { } else { contentTextValue = noteData.content_text } - if (contentTextValue.replace(/<[^>]+>/g, "").toLowerCase().indexOf(query.toLowerCase()) != -1 - || noteData.title.toLowerCase().indexOf(query.toLowerCase()) != -1) { + if (contentTextValue.replace(new RegExp('/<[^>]+>/g'), "").toLowerCase().indexOf(query.toLowerCase()) != -1 + || noteData.title.toLowerCase().indexOf(query.toLowerCase()) != -1) { LogUtil.info(TAG, "uuid " + noteData.uuid) searchData.push(noteData); } @@ -58,14 +64,14 @@ export class SearchModel { return searchData; } - splitToHighlightText(text: string, highlightKeyword): any[] { - let spans: any[] = [] - var lowerSpans: string[] = text.toLowerCase().split(highlightKeyword.toLowerCase()) - var keywordStartIndex = 0 - var keywordLength = highlightKeyword.length + splitToHighlightText(text: string, highlightKeyword: string): TextSpan[] { + let spans: TextSpan[] = []; + let lowerSpans: string[] = text.toLowerCase().split(highlightKeyword.toLowerCase()); + let keywordStartIndex = 0; + let keywordLength = highlightKeyword.length; - for (var i = 0; i < lowerSpans.length; i++) { - var normalText = text.substr(keywordStartIndex, lowerSpans[i].length) + for (let i = 0; i < lowerSpans.length; i++) { + let normalText = text.substr(keywordStartIndex, lowerSpans[i].length); spans.push({ type: 0, text: normalText @@ -73,7 +79,7 @@ export class SearchModel { // if not at last, append highlight keyword if (i != lowerSpans.length - 1) { keywordStartIndex += lowerSpans[i].length - var keywordText = text.substr(keywordStartIndex, keywordLength) + let keywordText = text.substr(keywordStartIndex, keywordLength); spans.push({ type: 1, text: keywordText diff --git a/features/.gitignore b/features/.gitignore index 9924c4f298e2f709c65fd11e6020873bd6f6ae54..fd0ce92f25f87dafbd208e749d1553a9465cd461 100644 --- a/features/.gitignore +++ b/features/.gitignore @@ -1,4 +1,5 @@ /node_modules +/oh_modules /.preview /build /.cxx diff --git a/features/index.ets b/features/index.ets new file mode 100644 index 0000000000000000000000000000000000000000..6db6bab1577f68e4d76dc153453028701e8cc10c --- /dev/null +++ b/features/index.ets @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2023-2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { NewOrEditFolderDialog } from './src/main/ets/components/CusDialogComp'; + +export { DeleteDialog } from './src/main/ets/components/CusDialogComp'; + +export { NoteDataMoveDialog } from './src/main/ets/components/CusDialogComp'; + +export { EditContentDialog } from './src/main/ets/components/CusDialogComp'; + +export { EditTitleDialog } from './src/main/ets/components/CusDialogComp'; + +export { EditContentDialogPortrait } from './src/main/ets/components/CusDialogComp'; + +export { FolderListComp } from './src/main/ets/components/FolderListComp'; + +export { NoteAndCreateComp } from './src/main/ets/components/FolderListComp'; + +export { NoteContent } from './src/main/ets/components/NoteContent'; + +export { NoteContentComp } from './src/main/ets/components/NoteContentComp'; + +export { NoteContentCompPortrait } from './src/main/ets/components/NoteContentCompPortrait'; + +export { NoteContentOverViewComp } from './src/main/ets/components/NoteContentCompPortrait'; + +export { ToolBarComp } from './src/main/ets/components/NoteContentCompPortrait'; + +export { DeleteNoteComp } from './src/main/ets/components/NoteContentCompPortrait'; + +export { NoteListComp } from './src/main/ets/components/NoteListComp'; + +export { NoteItemComp } from './src/main/ets/components/NoteListComp'; + +export { NoteItemListComp } from './src/main/ets/components/NoteListComp'; + +export { OperateNoteComp } from './src/main/ets/components/NoteListComp'; + +export { AddNoteComp } from './src/main/ets/components/NoteListComp'; + +export { SearchComp } from './src/main/ets/components/NoteListComp'; + +export { OperateNoteCompForPortrait } from './src/main/ets/components/NoteListComp'; + diff --git a/features/src/main/ets/components/CusDialogComp.ets b/features/src/main/ets/components/CusDialogComp.ets index 2d8372c431620f135660687387f8205c3dc9cca6..0f3ac9a2883db7822b60481bb8fd8678860c2926 100644 --- a/features/src/main/ets/components/CusDialogComp.ets +++ b/features/src/main/ets/components/CusDialogComp.ets @@ -18,7 +18,15 @@ import FolderData from '@ohos/utils/src/main/ets/default/model/databaseModel/Fol import FolderUtil from '@ohos/utils/src/main/ets/default/baseUtil/FolderUtil' import NoteData from '@ohos/utils/src/main/ets/default/model/databaseModel/NoteData' import NoteUtil from '@ohos/utils/src/main/ets/default/baseUtil/NoteUtil' -import { circleColorArray, fontColorArray, SysDefFolderUuid, DeleteFileType, FolderType, LogUtil } from '@ohos/utils' +import { + circleColorArray, + fontColorArray, + SysDefFolderUuid, + DeleteFileType, + FolderType, + Delete, + LogUtil +} from '@ohos/utils'; import inputMethod from '@ohos.inputMethod' const TAG = "CusDialogComp" @@ -26,7 +34,8 @@ const TAG = "CusDialogComp" @CustomDialog export struct NewOrEditFolderDialog { newOrEditFolderDialogCtl: CustomDialogController - confirm: (color: string, name: string) => void + confirm: (color: string, name: string) => void = (color: string, name: string) => { + }; @State inputName: string = "" private oriInputName: string = "" private oriSelectedColor: string = "" @@ -47,8 +56,9 @@ export struct NewOrEditFolderDialog { Flex({ wrap: FlexWrap.NoWrap, justifyContent: FlexAlign.SpaceBetween }) { ForEach(circleColorArray, (colorStr: string) => { ColorCircleComp({ circleColor: colorStr }) - }, colorStr => colorStr) + }, (colorStr: string) => colorStr) }.margin({ bottom: 12, left: 24, right: 24 }) + // folder name input Flex({ wrap: FlexWrap.NoWrap, justifyContent: FlexAlign.SpaceBetween }) { Image($r("app.media.folder")) @@ -107,21 +117,21 @@ export struct NewOrEditFolderDialog { .strokeWidth(1) .color($r("app.color.divider_color_e4e4e4")) Text($r("app.string.save")) - .opacity(this.inputName == "" - || (this.oriSelectedColor == this.selectedColor && this.inputName == this.oriInputName && this.dialogType == 1) - || (this.isExisted && this.dialogType == 0) - || (this.isExisted && this.dialogType == 1 && this.inputName != this.oriInputName) ? 0.4 : 1) - .enabled(this.inputName == "" - || (this.oriSelectedColor == this.selectedColor && this.inputName == this.oriInputName && this.dialogType == 1) - || (this.isExisted && this.dialogType == 0) - || (this.isExisted && this.dialogType == 1 && this.inputName != this.oriInputName) ? false : true) + .opacity(this.inputName == "" || (this.oriSelectedColor == this.selectedColor && + this.inputName == this.oriInputName && this.dialogType == 1) || + (this.isExisted && this.dialogType == 0) || + (this.isExisted && this.dialogType == 1 && this.inputName != this.oriInputName) ? 0.4 : 1) + .enabled(this.inputName == "" || (this.oriSelectedColor == this.selectedColor && + this.inputName == this.oriInputName && this.dialogType == 1) || + (this.isExisted && this.dialogType == 0) || (this.isExisted && this.dialogType == 1 && + this.inputName != this.oriInputName) ? false : true) .fontSize(18) .textAlign(TextAlign.Center) .fontColor($r("app.color.button_color_f86d05")) .width('48%') .onClick(() => { this.newOrEditFolderDialogCtl.close() - if (this.inputName.replace(/\s+/g, '') == '') { + if (this.inputName.replace(new RegExp('/\s+/g'), '') == '') { return } else { this.confirm(this.selectedColor, this.inputName) @@ -136,10 +146,11 @@ export struct NewOrEditFolderDialog { .backgroundColor($r("app.color.create_folder_bg_color")) .alignItems(HorizontalAlign.Start) .margin({ bottom: 16, left: 12, right: 12 }) + .offset({ y: -50 }) } aboutToAppear(): void { - var currentFolder: FolderData = FolderUtil.getFolderData(this.AllFolderArray, this.editFolderUuid) // 获取当前选中的文件夹 + let currentFolder: FolderData = FolderUtil.getFolderData(this.AllFolderArray, this.editFolderUuid); // 获取当前选中的文件夹 if (currentFolder == null) { return } @@ -148,7 +159,7 @@ export struct NewOrEditFolderDialog { this.oriInputName = this.inputName this.oriSelectedColor = currentFolder.color } else { - GlobalResourceManager.getStringByResource(FolderUtil.getFolderText(currentFolder)).then(result => { + GlobalResourceManager.getStringByResource(FolderUtil.getFolderText(currentFolder) as Resource).then(result => { this.inputName = result this.oriInputName = this.inputName this.oriSelectedColor = currentFolder.color @@ -159,7 +170,7 @@ export struct NewOrEditFolderDialog { @Component struct ColorCircleComp { - private circleColor: string + private circleColor: string = ''; @Consume('SelectedColor') selectedColor: string build() { @@ -189,7 +200,8 @@ export struct DeleteDialog { private multiSelect: boolean = false private deleteFileType = DeleteFileType.NoteData noteDataDeleteDialogCtl: CustomDialogController - onConfirm: () => void + onConfirm: () => void = () => { + }; build() { Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.SpaceBetween }) { @@ -200,30 +212,35 @@ export struct DeleteDialog { .textAlign(TextAlign.Center) .maxLines(1) } else { - Text(this.selectedFolderData.uuid == SysDefFolderUuid.RecentDeletes ? $r("app.string.deleteNoteComplete") : $r("app.string.deleteNote")) + Text(this.selectedFolderData.uuid == SysDefFolderUuid.RecentDeletes ? + $r("app.string.deleteNoteComplete") : $r("app.string.deleteNote")) .fontSize(14) .textAlign(TextAlign.Center) .maxLines(1) - .visibility(this.multiSelect == false || this.selectedFolderData.uuid == SysDefFolderUuid.RecentDeletes ? Visibility.Visible : Visibility.None) + .visibility(this.multiSelect == false || this.selectedFolderData.uuid == SysDefFolderUuid.RecentDeletes ? + Visibility.Visible : Visibility.None) if (this.CheckedNoteArray.length == NoteUtil.getNoteDataArray(this.AllNoteArray, this.selectedFolderData.uuid).length) { Text($r("app.string.deleteAllNote")) .fontSize(14) .textAlign(TextAlign.Center) .maxLines(1) - .visibility(this.multiSelect == false || this.selectedFolderData.uuid == SysDefFolderUuid.RecentDeletes ? Visibility.None : Visibility.Visible) + .visibility(this.multiSelect == false || this.selectedFolderData.uuid == SysDefFolderUuid.RecentDeletes ? + Visibility.None : Visibility.Visible) } else if (this.CheckedNoteArray.length > 1) { Text($r("app.string.deletePartNote", this.CheckedNoteArray.length)) .fontSize(14) .textAlign(TextAlign.Center) .maxLines(1) - .visibility(this.multiSelect == false || this.selectedFolderData.uuid == SysDefFolderUuid.RecentDeletes ? Visibility.None : Visibility.Visible) + .visibility(this.multiSelect == false || this.selectedFolderData.uuid == SysDefFolderUuid.RecentDeletes ? + Visibility.None : Visibility.Visible) } else { Text($r("app.string.deleteNote")) .fontSize(14) .textAlign(TextAlign.Center) .maxLines(1) - .visibility(this.multiSelect == false || this.selectedFolderData.uuid == SysDefFolderUuid.RecentDeletes ? Visibility.None : Visibility.Visible) + .visibility(this.multiSelect == false || this.selectedFolderData.uuid == SysDefFolderUuid.RecentDeletes ? + Visibility.None : Visibility.Visible) } } } @@ -267,6 +284,7 @@ export struct DeleteDialog { .padding({ top: 24, bottom: 16, left: 16, right: 16 }) .backgroundColor($r("app.color.delete_note_bg_color")) .margin({ bottom: 16, left: 12, right: 12 }) + .offset({ y: -50 }) } } @@ -274,24 +292,25 @@ export struct DeleteDialog { struct NoteDataMoveItemComp { @StorageLink('CheckedNoteArray') CheckedNoteArray: NoteData[] = [] @StorageLink('AllFolderArray') AllFolderArray: FolderData[] = [] - private folderItem: FolderData + private folderItem: FolderData = new FolderData(0, '', new Date().getTime() + '', '', FolderType.CusDef, Delete.No, + new Date().getTime(), new Date().getTime()); dividerShow: boolean = true build() { Flex({ alignItems: ItemAlign.Center, wrap: FlexWrap.NoWrap }) { Flex({ alignItems: ItemAlign.Center, wrap: FlexWrap.NoWrap }) { - Image(FolderUtil.getFolderIcon(this.folderItem.uuid)) + Image(FolderUtil.getFolderIcon(this.folderItem.uuid!)) .objectFit(ImageFit.Fill) .width(24) .height(24) .flexShrink(0) - .fillColor(FolderUtil.getFolderIconColor(this.AllFolderArray, this.folderItem.uuid, false)) + .fillColor(FolderUtil.getFolderIconColor(this.AllFolderArray, this.folderItem.uuid!, false)) } .width(24) Column() { Flex({ alignItems: ItemAlign.Center, wrap: FlexWrap.NoWrap, justifyContent: FlexAlign.SpaceBetween }) { - Text(FolderUtil.getFolderText(this.folderItem)) + Text(FolderUtil.getFolderText(this.folderItem!)) .fontSize(16) .textAlign(TextAlign.Center) .maxLines(1) @@ -299,7 +318,8 @@ struct NoteDataMoveItemComp { .flexShrink(1) .fontWeight(FontWeight.Medium) Image((FolderUtil.getCommonFolder(this.AllFolderArray, this.CheckedNoteArray) == null - || FolderUtil.getCommonFolder(this.AllFolderArray, this.CheckedNoteArray) != this.folderItem) ? $r("app.media.foldMove_unselect") : $r("app.media.foldMove_select")) + || FolderUtil.getCommonFolder(this.AllFolderArray, this.CheckedNoteArray) != this.folderItem!) ? + $r("app.media.foldMove_unselect") : $r("app.media.foldMove_select")) .objectFit(ImageFit.Fill) .width(24) .height(24) @@ -326,15 +346,16 @@ struct NoteDataMoveItemComp { @CustomDialog export struct NoteDataMoveDialog { noteDataMoveDialogCtl: CustomDialogController - onConfirm: (folderUuid: string) => void - NoteDataMoveArray: FolderData[] + onConfirm: (folderUuid: string) => void = (folderUuid: string) => { + }; + NoteDataMoveArray: FolderData[] = []; @StorageLink('AllFolderArray') AllFolderArray: FolderData[] = [] aboutToAppear() { this.NoteDataMoveArray = this.AllFolderArray.slice(2, this.AllFolderArray.length); if (this.AllFolderArray[1] === undefined || this.AllFolderArray[1] === null) { - LogUtil.info(TAG, "this AllFolderArray[1] undefined") - return + LogUtil.info(TAG, 'this AllFolderArray[1] undefined'); + return; } this.NoteDataMoveArray.push(this.AllFolderArray[1]); } @@ -350,8 +371,9 @@ export struct NoteDataMoveDialog { .width(288) List() { - if (this.NoteDataMoveArray !== undefined && this.NoteDataMoveArray !== null && this.NoteDataMoveArray !== []) { - ForEach(this.NoteDataMoveArray.slice(0, this.NoteDataMoveArray.length - 1), (item) => { + if (this.NoteDataMoveArray !== undefined && this.NoteDataMoveArray !== null && + this.NoteDataMoveArray.length > 0) { + ForEach(this.NoteDataMoveArray.slice(0, this.NoteDataMoveArray.length - 1), (item: FolderData) => { ListItem() { NoteDataMoveItemComp({ folderItem: item }) } @@ -359,7 +381,7 @@ export struct NoteDataMoveDialog { this.noteDataMoveDialogCtl.close() this.onConfirm(item.uuid) }) - }, noteItem => noteItem.uuid) + }, (noteItem: FolderData) => noteItem.uuid) } ListItem() { NoteDataMoveItemComp({ @@ -391,22 +413,24 @@ export struct NoteDataMoveDialog { .padding({ left: 24, right: 24 }) .backgroundColor($r("app.color.choose_folder_bg_color")) .margin({ bottom: 16, left: 12, right: 12 }) + .offset({ y: -50 }) } } -let inSetValue = AppStorage.Link('inSetValue') +let inSetValue: string = AppStorage.Link('inSetValue'); @CustomDialog export struct EditContentDialog { editContentDialogCtl: CustomDialogController - confirm: (excuteJs: string) => void + confirm: (excuteJs: string) => void = (excuteJs: string) => { + }; @State selectFontColor: string = fontColorArray[0] @Consume('SelectedNoteData') selectedNoteData: NoteData - private circleColor: string - private fontSize: number + private circleColor: string = ''; + private fontSize: number = 0; aboutToAppear() { - this.confirm("javascript:RICH_EDITOR.getFontSizes()") + this.confirm('javascript:RICH_EDITOR.getFontSizes()'); } build() { @@ -608,7 +632,7 @@ export struct EditContentDialog { this.selectFontColor = colorStr this.confirm("javascript:RICH_EDITOR.setTextColor('" + this.selectFontColor + "')") }) - }, colorStr => colorStr) + }, (colorStr: string) => colorStr) }.padding({ bottom: 11 }) } .alignItems(VerticalAlign.Top) @@ -665,7 +689,8 @@ export struct EditContentDialog { @CustomDialog export struct EditTitleDialog { editTitleDialog: CustomDialogController - confirm: (newTitle: string) => void + confirm: (newTitle: string) => void = (newTitle: string) => { + }; @State inputName: string = "" @State isEquivalentVal: boolean = true @@ -722,7 +747,7 @@ export struct EditTitleDialog { .onClick(() => { this.editTitleDialog.close() inputMethod.getController().stopInputSession(); - if (this.inputName.replace(/\s+/g, '') == '') { + if (this.inputName.replace(new RegExp('/\s+/g'), '') == '') { return } else { this.confirm(this.inputName) @@ -742,15 +767,16 @@ export struct EditTitleDialog { @CustomDialog export struct EditContentDialogPortrait { editContentDialogCtl: CustomDialogController; - confirm: (excuteJs: string) => void + confirm: (excuteJs: string) => void = (excuteJs: string) => { + }; @State selectFontColor: string = fontColorArray[0] @Consume('SelectedNoteData') selectedNoteData: NoteData - private circleColor: string - private fontSize: number + private circleColor: string = ''; + private fontSize: number = 0; aboutToAppear() { try { - this.confirm("javascript:RICH_EDITOR.getFontSizes()"); + this.confirm('javascript:RICH_EDITOR.getFontSizes()'); LogUtil.info(TAG, `runJavaScript success.`); } catch (error) { LogUtil.error(TAG, `runJavaScript failed.code:${JSON.stringify(error.code)},message:${JSON.stringify(error.message)}`); @@ -944,7 +970,7 @@ export struct EditContentDialogPortrait { this.selectFontColor = colorStr this.confirm("javascript:RICH_EDITOR.setTextColor('" + this.selectFontColor + "')") }) - }, colorStr => colorStr) + }, (colorStr: string) => colorStr) } } .height(48) @@ -984,5 +1010,6 @@ export struct EditContentDialogPortrait { .height(266) .backgroundColor($r("app.color.color_ffffff")) .borderRadius(36) + .offset({ y: -35 }) } } \ No newline at end of file diff --git a/features/src/main/ets/components/FolderListComp.ets b/features/src/main/ets/components/FolderListComp.ets index 5b256600ef83755380a55418de86851c2ba63468..f74c5557df6577425ab939a43476e5817e98ffb9 100644 --- a/features/src/main/ets/components/FolderListComp.ets +++ b/features/src/main/ets/components/FolderListComp.ets @@ -29,6 +29,7 @@ import RdbStoreUtil from '@ohos/utils/src/main/ets/default/baseUtil/RdbStoreUtil import FolderUtil from '@ohos/utils/src/main/ets/default/baseUtil/FolderUtil' import NoteUtil from '@ohos/utils/src/main/ets/default/baseUtil/NoteUtil' import { LogUtil } from '@ohos/utils/src/main/ets/default/baseUtil/LogUtil' +import webview from '@ohos.web.webview'; // Folder list component @Component @@ -37,7 +38,7 @@ export struct FolderListComp { @Consume('SectionStatus') sectionStatus: number @Consume('ExpandStatus') expandStatus: boolean // 笔记本折叠展开状态 @StorageLink('breakPoint') breakPoints: string = 'lg' - controllerShow: WebviewController + controllerShow: webview.WebviewController = new webview.WebviewController(); TAG = "FolderListComp" @Consume('AsideWidth') asideWidth: number @@ -78,7 +79,7 @@ export struct FolderListComp { FolderItemComp({ folderItem: folderItem, controllerShow: this.controllerShow }) } } - }, folderItem => folderItem.name.toString()) + }, (folderItem: FolderData) => folderItem.name.toString()) } .width('100%') .height(500) @@ -90,18 +91,19 @@ export struct FolderListComp { Column() { FolderItemComp({ - folderItem: FolderUtil.getFolderData(AppStorage.Get('AllFolderArray'), SysDefFolderUuid.MyFavorites), + folderItem: FolderUtil.getFolderData(AppStorage.Get('AllFolderArray')!, SysDefFolderUuid.MyFavorites), controllerShow: this.controllerShow }) FolderItemComp({ - folderItem: FolderUtil.getFolderData(AppStorage.Get('AllFolderArray'), SysDefFolderUuid.RecentDeletes), + folderItem: FolderUtil.getFolderData(AppStorage.Get('AllFolderArray')!, SysDefFolderUuid.RecentDeletes), controllerShow: this.controllerShow }) } .backgroundColor($r("app.color.folderlist_bgcolor_f1f3f5")) .flexGrow(0) .width("100%") - .padding({ left: 12, right: 12, bottom: 24 }) + .padding({ left: 12, right: 12, bottom: 60 }) + .margin({ bottom: 65 }) } .height("100%") .backgroundColor($r('app.color.folder_color_d6d6d6')) @@ -122,14 +124,18 @@ export struct NoteAndCreateComp { @StorageLink('AllFolderArray') AllFolderArray: FolderData[] = AppStorage.Link('AllFolderArray') @Consume('SelectedColor') selectedColor: string @Consume('PortraitModel') portraitModel: boolean - folderCreateDialogCtl: CustomDialogController = new CustomDialogController({ - builder: NewOrEditFolderDialog({ confirm: this.onCreateConfirm.bind(this), dialogType: 0 }), + folderCreateDialogCtl: CustomDialogController | null = new CustomDialogController({ + builder: NewOrEditFolderDialog({ confirm: (color: string, name: string) => { + this.onCreateConfirm(color, name) + }, dialogType: 0 }), alignment: DialogAlignment.Center, autoCancel: false, customStyle: true, }) - folderCreateDialogCtlBottom: CustomDialogController = new CustomDialogController({ - builder: NewOrEditFolderDialog({ confirm: this.onCreateConfirm.bind(this), dialogType: 0 }), + folderCreateDialogCtlBottom: CustomDialogController | null = new CustomDialogController({ + builder: NewOrEditFolderDialog({ confirm: (color: string, name: string) => { + this.onCreateConfirm(color, name) + }, dialogType: 0 }), alignment: DialogAlignment.Bottom, autoCancel: false, customStyle: true, @@ -144,7 +150,7 @@ export struct NoteAndCreateComp { let folderData = new FolderData(0, name, new Date().getTime() + "", color, FolderType.CusDef, Delete.No, new Date().getTime(), new Date().getTime()) // 新的的笔记本都是自定义类型 type为1 this.AllFolderArray.push(folderData) // insert folder to db - RdbStoreUtil.insert(TableName.FolderTable, folderData.toFolderObject(), null) + RdbStoreUtil.insert(TableName.FolderTable, folderData.toFolderObject(), null); AppStorage.SetOrCreate('isUpdate', true) } @@ -163,9 +169,9 @@ export struct NoteAndCreateComp { .onClick(() => { this.selectedColor = "#e84026" // 新建的时候选中第一个颜色 if (this.portraitModel) { - this.folderCreateDialogCtlBottom.open() + this.folderCreateDialogCtlBottom!.open(); } else { - this.folderCreateDialogCtl.open() + this.folderCreateDialogCtl!.open(); } }).padding({ right: 0 }) }.width(50) @@ -188,15 +194,17 @@ struct FolderItemComp { @Consume('Longpress') longpress: boolean @Consume('SelectedColor') selectedColor: string @Consume('PortraitModel') portraitModel: boolean - controllerShow: WebviewController + controllerShow: webview.WebviewController = new webview.WebviewController(); @State isLongPress: boolean = false TAG = "FolderItemComp" @StorageLink('isUpdate') isUpdate: boolean = false // Folder Edit Dialog - folderEditDialogCtl: CustomDialogController = new CustomDialogController({ + folderEditDialogCtl: CustomDialogController | null = new CustomDialogController({ builder: NewOrEditFolderDialog({ editFolderUuid: this.folderItem.uuid, - confirm: this.onEditConfirm.bind(this), + confirm: (color: string, name: string) => { + this.onEditConfirm(color, name); + }, dialogType: 1 }), alignment: DialogAlignment.Center, @@ -204,10 +212,12 @@ struct FolderItemComp { customStyle: true, }) // Folder Edit Dialog for portrait model - folderEditDialogCtlBottom: CustomDialogController = new CustomDialogController({ + folderEditDialogCtlBottom: CustomDialogController | null = new CustomDialogController({ builder: NewOrEditFolderDialog({ editFolderUuid: this.folderItem.uuid, - confirm: this.onEditConfirm.bind(this), + confirm: (color: string, name: string) => { + this.onEditConfirm(color, name); + }, dialogType: 1 }), alignment: DialogAlignment.Bottom, @@ -232,19 +242,24 @@ struct FolderItemComp { // update folder to db let predicates_folder = RdbStoreUtil.getRdbPredicates(TableName.FolderTable) predicates_folder.equalTo(FolderTableColumn.Uuid, this.folderItem.uuid) - RdbStoreUtil.update(this.folderItem.toFolderObject(), predicates_folder, null) + RdbStoreUtil.update(this.folderItem.toFolderObject(), predicates_folder, null); this.isUpdate = true } + // Folder Delete Dialog - folderDeleteDialogCtl: CustomDialogController = new CustomDialogController({ - builder: DeleteDialog({ onConfirm: this.onDeleteConfirm.bind(this), deleteFileType: DeleteFileType.FolderData }), + folderDeleteDialogCtl: CustomDialogController | null = new CustomDialogController({ + builder: DeleteDialog({ onConfirm: () => { + this.onDeleteConfirm(); + }, deleteFileType: DeleteFileType.FolderData }), alignment: DialogAlignment.Center, autoCancel: false, customStyle: true, }) // Folder Delete Dialog for portrait model - folderDeleteDialogCtlBottom: CustomDialogController = new CustomDialogController({ - builder: DeleteDialog({ onConfirm: this.onDeleteConfirm.bind(this), deleteFileType: DeleteFileType.FolderData }), + folderDeleteDialogCtlBottom: CustomDialogController | null = new CustomDialogController({ + builder: DeleteDialog({ onConfirm: () => { + this.onDeleteConfirm(); + }, deleteFileType: DeleteFileType.FolderData }), alignment: DialogAlignment.Bottom, autoCancel: false, customStyle: true, @@ -253,8 +268,8 @@ struct FolderItemComp { onDeleteConfirm() { let currentFolder = FolderUtil.getFolderData(this.AllFolderArray, this.folderItem.uuid) let index = this.AllFolderArray.indexOf(currentFolder) - let currentNoteDataArray = NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray'), this.folderItem.uuid) - let deleteNoteDataArray = NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray'), 'sys_def_recentDeletes_uuid') + let currentNoteDataArray = NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray')!, this.folderItem.uuid); + let deleteNoteDataArray = NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray')!, 'sys_def_recentDeletes_uuid'); if (index > -1) { this.AllFolderArray.splice(index, 1) if (deleteNoteDataArray.length != 0) { @@ -265,7 +280,7 @@ struct FolderItemComp { // update note to db let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, noteItem.uuid) - RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null) + RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null); } }) } @@ -277,16 +292,16 @@ struct FolderItemComp { // update note to db let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, noteItem.uuid) - RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null) + RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null); }) } // delete folder from db let predicates_folder = RdbStoreUtil.getRdbPredicates(TableName.FolderTable) predicates_folder.equalTo(FolderTableColumn.Uuid, this.folderItem.uuid) - RdbStoreUtil.delete(predicates_folder, null) + RdbStoreUtil.delete(predicates_folder, null); // update selectedFolderData and selectedNoteData this.selectedFolderData = FolderUtil.getFolderData(this.AllFolderArray, SysDefFolderUuid.AllNotes) - this.selectedNoteData = NoteUtil.getFirstNoteData(this.AllNoteArray, SysDefFolderUuid.AllNotes) + this.selectedNoteData = NoteUtil.getFirstNoteData(this.AllNoteArray, SysDefFolderUuid.AllNotes)!; if (!this.selectedNoteData) { return } @@ -308,26 +323,32 @@ struct FolderItemComp { } this.isUpdate = true } + // Folder Create Dialog - folderCreateDialogCtl: CustomDialogController = new CustomDialogController({ - builder: NewOrEditFolderDialog({ confirm: this.onCreateConfirm.bind(this), dialogType: 0 }), + folderCreateDialogCtl: CustomDialogController | null = new CustomDialogController({ + builder: NewOrEditFolderDialog({ confirm: (color: string, name: string) => { + this.onCreateConfirm(color, name); + }, dialogType: 0 }), alignment: DialogAlignment.Center, autoCancel: false, customStyle: true, }) // Folder Create Dialog for portrait model - folderCreateDialogCtlBottom: CustomDialogController = new CustomDialogController({ - builder: NewOrEditFolderDialog({ confirm: this.onCreateConfirm.bind(this), dialogType: 0 }), + folderCreateDialogCtlBottom: CustomDialogController | null = new CustomDialogController({ + builder: NewOrEditFolderDialog({ confirm: (color: string, name: string) => { + this.onCreateConfirm(color, name); + }, dialogType: 0 }), alignment: DialogAlignment.Bottom, autoCancel: false, customStyle: true, }) + // Folder Create Callback onCreateConfirm(color: string, name: string) { let folderData = new FolderData(0, name, new Date().getTime() + "", color, FolderType.CusDef, Delete.No, new Date().getTime(), new Date().getTime()) // 新的的笔记本都是自定义类型 type为1 this.AllFolderArray.push(folderData) // insert folder to db - RdbStoreUtil.insert(TableName.FolderTable, folderData.toFolderObject(), null) + RdbStoreUtil.insert(TableName.FolderTable, folderData.toFolderObject(), null); this.isUpdate = true } @@ -342,9 +363,9 @@ struct FolderItemComp { .onClick(() => { this.selectedColor = this.folderItem.color if (this.portraitModel) { - this.folderEditDialogCtlBottom.open() + this.folderEditDialogCtlBottom!.open(); } else { - this.folderEditDialogCtl.open() + this.folderEditDialogCtl!.open(); } ContextMenu.close() }) @@ -359,9 +380,9 @@ struct FolderItemComp { .fontColor($r("app.color.folder_color_182431")) .onClick(() => { if (this.portraitModel) { - this.folderDeleteDialogCtlBottom.open() + this.folderDeleteDialogCtlBottom!.open(); } else { - this.folderDeleteDialogCtl.open() + this.folderDeleteDialogCtl!.open(); } ContextMenu.close() }) @@ -377,9 +398,9 @@ struct FolderItemComp { .onClick(() => { this.selectedColor = "#e84026" // 新建的时候选中第一个颜色 if (this.portraitModel) { - this.folderCreateDialogCtlBottom.open() + this.folderCreateDialogCtlBottom!.open(); } else { - this.folderCreateDialogCtl.open() + this.folderCreateDialogCtl!.open(); } ContextMenu.close() }) @@ -436,15 +457,21 @@ struct FolderItemComp { NoteUtil.unsetAllNotesChecked(this.CheckedNoteArray) } else { this.selectedFolderData = this.folderItem - this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray'), this.folderItem.uuid) + this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray')!, this.folderItem.uuid)!; if (!this.selectedNoteData) { return } // 刷新web界面 if (this.portraitModel == false) { - this.controllerShow.runJavaScript( - "RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text + "')" - ) + try { + this.controllerShow.runJavaScript( + "RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text + "')" + ); + LogUtil.info(this.TAG, `onClick runJavaScript setHtml success.`); + } catch (error) { + LogUtil.error(this.TAG, `onClick runJavaScript setHtml failed,code:${JSON.stringify(error.code)}, + message:${JSON.stringify(error.message)}.`); + } } // save continue data let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()) @@ -488,22 +515,28 @@ struct FolderItemComp { .height(56) .padding({ left: 12, right: 12 }) .backgroundColor(this.isLongPress ? $r("app.color.folder_color_19182431") : this.selectedFolderData.uuid == this.folderItem.uuid - ? $r("app.color.folder_color_ffffff") : "#00FFFFFF") + ? $r("app.color.folder_color_ffffff") : "#00FFFFFF") .onClick(() => { if (this.longpress) { this.longpress = false NoteUtil.unsetAllNotesChecked(this.CheckedNoteArray) } else { this.selectedFolderData = this.folderItem - this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray'), this.folderItem.uuid) + this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray')!, this.folderItem.uuid)!; if (!this.selectedNoteData) { return } // 刷新web界面 if (this.portraitModel == false) { - this.controllerShow.runJavaScript( - "RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text + "')" - ) + try { + this.controllerShow.runJavaScript( + "RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text + "')" + ); + LogUtil.info(this.TAG, `else runJavaScript setHtml success.`); + } catch (error) { + LogUtil.info(this.TAG, `else runJavaScript setHtml failed.code:${JSON.stringify(error.code)}, + message:${JSON.stringify(error.message)}`); + } } // save continue data let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()) @@ -518,17 +551,17 @@ struct FolderItemComp { .width('100%') .height(56) .parallelGesture( - GestureGroup(GestureMode.Exclusive, - LongPressGesture() - .onAction(() => { - this.isLongPress = true - this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0) - }) - .onActionEnd(() => { - this.isLongPress = false - this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0) - }) - ) + GestureGroup(GestureMode.Exclusive, + LongPressGesture() + .onAction(() => { + this.isLongPress = true; + this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0); + }) + .onActionEnd(() => { + this.isLongPress = false; + this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0); + }) + ) ) } } \ No newline at end of file diff --git a/features/src/main/ets/components/NoteContent.ets b/features/src/main/ets/components/NoteContent.ets index c3689252f7401c6bd4ede9f2705d8ff5ec72961b..b0482eab020591c1617d68e5597cf43ce52c7bac 100644 --- a/features/src/main/ets/components/NoteContent.ets +++ b/features/src/main/ets/components/NoteContent.ets @@ -23,8 +23,9 @@ import { NoteTableColumn, SysDefFolderUuid, Favorite, - Delete -} from '@ohos/utils/src/main/ets/default/model/databaseModel/EnumData' + Delete, + FolderType +} from '@ohos/utils/src/main/ets/default/model/databaseModel/EnumData'; import StyleConstants from '@ohos/utils/src/main/ets/default/constants/StyleConstants' import { EditContentDialog, EditTitleDialog } from './CusDialogComp' import FolderUtil from '@ohos/utils/src/main/ets/default/baseUtil/FolderUtil' @@ -34,19 +35,30 @@ import OperationUtils from '@ohos/utils/src/main/ets/default/baseUtil/OperationU import router from '@system.router'; import inputMethod from '@ohos.inputMethod'; import { folderTextMap } from '@ohos/utils/src/main/ets/default/model/NoteBaseData' +import webview from '@ohos.web.webview'; +import common from '@ohos.app.ability.common'; -const TAG = "NoteContent" +const TAG: string = 'NoteContent'; -var timeID: number +let timeID: number = 0; +let noteContext = AppStorage.Get('noteContext')!; + +interface NoteContentType { + callbackhtml: (html: string) => void; + callbackImagePath: (imgName: string) => void; + callbackScheduledSave: (html: string) => void; + callbackPasteImage: (html: string) => void; + callbackGetSize: (fontSize: number) => void; +} @Component export struct NoteContent { - @Provide('SelectedNoteData') selectedNoteData: NoteData = AppStorage.Get('NewNote') + @Provide('SelectedNoteData') selectedNoteData: NoteData = AppStorage.Get('NewNote')!; @StorageLink('AllNoteArray') AllNoteArray: NoteData[] = AppStorage.Link('AllNoteArray') @Provide('Issave') issave: number = 0 @Provide('EditModel') editModel: boolean = false @StorageLink('dpi') dpi: number = 240 - controllerShow: WebviewController + controllerShow: webview.WebviewController = new webview.WebviewController(); private editContentFlag = false @StorageLink('ScrollTopPercent') scrollTopPercent: number = 0.0 @@ -61,7 +73,7 @@ export struct NoteContent { if (!AppStorage.Has('remoteScrollTopPercent')) { return } - var scrollTopPercent = AppStorage.Get('remoteScrollTopPercent') + let scrollTopPercent = AppStorage.Get('remoteScrollTopPercent')!; if (scrollTopPercent < 0) { return } @@ -82,8 +94,8 @@ export struct NoteContent { AppStorage.Delete('isRemoteFocusOnSearch') } - noteContent = { - callbackhtml: (html) => { + noteContent: NoteContentType = { + callbackhtml: (html: string) => { LogUtil.info(TAG, 'note uuid is:' + this.selectedNoteData.uuid) this.selectedNoteData.content_text = NoteUtil.contrastInitType(this.selectedNoteData.content_text); if (this.selectedNoteData.content_text === html ) { @@ -93,7 +105,7 @@ export struct NoteContent { this.selectedNoteData.modified_time = new Date().getTime() let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid) - RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null) + RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null); LogUtil.info(TAG, 'update note success:' + this.selectedNoteData.uuid) AppStorage.SetOrCreate('NewNote', this.selectedNoteData) AppStorage.SetOrCreate('needRefresh', true) @@ -102,13 +114,13 @@ export struct NoteContent { AppStorage.SetOrCreate('ContinueNote', continueNote) LogUtil.info(TAG, "callbackhtml, set continue note success") }, - callbackImagePath: (imgName) => { + callbackImagePath: (imgName: string) => { // updata note image LogUtil.info(TAG, 'note imgPath is:' + imgName) this.selectedNoteData.content_img = imgName }, - callbackScheduledSave: (html) => { + callbackScheduledSave: (html: string) => { LogUtil.info(TAG, 'callbackScheduledSave') if (this.selectedNoteData.content_text == html) { LogUtil.info(TAG, 'callbackScheduledSave the same value return') @@ -118,7 +130,7 @@ export struct NoteContent { this.selectedNoteData.modified_time = new Date().getTime() let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid) - RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null) + RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null); LogUtil.info(TAG, 'callbackScheduledSave, update note success:' + this.selectedNoteData.uuid) // save continue data let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()) @@ -126,14 +138,14 @@ export struct NoteContent { AppStorage.SetOrCreate('ContinueNote', continueNote) LogUtil.info(TAG, 'callbackScheduledSave, set continue note success') }, - callbackPasteImage: (html) => { + callbackPasteImage: (html: string) => { if (html) { LogUtil.info(TAG, 'paste info' + html) let realHtml = "" - let base64regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/ + let base64regex: RegExp = new RegExp('/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/'); if (html && html.indexOf("base64") > 0) { LogUtil.info(TAG, " getSrcFromHtml, src[1] : " + html) - let imgData = html.split(',')[1]; + let imgData: string = html.split(',')[1]; let imgType = 'png' if (html.indexOf("jpeg") > 0) { imgType = 'jpg' @@ -156,7 +168,7 @@ export struct NoteContent { LogUtil.info(TAG, 'paste info22223') } }, - callbackGetSize: (fontSize) => { + callbackGetSize: (fontSize: number) => { if (fontSize === 16) { this.selectedNoteData.slider_value = 0 } else if (fontSize === 18) { @@ -208,7 +220,7 @@ export struct NoteContent { "RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text + "')", () => { // wait for the image in the note to load - setTimeout(function () { + setTimeout(() => { self.restoreScrollTop() self.restoreFocus() }, 100) @@ -232,7 +244,13 @@ export struct NoteContent { clearInterval(timeID) } timeID = setInterval(() => { - this.controllerShow.runJavaScript("scheduledSaveContent()") + try { + this.controllerShow.runJavaScript("scheduledSaveContent()"); + LogUtil.info(TAG, `runJavaScript scheduledSaveContent success.`); + } catch (error) { + LogUtil.info(TAG, `runJavaScript scheduledSaveContent failed.code:${JSON.stringify(error.code)}, + message:${JSON.stringify(error.message)}`); + } }, 3000) LogUtil.info(TAG, "setInterval timeID : " + timeID) this.issave = 0 @@ -265,9 +283,11 @@ export struct ToolBarComp { @StorageLink('AllNoteArray') AllNoteArray: NoteData[] = AppStorage.Link('AllNoteArray') @Consume('Issave') issave: number @Consume('EditModel') editModel: boolean - controllerShow: WebviewController - editContentDialogCtl: CustomDialogController = new CustomDialogController({ - builder: EditContentDialog({ confirm: this.confirm.bind(this) }), + controllerShow: webview.WebviewController = new webview.WebviewController(); + editContentDialogCtl: CustomDialogController | null = new CustomDialogController({ + builder: EditContentDialog({ confirm: (newTitle: string) => { + this.confirm(newTitle); + } }), alignment: DialogAlignment.Bottom, autoCancel: true, customStyle: true, @@ -288,8 +308,15 @@ export struct ToolBarComp { .height(24) .width(24) .onClick(() => { - this.controllerShow.runJavaScript("RICH_EDITOR.setInputEnabled(false)") - this.controllerShow.runJavaScript("getHtmlContent()") + try { + this.controllerShow.runJavaScript("RICH_EDITOR.setInputEnabled(false)"); + this.controllerShow.runJavaScript("getHtmlContent()"); + LogUtil.info(TAG, `runJavaScript setInputEnabled and getHtmlContent success.`); + } catch (error) { + LogUtil.info(TAG, `runJavaScript setInputEnabled and getHtmlContent fail.code:${JSON.stringify(error.code)}, + message:${JSON.stringify(error.message)}`); + } + // 清除定时器 if (timeID != undefined) { LogUtil.info(TAG, "zoom, clearInterval timeID : " + timeID) @@ -331,7 +358,6 @@ export struct ToolBarComp { .width(24) .onClick(() => { // 退出键盘 - // @ts-ignore inputMethod.getController().stopInputSession(); // 清单 this.controllerShow.runJavaScript("javascript:RICH_EDITOR.setTodo()") @@ -347,10 +373,9 @@ export struct ToolBarComp { .width(24) .onClick(() => { // 退出键盘 - // @ts-ignore inputMethod.getController().stopInputSession(); LogUtil.info(TAG, 'editContentDialogCtl start') - this.editContentDialogCtl.open() + this.editContentDialogCtl!.open(); }) }.width(42) .height(42) @@ -361,27 +386,26 @@ export struct ToolBarComp { Image($r('app.media.picture_white')).height(24).width(24) .onClick(async () => { // 退出键盘 - // @ts-ignore inputMethod.getController().stopInputSession(); LogUtil.info(TAG, 'startAbility start') - await globalThis.noteContext.startAbilityForResult({ + await noteContext.startAbilityForResult({ parameters: { uri: "singleselect" }, bundleName: "com.ohos.photos", abilityName: "com.ohos.photos.MainAbility", }) - .then(v => { + .then((v: common.AbilityResult) => { let want = v['want']; if (want != null && want != undefined) { let param = want['parameters']; let imageUri = "" if (param != null && param != undefined) { - let uri = param['select-item-list']; + let uri = param['select-item-list'] as Record; imageUri = uri[0]; } // 拷贝 if (imageUri != null && imageUri != "") { OperationUtils.copy(imageUri).then((uriPath) => { - var path = "file://" + uriPath + let path = 'file://' + uriPath; LogUtil.info(TAG, 'image uri is:' + path) this.controllerShow.runJavaScript( "javascript:RICH_EDITOR.insertImage('" + path + "')" @@ -405,7 +429,6 @@ export struct ToolBarComp { .width(24) .onClick(() => { // 退出键盘 - // @ts-ignore inputMethod.getController().stopInputSession(); this.controllerShow.runJavaScript("RICH_EDITOR.undo()") }) @@ -420,7 +443,6 @@ export struct ToolBarComp { .width(24) .onClick(() => { // 退出键盘 - // @ts-ignore inputMethod.getController().stopInputSession(); this.controllerShow.runJavaScript("RICH_EDITOR.redo()") }) @@ -458,8 +480,10 @@ export struct NoteContentOverViewComp { @StorageLink('AllFolderArray') AllFolderArray: FolderData[] = [] @StorageLink('CheckedNoteArray') CheckedNoteArray: NoteData[] = [] @StorageLink('isUpdate') isUpdate: boolean = false - editTitleDialogCtl: CustomDialogController = new CustomDialogController({ - builder: EditTitleDialog({ confirm: this.confirm.bind(this) }), + editTitleDialogCtl: CustomDialogController | null = new CustomDialogController({ + builder: EditTitleDialog({ confirm: (newTitle: string) => { + this.confirm(newTitle); + } }), alignment: DialogAlignment.Center, autoCancel: false, customStyle: true, @@ -474,7 +498,7 @@ export struct NoteContentOverViewComp { this.selectedNoteData.modified_time = new Date().getTime() let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid) - RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null) + RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null); // save continue data let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()) AppStorage.SetOrCreate('ContinueNote', continueNote) @@ -485,7 +509,7 @@ export struct NoteContentOverViewComp { @Builder MenuBuilder() { Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { List() { - ForEach(this.AllFolderArray, (item) => { + ForEach(this.AllFolderArray, (item: FolderData) => { ListItem() { NoteDataMoveItemComp({ folderItem: item }) } @@ -493,14 +517,14 @@ export struct NoteContentOverViewComp { this.selectedNoteData.folder_uuid = item.uuid let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid) - RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null) + RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null); // save continue data let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()) AppStorage.SetOrCreate('ContinueNote', continueNote) LogUtil.info(TAG, "NoteContentOverViewComp MenuBuilder, set continue note success") NoteUtil.refreshAll() }) - }, noteItem => JSON.stringify(noteItem)) + }, (noteItem: NoteData) => JSON.stringify(noteItem)) }.listDirection(Axis.Vertical) .edgeEffect(EdgeEffect.Spring) .height(this.AllFolderArray.length > 12 ? 504 : (this.AllFolderArray.length - 3) * 56) @@ -521,7 +545,7 @@ export struct NoteContentOverViewComp { .margin({ left: 12, right: 24 }) .onClick(() => { clearInterval(timeID) - this.editTitleDialogCtl.open() + this.editTitleDialogCtl!.open(); }) }.height(40) .width(StyleConstants.PERCENTAGE_100) @@ -535,7 +559,7 @@ export struct NoteContentOverViewComp { .margin({ left: 12 }) Row() { Text(FolderUtil.getFolderText(FolderUtil.getFolderData(AppStorage.Get('AllFolderArray'), this.selectedNoteData.folder_uuid)) == - folderTextMap["sys_def_myFavorites_uuid"] ? folderTextMap["sys_def_unClassified_uuid"] : + folderTextMap.sys_def_myFavorites_uuid ? folderTextMap.sys_def_unClassified_uuid : FolderUtil.getFolderText(FolderUtil.getFolderData(AppStorage.Get('AllFolderArray'), this.selectedNoteData.folder_uuid))) .id(this.isUpdate + '') .fontSize(12) @@ -548,7 +572,7 @@ export struct NoteContentOverViewComp { .padding({ left: 8, right: 8, top: 4, bottom: 4 }) .margin({ left: 8 }) .borderRadius(16) - .backgroundColor(NoteUtil.getNoteBgColor(AppStorage.Get('AllFolderArray'), this.selectedNoteData.folder_uuid, SysDefFolderUuid.AllNotes, false)) + .backgroundColor(NoteUtil.getNoteBgColor(AppStorage.Get('AllFolderArray')!, this.selectedNoteData.folder_uuid, SysDefFolderUuid.AllNotes, false)) .bindMenu(this.MenuBuilder) }.alignItems(VerticalAlign.Top).height(40).width(StyleConstants.PERCENTAGE_100) } @@ -563,7 +587,7 @@ export struct NoteContentOverViewComp { struct NoteDataMoveItemComp { @StorageLink('CheckedNoteArray') CheckedNoteArray: NoteData[] = [] @StorageLink('AllFolderArray') AllFolderArray: FolderData[] = [] - private folderItem: FolderData + private folderItem: FolderData = new FolderData(0, '', new Date().getTime() + '', '', FolderType.CusDef, Delete.No, new Date().getTime(), new Date().getTime()); build() { Flex({ alignItems: ItemAlign.Center, wrap: FlexWrap.NoWrap, justifyContent: FlexAlign.Center }) { diff --git a/features/src/main/ets/components/NoteContentComp.ets b/features/src/main/ets/components/NoteContentComp.ets index 555d401d1029780e128b467819a1fcfd45136850..9654e7cdddd44041023ab7a9829b1f2f67ff8e95 100644 --- a/features/src/main/ets/components/NoteContentComp.ets +++ b/features/src/main/ets/components/NoteContentComp.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -13,208 +13,263 @@ * limitations under the License. */ -import DateUtil from '@ohos/utils/src/main/ets/default/baseUtil/DateUtil' -import RdbStoreUtil from '@ohos/utils/src/main/ets/default/baseUtil/RdbStoreUtil' -import FolderData from '@ohos/utils/src/main/ets/default/model/databaseModel/FolderData' -import NoteData from '@ohos/utils/src/main/ets/default/model/databaseModel/NoteData' +import DateUtil from '@ohos/utils/src/main/ets/default/baseUtil/DateUtil'; +import RdbStoreUtil from '@ohos/utils/src/main/ets/default/baseUtil/RdbStoreUtil'; +import FolderData from '@ohos/utils/src/main/ets/default/model/databaseModel/FolderData'; +import NoteData from '@ohos/utils/src/main/ets/default/model/databaseModel/NoteData'; import { TableName, NoteTableColumn, SysDefFolderUuid, Favorite, - Delete -} from '@ohos/utils/src/main/ets/default/model/databaseModel/EnumData' -import StyleConstants from '@ohos/utils/src/main/ets/default/constants/StyleConstants' -import { EditContentDialog, DeleteDialog, EditTitleDialog } from './CusDialogComp' -import FolderUtil from '@ohos/utils/src/main/ets/default/baseUtil/FolderUtil' -import NoteUtil from '@ohos/utils/src/main/ets/default/baseUtil/NoteUtil' -import prompt from '@system.prompt' -import util from '@ohos.util' -import { LogUtil } from '@ohos/utils/src/main/ets/default/baseUtil/LogUtil' -import OperationUtils from '@ohos/utils/src/main/ets/default/baseUtil/OperationUtils' -import mediaquery from '@ohos.mediaquery' + Delete, + FolderType +} from '@ohos/utils/src/main/ets/default/model/databaseModel/EnumData'; +import StyleConstants from '@ohos/utils/src/main/ets/default/constants/StyleConstants'; +import { EditContentDialog, DeleteDialog, EditTitleDialog } from './CusDialogComp'; +import FolderUtil from '@ohos/utils/src/main/ets/default/baseUtil/FolderUtil'; +import NoteUtil from '@ohos/utils/src/main/ets/default/baseUtil/NoteUtil'; +import { promptAction } from '@kit.ArkUI'; +import util from '@ohos.util'; +import { LogUtil } from '@ohos/utils/src/main/ets/default/baseUtil/LogUtil'; +import OperationUtils from '@ohos/utils/src/main/ets/default/baseUtil/OperationUtils'; +import mediaquery from '@ohos.mediaquery'; import inputMethod from '@ohos.inputMethod'; -import { folderTextMap } from '@ohos/utils/src/main/ets/default/model/NoteBaseData' -import abilityAccessCtrl from '@ohos.abilityAccessCtrl'; +import { folderTextMap } from '@ohos/utils/src/main/ets/default/model/NoteBaseData'; +import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl'; +import webview from '@ohos.web.webview'; +import common from '@ohos.app.ability.common'; +import { BusinessError } from '@ohos.base'; +import resourceManager from '@ohos.resourceManager'; -const TAG = "NoteContentComp" +const TAG = 'NoteContentComp'; -var timeId: number +let timeId: number = 0; +let noteContext = AppStorage.Get('noteContext')!; // Note content component -let inSetValue = AppStorage.Link('inSetValue') +let inSetValue: string = AppStorage.Link('inSetValue'); + +interface NoteContentType { + callbackhtml: (html: string) => void; + callbackImagePath: (imgName: string) => void; + callbackhtmlSave: (html: string) => void; + callbackScheduledSave: (html: string) => void; + callbackPasteImage: (html: string) => void; + callbackGetSize: (fontSize: number) => void; +} @Component export struct NoteContentComp { - @Consume('SelectedNoteData') selectedNoteData: NoteData - @StorageLink('AllNoteArray') AllNoteArray: NoteData[] = AppStorage.Link('AllNoteArray') - @Consume('SelectedFolderData') selectedFolderData: FolderData - @Consume('RefreshFlag') refreshFlag: number - @Consume('EditModel') editModel: boolean - @Consume('SectionStatus') sectionStatus: number - @Consume('LastSectionStatus') lastSectionStatus: number - @Consume('Issave') issave: number - @Consume('Search') search: boolean - @StorageLink('dpi') dpi: number = 240 - controllerShow: WebviewController - private editContentFlag = false - @State uri1: string = "" - private context = getContext(this) - @StorageLink('ScrollTopPercent') scrollTopPercent: number = 0.0 - @StorageLink('isUpdate') isUpdate: boolean = false - @StorageLink('refreshCurrentNote') @Watch('isDataChange') refreshCurrentNote: boolean = false - @Consume('AsideWidth') asideWidth: number + @Consume('SelectedNoteData') selectedNoteData: NoteData; + @StorageLink('AllNoteArray') AllNoteArray: NoteData[] = AppStorage.Link('AllNoteArray'); + @Consume('SelectedFolderData') selectedFolderData: FolderData; + @Consume('RefreshFlag') refreshFlag: number; + @Consume('EditModel') editModel: boolean; + @Consume('SectionStatus') sectionStatus: number; + @Consume('LastSectionStatus') lastSectionStatus: number; + @Consume('Issave') issave: number; + @Consume('Search') search: boolean; + @StorageLink('dpi') dpi: number = 240; + controllerShow: webview.WebviewController = new webview.WebviewController(); + private editContentFlag = false; + @State uri1: string = ""; + private context = getContext(this); + @StorageLink('ScrollTopPercent') scrollTopPercent: number = 0.0; + @StorageLink('isUpdate') isUpdate: boolean = false; + @StorageLink('refreshCurrentNote') @Watch('isDataChange') refreshCurrentNote: boolean = false; + @Consume('AsideWidth') asideWidth: number; isDataChange() { if (!this.refreshCurrentNote) { - return + return; + } + try { + this.controllerShow.runJavaScript("RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text + "')"); + LogUtil.info(TAG, `runJavaScript setHtml success.`); + } catch (error) { + LogUtil.error(TAG, `runJavaScript setHtml failed.code:${JSON.stringify(error.code)}, + message:${JSON.stringify(error.message)}`); } - this.controllerShow.runJavaScript("RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text + "')") - this.refreshCurrentNote = false + this.refreshCurrentNote = false; } storeScrollTop(scrollTop: number) { if (scrollTop < 0) { - return + return; } - AppStorage.SetOrCreate('ScrollTopPercent', scrollTop / this.controllerShow.getPageHeight()) + AppStorage.SetOrCreate('ScrollTopPercent', scrollTop / this.controllerShow.getPageHeight()); } restoreScrollTop() { - if (!AppStorage.Has('remoteScrollTopPercent')) { - return - } - var scrollTopPercent = AppStorage.Get('remoteScrollTopPercent') - if (scrollTopPercent < 0) { - return + try { + if (!AppStorage.Has('remoteScrollTopPercent')) { + return; + } + let scrollTopPercent = AppStorage.Get('remoteScrollTopPercent')!; + if (scrollTopPercent < 0) { + return; + } + this.controllerShow.runJavaScript( + 'document.documentElement.scrollTop = ' + this.controllerShow.getPageHeight() * scrollTopPercent + ) + } catch (error) { + LogUtil.error(TAG, `restoreScrollTop failed.code:${JSON.stringify(error.code)}, + message:${JSON.stringify(error.message)}`); } - this.controllerShow.runJavaScript( - 'document.documentElement.scrollTop = ' + this.controllerShow.getPageHeight() * scrollTopPercent - ) } restoreFocus() { if (!AppStorage.Has('isRemoteFocusOnSearch')) { - return + return; } - let isRemoteFocusOnSearch = AppStorage.Get('isRemoteFocusOnSearch') + let isRemoteFocusOnSearch = AppStorage.Get('isRemoteFocusOnSearch'); if (isRemoteFocusOnSearch) { - focusControl.requestFocus('searchInput') + focusControl.requestFocus('searchInput'); } - AppStorage.Delete('isRemoteFocusOnSearch') + AppStorage.Delete('isRemoteFocusOnSearch'); } - noteContent = { + noteContent: NoteContentType = { callbackhtml: (html) => { - LogUtil.info(TAG, 'note uuid is:' + this.selectedNoteData.uuid) - this.selectedNoteData.content_text = NoteUtil.contrastInitType(this.selectedNoteData.content_text); - if (this.selectedNoteData.content_text === html ) { - return; - }; - this.selectedNoteData.content_text = html - this.selectedNoteData.modified_time = new Date().getTime() - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid) - RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null) - LogUtil.info(TAG, 'update note success:' + this.selectedNoteData.uuid) - // save continue data - let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()) - AppStorage.SetOrCreate('ContinueNote', continueNote) - LogUtil.info(TAG, "callbackhtml, set continue note success") - return "AceString" + try { + LogUtil.info(TAG, 'note uuid is:' + this.selectedNoteData.uuid); + this.selectedNoteData.content_text = NoteUtil.contrastInitType(this.selectedNoteData.content_text); + if (this.selectedNoteData.content_text === html) { + return; + } + ; + this.selectedNoteData.content_text = html; + this.selectedNoteData.modified_time = new Date().getTime(); + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid); + RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicatesNote, null); + LogUtil.info(TAG, 'update note success:' + this.selectedNoteData.uuid); + // save continue data + let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()); + AppStorage.SetOrCreate('ContinueNote', continueNote); + LogUtil.info(TAG, 'callbackhtml, set continue note success'); + return 'AceString'; + } catch (error) { + LogUtil.error(TAG, 'callbackhtml error: ' + JSON.stringify(error)); + return 'AceString'; + } }, callbackImagePath: (imgName) => { // updata note image - LogUtil.info(TAG, 'note imgName is:' + imgName) - this.selectedNoteData.content_img = imgName + try { + LogUtil.info(TAG, 'note imgName is:' + imgName); + this.selectedNoteData.content_img = imgName; + LogUtil.info(TAG, 'set content_img success'); + } catch (error) { + LogUtil.error(TAG, 'callbackImagePath error: ' + JSON.stringify(error)); + } }, callbackhtmlSave: (html) => { - LogUtil.info(TAG, 'note uuid is:' + this.selectedNoteData.uuid) - this.selectedNoteData.content_text = html - this.selectedNoteData.modified_time = new Date().getTime() - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid) - RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null) - LogUtil.info(TAG, 'update note success:' + this.selectedNoteData.uuid) - this.sectionStatus = this.lastSectionStatus - this.sectionStatus = mediaquery.matchMediaSync('(width < 2000)').matches ? 2 : 3 - // save continue data - let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()) - AppStorage.SetOrCreate('ContinueNote', continueNote) - AppStorage.SetOrCreate('ContinueSection', this.sectionStatus) - LogUtil.info(TAG, "callbackhtmlSave, set continue note and section success") - return "AceString" + try { + LogUtil.info(TAG, 'note uuid is:' + this.selectedNoteData.uuid); + this.selectedNoteData.content_text = html; + this.selectedNoteData.modified_time = new Date().getTime(); + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid); + RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicatesNote, null); + LogUtil.info(TAG, 'update note success:' + this.selectedNoteData.uuid); + this.sectionStatus = this.lastSectionStatus; + this.sectionStatus = mediaquery.matchMediaSync('(width < 2000)').matches ? 2 : 3; + // save continue data + let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()); + AppStorage.SetOrCreate('ContinueNote', continueNote); + AppStorage.SetOrCreate('ContinueSection', this.sectionStatus); + LogUtil.info(TAG, 'callbackhtmlSave, set continue note and section success'); + return 'AceString'; + } catch (error) { + LogUtil.error(TAG, 'callbackhtmlSave error: ' + JSON.stringify(error)); + return 'AceString'; + } }, callbackScheduledSave: (html) => { - LogUtil.info(TAG, 'callbackScheduledSave') - if (this.selectedNoteData.content_text == html) { - LogUtil.info(TAG, 'callbackScheduledSave the same value return') - return; + try { + LogUtil.info(TAG, 'callbackScheduledSave'); + if (this.selectedNoteData.content_text == html) { + LogUtil.info(TAG, 'callbackScheduledSave the same value return'); + return; + } + this.selectedNoteData.content_text = html; + this.selectedNoteData.modified_time = new Date().getTime(); + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid); + RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicatesNote, null); + LogUtil.info(TAG, 'callbackScheduledSave, update note success:' + this.selectedNoteData.uuid); + // save continue data + let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()); + AppStorage.SetOrCreate('ContinueNote', continueNote); + LogUtil.info(TAG, 'callbackScheduledSave, set continue note success'); + } catch (error) { + LogUtil.error(TAG, 'callbackScheduledSave error: ' + JSON.stringify(error)); } - this.selectedNoteData.content_text = html - this.selectedNoteData.modified_time = new Date().getTime() - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid) - RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null) - LogUtil.info(TAG, 'callbackScheduledSave, update note success:' + this.selectedNoteData.uuid) - // save continue data - let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()) - AppStorage.SetOrCreate('ContinueNote', continueNote) - LogUtil.info(TAG, 'callbackScheduledSave, set continue note success') }, callbackPasteImage: (html) => { - if (html) { - LogUtil.info(TAG, 'paste info' + html) - let realHtml = "" - let base64regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/ - if (html && html.indexOf("base64") > 0) { - LogUtil.info(TAG, " getSrcFromHtml, src[1] : " + html) - let imgData = html.split(',')[1]; - let imgType = 'png' - if (html.indexOf("jpeg") > 0) { - imgType = 'jpg' - } else if (html.indexOf("gif") > 0) { - imgType = 'gif' - } - let filePath = "" - if (base64regex.test(imgData)) { - let base64 = new util.Base64() - let decodeArr = base64.decodeSync(imgData) - filePath = OperationUtils.saveImageData(decodeArr, imgType) - } else { - filePath = OperationUtils.saveImage(imgData, imgType) + try { + if (html) { + LogUtil.info(TAG, 'paste info' + html); + let realHtml = ""; + let base64regex: RegExp = new RegExp('/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/'); + if (html && html.indexOf('base64') > 0) { + LogUtil.info(TAG, ' getSrcFromHtml, src[1] : ' + html); + let imgData = html.split(',')[1]; + let imgType = 'png'; + if (html.indexOf('jpeg') > 0) { + imgType = 'jpg'; + } else if (html.indexOf('gif') > 0) { + imgType = 'gif'; + } + let filePath = ""; + if (base64regex.test(imgData)) { + let base64 = new util.Base64(); + let decodeArr = base64.decodeSync(imgData); + filePath = OperationUtils.saveImageData(decodeArr, imgType); + } else { + filePath = OperationUtils.saveImage(imgData, imgType); + } + realHtml = 'file://' + filePath; } - realHtml = "file://" + filePath + LogUtil.info(TAG, 'paste info11-' + realHtml); + this.controllerShow.runJavaScript("javascript:RICH_EDITOR.insertImageHtml('" + realHtml + "')"); + LogUtil.info(TAG, 'paste info11--' + realHtml); + } else { + LogUtil.info(TAG, 'paste info22225'); } - LogUtil.info(TAG, 'paste info11-' + realHtml) - this.controllerShow.runJavaScript("javascript:RICH_EDITOR.insertImageHtml('" + realHtml + "')") - LogUtil.info(TAG, 'paste info11--' + realHtml) - } else { - LogUtil.info(TAG, 'paste info22225') + } catch (error) { + LogUtil.error(TAG, `callbackPasteImage failed.code:${JSON.stringify(error.code)}, + message:${JSON.stringify(error.message)}`); } }, callbackGetSize: (fontSize) => { if (fontSize === 16) { - this.selectedNoteData.slider_value = 0 + this.selectedNoteData.slider_value = 0; } else if (fontSize === 18) { - this.selectedNoteData.slider_value = 4 + this.selectedNoteData.slider_value = 4; } else if (fontSize === 24) { - this.selectedNoteData.slider_value = 8 + this.selectedNoteData.slider_value = 8; } else if (fontSize === 32) { - this.selectedNoteData.slider_value = 12 + this.selectedNoteData.slider_value = 12; } else if (fontSize === 48) { - this.selectedNoteData.slider_value = 16 + this.selectedNoteData.slider_value = 16; } } } build() { Stack({ alignContent: Alignment.Bottom }) { - Flex({ direction: FlexDirection.Column, wrap: FlexWrap.NoWrap, - alignItems: ItemAlign.Start, alignContent: FlexAlign.SpaceAround }) { + Flex({ + direction: FlexDirection.Column, + wrap: FlexWrap.NoWrap, + alignItems: ItemAlign.Start, + alignContent: FlexAlign.SpaceAround + }) { Column() { ToolBarComp({ controllerShow: this.controllerShow }) } @@ -229,39 +284,45 @@ export struct NoteContentComp { .javaScriptAccess(true) .javaScriptProxy({ object: this.noteContent, - name: "callBackToApp", // html--> name.method - methodList: ["callbackhtml", "callbackhtmlSave", "callbackScheduledSave", "callbackGetSize", "callbackPasteImage", "callbackImagePath"], + name: 'callBackToApp', // html--> name.method + methodList: ['callbackhtml', 'callbackhtmlSave', 'callbackScheduledSave', 'callbackGetSize', + 'callbackPasteImage', 'callbackImagePath'], controller: this.controllerShow }) .enabled(this.sectionStatus !== 1 ? false : true) .onPageEnd((e) => { - if (this.dpi <= 240) { - this.controllerShow.runJavaScript("changeSizeToRk()") - } else if (this.dpi <= 320 && this.dpi > 240) { - this.controllerShow.runJavaScript("changeSizeToPhone()") - } else { - this.controllerShow.runJavaScript("changeSizeToTablet()") - } - if (AppStorage.Get('breakPoint') !== 'sm') { - this.controllerShow.runJavaScript("hiddenButton()") - } - LogUtil.info(TAG, "finish loadurl") - if (this.selectedNoteData) { - let self = this - this.controllerShow.runJavaScript( - "RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text + "')", - () => { - // wait for the image in the note to load - setTimeout(function () { - self.restoreScrollTop() - self.restoreFocus() - }, 100) - } - ) - } - // 初次加载为为小屏预览模式 - if (this.sectionStatus != 1) { - this.controllerShow.runJavaScript("RICH_EDITOR.setInputEnabled(false)") + try { + if (this.dpi <= 240) { + this.controllerShow.runJavaScript('changeSizeToRk()'); + } else if (this.dpi <= 320 && this.dpi > 240) { + this.controllerShow.runJavaScript('changeSizeToPhone()'); + } else { + this.controllerShow.runJavaScript('changeSizeToTablet()'); + } + if (AppStorage.Get('breakPoint') !== 'sm') { + this.controllerShow.runJavaScript('hiddenButton()'); + } + LogUtil.info(TAG, 'finish loadurl'); + if (this.selectedNoteData) { + let self = this; + this.controllerShow.runJavaScript( + "RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text + "')", + () => { + // wait for the image in the note to load + setTimeout(() => { + self.restoreScrollTop(); + self.restoreFocus(); + }, 100) + } + ); + } + // 初次加载为为小屏预览模式 + if (this.sectionStatus != 1) { + this.controllerShow.runJavaScript('RICH_EDITOR.setInputEnabled(false)'); + } + } catch (error) { + LogUtil.info(TAG, + `runJavaScript onPageEnd error. code:${JSON.stringify(error.code)},message:${error.message}`); } }) .imageAccess(true) @@ -272,48 +333,54 @@ export struct NoteContentComp { .height('88%') .width('100%') .onScroll((event) => { - this.storeScrollTop(event.yOffset) + this.storeScrollTop(event.yOffset); }) } .margin({ left: 24, right: 24 }) // .width(StyleConstants.PERCENTAGE_100) .enabled(this.selectedNoteData && this.selectedNoteData.is_deleted == Delete.Yes ? false : true) .onClick(() => { - this.issave = 0 - LogUtil.info(TAG, "editModel : " + this.editModel + ", sectionStatus : " + this.sectionStatus) - let isContinue = AppStorage.Get('IsContinue') - LogUtil.info(TAG, "isContinue : " + isContinue) - // 点击第三屏进入全屏编辑模式 - if (this.sectionStatus != 1 || isContinue) { - this.asideWidth = 0 - this.lastSectionStatus = this.sectionStatus - this.sectionStatus = 1 - this.controllerShow.runJavaScript("RICH_EDITOR.setInputEnabled(true)") - // 添加定时器:3s自动保存 - if (timeId) { - clearInterval(timeId) + try { + this.issave = 0; + LogUtil.info(TAG, 'editModel : ' + this.editModel + ', sectionStatus : ' + this.sectionStatus); + let isContinue = AppStorage.Get('IsContinue'); + LogUtil.info(TAG, 'isContinue : ' + isContinue); + // 点击第三屏进入全屏编辑模式 + if (this.sectionStatus != 1 || isContinue) { + this.asideWidth = 0; + this.lastSectionStatus = this.sectionStatus; + this.sectionStatus = 1; + this.controllerShow.runJavaScript('RICH_EDITOR.setInputEnabled(true)'); + // 添加定时器:3s自动保存 + if (timeId) { + clearInterval(timeId); + } + timeId = setInterval(() => { + this.controllerShow.runJavaScript('scheduledSaveContent()'); + }, 3000) + LogUtil.info(TAG, 'setInterval timeId : ' + timeId); + // save continue data + AppStorage.SetOrCreate('ContinueSection', this.sectionStatus); + LogUtil.info(TAG, 'set continue section success'); + this.editModel = !this.editModel; + AppStorage.SetOrCreate('IsContinue', false); } - timeId = setInterval(() => { - this.controllerShow.runJavaScript("scheduledSaveContent()") - }, 3000) - LogUtil.info(TAG, "setInterval timeId : " + timeId) - // save continue data - AppStorage.SetOrCreate('ContinueSection', this.sectionStatus) - LogUtil.info(TAG, "set continue section success") - this.editModel = !this.editModel - AppStorage.SetOrCreate('IsContinue', false) + } catch (error) { + LogUtil.error(TAG, `Column failed.code:${JSON.stringify(error.code)}, + message:${JSON.stringify(error.message)}`); } }) } .id(this.isUpdate + '') .height(StyleConstants.PERCENTAGE_100) - .visibility(FolderUtil.getNoteCount(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid) == 0 ? Visibility.Hidden : Visibility.Visible) + .visibility(FolderUtil.getNoteCount(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid) == 0 ? + Visibility.Hidden : Visibility.Visible) Column() { } - .height("100%") - .width("100%") - .backgroundColor("#18181A") + .height('100%') + .width('100%') + .backgroundColor('#18181A') .opacity(0.1) .visibility(this.search ? Visibility.Visible : Visibility.Hidden) } @@ -322,30 +389,34 @@ export struct NoteContentComp { } aboutToAppear(): void { - LogUtil.info(TAG, "aboutToAppear") + LogUtil.info(TAG, 'aboutToAppear') } aboutToDisappear(): void { clearInterval(timeId) - LogUtil.info(TAG, "aboutToDisappear") + LogUtil.info(TAG, 'aboutToDisappear') } } @Component export struct NoteContentOverViewComp { - @Consume('SelectedNoteData') selectedNoteData: NoteData - @StorageLink('AllFolderArray') @Watch('getArray') AllFolderArray: FolderData[] = [] - @StorageLink('CheckedNoteArray') CheckedNoteArray: NoteData[] = [] - @StorageLink('AllNoteArray') AllNoteArray: NoteData[] = AppStorage.Link('AllNoteArray') - @Consume('SelectedFolderData') selectedFolderData: FolderData - @Consume('EditModel') editModel: boolean - @Consume('SectionStatus') sectionStatus: number - @Consume('RefreshFlag') refreshFlag: number - @StorageLink('isUpdate') isUpdate: boolean = false - NoteDataMoveArray: FolderData[] - controllerShow: WebviewController - editTitleDialogCtl: CustomDialogController = new CustomDialogController({ - builder: EditTitleDialog({ confirm: this.confirm.bind(this) }), + @Consume('SelectedNoteData') selectedNoteData: NoteData; + @StorageLink('AllFolderArray') @Watch('getArray') AllFolderArray: FolderData[] = []; + @StorageLink('CheckedNoteArray') CheckedNoteArray: NoteData[] = []; + @StorageLink('AllNoteArray') AllNoteArray: NoteData[] = AppStorage.Link('AllNoteArray'); + @Consume('SelectedFolderData') selectedFolderData: FolderData; + @Consume('EditModel') editModel: boolean; + @Consume('SectionStatus') sectionStatus: number; + @Consume('RefreshFlag') refreshFlag: number; + @StorageLink('isUpdate') isUpdate: boolean = false; + NoteDataMoveArray: FolderData[] = []; + controllerShow: webview.WebviewController = new webview.WebviewController(); + editTitleDialogCtl: CustomDialogController | null = new CustomDialogController({ + builder: EditContentDialog({ + confirm: (newTitle: string) => { + this.confirm(newTitle); + } + }), alignment: DialogAlignment.Center, autoCancel: false, customStyle: true, @@ -354,8 +425,8 @@ export struct NoteContentOverViewComp { getArray() { this.NoteDataMoveArray = this.AllFolderArray.slice(2, this.AllFolderArray.length); if (this.AllFolderArray[1] === undefined || this.AllFolderArray[1] === null) { - LogUtil.info(TAG, "this AllFolderArray[1] undefined") - return + LogUtil.info(TAG, 'this AllFolderArray[1] undefined'); + return; } this.NoteDataMoveArray.push(this.AllFolderArray[1]); } @@ -363,79 +434,93 @@ export struct NoteContentOverViewComp { aboutToAppear() { this.NoteDataMoveArray = this.AllFolderArray.slice(2, this.AllFolderArray.length); if (this.AllFolderArray[1] === undefined || this.AllFolderArray[1] === null) { - LogUtil.info(TAG, "this AllFolderArray[1] undefined") - return + LogUtil.info(TAG, 'this AllFolderArray[1] undefined'); + return; } this.NoteDataMoveArray.push(this.AllFolderArray[1]); } aboutToDisappear() { - this.editTitleDialogCtl = null + this.editTitleDialogCtl = null; } confirm(newTitle: string) { - this.selectedNoteData.title = newTitle - this.selectedNoteData.modified_time = new Date().getTime() - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid) - RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null) - NoteUtil.refreshAll() + try { + this.selectedNoteData.title = newTitle; + this.selectedNoteData.modified_time = new Date().getTime(); + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid); + RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicatesNote, null); + NoteUtil.refreshAll(); + } catch (error) { + LogUtil.error(TAG, 'confirm error: ' + JSON.stringify(error)); + } } - @Builder MenuBuilder() { + @Builder + MenuBuilder() { Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { List() { - if (this.NoteDataMoveArray !== undefined && this.NoteDataMoveArray !== null && this.NoteDataMoveArray !== []) { - ForEach(this.NoteDataMoveArray, (item) => { + if (this.NoteDataMoveArray !== undefined && this.NoteDataMoveArray !== null && + this.NoteDataMoveArray.length > 0) { + ForEach(this.NoteDataMoveArray, (item: FolderData) => { ListItem() { NoteDataMoveItemCompTablet({ folderItem: item, uuid: this.selectedNoteData.folder_uuid }) } .onClick(() => { - this.selectedNoteData.folder_uuid = item.uuid - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid) - RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null) - if (this.sectionStatus != 1) { - this.selectedNoteData = NoteUtil.getFirstNoteData(this.AllNoteArray, this.selectedFolderData.uuid) - this.controllerShow.runJavaScript( - "RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text + "')" - ) - this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0) - } else { - this.selectedFolderData = FolderUtil.getFolderData(AppStorage.Get('AllFolderArray'), item.uuid) + try { + this.selectedNoteData.folder_uuid = item.uuid; + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid); + RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicatesNote, null); + if (this.sectionStatus != 1) { + this.selectedNoteData = NoteUtil.getFirstNoteData(this.AllNoteArray, this.selectedFolderData.uuid)!; + this.controllerShow.runJavaScript( + "RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text + "')" + ) + this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0); + } else { + this.selectedFolderData = FolderUtil.getFolderData(AppStorage.Get('AllFolderArray')!, item.uuid); + } + // save continue data + let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()); + AppStorage.SetOrCreate('ContinueNote', continueNote); + LogUtil.info(TAG, 'NoteContentOverViewComp, MenuBuilder, set continue note success'); + NoteUtil.refreshAll(); + } catch (error) { + LogUtil.error(TAG, 'ListItem click error: ' + JSON.stringify(error)); } - // save continue data - let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()) - AppStorage.SetOrCreate('ContinueNote', continueNote) - LogUtil.info(TAG, "NoteContentOverViewComp, MenuBuilder, set continue note success") - NoteUtil.refreshAll() }) - }, noteItem => noteItem.uuid) + }, (noteItem: NoteData) => noteItem.uuid) } }.listDirection(Axis.Vertical) .edgeEffect(EdgeEffect.Spring) .height(this.AllFolderArray.length > 12 ? 504 : (this.AllFolderArray.length - 3) * 56) } .width(148) - .backgroundColor($r("app.color.color_fffffB")) + .backgroundColor($r('app.color.color_fffffB')) .padding({ left: 24, right: 24 }) } build() { if (this.selectedNoteData) { - Flex({ direction: FlexDirection.Column, wrap: FlexWrap.NoWrap, - justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) { + Flex({ + direction: FlexDirection.Column, + wrap: FlexWrap.NoWrap, + justifyContent: FlexAlign.SpaceBetween, + alignItems: ItemAlign.Center + }) { Row() { Text(this.selectedNoteData.title) .id(this.isUpdate + '') .fontSize(30) .margin({ left: 0, right: 24 }) .onClick(() => { - clearInterval(timeId) - this.editTitleDialogCtl.open() + clearInterval(timeId); + this.editTitleDialogCtl!.open(); // save continue data - AppStorage.SetOrCreate('ContinueSection', this.sectionStatus) - LogUtil.info(TAG, "NoteContentComp, set continue section success") + AppStorage.SetOrCreate('ContinueSection', this.sectionStatus); + LogUtil.info(TAG, 'NoteContentComp, set continue section success'); }) }.height(40) .width(StyleConstants.PERCENTAGE_100) @@ -445,15 +530,17 @@ export struct NoteContentOverViewComp { .id(this.isUpdate + '') .fontSize(12) .padding({ top: 4, bottom: 4 }) - .fontColor($r("app.color.modified_time_font_color")) + .fontColor($r('app.color.modified_time_font_color')) .margin({ left: 0 }) Row() { - Text(FolderUtil.getFolderText(FolderUtil.getFolderData(AppStorage.Get('AllFolderArray'), this.selectedNoteData.folder_uuid)) == - folderTextMap["sys_def_myFavorites_uuid"] ? folderTextMap["sys_def_unClassified_uuid"] : - FolderUtil.getFolderText(FolderUtil.getFolderData(AppStorage.Get('AllFolderArray'), this.selectedNoteData.folder_uuid))) + Text(FolderUtil.getFolderText(FolderUtil.getFolderData(AppStorage.Get('AllFolderArray'), + this.selectedNoteData.folder_uuid)) == + folderTextMap.sys_def_myFavorites_uuid ? folderTextMap.sys_def_unClassified_uuid : + FolderUtil.getFolderText(FolderUtil.getFolderData(AppStorage.Get('AllFolderArray'), + this.selectedNoteData.folder_uuid))) .id(this.isUpdate + '') .fontSize(12) - .fontColor($r("app.color.list_modified_time_font_color")) + .fontColor($r('app.color.list_modified_time_font_color')) .padding({ top: 1 }) Image($r('app.media.triangle')) .width(6) @@ -461,10 +548,16 @@ export struct NoteContentOverViewComp { .margin({ left: 4 }) } .id(this.isUpdate + '') - .padding({ left: 8, right: 8, top: 4, bottom: 4 }) + .padding({ + left: 8, + right: 8, + top: 4, + bottom: 4 + }) .margin({ left: 8 }) .borderRadius(16) - .backgroundColor(NoteUtil.getNoteBgColor(AppStorage.Get('AllFolderArray'), this.selectedNoteData.folder_uuid, SysDefFolderUuid.AllNotes, false)) + .backgroundColor(NoteUtil.getNoteBgColor(AppStorage.Get('AllFolderArray')!, this.selectedNoteData.folder_uuid, + SysDefFolderUuid.AllNotes, false)) .bindMenu(this.MenuBuilder) }.alignItems(VerticalAlign.Top).height(40).width(StyleConstants.PERCENTAGE_100) } @@ -477,108 +570,134 @@ export struct NoteContentOverViewComp { @Component export struct ToolBarComp { - @Consume('SelectedNoteData') selectedNoteData: NoteData - @Consume('RefreshFlag') refreshFlag: number - @Consume('SectionStatus') sectionStatus: number - @Consume('LastSectionStatus') lastSectionStatus: number - @Consume('SelectedFolderData') selectedFolderData: FolderData - @Consume('ChooseNote') chooseNote: boolean - @Consume('PortraitModel') portraitModel: boolean - @StorageLink('AllNoteArray') AllNoteArray: NoteData[] = AppStorage.Link('AllNoteArray') - @Consume('EditModel') editModel: boolean - @Consume('Issave') issave: number - controllerShow: WebviewController - private context = getContext(this) - noteDataDeleteDialogCtl: CustomDialogController = new CustomDialogController({ - builder: DeleteDialog({ onConfirm: this.onDeleteConfirm.bind(this) }), + @Consume('SelectedNoteData') selectedNoteData: NoteData; + @Consume('RefreshFlag') refreshFlag: number; + @Consume('SectionStatus') sectionStatus: number; + @Consume('LastSectionStatus') lastSectionStatus: number; + @Consume('SelectedFolderData') selectedFolderData: FolderData; + @Consume('ChooseNote') chooseNote: boolean; + @Consume('PortraitModel') portraitModel: boolean; + @StorageLink('AllNoteArray') AllNoteArray: NoteData[] = AppStorage.Link('AllNoteArray'); + @Consume('EditModel') editModel: boolean; + @Consume('Issave') issave: number; + controllerShow: webview.WebviewController = new webview.WebviewController(); + private context = getContext(this); + noteDataDeleteDialogCtl: CustomDialogController | null = new CustomDialogController({ + builder: DeleteDialog({ + onConfirm: () => { + this.onDeleteConfirm(); + } + }), alignment: DialogAlignment.Center, autoCancel: false, customStyle: true, - }) - @Consume('AsideWidth') asideWidth: number + }); + @Consume('AsideWidth') asideWidth: number; aboutToDisappear() { - this.noteDataDeleteDialogCtl = null - this.editContentDialogCtl = null + this.noteDataDeleteDialogCtl = null; + this.editContentDialogCtl = null; } onDeleteConfirm() { - if (this.selectedFolderData.uuid != SysDefFolderUuid.RecentDeletes) { - this.selectedNoteData.is_deleted = Delete.Yes - this.selectedNoteData.deleted_time = new Date().getTime() - // update note to db - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid) - RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null) - } else { - NoteUtil.removeNoteData(this.AllNoteArray, this.selectedNoteData.uuid) - // delete note from db - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid) - RdbStoreUtil.delete(predicates_note, null) + try { + if (this.selectedFolderData.uuid != SysDefFolderUuid.RecentDeletes) { + this.selectedNoteData.is_deleted = Delete.Yes; + this.selectedNoteData.deleted_time = new Date().getTime(); + // update note to db + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid); + RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicatesNote, null); + } else { + NoteUtil.removeNoteData(this.AllNoteArray, this.selectedNoteData.uuid); + // delete note from db + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid); + RdbStoreUtil.delete(predicatesNote, null); + } + this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0); + this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray')!, this.selectedFolderData.uuid)!; + try { + this.controllerShow.runJavaScript("RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text! + "')"); + } catch (error) { + LogUtil.info(TAG, `setHtml error. code:${JSON.stringify(error.code)},message:${error.message}`); + } + this.chooseNote = false; + // save continue data + let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()); + AppStorage.SetOrCreate('ContinueNote', continueNote); + LogUtil.info(TAG, 'NoteContentOverViewComp, set continue note success'); + AppStorage.SetOrCreate('isUpdate', true); + } catch (error) { + LogUtil.error(TAG, 'onDeleteConfirm error: ' + JSON.stringify(error)); } - this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0) - this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid) - this.controllerShow.runJavaScript("RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text + "')") - this.chooseNote = false - // save continue data - let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()) - AppStorage.SetOrCreate('ContinueNote', continueNote) - LogUtil.info(TAG, "NoteContentOverViewComp, set continue note success") - AppStorage.SetOrCreate('isUpdate', true) } - editContentDialogCtl: CustomDialogController = new CustomDialogController({ - builder: EditContentDialog({ confirm: this.confirm.bind(this) }), + editContentDialogCtl: CustomDialogController | null = new CustomDialogController({ + builder: EditContentDialog({ + confirm: (newTitle: string) => { + this.confirm(newTitle); + } + }), alignment: DialogAlignment.Bottom, autoCancel: true, customStyle: true, }) confirm(excuteJs: string) { - this.controllerShow.runJavaScript(excuteJs) + this.controllerShow.runJavaScript(excuteJs); } build() { - Flex({ direction: FlexDirection.Row, wrap: FlexWrap.NoWrap, - justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) { + Flex({ + direction: FlexDirection.Row, + wrap: FlexWrap.NoWrap, + justifyContent: FlexAlign.SpaceBetween, + alignItems: ItemAlign.Center + }) { Image(this.sectionStatus == 1 ? $r('app.media.narrow') : $r('app.media.zoom')) .height(24) .width(24) .onClick(() => { - if (this.sectionStatus != 1) { - this.lastSectionStatus = this.sectionStatus - this.sectionStatus = 1 - this.asideWidth = 0 - this.controllerShow.runJavaScript("RICH_EDITOR.setInputEnabled(true)") - } else { - if (this.lastSectionStatus != undefined) { - this.asideWidth = 200 - // 切换为小屏预览模式 - this.controllerShow.runJavaScript("RICH_EDITOR.setInputEnabled(false)") - this.sectionStatus = this.lastSectionStatus - // 退出全屏时存库 - LogUtil.info(TAG, "close note" + this.selectedNoteData.uuid) - this.controllerShow.runJavaScript("saveHtmlContent()") - //退出键盘 - // @ts-ignore - inputMethod.getController().stopInputSession(); - // 清除定时器 - if (timeId != undefined) { - LogUtil.info(TAG, "zoom, clearInterval timeId : " + timeId) - clearInterval(timeId) - } + try { + if (this.sectionStatus != 1) { + this.lastSectionStatus = this.sectionStatus; + this.sectionStatus = 1; + this.asideWidth = 0; + this.controllerShow.runJavaScript('RICH_EDITOR.setInputEnabled(true)'); } else { - this.sectionStatus = 3 + if (this.lastSectionStatus != undefined) { + this.asideWidth = 200; + // 切换为小屏预览模式 + this.controllerShow.runJavaScript('RICH_EDITOR.setInputEnabled(false)'); + this.sectionStatus = this.lastSectionStatus; + // 退出全屏时存库 + LogUtil.info(TAG, 'close note' + this.selectedNoteData.uuid); + this.controllerShow.runJavaScript('saveHtmlContent()'); + //退出键盘 + inputMethod.getController().stopInputSession(); + // 清除定时器 + if (timeId != undefined) { + LogUtil.info(TAG, 'zoom, clearInterval timeId : ' + timeId); + clearInterval(timeId); + } + } else { + this.sectionStatus = 3; + } } + this.editModel = !this.editModel; + // save continue data + AppStorage.SetOrCreate('ContinueSection', this.sectionStatus); + LogUtil.info(TAG, 'ToolBarComp, set continue section success'); + NoteUtil.refreshAll(); + } catch (error) { + LogUtil.error(TAG, + `Image ${this.sectionStatus == 1 ? 'narrow' : 'zoom'} click failed.code:${JSON.stringify(error.code)}, + message:${JSON.stringify(error.message)}`); } - this.editModel = !this.editModel - // save continue data - AppStorage.SetOrCreate('ContinueSection', this.sectionStatus) - LogUtil.info(TAG, "ToolBarComp, set continue section success") - NoteUtil.refreshAll() }) - .visibility(!this.selectedNoteData ? Visibility.None : this.selectedNoteData.is_deleted == Delete.Yes ? Visibility.None : Visibility.Visible) + .visibility(!this.selectedNoteData ? Visibility.None : + this.selectedNoteData.is_deleted == Delete.Yes ? Visibility.None : Visibility.Visible) if (this.selectedNoteData) { if (this.selectedNoteData.is_deleted == Delete.Yes) { @@ -587,43 +706,49 @@ export struct ToolBarComp { .height(24) .width(24) .onClick(() => { - this.noteDataDeleteDialogCtl.open() + this.noteDataDeleteDialogCtl!.open(); }) Image($r('app.media.recover')) .height(24) .width(24) .onClick(() => { - this.selectedNoteData.is_deleted = Delete.No - this.selectedNoteData.deleted_time = 0 - let context: any = getContext(this) - let resource = { - bundleName: "com.ohos.note", - moduleName: "default", - id: $r('app.string.restore').id - }; - context.resourceManager.getString(resource, (error, value) => { - if (error != null) { - LogUtil.error(TAG, "error is " + error); - } else { - prompt.showToast({ message: value, duration: 2000 }); - } - }); - this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0) - this.chooseNote = false - // update note to db - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid) - RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null) - - this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid) - this.controllerShow.runJavaScript( - "RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text + "')" - ) - // save continue data - let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()) - AppStorage.SetOrCreate('ContinueNote', continueNote) - LogUtil.info(TAG, "recover, set continue note success") - NoteUtil.refreshAll() + try { + this.selectedNoteData.is_deleted = Delete.No; + this.selectedNoteData.deleted_time = 0; + let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; + let resource: resourceManager.Resource = { + bundleName: 'com.ohos.note', + moduleName: 'default', + id: $r('app.string.restore').id + }; + context.resourceManager.getStringValue(resource, (error: BusinessError, value: string) => { + if (error != null) { + LogUtil.error(TAG, 'error is ' + error); + } else { + promptAction.showToast({ message: value, duration: 2000 }); + } + }); + this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0); + this.chooseNote = false; + // update note to db + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid); + RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicatesNote, null); + + this.selectedNoteData = + NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray')!, this.selectedFolderData.uuid)!; + this.controllerShow.runJavaScript( + "RICH_EDITOR.setHtml('" + this.selectedNoteData!.content_text + "')" + ) + // save continue data + let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()); + AppStorage.SetOrCreate('ContinueNote', continueNote); + LogUtil.info(TAG, 'recover, set continue note success'); + NoteUtil.refreshAll(); + } catch (error) { + LogUtil.error(TAG, + `recover failed.code:${JSON.stringify(error.code)}, message:${JSON.stringify(error.message)}`); + } }) }.width(72) } else if (this.editModel == true) { @@ -633,11 +758,15 @@ export struct ToolBarComp { .height(24) .width(24) .onClick(() => { - // 清单 - this.controllerShow.runJavaScript("javascript:RICH_EDITOR.setTodo()") - // 退出键盘 - // @ts-ignore - inputMethod.getController().stopInputSession(); + try { + // 清单 + this.controllerShow.runJavaScript('javascript:RICH_EDITOR.setTodo()'); + // 退出键盘 + inputMethod.getController().stopInputSession(); + } catch (error) { + LogUtil.error(TAG, `Image circle_tick1 click failed.code:${JSON.stringify(error.code)}, + message:${JSON.stringify(error.message)}`); + } }) }.width(42) .height(42) @@ -650,9 +779,8 @@ export struct ToolBarComp { .width(24) .onClick(() => { // 退出键盘 - // @ts-ignore inputMethod.getController().stopInputSession(); - this.editContentDialogCtl.open() + this.editContentDialogCtl!.open(); }) }.width(42) .height(42) @@ -664,57 +792,60 @@ export struct ToolBarComp { .height(24) .width(24) .onClick(async () => { - let permissionList: Array = [ - "ohos.permission.READ_MEDIA", - "ohos.permission.WRITE_MEDIA", - ] - let context: any = getContext(this); + let permissionList: Permissions[] = [ + 'ohos.permission.READ_MEDIA', + 'ohos.permission.WRITE_MEDIA', + ]; + let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; let AtManager = abilityAccessCtrl.createAtManager(); - // @ts-ignore await AtManager.requestPermissionsFromUser(context, permissionList).then((data) => { - LogUtil.info(TAG, 'data permissions : ' + data.permissions) - LogUtil.info(TAG, 'data result: ' + data.authResults) - let sum = 0 + LogUtil.info(TAG, 'data permissions : ' + data.permissions); + LogUtil.info(TAG, 'data result: ' + data.authResults); + let sum = 0; for (let i = 0; i < data.authResults.length; i++) { - sum += data.authResults[i] + sum += data.authResults[i]; } - LogUtil.info(TAG, 'request permissions sum: ' + sum) - }).catch((err) => { + LogUtil.info(TAG, 'request permissions sum: ' + sum); + }).catch((err: BusinessError) => { LogUtil.warn(TAG, 'failed to requestPermissionsFromUser : ' + err.code); }) // 退出键盘 - // @ts-ignore inputMethod.getController().stopInputSession(); - LogUtil.info(TAG, 'startAbility start') - await globalThis.noteContext.startAbilityForResult({ - parameters: { uri: "singleselect" }, - bundleName: "com.ohos.photos", - abilityName: "com.ohos.photos.MainAbility", + LogUtil.info(TAG, 'startAbility start'); + await noteContext.startAbilityForResult({ + parameters: { uri: 'singleselect' }, + bundleName: 'com.ohos.photos', + abilityName: 'com.ohos.photos.MainAbility', }) - .then(v => { - let want = v['want']; - if (want != null && want != undefined) { - let param = want['parameters']; - let imageUri = "" - if (param != null && param != undefined) { - let uri = param['select-item-list']; - imageUri = uri; - } - // 拷贝 - if (imageUri != null && imageUri != "") { - OperationUtils.copy(imageUri).then((uriPath) => { - var path = "file://" + uriPath - LogUtil.info(TAG, 'image uri is:' + path) - this.controllerShow.runJavaScript( - "javascript:RICH_EDITOR.insertImage('" + path + "')" - ) - this.issave = 1 - // 保存笔记信息到数据库 - this.controllerShow.runJavaScript("getHtmlContent()") - }) + .then((v: common.AbilityResult) => { + try { + let want = v['want']; + if (want != null && want != undefined) { + let param = want['parameters']; + let imageUri = ""; + if (param != null && param != undefined) { + let uri = param['select-item-list']; + imageUri = uri as string; + } + // 拷贝 + if (imageUri != null && imageUri != "") { + OperationUtils.copy(imageUri).then((uriPath) => { + let path = 'file://' + uriPath; + LogUtil.info(TAG, 'image uri is:' + path); + this.controllerShow.runJavaScript( + "javascript:RICH_EDITOR.insertImage('" + path + "')" + ); + this.issave = 1; + // 保存笔记信息到数据库 + this.controllerShow.runJavaScript('getHtmlContent()'); + }) + } } + NoteUtil.refreshAll(); + } catch (error) { + LogUtil.error(TAG, `startAbilityForResult failed.code:${JSON.stringify(error.code)}, + message:${JSON.stringify(error.message)}`); } - NoteUtil.refreshAll() }); }) }.width(42) @@ -727,10 +858,14 @@ export struct ToolBarComp { .height(24) .width(24) .onClick(() => { - // 退出键盘 - // @ts-ignore - inputMethod.getController().stopInputSession(); - this.controllerShow.runJavaScript("RICH_EDITOR.undo()") + try { + // 退出键盘 + inputMethod.getController().stopInputSession(); + this.controllerShow.runJavaScript('RICH_EDITOR.undo()'); + } catch (error) { + LogUtil.error(TAG, `Image undo click failed.code:${JSON.stringify(error.code)}, + message:${JSON.stringify(error.message)}`); + } }) }.width(42) .height(42) @@ -742,10 +877,14 @@ export struct ToolBarComp { .height(24) .width(24) .onClick(() => { - // 退出键盘 - // @ts-ignore - inputMethod.getController().stopInputSession(); - this.controllerShow.runJavaScript("RICH_EDITOR.redo()") + try { + // 退出键盘 + inputMethod.getController().stopInputSession(); + this.controllerShow.runJavaScript('RICH_EDITOR.redo()'); + } catch (error) { + LogUtil.error(TAG, `Image todo click failed.code:${JSON.stringify(error.code)}, + message:${JSON.stringify(error.message)}`); + } }) }.width(42) .height(42) @@ -759,13 +898,18 @@ export struct ToolBarComp { .width(24) .fillColor(this.issave == 0 ? Color.Black : Color.Grey) .onClick(() => { - // 保存笔记信息到数据库 - this.controllerShow.runJavaScript("getHtmlContent()") - this.controllerShow.runJavaScript("javascript:RICH_EDITOR.getBlur()") - if (this.selectedNoteData.title == "标题" && this.selectedNoteData.content_text == "") { - LogUtil.info(TAG, "note is empty,save note failed") + try { + // 保存笔记信息到数据库 + this.controllerShow.runJavaScript('getHtmlContent()'); + this.controllerShow.runJavaScript('javascript:RICH_EDITOR.getBlur()'); + if (this.selectedNoteData.title == '标题' && this.selectedNoteData.content_text == "") { + LogUtil.info(TAG, 'note is empty,save note failed'); + } + this.issave = 1; + } catch (error) { + LogUtil.error(TAG, `Image tick_thin click failed.code:${JSON.stringify(error.code)}, + message:${JSON.stringify(error.message)}`); } - this.issave = 1 }) }.width(42) .height(42) @@ -774,28 +918,37 @@ export struct ToolBarComp { }.width(274) } else { Row({ space: StyleConstants.SPACE_24 }) { - Image(this.selectedNoteData.is_favorite == Favorite.Yes ? $r('app.media.favorite') : $r('app.media.favorite_cancel')) + Image(this.selectedNoteData.is_favorite == Favorite.Yes ? $r('app.media.favorite') : + $r('app.media.favorite_cancel')) .height(24) .width(24) .onClick(() => { try { - this.selectedNoteData.is_favorite = (this.selectedNoteData.is_favorite == Favorite.Yes ? Favorite.No : Favorite.Yes) - this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0) + this.selectedNoteData.is_favorite = + (this.selectedNoteData.is_favorite == Favorite.Yes ? Favorite.No : Favorite.Yes); + this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0); // update note to db - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid) - RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicates_note, null) + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData.uuid); + RdbStoreUtil.update(this.selectedNoteData.toNoteObject(), predicatesNote, null); if (this.selectedFolderData.uuid === SysDefFolderUuid.MyFavorites) { - this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray'), SysDefFolderUuid.MyFavorites) - this.controllerShow.runJavaScript( - "RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text + "')" - ) + this.selectedNoteData = + NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray')!, SysDefFolderUuid.MyFavorites)!; + try { + this.controllerShow.runJavaScript( + "RICH_EDITOR.setHtml('" + this.selectedNoteData.content_text + "')" + ); + LogUtil.info(TAG, `setHtml success`); + } catch (error) { + LogUtil.error(TAG, `setHtml failed.code:${JSON.stringify(error.code)}, + message:${JSON.stringify(error.message)}`); + } // save continue data - let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()) - AppStorage.SetOrCreate('ContinueNote', continueNote) - LogUtil.info(TAG, "ToolBarComp, set continue note success") + let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()); + AppStorage.SetOrCreate('ContinueNote', continueNote); + LogUtil.info(TAG, 'ToolBarComp, set continue note success'); } - NoteUtil.refreshAll() + NoteUtil.refreshAll(); } catch (error) { LogUtil.error(TAG, 'favorite error: ' + JSON.stringify(error)); } @@ -804,7 +957,7 @@ export struct ToolBarComp { .height(24) .width(24) .onClick(() => { - this.noteDataDeleteDialogCtl.open() + this.noteDataDeleteDialogCtl!.open(); }) }.width(72) } @@ -817,11 +970,13 @@ export struct ToolBarComp { @Component struct NoteDataMoveItemCompTablet { - @StorageLink('CheckedNoteArray') CheckedNoteArray: NoteData[] = [] - @StorageLink('AllFolderArray') AllFolderArray: FolderData[] = [] - @StorageLink('isUpdate') isUpdate: boolean = false - folderItem: FolderData - uuid: String + @StorageLink('CheckedNoteArray') CheckedNoteArray: NoteData[] = []; + @StorageLink('AllFolderArray') AllFolderArray: FolderData[] = []; + @StorageLink('isUpdate') isUpdate: boolean = false; + folderItem: FolderData = + new FolderData(0, '', new Date().getTime() + '', '', FolderType.CusDef, Delete.No, new Date().getTime(), + new Date().getTime()); + uuid: string = ''; build() { Flex({ alignItems: ItemAlign.Center, wrap: FlexWrap.NoWrap, justifyContent: FlexAlign.Center }) { @@ -832,7 +987,8 @@ struct NoteDataMoveItemCompTablet { .width(24) .height(24) .flexShrink(0) - .fillColor(FolderUtil.getFolderIconColor(this.AllFolderArray, this.folderItem.uuid, this.folderItem.uuid == this.uuid)) + .fillColor(FolderUtil.getFolderIconColor(this.AllFolderArray, this.folderItem.uuid, + this.folderItem.uuid == this.uuid)) } .width(24) @@ -842,7 +998,8 @@ struct NoteDataMoveItemCompTablet { .id(this.isUpdate + '') .padding({ top: 3 }) .fontSize(16) - .fontColor(FolderUtil.getFolderIconColor(this.AllFolderArray, this.folderItem.uuid == this.uuid ? this.folderItem.uuid : '', this.folderItem.uuid == this.uuid)) + .fontColor(FolderUtil.getFolderIconColor(this.AllFolderArray, + this.folderItem.uuid == this.uuid ? this.folderItem.uuid : '', this.folderItem.uuid == this.uuid)) .textAlign(TextAlign.Center) .maxLines(1) .textOverflow({ overflow: TextOverflow.Ellipsis }) @@ -853,7 +1010,7 @@ struct NoteDataMoveItemCompTablet { if (this.folderItem.uuid != SysDefFolderUuid.UnClassified) { Divider() - .color($r("app.color.divider_color_e4e4e4")) + .color($r('app.color.divider_color_e4e4e4')) .strokeWidth(1) } } diff --git a/features/src/main/ets/components/NoteContentCompPortrait.ets b/features/src/main/ets/components/NoteContentCompPortrait.ets index ebf835bde2d15ae978652cb3d1bc8f9542f73f45..1eb3eb713cb1ff49e25bcdbb5f4d797d9f9c4d66 100644 --- a/features/src/main/ets/components/NoteContentCompPortrait.ets +++ b/features/src/main/ets/components/NoteContentCompPortrait.ets @@ -23,50 +23,75 @@ import { NoteTableColumn, SysDefFolderUuid, Favorite, - Delete -} from '@ohos/utils/src/main/ets/default/model/databaseModel/EnumData' + Delete, + FolderType +} from '@ohos/utils/src/main/ets/default/model/databaseModel/EnumData'; import StyleConstants from '@ohos/utils/src/main/ets/default/constants/StyleConstants' import { EditContentDialogPortrait, DeleteDialog, EditTitleDialog } from './CusDialogComp' import FolderUtil from '@ohos/utils/src/main/ets/default/baseUtil/FolderUtil' import NoteUtil from '@ohos/utils/src/main/ets/default/baseUtil/NoteUtil' -import prompt from '@system.prompt' +import { promptAction } from '@kit.ArkUI'; import { LogUtil } from '@ohos/utils/src/main/ets/default/baseUtil/LogUtil' import OperationUtils from '@ohos/utils/src/main/ets/default/baseUtil/OperationUtils' import router from '@system.router' import inputMethod from '@ohos.inputMethod'; import { folderTextMap } from '@ohos/utils/src/main/ets/default/model/NoteBaseData' -import abilityAccessCtrl from '@ohos.abilityAccessCtrl'; - -var time_id: number - -const TAG = "NoteContentCompPortrait" +import abilityAccessCtrl,{ Permissions } from '@ohos.abilityAccessCtrl'; +import webview from '@ohos.web.webview'; +import { BusinessError } from '@ohos.base'; +import resourceManager from '@ohos.resourceManager'; +import common from '@ohos.app.ability.common'; +import window from '@ohos.window'; +import { wantAgent, WantAgent } from '@kit.AbilityKit'; +import { backgroundTaskManager } from '@kit.BackgroundTasksKit'; + +let time_id: number = 0; +let noteContext = AppStorage.Get('noteContext')!; + +const TAG = 'NoteContentCompPortrait'; + +interface NoteContentType { + callbackhtml: (html: string) => void; + callbackImagePath: (imgName: string) => void; + callbackScheduledSave: (html: string) => void; + callbackPasteImage: (html: string) => void; + callbackGetSize: (fontSize: number) => void; + addToDo: () => void; + chooseStyle: () => void; + openAlbum: () => Promise; + getBreakPoint: () => void; +} async function routePage() { try { await router.back() } catch (err) { - LogUtil.info(TAG, "fail callback") + LogUtil.info(TAG, 'fail callback'); } } // Note content component @Component export struct NoteContentCompPortrait { - @Provide('SelectedNoteData') selectedNoteData: NoteData = AppStorage.Get('NewNote') - @Provide('SelectedFolderData') selectedFolderData: FolderData = AppStorage.Get("NewFolder") + @Provide('SelectedNoteData') selectedNoteData: NoteData = AppStorage.Get('NewNote')!; + @Provide('SelectedFolderData') selectedFolderData: FolderData = AppStorage.Get('NewFolder')!; @StorageLink('AllNoteArray') AllNoteArray: NoteData[] = AppStorage.Link('AllNoteArray') @Provide('EditModel') editModel: boolean = false @StorageLink('dpi') dpi: number = 240 - controllerShow: WebviewController + controllerShow: webview.WebviewController = new webview.WebviewController(); private editContentFlag = false private isClickBack: boolean = false @StorageLink('ScrollTopPercent') scrollTopPercent: number = 0.0 - editContentDialogCtl: CustomDialogController = new CustomDialogController({ - builder: EditContentDialogPortrait({ confirm: this.confirm.bind(this) }), + editContentDialogCtl: CustomDialogController | null = new CustomDialogController({ + builder: EditContentDialogPortrait({ confirm: (newTitle: string) => { + this.confirm(newTitle); + } }), alignment: DialogAlignment.Bottom, autoCancel: true, customStyle: true, }) + @StorageLink('topHeight') topHeight: number = 0; // 窗口规避区域高 + @StorageLink('topWidth') topWidth: number = 0; // 窗口规避区域宽 confirm(excuteJs: string) { this.controllerShow.runJavaScript(excuteJs) @@ -84,7 +109,7 @@ export struct NoteContentCompPortrait { if (!AppStorage.Has('remoteScrollTopPercent')) { return } - var scrollTopPercent = AppStorage.Get('remoteScrollTopPercent') + let scrollTopPercent = AppStorage.Get('remoteScrollTopPercent')!; if (scrollTopPercent < 0) { return } @@ -108,7 +133,7 @@ export struct NoteContentCompPortrait { AppStorage.Delete('isRemoteFocusOnSearch') } - noteContent = { + noteContent: NoteContentType = { callbackhtml: (html) => { LogUtil.info(TAG, 'note uuid is:' + this.selectedNoteData?.uuid) this.selectedNoteData.content_text = NoteUtil.contrastInitType(this.selectedNoteData.content_text); @@ -117,14 +142,14 @@ export struct NoteContentCompPortrait { }; this.selectedNoteData.content_text = html this.selectedNoteData.modified_time = new Date().getTime() - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid) - RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicates_note, null) + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid); + RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicatesNote, null); LogUtil.info(TAG, 'update note success:' + this.selectedNoteData?.uuid) // save continue data let continueNote: string = JSON.stringify(this.selectedNoteData?.toNoteObject()) AppStorage.SetOrCreate('ContinueNote', continueNote) - LogUtil.info(TAG, "callbackhtml, set continue note success") + LogUtil.info(TAG, 'callbackhtml, set continue note success'); }, callbackImagePath: (imgName) => { // updata note image @@ -140,9 +165,9 @@ export struct NoteContentCompPortrait { } this.selectedNoteData.content_text = html this.selectedNoteData.modified_time = new Date().getTime() - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid) - RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicates_note, null) + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid); + RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicatesNote, null); LogUtil.info(TAG, 'callbackScheduledSave, update note success:' + this.selectedNoteData?.uuid) // save continue data let continueNote: string = JSON.stringify(this.selectedNoteData?.toNoteObject()) @@ -152,18 +177,18 @@ export struct NoteContentCompPortrait { callbackPasteImage: (html) => { if (html) { LogUtil.info(TAG, 'paste info' + html) - let realHtml = "" - let base64regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/ - if (html && html.indexOf("base64") > 0) { - LogUtil.info(TAG, " getSrcFromHtml, src[1] : " + html) + let realHtml = ''; + let base64regex: RegExp = new RegExp('/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/'); + if (html && html.indexOf('base64') > 0) { + LogUtil.info(TAG, ' getSrcFromHtml, src[1] : ' + html); let imgData = html.split(',')[1]; let imgType = 'png' - if (html.indexOf("jpeg") > 0) { + if (html.indexOf('jpeg') > 0) { imgType = 'jpg' - } else if (html.indexOf("gif") > 0) { + } else if (html.indexOf('gif') > 0) { imgType = 'gif' } - let filePath = "" + let filePath = ''; if (base64regex.test(imgData)) { let base64 = new util.Base64() let decodeArr = base64.decodeSync(imgData) @@ -171,7 +196,7 @@ export struct NoteContentCompPortrait { } else { filePath = OperationUtils.saveImage(imgData, imgType) } - realHtml = "file://" + filePath + realHtml = 'file://' + filePath; } LogUtil.info(TAG, 'paste info11' + realHtml) this.controllerShow.runJavaScript("javascript:RICH_EDITOR.insertImageHtml('" + realHtml + "')") @@ -194,19 +219,44 @@ export struct NoteContentCompPortrait { }, addToDo: () => { // 清单 - this.controllerShow.runJavaScript("javascript:RICH_EDITOR.setTodo()") + this.controllerShow.runJavaScript('javascript:RICH_EDITOR.setTodo()'); }, chooseStyle: () => { - this.editContentDialogCtl.open() + this.editContentDialogCtl!.open(); }, openAlbum: async () => { - let permissionList: Array = [ - "ohos.permission.READ_IMAGEVIDEO", - "ohos.permission.WRITE_IMAGEVIDEO" + let context: common.UIAbilityContext = AppStorage.Get('context')!; + // 申请长时任务 + let wantAgentInfo: wantAgent.WantAgentInfo = { + wants: [ + { + bundleName: 'com.ohos.note', + abilityName: 'com.ohos.note.MainAbility' + } + ], + actionType: wantAgent.OperationType.START_ABILITY, + requestCode: 0, + wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG] + }; + try { + wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj: WantAgent) => { + backgroundTaskManager.startBackgroundRunning(context, + backgroundTaskManager.BackgroundMode.DATA_TRANSFER, wantAgentObj).then(() => { + LogUtil.info(TAG, `Operation startBackgroundRunning succeeded`); + }).catch((error: BusinessError) => { + LogUtil.error(TAG, `Operation startBackgroundRunning failed. code is ${JSON.stringify(error.code)}, + message is ${JSON.stringify(error.message)}`); + }); + }); + } catch (error) { + LogUtil.error(TAG, `Operation getWantAgent failed. code is ${(error as BusinessError).code}, + message is ${(error as BusinessError).message}`); + } + let permissionList: Permissions[] = [ + 'ohos.permission.READ_IMAGEVIDEO', + 'ohos.permission.WRITE_IMAGEVIDEO' ] - let context: any = AppStorage.Get("context"); let AtManager = abilityAccessCtrl.createAtManager(); - // @ts-ignore await AtManager.requestPermissionsFromUser(context, permissionList).then((data) => { LogUtil.info(TAG, 'data permissions : ' + data.permissions) LogUtil.info(TAG, 'data result: ' + data.authResults) @@ -215,34 +265,46 @@ export struct NoteContentCompPortrait { sum += data.authResults[i] } LogUtil.info(TAG, 'request permissions sum: ' + sum) - }).catch((err) => { + }).catch((err: BusinessError) => { LogUtil.warn(TAG, 'failed to requestPermissionsFromUser : ' + err.code); }) LogUtil.info(TAG, 'startAbility start') - await globalThis.noteContext.startAbilityForResult({ - parameters: { uri: "singleselect", filterMediaType: "FILTER_MEDIA_TYPE_IMAGE" }, - bundleName: "com.ohos.photos", - abilityName: "com.ohos.photos.MainAbility", - }).then(v => { + await noteContext.startAbilityForResult({ + parameters: { uri: 'singleselect', filterMediaType: 'FILTER_MEDIA_TYPE_IMAGE' }, + bundleName: 'com.ohos.photos', + abilityName: 'com.ohos.photos.MainAbility', + }).then((v: common.AbilityResult) => { let want = v['want']; if (want != null && want != undefined) { let param = want['parameters']; - let imageUri = "" + let imageUri = ''; if (param != null && param != undefined) { - let uri = param['select-item-list']; + let uri = param['select-item-list'] as Record; imageUri = uri[0]; } - LogUtil.info(TAG, "image url" + imageUri) + LogUtil.info(TAG, 'image url' + imageUri); // 拷贝 - if (imageUri != null && imageUri != "") { + if (imageUri != null && imageUri != '') { OperationUtils.copy(imageUri).then((uriPath) => { - var path = "file://" + uriPath + let path = 'file://' + uriPath; LogUtil.info(TAG, 'image uri is:' + path) - this.controllerShow.runJavaScript("javascript:RICH_EDITOR.getFocus()") + this.controllerShow.runJavaScript('javascript:RICH_EDITOR.getFocus()'); this.controllerShow.runJavaScript("javascript:RICH_EDITOR.insertImage('" + path + "')") }) } } + // 取消长时任务 + try { + backgroundTaskManager.stopBackgroundRunning(context).then(() => { + LogUtil.info(TAG, `Operation stopBackgroundRunning succeeded`); + }).catch((error: BusinessError) => { + LogUtil.error(TAG, `Operation stopBackgroundRunning failed. code is ${JSON.stringify(error.code)}, + message is ${JSON.stringify(error.message)}`); + }); + } catch (error) { + LogUtil.error(TAG, `Operation stopBackgroundRunning failed. code is ${JSON.stringify(error.code)}, + message is ${JSON.stringify(error.message)}`); + } }); }, getBreakPoint: () => { @@ -255,6 +317,10 @@ export struct NoteContentCompPortrait { Flex({ direction: FlexDirection.Column, wrap: FlexWrap.NoWrap, alignItems: ItemAlign.Start, alignContent: FlexAlign.SpaceAround }) { Column() { + // 窗口顶部规避区域 + Row() + .width(px2vp(this.topWidth)) + .height(px2vp(this.topHeight)) ToolBarComp({ controllerShow: this.controllerShow }) NoteContentOverViewComp() .enabled(this.selectedNoteData && this.selectedNoteData?.is_deleted == Delete.Yes ? false : true) @@ -266,26 +332,27 @@ export struct NoteContentCompPortrait { .javaScriptAccess(true) .javaScriptProxy({ object: this.noteContent, - name: "callBackToApp", // html--> name.method - methodList: ["callbackhtml", "callbackScheduledSave", "callbackPasteImage", "callbackImagePath", "addToDo", "chooseStyle", "openAlbum", "callbackGetSize", "getBreakPoint"], + name: 'callBackToApp', // html--> name.method + methodList: ['callbackhtml', 'callbackScheduledSave', 'callbackPasteImage', 'callbackImagePath', + 'addToDo', 'chooseStyle', 'openAlbum', 'callbackGetSize', 'getBreakPoint'], controller: this.controllerShow }) .onPageEnd((e) => { try { if (this.dpi <= 240) { - this.controllerShow.runJavaScript("changeSizeToRk()") + this.controllerShow.runJavaScript('changeSizeToRk()'); } else if (this.dpi <= 320 && this.dpi > 240) { - this.controllerShow.runJavaScript("changeSizeToPhone()") + this.controllerShow.runJavaScript('changeSizeToPhone()'); } else { - this.controllerShow.runJavaScript("changeSizeToTablet()") + this.controllerShow.runJavaScript('changeSizeToTablet()'); } - LogUtil.info(TAG, "finish loadurl") + LogUtil.info(TAG, 'finish loadurl'); let self = this this.controllerShow.runJavaScript( "RICH_EDITOR.setHtml('" + this.selectedNoteData?.content_text + "')", () => { // wait for the image in the note to load - setTimeout(function () { + setTimeout(() => { self.restoreScrollTop() self.restoreFocus() }, 100) @@ -314,13 +381,13 @@ export struct NoteContentCompPortrait { time_id = setInterval(() => { try { if (!this.isClickBack) { - this.controllerShow.runJavaScript("scheduledSaveContent()") + this.controllerShow.runJavaScript('scheduledSaveContent()'); } } catch (error) { LogUtil.info(TAG, 'setInterval error') } }, 3000) - LogUtil.info(TAG, "setInterval time_id : " + time_id) + LogUtil.info(TAG, 'setInterval time_id : ' + time_id) this.editModel = true }) } @@ -332,7 +399,6 @@ export struct NoteContentCompPortrait { } .flexShrink(1) .padding({ left: 24, right: 24 }) - DeleteNoteComp() } .expandSafeArea([SafeAreaType.KEYBOARD, SafeAreaType.SYSTEM]) @@ -342,14 +408,17 @@ export struct NoteContentCompPortrait { aboutToAppear(): void { this.isClickBack = false - LogUtil.info(TAG, "aboutToAppear") + LogUtil.info(TAG, 'aboutToAppear'); + window.getLastWindow(getContext(this)).then(currentWindow => { + currentWindow.setWindowLayoutFullScreen(true); + }) } aboutToDisappear(): void { this.isClickBack = true clearInterval(time_id) NoteUtil.refreshAll() - LogUtil.info(TAG, "aboutToDisappear") + LogUtil.info(TAG, 'aboutToDisappear'); this.editContentDialogCtl = null } } @@ -360,9 +429,11 @@ export struct NoteContentOverViewComp { @StorageLink('AllFolderArray') AllFolderArray: FolderData[] = [] @StorageLink('CheckedNoteArray') CheckedNoteArray: NoteData[] = [] @StorageLink('isUpdate') isUpdate: boolean = false - NoteDataMoveArray: FolderData[] - editTitleDialogCtl: CustomDialogController = new CustomDialogController({ - builder: EditTitleDialog({ confirm: this.confirm.bind(this) }), + NoteDataMoveArray: FolderData[] = []; + editTitleDialogCtl: CustomDialogController | null = new CustomDialogController({ + builder: EditTitleDialog({ confirm: (newTitle: string) => { + this.confirm(newTitle); + } }), alignment: DialogAlignment.Center, autoCancel: false, customStyle: true, @@ -371,7 +442,7 @@ export struct NoteContentOverViewComp { aboutToAppear() { this.NoteDataMoveArray = this.AllFolderArray.slice(2, this.AllFolderArray.length); if (this.AllFolderArray[1] === undefined || this.AllFolderArray[1] === null) { - LogUtil.info(TAG, "this AllFolderArray[1] undefined") + LogUtil.info(TAG, 'this AllFolderArray[1] undefined'); return } this.NoteDataMoveArray.push(this.AllFolderArray[1]); @@ -384,9 +455,9 @@ export struct NoteContentOverViewComp { confirm(newTitle: string) { this.selectedNoteData.title = newTitle this.selectedNoteData.modified_time = new Date().getTime() - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid) - RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicates_note, null) + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid); + RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicatesNote, null); // save continue data let continueNote: string = JSON.stringify(this.selectedNoteData?.toNoteObject()) AppStorage.SetOrCreate('ContinueNote', continueNote) @@ -399,23 +470,24 @@ export struct NoteContentOverViewComp { Column() { Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { List() { - if (this.NoteDataMoveArray !== undefined && this.NoteDataMoveArray !== null && this.NoteDataMoveArray !== []) { - ForEach(this.NoteDataMoveArray, (item) => { + if (this.NoteDataMoveArray !== undefined && this.NoteDataMoveArray !== null && + this.NoteDataMoveArray.length > 0) { + ForEach(this.NoteDataMoveArray, (item: FolderData) => { ListItem() { NoteDataMoveItemCompMenu({ folderItem: item, uuid: this.selectedNoteData?.folder_uuid }) } .onClick(() => { this.selectedNoteData.folder_uuid = item.uuid - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid) - RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicates_note, null) + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid); + RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicatesNote, null); // save continue data let continueNote: string = JSON.stringify(this.selectedNoteData?.toNoteObject()) AppStorage.SetOrCreate('ContinueNote', continueNote) LogUtil.info(TAG, 'MenuBuilder, set continue note success') NoteUtil.refreshAll() }) - }, noteItem => noteItem?.uuid) + }, (noteItem: NoteData) => noteItem?.uuid) } } .margin({ top: 4, bottom: 4 }) @@ -439,7 +511,7 @@ export struct NoteContentOverViewComp { .fontSize(30).fontWeight(FontWeight.Medium) .onClick(() => { clearInterval(time_id) - this.editTitleDialogCtl.open() + this.editTitleDialogCtl!.open(); }) }.height(40) .width(StyleConstants.PERCENTAGE_100) @@ -449,10 +521,10 @@ export struct NoteContentOverViewComp { .id(this.isUpdate + '') .fontSize(12) .padding({ top: 4, bottom: 4 }) - .fontColor($r("app.color.modified_time_font_color")) + .fontColor($r('app.color.modified_time_font_color')) Row() { Text(FolderUtil.getFolderText(FolderUtil.getFolderData(AppStorage.Get('AllFolderArray'), this.selectedNoteData?.folder_uuid)) == - folderTextMap["sys_def_myFavorites_uuid"] ? folderTextMap["sys_def_unClassified_uuid"] : + folderTextMap.sys_def_myFavorites_uuid ? folderTextMap.sys_def_unClassified_uuid : FolderUtil.getFolderText(FolderUtil.getFolderData(AppStorage.Get('AllFolderArray'), this.selectedNoteData?.folder_uuid))) .id(this.isUpdate + '') .fontColor($r('app.color.folder_color_99182431')) @@ -466,7 +538,7 @@ export struct NoteContentOverViewComp { .padding({ left: 8, right: 8, top: 4, bottom: 4 }) .margin({ left: 8 }) .borderRadius(16) - .backgroundColor(NoteUtil.getNoteBgColor(AppStorage.Get('AllFolderArray'), this.selectedNoteData?.folder_uuid, SysDefFolderUuid.AllNotes, false)) + .backgroundColor(NoteUtil.getNoteBgColor(AppStorage.Get('AllFolderArray')!, this.selectedNoteData?.folder_uuid, SysDefFolderUuid.AllNotes, false)) .bindMenu(this.MenuBuilder) }.alignItems(VerticalAlign.Top).height(40).width(StyleConstants.PERCENTAGE_100) } @@ -483,30 +555,32 @@ export struct ToolBarComp { @Consume('SelectedFolderData') selectedFolderData: FolderData @Consume('EditModel') editModel: boolean @StorageLink('AllNoteArray') AllNoteArray: NoteData[] = AppStorage.Link('AllNoteArray') - controllerShow: WebviewController + controllerShow: webview.WebviewController = new webview.WebviewController(); onDeleteConfirm() { if (this.selectedFolderData.uuid != SysDefFolderUuid.RecentDeletes) { this.selectedNoteData.is_deleted = Delete.Yes this.selectedNoteData.deleted_time = new Date().getTime() // update note to db - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid) - RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicates_note, null) + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid); + RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicatesNote, null); routePage() } else { NoteUtil.removeNoteData(this.AllNoteArray, this.selectedNoteData?.uuid) // delete note from db - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid) - RdbStoreUtil.delete(predicates_note, null) + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid); + RdbStoreUtil.delete(predicatesNote, null); routePage() } AppStorage.SetOrCreate('isUpdate', true) } - noteDataDeleteDialogCtl: CustomDialogController = new CustomDialogController({ - builder: DeleteDialog({ onConfirm: this.onDeleteConfirm.bind(this), multiSelect: true }), + noteDataDeleteDialogCtl: CustomDialogController | null = new CustomDialogController({ + builder: DeleteDialog({ onConfirm: () => { + this.onDeleteConfirm(); + }, multiSelect: true }), alignment: DialogAlignment.Bottom, autoCancel: false, customStyle: true, @@ -526,14 +600,14 @@ export struct ToolBarComp { .responseRegion({ width: 54, height: 54 }) .onClick(() => { try { - this.controllerShow.runJavaScript("getHtmlContent()") + this.controllerShow.runJavaScript('getHtmlContent()'); // 清除定时器 if (time_id != undefined) { - LogUtil.info(TAG, "back, clearInterval time_id : " + time_id) + LogUtil.info(TAG, 'back, clearInterval time_id : ' + time_id); clearInterval(time_id) } setTimeout(() => { - LogUtil.info(TAG, "wait save cotext") + LogUtil.info(TAG, 'wait save cotext'); router.back() }, 50) NoteUtil.refreshAll() @@ -548,13 +622,14 @@ export struct ToolBarComp { .height(24).width(24) .onClick(() => { try { - this.selectedNoteData.is_favorite = (this.selectedNoteData?.is_favorite == Favorite.Yes ? Favorite.No : Favorite.Yes) + this.selectedNoteData.is_favorite = (this.selectedNoteData?.is_favorite == Favorite.Yes ? + Favorite.No : Favorite.Yes) // update note to db - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid) - RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicates_note, null) + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid); + RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicatesNote, null); if (this.selectedFolderData?.uuid === SysDefFolderUuid.MyFavorites) { - this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray'), SysDefFolderUuid.MyFavorites) + this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray')!, SysDefFolderUuid.MyFavorites)!; if (!this.selectedNoteData) { routePage() } @@ -564,7 +639,7 @@ export struct ToolBarComp { // save continue data let continueNote: string = JSON.stringify(this.selectedNoteData.toNoteObject()) AppStorage.SetOrCreate('ContinueNote', continueNote) - LogUtil.info(TAG, "ToolBarComp, set continue note success") + LogUtil.info(TAG, 'ToolBarComp, set continue note success'); } NoteUtil.refreshAll() } catch (error) { @@ -573,7 +648,7 @@ export struct ToolBarComp { }) Image($r('app.media.delete')).height(24).width(24) .onClick(() => { - this.noteDataDeleteDialogCtl.open() + this.noteDataDeleteDialogCtl!.open(); }) }.width(72) .visibility(this.selectedNoteData?.is_deleted == Delete.Yes ? Visibility.None : Visibility.Visible) @@ -584,9 +659,8 @@ export struct ToolBarComp { .onClick(() => { try { // 退出键盘 - // @ts-ignore inputMethod.getController().stopInputSession(); - this.controllerShow.runJavaScript("javascript:RICH_EDITOR.undo()") + this.controllerShow.runJavaScript('javascript:RICH_EDITOR.undo()'); } catch (error) { LogUtil.info(TAG, 'undo error') } @@ -601,9 +675,8 @@ export struct ToolBarComp { .onClick(() => { try { // 退出键盘 - // @ts-ignore inputMethod.getController().stopInputSession(); - this.controllerShow.runJavaScript("javascript:RICH_EDITOR.redo()") + this.controllerShow.runJavaScript('javascript:RICH_EDITOR.redo()'); } catch (error) { LogUtil.info(TAG, 'todo error') } @@ -618,9 +691,9 @@ export struct ToolBarComp { .onClick(() => { try { // 保存笔记信息到数据库 - this.controllerShow.runJavaScript("getHtmlContent()") + this.controllerShow.runJavaScript('getHtmlContent()'); this.editModel = false - this.controllerShow.runJavaScript("javascript:RICH_EDITOR.getBlur()") + this.controllerShow.runJavaScript('javascript:RICH_EDITOR.getBlur()'); } catch (error) { LogUtil.info(TAG, 'tick_thin error') } @@ -646,8 +719,10 @@ export struct DeleteNoteComp { @Consume('SelectedFolderData') selectedFolderData: FolderData @Consume('RefreshFlag') refreshFlag: number @Consume('SelectedNoteData') selectedNoteData: NoteData; - noteDataDeleteDialogCtlBottom: CustomDialogController = new CustomDialogController({ - builder: DeleteDialog({ onConfirm: this.onDeleteConfirm.bind(this), multiSelect: true }), + noteDataDeleteDialogCtlBottom: CustomDialogController | null = new CustomDialogController({ + builder: DeleteDialog({ onConfirm: () => { + this.onDeleteConfirm(); + }, multiSelect: true }), alignment: DialogAlignment.Bottom, autoCancel: false, customStyle: true, @@ -662,16 +737,16 @@ export struct DeleteNoteComp { this.selectedNoteData.is_deleted = Delete.Yes this.selectedNoteData.deleted_time = new Date().getTime() // update note to db - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid) - RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicates_note, null) + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid); + RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicatesNote, null); routePage() } else { NoteUtil.removeNoteData(this.AllNoteArray, this.selectedNoteData?.uuid) // delete note from db - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid) - RdbStoreUtil.delete(predicates_note, null) + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid); + RdbStoreUtil.delete(predicatesNote, null); NoteUtil.refreshAll() routePage() } @@ -686,17 +761,18 @@ export struct DeleteNoteComp { .height(24) .responseRegion({ x: -15.0, y: -15.0, width: 54, height: 54 }) .onClick(() => { - this.noteDataDeleteDialogCtlBottom.open() + this.noteDataDeleteDialogCtlBottom!.open(); }) - Text($r("app.string.delete")) + Text($r('app.string.delete')) .fontSize(10) .fontColor($r('app.color.delete_font_color')) .padding({ top: 5 }) } - .height("100%") + .height('100%') .width(180) .justifyContent(FlexAlign.Center) .alignItems(HorizontalAlign.Center) + .offset({ y: -50 }) Column() { Image($r('app.media.recover')) @@ -706,35 +782,36 @@ export struct DeleteNoteComp { .onClick(() => { this.selectedNoteData.is_deleted = Delete.No this.selectedNoteData.deleted_time = 0 - let context: any = getContext(this) - let resource = { - bundleName: "com.ohos.note", - moduleName: "default", + let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; + let resource: resourceManager.Resource = { + bundleName: 'com.ohos.note', + moduleName: 'default', id: $r('app.string.restore').id }; - context.resourceManager.getString(resource, (error, value) => { + context.resourceManager.getStringValue(resource, (error: BusinessError, value: string) => { if (error != null) { - LogUtil.error(TAG, "error is " + error); + LogUtil.error(TAG, 'error is' + error); } else { - prompt.showToast({ message: value, duration: 2000 }); + promptAction.showToast({ message: value, duration: 2000 }); } }); this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0) // update note to db - let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) - predicates_note.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid) - RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicates_note, null) + let predicatesNote = RdbStoreUtil.getRdbPredicates(TableName.NoteTable); + predicatesNote.equalTo(NoteTableColumn.Uuid, this.selectedNoteData?.uuid); + RdbStoreUtil.update(this.selectedNoteData?.toNoteObject(), predicatesNote, null); NoteUtil.refreshAll() }) - Text($r("app.string.recover")) + Text($r('app.string.recover')) .fontSize(10) .fontColor($r('app.color.recover_font_color')) .padding({ top: 5 }) } - .height("100%") + .height('100%') .width(180) .justifyContent(FlexAlign.Center) .alignItems(HorizontalAlign.Center) + .offset({ y: -50 }) } .width(360) .height(56) @@ -748,8 +825,8 @@ struct NoteDataMoveItemCompMenu { @StorageLink('CheckedNoteArray') CheckedNoteArray: NoteData[] = [] @StorageLink('AllFolderArray') AllFolderArray: FolderData[] = [] @StorageLink('isUpdate') isUpdate: boolean = false - folderItem: FolderData - uuid: String + folderItem: FolderData = new FolderData(0, '', new Date().getTime() + '', '', FolderType.CusDef, Delete.No, new Date().getTime(), new Date().getTime()); + uuid: string = ''; build() { Flex({ alignItems: ItemAlign.Center, wrap: FlexWrap.NoWrap, justifyContent: FlexAlign.Center }) { @@ -760,7 +837,8 @@ struct NoteDataMoveItemCompMenu { .width(24) .height(24) .flexShrink(0) - .fillColor(FolderUtil.getFolderIconColor(this.AllFolderArray, this.folderItem.uuid, this.folderItem.uuid == this.uuid)) + .fillColor(FolderUtil.getFolderIconColor(this.AllFolderArray, this.folderItem.uuid, + this.folderItem.uuid == this.uuid)) } .width(24) @@ -780,7 +858,7 @@ struct NoteDataMoveItemCompMenu { if (this.folderItem.uuid != SysDefFolderUuid.UnClassified) { Divider() - .color($r("app.color.divider_color_e4e4e4")) + .color($r('app.color.divider_color_e4e4e4')) .strokeWidth(1) } diff --git a/features/src/main/ets/components/NoteListComp.ets b/features/src/main/ets/components/NoteListComp.ets index 7713621269652a6b257ff1e400febe8014fefd59..8621e93d106a50f8d1bce0a6031f9ba8a0b0f08e 100644 --- a/features/src/main/ets/components/NoteListComp.ets +++ b/features/src/main/ets/components/NoteListComp.ets @@ -23,22 +23,31 @@ import { Favorite, Delete, Top, - NoteType -} from '@ohos/utils/src/main/ets/default/model/databaseModel/EnumData' + NoteType, + FolderType +} from '@ohos/utils/src/main/ets/default/model/databaseModel/EnumData'; import { NoteDataMoveDialog, DeleteDialog } from './CusDialogComp' import RdbStoreUtil from '@ohos/utils/src/main/ets/default/baseUtil/RdbStoreUtil' -import prompt from '@system.prompt' +import { promptAction } from '@kit.ArkUI'; import NoteUtil from '@ohos/utils/src/main/ets/default/baseUtil/NoteUtil' import FolderUtil from '@ohos/utils/src/main/ets/default/baseUtil/FolderUtil' import SearchModel from '@ohos/utils/src/main/ets/default/model/searchModel/SearchModel' import { LogUtil } from '@ohos/utils/src/main/ets/default/baseUtil/LogUtil' import router from '@ohos.router'; import inputMethod from '@ohos.inputMethod'; +import webview from '@ohos.web.webview'; +import resourceManager from '@ohos.resourceManager'; +import common from '@ohos.app.ability.common'; +import { BusinessError } from '@ohos.base'; const TAG = "NoteListComp" +interface RouteOption { + url: string; +} + function routePage() { - let options = { + let options: RouteOption = { url: 'pages/NoteContentHome' } try { @@ -48,6 +57,11 @@ function routePage() { } } +interface TextSpan { + type: 0 | 1; // 0 表示正常文本,1 表示高亮关键词 + text: string; +} + abstract class BasicDataSource implements IDataSource { private listeners: DataChangeListener[] = []; @@ -154,10 +168,11 @@ class noteListData extends BasicDataSource { // Note list component @Component export struct NoteListComp { + @StorageLink('topHeight') topHeight: number = 0; @StorageLink('AllFolderArray') AllFolderArray: FolderData[] = AppStorage.Link('AllFolderArray') @Consume('SelectedFolderData') selectedFolderData: FolderData @Consume('Search') search: boolean - controllerShow: WebviewController + controllerShow: webview.WebviewController = new webview.WebviewController(); @Consume('AsideWidth') asideWidth: number build() { @@ -177,6 +192,7 @@ export struct NoteListComp { OperateNoteCompForPortrait() } .flexShrink(0) + .padding({ bottom: 90}) } .height('100%') .width('100%') @@ -194,8 +210,8 @@ export struct NoteListComp { @Component struct NoteOverViewComp { - @StorageLink('AllNoteArray') AllNoteArray: NoteData[] = AppStorage.Link('AllNoteArray') - @StorageLink('breakPoint') breakPoints: string = AppStorage.Get('breakPoint') + @StorageLink('AllNoteArray') AllNoteArray: NoteData[] = AppStorage.Link('AllNoteArray')!; + @StorageLink('breakPoint') breakPoints: string = AppStorage.Get('breakPoint')!; @StorageLink('CheckedNoteArray') CheckedNoteArray: NoteData[] = [] @Consume('SelectedFolderData') selectedFolderData: FolderData @Consume('RefreshFlag') refreshFlag: number @@ -204,14 +220,14 @@ struct NoteOverViewComp { @Consume('ExpandStatus') expandStatus: boolean @Consume('Search') search: boolean @Consume('PortraitModel') portraitModel: boolean - controllerShow: WebviewController - @State noteNumber: number = undefined + controllerShow: webview.WebviewController = new webview.WebviewController(); + @State noteNumber: number = 0; @StorageLink('isUpdate') @Watch('notesNumberChange') isUpdate: boolean = false @Consume('AsideWidth') asideWidth: number @State isShow: boolean = false notesNumberChange() { - let noteNumbers = FolderUtil.getNoteCount(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid) + let noteNumbers = FolderUtil.getNoteCount(AppStorage.Get('AllNoteArray')!, this.selectedFolderData.uuid); if (noteNumbers == 0) { this.isShow = false } else { @@ -319,9 +335,9 @@ struct NoteOverViewComp { @Component export struct NoteItemComp { - public noteItem: NoteData - public spans: any[] - controllerShow: WebviewController + public noteItem: NoteData = new NoteData(0, '标题', new Date().getTime() + '', '', '', '', NoteType.SysDef, Top.No, Favorite.No, Delete.No, new Date().getTime(), new Date().getTime(), 0, 0); + public spans: TextSpan[] = []; + controllerShow: webview.WebviewController = new webview.WebviewController(); @Consume('SelectedFolderData') selectedFolderData: FolderData @Consume('SelectedNoteData') selectedNoteData: NoteData @StorageLink('AllFolderArray') AllFolderArray: FolderData[] = AppStorage.Link('AllFolderArray') @@ -331,7 +347,7 @@ export struct NoteItemComp { @Consume('Search') search: boolean @Consume('selectedAll') selectedAll: boolean @Consume('PortraitModel') portraitModel: boolean - @State isChecked: boolean = undefined + @State isChecked: boolean = false; @Consume('Longpress') @Watch('isLongPress') longpress: boolean @StorageLink('isUpdate') isUpdate: boolean = false @@ -356,7 +372,7 @@ export struct NoteItemComp { .id(this.isUpdate + '') .height(16) .width(4) - .fillColor(NoteUtil.getVerticalBarBgColor(AppStorage.Get('AllFolderArray'), this.noteItem.folder_uuid)) + .fillColor(NoteUtil.getVerticalBarBgColor(AppStorage.Get('AllFolderArray')!, this.noteItem.folder_uuid)) Text(this.noteItem.title) .fontSize(16) .maxLines(1) @@ -451,12 +467,18 @@ export struct NoteItemComp { LogUtil.info(TAG, "NoteItemComp, set continue note success") } if (this.portraitModel == false) { - this.controllerShow.runJavaScript( - "RICH_EDITOR.setHtml('" + this.selectedNoteData?.content_text + "')" - ) - this.controllerShow.runJavaScript( - "RICH_EDITOR.cancelSelection()" - ) + try { + this.controllerShow.runJavaScript( + "RICH_EDITOR.setHtml('" + this.selectedNoteData?.content_text + "')" + ) + this.controllerShow.runJavaScript( + "RICH_EDITOR.cancelSelection()" + ) + LogUtil.info(TAG, `runJavaScript setHtml and cancelSelection success`); + } catch (error) { + LogUtil.error(TAG, `runJavaScript setHtml and cancelSelection failed. + code:${JSON.stringify(error.code)},message:${JSON.stringify(error.message)}`); + } } if (this.portraitModel == true) { AppStorage.SetOrCreate('NewNote', this.selectedNoteData) @@ -464,7 +486,7 @@ export struct NoteItemComp { routePage() } this.selectedAll = this.CheckedNoteArray.length == - NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid).length + NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray')!, this.selectedFolderData.uuid).length; this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0) }) .gesture( @@ -497,12 +519,12 @@ export struct NoteItemListComp { @Consume('PortraitModel') portraitModel: boolean @State @Watch('setNoteListLazy') dateList: NoteData[] = []; @State noteList: noteListData = new noteListData(); - controllerShow: WebviewController + controllerShow: webview.WebviewController = new webview.WebviewController(); @StorageLink('isUpdate') @Watch('updateList') isUpdate: boolean = false updateList() { if (this.isUpdate) { - this.dateList = NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid) + this.dateList = NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray')!, this.selectedFolderData.uuid); } this.isUpdate = false this.doSearch() @@ -511,7 +533,7 @@ export struct NoteItemListComp { aboutToAppear() { LogUtil.info(TAG, "inputKeyWord:" + this.inputKeyword) this.inputKeyword = '' - this.dateList = NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid) + this.dateList = NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray')!, this.selectedFolderData.uuid); } doSearch() { @@ -519,7 +541,7 @@ export struct NoteItemListComp { this.setNoteListLazy() return; }; - SearchModel.search(NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid), this.inputKeyword) + SearchModel.search(NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray')!, this.selectedFolderData.uuid), this.inputKeyword) .then((result: NoteData[]) => { LogUtil.info(TAG, "result size " + result.length.toString()) this.searchResultList = result @@ -527,7 +549,7 @@ export struct NoteItemListComp { if (this.searchResultList.length != 0) { this.selectedNoteData = this.searchResultList[0] } else { - this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid) + this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray')!, this.selectedFolderData.uuid)!; } if (this.portraitModel == false) { this.controllerShow.runJavaScript( @@ -588,7 +610,8 @@ export struct NoteItemListComp { .height('100%') .padding({ bottom: 120 }) .visibility((FolderUtil.getNoteCount(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid) == 0) ? Visibility.Visible : Visibility.None) - LazyForEach(this.noteList, (noteItem) => { + + LazyForEach(this.noteList, (noteItem: NoteData) => { ListItem() { Column() { NoteItemComp({ @@ -600,7 +623,7 @@ export struct NoteItemListComp { .padding({ left: 24, right: 24, bottom: 12 }) } .visibility((FolderUtil.getNoteCount(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid) == 0) ? Visibility.None : Visibility.Visible) - }, noteItem => JSON.stringify(noteItem)) + }, (noteItem: NoteData) => JSON.stringify(noteItem)) } .id(this.isUpdate + '') .margin((FolderUtil.getNoteCount(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid) == 0) ? { @@ -649,9 +672,11 @@ export struct OperateNoteComp { @Consume('PortraitModel') portraitModel: boolean @Consume('selectedAll') selectedAll: boolean @StorageLink('isUpdate') isUpdate: boolean = false - controllerShow: WebviewController - noteDataMoveDialogCtl: CustomDialogController = new CustomDialogController({ - builder: NoteDataMoveDialog({ onConfirm: this.onMoveConfirm.bind(this) }), + controllerShow: webview.WebviewController = new webview.WebviewController(); + noteDataMoveDialogCtl: CustomDialogController | null = new CustomDialogController({ + builder: NoteDataMoveDialog({ onConfirm: (folderUuid: string) => { + this.onMoveConfirm(folderUuid); + } }), alignment: DialogAlignment.Center, autoCancel: false, customStyle: true, @@ -668,9 +693,9 @@ export struct OperateNoteComp { // update note to db let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, noteItem.uuid) - RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null) + RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null); }) - this.selectedNoteData = NoteUtil.getFirstNoteData(this.AllNoteArray, this.selectedFolderData.uuid) + this.selectedNoteData = NoteUtil.getFirstNoteData(this.AllNoteArray, this.selectedFolderData.uuid)!; // save continue data let continueNote: string = JSON.stringify(this.selectedNoteData?.toNoteObject()) AppStorage.SetOrCreate('ContinueNote', continueNote) @@ -684,8 +709,10 @@ export struct OperateNoteComp { NoteUtil.refreshAll() } - noteDataDeleteDialogCtl: CustomDialogController = new CustomDialogController({ - builder: DeleteDialog({ onConfirm: this.onDeleteConfirm.bind(this), multiSelect: true }), + noteDataDeleteDialogCtl: CustomDialogController | null = new CustomDialogController({ + builder: DeleteDialog({ onConfirm: () => { + this.onDeleteConfirm(); + }, multiSelect: true }), alignment: DialogAlignment.Center, autoCancel: false, customStyle: true, @@ -699,7 +726,7 @@ export struct OperateNoteComp { // update note to db let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, noteItem.uuid) - RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null) + RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null); }) } else { this.CheckedNoteArray.forEach((noteItem: NoteData) => { @@ -707,13 +734,13 @@ export struct OperateNoteComp { // delete note from db let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, noteItem.uuid) - RdbStoreUtil.delete(predicates_note, null) + RdbStoreUtil.delete(predicates_note, null); }) } NoteUtil.unsetAllNotesChecked(this.CheckedNoteArray) this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0) this.longpress = false - this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid) + this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray')!, this.selectedFolderData.uuid)!; if (this.portraitModel == false) { this.controllerShow.runJavaScript("RICH_EDITOR.setHtml('" + this.selectedNoteData?.content_text + "')") } @@ -739,7 +766,7 @@ export struct OperateNoteComp { // update note to db let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, noteItem.uuid) - RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null) + RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null); }) this.longpress = false NoteUtil.unsetAllNotesChecked(this.CheckedNoteArray) @@ -753,7 +780,7 @@ export struct OperateNoteComp { .margin({ right: this.selectedFolderData.uuid == SysDefFolderUuid.RecentDeletes ? 0 : 18 }) .visibility(this.selectedFolderData.uuid == SysDefFolderUuid.RecentDeletes ? Visibility.None : Visibility.Visible) .onClick(() => { - this.noteDataMoveDialogCtl.open() + this.noteDataMoveDialogCtl!.open(); }) Image($r('app.media.delete')) .width(24) @@ -762,7 +789,7 @@ export struct OperateNoteComp { .opacity(this.CheckedNoteArray.length == 0 ? 0.4 : 1) .enabled(this.CheckedNoteArray.length == 0 ? false : true) .onClick(() => { - this.noteDataDeleteDialogCtl.open() + this.noteDataDeleteDialogCtl!.open(); }) Image($r('app.media.recover')) .width(24) @@ -775,23 +802,23 @@ export struct OperateNoteComp { this.CheckedNoteArray.forEach((noteItem) => { noteItem.is_deleted = Delete.No noteItem.deleted_time = 0 - let context: any = getContext(this) - let resource = { + let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; + let resource: resourceManager.Resource = { bundleName: "com.ohos.note", moduleName: "default", id: $r('app.string.restore').id }; - context.resourceManager.getString(resource, (error, value) => { + context.resourceManager.getStringValue(resource, (error: BusinessError, value: string) => { if (error != null) { LogUtil.error(TAG, "error is " + error); } else { - prompt.showToast({ message: value, duration: 2000 }); + promptAction.showToast({ message: value, duration: 2000 }); } }); // update note to db let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, noteItem.uuid) - RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null) + RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null); }) this.longpress = false NoteUtil.unsetAllNotesChecked(this.CheckedNoteArray) @@ -805,8 +832,8 @@ export struct OperateNoteComp { .onClick(() => { LogUtil.info(TAG, "select all click") if (this.CheckedNoteArray.length < - NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid).length) { - NoteUtil.setAllNotesChecked(this.CheckedNoteArray, NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid)) + NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray')!, this.selectedFolderData.uuid).length) { + NoteUtil.setAllNotesChecked(this.CheckedNoteArray, NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray')!, this.selectedFolderData.uuid)); } else { NoteUtil.unsetAllNotesChecked(this.CheckedNoteArray) } @@ -831,7 +858,7 @@ export struct AddNoteComp { @Consume('EditModel') editModel: boolean @Consume('ChooseNote') chooseNote: boolean @Consume('PortraitModel') portraitModel: boolean - controllerShow: WebviewController + controllerShow: webview.WebviewController = new webview.WebviewController(); build() { Image($r('app.media.addNote')) @@ -840,7 +867,7 @@ export struct AddNoteComp { .margin({ right: 12 }) .responseRegion({ x: -15.0, y: -15.0, width: 54, height: 54 }) .onClick(() => { - let noteData + let noteData: NoteData; if (this.selectedFolderData.uuid == SysDefFolderUuid.AllNotes || this.selectedFolderData.uuid == SysDefFolderUuid.MyFavorites) { noteData = new NoteData(0, "标题", new Date().getTime() + "", SysDefFolderUuid.UnClassified, "", "", NoteType.SysDef, Top.No, Favorite.No, Delete.No, new Date().getTime(), new Date().getTime(), 0, 0) } else { @@ -848,15 +875,20 @@ export struct AddNoteComp { } this.AllNoteArray.push(noteData) - RdbStoreUtil.insert(TableName.NoteTable, noteData.toNoteObject(), null) + RdbStoreUtil.insert(TableName.NoteTable, noteData.toNoteObject(), null); LogUtil.info(TAG, 'insert new note is:' + noteData.uuid) this.selectedNoteData = noteData AppStorage.SetOrCreate('NewNote', noteData) if (this.portraitModel == false) { - this.controllerShow.runJavaScript( - "RICH_EDITOR.setHtml('" + this.selectedNoteData?.content_text + "')" - ) + try { + this.controllerShow.runJavaScript( + "RICH_EDITOR.setHtml('" + this.selectedNoteData?.content_text + "')" + ) + } catch (error) { + LogUtil.error(TAG, `runJavaScript setHtml content_text failed. + code:${JSON.stringify(error.code)},message:${JSON.stringify(error.message)}`); + } } if (this.portraitModel == true) { this.editModel = true @@ -894,7 +926,6 @@ export struct SearchComp { focusControl.requestFocus('searchFocus') this.search = false // 退出键盘 - // @ts-ignore inputMethod.getController().stopInputSession(); AppStorage.SetOrCreate('Search', this.search) }) @@ -963,8 +994,10 @@ export struct OperateNoteCompForPortrait { @Consume('PortraitModel') portraitModel: boolean @State greyOpacity: boolean = false @StorageLink('isUpdate') isUpdate: boolean = false - noteDataMoveDialogCtlBottom: CustomDialogController = new CustomDialogController({ - builder: NoteDataMoveDialog({ onConfirm: this.onMoveConfirm.bind(this) }), + noteDataMoveDialogCtlBottom: CustomDialogController | null = new CustomDialogController({ + builder: NoteDataMoveDialog({ onConfirm: (folderUuid: string) => { + this.onMoveConfirm(folderUuid); + } }), alignment: DialogAlignment.Bottom, autoCancel: false, customStyle: true, @@ -991,9 +1024,9 @@ export struct OperateNoteCompForPortrait { // update note to db let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, noteItem.uuid) - RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null) + RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null); }) - this.selectedNoteData = NoteUtil.getFirstNoteData(this.AllNoteArray, this.selectedFolderData.uuid) + this.selectedNoteData = NoteUtil.getFirstNoteData(this.AllNoteArray, this.selectedFolderData.uuid)!; // save continue data let continueNote: string = JSON.stringify(this.selectedNoteData?.toNoteObject()) AppStorage.SetOrCreate('ContinueNote', continueNote) @@ -1004,8 +1037,10 @@ export struct OperateNoteCompForPortrait { NoteUtil.refreshAll() } - noteDataDeleteDialogCtlBottom: CustomDialogController = new CustomDialogController({ - builder: DeleteDialog({ onConfirm: this.onDeleteConfirm.bind(this), multiSelect: true }), + noteDataDeleteDialogCtlBottom: CustomDialogController | null = new CustomDialogController({ + builder: DeleteDialog({ onConfirm: () => { + this.onDeleteConfirm(); + }, multiSelect: true }), alignment: DialogAlignment.Bottom, autoCancel: false, customStyle: true, @@ -1019,7 +1054,7 @@ export struct OperateNoteCompForPortrait { // update note to db let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, noteItem.uuid) - RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null) + RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null); }) } else { this.CheckedNoteArray.forEach((noteItem: NoteData) => { @@ -1027,13 +1062,13 @@ export struct OperateNoteCompForPortrait { // delete note from db let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, noteItem.uuid) - RdbStoreUtil.delete(predicates_note, null) + RdbStoreUtil.delete(predicates_note, null); }) } NoteUtil.unsetAllNotesChecked(this.CheckedNoteArray) this.longpress = false this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0) - this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid) + this.selectedNoteData = NoteUtil.getFirstNoteData(AppStorage.Get('AllNoteArray')!, this.selectedFolderData.uuid)!; // save continue data let continueNote: string = JSON.stringify(this.selectedNoteData?.toNoteObject()) AppStorage.SetOrCreate('ContinueNote', continueNote) @@ -1056,7 +1091,7 @@ export struct OperateNoteCompForPortrait { // update note to db let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, noteItem.uuid) - RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null) + RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null); }) this.longpress = false this.refreshFlag = (this.refreshFlag == 0 ? 1 : 0) @@ -1084,7 +1119,7 @@ export struct OperateNoteCompForPortrait { .height(24) .responseRegion({ x: -15.0, y: -15.0, width: 54, height: 54 }) .onClick(() => { - this.noteDataDeleteDialogCtlBottom.open() + this.noteDataDeleteDialogCtlBottom!.open(); AppStorage.SetOrCreate('isUpdate', true) }) Text($r("app.string.delete")) @@ -1108,7 +1143,7 @@ export struct OperateNoteCompForPortrait { .height(24) .responseRegion({ x: -15.0, y: -15.0, width: 54, height: 54 }) .onClick(() => { - this.noteDataMoveDialogCtlBottom.open() + this.noteDataMoveDialogCtlBottom!.open(); AppStorage.SetOrCreate('isUpdate', true) }) Text($r("app.string.move")) @@ -1136,23 +1171,23 @@ export struct OperateNoteCompForPortrait { this.CheckedNoteArray.forEach((noteItem) => { noteItem.is_deleted = Delete.No noteItem.deleted_time = 0 - let context: any = getContext(this) - let resource = { + let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; + let resource: resourceManager.Resource = { bundleName: "com.ohos.note", moduleName: "default", id: $r('app.string.restore').id }; - context.resourceManager.getString(resource, (error, value) => { + context.resourceManager.getStringValue(resource, (error: BusinessError, value: string) => { if (error != null) { LogUtil.error(TAG, "error is " + error); } else { - prompt.showToast({ message: value, duration: 2000 }); + promptAction.showToast({ message: value, duration: 2000 }); } }); // update note to db let predicates_note = RdbStoreUtil.getRdbPredicates(TableName.NoteTable) predicates_note.equalTo(NoteTableColumn.Uuid, noteItem.uuid) - RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null) + RdbStoreUtil.update(noteItem.toNoteObject(), predicates_note, null); }) this.longpress = false NoteUtil.unsetAllNotesChecked(this.CheckedNoteArray) @@ -1180,10 +1215,10 @@ export struct OperateNoteCompForPortrait { .responseRegion({ x: -15.0, y: -15.0, width: 54, height: 54 }) .id(this.isUpdate + '') .onClick(() => { - if (this.CheckedNoteArray.length < - NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid) - .length) { - NoteUtil.setAllNotesChecked(this.CheckedNoteArray, NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray'), this.selectedFolderData.uuid)) + if (this.CheckedNoteArray.length < NoteUtil.getNoteDataArray(AppStorage.Get('AllNoteArray')!, + this.selectedFolderData.uuid).length) { + NoteUtil.setAllNotesChecked(this.CheckedNoteArray, NoteUtil.getNoteDataArray( + AppStorage.Get('AllNoteArray')!, this.selectedFolderData.uuid)); } else { NoteUtil.unsetAllNotesChecked(this.CheckedNoteArray) } diff --git a/hvigor/hvigor-config.json5 b/hvigor/hvigor-config.json5 index 63bbb5e6edaf0ac4d3ac60e711f809e0f5355ddd..6ebda6766abb8e22b66d71b75b3e6e723819ab91 100644 --- a/hvigor/hvigor-config.json5 +++ b/hvigor/hvigor-config.json5 @@ -1,6 +1,20 @@ +/* + * Copyright (c) 2022-2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + { - "hvigorVersion": "3.0.2", + "modelVersion": "5.0.2", "dependencies": { - "@ohos/hvigor-ohos-plugin": "3.0.2" } -} +} \ No newline at end of file diff --git a/hvigor/hvigor-wrapper.js b/hvigor/hvigor-wrapper.js deleted file mode 100644 index 994f22987bd0739b9faa07c966b066c2d9218602..0000000000000000000000000000000000000000 --- a/hvigor/hvigor-wrapper.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";var e=require("fs"),t=require("path"),n=require("os"),r=require("crypto"),u=require("child_process"),o=require("constants"),i=require("stream"),s=require("util"),c=require("assert"),a=require("tty"),l=require("zlib"),f=require("net");function d(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var D=d(e),p=d(t),E=d(n),m=d(r),h=d(u),y=d(o),C=d(i),F=d(s),g=d(c),A=d(a),v=d(l),S=d(f),w="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},O={},b={},_={},B=w&&w.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(_,"__esModule",{value:!0}),_.isMac=_.isLinux=_.isWindows=void 0;const P=B(E.default),k="Windows_NT",x="Linux",N="Darwin";_.isWindows=function(){return P.default.type()===k},_.isLinux=function(){return P.default.type()===x},_.isMac=function(){return P.default.type()===N};var I={},T=w&&w.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),R=w&&w.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),M=w&&w.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&T(t,e,n);return R(t,e),t};Object.defineProperty(I,"__esModule",{value:!0}),I.hash=void 0;const L=M(m.default);I.hash=function(e,t="md5"){return L.createHash(t).update(e,"utf-8").digest("hex")},function(e){var t=w&&w.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),n=w&&w.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=w&&w.__importStar||function(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var u in e)"default"!==u&&Object.prototype.hasOwnProperty.call(e,u)&&t(r,e,u);return n(r,e),r};Object.defineProperty(e,"__esModule",{value:!0}),e.HVIGOR_BOOT_JS_FILE_PATH=e.HVIGOR_PROJECT_DEPENDENCY_PACKAGE_JSON_PATH=e.HVIGOR_PROJECT_DEPENDENCIES_HOME=e.HVIGOR_PROJECT_WRAPPER_HOME=e.HVIGOR_PROJECT_NAME=e.HVIGOR_PROJECT_ROOT_DIR=e.HVIGOR_PROJECT_CACHES_HOME=e.HVIGOR_PNPM_STORE_PATH=e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=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 u=r(p.default),o=r(E.default),i=_,s=I;e.HVIGOR_ENGINE_PACKAGE_NAME="@ohos/hvigor",e.PNPM_TOOL=(0,i.isWindows)()?"pnpm.cmd":"pnpm",e.NPM_TOOL=(0,i.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=u.resolve(o.homedir(),".hvigor"),e.HVIGOR_WRAPPER_TOOLS_HOME=u.resolve(e.HVIGOR_USER_HOME,"wrapper","tools"),e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=u.resolve(e.HVIGOR_WRAPPER_TOOLS_HOME,"node_modules",".bin",e.PNPM_TOOL),e.HVIGOR_PNPM_STORE_PATH=u.resolve(e.HVIGOR_USER_HOME,"caches"),e.HVIGOR_PROJECT_CACHES_HOME=u.resolve(e.HVIGOR_USER_HOME,"project_caches"),e.HVIGOR_PROJECT_ROOT_DIR=process.cwd(),e.HVIGOR_PROJECT_NAME=u.basename((0,s.hash)(e.HVIGOR_PROJECT_ROOT_DIR)),e.HVIGOR_PROJECT_WRAPPER_HOME=u.resolve(e.HVIGOR_PROJECT_ROOT_DIR,e.HVIGOR),e.HVIGOR_PROJECT_DEPENDENCIES_HOME=u.resolve(e.HVIGOR_PROJECT_CACHES_HOME,e.HVIGOR_PROJECT_NAME,"workspace"),e.HVIGOR_PROJECT_DEPENDENCY_PACKAGE_JSON_PATH=u.resolve(e.HVIGOR_PROJECT_DEPENDENCIES_HOME,e.DEFAULT_PACKAGE_JSON),e.HVIGOR_BOOT_JS_FILE_PATH=u.resolve(e.HVIGOR_PROJECT_DEPENDENCIES_HOME,"node_modules","@ohos","hvigor","bin","hvigor.js")}(b);var j={},$={};Object.defineProperty($,"__esModule",{value:!0}),$.logInfoPrintConsole=$.logErrorAndExit=void 0,$.logErrorAndExit=function(e){e instanceof Error?console.error(e.message):console.error(e),process.exit(-1)},$.logInfoPrintConsole=function(e){console.log(e)};var H=w&&w.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),J=w&&w.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),G=w&&w.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&H(t,e,n);return J(t,e),t},V=w&&w.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(j,"__esModule",{value:!0}),j.isFileExists=j.offlinePluginConversion=j.executeCommand=j.getNpmPath=j.hasNpmPackInPaths=void 0;const U=h.default,W=G(p.default),z=b,K=$,q=V(D.default);j.hasNpmPackInPaths=function(e,t){try{return require.resolve(e,{paths:[...t]}),!0}catch(e){return!1}},j.getNpmPath=function(){const e=process.execPath;return W.join(W.dirname(e),z.NPM_TOOL)},j.executeCommand=function(e,t,n){0!==(0,U.spawnSync)(e,t,n).status&&(0,K.logErrorAndExit)(`Error: ${e} ${t} execute failed.See above for details.`)},j.offlinePluginConversion=function(e,t){return t.startsWith("file:")||t.endsWith(".tgz")?W.resolve(e,z.HVIGOR,t.replace("file:","")):t},j.isFileExists=function(e){return q.default.existsSync(e)&&q.default.statSync(e).isFile()},function(e){var t=w&&w.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),n=w&&w.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=w&&w.__importStar||function(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var u in e)"default"!==u&&Object.prototype.hasOwnProperty.call(e,u)&&t(r,e,u);return n(r,e),r},u=w&&w.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(e,"__esModule",{value:!0}),e.executeInstallPnpm=e.isPnpmAvailable=e.environmentHandler=e.checkNpmConifg=e.PNPM_VERSION=void 0;const o=r(D.default),i=b,s=j,c=r(p.default),a=$,l=h.default,f=u(E.default);e.PNPM_VERSION="7.30.0",e.checkNpmConifg=function(){const e=c.resolve(i.HVIGOR_PROJECT_ROOT_DIR,".npmrc"),t=c.resolve(f.default.homedir(),".npmrc");if((0,s.isFileExists)(e)||(0,s.isFileExists)(t))return;const n=(0,s.getNpmPath)(),r=(0,l.spawnSync)(n,["config","get","prefix"],{cwd:i.HVIGOR_PROJECT_ROOT_DIR});if(0!==r.status||!r.stdout)return void(0,a.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.");const u=c.resolve(`${r.stdout}`.replace(/[\r\n]/gi,""),".npmrc");(0,s.isFileExists)(u)||(0,a.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.")},e.environmentHandler=function(){process.env["npm_config_update-notifier"]="false"},e.isPnpmAvailable=function(){return!!o.existsSync(i.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH)&&(0,s.hasNpmPackInPaths)("pnpm",[i.HVIGOR_WRAPPER_TOOLS_HOME])},e.executeInstallPnpm=function(){(0,a.logInfoPrintConsole)(`Installing pnpm@${e.PNPM_VERSION}...`);const t=(0,s.getNpmPath)();!function(){const t=c.resolve(i.HVIGOR_WRAPPER_TOOLS_HOME,i.DEFAULT_PACKAGE_JSON);try{o.existsSync(i.HVIGOR_WRAPPER_TOOLS_HOME)||o.mkdirSync(i.HVIGOR_WRAPPER_TOOLS_HOME,{recursive:!0});const n={dependencies:{}};n.dependencies[i.PNPM]=e.PNPM_VERSION,o.writeFileSync(t,JSON.stringify(n))}catch(e){(0,a.logErrorAndExit)(`Error: EPERM: operation not permitted,create ${t} failed.`)}}(),(0,s.executeCommand)(t,["install","pnpm"],{cwd:i.HVIGOR_WRAPPER_TOOLS_HOME,stdio:["inherit","inherit","inherit"],env:process.env}),(0,a.logInfoPrintConsole)("Pnpm install success.")}}(O);var Y={},X={},Z={},Q={};Object.defineProperty(Q,"__esModule",{value:!0}),Q.Unicode=void 0;class ee{}Q.Unicode=ee,ee.Space_Separator=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,ee.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]/,ee.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(Z,"__esModule",{value:!0}),Z.JudgeUtil=void 0;const te=Q;Z.JudgeUtil=class{static isIgnoreChar(e){return"string"==typeof e&&("\t"===e||"\v"===e||"\f"===e||" "===e||" "===e||"\ufeff"===e||"\n"===e||"\r"===e||"\u2028"===e||"\u2029"===e)}static isSpaceSeparator(e){return"string"==typeof e&&te.Unicode.Space_Separator.test(e)}static isIdStartChar(e){return"string"==typeof e&&(e>="a"&&e<="z"||e>="A"&&e<="Z"||"$"===e||"_"===e||te.Unicode.ID_Start.test(e))}static isIdContinueChar(e){return"string"==typeof e&&(e>="a"&&e<="z"||e>="A"&&e<="Z"||e>="0"&&e<="9"||"$"===e||"_"===e||"‌"===e||"‍"===e||te.Unicode.ID_Continue.test(e))}static isDigitWithoutZero(e){return/[1-9]/.test(e)}static isDigit(e){return"string"==typeof e&&/[0-9]/.test(e)}static isHexDigit(e){return"string"==typeof e&&/[0-9A-Fa-f]/.test(e)}};var ne={},re={fromCallback:function(e){return Object.defineProperty((function(...t){if("function"!=typeof t[t.length-1])return new Promise(((n,r)=>{e.call(this,...t,((e,t)=>null!=e?r(e):n(t)))}));e.apply(this,t)}),"name",{value:e.name})},fromPromise:function(e){return Object.defineProperty((function(...t){const n=t[t.length-1];if("function"!=typeof n)return e.apply(this,t);e.apply(this,t.slice(0,-1)).then((e=>n(null,e)),n)}),"name",{value:e.name})}},ue=y.default,oe=process.cwd,ie=null,se=process.env.GRACEFUL_FS_PLATFORM||process.platform;process.cwd=function(){return ie||(ie=oe.call(process)),ie};try{process.cwd()}catch(e){}if("function"==typeof process.chdir){var ce=process.chdir;process.chdir=function(e){ie=null,ce.call(process,e)},Object.setPrototypeOf&&Object.setPrototypeOf(process.chdir,ce)}var ae=function(e){ue.hasOwnProperty("O_SYMLINK")&&process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)&&function(e){e.lchmod=function(t,n,r){e.open(t,ue.O_WRONLY|ue.O_SYMLINK,n,(function(t,u){t?r&&r(t):e.fchmod(u,n,(function(t){e.close(u,(function(e){r&&r(t||e)}))}))}))},e.lchmodSync=function(t,n){var r,u=e.openSync(t,ue.O_WRONLY|ue.O_SYMLINK,n),o=!0;try{r=e.fchmodSync(u,n),o=!1}finally{if(o)try{e.closeSync(u)}catch(e){}else e.closeSync(u)}return r}}(e);e.lutimes||function(e){ue.hasOwnProperty("O_SYMLINK")&&e.futimes?(e.lutimes=function(t,n,r,u){e.open(t,ue.O_SYMLINK,(function(t,o){t?u&&u(t):e.futimes(o,n,r,(function(t){e.close(o,(function(e){u&&u(t||e)}))}))}))},e.lutimesSync=function(t,n,r){var u,o=e.openSync(t,ue.O_SYMLINK),i=!0;try{u=e.futimesSync(o,n,r),i=!1}finally{if(i)try{e.closeSync(o)}catch(e){}else e.closeSync(o)}return u}):e.futimes&&(e.lutimes=function(e,t,n,r){r&&process.nextTick(r)},e.lutimesSync=function(){})}(e);e.chown=r(e.chown),e.fchown=r(e.fchown),e.lchown=r(e.lchown),e.chmod=t(e.chmod),e.fchmod=t(e.fchmod),e.lchmod=t(e.lchmod),e.chownSync=u(e.chownSync),e.fchownSync=u(e.fchownSync),e.lchownSync=u(e.lchownSync),e.chmodSync=n(e.chmodSync),e.fchmodSync=n(e.fchmodSync),e.lchmodSync=n(e.lchmodSync),e.stat=o(e.stat),e.fstat=o(e.fstat),e.lstat=o(e.lstat),e.statSync=i(e.statSync),e.fstatSync=i(e.fstatSync),e.lstatSync=i(e.lstatSync),e.chmod&&!e.lchmod&&(e.lchmod=function(e,t,n){n&&process.nextTick(n)},e.lchmodSync=function(){});e.chown&&!e.lchown&&(e.lchown=function(e,t,n,r){r&&process.nextTick(r)},e.lchownSync=function(){});"win32"===se&&(e.rename="function"!=typeof e.rename?e.rename:function(t){function n(n,r,u){var o=Date.now(),i=0;t(n,r,(function s(c){if(c&&("EACCES"===c.code||"EPERM"===c.code||"EBUSY"===c.code)&&Date.now()-o<6e4)return setTimeout((function(){e.stat(r,(function(e,o){e&&"ENOENT"===e.code?t(n,r,s):u(c)}))}),i),void(i<100&&(i+=10));u&&u(c)}))}return Object.setPrototypeOf&&Object.setPrototypeOf(n,t),n}(e.rename));function t(t){return t?function(n,r,u){return t.call(e,n,r,(function(e){s(e)&&(e=null),u&&u.apply(this,arguments)}))}:t}function n(t){return t?function(n,r){try{return t.call(e,n,r)}catch(e){if(!s(e))throw e}}:t}function r(t){return t?function(n,r,u,o){return t.call(e,n,r,u,(function(e){s(e)&&(e=null),o&&o.apply(this,arguments)}))}:t}function u(t){return t?function(n,r,u){try{return t.call(e,n,r,u)}catch(e){if(!s(e))throw e}}:t}function o(t){return t?function(n,r,u){function o(e,t){t&&(t.uid<0&&(t.uid+=4294967296),t.gid<0&&(t.gid+=4294967296)),u&&u.apply(this,arguments)}return"function"==typeof r&&(u=r,r=null),r?t.call(e,n,r,o):t.call(e,n,o)}:t}function i(t){return t?function(n,r){var u=r?t.call(e,n,r):t.call(e,n);return u&&(u.uid<0&&(u.uid+=4294967296),u.gid<0&&(u.gid+=4294967296)),u}:t}function s(e){return!e||("ENOSYS"===e.code||!(process.getuid&&0===process.getuid()||"EINVAL"!==e.code&&"EPERM"!==e.code))}e.read="function"!=typeof e.read?e.read:function(t){function n(n,r,u,o,i,s){var c;if(s&&"function"==typeof s){var a=0;c=function(l,f,d){if(l&&"EAGAIN"===l.code&&a<10)return a++,t.call(e,n,r,u,o,i,c);s.apply(this,arguments)}}return t.call(e,n,r,u,o,i,c)}return Object.setPrototypeOf&&Object.setPrototypeOf(n,t),n}(e.read),e.readSync="function"!=typeof e.readSync?e.readSync:(c=e.readSync,function(t,n,r,u,o){for(var i=0;;)try{return c.call(e,t,n,r,u,o)}catch(e){if("EAGAIN"===e.code&&i<10){i++;continue}throw e}});var c};var le=C.default.Stream,fe=function(e){return{ReadStream:function t(n,r){if(!(this instanceof t))return new t(n,r);le.call(this);var u=this;this.path=n,this.fd=null,this.readable=!0,this.paused=!1,this.flags="r",this.mode=438,this.bufferSize=65536,r=r||{};for(var o=Object.keys(r),i=0,s=o.length;ithis.end)throw new Error("start must be <= end");this.pos=this.start}if(null!==this.fd)return void process.nextTick((function(){u._read()}));e.open(this.path,this.flags,this.mode,(function(e,t){if(e)return u.emit("error",e),void(u.readable=!1);u.fd=t,u.emit("open",t),u._read()}))},WriteStream:function t(n,r){if(!(this instanceof t))return new t(n,r);le.call(this),this.path=n,this.fd=null,this.writable=!0,this.flags="w",this.encoding="binary",this.mode=438,this.bytesWritten=0,r=r||{};for(var u=Object.keys(r),o=0,i=u.length;o= zero");this.pos=this.start}this.busy=!1,this._queue=[],null===this.fd&&(this._open=e.open,this._queue.push([this._open,this.path,this.flags,this.mode,void 0]),this.flush())}}};var de=function(e){if(null===e||"object"!=typeof e)return e;if(e instanceof Object)var t={__proto__:De(e)};else t=Object.create(null);return Object.getOwnPropertyNames(e).forEach((function(n){Object.defineProperty(t,n,Object.getOwnPropertyDescriptor(e,n))})),t},De=Object.getPrototypeOf||function(e){return e.__proto__};var pe,Ee,me=D.default,he=ae,ye=fe,Ce=de,Fe=F.default;function ge(e,t){Object.defineProperty(e,pe,{get:function(){return t}})}"function"==typeof Symbol&&"function"==typeof Symbol.for?(pe=Symbol.for("graceful-fs.queue"),Ee=Symbol.for("graceful-fs.previous")):(pe="___graceful-fs.queue",Ee="___graceful-fs.previous");var Ae=function(){};if(Fe.debuglog?Ae=Fe.debuglog("gfs4"):/\bgfs4\b/i.test(process.env.NODE_DEBUG||"")&&(Ae=function(){var e=Fe.format.apply(Fe,arguments);e="GFS4: "+e.split(/\n/).join("\nGFS4: "),console.error(e)}),!me[pe]){var ve=w[pe]||[];ge(me,ve),me.close=function(e){function t(t,n){return e.call(me,t,(function(e){e||_e(),"function"==typeof n&&n.apply(this,arguments)}))}return Object.defineProperty(t,Ee,{value:e}),t}(me.close),me.closeSync=function(e){function t(t){e.apply(me,arguments),_e()}return Object.defineProperty(t,Ee,{value:e}),t}(me.closeSync),/\bgfs4\b/i.test(process.env.NODE_DEBUG||"")&&process.on("exit",(function(){Ae(me[pe]),g.default.equal(me[pe].length,0)}))}w[pe]||ge(w,me[pe]);var Se,we=Oe(Ce(me));function Oe(e){he(e),e.gracefulify=Oe,e.createReadStream=function(t,n){return new e.ReadStream(t,n)},e.createWriteStream=function(t,n){return new e.WriteStream(t,n)};var t=e.readFile;e.readFile=function(e,n,r){"function"==typeof n&&(r=n,n=null);return function e(n,r,u,o){return t(n,r,(function(t){!t||"EMFILE"!==t.code&&"ENFILE"!==t.code?"function"==typeof u&&u.apply(this,arguments):be([e,[n,r,u],t,o||Date.now(),Date.now()])}))}(e,n,r)};var n=e.writeFile;e.writeFile=function(e,t,r,u){"function"==typeof r&&(u=r,r=null);return function e(t,r,u,o,i){return n(t,r,u,(function(n){!n||"EMFILE"!==n.code&&"ENFILE"!==n.code?"function"==typeof o&&o.apply(this,arguments):be([e,[t,r,u,o],n,i||Date.now(),Date.now()])}))}(e,t,r,u)};var r=e.appendFile;r&&(e.appendFile=function(e,t,n,u){"function"==typeof n&&(u=n,n=null);return function e(t,n,u,o,i){return r(t,n,u,(function(r){!r||"EMFILE"!==r.code&&"ENFILE"!==r.code?"function"==typeof o&&o.apply(this,arguments):be([e,[t,n,u,o],r,i||Date.now(),Date.now()])}))}(e,t,n,u)});var u=e.copyFile;u&&(e.copyFile=function(e,t,n,r){"function"==typeof n&&(r=n,n=0);return function e(t,n,r,o,i){return u(t,n,r,(function(u){!u||"EMFILE"!==u.code&&"ENFILE"!==u.code?"function"==typeof o&&o.apply(this,arguments):be([e,[t,n,r,o],u,i||Date.now(),Date.now()])}))}(e,t,n,r)});var o=e.readdir;e.readdir=function(e,t,n){"function"==typeof t&&(n=t,t=null);var r=i.test(process.version)?function(e,t,n,r){return o(e,u(e,t,n,r))}:function(e,t,n,r){return o(e,t,u(e,t,n,r))};return r(e,t,n);function u(e,t,n,u){return function(o,i){!o||"EMFILE"!==o.code&&"ENFILE"!==o.code?(i&&i.sort&&i.sort(),"function"==typeof n&&n.call(this,o,i)):be([r,[e,t,n],o,u||Date.now(),Date.now()])}}};var i=/^v[0-5]\./;if("v0.8"===process.version.substr(0,4)){var s=ye(e);d=s.ReadStream,D=s.WriteStream}var c=e.ReadStream;c&&(d.prototype=Object.create(c.prototype),d.prototype.open=function(){var e=this;E(e.path,e.flags,e.mode,(function(t,n){t?(e.autoClose&&e.destroy(),e.emit("error",t)):(e.fd=n,e.emit("open",n),e.read())}))});var a=e.WriteStream;a&&(D.prototype=Object.create(a.prototype),D.prototype.open=function(){var e=this;E(e.path,e.flags,e.mode,(function(t,n){t?(e.destroy(),e.emit("error",t)):(e.fd=n,e.emit("open",n))}))}),Object.defineProperty(e,"ReadStream",{get:function(){return d},set:function(e){d=e},enumerable:!0,configurable:!0}),Object.defineProperty(e,"WriteStream",{get:function(){return D},set:function(e){D=e},enumerable:!0,configurable:!0});var l=d;Object.defineProperty(e,"FileReadStream",{get:function(){return l},set:function(e){l=e},enumerable:!0,configurable:!0});var f=D;function d(e,t){return this instanceof d?(c.apply(this,arguments),this):d.apply(Object.create(d.prototype),arguments)}function D(e,t){return this instanceof D?(a.apply(this,arguments),this):D.apply(Object.create(D.prototype),arguments)}Object.defineProperty(e,"FileWriteStream",{get:function(){return f},set:function(e){f=e},enumerable:!0,configurable:!0});var p=e.open;function E(e,t,n,r){return"function"==typeof n&&(r=n,n=null),function e(t,n,r,u,o){return p(t,n,r,(function(i,s){!i||"EMFILE"!==i.code&&"ENFILE"!==i.code?"function"==typeof u&&u.apply(this,arguments):be([e,[t,n,r,u],i,o||Date.now(),Date.now()])}))}(e,t,n,r)}return e.open=E,e}function be(e){Ae("ENQUEUE",e[0].name,e[1]),me[pe].push(e),Be()}function _e(){for(var e=Date.now(),t=0;t2&&(me[pe][t][3]=e,me[pe][t][4]=e);Be()}function Be(){if(clearTimeout(Se),Se=void 0,0!==me[pe].length){var e=me[pe].shift(),t=e[0],n=e[1],r=e[2],u=e[3],o=e[4];if(void 0===u)Ae("RETRY",t.name,n),t.apply(null,n);else if(Date.now()-u>=6e4){Ae("TIMEOUT",t.name,n);var i=n.pop();"function"==typeof i&&i.call(null,r)}else{var s=Date.now()-o,c=Math.max(o-u,1);s>=Math.min(1.2*c,100)?(Ae("RETRY",t.name,n),t.apply(null,n.concat([u]))):me[pe].push(e)}void 0===Se&&(Se=setTimeout(Be,0))}}process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH&&!me.__patched&&(we=Oe(me),me.__patched=!0),function(e){const t=re.fromCallback,n=we,r=["access","appendFile","chmod","chown","close","copyFile","fchmod","fchown","fdatasync","fstat","fsync","ftruncate","futimes","lchmod","lchown","link","lstat","mkdir","mkdtemp","open","opendir","readdir","readFile","readlink","realpath","rename","rm","rmdir","stat","symlink","truncate","unlink","utimes","writeFile"].filter((e=>"function"==typeof n[e]));Object.assign(e,n),r.forEach((r=>{e[r]=t(n[r])})),e.realpath.native=t(n.realpath.native),e.exists=function(e,t){return"function"==typeof t?n.exists(e,t):new Promise((t=>n.exists(e,t)))},e.read=function(e,t,r,u,o,i){return"function"==typeof i?n.read(e,t,r,u,o,i):new Promise(((i,s)=>{n.read(e,t,r,u,o,((e,t,n)=>{if(e)return s(e);i({bytesRead:t,buffer:n})}))}))},e.write=function(e,t,...r){return"function"==typeof r[r.length-1]?n.write(e,t,...r):new Promise(((u,o)=>{n.write(e,t,...r,((e,t,n)=>{if(e)return o(e);u({bytesWritten:t,buffer:n})}))}))},"function"==typeof n.writev&&(e.writev=function(e,t,...r){return"function"==typeof r[r.length-1]?n.writev(e,t,...r):new Promise(((u,o)=>{n.writev(e,t,...r,((e,t,n)=>{if(e)return o(e);u({bytesWritten:t,buffers:n})}))}))})}(ne);var Pe={},ke={};const xe=p.default;ke.checkPath=function(e){if("win32"===process.platform){if(/[<>:"|?*]/.test(e.replace(xe.parse(e).root,""))){const t=new Error(`Path contains invalid characters: ${e}`);throw t.code="EINVAL",t}}};const Ne=ne,{checkPath:Ie}=ke,Te=e=>"number"==typeof e?e:{mode:511,...e}.mode;Pe.makeDir=async(e,t)=>(Ie(e),Ne.mkdir(e,{mode:Te(t),recursive:!0})),Pe.makeDirSync=(e,t)=>(Ie(e),Ne.mkdirSync(e,{mode:Te(t),recursive:!0}));const Re=re.fromPromise,{makeDir:Me,makeDirSync:Le}=Pe,je=Re(Me);var $e={mkdirs:je,mkdirsSync:Le,mkdirp:je,mkdirpSync:Le,ensureDir:je,ensureDirSync:Le};const He=re.fromPromise,Je=ne;var Ge={pathExists:He((function(e){return Je.access(e).then((()=>!0)).catch((()=>!1))})),pathExistsSync:Je.existsSync};const Ve=we;var Ue=function(e,t,n,r){Ve.open(e,"r+",((e,u)=>{if(e)return r(e);Ve.futimes(u,t,n,(e=>{Ve.close(u,(t=>{r&&r(e||t)}))}))}))},We=function(e,t,n){const r=Ve.openSync(e,"r+");return Ve.futimesSync(r,t,n),Ve.closeSync(r)};const ze=ne,Ke=p.default,qe=F.default;function Ye(e,t,n){const r=n.dereference?e=>ze.stat(e,{bigint:!0}):e=>ze.lstat(e,{bigint:!0});return Promise.all([r(e),r(t).catch((e=>{if("ENOENT"===e.code)return null;throw e}))]).then((([e,t])=>({srcStat:e,destStat:t})))}function Xe(e,t){return t.ino&&t.dev&&t.ino===e.ino&&t.dev===e.dev}function Ze(e,t){const n=Ke.resolve(e).split(Ke.sep).filter((e=>e)),r=Ke.resolve(t).split(Ke.sep).filter((e=>e));return n.reduce(((e,t,n)=>e&&r[n]===t),!0)}function Qe(e,t,n){return`Cannot ${n} '${e}' to a subdirectory of itself, '${t}'.`}var et={checkPaths:function(e,t,n,r,u){qe.callbackify(Ye)(e,t,r,((r,o)=>{if(r)return u(r);const{srcStat:i,destStat:s}=o;if(s){if(Xe(i,s)){const r=Ke.basename(e),o=Ke.basename(t);return"move"===n&&r!==o&&r.toLowerCase()===o.toLowerCase()?u(null,{srcStat:i,destStat:s,isChangingCase:!0}):u(new Error("Source and destination must not be the same."))}if(i.isDirectory()&&!s.isDirectory())return u(new Error(`Cannot overwrite non-directory '${t}' with directory '${e}'.`));if(!i.isDirectory()&&s.isDirectory())return u(new Error(`Cannot overwrite directory '${t}' with non-directory '${e}'.`))}return i.isDirectory()&&Ze(e,t)?u(new Error(Qe(e,t,n))):u(null,{srcStat:i,destStat:s})}))},checkPathsSync:function(e,t,n,r){const{srcStat:u,destStat:o}=function(e,t,n){let r;const u=n.dereference?e=>ze.statSync(e,{bigint:!0}):e=>ze.lstatSync(e,{bigint:!0}),o=u(e);try{r=u(t)}catch(e){if("ENOENT"===e.code)return{srcStat:o,destStat:null};throw e}return{srcStat:o,destStat:r}}(e,t,r);if(o){if(Xe(u,o)){const r=Ke.basename(e),i=Ke.basename(t);if("move"===n&&r!==i&&r.toLowerCase()===i.toLowerCase())return{srcStat:u,destStat:o,isChangingCase:!0};throw new Error("Source and destination must not be the same.")}if(u.isDirectory()&&!o.isDirectory())throw new Error(`Cannot overwrite non-directory '${t}' with directory '${e}'.`);if(!u.isDirectory()&&o.isDirectory())throw new Error(`Cannot overwrite directory '${t}' with non-directory '${e}'.`)}if(u.isDirectory()&&Ze(e,t))throw new Error(Qe(e,t,n));return{srcStat:u,destStat:o}},checkParentPaths:function e(t,n,r,u,o){const i=Ke.resolve(Ke.dirname(t)),s=Ke.resolve(Ke.dirname(r));if(s===i||s===Ke.parse(s).root)return o();ze.stat(s,{bigint:!0},((i,c)=>i?"ENOENT"===i.code?o():o(i):Xe(n,c)?o(new Error(Qe(t,r,u))):e(t,n,s,u,o)))},checkParentPathsSync:function e(t,n,r,u){const o=Ke.resolve(Ke.dirname(t)),i=Ke.resolve(Ke.dirname(r));if(i===o||i===Ke.parse(i).root)return;let s;try{s=ze.statSync(i,{bigint:!0})}catch(e){if("ENOENT"===e.code)return;throw e}if(Xe(n,s))throw new Error(Qe(t,r,u));return e(t,n,i,u)},isSrcSubdir:Ze,areIdentical:Xe};const tt=we,nt=p.default,rt=$e.mkdirs,ut=Ge.pathExists,ot=Ue,it=et;function st(e,t,n,r,u){const o=nt.dirname(n);ut(o,((i,s)=>i?u(i):s?at(e,t,n,r,u):void rt(o,(o=>o?u(o):at(e,t,n,r,u)))))}function ct(e,t,n,r,u,o){Promise.resolve(u.filter(n,r)).then((i=>i?e(t,n,r,u,o):o()),(e=>o(e)))}function at(e,t,n,r,u){(r.dereference?tt.stat:tt.lstat)(t,((o,i)=>o?u(o):i.isDirectory()?function(e,t,n,r,u,o){return t?Dt(n,r,u,o):function(e,t,n,r,u){tt.mkdir(n,(o=>{if(o)return u(o);Dt(t,n,r,(t=>t?u(t):dt(n,e,u)))}))}(e.mode,n,r,u,o)}(i,e,t,n,r,u):i.isFile()||i.isCharacterDevice()||i.isBlockDevice()?function(e,t,n,r,u,o){return t?function(e,t,n,r,u){if(!r.overwrite)return r.errorOnExist?u(new Error(`'${n}' already exists`)):u();tt.unlink(n,(o=>o?u(o):lt(e,t,n,r,u)))}(e,n,r,u,o):lt(e,n,r,u,o)}(i,e,t,n,r,u):i.isSymbolicLink()?function(e,t,n,r,u){tt.readlink(t,((t,o)=>t?u(t):(r.dereference&&(o=nt.resolve(process.cwd(),o)),e?void tt.readlink(n,((t,i)=>t?"EINVAL"===t.code||"UNKNOWN"===t.code?tt.symlink(o,n,u):u(t):(r.dereference&&(i=nt.resolve(process.cwd(),i)),it.isSrcSubdir(o,i)?u(new Error(`Cannot copy '${o}' to a subdirectory of itself, '${i}'.`)):e.isDirectory()&&it.isSrcSubdir(i,o)?u(new Error(`Cannot overwrite '${i}' with '${o}'.`)):function(e,t,n){tt.unlink(t,(r=>r?n(r):tt.symlink(e,t,n)))}(o,n,u)))):tt.symlink(o,n,u))))}(e,t,n,r,u):i.isSocket()?u(new Error(`Cannot copy a socket file: ${t}`)):i.isFIFO()?u(new Error(`Cannot copy a FIFO pipe: ${t}`)):u(new Error(`Unknown file: ${t}`))))}function lt(e,t,n,r,u){tt.copyFile(t,n,(o=>o?u(o):r.preserveTimestamps?function(e,t,n,r){if(function(e){return 0==(128&e)}(e))return function(e,t,n){return dt(e,128|t,n)}(n,e,(u=>u?r(u):ft(e,t,n,r)));return ft(e,t,n,r)}(e.mode,t,n,u):dt(n,e.mode,u)))}function ft(e,t,n,r){!function(e,t,n){tt.stat(e,((e,r)=>e?n(e):ot(t,r.atime,r.mtime,n)))}(t,n,(t=>t?r(t):dt(n,e,r)))}function dt(e,t,n){return tt.chmod(e,t,n)}function Dt(e,t,n,r){tt.readdir(e,((u,o)=>u?r(u):pt(o,e,t,n,r)))}function pt(e,t,n,r,u){const o=e.pop();return o?function(e,t,n,r,u,o){const i=nt.join(n,t),s=nt.join(r,t);it.checkPaths(i,s,"copy",u,((t,c)=>{if(t)return o(t);const{destStat:a}=c;!function(e,t,n,r,u){r.filter?ct(at,e,t,n,r,u):at(e,t,n,r,u)}(a,i,s,u,(t=>t?o(t):pt(e,n,r,u,o)))}))}(e,o,t,n,r,u):u()}var Et=function(e,t,n,r){"function"!=typeof n||r?"function"==typeof n&&(n={filter:n}):(r=n,n={}),r=r||function(){},(n=n||{}).clobber=!("clobber"in n)||!!n.clobber,n.overwrite="overwrite"in n?!!n.overwrite:n.clobber,n.preserveTimestamps&&"ia32"===process.arch&&console.warn("fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n\n see https://github.com/jprichardson/node-fs-extra/issues/269"),it.checkPaths(e,t,"copy",n,((u,o)=>{if(u)return r(u);const{srcStat:i,destStat:s}=o;it.checkParentPaths(e,i,t,"copy",(u=>u?r(u):n.filter?ct(st,s,e,t,n,r):st(s,e,t,n,r)))}))};const mt=we,ht=p.default,yt=$e.mkdirsSync,Ct=We,Ft=et;function gt(e,t,n,r){const u=(r.dereference?mt.statSync:mt.lstatSync)(t);if(u.isDirectory())return function(e,t,n,r,u){return t?St(n,r,u):function(e,t,n,r){return mt.mkdirSync(n),St(t,n,r),vt(n,e)}(e.mode,n,r,u)}(u,e,t,n,r);if(u.isFile()||u.isCharacterDevice()||u.isBlockDevice())return function(e,t,n,r,u){return t?function(e,t,n,r){if(r.overwrite)return mt.unlinkSync(n),At(e,t,n,r);if(r.errorOnExist)throw new Error(`'${n}' already exists`)}(e,n,r,u):At(e,n,r,u)}(u,e,t,n,r);if(u.isSymbolicLink())return function(e,t,n,r){let u=mt.readlinkSync(t);r.dereference&&(u=ht.resolve(process.cwd(),u));if(e){let e;try{e=mt.readlinkSync(n)}catch(e){if("EINVAL"===e.code||"UNKNOWN"===e.code)return mt.symlinkSync(u,n);throw e}if(r.dereference&&(e=ht.resolve(process.cwd(),e)),Ft.isSrcSubdir(u,e))throw new Error(`Cannot copy '${u}' to a subdirectory of itself, '${e}'.`);if(mt.statSync(n).isDirectory()&&Ft.isSrcSubdir(e,u))throw new Error(`Cannot overwrite '${e}' with '${u}'.`);return function(e,t){return mt.unlinkSync(t),mt.symlinkSync(e,t)}(u,n)}return mt.symlinkSync(u,n)}(e,t,n,r);if(u.isSocket())throw new Error(`Cannot copy a socket file: ${t}`);if(u.isFIFO())throw new Error(`Cannot copy a FIFO pipe: ${t}`);throw new Error(`Unknown file: ${t}`)}function At(e,t,n,r){return mt.copyFileSync(t,n),r.preserveTimestamps&&function(e,t,n){(function(e){return 0==(128&e)})(e)&&function(e,t){vt(e,128|t)}(n,e);(function(e,t){const n=mt.statSync(e);Ct(t,n.atime,n.mtime)})(t,n)}(e.mode,t,n),vt(n,e.mode)}function vt(e,t){return mt.chmodSync(e,t)}function St(e,t,n){mt.readdirSync(e).forEach((r=>function(e,t,n,r){const u=ht.join(t,e),o=ht.join(n,e),{destStat:i}=Ft.checkPathsSync(u,o,"copy",r);return function(e,t,n,r){if(!r.filter||r.filter(t,n))return gt(e,t,n,r)}(i,u,o,r)}(r,e,t,n)))}var wt=function(e,t,n){"function"==typeof n&&(n={filter:n}),(n=n||{}).clobber=!("clobber"in n)||!!n.clobber,n.overwrite="overwrite"in n?!!n.overwrite:n.clobber,n.preserveTimestamps&&"ia32"===process.arch&&console.warn("fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n\n see https://github.com/jprichardson/node-fs-extra/issues/269");const{srcStat:r,destStat:u}=Ft.checkPathsSync(e,t,"copy",n);return Ft.checkParentPathsSync(e,r,t,"copy"),function(e,t,n,r){if(r.filter&&!r.filter(t,n))return;const u=ht.dirname(n);mt.existsSync(u)||yt(u);return gt(e,t,n,r)}(u,e,t,n)};var Ot={copy:(0,re.fromCallback)(Et),copySync:wt};const bt=we,_t=p.default,Bt=g.default,Pt="win32"===process.platform;function kt(e){["unlink","chmod","stat","lstat","rmdir","readdir"].forEach((t=>{e[t]=e[t]||bt[t],e[t+="Sync"]=e[t]||bt[t]})),e.maxBusyTries=e.maxBusyTries||3}function xt(e,t,n){let r=0;"function"==typeof t&&(n=t,t={}),Bt(e,"rimraf: missing path"),Bt.strictEqual(typeof e,"string","rimraf: path should be a string"),Bt.strictEqual(typeof n,"function","rimraf: callback function required"),Bt(t,"rimraf: invalid options argument provided"),Bt.strictEqual(typeof t,"object","rimraf: options should be object"),kt(t),Nt(e,t,(function u(o){if(o){if(("EBUSY"===o.code||"ENOTEMPTY"===o.code||"EPERM"===o.code)&&rNt(e,t,u)),100*r)}"ENOENT"===o.code&&(o=null)}n(o)}))}function Nt(e,t,n){Bt(e),Bt(t),Bt("function"==typeof n),t.lstat(e,((r,u)=>r&&"ENOENT"===r.code?n(null):r&&"EPERM"===r.code&&Pt?It(e,t,r,n):u&&u.isDirectory()?Rt(e,t,r,n):void t.unlink(e,(r=>{if(r){if("ENOENT"===r.code)return n(null);if("EPERM"===r.code)return Pt?It(e,t,r,n):Rt(e,t,r,n);if("EISDIR"===r.code)return Rt(e,t,r,n)}return n(r)}))))}function It(e,t,n,r){Bt(e),Bt(t),Bt("function"==typeof r),t.chmod(e,438,(u=>{u?r("ENOENT"===u.code?null:n):t.stat(e,((u,o)=>{u?r("ENOENT"===u.code?null:n):o.isDirectory()?Rt(e,t,n,r):t.unlink(e,r)}))}))}function Tt(e,t,n){let r;Bt(e),Bt(t);try{t.chmodSync(e,438)}catch(e){if("ENOENT"===e.code)return;throw n}try{r=t.statSync(e)}catch(e){if("ENOENT"===e.code)return;throw n}r.isDirectory()?Lt(e,t,n):t.unlinkSync(e)}function Rt(e,t,n,r){Bt(e),Bt(t),Bt("function"==typeof r),t.rmdir(e,(u=>{!u||"ENOTEMPTY"!==u.code&&"EEXIST"!==u.code&&"EPERM"!==u.code?u&&"ENOTDIR"===u.code?r(n):r(u):function(e,t,n){Bt(e),Bt(t),Bt("function"==typeof n),t.readdir(e,((r,u)=>{if(r)return n(r);let o,i=u.length;if(0===i)return t.rmdir(e,n);u.forEach((r=>{xt(_t.join(e,r),t,(r=>{if(!o)return r?n(o=r):void(0==--i&&t.rmdir(e,n))}))}))}))}(e,t,r)}))}function Mt(e,t){let n;kt(t=t||{}),Bt(e,"rimraf: missing path"),Bt.strictEqual(typeof e,"string","rimraf: path should be a string"),Bt(t,"rimraf: missing options"),Bt.strictEqual(typeof t,"object","rimraf: options should be object");try{n=t.lstatSync(e)}catch(n){if("ENOENT"===n.code)return;"EPERM"===n.code&&Pt&&Tt(e,t,n)}try{n&&n.isDirectory()?Lt(e,t,null):t.unlinkSync(e)}catch(n){if("ENOENT"===n.code)return;if("EPERM"===n.code)return Pt?Tt(e,t,n):Lt(e,t,n);if("EISDIR"!==n.code)throw n;Lt(e,t,n)}}function Lt(e,t,n){Bt(e),Bt(t);try{t.rmdirSync(e)}catch(r){if("ENOTDIR"===r.code)throw n;if("ENOTEMPTY"===r.code||"EEXIST"===r.code||"EPERM"===r.code)!function(e,t){if(Bt(e),Bt(t),t.readdirSync(e).forEach((n=>Mt(_t.join(e,n),t))),!Pt){return t.rmdirSync(e,t)}{const n=Date.now();do{try{return t.rmdirSync(e,t)}catch{}}while(Date.now()-n<500)}}(e,t);else if("ENOENT"!==r.code)throw r}}var jt=xt;xt.sync=Mt;const $t=we,Ht=re.fromCallback,Jt=jt;var Gt={remove:Ht((function(e,t){if($t.rm)return $t.rm(e,{recursive:!0,force:!0},t);Jt(e,t)})),removeSync:function(e){if($t.rmSync)return $t.rmSync(e,{recursive:!0,force:!0});Jt.sync(e)}};const Vt=re.fromPromise,Ut=ne,Wt=p.default,zt=$e,Kt=Gt,qt=Vt((async function(e){let t;try{t=await Ut.readdir(e)}catch{return zt.mkdirs(e)}return Promise.all(t.map((t=>Kt.remove(Wt.join(e,t)))))}));function Yt(e){let t;try{t=Ut.readdirSync(e)}catch{return zt.mkdirsSync(e)}t.forEach((t=>{t=Wt.join(e,t),Kt.removeSync(t)}))}var Xt={emptyDirSync:Yt,emptydirSync:Yt,emptyDir:qt,emptydir:qt};const Zt=re.fromCallback,Qt=p.default,en=we,tn=$e;var nn={createFile:Zt((function(e,t){function n(){en.writeFile(e,"",(e=>{if(e)return t(e);t()}))}en.stat(e,((r,u)=>{if(!r&&u.isFile())return t();const o=Qt.dirname(e);en.stat(o,((e,r)=>{if(e)return"ENOENT"===e.code?tn.mkdirs(o,(e=>{if(e)return t(e);n()})):t(e);r.isDirectory()?n():en.readdir(o,(e=>{if(e)return t(e)}))}))}))})),createFileSync:function(e){let t;try{t=en.statSync(e)}catch{}if(t&&t.isFile())return;const n=Qt.dirname(e);try{en.statSync(n).isDirectory()||en.readdirSync(n)}catch(e){if(!e||"ENOENT"!==e.code)throw e;tn.mkdirsSync(n)}en.writeFileSync(e,"")}};const rn=re.fromCallback,un=p.default,on=we,sn=$e,cn=Ge.pathExists,{areIdentical:an}=et;var ln={createLink:rn((function(e,t,n){function r(e,t){on.link(e,t,(e=>{if(e)return n(e);n(null)}))}on.lstat(t,((u,o)=>{on.lstat(e,((u,i)=>{if(u)return u.message=u.message.replace("lstat","ensureLink"),n(u);if(o&&an(i,o))return n(null);const s=un.dirname(t);cn(s,((u,o)=>u?n(u):o?r(e,t):void sn.mkdirs(s,(u=>{if(u)return n(u);r(e,t)}))))}))}))})),createLinkSync:function(e,t){let n;try{n=on.lstatSync(t)}catch{}try{const t=on.lstatSync(e);if(n&&an(t,n))return}catch(e){throw e.message=e.message.replace("lstat","ensureLink"),e}const r=un.dirname(t);return on.existsSync(r)||sn.mkdirsSync(r),on.linkSync(e,t)}};const fn=p.default,dn=we,Dn=Ge.pathExists;var pn={symlinkPaths:function(e,t,n){if(fn.isAbsolute(e))return dn.lstat(e,(t=>t?(t.message=t.message.replace("lstat","ensureSymlink"),n(t)):n(null,{toCwd:e,toDst:e})));{const r=fn.dirname(t),u=fn.join(r,e);return Dn(u,((t,o)=>t?n(t):o?n(null,{toCwd:u,toDst:e}):dn.lstat(e,(t=>t?(t.message=t.message.replace("lstat","ensureSymlink"),n(t)):n(null,{toCwd:e,toDst:fn.relative(r,e)})))))}},symlinkPathsSync:function(e,t){let n;if(fn.isAbsolute(e)){if(n=dn.existsSync(e),!n)throw new Error("absolute srcpath does not exist");return{toCwd:e,toDst:e}}{const r=fn.dirname(t),u=fn.join(r,e);if(n=dn.existsSync(u),n)return{toCwd:u,toDst:e};if(n=dn.existsSync(e),!n)throw new Error("relative srcpath does not exist");return{toCwd:e,toDst:fn.relative(r,e)}}}};const En=we;var mn={symlinkType:function(e,t,n){if(n="function"==typeof t?t:n,t="function"!=typeof t&&t)return n(null,t);En.lstat(e,((e,r)=>{if(e)return n(null,"file");t=r&&r.isDirectory()?"dir":"file",n(null,t)}))},symlinkTypeSync:function(e,t){let n;if(t)return t;try{n=En.lstatSync(e)}catch{return"file"}return n&&n.isDirectory()?"dir":"file"}};const hn=re.fromCallback,yn=p.default,Cn=ne,Fn=$e.mkdirs,gn=$e.mkdirsSync,An=pn.symlinkPaths,vn=pn.symlinkPathsSync,Sn=mn.symlinkType,wn=mn.symlinkTypeSync,On=Ge.pathExists,{areIdentical:bn}=et;function _n(e,t,n,r){An(e,t,((u,o)=>{if(u)return r(u);e=o.toDst,Sn(o.toCwd,n,((n,u)=>{if(n)return r(n);const o=yn.dirname(t);On(o,((n,i)=>n?r(n):i?Cn.symlink(e,t,u,r):void Fn(o,(n=>{if(n)return r(n);Cn.symlink(e,t,u,r)}))))}))}))}var Bn={createSymlink:hn((function(e,t,n,r){r="function"==typeof n?n:r,n="function"!=typeof n&&n,Cn.lstat(t,((u,o)=>{!u&&o.isSymbolicLink()?Promise.all([Cn.stat(e),Cn.stat(t)]).then((([u,o])=>{if(bn(u,o))return r(null);_n(e,t,n,r)})):_n(e,t,n,r)}))})),createSymlinkSync:function(e,t,n){let r;try{r=Cn.lstatSync(t)}catch{}if(r&&r.isSymbolicLink()){const n=Cn.statSync(e),r=Cn.statSync(t);if(bn(n,r))return}const u=vn(e,t);e=u.toDst,n=wn(u.toCwd,n);const o=yn.dirname(t);return Cn.existsSync(o)||gn(o),Cn.symlinkSync(e,t,n)}};const{createFile:Pn,createFileSync:kn}=nn,{createLink:xn,createLinkSync:Nn}=ln,{createSymlink:In,createSymlinkSync:Tn}=Bn;var Rn={createFile:Pn,createFileSync:kn,ensureFile:Pn,ensureFileSync:kn,createLink:xn,createLinkSync:Nn,ensureLink:xn,ensureLinkSync:Nn,createSymlink:In,createSymlinkSync:Tn,ensureSymlink:In,ensureSymlinkSync:Tn};var Mn={stringify:function(e,{EOL:t="\n",finalEOL:n=!0,replacer:r=null,spaces:u}={}){const o=n?t:"";return JSON.stringify(e,r,u).replace(/\n/g,t)+o},stripBom:function(e){return Buffer.isBuffer(e)&&(e=e.toString("utf8")),e.replace(/^\uFEFF/,"")}};let Ln;try{Ln=we}catch(e){Ln=D.default}const jn=re,{stringify:$n,stripBom:Hn}=Mn;const Jn=jn.fromPromise((async function(e,t={}){"string"==typeof t&&(t={encoding:t});const n=t.fs||Ln,r=!("throws"in t)||t.throws;let u,o=await jn.fromCallback(n.readFile)(e,t);o=Hn(o);try{u=JSON.parse(o,t?t.reviver:null)}catch(t){if(r)throw t.message=`${e}: ${t.message}`,t;return null}return u}));const Gn=jn.fromPromise((async function(e,t,n={}){const r=n.fs||Ln,u=$n(t,n);await jn.fromCallback(r.writeFile)(e,u,n)}));const Vn={readFile:Jn,readFileSync:function(e,t={}){"string"==typeof t&&(t={encoding:t});const n=t.fs||Ln,r=!("throws"in t)||t.throws;try{let r=n.readFileSync(e,t);return r=Hn(r),JSON.parse(r,t.reviver)}catch(t){if(r)throw t.message=`${e}: ${t.message}`,t;return null}},writeFile:Gn,writeFileSync:function(e,t,n={}){const r=n.fs||Ln,u=$n(t,n);return r.writeFileSync(e,u,n)}};var Un={readJson:Vn.readFile,readJsonSync:Vn.readFileSync,writeJson:Vn.writeFile,writeJsonSync:Vn.writeFileSync};const Wn=re.fromCallback,zn=we,Kn=p.default,qn=$e,Yn=Ge.pathExists;var Xn={outputFile:Wn((function(e,t,n,r){"function"==typeof n&&(r=n,n="utf8");const u=Kn.dirname(e);Yn(u,((o,i)=>o?r(o):i?zn.writeFile(e,t,n,r):void qn.mkdirs(u,(u=>{if(u)return r(u);zn.writeFile(e,t,n,r)}))))})),outputFileSync:function(e,...t){const n=Kn.dirname(e);if(zn.existsSync(n))return zn.writeFileSync(e,...t);qn.mkdirsSync(n),zn.writeFileSync(e,...t)}};const{stringify:Zn}=Mn,{outputFile:Qn}=Xn;var er=async function(e,t,n={}){const r=Zn(t,n);await Qn(e,r,n)};const{stringify:tr}=Mn,{outputFileSync:nr}=Xn;var rr=function(e,t,n){const r=tr(t,n);nr(e,r,n)};const ur=re.fromPromise,or=Un;or.outputJson=ur(er),or.outputJsonSync=rr,or.outputJSON=or.outputJson,or.outputJSONSync=or.outputJsonSync,or.writeJSON=or.writeJson,or.writeJSONSync=or.writeJsonSync,or.readJSON=or.readJson,or.readJSONSync=or.readJsonSync;var ir=or;const sr=we,cr=p.default,ar=Ot.copy,lr=Gt.remove,fr=$e.mkdirp,dr=Ge.pathExists,Dr=et;function pr(e,t,n,r,u){return r?Er(e,t,n,u):n?lr(t,(r=>r?u(r):Er(e,t,n,u))):void dr(t,((r,o)=>r?u(r):o?u(new Error("dest already exists.")):Er(e,t,n,u)))}function Er(e,t,n,r){sr.rename(e,t,(u=>u?"EXDEV"!==u.code?r(u):function(e,t,n,r){const u={overwrite:n,errorOnExist:!0};ar(e,t,u,(t=>t?r(t):lr(e,r)))}(e,t,n,r):r()))}var mr=function(e,t,n,r){"function"==typeof n&&(r=n,n={});const u=n.overwrite||n.clobber||!1;Dr.checkPaths(e,t,"move",n,((n,o)=>{if(n)return r(n);const{srcStat:i,isChangingCase:s=!1}=o;Dr.checkParentPaths(e,i,t,"move",(n=>n?r(n):function(e){const t=cr.dirname(e);return cr.parse(t).root===t}(t)?pr(e,t,u,s,r):void fr(cr.dirname(t),(n=>n?r(n):pr(e,t,u,s,r)))))}))};const hr=we,yr=p.default,Cr=Ot.copySync,Fr=Gt.removeSync,gr=$e.mkdirpSync,Ar=et;function vr(e,t,n){try{hr.renameSync(e,t)}catch(r){if("EXDEV"!==r.code)throw r;return function(e,t,n){const r={overwrite:n,errorOnExist:!0};return Cr(e,t,r),Fr(e)}(e,t,n)}}var Sr=function(e,t,n){const r=(n=n||{}).overwrite||n.clobber||!1,{srcStat:u,isChangingCase:o=!1}=Ar.checkPathsSync(e,t,"move",n);return Ar.checkParentPathsSync(e,u,t,"move"),function(e){const t=yr.dirname(e);return yr.parse(t).root===t}(t)||gr(yr.dirname(t)),function(e,t,n,r){if(r)return vr(e,t,n);if(n)return Fr(t),vr(e,t,n);if(hr.existsSync(t))throw new Error("dest already exists.");return vr(e,t,n)}(e,t,r,o)};var wr,Or,br,_r,Br,Pr={move:(0,re.fromCallback)(mr),moveSync:Sr},kr={...ne,...Ot,...Xt,...Rn,...ir,...$e,...Pr,...Xn,...Ge,...Gt},xr={},Nr={exports:{}},Ir={exports:{}};function Tr(){if(Or)return wr;Or=1;var e=1e3,t=60*e,n=60*t,r=24*n,u=7*r,o=365.25*r;function i(e,t,n,r){var u=t>=1.5*n;return Math.round(e/n)+" "+r+(u?"s":"")}return wr=function(s,c){c=c||{};var a=typeof s;if("string"===a&&s.length>0)return function(i){if((i=String(i)).length>100)return;var s=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(i);if(!s)return;var c=parseFloat(s[1]);switch((s[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*o;case"weeks":case"week":case"w":return c*u;case"days":case"day":case"d":return c*r;case"hours":case"hour":case"hrs":case"hr":case"h":return c*n;case"minutes":case"minute":case"mins":case"min":case"m":return c*t;case"seconds":case"second":case"secs":case"sec":case"s":return c*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(s);if("number"===a&&isFinite(s))return c.long?function(u){var o=Math.abs(u);if(o>=r)return i(u,o,r,"day");if(o>=n)return i(u,o,n,"hour");if(o>=t)return i(u,o,t,"minute");if(o>=e)return i(u,o,e,"second");return u+" ms"}(s):function(u){var o=Math.abs(u);if(o>=r)return Math.round(u/r)+"d";if(o>=n)return Math.round(u/n)+"h";if(o>=t)return Math.round(u/t)+"m";if(o>=e)return Math.round(u/e)+"s";return u+"ms"}(s);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(s))}}function Rr(){if(_r)return br;return _r=1,br=function(e){function t(e){let r,u,o,i=null;function s(...e){if(!s.enabled)return;const n=s,u=Number(new Date),o=u-(r||u);n.diff=o,n.prev=r,n.curr=u,r=u,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let i=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,((r,u)=>{if("%%"===r)return"%";i++;const o=t.formatters[u];if("function"==typeof o){const t=e[i];r=o.call(n,t),e.splice(i,1),i--}return r})),t.formatArgs.call(n,e);(n.log||t.log).apply(n,e)}return s.namespace=e,s.useColors=t.useColors(),s.color=t.selectColor(e),s.extend=n,s.destroy=t.destroy,Object.defineProperty(s,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==i?i:(u!==t.namespaces&&(u=t.namespaces,o=t.enabled(e)),o),set:e=>{i=e}}),"function"==typeof t.init&&t.init(s),s}function n(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function r(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){if(e instanceof Error)return e.stack||e.message;return e},t.disable=function(){const e=[...t.names.map(r),...t.skips.map(r).map((e=>"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),u=r.length;for(n=0;n{t[n]=e[n]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t{const n=e.startsWith("-")?"":1===e.length?"-":"--",r=t.indexOf(n+e),u=t.indexOf("--");return-1!==r&&(-1===u||r{}),"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."),t.colors=[6,2,3,4,5,1];try{const e=function(){if($r)return jr;$r=1;const e=E.default,t=A.default,n=Vr(),{env:r}=process;let u;function o(e){return 0!==e&&{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function i(t,o){if(0===u)return 0;if(n("color=16m")||n("color=full")||n("color=truecolor"))return 3;if(n("color=256"))return 2;if(t&&!o&&void 0===u)return 0;const i=u||0;if("dumb"===r.TERM)return i;if("win32"===process.platform){const t=e.release().split(".");return Number(t[0])>=10&&Number(t[2])>=10586?Number(t[2])>=14931?3:2:1}if("CI"in r)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some((e=>e in r))||"codeship"===r.CI_NAME?1:i;if("TEAMCITY_VERSION"in r)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(r.TEAMCITY_VERSION)?1:0;if("truecolor"===r.COLORTERM)return 3;if("TERM_PROGRAM"in r){const e=parseInt((r.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(r.TERM_PROGRAM){case"iTerm.app":return e>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(r.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(r.TERM)||"COLORTERM"in r?1:i}return n("no-color")||n("no-colors")||n("color=false")||n("color=never")?u=0:(n("color")||n("colors")||n("color=true")||n("color=always"))&&(u=1),"FORCE_COLOR"in r&&(u="true"===r.FORCE_COLOR?1:"false"===r.FORCE_COLOR?0:0===r.FORCE_COLOR.length?1:Math.min(parseInt(r.FORCE_COLOR,10),3)),jr={supportsColor:function(e){return o(i(e,e&&e.isTTY))},stdout:o(i(!0,t.isatty(1))),stderr:o(i(!0,t.isatty(2)))}}();e&&(e.stderr||e).level>=2&&(t.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch(e){}t.inspectOpts=Object.keys(process.env).filter((e=>/^debug_/i.test(e))).reduce(((e,t)=>{const n=t.substring(6).toLowerCase().replace(/_([a-z])/g,((e,t)=>t.toUpperCase()));let r=process.env[t];return r=!!/^(yes|on|true|enabled)$/i.test(r)||!/^(no|off|false|disabled)$/i.test(r)&&("null"===r?null:Number(r)),e[n]=r,e}),{}),e.exports=Rr()(t);const{formatters:u}=e.exports;u.o=function(e){return this.inspectOpts.colors=this.useColors,r.inspect(e,this.inspectOpts).split("\n").map((e=>e.trim())).join(" ")},u.O=function(e){return this.inspectOpts.colors=this.useColors,r.inspect(e,this.inspectOpts)}}(Gr,Gr.exports)),Gr.exports}Jr=Nr,"undefined"==typeof process||"renderer"===process.type||!0===process.browser||process.__nwjs?Jr.exports=(Br||(Br=1,function(e,t){t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let r=0,u=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(r++,"%c"===e&&(u=r))})),t.splice(u,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}return!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG),e},t.useColors=function(){return!("undefined"==typeof window||!window.process||"renderer"!==window.process.type&&!window.process.__nwjs)||("undefined"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=Rr()(t);const{formatters:n}=e.exports;n.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}(Ir,Ir.exports)),Ir.exports):Jr.exports=Ur();var Wr=function(e){return(e=e||{}).circles?function(e){var t=[],n=[];return e.proto?function e(u){if("object"!=typeof u||null===u)return u;if(u instanceof Date)return new Date(u);if(Array.isArray(u))return r(u,e);if(u instanceof Map)return new Map(r(Array.from(u),e));if(u instanceof Set)return new Set(r(Array.from(u),e));var o={};for(var i in t.push(u),n.push(o),u){var s=u[i];if("object"!=typeof s||null===s)o[i]=s;else if(s instanceof Date)o[i]=new Date(s);else if(s instanceof Map)o[i]=new Map(r(Array.from(s),e));else if(s instanceof Set)o[i]=new Set(r(Array.from(s),e));else if(ArrayBuffer.isView(s))o[i]=zr(s);else{var c=t.indexOf(s);o[i]=-1!==c?n[c]:e(s)}}return t.pop(),n.pop(),o}:function e(u){if("object"!=typeof u||null===u)return u;if(u instanceof Date)return new Date(u);if(Array.isArray(u))return r(u,e);if(u instanceof Map)return new Map(r(Array.from(u),e));if(u instanceof Set)return new Set(r(Array.from(u),e));var o={};for(var i in t.push(u),n.push(o),u)if(!1!==Object.hasOwnProperty.call(u,i)){var s=u[i];if("object"!=typeof s||null===s)o[i]=s;else if(s instanceof Date)o[i]=new Date(s);else if(s instanceof Map)o[i]=new Map(r(Array.from(s),e));else if(s instanceof Set)o[i]=new Set(r(Array.from(s),e));else if(ArrayBuffer.isView(s))o[i]=zr(s);else{var c=t.indexOf(s);o[i]=-1!==c?n[c]:e(s)}}return t.pop(),n.pop(),o};function r(e,r){for(var u=Object.keys(e),o=new Array(u.length),i=0;i!e,Qr=e=>e&&"object"==typeof e&&!Array.isArray(e),eu=(e,t,n)=>{(Array.isArray(t)?t:[t]).forEach((t=>{if(t)throw new Error(`Problem with log4js configuration: (${Kr.inspect(e,{depth:5})}) - ${n}`)}))};var tu={configure:e=>{qr("New configuration to be validated: ",e),eu(e,Zr(Qr(e)),"must be an object."),qr(`Calling pre-processing listeners (${Yr.length})`),Yr.forEach((t=>t(e))),qr("Configuration pre-processing finished."),qr(`Calling configuration listeners (${Xr.length})`),Xr.forEach((t=>t(e))),qr("Configuration finished.")},addListener:e=>{Xr.push(e),qr(`Added listener, now ${Xr.length} listeners`)},addPreProcessingListener:e=>{Yr.push(e),qr(`Added pre-processing listener, now ${Yr.length} listeners`)},throwExceptionIf:eu,anObject:Qr,anInteger:e=>e&&"number"==typeof e&&Number.isInteger(e),validIdentifier:e=>/^[A-Za-z][A-Za-z0-9_]*$/g.test(e),not:Zr},nu={exports:{}};!function(e){function t(e,t){for(var n=e.toString();n.length-1?s:c,l=n(u.getHours()),f=n(u.getMinutes()),d=n(u.getSeconds()),D=t(u.getMilliseconds(),3),p=function(e){var t=Math.abs(e),n=String(Math.floor(t/60)),r=String(t%60);return n=("0"+n).slice(-2),r=("0"+r).slice(-2),0===e?"Z":(e<0?"+":"-")+n+":"+r}(u.getTimezoneOffset());return r.replace(/dd/g,o).replace(/MM/g,i).replace(/y{1,4}/g,a).replace(/hh/g,l).replace(/mm/g,f).replace(/ss/g,d).replace(/SSS/g,D).replace(/O/g,p)}function u(e,t,n,r){e["set"+(r?"":"UTC")+t](n)}e.exports=r,e.exports.asString=r,e.exports.parse=function(t,n,r){if(!t)throw new Error("pattern must be supplied");return function(t,n,r){var o=t.indexOf("O")<0,i=!1,s=[{pattern:/y{1,4}/,regexp:"\\d{1,4}",fn:function(e,t){u(e,"FullYear",t,o)}},{pattern:/MM/,regexp:"\\d{1,2}",fn:function(e,t){u(e,"Month",t-1,o),e.getMonth()!==t-1&&(i=!0)}},{pattern:/dd/,regexp:"\\d{1,2}",fn:function(e,t){i&&u(e,"Month",e.getMonth()-1,o),u(e,"Date",t,o)}},{pattern:/hh/,regexp:"\\d{1,2}",fn:function(e,t){u(e,"Hours",t,o)}},{pattern:/mm/,regexp:"\\d\\d",fn:function(e,t){u(e,"Minutes",t,o)}},{pattern:/ss/,regexp:"\\d\\d",fn:function(e,t){u(e,"Seconds",t,o)}},{pattern:/SSS/,regexp:"\\d\\d\\d",fn:function(e,t){u(e,"Milliseconds",t,o)}},{pattern:/O/,regexp:"[+-]\\d{1,2}:?\\d{2}?|Z",fn:function(e,t){t="Z"===t?0:t.replace(":","");var n=Math.abs(t),r=(t>0?-1:1)*(n%100+60*Math.floor(n/100));e.setUTCMinutes(e.getUTCMinutes()+r)}}],c=s.reduce((function(e,t){return t.pattern.test(e.regexp)?(t.index=e.regexp.match(t.pattern).index,e.regexp=e.regexp.replace(t.pattern,"("+t.regexp+")")):t.index=-1,e}),{regexp:t,index:[]}),a=s.filter((function(e){return e.index>-1}));a.sort((function(e,t){return e.index-t.index}));var l=new RegExp(c.regexp).exec(n);if(l){var f=r||e.exports.now();return a.forEach((function(e,t){e.fn(f,l[t+1])})),f}throw new Error("String '"+n+"' could not be parsed as '"+t+"'")}(t,n,r)},e.exports.now=function(){return new Date},e.exports.ISO8601_FORMAT="yyyy-MM-ddThh:mm:ss.SSS",e.exports.ISO8601_WITH_TZ_OFFSET_FORMAT="yyyy-MM-ddThh:mm:ss.SSSO",e.exports.DATETIME_FORMAT="dd MM yyyy hh:mm:ss.SSS",e.exports.ABSOLUTETIME_FORMAT="hh:mm:ss.SSS"}(nu);const ru=nu.exports,uu=E.default,ou=F.default,iu=p.default,su={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[90,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[91,39],yellow:[33,39]};function cu(e){return e?`[${su[e][0]}m`:""}function au(e){return e?`[${su[e][1]}m`:""}function lu(e,t){return n=ou.format("[%s] [%s] %s - ",ru.asString(e.startTime),e.level.toString(),e.categoryName),cu(r=t)+n+au(r);var n,r}function fu(e){return lu(e)+ou.format(...e.data)}function du(e){return lu(e,e.level.colour)+ou.format(...e.data)}function Du(e){return ou.format(...e.data)}function pu(e){return e.data[0]}function Eu(e,t){const n=/%(-?[0-9]+)?(\.?-?[0-9]+)?([[\]cdhmnprzxXyflos%])(\{([^}]+)\})?|([^%]+)/;function r(e){return e&&e.pid?e.pid.toString():process.pid.toString()}e=e||"%r %p %c - %m%n";const u={c:function(e,t){let n=e.categoryName;if(t){const e=parseInt(t,10),r=n.split(".");ee&&(n=r.slice(-e).join(iu.sep))}return n},l:function(e){return e.lineNumber?`${e.lineNumber}`:""},o:function(e){return e.columnNumber?`${e.columnNumber}`:""},s:function(e){return e.callStack||""}};function o(e,t,n){return u[e](t,n)}function i(e,t,n){let r=e;return r=function(e,t){let n;return e?(n=parseInt(e.substr(1),10),n>0?t.slice(0,n):t.slice(n)):t}(t,r),r=function(e,t){let n;if(e)if("-"===e.charAt(0))for(n=parseInt(e.substr(1),10);t.lengthDu,basic:()=>fu,colored:()=>du,coloured:()=>du,pattern:e=>Eu(e&&e.pattern,e&&e.tokens),dummy:()=>pu};var hu={basicLayout:fu,messagePassThroughLayout:Du,patternLayout:Eu,colouredLayout:du,coloredLayout:du,dummyLayout:pu,addLayout(e,t){mu[e]=t},layout:(e,t)=>mu[e]&&mu[e](t)};const yu=tu,Cu=["white","grey","black","blue","cyan","green","magenta","red","yellow"];class Fu{constructor(e,t,n){this.level=e,this.levelStr=t,this.colour=n}toString(){return this.levelStr}static getLevel(e,t){return e?e instanceof Fu?e:(e instanceof Object&&e.levelStr&&(e=e.levelStr),Fu[e.toString().toUpperCase()]||t):t}static addLevels(e){if(e){Object.keys(e).forEach((t=>{const n=t.toUpperCase();Fu[n]=new Fu(e[t].value,n,e[t].colour);const r=Fu.levels.findIndex((e=>e.levelStr===n));r>-1?Fu.levels[r]=Fu[n]:Fu.levels.push(Fu[n])})),Fu.levels.sort(((e,t)=>e.level-t.level))}}isLessThanOrEqualTo(e){return"string"==typeof e&&(e=Fu.getLevel(e)),this.level<=e.level}isGreaterThanOrEqualTo(e){return"string"==typeof e&&(e=Fu.getLevel(e)),this.level>=e.level}isEqualTo(e){return"string"==typeof e&&(e=Fu.getLevel(e)),this.level===e.level}}Fu.levels=[],Fu.addLevels({ALL:{value:Number.MIN_VALUE,colour:"grey"},TRACE:{value:5e3,colour:"blue"},DEBUG:{value:1e4,colour:"cyan"},INFO:{value:2e4,colour:"green"},WARN:{value:3e4,colour:"yellow"},ERROR:{value:4e4,colour:"red"},FATAL:{value:5e4,colour:"magenta"},MARK:{value:9007199254740992,colour:"grey"},OFF:{value:Number.MAX_VALUE,colour:"grey"}}),yu.addListener((e=>{const t=e.levels;if(t){yu.throwExceptionIf(e,yu.not(yu.anObject(t)),"levels must be an object");Object.keys(t).forEach((n=>{yu.throwExceptionIf(e,yu.not(yu.validIdentifier(n)),`level name "${n}" is not a valid identifier (must start with a letter, only contain A-Z,a-z,0-9,_)`),yu.throwExceptionIf(e,yu.not(yu.anObject(t[n])),`level "${n}" must be an object`),yu.throwExceptionIf(e,yu.not(t[n].value),`level "${n}" must have a 'value' property`),yu.throwExceptionIf(e,yu.not(yu.anInteger(t[n].value)),`level "${n}".value must have an integer value`),yu.throwExceptionIf(e,yu.not(t[n].colour),`level "${n}" must have a 'colour' property`),yu.throwExceptionIf(e,yu.not(Cu.indexOf(t[n].colour)>-1),`level "${n}".colour must be one of ${Cu.join(", ")}`)}))}})),yu.addListener((e=>{Fu.addLevels(e.levels)}));var gu=Fu,Au={exports:{}},vu={};/*! (c) 2020 Andrea Giammarchi */ -const{parse:Su,stringify:wu}=JSON,{keys:Ou}=Object,bu=String,_u="string",Bu={},Pu="object",ku=(e,t)=>t,xu=e=>e instanceof bu?bu(e):e,Nu=(e,t)=>typeof t===_u?new bu(t):t,Iu=(e,t,n,r)=>{const u=[];for(let o=Ou(n),{length:i}=o,s=0;s{const r=bu(t.push(n)-1);return e.set(n,r),r},Ru=(e,t)=>{const n=Su(e,Nu).map(xu),r=n[0],u=t||ku,o=typeof r===Pu&&r?Iu(n,new Set,r,u):r;return u.call({"":o},"",o)};vu.parse=Ru;const Mu=(e,t,n)=>{const r=t&&typeof t===Pu?(e,n)=>""===e||-1Su(Mu(e));vu.fromJSON=e=>Ru(wu(e));const Lu=vu,ju=gu;class $u{constructor(e,t,n,r,u){this.startTime=new Date,this.categoryName=e,this.data=n,this.level=t,this.context=Object.assign({},r),this.pid=process.pid,u&&(this.functionName=u.functionName,this.fileName=u.fileName,this.lineNumber=u.lineNumber,this.columnNumber=u.columnNumber,this.callStack=u.callStack)}serialise(){const e=this.data.map((e=>(e&&e.message&&e.stack&&(e=Object.assign({message:e.message,stack:e.stack},e)),e)));return this.data=e,Lu.stringify(this)}static deserialise(e){let t;try{const n=Lu.parse(e);n.data=n.data.map((e=>{if(e&&e.message&&e.stack){const t=new Error(e);Object.keys(e).forEach((n=>{t[n]=e[n]})),e=t}return e})),t=new $u(n.categoryName,ju.getLevel(n.level.levelStr),n.data,n.context),t.startTime=new Date(n.startTime),t.pid=n.pid,t.cluster=n.cluster}catch(n){t=new $u("log4js",ju.ERROR,["Unable to parse log:",e,"because: ",n])}return t}}var Hu=$u;const Ju=Nr.exports("log4js:clustering"),Gu=Hu,Vu=tu;let Uu=!1,Wu=null;try{Wu=require("cluster")}catch(e){Ju("cluster module not present"),Uu=!0}const zu=[];let Ku=!1,qu="NODE_APP_INSTANCE";const Yu=()=>Ku&&"0"===process.env[qu],Xu=()=>Uu||Wu.isMaster||Yu(),Zu=e=>{zu.forEach((t=>t(e)))},Qu=(e,t)=>{if(Ju("cluster message received from worker ",e,": ",t),e.topic&&e.data&&(t=e,e=void 0),t&&t.topic&&"log4js:message"===t.topic){Ju("received message: ",t.data);const e=Gu.deserialise(t.data);Zu(e)}};Uu||Vu.addListener((e=>{zu.length=0,({pm2:Ku,disableClustering:Uu,pm2InstanceVar:qu="NODE_APP_INSTANCE"}=e),Ju(`clustering disabled ? ${Uu}`),Ju(`cluster.isMaster ? ${Wu&&Wu.isMaster}`),Ju(`pm2 enabled ? ${Ku}`),Ju(`pm2InstanceVar = ${qu}`),Ju(`process.env[${qu}] = ${process.env[qu]}`),Ku&&process.removeListener("message",Qu),Wu&&Wu.removeListener&&Wu.removeListener("message",Qu),Uu||e.disableClustering?Ju("Not listening for cluster messages, because clustering disabled."):Yu()?(Ju("listening for PM2 broadcast messages"),process.on("message",Qu)):Wu.isMaster?(Ju("listening for cluster messages"),Wu.on("message",Qu)):Ju("not listening for messages, because we are not a master process")}));var eo={onlyOnMaster:(e,t)=>Xu()?e():t,isMaster:Xu,send:e=>{Xu()?Zu(e):(Ku||(e.cluster={workerId:Wu.worker.id,worker:process.pid}),process.send({topic:"log4js:message",data:e.serialise()}))},onMessage:e=>{zu.push(e)}},to={};function no(e){if("number"==typeof e&&Number.isInteger(e))return e;const t={K:1024,M:1048576,G:1073741824},n=Object.keys(t),r=e.substr(e.length-1).toLocaleUpperCase(),u=e.substring(0,e.length-1).trim();if(n.indexOf(r)<0||!Number.isInteger(Number(u)))throw Error(`maxLogSize: "${e}" is invalid`);return u*t[r]}function ro(e){return function(e,t){const n=Object.assign({},t);return Object.keys(e).forEach((r=>{n[r]&&(n[r]=e[r](t[r]))})),n}({maxLogSize:no},e)}const uo={file:ro,fileSync:ro};to.modifyConfig=e=>uo[e.type]?uo[e.type](e):e;var oo={};const io=console.log.bind(console);oo.configure=function(e,t){let n=t.colouredLayout;return e.layout&&(n=t.layout(e.layout.type,e.layout)),function(e,t){return n=>{io(e(n,t))}}(n,e.timezoneOffset)};var so={};so.configure=function(e,t){let n=t.colouredLayout;return e.layout&&(n=t.layout(e.layout.type,e.layout)),function(e,t){return n=>{process.stdout.write(`${e(n,t)}\n`)}}(n,e.timezoneOffset)};var co={};co.configure=function(e,t){let n=t.colouredLayout;return e.layout&&(n=t.layout(e.layout.type,e.layout)),function(e,t){return n=>{process.stderr.write(`${e(n,t)}\n`)}}(n,e.timezoneOffset)};var ao={};ao.configure=function(e,t,n,r){const u=n(e.appender);return function(e,t,n,r){const u=r.getLevel(e),o=r.getLevel(t,r.FATAL);return e=>{const t=e.level;t.isGreaterThanOrEqualTo(u)&&t.isLessThanOrEqualTo(o)&&n(e)}}(e.level,e.maxLevel,u,r)};var lo={};const fo=Nr.exports("log4js:categoryFilter");lo.configure=function(e,t,n){const r=n(e.appender);return function(e,t){return"string"==typeof e&&(e=[e]),n=>{fo(`Checking ${n.categoryName} against ${e}`),-1===e.indexOf(n.categoryName)&&(fo("Not excluded, sending to appender"),t(n))}}(e.exclude,r)};var Do={};const po=Nr.exports("log4js:noLogFilter");Do.configure=function(e,t,n){const r=n(e.appender);return function(e,t){return n=>{po(`Checking data: ${n.data} against filters: ${e}`),"string"==typeof e&&(e=[e]),e=e.filter((e=>null!=e&&""!==e));const r=new RegExp(e.join("|"),"i");(0===e.length||n.data.findIndex((e=>r.test(e)))<0)&&(po("Not excluded, sending to appender"),t(n))}}(e.exclude,r)};var Eo={},mo={exports:{}},ho={},yo={fromCallback:function(e){return Object.defineProperty((function(){if("function"!=typeof arguments[arguments.length-1])return new Promise(((t,n)=>{arguments[arguments.length]=(e,r)=>{if(e)return n(e);t(r)},arguments.length++,e.apply(this,arguments)}));e.apply(this,arguments)}),"name",{value:e.name})},fromPromise:function(e){return Object.defineProperty((function(){const t=arguments[arguments.length-1];if("function"!=typeof t)return e.apply(this,arguments);e.apply(this,arguments).then((e=>t(null,e)),t)}),"name",{value:e.name})}};!function(e){const t=yo.fromCallback,n=we,r=["access","appendFile","chmod","chown","close","copyFile","fchmod","fchown","fdatasync","fstat","fsync","ftruncate","futimes","lchown","lchmod","link","lstat","mkdir","mkdtemp","open","readFile","readdir","readlink","realpath","rename","rmdir","stat","symlink","truncate","unlink","utimes","writeFile"].filter((e=>"function"==typeof n[e]));Object.keys(n).forEach((t=>{"promises"!==t&&(e[t]=n[t])})),r.forEach((r=>{e[r]=t(n[r])})),e.exists=function(e,t){return"function"==typeof t?n.exists(e,t):new Promise((t=>n.exists(e,t)))},e.read=function(e,t,r,u,o,i){return"function"==typeof i?n.read(e,t,r,u,o,i):new Promise(((i,s)=>{n.read(e,t,r,u,o,((e,t,n)=>{if(e)return s(e);i({bytesRead:t,buffer:n})}))}))},e.write=function(e,t,...r){return"function"==typeof r[r.length-1]?n.write(e,t,...r):new Promise(((u,o)=>{n.write(e,t,...r,((e,t,n)=>{if(e)return o(e);u({bytesWritten:t,buffer:n})}))}))},"function"==typeof n.realpath.native&&(e.realpath.native=t(n.realpath.native))}(ho);const Co=p.default;function Fo(e){return(e=Co.normalize(Co.resolve(e)).split(Co.sep)).length>0?e[0]:null}const go=/[<>:"|?*]/;var Ao=function(e){const t=Fo(e);return e=e.replace(t,""),go.test(e)};const vo=we,So=p.default,wo=Ao,Oo=parseInt("0777",8);var bo=function e(t,n,r,u){if("function"==typeof n?(r=n,n={}):n&&"object"==typeof n||(n={mode:n}),"win32"===process.platform&&wo(t)){const e=new Error(t+" contains invalid WIN32 path characters.");return e.code="EINVAL",r(e)}let o=n.mode;const i=n.fs||vo;void 0===o&&(o=Oo&~process.umask()),u||(u=null),r=r||function(){},t=So.resolve(t),i.mkdir(t,o,(o=>{if(!o)return r(null,u=u||t);if("ENOENT"===o.code){if(So.dirname(t)===t)return r(o);e(So.dirname(t),n,((u,o)=>{u?r(u,o):e(t,n,r,o)}))}else i.stat(t,((e,t)=>{e||!t.isDirectory()?r(o,u):r(null,u)}))}))};const _o=we,Bo=p.default,Po=Ao,ko=parseInt("0777",8);var xo=function e(t,n,r){n&&"object"==typeof n||(n={mode:n});let u=n.mode;const o=n.fs||_o;if("win32"===process.platform&&Po(t)){const e=new Error(t+" contains invalid WIN32 path characters.");throw e.code="EINVAL",e}void 0===u&&(u=ko&~process.umask()),r||(r=null),t=Bo.resolve(t);try{o.mkdirSync(t,u),r=r||t}catch(u){if("ENOENT"===u.code){if(Bo.dirname(t)===t)throw u;r=e(Bo.dirname(t),n,r),e(t,n,r)}else{let e;try{e=o.statSync(t)}catch(e){throw u}if(!e.isDirectory())throw u}}return r};const No=(0,yo.fromCallback)(bo);var Io={mkdirs:No,mkdirsSync:xo,mkdirp:No,mkdirpSync:xo,ensureDir:No,ensureDirSync:xo};const To=we;E.default,p.default;var Ro=function(e,t,n,r){To.open(e,"r+",((e,u)=>{if(e)return r(e);To.futimes(u,t,n,(e=>{To.close(u,(t=>{r&&r(e||t)}))}))}))},Mo=function(e,t,n){const r=To.openSync(e,"r+");return To.futimesSync(r,t,n),To.closeSync(r)};const Lo=we,jo=p.default,$o=10,Ho=5,Jo=0,Go=process.versions.node.split("."),Vo=Number.parseInt(Go[0],10),Uo=Number.parseInt(Go[1],10),Wo=Number.parseInt(Go[2],10);function zo(){if(Vo>$o)return!0;if(Vo===$o){if(Uo>Ho)return!0;if(Uo===Ho&&Wo>=Jo)return!0}return!1}function Ko(e,t){const n=jo.resolve(e).split(jo.sep).filter((e=>e)),r=jo.resolve(t).split(jo.sep).filter((e=>e));return n.reduce(((e,t,n)=>e&&r[n]===t),!0)}function qo(e,t,n){return`Cannot ${n} '${e}' to a subdirectory of itself, '${t}'.`}var Yo,Xo,Zo={checkPaths:function(e,t,n,r){!function(e,t,n){zo()?Lo.stat(e,{bigint:!0},((e,r)=>{if(e)return n(e);Lo.stat(t,{bigint:!0},((e,t)=>e?"ENOENT"===e.code?n(null,{srcStat:r,destStat:null}):n(e):n(null,{srcStat:r,destStat:t})))})):Lo.stat(e,((e,r)=>{if(e)return n(e);Lo.stat(t,((e,t)=>e?"ENOENT"===e.code?n(null,{srcStat:r,destStat:null}):n(e):n(null,{srcStat:r,destStat:t})))}))}(e,t,((u,o)=>{if(u)return r(u);const{srcStat:i,destStat:s}=o;return s&&s.ino&&s.dev&&s.ino===i.ino&&s.dev===i.dev?r(new Error("Source and destination must not be the same.")):i.isDirectory()&&Ko(e,t)?r(new Error(qo(e,t,n))):r(null,{srcStat:i,destStat:s})}))},checkPathsSync:function(e,t,n){const{srcStat:r,destStat:u}=function(e,t){let n,r;n=zo()?Lo.statSync(e,{bigint:!0}):Lo.statSync(e);try{r=zo()?Lo.statSync(t,{bigint:!0}):Lo.statSync(t)}catch(e){if("ENOENT"===e.code)return{srcStat:n,destStat:null};throw e}return{srcStat:n,destStat:r}}(e,t);if(u&&u.ino&&u.dev&&u.ino===r.ino&&u.dev===r.dev)throw new Error("Source and destination must not be the same.");if(r.isDirectory()&&Ko(e,t))throw new Error(qo(e,t,n));return{srcStat:r,destStat:u}},checkParentPaths:function e(t,n,r,u,o){const i=jo.resolve(jo.dirname(t)),s=jo.resolve(jo.dirname(r));if(s===i||s===jo.parse(s).root)return o();zo()?Lo.stat(s,{bigint:!0},((i,c)=>i?"ENOENT"===i.code?o():o(i):c.ino&&c.dev&&c.ino===n.ino&&c.dev===n.dev?o(new Error(qo(t,r,u))):e(t,n,s,u,o))):Lo.stat(s,((i,c)=>i?"ENOENT"===i.code?o():o(i):c.ino&&c.dev&&c.ino===n.ino&&c.dev===n.dev?o(new Error(qo(t,r,u))):e(t,n,s,u,o)))},checkParentPathsSync:function e(t,n,r,u){const o=jo.resolve(jo.dirname(t)),i=jo.resolve(jo.dirname(r));if(i===o||i===jo.parse(i).root)return;let s;try{s=zo()?Lo.statSync(i,{bigint:!0}):Lo.statSync(i)}catch(e){if("ENOENT"===e.code)return;throw e}if(s.ino&&s.dev&&s.ino===n.ino&&s.dev===n.dev)throw new Error(qo(t,r,u));return e(t,n,i,u)},isSrcSubdir:Ko};const Qo=we,ei=p.default,ti=Io.mkdirsSync,ni=Mo,ri=Zo;function ui(e,t,n,r){if(!r.filter||r.filter(t,n))return function(e,t,n,r){const u=r.dereference?Qo.statSync:Qo.lstatSync,o=u(t);if(o.isDirectory())return function(e,t,n,r,u){if(!t)return function(e,t,n,r){return Qo.mkdirSync(n),ii(t,n,r),Qo.chmodSync(n,e.mode)}(e,n,r,u);if(t&&!t.isDirectory())throw new Error(`Cannot overwrite non-directory '${r}' with directory '${n}'.`);return ii(n,r,u)}(o,e,t,n,r);if(o.isFile()||o.isCharacterDevice()||o.isBlockDevice())return function(e,t,n,r,u){return t?function(e,t,n,r){if(r.overwrite)return Qo.unlinkSync(n),oi(e,t,n,r);if(r.errorOnExist)throw new Error(`'${n}' already exists`)}(e,n,r,u):oi(e,n,r,u)}(o,e,t,n,r);if(o.isSymbolicLink())return function(e,t,n,r){let u=Qo.readlinkSync(t);r.dereference&&(u=ei.resolve(process.cwd(),u));if(e){let e;try{e=Qo.readlinkSync(n)}catch(e){if("EINVAL"===e.code||"UNKNOWN"===e.code)return Qo.symlinkSync(u,n);throw e}if(r.dereference&&(e=ei.resolve(process.cwd(),e)),ri.isSrcSubdir(u,e))throw new Error(`Cannot copy '${u}' to a subdirectory of itself, '${e}'.`);if(Qo.statSync(n).isDirectory()&&ri.isSrcSubdir(e,u))throw new Error(`Cannot overwrite '${e}' with '${u}'.`);return function(e,t){return Qo.unlinkSync(t),Qo.symlinkSync(e,t)}(u,n)}return Qo.symlinkSync(u,n)}(e,t,n,r)}(e,t,n,r)}function oi(e,t,n,r){return"function"==typeof Qo.copyFileSync?(Qo.copyFileSync(t,n),Qo.chmodSync(n,e.mode),r.preserveTimestamps?ni(n,e.atime,e.mtime):void 0):function(e,t,n,r){const u=65536,o=(Xo?Yo:(Xo=1,Yo=function(e){if("function"==typeof Buffer.allocUnsafe)try{return Buffer.allocUnsafe(e)}catch(t){return new Buffer(e)}return new Buffer(e)}))(u),i=Qo.openSync(t,"r"),s=Qo.openSync(n,"w",e.mode);let c=0;for(;cfunction(e,t,n,r){const u=ei.join(t,e),o=ei.join(n,e),{destStat:i}=ri.checkPathsSync(u,o,"copy");return ui(i,u,o,r)}(r,e,t,n)))}var si=function(e,t,n){"function"==typeof n&&(n={filter:n}),(n=n||{}).clobber=!("clobber"in n)||!!n.clobber,n.overwrite="overwrite"in n?!!n.overwrite:n.clobber,n.preserveTimestamps&&"ia32"===process.arch&&console.warn("fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n\n see https://github.com/jprichardson/node-fs-extra/issues/269");const{srcStat:r,destStat:u}=ri.checkPathsSync(e,t,"copy");return ri.checkParentPathsSync(e,r,t,"copy"),function(e,t,n,r){if(r.filter&&!r.filter(t,n))return;const u=ei.dirname(n);Qo.existsSync(u)||ti(u);return ui(e,t,n,r)}(u,e,t,n)},ci={copySync:si};const ai=yo.fromPromise,li=ho;var fi={pathExists:ai((function(e){return li.access(e).then((()=>!0)).catch((()=>!1))})),pathExistsSync:li.existsSync};const di=we,Di=p.default,pi=Io.mkdirs,Ei=fi.pathExists,mi=Ro,hi=Zo;function yi(e,t,n,r,u){const o=Di.dirname(n);Ei(o,((i,s)=>i?u(i):s?Fi(e,t,n,r,u):void pi(o,(o=>o?u(o):Fi(e,t,n,r,u)))))}function Ci(e,t,n,r,u,o){Promise.resolve(u.filter(n,r)).then((i=>i?e(t,n,r,u,o):o()),(e=>o(e)))}function Fi(e,t,n,r,u){return r.filter?Ci(gi,e,t,n,r,u):gi(e,t,n,r,u)}function gi(e,t,n,r,u){(r.dereference?di.stat:di.lstat)(t,((o,i)=>o?u(o):i.isDirectory()?function(e,t,n,r,u,o){if(!t)return function(e,t,n,r,u){di.mkdir(n,(o=>{if(o)return u(o);Si(t,n,r,(t=>t?u(t):di.chmod(n,e.mode,u)))}))}(e,n,r,u,o);if(t&&!t.isDirectory())return o(new Error(`Cannot overwrite non-directory '${r}' with directory '${n}'.`));return Si(n,r,u,o)}(i,e,t,n,r,u):i.isFile()||i.isCharacterDevice()||i.isBlockDevice()?function(e,t,n,r,u,o){return t?function(e,t,n,r,u){if(!r.overwrite)return r.errorOnExist?u(new Error(`'${n}' already exists`)):u();di.unlink(n,(o=>o?u(o):Ai(e,t,n,r,u)))}(e,n,r,u,o):Ai(e,n,r,u,o)}(i,e,t,n,r,u):i.isSymbolicLink()?function(e,t,n,r,u){di.readlink(t,((t,o)=>t?u(t):(r.dereference&&(o=Di.resolve(process.cwd(),o)),e?void di.readlink(n,((t,i)=>t?"EINVAL"===t.code||"UNKNOWN"===t.code?di.symlink(o,n,u):u(t):(r.dereference&&(i=Di.resolve(process.cwd(),i)),hi.isSrcSubdir(o,i)?u(new Error(`Cannot copy '${o}' to a subdirectory of itself, '${i}'.`)):e.isDirectory()&&hi.isSrcSubdir(i,o)?u(new Error(`Cannot overwrite '${i}' with '${o}'.`)):function(e,t,n){di.unlink(t,(r=>r?n(r):di.symlink(e,t,n)))}(o,n,u)))):di.symlink(o,n,u))))}(e,t,n,r,u):void 0))}function Ai(e,t,n,r,u){return"function"==typeof di.copyFile?di.copyFile(t,n,(t=>t?u(t):vi(e,n,r,u))):function(e,t,n,r,u){const o=di.createReadStream(t);o.on("error",(e=>u(e))).once("open",(()=>{const t=di.createWriteStream(n,{mode:e.mode});t.on("error",(e=>u(e))).on("open",(()=>o.pipe(t))).once("close",(()=>vi(e,n,r,u)))}))}(e,t,n,r,u)}function vi(e,t,n,r){di.chmod(t,e.mode,(u=>u?r(u):n.preserveTimestamps?mi(t,e.atime,e.mtime,r):r()))}function Si(e,t,n,r){di.readdir(e,((u,o)=>u?r(u):wi(o,e,t,n,r)))}function wi(e,t,n,r,u){const o=e.pop();return o?function(e,t,n,r,u,o){const i=Di.join(n,t),s=Di.join(r,t);hi.checkPaths(i,s,"copy",((t,c)=>{if(t)return o(t);const{destStat:a}=c;Fi(a,i,s,u,(t=>t?o(t):wi(e,n,r,u,o)))}))}(e,o,t,n,r,u):u()}var Oi=function(e,t,n,r){"function"!=typeof n||r?"function"==typeof n&&(n={filter:n}):(r=n,n={}),r=r||function(){},(n=n||{}).clobber=!("clobber"in n)||!!n.clobber,n.overwrite="overwrite"in n?!!n.overwrite:n.clobber,n.preserveTimestamps&&"ia32"===process.arch&&console.warn("fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n\n see https://github.com/jprichardson/node-fs-extra/issues/269"),hi.checkPaths(e,t,"copy",((u,o)=>{if(u)return r(u);const{srcStat:i,destStat:s}=o;hi.checkParentPaths(e,i,t,"copy",(u=>u?r(u):n.filter?Ci(yi,s,e,t,n,r):yi(s,e,t,n,r)))}))};var bi={copy:(0,yo.fromCallback)(Oi)};const _i=we,Bi=p.default,Pi=g.default,ki="win32"===process.platform;function xi(e){["unlink","chmod","stat","lstat","rmdir","readdir"].forEach((t=>{e[t]=e[t]||_i[t],e[t+="Sync"]=e[t]||_i[t]})),e.maxBusyTries=e.maxBusyTries||3}function Ni(e,t,n){let r=0;"function"==typeof t&&(n=t,t={}),Pi(e,"rimraf: missing path"),Pi.strictEqual(typeof e,"string","rimraf: path should be a string"),Pi.strictEqual(typeof n,"function","rimraf: callback function required"),Pi(t,"rimraf: invalid options argument provided"),Pi.strictEqual(typeof t,"object","rimraf: options should be object"),xi(t),Ii(e,t,(function u(o){if(o){if(("EBUSY"===o.code||"ENOTEMPTY"===o.code||"EPERM"===o.code)&&rIi(e,t,u)),100*r)}"ENOENT"===o.code&&(o=null)}n(o)}))}function Ii(e,t,n){Pi(e),Pi(t),Pi("function"==typeof n),t.lstat(e,((r,u)=>r&&"ENOENT"===r.code?n(null):r&&"EPERM"===r.code&&ki?Ti(e,t,r,n):u&&u.isDirectory()?Mi(e,t,r,n):void t.unlink(e,(r=>{if(r){if("ENOENT"===r.code)return n(null);if("EPERM"===r.code)return ki?Ti(e,t,r,n):Mi(e,t,r,n);if("EISDIR"===r.code)return Mi(e,t,r,n)}return n(r)}))))}function Ti(e,t,n,r){Pi(e),Pi(t),Pi("function"==typeof r),n&&Pi(n instanceof Error),t.chmod(e,438,(u=>{u?r("ENOENT"===u.code?null:n):t.stat(e,((u,o)=>{u?r("ENOENT"===u.code?null:n):o.isDirectory()?Mi(e,t,n,r):t.unlink(e,r)}))}))}function Ri(e,t,n){let r;Pi(e),Pi(t),n&&Pi(n instanceof Error);try{t.chmodSync(e,438)}catch(e){if("ENOENT"===e.code)return;throw n}try{r=t.statSync(e)}catch(e){if("ENOENT"===e.code)return;throw n}r.isDirectory()?ji(e,t,n):t.unlinkSync(e)}function Mi(e,t,n,r){Pi(e),Pi(t),n&&Pi(n instanceof Error),Pi("function"==typeof r),t.rmdir(e,(u=>{!u||"ENOTEMPTY"!==u.code&&"EEXIST"!==u.code&&"EPERM"!==u.code?u&&"ENOTDIR"===u.code?r(n):r(u):function(e,t,n){Pi(e),Pi(t),Pi("function"==typeof n),t.readdir(e,((r,u)=>{if(r)return n(r);let o,i=u.length;if(0===i)return t.rmdir(e,n);u.forEach((r=>{Ni(Bi.join(e,r),t,(r=>{if(!o)return r?n(o=r):void(0==--i&&t.rmdir(e,n))}))}))}))}(e,t,r)}))}function Li(e,t){let n;xi(t=t||{}),Pi(e,"rimraf: missing path"),Pi.strictEqual(typeof e,"string","rimraf: path should be a string"),Pi(t,"rimraf: missing options"),Pi.strictEqual(typeof t,"object","rimraf: options should be object");try{n=t.lstatSync(e)}catch(n){if("ENOENT"===n.code)return;"EPERM"===n.code&&ki&&Ri(e,t,n)}try{n&&n.isDirectory()?ji(e,t,null):t.unlinkSync(e)}catch(n){if("ENOENT"===n.code)return;if("EPERM"===n.code)return ki?Ri(e,t,n):ji(e,t,n);if("EISDIR"!==n.code)throw n;ji(e,t,n)}}function ji(e,t,n){Pi(e),Pi(t),n&&Pi(n instanceof Error);try{t.rmdirSync(e)}catch(r){if("ENOTDIR"===r.code)throw n;if("ENOTEMPTY"===r.code||"EEXIST"===r.code||"EPERM"===r.code)!function(e,t){if(Pi(e),Pi(t),t.readdirSync(e).forEach((n=>Li(Bi.join(e,n),t))),!ki){return t.rmdirSync(e,t)}{const n=Date.now();do{try{return t.rmdirSync(e,t)}catch(e){}}while(Date.now()-n<500)}}(e,t);else if("ENOENT"!==r.code)throw r}}var $i=Ni;Ni.sync=Li;const Hi=$i;var Ji={remove:(0,yo.fromCallback)(Hi),removeSync:Hi.sync};const Gi=yo.fromCallback,Vi=we,Ui=p.default,Wi=Io,zi=Ji,Ki=Gi((function(e,t){t=t||function(){},Vi.readdir(e,((n,r)=>{if(n)return Wi.mkdirs(e,t);r=r.map((t=>Ui.join(e,t))),function e(){const n=r.pop();if(!n)return t();zi.remove(n,(n=>{if(n)return t(n);e()}))}()}))}));function qi(e){let t;try{t=Vi.readdirSync(e)}catch(t){return Wi.mkdirsSync(e)}t.forEach((t=>{t=Ui.join(e,t),zi.removeSync(t)}))}var Yi={emptyDirSync:qi,emptydirSync:qi,emptyDir:Ki,emptydir:Ki};const Xi=yo.fromCallback,Zi=p.default,Qi=we,es=Io,ts=fi.pathExists;var ns={createFile:Xi((function(e,t){function n(){Qi.writeFile(e,"",(e=>{if(e)return t(e);t()}))}Qi.stat(e,((r,u)=>{if(!r&&u.isFile())return t();const o=Zi.dirname(e);ts(o,((e,r)=>e?t(e):r?n():void es.mkdirs(o,(e=>{if(e)return t(e);n()}))))}))})),createFileSync:function(e){let t;try{t=Qi.statSync(e)}catch(e){}if(t&&t.isFile())return;const n=Zi.dirname(e);Qi.existsSync(n)||es.mkdirsSync(n),Qi.writeFileSync(e,"")}};const rs=yo.fromCallback,us=p.default,os=we,is=Io,ss=fi.pathExists;var cs={createLink:rs((function(e,t,n){function r(e,t){os.link(e,t,(e=>{if(e)return n(e);n(null)}))}ss(t,((u,o)=>u?n(u):o?n(null):void os.lstat(e,(u=>{if(u)return u.message=u.message.replace("lstat","ensureLink"),n(u);const o=us.dirname(t);ss(o,((u,i)=>u?n(u):i?r(e,t):void is.mkdirs(o,(u=>{if(u)return n(u);r(e,t)}))))}))))})),createLinkSync:function(e,t){if(os.existsSync(t))return;try{os.lstatSync(e)}catch(e){throw e.message=e.message.replace("lstat","ensureLink"),e}const n=us.dirname(t);return os.existsSync(n)||is.mkdirsSync(n),os.linkSync(e,t)}};const as=p.default,ls=we,fs=fi.pathExists;var ds={symlinkPaths:function(e,t,n){if(as.isAbsolute(e))return ls.lstat(e,(t=>t?(t.message=t.message.replace("lstat","ensureSymlink"),n(t)):n(null,{toCwd:e,toDst:e})));{const r=as.dirname(t),u=as.join(r,e);return fs(u,((t,o)=>t?n(t):o?n(null,{toCwd:u,toDst:e}):ls.lstat(e,(t=>t?(t.message=t.message.replace("lstat","ensureSymlink"),n(t)):n(null,{toCwd:e,toDst:as.relative(r,e)})))))}},symlinkPathsSync:function(e,t){let n;if(as.isAbsolute(e)){if(n=ls.existsSync(e),!n)throw new Error("absolute srcpath does not exist");return{toCwd:e,toDst:e}}{const r=as.dirname(t),u=as.join(r,e);if(n=ls.existsSync(u),n)return{toCwd:u,toDst:e};if(n=ls.existsSync(e),!n)throw new Error("relative srcpath does not exist");return{toCwd:e,toDst:as.relative(r,e)}}}};const Ds=we;var ps={symlinkType:function(e,t,n){if(n="function"==typeof t?t:n,t="function"!=typeof t&&t)return n(null,t);Ds.lstat(e,((e,r)=>{if(e)return n(null,"file");t=r&&r.isDirectory()?"dir":"file",n(null,t)}))},symlinkTypeSync:function(e,t){let n;if(t)return t;try{n=Ds.lstatSync(e)}catch(e){return"file"}return n&&n.isDirectory()?"dir":"file"}};const Es=yo.fromCallback,ms=p.default,hs=we,ys=Io.mkdirs,Cs=Io.mkdirsSync,Fs=ds.symlinkPaths,gs=ds.symlinkPathsSync,As=ps.symlinkType,vs=ps.symlinkTypeSync,Ss=fi.pathExists;var ws={createSymlink:Es((function(e,t,n,r){r="function"==typeof n?n:r,n="function"!=typeof n&&n,Ss(t,((u,o)=>u?r(u):o?r(null):void Fs(e,t,((u,o)=>{if(u)return r(u);e=o.toDst,As(o.toCwd,n,((n,u)=>{if(n)return r(n);const o=ms.dirname(t);Ss(o,((n,i)=>n?r(n):i?hs.symlink(e,t,u,r):void ys(o,(n=>{if(n)return r(n);hs.symlink(e,t,u,r)}))))}))}))))})),createSymlinkSync:function(e,t,n){if(hs.existsSync(t))return;const r=gs(e,t);e=r.toDst,n=vs(r.toCwd,n);const u=ms.dirname(t);return hs.existsSync(u)||Cs(u),hs.symlinkSync(e,t,n)}};var Os,bs={createFile:ns.createFile,createFileSync:ns.createFileSync,ensureFile:ns.createFile,ensureFileSync:ns.createFileSync,createLink:cs.createLink,createLinkSync:cs.createLinkSync,ensureLink:cs.createLink,ensureLinkSync:cs.createLinkSync,createSymlink:ws.createSymlink,createSymlinkSync:ws.createSymlinkSync,ensureSymlink:ws.createSymlink,ensureSymlinkSync:ws.createSymlinkSync};try{Os=we}catch(e){Os=D.default}function _s(e,t){var n,r="\n";return"object"==typeof t&&null!==t&&(t.spaces&&(n=t.spaces),t.EOL&&(r=t.EOL)),JSON.stringify(e,t?t.replacer:null,n).replace(/\n/g,r)+r}function Bs(e){return Buffer.isBuffer(e)&&(e=e.toString("utf8")),e=e.replace(/^\uFEFF/,"")}var Ps={readFile:function(e,t,n){null==n&&(n=t,t={}),"string"==typeof t&&(t={encoding:t});var r=(t=t||{}).fs||Os,u=!0;"throws"in t&&(u=t.throws),r.readFile(e,t,(function(r,o){if(r)return n(r);var i;o=Bs(o);try{i=JSON.parse(o,t?t.reviver:null)}catch(t){return u?(t.message=e+": "+t.message,n(t)):n(null,null)}n(null,i)}))},readFileSync:function(e,t){"string"==typeof(t=t||{})&&(t={encoding:t});var n=t.fs||Os,r=!0;"throws"in t&&(r=t.throws);try{var u=n.readFileSync(e,t);return u=Bs(u),JSON.parse(u,t.reviver)}catch(t){if(r)throw t.message=e+": "+t.message,t;return null}},writeFile:function(e,t,n,r){null==r&&(r=n,n={});var u=(n=n||{}).fs||Os,o="";try{o=_s(t,n)}catch(e){return void(r&&r(e,null))}u.writeFile(e,o,n,r)},writeFileSync:function(e,t,n){var r=(n=n||{}).fs||Os,u=_s(t,n);return r.writeFileSync(e,u,n)}},ks=Ps;const xs=yo.fromCallback,Ns=ks;var Is={readJson:xs(Ns.readFile),readJsonSync:Ns.readFileSync,writeJson:xs(Ns.writeFile),writeJsonSync:Ns.writeFileSync};const Ts=p.default,Rs=Io,Ms=fi.pathExists,Ls=Is;var js=function(e,t,n,r){"function"==typeof n&&(r=n,n={});const u=Ts.dirname(e);Ms(u,((o,i)=>o?r(o):i?Ls.writeJson(e,t,n,r):void Rs.mkdirs(u,(u=>{if(u)return r(u);Ls.writeJson(e,t,n,r)}))))};const $s=we,Hs=p.default,Js=Io,Gs=Is;var Vs=function(e,t,n){const r=Hs.dirname(e);$s.existsSync(r)||Js.mkdirsSync(r),Gs.writeJsonSync(e,t,n)};const Us=yo.fromCallback,Ws=Is;Ws.outputJson=Us(js),Ws.outputJsonSync=Vs,Ws.outputJSON=Ws.outputJson,Ws.outputJSONSync=Ws.outputJsonSync,Ws.writeJSON=Ws.writeJson,Ws.writeJSONSync=Ws.writeJsonSync,Ws.readJSON=Ws.readJson,Ws.readJSONSync=Ws.readJsonSync;var zs=Ws;const Ks=we,qs=p.default,Ys=ci.copySync,Xs=Ji.removeSync,Zs=Io.mkdirpSync,Qs=Zo;function ec(e,t,n){try{Ks.renameSync(e,t)}catch(r){if("EXDEV"!==r.code)throw r;return function(e,t,n){const r={overwrite:n,errorOnExist:!0};return Ys(e,t,r),Xs(e)}(e,t,n)}}var tc=function(e,t,n){const r=(n=n||{}).overwrite||n.clobber||!1,{srcStat:u}=Qs.checkPathsSync(e,t,"move");return Qs.checkParentPathsSync(e,u,t,"move"),Zs(qs.dirname(t)),function(e,t,n){if(n)return Xs(t),ec(e,t,n);if(Ks.existsSync(t))throw new Error("dest already exists.");return ec(e,t,n)}(e,t,r)},nc={moveSync:tc};const rc=we,uc=p.default,oc=bi.copy,ic=Ji.remove,sc=Io.mkdirp,cc=fi.pathExists,ac=Zo;function lc(e,t,n,r){rc.rename(e,t,(u=>u?"EXDEV"!==u.code?r(u):function(e,t,n,r){const u={overwrite:n,errorOnExist:!0};oc(e,t,u,(t=>t?r(t):ic(e,r)))}(e,t,n,r):r()))}var fc=function(e,t,n,r){"function"==typeof n&&(r=n,n={});const u=n.overwrite||n.clobber||!1;ac.checkPaths(e,t,"move",((n,o)=>{if(n)return r(n);const{srcStat:i}=o;ac.checkParentPaths(e,i,t,"move",(n=>{if(n)return r(n);sc(uc.dirname(t),(n=>n?r(n):function(e,t,n,r){if(n)return ic(t,(u=>u?r(u):lc(e,t,n,r)));cc(t,((u,o)=>u?r(u):o?r(new Error("dest already exists.")):lc(e,t,n,r)))}(e,t,u,r)))}))}))};var dc={move:(0,yo.fromCallback)(fc)};const Dc=yo.fromCallback,pc=we,Ec=p.default,mc=Io,hc=fi.pathExists;var yc={outputFile:Dc((function(e,t,n,r){"function"==typeof n&&(r=n,n="utf8");const u=Ec.dirname(e);hc(u,((o,i)=>o?r(o):i?pc.writeFile(e,t,n,r):void mc.mkdirs(u,(u=>{if(u)return r(u);pc.writeFile(e,t,n,r)}))))})),outputFileSync:function(e,...t){const n=Ec.dirname(e);if(pc.existsSync(n))return pc.writeFileSync(e,...t);mc.mkdirsSync(n),pc.writeFileSync(e,...t)}};!function(e){e.exports=Object.assign({},ho,ci,bi,Yi,bs,zs,Io,nc,dc,yc,fi,Ji);const t=D.default;Object.getOwnPropertyDescriptor(t,"promises")&&Object.defineProperty(e.exports,"promises",{get:()=>t.promises})}(mo);const Cc=Nr.exports("streamroller:fileNameFormatter"),Fc=p.default;const gc=Nr.exports("streamroller:fileNameParser"),Ac=nu.exports;const vc=Nr.exports("streamroller:moveAndMaybeCompressFile"),Sc=mo.exports,wc=v.default;var Oc=async(e,t,n)=>{if(n=function(e){const t={mode:parseInt("0600",8),compress:!1},n=Object.assign({},t,e);return vc(`_parseOption: moveAndMaybeCompressFile called with option=${JSON.stringify(n)}`),n}(n),e!==t){if(await Sc.pathExists(e))if(vc(`moveAndMaybeCompressFile: moving file from ${e} to ${t} ${n.compress?"with":"without"} compress`),n.compress)await new Promise(((r,u)=>{let o=!1;const i=Sc.createWriteStream(t,{mode:n.mode,flags:"wx"}).on("open",(()=>{o=!0;const t=Sc.createReadStream(e).on("open",(()=>{t.pipe(wc.createGzip()).pipe(i)})).on("error",(t=>{vc(`moveAndMaybeCompressFile: error reading ${e}`,t),i.destroy(t)}))})).on("finish",(()=>{vc(`moveAndMaybeCompressFile: finished compressing ${t}, deleting ${e}`),Sc.unlink(e).then(r).catch((t=>{vc(`moveAndMaybeCompressFile: error deleting ${e}, truncating instead`,t),Sc.truncate(e).then(r).catch((t=>{vc(`moveAndMaybeCompressFile: error truncating ${e}`,t),u(t)}))}))})).on("error",(e=>{o?(vc(`moveAndMaybeCompressFile: error writing ${t}, deleting`,e),Sc.unlink(t).then((()=>{u(e)})).catch((e=>{vc(`moveAndMaybeCompressFile: error deleting ${t}`,e),u(e)}))):(vc(`moveAndMaybeCompressFile: error creating ${t}`,e),u(e))}))})).catch((()=>{}));else{vc(`moveAndMaybeCompressFile: renaming ${e} to ${t}`);try{await Sc.move(e,t,{overwrite:!0})}catch(n){if(vc(`moveAndMaybeCompressFile: error renaming ${e} to ${t}`,n),"ENOENT"!==n.code){vc("moveAndMaybeCompressFile: trying copy+truncate instead");try{await Sc.copy(e,t,{overwrite:!0}),await Sc.truncate(e)}catch(e){vc("moveAndMaybeCompressFile: error copy+truncate",e)}}}}}else vc("moveAndMaybeCompressFile: source and target are the same, not doing anything")};const bc=Nr.exports("streamroller:RollingFileWriteStream"),_c=mo.exports,Bc=p.default,Pc=E.default,kc=()=>new Date,xc=nu.exports,{Writable:Nc}=C.default,Ic=({file:e,keepFileExt:t,needsIndex:n,alwaysIncludeDate:r,compress:u,fileNameSep:o})=>{let i=o||".";const s=Fc.join(e.dir,e.name),c=t=>t+e.ext,a=(e,t,r)=>!n&&r||!t?e:e+i+t,l=(e,t,n)=>(t>0||r)&&n?e+i+n:e,f=(e,t)=>t&&u?e+".gz":e,d=t?[l,a,c,f]:[c,l,a,f];return({date:e,index:t})=>(Cc(`_formatFileName: date=${e}, index=${t}`),d.reduce(((n,r)=>r(n,t,e)),s))},Tc=({file:e,keepFileExt:t,pattern:n,fileNameSep:r})=>{let u=r||".";const o="__NOT_MATCHING__";let i=[(e,t)=>e.endsWith(".gz")?(gc("it is gzipped"),t.isCompressed=!0,e.slice(0,-1*".gz".length)):e,t?t=>t.startsWith(e.name)&&t.endsWith(e.ext)?(gc("it starts and ends with the right things"),t.slice(e.name.length+1,-1*e.ext.length)):o:t=>t.startsWith(e.base)?(gc("it starts with the right things"),t.slice(e.base.length+1)):o,n?(e,t)=>{const r=e.split(u);let o=r[r.length-1];gc("items: ",r,", indexStr: ",o);let i=e;void 0!==o&&o.match(/^\d+$/)?(i=e.slice(0,-1*(o.length+1)),gc(`dateStr is ${i}`),n&&!i&&(i=o,o="0")):o="0";try{const r=Ac.parse(n,i,new Date(0,0));return Ac.asString(n,r)!==i?e:(t.index=parseInt(o,10),t.date=i,t.timestamp=r.getTime(),"")}catch(t){return gc(`Problem parsing ${i} as ${n}, error was: `,t),e}}:(e,t)=>e.match(/^\d+$/)?(gc("it has an index"),t.index=parseInt(e,10),""):e];return e=>{let t={filename:e,index:0,isCompressed:!1};return i.reduce(((e,n)=>n(e,t)),e)?null:t}},Rc=Oc;var Mc=class extends Nc{constructor(e,t){if(bc(`constructor: creating RollingFileWriteStream. path=${e}`),"string"!=typeof e||0===e.length)throw new Error(`Invalid filename: ${e}`);if(e.endsWith(Bc.sep))throw new Error(`Filename is a directory: ${e}`);0===e.indexOf(`~${Bc.sep}`)&&(e=e.replace("~",Pc.homedir())),super(t),this.options=this._parseOption(t),this.fileObject=Bc.parse(e),""===this.fileObject.dir&&(this.fileObject=Bc.parse(Bc.join(process.cwd(),e))),this.fileFormatter=Ic({file:this.fileObject,alwaysIncludeDate:this.options.alwaysIncludePattern,needsIndex:this.options.maxSize 0`)}else delete n.maxSize;if(n.numBackups||0===n.numBackups){if(n.numBackups<0)throw new Error(`options.numBackups (${n.numBackups}) should be >= 0`);if(n.numBackups>=Number.MAX_SAFE_INTEGER)throw new Error(`options.numBackups (${n.numBackups}) should be < Number.MAX_SAFE_INTEGER`);n.numToKeep=n.numBackups+1}else if(n.numToKeep<=0)throw new Error(`options.numToKeep (${n.numToKeep}) should be > 0`);return bc(`_parseOption: creating stream with option=${JSON.stringify(n)}`),n}_final(e){this.currentFileStream.end("",this.options.encoding,e)}_write(e,t,n){this._shouldRoll().then((()=>{bc(`_write: writing chunk. file=${this.currentFileStream.path} state=${JSON.stringify(this.state)} chunk=${e}`),this.currentFileStream.write(e,t,(t=>{this.state.currentSize+=e.length,n(t)}))}))}async _shouldRoll(){(this._dateChanged()||this._tooBig())&&(bc(`_shouldRoll: rolling because dateChanged? ${this._dateChanged()} or tooBig? ${this._tooBig()}`),await this._roll())}_dateChanged(){return this.state.currentDate&&this.state.currentDate!==xc(this.options.pattern,kc())}_tooBig(){return this.state.currentSize>=this.options.maxSize}_roll(){return bc("_roll: closing the current stream"),new Promise(((e,t)=>{this.currentFileStream.end("",this.options.encoding,(()=>{this._moveOldFiles().then(e).catch(t)}))}))}async _moveOldFiles(){const e=await this._getExistingFiles();for(let t=(this.state.currentDate?e.filter((e=>e.date===this.state.currentDate)):e).length;t>=0;t--){bc(`_moveOldFiles: i = ${t}`);const e=this.fileFormatter({date:this.state.currentDate,index:t}),n=this.fileFormatter({date:this.state.currentDate,index:t+1}),r={compress:this.options.compress&&0===t,mode:this.options.mode};await Rc(e,n,r)}this.state.currentSize=0,this.state.currentDate=this.state.currentDate?xc(this.options.pattern,kc()):null,bc(`_moveOldFiles: finished rolling files. state=${JSON.stringify(this.state)}`),this._renewWriteStream(),await new Promise(((e,t)=>{this.currentFileStream.write("","utf8",(()=>{this._clean().then(e).catch(t)}))}))}async _getExistingFiles(){const e=await _c.readdir(this.fileObject.dir).catch((()=>[]));bc(`_getExistingFiles: files=${e}`);const t=e.map((e=>this.fileNameParser(e))).filter((e=>e)),n=e=>(e.timestamp?e.timestamp:kc().getTime())-e.index;return t.sort(((e,t)=>n(e)-n(t))),t}_renewWriteStream(){const e=this.fileFormatter({date:this.state.currentDate,index:0}),t=e=>{try{return _c.mkdirSync(e,{recursive:!0})}catch(n){if("ENOENT"===n.code)return t(Bc.dirname(e)),t(e);if("EEXIST"!==n.code&&"EROFS"!==n.code)throw n;try{if(_c.statSync(e).isDirectory())return e;throw n}catch(e){throw n}}};t(this.fileObject.dir);const n={flags:this.options.flags,encoding:this.options.encoding,mode:this.options.mode};var r,u;_c.appendFileSync(e,"",(r={...n},u="flags",r["flag"]=r[u],delete r[u],r)),this.currentFileStream=_c.createWriteStream(e,n),this.currentFileStream.on("error",(e=>{this.emit("error",e)}))}async _clean(){const e=await this._getExistingFiles();if(bc(`_clean: numToKeep = ${this.options.numToKeep}, existingFiles = ${e.length}`),bc("_clean: existing files are: ",e),this._tooManyFiles(e.length)){const n=e.slice(0,e.length-this.options.numToKeep).map((e=>Bc.format({dir:this.fileObject.dir,base:e.filename})));await(t=n,bc(`deleteFiles: files to delete: ${t}`),Promise.all(t.map((e=>_c.unlink(e).catch((t=>{bc(`deleteFiles: error when unlinking ${e}, ignoring. Error was ${t}`)}))))))}var t}_tooManyFiles(e){return this.options.numToKeep>0&&e>this.options.numToKeep}};const Lc=Mc;var jc=class extends Lc{constructor(e,t,n,r){r||(r={}),t&&(r.maxSize=t),r.numBackups||0===r.numBackups||(n||0===n||(n=1),r.numBackups=n),super(e,r),this.backups=r.numBackups,this.size=this.options.maxSize}get theStream(){return this.currentFileStream}};const $c=Mc;var Hc={RollingFileWriteStream:Mc,RollingFileStream:jc,DateRollingFileStream:class extends $c{constructor(e,t,n){t&&"object"==typeof t&&(n=t,t=null),n||(n={}),t||(t="yyyy-MM-dd"),n.pattern=t,n.numBackups||0===n.numBackups?n.daysToKeep=n.numBackups:(n.daysToKeep||0===n.daysToKeep?process.emitWarning("options.daysToKeep is deprecated due to the confusion it causes when used together with file size rolling. Please use options.numBackups instead.","DeprecationWarning","streamroller-DEP0001"):n.daysToKeep=1,n.numBackups=n.daysToKeep),super(e,n),this.mode=this.options.mode}get theStream(){return this.currentFileStream}}};const Jc=Nr.exports("log4js:file"),Gc=p.default,Vc=Hc,Uc=E.default.EOL;let Wc=!1;const zc=new Set;function Kc(){zc.forEach((e=>{e.sighupHandler()}))}function qc(e,t,n,r){const u=new Vc.RollingFileStream(e,t,n,r);return u.on("error",(t=>{console.error("log4js.fileAppender - Writing to file %s, error happened ",e,t)})),u.on("drain",(()=>{process.emit("log4js:pause",!1)})),u}Eo.configure=function(e,t){let n=t.basicLayout;return e.layout&&(n=t.layout(e.layout.type,e.layout)),e.mode=e.mode||384,function(e,t,n,r,u,o){e=Gc.normalize(e),Jc("Creating file appender (",e,", ",n,", ",r=r||0===r?r:5,", ",u,", ",o,")");let i=qc(e,n,r,u);const s=function(e){if(i.writable){if(!0===u.removeColor){const t=/\x1b[[0-9;]*m/g;e.data=e.data.map((e=>"string"==typeof e?e.replace(t,""):e))}i.write(t(e,o)+Uc,"utf8")||process.emit("log4js:pause",!0)}};return s.reopen=function(){i.end((()=>{i=qc(e,n,r,u)}))},s.sighupHandler=function(){Jc("SIGHUP handler called."),s.reopen()},s.shutdown=function(e){zc.delete(s),0===zc.size&&Wc&&(process.removeListener("SIGHUP",Kc),Wc=!1),i.end("","utf-8",e)},zc.add(s),Wc||(process.on("SIGHUP",Kc),Wc=!0),s}(e.filename,n,e.maxLogSize,e.backups,e,e.timezoneOffset)};var Yc={};const Xc=Hc,Zc=E.default.EOL;function Qc(e,t,n,r,u){r.maxSize=r.maxLogSize;const o=function(e,t,n){const r=new Xc.DateRollingFileStream(e,t,n);return r.on("error",(t=>{console.error("log4js.dateFileAppender - Writing to file %s, error happened ",e,t)})),r.on("drain",(()=>{process.emit("log4js:pause",!1)})),r}(e,t,r),i=function(e){o.writable&&(o.write(n(e,u)+Zc,"utf8")||process.emit("log4js:pause",!0))};return i.shutdown=function(e){o.end("","utf-8",e)},i}Yc.configure=function(e,t){let n=t.basicLayout;return e.layout&&(n=t.layout(e.layout.type,e.layout)),e.alwaysIncludePattern||(e.alwaysIncludePattern=!1),e.mode=e.mode||384,Qc(e.filename,e.pattern,n,e,e.timezoneOffset)};var ea={};const ta=Nr.exports("log4js:fileSync"),na=p.default,ra=D.default,ua=E.default.EOL||"\n";function oa(e,t){if(ra.existsSync(e))return;const n=ra.openSync(e,t.flags,t.mode);ra.closeSync(n)}class ia{constructor(e,t,n,r){ta("In RollingFileStream"),function(){if(!e||!t||t<=0)throw new Error("You must specify a filename and file size")}(),this.filename=e,this.size=t,this.backups=n,this.options=r,this.currentSize=0,this.currentSize=function(e){let t=0;try{t=ra.statSync(e).size}catch(t){oa(e,r)}return t}(this.filename)}shouldRoll(){return ta("should roll with current size %d, and max size %d",this.currentSize,this.size),this.currentSize>=this.size}roll(e){const t=this,n=new RegExp(`^${na.basename(e)}`);function r(e){return n.test(e)}function u(t){return parseInt(t.substring(`${na.basename(e)}.`.length),10)||0}function o(e,t){return u(e)>u(t)?1:u(e) ${e}.${r+1}`),ra.renameSync(na.join(na.dirname(e),n),`${e}.${r+1}`)}}ta("Rolling, rolling, rolling"),ta("Renaming the old files"),ra.readdirSync(na.dirname(e)).filter(r).sort(o).reverse().forEach(i)}write(e,t){const n=this;ta("in write"),this.shouldRoll()&&(this.currentSize=0,this.roll(this.filename)),ta("writing the chunk to the file"),n.currentSize+=e.length,ra.appendFileSync(n.filename,e)}}ea.configure=function(e,t){let n=t.basicLayout;e.layout&&(n=t.layout(e.layout.type,e.layout));const r={flags:e.flags||"a",encoding:e.encoding||"utf8",mode:e.mode||384};return function(e,t,n,r,u,o){ta("fileSync appender created");const i=function(e,t,n){let r;var u;return t?r=new ia(e,t,n,o):(oa(u=e,o),r={write(e){ra.appendFileSync(u,e)}}),r}(e=na.normalize(e),n,r=r||0===r?r:5);return e=>{i.write(t(e,u)+ua)}}(e.filename,n,e.maxLogSize,e.backups,e.timezoneOffset,r)};var sa={};const ca=Nr.exports("log4js:tcp"),aa=S.default;sa.configure=function(e,t){ca(`configure with config = ${e}`);let n=function(e){return e.serialise()};return e.layout&&(n=t.layout(e.layout.type,e.layout)),function(e,t){let n=!1;const r=[];let u,o=3,i="__LOG4JS__";function s(e){ca("Writing log event to socket"),n=u.write(`${t(e)}${i}`,"utf8")}function c(){let e;for(ca("emptying buffer");e=r.shift();)s(e)}function a(e){n?s(e):(ca("buffering log event because it cannot write at the moment"),r.push(e))}return function t(){ca(`appender creating socket to ${e.host||"localhost"}:${e.port||5e3}`),i=`${e.endMsg||"__LOG4JS__"}`,u=aa.createConnection(e.port||5e3,e.host||"localhost"),u.on("connect",(()=>{ca("socket connected"),c(),n=!0})),u.on("drain",(()=>{ca("drain event received, emptying buffer"),n=!0,c()})),u.on("timeout",u.end.bind(u)),u.on("error",(e=>{ca("connection error",e),n=!1,c()})),u.on("close",t)}(),a.shutdown=function(e){ca("shutdown called"),r.length&&o?(ca("buffer has items, waiting 100ms to empty"),o-=1,setTimeout((()=>{a.shutdown(e)}),100)):(u.removeAllListeners("close"),u.end(e))},a}(e,n)};const la=p.default,fa=Nr.exports("log4js:appenders"),da=tu,Da=eo,pa=gu,Ea=hu,ma=to,ha=new Map;ha.set("console",oo),ha.set("stdout",so),ha.set("stderr",co),ha.set("logLevelFilter",ao),ha.set("categoryFilter",lo),ha.set("noLogFilter",Do),ha.set("file",Eo),ha.set("dateFile",Yc),ha.set("fileSync",ea),ha.set("tcp",sa);const ya=new Map,Ca=(e,t)=>{fa("Loading module from ",e);try{return require(e)}catch(n){return void da.throwExceptionIf(t,"MODULE_NOT_FOUND"!==n.code,`appender "${e}" could not be loaded (error was: ${n})`)}},Fa=new Set,ga=(e,t)=>{if(ya.has(e))return ya.get(e);if(!t.appenders[e])return!1;if(Fa.has(e))throw new Error(`Dependency loop detected for appender ${e}.`);Fa.add(e),fa(`Creating appender ${e}`);const n=Aa(e,t);return Fa.delete(e),ya.set(e,n),n},Aa=(e,t)=>{const n=t.appenders[e],r=n.type.configure?n.type:((e,t)=>ha.get(e)||Ca(`./${e}`,t)||Ca(e,t)||require.main&&Ca(la.join(la.dirname(require.main.filename),e),t)||Ca(la.join(process.cwd(),e),t))(n.type,t);return da.throwExceptionIf(t,da.not(r),`appender "${e}" is not valid (type "${n.type}" could not be found)`),r.appender&&fa(`DEPRECATION: Appender ${n.type} exports an appender function.`),r.shutdown&&fa(`DEPRECATION: Appender ${n.type} exports a shutdown function.`),fa(`${e}: clustering.isMaster ? ${Da.isMaster()}`),fa(`${e}: appenderModule is ${F.default.inspect(r)}`),Da.onlyOnMaster((()=>(fa(`calling appenderModule.configure for ${e} / ${n.type}`),r.configure(ma.modifyConfig(n),Ea,(e=>ga(e,t)),pa))),(()=>{}))},va=e=>{ya.clear(),Fa.clear();const t=[];Object.values(e.categories).forEach((e=>{t.push(...e.appenders)})),Object.keys(e.appenders).forEach((n=>{(t.includes(n)||"tcp-server"===e.appenders[n].type)&&ga(n,e)}))},Sa=()=>{va({appenders:{out:{type:"stdout"}},categories:{default:{appenders:["out"],level:"trace"}}})};Sa(),da.addListener((e=>{da.throwExceptionIf(e,da.not(da.anObject(e.appenders)),'must have a property "appenders" of type object.');const t=Object.keys(e.appenders);da.throwExceptionIf(e,da.not(t.length),"must define at least one appender."),t.forEach((t=>{da.throwExceptionIf(e,da.not(e.appenders[t].type),`appender "${t}" is not valid (must be an object with property "type")`)}))})),da.addListener(va),Au.exports=ya,Au.exports.init=Sa;var wa={exports:{}};!function(e){const t=Nr.exports("log4js:categories"),n=tu,r=gu,u=Au.exports,o=new Map;function i(e,t,n){if(!1===t.inherit)return;const r=n.lastIndexOf(".");if(r<0)return;const u=n.substring(0,r);let o=e.categories[u];o||(o={inherit:!0,appenders:[]}),i(e,o,u),!e.categories[u]&&o.appenders&&o.appenders.length&&o.level&&(e.categories[u]=o),t.appenders=t.appenders||[],t.level=t.level||o.level,o.appenders.forEach((e=>{t.appenders.includes(e)||t.appenders.push(e)})),t.parent=o}function s(e){if(!e.categories)return;Object.keys(e.categories).forEach((t=>{const n=e.categories[t];i(e,n,t)}))}n.addPreProcessingListener((e=>s(e))),n.addListener((e=>{n.throwExceptionIf(e,n.not(n.anObject(e.categories)),'must have a property "categories" of type object.');const t=Object.keys(e.categories);n.throwExceptionIf(e,n.not(t.length),"must define at least one category."),t.forEach((t=>{const o=e.categories[t];n.throwExceptionIf(e,[n.not(o.appenders),n.not(o.level)],`category "${t}" is not valid (must be an object with properties "appenders" and "level")`),n.throwExceptionIf(e,n.not(Array.isArray(o.appenders)),`category "${t}" is not valid (appenders must be an array of appender names)`),n.throwExceptionIf(e,n.not(o.appenders.length),`category "${t}" is not valid (appenders must contain at least one appender name)`),Object.prototype.hasOwnProperty.call(o,"enableCallStack")&&n.throwExceptionIf(e,"boolean"!=typeof o.enableCallStack,`category "${t}" is not valid (enableCallStack must be boolean type)`),o.appenders.forEach((r=>{n.throwExceptionIf(e,n.not(u.get(r)),`category "${t}" is not valid (appender "${r}" is not defined)`)})),n.throwExceptionIf(e,n.not(r.getLevel(o.level)),`category "${t}" is not valid (level "${o.level}" not recognised; valid levels are ${r.levels.join(", ")})`)})),n.throwExceptionIf(e,n.not(e.categories.default),'must define a "default" category.')}));const c=e=>{o.clear();Object.keys(e.categories).forEach((n=>{const i=e.categories[n],s=[];i.appenders.forEach((e=>{s.push(u.get(e)),t(`Creating category ${n}`),o.set(n,{appenders:s,level:r.getLevel(i.level),enableCallStack:i.enableCallStack||!1})}))}))},a=()=>{c({categories:{default:{appenders:["out"],level:"OFF"}}})};a(),n.addListener(c);const l=e=>(t(`configForCategory: searching for config for ${e}`),o.has(e)?(t(`configForCategory: ${e} exists in config, returning it`),o.get(e)):e.indexOf(".")>0?(t(`configForCategory: ${e} has hierarchy, searching for parents`),l(e.substring(0,e.lastIndexOf(".")))):(t("configForCategory: returning config for default category"),l("default")));e.exports=o,e.exports=Object.assign(e.exports,{appendersForCategory:e=>l(e).appenders,getLevelForCategory:e=>l(e).level,setLevelForCategory:(e,n)=>{let r=o.get(e);if(t(`setLevelForCategory: found ${r} for ${e}`),!r){const n=l(e);t(`setLevelForCategory: no config found for category, found ${n} for parents of ${e}`),r={appenders:n.appenders}}r.level=n,o.set(e,r)},getEnableCallStackForCategory:e=>!0===l(e).enableCallStack,setEnableCallStackForCategory:(e,t)=>{l(e).enableCallStack=t},init:a})}(wa);const Oa=Nr.exports("log4js:logger"),ba=Hu,_a=gu,Ba=eo,Pa=wa.exports,ka=tu,xa=/at (?:(.+)\s+\()?(?:(.+?):(\d+)(?::(\d+))?|([^)]+))\)?/;function Na(e,t=4){const n=e.stack.split("\n").slice(t),r=xa.exec(n[0]);return r&&6===r.length?{functionName:r[1],fileName:r[2],lineNumber:parseInt(r[3],10),columnNumber:parseInt(r[4],10),callStack:n.join("\n")}:null}class Ia{constructor(e){if(!e)throw new Error("No category provided.");this.category=e,this.context={},this.parseCallStack=Na,Oa(`Logger created (${this.category}, ${this.level})`)}get level(){return _a.getLevel(Pa.getLevelForCategory(this.category),_a.TRACE)}set level(e){Pa.setLevelForCategory(this.category,_a.getLevel(e,this.level))}get useCallStack(){return Pa.getEnableCallStackForCategory(this.category)}set useCallStack(e){Pa.setEnableCallStackForCategory(this.category,!0===e)}log(e,...t){let n=_a.getLevel(e);n||(this._log(_a.WARN,"log4js:logger.log: invalid value for log-level as first parameter given: ",e),n=_a.INFO),this.isLevelEnabled(n)&&this._log(n,t)}isLevelEnabled(e){return this.level.isLessThanOrEqualTo(e)}_log(e,t){Oa(`sending log data (${e}) to appenders`);const n=new ba(this.category,e,t,this.context,this.useCallStack&&this.parseCallStack(new Error));Ba.send(n)}addContext(e,t){this.context[e]=t}removeContext(e){delete this.context[e]}clearContext(){this.context={}}setParseCallStackFunction(e){this.parseCallStack=e}}function Ta(e){const t=_a.getLevel(e),n=t.toString().toLowerCase().replace(/_([a-z])/g,(e=>e[1].toUpperCase())),r=n[0].toUpperCase()+n.slice(1);Ia.prototype[`is${r}Enabled`]=function(){return this.isLevelEnabled(t)},Ia.prototype[n]=function(...e){this.log(t,...e)}}_a.levels.forEach(Ta),ka.addListener((()=>{_a.levels.forEach(Ta)}));var Ra=Ia;const Ma=gu;function La(e){return e.originalUrl||e.url}function ja(e,t){for(let n=0;ne.source?e.source:e));t=new RegExp(n.join("|"))}return t}(t.nolog);return(e,i,s)=>{if(e._logging)return s();if(o&&o.test(e.originalUrl))return s();if(n.isLevelEnabled(r)||"auto"===t.level){const o=new Date,{writeHead:s}=i;e._logging=!0,i.writeHead=(e,t)=>{i.writeHead=s,i.writeHead(e,t),i.__statusCode=e,i.__headers=t||{}},i.on("finish",(()=>{i.responseTime=new Date-o,i.statusCode&&"auto"===t.level&&(r=Ma.INFO,i.statusCode>=300&&(r=Ma.WARN),i.statusCode>=400&&(r=Ma.ERROR)),r=function(e,t,n){let r=t;if(n){const t=n.find((t=>{let n=!1;return n=t.from&&t.to?e>=t.from&&e<=t.to:-1!==t.codes.indexOf(e),n}));t&&(r=Ma.getLevel(t.level,r))}return r}(i.statusCode,r,t.statusRules);const s=function(e,t,n){const r=[];return r.push({token:":url",replacement:La(e)}),r.push({token:":protocol",replacement:e.protocol}),r.push({token:":hostname",replacement:e.hostname}),r.push({token:":method",replacement:e.method}),r.push({token:":status",replacement:t.__statusCode||t.statusCode}),r.push({token:":response-time",replacement:t.responseTime}),r.push({token:":date",replacement:(new Date).toUTCString()}),r.push({token:":referrer",replacement:e.headers.referer||e.headers.referrer||""}),r.push({token:":http-version",replacement:`${e.httpVersionMajor}.${e.httpVersionMinor}`}),r.push({token:":remote-addr",replacement:e.headers["x-forwarded-for"]||e.ip||e._remoteAddress||e.socket&&(e.socket.remoteAddress||e.socket.socket&&e.socket.socket.remoteAddress)}),r.push({token:":user-agent",replacement:e.headers["user-agent"]}),r.push({token:":content-length",replacement:t.getHeader("content-length")||t.__headers&&t.__headers["Content-Length"]||"-"}),r.push({token:/:req\[([^\]]+)]/g,replacement:(t,n)=>e.headers[n.toLowerCase()]}),r.push({token:/:res\[([^\]]+)]/g,replacement:(e,n)=>t.getHeader(n.toLowerCase())||t.__headers&&t.__headers[n]}),(e=>{const t=e.concat();for(let e=0;eja(e,s)));t&&n.log(r,t)}else n.log(r,ja(u,s));t.context&&n.removeContext("res")}))}return s()}},nl=Va;let rl=!1;function ul(e){if(!rl)return;Ua("Received log event ",e);Za.appendersForCategory(e.categoryName).forEach((t=>{t(e)}))}function ol(e){rl&&il();let t=e;return"string"==typeof t&&(t=function(e){Ua(`Loading configuration from ${e}`);try{return JSON.parse(Wa.readFileSync(e,"utf8"))}catch(t){throw new Error(`Problem reading config from file "${e}". Error was ${t.message}`,t)}}(e)),Ua(`Configuration is ${t}`),Ka.configure(za(t)),el.onMessage(ul),rl=!0,sl}function il(e){Ua("Shutdown called. Disabling all log writing."),rl=!1;const t=Array.from(Xa.values());Xa.init(),Za.init();const n=t.reduceRight(((e,t)=>t.shutdown?e+1:e),0);if(0===n)return Ua("No appenders with shutdown functions found."),void 0!==e&&e();let r,u=0;function o(t){r=r||t,u+=1,Ua(`Appender shutdowns complete: ${u} / ${n}`),u>=n&&(Ua("All shutdown functions completed."),e&&e(r))}return Ua(`Found ${n} appenders with shutdown functions.`),t.filter((e=>e.shutdown)).forEach((e=>e.shutdown(o))),null}const sl={getLogger:function(e){return rl||ol(process.env.LOG4JS_CONFIG||{appenders:{out:{type:"stdout"}},categories:{default:{appenders:["out"],level:"OFF"}}}),new Qa(e||"default")},configure:ol,shutdown:il,connectLogger:tl,levels:Ya,addLayout:qa.addLayout,recording:function(){return nl}};var cl=sl,al={};Object.defineProperty(al,"__esModule",{value:!0}),al.levelMap=al.getLevel=al.setCategoriesLevel=al.getConfiguration=al.setConfiguration=void 0;const ll=cl;let fl={appenders:{debug:{type:"stdout",layout:{type:"pattern",pattern:"[%d] > hvigor %p %c %[%m%]"}},info:{type:"stdout",layout:{type:"pattern",pattern:"[%d] > hvigor %[%m%]"}},"no-pattern-info":{type:"stdout",layout:{type:"pattern",pattern:"%m"}},wrong:{type:"stderr",layout:{type:"pattern",pattern:"[%d] > hvigor %[%p: %m%]"}},"just-debug":{type:"logLevelFilter",appender:"debug",level:"debug",maxLevel:"debug"},"just-info":{type:"logLevelFilter",appender:"info",level:"info",maxLevel:"info"},"just-wrong":{type:"logLevelFilter",appender:"wrong",level:"warn",maxLevel:"error"}},categories:{default:{appenders:["just-debug","just-info","just-wrong"],level:"debug"},"no-pattern-info":{appenders:["no-pattern-info"],level:"info"}}};al.setConfiguration=e=>{fl=e};al.getConfiguration=()=>fl;let dl=ll.levels.DEBUG;al.setCategoriesLevel=(e,t)=>{dl=e;const n=fl.categories;for(const r in n)(null==t?void 0:t.includes(r))||Object.prototype.hasOwnProperty.call(n,r)&&(n[r].level=e.levelStr)};al.getLevel=()=>dl,al.levelMap=new Map([["ALL",ll.levels.ALL],["MARK",ll.levels.MARK],["TRACE",ll.levels.TRACE],["DEBUG",ll.levels.DEBUG],["INFO",ll.levels.INFO],["WARN",ll.levels.WARN],["ERROR",ll.levels.ERROR],["FATAL",ll.levels.FATAL],["OFF",ll.levels.OFF]]);var Dl=w&&w.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),pl=w&&w.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),El=w&&w.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&Dl(t,e,n);return pl(t,e),t};Object.defineProperty(xr,"__esModule",{value:!0}),xr.evaluateLogLevel=xr.HvigorLogger=void 0;const ml=El(cl),hl=cl,yl=El(F.default),Cl=al;class Fl{constructor(e){ml.configure((0,Cl.getConfiguration)()),this._logger=ml.getLogger(e),this._logger.level=(0,Cl.getLevel)()}static getLogger(e){return new Fl(e)}log(e,...t){this._logger.log(e,...t)}debug(e,...t){this._logger.debug(e,...t)}info(e,...t){this._logger.info(e,...t)}warn(e,...t){void 0!==e&&""!==e&&this._logger.warn(e,...t)}error(e,...t){this._logger.error(e,...t)}_printTaskExecuteInfo(e,t){this.info(`Finished :${e}... after ${t}`)}_printFailedTaskInfo(e){this.error(`Failed :${e}... `)}_printDisabledTaskInfo(e){this.info(`Disabled :${e}... `)}_printUpToDateTaskInfo(e){this.info(`UP-TO-DATE :${e}... `)}errorMessageExit(e,...t){throw new Error(yl.format(e,...t))}errorExit(e,t,...n){t&&this._logger.error(t,n),this._logger.error(e.stack)}setLevel(e,t){(0,Cl.setCategoriesLevel)(e,t),ml.shutdown(),ml.configure((0,Cl.getConfiguration)())}getLevel(){return this._logger.level}configure(e){const t=(0,Cl.getConfiguration)(),n={appenders:{...t.appenders,...e.appenders},categories:{...t.categories,...e.categories}};(0,Cl.setConfiguration)(n),ml.shutdown(),ml.configure(n)}}xr.HvigorLogger=Fl,xr.evaluateLogLevel=function(e,t){t.debug?e.setLevel(hl.levels.DEBUG):t.warn?e.setLevel(hl.levels.WARN):t.error?e.setLevel(hl.levels.ERROR):e.setLevel(hl.levels.INFO)};var gl=w&&w.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(X,"__esModule",{value:!0}),X.parseJsonText=X.parseJsonFile=void 0;const Al=Z,vl=gl(kr),Sl=gl(p.default),wl=gl(E.default),Ol=xr.HvigorLogger.getLogger("parse-json-util");var bl;!function(e){e[e.Char=0]="Char",e[e.EOF=1]="EOF",e[e.Identifier=2]="Identifier"}(bl||(bl={}));let _l,Bl,Pl,kl,xl,Nl,Il="start",Tl=[],Rl=0,Ml=1,Ll=0,jl=!1,$l="default",Hl="'",Jl=1;function Gl(e,t=!1){Bl=String(e),Il="start",Tl=[],Rl=0,Ml=1,Ll=0,kl=void 0,jl=t;do{_l=Vl(),Xl[Il]()}while("eof"!==_l.type);return kl}function Vl(){for($l="default",xl="",Hl="'",Jl=1;;){Nl=Ul();const e=zl[$l]();if(e)return e}}function Ul(){if(Bl[Rl])return String.fromCodePoint(Bl.codePointAt(Rl))}function Wl(){const e=Ul();return"\n"===e?(Ml++,Ll=0):e?Ll+=e.length:Ll++,e&&(Rl+=e.length),e}X.parseJsonFile=function(e,t=!1,n="utf-8"){const r=vl.default.readFileSync(Sl.default.resolve(e),{encoding:n});try{return Gl(r,t)}catch(t){if(t instanceof SyntaxError){const n=t.message.split("at");2===n.length&&Ol.errorMessageExit(`${n[0].trim()}${wl.default.EOL}\t at ${e}:${n[1].trim()}`)}Ol.errorMessageExit(`${e} is not in valid JSON/JSON5 format.`)}},X.parseJsonText=Gl;const zl={default(){switch(Nl){case"/":return Wl(),void($l="comment");case void 0:return Wl(),Kl("eof")}if(!Al.JudgeUtil.isIgnoreChar(Nl)&&!Al.JudgeUtil.isSpaceSeparator(Nl))return zl[Il]();Wl()},start(){$l="value"},beforePropertyName(){switch(Nl){case"$":case"_":return xl=Wl(),void($l="identifierName");case"\\":return Wl(),void($l="identifierNameStartEscape");case"}":return Kl("punctuator",Wl());case'"':case"'":return Hl=Nl,Wl(),void($l="string")}if(Al.JudgeUtil.isIdStartChar(Nl))return xl+=Wl(),void($l="identifierName");throw tf(bl.Char,Wl())},afterPropertyName(){if(":"===Nl)return Kl("punctuator",Wl());throw tf(bl.Char,Wl())},beforePropertyValue(){$l="value"},afterPropertyValue(){switch(Nl){case",":case"}":return Kl("punctuator",Wl())}throw tf(bl.Char,Wl())},beforeArrayValue(){if("]"===Nl)return Kl("punctuator",Wl());$l="value"},afterArrayValue(){switch(Nl){case",":case"]":return Kl("punctuator",Wl())}throw tf(bl.Char,Wl())},end(){throw tf(bl.Char,Wl())},comment(){switch(Nl){case"*":return Wl(),void($l="multiLineComment");case"/":return Wl(),void($l="singleLineComment")}throw tf(bl.Char,Wl())},multiLineComment(){switch(Nl){case"*":return Wl(),void($l="multiLineCommentAsterisk");case void 0:throw tf(bl.Char,Wl())}Wl()},multiLineCommentAsterisk(){switch(Nl){case"*":return void Wl();case"/":return Wl(),void($l="default");case void 0:throw tf(bl.Char,Wl())}Wl(),$l="multiLineComment"},singleLineComment(){switch(Nl){case"\n":case"\r":case"\u2028":case"\u2029":return Wl(),void($l="default");case void 0:return Wl(),Kl("eof")}Wl()},value(){switch(Nl){case"{":case"[":return Kl("punctuator",Wl());case"n":return Wl(),ql("ull"),Kl("null",null);case"t":return Wl(),ql("rue"),Kl("boolean",!0);case"f":return Wl(),ql("alse"),Kl("boolean",!1);case"-":case"+":return"-"===Wl()&&(Jl=-1),void($l="numerical");case".":case"0":case"I":case"N":return void($l="numerical");case'"':case"'":return Hl=Nl,Wl(),xl="",void($l="string")}if(void 0===Nl||!Al.JudgeUtil.isDigitWithoutZero(Nl))throw tf(bl.Char,Wl());$l="numerical"},numerical(){switch(Nl){case".":return xl=Wl(),void($l="decimalPointLeading");case"0":return xl=Wl(),void($l="zero");case"I":return Wl(),ql("nfinity"),Kl("numeric",Jl*(1/0));case"N":return Wl(),ql("aN"),Kl("numeric",NaN)}if(void 0!==Nl&&Al.JudgeUtil.isDigitWithoutZero(Nl))return xl=Wl(),void($l="decimalInteger");throw tf(bl.Char,Wl())},zero(){switch(Nl){case".":case"e":case"E":return void($l="decimal");case"x":case"X":return xl+=Wl(),void($l="hexadecimal")}return Kl("numeric",0)},decimalInteger(){switch(Nl){case".":case"e":case"E":return void($l="decimal")}if(!Al.JudgeUtil.isDigit(Nl))return Kl("numeric",Jl*Number(xl));xl+=Wl()},decimal(){switch(Nl){case".":xl+=Wl(),$l="decimalFraction";break;case"e":case"E":xl+=Wl(),$l="decimalExponent"}},decimalPointLeading(){if(Al.JudgeUtil.isDigit(Nl))return xl+=Wl(),void($l="decimalFraction");throw tf(bl.Char,Wl())},decimalFraction(){switch(Nl){case"e":case"E":return xl+=Wl(),void($l="decimalExponent")}if(!Al.JudgeUtil.isDigit(Nl))return Kl("numeric",Jl*Number(xl));xl+=Wl()},decimalExponent(){switch(Nl){case"+":case"-":return xl+=Wl(),void($l="decimalExponentSign")}if(Al.JudgeUtil.isDigit(Nl))return xl+=Wl(),void($l="decimalExponentInteger");throw tf(bl.Char,Wl())},decimalExponentSign(){if(Al.JudgeUtil.isDigit(Nl))return xl+=Wl(),void($l="decimalExponentInteger");throw tf(bl.Char,Wl())},decimalExponentInteger(){if(!Al.JudgeUtil.isDigit(Nl))return Kl("numeric",Jl*Number(xl));xl+=Wl()},hexadecimal(){if(Al.JudgeUtil.isHexDigit(Nl))return xl+=Wl(),void($l="hexadecimalInteger");throw tf(bl.Char,Wl())},hexadecimalInteger(){if(!Al.JudgeUtil.isHexDigit(Nl))return Kl("numeric",Jl*Number(xl));xl+=Wl()},identifierNameStartEscape(){if("u"!==Nl)throw tf(bl.Char,Wl());Wl();const e=Yl();switch(e){case"$":case"_":break;default:if(!Al.JudgeUtil.isIdStartChar(e))throw tf(bl.Identifier)}xl+=e,$l="identifierName"},identifierName(){switch(Nl){case"$":case"_":case"‌":case"‍":return void(xl+=Wl());case"\\":return Wl(),void($l="identifierNameEscape")}if(!Al.JudgeUtil.isIdContinueChar(Nl))return Kl("identifier",xl);xl+=Wl()},identifierNameEscape(){if("u"!==Nl)throw tf(bl.Char,Wl());Wl();const e=Yl();switch(e){case"$":case"_":case"‌":case"‍":break;default:if(!Al.JudgeUtil.isIdContinueChar(e))throw tf(bl.Identifier)}xl+=e,$l="identifierName"},string(){switch(Nl){case"\\":return Wl(),void(xl+=function(){const e=Ul(),t=function(){switch(Ul()){case"b":return Wl(),"\b";case"f":return Wl(),"\f";case"n":return Wl(),"\n";case"r":return Wl(),"\r";case"t":return Wl(),"\t";case"v":return Wl(),"\v"}return}();if(t)return t;switch(e){case"0":if(Wl(),Al.JudgeUtil.isDigit(Ul()))throw tf(bl.Char,Wl());return"\0";case"x":return Wl(),function(){let e="",t=Ul();if(!Al.JudgeUtil.isHexDigit(t))throw tf(bl.Char,Wl());if(e+=Wl(),t=Ul(),!Al.JudgeUtil.isHexDigit(t))throw tf(bl.Char,Wl());return e+=Wl(),String.fromCodePoint(parseInt(e,16))}();case"u":return Wl(),Yl();case"\n":case"\u2028":case"\u2029":return Wl(),"";case"\r":return Wl(),"\n"===Ul()&&Wl(),""}if(void 0===e||Al.JudgeUtil.isDigitWithoutZero(e))throw tf(bl.Char,Wl());return Wl()}());case'"':case"'":if(Nl===Hl){const e=Kl("string",xl);return Wl(),e}return void(xl+=Wl());case"\n":case"\r":case void 0:throw tf(bl.Char,Wl());case"\u2028":case"\u2029":!function(e){Ol.warn(`JSON5: '${ef(e)}' in strings is not valid ECMAScript; consider escaping.`)}(Nl)}xl+=Wl()}};function Kl(e,t){return{type:e,value:t,line:Ml,column:Ll}}function ql(e){for(const t of e){if(Ul()!==t)throw tf(bl.Char,Wl());Wl()}}function Yl(){let e="",t=4;for(;t-- >0;){const t=Ul();if(!Al.JudgeUtil.isHexDigit(t))throw tf(bl.Char,Wl());e+=Wl()}return String.fromCodePoint(parseInt(e,16))}const Xl={start(){if("eof"===_l.type)throw tf(bl.EOF);Zl()},beforePropertyName(){switch(_l.type){case"identifier":case"string":return Pl=_l.value,void(Il="afterPropertyName");case"punctuator":return void Ql();case"eof":throw tf(bl.EOF)}},afterPropertyName(){if("eof"===_l.type)throw tf(bl.EOF);Il="beforePropertyValue"},beforePropertyValue(){if("eof"===_l.type)throw tf(bl.EOF);Zl()},afterPropertyValue(){if("eof"===_l.type)throw tf(bl.EOF);switch(_l.value){case",":return void(Il="beforePropertyName");case"}":Ql()}},beforeArrayValue(){if("eof"===_l.type)throw tf(bl.EOF);"punctuator"!==_l.type||"]"!==_l.value?Zl():Ql()},afterArrayValue(){if("eof"===_l.type)throw tf(bl.EOF);switch(_l.value){case",":return void(Il="beforeArrayValue");case"]":Ql()}},end(){}};function Zl(){const e=function(){let e;switch(_l.type){case"punctuator":switch(_l.value){case"{":e={};break;case"[":e=[]}break;case"null":case"boolean":case"numeric":case"string":e=_l.value}return e}();if(jl&&"object"==typeof e&&(e._line=Ml,e._column=Ll),void 0===kl)kl=e;else{const t=Tl[Tl.length-1];Array.isArray(t)?jl&&"object"!=typeof e?t.push({value:e,_line:Ml,_column:Ll}):t.push(e):t[Pl]=jl&&"object"!=typeof e?{value:e,_line:Ml,_column:Ll}:e}!function(e){if(e&&"object"==typeof e)Tl.push(e),Il=Array.isArray(e)?"beforeArrayValue":"beforePropertyName";else{const e=Tl[Tl.length-1];Il=e?Array.isArray(e)?"afterArrayValue":"afterPropertyValue":"end"}}(e)}function Ql(){Tl.pop();const e=Tl[Tl.length-1];Il=e?Array.isArray(e)?"afterArrayValue":"afterPropertyValue":"end"}function ef(e){const t={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(t[e])return t[e];if(e<" "){const t=e.charCodeAt(0).toString(16);return`\\x${`00${t}`.substring(t.length)}`}return e}function tf(e,t){let n="";switch(e){case bl.Char:n=void 0===t?`JSON5: invalid end of input at ${Ml}:${Ll}`:`JSON5: invalid character '${ef(t)}' at ${Ml}:${Ll}`;break;case bl.EOF:n=`JSON5: invalid end of input at ${Ml}:${Ll}`;break;case bl.Identifier:Ll-=5,n=`JSON5: invalid identifier character at ${Ml}:${Ll}`}const r=new nf(n);return r.lineNumber=Ml,r.columnNumber=Ll,r}class nf extends SyntaxError{}var rf=w&&w.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),uf=w&&w.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),of=w&&w.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&rf(t,e,n);return uf(t,e),t};Object.defineProperty(Y,"__esModule",{value:!0});var sf=Y.cleanWorkSpace=Ff=Y.executeInstallHvigor=yf=Y.isHvigorInstalled=mf=Y.isAllDependenciesInstalled=void 0;const cf=of(D.default),af=of(p.default),lf=b,ff=j,df=$,Df=X;let pf,Ef;var mf=Y.isAllDependenciesInstalled=function(){function e(e){const t=null==e?void 0:e.dependencies;return void 0===t?0:Object.getOwnPropertyNames(t).length}if(pf=gf(),Ef=Af(),e(pf)+1!==e(Ef))return!1;for(const e in null==pf?void 0:pf.dependencies)if(!(0,ff.hasNpmPackInPaths)(e,[lf.HVIGOR_PROJECT_DEPENDENCIES_HOME])||!hf(e,pf,Ef))return!1;return!0};function hf(e,t,n){return void 0!==n.dependencies&&(0,ff.offlinePluginConversion)(lf.HVIGOR_PROJECT_ROOT_DIR,t.dependencies[e])===n.dependencies[e]}var yf=Y.isHvigorInstalled=function(){return pf=gf(),Ef=Af(),(0,ff.hasNpmPackInPaths)(lf.HVIGOR_ENGINE_PACKAGE_NAME,[lf.HVIGOR_PROJECT_DEPENDENCIES_HOME])&&(0,ff.offlinePluginConversion)(lf.HVIGOR_PROJECT_ROOT_DIR,pf.hvigorVersion)===Ef.dependencies[lf.HVIGOR_ENGINE_PACKAGE_NAME]};const Cf={cwd:lf.HVIGOR_PROJECT_DEPENDENCIES_HOME,stdio:["inherit","inherit","inherit"]};var Ff=Y.executeInstallHvigor=function(){(0,df.logInfoPrintConsole)("Hvigor installing...");const e={dependencies:{}};e.dependencies[lf.HVIGOR_ENGINE_PACKAGE_NAME]=(0,ff.offlinePluginConversion)(lf.HVIGOR_PROJECT_ROOT_DIR,pf.hvigorVersion);try{cf.mkdirSync(lf.HVIGOR_PROJECT_DEPENDENCIES_HOME,{recursive:!0});const t=af.resolve(lf.HVIGOR_PROJECT_DEPENDENCIES_HOME,lf.DEFAULT_PACKAGE_JSON);cf.writeFileSync(t,JSON.stringify(e))}catch(e){(0,df.logErrorAndExit)(e)}!function(){const e=["config","set","store-dir",lf.HVIGOR_PNPM_STORE_PATH];(0,ff.executeCommand)(lf.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,e,Cf)}(),(0,ff.executeCommand)(lf.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,["install"],Cf)};function gf(){const e=af.resolve(lf.HVIGOR_PROJECT_WRAPPER_HOME,lf.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME);return cf.existsSync(e)||(0,df.logErrorAndExit)(`Error: Hvigor config file ${e} does not exist.`),(0,Df.parseJsonFile)(e)}function Af(){return cf.existsSync(lf.HVIGOR_PROJECT_DEPENDENCY_PACKAGE_JSON_PATH)?(0,Df.parseJsonFile)(lf.HVIGOR_PROJECT_DEPENDENCY_PACKAGE_JSON_PATH):{dependencies:{}}}sf=Y.cleanWorkSpace=function(){if((0,df.logInfoPrintConsole)("Hvigor cleaning..."),!cf.existsSync(lf.HVIGOR_PROJECT_DEPENDENCIES_HOME))return;const e=cf.readdirSync(lf.HVIGOR_PROJECT_DEPENDENCIES_HOME);if(e&&0!==e.length){cf.existsSync(lf.HVIGOR_BOOT_JS_FILE_PATH)&&(0,ff.executeCommand)(process.argv[0],[lf.HVIGOR_BOOT_JS_FILE_PATH,"--stop-daemon"],{});try{e.forEach((e=>{cf.rmSync(af.resolve(lf.HVIGOR_PROJECT_DEPENDENCIES_HOME,e),{recursive:!0})}))}catch(e){(0,df.logErrorAndExit)(`The hvigor build tool cannot be installed. Please manually clear the workspace directory and synchronize the project again.\n\n Workspace Path: ${lf.HVIGOR_PROJECT_DEPENDENCIES_HOME}.`)}}};var vf={},Sf=w&&w.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),wf=w&&w.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),Of=w&&w.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&Sf(t,e,n);return wf(t,e),t};Object.defineProperty(vf,"__esModule",{value:!0});var bf=vf.executeBuild=void 0;const _f=b,Bf=Of(D.default),Pf=Of(p.default),kf=$;bf=vf.executeBuild=function(){const e=Pf.resolve(_f.HVIGOR_PROJECT_DEPENDENCIES_HOME,"node_modules","@ohos","hvigor","bin","hvigor.js");try{const t=Bf.realpathSync(e);require(t)}catch(t){(0,kf.logErrorAndExit)(`Error: ENOENT: no such file ${e},delete ${_f.HVIGOR_PROJECT_DEPENDENCIES_HOME} and retry.`)}},function(){if(O.checkNpmConifg(),O.environmentHandler(),O.isPnpmAvailable()||O.executeInstallPnpm(),yf()&&mf())bf();else{sf();try{Ff()}catch(e){return void sf()}bf()}}(); \ No newline at end of file diff --git a/hvigorw b/hvigorw deleted file mode 100644 index 54aadd226b453397860013d328fd01031648fc31..0000000000000000000000000000000000000000 --- a/hvigorw +++ /dev/null @@ -1,48 +0,0 @@ -#!/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=$(dirname $(readlink -f $0)) -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/hvigorw.bat b/hvigorw.bat deleted file mode 100644 index 29196b4d4e82f370133574d33636bdf9c7440a0b..0000000000000000000000000000000000000000 --- a/hvigorw.bat +++ /dev/null @@ -1,57 +0,0 @@ -@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% %* - -:fail -exit /b 1 diff --git a/oh-package.json5 b/oh-package.json5 index fdde029660e483a83637b99c3e87dc613550553e..2675be410f767c8a010b2db90265ffaddced668b 100644 --- a/oh-package.json5 +++ b/oh-package.json5 @@ -1,4 +1,20 @@ +/* + * Copyright (c) 2022-2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + { + "modelVersion": "5.0.2", "license": "ISC", "devDependencies": { "@ohos/hypium": "1.0.6" @@ -8,4 +24,4 @@ "repository": {}, "version": "1.0.0", "dependencies": {} -} +} \ No newline at end of file diff --git a/product/default/.gitignore b/product/default/.gitignore index a5c564ae6da6b5e2336628d9f9e2155bddfc399d..725ae7072d7e7c2ab5b266c3012221ada16e2552 100644 --- a/product/default/.gitignore +++ b/product/default/.gitignore @@ -1,4 +1,5 @@ /node_modules +/oh_modules /.preview /build /package.json \ No newline at end of file diff --git a/product/default/src/main/ets/MainAbility/MainAbility.ts b/product/default/src/main/ets/MainAbility/MainAbility.ts index b990e3e48dce89f37df28884225b6ebe384044aa..46317751e236fff55320bf7eb02cb923da7d6e65 100644 --- a/product/default/src/main/ets/MainAbility/MainAbility.ts +++ b/product/default/src/main/ets/MainAbility/MainAbility.ts @@ -15,210 +15,231 @@ import UIAbility from '@ohos.app.ability.UIAbility'; import deviceInfo from '@ohos.deviceInfo'; -import AbilityConstant from '@ohos.app.ability.AbilityConstant' -import fileio from '@ohos.fileio' +import AbilityConstant from '@ohos.app.ability.AbilityConstant'; +import fileio from '@ohos.fileio'; import inputMethod from '@ohos.inputMethod'; -import { LogUtil } from '@ohos/utils/src/main/ets/default/baseUtil/LogUtil' +import { LogUtil } from '@ohos/utils/src/main/ets/default/baseUtil/LogUtil'; import display from '@ohos.display'; import window from '@ohos.window'; import util from '@ohos.util'; +import common from '@ohos.app.ability.common'; +import relationalStore from '@ohos.data.relationalStore'; -globalThis.rdbStore = undefined +AppStorage.SetOrCreate('rdbStore', undefined); export default class MainAbility extends UIAbility { - private Tag = "MainAbility_Tablet" - - onCreate(want, launchParam) { - AppStorage.SetOrCreate('context', this.context) - // @ts-ignore - LogUtil.info(this.Tag, " onCreate, launchReason is " + launchParam.launchReason + ", deviceType" + deviceInfo.deviceType) - if (deviceInfo.deviceType === 'phone' || deviceInfo.deviceType === 'default') { - AppStorage.SetOrCreate('Expand', false) - AppStorage.SetOrCreate('Choose', true) - } - if (launchParam.launchReason == AbilityConstant.LaunchReason.CONTINUATION) { - // 设置迁移标记 - AppStorage.SetOrCreate('IsContinue', true) - // 获取对端的迁移数据 - let Search: boolean = want.parameters["Search"] - let continueNote: string = want.parameters["ContinueNote"] - let continueSection: number = want.parameters["ContinueSection"] - let scrollTopPercent: number = want.parameters["ScrollTopPercent"] - let isFocusOnSearch: boolean = want.parameters["isFocusOnSearch"] - LogUtil.info(this.Tag, " continueSection : " + continueSection) - AppStorage.SetOrCreate('Search', Search) - AppStorage.SetOrCreate('ContinueNote', continueNote) - AppStorage.SetOrCreate('ContinueSection', continueSection) - // 使用新的key保存数据,防止迁移过来的数据在使用前被本地操作覆盖 - AppStorage.SetOrCreate('remoteScrollTopPercent', scrollTopPercent) - AppStorage.SetOrCreate('isRemoteFocusOnSearch', isFocusOnSearch) - // 来自手机的迁移 - let continueChoose: boolean = want.parameters["ContinueChoose"] - if (continueChoose) { - LogUtil.info(this.Tag, " continue from phone") - AppStorage.SetOrCreate('ContinueFromPhone', true) - } else { - AppStorage.SetOrCreate('ContinueFromTablet', true) - LogUtil.info(this.Tag, " continue from tablet") - } - this.context.restoreWindowStage(null) - } - globalThis.noteContext = this.context - } + private Tag = 'MainAbility_Tablet'; + + onCreate(want, launchParam) { - onDestroy() { - LogUtil.info(this.Tag, " onDestroy") + AppStorage.SetOrCreate('context', this.context); + LogUtil.info(this.Tag, " onCreate, launchReason is " + launchParam.launchReason + ", deviceType" + deviceInfo.deviceType); + if (deviceInfo.deviceType === 'phone' || deviceInfo.deviceType === 'default') { + AppStorage.SetOrCreate('Expand', false); + AppStorage.SetOrCreate('Choose', true); } + if (launchParam.launchReason == AbilityConstant.LaunchReason.CONTINUATION) { + // 设置迁移标记 + AppStorage.SetOrCreate('IsContinue', true); + // 获取对端的迁移数据 + let Search: boolean = want.parameters["Search"]; + let continueNote: string = want.parameters["ContinueNote"]; + let continueSection: number = want.parameters["ContinueSection"]; + let scrollTopPercent: number = want.parameters["ScrollTopPercent"]; + let isFocusOnSearch: boolean = want.parameters["isFocusOnSearch"]; + LogUtil.info(this.Tag, " continueSection : " + continueSection); + AppStorage.SetOrCreate('Search', Search); + AppStorage.SetOrCreate('ContinueNote', continueNote); + AppStorage.SetOrCreate('ContinueSection', continueSection); + // 使用新的key保存数据,防止迁移过来的数据在使用前被本地操作覆盖 + AppStorage.SetOrCreate('remoteScrollTopPercent', scrollTopPercent); + AppStorage.SetOrCreate('isRemoteFocusOnSearch', isFocusOnSearch); + // 来自手机的迁移 + let continueChoose: boolean = want.parameters["ContinueChoose"]; + if (continueChoose) { + LogUtil.info(this.Tag, " continue from phone"); + AppStorage.SetOrCreate('ContinueFromPhone', true); + } else { + AppStorage.SetOrCreate('ContinueFromTablet', true); + LogUtil.error(this.Tag, " continue from tablet"); + } + this.context.restoreWindowStage(null); + } + AppStorage.SetOrCreate('noteContext', this.context); - onWindowStageCreate(windowStage) { - windowStage.getMainWindow((err, data) => { - let windowClass = data - try { - windowClass.on('windowSizeChange', (data) => { - this.screenBreakPoints(data.width) - }) - } catch (exception) { - LogUtil.info(this.Tag, 'windowSizeChange fail') - } - }) - window.getLastWindow(this.context, (err, data) => { - if (data && data.getWindowProperties()) { - let windowWidth = data.getWindowProperties().windowRect.width - LogUtil.info(this.Tag, " getLastWindow:" + windowWidth) - this.screenBreakPoints(windowWidth) - } else { - LogUtil.info(this.Tag, "getWindowProperties error:" + JSON.stringify(err)) - } + } + + onDestroy() { + LogUtil.info(this.Tag, " onDestroy"); + } + + onWindowStageCreate(windowStage) { + windowStage.getMainWindow((err, data) => { + let windowClass = data; + try { + windowClass.on('windowSizeChange', (data) => { + this.screenBreakPoints(data.width); }) - LogUtil.info(this.Tag, " onWindowStageCreate") - windowStage.setUIContent(this.context, "pages/MyNoteHome", null) + // 窗口规避区域 + windowClass.on('avoidAreaChange', ({ type, area }) => { + if (type === window.AvoidAreaType.TYPE_SYSTEM) { + AppStorage.setOrCreate('topHeight', area.topRect.height); + AppStorage.setOrCreate('topWidth', area.topRect.width); + } + }); + windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM); + // 设置主窗口沉浸式 + windowClass.setWindowLayoutFullScreen(true); + // 设置主窗口导航栏、状态栏、文字颜色等属性 + const sysBarProps: window.SystemBarProperties = { + statusBarColor: "#ffffff", + navigationBarColor: '#ffffff', + statusBarContentColor: '#000000', + navigationBarContentColor: '#000000' + }; + // 加载状态变量 + windowClass.setWindowSystemBarProperties(sysBarProps); + } catch (exception) { + LogUtil.error(this.Tag, 'windowSizeChange fail'); + } + }) + window.getLastWindow(this.context, (err, data) => { + if (data && data.getWindowProperties()) { + let windowWidth = data.getWindowProperties().windowRect.width; + LogUtil.info(this.Tag, " getLastWindow:" + windowWidth); + this.screenBreakPoints(windowWidth); + } else { + LogUtil.error(this.Tag, "getWindowProperties error:" + JSON.stringify(err)); + } + }) + LogUtil.info(this.Tag, " onWindowStageCreate"); + windowStage.setUIContent(this.context, "pages/MyNoteHome", null); + } + + onWindowStageDestroy() { + LogUtil.info(this.Tag, " onWindowStageDestroy"); + } + + onForeground() { + LogUtil.info(this.Tag, " onForeground"); + } + + onBackground() { + LogUtil.info(this.Tag, " onBackground"); + // 退出键盘 + inputMethod.getController().stopInputSession(); + } + + onContinue(wantParam: { [key: string]: any }) { + LogUtil.info(this.Tag, " onContinue"); + // 获取本端的迁移数据 + let Search = AppStorage.Get('Search'); + let continueNote = AppStorage.Get('ContinueNote'); + if (continueNote == undefined || continueNote == null) { + LogUtil.info(this.Tag, " onContinue, continueNote is error, default [0]"); + continueNote = JSON.stringify(AppStorage.Get('AllNoteArray')[0].toNoteObject()); } - onWindowStageDestroy() { - LogUtil.info(this.Tag, " onWindowStageDestroy") + let continueSection = AppStorage.Get('ContinueSection'); + if (continueSection == undefined || continueSection == null) { + LogUtil.info(this.Tag, " onContinue, continueSection is error, default 3"); + continueSection = 3; } + LogUtil.info(this.Tag, " onContinue, continueSection : " + continueSection); - onForeground() { - LogUtil.info(this.Tag, " onForeground") + let scrollTopPercent = AppStorage.Get('ScrollTopPercent'); + if (scrollTopPercent == undefined || scrollTopPercent == null) { + LogUtil.info(this.Tag, " onContinue, scrollTopPercent is error, default 0"); + scrollTopPercent = 0; } - onBackground() { - LogUtil.info(this.Tag, " onBackground") - // 退出键盘 - // @ts-ignore - inputMethod.getController().stopInputSession(); + let isFocusOnSearch = AppStorage.Get('isFocusOnSearch'); + if (isFocusOnSearch == undefined || isFocusOnSearch == null) { + LogUtil.info(this.Tag, " onContinue, isFocusOnSearch is error, default true"); + isFocusOnSearch = true; } - onContinue(wantParam: { [key: string]: any }) { - LogUtil.info(this.Tag, " onContinue") - // 获取本端的迁移数据 - let Search = AppStorage.Get('Search') - let continueNote = AppStorage.Get('ContinueNote') - if (continueNote == undefined || continueNote == null) { - LogUtil.info(this.Tag, " onContinue, continueNote is error, default [0]") - continueNote = JSON.stringify(AppStorage.Get('AllNoteArray')[0].toNoteObject()) - } - - let continueSection = AppStorage.Get('ContinueSection') - if (continueSection == undefined || continueSection == null) { - LogUtil.info(this.Tag, " onContinue, continueSection is error, default 3") - continueSection = 3 - } - LogUtil.info(this.Tag, " onContinue, continueSection : " + continueSection) - - let scrollTopPercent = AppStorage.Get('ScrollTopPercent') - if (scrollTopPercent == undefined || scrollTopPercent == null) { - LogUtil.info(this.Tag, " onContinue, scrollTopPercent is error, default 0") - scrollTopPercent = 0 - } - - let isFocusOnSearch = AppStorage.Get('isFocusOnSearch') - if (isFocusOnSearch == undefined || isFocusOnSearch == null) { - LogUtil.info(this.Tag, " onContinue, isFocusOnSearch is error, default true") - isFocusOnSearch = true - } - - // 保存本端的迁移数据 - wantParam["Search"] = Search - wantParam["ContinueNote"] = continueNote - wantParam["ContinueSection"] = continueSection - wantParam["ScrollTopPercent"] = scrollTopPercent - wantParam["isFocusOnSearch"] = isFocusOnSearch - if (deviceInfo.deviceType === 'phone' || deviceInfo.deviceType === 'default') { - wantParam["ContinueChoose"] = true - } - - // save img to DisFileDir - LogUtil.info(this.Tag, " onContinue, save img to DisFileDir") - let continueNoteObj = JSON.parse(continueNote) - let srcArray = this.getSrcFromHtml(continueNoteObj.content_text) - srcArray.forEach((src: string) => { - let lastIndex = src.lastIndexOf('/') - if (lastIndex != -1) { - let imgName = src.substring(lastIndex + 1) - this.writeToDisFileDir(imgName) - } - }) - LogUtil.info(this.Tag, " onContinue end") - return AbilityConstant.OnContinueResult.AGREE + // 保存本端的迁移数据 + wantParam["Search"] = Search; + wantParam["ContinueNote"] = continueNote; + wantParam["ContinueSection"] = continueSection; + wantParam["ScrollTopPercent"] = scrollTopPercent; + wantParam["isFocusOnSearch"] = isFocusOnSearch; + if (deviceInfo.deviceType === 'phone' || deviceInfo.deviceType === 'default') { + wantParam["ContinueChoose"] = true; } - getSrcFromHtml(html: string): any { - let srcArray = [] - if (html == undefined || html == null || html == "") { - return srcArray - } - let base64regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/ - let realHtml - if (base64regex.test(html)) { - let base64 = new util.Base64Helper - realHtml = base64.decodeSync(html).toString() - } else { - realHtml = html; - } - let imgReg = /]+>/g - let srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i - let imgArray = realHtml.match(imgReg) - if (imgArray != null) { - for (let i = 0; i < imgArray.length; i++) { - let src = imgArray[i].match(srcReg) - if (src != null && src.length > 1) { - LogUtil.info(this.Tag, " getSrcFromHtml, src[1] : " + src[1]) - srcArray.push(src[1]) - } - } - } - return srcArray + // save img to DisFileDir + LogUtil.info(this.Tag, " onContinue, save img to DisFileDir"); + let continueNoteObj = JSON.parse(continueNote); + let srcArray = this.getSrcFromHtml(continueNoteObj.content_text); + srcArray.forEach((src: string) => { + let lastIndex = src.lastIndexOf('/'); + if (lastIndex != -1) { + let imgName = src.substring(lastIndex + 1); + this.writeToDisFileDir(imgName); + } + }) + LogUtil.info(this.Tag, " onContinue end"); + return AbilityConstant.OnContinueResult.AGREE; + } + + getSrcFromHtml(html: string): any { + let srcArray = []; + if (html == undefined || html == null || html == "") { + return srcArray; } - - writeToDisFileDir(fileName: string) { - LogUtil.info(this.Tag, " writeToDisFileDir, fileName : " + fileName) - let filesDir = this.context.filesDir - let srcPath = filesDir + "/" + fileName - let distributedFilesDir = this.context.distributedFilesDir - let desPath = distributedFilesDir + "/" + fileName - try { - fileio.copyFileSync(srcPath, desPath) - LogUtil.info(this.Tag, " onContinue, writeToDisFileDir, copyFile successfully" + desPath + " " + srcPath) - } catch (err) { - LogUtil.warn(this.Tag, " onContinue, writeToDisFileDir, copyFile failed : " + err) - } + let base64regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/; + let realHtml; + if (base64regex.test(html)) { + let base64 = new util.Base64Helper; + realHtml = base64.decodeSync(html).toString(); + } else { + realHtml = html; } - - screenBreakPoints(data) { - let displayClass = null - let screenDpi = null - displayClass = display.getDefaultDisplaySync() - screenDpi = displayClass.densityDPI - AppStorage.SetOrCreate('dpi', screenDpi) - let windowWidth = data / (screenDpi / 160) - LogUtil.debug(this.Tag, " screenBreakPoints windowWidth: " + windowWidth) - if (windowWidth >= 320 && windowWidth < 520 || windowWidth < 320) { - AppStorage.SetOrCreate('breakPoint', 'sm') - } else if (windowWidth >= 520 && windowWidth < 840) { - AppStorage.SetOrCreate('breakPoint', 'md') - } else if (windowWidth >= 840) { - AppStorage.SetOrCreate('breakPoint', 'lg') + let imgReg = /]+>/g; + let srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i; + let imgArray = realHtml.match(imgReg); + if (imgArray != null) { + for (let i = 0; i < imgArray.length; i++) { + let src = imgArray[i].match(srcReg); + if (src != null && src.length > 1) { + LogUtil.info(this.Tag, " getSrcFromHtml, src[1] : " + src[1]); + srcArray.push(src[1]); } + } + } + return srcArray + } + + writeToDisFileDir(fileName: string) { + LogUtil.info(this.Tag, " writeToDisFileDir, fileName : " + fileName); + let filesDir = this.context.filesDir; + let srcPath = filesDir + "/" + fileName; + let distributedFilesDir = this.context.distributedFilesDir; + let desPath = distributedFilesDir + "/" + fileName; + try { + fileio.copyFileSync(srcPath, desPath); + LogUtil.info(this.Tag, " onContinue, writeToDisFileDir, copyFile successfully" + desPath + " " + srcPath); + } catch (err) { + LogUtil.error(this.Tag, " onContinue, writeToDisFileDir, copyFile failed : " + err); + } + } + + screenBreakPoints(data) { + let displayClass = null; + let screenDpi = null; + displayClass = display.getDefaultDisplaySync(); + screenDpi = displayClass.densityDPI; + AppStorage.SetOrCreate('dpi', screenDpi); + let windowWidth = data / (screenDpi / 160); + LogUtil.debug(this.Tag, " screenBreakPoints windowWidth: " + windowWidth); + if (windowWidth >= 320 && windowWidth < 520 || windowWidth < 320) { + AppStorage.SetOrCreate('breakPoint', 'sm'); + } else if (windowWidth >= 520 && windowWidth < 840) { + AppStorage.SetOrCreate('breakPoint', 'md'); + } else if (windowWidth >= 840) { + AppStorage.SetOrCreate('breakPoint', 'lg'); } + } } \ No newline at end of file diff --git a/product/default/src/main/ets/pages/MyNoteHome.ets b/product/default/src/main/ets/pages/MyNoteHome.ets index 6aa38041a06ce671c8df912201dd23d52ea02dd6..875cce57e2d391ea26fe4df859eee2522b8663a2 100644 --- a/product/default/src/main/ets/pages/MyNoteHome.ets +++ b/product/default/src/main/ets/pages/MyNoteHome.ets @@ -22,15 +22,19 @@ import inputMethod from '@ohos.inputMethod'; import router from '@system.router'; import abilityAccessCtrl from '@ohos.abilityAccessCtrl'; import webview from '@ohos.web.webview'; +import { BusinessError } from '@ohos.base'; +import common from '@ohos.app.ability.common'; @Entry @Component export struct MyNoteHomeComp { + @StorageLink('topHeight') topHeight: number = 0; // 窗口规避区域高 + @StorageLink('topWidth') topWidth: number = 0; // 窗口规避区域宽 @StorageLink('DBQueryFinished') dBQueryFinished: number = 0 @Provide('PortraitModel') portraitModel: boolean = true @Provide('RefreshFlag') refreshFlag: number = 0 private controllerShow: WebviewController = new webview.WebviewController() - private context = getContext(this) + private context = getContext(this) as common.UIAbilityContext; TAG = "MyNoteHomeComp_Tablet" @StorageLink('breakPoint') @Watch('onBreakPointChange') breakPoints: string = 'lg' @@ -43,23 +47,29 @@ export struct MyNoteHomeComp { } build() { - Row() { - if (this.dBQueryFinished == 1) { - if (this.breakPoints == 'sm') { - NoteHomePortraitComp() - } else { - NoteHomeComp({ controllerShow: this.controllerShow }) - } + Column() { + // 窗口顶部规避区域 + Row() + .width(px2vp(this.topWidth)) + .height(px2vp(this.topHeight)) + Row() { + if (this.dBQueryFinished == 1) { + if (this.breakPoints == 'sm') { + NoteHomePortraitComp() + } else { + NoteHomeComp({ controllerShow: this.controllerShow }) + } + } } + .width('100%') + .height('100%') } - .width('100%') - .height('100%') } aboutToAppear(): void { LogUtil.info(this.TAG, "aboutToAppear") - this.breakPoints = AppStorage.Get('breakPoint') + this.breakPoints = AppStorage.Get('breakPoint')!; if (this.breakPoints == 'sm' || this.breakPoints == 'md') { this.portraitModel = true } else { @@ -73,10 +83,9 @@ export struct MyNoteHomeComp { "ohos.permission.DISTRIBUTED_DATASYNC" ] LogUtil.info(this.TAG, 'permissions need to require from user') - let context: any = getContext(this); + let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; let AtManager = abilityAccessCtrl.createAtManager(); //requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗 - // @ts-ignore AtManager.requestPermissionsFromUser(context, ["ohos.permission.MANAGE_DISPOSED_APP_STATUS"]).then((data) => { LogUtil.info(this.TAG, 'data permissions : ' + data.permissions) LogUtil.info(this.TAG, 'data result: ' + data.authResults) @@ -85,7 +94,7 @@ export struct MyNoteHomeComp { sum += data.authResults[i] } LogUtil.info(this.TAG, 'request permissions sum: ' + sum) - }).catch((err) => { + }).catch((err: BusinessError) => { LogUtil.warn(this.TAG, 'failed to requestPermissionsFromUser : ' + err.code); }) let dbExist = false; @@ -132,7 +141,6 @@ export struct MyNoteHomeComp { onBackPress() { LogUtil.info(this.TAG, "onBackPress") // 退出键盘 - // @ts-ignore inputMethod.getController().stopInputSession(); setTimeout(() => { LogUtil.info(this.TAG, "wait save cotext") diff --git a/product/default/src/main/ets/pages/NoteContentHome.ets b/product/default/src/main/ets/pages/NoteContentHome.ets index 0733cca2e99b1098f6da206e87c1eb714684b1ad..4e732a93fc513a56a519a9a6895f6eba79f13256 100644 --- a/product/default/src/main/ets/pages/NoteContentHome.ets +++ b/product/default/src/main/ets/pages/NoteContentHome.ets @@ -20,6 +20,7 @@ import { LogUtil } from '@ohos/utils/src/main/ets/default/baseUtil/LogUtil' import RdbStoreUtil from '@ohos/utils/src/main/ets/default/baseUtil/RdbStoreUtil' import inputMethod from '@ohos.inputMethod' import webview from '@ohos.web.webview'; +import common from '@ohos.app.ability.common'; @Entry @Component @@ -53,7 +54,6 @@ struct NoteContentHome { this.controllerShow.runJavaScript("RICH_EDITOR.setInputEnabled(false)") this.controllerShow.runJavaScript("getHtmlContent()") if (deviceInfo.deviceType !== 'phone' && deviceInfo.deviceType !== 'default') { - // @ts-ignore inputMethod.getController().stopInputSession(); } } catch (error) { @@ -62,12 +62,13 @@ struct NoteContentHome { } aboutToAppear(): void { - this.breakPoints = AppStorage.Get('breakPoint') + let noteContext = AppStorage.Get('noteContext')!; + this.breakPoints = AppStorage.Get('breakPoint')!; LogUtil.info(this.TAG, "aboutToAppear") let isContinue = AppStorage.Get('IsContinue') LogUtil.info(this.TAG, "aboutToAppear, isContinue : " + isContinue) if (isContinue) { - RdbStoreUtil.initAppStorage(globalThis.noteContext) + RdbStoreUtil.initAppStorage(noteContext); } if (deviceInfo.deviceType === 'phone' || deviceInfo.deviceType === 'default') { AppStorage.SetOrCreate('NoteContentHomeExist', true) diff --git a/product/default/src/main/ets/pages/NoteHome.ets b/product/default/src/main/ets/pages/NoteHome.ets index 0dcbb1e86c2359f9767cde00d565f22b1840447e..b2b6e24ffdb9a0f6cec80840e0ab8a73ad250fd8 100644 --- a/product/default/src/main/ets/pages/NoteHome.ets +++ b/product/default/src/main/ets/pages/NoteHome.ets @@ -22,27 +22,28 @@ import { circleColorArray } from '@ohos/utils/src/main/ets/default/model/NoteBas import FolderData from '@ohos/utils/src/main/ets/default/model/databaseModel/FolderData' import NoteData from '@ohos/utils/src/main/ets/default/model/databaseModel/NoteData' import LayoutUtil from '@ohos/utils/src/main/ets/default/baseUtil/LayoutUtil' +import webview from '@ohos.web.webview'; @Entry @Component export struct NoteHomeComp { // 当前文件夹、笔记、分栏 - @Provide('SelectedFolderData') selectedFolderData: FolderData = AppStorage.Get('Folder') - @Provide('SelectedNoteData') selectedNoteData: NoteData = AppStorage.Get('Note') - @Provide('SectionStatus') sectionStatus: number = AppStorage.Get('Section') + @Provide('SelectedFolderData') selectedFolderData: FolderData = AppStorage.Get('Folder')!; + @Provide('SelectedNoteData') selectedNoteData: NoteData = AppStorage.Get('Note')!; + @Provide('SectionStatus') sectionStatus: number = AppStorage.Get('Section')!; @Provide('SelectedColor') selectedColor: string = circleColorArray[0] @Provide('LastSectionStatus') lastSectionStatus: number = 3 // 记录分栏上一次的状态 @Provide('Longpress') longpress: boolean = false // 第二栏长按状态 @Provide('ExpandStatus') expandStatus: boolean = false // 笔记本折叠展开状态 @Provide('ChooseNote') chooseNote: boolean = true // 是否选择笔记进行打开 - @Provide('Search') search: boolean = AppStorage.Get('Search') // 是否处于搜索状态 + @Provide('Search') search: boolean = AppStorage.Get('Search')!; // 是否处于搜索状态 @Provide('SearchResultList') searchResultList: NoteData[] = [] // 搜索得到的笔记列表 @Provide('InputKeyword') inputKeyword: string = '' // 搜索的字串 @Provide('SelectedAll') selectedAll: boolean = false @Provide('EditModel') editModel: boolean = false //编辑模式:临时方案 @Provide('Issave') issave: number = 0 @StorageLink('breakPoint') breakPoints: string = 'lg' - controllerShow: WebviewController + controllerShow: webview.WebviewController = new webview.WebviewController(); TAG = "NoteHomeComp_Tablet" @Provide('AsideWidth') asideWidth: number = 200 @@ -159,7 +160,7 @@ export struct NoteHomeComp { let isContinue = AppStorage.Get('IsContinue') LogUtil.info(this.TAG, "aboutToAppear, isContinue : " + isContinue) if (isContinue) { - this.sectionStatus = AppStorage.Get('Section') + this.sectionStatus = AppStorage.Get('Section')!; } // continue from phone let continueFromPhone = AppStorage.Get('ContinueFromPhone') diff --git a/product/default/src/main/ets/pages/NoteHomePortrait.ets b/product/default/src/main/ets/pages/NoteHomePortrait.ets index 37d98674b11770663369046eaad087b7ae620f45..6fd596069e0d567b7838dbdb56e49d2542e9d87c 100644 --- a/product/default/src/main/ets/pages/NoteHomePortrait.ets +++ b/product/default/src/main/ets/pages/NoteHomePortrait.ets @@ -25,8 +25,8 @@ import NoteData from '@ohos/utils/src/main/ets/default/model/databaseModel/NoteD @Component export struct NoteHomePortraitComp { // 当前文件夹、笔记、分栏 - @Provide('SelectedFolderData') selectedFolderData: FolderData = AppStorage.Get('Folder') - @Provide('SelectedNoteData') selectedNoteData: NoteData = AppStorage.Get('Note') + @Provide('SelectedFolderData') selectedFolderData: FolderData = AppStorage.Get('Folder')!; + @Provide('SelectedNoteData') selectedNoteData: NoteData = AppStorage.Get('Note')!; @Provide('SectionStatus') sectionStatus: number = 1; // 表示分栏状态, 3表示三分栏, 2表示二分栏,1表示一分栏 @Provide('LastSectionStatus') lastSectionStatus: number = 1; // 记录分栏上一次的状态 @Provide('SelectedColor') selectedColor: string = circleColorArray[0]; @@ -34,7 +34,7 @@ export struct NoteHomePortraitComp { // 分栏状态 @Provide('ExpandStatus') expandStatus: boolean = false // 笔记本折叠展开状态 - @Provide('ChooseNote') chooseNote: boolean = AppStorage.Get('Choose') // 是否选择笔记进行打开 + @Provide('ChooseNote') chooseNote: boolean = AppStorage.Get('Choose')!; // 是否选择笔记进行打开 @Provide('Search') search: boolean = false // 是否处于搜索状态 @Provide('SearchResultList') searchResultList: NoteData[] = [] // 搜索得到的笔记列表 diff --git a/product/default/src/main/module.json5 b/product/default/src/main/module.json5 index 55d5c36572ef8adc1d3047320437198bac84560e..7ca60094c5055de33d3fae68521fb0a94ab279a1 100644 --- a/product/default/src/main/module.json5 +++ b/product/default/src/main/module.json5 @@ -18,7 +18,7 @@ "module": { "name": "default", "type": "entry", - "srcEntrance": "./ets/Application/AbilityStage.ts", + "srcEntry": "./ets/Application/AbilityStage.ts", "description": "$string:entry_MainAbility", "mainElement": "MainAbility", "deviceTypes": [ @@ -31,22 +31,56 @@ }, { "name": "ohos.permission.MEDIA_LOCATION", - "reason": "$string:media_location_permission" + "reason": "$string:media_location_permission", + "usedScene": { + "abilities": [ + "MainAbility" + ], + "when":"inuse" + } }, { "name": "ohos.permission.DISTRIBUTED_DATASYNC", - "reason": "$string:distributed_dataSync_permission" + "reason": "$string:distributed_dataSync_permission", + "usedScene": { + "abilities": [ + "MainAbility" + ], + "when":"inuse" + } }, { "name": "ohos.permission.START_ABILITIES_FROM_BACKGROUND" }, { "name": "ohos.permission.READ_IMAGEVIDEO", - "reason": "$string:read_image_video_permission" + "reason": "$string:read_image_video_permission", + "usedScene": { + "abilities": [ + "MainAbility" + ], + "when":"inuse" + } }, { "name": "ohos.permission.WRITE_IMAGEVIDEO", - "reason": "$string:write_image_video_permission" + "reason": "$string:write_image_video_permission", + "usedScene": { + "abilities": [ + "MainAbility" + ], + "when":"inuse" + } + }, + { + "name": "ohos.permission.KEEP_BACKGROUND_RUNNING", + "reason": "$string:keep_background_running_permission", + "usedScene": { + "abilities": [ + "MainAbility" + ], + "when":"always" + } } ], "deliveryWithInstall": true, @@ -62,7 +96,7 @@ "abilities": [ { "name": "MainAbility", - "srcEntrance": "./ets/MainAbility/MainAbility.ts", + "srcEntry": "./ets/MainAbility/MainAbility.ts", "description": "$string:entry_MainAbility", "icon": "$media:note", "label": "$string:entry_MainAbility", @@ -78,6 +112,9 @@ ] } ], + "backgroundModes": [ + "dataTransfer" + ], "startWindowBackground": "$color:color_1", "startWindowIcon": "$media:note" } diff --git a/product/default/src/main/resources/base/element/string.json b/product/default/src/main/resources/base/element/string.json index bcae607b9d365abbb1e54b22f18b5983d3c4cdef..b71ceaddf0e41e14f88d07dc6b47cb1eada613ef 100644 --- a/product/default/src/main/resources/base/element/string.json +++ b/product/default/src/main/resources/base/element/string.json @@ -19,6 +19,10 @@ { "name": "write_image_video_permission", "value": "Used to modify image or video files in the user's public directory" + }, + { + "name": "keep_background_running_permission", + "value": "Allow Service Ability to run continuously in the background" } ] } \ No newline at end of file diff --git a/product/default/src/main/resources/zh_CN/element/string.json b/product/default/src/main/resources/zh_CN/element/string.json index 4d0096bca4561b08aa9cd14f13f42bf65504d41a..9538ea398859939d8c0ed1f349210ac5966d1d50 100644 --- a/product/default/src/main/resources/zh_CN/element/string.json +++ b/product/default/src/main/resources/zh_CN/element/string.json @@ -15,6 +15,10 @@ { "name": "write_image_video_permission", "value": "用于备忘录修改用户公共目录的图片或视频文件" + }, + { + "name": "keep_background_running_permission", + "value": "允许Service Ability在后台持续运行" } ] } \ No newline at end of file