├── .deployment ├── .dockerignore ├── .env-snapshot ├── .gitattributes ├── .gitignore ├── .npmignore ├── .vscode ├── launch.json ├── settings.json ├── tasks.json └── tasks.json.old ├── CONTRIBUTING.md ├── Dockerfile ├── Dockerfile-npm ├── Documentation └── vorlon-adoption-doc │ ├── doc │ ├── vorlon-early-adoption-steps-old.pdf │ ├── vorlon-early-adoption-steps.md │ └── vorlon-early-adoption-steps.pdf │ └── images │ ├── manifest-update.png │ ├── ngrok-authtoken.jpg │ ├── vorlon-early-adoption-screenshot1.png │ ├── vorlon-early-adoption-screenshot2.jpg │ ├── vorlon-early-adoption-screenshot3.jpg │ ├── vorlon-early-adoption-screenshot4.jpg │ ├── vorlon-early-adoption-screenshot5.jpg │ ├── vorlon-early-adoption-screenshot6.jpg │ ├── vorlon-early-adoption-screenshot7.jpg │ ├── vorlon-early-adoption-screenshot8.jpg │ ├── vorlon-early-adoption-screenshot9.jpg │ └── vorlon-head-script.png ├── LICENSE ├── Plugins ├── .gitignore ├── .npmignore ├── Vorlon │ ├── .gitignore │ ├── plugins │ │ ├── device │ │ │ ├── control.html │ │ │ ├── control.less │ │ │ ├── res.min.js │ │ │ ├── verge.min.js │ │ │ ├── vorlon.device.client.ts │ │ │ └── vorlon.device.dashboard.ts │ │ ├── domExplorer │ │ │ ├── .gitignore │ │ │ ├── control.html │ │ │ ├── control.less │ │ │ ├── readme.md │ │ │ ├── vorlon.domExplorer.client.ts │ │ │ ├── vorlon.domExplorer.dashboard.ts │ │ │ └── vorlon.domExplorer.interfaces.ts │ │ ├── domtimeline │ │ │ ├── api │ │ │ │ ├── mapping-system.d.ts │ │ │ │ └── shared-definitions.d.ts │ │ │ ├── control.html │ │ │ ├── dom-timeline.js │ │ │ ├── images │ │ │ │ ├── arrow-blue-b.png │ │ │ │ ├── arrow-blue.png │ │ │ │ ├── arrow-green-b.png │ │ │ │ ├── arrow-green.png │ │ │ │ ├── arrow-red-b.png │ │ │ │ ├── arrow-red.png │ │ │ │ ├── blind.png │ │ │ │ ├── lev.png │ │ │ │ ├── rule.png │ │ │ │ ├── sample.ts │ │ │ │ └── standalone.part.html │ │ │ ├── mapping-system.js │ │ │ ├── navigator.d.ts │ │ │ ├── vorlon.domtimeline.client.ts │ │ │ └── vorlon.domtimeline.dashboard.ts │ │ ├── express │ │ │ ├── README.md │ │ │ ├── control.css │ │ │ ├── control.html │ │ │ ├── icon.png │ │ │ ├── vorlon.express.client.min.js │ │ │ ├── vorlon.express.client.ts │ │ │ └── vorlon.express.dashboard.ts │ │ ├── interactiveConsole │ │ │ ├── .gitignore │ │ │ ├── control.html │ │ │ ├── control.less │ │ │ ├── icon.png │ │ │ ├── vorlon.interactiveConsole.client.ts │ │ │ ├── vorlon.interactiveConsole.dashboard.ts │ │ │ └── vorlon.interactiveConsole.interfaces.ts │ │ ├── modernizrReport │ │ │ ├── control.html │ │ │ ├── control.less │ │ │ ├── icon.png │ │ │ ├── modernizr.js │ │ │ ├── vorlon.modernizrReport.client.ts │ │ │ ├── vorlon.modernizrReport.dashboard.ts │ │ │ └── vorlon.modernizrReport.interfaces.ts │ │ ├── networkMonitor │ │ │ ├── control.html │ │ │ ├── control.less │ │ │ ├── icon.png │ │ │ ├── vorlon.networkMonitor.client.ts │ │ │ ├── vorlon.networkMonitor.dashboard.ts │ │ │ └── vorlon.networkMonitor.interfaces.ts │ │ ├── ngInspector │ │ │ ├── .gitignore │ │ │ ├── control.html │ │ │ ├── control.less │ │ │ ├── icon.png │ │ │ ├── readme.md │ │ │ ├── vorlon.ngInspector.client.ts │ │ │ ├── vorlon.ngInspector.dashboard.ts │ │ │ └── vorlon.ngInspector.interfaces.ts │ │ ├── objectExplorer │ │ │ ├── .gitignore │ │ │ ├── control.html │ │ │ ├── control.less │ │ │ ├── vorlon.objectExplorer.client.ts │ │ │ ├── vorlon.objectExplorer.dashboard.ts │ │ │ └── vorlon.objectExplorer.interfaces.ts │ │ ├── office │ │ │ ├── .gitignore │ │ │ ├── control.css │ │ │ ├── control.html │ │ │ ├── vorlon.office.client.ts │ │ │ ├── vorlon.office.dashboard.ts │ │ │ ├── vorlon.office.document.ts │ │ │ ├── vorlon.office.interfaces.ts │ │ │ ├── vorlon.office.outlook.ts │ │ │ ├── vorlon.office.powerpoint.ts │ │ │ └── vorlon.office.tools.ts │ │ ├── resourcesExplorer │ │ │ ├── control.html │ │ │ ├── control.js │ │ │ ├── control.less │ │ │ ├── icon.png │ │ │ ├── vorlon.resourcesExplorer.client.ts │ │ │ ├── vorlon.resourcesExplorer.dashboard.ts │ │ │ └── vorlon.resourcesExplorer.interfaces.ts │ │ ├── sample │ │ │ ├── README.md │ │ │ ├── control.css │ │ │ ├── control.html │ │ │ ├── vorlon.sample.client.ts │ │ │ └── vorlon.sample.dashboard.ts │ │ ├── unitTestRunner │ │ │ ├── control.html │ │ │ ├── control.less │ │ │ ├── qunit.js │ │ │ ├── vorlon.unitTestRunner.client.ts │ │ │ └── vorlon.unitTestRunner.dashboard.ts │ │ ├── uwp │ │ │ ├── control.html │ │ │ ├── control.less │ │ │ ├── vorlon.uwp.client.ts │ │ │ ├── vorlon.uwp.dashboard.ts │ │ │ └── vorlon.uwp.interfaces.ts │ │ ├── vorlontheme.css │ │ ├── vorlontheme.less │ │ ├── webstandards │ │ │ ├── axe.min.js │ │ │ ├── control.html │ │ │ ├── control.less │ │ │ ├── css.js │ │ │ ├── rules │ │ │ │ ├── accessibility.aXe.ts │ │ │ │ ├── mobileweb.deviceicons.ts │ │ │ │ ├── mobileweb.mediaqueries.ts │ │ │ │ ├── mobileweb.viewport.ts │ │ │ │ ├── performances.bundle.ts │ │ │ │ ├── performances.contentencoding.ts │ │ │ │ ├── performances.minification.ts │ │ │ │ ├── webstandards.activex.ts │ │ │ │ ├── webstandards.browserdetection.ts │ │ │ │ ├── webstandards.browserinterop.ts │ │ │ │ ├── webstandards.conditionalcomments.ts │ │ │ │ ├── webstandards.cssfallback.ts │ │ │ │ ├── webstandards.cssprefixes.ts │ │ │ │ ├── webstandards.documentmode.ts │ │ │ │ └── webstandards.jslibversions.ts │ │ │ ├── vorlon.webstandards.client.ts │ │ │ ├── vorlon.webstandards.dashboard.ts │ │ │ └── vorlon.webstandards.interfaces.ts │ │ └── xhrPanel │ │ │ ├── .gitignore │ │ │ ├── control.html │ │ │ ├── control.less │ │ │ ├── vorlon.xhrPanel.client.ts │ │ │ ├── vorlon.xhrPanel.dashboard.ts │ │ │ └── vorlon.xhrPanel.interfaces.ts │ ├── tsconfig.json │ ├── vorlon.basePlugin.ts │ ├── vorlon.clientMessenger.ts │ ├── vorlon.clientPlugin.ts │ ├── vorlon.core.ts │ ├── vorlon.dashboardPlugin.ts │ ├── vorlon.enums.ts │ └── vorlon.tools.ts ├── Web.config └── libs │ ├── css.js │ └── require.js ├── README.md ├── Server ├── .gitignore ├── .npmignore ├── README.md ├── Scripts │ ├── typings │ │ └── redis │ │ │ └── redis.d.ts │ ├── vorlon.IWebServerComponent.ts │ ├── vorlon.authentication.ts │ ├── vorlon.dashboard.ts │ ├── vorlon.httpproxy.server.ts │ ├── vorlon.server.ts │ ├── vorlon.tools.ts │ ├── vorlon.webServer.ts │ └── vorlon.winstonlogger.ts ├── Web.config ├── bin │ ├── ChangeConfig.ps1 │ ├── download.ps1 │ ├── node.cmd │ └── setup_web.cmd ├── cert │ ├── server.crt │ └── server.key ├── config.json ├── config │ ├── vorlon.baseurlconfig.ts │ ├── vorlon.configprovider.ts │ ├── vorlon.httpconfig.ts │ ├── vorlon.logconfig.ts │ ├── vorlon.pluginsconfig.ts │ ├── vorlon.redisconfig.ts │ └── vorlon.servercontext.ts ├── public │ ├── fonts │ │ ├── fontawesome │ │ │ ├── css │ │ │ │ ├── font-awesome.css │ │ │ │ └── font-awesome.min.css │ │ │ └── fonts │ │ │ │ ├── FontAwesome.otf │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ ├── fontawesome-webfont.svg │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ └── fontawesome-webfont.woff2 │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ └── glyphicons-halflings-regular.woff │ ├── images │ │ ├── VorlonLogo_Smooth.svg │ │ ├── express.png │ │ ├── favicon.png │ │ ├── icon-resize-horiz.svg │ │ ├── machine.png │ │ ├── no_img.png │ │ ├── nodejs.png │ │ ├── systems │ │ │ ├── android.png │ │ │ ├── apple.png │ │ │ ├── bb.png │ │ │ ├── firefox.png │ │ │ ├── kindle.png │ │ │ ├── linux.png │ │ │ ├── nodejs.png │ │ │ ├── openbsd.png │ │ │ ├── unknown.png │ │ │ ├── windows.png │ │ │ └── windows_phone.png │ │ ├── vorlon-logo-white.svg │ │ └── vorlonlogo_pixel_large.svg │ ├── javascripts │ │ ├── _references.js │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ ├── contextMenu.js │ │ ├── css.js │ │ ├── dashboard-config.js │ │ ├── dashboard.js │ │ ├── jquery-1.10.2.intellisense.js │ │ ├── jquery-1.10.2.js │ │ ├── jquery-1.10.2.min.js │ │ ├── jquery-1.10.2.min.map │ │ ├── jquery-2.1.1.min.js │ │ ├── jquery-ui.js │ │ ├── jquery.splitter-0.14.0.js │ │ ├── jquery.switchButton.js │ │ ├── jquery.validate-vsdoc.js │ │ ├── jquery.validate.js │ │ ├── jquery.validate.min.js │ │ ├── jquery.validate.unobtrusive.js │ │ ├── jquery.validate.unobtrusive.min.js │ │ ├── modernizr-2.6.2.js │ │ ├── modernizr.js │ │ ├── respond.js │ │ ├── respond.min.js │ │ ├── smoothie.js │ │ ├── socket.io-1.4.3.js │ │ └── x-tag-components.js │ ├── stylesheets │ │ ├── components │ │ │ ├── base.styl │ │ │ ├── buttons.styl │ │ │ ├── config.styl │ │ │ ├── dashboard.styl │ │ │ ├── login.styl │ │ │ ├── resize.styl │ │ │ └── sidebar.styl │ │ ├── contextMenu.css │ │ ├── globals │ │ │ ├── reset.styl │ │ │ └── variables.styl │ │ ├── httpproxy.css │ │ ├── images │ │ │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ │ │ ├── ui-bg_flat_75_ffffff_40x100.png │ │ │ ├── ui-bg_glass_55_fbf9ee_1x400.png │ │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ │ ├── ui-bg_glass_75_dadada_1x400.png │ │ │ ├── ui-bg_glass_75_e6e6e6_1x400.png │ │ │ ├── ui-bg_glass_95_fef1ec_1x400.png │ │ │ ├── ui-bg_highlight-soft_75_cccccc_1x100.png │ │ │ ├── ui-icons_222222_256x240.png │ │ │ ├── ui-icons_2e83ff_256x240.png │ │ │ ├── ui-icons_454545_256x240.png │ │ │ ├── ui-icons_888888_256x240.png │ │ │ └── ui-icons_cd0a0a_256x240.png │ │ ├── jquery-ui.css │ │ ├── jquery.switchButton.css │ │ ├── style.styl │ │ └── x-tag-components.css │ ├── vorlon.dashboardManager.ts │ └── vorlon.production.ts ├── server.ts ├── tsconfig.json └── views │ ├── config.jade │ ├── dashboard.jade │ ├── getsession.jade │ ├── httpproxy.jade │ ├── httpproxyerror.jade │ ├── includes │ ├── accessibility.jade │ ├── dashboard-config.jade │ ├── dashboard-initial.jade │ ├── dashboard-plugins.jade │ ├── plugins │ │ ├── console-logs.jade │ │ ├── console.jade │ │ ├── dom-explorer-style.jade │ │ ├── dom-explorer-tree.jade │ │ ├── dom-explorer.jade │ │ └── modernizr.jade │ └── sidebar.jade │ ├── layout.jade │ └── login.jade ├── Tests ├── gulpfile.tests.js └── server.vorlon.tools.tests.js ├── azuredeploy-parameters.json ├── azuredeploy.json ├── bin └── vorlon ├── build-docker-image.sh ├── deploy.cmd ├── disclaimer.js ├── gulpfile.js ├── package-lock.json ├── package.json ├── plugins library ├── README.md └── wappalyzerReport │ ├── control.html │ ├── control.less │ ├── vorlon.wappalyzerReport.client.ts │ ├── vorlon.wappalyzerReport.dashboard.ts │ ├── vorlon.wappalyzerReport.interfaces.ts │ └── wappalyzer.js ├── tsconfig.json └── whatsnew.md /.deployment: -------------------------------------------------------------------------------- 1 | [config] 2 | project = . 3 | command = deploy.cmd 4 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | DeploymentTools/ 2 | desktop/ 3 | .vscode/ 4 | Tests/ 5 | node_modules/ 6 | Contributing.md 7 | Readme.md 8 | azuredeploy.json 9 | azuredeploy-parameters.json 10 | deploy.cmd 11 | build-docker-image.sh 12 | VorlonNodeWrapper/ 13 | client samples/ -------------------------------------------------------------------------------- /.env-snapshot: -------------------------------------------------------------------------------- 1 | ------ DATE ------ 2 | Fri Feb 10 2023 1:00:59 PM 3 | ------------------ 4 | 5 | node -v 6 | v18.13.0 7 | 8 | 9 | gulp -v 10 | CLI version: 2.3.0 11 | Local version: 4.0.2 12 | 13 | 14 | npm -v 15 | 8.19.3 16 | 17 | 18 | tsc -v 19 | Version 4.9.4 20 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | 3 | bin/vorlon eol=lf 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | npm-debug.log 2 | *.log 3 | /Plugins/obj 4 | **/node_modules 5 | sync.bat 6 | *.suo 7 | /.vs/ 8 | bin/ 9 | **/control.css 10 | !Plugins/Vorlon/plugins/office/control.css 11 | sync.bat 12 | .settings/launch.json 13 | *.dat 14 | Server/public/stylesheets/style.css 15 | /Server/public/stylesheets/style.css 16 | /DeploymentTools/deployment-package.zip 17 | DeploymentTools/deployment-package.zip 18 | !/Plugins/Vorlon/plugins/domtimeline/** 19 | !/Plugins/Vorlon/plugins/domtimeline/**/*.css 20 | !/Plugins/Vorlon/plugins/domtimeline/**/*.js 21 | !/Plugins/Vorlon/plugins/domtimeline/dom-timeline.js 22 | .idea 23 | /Page Analyzer Extension/.gitignore 24 | .DS_Store 25 | output -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | *.ts 2 | Plugins 3 | *.sln 4 | *.njsproj 5 | server/web.config 6 | *.njsproj 7 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | 4 | "editor.fontSize": 15, 5 | "search.exclude": { 6 | "**/node_modules": false, 7 | "**/bower_components": true 8 | } 9 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // Available variables which can be used inside of strings. 2 | // ${workspaceRoot}: the root folder of the team 3 | // ${file}: the current opened file 4 | // ${fileBasename}: the current opened file's basename 5 | // ${fileDirname}: the current opened file's dirname 6 | // ${fileExtname}: the current opened file's extension 7 | // ${cwd}: the current working directory of the spawned process 8 | 9 | { 10 | "version": "2.0.0", 11 | "command": "gulp", 12 | "tasks": [ 13 | { 14 | "label": "default", 15 | "type": "gulp", 16 | "task": "default", 17 | "problemMatcher": [], 18 | "group": { 19 | "_id": "build", 20 | "isDefault": false 21 | } 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /.vscode/tasks.json.old: -------------------------------------------------------------------------------- 1 | // Available variables which can be used inside of strings. 2 | // ${workspaceRoot}: the root folder of the team 3 | // ${file}: the current opened file 4 | // ${fileBasename}: the current opened file's basename 5 | // ${fileDirname}: the current opened file's dirname 6 | // ${fileExtname}: the current opened file's extension 7 | // ${cwd}: the current working directory of the spawned process 8 | 9 | { 10 | "version": "0.1.0", 11 | "command": "gulp", 12 | "isShellCommand": true, 13 | "tasks": [ 14 | { 15 | "taskName": "default", 16 | "isBuildCommand": true, 17 | "showOutput": "always" 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Vorlon.JS is an open source project. 4 | 5 | Please submit pull requests, and file issues, so we can make Vorlon.JS even better. 6 | 7 | Do not work directly on master, commit your changes to the current dev branch : 8 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # use the node argon (4.4.3) image as base 2 | FROM node:argon 3 | 4 | # Set the Vorlon.JS Docker Image maintainer 5 | MAINTAINER Julien Corioland (Microsoft, DX) 6 | 7 | # Expose port 1337 8 | EXPOSE 1337 9 | 10 | # Upgrade to last NPM version 11 | RUN npm upgrade -g npm 12 | 13 | # Install gulp 14 | RUN npm install -g gulp 15 | 16 | # Set the entry point 17 | ENTRYPOINT ["npm", "start"] 18 | 19 | # Create the application directory 20 | RUN mkdir -p /usr/src/vorlonjs 21 | 22 | # Copy the application content 23 | COPY . /usr/src/vorlonjs/ 24 | 25 | # Set app root as working directory 26 | WORKDIR /usr/src/vorlonjs 27 | 28 | # Run npm install 29 | RUN npm install 30 | 31 | # Run gulp 32 | RUN gulp 33 | -------------------------------------------------------------------------------- /Dockerfile-npm: -------------------------------------------------------------------------------- 1 | # use the node argon (4.4.3) image as base 2 | FROM node:argon 3 | 4 | # Set the Vorlon.JS Docker Image maintainer 5 | MAINTAINER Julien Corioland (Microsoft, DX) 6 | 7 | # Expose port 1337 8 | EXPOSE 1337 9 | 10 | # Upgrade to last NPM version 11 | RUN npm upgrade -g npm 12 | 13 | # Install Vorlonjs 14 | RUN npm install -g vorlon@0.5.4 15 | 16 | # Set the entry point 17 | ENTRYPOINT ["vorlon"] -------------------------------------------------------------------------------- /Documentation/vorlon-adoption-doc/doc/vorlon-early-adoption-steps-old.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Documentation/vorlon-adoption-doc/doc/vorlon-early-adoption-steps-old.pdf -------------------------------------------------------------------------------- /Documentation/vorlon-adoption-doc/doc/vorlon-early-adoption-steps.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Documentation/vorlon-adoption-doc/doc/vorlon-early-adoption-steps.pdf -------------------------------------------------------------------------------- /Documentation/vorlon-adoption-doc/images/manifest-update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Documentation/vorlon-adoption-doc/images/manifest-update.png -------------------------------------------------------------------------------- /Documentation/vorlon-adoption-doc/images/ngrok-authtoken.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Documentation/vorlon-adoption-doc/images/ngrok-authtoken.jpg -------------------------------------------------------------------------------- /Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot1.png -------------------------------------------------------------------------------- /Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot2.jpg -------------------------------------------------------------------------------- /Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot3.jpg -------------------------------------------------------------------------------- /Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot4.jpg -------------------------------------------------------------------------------- /Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot5.jpg -------------------------------------------------------------------------------- /Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot6.jpg -------------------------------------------------------------------------------- /Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot7.jpg -------------------------------------------------------------------------------- /Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot8.jpg -------------------------------------------------------------------------------- /Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Documentation/vorlon-adoption-doc/images/vorlon-early-adoption-screenshot9.jpg -------------------------------------------------------------------------------- /Documentation/vorlon-adoption-doc/images/vorlon-head-script.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Documentation/vorlon-adoption-doc/images/vorlon-head-script.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Vorlon.js 2 | 3 | Copyright (c) Microsoft Corporation 4 | All rights reserved. 5 | 6 | ##MIT License## 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ""Software""), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 9 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 10 | THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 11 | -------------------------------------------------------------------------------- /Plugins/.gitignore: -------------------------------------------------------------------------------- 1 | release/* 2 | obj/* 3 | *.csproj.* -------------------------------------------------------------------------------- /Plugins/.npmignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/.npmignore -------------------------------------------------------------------------------- /Plugins/Vorlon/.gitignore: -------------------------------------------------------------------------------- 1 | *.js.map 2 | *.min.js 3 | !verge.min.js 4 | !res.min.js 5 | !plugins/domtimeline/** 6 | !plugins/domtimeline/**/*.css 7 | !plugins/domtimeline/**/*.js 8 | !plugins/domtimeline/dom-timeline.js 9 | !plugins/express/** 10 | !plugins/express/**/*.css 11 | !plugins/express/**/*.js 12 | !plugins/express/dom-timeline.js 13 | !plugins/nodejs/** 14 | !plugins/nodejs/**/*.css 15 | !plugins/nodejs/**/*.js 16 | !plugins/nodejs/dom-timeline.js 17 | !plugins/botFrameworkInspector/**/*.css -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/device/control.html: -------------------------------------------------------------------------------- 1 |
2 |

Device Information

