From f2e7912f0b4469f3729377ac0a714278871c9bb4 Mon Sep 17 00:00:00 2001 From: polsevev Date: Sat, 24 Feb 2024 22:30:30 +0100 Subject: [PATCH] wow, been a long time since i commited to github :) --- .vscode/settings.json | 17 +- babel | 2 +- bun.lockb | Bin 71883 -> 87525 bytes demo-site/index.html | 19 + .../language/js-transform-lang copy.langium | 18 + .../language/js-transform-lang-validator.ts | 8 +- .../src/language/js-transform-lang.langium | 30 +- dsl_files/test.jstl | 5 +- dsl_files/test_hello.jstl | 19 + output.js | 120 ++++++ package-lock.json | 384 ++++++++++++++++-- package.json | 47 ++- src/babel.config.json | 0 src/data_structures/tree.ts | 72 ++++ src/index.ts | 93 ++++- src/matcher/matcher.ts | 156 +++++++ src/parser/internal_to_js_map.ts | 11 + src/parser/parse.ts | 94 +++-- src/placeholders.js | 2 - src/structurizer.js | 3 - src/test/test_transform.test.ts | 39 ++ src/transform/transform.ts | 92 +++-- src/transform/transformMatch.ts | 94 +++++ test.js | 160 ++++++++ tsconfig.json | 5 +- 25 files changed, 1321 insertions(+), 169 deletions(-) create mode 100644 demo-site/index.html create mode 100644 didactic-chainsaw-dsl/src/language/js-transform-lang copy.langium create mode 100644 dsl_files/test_hello.jstl create mode 100644 output.js create mode 100644 src/babel.config.json create mode 100644 src/data_structures/tree.ts create mode 100644 src/matcher/matcher.ts create mode 100644 src/parser/internal_to_js_map.ts delete mode 100644 src/placeholders.js delete mode 100644 src/structurizer.js create mode 100644 src/test/test_transform.test.ts create mode 100644 src/transform/transformMatch.ts create mode 100644 test.js diff --git a/.vscode/settings.json b/.vscode/settings.json index b396049..c62565e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,10 +1,11 @@ { - // The path to the `bun` executable. - "bun.runtime": "/home/rolfmg/.bun/bin/bun", + // The path to the `bun` executable. + "bun.runtime": "/home/rolfmg/.bun/bin/bun", - // If support for Bun should be added to the default "JavaScript Debug Terminal". - "bun.debugTerminal.enabled": true, - - // If the debugger should stop on the first line of the program. - "bun.debugTerminal.stopOnEntry": true, -} \ No newline at end of file + // If support for Bun should be added to the default "JavaScript Debug Terminal". + "bun.debugTerminal.enabled": true, + + // If the debugger should stop on the first line of the program. + "bun.debugTerminal.stopOnEntry": true, + "cSpell.words": ["babelparser"] +} diff --git a/babel b/babel index 380d186..2f9c48d 160000 --- a/babel +++ b/babel @@ -1 +1 @@ -Subproject commit 380d186b77d32734c595652a40cbda5e4e109c5c +Subproject commit 2f9c48d4eda2d69908fc53ea285f47ed2c540f7e diff --git a/bun.lockb b/bun.lockb index 4d1dedaa626ce1181e23eea8ef449748693cd709..5aaca4db2d03d7fe45806acc42c9ac6447a9c301 100755 GIT binary patch delta 26179 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 RL|G}-*Le8N@>Fs2{~yEr>U;nI delta 14025 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 diff --git a/demo-site/index.html b/demo-site/index.html new file mode 100644 index 0000000..ed0b63f --- /dev/null +++ b/demo-site/index.html @@ -0,0 +1,19 @@ + + + +Page Title + + + + + + +

Demo site

+

+ + + \ No newline at end of file diff --git a/didactic-chainsaw-dsl/src/language/js-transform-lang copy.langium b/didactic-chainsaw-dsl/src/language/js-transform-lang copy.langium new file mode 100644 index 0000000..dcf393c --- /dev/null +++ b/didactic-chainsaw-dsl/src/language/js-transform-lang copy.langium @@ -0,0 +1,18 @@ +grammar JsTransformLang + + +terminal ID: /[_a-zA-Z][\w_]*/; +terminal STRING: /"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/; +entry Model: + proposals+=Proposal*; + + +Proposal: + "proposal" proposalName=ID "{" + "applicable" "to" "{" + code=STRING + "}" + "replace" "with" "{" + code=STRING + "}" + "}"; diff --git a/didactic-chainsaw-dsl/src/language/js-transform-lang-validator.ts b/didactic-chainsaw-dsl/src/language/js-transform-lang-validator.ts index 44e7cc4..9464b33 100644 --- a/didactic-chainsaw-dsl/src/language/js-transform-lang-validator.ts +++ b/didactic-chainsaw-dsl/src/language/js-transform-lang-validator.ts @@ -1,5 +1,5 @@ -import type { ValidationAcceptor, ValidationChecks } from "langium"; -import type { JsTransformLangAstType, Proposal } from "./generated/ast.js"; +import type { ValidationChecks } from "langium"; +import type { JsTransformLangAstType } from "./generated/ast.js"; import type { JsTransformLangServices } from "./js-transform-lang-module.js"; /** @@ -9,7 +9,7 @@ export function registerValidationChecks(services: JsTransformLangServices) { const registry = services.validation.ValidationRegistry; const validator = services.validation.JsTransformLangValidator; const checks: ValidationChecks = { - Proposal: validator.checkPersonStartsWithCapital, + //Person: validator.checkPersonStartsWithCapital, }; registry.register(checks, validator); } @@ -18,6 +18,7 @@ export function registerValidationChecks(services: JsTransformLangServices) { * Implementation of custom validations. */ export class JsTransformLangValidator { + /* checkPersonStartsWithCapital( proposal: Proposal, accept: ValidationAcceptor @@ -31,4 +32,5 @@ export class JsTransformLangValidator { } } } + */ } diff --git a/didactic-chainsaw-dsl/src/language/js-transform-lang.langium b/didactic-chainsaw-dsl/src/language/js-transform-lang.langium index 71cd962..5fd636f 100644 --- a/didactic-chainsaw-dsl/src/language/js-transform-lang.langium +++ b/didactic-chainsaw-dsl/src/language/js-transform-lang.langium @@ -1,18 +1,32 @@ grammar JsTransformLang - -terminal PROPOSALNAME: /[_a-zA-Z]+/; -terminal STRING: /"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/; entry Model: - (proposals+=Proposal); - + (proposals+=Proposal)*; Proposal: - "proposal" "(" proposalName=PROPOSALNAME ")" "{" + 'proposal' name=ID "{" "applicable" "to" "{" - code=STRING + code=RICH_TEXT "}" "replace" "with" "{" - code=STRING + "}" "}"; + +hidden terminal WS: /\s+/; +terminal ID: /[_a-zA-Z][\w_]*/; + +terminal fragment IN_RICH_STRING: + "''" !('«'|"'") + | "'" !('«'|"'"); +//| !('«'|"'"); +terminal STRING: /"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/; +hidden terminal ML_COMMENT: /\/\*[\s\S]*?\*\//; +hidden terminal SL_COMMENT: /\/\/[^\n\r]*/; +terminal RICH_TEXT: "'''" IN_RICH_STRING* ("'''"| ("'" "'"?)? ); +terminal RICH_TEXT_START: "'''" IN_RICH_STRING* ("'" "'"?)? '«'; +terminal RICH_TEXT_END: '»' IN_RICH_STRING* ("'''"| ("'" "'"?)? ); +terminal RICH_TEXT_INBETWEEN: '»' IN_RICH_STRING* ("'" "'"?)? '«'; +terminal COMMENT_RICH_TEXT_INBETWEEN: "««" !('\n'|'\r')* ('\r'? '\n' IN_RICH_STRING* ("'" "'"?)? '«')?; +terminal COMMENT_RICH_TEXT_END: "««" !('\n'|'\r')* (('\r'? '\n' IN_RICH_STRING* ("'''"| ("'" "'"?)? )) ); + diff --git a/dsl_files/test.jstl b/dsl_files/test.jstl index 3d20c5e..b55cb1d 100644 --- a/dsl_files/test.jstl +++ b/dsl_files/test.jstl @@ -1,4 +1,7 @@ -proposal (async) { + + + +proposal async { applicable to { let _$_a_$_ = await _$_expr_$_(); console.log(_$_a_$_); diff --git a/dsl_files/test_hello.jstl b/dsl_files/test_hello.jstl new file mode 100644 index 0000000..ed3b330 --- /dev/null +++ b/dsl_files/test_hello.jstl @@ -0,0 +1,19 @@ +proposal p1 { + applicable to { + "let a = 0;" + } + replace with { + "SOMETHING" + } +} + + +proposal p2 { + applicable to { + "let a = 0;" + } + replace with { + "SOMETHING" + } +} + diff --git a/output.js b/output.js new file mode 100644 index 0000000..3f2d1e0 --- /dev/null +++ b/output.js @@ -0,0 +1,120 @@ +require("@risingstack/trace"); +const Discord = require("discord.js"); +const ytdl = require("ytdl-core"); +const bot = new Discord.Client(); +const fs = new require("fs"); +const path = require("path"); +const probe = require("pmx").probe(); +const jsonfile = require("jsonfile"); +const commandCooldown = require("./helpers/commandCooldown.js"); +let cleverbot = require("cleverbot.io"), + clever = new cleverbot("jp6wu9XZbYdoICmo", "54jV1VcMNxGQyc2cdKUFUpjkPVo3bTr2"); +const log = require("./helpers/log.js"); +bot.on("ready", () => { + bot.user.setGame(".help"); + (function loop(i) { + setTimeout(function () { + bot.guilds.size |> guilds.set(%); + if (true) { + loop(i); + } + }, 1000); + })(10); + log(`Ready to serve ${bot.users.size} users, in ${bot.channels.size} channels of ${bot.guilds.size} servers.`); +}); +fs.readFile("config.json", (err, data) => { + if (err) { + log("Config file does not exist, creating one."); + let obj = { + discordToken: "TOKEN", + discordBotsToken: "TOKEN" + }; + jsonfile.spaces = 4; + jsonfile.writeFile("config.json", obj, err => { + err |> console.log(%); + }); + process.exit(1); + } else { + config = require("./config.json"); + config.discordToken |> bot.login(%); + } +}); +global.skips = {}; +global.queue = { + test: "test" +}; +global.dispatchers = new Map(); +global.connections = new Map(); +global.voices = new Map(); +global.streams = new Map(); +let config = "ERR"; +global.allstreams = 0; +global.counter = probe.counter({ + name: "Streams" +}); +let guilds = probe.metric({ + name: "Guilds" +}); +let userCooldown = new Map(); +bot.commands = new Discord.Collection(); +bot.aliases = new Discord.Collection(); +fs.readdir("./commands/", (err, files) => { + if (err) err |> console.error(%); + log(`Loading a total of ${files.length} commands.`); + files.forEach(f => { + let props = require(`./commands/${f}`); + log(`Loading Command: ${props.info.name}. :ok_hand:`); + bot.commands.set(props.info.name, props); + /* + props.conf.aliases.forEach(alias => { + bot.aliases.set(alias, props.info.name); + }); + */ + }); +}); + +bot.on("message", msg => { + const prefix = "."; + let id = bot.user.id; + let clevername = new RegExp(`^<@!?${id}>`); + if (msg.content.startsWith(prefix)) {} else if (clevername.test(msg.content)) {} else return; + if (msg.author.bot) return; + if (msg.guild) { + if (!queue[msg.guild.id]) { + queue[msg.guild.id] = []; + } + } else return; + let command = msg.content.split(" ")[0].slice(prefix.length); + let params = msg.content.split(" ").slice(1); + //let perms = bot.elevation(msg); + let cmd; + if (!userCooldown.get(msg.author.id)) { + userCooldown.set(msg.author.id, 0); + } + if (bot.commands.has(command)) { + if (!commandCooldown(userCooldown.get(msg.author.id))) { + userCooldown.set(msg.author.id, Date.now()); + cmd = bot.commands.get(command); + } else msg.channel.sendMessage("You're sending commands too quickly!"); + } else if (bot.aliases.has(command)) { + cmd = bot.commands.get(bot.aliases.get(command)); + } + if (cmd) { + cmd.run(bot, msg, params); + } + if (clevername.test(msg.content)) { + msg.author.username + " (" + msg.author.id + ") issued command: " + msg.content |> console.log(%); + let string = msg.content; + string = msg.content.split(" "); + string.shift(); + " " |> string.join(%); + msg.author.username |> clever.setNick(%); + clever.create(function (err, session) { + if (err) log(err); + clever.ask(string, function (err, response) { + if (err) log(err); + msg.channel.sendMessage(response).then(msg => log(`Sent message: ${msg.content}`)).catch(console.error); + }); + }); + } +}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 298c048..1b84bbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "didactic-chainsaw", "dependencies": { + "@babel/core": "^7.23.7", "@babel/generator": "^7.23.0", "@babel/parser": "^7.23.0", "@babel/traverse": "^7.23.0", @@ -16,30 +17,88 @@ "ts-node": "^10.9.1" }, "devDependencies": { + "@babel/plugin-proposal-pipeline-operator": "^7.23.3", "@swc/cli": "^0.1.62", "@types/node": "^20.5.9", "bun-types": "latest", "typescript": "^5.2.2" } }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dependencies": { - "@babel/highlight": "^7.22.13", + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", "dependencies": { - "@babel/types": "^7.23.0", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dependencies": { + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -57,6 +116,42 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", @@ -88,6 +183,55 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", @@ -100,9 +244,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "engines": { "node": ">=6.9.0" } @@ -115,10 +259,31 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", + "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -129,9 +294,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -139,6 +304,37 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-proposal-pipeline-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.23.3.tgz", + "integrity": "sha512-8TDc1vEx+YRaGiF8J8w/XcADaBuqc0RnokaMRrHdX7Vx74WhmxPU8wtM/OHSXvgw45P9tlHS/l0YDpNXwLghmQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-pipeline-operator": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-pipeline-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.23.3.tgz", + "integrity": "sha512-xypNE8ptJ5buVtgAAOZzN3gIV6McZfMA27GMhy70a8auQIxbLW9g/uKsaoWqUHdPJgpsXYjVD+5oDyS6pRvraA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", @@ -153,19 +349,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz", - "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -173,11 +369,11 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -957,6 +1153,37 @@ "node": ">=8" } }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/bun": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/bun/-/bun-1.0.4.tgz", @@ -1031,6 +1258,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001574", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz", + "integrity": "sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -1098,6 +1344,11 @@ "node": ">= 0.6" } }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -1174,6 +1425,11 @@ "node": ">=0.3.1" } }, + "node_modules/electron-to-chromium": { + "version": "1.4.623", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.623.tgz", + "integrity": "sha512-lKoz10iCYlP1WtRYdh5MvocQPWVRoI7ysp6qf18bmeBgR8abE6+I2CsfyNKztRDZvhdWc+krKT6wS7Neg8sw3A==" + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -1183,6 +1439,14 @@ "once": "^1.4.0" } }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -1348,6 +1612,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -1540,6 +1812,17 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/keyv": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", @@ -1633,6 +1916,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", @@ -1733,6 +2021,11 @@ "url": "https://github.com/sponsors/Borewit" } }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -2202,6 +2495,35 @@ "node": ">=14.17" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index 297c2e5..612c499 100644 --- a/package.json +++ b/package.json @@ -1,24 +1,27 @@ { - "name": "didactic-chainsaw", - "module": "index.ts", - "type": "module", - "scripts": { - "run": "bun run src/index.ts", - "watch": "bun --watch src/index.ts" - }, - "devDependencies": { - "@swc/cli": "^0.1.62", - "@types/node": "^20.5.9", - "bun-types": "latest", - "typescript": "^5.2.2" - }, - "dependencies": { - "@babel/generator": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/traverse": "^7.23.0", - "@types/babel-traverse": "^6.25.10", - "babel": "^6.23.0", - "bun": "^1.0.4", - "ts-node": "^10.9.1" - } + "name": "didactic-chainsaw", + "module": "index.ts", + "type": "module", + "scripts": { + "": "bun run src/index.ts", + "watch": "bun --watch src/index.ts" + }, + "devDependencies": { + "@babel/plugin-proposal-pipeline-operator": "^7.23.3", + "@swc/cli": "^0.1.62", + "@types/node": "^20.5.9", + "bun-types": "latest", + "typescript": "^5.2.2" + }, + "dependencies": { + "@babel/core": "^7.23.7", + "@babel/generator": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/traverse": "^7.23.0", + "@types/babel-traverse": "^6.25.10", + "@types/babel__traverse": "^7.20.5", + "babel": "^6.23.0", + "bun": "^1.0.4", + "ts-node": "^10.9.1" + } } diff --git a/src/babel.config.json b/src/babel.config.json new file mode 100644 index 0000000..e69de29 diff --git a/src/data_structures/tree.ts b/src/data_structures/tree.ts new file mode 100644 index 0000000..283e6e6 --- /dev/null +++ b/src/data_structures/tree.ts @@ -0,0 +1,72 @@ +import * as babelparser from "@babel/parser"; + +import traverse from "@babel/traverse"; +import * as t from "@babel/types"; +import { PairedNodes } from "../matcher/matcher"; + +export class TreeNode { + public parent: TreeNode | null; + public element: T; + public children: TreeNode[] = []; + + constructor(parent: TreeNode | null, element: T) { + this.parent = parent; + this.element = element; + if (this.parent) this.parent.children.push(this); + } +} + +export const makeTree = ( + ast: babelparser.ParseResult +): TreeNode | undefined => { + let last: TreeNode | null = null; + + let first: TreeNode | null = null; + traverse(ast, { + enter(path: any) { + //console.log(path.node); + //console.log("Entered: ", path.node.type); + + let node: TreeNode = new TreeNode( + last, + path.node as t.Node + ); + + if (last == null) { + first = node; + } + last = node; + }, + exit(path: any) { + if (last && last?.element?.type != "Program") { + last = last.parent; + } + }, + }); + //console.log(first.children); + + if (first != null) { + return first; + } else { + return undefined; + } +}; +export const showTree = (tree: TreeNode, idents: number = 0) => { + console.log(" ".repeat(idents) + tree.element?.type); + tree.children.forEach((child) => { + showTree(child, idents + 1); + }); +}; +export const showTreePaired = ( + tree: TreeNode, + idents: number = 0 +) => { + console.log( + " ".repeat(idents), + tree.element.aplToNode.type, + tree.element.codeNode.type + ); + tree.children.forEach((child) => { + showTreePaired(child, idents + 1); + }); +}; diff --git a/src/index.ts b/src/index.ts index 677e837..f4f2bc3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,36 +1,101 @@ -import * as babelparser from "../babel/packages/babel-parser"; -import { parseApplicableTo } from "./parser/parse"; +//import * as babelparser from "../babel/packages/babel-parser"; +import * as babelparser from "@babel/parser"; +//import core from "../babel/packages/babel-core"; +import { parse_with_plugins } from "./parser/parse"; import { TransformRecipe, transform } from "./transform/transform"; /* proposal await_to_promise { applicable to { let a = await b(); - <> + <> } transform to { b().then((a) => { - console.log(a); + <> }) } } */ -const transformExample:TransformRecipe = { - applicableTo: `let a = await b();<>`, - consumeBlock: true, - identifiers: ["b", "a", "rest"], - transformTo: "b().then((a) => {<>})" +/* +// Status quo +var minLoc = Object.keys( grunt.config( "uglify.all.files" ) )[ 0 ]; + +// With pipes +var minLoc = grunt.config('uglify.all.files') |> Object.keys(%)[0]; + + +proposal pipeline_simple{ + applicable to { + var minLoc = Object.keys( grunt.config( "uglify.all.files" ) )[ 0 ]; + } + + transform to { + var minLoc = grunt.config('uglify.all.files') |> Object.keys(%)[0]; + } } -const code = "let a = await b(); console.log(a);" -const main = (): void => { - transform(transformExample, code); +*/ - +/* - +an example of what this will hit: +Unary function calls test(1); + +proposal pipeline_simple{ + applicable to { + <>(<>); + console.log(<>) + } + + transform to { + b |> a(%); + } +} + +*/ + +const transformExample: TransformRecipe = { + applicableTo: `<
>(<>);`, + transformTo: "b |> a(%)", +}; +const code = + "a(something);a(1+1);something(some_other_thing + 1 + 10 + 100); console.log(a)"; + +// Expected outcome: 3 correct matches +const secondTransformExample: TransformRecipe = { + applicableTo: `<>.<>(<>);`, + transformTo: "c |> a.b(%);", +}; +const code2 = `console.log(a);something.sometingOther(b(c));some.thing(1+1);a(b)`; + +// Expected outcome: 1 correct match +const thirdTransformExample: TransformRecipe = { + applicableTo: `myFunction(<>)`, + transformTo: `a |> myFunction(%)`, +}; +const code3 = `myFunction(a);otherFunction(a); myFunction.otherfunction(a)`; + +// Expected outcome: 3 correct matches +const simpleTransformExample: TransformRecipe = { + applicableTo: `<>.<>(<>)`, + transformTo: `something |> a.b(%)`, +}; + +const test: TransformRecipe = { + applicableTo: "let <> = 0;", + transformTo: "if (true) {console.log(<>)};", +}; +const path = "../test.js"; +const file = Bun.file(path); +const codeFromFile = await file.text(); +const main = async () => { + await Bun.write( + "../output.js", + transform(simpleTransformExample, codeFromFile) + ); }; main(); diff --git a/src/matcher/matcher.ts b/src/matcher/matcher.ts new file mode 100644 index 0000000..f3e9925 --- /dev/null +++ b/src/matcher/matcher.ts @@ -0,0 +1,156 @@ +import * as t from "@babel/types"; + +import * as babelparser from "@babel/parser"; +import { TreeNode, makeTree, showTree } from "../data_structures/tree"; +import { InternalDSLVariable } from "../parser/parse"; + +const keys_to_ignore = ["loc", "start", "end", "type"]; + +export interface MatchedTreeNode { + aplToNode: TreeNode; + codeNode: TreeNode; +} + +export interface PairedNodes { + aplToNode: t.Node; + codeNode: t.Node; +} + +export function runMatch( + code: TreeNode, + applicableTo: TreeNode, + internals: Map +): TreeNode[] { + let matches: TreeNode[] = []; + + function checkDSLInternals(code_node: t.Node, aplTo: t.Node): boolean { + if (aplTo.type == "Identifier" && internals.has(aplTo.name)) { + let dsl_types = internals.get(aplTo.name)?.type ?? []; + + for (const dsl_type of dsl_types) { + if (dsl_type == "Expression") { + if ( + code_node.type.includes("Expression") || + code_node.type == "StringLiteral" + ) { + return true; + } + } else if (dsl_type == "") { + if ( + code_node.type == "Identifier" && + aplTo.type == "Identifier" + ) { + return true; + } + } else if (dsl_type == "Identifier") { + if (code_node.type == "Identifier") { + return true; + } + } + } + } + return false; + } + + function match( + code: TreeNode, + applicableTo: TreeNode + ): boolean { + if (code.element.type == "Program") { + code.children.forEach((code_child) => { + match(code_child, applicableTo); + }); + } + + // This is a bit wierd, as we currently do not support having ApplicableTo be multiple statements + if (applicableTo.element.type == "Program") { + match(code, applicableTo.children[0]); + } + + let node_matches = checkCodeNode(code.element, applicableTo.element); + + //If element matches DSL internals, we return right away and ignore the contents + if (checkDSLInternals(code.element, applicableTo.element)) { + return true; + } + + if (node_matches) { + if (applicableTo.children.length != code.children.length) { + return false; + } + for (let i = 0; i < applicableTo.children.length; i++) { + //Verify we can actually do a match + if (!match(code.children[i], applicableTo.children[i])) { + return false; + } + } + return true; + } else { + for (let code_child of code.children) { + //Avoid matching on single identifier + if (code_child.element.type == "Identifier") { + continue; + } + if (match(code_child, applicableTo)) { + matches.push(code_child); + } + } + return false; + } + } + match(code, applicableTo); + console.log(matches.length); + + return matches + .map((match) => pairMatch(match, applicableTo)) + .filter((match) => match != null); +} + +function pairMatch( + match: TreeNode, + aplTo: TreeNode +): TreeNode | null { + if (aplTo.element.type == "Program") { + return pairMatch(match, aplTo.children[0]); + } + try { + let node: TreeNode = new TreeNode(null, { + codeNode: match.element, + aplToNode: aplTo.element, + }); + + for (let i = 0; i < aplTo.children.length; i++) { + let child = pairMatch(match.children[i], aplTo.children[i]); + child.parent = node; + node.children.push(child); + } + + return node; + } catch (exception) { + return null; + } +} + +function checkCodeNode(code_node: t.Node, aplTo: t.Node): boolean { + if (code_node.type != aplTo.type) { + return false; + } + + //If not an internal DSL variable, gotta verify that the identifier is the same + if (code_node.type === "Identifier" && aplTo.type === "Identifier") { + if (code_node.name != aplTo.name) { + return false; + } + } + for (let key of Object.keys(aplTo)) { + if (key in keys_to_ignore) { + continue; + } + + if (!Object.keys(code_node).includes(key)) { + return false; + } + } + + return true; +} diff --git a/src/parser/internal_to_js_map.ts b/src/parser/internal_to_js_map.ts new file mode 100644 index 0000000..84853c8 --- /dev/null +++ b/src/parser/internal_to_js_map.ts @@ -0,0 +1,11 @@ + +import * as t from "@babel/types"; + + +export interface InternalJsMap{ + CallExpression: +} + + + + diff --git a/src/parser/parse.ts b/src/parser/parse.ts index 4672a77..1ba7491 100644 --- a/src/parser/parse.ts +++ b/src/parser/parse.ts @@ -1,50 +1,78 @@ +import * as babelparser from "@babel/parser"; -// This needs to support multiple commands in future +import * as t from "@babel/types"; -export interface Command{ - commandName: string, - commandIdentifier: string, +export interface InternalDSLVariable { + type: string[]; + dsl_name: string; } -export interface ApplicableToResult{ - commands: Command[], - applicableTo: string, +export interface InternalParseResult { + internals: Map; + cleanedJS: string; } -export function parseApplicableTo(applicableTo:string) :ApplicableToResult { +export function parseInternal(applicableTo: string): InternalParseResult { + let lastChar: null | string = null; + let inDslParseMode = false; - let applicableToIter = applicableTo[Symbol.iterator](); + let inDslParseString = ""; - let applicableToOut = ""; + let internalParseResult: InternalParseResult = { + internals: new Map(), + cleanedJS: "", + }; - let commands:Command[] = []; - let curCommandName = ""; - let curCommandIdentifier = ""; - - let nextIter; - while(!(nextIter = applicableToIter.next()).done){ - if (nextIter.value === "<" && applicableToIter.next().value === "<") { - let commandChar; - let commandName = ""; - - while((commandChar = applicableToIter.next()).value != ":"){ - commandName += commandChar.value; + for (let char of applicableTo) { + if (inDslParseMode) { + if (char == ">" && lastChar == ">") { + //remove first closing > + inDslParseString = inDslParseString.slice(0, -1); + let { identifier, type, replaceWith } = + parseInternalString(inDslParseString); + internalParseResult.cleanedJS += replaceWith; + internalParseResult.internals.set("___" + identifier, { + type: type, + dsl_name: identifier, + }); + inDslParseString = ""; + inDslParseMode = false; + continue; } - let commandIdentifier = ""; - - while((commandChar = applicableToIter.next()).value != ">"){ - commandIdentifier += commandChar.value; + inDslParseString += char; + } else { + if (char == "<" && lastChar == "<") { + //Remove previous < + internalParseResult.cleanedJS = + internalParseResult.cleanedJS.slice(0, -1); + inDslParseMode = true; + continue; } - let _ = applicableToIter.next(); - - commands.push({commandIdentifier, commandName}); - }else{ - applicableToOut += nextIter.value; + internalParseResult.cleanedJS += char; } + + lastChar = char; } - return {applicableTo:applicableToOut, commands}; - + return internalParseResult; +} + +function parseInternalString(dslString: string) { + let splitted = dslString.split(":"); + + return { + identifier: splitted[0], + type: splitted.length > 1 ? splitted[1].split("|") : [""], + replaceWith: "___" + splitted[0], + }; +} + +export function parse_with_plugins( + code: string +): babelparser.ParseResult { + return babelparser.parse(code, { + plugins: [["pipelineOperator", { proposal: "hack", topicToken: "%" }]], + }); } diff --git a/src/placeholders.js b/src/placeholders.js deleted file mode 100644 index 139597f..0000000 --- a/src/placeholders.js +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/src/structurizer.js b/src/structurizer.js deleted file mode 100644 index b28b04f..0000000 --- a/src/structurizer.js +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/test/test_transform.test.ts b/src/test/test_transform.test.ts new file mode 100644 index 0000000..42cb5d7 --- /dev/null +++ b/src/test/test_transform.test.ts @@ -0,0 +1,39 @@ +import { expect, test } from "bun:test"; +import { TransformRecipe, transform } from "../transform/transform"; + +const transformExample: TransformRecipe = { + applicableTo: `<>(<>);`, + transformTo: "b |> a(%)", +}; +const code = + "a(something);a(1+1);something(some_other_thing + 1 + 10 + 100); console.log(a)"; + +test("Test code: " + code + " on " + transformExample.applicableTo, () => { + expect(transform(transformExample, code).length).toBe( + "something |> a(%);1 + 1 |> a(%);some_other_thing + 1 + 10 + 100 |> something(%);console.log(a);" + ); +}); +// Expected outcome: 3 correct matches +const secondTransformExample: TransformRecipe = { + applicableTo: `<>.<>(<>);`, + transformTo: "c |> a.b(%);", +}; +const code2 = `console.log(a);something.sometingOther(b(c));some.thing(1+1); a(b)`; +test( + "Test code: " + code2 + " on " + secondTransformExample.applicableTo, + () => { + expect(transform(secondTransformExample, code2).length).toBe(3); + } +); +// Expected outcome: 1 correct match +const thirdTransformExample: TransformRecipe = { + applicableTo: `myFunction(<>)`, + transformTo: `a |> myFunction(%)`, +}; +const code3 = `myFunction(a);otherFunction(a); myFunction.otherfunction(a)`; +test( + "Test code: " + code3 + " on " + thirdTransformExample.applicableTo, + () => { + expect(transform(thirdTransformExample, code3)).toBe(``); + } +); diff --git a/src/transform/transform.ts b/src/transform/transform.ts index 6d4e4cf..7a09027 100644 --- a/src/transform/transform.ts +++ b/src/transform/transform.ts @@ -1,50 +1,60 @@ - -import * as babelparser from "@babel/parser"; import traverse from "@babel/traverse"; import * as t from "@babel/types"; - -import { parseApplicableTo } from "../parser/parse"; -export interface TransformRecipe{ - applicableTo: string, - identifiers: string[], - consumeBlock: boolean, - transformTo: string, +import generate from "@babel/generator"; +import { parseInternal, parse_with_plugins } from "../parser/parse"; +import { + TreeNode, + makeTree, + showTree, + showTreePaired, +} from "../data_structures/tree"; +import { runMatch } from "../matcher/matcher"; +import { transformMatch, transformer } from "./transformMatch"; +export interface TransformRecipe { + applicableTo: string; + transformTo: string; } -export function transform(recipe: TransformRecipe, code:string){ - - let {commands, applicableTo} = parseApplicableTo(recipe.applicableTo); - - - //console.log(applicableTo); +export function transform(recipe: TransformRecipe, code: string) { + let { internals, cleanedJS } = parseInternal(recipe.applicableTo); + let codeAST = parse_with_plugins(code); + let codeTree = makeTree(codeAST); + let applicabelToAST = parse_with_plugins(cleanedJS); + let applicableToTree = makeTree(applicabelToAST); + let transformTo = parse_with_plugins(recipe.transformTo); + let transformToTree = makeTree(transformTo); - let applicableToAST = babelparser.parse(applicableTo, {allowAwaitOutsideFunction: true}); - console.log(applicableToAST); + console.log(); - let codeAST = babelparser.parse(code, {allowAwaitOutsideFunction: true}); - console.log(codeAST); + if ( + codeTree == undefined || + applicableToTree == undefined || + transformToTree == undefined + ) { + throw new Error("This no worky LOL"); + } + let matches = runMatch(codeTree, applicableToTree, internals); - - - traverse(applicableToAST, { - enter(path:any) { - traverse(codeAST, { - enter(codePath:any){ - if (codePath.node.type === "Program"){ - return; - } - if (codePath.node.type === path.node.type){ - console.log("We found a match with"); - console.log(codePath.node); - - } - } - }) + for (let match of matches) { + //console.log(transformToTree.element); + let output = structuredClone(transformToTree.element); + try { + transformer(match, transformToTree, output, codeAST); + } catch (error) { + console.log("We failed to transform an element!"); } - }) + //let result = generate(transformToTreeClone.element); + //console.log(output); + console.log(generate(match.element.codeNode).code, "is turned into:"); + console.log(generate(output, { topicToken: "%" }).code); + //console.log(generate(codeAST, { topicToken: "%" }).code); + console.log("\n"); + } + + console.log("Final generated code: \n"); + + let output = generate(codeAST, { topicToken: "%" }).code; + //showTree(transformToTree); + + return output; } - - - - - diff --git a/src/transform/transformMatch.ts b/src/transform/transformMatch.ts new file mode 100644 index 0000000..3d8b3d8 --- /dev/null +++ b/src/transform/transformMatch.ts @@ -0,0 +1,94 @@ +import * as t from "@babel/types"; + +import * as babelparser from "@babel/parser"; + +import { + TreeNode, + makeTree, + showTree, + showTreePaired, +} from "../data_structures/tree"; +import { InternalDSLVariable } from "../parser/parse"; +import { MatchedTreeNode, PairedNodes } from "../matcher/matcher"; +import traverse from "@babel/traverse"; + +export function transformer( + match: TreeNode, + trnTo: TreeNode, + output: t.Node, + inputCode: t.Node +) { + transformMatch(match, trnTo, output); + + if (output.type == "Program") { + output = output.body[0]; + } + traverse(inputCode, { + enter(path) { + if (path.node === match.element.codeNode) { + console.log("We did stuffs?"); + path.replaceWith(output); + } + }, + }); +} + +export function transformMatch( + match: TreeNode, + trnTo: TreeNode, + output: t.Node +) { + if (trnTo.element.type == "Program") { + return transformMatch(match, trnTo.children[0], output); + } + + let isMatch = matchNode(match.element.aplToNode, trnTo.element); + if (isMatch) { + if (trnTo.element.type == "Identifier") { + traverse(output, { + enter(path) { + if (path.isIdentifier({ name: trnTo.element.name })) { + //console.log(match.element.codeNode); + if (match.element.codeNode) { + path.replaceWith(match.element.codeNode); + } + } + }, + }); + } + } else { + for (let match_child of match.children) { + transformMatch(match_child, trnTo, output); + } + for (let trnTo_child of trnTo.children) { + transformMatch(match, trnTo_child, output); + } + } +} + +function matchNode(aplTo: t.Node, trnTo: t.Node): boolean { + //console.log(trnTo); + + if (trnTo.type == "Identifier" && aplTo.type == "Identifier") { + let aplToName = washName(aplTo.name); + let trnToName = trnTo.name; + if (aplToName == trnToName) { + return true; + } + } else if (trnTo.type == "Identifier" && aplTo.type == "Identifier") { + let aplToName = washName(aplTo.name); + let trnToName = trnTo.name; + + if (aplToName == trnToName) { + return true; + } + } + return false; +} + +function washName(name: string): string { + if (name.startsWith("___")) { + return name.slice(3); + } + return name; +} diff --git a/test.js b/test.js new file mode 100644 index 0000000..aa92a51 --- /dev/null +++ b/test.js @@ -0,0 +1,160 @@ +require("@risingstack/trace"); +const Discord = require("discord.js"); +const ytdl = require("ytdl-core"); +const bot = new Discord.Client(); +const fs = new require("fs"); +const path = require("path"); +const probe = require("pmx").probe(); +const jsonfile = require("jsonfile"); +const commandCooldown = require("./helpers/commandCooldown.js"); +let cleverbot = require("cleverbot.io"), + clever = new cleverbot( + "jp6wu9XZbYdoICmo", + "54jV1VcMNxGQyc2cdKUFUpjkPVo3bTr2" + ); + +const log = require("./helpers/log.js"); + +bot.on("ready", () => { + bot.user.setGame(".help"); + + (function loop(i) { + setTimeout(function () { + guilds.set(bot.guilds.size); + if (true) { + loop(i); + } + }, 1000); + })(10); + + log( + `Ready to serve ${bot.users.size} users, in ${bot.channels.size} channels of ${bot.guilds.size} servers.` + ); +}); + +fs.readFile("config.json", (err, data) => { + if (err) { + log("Config file does not exist, creating one."); + + let obj = { + discordToken: "TOKEN", + discordBotsToken: "TOKEN", + }; + + jsonfile.spaces = 4; + jsonfile.writeFile("config.json", obj, (err) => { + console.log(err); + }); + process.exit(1); + } else { + config = require("./config.json"); + + bot.login(config.discordToken); + } +}); + +global.skips = {}; +global.queue = { + test: "test", +}; + +global.dispatchers = new Map(); +global.connections = new Map(); +global.voices = new Map(); +global.streams = new Map(); + +let config = "ERR"; + +global.allstreams = 0; +global.counter = probe.counter({ + name: "Streams", +}); +let guilds = probe.metric({ + name: "Guilds", +}); + +let userCooldown = new Map(); + +bot.commands = new Discord.Collection(); +bot.aliases = new Discord.Collection(); +fs.readdir("./commands/", (err, files) => { + if (err) console.error(err); + log(`Loading a total of ${files.length} commands.`); + files.forEach((f) => { + let props = require(`./commands/${f}`); + log(`Loading Command: ${props.info.name}. :ok_hand:`); + bot.commands.set(props.info.name, props); + /* + props.conf.aliases.forEach(alias => { + bot.aliases.set(alias, props.info.name); + }); + */ + }); +}); + +bot.on("message", (msg) => { + const prefix = "."; + + let id = bot.user.id; + let clevername = new RegExp(`^<@!?${id}>`); + + if (msg.content.startsWith(prefix)) { + } else if (clevername.test(msg.content)) { + } else return; + if (msg.author.bot) return; + + if (msg.guild) { + if (!queue[msg.guild.id]) { + queue[msg.guild.id] = []; + } + } else return; + + let command = msg.content.split(" ")[0].slice(prefix.length); + let params = msg.content.split(" ").slice(1); + //let perms = bot.elevation(msg); + let cmd; + + if (!userCooldown.get(msg.author.id)) { + userCooldown.set(msg.author.id, 0); + } + + if (bot.commands.has(command)) { + if (!commandCooldown(userCooldown.get(msg.author.id))) { + userCooldown.set(msg.author.id, Date.now()); + cmd = bot.commands.get(command); + } else msg.channel.sendMessage("You're sending commands too quickly!"); + } else if (bot.aliases.has(command)) { + cmd = bot.commands.get(bot.aliases.get(command)); + } + if (cmd) { + cmd.run(bot, msg, params); + } + + if (clevername.test(msg.content)) { + console.log( + msg.author.username + + " (" + + msg.author.id + + ") issued command: " + + msg.content + ); + + let string = msg.content; + string = msg.content.split(" "); + string.shift(); + string.join(" "); + + clever.setNick(msg.author.username); + + clever.create(function (err, session) { + if (err) log(err); + clever.ask(string, function (err, response) { + if (err) log(err); + msg.channel + .sendMessage(response) + .then((msg) => log(`Sent message: ${msg.content}`)) + .catch(console.error); + }); + }); + } +}); diff --git a/tsconfig.json b/tsconfig.json index 3c12a82..19d03b7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,12 +3,13 @@ "rootDir": "src", "outDir": "dist", "strict": true, - "target": "es6", + "target": "es2017"17", "module": "commonjs", "sourceMap": true, "esModuleInterop": true, "moduleResolution": "node", "types": ["bun-types"] }, - "include": ["src", "babel/packages/babel-parser"] + "include": ["src"], + "exclude": ["babel"] }