JSPM

  • Created
  • Published
  • Downloads 30197
  • Score
    100M100P100Q152317F
  • License MIT

Node.js loader for import specifiers as file paths without extensions or as directory paths

Package Exports

  • extensionless
  • extensionless/register

Readme

Node.js loader for import specifiers as file paths without extensions or as directory paths

 

Install:

npm i extensionless

 

Start node with the following flag added:

--import=extensionless/register

Note: If node version is lower than 20.6.0, that doesn't work and this flag is needed instead:

--experimental-loader=extensionless

 

You can now use import specifiers as file paths without extensions or as directory paths:

// imports from the first existing file in the candidates list as follows

import mod from './mod'
// ['./mod.js', './mod/index.js']

import mod from '../mod' with {type: 'json'}
// ['../mod.json', '../mod/index.json']

import api from '/apps/api'
// ['/apps/api.js', '/apps/api/index.js']

import web from 'file:///apps/web'
// ['file:///apps/web.js', 'file:///apps/web/index.js']

 

To configure this module, add the field extensionless to your project's package.json:

"extensionless": {
  "lookFor": ["js", "mjs", "cjs"]
}
Field Default Value
lookFor ["js"]

Note: If you use the flag --experimental-transform-types with node, the value "ts" is automatically prepended to the array lookFor, so that you won't need to configure it manually.

 

When it can be deduced from the specifier that its target is a directory, the resolver looks for only the index files:

// imports from the first existing file in the candidates list as follows

import cur from '.'
// ['./index.js']

import up from '..'
// ['../index.js']

import mod from './mod/'
// ['./mod/index.js']

import mod from '../mod/' with {type: 'json'}
// ['../mod/index.json']

import api from '/apps/api/'
// ['/apps/api/index.js']

import web from 'file:///apps/web/'
// ['file:///apps/web/index.js']

 

This loader also adds support for Windows path resolution with which you can use forward or backward slashes as separators.

import mod from '.\\mod'
// ['./mod.js', './mod/index.js']

import mod from '..\\mod\\' with {type: 'json'}
// ['../mod/index.json']

import api from 'C:/apps/api'
// ['/C:/apps/api.js', '/C:/apps/api/index.js']

import web from 'C:\\apps\\web\\'
// ['/C:/apps/web/index.js']