Compare commits

...

No commits in common. "master" and "WebView-with-Auth" have entirely different histories.

65 changed files with 10655 additions and 3563 deletions

42
.gitignore vendored
View File

@ -264,45 +264,3 @@ __pycache__/
type-script-helper-1.1.6.vsix type-script-helper-1.1.6.vsix
type-script-helper-1.1.7.vsix type-script-helper-1.1.7.vsix
type-script-helper-1.1.8.vsix type-script-helper-1.1.8.vsix
.kanbn
*.exe
*.pdb
.vscode/helper/**
type-script-helper/src/Card.js
type-script-helper/src/Card.js.map
type-script-helper/src/ColumnsToCardsWebviewViewProvider.js
type-script-helper/src/ColumnsToCardsWebviewViewProvider.js.map
type-script-helper/src/constants.js
type-script-helper/src/constants.js.map
type-script-helper/src/extension.js
type-script-helper/src/extension.js.map
type-script-helper/src/getNonce.js
type-script-helper/src/getNonce.js.map
type-script-helper/src/H2HexColor.js
type-script-helper/src/H2HexColor.js.map
type-script-helper/src/H2NoCheckboxes.js
type-script-helper/src/H2NoCheckboxes.js.map
type-script-helper/src/H2WithCheckboxes.js
type-script-helper/src/H2WithCheckboxes.js.map
type-script-helper/src/kanbanHelper.js
type-script-helper/src/kanbanHelper.js.map
type-script-helper/src/LineNumber.js
type-script-helper/src/LineNumber.js.map
type-script-helper/src/markdownHelper.js
type-script-helper/src/markdownHelper.js.map
type-script-helper/src/PostMessage.js
type-script-helper/src/PostMessage.js.map
type-script-helper/src/promiseLinesHelper.js
type-script-helper/src/promiseLinesHelper.js.map
type-script-helper/src/readOnlyLinesHelper.js
type-script-helper/src/readOnlyLinesHelper.js.map
type-script-helper/src/replaceLinesHelper.js
type-script-helper/src/replaceLinesHelper.js.map
type-script-helper/src/WebViewPanel.js
type-script-helper/src/WebViewPanel.js.map
svelte-helper/.dist/*
Application.evtx

20
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,20 @@
// A launch configuration that compiles the extension and then opens it inside a new window
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
{
"version": "0.2.0",
"configurations": [
{
"name": "Run Extension",
"type": "extensionHost",
"request": "launch",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}/type-script-helper"
],
"outFiles": [
"${workspaceFolder}/dist/**/*.js"
]
}
]
}

29
.vscode/settings.json vendored
View File

@ -1,27 +1,6 @@
{ {
"[markdown]": { "cSpell.words": [
"editor.wordWrap": "off" "Kanban",
}, "VSIX"
"cSpell.words": [ ]
"Infineon",
"initialise",
"Kanban",
"Phares",
"VSIX",
"Weightest",
"WSJF"
],
"files.eol": "\n",
"files.exclude": {
"**/dist": false,
"**/node_modules": true,
"**/out": false
},
"files.watcherExclude": {
"**/node_modules": true
},
"search.exclude": {
"**/dist": true,
"**/out": true
}
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,8 +1,5 @@
.vscode-test/ out
.vscode/helper/**
*.vsix
dist dist
node_modules node_modules
out .vscode-test/
src/*.js* *.vsix
!src/embed.js

View File

@ -3,28 +3,33 @@
// Hover to view descriptions of existing attributes. // Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
{ {
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{ {
"name": "Run Extension", "name": "Run Extension",
"type": "extensionHost", "type": "extensionHost",
"request": "launch", "request": "launch",
"preLaunchTask": "npm: webpack", "args": [
"args": [ "--extensionDevelopmentPath=${workspaceFolder}"
"--extensionDevelopmentPath=${workspaceFolder}" ],
], "outFiles": [
"outFiles": [ "${workspaceFolder}/dist/**/*.js"
"${workspaceFolder}/dist/**/*.js" ],
] "preLaunchTask": "${defaultBuildTask}"
}, },
{ {
"type": "node", "name": "Extension Tests",
"request": "launch", "type": "extensionHost",
"name": "Launch Program", "request": "launch",
"program": "${workspaceFolder}/src/extension.ts", "args": [
"outFiles": [ "--extensionDevelopmentPath=${workspaceFolder}",
"${workspaceFolder}/out/**/*.js" "--extensionTestsPath=${workspaceFolder}/out/test/suite/index"
] ],
} "outFiles": [
] "${workspaceFolder}/out/**/*.js",
"${workspaceFolder}/dist/**/*.js"
],
"preLaunchTask": "tasks: watch-tests"
}
]
} }

View File

@ -1,11 +0,0 @@
---
type: "note"
created: "2023-10-20T03:53:13.742Z"
updated: "2023-10-20T04:00:37.259Z"
---
# mklink
```bash
mklink /J "L:\Git\YO-VSCode\type-script-helper\net8.0\win-x64\publish" "L:\DevOps\Mesa_FI\File-Folder-Helper\bin\Release\net8.0\win-x64\publish"
```

View File

@ -1,29 +1,13 @@
// Place your settings in this file to overwrite default and user settings.
{ {
"[markdown]": { "files.exclude": {
"editor.wordWrap": "off" "out": false, // set this to true to hide the "out" folder with the compiled JS files
}, "dist": false // set this to true to hide the "dist" folder with the compiled JS files
"cSpell.words": [ },
"Infineon", "search.exclude": {
"initialise", "out": true, // set this to false to include "out" folder in search results
"Kanban", "dist": true // set this to false to include "dist" folder in search results
"Phares", },
"signalr", // Turn off tsc task auto detection since we have the necessary tasks as npm scripts
"VSIX", "typescript.tsc.autoDetect": "off"
"Weightest",
"WSJF"
],
"files.eol": "\n",
"files.exclude": {
"**/dist": false,
"**/node_modules": true,
"**/out": false
},
"files.watcherExclude": {
"**/node_modules": true
},
"explorer.sortOrder": "default",
"search.exclude": {
"**/dist": true,
"**/out": true
}
} }

View File

@ -1,63 +1,40 @@
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
{ {
"tasks": [ "version": "2.0.0",
{ "tasks": [
"type": "npm", {
"script": "tsc-build", "type": "npm",
"group": "build", "script": "watch",
"problemMatcher": [], "problemMatcher": "$ts-webpack-watch",
"label": "npm: tsc-build", "isBackground": true,
"detail": "tsc" "presentation": {
}, "reveal": "never",
{ "group": "watchers"
"type": "npm", },
"script": "tsc-clean", "group": {
"problemMatcher": [], "kind": "build",
"label": "npm: tsc-clean", "isDefault": true
"detail": "tsc --build --clean" }
}, },
{ {
"type": "npm", "type": "npm",
"script": "vscode:package", "script": "watch-tests",
"problemMatcher": [], "problemMatcher": "$tsc-watch",
"label": "npm: vscode:package", "isBackground": true,
"detail": "node node_modules/@vscode/vsce/vsce package" "presentation": {
}, "reveal": "never",
{ "group": "watchers"
"type": "npm", },
"script": "vscode:login", "group": "build"
"problemMatcher": [], },
"label": "npm: vscode:login", {
"detail": "node node_modules/@vscode/vsce/vsce login Infineon-Technologies-AG-Mesa-FI" "label": "tasks: watch-tests",
}, "dependsOn": [
{ "npm: watch",
"type": "npm", "npm: watch-tests"
"script": "vscode:ls-publishers", ],
"problemMatcher": [], "problemMatcher": []
"label": "npm: vscode:ls-publishers", }
"detail": "node node_modules/@vscode/vsce/vsce ls-publishers" ]
},
{
"type": "npm",
"script": "vscode:publish",
"problemMatcher": [],
"label": "npm: vscode:publish",
"detail": "node node_modules/@vscode/vsce/vsce publish"
},
{
"type": "npm",
"script": "watch",
"group": "build",
"problemMatcher": [],
"label": "npm: watch",
"detail": "concurrently \"rollup -c -w\" \"webpack --watch --config ./build/node-extension.webpack.config.js\""
},
{
"type": "npm",
"script": "webpack",
"problemMatcher": [],
"label": "npm: webpack",
"detail": "webpack --config ./build/node-extension.webpack.config.js"
}
],
"version": "2.0.0"
} }

View File

