Skip to content
Snippets Groups Projects
qjs-compile.js 2.49 KiB
Newer Older
  • Learn to ignore specific revisions
  • const path = require("path");
    const fs = require("fs");
    
    const qjsDir = path.resolve("./qjs");
    const importRegex = /import .* from "\..*"/g;
    
    const insert = (line, start, end, content) =>
      [line.slice(0, start), content, line.slice(end)].join("");
    
    // find all js files in qjs folder
    const traverse = (dirname) => {
      fs.readdirSync(dirname).forEach((file) => {
        const fp = path.join(dirname, file);
        if (path.extname(fp) === "") traverse(fp);
        if (path.extname(fp) === ".js") {
          // check if has file imports
          const content = fs.readFileSync(fp).toString();
          const found = content.matchAll(importRegex);
          let wasChanged = false;
          const lines =
            found !== null
              ? content.split("\n").map((it) => {
                  const line = it.trim();
                  if (line.includes("import ") && line.includes('./') && !line.includes('.js')) {
                    const fixedLine = insert(
                      line,
                      line.lastIndexOf('"'),
                      line.lastIndexOf('"') + 1,
                      '.js"'
                    );
                    const split = fixedLine.split('"');
                    const importPath = split[split.length - 2];
    
                    const fullImportPath = path.resolve(
                      path.join(dirname, importPath)
                    );
                    const fileExists = fs.existsSync(fullImportPath);
                    const finalFixedLine = fileExists
                      ? fixedLine
                      : insert(line, line.length - 2, line.length - 1, '/index.js"');
    
                    wasChanged = true;
                    return finalFixedLine;
                  }
                  return line;
                })
              : [];
    
          if (wasChanged) {
            console.log("Editing", fp);
            fs.writeFileSync(fp, lines.join("\n"), { encoding: "utf8", flag: "w" });
          }
        }
      });
    };
    
    console.log('\tStarting file traversal')
    traverse(qjsDir);
    
    console.log('\tCreating test file');
    fs.writeFileSync('./qjs/testy.js', `
    import connect from "./index.js";
    
    const run = async () => {
      try {
        print('before connect')
        const usp = await connect({
          host: "iopsys.lan",
          username: "admin",
          password: "admin",
          port: 9001,
          protocol: "ws",
        });
    
        print('after connect')
    
        const res = await usp.get("Device.DeviceInfo.");
        print('get result')
        print(JSON.stringify(res, null, 2))
    
        await usp.disconnect();
        print('after disconnect')
      } catch(err) {
        print("ERROR")
        print(err)
        print(err.stack)
      }
    };
    
    run();
    print('after run');
    `)