forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.js
More file actions
1 lines (1 loc) · 41.7 KB
/
main.js
File metadata and controls
1 lines (1 loc) · 41.7 KB
1
define(function(require,exports,module){const _=brackets.getModule("thirdparty/lodash"),Commands=brackets.getModule("command/Commands"),CommandManager=brackets.getModule("command/CommandManager"),Menus=brackets.getModule("command/Menus"),FileSystem=brackets.getModule("filesystem/FileSystem"),FileUtils=brackets.getModule("file/FileUtils"),PerfUtils=brackets.getModule("utils/PerfUtils"),StringUtils=brackets.getModule("utils/StringUtils"),Dialogs=brackets.getModule("widgets/Dialogs"),DragAndDrop=brackets.getModule("utils/DragAndDrop"),Strings=brackets.getModule("strings"),PreferencesManager=brackets.getModule("preferences/PreferencesManager"),LocalizationUtils=brackets.getModule("utils/LocalizationUtils"),MainViewManager=brackets.getModule("view/MainViewManager"),WorkingSetView=brackets.getModule("project/WorkingSetView"),ExtensionManager=brackets.getModule("extensibility/ExtensionManager"),Mustache=brackets.getModule("thirdparty/mustache/mustache"),Locales=brackets.getModule("nls/strings"),ProjectManager=brackets.getModule("project/ProjectManager"),ExtensionLoader=brackets.getModule("utils/ExtensionLoader"),NodeConnector=brackets.getModule("NodeConnector"),extensionDevelopment=require("extensionDevelopment"),PerfDialogTemplate=require("text!htmlContent/perf-dialog.html"),TestBuilder=require("./testBuilder"),LanguageDialogTemplate=require("text!htmlContent/language-dialog.html"),KeyboardPrefs=JSON.parse(require("text!keyboard.json")),DIAGNOSTICS_SUBMENU="debug-diagnostics-sub-menu",EXPERIMENTAL_FEATURES_SUB_MENU="debug-experimental-features",DEFAULT_PREFERENCES_FILENAME="defaultPreferences.json",SUPPORTED_PREFERENCE_TYPES=["number","boolean","string","array","object"];let recomputeDefaultPrefs=!0,defaultPreferencesFullPath=path.normalize(brackets.app.getApplicationSupportDirectory()+"/defaultPreferences.json");const DEBUG_REFRESH_WINDOW="debug.refreshWindow",DEBUG_SHOW_DEVELOPER_TOOLS="debug.showDeveloperTools",DEBUG_LOAD_CURRENT_EXTENSION="debug.loadCurrentExtension",DEBUG_UNLOAD_CURRENT_EXTENSION="debug.unloadCurrentExtension",DEBUG_RUN_UNIT_TESTS="debug.runUnitTests",DEBUG_SHOW_PERF_DATA="debug.showPerfData",DEBUG_RELOAD_WITHOUT_USER_EXTS="debug.reloadWithoutUserExts",DEBUG_SWITCH_LANGUAGE="debug.switchLanguage",DEBUG_ENABLE_LOGGING="debug.enableLogging",DEBUG_ENABLE_PHNODE_INSPECTOR="debug.enablePhNodeInspector",DEBUG_GET_PHNODE_INSPECTOR_URL="debug.getPhNodeInspectorURL",DEBUG_LIVE_PREVIEW_LOGGING="debug.livePreviewLogging",DEBUG_GIT_EXTENSION_LOGGING="debug.gitLogging",DEBUG_OPEN_VFS="debug.openVFS",DEBUG_OPEN_EXTENSION_FOLDER="debug.openExtensionFolders",DEBUG_OPEN_VIRTUAL_SERVER="debug.openVirtualServer",DEBUG_OPEN_PREFERENCES_IN_SPLIT_VIEW="debug.openPrefsInSplitView",DEBUG_BUILD_TESTS="debug.buildTests",DEBUG_DRAG_AND_DROP="debug.dragAndDrop",LOG_TO_CONSOLE_KEY=logger.loggingOptions.LOCAL_STORAGE_KEYS.LOG_TO_CONSOLE_KEY,LOG_LIVE_PREVIEW_KEY=logger.loggingOptions.LOCAL_STORAGE_KEYS.LOG_LIVE_PREVIEW,LOG_GIT_KEY=logger.loggingOptions.LOCAL_STORAGE_KEYS.LOG_GIT;var prefs=PreferencesManager.getExtensionPrefs("preferencesView");function _runUnitTests(spec){let queryString=spec?"?spec="+spec:"?suite=unit",testBaseURL="../test/SpecRunner.html";"localhost"!==window.location.hostname&&"127.0.0.1"!==window.location.hostname&&(testBaseURL="test/SpecRunner.html"),Phoenix.app.openURLInPhoenixWindow(testBaseURL+queryString,{windowTitle:"Test Runner",preferTabs:!0,width:1670,height:900})}function handleReload(){CommandManager.execute(Commands.APP_RELOAD)}function handleReloadWithoutUserExts(){CommandManager.execute(Commands.APP_RELOAD_WITHOUT_EXTS)}function handleShowPerfData(){var templateVars={delimitedPerfData:PerfUtils.getDelimitedPerfData(),perfData:[]},getValue=function(entry){if(Array.isArray(entry)){var i,e,avg,sum=0,min=Number.MAX_VALUE,max=0;for(i=0;i<entry.length;i++)e=entry[i],min=Math.min(min,e),sum+=e,max=Math.max(max,e);return avg=Math.round(10*sum/entry.length)/10,String(min)+"/"+String(avg)+"("+entry.length+")/"+String(max)+"/"+String(e)}return entry},perfData=PerfUtils.getData();_.forEach(perfData,function(value,testName){templateVars.perfData.push({testName:StringUtils.breakableUrl(testName),value:getValue(value)})});var template=Mustache.render(PerfDialogTemplate,templateVars);Dialogs.showModalDialogUsingTemplate(template),$("#brackets-perf-raw-data").click(function(){$(this).focus().select()})}function handleSwitchLanguage(){const supportedLocales=Object.keys(Locales);var $dialog,$submit,$select,locale,curLocale=brackets.isLocaleDefault()?null:brackets.getLocale(),languages=[],setLanguage=function(event){locale=$select.val(),$submit.prop("disabled",locale===(curLocale||""))};for(let supportedLocale of supportedLocales){var match=supportedLocale.match(/^([a-z]{2})(-[a-z]{2})?$/);if(match){var language=supportedLocale,label=match[1];match[2]&&(label+=match[2].toUpperCase()),languages.push({label:LocalizationUtils.getLocalizedLabel(label),language:language})}}languages.push({label:LocalizationUtils.getLocalizedLabel("en"),language:"en"}),languages.sort(function(lang1,lang2){return lang1.label.localeCompare(lang2.label)}),languages.unshift({label:Strings.LANGUAGE_SYSTEM_DEFAULT,language:null});var template=Mustache.render(LanguageDialogTemplate,{languages:languages,Strings:Strings});Dialogs.showModalDialogUsingTemplate(template).done(function(id){id===Dialogs.DIALOG_BTN_OK&&locale!==curLocale&&(brackets.setLocale(locale),CommandManager.execute(Commands.APP_RELOAD))}),$dialog=$(".switch-language.instance"),$submit=$dialog.find(".dialog-button[data-button-id='"+Dialogs.DIALOG_BTN_OK+"']"),($select=$dialog.find("select")).on("change",setLanguage).val(curLocale)}function _openPrefFilesInSplitView(prefsPath,defaultPrefsPath,deferredPromise){var currScheme=MainViewManager.getLayoutScheme(),file=FileSystem.getFileForPath(prefsPath),defaultPrefsFile=FileSystem.getFileForPath(defaultPrefsPath),DEFAULT_PREFS_PANE="first-pane",USER_PREFS_PANE="second-pane";function _openFiles(){1===currScheme.rows&&1===currScheme.columns&&MainViewManager.setLayoutScheme(1,2),CommandManager.execute(Commands.FILE_OPEN,{fullPath:defaultPrefsPath,paneId:DEFAULT_PREFS_PANE,options:{isReadOnly:!0}}).done(function(){MainViewManager.findInWorkingSet(DEFAULT_PREFS_PANE,prefsPath)>=0&&(MainViewManager._moveView(DEFAULT_PREFS_PANE,USER_PREFS_PANE,file,0,!0),WorkingSetView.refresh(!0)),CommandManager.execute(Commands.FILE_OPEN,{fullPath:prefsPath,paneId:USER_PREFS_PANE}).done(function(){deferredPromise.resolve()}).fail(function(){deferredPromise.reject()})}).fail(function(){deferredPromise.reject()})}prefs.get("openUserPrefsInSecondPane")||(DEFAULT_PREFS_PANE="second-pane",USER_PREFS_PANE="first-pane");var resultObj=MainViewManager.findInAllWorkingSets(defaultPrefsPath);resultObj&&resultObj.length>0?CommandManager.execute(Commands.FILE_CLOSE,{file:defaultPrefsFile,paneId:resultObj[0].paneId}).done(function(){_openFiles()}).fail(function(){deferredPromise.reject()}):_openFiles()}function _isSupportedPrefType(prefType){return SUPPORTED_PREFERENCE_TYPES.indexOf(prefType)>=0}function _getPrefType(prefItem){var finalPrefType="undefined";if(prefItem){var _prefType=prefItem.type;if(void 0!==_prefType&&(finalPrefType=prefItem.type.toLowerCase(),void 0!==prefItem.initial))if(Array.isArray(prefItem.initial))_prefType="array";else{var _initialType=typeof prefItem.initial;_prefType!==(_initialType=_initialType.toLowerCase())&&(_prefType=_initialType)}if(_prefType)_isSupportedPrefType(finalPrefType=_prefType)||(finalPrefType="undefined");else if(Array.isArray(prefItem))finalPrefType="array";else if(void 0!==prefItem.initial||void 0!==prefItem.keys){var _prefVar;_prefVar=void 0!==prefItem.initial?prefItem.initial:prefItem.keys,Array.isArray(_prefVar)&&(finalPrefType="array")}else finalPrefType=typeof prefItem}return _isSupportedPrefType(finalPrefType)||(finalPrefType="undefined"),finalPrefType}function _isValidPref(pref){return!(!pref||pref.excludeFromHints||"undefined"===_getPrefType(pref))}function _getChildPrefs(prefItem){var finalObj={},keysFound=!1;if(!prefItem)return{};function _populateKeys(allKeys){var prop;if("object"==typeof allKeys)for(prop in keysFound=!0,allKeys)allKeys.hasOwnProperty(prop)&&(finalObj[prop]=allKeys[prop])}return _populateKeys(prefItem.initial),_populateKeys(prefItem.keys),keysFound||_populateKeys(prefItem),finalObj}function _formatBasicPref(prefItem,prefName,tabIndentStr){if(!prefItem||"string"!=typeof prefName||"object"===_getPrefType(prefItem))return"";var prefDescription=prefItem.description||"",prefDefault=prefItem.initial,prefFormatText=tabIndentStr+"\t// {0}\n"+tabIndentStr+'\t"{1}": {2}',prefItemType=_getPrefType(prefItem);return void 0!==prefDefault||prefItem.description||"number"!==prefItemType&&"boolean"!==prefItemType&&"string"!==prefItemType||(prefDefault=prefItem),void 0===prefDefault&&(prefDefault="number"===prefItemType?0:"boolean"!==prefItemType&&""),void 0!==prefDescription&&0!==prefDescription.length||(prefDescription=Array.isArray(prefDefault)?"":Strings.DEFAULT_PREFERENCES_JSON_DEFAULT+": "+prefDefault),"array"===prefItemType?prefDefault="[]":(0===prefDefault.length||"boolean"!==prefItemType&&"number"!==prefItemType)&&(prefDefault='"'+prefDefault+'"'),StringUtils.format(prefFormatText,prefDescription,prefName,prefDefault)}function _formatPref(prefName,prefItem,indentLevel){if(!prefItem||indentLevel<0||!prefName||!prefName.length)return"";var iLevel,prefItemKeys,entireText="",prefItemDesc=prefItem.description||"",prefItemType=_getPrefType(prefItem),hasKeys=!1,tabIndents="",numKeys=0;for(iLevel=0;iLevel<indentLevel;iLevel++)tabIndents+="\t";return"object"===_getPrefType(prefItem)&&(prefItemKeys=_getChildPrefs(prefItem),Object.keys(prefItemKeys).length>0&&(hasKeys=!0)),"object"!==prefItemType&&!1===hasKeys?_formatBasicPref(prefItem,prefName,tabIndents):(tabIndents+="\t",prefItemDesc&&prefItemDesc.length>0&&(entireText=tabIndents+"// "+prefItemDesc+"\n"),entireText+=tabIndents+'"'+prefName+'": {',prefItemKeys&&(numKeys=Object.keys(prefItemKeys).length),numKeys<=0?entireText+="}":(entireText+="\n",Object.keys(prefItemKeys).sort().forEach(function(property){if(prefItemKeys.hasOwnProperty(property)){var pref=prefItemKeys[property];if(_isValidPref(pref)){var formattedText="";(formattedText="object"===_getPrefType(pref)?_formatPref(property,pref,indentLevel+1):_formatBasicPref(pref,property,tabIndents)).length>0&&(entireText+=formattedText+",\n\n")}}}),entireText=entireText.length>0?entireText.slice(0,-3)+"\n"+tabIndents+"}":"{}"))}function _getDefaultPreferencesString(){var allPrefs=PreferencesManager.getAllPreferences(),headerComment=Strings.DEFAULT_PREFERENCES_JSON_HEADER_COMMENT+"\n\n{\n",entireText="";return Object.keys(allPrefs).sort().forEach(function(property){if(allPrefs.hasOwnProperty(property)){var pref=allPrefs[property];_isValidPref(pref)&&(entireText+=_formatPref(property,pref,0)+",\n\n")}}),entireText=entireText.length>0?headerComment+entireText.slice(0,-3)+"\n}\n":headerComment+"}\n"}function _loadDefaultPrefs(prefsPath,deferredPromise){var defaultPrefsPath=defaultPreferencesFullPath,file=FileSystem.getFileForPath(defaultPrefsPath);function _executeDefaultOpenPrefsCommand(){CommandManager.execute(Commands.FILE_OPEN_PREFERENCES).done(function(){deferredPromise.resolve()}).fail(function(){deferredPromise.reject()})}file.exists(function(err,doesExist){if(doesExist)if(recomputeDefaultPrefs){var prefsString=_getDefaultPreferencesString();recomputeDefaultPrefs=!1,file.unlink(function(err){err?(console.error("Unable to delete the existing default preferences file! error code:"+err),_executeDefaultOpenPrefsCommand()):FileUtils.writeText(file,prefsString,!0).done(function(){recomputeDefaultPrefs=!1,_openPrefFilesInSplitView(prefsPath,defaultPrefsPath,deferredPromise)}).fail(function(error){console.error("Unable to write to default preferences file! error code:"+error),_executeDefaultOpenPrefsCommand()})})}else _openPrefFilesInSplitView(prefsPath,defaultPrefsPath,deferredPromise);else{var _prefsString=_getDefaultPreferencesString();FileUtils.writeText(file,_prefsString,!0).done(function(){recomputeDefaultPrefs=!1,_openPrefFilesInSplitView(prefsPath,defaultPrefsPath,deferredPromise)}).fail(function(error){console.error("Unable to write to default preferences file! error code:"+error),_executeDefaultOpenPrefsCommand()})}})}function handleOpenPrefsInSplitView(){var fullPath=PreferencesManager.getUserPrefFile(),file=FileSystem.getFileForPath(fullPath),splitViewPrefOn=prefs.get("openPrefsInSplitView"),result=new $.Deferred;return splitViewPrefOn?(file.exists(function(err,doesExist){doesExist?_loadDefaultPrefs(fullPath,result):FileUtils.writeText(file,"",!0).done(function(){_loadDefaultPrefs(fullPath,result)}).fail(function(){result.reject()})}),result.promise()):CommandManager.execute(Commands.FILE_OPEN_PREFERENCES)}function _updateLogToConsoleMenuItemChecked(){const isLogging=window.setupLogging();CommandManager.get(DEBUG_ENABLE_LOGGING).setChecked(isLogging),CommandManager.get(DEBUG_LIVE_PREVIEW_LOGGING).setEnabled(isLogging),logger.loggingOptions.logLivePreview=window.isLoggingEnabled(LOG_LIVE_PREVIEW_KEY),logger.loggingOptions.logGit=window.isLoggingEnabled(LOG_GIT_KEY),CommandManager.get(DEBUG_LIVE_PREVIEW_LOGGING).setChecked(logger.loggingOptions.logLivePreview),CommandManager.get(DEBUG_GIT_EXTENSION_LOGGING).setChecked(logger.loggingOptions.logGit),CommandManager.get(DEBUG_ENABLE_PHNODE_INSPECTOR).setChecked(NodeConnector.isInspectEnabled())}function _handleLogging(){window.toggleLoggingKey(LOG_TO_CONSOLE_KEY),_updateLogToConsoleMenuItemChecked()}function _handlePhNodeInspectEnable(){NodeConnector.setInspectEnabled(!NodeConnector.isInspectEnabled()),_updateLogToConsoleMenuItemChecked()}function _handleGetPhNodeInspectURL(){Dialogs.showInfoDialog(Strings.CMD_GET_PHNODE_INSPECTOR_URL,`<div id="instructions">\n <p>\n 1. Go to <a href="chrome://inspect/" target="_blank">chrome://inspect/#devices</a>\n <button onclick="Phoenix.app.copyToClipboard('chrome://inspect/')">\n <i class="fas fa-copy"></i> Copy\n </button>\n </p>\n <p>2. Select Option 'Open dedicated DevTools for Node'</p>\n <p>\n 3. Use the URL in connection tab'<code>localhost:${NodeConnector.getInspectPort()}</code>'\n <button onclick="Phoenix.app.copyToClipboard('localhost:${NodeConnector.getInspectPort()}')">\n <i class="fas fa-copy"></i> Copy\n </button>\n </p>\n</div>`)}function _handleLivePreviewLogging(){window.toggleLoggingKey(LOG_LIVE_PREVIEW_KEY),_updateLogToConsoleMenuItemChecked()}function _handleGitLogging(){window.toggleLoggingKey(LOG_GIT_KEY),_updateLogToConsoleMenuItemChecked()}function _openVFS(){ProjectManager.openProject("/")}function _openExtensionsFolder(){Phoenix.app.openPathInFileBrowser(ExtensionLoader.getUserExtensionPath())}function _openVirtualServer(){const virtualServingURL=Phoenix.VFS.getVirtualServingURLForPath("/");if(!virtualServingURL)throw new Error("Unable to find virtual server!");Phoenix.app.openURLInPhoenixWindow(virtualServingURL,{preferTabs:!0})}function _handleShowDeveloperTools(){brackets.app.toggleDevtools()}prefs.definePreference("openPrefsInSplitView","boolean",!0,{description:Strings.DESCRIPTION_OPEN_PREFS_IN_SPLIT_VIEW}),prefs.definePreference("openUserPrefsInSecondPane","boolean",!0,{description:Strings.DESCRIPTION_OPEN_USER_PREFS_IN_SECOND_PANE}),ExtensionManager.on("statusChange",function(id){recomputeDefaultPrefs=!0});let loadOrReloadString=extensionDevelopment.isProjectLoadedAsExtension()?Strings.CMD_RELOAD_CURRENT_EXTENSION:Strings.CMD_LOAD_CURRENT_EXTENSION;CommandManager.register(loadOrReloadString,"debug.loadCurrentExtension",extensionDevelopment.loadCurrentExtension),CommandManager.register(Strings.CMD_UNLOAD_CURRENT_EXTENSION,"debug.unloadCurrentExtension",extensionDevelopment.unloadCurrentExtension),CommandManager.register(Strings.CMD_REFRESH_WINDOW,DEBUG_REFRESH_WINDOW,handleReload),CommandManager.register(Strings.CMD_RELOAD_WITHOUT_USER_EXTS,"debug.reloadWithoutUserExts",handleReloadWithoutUserExts),CommandManager.register(Strings.CMD_RUN_UNIT_TESTS,"debug.runUnitTests",_runUnitTests),CommandManager.register(Strings.CMD_SHOW_PERF_DATA,"debug.showPerfData",handleShowPerfData);let switchLanguageStr="Switch Language…"===Strings.CMD_SWITCH_LANGUAGE?Strings.CMD_SWITCH_LANGUAGE:`${Strings.CMD_SWITCH_LANGUAGE} (Switch Language)`;CommandManager.register(switchLanguageStr,DEBUG_SWITCH_LANGUAGE,handleSwitchLanguage),CommandManager.register(Strings.CMD_ENABLE_LOGGING,DEBUG_ENABLE_LOGGING,_handleLogging),CommandManager.register(Strings.CMD_ENABLE_PHNODE_INSPECTOR,DEBUG_ENABLE_PHNODE_INSPECTOR,_handlePhNodeInspectEnable),CommandManager.register(Strings.CMD_GET_PHNODE_INSPECTOR_URL,"debug.getPhNodeInspectorURL",_handleGetPhNodeInspectURL),CommandManager.register(Strings.CMD_ENABLE_LIVE_PREVIEW_LOGS,DEBUG_LIVE_PREVIEW_LOGGING,_handleLivePreviewLogging),CommandManager.register(Strings.CMD_ENABLE_GIT_LOGS,DEBUG_GIT_EXTENSION_LOGGING,_handleGitLogging),CommandManager.register(Strings.CMD_OPEN_VFS,DEBUG_OPEN_VFS,_openVFS),CommandManager.register(Strings.CMD_OPEN_EXTENSIONS_FOLDER,DEBUG_OPEN_EXTENSION_FOLDER,_openExtensionsFolder),CommandManager.register(Strings.CMD_OPEN_VIRTUAL_SERVER,"debug.openVirtualServer",_openVirtualServer),CommandManager.register(Strings.CMD_OPEN_PREFERENCES,"debug.openPrefsInSplitView",handleOpenPrefsInSplitView);const debugMenu=Menus.getMenu(Menus.AppMenuBar.DEBUG_MENU);debugMenu.addMenuItem(DEBUG_REFRESH_WINDOW,window.debugMode?KeyboardPrefs.refreshWindow:void 0),debugMenu.addMenuItem("debug.reloadWithoutUserExts",window.debugMode?KeyboardPrefs.reloadWithoutUserExts:void 0),debugMenu.addMenuItem("debug.loadCurrentExtension"),debugMenu.addMenuItem("debug.unloadCurrentExtension",void 0,void 0,void 0,{hideWhenCommandDisabled:!0}),debugMenu.addMenuItem(DEBUG_OPEN_EXTENSION_FOLDER,void 0,void 0,void 0,{hideWhenCommandDisabled:!0}),debugMenu.addMenuDivider(),Phoenix.isNativeApp&&(CommandManager.register(Strings.CMD_SHOW_DEV_TOOLS,"debug.showDeveloperTools",_handleShowDeveloperTools),debugMenu.addMenuItem("debug.showDeveloperTools",KeyboardPrefs.showDeveloperTools)),debugMenu.addMenuItem(Commands.FILE_OPEN_KEYMAP,null),Phoenix.isNativeApp&&debugMenu.addMenuItem(Commands.REINSTALL_CREDS,null);const diagnosticsSubmenu=debugMenu.addSubMenu(Strings.CMD_DIAGNOSTIC_TOOLS,DIAGNOSTICS_SUBMENU);if(diagnosticsSubmenu.addMenuItem("debug.runUnitTests"),CommandManager.register(Strings.CMD_BUILD_TESTS,DEBUG_BUILD_TESTS,TestBuilder.toggleTestBuilder),diagnosticsSubmenu.addMenuItem(DEBUG_BUILD_TESTS),"dev"===AppConfig.config.environment&&diagnosticsSubmenu.addMenuItem("debug.phoenixBuilderConnect"),diagnosticsSubmenu.addMenuDivider(),diagnosticsSubmenu.addMenuItem(DEBUG_ENABLE_LOGGING),diagnosticsSubmenu.addMenuItem(DEBUG_ENABLE_PHNODE_INSPECTOR,void 0,void 0,void 0,{hideWhenCommandDisabled:!0}),diagnosticsSubmenu.addMenuItem("debug.getPhNodeInspectorURL",void 0,void 0,void 0,{hideWhenCommandDisabled:!0}),diagnosticsSubmenu.addMenuItem(DEBUG_LIVE_PREVIEW_LOGGING),Phoenix.isNativeApp&&diagnosticsSubmenu.addMenuItem(DEBUG_GIT_EXTENSION_LOGGING),diagnosticsSubmenu.addMenuDivider(),diagnosticsSubmenu.addMenuItem("debug.showPerfData"),diagnosticsSubmenu.addMenuItem(DEBUG_OPEN_VFS),diagnosticsSubmenu.addMenuItem("debug.openVirtualServer",void 0,void 0,void 0,{hideWhenCommandDisabled:!0}),Phoenix.isNativeApp){const experimentalSubmenu=debugMenu.addSubMenu(Strings.CMD_EXPERIMENTAL_FEATURES,"debug-experimental-features");CommandManager.register(Strings.CMD_ENABLE_DRAG_AND_DROP,"debug.dragAndDrop",()=>{PreferencesManager.set(DragAndDrop._PREF_DRAG_AND_DROP,!PreferencesManager.get(DragAndDrop._PREF_DRAG_AND_DROP))}),PreferencesManager.on("change",DragAndDrop._PREF_DRAG_AND_DROP,function(){CommandManager.get("debug.dragAndDrop").setChecked(PreferencesManager.get(DragAndDrop._PREF_DRAG_AND_DROP))}),experimentalSubmenu.addMenuItem("debug.dragAndDrop")}CommandManager.get("debug.unloadCurrentExtension").setEnabled(extensionDevelopment.isProjectLoadedAsExtension()),CommandManager.get(DEBUG_OPEN_EXTENSION_FOLDER).setEnabled(Phoenix.isNativeApp),CommandManager.get(DEBUG_ENABLE_PHNODE_INSPECTOR).setEnabled(Phoenix.isNativeApp),CommandManager.get("debug.getPhNodeInspectorURL").setEnabled(Phoenix.isNativeApp),CommandManager.get("debug.openVirtualServer").setEnabled(!Phoenix.isNativeApp),_updateLogToConsoleMenuItemChecked();const helpMenu=Menus.getMenu(Menus.AppMenuBar.HELP_MENU);helpMenu.addMenuItem(DEBUG_SWITCH_LANGUAGE,"",Menus.BEFORE,Commands.HELP_YOUTUBE),helpMenu.addMenuDivider(Menus.AFTER,DEBUG_SWITCH_LANGUAGE);const fileMenu=Menus.getMenu(Menus.AppMenuBar.FILE_MENU);fileMenu.addMenuItem("debug.openPrefsInSplitView",null,Menus.BEFORE,Menus.MenuSection.FILE_SETTINGS.sectionMarker),exports._runUnitTests=_runUnitTests}),define("MacroRunner",function(require,exports,module){const FileViewController=brackets.getModule("project/FileViewController"),CommandManager=brackets.getModule("command/CommandManager"),EditorManager=brackets.getModule("editor/EditorManager"),KeyEvent=brackets.getModule("utils/KeyEvent"),Commands=brackets.getModule("command/Commands"),FileSystem=brackets.getModule("filesystem/FileSystem"),MainViewManager=brackets.getModule("view/MainViewManager"),FileUtils=brackets.getModule("file/FileUtils"),PreferencesManager=brackets.getModule("preferences/PreferencesManager"),Editor=brackets.getModule("editor/Editor"),Dialogs=brackets.getModule("widgets/Dialogs"),_=brackets.getModule("thirdparty/lodash"),ProjectManager=brackets.getModule("project/ProjectManager");function openFile(filePath){if(filePath.startsWith("/"))return jsPromise(FileViewController.openFileAndAddToWorkingSet(filePath));const projectFilePath=path.join(ProjectManager.getProjectRoot().fullPath,filePath);return jsPromise(FileViewController.openFileAndAddToWorkingSet(projectFilePath))}function readTextFile(filePath,bypassCache){filePath.startsWith("/")||(filePath=path.join(ProjectManager.getProjectRoot().fullPath,filePath));const file=FileSystem.getFileForPath(filePath);return jsPromise(FileUtils.readAsText(file,bypassCache))}function writeTextFile(filePath,text,allowBlindWrite){filePath.startsWith("/")||(filePath=path.join(ProjectManager.getProjectRoot().fullPath,filePath));const file=FileSystem.getFileForPath(filePath);return jsPromise(FileUtils.writeText(file,text,allowBlindWrite))}function deletePath(filePath){return filePath.startsWith("/")||(filePath=path.join(ProjectManager.getProjectRoot().fullPath,filePath)),new Promise((resolve,reject)=>{window.fs.unlink(filePath,err=>{err?reject(err):resolve()})})}function setCursors(selections){const activeEditor=EditorManager.getActiveEditor();if(!activeEditor)throw new Error(`No active editor found to set cursor at: ${selections}`);const parsedSelections=selections.map(selection=>{const parts=selection.split("-");if(1===parts.length){const[line,ch]=parts[0].split(":").map(Number);if(isNaN(line)||isNaN(ch))throw new Error(`Invalid cursor format: ${parts[0]} for ${selections}`);return{start:{line:line-1,ch:ch-1},end:{line:line-1,ch:ch-1}}}if(2===parts.length){const[fromLine,fromCh]=parts[0].split(":").map(Number),[toLine,toCh]=parts[1].split(":").map(Number);if(isNaN(fromLine)||isNaN(fromCh)||isNaN(toLine)||isNaN(toCh))throw new Error(`Invalid selection range format: ${selection}`);return{start:{line:fromLine-1,ch:fromCh-1},end:{line:toLine-1,ch:toCh-1}}}throw new Error(`Invalid format: ${selection}`)});activeEditor.setSelections(parsedSelections)}function computeCursors(editor,addQuotes){const selections=editor.getSelections();return selections.map(selection=>{const start=selection.start,end=selection.end;let cursor;return cursor=start.line===end.line&&start.ch===end.ch?`${start.line+1}:${start.ch+1}`:`${start.line+1}:${start.ch+1}-${end.line+1}:${end.ch+1}`,addQuotes?`"${cursor}"`:cursor})}function expectCursorsToBe(expectedSelections){const activeEditor=EditorManager.getActiveEditor();if(!activeEditor)throw new Error(`No active editor found for expectCursorsToBe: ${expectedSelections}`);const currentSelections=computeCursors(activeEditor);if(currentSelections.length!==expectedSelections.length)throw new Error(`expectCursorsToBe: [${expectedSelections.join(", ")}] `+`but got [${currentSelections.join(", ")}]`);for(let i=0;i<currentSelections.length;i++)if(!currentSelections.includes(`${expectedSelections[i]}`)||!expectedSelections.includes(currentSelections[i]))throw new Error(`expectCursorsToBe: [${expectedSelections.join(", ")}] `+`but got [${currentSelections.join(", ")}]`)}function raiseKeyEvent(key,event,element,options){const doc=element.ownerDocument;void 0===options?options={view:doc.defaultView,bubbles:!0,cancelable:!0,keyIdentifer:key}:(options.view=doc.defaultView,options.bubbles=!0,options.cancelable=!0,options.keyIdentifier=key);const oEvent=new KeyboardEvent(event,options);"keydown"===event||"keyup"===event||"keypress"===event?(Object.defineProperty(oEvent,"keyCode",{get:function(){return this.keyCodeVal}}),Object.defineProperty(oEvent,"which",{get:function(){return this.keyCodeVal}}),Object.defineProperty(oEvent,"charCode",{get:function(){return this.keyCodeVal}}),oEvent.keyCodeVal=key,oEvent.keyCode!==key&&console.log("SpecRunnerUtils.simulateKeyEvent() - keyCode mismatch: "+oEvent.keyCode),element.dispatchEvent(oEvent)):console.log("SpecRunnerUtils.simulateKeyEvent() - unsupported keyevent: "+event)}function keydown(keysArray,modifiers){for(let key of keysArray){if("string"==typeof key&&(key.startsWith("DOM_VK_")||(key="DOM_VK_"+key),!(key=KeyEvent[key])))throw new Error(`Invalid key "${key}"`);raiseKeyEvent(key,"keydown",document.activeElement,modifiers)}}function typeAtCursor(text,origin){const activeEditor=EditorManager.getActiveEditor();if(!activeEditor)throw new Error(`No active editor found to typeAtCursor: ${text}`);const selections=activeEditor.getSelections();for(let selection of selections)activeEditor.replaceRange(text,selection.start,selection.end,origin)}function _toPos(posString){const pos=posString.split(":");return{line:Number(pos[0])-1,ch:Number(pos[1])-1}}function validateText(text,selection){const activeEditor=EditorManager.getActiveEditor();if(!activeEditor)throw new Error(`No active editor found to validateText: ${text} at selection ${selection}`);const from=selection.split("-")[0],to=selection.split("-")[1],selectedText=activeEditor.getTextBetween(_toPos(from),_toPos(to));if(selectedText!==text)throw new Error(`validateText: expected text at [${selection}] to be "${text}" but got "${selectedText}"`)}function _getMarkLocations(markType,whichAPI,selections){const activeEditor=EditorManager.getActiveEditor();if(!activeEditor)throw new Error(`No active editor found to ${whichAPI}: "${markType}" for selection "${selections}"`);const marks=activeEditor.getAllMarks(markType),marksLocations=[];for(let mark of marks){const loc=mark.find();marksLocations.push(`${loc.from.line+1}:${loc.from.ch+1}-${loc.to.line+1}:${loc.to.ch+1}`)}return marksLocations}function validateAllMarks(markType,selections){const marksLocations=_getMarkLocations(markType,"validateAllMarks",selections);if(!selections||marksLocations.length!==selections.length)throw new Error(`validateAllMarks expected marks "${markType}" at: [${selections&&selections.join(", ")}] `+`but got marked locations [${marksLocations.join(", ")}]`);for(let i=0;i<selections.length;i++)if(!selections.includes(`${marksLocations[i]}`)||!marksLocations.includes(selections[i]))throw new Error(`validateAllMarks expected marks "${markType}" at: [${selections.join(", ")}] `+`but got marked locations [${marksLocations.join(", ")}]`)}function validateEqual(obj1,obj2,message=""){if(!_.isEqual(obj1,obj2))throw new Error(`validateEqual: ${message?message+"\n":""} expected ${JSON.stringify(obj1)} to equal ${JSON.stringify(obj2)}`)}function validateNotEqual(obj1,obj2){if(_.isEqual(obj1,obj2))throw new Error(`validateEqual: expected ${JSON.stringify(obj1)} to NOT equal ${JSON.stringify(obj2)}`)}function validateMarks(markType,selections,totalMarkCount){const marksLocations=_getMarkLocations(markType,"validateMarks",selections);if(selections){if(void 0!==totalMarkCount&&marksLocations.length!==totalMarkCount)throw new Error(`validateMarks expected mark count for "${markType}" to be: ${totalMarkCount} `+`but got ${marksLocations.length}`);for(let selection of selections)if(!marksLocations.includes(selection))throw new Error(`validateMarks expected marks "${markType}" to be at: [${selections.join(", ")}] `+`but got marked locations [${marksLocations.join(", ")}]`)}}function closeFile(){return jsPromise(CommandManager.execute(Commands.FILE_CLOSE,{_forceClose:!0}))}function closeAll(){return jsPromise(CommandManager.execute(Commands.FILE_CLOSE_ALL,{_forceClose:!0}))}function execCommand(commandID,arg){return jsPromise(CommandManager.execute(commandID,arg))}function undo(){return execCommand(Commands.EDIT_UNDO)}function redo(){return execCommand(Commands.EDIT_REDO)}function setPreference(key,value){PreferencesManager.set(key,value)}function getPreference(key){return PreferencesManager.get(key)}function _getFullPath(filePath){return filePath.startsWith("/")?filePath:path.join(ProjectManager.getProjectRoot().fullPath,filePath)}const EDITING={setEditorSpacing:function(useTabs,spaceOrTabCount,isAutoMode){const activeEditor=EditorManager.getActiveEditor();if(!activeEditor)throw new Error("No active editor found to setEditorSpacing");const fullPath=activeEditor.document.file.fullPath;Editor.Editor.getAutoTabSpaces(fullPath)!==isAutoMode&&(Editor.Editor.setAutoTabSpaces(isAutoMode,fullPath),isAutoMode&&Editor.Editor._autoDetectTabSpaces(activeEditor,!0,!0)),Editor.Editor.setUseTabChar(useTabs,fullPath),useTabs?Editor.Editor.setTabSize(spaceOrTabCount,fullPath):Editor.Editor.setSpaceUnits(spaceOrTabCount,fullPath)},splitVertical:function(){CommandManager.execute(Commands.CMD_SPLITVIEW_VERTICAL)},splitHorizontal:function(){CommandManager.execute(Commands.CMD_SPLITVIEW_HORIZONTAL)},splitNone:function(){CommandManager.execute(Commands.CMD_SPLITVIEW_NONE)},getFirstPaneEditor:function(){return MainViewManager.getCurrentlyViewedEditor("first-pane")},getSecondPaneEditor:function(){return MainViewManager.getCurrentlyViewedEditor("second-pane")},isSplit:function(){return MainViewManager.getPaneCount()>1},openFileInFirstPane:function(filePath,addToWorkingSet){const command=addToWorkingSet?Commands.CMD_ADD_TO_WORKINGSET_AND_OPEN:Commands.FILE_OPEN;return jsPromise(CommandManager.execute(command,{fullPath:_getFullPath(filePath),paneId:"first-pane"}))},openFileInSecondPane:function(filePath,addToWorkingSet){const command=addToWorkingSet?Commands.CMD_ADD_TO_WORKINGSET_AND_OPEN:Commands.FILE_OPEN;return jsPromise(CommandManager.execute(command,{fullPath:_getFullPath(filePath),paneId:"second-pane"}))},focusFirstPane:function(){MainViewManager.setActivePaneId("first-pane")},focusSecondPane:function(){MainViewManager.setActivePaneId("second-pane")}};function awaitsFor(pollFn,_timeoutMessageOrMessageFn,timeoutms=2e3,pollInterval=10){if("number"==typeof _timeoutMessageOrMessageFn&&(pollInterval=timeoutms=_timeoutMessageOrMessageFn),"number"!=typeof timeoutms||"number"!=typeof pollInterval)throw new Error("awaitsFor: invalid parameters when awaiting for "+_timeoutMessageOrMessageFn);async function _getExpectMessage(_timeoutMessageOrMessageFn){try{"function"==typeof _timeoutMessageOrMessageFn&&(_timeoutMessageOrMessageFn=_timeoutMessageOrMessageFn())instanceof Promise&&(_timeoutMessageOrMessageFn=await _timeoutMessageOrMessageFn)}catch(e){_timeoutMessageOrMessageFn="Error executing expected message function:"+e.stack}return _timeoutMessageOrMessageFn}function _timeoutPromise(promise,ms){const timeout=new Promise((_,reject)=>{setTimeout(async()=>{_timeoutMessageOrMessageFn=await _getExpectMessage(_timeoutMessageOrMessageFn),reject(new Error(_timeoutMessageOrMessageFn||`Promise timed out after ${ms}ms`))},ms)});return Promise.race([promise,timeout])}return new Promise((resolve,reject)=>{let startTime=Date.now(),lapsedTime;async function pollingFn(){try{let result=pollFn();if("[object Promise]"===Object.prototype.toString.call(result)&&(result=await _timeoutPromise(result,timeoutms)),result)return void resolve();if((lapsedTime=Date.now()-startTime)>timeoutms)return _timeoutMessageOrMessageFn=await _getExpectMessage(_timeoutMessageOrMessageFn),void reject("awaitsFor timed out waiting for - "+_timeoutMessageOrMessageFn);setTimeout(pollingFn,pollInterval)}catch(e){reject(e)}}pollingFn()})}async function waitForModalDialog(dialogClass,friendlyName,timeout=2e3){dialogClass=dialogClass||"",friendlyName=friendlyName||dialogClass||"Modal Dialog",await awaitsFor(()=>{let $dlg;return $(`.modal.instance${dialogClass}`).length>=1},`Waiting for Modal Dialog to show ${friendlyName}`,timeout)}async function waitForModalDialogClosed(dialogClass,friendlyName,timeout=2e3){dialogClass=dialogClass||"",friendlyName=friendlyName||dialogClass||"Modal Dialog",await awaitsFor(()=>{let $dlg;return 0===$(`.modal.instance${dialogClass}`).length},`Waiting for Modal Dialog to not there ${friendlyName}`,timeout)}function _clickDialogButtonWithSelector(selectorOrButtonID,dialogClass,isButtonID){dialogClass=dialogClass||"";const $dlg=$(`.modal.instance${dialogClass}`);if(!$dlg.length)throw new Error(`No such dialog present: "${dialogClass}"`);const $button=isButtonID?$dlg.find(".dialog-button[data-button-id='"+selectorOrButtonID+"']"):$dlg.find(selectorOrButtonID);if($button.length>1)throw new Error(`Multiple button in dialog "${selectorOrButtonID}"`);if(!$button.length)throw new Error(`No such button in dialog "${selectorOrButtonID}"`);if($button.prop("disabled"))throw new Error(`Cannot click, button is disabled. "${selectorOrButtonID}"`);$button.click()}function clickDialogButtonID(buttonID,dialogClass){_clickDialogButtonWithSelector(buttonID,dialogClass,!0)}function clickDialogButton(buttonSelector,dialogClass){_clickDialogButtonWithSelector(buttonSelector,dialogClass,!1)}function saveActiveFile(){return jsPromise(CommandManager.execute(Commands.FILE_SAVE))}const __PR={readTextFile:readTextFile,writeTextFile:writeTextFile,deletePath:deletePath,openFile:openFile,setCursors:setCursors,expectCursorsToBe:expectCursorsToBe,keydown:keydown,typeAtCursor:typeAtCursor,validateText:validateText,validateAllMarks:validateAllMarks,validateMarks:validateMarks,closeFile:closeFile,closeAll:closeAll,undo:undo,redo:redo,setPreference:setPreference,getPreference:getPreference,validateEqual:validateEqual,validateNotEqual:validateNotEqual,execCommand:execCommand,saveActiveFile:saveActiveFile,awaitsFor:awaitsFor,waitForModalDialog:waitForModalDialog,waitForModalDialogClosed:waitForModalDialogClosed,clickDialogButtonID:clickDialogButtonID,clickDialogButton:clickDialogButton,EDITING:EDITING,$:$,Commands:Commands,Dialogs:Dialogs};async function runMacro(macroText){let errors=[];try{const AsyncFunction=async function(){}.constructor,macroAsync=new AsyncFunction("__PR","KeyEvent",macroText);await macroAsync(__PR,KeyEvent)}catch(e){console.error("Error executing macro: ",macroText,e),errors.push({lineNo:0,line:"",errorCode:"ERROR_EXEC",errorText:`${e}`})}return errors}Phoenix.isTestWindow&&(window.__PR=__PR),exports.computeCursors=computeCursors,exports.runMacro=runMacro}),define("extensionDevelopment",function(require,exports,module){const ProjectManager=brackets.getModule("project/ProjectManager"),Commands=brackets.getModule("command/Commands"),CommandManager=brackets.getModule("command/CommandManager"),Strings=brackets.getModule("strings"),StringUtils=brackets.getModule("utils/StringUtils"),DocumentManager=brackets.getModule("document/DocumentManager"),DefaultDialogs=brackets.getModule("widgets/DefaultDialogs"),Dialogs=brackets.getModule("widgets/Dialogs"),UrlParams=brackets.getModule("utils/UrlParams").UrlParams,FileSystem=brackets.getModule("filesystem/FileSystem");function _showError(message,title=Strings.ERROR_LOADING_EXTENSION){Dialogs.showModalDialog(DefaultDialogs.DIALOG_ID_ERROR,title,message)}function _validatePackageJson(docText){try{let packageJson=JSON.parse(docText),requiredFields=["name","title","description","homepage","version","author","license","engines"],missingFields=[];for(let requiredField of requiredFields)packageJson[requiredField]||missingFields.push(requiredField);return packageJson.engines&&!packageJson.engines.brackets&&missingFields.push('engines:{"brackets": ">=2.0.0"}'),!missingFields.length||(_showError(StringUtils.format(Strings.ERROR_INVALID_EXTENSION_PACKAGE_FIELDS,missingFields)),!1)}catch(e){return console.log("Cannot load extension",Strings.ERROR_INVALID_EXTENSION_PACKAGE),_showError(Strings.ERROR_INVALID_EXTENSION_PACKAGE),!1}}function loadCurrentExtension(){const projectRoot=ProjectManager.getProjectRoot().fullPath,file=FileSystem.getFileForPath(projectRoot+"package.json");DocumentManager.getDocumentText(file).done(function(docText){console.log(docText),_validatePackageJson(docText)&&CommandManager.execute(Commands.APP_RELOAD,!1,projectRoot)}).fail(err=>{console.log("No extension package.json in ",file.fullPath,err),Dialogs.showModalDialog(DefaultDialogs.DIALOG_ID_ERROR,Strings.ERROR_LOADING_EXTENSION,Strings.ERROR_NO_EXTENSION_PACKAGE)})}function unloadCurrentExtension(){CommandManager.execute(Commands.APP_RELOAD,!1,[])}function isProjectLoadedAsExtension(){const params=new UrlParams;return params.parse(),!!params.get("loadDevExtensionPath")}exports.loadCurrentExtension=loadCurrentExtension,exports.unloadCurrentExtension=unloadCurrentExtension,exports.isProjectLoadedAsExtension=isProjectLoadedAsExtension}),define("testBuilder",function(require,exports,module){const AppInit=brackets.getModule("utils/AppInit"),DocumentManager=brackets.getModule("document/DocumentManager"),EditorManager=brackets.getModule("editor/EditorManager"),FileSystem=brackets.getModule("filesystem/FileSystem"),Editor=brackets.getModule("editor/Editor"),Dialogs=brackets.getModule("widgets/Dialogs"),CommandManager=brackets.getModule("command/CommandManager"),Commands=brackets.getModule("command/Commands"),WorkspaceManager=brackets.getModule("view/WorkspaceManager"),MacroRunner=require("./MacroRunner"),BUILD_SCRATCH_FILE=path.join(brackets.app.getApplicationSupportDirectory(),"testBuilder.js");let builderPanel,$panel,builderEditor;function toggleTestBuilder(){if(!$panel)return $panel=$(panelHTML),(builderPanel=WorkspaceManager.createBottomPanel("phcode-test-builder-panel",$panel,100,"Test Builder")).hide(),void _setupPanel().then(()=>{builderPanel.setVisible(!builderPanel.isVisible())});builderPanel.setVisible(!builderPanel.isVisible())}const panelHTML='\n<div id="test-builder-panel-phcode" class="bottom-panel vert-resizable top-resizer">\n <div class="toolbar" style="display: flex; justify-content: space-between; align-items: center; padding: 5px 8px;">\n <div style="display: flex; gap: 4px;">\n <button class="btn btn-mini no-focus save-test-builder">Save</button>\n <button class="btn btn-mini primary no-focus run-test-builder">Run</button>\n <button class="btn btn-mini no-focus run-selected">Run Selected</button>\n </div>\n <div style="display: flex; gap: 4px;">\n <button class="btn btn-mini no-focus mark-validate" title="Validate marks at cursor">Marks</button>\n <button class="btn btn-mini no-focus cursor-locate">cursor</button>\n <button class="btn btn-mini no-focus text-validate" title="validate text">Text</button>\n </div>\n </div>\n <div style="display: flex; height: 100%; overflow: scroll;">\n <div class="test_builder-editor" style="width: 100%; height: 100%;"></div>\n </div>\n</div>';function saveFile(){return new Promise((resolve,reject)=>{CommandManager.execute(Commands.FILE_SAVE,{doc:builderEditor.document}).done(resolve).fail(function(openErr){console.error("error saving test builder file: ",BUILD_SCRATCH_FILE,openErr),reject()})})}async function runTests(macroText){saveFile();const errors=await MacroRunner.runMacro(macroText||builderEditor.document.getText());if(errors.length){let errorHTML="";for(let error of errors)errorHTML+=`${error.errorText}<br>`;Dialogs.showErrorDialog("Error running macro: ",errorHTML)}}function runSelection(){return runTests(builderEditor.getSelectedText())}function _locateCursor(){const editor=EditorManager.getActiveEditor();if(!editor)return;const formattedSelections=MacroRunner.computeCursors(editor,!0);builderEditor.replaceRange(`\n__PR.setCursors([${formattedSelections.join(", ")}]);`,builderEditor.getCursorPos()),editor.focus()}function _validateText(){const editor=EditorManager.getActiveEditor();if(!editor)return;const selection=editor.getSelection(),start=selection.start,end=selection.end,selectionText=`${start.line+1}:${start.ch+1}-${end.line+1}:${end.ch+1}`;let quotedString=editor.getSelectedText().replaceAll("\n","\\n");builderEditor.replaceRange(`\n__PR.validateText(\`${quotedString}\`, "${selectionText}");`,builderEditor.getCursorPos()),editor.focus()}function _validateMarks(){const editor=EditorManager.getActiveEditor();if(!editor)return;const marks=editor.findMarksAt(editor.getCursorPos()).filter(mark=>mark.markType),markTypeMap={};for(let mark of marks){markTypeMap[mark.markType]||(markTypeMap[mark.markType]=[]);const loc=mark.find();markTypeMap[mark.markType].push(`"${loc.from.line+1}:${loc.from.ch+1}-${loc.to.line+1}:${loc.to.ch+1}"`)}for(let markType of Object.keys(markTypeMap)){const selections=markTypeMap[markType];builderEditor.replaceRange(`\n__PR.validateMarks("${markType}", [${selections.join(", ")}]);`,builderEditor.getCursorPos())}}async function _setupPanel(){let file=FileSystem.getFileForPath(BUILD_SCRATCH_FILE),isExists;await file.existsAsync()||await new Promise(resolve=>{file.write("",{blind:!0},resolve)}),DocumentManager.getDocumentForPath(BUILD_SCRATCH_FILE).done(function(doc){const _$editor=$panel.find(".test_builder-editor");(builderEditor=new Editor.Editor(doc,!1,_$editor,null,{})).updateLayout()}),new ResizeObserver(()=>{builderEditor&&builderEditor.updateLayout()}).observe($panel[0]),$panel.find(".save-test-builder").click(saveFile),$panel.find(".run-test-builder").click(()=>{runTests()}),$panel.find(".run-selected").click(runSelection),$panel.find(".cursor-locate").click(_locateCursor),$panel.find(".text-validate").click(_validateText),$panel.find(".mark-validate").click(_validateMarks)}AppInit.appReady(function(){Phoenix.isTestWindow||($panel=$(panelHTML),(builderPanel=WorkspaceManager.createBottomPanel("phcode-test-builder-panel",$panel,100,"Test Builder")).hide(),_setupPanel())}),exports.toggleTestBuilder=toggleTestBuilder});