@ -1,14 +1,13 @@
.gitignore
.vscode-test/**
.vscode/** .vscode/**
.vscode-test/**
out/**
node_modules/**
src/**
.gitignore
.yarnrc .yarnrc
webpack.config.js
vsc-extension-quickstart.md
**/tsconfig.json
**/.eslintrc.json **/.eslintrc.json
**/*.map **/*.map
**/*.ts **/*.ts
**/tsconfig.json
build/**
node_modules/**
src/**
webviews/**
vsc-extension-quickstart.md
webpack.config.js

View File

@ -0,0 +1,9 @@
# Change Log
All notable changes to the "type-script-helper" extension will be documented in this file.
Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
## [Unreleased]
- Initial release

View File

@ -1,11 +1,3 @@
---
type: "note"
created: "2022-03-10T21:18:17.054Z"
updated: "2022-03-10T21:18:17.054Z"
---
# LICENSE
Copyright (c) Twitter Inc Copyright (c) Twitter Inc
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy

View File

@ -1,9 +1,3 @@
---
type: "read-me"
created: "2023-09-30T01:47:18.241Z"
updated: "2023-09-30T01:47:18.242Z"
---
# type-script-helper README # type-script-helper README
## Features ## Features
@ -22,7 +16,7 @@ yo code
# ? What's the name of your extension? HelloWorld # ? What's the name of your extension? HelloWorld
### Press <Enter> to choose default for all options below ### ### Press <Enter> to choose default for all options below ###
# ? What's the identifier of your extension? hello-world # ? What's the identifier of your extension? helloworld
# ? What's the description of your extension? LEAVE BLANK # ? What's the description of your extension? LEAVE BLANK
# ? Initialize a git repository? Yes # ? Initialize a git repository? Yes
# ? Bundle the source code with webpack? No (should be yes?) # ? Bundle the source code with webpack? No (should be yes?)
@ -114,155 +108,4 @@ None
## 1.5.1 ## 1.5.1
----------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------
- columns-to-cards-webview-view-provider - Webview
- file-folder-helper-exe
- clickable list
## 1.5.2
-----------------------------------------------------------------------------------------------------------
- file-folder-helper-exe net8.0
## 1.5.3
-----------------------------------------------------------------------------------------------------------
- Updated File-Folder-Helper ccea8de8cf49343dd4190a77ac755d233bb4e528
## 1.6.0
-----------------------------------------------------------------------------------------------------------
- Updated File-Folder-Helper 4e3f06bb44b7e85ba40a5e589e6ca871cbdbfb3e
## 1.6.1
-----------------------------------------------------------------------------------------------------------
- Updated File-Folder-Helper 299aa19d538bcfd5e06e4743a5a05f6d62960a80
- code --install-extension D:\Tmp\phares\type-script-helper-1.6.1.vsix
- code-insiders --install-extension D:\Tmp\phares\type-script-helper-1.6.1.vsix
## 1.6.2
-----------------------------------------------------------------------------------------------------------
- Updated File-Folder-Helper 47e6b85c218f994216fb35d44906850a790c36d0
- Open with Text Editor Kanban
## 1.6.4 Fri Aug 02 2024 13:07:24 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Wrap directory in quotes
## 1.7.0 Fri Aug 30 2024 11:13:09 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Copy Syntax In Light Theme
- [Copy-Syntax-in-Light](https://github.com/Ahmed-Adel-Morsi/Copy-Syntax-in-Light)
## 1.8.0 Wed Nov 06 2024 06:03:59 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Change insert date to include epoch seconds and ticks *
## 1.9.0 1735586943373 = 638711837433730000 = Mon Dec 30 2024 12:29:02 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Insert All Extensions (Not Disabled)
## 1.110.0 1735689397890 = 638712861978900000 = Tue Dec 31 2024 16:56:37 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Open Sub-Kanban in New Window
## 1.111.0 1736196204601 = 638717930046010000 = 2025-0.Winter = Mon Jan 06 2025 13:43:24 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Added season to insert date
- Removed
- kanban.refreshBoth
- kanban.refreshSidebar
- kanban.refreshWebview
- kanban.debugReload
- columns-to-cards-webview-view-provider-view
- Open Sub-Kanban in New Window
## 1.111.1 1738206291411 = 638738030914110000 = 2025-0.Winter = Wed Jan 29 2025 20:04:50 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Changed trigger for code-insiders
## 1.112.0 1738349146299 = 638739459462990000 = 2025-0.Winter = Fri Jan 31 2025 11:45:45 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Added Cost of Delay (CoD)
## 1.113.0 1739287994496 = 638748847944960000 = 2025-0.Winter = Tue Feb 11 2025 08:33:14 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Add Code Insiders lines when not present
## 1.114.0 1739295723637 = 638748925236370000 = 2025-0.Winter = Tue Feb 11 2025 10:42:03 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- infineon-mes-mike-phares
## 1.115.0 1739295727065 = 638748925270650000 = 2025-0.Winter = Tue Feb 11 2025 10:42:06 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Infineon-Technologies-AG-Mesa-FI
## 1.116.0 1740441381597 = 638760381815970000 = 2025-0.Winter = Mon Feb 24 2025 16:56:21 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Calculator
- Explorer Sort Order
## 1.117.0 1740671831803 = 638762686318030000 = 2025-0.Winter = Thu Feb 27 2025 08:57:11 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Close active after opening Sub-Kanban when directory found
## 1.118.0 1741303103654 = 638768999036540000 = 2025-0.Winter = Thu Mar 06 2025 16:18:23 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Add search page for Backlog
## 1.119.0 1744337196592 = 638799339965920000 = 2025-1.Spring = Thu Apr 10 2025 19:06:36 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Changed ADO Priority servers
## 1.120.0 1744401374311 = 638799981743110000 = 2025-1.Spring = Fri Apr 11 2025 12:56:13 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Sidebar button for view command pallette images
## 1.121.0 1744403802837 = 638800006028370000 = 2025-1.Spring = Fri Apr 11 2025 13:36:42 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Extension logo
## 1.122.0 1744403802837 = 638800006028370000 = 2025-1.Spring = Fri Apr 11 2025 13:36:42 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Extension to javascript communication
- cod-1-122-0.js
## 1.123.0 1745545527205 = 638811423272050000 = 2025-1.Spring = Thu Apr 24 2025 18:45:26 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Enable find within Cost of Delay (CoD)
## 1.123.1 1746135167656 = 638817319676560000 = 2025-1.Spring = Thu May 01 2025 14:32:47 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Spelling fixes
## 1.124.0 1749244041290 = 638848408412900000 = 2025-2.Spring = Fri Jun 06 2025 14:07:20 GMT-0700 (Mountain Standard Time)
-----------------------------------------------------------------------------------------------------------
- Delete remaining column-to-cards files
- Bun support
- Spelling of pallette
- FileSync prep
- json remove null lines
- Remove lines containing highlighted

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because one or more lines are too long

View File

@ -1,37 +0,0 @@
#HeaderGridDiv,
#DetailsGridDiv {
font-size: 12px;
min-width: 1200px;
max-width: 1200px;
}
#HeaderGrid {
font-family: monospace;
margin-top: 60px;
}
#HeaderGrid tr td {
max-width: 200px;
padding: 5px;
}
#AllGrid {
font-family: monospace;
}
.navbar-brand {
min-width: 1200px;
background-color: whitesmoke;
}
tr:nth-of-type(odd) {
background-color: #eee;
}
#AllTextarea {
font-family: monospace;
}
#th-span {
margin-right: 500px;
}

View File

@ -1,51 +0,0 @@
$(document).ready(function () {
const fromHtml = true;
const username = _webviewUsername;
const machineId = _webviewMachineId;
const baseUri = 'https://eaf-dev.mes.infineon.com';
const apiUrl = 'https://eaf-dev.mes.infineon.com/api/v1/ado/';
const windowLocationHRef = window.location.href + '?site=' + _webviewSite + 'view=' + _webviewView;
const signalRUrl = baseUri + '/signalr';
const workItems = {
a: baseUri + '/markdown/bugs-features-with-parents.json?v=2025-04-10-15-59',
b: baseUri + '/markdown/{[]}.json?v=2025-04-10-15-59',
timeout: 3000,
};
const b = {
page: 'business',
description: 'Value',
th: 'Business Value',
span: 'What is the relative value to the Customer or business?<br>• Do our users prefer this over that?<br>• What is the revenue impact on our business?<br>• Is there a potential penalty or other negative effects if we delay?'
};
const r = {
page: 'risk',
description: 'Risk',
th: 'Risk Reduction and/or Opportunity Enablement',
span: 'What else does this do for our business?<br>• Reduce the risk of this or future delivery?<br>• Is there value in the information we will receive?<br>• Enable new business opportunities?'
};
const t = {
page: 'time',
description: 'Critical',
th: 'Time Criticality',
span: 'How does user/business value decay over time?<br>• Is there a fixed deadline?<br>• Will they wait for us or move to another Solution?<br>• What is the current effect on Customer satisfaction?'
};
const c = {
page: 'cod',
description: 'CoD',
th: 'Cost of Delay (CoD)',
span: "Cost of Delay (CoD) is the money lost by delaying or not doing a job for a specific time. It's a measure of the economic value of a job over time."
};
const e = {
page: 'effort',
description: 'Effort',
th: 'Effort',
span: 'Effort'
};
const w = {
page: 'wsjf',
description: 'WSJF',
th: 'Weightest Shortest Job First calculation (WSJF)',
span: 'Weightest Shortest Job First calculation (see @SCALE formula)'
};
initIndex(fromHtml, username, machineId, windowLocationHRef, workItems, b, r, t, c, e, w, apiUrl, signalRUrl);
});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

9718
type-script-helper/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,52 +1,10 @@
{ {
"activationEvents": [ "activationEvents": [],
"onLanguage:csharp",
"onLanguage:markdown",
"onLanguage:javascript",
"onLanguage:json",
"onLanguage:typescript",
"onLanguage:yaml"
],
"categories": [ "categories": [
"Other" "Other"
], ],
"contributes": { "contributes": {
"commands": [ "commands": [
{
"category": "Calculate",
"command": "extension.calcAppendWithCursor",
"title": "Calculate and append in front of cursor"
},
{
"category": "Calculate",
"command": "extension.calcAppend",
"title": "Calculate and append"
},
{
"category": "Calculate",
"command": "extension.calcReplaceWithCursor",
"title": "Calculate and replace in front of cursor"
},
{
"category": "Explorer",
"command": "extension.rotateExplorerSortOrder",
"title": "Rotate Explorer Sort Order"
},
{
"category": "FileSync",
"command": "webview.fileSync",
"title": "FileSync"
},
{
"category": "Calculate",
"command": "extension.calcReplace",
"title": "Calculate and replace"
},
{
"category": "Helper",
"command": "copyHelper.copySyntaxInLight",
"title": "Copy Syntax In Light Theme"
},
{ {
"category": "Helper", "category": "Helper",
"command": "open-in-new-window.open", "command": "open-in-new-window.open",
@ -62,20 +20,15 @@
"command": "promiseLinesHelper.insertDateTime", "command": "promiseLinesHelper.insertDateTime",
"title": "Insert DateTime" "title": "Insert DateTime"
}, },
{
"category": "Helper",
"command": "promiseLinesHelper.insertAllExtensions",
"title": "Insert All Extensions (Not Disabled)"
},
{ {
"category": "Helper", "category": "Helper",
"command": "promiseLinesHelper.transformToParamCase", "command": "promiseLinesHelper.transformToParamCase",
"title": "Transform to Param (Kebab) Case" "title": "Transform to Param Case"
}, },
{ {
"category": "Helper", "category": "Helper",
"command": "promiseLinesHelper.transformToProperCase", "command": "promiseLinesHelper.transformToPopperCase",
"title": "Transform to Proper (Pascal) Case" "title": "Transform to Popper Case"
}, },
{ {
"category": "Helper", "category": "Helper",
@ -84,68 +37,23 @@
}, },
{ {
"category": "Kanban", "category": "Kanban",
"command": "kanban.openInNewWindow", "command": "kanban.apiAuthenticate",
"title": "Open Sub-Kanban in New Window" "title": "API Authenticate Kanban"
}, },
{ {
"category": "Kanban", "category": "Kanban",
"command": "kanban.openWithTextEditor", "command": "kanban.newEntry",
"title": "Open with Text Editor Kanban" "title": "New Kanban Entry"
}, },
{ {
"category": "Leominster", "category": "Kanban",
"command": "webview.backlogLeominster", "command": "kanban.refresh",
"title": "Backlog (Bugs & Features with parents)" "title": "Refresh Kanban"
}, },
{ {
"category": "Leominster", "category": "Kanban",
"command": "webview.costOfDelayLeominster", "command": "kanban.debugReload",
"title": "Cost of Delay (CoD)" "title": "Debug Reload Kanban"
},
{
"category": "Leominster",
"command": "webview.costOfDelayLiveLeominster",
"title": "Cost of Delay (CoD) - Live Update"
},
{
"category": "Leominster",
"command": "webview.costOfDelayEffortLeominster",
"title": "Effort"
},
{
"category": "Leominster",
"command": "webview.costOfDelayWSJFLeominster",
"title": "Weightest Shortest Job First calculation (WSJF)"
},
{
"category": "Markdown",
"command": "markdown.newMarkdownFile",
"title": "New Markdown File"
},
{
"category": "Mesa",
"command": "webview.backlogMesa",
"title": "Backlog (Bugs & Features with parents)"
},
{
"category": "Mesa",
"command": "webview.costOfDelayMesa",
"title": "Cost of Delay (CoD)"
},
{
"category": "Mesa",
"command": "webview.costOfDelayLiveMesa",
"title": "Cost of Delay (CoD) - Live Update"
},
{
"category": "Mesa",
"command": "webview.costOfDelayEffortMesa",
"title": "Effort"
},
{
"category": "Mesa",
"command": "webview.costOfDelayWSJFMesa",
"title": "Weightest Shortest Job First calculation (WSJF)"
}, },
{ {
"category": "Quick Fix", "category": "Quick Fix",
@ -222,16 +130,6 @@
"command": "replaceLinesHelper.removeComment", "command": "replaceLinesHelper.removeComment",
"title": "Remove comment" "title": "Remove comment"
}, },
{
"category": "Replace",
"command": "replaceLinesHelper.removeJsonNullValues",
"title": "Remove json null values"
},
{
"category": "Replace",
"command": "replaceLinesHelper.removeLinesContainingHighlighted",
"title": "Remove lines containing highlighted"
},
{ {
"category": "Replace", "category": "Replace",
"command": "replaceLinesHelper.sortLength", "command": "replaceLinesHelper.sortLength",
@ -263,40 +161,18 @@
"title": "Wrap Sql for VB" "title": "Wrap Sql for VB"
}, },
{ {
"category": "Webview", "category": "WebView",
"command": "webview.example", "command": "webView.webView",
"title": "Webview Example" "title": "Web View"
} }
], ],
"configuration": {
"properties": {
"fileTemplates.author": {
"default": null,
"description": "Value to use to replace #{author} variable.",
"type": [
"string",
"Mike Phares"
]
},
"fileTemplates.company": {
"default": null,
"description": "Value to use to replace #{company} variable.",
"type": [
"string",
"Infineon Technologies Americas Corp."
]
}
},
"title": "Cost of Delay Helper Configuration",
"type": "object"
},
"views": { "views": {
"view-command-pallete-webview-view-provider-view": [ "kanban-sidebar-view": [
{ {
"contextualTitle": "Infineon Technologies Americas Corp.", "contextualTitle": "Kanban",
"icon": "media/lowres-LOGO_Black.png.png", "icon": "media/checklist.svg",
"id": "view-command-pallete-webview-view-provider", "id": "kanban-sidebar",
"name": "Infineon", "name": "Kanban",
"type": "webview" "type": "webview"
} }
] ]
@ -304,70 +180,65 @@
"viewsContainers": { "viewsContainers": {
"activitybar": [ "activitybar": [
{ {
"icon": "media/lowres-LOGO_Black.png.png", "icon": "media/checklist.svg",
"id": "view-command-pallete-webview-view-provider-view", "id": "kanban-sidebar-view",
"title": "Infineon Technologies Americas Corp." "title": "Kanban"
} }
] ]
} }
}, },
"dependencies": { "dependencies": {
"@vscode/vsce": "^3.2.1", "@vscode/vsce": "^2.19.0",
"polka": "^0.5.2" "polka": "^0.5.2"
}, },
"description": "Cost of Delay Helper", "description": "Helper for VS Code in TypeScript",
"devDependencies": { "devDependencies": {
"@nodelib/fs.stat": "^3.0.0", "@rollup/plugin-commonjs": "^25.0.4",
"@types/mocha": "^10.0.6", "@rollup/plugin-node-resolve": "^15.2.1",
"@types/node": "^18.11.0", "@rollup/plugin-typescript": "^11.1.4",
"@types/vscode": "^1.63.0", "@tsconfig/svelte": "^1.0.10",
"@typescript-eslint/eslint-plugin": "^5.40.0", "@types/glob": "^8.1.0",
"@typescript-eslint/parser": "^5.40.0", "@types/mocha": "^10.0.1",
"@vscode/test-electron": "^2.4.0", "@types/node": "20.2.5",
"@vscode/test-web": "*", "@types/polka": "^0.5.1",
"concurrently": "^8.2.2", "@types/vscode": "^1.79.0",
"editor-calc": "^2.1.0", "@typescript-eslint/eslint-plugin": "^5.59.8",
"eslint": "^8.25.0", "@typescript-eslint/parser": "^5.59.8",
"eslint-config-prettier": "^8.5.0", "@vscode/test-electron": "^2.3.2",
"eslint-plugin-prettier": "^4.2.1", "concurrently": "^8.2.1",
"glob": "^10.4.1", "eslint": "^8.41.0",
"mocha": "^10.4.0", "glob": "^8.1.0",
"prettier": "^2.7.1", "mocha": "^10.2.0",
"ts-loader": "^9.4.1", "rollup": "^2.3.4",
"typescript": "^4.8.4", "rollup-plugin-svelte": "^6.1.1",
"webpack": "^5.74.0", "rollup-plugin-terser": "^7.0.2",
"webpack-cli": "^4.10.0" "svelte": "^3.31.0",
"svelte-check": "^1.1.23",
"svelte-preprocess": "^5.0.4",
"ts-loader": "^9.4.3",
"typescript": "^5.1.3",
"webpack": "^5.85.0",
"webpack-cli": "^5.1.1"
}, },
"displayName": "Cost of Delay Helper", "displayName": "Type Script Helper",
"engines": { "engines": {
"vscode": "^1.79.0" "vscode": "^1.79.0"
}, },
"icon": "media/LOGO_RGB.png",
"keywords": [
"Backlog",
"CoD",
"Cost of Delay (CoD)",
"FI",
"Infineon",
"Leominster",
"Mesa",
"Phares",
"Weightest Shortest Job First calculation (WSJF)",
"WSJF"
],
"main": "./dist/extension.js", "main": "./dist/extension.js",
"name": "infineon-technologies-ag-mesa-fi-cost-of-delay-helper", "name": "type-script-helper",
"publisher": "Infineon-Technologies-AG-Mesa-FI", "publisher": "IFX",
"repository": "https://gitea.phares.duckdns.org/phares3757/yo-vscode.git", "repository": "https://github.com/mikepharesjr/YO-VSCode/tree/master/type-script-helper",
"scripts": { "scripts": {
"tsc-build": "tsc", "compile": "webpack --config ./build/node-extension.webpack.config.js",
"tsc-clean": "tsc --build --clean", "lint": "eslint src --ext ts",
"vscode:login": "node node_modules/@vscode/vsce/vsce login Infineon-Technologies-AG-Mesa-FI", "package": "webpack --mode production --devtool hidden-source-map --config ./build/node-extension.webpack.config.js",
"vscode:ls-publishers": "node node_modules/@vscode/vsce/vsce ls-publishers", "pretest": "npm run test-compile && npm run lint",
"vscode:package": "node node_modules/@vscode/vsce/vsce package", "rollup:compile": "rollup -c && webpack --mode production",
"vscode:publish": "node node_modules/@vscode/vsce/vsce publish", "test": "node ./out/test/runTest.js",
"watch": "concurrently \"rollup -c -w\" \"webpack --watch --config ./build/node-extension.webpack.config.js\"", "test-compile": "tsc -p ./",
"webpack": "webpack --config ./build/node-extension.webpack.config.js" "test-watch": "tsc -watch -p ./",
"vscode:prepublish": "npm run package",
"watch": "concurrently \"rollup -c -w\" \"webpack --watch --config ./build/node-extension.webpack.config.js\""
}, },
"version": "1.124.0" "version": "1.5.1"
} }

View File

@ -0,0 +1,68 @@
import svelte from "rollup-plugin-svelte";
import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
import { terser } from "rollup-plugin-terser";
import sveltePreprocess from "svelte-preprocess";
import typescript from "@rollup/plugin-typescript";
import path from "path";
import fs from "fs";
const production = !process.env.ROLLUP_WATCH;
export default fs
.readdirSync(path.join(__dirname, "webviews", "pages"))
.map((input) => {
const name = input.split(".")[0];
return {
input: "webviews/pages/" + input,
output: {
sourcemap: true,
format: "iife",
name: "app",
file: "out/compiled/" + name + ".js",
},
plugins: [
svelte({
// enable run-time checks when not in production
dev: !production,
// we'll extract any component CSS out into
// a separate file - better for performance
css: (css) => {
css.write(name + ".css");
},
preprocess: sveltePreprocess(),
}),
// If you have external dependencies installed from
// npm, you'll most likely need these plugins. In
// some cases you'll need additional configuration -
// consult the documentation for details:
// https://github.com/rollup/plugins/tree/master/packages/commonjs
resolve({
browser: true,
dedupe: ["svelte"],
}),
commonjs(),
typescript({
tsconfig: "webviews/tsconfig.json",
sourceMap: !production,
inlineSources: !production,
}),
// In dev mode, call `npm run start` once
// the bundle has been generated
// !production && serve(),
// Watch the `public` directory and refresh the
// browser on changes when not in production
// !production && livereload("public"),
// If we're building for production (npm run build
// instead of npm run dev), minify
production && terser(),
],
watch: {
clearScreen: false,
},
};
});

View File

@ -1,22 +0,0 @@
import { H2HexColor } from "./H2HexColor";
import { LineNumber } from "./LineNumber";
import { H2NoCheckboxes } from "./H2NoCheckboxes";
import { H2WithCheckboxes } from "./H2WithCheckboxes";
export type Card = {
Assignees: Array<string>;
CreationDateTime: Date;
Directory: string;
Extension: string;
File: string;
FileName: string;
FileNameWithoutExtension: string;
H1: string;
H2HexColorCollection: Array<H2HexColor>;
H2NoCheckboxesCollection: Array<H2NoCheckboxes>;
H2WithCheckboxesCollection: Array<H2WithCheckboxes>;
LastWriteDateTime: Date;
LineNumber: LineNumber;
RequestedDateTime: string;
Type: string;
};

View File

@ -1,4 +0,0 @@
export type H2HexColor = {
H2: string;
HexColor: string;
};

View File

@ -1,5 +0,0 @@
export type H2NoCheckboxes = {
H2: string;
Lines: Array<string>;
};

View File

@ -1,7 +0,0 @@
export type H2WithCheckboxes = {
Completed: number;
H2: string;
NotCompleted: number;
Total: number;
};

View File

@ -1,9 +0,0 @@
export type LineNumber = {
Created: number;
H1: number;
FrontMatterYamlEnd: number;
Status: number;
Type: number;
Updated: number;
};

View File

@ -1,5 +0,0 @@
export type PostMessage = {
type: string;
value: any;
};

View File

@ -1,7 +0,0 @@
export type ReceivedMessage = {
command: string;
collection: Array<any>;
subcommand: string;
value: any;
};

View File

@ -0,0 +1,115 @@
import * as vscode from "vscode";
// import { authenticate } from "./authenticate";
import { apiBaseUrl } from "./constants";
import { key } from "./constants";
import { getNonce } from "./getNonce";
export class SidebarProvider implements vscode.WebviewViewProvider {
_view?: vscode.WebviewView;
_doc?: vscode.TextDocument;
constructor(private readonly _extensionContext: vscode.ExtensionContext) { }
public resolveWebviewView(webviewView: vscode.WebviewView) {
this._view = webviewView;
webviewView.webview.options = {
// Allow scripts in the webview
enableScripts: true,
localResourceRoots: [this._extensionContext.extensionUri],
};
webviewView.webview.html = this._getHtmlForWebview(webviewView.webview);
webviewView.webview.onDidReceiveMessage(async (data) => {
switch (data.type) {
case "logout": {
this._extensionContext.workspaceState.update(key, "");
break;
}
case "authenticate": {
// authenticate(this._extensionContext, () => {
// webviewView.webview.postMessage({
// type: "token",
// value: this._extensionContext.workspaceState.get(key),
// });
// });
webviewView.webview.postMessage({
type: "token",
value: this._extensionContext.workspaceState.get(key),
});
break;
}
case "get-token": {
webviewView.webview.postMessage({
type: "token",
value: this._extensionContext.workspaceState.get(key),
});
break;
}
case "onInfo": {
if (!data.value) {
return;
}
vscode.window.showInformationMessage(data.value);
break;
}
case "onError": {
if (!data.value) {
return;
}
vscode.window.showErrorMessage(data.value);
break;
}
}
});
}
public revive(panel: vscode.WebviewView) {
this._view = panel;
}
private _getHtmlForWebview(webview: vscode.Webview) {
const styleResetUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "reset.css")
);
const styleVSCodeUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "vscode.css")
);
const scriptUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionContext.extensionUri, "out", "compiled/sidebar.js")
);
const styleMainUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionContext.extensionUri, "out", "compiled/sidebar.css")
);
// Use a nonce to only allow a specific script to be run.
const nonce = getNonce();
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!--
Use a content security policy to only allow loading images from https or from our extension directory,
and only allow scripts that have a specific nonce.
-->
<meta http-equiv="Content-Security-Policy" content="img-src https: data:; style-src 'unsafe-inline' ${webview.cspSource
}; script-src 'nonce-${nonce}';">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="${styleResetUri}" rel="stylesheet">
<link href="${styleVSCodeUri}" rel="stylesheet">
<link href="${styleMainUri}" rel="stylesheet">
<script nonce="${nonce}">
const acquiredVsCodeApi = acquireVsCodeApi();
const apiBaseUrl = ${JSON.stringify(apiBaseUrl)}
</script>
</head>
<body>
<script nonce="${nonce}" src="${scriptUri}"></script>
</body>
</html>`;
}
}

View File

@ -1,65 +0,0 @@
import * as vscode from "vscode";
import { getNonce } from "./getNonce";
export class ViewCommandPalletteWebviewViewProvider implements vscode.WebviewViewProvider {
_webviewView?: vscode.WebviewView;
constructor(private readonly _extensionContext: vscode.ExtensionContext) {
}
public revive(webviewView: vscode.WebviewView) {
this._webviewView = webviewView;
}
public resolveWebviewView(webviewView: vscode.WebviewView) {
this._webviewView = webviewView;
webviewView.webview.options = {
// Allow scripts in the webview
enableScripts: true,
localResourceRoots: [this._extensionContext.extensionUri],
};
webviewView.webview.html = this._getHtmlForWebview(webviewView.webview);
}
private _getHtmlForWebview(webview: vscode.Webview) {
const imageA = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "Screenshot 2025-04-11 125031.png")
);
const imageB = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "Screenshot 2025-04-11 125350.png")
);
// Use a nonce to only allow a specific script to be run.
const nonce = getNonce();
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!--
Use a content security policy to only allow loading images from https or from our extension directory,
and only allow scripts that have a specific nonce.
-->
<meta http-equiv="Content-Security-Policy"
content="img-src https: data:;
style-src 'unsafe-inline' ${webview.cspSource};
script-src 'nonce-${nonce}';">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h1>Infineon Technologies Americas Corp.</h1>
<ul>
<li>View</li>
<li>Command Pallette... Ctrl+Shift+P</li>
<li>Type Mesa or Leominster</li>
<li>Select item</li>
</ul>
<img src="${imageA}" alt="Screenshot 2025-04-11 125031.png" width="75%" height="75%">
<img src="${imageB}" alt="Screenshot 2025-04-11 125350" width="75%" height="75%">
</body>
</html>`;
}
}

View File

@ -0,0 +1,165 @@
import * as vscode from "vscode";
import { getNonce } from "./getNonce";
export class WebViewPanel {
/**
* Track the currently panel. Only allow a single panel to exist at a time.
*/
public static currentPanel: WebViewPanel | undefined;
public static readonly viewType = "web-view-panel";
private readonly _panel: vscode.WebviewPanel;
private readonly _extensionUri: vscode.Uri;
private _disposables: vscode.Disposable[] = [];
public static createOrShow(extensionUri: vscode.Uri) {
const column = vscode.window.activeTextEditor
? vscode.window.activeTextEditor.viewColumn
: undefined;
// If we already have a panel, show it.
if (WebViewPanel.currentPanel) {
WebViewPanel.currentPanel._panel.reveal(column);
WebViewPanel.currentPanel._update();
return;
}
// Otherwise, create a new panel.
const panel = vscode.window.createWebviewPanel(
WebViewPanel.viewType,
"Web-View-Panel",
column || vscode.ViewColumn.One,
{
// Enable javascript in the webview
enableScripts: true,
// And restrict the webview to only loading content from our extension's `media` directory.
localResourceRoots: [
vscode.Uri.joinPath(extensionUri, "media"),
vscode.Uri.joinPath(extensionUri, "out/compiled"),
],
}
);
WebViewPanel.currentPanel = new WebViewPanel(panel, extensionUri);
}
public static kill() {
WebViewPanel.currentPanel?.dispose();
WebViewPanel.currentPanel = undefined;
}
public static revive(panel: vscode.WebviewPanel, extensionUri: vscode.Uri) {
WebViewPanel.currentPanel = new WebViewPanel(panel, extensionUri);
}
private constructor(panel: vscode.WebviewPanel, extensionUri: vscode.Uri) {
this._panel = panel;
this._extensionUri = extensionUri;
// Set the webview's initial html content
this._update();
// Listen for when the panel is disposed
// This happens when the user closes the panel or when the panel is closed programmatically
this._panel.onDidDispose(() => this.dispose(), null, this._disposables);
// // Handle messages from the webview
// this._panel.webview.onDidReceiveMessage(
// (message) => {
// switch (message.command) {
// case "alert":
// vscode.window.showErrorMessage(message.text);
// return;
// }
// },
// null,
// this._disposables
// );
}
public dispose() {
WebViewPanel.currentPanel = undefined;
// Clean up our resources
this._panel.dispose();
while (this._disposables.length) {
const x = this._disposables.pop();
if (x) {
x.dispose();
}
}
}
private async _update() {
const webview = this._panel.webview;
this._panel.webview.html = this._getHtmlForWebview(webview);
webview.onDidReceiveMessage(async (data) => {
switch (data.type) {
case "onInfo": {
if (!data.value) {
return;
}
vscode.window.showInformationMessage(data.value);
break;
}
case "onError": {
if (!data.value) {
return;
}
vscode.window.showErrorMessage(data.value);
break;
}
// case "tokens": {
// await Util.globalState.update(accessTokenKey, data.accessToken);
// await Util.globalState.update(refreshTokenKey, data.refreshToken);
// break;
// }
}
});
}
private _getHtmlForWebview(webview: vscode.Webview) {
// // And the uri we use to load this script in the webview
const scriptUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionUri, "out/compiled", "WebView.js")
);
// Uri to load styles into webview
const stylesResetUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionUri, "media", "reset.css")
);
const stylesMainUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionUri, "media", "vscode.css")
);
// const cssUri = webview.asWebviewUri(
// vscode.Uri.joinPath(this._extensionUri, "out", "compiled/swiper.css")
// );
// // Use a nonce to only allow specific scripts to be run
const nonce = getNonce();
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!--
Use a content security policy to only allow loading images from https or from our extension directory,
and only allow scripts that have a specific nonce.
-->
<meta http-equiv="Content-Security-Policy" content="img-src https: data:; style-src 'unsafe-inline' ${webview.cspSource}; script-src 'nonce-${nonce}';">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="${stylesResetUri}" rel="stylesheet">
<link href="${stylesMainUri}" rel="stylesheet">
<script nonce="${nonce}">
</script>
</head>
<body>
</body>
<script src="${scriptUri}" nonce="${nonce}">
</html>`;
}
}

View File

@ -1,223 +0,0 @@
import * as vscode from "vscode";
import { getNonce } from "./getNonce";
import { apiBaseUrl } from "./constants";
export class WebviewPanelCostOfDelay {
/**
* Track the currently panel. Only allow a single panel to exist at a time.
*/
public static _site: string;
public static _view: string;
public static _title: string;
public static currentPanel: WebviewPanelCostOfDelay | undefined;
public static readonly viewType = "web-view-panel";
private _disposables: vscode.Disposable[] = [];
public static createOrShow(extensionContext: vscode.ExtensionContext, site: string, view: string) {
this._site = site;
this._view = view;
const column = vscode.window.activeTextEditor
? vscode.window.activeTextEditor.viewColumn
: undefined;
const title = view === '' ? 'Cost of Delay (CoD)' :
view === 'EFFORT' ? 'Effort' :
view === 'LIVE' ? 'Cost of Delay (CoD) - Live Update' :
view === 'HTML' ? 'Backlog (Bugs & Features with parents)' :
view === 'WSJF' ? 'Weightest Shortest Job First calculation (WSJF)' :
'CoD';
this._title = title;
// If we already have a panel, show it.
if (WebviewPanelCostOfDelay.currentPanel) {
WebviewPanelCostOfDelay.currentPanel._panel.reveal(column);
WebviewPanelCostOfDelay.currentPanel._update(site, title, view);
return;
}
// Otherwise, create a new panel.
const panel = vscode.window.createWebviewPanel(
WebviewPanelCostOfDelay.viewType,
title,
column || vscode.ViewColumn.One,
{
// Enable javascript in the webview
enableScripts: true,
enableFindWidget: true,
// And restrict the webview to only loading content from our extension's `media` directory.
localResourceRoots: [
vscode.Uri.joinPath(extensionContext.extensionUri, "media"),
vscode.Uri.joinPath(extensionContext.extensionUri, "out/compiled"),
],
}
);
WebviewPanelCostOfDelay.currentPanel = new WebviewPanelCostOfDelay(extensionContext, panel, site, title, view);
}
public static kill() {
WebviewPanelCostOfDelay.currentPanel?.dispose();
WebviewPanelCostOfDelay.currentPanel = undefined;
}
public static revive(panel: vscode.WebviewPanel, extensionContext: vscode.ExtensionContext) {
WebviewPanelCostOfDelay.currentPanel = new WebviewPanelCostOfDelay(extensionContext, panel, this._site, this._title, this._view);
}
private constructor(private readonly _extensionContext: vscode.ExtensionContext, private readonly _panel: vscode.WebviewPanel, site: string, title: string, view: string) {
// Set the webview's initial html content
this._update(site, title, view);
// Listen for when the panel is disposed
// This happens when the user closes the panel or when the panel is closed programmatically
this._panel.onDidDispose(() => this.dispose(), null, this._disposables);
// Handle messages from the webview
this._panel.webview.onDidReceiveMessage(
(message) => {
switch (message.command) {
case "alert":
vscode.window.showErrorMessage(message.text);
return;
default:
vscode.window.showErrorMessage(message.text);
break;
}
},
null,
this._disposables
);
}
public dispose() {
WebviewPanelCostOfDelay.currentPanel = undefined;
// Clean up our resources
this._panel.dispose();
while (this._disposables.length) {
const x = this._disposables.pop();
if (x) {
x.dispose();
}
}
}
private async _update(site: string, title: string, view: string) {
const webview = this._panel.webview;
this._panel.webview.html = this._getHtmlForWebview(site, title, view, webview);
webview.onDidReceiveMessage(async (message: string) => {
vscode.window.showErrorMessage(message);
});
}
private _getHtmlForWebview(site: string, title: string, view: string, webview: vscode.Webview) {
const baseUri = 'https://eaf-dev.mes.infineon.com';
const scriptUri = 'cod-1-123-0.js?v=2025-04-14-08-10';
// Use a nonce to only allow a specific script to be run.
const nonce = getNonce();
if (view === 'HTML') {
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Infineon - ${title}</title>
</head>
<body>
<iframe width="100%" style="height: 100vh;" src="${baseUri}/html/mes.html?site=${site}" title="${title}">
</iframe>
</body>
</html>`;
}
else {
const styleBootstrapUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "bootstrap.min.css")
);
const styleCostOfDelayUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "cod.css")
);
const scriptJQueryUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "jquery-1.6.4.min.js")
);
const scriptSignalRUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "jquery.signalR-2.4.3.min.js")
);
const scriptCostOfDelayUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "cost-of-delay.js")
);
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Infineon - ${title}</title>
<link href="${styleBootstrapUri}" rel="stylesheet" />
<link href="${styleCostOfDelayUri}" rel="stylesheet" />
<script nonce="${nonce}" src="${scriptJQueryUri}"></script>
<script nonce="${nonce}" src="${scriptSignalRUri}"></script>
<script nonce="${nonce}" src="${baseUri}/js/${scriptUri}" type="text/javascript"></script>
<script nonce="${nonce}">
const _webviewSite = '${site}';
const _webviewView = '${view}';
const acquiredVsCodeApi = acquireVsCodeApi();
const apiBaseUrl = ${JSON.stringify(apiBaseUrl)}
const _webviewUsername = '${process.env.USERNAME}';
const _webviewMachineId = '${vscode.env.machineId}';
</script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-brand">
<span id="siteHeader">&nbsp;</span> -
<span id="th-span">&nbsp;</span>
<button id="toggle">Toggle</button>
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
</ul>
<p class="navbar-text navbar-right">
&nbsp;
</p>
</div>
</div>
</div>
<div class="container-fluid body-content" style="margin-top: 40px; margin-left: 15px;">
<div id="HeaderGridDiv">
<table id="HeaderGrid" border="1"></table>
</div>
<br />&nbsp;
<div id="AllGridDiv">
<table id="AllGrid"></table>
</div>
<textarea id="AllTextarea" rows="20" cols="147"></textarea>
</div>
<script nonce="${nonce}" src="${scriptCostOfDelayUri}"></script>
</body>
</html>`;
}
}
}

View File

@ -1,167 +0,0 @@
import * as vscode from "vscode";
import { getNonce } from "./getNonce";
import { apiBaseUrl } from "./constants";
import { PostMessage } from "./PostMessage";
export function refreshWebviewPanelExample(extensionContext: vscode.ExtensionContext): any {
WebviewPanelExample.kill();
WebviewPanelExample.createOrShow(extensionContext);
}
export class WebviewPanelExample {
/**
* Track the currently panel. Only allow a single panel to exist at a time.
*/
public static currentPanel: WebviewPanelExample | undefined;
public static readonly viewType = "web-view-panel";
private _disposables: vscode.Disposable[] = [];
public static createOrShow(extensionContext: vscode.ExtensionContext) {
const column = vscode.window.activeTextEditor
? vscode.window.activeTextEditor.viewColumn
: undefined;
// If we already have a panel, show it.
if (WebviewPanelExample.currentPanel) {
WebviewPanelExample.currentPanel._panel.reveal(column);
WebviewPanelExample.currentPanel._update();
return;
}
// Otherwise, create a new panel.
const panel = vscode.window.createWebviewPanel(
WebviewPanelExample.viewType,
"Web-View-Panel",
column || vscode.ViewColumn.One,
{
// Enable javascript in the webview
enableScripts: true,
enableFindWidget: true,
// And restrict the webview to only loading content from our extension's `media` directory.
localResourceRoots: [
vscode.Uri.joinPath(extensionContext.extensionUri, "media"),
vscode.Uri.joinPath(extensionContext.extensionUri, "out/compiled"),
],
}
);
WebviewPanelExample.currentPanel = new WebviewPanelExample(panel, extensionContext);
}
public static kill() {
WebviewPanelExample.currentPanel?.dispose();
WebviewPanelExample.currentPanel = undefined;
}
public static revive(panel: vscode.WebviewPanel, extensionContext: vscode.ExtensionContext) {
WebviewPanelExample.currentPanel = new WebviewPanelExample(panel, extensionContext);
}
private constructor(private readonly _panel: vscode.WebviewPanel, private readonly _extensionContext: vscode.ExtensionContext) {
// Set the webview's initial html content
this._update();
// Listen for when the panel is disposed
// This happens when the user closes the panel or when the panel is closed programmatically
this._panel.onDidDispose(() => this.dispose(), null, this._disposables);
// // Handle messages from the webview
// this._panel.webview.onDidReceiveMessage(
// (message) => {
// switch (message.command) {
// case "alert":
// vscode.window.showErrorMessage(message.text);
// return;
// }
// },
// null,
// this._disposables
// );
}
public dispose() {
WebviewPanelExample.currentPanel = undefined;
// Clean up our resources
this._panel.dispose();
while (this._disposables.length) {
const x = this._disposables.pop();
if (x) {
x.dispose();
}
}
}
private async _update() {
const webview = this._panel.webview;
this._panel.webview.html = this._getHtmlForWebview(webview);
webview.onDidReceiveMessage(async (postMessage: PostMessage) => {
switch (postMessage.type) {
case "on-info":
if (!postMessage.value)
return;
vscode.window.showInformationMessage(postMessage.value);
break;
case "on-error":
if (!postMessage.value)
return;
vscode.window.showErrorMessage(postMessage.value);
break;
default:
vscode.window.showErrorMessage(postMessage.type);
break;
}
});
}
private _getHtmlForWebview(webview: vscode.Webview) {
const styleResetUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "reset.css")
);
const styleVSCodeUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "vscode.css")
);
const scriptUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionContext.extensionUri, "out", "compiled/DisplayDate.js")
);
const styleMainUri = webview.asWebviewUri(
vscode.Uri.joinPath(this._extensionContext.extensionUri, "out", "compiled/DisplayDate.css")
);
// Use a nonce to only allow a specific script to be run.
const nonce = getNonce();
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!--
Use a content security policy to only allow loading images from https or from our extension directory,
and only allow scripts that have a specific nonce.
-->
<meta http-equiv="Content-Security-Policy"
content="img-src https: data:;
style-src 'unsafe-inline' ${webview.cspSource};
script-src 'nonce-${nonce}';">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="${styleResetUri}" rel="stylesheet">
<link href="${styleVSCodeUri}" rel="stylesheet">
<link href="${styleMainUri}" rel="stylesheet">
<script nonce="${nonce}">
const acquiredVsCodeApi = acquireVsCodeApi();
const apiBaseUrl = ${JSON.stringify(apiBaseUrl)}
</script>
</head>
<body>
<script nonce="${nonce}" src="${scriptUri}"></script>
</body>
</html>`;
}
}