3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
Viewport
Aspect Ratio
Width
Width (in EMs)
Meta Viewport Tag
25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 |
Screen Size
Screen Width
Screen Available Width
Window Inner Width
Body Client Width
47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 |
Resolution
Dots Per Inch (DPI)
Dots Per Pixel (DPPX)
Dots Per Centimeter (DPCM)
65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 |
Miscellaneous
Root Font Size
Pixel Ratio
User Agent
83 |
84 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/device/control.less: -------------------------------------------------------------------------------- 1 | #device-information { 2 | padding: 20px; 3 | 4 | & > table { 5 | width: 100%; 6 | margin: 20px 0 30px; 7 | 8 | th, td { 9 | padding: 5px 10px; 10 | text-align: left; 11 | } 12 | 13 | td { 14 | border-bottom: 1px solid #eee; 15 | 16 | &:first-child { 17 | width: 30%; 18 | } 19 | } 20 | 21 | .header { 22 | background: #f7f7f7; 23 | border-bottom: 1px solid #ddd; 24 | font-weight: 400; 25 | } 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/device/res.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * res 0.3.0+201410120233 3 | * https://github.com/ryanve/res 4 | * MIT License, 2014 Ryan Van Etten 5 | */ 6 | !function(a,b,c){"undefined"!=typeof module&&module.exports?module.exports=c(require):a[b]=c(function(b){return a[b]})}(this,"res",function(a){function b(b){return a("actual")("resolution",b.valueOf(),e[b])}function c(){return"undefined"==typeof window?0:+window.devicePixelRatio||Math.sqrt(screen.deviceXDPI*screen.deviceYDPI)/e.dpi||0}function d(a){var d=e[a];b[a]=1==d?c:function(){return c()*d}}var e={dppx:1,dpi:96,dpcm:96/2.54};return d("dppx"),d("dpcm"),d("dpi"),b}); -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/device/verge.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * verge 1.9.1+201402130803 3 | * https://github.com/ryanve/verge 4 | * MIT License 2013 Ryan Van Etten 5 | */ 6 | !function(a,b,c){"undefined"!=typeof module&&module.exports?module.exports=c():a[b]=c()}(this,"verge",function(){function a(){return{width:k(),height:l()}}function b(a,b){var c={};return b=+b||0,c.width=(c.right=a.right+b)-(c.left=a.left-b),c.height=(c.bottom=a.bottom+b)-(c.top=a.top-b),c}function c(a,c){return a=a&&!a.nodeType?a[0]:a,a&&1===a.nodeType?b(a.getBoundingClientRect(),c):!1}function d(b){b=null==b?a():1===b.nodeType?c(b):b;var d=b.height,e=b.width;return d="function"==typeof d?d.call(b):d,e="function"==typeof e?e.call(b):e,e/d}var e={},f="undefined"!=typeof window&&window,g="undefined"!=typeof document&&document,h=g&&g.documentElement,i=f.matchMedia||f.msMatchMedia,j=i?function(a){return!!i.call(f,a).matches}:function(){return!1},k=e.viewportW=function(){var a=h.clientWidth,b=f.innerWidth;return b>a?b:a},l=e.viewportH=function(){var a=h.clientHeight,b=f.innerHeight;return b>a?b:a};return e.mq=j,e.matchMedia=i?function(){return i.apply(f,arguments)}:function(){return{}},e.viewport=a,e.scrollX=function(){return f.pageXOffset||h.scrollLeft},e.scrollY=function(){return f.pageYOffset||h.scrollTop},e.rectangle=c,e.aspect=d,e.inX=function(a,b){var d=c(a,b);return!!d&&d.right>=0&&d.left<=k()},e.inY=function(a,b){var d=c(a,b);return!!d&&d.bottom>=0&&d.top<=l()},e.inViewport=function(a,b){var d=c(a,b);return!!d&&d.bottom>=0&&d.right>=0&&d.top<=l()&&d.left<=k()},e}); -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domExplorer/.gitignore: -------------------------------------------------------------------------------- 1 | *.css 2 | *.js -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domExplorer/readme.md: -------------------------------------------------------------------------------- 1 | ## DOM Explorer 2 | Inspect the DOM tree and its corresponding styles. 3 | 4 | [More information](http://blogs.msdn.com/b/eternalcoding/archive/2015/08/06/vorlon-js-focus-on-dom-explorer.aspx) -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domExplorer/vorlon.domExplorer.interfaces.ts: -------------------------------------------------------------------------------- 1 | interface Element { 2 | __vorlon: any; 3 | } 4 | interface HTMLElement { 5 | __vorlon: any; 6 | } 7 | 8 | module VORLON { 9 | export interface PackagedNode { 10 | id: string; 11 | type: string; 12 | name: string; 13 | classes: string; 14 | content: string; 15 | isEmpty: boolean; 16 | attributes: Array; 17 | styles?: any; 18 | internalId: string; 19 | hasChildNodes: boolean; 20 | rootHTML: any; 21 | children: Array; 22 | highlightElementID?: string; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domtimeline/api/mapping-system.d.ts: -------------------------------------------------------------------------------- 1 | declare var AMap: { new(): Map }; 2 | interface AMap { 3 | get(index:IndexType): ValueType, 4 | set(index:IndexType, value:ValueType) 5 | } 6 | 7 | declare var MappingSystem: MappingSystemConstructor; 8 | interface MappingSystemConstructor { 9 | new(): MappingSystem 10 | NodeMappingSystem: NodeMappingSystemConstructor 11 | Pointer: MappingSystemPointerConstructor 12 | } 13 | interface MappingSystem { 14 | data: DataType[], 15 | p2oMap: AMap, 16 | o2pMap: AMap> 17 | addToMaps(index: IndexType, meta: MetaType, value: LiveType) 18 | } 19 | interface NodeMappingSystemConstructor { 20 | new(document?: Document): NodeMappingSystem 21 | initFromDocument(): NodeMappingSystem 22 | initFromData(data: DehydratedNode[]): NodeMappingSystem 23 | } 24 | interface DehydratedNode { 25 | nodeName: string, 26 | nodeValue: string, 27 | outerHTML: string 28 | } 29 | interface NodeMappingSystem extends MappingSystem { 30 | addNodeAndChildren(node: Node) 31 | importData(data: DehydratedNode[]) 32 | getPointerListFor(nodes: {length:number,[i:number]:Node}): MappingSystemPointer[] 33 | getPointerFor(node: Node): MappingSystemPointer 34 | getObjectListFor(pointers: MappingSystemPointer[]): Node[] 35 | getObjectFor(pointer: MappingSystemPointer): Node 36 | } 37 | interface MappingSystemPointer { 38 | index: IndexType, 39 | meta: MetaType 40 | } 41 | interface MappingSystemPointerConstructor { 42 | new(index:IndexType, meta?:MetaType): MappingSystemPointer 43 | } 44 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domtimeline/api/shared-definitions.d.ts: -------------------------------------------------------------------------------- 1 | // =============================================================== 2 | // data being transferred by the pluging 3 | // =============================================================== 4 | interface DataForEntry { 5 | type:string, 6 | description: string, 7 | timestamp: number, 8 | rawData: any, 9 | details: any, 10 | } 11 | 12 | interface ClientDataForEntry extends DataForEntry { 13 | // data only available on the client side of things 14 | __dashboardData?: any, 15 | } 16 | 17 | interface DashboardDataForEntry extends DataForEntry { 18 | // data only available on the dashboard side of things 19 | isCancelled?: boolean 20 | areDetailsVisible?: boolean 21 | } 22 | 23 | interface DomHistoryData { 24 | 25 | clientUrl: string 26 | events: DataForEntry[] 27 | domData: NodeMappingSystem 28 | 29 | } 30 | 31 | // =============================================================== 32 | // dom api not defined in lib.d.ts 33 | // =============================================================== 34 | interface Window { 35 | eval: (string) => (any) 36 | } -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domtimeline/images/arrow-blue-b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/domtimeline/images/arrow-blue-b.png -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domtimeline/images/arrow-blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/domtimeline/images/arrow-blue.png -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domtimeline/images/arrow-green-b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/domtimeline/images/arrow-green-b.png -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domtimeline/images/arrow-green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/domtimeline/images/arrow-green.png -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domtimeline/images/arrow-red-b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/domtimeline/images/arrow-red-b.png -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domtimeline/images/arrow-red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/domtimeline/images/arrow-red.png -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domtimeline/images/blind.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/domtimeline/images/blind.png -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domtimeline/images/lev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/domtimeline/images/lev.png -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domtimeline/images/rule.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/domtimeline/images/rule.png -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domtimeline/images/sample.ts: -------------------------------------------------------------------------------- 1 | var m : ExtendedMutationRecord; 2 | 3 | //if(true) { debugger; }; 4 | 5 | function closest(selector: string, node: Node, converter: Function) { 6 | while(node && !matches(selector, node)) { 7 | node = node.parentNode; 8 | } 9 | return node ? converter(node) : node; 10 | } 11 | 12 | function matches(selector: string, node: any) { 13 | var matches = node.matches || node.webkitMatchesSelector || node.mozMatchesSelector || node.msMatchesSelector || function() { return false }; 14 | return matches.call(node, selector); 15 | } 16 | 17 | function anyNodeInList(nodes: NodeList, match: Function, options) { 18 | if(!nodes || nodes.length == 0) return false; 19 | if(!options) options = { deep: true }; 20 | for(var i = nodes.length; i--;) { 21 | if(match(nodes[i])) return true; 22 | if(options.deep != false) { 23 | if(anyNodeInList(nodes[i].childNodes, match, options)) { 24 | return true; 25 | } 26 | } 27 | } 28 | } 29 | 30 | function anyNode(match: Function | string, options) { 31 | if (match instanceof Function) { 32 | return match(m.target) || anyAddedNode(match, options) || anyRemovedNode(match, options); 33 | } else { 34 | return anyNode(function(node) { return matches(match, node); }, options); 35 | } 36 | } 37 | 38 | function anyAddedNode(match: Function | string, options) { 39 | if (match instanceof Function) { 40 | return anyNodeInList(m.addedNodes, match, options); 41 | } else { 42 | return anyNodeInList(m.addedNodes, function(node) { return matches(match, node); }, options); 43 | } 44 | } 45 | 46 | function anyRemovedNode(match: Function | string, options) { 47 | if (match instanceof Function) { 48 | return anyNodeInList(m.removedNodes, match, options); 49 | } else { 50 | return anyNodeInList(m.removedNodes, function(node) { return matches(match, node); }, options); 51 | } 52 | } 53 | 54 | function attributeAdded(name: string) { 55 | return m.type == 'attributes' && m.newValue != null && m.oldValue == null; 56 | } 57 | 58 | function attributeRemoved(name: string) { 59 | return m.type == 'attributes' && m.newValue == null && m.oldValue != null; 60 | } 61 | 62 | function attributeChanged(name: string, options) { 63 | var matches = m.type == 'attributes'; 64 | matches = matches && (name===undefined || (m.attributeName === name)); 65 | matches = matches && (options.newValue===undefined || (m.newValue === options.newValue)); 66 | matches = matches && (options.newValueContains===undefined || (m.newValue && m.newValue.indexOf(options.newValueContains) >= 0)); 67 | matches = matches && (options.oldValue===undefined || (m.oldValue === options.oldValue)); 68 | matches = matches && (options.oldValueContains===undefined || (m.oldValue && m.oldValue.indexOf(options.oldValueContains) >= 0)); 69 | matches = matches && (options.newlyContains===undefined || ( 70 | (!m.oldValue || m.oldValue.indexOf(options.newlyContains) == -1) 71 | && (m.newValue && m.newValue.indexOf(options.newlyContains) >= 0) 72 | )); 73 | matches = matches && (options.previouslyContained===undefined || ( 74 | (!m.newValue || m.newValue.indexOf(options.previouslyContained) == -1) 75 | && (m.oldValue && m.oldValue.indexOf(options.previouslyContained) >= 0) 76 | )); 77 | return matches; 78 | } 79 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domtimeline/images/standalone.part.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Page recorded on {{date}} ({{title}}) 4 | 5 | 6 | 7 | 18 | 19 | 62 | 63 | 68 | 69 | 70 | 71 | 76 |
72 | 73 | {{html}} 74 | 75 |
-------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/domtimeline/navigator.d.ts: -------------------------------------------------------------------------------- 1 | interface Navigator { 2 | msSaveBlob: (blobOrBase64: Blob | string, filename: string) => void 3 | } -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/express/README.md: -------------------------------------------------------------------------------- 1 | # Sample plugin 2 | 3 | This is an example additional plugin for vorlon. It renders an input field into the Vorlon dashboard. If you type a message, it sends it to your client, which reverses it, and sends it back to be rendered into the dashboard. 4 | 5 | You can use this as a starting point for your own plugins. 6 | 7 | ## Enabling the sample plugin 8 | 9 | To enable the sample plugin: 10 | 11 | 1. Clone this github repo if you haven't already (`git clone git@github.com/MicrosoftDX/Vorlonjs`) 12 | 2. Modify `Server/config.json` to add the plugin, so it looks like this: 13 | 14 | ```json 15 | { 16 | "includeSocketIO": true, 17 | "plugins": [ 18 | { "id": "CONSOLE", "name": "Interactive Console", "panel": "bottom", "foldername" : "interactiveConsole", "enabled": true}, 19 | { "id": "DOM", "name": "Dom Explorer", "panel": "top", "foldername" : "domExplorer", "enabled": true }, 20 | { "id": "MODERNIZR", "name": "Modernizr","panel": "bottom", "foldername" : "modernizrReport", "enabled": true }, 21 | { "id": "OBJEXPLORER", "name" : "Obj. Explorer","panel": "top", "foldername" : "objectExplorer", "enabled": true }, 22 | { "id": "SAMPLE", "name" : "Sample","panel": "top", "foldername" : "sample", "enabled": true } 23 | ] 24 | } 25 | ``` 26 | 27 | 3. From the root directory of the repository, install dependencies with `npm install`, build vorlon with `npm run build` and start the server with `npm start` (make sure you kill any existing vorlon servers running on your machine. You can now navigate to the vorlon dashboard as normal, and you'll see an additional tab in the list. 28 | 29 | ## Modifying the plugin 30 | 31 | The plugin is based on two files (one for the client and one for the dashboard) who respectively extend from VORLON.ClientPlugin and VORLON.DashboardPlugin, as defined in `Plugins/Vorlon/vorlon.clientPlugin.ts` and `Plugins/Vorlon/vorlon.dashboardPlugin.ts` so you can see what methods are available for your plugin from there. You may also wish to look at the other existing plugins in `Plugins/Vorlon/plugins` for ideas. 32 | 33 | `control.html` will be inserted into the dashboard, as will `dashboard.css`. 34 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/express/control.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
10 |

HEADERS :

11 |

12 |   
13 |
14 |
15 |
16 | + 17 |
18 |

