copy-and-watch icon indicating copy to clipboard operation
copy-and-watch copied to clipboard

--watch not working on file rename?

Open Rechdan opened this issue 4 years ago • 7 comments

I tried to rename a file and got these errors:

(node:20668) UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_ARG_TYPE]: The "from" argument must be of type string. Received undefined
    at validateString (internal/validators.js:120:11)
    at Object.relative (path.js:437:5)
    at findTarget (...\node_modules\copy-and-watch\index.js:40:33)
    at FSWatcher.copy (...\node_modules\copy-and-watch\index.js:60:14)
    at FSWatcher.emit (events.js:315:20)
    at FSWatcher.emitWithAll (...\node_modules\chokidar\index.js:524:8)
    at FSWatcher._emit (...\node_modules\chokidar\index.js:616:8)
    at NodeFsHandler._handleFile (...\node_modules\chokidar\lib\nodefs-handler.js:400:14)
    at NodeFsHandler._addToNodeFs (...\node_modules\chokidar\lib\nodefs-handler.js:628:21)
(node:20668) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:20668) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
internal/validators.js:120
    throw new ERR_INVALID_ARG_TYPE(name, 'string', value);
    ^

TypeError [ERR_INVALID_ARG_TYPE]: The "from" argument must be of type string. Received undefined
    at validateString (internal/validators.js:120:11)
    at Object.relative (path.js:437:5)
    at findTarget (...\node_modules\copy-and-watch\index.js:40:33)
    at FSWatcher.remove (...\node_modules\copy-and-watch\index.js:70:14)
    at FSWatcher.emit (events.js:315:20)
    at ...\node_modules\chokidar\index.js:565:16
    at Map.forEach (<anonymous>)
    at Timeout._onTimeout (...\node_modules\chokidar\index.js:564:30)
    at listOnTimeout (internal/timers.js:549:17)
    at processTimers (internal/timers.js:492:7) {
  code: 'ERR_INVALID_ARG_TYPE'
}

Rechdan avatar Oct 07 '20 22:10 Rechdan

Cannot reproduce.

Maybe you try to rename file in destination folder?

zont avatar Oct 08 '20 08:10 zont

Maybe thats a problem with my node version?

node -v
v12.18.4

And here is the command I used:

copy-and-watch --clean ./src/public/**/*.* ./dist/public

Rechdan avatar Oct 08 '20 12:10 Rechdan

This is not restricted for file rename, simple content updates doesn't work either on Windows. I have encountered the same error, this is most likely due to different separator between MacOS and Windows. After adding a console.log to the findTarget function where the error is thrown the following can be seen:

[build:copy] {
[build:copy]   target: 'build',
[build:copy]   parents: [ 'src/assets' ],
[build:copy]   parent: 'src/assets',     
[build:copy]   from: 'src/assets/styles'
[build:copy] }
[build:copy] {
[build:copy]   target: 'build',
[build:copy]   parents: [ 'src/assets' ],
[build:copy]   parent: 'src/assets',
[build:copy]   from: 'src/assets/styles/main.css'
[build:copy] }
[build:copy] [COPY] src/assets/styles/main.css to build\styles\main.css
[build:copy] [WATCH] src\assets\**\*
[build:copy] {
[build:copy]   target: 'build',
[build:copy]   parents: [ 'src/assets' ],
[build:copy]   parent: undefined,
[build:copy]   from: 'src\\assets\\styles\\main.css'
[build:copy] }
[build:copy] (node:8544) UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_ARG_TYPE]: The "from" argument must be of type string. Received undefined
[build:copy]     at validateString (internal/validators.js:121:11)
[build:copy]     at Object.relative (path.js:437:5)
[build:copy]     at findTarget (C:\Users\attil\code\spreadmonitor\alteo\website\node_modules\copy-and-watch\index.js:41:33)
[build:copy]     at FSWatcher.copy (C:\Users\attil\code\spreadmonitor\alteo\website\node_modules\copy-and-watch\index.js:61:14)
[build:copy]     at FSWatcher.emit (events.js:314:20)
[build:copy]     at FSWatcher.emitWithAll (C:\Users\attil\code\spreadmonitor\alteo\website\node_modules\chokidar\index.js:524:8)
[build:copy]     at FSWatcher._emit (C:\Users\attil\code\spreadmonitor\alteo\website\node_modules\chokidar\index.js:616:8)
[build:copy]     at listener (C:\Users\attil\code\spreadmonitor\alteo\website\node_modules\chokidar\lib\nodefs-handler.js:370:20)
[build:copy] (Use `node --trace-warnings ...` to show where the warning was created)
[build:copy] (node:8544) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not 
handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)[build:copy] (node:8544) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.    

The first two print is from the startup, where the from parameter is not escaped, but then on update I assume the from parameter comes from the watcher library used, what escapes it Windows style so consequent checks will always fail.

A super dirty quick fix to showcase the problem:

const findTarget = from => {
  const parent = parents
    .filter(p => {
      console.log({ p, fromreplaced: from.replace(/\\/g, '/'), from })
      return from.replace(/\\/g, '/').indexOf(p) >= 0;
    })
    .sort()
    .reverse()[0];
  console.log({ target, parents, parent, from });
  return path.join(target, path.relative(parent, from));
};

Replace can be used to fix this, but proably would be better to use path.seprator from Node in path handling to made it platform agnostic.

NoNameProvided avatar Nov 16 '20 03:11 NoNameProvided

any news about this problem? i'm working in windows and the initial copy works fine but the watch shows the error and end the execution For the workaround if I understand I have to replace the internal code of findTarget

nicearma avatar Aug 02 '21 12:08 nicearma

For the workaround if I understand I have to replace the internal code of findTarget

Yes, you can use https://github.com/ds300/patch-package to apply the fix automatically while the fix doesn't land in this repo.

NoNameProvided avatar Aug 16 '21 06:08 NoNameProvided

same issue on linux

ba32107 avatar Oct 23 '22 20:10 ba32107

Currently using this with other package run-when-changed

npx run-when-changed --watch "FolderToWatch/**/*" --exec 'npx copy-and-watch ../FolderToWatch/**/* outputFolder/'

AmitDigga avatar Feb 08 '23 09:02 AmitDigga