View File

@ -1,241 +0,0 @@
import { readFile } from 'fs';
import * as vscode from 'vscode';
import { getNonce } from './getNonce';
import { fileFolderHelperExe } from './constants';
import { ExecException, exec } from 'child_process';
import { ReceivedMessage } from './ReceivedMessage';
async function postRelativePath(extensionUri: vscode.Uri, webviewPanel: vscode.WebviewPanel, receivedMessage: ReceivedMessage) {
if (vscode.workspace.workspaceFolders === undefined) {
vscode.window.showInformationMessage('Open workspace first!');
}
else {
const workspaceFoldersZero = vscode.workspace.workspaceFolders[0].uri;
const inputUri: vscode.Uri = vscode.Uri.joinPath(workspaceFoldersZero, '.vscode', 'input.json');
readFile(inputUri.fsPath, (err, data) =>
inputUriRead(extensionUri, webviewPanel, receivedMessage, workspaceFoldersZero, inputUri, err, data.toString('utf8')));
}
}
function inputUriRead(extensionUri: vscode.Uri, webviewPanel: vscode.WebviewPanel, receivedMessage: ReceivedMessage, workspaceFoldersZero: vscode.Uri, inputUri: vscode.Uri, err: NodeJS.ErrnoException | null, data: string) {
if (err) {
vscode.window.showInformationMessage(`<${inputUri.fsPath}> doesn't exist! ${err.message}`);
}
else {
const jsonObject: any = JSON.parse(data);
if (!jsonObject.BaseAddresses || !jsonObject.Page || jsonObject.BaseAddresses.length === 0) {
vscode.window.showInformationMessage(`<${inputUri.fsPath}> doesn't have valid json! ${data}`);
}
else {
const relativePathUri: vscode.Uri = vscode.Uri.joinPath(workspaceFoldersZero, '.vscode', 'RelativePath.json');
const fileFolderHelper: vscode.Uri = vscode.Uri.joinPath(extensionUri, 'net8.0', 'win-x64', 'publish', fileFolderHelperExe);
const command: string = `${fileFolderHelper.fsPath} s X "${workspaceFoldersZero.fsPath}" Day-Helper-2025-05-19 "${inputUri.fsPath}"`;
exec(command, (error, stdout, stderr) =>
execCallback(webviewPanel, receivedMessage, jsonObject, relativePathUri, error, stdout, stderr));
}
}
}
function execCallback(webviewPanel: vscode.WebviewPanel, receivedMessage: ReceivedMessage, jsonObject: any, relativePathUri: vscode.Uri, error: ExecException | null, stdout: string, stderr: string) {
if (error) {
vscode.window.showInformationMessage(error.message);
return;
}
if (stderr) {
vscode.window.showInformationMessage(stderr);
return;
}
console.log(`stdout: ${stdout}`);
readFile(relativePathUri.fsPath, (err, data) =>
relativePathUriRead(webviewPanel, receivedMessage, jsonObject, relativePathUri, err, data.toString('utf8')));
};
function relativePathUriRead(webviewPanel: vscode.WebviewPanel, receivedMessage: ReceivedMessage, jsonObject: any, relativePathUri: vscode.Uri, err: NodeJS.ErrnoException | null, data: string) {
if (err) {
vscode.window.showInformationMessage(`<${relativePathUri.fsPath}> doesn't exist! ${err.message}`);
}
else {
// const jsonObject: any = JSON.parse(data);
// const receivedMessage: ReceivedMessage = { command: 'File-Folder-Helper', subcommand: 'post', value: jsonObject, collection: [] };
// receivedMessage.command = 'done';
// webviewPanel.webview.postMessage(receivedMessage);
const message = { command: receivedMessage.subcommand, from: receivedMessage.command + '-' + receivedMessage.subcommand, input: jsonObject, relativePath: data };
webviewPanel.webview.postMessage(message);
}
}
export class WebviewPanelFileSync {
public static _title: string;
public static readonly viewType = 'web-view-panel';
public static currentPanel: WebviewPanelFileSync | undefined;
private _disposables: vscode.Disposable[] = [];
public static createOrShow(extensionContext: vscode.ExtensionContext, title: string) {
this._title = title;
const column = vscode.window.activeTextEditor
? vscode.window.activeTextEditor.viewColumn
: undefined;
if (WebviewPanelFileSync.currentPanel) {
WebviewPanelFileSync.currentPanel._panel.reveal(column);
WebviewPanelFileSync.currentPanel._update(title);
return;
}
const panel = vscode.window.createWebviewPanel(
WebviewPanelFileSync.viewType,
title,
column || vscode.ViewColumn.One,
{
enableScripts: true,
enableFindWidget: true,
localResourceRoots: [
vscode.Uri.joinPath(extensionContext.extensionUri, 'dist'),
vscode.Uri.joinPath(extensionContext.extensionUri, 'media'),
],
}
);
WebviewPanelFileSync.currentPanel = new WebviewPanelFileSync(extensionContext, panel, title);
}
public static kill() {
WebviewPanelFileSync.currentPanel?.dispose();
WebviewPanelFileSync.currentPanel = undefined;
}
public static revive(panel: vscode.WebviewPanel, extensionContext: vscode.ExtensionContext) {
WebviewPanelFileSync.currentPanel = new WebviewPanelFileSync(extensionContext, panel, this._title);
}
public dispose() {
WebviewPanelFileSync.currentPanel = undefined;
this._panel.dispose();
while (this._disposables.length) {
const x = this._disposables.pop();
if (x) {
x.dispose();
}
}
}
private constructor(private readonly _extensionContext: vscode.ExtensionContext, private readonly _panel: vscode.WebviewPanel, title: string) {
this._update(title);
this._panel.onDidDispose(() => this.dispose(), null, this._disposables);
}
private async _update(title: string) {
const webview = this._panel.webview;
this._panel.webview.html = this._getHtmlForWebview(title, webview);
webview.onDidReceiveMessage(
(receivedMessage: ReceivedMessage) => {
WebviewPanelFileSync.onDidReceiveMessage(
this._extensionContext.extensionUri,
this._panel,
receivedMessage
);
},
null,
this._disposables
);
}
private static onDidReceiveMessage(extensionUri: vscode.Uri, webviewPanel: vscode.WebviewPanel, receivedMessage: ReceivedMessage) {
switch (receivedMessage.command) {
case 'alert':
vscode.window.showErrorMessage(receivedMessage.value);
return;
case fileFolderHelperExe:
if (receivedMessage.subcommand === 'post') {
postRelativePath(extensionUri, webviewPanel, receivedMessage);
}
return;
default:
vscode.window.showErrorMessage(receivedMessage.value);
break;
}
}
private _getHtmlForWebview(title: string, webview: vscode.Webview) {
// Use a nonce to only allow a specific script to be run.
const nonce = getNonce();
if (title === 'HTML') {
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Infineon - ${title}</title>
</head>
<body>
${title}
</body>
</html>`;
}
else {
const styleCostOfDelayUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "cod.css"));
const scriptEmbedRollup = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionContext.extensionUri, "dist", "embed-rollup.js"));
const scriptJQueryUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "jquery-1.6.4.min.js"));
const styleBootstrapUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionContext.extensionUri, "media", "bootstrap.min.css"));
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Infineon - ${title}</title>
<link href="${styleBootstrapUri}" rel="stylesheet" />
<link href="${styleCostOfDelayUri}" rel="stylesheet" />
<script nonce="${nonce}" src="${scriptJQueryUri}" type="text/javascript"></script>
<script nonce="${nonce}" type="text/javascript">
const acquiredVsCodeApi = acquireVsCodeApi();
const _webviewUsername = '${process.env.USERNAME}';
const _webviewMachineId = '${vscode.env.machineId}';
</script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-brand">
<span id="siteHeader">&nbsp;</span> -
<span id="th-span">&nbsp;</span>
<button id="toggle" onclick="getRelativePathAndPost()">Toggle</button>
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
</ul>
<p class="navbar-text navbar-right">
&nbsp;
</p>
</div>
</div>
</div>
<div class="container-fluid body-content" style="margin-top: 40px; margin-left: 15px;">
<script nonce="${nonce}" src="${scriptEmbedRollup}" type="text/javascript"></script>
<div id="HeaderGridDiv">
<table id="HeaderGrid" border="1"></table>
</div>
<br />&nbsp;
<textarea id="AllTextarea" rows="20" cols="147"></textarea>
</div>
</body>
</html>`;
}
}
}