VorlonJS did not find you Express app :(

19 |

To connect your express application into the vorlon plugin,

20 |

add this line in your nodejs application :

21 |

`EXPRESS_VORLONJS = app;` where app is your express application

22 |
23 |
24 |
25 |
26 |
27 | 28 | 29 | 36 | 37 |
    38 | 39 |
40 |
41 | 47 | 50 | 54 |
55 |
56 |
57 |
58 |

Routes

59 |

Requests

60 |

Sessions

61 |

Locals

62 |
63 |
64 |
65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/express/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/express/icon.png -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/express/vorlon.express.client.min.js: -------------------------------------------------------------------------------- 1 | var __extends=this&&this.__extends||function(e,o){function t(){this.constructor=e}for(var s in o)o.hasOwnProperty(s)&&(e[s]=o[s]);e.prototype=null===o?Object.create(o):(t.prototype=o.prototype,new t)},VORLON;!function(e){var o=function(o){function t(){o.call(this,"express"),this.hooked=!1,this._ready=!0,console.log("Started")}return __extends(t,o),t.prototype.getID=function(){return"NODEJS"},t.prototype.refresh=function(){},t.prototype.startClientSide=function(){},t.prototype.setupExpressHook=function(){console.log("Hooking express");if(!e.Tools.IsWindowAvailable&&!this._hookAlreadyDone){this._hookAlreadyDone=!0;{require("express")}}this.hooked=!0},t.prototype._hookPrototype=function(e,o){this._previousExpress||(this._previousExpress=o.application.init),o.application.init=function(){return console.log("IN EXPRESS !"),e._previousExpress.apply(this)}},t.prototype.onRealtimeMessageReceivedFromDashboardSide=function(o){e.Tools.IsWindowAvailable||"express"==o&&this.sendToDashboard({type:"express",data:global.express_vorlonJS})},t}(e.ClientPlugin);e.ExpressClient=o,e.Core.RegisterClientPlugin(new o)}(VORLON||(VORLON={})); -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/interactiveConsole/.gitignore: -------------------------------------------------------------------------------- 1 | *.css 2 | *.js -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/interactiveConsole/control.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/interactiveConsole/control.less: -------------------------------------------------------------------------------- 1 | .plugin-console { 2 | .logs-container { 3 | width: 100%; 4 | height: 100%; 5 | } 6 | 7 | .logs-list { 8 | overflow: auto; 9 | padding: 0.5em 0.5em 0px; 10 | width: 100%; 11 | height: ~"calc(100% - 80px)"; 12 | } 13 | 14 | .filter-btn { 15 | border-radius: 0; 16 | background-color: transparent; 17 | width: 32px; 18 | text-align: center; 19 | margin-left: 2px; 20 | 21 | #filterall { 22 | margin-right: 4px; 23 | } 24 | &.selected { 25 | background-color: #333; 26 | color: white; 27 | } 28 | } 29 | 30 | .log-entry { 31 | margin-bottom: 3px; 32 | margin-left: 30px; 33 | position: relative; 34 | 35 | &.hide { 36 | display: none !important; 37 | } 38 | 39 | &:before { 40 | content: '>'; 41 | position: absolute; 42 | left: -30px; 43 | top: 0; 44 | font-size: 14px; 45 | font-weight: 400; 46 | color: #ccc; 47 | } 48 | 49 | &.logMessage { 50 | color: #444; 51 | } 52 | 53 | &.logDebug { 54 | color: #b200ff; 55 | } 56 | 57 | &.logInfo { 58 | color: #0026ff; 59 | } 60 | 61 | &.logWarning { 62 | color: #ff9205; 63 | } 64 | 65 | &.logError { 66 | color: #ed2424; 67 | } 68 | 69 | &.logException { 70 | color: #ed2424; 71 | } 72 | 73 | .text-message { 74 | display: inline-block; 75 | margin-right: 1em; 76 | } 77 | 78 | .object-description { 79 | .obj-link { 80 | color: inherit; 81 | cursor: pointer; 82 | } 83 | 84 | .toggle-state, .blank-state { 85 | display: inline-block; 86 | width: 14px; 87 | height: 14px; 88 | line-height: 12px; 89 | vertical-align: middle; 90 | text-align: center; 91 | margin-right: 4px; 92 | box-sizing: border-box; 93 | } 94 | 95 | .toggle-state { 96 | border: 1px solid #CCC; 97 | } 98 | 99 | > .object-toggle { 100 | display: block; 101 | } 102 | 103 | > .object-content { 104 | border-left: 1px solid #DDD; 105 | padding-left: 15px; 106 | margin-left: 7px; 107 | 108 | > .obj-proto, > .obj-functions { 109 | > .content { 110 | border-left: 1px solid #DDD; 111 | padding-left: 15px; 112 | margin-left: 7px; 113 | } 114 | 115 | 116 | &.collapsed { 117 | > .content { 118 | display: none; 119 | } 120 | } 121 | } 122 | } 123 | 124 | &.collapsed { 125 | > .object-content { 126 | display: none; 127 | } 128 | } 129 | 130 | .prop-value { 131 | font-weight: bold; 132 | } 133 | } 134 | } 135 | 136 | .console-input { 137 | display: block; 138 | margin: 0; 139 | font-size: inherit; 140 | width: 100%; 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/interactiveConsole/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/interactiveConsole/icon.png -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/interactiveConsole/vorlon.interactiveConsole.interfaces.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | 3 | export interface ObjectPropertyDescriptor { 4 | name: string; 5 | val: any; 6 | } 7 | 8 | export interface ObjectDescriptor { 9 | proto?: ObjectDescriptor; 10 | functions: Array; 11 | properties: Array; 12 | } 13 | 14 | export interface ConsoleEntry { 15 | type: any; 16 | messages: Array; 17 | } 18 | } -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/modernizrReport/control.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 |

CSS Features Detection

11 | 12 | 13 | 14 | 15 | 16 |
FeatureSupport level
17 |

HTML5 Features Detection

18 | 19 | 20 | 21 | 22 | 23 |
FeatureSupport level
24 |

Miscellaneous

25 | 26 | 27 | 28 | 29 | 30 |
FeatureSupport level
31 |

Non core

32 | 33 | 34 | 35 | 36 | 37 |
FeatureSupport level
38 |
39 | 40 | 41 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/modernizrReport/control.less: -------------------------------------------------------------------------------- 1 | .plugin-modernizr { 2 | padding: 20px; 3 | 4 | .modernizr-features-list { 5 | width: 100%; 6 | margin: 20px 0 30px; 7 | } 8 | 9 | .modernizr-features-list th, 10 | .modernizr-features-list td { 11 | padding: 5px 10px; 12 | text-align: left; 13 | } 14 | 15 | .modernizr-features-list th { 16 | background: #f7f7f7; 17 | border-bottom: 1px solid #ddd; 18 | font-weight: 400; 19 | } 20 | 21 | .modernizr-features-list td { 22 | border-bottom: 1px solid #eee; 23 | } 24 | 25 | .modernizr-features-list th:first-child, 26 | .modernizr-features-list td:first-child { 27 | width: 70%; 28 | } 29 | 30 | .modernizr-features-list th:last-child, 31 | .modernizr-features-list td:last-child { 32 | width: 30%; 33 | font-weight: bold; 34 | text-align: center; 35 | } 36 | 37 | .modernizr-features-list .modernizrFeatureSupported { 38 | color: #466733; 39 | } 40 | 41 | .modernizr-features-list .modernizrFeatureUnsupported { 42 | color: #803030; 43 | } 44 | 45 | #css_feature_filter { 46 | display: block; 47 | width: 100%; 48 | max-width: 225px; 49 | margin: 0 0 20px 0; 50 | padding: 4px; 51 | border: 1px solid #ddd; 52 | border-radius: 3px; 53 | 54 | &::-webkit-input-placeholder { 55 | font-size: 80%; 56 | font-style: italic; 57 | } 58 | 59 | &:-moz-placeholder { 60 | font-size: 80%; 61 | font-style: italic; 62 | } 63 | 64 | &::-moz-placeholder { 65 | font-size: 80%; 66 | font-style: italic; 67 | } 68 | 69 | &:-ms-input-placeholder { 70 | font-size: 80%; 71 | font-style: italic; 72 | } 73 | 74 | &::placeholder { 75 | font-size: 80%; 76 | font-style: italic; 77 | } 78 | 79 | &:invalid { 80 | outline: none; 81 | -webkit-box-shadow: none; 82 | -ms-box-shadow: none; 83 | box-shadow: none; 84 | } 85 | 86 | &:valid ~ table { 87 | margin: 0; 88 | } 89 | 90 | &:valid ~ h1, &:valid ~ table th { 91 | display: none; 92 | } 93 | } 94 | 95 | .modernizr-features-list [data-feature-visibility="hidden"] { 96 | display: none; 97 | } 98 | } -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/modernizrReport/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/modernizrReport/icon.png -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/modernizrReport/vorlon.modernizrReport.interfaces.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export class FeatureSupported { 3 | public featureName: string; 4 | public isSupported: boolean; 5 | public type: string; 6 | } 7 | } -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/networkMonitor/control.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
NameDomainTypeDuration (ms)Timeline
20 | 21 | 22 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/networkMonitor/control.less: -------------------------------------------------------------------------------- 1 | .plugin-network { 2 | padding: 20px; 3 | 4 | .network-log-list { 5 | width: 100%; 6 | margin: 0px 0 30px; 7 | 8 | th, 9 | td { 10 | padding: 5px 10px; 11 | text-align: left; 12 | } 13 | 14 | th { 15 | background: #f7f7f7; 16 | border-bottom: 1px solid #ddd; 17 | font-weight: 400; 18 | } 19 | 20 | td { 21 | border-bottom: 1px solid #eee; 22 | } 23 | 24 | .network-log-list-right { 25 | text-align: right; 26 | } 27 | 28 | td .chart-bar { 29 | position: absolute; 30 | height: 10px; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/networkMonitor/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/networkMonitor/icon.png -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/networkMonitor/vorlon.networkMonitor.client.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export class NetworkMonitorClient extends ClientPlugin { 3 | public performanceItems: PerformanceItem[] = []; 4 | 5 | constructor() { 6 | super("networkMonitor"); 7 | //this.debug = true; 8 | this._ready = true; 9 | } 10 | 11 | public getID(): string { 12 | return "NETWORK"; 13 | } 14 | 15 | public sendClientData(): void { 16 | this.trace("network monitor sending data ") 17 | this.performanceItems = []; 18 | 19 | if (typeof window.performance.getEntries !== 'undefined' && window.performance) { 20 | var entries = window.performance.getEntries(); 21 | 22 | for (var i = 0; i < entries.length; i++) { 23 | var perfEntry = entries[i]; 24 | 25 | //TODO:- (gakeshre) Temporary code commit to silence errors 26 | /* 27 | if (perfEntry instanceof PerformanceEventTiming) { 28 | this.performanceItems.push({ 29 | name: perfEntry.name, 30 | type: perfEntry.initiatorType, 31 | startTime: perfEntry.startTime, 32 | duration: perfEntry.duration, 33 | redirectStart: perfEntry.redirectStart, 34 | redirectDuration: perfEntry.redirectEnd - perfEntry.redirectStart, 35 | dnsStart: perfEntry.domainLookupStart, 36 | dnsDuration: perfEntry.domainLookupEnd - perfEntry.domainLookupStart, 37 | tcpStart: perfEntry.connectStart, 38 | tcpDuration: perfEntry.connectEnd - perfEntry.connectStart, // TODO 39 | requestStart: perfEntry.requestStart, 40 | requestDuration: perfEntry.responseStart - perfEntry.requestStart, 41 | responseStart: perfEntry.responseStart, 42 | responseDuration: (perfEntry.responseStart == 0 ? 0 : perfEntry.responseEnd - perfEntry.responseStart) 43 | }); 44 | } 45 | */ 46 | } 47 | } 48 | 49 | var message: any = {}; 50 | message.entries = this.performanceItems; 51 | this.sendCommandToDashboard("performanceItems", message); 52 | } 53 | 54 | public refresh(): void { 55 | this.sendClientData(); 56 | } 57 | } 58 | 59 | NetworkMonitorClient.prototype.ClientCommands = { 60 | refresh: function (data: any) { 61 | var plugin = this; 62 | plugin.sendClientData(); 63 | } 64 | }; 65 | //Register the plugin with vorlon core 66 | Core.RegisterClientPlugin(new NetworkMonitorClient()); 67 | } -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/networkMonitor/vorlon.networkMonitor.interfaces.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export class PerformanceItem { 3 | public name: string; 4 | public type: string; 5 | public startTime: number; 6 | public duration: number; 7 | public redirectStart: number; 8 | public redirectDuration: number; 9 | //public appCacheStart: number; 10 | //public appCacheDuration: number; 11 | public dnsStart: number; 12 | public dnsDuration: number; 13 | public tcpStart: number; 14 | public tcpDuration: number; 15 | //public sslStart: number; 16 | //public sslDuration: number; 17 | public requestStart: number; 18 | public requestDuration: number; 19 | public responseStart: number; 20 | public responseDuration: number; 21 | } 22 | } -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/ngInspector/.gitignore: -------------------------------------------------------------------------------- 1 | *.css 2 | *.js -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/ngInspector/control.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
10 | 18 |
19 |
20 |
21 |
22 |
23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/ngInspector/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/ngInspector/icon.png -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/ngInspector/readme.md: -------------------------------------------------------------------------------- 1 | ## ngInspector 2 | Inspect your Angular.js scopes. 3 | 4 | [More information](http://sebastienollivier.fr/blog/javascript/nginspector-for-vorlon) -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/ngInspector/vorlon.ngInspector.interfaces.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | 3 | export enum ScopeType { NgRepeat, RootScope, Controller, Directive }; 4 | export enum PropertyType { Array, Object, Number, String, Boolean, Null }; 5 | export enum MessageType { ReloadWithDebugInfo }; 6 | 7 | export interface Scope { 8 | $id: number; 9 | $parentId: number; 10 | $children: Scope[]; 11 | $functions: string[]; 12 | $type: ScopeType; 13 | $name: string; 14 | } 15 | } -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/objectExplorer/.gitignore: -------------------------------------------------------------------------------- 1 | *.css 2 | *.js -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/objectExplorer/control.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/objectExplorer/control.less: -------------------------------------------------------------------------------- 1 | @import "../vorlontheme.less"; 2 | 3 | .plugin-objexplorer { 4 | 5 | .obj-explorer-container { 6 | height: 100%; 7 | overflow: hidden !important; 8 | } 9 | 10 | .tree-view-wrapper { 11 | position: relative; 12 | width: 100%; 13 | height: 100%; 14 | @searchBoxHeight: 38px; 15 | 16 | #searchbox { 17 | position: absolute; 18 | left: 0; 19 | top: 0; 20 | right: 0; 21 | padding: 4px; 22 | height: @searchBoxHeight; 23 | border-bottom: 1px solid #EEE; 24 | display: flex; 25 | 26 | .panel { 27 | position: relative; 28 | 29 | input { 30 | width: 100%; 31 | padding-left: 30px; 32 | } 33 | 34 | i { 35 | left: 10px; 36 | top: 0; 37 | line-height: 27px; 38 | color: #CCC; 39 | position: absolute; 40 | } 41 | } 42 | 43 | .searchPanel { 44 | flex: 1; 45 | } 46 | 47 | .filterPanel { 48 | width: 20%; 49 | min-width: 120px; 50 | margin-left: 4px; 51 | } 52 | } 53 | 54 | #treeViewObj { 55 | position: absolute; 56 | left: 0; 57 | top: @searchBoxHeight; 58 | right: 0; 59 | bottom: 0; 60 | padding: 5px 20px 20px 30px; 61 | overflow: auto; 62 | line-height: 1.5em; 63 | } 64 | } 65 | 66 | .panel-left, .panel-right { 67 | height: 100%; 68 | } 69 | 70 | .objdescriptor { 71 | margin-bottom: 5px; 72 | } 73 | 74 | .expandable { 75 | > .expand { 76 | cursor: pointer; 77 | 78 | > .expand-btn { 79 | color: black; 80 | margin-left: -18px; 81 | margin-right: 4px; 82 | width: 14px; 83 | height: 14px; 84 | line-height: 12px; 85 | border: 1px solid #DDD; 86 | text-align: center; 87 | cursor: pointer; 88 | display: inline-block; 89 | } 90 | } 91 | 92 | > .expand-content { 93 | display: none; 94 | padding-left: 30px; 95 | margin-left: -12px; 96 | border-left: 1px solid #DDD; 97 | } 98 | 99 | &.expanded { 100 | > .expand-content { 101 | display: block; 102 | } 103 | } 104 | } 105 | 106 | .tree-view { 107 | padding: 0; 108 | } 109 | 110 | .objdescriptor>*{ 111 | margin-bottom: 2px; 112 | } 113 | 114 | .property{ 115 | 116 | .prop-name{ 117 | } 118 | 119 | .prop-value{ 120 | color: #2C2242; 121 | margin-left: 10px; 122 | text-decoration: underline; 123 | } 124 | } 125 | 126 | .actionicon { 127 | margin-left: 0.5em; 128 | display: inline-block; 129 | width: 16px; 130 | height: 16px; 131 | line-height: 16px; 132 | color: lighten(@lightpurple, 50%); 133 | text-align:center; 134 | vertical-align : middle; 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/objectExplorer/vorlon.objectExplorer.interfaces.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export interface ObjExplorerPropertyDescriptor { 3 | name: string; 4 | type: string; 5 | fullpath: string; 6 | value?: any; 7 | } 8 | 9 | export interface ObjExplorerFunctionDescriptor { 10 | name: string; 11 | args: string[]; 12 | fullpath: string; 13 | } 14 | 15 | export interface ObjExplorerObjDescriptor extends ObjExplorerPropertyDescriptor { 16 | proto?: ObjExplorerObjDescriptor; 17 | functions: Array; 18 | properties: Array; 19 | contentFetched: boolean; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/office/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | *.js -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/office/control.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 |
13 |
14 |
15 | 16 | Refresh 17 | 18 | 19 |
20 |
21 | Loading ... 22 |
23 | 24 |
25 |
26 |
27 | 28 |

Properties

29 | 30 |
31 | 32 | 33 |
34 | 35 | 36 | 37 | 42 |
43 |
44 |
45 | 46 | 47 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/office/vorlon.office.document.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | 5 | var $: any; 6 | module VORLON { 7 | 8 | export class OfficeDocument { 9 | 10 | private dashboardPlugin: DashboardPlugin; 11 | 12 | constructor(dashboardPlugin: DashboardPlugin) { 13 | this.dashboardPlugin = dashboardPlugin; 14 | } 15 | 16 | public execute() { 17 | 18 | this.apis.forEach(api => { 19 | api().addTree(); 20 | }); 21 | } 22 | 23 | public apis: { (): OfficeFunction }[] = [ 24 | (): OfficeFunction => { 25 | var fn = new OfficeFunction(this.dashboardPlugin, "window.Office.context.requirements", "isSetSupported"); 26 | var apiName = OfficeTools.CreateTextBlock(fn.fullpathName + ".apiName", "Api name"); 27 | var apiVersion = OfficeTools.CreateTextBlock(fn.fullpathName + ".apiVersion", "Api Version"); 28 | fn.elements.push(apiName, apiVersion); 29 | return fn; 30 | }, 31 | (): OfficeFunction => { 32 | return new OfficeFunction(this.dashboardPlugin, "window.Office.context.document", "getAllAsync"); 33 | 34 | }, 35 | (): OfficeFunction => { 36 | 37 | var fn = new OfficeFunction(this.dashboardPlugin, "window.Office.context.document", "getSelectedDataAsync"); 38 | var coercionType = OfficeTools.CreateTextBlock(fn.fullpathName + ".coercionType", "Coercion type", "text"); 39 | var filterType = OfficeTools.CreateTextBlock(fn.fullpathName + ".filterType", "Filter type", "all"); 40 | var valueFormat = OfficeTools.CreateTextBlock(fn.fullpathName + ".valueFormat", "Value format", "unformatted"); 41 | fn.elements.push(coercionType, filterType, valueFormat); 42 | fn.getArgs = (): any => { 43 | var args = [coercionType.value, { 44 | filterType: filterType.value === "" ? null : filterType.value, 45 | valueFormat: valueFormat.value === "" ? null : valueFormat.value 46 | }]; 47 | return args; 48 | }; 49 | return fn; 50 | 51 | }, 52 | (): OfficeFunction => { 53 | 54 | var fn = new OfficeFunction(this.dashboardPlugin, "window.Office.context.document", "getFileAsync"); 55 | fn.elements.push(OfficeTools.CreateTextBlock(fn.fullpathName + ".fileType", "Type", "text")); 56 | return fn; 57 | }, 58 | (): OfficeFunction => { 59 | var fn = new OfficeFunction(this.dashboardPlugin, "window.Office.context.document", "setSelectedDataAsync"); 60 | var data = VORLON.OfficeTools.CreateTextArea(fn.fullpathName + ".data", "Data", "Hello World"); 61 | var coercionType = VORLON.OfficeTools.CreateTextBlock(fn.fullpathName + ".coerctionType", "Type", "text"); 62 | fn.elements.push(data, coercionType); 63 | fn.getArgs = (): any => { 64 | var args = [data.value, { 65 | coercionType: coercionType.value === "" ? null : coercionType.value 66 | }]; 67 | return args; 68 | }; 69 | return fn; 70 | } 71 | ] 72 | } 73 | 74 | } -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/office/vorlon.office.interfaces.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export class OfficeFunction { 3 | 4 | public treeCategory: string; 5 | public functionName: string; 6 | public elements: any[]; 7 | public callback: void; 8 | private dashboardPlugin: DashboardPlugin; 9 | public fullpathName: string; 10 | public sendToClient: () => void; 11 | 12 | /** 13 | * function ecosystem 14 | */ 15 | constructor(dashboardPlugin: DashboardPlugin, treeCategory: string, functionName: string) { 16 | this.dashboardPlugin = dashboardPlugin; 17 | this.treeCategory = treeCategory; 18 | this.functionName = functionName; 19 | this.fullpathName = treeCategory + "." + functionName; 20 | this.elements = []; 21 | this.sendToClient = () => this.dashboardPlugin.sendToClient( 22 | { 23 | type: "function", 24 | name: this.fullpathName, 25 | args: this.getArgs(), 26 | hasAsyncResult: this.isAsync() 27 | }); 28 | 29 | 30 | 31 | } 32 | 33 | public addTree(): void { 34 | 35 | var func = VORLON.OfficeTools.AddTreeFunction(this.treeCategory, this.functionName); 36 | 37 | func.click(e => { 38 | VORLON.OfficeTools.ShowFunction(this.fullpathName, this.sendToClient, this.elements); 39 | }); 40 | } 41 | 42 | public getArgs(): any[] { 43 | var args = []; 44 | this.elements.forEach(element => { 45 | if (element.value !== null && element.value !== undefined && element.value !== "") 46 | args.push(element.value); 47 | }); 48 | 49 | return args; 50 | } 51 | 52 | public isAsync() { 53 | var isAsync = (this.functionName.toLowerCase().indexOf("async") > 0); 54 | return isAsync; 55 | } 56 | 57 | 58 | 59 | } 60 | } -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/office/vorlon.office.powerpoint.ts: -------------------------------------------------------------------------------- 1 | 2 | var $: any; 3 | module VORLON { 4 | 5 | export class OfficePowerPoint { 6 | 7 | private dashboardPlugin: DashboardPlugin; 8 | 9 | constructor(dashboardPlugin: DashboardPlugin) { 10 | this.dashboardPlugin = dashboardPlugin; 11 | } 12 | 13 | public execute() { 14 | this.apis.forEach(api => { 15 | api().addTree(); 16 | }); 17 | } 18 | 19 | public apis: { (): OfficeFunction; }[] = [ 20 | (): OfficeFunction => { 21 | return (new OfficeFunction(this.dashboardPlugin, "window.Office.context.document", "getActiveViewAsync")); 22 | }, 23 | (): OfficeFunction => { 24 | return (new OfficeFunction(this.dashboardPlugin, "window.Office.context.document", "getFilePropertiesAsync")); 25 | }, 26 | (): OfficeFunction => { 27 | 28 | var fn = new OfficeFunction(this.dashboardPlugin, "window.Office.context.document", "getSelectedDataAsync"); 29 | var coercionType = OfficeTools.CreateTextBlock(fn.fullpathName + ".coercionType", "Coercion type", "text"); 30 | var filterType = OfficeTools.CreateTextBlock(fn.fullpathName + ".filterType", "Filter type", "all"); 31 | var valueFormat = OfficeTools.CreateTextBlock(fn.fullpathName + ".valueFormat", "Value format", "unformatted"); 32 | fn.elements.push(coercionType, filterType, valueFormat); 33 | fn.getArgs = (): any => { 34 | var args = [coercionType.value, { 35 | filterType: filterType.value === "" ? null : filterType.value, 36 | valueFormat: valueFormat.value === "" ? null : valueFormat.value 37 | }]; 38 | return args; 39 | }; 40 | return fn; 41 | 42 | }, 43 | (): OfficeFunction => { 44 | var fn = new OfficeFunction(this.dashboardPlugin, "window.Office.context.document", "setSelectedDataAsync"); 45 | var data = VORLON.OfficeTools.CreateTextArea(fn.fullpathName + ".data", "Data", "Hello World"); 46 | var coercionType = VORLON.OfficeTools.CreateTextBlock(fn.fullpathName + ".coerctionType", "Type", "text"); 47 | fn.elements.push(data, coercionType); 48 | fn.getArgs = (): any => { 49 | var args = [data.value, { 50 | coercionType: coercionType.value === "" ? null : coercionType.value 51 | }]; 52 | return args; 53 | }; 54 | return fn; 55 | } 56 | 57 | ] 58 | } 59 | } -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/resourcesExplorer/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/resourcesExplorer/icon.png -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/resourcesExplorer/vorlon.resourcesExplorer.client.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export class ResourcesExplorerClient extends ClientPlugin { 3 | public localStorageList: KeyValue[] = []; 4 | public sessionStorageList: KeyValue[] = []; 5 | public cookiesList: KeyValue[] = []; 6 | 7 | constructor() { 8 | super("resourcesExplorer"); 9 | this._ready = true; 10 | this._id = "RESOURCES"; 11 | //this.debug = true; 12 | 13 | window.addEventListener("load", () => { 14 | this.sendClientData(); 15 | }); 16 | } 17 | 18 | public sendClientData(): void { 19 | // LOCAL STORAGE 20 | this.localStorageList = []; 21 | for (var i = 0; i < localStorage.length; i++) { 22 | this.localStorageList.push({ "key": localStorage.key(i), "value": localStorage.getItem(localStorage.key(i)) }); 23 | } 24 | // SESSION STORAGE 25 | this.sessionStorageList = []; 26 | for (var i = 0; i < sessionStorage.length; i++) { 27 | this.sessionStorageList.push({ "key": sessionStorage.key(i), "value": sessionStorage.getItem(sessionStorage.key(i)) }); 28 | } 29 | // COOKIES 30 | this.cookiesList = []; 31 | var cookies = document.cookie.split(';'); 32 | for (var i = 0; i < cookies.length; i++) { 33 | var keyValue = cookies[i].split('='); 34 | this.cookiesList.push({ "key": keyValue[0], "value": keyValue[1] }); 35 | } 36 | 37 | var message: any = {}; 38 | message.localStorageList = this.localStorageList; 39 | message.sessionStorageList = this.sessionStorageList; 40 | message.cookiesList = this.cookiesList; 41 | this.sendCommandToDashboard("resourceitems", message); 42 | } 43 | 44 | public refresh(): void { 45 | this.sendClientData(); 46 | } 47 | 48 | public evalOrderFromDashboard(order: string) { 49 | try { 50 | eval(order); 51 | } catch (e) { 52 | console.error("Unable to execute order: " + e.message); 53 | } 54 | } 55 | } 56 | 57 | ResourcesExplorerClient.prototype.ClientCommands = { 58 | refresh: function (data: any) { 59 | var plugin = this; 60 | plugin.refresh(); 61 | }, 62 | order: function (data: any) { 63 | var plugin = this; 64 | plugin.evalOrderFromDashboard(data.order); 65 | } 66 | }; 67 | 68 | //Register the plugin with vorlon core 69 | Core.RegisterClientPlugin(new ResourcesExplorerClient()); 70 | } -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/resourcesExplorer/vorlon.resourcesExplorer.interfaces.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export class KeyValue { 3 | public key: string; 4 | public value: string; 5 | } 6 | } -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/sample/README.md: -------------------------------------------------------------------------------- 1 | # Sample plugin 2 | 3 | This is an example additional plugin for vorlon. It renders an input field into the Vorlon dashboard. If you type a message, it sends it to your client, which reverses it, and sends it back to be rendered into the dashboard. 4 | 5 | You can use this as a starting point for your own plugins. 6 | 7 | ## Enabling the sample plugin 8 | 9 | To enable the sample plugin: 10 | 11 | 1. Clone this github repo if you haven't already (`git clone git@github.com/MicrosoftDX/Vorlonjs`) 12 | 2. Modify `Server/config.json` to add the plugin, so it looks like this: 13 | 14 | ```json 15 | { 16 | "includeSocketIO": true, 17 | "plugins": [ 18 | { "id": "CONSOLE", "name": "Interactive Console", "panel": "bottom", "foldername" : "interactiveConsole", "enabled": true}, 19 | { "id": "DOM", "name": "Dom Explorer", "panel": "top", "foldername" : "domExplorer", "enabled": true }, 20 | { "id": "MODERNIZR", "name": "Modernizr","panel": "bottom", "foldername" : "modernizrReport", "enabled": true }, 21 | { "id": "OBJEXPLORER", "name" : "Obj. Explorer","panel": "top", "foldername" : "objectExplorer", "enabled": true }, 22 | { "id": "SAMPLE", "name" : "Sample","panel": "top", "foldername" : "sample", "enabled": true } 23 | ] 24 | } 25 | ``` 26 | 27 | 3. From the root directory of the repository, install dependencies with `npm install`, build vorlon with `npm run build` and start the server with `npm start` (make sure you kill any existing vorlon servers running on your machine. You can now navigate to the vorlon dashboard as normal, and you'll see an additional tab in the list. 28 | 29 | ## Modifying the plugin 30 | 31 | The plugin is based on two files (one for the client and one for the dashboard) who respectively extend from VORLON.ClientPlugin and VORLON.DashboardPlugin, as defined in `Plugins/Vorlon/vorlon.clientPlugin.ts` and `Plugins/Vorlon/vorlon.dashboardPlugin.ts` so you can see what methods are available for your plugin from there. You may also wish to look at the other existing plugins in `Plugins/Vorlon/plugins` for ideas. 32 | 33 | `control.html` will be inserted into the dashboard, as will `dashboard.css`. 34 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/sample/control.css: -------------------------------------------------------------------------------- 1 | #echoInput { 2 | width: 25%; 3 | padding: 5px; 4 | margin: 20px; 5 | margin-bottom: 10px; 6 | } 7 | .plugin-sample h6 { 8 | padding: 5px; 9 | margin: 20px; 10 | margin-top: 10px; 11 | font-weight: bold; 12 | } 13 | .plugin-sample p { 14 | margin: 5px 20px; 15 | } 16 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/sample/control.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 |
Messages from the client
6 | 7 |
8 |
9 |
10 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/sample/vorlon.sample.client.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export class SampleClient extends ClientPlugin { 3 | 4 | constructor() { 5 | super("sample"); // Name 6 | this._ready = true; // No need to wait 7 | console.log('Started'); 8 | } 9 | 10 | //Return unique id for your plugin 11 | public getID(): string { 12 | return "SAMPLE"; 13 | } 14 | 15 | public refresh(): void { 16 | //override this method with cleanup work that needs to happen 17 | //as the user switches between clients on the dashboard 18 | 19 | //we don't really need to do anything in this sample 20 | } 21 | 22 | // This code will run on the client ////////////////////// 23 | 24 | // Start the clientside code 25 | public startClientSide(): void { 26 | //don't actually need to do anything at startup 27 | } 28 | 29 | // Handle messages from the dashboard, on the client 30 | public onRealtimeMessageReceivedFromDashboardSide(receivedObject: any): void { 31 | console.log('Got message from sample plugin', receivedObject.message); 32 | //The dashboard will send us an object like { message: 'hello' } 33 | //Let's just return it, reversed 34 | var data = { 35 | message: receivedObject.message.split("").reverse().join("") 36 | }; 37 | 38 | this.sendToDashboard(data); 39 | } 40 | } 41 | 42 | //Register the plugin with vorlon core 43 | Core.RegisterClientPlugin(new SampleClient()); 44 | } 45 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/sample/vorlon.sample.dashboard.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export class SampleDashboard extends DashboardPlugin { 3 | 4 | //Do any setup you need, call super to configure 5 | //the plugin with html and css for the dashboard 6 | constructor() { 7 | // name , html for dash css for dash 8 | super("sample", "control.html", "control.css"); 9 | this._ready = true; 10 | console.log('Started'); 11 | } 12 | 13 | //Return unique id for your plugin 14 | public getID(): string { 15 | return "SAMPLE"; 16 | } 17 | 18 | // This code will run on the dashboard ////////////////////// 19 | 20 | // Start dashboard code 21 | // uses _insertHtmlContentAsync to insert the control.html content 22 | // into the dashboard 23 | private _inputField: HTMLInputElement 24 | private _outputDiv: HTMLElement 25 | 26 | public startDashboardSide(div: HTMLDivElement = null): void { 27 | this._insertHtmlContentAsync(div, (filledDiv) => { 28 | this._inputField = filledDiv.querySelector('#echoInput'); 29 | this._outputDiv = filledDiv.querySelector('#output'); 30 | 31 | 32 | // Send message to client when user types and hits return 33 | this._inputField.addEventListener("keydown", (evt) => { 34 | if (evt.keyCode === 13) { 35 | this.sendToClient({ 36 | message: this._inputField.value 37 | }); 38 | 39 | this._inputField.value = ""; 40 | } 41 | }); 42 | }) 43 | } 44 | 45 | // When we get a message from the client, just show it 46 | public onRealtimeMessageReceivedFromClientSide(receivedObject: any): void { 47 | var message = document.createElement('p'); 48 | message.textContent = receivedObject.message; 49 | this._outputDiv.appendChild(message); 50 | } 51 | } 52 | 53 | //Register the plugin with vorlon core 54 | Core.RegisterDashboardPlugin(new SampleDashboard()); 55 | } 56 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/unitTestRunner/control.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |  Run test 10 | 11 | 12 |
13 |

Unit test

14 | 15 |
16 |
17 |

Results

18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
NameModulePassedFailedTimeTotal
n/an/an/an/an/an/a
41 |
42 | 43 | 44 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/unitTestRunner/control.less: -------------------------------------------------------------------------------- 1 | .plugin-unittest { 2 | 3 | input[type="file"] { 4 | padding: 2px; 5 | } 6 | 7 | #dropPanel { 8 | padding: 20px; 9 | 10 | .droppable { 11 | background-color: #f7f7f7; 12 | 13 | textarea { 14 | background-color: #f7f7f7; 15 | } 16 | } 17 | 18 | textarea { 19 | width: 100%; 20 | height: 120px; 21 | } 22 | } 23 | 24 | .test-results-panel { 25 | padding: 20px; 26 | 27 | .test-results-list { 28 | width: 100%; 29 | margin: 20px 0 30px; 30 | 31 | th, 32 | td { 33 | padding: 5px 10px; 34 | text-align: left; 35 | } 36 | 37 | th { 38 | background: #f7f7f7; 39 | border-bottom: 1px solid #ddd; 40 | font-weight: 400; 41 | } 42 | 43 | td { 44 | border-bottom: 1px solid #eee; 45 | } 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/unitTestRunner/vorlon.unitTestRunner.client.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | 3 | declare var QUnit; 4 | 5 | export class UnitTestRunnerClient extends ClientPlugin { 6 | //public localStorageList: KeyValue[] = []; 7 | 8 | constructor() { 9 | super("unitTestRunner"); 10 | this._ready = false; 11 | } 12 | 13 | public getID(): string { 14 | return "UNITTEST"; 15 | } 16 | 17 | public startClientSide(): void { 18 | this._loadNewScriptAsync("qunit.js",() => { 19 | var self = this; 20 | this._ready = true; 21 | QUnit.testDone((details) => { 22 | //console.log("QUnit.testDone"); 23 | //console.log(details); 24 | var message: any = {}; 25 | message.commandType = "testDone"; 26 | message.name = details.name; 27 | message.module = details.module; 28 | message.failed = details.failed; 29 | message.passed = details.passed; 30 | message.total = details.total; 31 | message.runtime = details.runtime; 32 | this.sendToDashboard(message); 33 | }); 34 | QUnit.done((details) => { 35 | //console.log("QUnit.done"); 36 | //console.log(details); 37 | var message: any = {}; 38 | message.commandType = "done"; 39 | message.failed = details.failed; 40 | message.passed = details.passed; 41 | message.total = details.total; 42 | message.runtime = details.runtime; 43 | this.sendToDashboard(message); 44 | }); 45 | }); 46 | } 47 | 48 | public refresh(): void { 49 | 50 | } 51 | 52 | public runTest(testContent: any): void { 53 | eval(testContent); 54 | } 55 | 56 | public onRealtimeMessageReceivedFromDashboardSide(receivedObject: any): void { 57 | 58 | } 59 | } 60 | 61 | UnitTestRunnerClient.prototype.ClientCommands = { 62 | runTest: function (data) { 63 | var plugin = this; 64 | plugin.runTest(data); 65 | } 66 | } 67 | 68 | //Register the plugin with vorlon core 69 | Core.RegisterClientPlugin(new UnitTestRunnerClient()); 70 | } -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/uwp/control.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 |
23 | This plugin is intended to be used for Universal Windows Platform applications (or UWP app). The client is not an UWP application or doesn't have access to WinRT API. 24 |
25 |
26 |
27 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/uwp/control.less: -------------------------------------------------------------------------------- 1 | @import "../vorlontheme.less"; 2 | 3 | .plugin-uwp { 4 | .uwppanel{ 5 | position: relative; 6 | width: 100%; 7 | height: 100%; 8 | 9 | .toolbar{ 10 | position: absolute; 11 | left: 0; 12 | top: 0; 13 | right: 0; 14 | border-bottom: 1px solid #DDD; 15 | } 16 | 17 | .uwp-status-bloc{ 18 | position: absolute; 19 | left: 0; 20 | top: 36px; 21 | right: 0; 22 | bottom: 0; 23 | overflow-x: hidden; 24 | overflow-y: auto; 25 | background-color: #EEE; 26 | display : flex; 27 | flex-flow : row wrap; 28 | padding : 5px; 29 | 30 | .contentbloc{ 31 | padding : 20px; 32 | margin : 5px; 33 | background-color: white; 34 | border: 1px solid #DDD; 35 | width : 400px; 36 | height : 300px; 37 | 38 | h1 { 39 | margin-bottom: 6px; 40 | font-size: 16px; 41 | } 42 | 43 | .labelval{ 44 | display: flex; 45 | flex-flow: row nowrap; 46 | 47 | 48 | .label{ 49 | width : 140px; 50 | color : #777; 51 | } 52 | .val { 53 | flex : 1; 54 | font-weight: 500; 55 | } 56 | } 57 | 58 | canvas{ 59 | margin-top: 4px; 60 | } 61 | } 62 | } 63 | 64 | #metadata { 65 | 66 | } 67 | 68 | #nowinrt{ 69 | position: absolute; 70 | left: 0; 71 | top: 0; 72 | right: 0; 73 | bottom : 0; 74 | display: flex; 75 | align-items : center; 76 | justify-content: center; 77 | background-color: #EEE; 78 | 79 | .message{ 80 | width : 70%; 81 | max-width: 500px; 82 | } 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/uwp/vorlon.uwp.interfaces.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export interface IUWPMonitorOptions { 3 | interval: number 4 | } 5 | 6 | export interface IUWPMetadata { 7 | isRunning : boolean, 8 | metadataDate: Date, 9 | winRTAvailable: boolean, 10 | name: string; 11 | language: string; 12 | region: string; 13 | deviceType: string; 14 | appversion: { 15 | major: number, 16 | minor: number, 17 | build: number, 18 | revision: number, 19 | }; 20 | systemManufacturer: string; 21 | systemProductName: string; 22 | } 23 | 24 | export interface IUWPMemoryStatus { 25 | nonPagedPool: number, 26 | pagedPool: number, 27 | pageFaultCount: number, 28 | pageFile: number, 29 | peakNonPagedPool: number 30 | peakPagedPool: number, 31 | peakPageFile: number 32 | peakVirtualMemory: number, 33 | peakWorkingSet: number, 34 | privatePageCount: number, 35 | virtualMemory: number, 36 | workingSet: number, 37 | } 38 | 39 | export interface IUWPPhoneMemoryStatus { 40 | commitedBytes: number, 41 | commitedLimit: number, 42 | } 43 | 44 | export interface IUWPCpuStatus { 45 | user: number, 46 | kernel: number 47 | } 48 | 49 | export interface IUWPDiskStatus { 50 | bytesRead: number, 51 | bytesWritten: number, 52 | otherBytes: number, 53 | otherCount: number, 54 | readCount: number, 55 | writeCount: number, 56 | } 57 | 58 | export interface IUWPPowerStatus { 59 | batteryStatus: number, 60 | energySaverStatus: number, 61 | powerSupplyStatus: number, 62 | remainingChargePercent: number, 63 | remainingDischargeTime: number 64 | } 65 | 66 | export interface IUWPNetworkStatus { 67 | ianaInterfaceType: number, 68 | signal: number, 69 | } 70 | 71 | export interface IUWPEnergyStatus { 72 | foregroundEnergy?: { 73 | excessiveUsageLevel: number, 74 | lowUsageLevel: number, 75 | maxAcceptableUsageLevel: number, 76 | nearMaxAcceptableUsageLevel: number, 77 | recentEnergyUsage: number, 78 | recentEnergyUsageLevel: number 79 | }, 80 | backgroundEnergy?: { 81 | excessiveUsageLevel: number, 82 | lowUsageLevel: number, 83 | maxAcceptableUsageLevel: number, 84 | nearMaxAcceptableUsageLevel: number, 85 | nearTerminationUsageLevel: number, 86 | recentEnergyUsage: number, 87 | recentEnergyUsageLevel: number, 88 | terminationUsageLevel: number 89 | } 90 | } 91 | 92 | export interface IUWPStatus { 93 | isRunning : boolean, 94 | winRTAvailable: boolean; 95 | statusDate: Date, 96 | memory?: IUWPMemoryStatus, 97 | cpu?: IUWPCpuStatus, 98 | disk?: IUWPDiskStatus, 99 | power?: IUWPPowerStatus, 100 | energy?: IUWPEnergyStatus, 101 | phone?: { 102 | memory?: IUWPPhoneMemoryStatus 103 | }, 104 | network?: IUWPNetworkStatus 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/vorlontheme.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Plugins/Vorlon/plugins/vorlontheme.css -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/vorlontheme.less: -------------------------------------------------------------------------------- 1 | @lightblue: #00a5b3; 2 | @lightpurple : #6b2d81; 3 | @darkpurple : #1d0c3d; -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/webstandards/control.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 6 | 9 |
10 | 11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | Analyze your page by clicking on the play button above, and select rules to display details. 19 |
20 |
21 |
22 |
23 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/webstandards/rules/accessibility.aXe.ts: -------------------------------------------------------------------------------- 1 | declare var axe: any; 2 | 3 | module VORLON.WebStandards.Rules.Accessibility { 4 | 5 | export var aXeCheck = { 6 | id: "accessibility.aXeCheck", 7 | title: "aXe accessibility check", 8 | description: "We are using aXe helps you catch accessibility issues early.", 9 | 10 | prepare: function(rulecheck : IRuleCheck, analyzeSummary: any) { 11 | analyzeSummary.pendingLoad++; 12 | // Using aXe 13 | axe.a11yCheck(document, (results) => { 14 | rulecheck.items = []; 15 | 16 | rulecheck.failed = (results.violations.length > 0); 17 | rulecheck.skipRootLevel = rulecheck.failed ; 18 | 19 | for (var index = 0; index < results.violations.length; index++) { 20 | var check = results.violations[index]; 21 | 22 | var item = { 23 | description: check.description, 24 | failed: true, 25 | id: check.id, 26 | title: check.help, 27 | type: "blockitems", 28 | items: [] 29 | }; 30 | 31 | rulecheck.items.push(item); 32 | 33 | for (var nodeIndex = 0; nodeIndex < check.nodes.length; nodeIndex++) { 34 | var node = check.nodes[nodeIndex]; 35 | var nodeEntry = { 36 | title: node.html, 37 | items: [] 38 | }; 39 | 40 | item.items.push(nodeEntry); 41 | 42 | for (var anyIndex = 0; anyIndex < node.any.length; anyIndex++) { 43 | nodeEntry.items.push({ title: node.any[anyIndex].message}); 44 | } 45 | } 46 | } 47 | 48 | analyzeSummary.pendingLoad--; 49 | }); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/webstandards/rules/mobileweb.deviceicons.ts: -------------------------------------------------------------------------------- 1 | module VORLON.WebStandards.Rules.DOM { 2 | 3 | export var deviceIcons = { 4 | id: "mobileweb.deviceIcons", 5 | title: "define platform icons", 6 | description: "Platform icons helps user pinning your website with an icon that fits well on mobile device home.", 7 | nodeTypes: ["meta", "link"], 8 | 9 | prepare: function(rulecheck: IRuleCheck, analyzeSummary) { 10 | rulecheck.items = rulecheck.items || []; 11 | rulecheck.type = "blockitems"; 12 | rulecheck.data = { 13 | hasWindowsIcons : false, 14 | hasWindowsNotification : false, 15 | hasIOSIcons : false 16 | } 17 | }, 18 | 19 | check: function(node: HTMLElement, rulecheck: IRuleCheck, analyzeSummary: any, htmlString: string) { 20 | if (node.nodeName == "LINK") { 21 | var rel = node.getAttribute("rel"); 22 | if (rel && rel == "apple-touch-icon-precomposed") { 23 | rulecheck.data.hasIOSIcons = true; 24 | } 25 | } else if (node.nodeName == "META") { 26 | var name = node.getAttribute("name"); 27 | if (name) { 28 | if (name.toLowerCase() == "msapplication-notification") { 29 | rulecheck.data.hasWindowsNotification = true; 30 | } else if (name.toLowerCase().indexOf("msapplication-") == 0) { 31 | rulecheck.data.hasWindowsIcons = true; 32 | } 33 | } 34 | } 35 | }, 36 | 37 | endcheck: function(rulecheck: IRuleCheck, analyzeSummary) { 38 | if (!rulecheck.data.hasIOSIcons) { 39 | rulecheck.failed = true; 40 | rulecheck.items.push({ 41 | title: 'add Apple - iOS icons by adding link tags like ' 42 | }); 43 | } 44 | 45 | if (!rulecheck.data.hasWindowsIcons) { 46 | rulecheck.failed = true; 47 | //https://msdn.microsoft.com/en-us/library/dn255024(v=vs.85).aspx 48 | rulecheck.items.push({ 49 | title: 'add Microsoft - Windows tiles by adding meta tags like ' 50 | }); 51 | } 52 | 53 | } 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/webstandards/rules/mobileweb.viewport.ts: -------------------------------------------------------------------------------- 1 | module VORLON.WebStandards.Rules.DOM { 2 | 3 | export var useViewport = { 4 | id: "mobileweb.use-viewport", 5 | title: "use meta viewport", 6 | description: "Use meta viewport tag to choose how your website will get scaled on smaller devices like phones. Define at least ", 7 | nodeTypes: ["meta"], 8 | 9 | prepare: function(rulecheck : IRuleCheck, analyzeSummary) { 10 | rulecheck.failed = true; 11 | }, 12 | 13 | check: function(node: HTMLElement, rulecheck : IRuleCheck, analyzeSummary: any, htmlString: string) { 14 | var viewportattr = node.getAttribute("name"); 15 | if (viewportattr && viewportattr.toLowerCase() == "viewport") { 16 | rulecheck.failed = false; 17 | } 18 | 19 | } 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/webstandards/rules/performances.bundle.ts: -------------------------------------------------------------------------------- 1 | module VORLON.WebStandards.Rules.Files { 2 | var cssFilesLimit = 5; 3 | var scriptsFilesLimit = 5; 4 | 5 | export var filesBundle = { 6 | id: "performances.bundles", 7 | title: "try bundling your files", 8 | description: "Multiple http requests makes your site slower, especially on mobile devices", 9 | 10 | check: function(rulecheck: any, analyzeSummary: any) { 11 | rulecheck.items = rulecheck.items || []; 12 | rulecheck.type = "blockitems"; 13 | var countStylesheets = 0; 14 | for (var n in analyzeSummary.files.stylesheets){ 15 | var isVorlonInjection = n.toLowerCase().indexOf("vorlon/plugins") >= 0; 16 | if (!isVorlonInjection) 17 | countStylesheets++; 18 | } 19 | 20 | if (countStylesheets > cssFilesLimit){ 21 | rulecheck.failed = true; 22 | rulecheck.items.push({ 23 | title : "You have more than " + cssFilesLimit + " stylesheets in your page, consider bundling your stylesheets." 24 | }); 25 | } 26 | 27 | var countScripts = 0; 28 | for (var n in analyzeSummary.files.scripts){ 29 | var isVorlonInjection = n.toLowerCase().indexOf("vorlon/plugins") >= 0; 30 | if (!isVorlonInjection) 31 | countScripts++; 32 | } 33 | 34 | if (countScripts > scriptsFilesLimit){ 35 | rulecheck.failed = true; 36 | rulecheck.items.push({ 37 | title : "You have more than " + scriptsFilesLimit + " scripts files in your page, consider bundling your scripts." 38 | }); 39 | } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/webstandards/rules/performances.contentencoding.ts: -------------------------------------------------------------------------------- 1 | module VORLON.WebStandards.Rules.Files { 2 | export var contentEncoding = { 3 | id: "performances.contentencoding", 4 | title: "encode static content", 5 | description: "content encoding like gzip or deflate helps reducing the network bandwith required to display your website, it is especially important for mobile devices. Use content encoding for static files like CSS and JavaScript files.", 6 | 7 | check: function(rulecheck: any, analyzeSummary: any) { 8 | rulecheck.items = rulecheck.items || []; 9 | rulecheck.type = "blockitems"; 10 | for (var n in analyzeSummary.files.stylesheets){ 11 | var isVorlonInjection = n.toLowerCase().indexOf("vorlon/plugins") >= 0; 12 | if (!isVorlonInjection && analyzeSummary.files.stylesheets[n].encoding && analyzeSummary.files.stylesheets[n].encoding == "none"){ 13 | rulecheck.failed = true; 14 | rulecheck.items.push({ 15 | title : "use content encoding for " + n 16 | }); 17 | } 18 | } 19 | 20 | for (var n in analyzeSummary.files.scripts){ 21 | var isVorlonInjection = n.toLowerCase().indexOf("vorlon/plugins") >= 0; 22 | if (!isVorlonInjection && analyzeSummary.files.scripts[n].encoding && analyzeSummary.files.scripts[n].encoding == "none"){ 23 | rulecheck.failed = true; 24 | rulecheck.items.push({ 25 | title : "use content encoding for " + n 26 | }); 27 | } 28 | } 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/webstandards/rules/performances.minification.ts: -------------------------------------------------------------------------------- 1 | module VORLON.WebStandards.Rules.Files { 2 | export var filesMinification = { 3 | id: "performances.minification", 4 | title: "minify static files", 5 | description: "minification helps reducing the network bandwith required to display your website, it is especially important for mobile devices. Minify static files like CSS and JavaScript files.", 6 | 7 | check: function(rulecheck: any, analyzeSummary: any) { 8 | rulecheck.items = rulecheck.items || []; 9 | rulecheck.type = "blockitems"; 10 | for (var n in analyzeSummary.files.stylesheets){ 11 | var isVorlonInjection = n.toLowerCase().indexOf("vorlon/plugins") >= 0; 12 | if (!isVorlonInjection){ 13 | var charPerLines = this.getAverageCharacterPerLine(analyzeSummary.files.stylesheets[n].content); 14 | if (charPerLines < 50){ 15 | rulecheck.failed = true; 16 | rulecheck.items.push({ 17 | title : "minify " + n 18 | }); 19 | } 20 | } 21 | } 22 | 23 | for (var n in analyzeSummary.files.scripts){ 24 | var isVorlonInjection = n.toLowerCase().indexOf("vorlon/plugins") >= 0; 25 | if (!isVorlonInjection){ 26 | var charPerLines = this.getAverageCharacterPerLine(analyzeSummary.files.scripts[n].content); 27 | if (charPerLines < 50){ 28 | rulecheck.failed = true; 29 | rulecheck.items.push({ 30 | title : "minify " + n 31 | }); 32 | } 33 | } 34 | } 35 | }, 36 | 37 | getAverageCharacterPerLine : function(content : string){ 38 | if (!content) 39 | return 1000; 40 | 41 | var lines = content.split('\n'); 42 | if (lines.length == 0) 43 | return 1000; 44 | 45 | var total = 0; 46 | lines.forEach(function(l){ 47 | total+= l.length; 48 | }); 49 | return total / lines.length 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/webstandards/rules/webstandards.activex.ts: -------------------------------------------------------------------------------- 1 | module VORLON.WebStandards.Rules.DOM { 2 | export var dontUsePlugins = { 3 | id: "webstandards.dont-use-plugins", 4 | title: "object and embed", 5 | description : "With HTML5 embed or object tags can often be replaced with HTML5 features.", 6 | nodeTypes: ["EMBED", "OBJECT"], 7 | 8 | prepare: function(rulecheck, analyzeSummary) { 9 | rulecheck.items = rulecheck.items || []; 10 | rulecheck.type = "blockitems"; 11 | }, 12 | 13 | check: function(node: HTMLElement, rulecheck: any, analyzeSummary: any, htmlString: string) { 14 | //console.log("check for plugins"); 15 | 16 | var source :string = null, data:string = null, type:string = null; 17 | 18 | var source = node.getAttribute("src"); 19 | if (source) source = source.toLowerCase(); else source = ""; 20 | 21 | var data = node.getAttribute("data"); 22 | if (data) data = data.toLowerCase(); else data = ""; 23 | 24 | var type = node.getAttribute("type"); 25 | if (type) type = type.toLowerCase(); else type = ""; 26 | 27 | if (source.indexOf(".swf") > 0 || data.indexOf("swf") > 0){ 28 | rulecheck.failed = true; 29 | rulecheck.items.push({ message: "consider using HTML5 instead of Flash", content : VORLON.Tools.htmlToString((node).outerHTML) }) 30 | } 31 | else if (type.indexOf("silverlight") > 0){ 32 | rulecheck.failed = true; 33 | rulecheck.items.push({ message: "consider using HTML5 instead of Silverlight", content : VORLON.Tools.htmlToString((node).outerHTML) }) 34 | } else if (source.indexOf(".svg") > 0 || data.indexOf("svg") > 0) { 35 | rulecheck.failed = true; 36 | rulecheck.items.push({ message: "dont't use SVG with " + node.nodeType, content : VORLON.Tools.htmlToString((node).outerHTML) }) 37 | } else { 38 | rulecheck.failed = true; 39 | rulecheck.items.push({ message: "use HTML5 instead of embed or object elements", content : VORLON.Tools.htmlToString((node).outerHTML) }) 40 | } 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/webstandards/rules/webstandards.browserdetection.ts: -------------------------------------------------------------------------------- 1 | module VORLON.WebStandards.Rules.DOM { 2 | export var browserdetection = { 3 | id: "webstandards.avoid-browser-detection", 4 | exceptions : [ 5 | "ajax.googleapis.com", 6 | "ajax.aspnetcdn.com", 7 | "ajax.microsoft.com", 8 | "jquery", 9 | "mootools", 10 | "prototype", 11 | "protoaculous", 12 | "google-analytics.com", 13 | "partner.googleadservices.com", 14 | "vorlon" 15 | ], 16 | title: "avoid browser detection", 17 | description: "Nowadays, browser have very similar user agent, and browser feature moves very fast. Browser detection leads to britle code. Consider using feature detection instead.", 18 | nodeTypes: ["#comment"], 19 | violations: [], 20 | 21 | prepare: function(rulecheck: IRuleCheck, analyzeSummary) { 22 | rulecheck.items = rulecheck.items || []; 23 | rulecheck.type = "blockitems"; 24 | }, 25 | 26 | init: function() { 27 | var pageWindow = document.parentNode 28 | try{ 29 | this.hook("navigator", "userAgent"); 30 | this.hook("navigator", "appVersion"); 31 | this.hook("navigator", "appName"); 32 | this.hook("navigator", "product"); 33 | this.hook("navigator", "vendor"); 34 | } 35 | catch(e){ 36 | console.warn("Vorlon.js Web Standards Plugin : Browser detection rule not available due to browser limitations"); 37 | var check = { 38 | title: "Vorlon.js Web Standards Plugin no available.", 39 | content: "Browser detection rule not available due to browser limitations" 40 | }; 41 | 42 | this.violations.push(check); 43 | } 44 | }, 45 | 46 | hook: function(root, prop) { 47 | VORLON.Tools.HookProperty(root, prop, (stack) => { 48 | //this.trace("browser detection " + stack.file); 49 | //this.trace(stack.stack); 50 | if (stack.file) { 51 | if (this.isException(stack.file)) { 52 | //this.trace("skip browser detection access " + stack.file) 53 | 54 | return; 55 | } 56 | } 57 | var check = { 58 | title : "Access to window.navigator." + stack.property, 59 | content : "From " + stack.file + " at " + stack.line 60 | }; 61 | 62 | this.violations.push(check); 63 | }); 64 | }, 65 | 66 | check: function(node: Node, rulecheck: IRuleCheck, analyzeSummary: any, htmlString: string) { 67 | 68 | }, 69 | 70 | isException : function(file){ 71 | if (!file) 72 | return false; 73 | 74 | return this.exceptions.some((e) =>{ 75 | return file.indexOf(e) >= 0; 76 | }) 77 | }, 78 | 79 | endcheck: function(rulecheck: IRuleCheck, analyzeSummary: any) { 80 | if (this.violations.length > 0) { 81 | rulecheck.failed = true; 82 | for (var index = 0; index < this.violations.length; index++) { 83 | rulecheck.items.push(this.violations[index]); 84 | } 85 | } 86 | }, 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/webstandards/rules/webstandards.conditionalcomments.ts: -------------------------------------------------------------------------------- 1 | module VORLON.WebStandards.Rules.DOM { 2 | export var dontUseBrowserConditionalComment = { 3 | id: "webstandards.avoid-browser-specific-css", 4 | title: "avoid conditional comments", 5 | description: "Conditional comments are not the best way to adapt your website to target browser, and support is dropped for IE > 9.", 6 | nodeTypes: ["#comment"], 7 | 8 | prepare: function(rulecheck, analyzeSummary) { 9 | rulecheck.items = rulecheck.items || []; 10 | rulecheck.type = "blockitems"; 11 | }, 12 | 13 | check: function(node: Node, rulecheck: any, analyzeSummary: any, htmlString: string) { 14 | //console.log("checking comment " + node.nodeValue); 15 | var commentContent = node.nodeValue.toLowerCase(); 16 | 17 | var hasConditionalComment = 18 | commentContent.indexOf("[if ie ") >= 0 || 19 | commentContent.indexOf("[if !ie]") >= 0 || 20 | commentContent.indexOf("[if gt ie ") >= 0 || 21 | commentContent.indexOf("[if gte ie ") >= 0 || 22 | commentContent.indexOf("[if lt ie ") >= 0 || 23 | commentContent.indexOf("[if lte ie ") >= 0; 24 | 25 | if (hasConditionalComment) { 26 | rulecheck.failed = true; 27 | rulecheck.items.push({ 28 | title: VORLON.Tools.htmlToString(node.nodeValue) 29 | }); 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/webstandards/rules/webstandards.documentmode.ts: -------------------------------------------------------------------------------- 1 | module VORLON.WebStandards.Rules.DOM { 2 | export var modernDocType = { 3 | id: "webstandards.documentmode", 4 | title: "use modern doctype", 5 | description: "Modern doctype like are better for browser compatibility and enable using HTML5 features.", 6 | nodeTypes: ["META"], 7 | 8 | prepare: function(rulecheck: IRuleCheck, analyzeSummary) { 9 | rulecheck.items = rulecheck.items || []; 10 | rulecheck.type = "blockitems"; 11 | }, 12 | 13 | check: function(node: HTMLElement, rulecheck: IRuleCheck, analyzeSummary: any, htmlString: string) { 14 | var httpequiv = node.getAttribute("http-equiv"); 15 | 16 | if (httpequiv && httpequiv.toLowerCase() == "x-ua-compatible"){ 17 | var content = node.getAttribute("content"); 18 | if (!(content.toLowerCase().indexOf("edge") >= 0)){ 19 | rulecheck.failed = true; 20 | //current.content = doctype.html; 21 | rulecheck.items.push({ 22 | title : "your website use IE's document mode compatibility for an older version of IE ", 23 | content : node.outerHTML 24 | }); 25 | } 26 | } 27 | }, 28 | 29 | endcheck: function(rulecheck: IRuleCheck, analyzeSummary: any) { 30 | //console.log("checking comment " + node.nodeValue); 31 | var doctype = analyzeSummary.doctype || {}; 32 | var current = { 33 | title : "used doctype is " + doctype.html 34 | } 35 | 36 | if (doctype.publicId || doctype.systemId){ 37 | rulecheck.failed = true; 38 | //current.content = doctype.html; 39 | rulecheck.items.push(current); 40 | } 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/webstandards/vorlon.webstandards.interfaces.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export interface IRuleCheck { 3 | items? : IRuleCheck[]; 4 | title?: string; 5 | description?: string; 6 | alert?: string; 7 | message?: string; 8 | content?: string; 9 | type?: string; 10 | failed?:boolean; 11 | data?:any; 12 | skipRootLevel?: boolean; 13 | } 14 | 15 | export interface IRule{ 16 | id: string; 17 | title: string; 18 | disabled?:boolean; 19 | description?: string; 20 | 21 | prepare?: (rulecheck : IRuleCheck, analyzeSummary) => void; 22 | endcheck?: (rulecheck : IRuleCheck, analyzeSummary) => void; 23 | } 24 | 25 | export interface IDOMRule extends IRule { 26 | nodeTypes: string[]; 27 | check: (node, rulecheck: IRuleCheck, analyze, htmlcontent) => void; 28 | generalRule?: boolean; 29 | } 30 | 31 | export interface ICSSRule extends IRule { 32 | check: (url: string, ast, rulecheck, analyzeSummary) => void; 33 | } 34 | 35 | export interface IFileRule extends IRule { 36 | check: (rulecheck: any, analyzeSummary: any) => void; 37 | } 38 | 39 | export interface IScriptRule extends IRule { 40 | check: (url: string, javascriptContent: string, rulecheck: any, analyzeSummary: any) => void; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/xhrPanel/.gitignore: -------------------------------------------------------------------------------- 1 | *.css 2 | *.js -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/xhrPanel/control.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 |
11 |
12 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/xhrPanel/control.less: -------------------------------------------------------------------------------- 1 | .networkpanel { 2 | position: relative; 3 | width: 100%; 4 | height: 100%; 5 | 6 | .toolbar{ 7 | position: absolute; 8 | left: 0; 9 | top: 0; 10 | right: 0; 11 | border-bottom: 1px solid #DDD; 12 | } 13 | 14 | .network-items{ 15 | position: absolute; 16 | left: 0; 17 | top: 36px; 18 | right: 0; 19 | bottom: 0; 20 | overflow-x: hidden; 21 | overflow-y: auto; 22 | } 23 | 24 | .network-item{ 25 | border-bottom: 1px solid #DDD; 26 | padding: 10px; 27 | line-height: 1.1em; 28 | 29 | .description{ 30 | .item{ 31 | display: inline-block; 32 | } 33 | 34 | .smallitem{ 35 | min-width: 60px; 36 | 37 | } 38 | } 39 | 40 | .details{ 41 | font-size: 0.8rem; 42 | color: #2B2B2B; 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Plugins/Vorlon/plugins/xhrPanel/vorlon.xhrPanel.interfaces.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export interface NetworkEntry{ 3 | id: string; 4 | url: string; 5 | status : number; 6 | statusText : string; 7 | method: string; 8 | responseType: string; 9 | responseHeaders : any; 10 | requestHeaders: any[]; 11 | readyState: number; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Plugins/Vorlon/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES5", 4 | "skipLibCheck": true, 5 | "types": ["node"], 6 | "typeRoots": [ 7 | "../../node_modules/@types" 8 | ] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Plugins/Vorlon/vorlon.basePlugin.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export class BasePlugin { 3 | public _ready = true; 4 | protected _id = ""; 5 | protected _debug: boolean; 6 | public _type = PluginType.OneOne; 7 | public trace : (msg) => void; 8 | protected traceLog = (msg) => { console.log(msg); }; 9 | protected traceNoop = (msg) => { }; 10 | public loadingDirectory = "vorlon/plugins"; 11 | 12 | constructor(public name: string) { 13 | this.debug = Core.debug; 14 | } 15 | 16 | public get Type(): PluginType { 17 | return this._type; 18 | } 19 | 20 | public get debug(): boolean { 21 | return this._debug; 22 | } 23 | 24 | public set debug(val: boolean) { 25 | this._debug = val; 26 | if (val){ 27 | this.trace = this.traceLog; 28 | }else{ 29 | this.trace = this.traceNoop; 30 | } 31 | } 32 | 33 | public getID(): string { 34 | return this._id; 35 | } 36 | 37 | public isReady() { 38 | return this._ready; 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Plugins/Vorlon/vorlon.clientPlugin.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | declare var vorlonBaseURL: string; 3 | 4 | export class ClientPlugin extends BasePlugin { 5 | public ClientCommands: any; 6 | 7 | constructor(name: string) { 8 | super(name); 9 | 10 | } 11 | 12 | public startClientSide(): void { } 13 | public onRealtimeMessageReceivedFromDashboardSide(receivedObject: any): void { } 14 | 15 | 16 | public sendToDashboard(data: any){ 17 | if (Core.Messenger) 18 | Core.Messenger.sendRealtimeMessage(this.getID(), data, RuntimeSide.Client, "message"); 19 | } 20 | 21 | public sendCommandToDashboard(command: string, data: any = null) { 22 | if (Core.Messenger) { 23 | this.trace(this.getID() + ' send command to dashboard ' + command); 24 | Core.Messenger.sendRealtimeMessage(this.getID(), data, RuntimeSide.Client, "message", command); 25 | } 26 | } 27 | 28 | public refresh(): void { 29 | console.error("Please override plugin.refresh()"); 30 | } 31 | 32 | public _loadNewScriptAsync(scriptName: string, callback: () => void, waitForDOMContentLoaded?: boolean) { 33 | var basedUrl = ""; 34 | if(this.loadingDirectory.indexOf('http') === 0){ 35 | if (scriptName[0] == "/"){ 36 | basedUrl = ""; 37 | } else { 38 | basedUrl = this.loadingDirectory + "/" + this.name + "/"; 39 | } 40 | } 41 | else{ 42 | if (scriptName[0] == "/"){ 43 | basedUrl = vorlonBaseURL; 44 | } else { 45 | basedUrl = vorlonBaseURL + "/" + this.loadingDirectory + "/" + this.name + "/"; 46 | } 47 | } 48 | 49 | if(Core.IsHttpsEnabled && basedUrl.indexOf('https://') === -1){ 50 | basedUrl = basedUrl.replace(/^http/, "https"); 51 | } 52 | 53 | function loadScript() { 54 | var scriptToLoad = document.createElement("script"); 55 | scriptToLoad.setAttribute("src", basedUrl + scriptName); 56 | scriptToLoad.onload = callback; 57 | var first = document.getElementsByTagName('script')[0]; 58 | first.parentNode.insertBefore(scriptToLoad, first); 59 | } 60 | if (!waitForDOMContentLoaded || document.body) { 61 | loadScript(); 62 | } 63 | else { 64 | document.addEventListener("DOMContentLoaded", () => { 65 | this._loadNewScriptAsync(scriptName, callback, waitForDOMContentLoaded); 66 | }); 67 | } 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /Plugins/Vorlon/vorlon.enums.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export enum RuntimeSide { 3 | Client, 4 | Dashboard, 5 | Both 6 | } 7 | 8 | export enum PluginType { 9 | OneOne, 10 | MulticastReceiveOnly, 11 | Multicast 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Plugins/Web.config: -------------------------------------------------------------------------------- 1 |  2 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Server/.gitignore: -------------------------------------------------------------------------------- 1 | .log 2 | .vscode/ 3 | Scripts/**/*.js 4 | Scripts/**/*.js.map 5 | config/**/*.js 6 | config/**/*.js.map 7 | server.js 8 | public/vorlon.dashboardManager.js 9 | public/vorlon.dashboardManager.js.map 10 | public/vorlon.production.js 11 | public/vorlon.production.js.map 12 | public/vorlon/**/* 13 | public/stylesheets/**/*.css 14 | Scripts/typings/vorlon/**/*.d.ts 15 | public/stylesheets/style.css 16 | Scripts/typings/Vorlon/**/*.* -------------------------------------------------------------------------------- /Server/.npmignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/.npmignore -------------------------------------------------------------------------------- /Server/README.md: -------------------------------------------------------------------------------- 1 | # VorlonJS.API 2 | 3 | 4 | -------------------------------------------------------------------------------- /Server/Scripts/vorlon.IWebServerComponent.ts: -------------------------------------------------------------------------------- 1 | import express = require("express"); 2 | import http = require("http"); 3 | 4 | export module VORLON { 5 | export interface IWebServerComponent { 6 | addRoutes: (app: express.Express, passport: any) => void; 7 | start: (httpServer: http.Server) => void; 8 | } 9 | } -------------------------------------------------------------------------------- /Server/Scripts/vorlon.authentication.ts: -------------------------------------------------------------------------------- 1 | import fs = require("fs"); 2 | import path = require("path"); 3 | import config = require("../config/vorlon.configprovider"); 4 | 5 | export module VORLON { 6 | export class Authentication { 7 | public static ActivateAuth: boolean = false; 8 | public static UserName: string; 9 | public static Password: string; 10 | public static BaseURL: string; 11 | 12 | public static ensureAuthenticated(req, res, next) { 13 | if (!Authentication.ActivateAuth || req.isAuthenticated()) { return next(); } 14 | res.redirect(Authentication.BaseURL + '/login'); 15 | } 16 | 17 | public static loadAuthConfig(baseURL : string): void { 18 | fs.readFile(config.VORLON.ConfigProvider.getConfigPath(), "utf8",(err, catalogdata) => { 19 | if (err) { 20 | return; 21 | } 22 | var catalog = JSON.parse(catalogdata.replace(/^\uFEFF/, '')); 23 | 24 | if(catalog.activateAuth){ 25 | Authentication.ActivateAuth = catalog.activateAuth; 26 | } 27 | if(catalog.username){ 28 | Authentication.UserName = catalog.username; 29 | } 30 | if(catalog.password){ 31 | Authentication.Password = catalog.password; 32 | } 33 | Authentication.BaseURL = baseURL; 34 | }); 35 | } 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /Server/Scripts/vorlon.tools.ts: -------------------------------------------------------------------------------- 1 | export module VORLON { 2 | export class Tools { 3 | 4 | public static GetIconSystem(name: string) { 5 | 6 | var os = [ 7 | {name: ['Windows'], icon: 'windows.png'}, 8 | {name: ['iOS', 'Macintosh'], icon: 'apple.png'}, 9 | {name: ['Windows Phone'], icon: 'windows_phone.png'}, 10 | {name: ['Firefox OS'], icon: 'firefox.png'}, 11 | {name: ['Kindle'], icon: 'kindle.png'}, 12 | {name: ['Android'], icon: 'android.png'}, 13 | {name: ['BlackBerry'], icon: 'bb.png'}, 14 | {name: ['Linux'], icon: 'linux.png'}, 15 | {name: ['Linux'], icon: 'nodejs.png'}, 16 | {name: ['OpenBSD'], icon: 'openbsd.png'}, 17 | {name: ['Node.js'], icon: 'nodejs.png'}, 18 | ]; 19 | 20 | for (var i = 0, len = os.length; i < len; i++) { 21 | if(os[i].name.indexOf(name) > -1) { 22 | return os[i].icon; 23 | } 24 | } 25 | 26 | return 'unknown.png'; 27 | } 28 | 29 | public static GetOperatingSystem(ua: string) { 30 | var currentLowerUA = ua.toLowerCase(); 31 | 32 | // Windows Phone 33 | if (currentLowerUA.indexOf("windows phone") >= 0) { 34 | return "Windows Phone"; 35 | } 36 | 37 | // Windows 38 | if (currentLowerUA.indexOf("windows") >= 0) { 39 | return "Windows"; 40 | } 41 | 42 | // Android 43 | if (currentLowerUA.indexOf("android") >= 0) { 44 | return "Android"; 45 | } 46 | 47 | // iOS 48 | if (currentLowerUA.indexOf("apple-i") >= 0) { 49 | return "iOS"; 50 | } 51 | 52 | if (currentLowerUA.indexOf("iphone") >= 0) { 53 | return "iOS"; 54 | } 55 | 56 | if (currentLowerUA.indexOf("ipad") >= 0) { 57 | return "iOS"; 58 | } 59 | 60 | // BlackBerry 61 | if (currentLowerUA.indexOf("blackberry") >= 0) { 62 | return "BlackBerry"; 63 | } 64 | 65 | // BlackBerry 66 | if (currentLowerUA.indexOf("(bb") >= 0) { 67 | return "BlackBerry"; 68 | } 69 | 70 | // Kindle 71 | if (currentLowerUA.indexOf("kindle") >= 0) { 72 | return "Kindle"; 73 | } 74 | 75 | // Macintosh 76 | if (currentLowerUA.indexOf("macintosh") >= 0) { 77 | return "Macintosh"; 78 | } 79 | 80 | // Linux 81 | if (currentLowerUA.indexOf("linux") >= 0) { 82 | return "Linux"; 83 | } 84 | 85 | // OpenBSD 86 | if (currentLowerUA.indexOf("openbsd") >= 0) { 87 | return "OpenBSD"; 88 | } 89 | 90 | // Firefox OS 91 | if (currentLowerUA.indexOf("firefox") >= 0) { 92 | return "Firefox OS"; // Web is the plaform 93 | } 94 | 95 | // Node.js 96 | if (currentLowerUA.indexOf("node.js") >= 0) { 97 | return "Node.js"; 98 | } 99 | 100 | return "Unknown operating system"; 101 | } 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /Server/Scripts/vorlon.winstonlogger.ts: -------------------------------------------------------------------------------- 1 | import express = require("express"); 2 | import winston = require("winston"); 3 | import http = require("http"); 4 | 5 | //Vorlon 6 | import iwsc = require("./vorlon.IWebServerComponent"); 7 | import tools = require("./vorlon.tools"); 8 | import vorloncontext = require("../config/vorlon.servercontext"); 9 | import { format } from "path"; 10 | import { formatWithOptions } from "util"; 11 | 12 | var winstonDisplay = require("winston-logs-display"); 13 | export module VORLON { 14 | export class WinstonLogger implements iwsc.VORLON.IWebServerComponent { 15 | private logConfig: vorloncontext.VORLON.ILogConfig; 16 | private _log: winston.Logger; 17 | 18 | constructor(context : vorloncontext.VORLON.IVorlonServerContext) { 19 | this.logConfig = context.logConfig; 20 | 21 | //LOGS 22 | // winston.cli(); 23 | this._log = winston.createLogger({ 24 | levels: { 25 | info: 0, 26 | warn: 1, 27 | error: 2, 28 | verbose: 3, 29 | api: 4, 30 | dashboard: 5, 31 | plugin: 6 32 | }, 33 | transports: [ 34 | new winston.transports.File({ filename: this.logConfig.vorlonLogFile, level: this.logConfig.level}) 35 | ], 36 | exceptionHandlers: [ 37 | new winston.transports.File({ filename: this.logConfig.exceptionsLogFile, timestamp: true, maxsize: 1000000 }) 38 | ], 39 | exitOnError: false 40 | }); 41 | context.logger = this._log; 42 | 43 | if (this.logConfig.enableConsole) { 44 | this._log.add(new winston.transports.Console({ 45 | level:this.logConfig.level, 46 | handleExceptions: true, 47 | format: winston.format.combine( 48 | winston.format.colorize(), 49 | winston.format.timestamp({format:'YYYY-MMM-DD T hh:mm:ss.sss A'}) 50 | ), 51 | })); 52 | } 53 | 54 | winston.addColors({ 55 | info: 'green', 56 | warn: 'cyan', 57 | error: 'red', 58 | verbose: 'blue', 59 | api: 'gray', 60 | dashboard: 'pink', 61 | plugin: 'yellow' 62 | }); 63 | 64 | // this._log.cli(); 65 | } 66 | 67 | public addRoutes(app: express.Express, passport: any): void { 68 | //DisplayLogs 69 | winstonDisplay(app, this._log); 70 | } 71 | 72 | public start(httpServer: http.Server): void { 73 | } 74 | } 75 | } -------------------------------------------------------------------------------- /Server/Web.config: -------------------------------------------------------------------------------- 1 |  2 | 6 | 7 | 8 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 33 | 34 | 36 | 37 | 38 | 39 | 41 | 43 | 44 | 45 | 46 | 47 | 48 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 65 | -------------------------------------------------------------------------------- /Server/bin/ChangeConfig.ps1: -------------------------------------------------------------------------------- 1 | $configFile = $args[0] 2 | 3 | Write-Host "Adding iisnode section to config file '$configFile'" 4 | $config = New-Object System.Xml.XmlDocument 5 | $config.load($configFile) 6 | $xpath = $config.CreateNavigator() 7 | $parentElement = $xpath.SelectSingleNode("//configuration/configSections/sectionGroup[@name='system.webServer']") 8 | $iisnodeElement = $parentElement.SelectSingleNode("//section[@name='iisnode']") 9 | if ($iisnodeElement) { 10 | Write-Host "Removing existing iisnode section from config file '$configFile'" 11 | $iisnodeElement.DeleteSelf() 12 | } 13 | 14 | $parentElement.AppendChild("
") 15 | $config.Save($configFile) 16 | -------------------------------------------------------------------------------- /Server/bin/download.ps1: -------------------------------------------------------------------------------- 1 | $runtimeUrl = $args[0] 2 | $overrideUrl = $args[1] 3 | $current = [string] (Get-Location -PSProvider FileSystem) 4 | $client = New-Object System.Net.WebClient 5 | 6 | function downloadWithRetry { 7 | param([string]$url, [string]$dest, [int]$retry) 8 | Write-Host 9 | Write-Host "Attempt: $retry" 10 | Write-Host 11 | trap { 12 | Write-Host $_.Exception.ToString() 13 | if ($retry -lt 5) { 14 | $retry=$retry+1 15 | Write-Host 16 | Write-Host "Waiting 5 seconds and retrying" 17 | Write-Host 18 | Start-Sleep -s 5 19 | downloadWithRetry $url $dest $retry $client 20 | } 21 | else { 22 | Write-Host "Download failed" 23 | throw "Max number of retries downloading [5] exceeded" 24 | } 25 | } 26 | $client.downloadfile($url, $dest) 27 | } 28 | 29 | function download($url, $dest) { 30 | Write-Host "Downloading $url" 31 | downloadWithRetry $url $dest 1 32 | } 33 | 34 | function copyOnVerify($file, $output) { 35 | Write-Host "Verifying $file" 36 | $verify = Get-AuthenticodeSignature $file 37 | Out-Host -InputObject $verify 38 | if ($verify.Status -ne "Valid") { 39 | throw "Invalid signature for runtime package $file" 40 | } 41 | else { 42 | mv $file $output 43 | } 44 | } 45 | 46 | if ($overrideUrl) { 47 | Write-Host "Using override url: $overrideUrl" 48 | $url = $overrideUrl 49 | } 50 | else { 51 | $url = $runtimeUrl 52 | } 53 | 54 | foreach($singleUrl in $url -split ";") 55 | { 56 | $suffix = Get-Random 57 | $downloaddir = $current + "\sandbox" + $suffix 58 | mkdir $downloaddir 59 | $dest = $downloaddir + "\sandbox.exe" 60 | download $singleUrl $dest 61 | $final = $downloaddir + "\runtime.exe" 62 | copyOnVerify $dest $final 63 | if (Test-Path -LiteralPath $final) 64 | { 65 | cd $downloaddir 66 | if ($host.Version.Major -eq 3) 67 | { 68 | .\runtime.exe -y | Out-Null 69 | .\setup.cmd 70 | } 71 | else 72 | { 73 | Start-Process -FilePath $final -ArgumentList -y -Wait 74 | $cmd = $downloaddir + "\setup.cmd" 75 | Start-Process -FilePath $cmd -Wait 76 | } 77 | } 78 | else 79 | { 80 | throw "Unable to verify package" 81 | } 82 | cd $current 83 | if (Test-Path -LiteralPath $downloaddir) 84 | { 85 | Remove-Item -LiteralPath $downloaddir -Force -Recurse 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /Server/bin/node.cmd: -------------------------------------------------------------------------------- 1 | node.exe %1 %2 %3 -------------------------------------------------------------------------------- /Server/bin/setup_web.cmd: -------------------------------------------------------------------------------- 1 | @echo on 2 | 3 | cd /d "%~dp0" 4 | 5 | if "%EMULATED%"=="true" if DEFINED APPCMD goto emulator_setup 6 | if "%EMULATED%"== "true" exit /b 0 7 | 8 | echo Granting permissions for Network Service to the web root directory... 9 | icacls ..\ /grant "Network Service":(OI)(CI)W 10 | if %ERRORLEVEL% neq 0 goto error 11 | echo OK 12 | 13 | echo Configuring powershell permissions 14 | powershell -c "set-executionpolicy unrestricted" 15 | 16 | echo Downloading and installing runtime components 17 | powershell .\download.ps1 '%RUNTIMEURL%' '%RUNTIMEURLOVERRIDE%' 18 | if %ERRORLEVEL% neq 0 goto error 19 | 20 | echo SUCCESS 21 | exit /b 0 22 | 23 | :error 24 | echo FAILED 25 | exit /b -1 26 | 27 | :emulator_setup 28 | echo Running in emulator adding iisnode to application host config 29 | FOR /F "tokens=1,2 delims=/" %%a in ("%APPCMD%") DO set FN=%%a&set OPN=%%b 30 | if "%OPN%"=="%OPN:apphostconfig:=%" ( 31 | echo "Could not parse appcmd '%appcmd% for configuration file, exiting" 32 | goto error 33 | ) 34 | 35 | set IISNODE_BINARY_DIRECTORY=%programfiles(x86)%\iisnode-dev\release\x64 36 | set IISNODE_SCHEMA=%programfiles(x86)%\iisnode-dev\release\x64\iisnode_schema.xml 37 | 38 | if "%PROCESSOR_ARCHITECTURE%"=="AMD64" goto start 39 | set IISNODE_BINARY_DIRECTORY=%programfiles%\iisnode-dev\release\x86 40 | set IISNODE_SCHEMA=%programfiles%\iisnode-dev\release\x86\iisnode_schema_x86.xml 41 | 42 | 43 | :start 44 | set 45 | 46 | echo Using iisnode binaries location '%IISNODE_BINARY_DIRECTORY%' 47 | echo installing iisnode module using AppCMD alias %appcmd% 48 | %appcmd% install module /name:"iisnode" /image:"%IISNODE_BINARY_DIRECTORY%\iisnode.dll" 49 | 50 | set apphostconfigfile=%OPN:apphostconfig:=% 51 | powershell -c "set-executionpolicy unrestricted" 52 | powershell .\ChangeConfig.ps1 %apphostconfigfile% 53 | if %ERRORLEVEL% neq 0 goto error 54 | 55 | copy /y "%IISNODE_SCHEMA%" "%programfiles%\IIS Express\config\schema\iisnode_schema.xml" 56 | if %ERRORLEVEL% neq 0 goto error 57 | exit /b 0 58 | -------------------------------------------------------------------------------- /Server/cert/server.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIEgzCCA2ugAwIBAgIJAJO6mjDuQlJBMA0GCSqGSIb3DQEBCwUAMIGHMQswCQYD 3 | VQQGEwJGUjEYMBYGA1UECBMPQWxwZXMgTWFyaXRpbWVzMQ0wCwYDVQQHEwROaWNl 4 | MRkwFwYDVQQKExBNaWNoZWwgRHVyYW5kIFNBMSAwHgYDVQQLExdGb3VybmkgcGFy 5 | IFRCUyBpbnRlcm5ldDESMBAGA1UEAxMJbG9jYWxob3N0MB4XDTE2MDcwNzEyNDQ0 6 | NVoXDTI2MDcwNTEyNDQ0NVowgYcxCzAJBgNVBAYTAkZSMRgwFgYDVQQIEw9BbHBl 7 | cyBNYXJpdGltZXMxDTALBgNVBAcTBE5pY2UxGTAXBgNVBAoTEE1pY2hlbCBEdXJh 8 | bmQgU0ExIDAeBgNVBAsTF0ZvdXJuaSBwYXIgVEJTIGludGVybmV0MRIwEAYDVQQD 9 | Ewlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgRS1k 10 | FxyUQiD+Ji+A7Z/S6sKExPYDSdcam1EC3do/WfGXm2adt5zO840II0YcpJ15EVh8 11 | wBugI9ao+FuCaexIeHt0sFEmfcwAi6vSttgFBubPFUwLZsD6lCoTxKW5csG53Bm/ 12 | h8XxYGKYQfPXKdLBWxnLvtX9b1348f7uXMB9GIXIVEvCEu81ZVdtnOz9bMl1RFP1 13 | rjmjoJDv5j2HlQznu5rZIT2XLn1LMqhxkWYtwZB/WOAof6YEu5pD1vzeInkFxp2t 14 | +iknbCeD/dNnsFoUJBywT/xISGlxLiz9xLHDSkBZid1WhslisciqnSjkk+BKGKL3 15 | WSOzgreK3YM3b159AgMBAAGjge8wgewwHQYDVR0OBBYEFCgVO6gV1qxF1hG/SWxU 16 | XFxyS9bbMIG8BgNVHSMEgbQwgbGAFCgVO6gV1qxF1hG/SWxUXFxyS9bboYGNpIGK 17 | MIGHMQswCQYDVQQGEwJGUjEYMBYGA1UECBMPQWxwZXMgTWFyaXRpbWVzMQ0wCwYD 18 | VQQHEwROaWNlMRkwFwYDVQQKExBNaWNoZWwgRHVyYW5kIFNBMSAwHgYDVQQLExdG 19 | b3VybmkgcGFyIFRCUyBpbnRlcm5ldDESMBAGA1UEAxMJbG9jYWxob3N0ggkAk7qa 20 | MO5CUkEwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAHLrW2vxW6w3+ 21 | NhS2vHk00pmVCAxXQorFHeu7k/gabmzjYQ/rmU6h68qtpnwgwAbXZ32rlRI0rh+p 22 | mTvrcgOZ2j00lhNr86TQ4tXBHV8BD0yRfjunCB6odndNusspRba1PQZNIv4+wwEv 23 | vvC8l4oR4N2oVDiSNs6mSNj6IGH1Hs0em7FGkbGSX3WqEpZTkGMuoqJP1Q0mYmFK 24 | 2aPiKa+TWXW3Fu+6Ew0ibcyIRjpzkTJtuzZuS9m3me4++3kg7+zJ/yhdQdyj8Nur 25 | fU8NC8VZfUDt2J5UvBlf+YKPcAK3aJh4qZiTv1B5iqIGezcPaQR8TjcX6SSlM2CX 26 | 8yd0JSXPaA== 27 | -----END CERTIFICATE----- 28 | -------------------------------------------------------------------------------- /Server/cert/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | ***REMOVED*** 3 | -----END PRIVATE KEY----- 4 | -------------------------------------------------------------------------------- /Server/config/vorlon.baseurlconfig.ts: -------------------------------------------------------------------------------- 1 | import fs = require("fs"); 2 | import path = require("path"); 3 | import config = require("./vorlon.configprovider"); 4 | 5 | export module VORLON { 6 | export class BaseURLConfig { 7 | 8 | public baseURL: string; 9 | public baseProxyURL : string; 10 | 11 | constructor() { 12 | var catalogdata: string = fs.readFileSync(config.VORLON.ConfigProvider.getConfigPath(), "utf8"); 13 | var catalogstring = catalogdata.toString().replace(/^\uFEFF/, ''); 14 | var catalog = JSON.parse(catalogstring); 15 | if (catalog.baseURL != undefined) { 16 | this.baseURL = process.env.BASE_URL || catalog.baseURL; 17 | } 18 | else { 19 | this.baseURL = ""; 20 | } 21 | 22 | if (catalog.baseProxyURL != undefined) { 23 | this.baseProxyURL = process.env.BASE_PROXY_URL || catalog.baseProxyURL; 24 | } 25 | else { 26 | this.baseProxyURL = ""; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Server/config/vorlon.configprovider.ts: -------------------------------------------------------------------------------- 1 | import fs = require("fs"); 2 | import path = require("path"); 3 | 4 | var argv = require('minimist')(process.argv.slice(2)); 5 | 6 | export module VORLON { 7 | export class ConfigProvider { 8 | public static getConfigPath(): string { 9 | return argv.config ? path.resolve(argv.config) : path.resolve(__dirname, "../config.json"); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Server/config/vorlon.httpconfig.ts: -------------------------------------------------------------------------------- 1 | import fs = require("fs"); 2 | import http = require("http"); 3 | import https = require("https"); 4 | import path = require("path"); 5 | import config = require("./vorlon.configprovider"); 6 | 7 | export module VORLON { 8 | export class HttpConfig { 9 | public useSSL: boolean; 10 | public protocol: String; 11 | public httpModule; 12 | public options; 13 | public host; 14 | public port; 15 | public socket; 16 | public proxyHost; 17 | public proxyPort; 18 | public enableWebproxy: boolean; 19 | public vorlonServerURL: string; 20 | public vorlonProxyURL: string; 21 | public proxyEnvPort: boolean; 22 | 23 | public constructor() { 24 | var catalogdata: string = fs.readFileSync(config.VORLON.ConfigProvider.getConfigPath(), "utf8"); 25 | var catalogstring = catalogdata.toString().replace(/^\uFEFF/, ''); 26 | var catalog = JSON.parse(catalogstring); 27 | 28 | if (catalog.useSSL) { 29 | this.useSSL = true; 30 | this.protocol = "https"; 31 | this.httpModule = https; 32 | this.options = { 33 | key: fs.readFileSync(path.join(__dirname, "../", catalog.SSLkey)), 34 | cert: fs.readFileSync(path.join(__dirname, "../", catalog.SSLcert)) 35 | } 36 | } 37 | else { 38 | this.useSSL = false; 39 | if (catalog.useSSLAzure) { 40 | this.protocol = "https"; 41 | this.httpModule = http; 42 | } 43 | else { 44 | this.protocol = "http"; 45 | this.httpModule = http; 46 | } 47 | } 48 | this.proxyHost = process.env.PROXY_HOST || catalog.proxyHost || 'localhost'; 49 | this.proxyEnvPort = catalog.proxyEnvPort; 50 | if (catalog.proxyEnvPort) 51 | this.proxyPort = process.env.PORT; 52 | else 53 | this.proxyPort = catalog.proxyPort || 5050; 54 | this.host = process.env.HOST || catalog.host || 'localhost'; 55 | this.port = process.env.PORT || catalog.port || 1337; 56 | this.socket = (typeof catalog.socket === 'string' && catalog.socket.length > 0) ? catalog.socket : undefined; 57 | this.proxyPort = catalog.proxyPort || 5050; 58 | this.enableWebproxy = catalog.enableWebproxy || false; 59 | this.vorlonServerURL = catalog.vorlonServerURL || ""; 60 | this.vorlonProxyURL = catalog.vorlonProxyURL || ""; 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Server/config/vorlon.logconfig.ts: -------------------------------------------------------------------------------- 1 | import fs = require("fs"); 2 | import path = require("path"); 3 | import config = require("./vorlon.configprovider"); 4 | 5 | export module VORLON { 6 | export class LogConfig { 7 | public vorlonLogFile: string; 8 | public exceptionsLogFile: string; 9 | public enableConsole: boolean; 10 | public level: string; 11 | 12 | public constructor() { 13 | var configurationFile: string = fs.readFileSync(config.VORLON.ConfigProvider.getConfigPath(), "utf8"); 14 | var configurationString = configurationFile.toString().replace(/^\uFEFF/, ''); 15 | var configuration = JSON.parse(configurationString); 16 | if (configuration.logs) { 17 | var logConfig = configuration.logs; 18 | var filePath = logConfig.filePath ? logConfig.filePath : path.join(__dirname, "../"); 19 | var vorlonjsFile = logConfig.vorlonLogFileName ? logConfig.vorlonLogFileName : "vorlonjs.log"; 20 | var exceptionFile = logConfig.exceptionsLogFileName ? logConfig.exceptionsLogFileName : "exceptions.log"; 21 | 22 | this.vorlonLogFile = path.join(filePath, vorlonjsFile); 23 | this.exceptionsLogFile = path.join(filePath, exceptionFile); 24 | this.enableConsole = logConfig.enableConsole; 25 | this.level = logConfig.level ? logConfig.level : "info"; 26 | } 27 | else { 28 | this.vorlonLogFile = path.join(__dirname, "../vorlonjs.log"); 29 | this.exceptionsLogFile = path.join(__dirname, "../exceptions.log"); 30 | this.enableConsole = true; 31 | this.level = "info"; 32 | } 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Server/config/vorlon.redisconfig.ts: -------------------------------------------------------------------------------- 1 | export module VORLON { 2 | export class RedisConfig { 3 | public fackredis: boolean = true; 4 | public _redisPort = 6379; 5 | public _redisMachine = ""; 6 | public _redisPassword = ""; 7 | } 8 | } -------------------------------------------------------------------------------- /Server/public/fonts/fontawesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/fonts/fontawesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /Server/public/fonts/fontawesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/fonts/fontawesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /Server/public/fonts/fontawesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/fonts/fontawesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /Server/public/fonts/fontawesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/fonts/fontawesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /Server/public/fonts/fontawesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/fonts/fontawesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /Server/public/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /Server/public/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /Server/public/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /Server/public/images/express.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/express.png -------------------------------------------------------------------------------- /Server/public/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/favicon.png -------------------------------------------------------------------------------- /Server/public/images/icon-resize-horiz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Server/public/images/machine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/machine.png -------------------------------------------------------------------------------- /Server/public/images/no_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/no_img.png -------------------------------------------------------------------------------- /Server/public/images/nodejs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/nodejs.png -------------------------------------------------------------------------------- /Server/public/images/systems/android.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/systems/android.png -------------------------------------------------------------------------------- /Server/public/images/systems/apple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/systems/apple.png -------------------------------------------------------------------------------- /Server/public/images/systems/bb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/systems/bb.png -------------------------------------------------------------------------------- /Server/public/images/systems/firefox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/systems/firefox.png -------------------------------------------------------------------------------- /Server/public/images/systems/kindle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/systems/kindle.png -------------------------------------------------------------------------------- /Server/public/images/systems/linux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/systems/linux.png -------------------------------------------------------------------------------- /Server/public/images/systems/nodejs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/systems/nodejs.png -------------------------------------------------------------------------------- /Server/public/images/systems/openbsd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/systems/openbsd.png -------------------------------------------------------------------------------- /Server/public/images/systems/unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/systems/unknown.png -------------------------------------------------------------------------------- /Server/public/images/systems/windows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/systems/windows.png -------------------------------------------------------------------------------- /Server/public/images/systems/windows_phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/images/systems/windows_phone.png -------------------------------------------------------------------------------- /Server/public/images/vorlon-logo-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Server/public/javascripts/_references.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/javascripts/_references.js -------------------------------------------------------------------------------- /Server/public/javascripts/dashboard.js: -------------------------------------------------------------------------------- 1 | jQuery(function ($) { 2 | //Resizable panes 3 | $('.dashboard-plugins').split({ 4 | orientation: 'horizontal', 5 | limit: 38 6 | }); 7 | 8 | // Replace default url with the current one (running vorlon) 9 | $('#scriptSrc').text(''.replace('{{location}}', location.origin).replace('{{baseURL}}', vorlonBaseURL)); 10 | 11 | //Plugin tab navigation 12 | $('#pluginsPaneTop').on('click', '[data-plugin-target]', function (e) { 13 | var $this = $(this); 14 | var target = $this.data('plugin-target'); 15 | 16 | $('#pluginsPaneTop [data-plugin-target]').removeClass('active'); 17 | $this.addClass('active'); 18 | $('#pluginsPaneTop [data-plugin]') 19 | .hide() 20 | .trigger("vorlon.plugins.inactive"); 21 | 22 | var pluginTarget = $('#pluginsPaneTop [data-plugin~=' + target + ']'); 23 | 24 | pluginTarget.show() 25 | .trigger("vorlon.plugins.active"); 26 | if (pluginTarget.find('.split').length && !pluginTarget.find('.vsplitter').length) { 27 | pluginTarget.find('.split').split({ 28 | orientation: pluginTarget.find('.split').data('orientation'), 29 | limit: pluginTarget.find('.split').data('limit'), 30 | position: pluginTarget.find('.split').data('position'), 31 | }); 32 | 33 | } 34 | }); 35 | 36 | $('#pluginsPaneBottom').on('click', '[data-plugin-target]', function (e) { 37 | var target = $(this).data('plugin-target'); 38 | 39 | $('#pluginsPaneBottom [data-plugin-target]').removeClass('active'); 40 | $(this).addClass('active'); 41 | $('#pluginsPaneBottom [data-plugin]') 42 | .hide() 43 | .trigger("vorlon.plugins.inactive"); 44 | 45 | var pluginTarget = $('#pluginsPaneBottom [data-plugin~=' + target + ']'); 46 | 47 | pluginTarget.show() 48 | .trigger("vorlon.plugins.active"); 49 | if (pluginTarget.find('.split').length && !pluginTarget.find('.vsplitter').length) { 50 | pluginTarget.find('.split').split({ 51 | orientation: pluginTarget.find('.split').data('orientation'), 52 | limit: pluginTarget.find('.split').data('limit'), 53 | position: pluginTarget.find('.split').data('position'), 54 | }); 55 | 56 | } 57 | }); 58 | 59 | $( "#pluginsListPaneBottom, #pluginsListPaneTop" ).sortable({ 60 | axis: 'x', 61 | update: function( event, ui ) { 62 | var positions = []; 63 | $('#pluginsListPaneTop div, #pluginsListPaneBottom div').each(function() { 64 | if($(this).data('plugin-target')) { 65 | positions.push($(this).data('plugin-target')); 66 | } 67 | }); 68 | 69 | $.post(VORLON.DashboardManager.vorlonBaseURL + '/setplugin/positions', {positions: JSON.stringify(positions)},function(data) { 70 | $('.plugins-list li').find('.calque').fadeOut(); 71 | }); 72 | }, 73 | start: function() { 74 | $('#pluginsListPaneTop').css('width', '1000%'); 75 | }, 76 | stop: function() { 77 | $('#pluginsListPaneTop').css('width', '100%'); 78 | } 79 | }); 80 | }); 81 | -------------------------------------------------------------------------------- /Server/public/stylesheets/components/base.styl: -------------------------------------------------------------------------------- 1 | // Base styling 2 | 3 | *, *:after, *:before 4 | box-sizing: border-box 5 | 6 | html 7 | font-size: 100% 8 | text-size-adjust: none 9 | 10 | body 11 | background: white 12 | text-rendering: optimizeLegibility 13 | font-smoothing: antialiased 14 | font-family: $font-family-roboto 15 | font-weight: $font-weight-normal 16 | font-size: 16px 17 | line-height: 1.4 18 | color: $grey-drk 19 | 20 | h1:not(.logo), h2, h3 21 | margin-bottom: 15px 22 | font-family: $font-family-oswald 23 | font-weight: $font-weight-bold 24 | line-height: 1.2 25 | text-transform: uppercase 26 | letter-spacing: .5px 27 | 28 | h1:not(.logo) 29 | font-size: 18px 30 | 31 | h2 32 | font-size: 16px 33 | 34 | h3 35 | font-size: 14px 36 | 37 | a 38 | color: $blue 39 | text-decoration: none 40 | 41 | .waitLoader 42 | transform: scale(1.5) 43 | 44 | .hidden 45 | display: none !important 46 | 47 | // Clearfix 48 | .cf 49 | &:before, 50 | &:after 51 | content: " " 52 | display: table 53 | 54 | &:after 55 | clear: both -------------------------------------------------------------------------------- /Server/public/stylesheets/components/buttons.styl: -------------------------------------------------------------------------------- 1 | //- Buttons 2 | 3 | .btn 4 | margin: 10px 0 5 | display: inline-block 6 | border-radius: 3px 7 | font-weight: $font-weight-bold 8 | text-align: center 9 | cursor: pointer 10 | padding: 8px 10px 11 | 12 | &.btn-primary 13 | background: $teal 14 | color: white 15 | 16 | &:hover 17 | background: darken($teal, 10%) 18 | 19 | &.btn-secondary 20 | background: $grey-med 21 | color: $grey-drk 22 | 23 | &:hover 24 | background: darken($grey-med, 10%) 25 | 26 | &.btn-small 27 | padding: 2px 5px 28 | font-size: 90% 29 | -------------------------------------------------------------------------------- /Server/public/stylesheets/components/config.styl: -------------------------------------------------------------------------------- 1 | #settingsBtn 2 | text-align center 3 | cursor pointer 4 | i 5 | font-size 30px 6 | .plugin-title 7 | font-size 30px 8 | margin-bottom 20px 9 | 10 | .config-wrapper 11 | padding 20px 12 | text-align center 13 | .machine 14 | width 70px 15 | position relative 16 | top 7px 17 | margin-right 15px 18 | .plugins-list 19 | li 20 | opacity 1 21 | float left 22 | transition all 0.2s linear 23 | text-align left 24 | margin 10px 25 | display inline-block 26 | width 300px 27 | border 1px solid #C3C1C1 28 | background #EEEEEE 29 | height 150px 30 | padding 15px 31 | position relative 32 | .panel_option, .state_option 33 | width 50% 34 | padding 7px 35 | label 36 | display block 37 | font-size 15px 38 | margin-bottom 4px 39 | select 40 | width 100% 41 | float left 42 | padding 5px 43 | .panel_option 44 | float left 45 | .state_option 46 | float right 47 | padding-left 25px 48 | h4 49 | color black 50 | cursor pointer 51 | font-size 18px 52 | margin-bottom 15px 53 | input 54 | display none 55 | i 56 | margin-left 5px 57 | img 58 | height 25px 59 | width 25px 60 | position relative 61 | top 7px 62 | margin-right 10px 63 | .fa-arrows 64 | position absolute 65 | bottom 10px 66 | right 10px 67 | font-size 20px 68 | .nodeCompliant 69 | position absolute 70 | cursor pointer 71 | top 20px 72 | right 10px 73 | width 25px 74 | .nodeCompliant.nodeCompliant_enable 75 | opacity 1 76 | .nodeCompliant.nodeCompliant_disable 77 | opacity 0.5 78 | .pluginLoad 79 | opacity 0.5 !important 80 | .calque 81 | position absolute 82 | width 100% 83 | height 100% 84 | background black 85 | z-index 312 86 | opacity 0.5 87 | display none 88 | top 0px 89 | left 0px 90 | .search-config 91 | display inline-block 92 | float right 93 | position relative 94 | top 15px 95 | .config-wrapper .search-config .fa-search 96 | float right 97 | cursor pointer 98 | .config-wrapper .search-config input 99 | float right 100 | border none 101 | background-color #FFFFFF 102 | padding 7px 103 | position relative 104 | right 10px 105 | width 0px 106 | color white 107 | transition 0.2s linear all 108 | .clear 109 | clear both -------------------------------------------------------------------------------- /Server/public/stylesheets/components/login.styl: -------------------------------------------------------------------------------- 1 | 2 | .login-container 3 | position: absolute 4 | left:0 5 | top: 0 6 | right: 0 7 | bottom: 0 8 | background-color: #3C1942 9 | z-index: 1000 10 | opacity : 1 11 | transition: opacity 12 | transition-duration: 700ms 13 | transition-delay: 200ms 14 | transition-timing: ease-out 15 | .message 16 | background-color: #DDD 17 | text-align:center 18 | max-width:300px 19 | padding: 30px 20 | padding-bottom: 40px 21 | margin: auto 22 | margin-top: calc(25% - 100px) 23 | .logo 24 | max-width: 100% 25 | max-height: 80px 26 | margin-bottom: 1em 27 | transition: transform 28 | transition-duration: 700ms 29 | transition-timing: ease-out 30 | transform: scale(1) 31 | h1 32 | font-size: 1em 33 | color: #6b2d81 34 | form 35 | width: 200px 36 | margin-left:auto 37 | margin-right: auto 38 | text-align: left 39 | input 40 | width: 100% 41 | margin-bottom: 10px 42 | border: 0 43 | padding: 10px 44 | button 45 | margin-top: 10px 46 | width: 200px 47 | background-color: #6b2d81 48 | color: white 49 | border:0 50 | padding: 10px -------------------------------------------------------------------------------- /Server/public/stylesheets/components/resize.styl: -------------------------------------------------------------------------------- 1 | /*! 2 | * StyleSheet for JQuery splitter Plugin 3 | * Copyright (C) 2010 Jakub Jankiewicz 4 | * 5 | * Same license as plugin 6 | */ 7 | 8 | .splitter_panel 9 | position: relative 10 | 11 | .splitter_panel .vsplitter 12 | cursor: col-resize 13 | z-index: 900 14 | width: 5px 15 | background-color: white 16 | border-right: $border-med 17 | border-left: $border-med 18 | 19 | .splitter_panel .hsplitter 20 | cursor: row-resize 21 | z-index: 800 22 | height: 8px 23 | background: white url(../images/icon-resize-horiz.svg) no-repeat center center 24 | background-size: auto 3px 25 | border-bottom: $border-med 26 | border-top: $border-med 27 | 28 | .splitter_panel .vsplitter.splitter-invisible, 29 | .splitter_panel .hsplitter.splitter-invisible 30 | background: none 31 | 32 | .splitter_panel .vsplitter, .splitter_panel .left_panel, .splitter_panel .right_panel, 33 | .splitter_panel .hsplitter, .splitter_panel .top_panel, .splitter_panel .bottom_panel 34 | position: absolute 35 | overflow: auto 36 | 37 | .splitter_panel .vsplitter, .splitter_panel .left_panel, .splitter_panel .right_panel 38 | height: 100% 39 | 40 | .splitter_panel .hsplitter, .splitter_panel .top_panel, .splitter_panel .bottom_panel 41 | width: 100% 42 | 43 | .splitter_panel .top_panel, .splitter_panel .left_panel, .splitter_panel .right_panel, .splitter_panel .vsplitter 44 | top: 0 45 | 46 | .splitter_panel .top_panel, .splitter_panel .bottom_panel, .splitter_panel .left_panel, .splitter_panel .hsplitter 47 | left: 0 48 | 49 | .splitter_panel .bottom_panel 50 | bottom: 0 51 | 52 | .splitter_panel .right_panel 53 | right: 0 54 | 55 | .splitterMask 56 | position: absolute 57 | left: 0 58 | top: 0 59 | right: 0 60 | bottom: 0 61 | z-index: 1000 62 | cursor: default -------------------------------------------------------------------------------- /Server/public/stylesheets/components/sidebar.styl: -------------------------------------------------------------------------------- 1 | // Sidebar 2 | 3 | .sidebar 4 | width: 200px 5 | height: 100vh 6 | padding-bottom: 20px 7 | position: absolute 8 | top: 0 9 | left: 0 10 | overflow: auto 11 | background: $grey-light 12 | border-right: $border-med 13 | 14 | .sidebar-header 15 | background: $vorlon-purple 16 | color: white 17 | 18 | .logo 19 | height: 40px 20 | background: url(../images/vorlon-logo-white.svg) no-repeat center center 21 | background-size: auto 20px 22 | text-indent: -9999em 23 | 24 | // Session IDs 25 | .session-info 26 | padding: 15px 27 | background: $purple 28 | font-weight: $font-weight-bold 29 | 30 | p span 31 | font-weight: $font-weight-normal 32 | 33 | // Client list 34 | .client-pane 35 | padding: 15px 36 | 37 | h2 38 | margin-bottom: 5px 39 | color: black; 40 | 41 | .btn 42 | width: 100% 43 | margin: 0 0 15px 44 | 45 | .client 46 | margin: 0 -15px 47 | display: block 48 | font-size: 15px 49 | color: $grey-drk 50 | 51 | &.active 52 | background-color: white 53 | font-weight: $font-weight-bold 54 | 55 | a 56 | display: block 57 | padding: 2px 15px 58 | 59 | .btn-reset 60 | margin-top: 10px 61 | 62 | #clientsListPaneContent img 63 | width 15px 64 | position relative 65 | top 2px 66 | margin-right 12px 67 | left 2px 68 | 69 | #vorlonVersion 70 | position: absolute 71 | bottom: 10px 72 | -------------------------------------------------------------------------------- /Server/public/stylesheets/globals/reset.styl: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v2.0 | 20110126 3 | License: none (public domain) 4 | */ 5 | 6 | html, body, div, span, applet, object, iframe, 7 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 8 | a, abbr, acronym, address, big, cite, code, 9 | del, dfn, em, img, ins, kbd, q, s, samp, 10 | small, strike, strong, sub, sup, tt, var, 11 | b, u, i, center, 12 | dl, dt, dd, ol, ul, li, 13 | fieldset, form, label, legend, 14 | table, caption, tbody, tfoot, thead, tr, th, td, 15 | article, aside, canvas, details, embed, 16 | figure, figcaption, footer, header, hgroup, 17 | menu, nav, output, ruby, section, summary, 18 | time, mark, audio, video 19 | margin: 0 20 | padding: 0 21 | border: 0 22 | font-size: 100% 23 | font: inherit 24 | vertical-align: baseline 25 | 26 | /* HTML5 display-role reset for older browsers */ 27 | article, aside, details, figcaption, figure, 28 | footer, header, hgroup, menu, nav, section 29 | display: block 30 | 31 | body 32 | line-height: 1 33 | 34 | ol, ul 35 | list-style: none 36 | 37 | blockquote, q 38 | quotes: none 39 | 40 | blockquote:before, blockquote:after, 41 | q:before, q:after 42 | content: '' 43 | content: none 44 | 45 | table 46 | border-collapse: collapse 47 | border-spacing: 0 48 | -------------------------------------------------------------------------------- /Server/public/stylesheets/globals/variables.styl: -------------------------------------------------------------------------------- 1 | // Variables 2 | 3 | 4 | // Font Families 5 | $font-family-georgia = Georgia, serif 6 | $font-family-roboto = 'Roboto', Helvetica, Arial, sans-serif 7 | $font-family-oswald = 'Oswald', Helvetica, Arial, sans-serif 8 | $font-family-courier = 'Courier New', Courier, monospace 9 | $font-family-menlo = 'Menlo', 'Consolas', 'Lucida Console', Courier, monospace 10 | 11 | 12 | // Font Weights 13 | $font-weight-normal = 300 14 | $font-weight-bold = 400 15 | 16 | 17 | // Colors 18 | 19 | $vorlon-purple = #1d0c3d 20 | 21 | $purple = #6b2d81 22 | $purple-drk = #411748 23 | 24 | $blue = #007ca7 25 | $blue-drk = #0a567f 26 | 27 | $yellow = #fee600 28 | $yellow-drk = #ffcb05 29 | 30 | $green = #a2c13b 31 | $green-drk = #899c3a 32 | 33 | $teal = #00616a 34 | $red = #ed2424 35 | 36 | $grey-drk = #444 37 | $grey-med = #ccc 38 | $grey-light = #eee 39 | 40 | white(alpha) 41 | rgba(255,255,255,alpha) 42 | 43 | black(alpha) 44 | rgba(0,0,0,alpha) 45 | 46 | // For panel information 47 | 48 | $orange = #ff9205 49 | $green-bright = #52ba19 50 | 51 | // Borders 52 | 53 | $border-light = 1px solid #eee 54 | $border-med = 1px solid #CAADD4 55 | 56 | // Widths 57 | 58 | $container-width = 1200px 59 | $small-width = 600px 60 | $medium-width = 900px 61 | 62 | // Transforms & transitions 63 | 64 | transition(args) 65 | transition: args 66 | 67 | // Center content vertically 68 | 69 | centerVert = 70 | position: absolute 71 | top: 50% 72 | transform: translateY(-50%) -------------------------------------------------------------------------------- /Server/public/stylesheets/httpproxy.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #eee; 3 | font-family: Roboto; 4 | } 5 | .home .top { 6 | margin: calc(15% - 100px) auto auto; 7 | text-align: center; 8 | } 9 | .home .top .logo { 10 | max-width: 100%; 11 | max-height: 120px; 12 | margin-bottom: 1em; 13 | } 14 | .home .form { 15 | margin: auto; 16 | text-align: center; 17 | width: 400px; 18 | } 19 | 20 | .home .form .input input { 21 | -moz-box-sizing: border-box; 22 | -webkit-box-sizing: border-box; 23 | box-sizing: border-box; 24 | } 25 | 26 | .home .message { 27 | color: #777; 28 | text-align: center; 29 | margin-bottom: 10px; 30 | text-align: justify; 31 | } 32 | 33 | .home .message.error { 34 | color: red; 35 | } 36 | 37 | .home .form .input input { 38 | padding: 6px 12px; 39 | border-color: #411748; 40 | width: 100%; 41 | } 42 | .home .form .button { 43 | margin: auto; 44 | } 45 | .spacebutton { 46 | width: 100%; 47 | } 48 | .btn { 49 | border: none; 50 | cursor: pointer; 51 | display: inline-block; 52 | font-weight: 400; 53 | margin: 10px 0 0 0; 54 | padding: 8px 10px; 55 | text-align: center; 56 | width: 100%; 57 | background-color: #411748 !important; 58 | color: white !important; 59 | -moz-box-sizing: border-box; 60 | -webkit-box-sizing: border-box; 61 | box-sizing: border-box; 62 | } 63 | .btn.left{ 64 | float: left; 65 | } 66 | .btn.right{ 67 | float: right; 68 | } 69 | .btn-default { 70 | background: #ccc none repeat scroll 0 0; 71 | color: #444; 72 | } 73 | 74 | .hide { 75 | display: none; 76 | } -------------------------------------------------------------------------------- /Server/public/stylesheets/images/ui-bg_flat_0_aaaaaa_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/stylesheets/images/ui-bg_flat_0_aaaaaa_40x100.png -------------------------------------------------------------------------------- /Server/public/stylesheets/images/ui-bg_flat_75_ffffff_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/stylesheets/images/ui-bg_flat_75_ffffff_40x100.png -------------------------------------------------------------------------------- /Server/public/stylesheets/images/ui-bg_glass_55_fbf9ee_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/stylesheets/images/ui-bg_glass_55_fbf9ee_1x400.png -------------------------------------------------------------------------------- /Server/public/stylesheets/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/stylesheets/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /Server/public/stylesheets/images/ui-bg_glass_75_dadada_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/stylesheets/images/ui-bg_glass_75_dadada_1x400.png -------------------------------------------------------------------------------- /Server/public/stylesheets/images/ui-bg_glass_75_e6e6e6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/stylesheets/images/ui-bg_glass_75_e6e6e6_1x400.png -------------------------------------------------------------------------------- /Server/public/stylesheets/images/ui-bg_glass_95_fef1ec_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/stylesheets/images/ui-bg_glass_95_fef1ec_1x400.png -------------------------------------------------------------------------------- /Server/public/stylesheets/images/ui-bg_highlight-soft_75_cccccc_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/stylesheets/images/ui-bg_highlight-soft_75_cccccc_1x100.png -------------------------------------------------------------------------------- /Server/public/stylesheets/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/stylesheets/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /Server/public/stylesheets/images/ui-icons_2e83ff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/stylesheets/images/ui-icons_2e83ff_256x240.png -------------------------------------------------------------------------------- /Server/public/stylesheets/images/ui-icons_454545_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/stylesheets/images/ui-icons_454545_256x240.png -------------------------------------------------------------------------------- /Server/public/stylesheets/images/ui-icons_888888_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/stylesheets/images/ui-icons_888888_256x240.png -------------------------------------------------------------------------------- /Server/public/stylesheets/images/ui-icons_cd0a0a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MicrosoftDX/Vorlonjs/dc77d6dd8ed990d0cf207e0d7230fe5568c7987f/Server/public/stylesheets/images/ui-icons_cd0a0a_256x240.png -------------------------------------------------------------------------------- /Server/public/stylesheets/jquery.switchButton.css: -------------------------------------------------------------------------------- 1 | .switch-button-label { 2 | float: left; 3 | 4 | font-size: 10pt; 5 | cursor: pointer; 6 | } 7 | 8 | .switch-button-label.off { 9 | color: #adadad; 10 | } 11 | 12 | .switch-button-label.on { 13 | color: #0088CC; 14 | } 15 | 16 | .switch-button-background { 17 | float: left; 18 | position: relative; 19 | 20 | background: #ccc; 21 | border: 1px solid #aaa; 22 | 23 | margin: 1px 10px; 24 | 25 | -webkit-border-radius: 4px; 26 | -moz-border-radius: 4px; 27 | border-radius: 4px; 28 | 29 | cursor: pointer; 30 | } 31 | 32 | .switch-button-button { 33 | position: absolute; 34 | 35 | left: -1px; 36 | top : -1px; 37 | 38 | background: #FAFAFA; 39 | border: 1px solid #aaa; 40 | 41 | -webkit-border-radius: 4px; 42 | -moz-border-radius: 4px; 43 | border-radius: 4px; 44 | } 45 | -------------------------------------------------------------------------------- /Server/public/stylesheets/style.styl: -------------------------------------------------------------------------------- 1 | @import 'globals/reset' 2 | @import 'globals/variables' 3 | 4 | @import 'components/base' 5 | @import 'components/buttons' 6 | @import 'components/resize' 7 | @import 'components/sidebar' 8 | @import 'components/dashboard' 9 | @import 'components/login' 10 | @import 'components/config' -------------------------------------------------------------------------------- /Server/public/stylesheets/x-tag-components.css: -------------------------------------------------------------------------------- 1 | x-action{display:inline-block} 2 | 3 | 4 | x-controlbar { 5 | display:-webkit-box; 6 | display:-moz-box; 7 | display:-ms-flexbox; 8 | display:-webkit-flex; 9 | display:flex; 10 | padding: 0.35em; 11 | background: #fafafa; 12 | border: 1px solid #ddd; 13 | -webkit-box-sizing: border-box; 14 | -moz-box-sizing: border-box; 15 | -ms-box-sizing: border-box; 16 | box-sizing: border-box; 17 | height: 36px; 18 | font-size: 0.8rem; 19 | } 20 | 21 | x-controlbar > * { 22 | -webkit-box-flex: 0; 23 | -moz-box-flex: 0; 24 | -webkit-flex: 0 0 auto; 25 | -ms-flex: 0 0 auto; 26 | box-flex: 0; 27 | flex: 0 0 auto; 28 | margin-left: 0.35em; 29 | padding: 0.35em 0.7em; 30 | border: 1px solid rgba(0,0,0, 0.1); 31 | font: inherit; 32 | } 33 | 34 | x-controlbar > *:first-child { 35 | margin-left: 0; 36 | } 37 | 38 | x-controlbar > [stretch] { 39 | -webkit-box-flex:1; 40 | -moz-box-flex:1; 41 | -webkit-flex:1; 42 | -ms-flex:1; 43 | box-flex:1; 44 | flex:1; 45 | } 46 | 47 | x-controlbar > button, 48 | x-controlbar > x-action, 49 | x-controlbar > input[type="submit"] { 50 | background: #ddd; 51 | cursor: pointer; 52 | line-height: 0.9rem; 53 | text-align:center; 54 | } 55 | 56 | x-controlbar > button:hover, 57 | x-controlbar > x-action:hover, 58 | x-controlbar > input[type="submit"]:hover { 59 | background: #BBB; 60 | } 61 | 62 | x-controlbar > input[type="text"], 63 | x-controlbar > input:not([type]) { 64 | border: 1px solid rgba(0,0,0, 0.15); 65 | } 66 | 67 | 68 | 69 | [x-notify-parentnode] { 70 | position: relative; 71 | overflow: hidden; 72 | } 73 | 74 | x-notify { 75 | display: none; 76 | position: absolute; 77 | bottom: 0; 78 | left: 0; 79 | width: 100%; 80 | padding: 0.6em 2.5em 0.5em 0.6em; 81 | color: #fff; 82 | background: #34495e; 83 | text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4); 84 | cursor: default; 85 | -webkit-box-sizing: border-box; 86 | -moz-box-sizing: border-box; 87 | -ms-box-sizing: border-box; 88 | box-sizing: border-box; 89 | -webkit-transform: translateY(100%); 90 | -ms-transform: translateY(100%); 91 | transform: translateY(100%); 92 | -webkit-transition: opacity 0.4s, transform 0.4s; 93 | -ms-transition: opacity 0.4s, transform 0.4s; 94 | transition: opacity 0.4s, transform 0.4s; 95 | } 96 | 97 | x-notify > *, x-notify:before, x-notify:after { 98 | display: inline-block; 99 | vertical-align: middle; 100 | } 101 | 102 | x-notify[closable]:after { 103 | content: "✖"; 104 | position: absolute; 105 | top: 50%; 106 | right: 0; 107 | width: 2.5em; 108 | text-align: center; 109 | cursor: pointer; 110 | -webkit-transform: translateY(-50%); 111 | -ms-transform: translateY(-50%); 112 | transform: translateY(-50%); 113 | } 114 | 115 | x-notify[position="top"] { 116 | top: 0; 117 | bottom: auto; 118 | -webkit-transform: translateY(-100%); 119 | -ms-transform: translateY(-100%); 120 | transform: translateY(-100%); 121 | } 122 | 123 | x-notify[transition="show"] { 124 | display: block; 125 | opacity: 1; 126 | -webkit-transform: translateY(0%); 127 | -ms-transform: translateY(0%); 128 | transform: translateY(0%); 129 | } 130 | 131 | x-notify[transition="hide"] { 132 | opacity: 0; 133 | -webkit-transition-duration: 0.2s; 134 | -ms-transition-duration: 0.2s; 135 | transition-duration: 0.2s; 136 | } 137 | 138 | x-notify[transitioning] { 139 | display: block; 140 | } 141 | 142 | /*** DEFAULT VARIANTS ***/ 143 | 144 | x-notify[type="success"] { 145 | background-color: #27ae60; 146 | } 147 | 148 | x-notify[type="warning"] { 149 | background-color: #e67e22; 150 | } 151 | 152 | x-notify[type="error"] { 153 | background-color: #e74c3c; 154 | } -------------------------------------------------------------------------------- /Server/public/vorlon.production.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export class Production{ 3 | public isActivated : boolean; 4 | 5 | constructor(public vorlonServerUrl: string, public vorlonSessionId : string, public useLocalStorage?: boolean){ 6 | var storage = useLocalStorage ? localStorage : sessionStorage; 7 | var mustActivate = storage["vorlonActivation"] === "true"; 8 | 9 | if (this.vorlonServerUrl && this.vorlonServerUrl[this.vorlonServerUrl.length-1] !== '/'){ 10 | this.vorlonServerUrl = this.vorlonServerUrl + "/"; 11 | } 12 | 13 | if (mustActivate){ 14 | this.addVorlonScript(); 15 | } 16 | } 17 | 18 | addVorlonScript(){ 19 | var storage = this.useLocalStorage ? localStorage : sessionStorage; 20 | storage["vorlonActivation"] = "true"; 21 | this.isActivated = true; 22 | 23 | var scriptElt = document.createElement("SCRIPT"); 24 | scriptElt.src = this.vorlonServerUrl + "vorlon.js" + (this.vorlonSessionId ? "/" + this.vorlonSessionId : ""); 25 | document.head.insertBefore(scriptElt, document.head.firstChild); 26 | } 27 | 28 | setIdentity(identity){ 29 | var storage = this.useLocalStorage ? localStorage : sessionStorage; 30 | storage["vorlonClientIdentity"] = identity; 31 | var v = VORLON; 32 | if (v && v.Core){ 33 | v.Core.sendHelo(); 34 | } 35 | } 36 | 37 | getIdentity(){ 38 | var storage = this.useLocalStorage ? localStorage : sessionStorage; 39 | return storage["vorlonClientIdentity"]; 40 | } 41 | 42 | activate(reload : boolean){ 43 | if (this.isActivated) 44 | return; 45 | 46 | if (reload){ 47 | var storage = this.useLocalStorage ? localStorage : sessionStorage; 48 | storage["vorlonActivation"] = "true"; 49 | this.isActivated = true; 50 | window.location.reload(); 51 | }else{ 52 | this.addVorlonScript(); 53 | } 54 | } 55 | 56 | deactivate(reload : boolean){ 57 | var storage = this.useLocalStorage ? localStorage : sessionStorage; 58 | storage["vorlonActivation"] = "false"; 59 | this.isActivated = false; 60 | if (reload){ 61 | window.location.reload(); 62 | } 63 | } 64 | } 65 | } -------------------------------------------------------------------------------- /Server/server.ts: -------------------------------------------------------------------------------- 1 | import servercontext = require("./config/vorlon.servercontext"); 2 | import vorlonServer = require("./Scripts/vorlon.server"); 3 | import vorlonDashboard = require("./Scripts/vorlon.dashboard"); 4 | import vorlonWebserver = require("./Scripts/vorlon.webServer"); 5 | import vorlonHttpProxy = require("./Scripts/vorlon.httpproxy.server"); 6 | import winstonLogger = require("./Scripts/vorlon.winstonlogger"); 7 | 8 | var context = new servercontext.VORLON.DefaultContext(); 9 | 10 | // if proxyEnvPort==true start a standalone instance of httpProxy 11 | if (!context.httpConfig.proxyEnvPort) { 12 | //context.logger = new servercontext.VORLON.SimpleConsoleLogger(); 13 | var logger = new winstonLogger.VORLON.WinstonLogger(context); 14 | //WEBSERVER 15 | var webServer = new vorlonWebserver.VORLON.WebServer(context); 16 | 17 | //DASHBOARD 18 | var dashboard = new vorlonDashboard.VORLON.Dashboard(context); 19 | 20 | //VORLON SERVER 21 | var server = new vorlonServer.VORLON.Server(context); 22 | 23 | //VORLON HTTPPROXY 24 | var HttpProxy = new vorlonHttpProxy.VORLON.HttpProxy(context, false); 25 | 26 | webServer.components.push(logger); 27 | webServer.components.push(dashboard); 28 | webServer.components.push(server); 29 | webServer.components.push(HttpProxy); 30 | webServer.start(); 31 | } 32 | else { 33 | var serverProxy = new vorlonHttpProxy.VORLON.HttpProxy(context, true); 34 | serverProxy.start(); 35 | } 36 | -------------------------------------------------------------------------------- /Server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES5", 4 | "skipLibCheck": true 5 | }, 6 | "exclude": ["node_modules", "**/*.spec.ts"] 7 | } 8 | -------------------------------------------------------------------------------- /Server/views/config.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | .dashboard.cf 5 | 6 | include includes/sidebar 7 | include includes/dashboard-config 8 | 9 | block scripts 10 | script(src=baseURL + '/javascripts/socket.io-1.4.3.js') 11 | script(src=baseURL + '/javascripts/x-tag-components.js') 12 | script(src=baseURL + '/vorlon/vorlon-noplugin.max.js') 13 | script(src=baseURL + '/vorlon.dashboardManager.js') 14 | script!='var vorlonDashboard = new VORLON.DashboardManager("' + sessionid + '", "' + clientid + '");' 15 | script(src=baseURL + '/javascripts/jquery.splitter-0.14.0.js') 16 | script(src=baseURL + '/javascripts/dashboard.js') 17 | script(src=baseURL + '/javascripts/jquery-ui.js' type="text/javascript") 18 | script(src=baseURL + '/javascripts/contextMenu.js' type="text/javascript") 19 | script(src=baseURL + '/javascripts/jquery.switchButton.js' type="text/javascript") 20 | script(src=baseURL + '/javascripts/dashboard-config.js') -------------------------------------------------------------------------------- /Server/views/dashboard.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | .dashboard.cf 5 | 6 | include includes/sidebar 7 | include includes/dashboard-plugins 8 | include includes/accessibility 9 | 10 | block scripts 11 | script(src=baseURL + '/javascripts/socket.io-1.4.3.js') 12 | script(src=baseURL + '/javascripts/x-tag-components.js') 13 | script(src=baseURL + '/vorlon/vorlon-noplugin.max.js') 14 | script(src=baseURL + '/vorlon.dashboardManager.js') 15 | script(src=baseURL + '/javascripts/jquery.splitter-0.14.0.js') 16 | script(src=baseURL + '/javascripts/dashboard.js') 17 | script(src=baseURL + '/javascripts/jquery-ui.js' type="text/javascript") 18 | script(src=baseURL + '/javascripts/contextMenu.js' type="text/javascript") 19 | script(src=baseURL + '/javascripts/jquery.switchButton.js' type="text/javascript") 20 | script(src=baseURL + '/javascripts/smoothie.js' type="text/javascript") 21 | script!='var vorlonDashboard = new VORLON.DashboardManager("' + sessionid + '", "' + clientid + '");' 22 | -------------------------------------------------------------------------------- /Server/views/getsession.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | .row 5 | p To start using vorlon.js, you need to create a session. 6 | a#createSessionButton.btn.btn-default.btn-getsession(onclick='VORLON.DashboardManager.getSessionId()') Create Session 7 | 8 | block scripts 9 | script(src=baseURL + '/javascripts/socket.io-1.4.3.js') 10 | script(src=baseURL + '/vorlon.dashboardManager.js') 11 | -------------------------------------------------------------------------------- /Server/views/httpproxyerror.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html(lang='en') 3 | head 4 | meta(charset='utf-8') 5 | meta(http-equiv='X-UA-Compatible', content='IE=edge') 6 | meta(name='viewport', content='width=device-width, initial-scale=1') 7 | meta(name='description', content='') 8 | meta(name='author', content='') 9 | title Vorlonjs HTTP Proxy Error 10 | link(rel='stylesheet', href='/stylesheets/httpproxy.css') 11 | link(href='https://fonts.googleapis.com/css?family=Oswald:400' rel='stylesheet') 12 | link(href='https://fonts.googleapis.com/css?family=Roboto+Condensed:400,300|Roboto:400,300' rel='stylesheet') 13 | script(src='/javascripts/jquery-2.1.1.min.js' type="text/javascript") 14 | body 15 | 16 | div.home 17 | div.top 18 | img.logo(src=baseURL + "/images/VorlonLogo_Smooth.svg", alt="Vorlon logo" ) 19 | div.form 20 | div.message error 21 | -------------------------------------------------------------------------------- /Server/views/includes/accessibility.jade: -------------------------------------------------------------------------------- 1 | #aria-pluginDesc.aria-descHelper This is a Vorlon dot JS plugin. 2 | #aria-pluginAddition.aria-descHelper This will redirect you to the plugin section of the Vorlon dot JS website. -------------------------------------------------------------------------------- /Server/views/includes/dashboard-config.jade: -------------------------------------------------------------------------------- 1 | section.dashboard-initial 2 | section.config-wrapper 3 | h2.plugin-title 4 | img.machine(src=baseURL + "/images/machine.png") 5 | span Plugins available (0) : 6 | div.search-config 7 | i.fa.fa-search 8 | input(type="text") 9 | div.plugins-list-wrapper 10 | ul.plugins-list 11 | div.clear 12 | div.clear 13 | -------------------------------------------------------------------------------- /Server/views/includes/dashboard-initial.jade: -------------------------------------------------------------------------------- 1 | section.dashboard-initial 2 | div.get-started 3 | p To start using Vorlon.js, please create a session. 4 | a.btn.btn-primary(onclick='VORLON.DashboardManager.getSessionId()') Create Session -------------------------------------------------------------------------------- /Server/views/includes/dashboard-plugins.jade: -------------------------------------------------------------------------------- 1 | section.dashboard-plugins-container 2 | section.dashboard-plugins 3 | section.panel-top#pluginsPaneTop 4 | header.tab-bar.cf#pluginsListPaneTop 5 | 6 | section.panel-bottom#pluginsPaneBottom 7 | header.tab-bar.cf#pluginsListPaneBottom 8 | section.dashboard-plugins-overlay 9 | div.message 10 | img.logo(src=baseURL + "/images/VorlonLogo_Smooth.svg", alt="Vorlon logo" ) 11 | h3 To get started, you must add a reference to client script in the page of your website, like this : 12 | h4#scriptSrc <script src="http://localhost:1337/vorlon.js"></script> 13 | h3 Once your page is loaded, the client will appear in the sidebar on the left. 14 | h3 Click on it to start inspecting your website. 15 | h3 You could also inspect existing websites using 16 | a(href="/httpproxy") Vorlon proxy 17 | br 18 | div.waitLoader.hidden 19 | span.fa.fa-spin.fa-spinner 20 | -------------------------------------------------------------------------------- /Server/views/includes/plugins/console-logs.jade: -------------------------------------------------------------------------------- 1 |
Executing order: window
error!!!
message!!!
error!!!
message!!!
error!!!
message!!!
error!!!
message!!!
error!!!
message!!!
error!!!
message!!!
error!!!
message!!!
error!!!
message!!!
error!!!
message!!!
error!!!
message!!!
2 | -------------------------------------------------------------------------------- /Server/views/includes/plugins/console.jade: -------------------------------------------------------------------------------- 1 | .plugin.plugin-console 2 | #logsContainer.logs-container 3 | #logs.logs-list 4 | include console-logs 5 | input#input.console-input(type='text') 6 | -------------------------------------------------------------------------------- /Server/views/includes/plugins/dom-explorer-style.jade: -------------------------------------------------------------------------------- 1 |
font-size
18px
2 |
width
200px
+
3 | -------------------------------------------------------------------------------- /Server/views/includes/plugins/dom-explorer.jade: -------------------------------------------------------------------------------- 1 | .plugin.plugin-dom-explorer(data-plugin='dom-explorer') 2 | #DOMExplorerContainer.dom-explorer-container 3 | .panel-left 4 | #treeView.tree-view 5 | include dom-explorer-tree 6 | .panel-right 7 | #styleView.style-view 8 | include dom-explorer-style 9 | -------------------------------------------------------------------------------- /Server/views/includes/plugins/modernizr.jade: -------------------------------------------------------------------------------- 1 | .plugin.plugin-modernizr(data-plugin='modernizr') 2 | #ModernizrReportContainer.modernizr-container 3 | h2 CSS Features Detection 4 | table#cssFeaturesList.modernizr-features-list 5 | tr 6 | th Feature 7 | th Support level 8 | tr 9 | td Some feature that is nice 10 | td.modernizrFeatureSupported Supported 11 | tr 12 | td Some feature that is nice 13 | td.modernizrFeatureSupported Supported 14 | tr 15 | td Some feature that is nice 16 | td.modernizrFeatureSupported Supported 17 | tr 18 | td Some feature that is not nice 19 | td.modernizrFeatureUnsupported Not supported 20 | h2 HTML5 Features Detection 21 | table#htmlFeaturesList.modernizr-features-list 22 | tr 23 | th Feature 24 | th Support level 25 | tr 26 | td Some feature that is nice 27 | td.modernizrFeatureSupported Supported 28 | tr 29 | td Some feature that is not nice 30 | td.modernizrFeatureUnsupported Not supported 31 | h2 Miscellaneous 32 | table#miscFeaturesList.modernizr-features-list 33 | tr 34 | th Feature 35 | th Support level 36 | tr 37 | td Some feature that is nice 38 | td.modernizrFeatureSupported Supported 39 | tr 40 | td Some feature that is not nice 41 | td.modernizrFeatureUnsupported Not supported 42 | h2 Non Core 43 | table#nonCoreFeaturesList.modernizr-features-list 44 | tr 45 | th Feature 46 | th Support level 47 | tr 48 | td Some feature that is nice 49 | td.modernizrFeatureSupported Supported 50 | tr 51 | td Some feature that is not nice 52 | td.modernizrFeatureUnsupported Not supported 53 | -------------------------------------------------------------------------------- /Server/views/includes/sidebar.jade: -------------------------------------------------------------------------------- 1 | section.sidebar 2 | header.sidebar-header 3 | h1.logo Vorlon.js 4 | .session-info 5 | p 6 | | Session ID: 7 | span(data-hook='session-id') 8 | p 9 | | Client ID: 10 | span(data-hook='client-id') 11 | #clientsListPane.client-pane 12 | a#identify.btn.btn-primary(onclick='vorlonDashboard.identify()',tabindex='0',role="button") Identify a client 13 | h2 Client List 14 | #clientsListPaneContent.client-list 15 | a.btn.btn-secondary.btn-small.btn-reset(onclick='VORLON.DashboardManager.ResetDashboard()', tabindex='0',role="button") Reset Dashboard 16 | if authenticated 17 | a#logout.btn.btn-secondary.btn-small.btn-reset(href='/logout', tabindex='0',role="button") logout 18 | a#reload.btn.btn-secondary.btn-small.btn-reset.hidden(onclick='VORLON.DashboardManager.ReloadClient()', tabindex='0',role="button") Reload Client 19 | p#vorlonVersion= "Version: " + version 20 | #settingsBtn(onclick='VORLON.DashboardManager.goConfig()') 21 | i.fa.fa-cogs(aria-hidden='true') -------------------------------------------------------------------------------- /Server/views/layout.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html(lang='en') 3 | head 4 | meta(charset='utf-8') 5 | meta(http-equiv='X-UA-Compatible', content='IE=edge') 6 | meta(name='viewport', content='width=device-width, initial-scale=1') 7 | meta(name='description', content='') 8 | meta(name='author', content='') 9 | 10 | title Vorlon.js 11 | script!='var vorlonBaseURL = "' + baseURL + '";' 12 | link(rel='stylesheet', href=baseURL + '/stylesheets/x-tag-components.css') 13 | link(rel='stylesheet', href=baseURL + '/stylesheets/jquery-ui.css') 14 | link(rel='stylesheet', href=baseURL + '/stylesheets/contextMenu.css') 15 | link(rel='stylesheet', href=baseURL + '/stylesheets/jquery.switchButton.css') 16 | 17 | link(href='https://fonts.googleapis.com/css?family=Oswald:400' rel='stylesheet') 18 | link(href='https://fonts.googleapis.com/css?family=Roboto+Condensed:400,300|Roboto:400,300' rel='stylesheet') 19 | 20 | link(rel='icon', type='image/png', href=baseURL + '/images/favicon.png') 21 | link(rel='stylesheet', href=baseURL + '/stylesheets/style.css') 22 | link(rel='stylesheet', href=baseURL + '/fonts/fontawesome/css/font-awesome.min.css') 23 | body 24 | 25 | block content 26 | 27 | script(src=baseURL + '/javascripts/jquery-2.1.1.min.js') 28 | 29 | block scripts 30 | -------------------------------------------------------------------------------- /Server/views/login.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | section.login-container 5 | div.message 6 | img.logo(src=baseURL + "/images/VorlonLogo_Smooth.svg", alt="Vorlon logo" ) 7 | h1 We need your credentials :) 8 | 9 | //- submit to /login 10 | form(action="#{baseURL}/login", method="post") 11 | input(type="text", id="username", name="username", placeholder="Username") 12 | input(type="password", id="password", name="password", placeholder="Password") 13 | button(type="submit") Login 14 | 15 | block scripts 16 | -------------------------------------------------------------------------------- /Tests/gulpfile.tests.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'), 2 | mocha = require('gulp-mocha'); 3 | 4 | /** 5 | * Task that runs unit test using Mocha 6 | */ 7 | gulp.task('tests', function(){ 8 | gulp.src('server.vorlon.tools.tests.js') 9 | .pipe(mocha({reporter: 'mocha-junit-reporter'})); 10 | }); -------------------------------------------------------------------------------- /Tests/server.vorlon.tools.tests.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var vorlontools = require('../Server/Scripts/vorlon.tools'); 3 | 4 | describe('Server/VORLON.Tools', function() { 5 | describe('GetOperatingSystem()', function () { 6 | it('should return Android for android user agent', function () { 7 | var ua = "Mozilla/5.0 (Linux; ; ) AppleWebKit/ (KHTML, like Gecko) Chrome/ Mobile Safari/ "; 8 | var expected = "Android"; 9 | var actual = vorlontools.VORLON.Tools.GetOperatingSystem(ua); 10 | assert.equal(actual, expected); 11 | }); 12 | }); 13 | }); 14 | 15 | describe('Server/VORLON.Tools', function() { 16 | describe('GetOperatingSystem()', function () { 17 | it('should return Windows for Windows user agent', function () { 18 | var ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240"; 19 | var expected = "Windows"; 20 | var actual = vorlontools.VORLON.Tools.GetOperatingSystem(ua); 21 | assert.equal(actual, expected); 22 | }); 23 | }); 24 | }); 25 | 26 | describe('Server/VORLON.Tools', function() { 27 | describe('GetOperatingSystem()', function () { 28 | it('should return Windows Phone for Windows Phone user agent', function () { 29 | var ua = "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)"; 30 | var expected = "Windows Phone"; 31 | var actual = vorlontools.VORLON.Tools.GetOperatingSystem(ua); 32 | assert.equal(actual, expected); 33 | }); 34 | }); 35 | }); 36 | 37 | describe('Server/VORLON.Tools', function() { 38 | describe('GetOperatingSystem()', function () { 39 | it('should return iOS for iPad user agent', function () { 40 | var ua = "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"; 41 | var expected = "iOS"; 42 | var actual = vorlontools.VORLON.Tools.GetOperatingSystem(ua); 43 | assert.equal(actual, expected); 44 | }); 45 | }); 46 | }); 47 | 48 | describe('Server/VORLON.Tools', function() { 49 | describe('GetOperatingSystem()', function () { 50 | it('should return Kindle for Kindle user agent', function () { 51 | var ua = "Mozilla/4.0 (compatible; Linux 2.6.10) NetFront/3.4 Kindle/1.0 (screen 600x800)"; 52 | var expected = "Kindle"; 53 | var actual = vorlontools.VORLON.Tools.GetOperatingSystem(ua); 54 | assert.equal(actual, expected); 55 | }); 56 | }); 57 | }); -------------------------------------------------------------------------------- /azuredeploy-parameters.json: -------------------------------------------------------------------------------- 1 | { 2 | "siteName": { 3 | "value": "SiteName" 4 | }, 5 | "hostingPlanName": { 6 | "value": "AppServicePlanName" 7 | }, 8 | "siteLocation": { 9 | "value": "West US" 10 | } 11 | } -------------------------------------------------------------------------------- /bin/vorlon: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | require('../Server/server.js') 4 | -------------------------------------------------------------------------------- /build-docker-image.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # get version from package.json 4 | appVersion=$(cat package.json | jq -r '.version') 5 | 6 | # run the docker build command to create the Docker image 7 | echo "Building Docker Vorlon.JS image version $appVersion" 8 | docker build -t vorlonjs/dashboard:$appVersion . 9 | 10 | # run the docker login command to authenticate to the Docker Hub 11 | echo "Logging into the Docker Hub. Account is : $1" 12 | docker login --username="$1" --password="$2" 13 | 14 | # run the docker push command to push the new image to the hub 15 | echo "Pushing the new Vorlon.JS image to the Docker Hub" 16 | docker push vorlonjs/dashboard:$appVersion 17 | 18 | # run the docker logout command to logout from the Docker Hub 19 | echo "Logging out from the Docker Hub" 20 | docker logout 21 | 22 | echo "The image vorlonjs/dashboard:$appVersion has been pushed successfuly to the Docker Hub" 23 | exit 0 -------------------------------------------------------------------------------- /disclaimer.js: -------------------------------------------------------------------------------- 1 | var colors = require('colors'); 2 | 3 | console.log("Building vorlon.js..."); 4 | console.log('Please ignore errors regarding Python and socket.io. This is due to a known issue with socket.io. More info here: https://github.com/socketio/socket.io/issues/1151'.bgYellow); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vorlon", 3 | "version": "0.5.4", 4 | "description": "vorlon", 5 | "main": "Server/server.js", 6 | "engines": { 7 | "node": ">=16.0.0" 8 | }, 9 | "dependencies": { 10 | "body-parser": "^1.20.1", 11 | "colors": "^1.4.0", 12 | "cookie-parser": "^1.4.6", 13 | "cors": "^2.8.5", 14 | "express": "^4.18.2", 15 | "express-session": "^1.17.3", 16 | "fancy-log": "^2.0.0", 17 | "http-proxy": "^1.18.1", 18 | "json": "^11.0.0", 19 | "method-override": "^3.0.0", 20 | "minimist": "^1.2.7", 21 | "mkdirp": "^2.1.3", 22 | "mocha": "^10.2.0", 23 | "multer": "^1.4.5-lts.1", 24 | "passport": "^0.6.0", 25 | "passport-local": "~1.0.0", 26 | "passport-twitter": "~1.0.4", 27 | "socket.io": "^4.6.0", 28 | "stylus": "~0.59.0", 29 | "winston": "~3.8.2", 30 | "winston-logs-display": "~1.0.0", 31 | "xmlhttprequest": "~1.8.0" 32 | }, 33 | "devDependencies": { 34 | "@types/node": "^18.13.0", 35 | "@types/socket.io": "^3.0.2", 36 | "gulp": "^4.0.2", 37 | "gulp-concat": "~2.6.1", 38 | "gulp-filter": "~7.0.0", 39 | "gulp-less": "~5.0.0", 40 | "gulp-mocha": "~8.0.0", 41 | "gulp-rename": "~2.0.0", 42 | "gulp-sourcemaps": "~3.0.0", 43 | "gulp-typescript": "^5.0.1", 44 | "gulp-uglify": "~3.0.2", 45 | "gulp-util": "~3.0.8", 46 | "gulp-webserver": "~0.9.1", 47 | "gulp-zip": "~5.1.0", 48 | "merge2": "~1.4.1", 49 | "typescript": "^4.9.5" 50 | }, 51 | "scripts": { 52 | "global-deploy-gulp": "npm install -g gulp", 53 | "global-deploy-gulp-cli": "npm install -g gulp-cli", 54 | "build-all": "gulp --gulpfile=./gulpfile.js", 55 | "build": "node disclaimer.js && npm run build-all", 56 | "prepublish": "npm run build", 57 | "start": "node ./Server/server.js" 58 | }, 59 | "bin": { 60 | "vorlon": "./bin/vorlon" 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /plugins library/README.md: -------------------------------------------------------------------------------- 1 | # Vorlon.js plugins library 2 | 3 | You will find here all kind of plugins done by the community. 4 | 5 | ## [Wappalyzer](wappalyzerReport) 6 | This plugin uses Wappalyzer to detect "well-known" technologies used in a website implementation. 7 | It is based on script tags (to guess js libs for example), meta tags (to guess CMS), HTTP headers (to guess server type), etc. 8 | 9 | It could be useful for a dashboard connected to several distinct applications, or if some libraries are loaded accordingly to the device the user is running. 10 | -------------------------------------------------------------------------------- /plugins library/wappalyzerReport/control.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
10 |

Technologies Detection

11 | 12 | 13 | 14 | 15 | 16 | 17 |
TechnologyCategories
18 |
19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /plugins library/wappalyzerReport/control.less: -------------------------------------------------------------------------------- 1 | .plugin-wappalyzer { 2 | .app-list { 3 | margin: 20px 10px; 4 | line-height: 20px; 5 | 6 | img { 7 | vertical-align: middle; 8 | } 9 | } 10 | 11 | .wappalyzer-tech-list { 12 | width: 100%; 13 | margin: 20px 0 30px; 14 | 15 | th, 16 | td { 17 | padding: 5px 10px; 18 | text-align: left; 19 | } 20 | 21 | th { 22 | background: #f7f7f7; 23 | border-bottom: 1px solid #ddd; 24 | font-weight: 400; 25 | } 26 | 27 | td { 28 | border-bottom: 1px solid #eee; 29 | } 30 | 31 | th:first-child, 32 | td:first-child { 33 | width: 70%; 34 | } 35 | 36 | th:last-child, 37 | td:last-child { 38 | width: 30%; 39 | font-weight: bold; 40 | text-align: center; 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /plugins library/wappalyzerReport/vorlon.wappalyzerReport.dashboard.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | export class WappalyzerReportDashboard extends DashboardPlugin { 3 | constructor() { 4 | super("wappalyzerReport", "control.html", "control.css"); 5 | this._ready = true; 6 | } 7 | 8 | public getID(): string { 9 | return "WAPPALYZER"; 10 | } 11 | 12 | private _techListTable: HTMLTableElement; 13 | public startDashboardSide(div: HTMLDivElement = null): void { 14 | this._insertHtmlContentAsync(div, (filledDiv) => { 15 | this._techListTable = Tools.QuerySelectorById(div, "techList"); 16 | }) 17 | } 18 | 19 | public onRealtimeMessageReceivedFromClientSide(receivedObject: any): void { 20 | console.log('from client'); 21 | console.log(receivedObject); 22 | 23 | this._techListTable.innerHTML = ''; 24 | for (var i = 0; i < receivedObject.detected.length; i++) { 25 | console.log(receivedObject.detected[i]); 26 | var app = receivedObject.detected[i].app; 27 | 28 | var categories = ''; 29 | for (var j = 0; j < receivedObject.detected[i].categories.length; j++) { 30 | categories += '' + receivedObject.detected[i].categories[j] + ''; 31 | } 32 | 33 | var rowCount = this._techListTable.rows.length; 34 | var row = this._techListTable.insertRow(rowCount); 35 | row.insertCell(0).innerHTML = ' ' + app + ''; 36 | row.insertCell(1).innerHTML = categories; 37 | 38 | }; 39 | } 40 | } 41 | 42 | //Register the plugin with vorlon core 43 | Core.RegisterDashboardPlugin(new WappalyzerReportDashboard()); 44 | } -------------------------------------------------------------------------------- /plugins library/wappalyzerReport/vorlon.wappalyzerReport.interfaces.ts: -------------------------------------------------------------------------------- 1 | module VORLON { 2 | 3 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES5", 4 | "skipLibCheck": true 5 | } 6 | } --------------------------------------------------------------------------------