diff --git a/packages/core.gbapp/services/GBAPIService.ts b/packages/core.gbapp/services/GBAPIService.ts index 766498f1..db9555a1 100644 --- a/packages/core.gbapp/services/GBAPIService.ts +++ b/packages/core.gbapp/services/GBAPIService.ts @@ -242,78 +242,6 @@ class SysClass { } } - public async findV1(file: string, ...args): Promise { - let token = await this.min.adminService.acquireElevatedToken(this.min.instance.instanceId); - - let client = MicrosoftGraph.Client.init({ - authProvider: done => { - done(null, token); - } - }); - let siteId = process.env.STORAGE_SITE_ID; - let libraryId = process.env.STORAGE_LIBRARY; - const botId = this.min.instance.botId; - const path = `/${botId}.gbai/${botId}.gbdata`; - - try { - let res = await client - .api(`https://graph.microsoft.com/v1.0/sites/${siteId}/lists/${libraryId}/drive/root:${path}:/children`) - .get(); - - // Performs validation. - - let document = res.value.filter(m => { - return m.name.toLowerCase() === file.toLowerCase(); - }); - - if (!document || document.length === 0) { - throw `File '${file}' specified on save GBasic command FIND not found. Check the .gbdata or the .gbdialog associated.`; - } - if (args.length > 1) { - throw `File '${file}' has a FIND call with more than 1 arguments. Check the .gbdialog associated.`; - } - - // Creates workbook session that will be discarded. - - const filter = args[0].split('='); - const columnName = filter[0]; - const value = filter[1]; - let results = await client - .api( - `https://graph.microsoft.com/v1.0/sites/${siteId}/lists/${libraryId}/drive/items/${document[0].id}/workbook/worksheets('Sheet1')/range(address='A1:Z100')` - ) - .get(); - - let columnIndex = 0; - const header = results.text[0]; - for (; columnIndex < header.length; columnIndex++) { - if (header[columnIndex] === columnName) { - break; - } - } - - let foundIndex = 0; - for (; foundIndex < results.text.length; foundIndex++) { - if (results.text[foundIndex][columnIndex] === value) { - break; - } - } - if (foundIndex === results.text.length) { - return null; - } else { - let output = {}; - const row = results.text[foundIndex]; - for (let colIndex = 0; colIndex < row.length; colIndex++) { - output[header[colIndex]] = row[colIndex]; - } - output['line'] = foundIndex + 1; - return output; - } - } catch (error) { - GBLog.error(error); - } - } - public async find(file: string, ...args): Promise { let token = await this.min.adminService.acquireElevatedToken(this.min.instance.instanceId); @@ -365,9 +293,14 @@ class SysClass { } let array = []; + array.push({}); let foundIndex = 0; for (; foundIndex < results.text.length; foundIndex++) { + + // Filter results action. + if (results.text[foundIndex][columnIndex].toLowerCase() === value.toLowerCase()) { + let output = {}; const row = results.text[foundIndex]; for (let colIndex = 0; colIndex < row.length; colIndex++) { diff --git a/packages/core.gbapp/services/GBVMService.ts b/packages/core.gbapp/services/GBVMService.ts index bb284526..2540f67e 100644 --- a/packages/core.gbapp/services/GBVMService.ts +++ b/packages/core.gbapp/services/GBVMService.ts @@ -45,7 +45,7 @@ import { Messages } from '../strings'; import { GBConversationalService } from './GBConversationalService'; //tslint:disable-next-line:no-submodule-imports const vm = require('vm'); -const vb2ts = require('vbscript-to-typescript/dist/converter'); +const vb2ts = require('../../../../vbscript-to-typescript'); const beautify = require('js-beautify').js; var textract = require('textract'); @@ -160,7 +160,7 @@ export class GBVMService extends GBService { id = sys().getRandomId() username = this.getUserName(step); mobile = this.getUserMobile(step); - ubound = (list) => list.length; + ubound = function(list){return list.length}; ${code} `; @@ -369,7 +369,8 @@ export class GBVMService extends GBService { code = code.replace(/this\./gm, 'await this.'); code = code.replace(/function/gm, 'async function'); - + code = code.replace('ubound = async', 'ubound ='); // TODO: Improve this. + return code; } diff --git a/vbscript-to-typescript.js b/vbscript-to-typescript.js new file mode 100644 index 00000000..f519b6b0 --- /dev/null +++ b/vbscript-to-typescript.js @@ -0,0 +1,156 @@ +"use strict"; +exports.__esModule = true; +var fs_1 = require("fs"); +var path = require("path"); +function convertFile(file) { + var extension = path.extname(file); + var withoutExtension = file.substr(0, file.length - extension.length); + var targetFile = withoutExtension + ".ts"; + var baseName = path.basename(file, extension); + var content = fs_1.readFileSync(file, 'utf8'); + var result = convert(content, baseName); + console.log("Writing to \"" + targetFile + "\"..."); + fs_1.writeFileSync(targetFile, result); +} +exports.convertFile = convertFile; +function convert(input, name) { + var result = convertImports(input, name); + return result; +} +exports.convert = convert; +function convertImports(input, name) { + var items = []; + var result = input.replace(//g, function (input, group1, group2) { + var path = group1 || './'; + var file = "" + path + group2; + items.push({ name: group2, path: file }); + return "<%\n" + group2 + "();\n%>"; + }); + result = convertCode(result); + result = convertExpressions(result); + result = convertStrings(result); + result = "\nexport function " + name + "() {\n" + result + "\n}"; + for (var _i = 0, items_1 = items; _i < items_1.length; _i++) { + var item = items_1[_i]; + result = "import {" + item.name + "} from \"" + item.path + "\"\n" + result; + } + return result; +} +exports.convertImports = convertImports; +function convertCode(input) { + var result = input.replace(/<%([^=][\s\S]*?)%>/g, function (input, group1) { + var code = group1; + code = convertComments(code); + code = convertIfStatements(code); + code = convertSwitchStatements(code); + code = convertFunctions(code); + code = convertForStatements(code); + code = convertLoops(code); + code = convertPRec(code); + code = convertPLan(code); + return "<%" + code + "%>"; + }); + return result; +} +exports.convertCode = convertCode; +function convertExpressions(input) { + var result = input.replace(/<%=([\s\S]*?)%>/g, function (input, group1) { + var content = convertPRec(group1); + content = convertPLan(content); + return "${" + content + "}"; + }); + return result; +} +exports.convertExpressions = convertExpressions; +function convertStrings(input) { + var result = input.replace(/%>([\s\S]+?)<%/g, "\nResponse.Write(`$1`);\n"); + // Entire document is a string + if (result.indexOf("<%") === -1) { + result = "Response.Write(`" + result + "`);"; + } + // Start of the document is a string + var firstIndex = result.indexOf("<%"); + if (firstIndex > 0) { + result = "Response.Write(`" + result.substr(0, firstIndex) + "`);\n" + result.substring(firstIndex + 2); + } + result = result.replace(/%>$/, ""); + // End of the document is a string + var lastIndex = result.lastIndexOf("%>"); + if (lastIndex > -1 && lastIndex < result.length - 2) { + result = result.substr(0, lastIndex) + "\nResponse.Write(`" + result.substr(lastIndex + 3) + "`);"; + } + result = result.replace(/^<%/, ""); + return result; +} +exports.convertStrings = convertStrings; +function convertComments(input) { + var result = ''; + var splitted = input.split(/(".*")/gm); + for (var _i = 0, splitted_1 = splitted; _i < splitted_1.length; _i++) { + var part = splitted_1[_i]; + if (part.indexOf("\"") === 0) { + result += part; + } + else { + result += part.replace(/'/g, "//"); + } + } + return result; +} +exports.convertComments = convertComments; +function convertIfStatements(input) { + var result = input.replace(/if +(.*?) +then/g, function (input, group1) { + var condition = convertConditions(group1); + return "\nif (" + condition + ") {\n"; + }); + result = result.replace(/end if/g, "\n}\n"); + result = result.replace(/else(?!{)/g, "\n}\nelse {\n"); + return result; +} +exports.convertIfStatements = convertIfStatements; +function convertSwitchStatements(input) { + var result = input.replace(/select case +(.*)/g, "\nswitch ($1) {\n"); + result = result.replace(/end select/g, "\n}\n"); + return result; +} +exports.convertSwitchStatements = convertSwitchStatements; +function convertFunctions(input) { + var result = input.replace(/function +(.*)\((.*)\)/g, "\n$1 = ($2) => {\n"); + result = result.replace(/end function/g, "\n}\n"); + return result; +} +exports.convertFunctions = convertFunctions; +function convertForStatements(input) { + var result = input.replace(/for +(.*to.*)/g, "\nfor ($1) {\n"); + result = result.replace(/^ *next *$/gm, "}\n"); + return result; +} +exports.convertForStatements = convertForStatements; +function convertConditions(input) { + var result = input.replace(/ +and +/g, " && "); + result = result.replace(/ +or +/g, " || "); + result = result.replace(/ +<> +/g, " !== "); + result = result.replace(/ += +/g, " === "); + return result; +} +exports.convertConditions = convertConditions; +function convertLoops(input) { + var result = input.replace(/do while +(.*)/g, function (input, group1) { + var condition = convertConditions(group1); + return "\nwhile (" + condition + ") {\n"; + }); + + result = result.replace(/^ *loop *$/gm, "}\n"); + return result; +} +exports.convertLoops = convertLoops; +function convertPRec(input) { + var result = input.replace(/(p_rec\("\S+?"\))/g, "$1.Value"); + return result; +} +exports.convertPRec = convertPRec; +function convertPLan(input) { + var result = input.replace(/(l_\S+?)\(p_lan\)/g, "$1[p_lan]"); + return result; +} +exports.convertPLan = convertPLan;