View File

@ -0,0 +1,34 @@
// import * as vscode from "vscode";
// import { apiBaseUrl } from "./constants";
// import { key } from "./constants";
// import * as polka from "polka";
// export const authenticate = (extensionContext: vscode.ExtensionContext, fn: () => void) => {
// const app = polka();
// app.get(`/auth/:token`, async (req, res) => {
// const { token } = req.params;
// if (!token) {
// res.end(`<h1>something went wrong</h1>`);
// return;
// }
// await extensionContext.workspaceState.update(key, token);
// fn();
// res.end(`<h1>auth was successful, you can close this now</h1>`);
// (app as any).server.close();
// });
// app.listen(54321, (err: Error) => {
// if (err) {
// vscode.window.showErrorMessage(err.message);
// } else {
// vscode.commands.executeCommand(
// "vscode.open",
// vscode.Uri.parse(`${apiBaseUrl}/auth/github`)
// );
// }
// });
// };

View File

@ -1,193 +0,0 @@
import * as vscode from 'vscode';
import * as editorCalc from 'editor-calc';
export class CalcProvider implements vscode.CompletionItemProvider {
public enableActive: boolean;
private decorationType: vscode.TextEditorDecorationType;
constructor(
public config: vscode.WorkspaceConfiguration,
private onError: (error: unknown) => any,
) {
this.enableActive = false;
this.decorationType = vscode.window.createTextEditorDecorationType({
dark: {
border: '1px dashed gray',
},
light: {
border: '1px dashed black',
},
});
}
public async highlight(range: vscode.Range) {
const editor = vscode.window.activeTextEditor;
if (editor) {
editor.setDecorations(this.decorationType, [range]);
}
}
public async clearHighlight() {
const editor = vscode.window.activeTextEditor;
if (editor) {
editor.setDecorations(this.decorationType, []);
}
}
public calculateLine(
position: vscode.Position,
exprLine: string,
): {
skip: number;
result: string;
insertText: string;
expressionRange: vscode.Range;
expressionWithEqualSignRange: vscode.Range;
expressionEndRange: vscode.Range;
} | null {
let skip, result;
try {
({ skip, result } = editorCalc.calculate(exprLine));
} catch (error) {
this.onError(error);
return null;
}
const formulaRaw = exprLine.slice(skip);
const leftMatches = formulaRaw.match(/^\s+/);
const leftEmpty = leftMatches ? leftMatches[0].length : 0;
const rightMatches = formulaRaw.match(/[\s=]+$/);
const rightEmpty = rightMatches ? rightMatches[0].length : 0;
const insertText = exprLine.endsWith(' =') ? ` ${result}` : result;
return {
skip,
result,
insertText,
expressionRange: new vscode.Range(
position.line,
skip + leftEmpty,
position.line,
position.character - rightEmpty,
),
expressionWithEqualSignRange: new vscode.Range(
position.line,
skip + leftEmpty,
position.line,
position.character,
),
expressionEndRange: new vscode.Range(
position.line,
position.character,
position.line,
position.character,
),
};
}
private getCompletionResultsFromExtraCursors(document: vscode.TextDocument): {
additionalReplacements: vscode.Range[];
additionalTextInserts: string[];
additionalResults: string[];
} {
const additionalReplacements = [];
const additionalTextInserts = [];
const additionalResults = [];
const editor = vscode.window.activeTextEditor;
if (editor) {
for (const selection of editor.selections.slice(1)) {
const position = selection.active;
const exprLine = document.getText(
new vscode.Range(new vscode.Position(position.line, 0), position),
);
const lineCalcResult = this.calculateLine(position, exprLine);
if (lineCalcResult == null) {
continue;
}
const { expressionWithEqualSignRange, insertText, result } =
lineCalcResult;
additionalReplacements.push(expressionWithEqualSignRange);
additionalTextInserts.push(insertText);
additionalResults.push(result);
}
}
return { additionalReplacements, additionalTextInserts, additionalResults };
}
public async provideCompletionItems(
document: vscode.TextDocument,
position: vscode.Position,
_token: vscode.CancellationToken,
_context: vscode.CompletionContext,
): Promise<vscode.CompletionItem[]> {
const exprLine = document.getText(
new vscode.Range(new vscode.Position(position.line, 0), position),
);
if (!this.enableActive && !exprLine.trimRight().endsWith('=')) {
return [];
}
const lineCalcResult = this.calculateLine(position, exprLine);
if (lineCalcResult == null) {
return [];
}
const {
skip,
result,
expressionRange,
expressionWithEqualSignRange,
expressionEndRange,
insertText,
} = lineCalcResult;
this.clearHighlight().catch(this.onError);
this.highlight(expressionRange).catch(this.onError);
const { additionalReplacements, additionalTextInserts, additionalResults } =
this.getCompletionResultsFromExtraCursors(document);
const documentationPostfix =
additionalResults.length > 0 ? ' (multiple)' : '';
return [
{
label: result,
kind: vscode.CompletionItemKind.Constant,
detail: `calc append${documentationPostfix}`,
documentation: `\`${exprLine
.slice(skip)
.trimStart()}${insertText}\`${documentationPostfix}`,
range: expressionEndRange,
additionalTextEdits: [
vscode.TextEdit.insert(expressionWithEqualSignRange.end, insertText),
...additionalReplacements.map((replacementRange, i) =>
vscode.TextEdit.insert(replacementRange.end, additionalTextInserts[i]),
),
],
insertText: '', // text specified here will be inserted on every line
},
{
label: result,
kind: vscode.CompletionItemKind.Constant,
detail: `calc replace${documentationPostfix}`,
documentation: `\`${result}\`${documentationPostfix}`,
additionalTextEdits: [
vscode.TextEdit.replace(expressionWithEqualSignRange, result),
...additionalReplacements.map((replacementRange, i) =>
vscode.TextEdit.replace(replacementRange, additionalResults[i]),
),
],
insertText: '',
},
];
}
async resolveCompletionItem(
item: vscode.CompletionItem,
_token: vscode.CancellationToken,
): Promise<vscode.CompletionItem> {
return item;
}
}

