Не могу получить абсолютный путь в Node JS, import {...} from "path"

Почему комбинация с двумя слешами спереди //path в пути не разрешается?

const path1 = '/a//b\\c'
const path2 = '//a//b\\c' // ???
const path3 = '///a//b\\c'
const path4 = 'C:/a//b\\c'
const path5 = 'C://a//b\\c'
const path6 = 'C:///a//b\\c'

Вот что мне выдает консоль при использовании normalize и resolve:

import { normalize, resolve } from 'path'

console.log(normalize(path1)) ... path6
// \a\b\c
// \\a\b\c ???
// \a\b\c
// C:\a\b\c
// C:\a\b\c
// C:\a\b\c

console.log(resolve(path1)) ... path6

// C:\a\b\c
// \\a\b\c ???
// C:\a\b\c
// C:\a\b\c
// C:\a\b\c
// C:\a\b\c

В обоих случаях остается 2 слеша и путь не приводится к абсолютному.

Еще интересней выдает parse

console.log(parse(path2))
// { root: '//a//b\\', dir: '//a//b\\', base: 'c', ext: '', name: 'c' }

console.log(parse(resolve(path2)))
// {
//   root: '\\\\a\\b\\',
//   dir: '\\\\a\\b\\',
//   base: 'c',
//   ext: '',
//   name: 'c'
// }

Платформа Windows
Node -v v12.16.1


Ответы (1 шт):

Автор решения: Alexander Lonberg

Пути начинающиеся с двойного слеша и имеющие минимально 2 сегмента //server/share, зарезервированы в качестве абсолютного пути в формате UNC.

Краткая справка UNC_в_Windows.
Примеры path в Windows.

Два сегмента пути указывают на:

  • server - имя сервера(компьютера)
  • share - имя общей папки

Модуль path вычисляет путь в зависимости от формата полученного аргумента:

import { parse, resolve } from 'path'
parse('//a//b/c/d/e/f')
// => 
{
  root: '//a//b/', // общая папка
  dir: '//a//b/c/d/e',
  base: 'f',
  ext: '',
  name: 'f'
}
resolve('//a//b/c/d/e/f') // \\a\b\c\d\e\f

Один сегмент не может указать на share в формате UNC:

parse('//a')
// => 
{
  root: '/', ...
}
resolve('//a') // C:\a

Благо это можно проверить:

import { toNamespacedPath } from 'path'
toNamespacedPath('//a/b/c')
// => \\?\UNC\a\b\c
toNamespacedPath('/a/b/c')
// => \\?\C:\a\b\c
→ Ссылка