1. lnk
Create links between files cross-platform
lnk
Package: lnk
Created by: schnittstabil
Last modified: Sun, 19 Jun 2022 13:10:05 GMT
Version: 1.1.0
License: MIT
Downloads: 32,891
Repository: https://github.com/schnittstabil/lnk

Install

npm install lnk
yarn add lnk

lnk Build Status Build status Coverage Status XO code style

Create links between files cross-platform

Why

  • Promise interface
  • Create hard links, directory junctions and symbolic links depending on the platform

Install

 $ npm install lnk --save

Usage

$ tree
.
└── assets
    ├── favicon.ico
    └── style
        ├── app.css
        └── vendor.css

2 directories, 3 files
 const lnk = require('lnk');

lnk(['assets/favicon.ico', 'assets/style'], 'dist')
	.then(() => console.log('done'));
$ tree
.
├── assets
│   ├── favicon.ico
│   └── style
│       ├── app.css
│       └── vendor.css
└── dist
    ├── favicon.ico              // hard link to assets/favicon.ico
    └── style -> ../assets/style // symlink; directory junction on windows

4 directories, 4 files

Glob support

lnk don't support globbing by itself, lnk supports arrays of targets and Promises which resolve to these though:

 const lnk = require('lnk');
const globby = require('globby');  // npm install globby

lnk(globby('assets/*'), 'dist')
	.then(() => console.log('done'));

API

lnk provides a cross-platform convenience wrapper for the fs.link and fs.symlink functions.

lnk(targets, directory, [opts])

Returns a Promise.

lnk.sync (targets, directory, [opts])

Synchronous version of lnk.

targets

Type: string|string[]

Targets of the links. lnk() additionally supports Promise<string|string[]>.

directory

Type: string

Destination directory.

opts

Type: object

cwd

Type: string

Default: process.cwd()

The current working directory for targets and directory.

force

Type: boolean

Default: false

Overwrite existing files.

type

Type: string

Values: 'default', 'hard', 'symbolic', 'junction' or 'directory'

Default: 'default'

By 'default', lnk tries to create hard links, if this fails for a target because
it is a directory lnk tries to create a directory junction (symbolic link on
modern OSs) for this target.

parents

Type: boolean

Default: false

Use full source file name under directory.

 // w/o parents:
lnk('assets/style/foo.css', 'dist/assets/style', ...);

// w/ parents:
lnk('assets/style/foo.css', 'dist', {parents: true}, ...);
rename

Type: string|object|function(object):(string|object)

Filepath or function mapping a path object to a filename or path object; used to modify the path of the link before creating.

Basic Example
$ tree
.
└── assets
    ├── favicon.ICO
    └── style
        ├── app.css
        └── vendor.css
 const path = require('path');

Promise.all([
	lnk('assets/style', 'dist', {rename: 'css'}),
	lnk('assets/favicon.ICO', 'dist', {rename: pathOfLink => pathOfLink.base.toLowerCase()})
]).then(() => console.log('done'));
$ tree
.
├── assets
│   ├── favicon.ICO
│   └── style
│       ├── app.css
│       └── vendor.css
└── dist
    ├── css -> ../assets/style // symlink; directory junction on windows
    └── favicon.ico            // hard link to assets/favicon.ICO
Sophisticated Example
$ tree
.
└── assets
    ├── favicon.ico
    └── style
        ├── app.css
        └── vendor.css
 const rename = pathOfLink => Object.assign(pathOfLink, {
	dir: path.join(pathOfLink.dir, '42'),
	base: `prefix-${pathOfLink.name}` + pathOfLink.ext.toLowerCase()
});

lnk(['assets/favicon.ico', 'assets/style'], 'dist', {rename})
	.then(() => console.log('done'));
$ tree
.
├── assets
│   ├── favicon.ico
│   └── style
│       ├── app.css
│       └── vendor.css
└── dist
    └── 42
        ├── prefix-favicon.ico                 // hard link to assets/favicon.ico
        └── prefix-style -> ../../assets/style // symlink; directory junction on windows
log

Type: function

Default: (level, prefix, message) => {}

A logger function, you may want to use console.log or npmlog.log, see npmlog documentation for details.

  • lnk-cli – CLI version of this project
  • globby – if you need glob support for multiple patterns
  • cpy – if you need to copy multiple files
  • del – if you need to delete files and folders

License

MIT © Michael Mayer

RELATED POST

10 Must-Know Windows Shortcuts That Will Save You Time

10 Must-Know Windows Shortcuts That Will Save You Time

Arrays vs Linked Lists: Which is Better for Memory Management in Data Structures?

Arrays vs Linked Lists: Which is Better for Memory Management in Data Structures?

Navigating AWS Networking: Essential Hacks for Smooth Operation

Navigating AWS Networking: Essential Hacks for Smooth Operation

Achieving Stunning Visuals with Unity's Global Illumination

Achieving Stunning Visuals with Unity's Global Illumination

Nim's Hidden Gems: Lesser-known Features for Writing Efficient Code

Nim's Hidden Gems: Lesser-known Features for Writing Efficient Code