View File

@ -1,3 +1,2 @@
export const key: string = 'type-script-helper'; export const key = "type-script-helper";
export const apiBaseUrl: string = 'http://localhost:3002'; export const apiBaseUrl = "http://localhost:3002";
export const fileFolderHelperExe: string = 'File-Folder-Helper.exe'

View File

@ -1,37 +0,0 @@
import * as vscode from 'vscode';
async function copySyntaxInLightLogic(): Promise<any> {
try {
// Get the current configuration
const config = vscode.workspace.getConfiguration();
// Get the current color theme
const currentTheme = config.get("workbench.colorTheme");
// Set the color theme to "Default Light+"
await config.update(
"workbench.colorTheme",
"Default Light Modern",
vscode.ConfigurationTarget.Global
);
// Copy Selected Text
await vscode.commands.executeCommand(
"editor.action.clipboardCopyAction"
);
// Show success message
vscode.window.showInformationMessage("Text copied in Light Mode");
// Switch back to dark theme
await config.update(
"workbench.colorTheme",
currentTheme,
vscode.ConfigurationTarget.Global
);
} catch (error) {
vscode.window.showErrorMessage(`Error: ${error}`);
}
}
export const copySyntaxInLight = () => copySyntaxInLightLogic();

View File

@ -1,162 +1,49 @@
// The module 'vscode' contains the VS Code extensibility API // The module 'vscode' contains the VS Code extensibility API
// Import the module and reference it with the alias vscode in your code below // Import the module and reference it with the alias vscode in your code below
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import * as Calculator from './calculator';
import * as copyHelper from './copyHelper';
import * as kanbanHelper from './kanbanHelper'; import * as kanbanHelper from './kanbanHelper';
import * as markdownHelper from './markdownHelper';
import * as settingsHelper from './settingsHelper';
import * as promiseLinesHelper from './promiseLinesHelper';
import * as replaceLinesHelper from './replaceLinesHelper'; import * as replaceLinesHelper from './replaceLinesHelper';
import * as readOnlyLinesHelper from './readOnlyLinesHelper'; import * as readOnlyLinesHelper from './readOnlyLinesHelper';
import * as WebviewPanelExample from './WebviewPanelExample'; import * as promiseLinesHelper from './promiseLinesHelper';
import * as WebviewPanelFileSync from './WebviewPanelFileSync'; import { SidebarProvider } from "./SidebarProvider";
import * as WebviewPanelCostOfDelay from './WebviewPanelCostOfDelay'; import { WebViewPanel } from "./WebViewPanel";
import { ViewCommandPalletteWebviewViewProvider } from "./ViewCommandPalletteWebviewViewProvider";
// This method is called when your extension is activated // This method is called when your extension is activated
// Your extension is activated the very first time the command is executed // Your extension is activated the very first time the command is executed
export async function activate(extensionContext: vscode.ExtensionContext) { export async function activate(extensionContext: vscode.ExtensionContext) {
const viewCommandPalletteWebviewViewProvider = new ViewCommandPalletteWebviewViewProvider(extensionContext); const sidebarProvider = new SidebarProvider(extensionContext);
extensionContext.subscriptions.push(vscode.window.registerWebviewViewProvider("view-command-Pallette-webview-view-provider", viewCommandPalletteWebviewViewProvider));
const config = vscode.workspace.getConfiguration('calc'); const item = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right);
const outputChannel = vscode.window.createOutputChannel('calc'); item.text = "$(beaker) Show Kanban";
// item.command = "kanban.show";
item.show();
const onError = (error: unknown) => { extensionContext.subscriptions.push(vscode.window.registerWebviewViewProvider("kanban-sidebar", sidebarProvider));
if (error instanceof Error) {
outputChannel.appendLine(error.message);
if (error.stack) outputChannel.appendLine(error.stack);
} else {
outputChannel.appendLine((error as any).toString().message);
}
};
const calcProvider = new Calculator.CalcProvider(config, onError); // Use the console to output diagnostic information (console.log) and errors (console.error)
// This line of code will only be executed once when your extension is activated
console.log('Congratulations, your extension "type-script-helper" is now active!');
extensionContext.subscriptions.push( // // The command has been defined in the package.json file
vscode.languages.registerCompletionItemProvider('*', calcProvider, '=', ' '), // // Now provide the implementation of the command with registerCommand
vscode.workspace.onDidOpenTextDocument(() => { // // The commandId parameter must match the command field in package.json
calcProvider.clearHighlight().catch(onError); // let disposable = vscode.commands.registerCommand('type-script-helper.helloWorld', () => {
}), // // The code you place here will be executed every time your command is executed
vscode.window.onDidChangeTextEditorSelection(() => { // // Display a message box to the user
calcProvider.clearHighlight().catch(onError); // vscode.window.showInformationMessage('Hello World from type-script-helper!');
}), // });
);
function getWebviewView(title: string) { // context.subscriptions.push(disposable);
const column = vscode.window.activeTextEditor
? vscode.window.activeTextEditor.viewColumn
: undefined;
// Otherwise, create a new panel.
const webviewView = vscode.window.createWebviewPanel(
"web-view-panel",
title,
column || vscode.ViewColumn.One,
{
// Enable javascript in the webview
enableScripts: true,
// And restrict the webview to only loading content from our extension's `media` directory.
localResourceRoots: [
vscode.Uri.joinPath(extensionContext.extensionUri, "media"),
vscode.Uri.joinPath(extensionContext.extensionUri, "out/compiled"),
],
}
);
return webviewView;
}
async function replaceResultsWithPositions(
editor: vscode.TextEditor,
positionsAndExpressions: [vscode.Position, string][],
mode: 'append' | 'replace',
) {
await editor.edit((editBuilder) => {
for (const [position, expression] of positionsAndExpressions) {
const lineCalcResult = calcProvider.calculateLine(position, expression);
if (lineCalcResult == null) {
continue;
}
const { insertText, expressionWithEqualSignRange, expressionEndRange } =
lineCalcResult;
if (mode === 'append') {
const endWithEqual = expression.trimEnd().endsWith('=');
editBuilder.replace(
expressionEndRange,
endWithEqual ? insertText : ` = ${insertText}`,
);
} else if (mode === 'replace') {
editBuilder.replace(expressionWithEqualSignRange, insertText);
}
}
});
}
async function replaceResult(
mode: 'append' | 'replace',
withCursor: boolean,
) {
const editor = vscode.window.activeTextEditor;
if (!editor || !editor.selection.isEmpty) {
return;
}
const doc = editor.document;
let positionsAndExpressions;
if (withCursor) {
positionsAndExpressions = editor.selections.map(
(selection) =>
<[vscode.Position, string]>[
selection.active,
doc
.lineAt(selection.active.line)
.text.slice(0, selection.active.character),
],
);
} else {
const uniqueLineNumbers = [
...new Set(editor.selections.map((selection) => selection.active.line)),
];
positionsAndExpressions = uniqueLineNumbers.map((number) => {
const line = doc.lineAt(number);
return <[vscode.Position, string]>[line.range.end, line.text];
});
}
await replaceResultsWithPositions(editor, positionsAndExpressions, mode);
}
extensionContext.subscriptions.push(
vscode.commands.registerTextEditorCommand('extension.calcAppendWithCursor', () => {
replaceResult('append', true).catch(onError);
}),
vscode.commands.registerTextEditorCommand('extension.calcAppend', () => {
replaceResult('append', false).catch(onError);
}),
vscode.commands.registerTextEditorCommand(
'extension.calcReplaceWithCursor',
() => {
replaceResult('replace', true).catch(onError);
},
),
vscode.commands.registerTextEditorCommand('extension.calcReplace', () => {
replaceResult('replace', false).catch(onError);
}),
);
const commands = [ const commands = [
vscode.commands.registerCommand("copyHelper.copySyntaxInLight", copyHelper.copySyntaxInLight), // vscode.commands.registerCommand("kanban.apiAuthenticate", kanbanHelper.apiAuthenticate(extensionContext)),
vscode.commands.registerCommand("extension.rotateExplorerSortOrder", settingsHelper.rotateExplorerSortOrder), vscode.commands.registerCommand("kanban.newEntry", kanbanHelper.newEntry(sidebarProvider)),
vscode.commands.registerCommand("kanban.openWithTextEditor", kanbanHelper.openWithTextEditor), vscode.commands.registerCommand("kanban.refresh", await kanbanHelper.refresh()),
vscode.commands.registerCommand("kanban.openInNewWindow", kanbanHelper.openInNewWindow), // vscode.commands.registerCommand("kanban.debugReload", await kanbanHelper.debugReload(extensionContext)),
vscode.commands.registerCommand("markdown.newMarkdownFile", markdownHelper.newMarkdownFile),
vscode.commands.registerCommand('promiseLinesHelper.codeGeneratorQuickPick', promiseLinesHelper.codeGeneratorQuickPick), vscode.commands.registerCommand('promiseLinesHelper.codeGeneratorQuickPick', promiseLinesHelper.codeGeneratorQuickPick),
vscode.commands.registerCommand('promiseLinesHelper.insertDateTime', promiseLinesHelper.insertDateTime), vscode.commands.registerCommand('promiseLinesHelper.insertDateTime', promiseLinesHelper.insertDateTime),
vscode.commands.registerCommand("promiseLinesHelper.insertAllExtensions", promiseLinesHelper.insertAllExtensions), vscode.commands.registerCommand('promiseLinesHelper.transformToPopperCase', promiseLinesHelper.transformToPopperCase),
vscode.commands.registerCommand('promiseLinesHelper.transformToProperCase', promiseLinesHelper.transformToProperCase),
vscode.commands.registerCommand('promiseLinesHelper.transformToParamCase', promiseLinesHelper.transformToParamCase), vscode.commands.registerCommand('promiseLinesHelper.transformToParamCase', promiseLinesHelper.transformToParamCase),
vscode.commands.registerCommand('readOnlyLinesHelper.searchGoogle', readOnlyLinesHelper.searchGoogle), vscode.commands.registerCommand('readOnlyLinesHelper.searchGoogle', readOnlyLinesHelper.searchGoogle),
vscode.commands.registerCommand('replaceLinesHelper.addCSharpComment', replaceLinesHelper.addCSharpComment), vscode.commands.registerCommand('replaceLinesHelper.addCSharpComment', replaceLinesHelper.addCSharpComment),
@ -174,26 +61,13 @@ export async function activate(extensionContext: vscode.ExtensionContext) {
vscode.commands.registerCommand('replaceLinesHelper.quickFixProperCaseProperties', replaceLinesHelper.quickFixProperCaseProperties), vscode.commands.registerCommand('replaceLinesHelper.quickFixProperCaseProperties', replaceLinesHelper.quickFixProperCaseProperties),
vscode.commands.registerCommand('replaceLinesHelper.quickFixPublic', replaceLinesHelper.quickFixPublic), vscode.commands.registerCommand('replaceLinesHelper.quickFixPublic', replaceLinesHelper.quickFixPublic),
vscode.commands.registerCommand('replaceLinesHelper.removeComment', replaceLinesHelper.removeComment), vscode.commands.registerCommand('replaceLinesHelper.removeComment', replaceLinesHelper.removeComment),
vscode.commands.registerCommand('replaceLinesHelper.removeJsonNullValues', replaceLinesHelper.removeJsonNullValues),
vscode.commands.registerCommand('replaceLinesHelper.removeLinesContainingHighlighted', replaceLinesHelper.removeLinesContainingHighlighted),
vscode.commands.registerCommand('replaceLinesHelper.sortLength', replaceLinesHelper.sortLength), vscode.commands.registerCommand('replaceLinesHelper.sortLength', replaceLinesHelper.sortLength),
vscode.commands.registerCommand('replaceLinesHelper.sortNormal', replaceLinesHelper.sortNormal), vscode.commands.registerCommand('replaceLinesHelper.sortNormal', replaceLinesHelper.sortNormal),
vscode.commands.registerCommand('replaceLinesHelper.splitBySpaceReverseJoinSort', replaceLinesHelper.splitBySpaceReverseJoinSort), vscode.commands.registerCommand('replaceLinesHelper.splitBySpaceReverseJoinSort', replaceLinesHelper.splitBySpaceReverseJoinSort),
vscode.commands.registerCommand('replaceLinesHelper.unwrapSql', replaceLinesHelper.unwrapSql), vscode.commands.registerCommand('replaceLinesHelper.unwrapSql', replaceLinesHelper.unwrapSql),
vscode.commands.registerCommand('replaceLinesHelper.wrapSqlCSharp', replaceLinesHelper.wrapSqlCSharp), vscode.commands.registerCommand('replaceLinesHelper.wrapSqlCSharp', replaceLinesHelper.wrapSqlCSharp),
vscode.commands.registerCommand('replaceLinesHelper.wrapSqlVB', replaceLinesHelper.wrapSqlVB), vscode.commands.registerCommand('replaceLinesHelper.wrapSqlVB', replaceLinesHelper.wrapSqlVB),
vscode.commands.registerCommand("webview.fileSync", () => { WebviewPanelFileSync.WebviewPanelFileSync.createOrShow(extensionContext, 'File-Sync'); }), vscode.commands.registerCommand("webView.webView", () => { WebViewPanel.createOrShow(extensionContext.extensionUri); })
vscode.commands.registerCommand("webview.backlogMesa", () => { WebviewPanelCostOfDelay.WebviewPanelCostOfDelay.createOrShow(extensionContext, 'MES', 'HTML'); }),
vscode.commands.registerCommand("webview.costOfDelayMesa", () => { WebviewPanelCostOfDelay.WebviewPanelCostOfDelay.createOrShow(extensionContext, 'MES', ''); }),
vscode.commands.registerCommand("webview.costOfDelayEffortMesa", () => { WebviewPanelCostOfDelay.WebviewPanelCostOfDelay.createOrShow(extensionContext, 'MES', 'EFFORT'); }),
vscode.commands.registerCommand("webview.costOfDelayLiveMesa", () => { WebviewPanelCostOfDelay.WebviewPanelCostOfDelay.createOrShow(extensionContext, 'MES', 'LIVE'); }),
vscode.commands.registerCommand("webview.costOfDelayWSJFMesa", () => { WebviewPanelCostOfDelay.WebviewPanelCostOfDelay.createOrShow(extensionContext, 'MES', 'WSJF'); }),
vscode.commands.registerCommand("webview.backlogLeominster", () => { WebviewPanelCostOfDelay.WebviewPanelCostOfDelay.createOrShow(extensionContext, 'LEO', 'HTML'); }),
vscode.commands.registerCommand("webview.costOfDelayLeominster", () => { WebviewPanelCostOfDelay.WebviewPanelCostOfDelay.createOrShow(extensionContext, 'LEO', ''); }),
vscode.commands.registerCommand("webview.costOfDelayEffortLeominster", () => { WebviewPanelCostOfDelay.WebviewPanelCostOfDelay.createOrShow(extensionContext, 'LEO', 'EFFORT'); }),
vscode.commands.registerCommand("webview.costOfDelayLiveLeominster", () => { WebviewPanelCostOfDelay.WebviewPanelCostOfDelay.createOrShow(extensionContext, 'LEO', 'LIVE'); }),
vscode.commands.registerCommand("webview.costOfDelayWSJFLeominster", () => { WebviewPanelCostOfDelay.WebviewPanelCostOfDelay.createOrShow(extensionContext, 'LEO', 'WSJF'); }),
vscode.commands.registerCommand("webview.example", () => { WebviewPanelExample.WebviewPanelExample.createOrShow(extensionContext); })
]; ];
commands.forEach(command => extensionContext.subscriptions.push(command)); commands.forEach(command => extensionContext.subscriptions.push(command));

View File

@ -1,126 +1,40 @@
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import { paramCase } from './promiseLinesHelper'; // import { authenticate } from "./authenticate";
import { SidebarProvider } from './SidebarProvider';
// import { WebViewPanel } from "./WebViewPanel";
async function updateWithLogic(textDocument: vscode.TextDocument) { export function newEntry(sidebarProvider: SidebarProvider): any {
await vscode.window.showTextDocument(textDocument); const { activeTextEditor } = vscode.window;
const textEditor = vscode.window.activeTextEditor; if (!activeTextEditor) {
if (!textEditor) { vscode.window.showInformationMessage("No active text editor");
return undefined; return;
} }
const now: Date = new Date(); const text = activeTextEditor.document.getText(
const time: number = now.getTime(); activeTextEditor.selection
const year: number = now.getFullYear(); );
const start: Date = new Date(year, 0, 0); sidebarProvider._view?.webview.postMessage({
const oneDay: number = 1000 * 60 * 60 * 24; type: "new-entry",
const timezoneOffset: number = now.getTimezoneOffset(); value: text,
let segments: string[] = textDocument.fileName.split('\\');
const diff: number = (time - start.getTime()) + ((start.getTimezoneOffset() - timezoneOffset) * 60 * 1000);
const day: number = Math.floor(diff / oneDay);
const seconds: number = time.valueOf() + timezoneOffset;
let notLastThree: string[] = segments.slice(0, -3);
let season: string = year + "-";
if (day < 78) {
season += "0.Winter";
} else if (day < 124) {
season += "1.Spring";
} else if (day < 171) {
season += "2.Spring";
} else if (day < 217) {
season += "3.Summer";
} else if (day < 264) {
season += "4.Summer";
} else if (day < 309) {
season += "5.Fall";
} else if (day < 354) {
season += "6.Fall";
} else {
season += "7.Winter";
}
let path: string = notLastThree.join('\\') + `\\${year}\\${season}\\${seconds}`;
const uri = vscode.Uri.parse(path);
textEditor.edit(editBuilder => {
let text: string = `\r\n## Code Insiders\r\n\r\n- [code-insiders](${path})\r\n\r\n## Sub-tasks\r\n\r\n- [ ] To do`;
let position: vscode.Position = new vscode.Position(textDocument.lineCount, 0);
editBuilder.insert(position, text);
}); });
} }
async function openInNewWindowLogic(): Promise<any> { // export function apiAuthenticate(extensionContext: vscode.ExtensionContext): any {
if (vscode.workspace.workspaceFolders === undefined) { // try {
vscode.window.showInformationMessage("Open workspace first!"); // authenticate(extensionContext, () => { });
return; // } catch (err) {
} // console.log(err);
if (vscode.window.tabGroups.activeTabGroup.activeTab === undefined) { // }
vscode.window.showInformationMessage("Open a tab first!"); // }
return;
} export async function refresh(): Promise<any> {
const activeTab = vscode.window.tabGroups.activeTabGroup.activeTab; await vscode.commands.executeCommand("workbench.action.closeSidebar");
const tabs: vscode.Tab[] = vscode.window.tabGroups.all.map(tagGroup => tagGroup.tabs).flat(); await vscode.commands.executeCommand("workbench.view.extension.kanban-sidebar-view");
const index = tabs.findIndex(tab => tab.label === activeTab.label);
const paramCaseActiveTabLabel: string = paramCase(activeTab.label);
vscode.window.showInformationMessage(`Searching for <${paramCaseActiveTabLabel}>`);
const fileUris: vscode.Uri[] = await vscode.workspace.findFiles(`**/${paramCaseActiveTabLabel}*`);
if (fileUris.length === 0) {
vscode.window.showInformationMessage(`Didn't find a file matching <${paramCaseActiveTabLabel}>!`);
return;
}
for (let i = 0; i < fileUris.length; ++i) {
let found: boolean = false;
const textDocument: vscode.TextDocument = await vscode.workspace.openTextDocument(fileUris[i]);
for (let j = 0; j < textDocument.lineCount; ++j) {
const text = textDocument.lineAt(j).text;
if (text.endsWith(')')) {
if (text.startsWith("- [code](")) {
found = true;
const uri = vscode.Uri.parse("file:" + text.substring(9, text.length - 1));
await vscode.commands.executeCommand('vscode.openFolder', uri, true);
break;
}
if (text.startsWith("- [codium](")) {
found = true;
const uri = vscode.Uri.parse("file:" + text.substring(11, text.length - 1));
await vscode.commands.executeCommand('vscode.openFolder', uri, true);
break;
}
if (text.startsWith("- [code-insiders](")) {
found = true;
const uri = vscode.Uri.parse("file:" + text.substring(18, text.length - 1));
await vscode.commands.executeCommand('vscode.openFolder', uri, true);
break;
}
}
}
if (!found) {
updateWithLogic(textDocument);
}
else if (index !== -1) {
await vscode.window.tabGroups.close(tabs[index]);
}
}
} }
async function openWithTextEditorLogic(): Promise<any> { // export async function debugReload(extensionContext: vscode.ExtensionContext): Promise<any> {
if (vscode.workspace.workspaceFolders === undefined) { // WebViewPanel.kill();
vscode.window.showInformationMessage("Open workspace first!"); // WebViewPanel.createOrShow(extensionContext.extensionUri);
return; // await vscode.commands.executeCommand("workbench.action.closeSidebar");
} // await vscode.commands.executeCommand("workbench.view.extension.kanban-sidebar-view");
if (vscode.window.tabGroups.activeTabGroup.activeTab === undefined) { // setTimeout(() => { vscode.commands.executeCommand("workbench.action.webview.openDeveloperTools"); }, 500);
vscode.window.showInformationMessage("Open a tab first!"); // }
return;
}
const activeTabLabel = vscode.window.tabGroups.activeTabGroup.activeTab.label;
const paramCaseActiveTabLabel: string = paramCase(activeTabLabel);
vscode.window.showInformationMessage(`Searching for <${paramCaseActiveTabLabel}>`);
const fileUris: vscode.Uri[] = await vscode.workspace.findFiles(`**/${paramCaseActiveTabLabel}*`);
if (fileUris.length === 0) {
vscode.window.showInformationMessage(`Didn't find a file matching <${paramCaseActiveTabLabel}>!`);
return;
}
for (let i = 0; i < fileUris.length; ++i) {
const textDocument: vscode.TextDocument = await vscode.workspace.openTextDocument(fileUris[i]);
await vscode.window.showTextDocument(textDocument);
}
}
export const openInNewWindow = () => openInNewWindowLogic();
export const openWithTextEditor = () => openWithTextEditorLogic();

View File

@ -1,22 +0,0 @@
import * as vscode from 'vscode';
import { paramCase } from './promiseLinesHelper';
async function newMarkdownFileLogic(): Promise<any> {
console.log(vscode.window.tabGroups.activeTabGroup.activeTab?.label);
if (vscode.workspace.workspaceFolders === undefined) {
vscode.window.showInformationMessage("Open workspace first!");
return;
}
const workspaceFoldersZero = vscode.workspace.workspaceFolders[0].uri;
const cardTitle = await vscode.window.showInputBox({ prompt: 'Provide title for card.' });
if (cardTitle === undefined)
return;
const paramCaseCardTitle: string = paramCase(cardTitle);
const fileUri: vscode.Uri = vscode.Uri.joinPath(workspaceFoldersZero, `${paramCaseCardTitle}.md`);
const buffer: Buffer = Buffer.from(`# ${cardTitle}`, 'utf8');
await vscode.workspace.fs.writeFile(fileUri, buffer);
const textDocument: vscode.TextDocument = await vscode.workspace.openTextDocument(fileUri);
vscode.window.showTextDocument(textDocument);
}
export const newMarkdownFile = () => newMarkdownFileLogic();

View File

@ -133,66 +133,16 @@ function insertDateTimeLogic(): undefined {
if (!textEditor) { if (!textEditor) {
return undefined; return undefined;
} }
const date = new Date();
const selection = textEditor.selection; const selection = textEditor.selection;
textEditor.edit(editBuilder => { textEditor.edit(editBuilder => {
var range; var range;
const now: Date = new Date();
const time: number = now.getTime();
const year: number = now.getFullYear();
const start: Date = new Date(year, 0, 0);
const oneDay: number = 1000 * 60 * 60 * 24;
const timezoneOffset: number = now.getTimezoneOffset();
const diff: number = (time - start.getTime()) + ((start.getTimezoneOffset() - timezoneOffset) * 60 * 1000);
const seconds: number = time.valueOf() + timezoneOffset;
const day: number = Math.floor(diff / oneDay);
const epoch: number = seconds * 10000;
const ticks: number = epoch + 621355968000000000;
let season: string = year + "-";
if (day < 78) {
season += "0.Winter";
} else if (day < 124) {
season += "1.Spring";
} else if (day < 171) {
season += "2.Spring";
} else if (day < 217) {
season += "3.Summer";
} else if (day < 264) {
season += "4.Summer";
} else if (day < 309) {
season += "5.Fall";
} else if (day < 354) {
season += "6.Fall";
} else {
season += "7.Winter";
}
const dateText = seconds + " = " + ticks + " = " + season + " = " + now.toString();
if (selection.isEmpty) { if (selection.isEmpty) {
editBuilder.insert(selection.start, dateText) editBuilder.insert(selection.start, date.toString())
} }
else { else {
range = new vscode.Range(selection.start.line, selection.start.character, selection.end.line, selection.end.character); range = new vscode.Range(selection.start.line, selection.start.character, selection.end.line, selection.end.character);
editBuilder.replace(range, dateText); editBuilder.replace(range, date.toString());
}
});
return undefined;
}
function insertAllExtensionsLogic(): undefined {
const textEditor = vscode.window.activeTextEditor;
if (!textEditor) {
return undefined;
}
const selection = textEditor.selection;
textEditor.edit(editBuilder => {
var range;
let extensions = vscode.extensions.all;
let text = extensions.map(extension => extension.id).join("\n");
if (selection.isEmpty) {
editBuilder.insert(selection.start, text)
}
else {
range = new vscode.Range(selection.start.line, selection.start.character, selection.end.line, selection.end.character);
editBuilder.replace(range, text);
} }
}); });
return undefined; return undefined;
@ -205,7 +155,7 @@ function camelCase(str: string) {
}); });
} }
function transformToProperCaseLogic(): undefined { function transformToPopperCaseLogic(): undefined {
const textEditor = vscode.window.activeTextEditor; const textEditor = vscode.window.activeTextEditor;
if (!textEditor) { if (!textEditor) {
return undefined; return undefined;
@ -227,7 +177,7 @@ function transformToProperCaseLogic(): undefined {
return undefined; return undefined;
} }
export function paramCase(str: string) { function paramCase(str: string) {
return str return str
.replace( .replace(
/([A-Z]+(.))/g, /([A-Z]+(.))/g,
@ -261,6 +211,5 @@ function transformToParamCaseLogic(): undefined {
export const codeGeneratorQuickPick = () => codeGeneratorQuickPickLogic(); export const codeGeneratorQuickPick = () => codeGeneratorQuickPickLogic();
export const insertDateTime = () => insertDateTimeLogic(); export const insertDateTime = () => insertDateTimeLogic();
export const insertAllExtensions = () => insertAllExtensionsLogic(); export const transformToPopperCase = () => transformToPopperCaseLogic();
export const transformToProperCase = () => transformToProperCaseLogic();
export const transformToParamCase = () => transformToParamCaseLogic(); export const transformToParamCase = () => transformToParamCaseLogic();

View File

@ -5,16 +5,12 @@ enum LinesAction {
} }
function searchGoogleLogic(text: string, lines: string[]): void { function searchGoogleLogic(text: string, lines: string[]): void {
let searchText: string = '';
if (text.length > 0) { if (text.length > 0) {
searchText = text.trim(); vscode.env.openExternal(
vscode.Uri.parse(`https://www.google.com/search?q=${text.trim()}`)
)
} }
else if (lines.length > 0) { else if (lines.length > 0) {
searchText = lines[0].trim();
}
else
return undefined;
if (searchText != '') {
vscode.env.openExternal( vscode.env.openExternal(
vscode.Uri.parse(`https://www.google.com/search?q=${lines[0].trim()}`) vscode.Uri.parse(`https://www.google.com/search?q=${lines[0].trim()}`)
) )

View File

@ -20,8 +20,6 @@ enum LinesAction {
quickFixPublic, quickFixPublic,
pdsfToFixedWidth, pdsfToFixedWidth,
removeComment, removeComment,
removeJsonNullValues,
removeLinesContainingHighlighted,
sortLength, sortLength,
sortNormal, sortNormal,
splitBySpaceReverseJoinSort, splitBySpaceReverseJoinSort,
@ -271,25 +269,6 @@ function removeCommentLogic(lines: string[]): void {
} }
} }
function removeJsonNullValuesLogic(lines: string[]): void {
let text = ': null,';
for (let i = 0; i < lines.length; ++i) {
lines[i] = lines[i].trim();
if (text.length > 1 && lines[i].length > 1 && lines[i].includes(text)) {
lines[i] = '';
}
}
}
function removeLinesContainingHighlightedLogic(lines: string[], text: string): void {
for (let i = 0; i < lines.length; ++i) {
lines[i] = lines[i].trim();
if (text.length > 1 && lines[i].length > 1 && lines[i].includes(text)) {
lines[i] = '';
}
}
}
function makeSorter(algorithm?: SortingAlgorithm): ArrayTransformer { function makeSorter(algorithm?: SortingAlgorithm): ArrayTransformer {
return function (lines: string[]): string[] { return function (lines: string[]): string[] {
return lines.sort(algorithm); return lines.sort(algorithm);
@ -408,25 +387,12 @@ function linesFunction(linesAction: LinesAction): Thenable<boolean> | undefined
if (!textEditor) { if (!textEditor) {
return undefined; return undefined;
} }
let text; var startLine = 0;
var endLine; var endLine = textEditor.document.lineCount - 1;
var startLine;
const selection = textEditor.selection; const selection = textEditor.selection;
if (selection.isEmpty) { if (!selection.isEmpty) {
text = ''; startLine = selection.start.line;
startLine = 0; endLine = selection.end.line;
endLine = textEditor.document.lineCount - 1;
} else {
if (linesAction !== LinesAction.removeLinesContainingHighlighted) {
text = '';
endLine = selection.end.line;
startLine = selection.start.line;
} else {
startLine = 0;
endLine = textEditor.document.lineCount - 1;
let range = new vscode.Range(selection.start, selection.end)
text = textEditor.document.getText(range);
}
} }
let lines: string[] = getLines(textEditor, startLine, endLine); let lines: string[] = getLines(textEditor, startLine, endLine);
switch (linesAction) { switch (linesAction) {
@ -445,8 +411,6 @@ function linesFunction(linesAction: LinesAction): Thenable<boolean> | undefined
case LinesAction.quickFixProperCaseProperties: { quickFixProperCasePropertiesLogic(lines); break; } case LinesAction.quickFixProperCaseProperties: { quickFixProperCasePropertiesLogic(lines); break; }
case LinesAction.quickFixPublic: { quickFixPublicLogic(lines); break; } case LinesAction.quickFixPublic: { quickFixPublicLogic(lines); break; }
case LinesAction.removeComment: { removeCommentLogic(lines); break; } case LinesAction.removeComment: { removeCommentLogic(lines); break; }
case LinesAction.removeJsonNullValues: { removeJsonNullValuesLogic(lines); break; }
case LinesAction.removeLinesContainingHighlighted: { removeLinesContainingHighlightedLogic(lines, text); break; }
case LinesAction.sortLength: { sortLengthLogic(lines); break; } case LinesAction.sortLength: { sortLengthLogic(lines); break; }
case LinesAction.sortNormal: { sortNormalLogic(lines); break; } case LinesAction.sortNormal: { sortNormalLogic(lines); break; }
case LinesAction.splitBySpaceReverseJoinSort: { splitBySpaceReverseJoinSortLogic(lines); break; } case LinesAction.splitBySpaceReverseJoinSort: { splitBySpaceReverseJoinSortLogic(lines); break; }
@ -474,8 +438,6 @@ export const quickFixProperCaseProperties = () => linesFunction(LinesAction.quic
export const quickFixPublic = () => linesFunction(LinesAction.quickFixPublic); export const quickFixPublic = () => linesFunction(LinesAction.quickFixPublic);
export const pdsfToFixedWidth = () => linesFunction(LinesAction.pdsfToFixedWidth); export const pdsfToFixedWidth = () => linesFunction(LinesAction.pdsfToFixedWidth);
export const removeComment = () => linesFunction(LinesAction.removeComment); export const removeComment = () => linesFunction(LinesAction.removeComment);
export const removeJsonNullValues = () => linesFunction(LinesAction.removeJsonNullValues);
export const removeLinesContainingHighlighted = () => linesFunction(LinesAction.removeLinesContainingHighlighted);
export const sortLength = () => linesFunction(LinesAction.sortLength); export const sortLength = () => linesFunction(LinesAction.sortLength);
export const sortNormal = () => linesFunction(LinesAction.sortNormal); export const sortNormal = () => linesFunction(LinesAction.sortNormal);
export const splitBySpaceReverseJoinSort = () => linesFunction(LinesAction.splitBySpaceReverseJoinSort); export const splitBySpaceReverseJoinSort = () => linesFunction(LinesAction.splitBySpaceReverseJoinSort);

View File

@ -1,29 +0,0 @@
import * as vscode from 'vscode';
async function rotateExplorerSortOrderLogic(): Promise<any> {
const config = vscode.workspace.getConfiguration("explorer");
const sortOrder = config.get("sortOrder");
let sortOrderOptions = [
"default",
"modified",
"type",
"mixed",
"filesFirst",
"foldersNestsFiles",
];
let index = sortOrderOptions.findIndex(l => l === sortOrder);
if (index !== -1)
index++;
else
index = 0;
if (index >= sortOrderOptions.length)
index = 0;
let value = sortOrderOptions[index];
await config.update("sortOrder", value);
index++;
if (index >= sortOrderOptions.length)
index = 0;
vscode.window.showInformationMessage(`Explorer Sort Order set to: ${value}; next will be: ${sortOrderOptions[index]};`);
}
export const rotateExplorerSortOrder = () => rotateExplorerSortOrderLogic();

View File

@ -0,0 +1,23 @@
import * as path from 'path';
import { runTests } from '@vscode/test-electron';
async function main() {
try {
// The folder containing the Extension Manifest package.json
// Passed to `--extensionDevelopmentPath`
const extensionDevelopmentPath = path.resolve(__dirname, '../../');
// The path to test runner
// Passed to --extensionTestsPath
const extensionTestsPath = path.resolve(__dirname, './suite/index');
// Download VS Code, unzip it and run the integration test
await runTests({ extensionDevelopmentPath, extensionTestsPath });
} catch (err) {
console.error('Failed to run tests', err);
process.exit(1);
}
}
main();

View File

@ -0,0 +1,15 @@
import * as assert from 'assert';
// You can import and use all API from the 'vscode' module
// as well as import your extension to test it
import * as vscode from 'vscode';
// import * as myExtension from '../../extension';
suite('Extension Test Suite', () => {
vscode.window.showInformationMessage('Start all tests.');
test('Sample test', () => {
assert.strictEqual(-1, [1, 2, 3].indexOf(5));
assert.strictEqual(-1, [1, 2, 3].indexOf(0));
});
});

View File

@ -0,0 +1,38 @@
import * as path from 'path';
import * as Mocha from 'mocha';
import * as glob from 'glob';
export function run(): Promise<void> {
// Create the mocha test
const mocha = new Mocha({
ui: 'tdd',
color: true
});
const testsRoot = path.resolve(__dirname, '..');
return new Promise((c, e) => {
glob('**/**.test.js', { cwd: testsRoot }, (err, files) => {
if (err) {
return e(err);
}
// Add files to the test suite
files.forEach(f => mocha.addFile(path.resolve(testsRoot, f)));
try {
// Run the mocha test
mocha.run(failures => {
if (failures > 0) {
e(new Error(`${failures} tests failed.`));
} else {
c();
}
});
} catch (err) {
console.error(err);
e(err);
}
});
});
}

View File

@ -1,6 +1,5 @@
{ {
"compilerOptions": { "compilerOptions": {
"typeRoots": ["./node_modules/@types"],
"allowSyntheticDefaultImports": true, "allowSyntheticDefaultImports": true,
"lib": [ "lib": [
"ES2020" "ES2020"

View File

@ -1,11 +1,3 @@
---
type: "note"
created: "2023-07-07T16:15:27.822Z"
updated: "2023-07-07T16:15:27.822Z"
---
# vsc-extension-quickstart
# Welcome to your VS Code Extension # Welcome to your VS Code Extension
## What's in the folder ## What's in the folder

View File

@ -0,0 +1,87 @@
<script lang="ts">
import { onMount } from "svelte";
import type { User } from "../types";
import type { Entry } from "../types";
export let user: User;
export let accessToken: string;
let text = "";
let entries: Array<Entry> = [];
async function addEntry(t: string) {
const response = await fetch(`${apiBaseUrl}/entry`, {
method: "POST",
body: JSON.stringify({
text: t,
}),
headers: {
"content-type": "application/json",
authorization: `Bearer ${accessToken}`,
},
});
const { entry } = await response.json();
entries = [entry, ...entries];
}
onMount(async () => {
window.addEventListener("message", async (event) => {
const message = event.data;
switch (message.type) {
case "new-entry":
addEntry(message.value);
break;
}
});
const response = await fetch(`${apiBaseUrl}/entry`, {
headers: {
authorization: `Bearer ${accessToken}`,
},
});
const payload = await response.json();
entries = payload.entries;
});
</script>
<div>Hello: {user.name}</div>
<form
on:submit|preventDefault={async () => {
addEntry(text);
text = "";
}}
>
<input bind:value={text} />
</form>
<ul>
{#each entries as entry (entry.id)}
<!-- svelte-ignore a11y-click-events-have-key-events -->
<!-- svelte-ignore missing-declaration -->
<li
class:complete={entry.completed}
on:click={async () => {
entry.completed = !entry.completed;
const response = await fetch(`${apiBaseUrl}/entry`, {
method: "PUT",
body: JSON.stringify({
id: entry.id,
}),
headers: {
"content-type": "application/json",
authorization: `Bearer ${accessToken}`,
},
});
console.log(await response.json());
}}
>
{entry.text}
</li>
{/each}
</ul>
<style>
.complete {
text-decoration: line-through;
}
</style>

View File

@ -0,0 +1,70 @@
<script lang="ts">
import { onMount } from "svelte";
import type { User } from "../types";
import Entries from "./Entries.svelte";
let accessToken = "";
let loading = true;
let user: User | null = null;
let page: "entries" | "contact" =
acquiredVsCodeApi.getState()?.page || "entries";
$: {
acquiredVsCodeApi.setState({ page });
}
onMount(async () => {
window.addEventListener("message", async (event) => {
const message = event.data;
switch (message.type) {
case "token":
accessToken = message.value;
const response = await fetch(`${apiBaseUrl}/me`, {
headers: {
authorization: `Bearer ${accessToken}`,
},
});
const data = await response.json();
user = data.user;
loading = false;
}
});
acquiredVsCodeApi.postMessage({ type: "get-token", value: undefined });
});
</script>
{#if loading}
<div>loading...</div>
{:else if user}
{#if page === "entries"}
<Entries {user} {accessToken} />
<button
on:click={() => {
page = "contact";
}}>go to contact</button
>
{:else}
<div>Contact me here: adlkfjjqioefeqio</div>
<button
on:click={() => {
page = "entries";
}}>go back</button
>
{/if}
<!-- svelte-ignore missing-declaration -->
<button
on:click={() => {
accessToken = "";
user = null;
acquiredVsCodeApi.postMessage({ type: "logout", value: undefined });
}}>logout</button
>
{:else}
<!-- svelte-ignore missing-declaration -->
<button
on:click={() => {
acquiredVsCodeApi.postMessage({ type: "authenticate", value: undefined });
}}>login with GitHub</button
>
{/if}

View File

@ -0,0 +1,4 @@
<script lang="ts">
</script>
<h1>WebView 2023-09-23-15-20</h1>

View File

@ -0,0 +1,10 @@
import * as _vscode from "vscode";
declare global {
const acquiredVsCodeApi: {
postMessage: ({ type: string, value: any }) => void;
getState: () => any;
setState: (state: any) => void;
};
const apiBaseUrl: string;
}

View File

@ -0,0 +1,7 @@
import App from "../components/Sidebar.svelte";
const app = new App({
target: document.body,
});
export default app;

View File

@ -0,0 +1,7 @@
import App from "../components/WebView.svelte";
const app = new App({
target: document.body,
});
export default app;

View File

@ -0,0 +1,13 @@
{
"compilerOptions": {
"ignoreDeprecations": "5.0",
"strict": true
},
"exclude": [
"../node_modules/*"
],
"extends": "@tsconfig/svelte/tsconfig.json",
"include": [
"./**/*"
]
}

View File

@ -0,0 +1,11 @@
export type User = {
id: string;
name: string;
githubId: string;
};
export type Entry = {
text: string;
completed: boolean;
id: number;
};