ioBroker / ioBroker.javascript

Script engine for JavaScript and Blockly
MIT License
325 stars 120 forks source link

[Bug]: `mkdtemp` && `rm` from `node:fs` is not a function. Used to work outside ioBroker folders tree. #1528

Closed PeterVoronov closed 6 months ago

PeterVoronov commented 6 months ago

I'm sure that

Script type

JavaScript

The problem

From version v7.10.2 this functions from the node:fs is not availabe.

This simple code doesn't work with mkdtemp and mkdtempSync:

// @ts-ignore
const nodeOS = require('node:os');
// @ts-ignore
const nodeFS = require('node:fs');
// @ts-ignore
const nodePath = require('node:path');

/*** Test node:fs mkdtemp ***/
nodeFS.mkdtemp(nodePath.join(nodeOS.tmpdir(), 'test'), (err, tmpDirectory) => {
  if (err) {
    log(`mkdtemp: Can't create temporary directory! Error: '${JSON.stringify(err)}'.`);
  } else {
    log(`mkdtemp: Temporary directory '${tmpDirectory}' created.`);
    nodeFS.rm(tmpDirectory, {recursive: true, force: true}, (err) => {
      if (err)  {
        log(`rm: Can't remove temporary directory '${tmpDirectory}'! Error: '${JSON.stringify(err)}'.`)
      }
      else {
        log(`rm: Temporary directory '${tmpDirectory}' removed.`);
      }
    });
  }
});

/*** Test node:fs mkdir ***/
let tmpDirectory123 = nodePath.join(nodeOS.tmpdir(), 'test123');
nodeFS.mkdir(tmpDirectory123, (err) => {
  if (err) {
    log(`mkdir: Can't create temporary directory '${tmpDirectory123}'! Error: '${JSON.stringify(err)}'.`);
  } else {
    log(`mkdir: Temporary directory '${tmpDirectory123}' created.`);
    nodeFS.rm(tmpDirectory123, {recursive: true, force: true}, (err) => {
      if (err)  {
        log(`rm: Can't remove temporary directory '${tmpDirectory123}'! Error: '${JSON.stringify(err)}'.`)
      }
      else {
        log(`rm: Temporary directory '${tmpDirectory123}' removed.`);
      }
    });
  }
});

/*** Test node:fs mkdtempSync ***/
let tmpDirectorySync;
try {
  tmpDirectorySync = nodeFS.mkdtempSync(nodePath.join(nodeOS.tmpdir(), 'test'));
  console.log(`mkdtempSync: Temporary directory '${tmpDirectorySync}' created.`);
} catch (err) {
  console.error(`mkdtempSync: Can't create temporary directory '${tmpDirectorySync}'! Error: '${JSON.stringify(err)}'.`);
  tmpDirectorySync = undefined
}
if (tmpDirectorySync) {
  try {
    nodeFS.rmSync(tmpDirectorySync, {recursive: true, force: true});
    console.log(`rmSync: Temporary directory '${tmpDirectorySync}' removed.`);
  } catch (err) {
    console.error(`rmSync: Can't remove temporary directory '${tmpDirectorySync}'! Error: '${JSON.stringify(err)}'.`);
    tmpDirectorySync = undefined
  }
}

/*** Test node:fs mkdirSync ***/
let tmpDirectory456 = nodePath.join(nodeOS.tmpdir(), 'test456');
try {
  nodeFS.mkdirSync(tmpDirectory456);
  console.log(`mkdirSync: Temporary directory '${tmpDirectory456}' created.`);
} catch (err) {
  console.error(`mkdirSync: Can't create temporary directory '${tmpDirectory456}'! Error: '${JSON.stringify(err)}'.`);
  tmpDirectory456 = undefined
}
if (tmpDirectory456) {
  try {
    nodeFS.rmSync(tmpDirectory456, {recursive: true, force: true});
    console.log(`rmSync: Temporary directory '${tmpDirectory456}' removed.`);
  } catch (err) {
    console.error(`rmSync: Can't remove temporary directory '${tmpDirectory456}'! Error: '${JSON.stringify(err)}'.`);
    tmpDirectory456 = undefined
  }
}

The current behavior is on next field (log). Expected behaviour is (after roll-back to v7.9.4):

nfo: javascript.0 (140158) Start javascript script.js.Test.mkdtemp
info: javascript.0 (140158) script.js.Test.mkdtemp: mkdtempSync: Temporary directory '/tmp/testx5HgEW' created.
info: javascript.0 (140158) script.js.Test.mkdtemp: rmSync: Temporary directory '/tmp/testx5HgEW' removed.
info: javascript.0 (140158) script.js.Test.mkdtemp: mkdirSync: Temporary directory '/tmp/test456' created.
info: javascript.0 (140158) script.js.Test.mkdtemp: rmSync: Temporary directory '/tmp/test456' removed.
info: javascript.0 (140158) script.js.Test.mkdtemp: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
info: javascript.0 (140158) script.js.Test.mkdtemp: mkdtemp: Temporary directory '/tmp/testGIKnjQ' created.
info: javascript.0 (140158) script.js.Test.mkdtemp: mkdir: Temporary directory '/tmp/test123' created.
info: javascript.0 (140158) script.js.Test.mkdtemp: rm: Temporary directory '/tmp/testGIKnjQ' removed.
info: javascript.0 (140158) script.js.Test.mkdtemp: rm: Temporary directory '/tmp/test123' removed.

iobroker.current.log (in debug mode!)

info: javascript.0 (270665) Start javascript script.js.Test.mkdtemp info: javascript.0 (270665) script.js.Test.mkdtemp: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions error: javascript.0 (270665) script.js.Test.mkdtemp: TypeError: nodeFS.mkdtemp is not a function error: javascript.0 (270665) at script.js.Test.mkdtemp:10:8 error: javascript.0 (270665) at script.js.Test.mkdtemp:84:3

and if mkdtemp is commented:

info: javascript.0 (270665) Start javascript script.js.Test.mkdtemp error: javascript.0 (270665) script.js.Test.mkdtemp: mkdtempSync: Can't create temporary directory 'undefined'! Error: '{}'. info: javascript.0 (270665) script.js.Test.mkdtemp: mkdirSync: Temporary directory '/tmp/test456' created. error: javascript.0 (270665) script.js.Test.mkdtemp: rmSync: Can't remove temporary directory '/tmp/test456'! Error: '{}'. info: javascript.0 (270665) script.js.Test.mkdtemp: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions info: javascript.0 (270665) script.js.Test.mkdtemp: mkdir: Temporary directory '/tmp/test123' created. error: javascript.0 (270665) script.js.Test.mkdtemp: TypeError: nodeFS.rm is not a function error: javascript.0 (270665) at script.js.Test.mkdtemp:35:12

Version of nodejs

v18.19.1

Version of ioBroker js-controller

5.0.19

Version of adapter

v7.10.2 and v7.11 and v.7.11.1