
Research
Two Malicious Rust Crates Impersonate Popular Logger to Steal Wallet Keys
Socket uncovers malicious Rust crates impersonating fast_log to steal Solana and Ethereum wallet keys from source code.
@reliverse/dler-sdk
Advanced tools
@reliverse/dler-sdk without cli. @reliverse/dler-sdk allows you to create new plugins for @reliverse/dler CLI, and even extend your own CLI functionality (you may also try @reliverse/rse-sdk for this case).
sponsor β discord β github β npm
@reliverse/dler (formerly relidler;
/ΛdiΛ.lΙr/
, dealer) is both a unified package manager for typescript/javascript projects and a flexible framework for creating, building, and publishing js/ts libraries to npm and jsr.dler is your package managerβs best friend β it extends bun, deno (π), pnpm, yarn, and npm with powerful and modern features.
at its core, dler is a flexible and fully automated bundler that also doubles as an npm/jsr publishing tool. beyond bundling, dler provides a rich codemod toolkit designed for modern typescript/javascript development.
unjs/unbuild
support with extended capabilities like publishingpackage.json
maintenancelibs
mode for multi-library setupsbefore using dler, make sure you have git, node.js, and a supported package manager installed β bun is highly recommended for the best experience.
π‘ tip curious to see dler in action before integrating it into your project? clone the repo and try e.g.
bun dler build
to build dler using... dler itself!
git clone https://github.com/reliverse/dler.git
cd dler
bun i
bun dler build # runs dler from source (cli entry: src/cli.ts)
it is recommended to install dler both globally and as a dev dependency:
bun add -g @reliverse/dler
β lets you use dler anywhere, like a system-level cli.bun add -D @reliverse/dler
β pins the version per project, so all contributors use the same version.instead of global install, you can alternatively install dler as a standalone binary: bunx @reliverse/dler
usage depends on how dler is installed:
dler
β if installed globally (or as standalone binary)bun dler
β if installed as a dev dependency
first-time dler run initializes config, repeatable runs launches dler interactive menu.
bun dler # if installed locally
dler # if installed globally
this creates a starter config file: .config/dler.ts
it is recommended to tweak the config to match your project structure
example config: .config/dler.ts β
useful options:
buildPreExtensions
: support additional file types like ["ts", "js", "vue", "tsx", "jsx"]
buildTemplatesDir
: exclude a directory from being built; it will be copied as-is (e.g. src/foo/templates β dist-*/bin/foo/templates
)bun dler [build|pub|--help] # if local
dler [build|pub|--help] # if global
π‘ run
dler
for an interactive menu, ordler --help
for full command list.
keeping your tools fresh is always a good practice.
the command below upgrades not just dler, but also your local setup β including git
, node.js
, bun
, npm
, yarn
, pnpm
, and more.
just run:
bun dler upgrade
β οΈ donβt confuse this with
dler update
, which upgrades your project dependencies and global packages, not your system tools. π note: bothupgrade
andupdate
will update dler itself β globally and in yourdependencies
ordevDependencies
if run inside a project with apackage.json
β depends on how dler is installed.
dler ships with a flexible command system (prev. plugins) and 17 built-in commands (from reliverse addons collection).
feel free to create your own commands. commands can be implemented as built-in directly in src/app/<command>/impl/*
and then imported from src/app/<command>/cmd.ts
; or implemented in your own library and then imported from src/app/<command>/cmd.ts
.
if you run just dler
β it will display a list of commands which you can launch interactively.
build β pub β agg β check β conv β fs β init β inject β libs β merge β migrate β rempts β x β spell β split β pack
core
install
# Install all dependencies
dler install
# Install with workspace filtering
dler install --filter "pkg-*" --filter "!pkg-c"
dler install --filter "./packages/pkg-*"
# Install specific package in filtered workspaces
dler install lodash --filter "pkg-*"
remove
# Remove package from all workspaces
dler remove lodash
# Remove from specific workspaces
dler remove lodash --filter "pkg-*" --filter "!pkg-c"
update
when dler detects that you are in a monorepo, it will uses linked dependencies (--linker
).
# Update all dependencies
dler update
# Update with workspace filtering
dler update --filter "pkg-*" --filter "!pkg-c"
# Update specific packages in filtered workspaces
dler update lodash --filter "pkg-*"
build
since dler is fully modular, build command is separated for its own build-in plugin as well.
bun dler build ...
legend:
build binary
- Standalone Executable Buildercreates standalone executables for different platforms using bun's --compile
feature.
# build for default targets (linux x64, windows x64, macos arm64)
bun dler build binary
# build for all supported platforms
bun dler build binary --targets=all
# build for specific platforms
bun dler build binary --targets=bun-linux-x64,bun-windows-x64
# build with optimization
bun dler build binary --bytecode --minify --sourcemap
# windows-specific options
bun dler build binary --windows-icon=icon.ico --windows-hide-console
# debugging options
bun dler build binary --no-compile --external=c12,terminal-kit,problematic-package
# list all available targets
bun dler build binary --targets=list
supported platforms:
output files:
mycli-linux
, mycli-windows.exe
, mycli-darwin-arm64
mycli-linux.js
, mycli-windows.js
, mycli-darwin-arm64.js
typical file sizes: 60-120mb per executable (includes bun runtime and dependencies)
pub
it already calls build command by itself, so you don't need to run dler build
separately.
bun dler pub ...
agg
generates aggregator file with content like import { getsomething } from "./utils.js"
.
# interactively:
dler > "agg"
# non-interactively:
dler agg --input <dir> --out <file> [options]
usage example: if you're exploring the example playground, you can try the following:
ctrl+a
, then backspace
. run the command below and watch the magic happen:bun tools:agg # shortcut for:
bun src/cli.ts tools --dev --tool agg --input src/libs/sdk/sdk-impl --out src/libs/sdk/sdk-mod.ts --recursive --named --strip src/libs/sdk
check
checks your project for common issues and potential improvements. This command performs several types of checks (aka rules of dler):
File Extensions: Validates that files have the correct extensions based on their location and module resolution strategy
.ts
files in source and JSR distributions.js
files in NPM distributions.css
and .json
files in all environmentsPath Extensions: Ensures import statements use the correct file extensions
Dependencies: Identifies missing dependencies in your project
Self-Include: Prevents circular dependencies and self-imports
Module Resolution: Validates TypeScript module resolution settings
Dler Config Health: Validates your dler configuration
Package.json Validation: Ensures your package.json follows best practices
# Fully interactive mode (when no args provided)
dler check
# Mixed mode (some args provided, prompts for the rest)
dler check --directory src
dler check --checks file-extensions,path-extensions
dler check --strict
# Fully automated mode (all args provided)
dler check --directory src --checks file-extensions,path-extensions --strict
# Output in JSON format
dler check --json
arguments:
--directory
: directory to check (src, dist-npm, dist-jsr, dist-libs/npm, dist-libs/jsr, or all)--checks
: comma-separated list of checks to run (missing-deps, file-extensions, path-extensions, dler-config-health, self-include, tsconfig-health, package-json-health)--strict
: enable strict mode (requires explicit extensions)--json
: output results in JSON formatpro tip:
the command will prompt you only for the arguments you haven't provided. for example, if you specify --directory
but not --checks
, it will only prompt you to select which checks to run.
how deps check works:
finds missing dependencies in your project by scanning your code for imports and comparing them to your package.json
. This command is particularly useful for maintaining clean dependency lists and preventing runtime errors.
what it does:
.js
, .jsx
, .ts
, and .tsx
files in your project (by default, in the current directory)@org/dep-name
)import ... from "dep"
) and commonjs (require("dep")
)dep/some/file
to just dep
./foo
, ../bar
)node_modules
, .git
, and common build folderspackage.json
devDependencies
but used in production codedependencies
and devDependencies
usage examples:
# basic usage - scan current directory
dler deps
# scan a specific directory
dler deps --directory ./my-project
# show all dependencies (both listed and missing)
dler deps --all
# ignore specific patterns
dler deps --ignore "test/**,example/**"
# output in json format
dler deps --json
# include node.js built-in modules
dler deps --include-builtins
# combine options
dler deps --all --directory ./src --include-builtins
missing dependencies are shown only once, even if used in multiple files.
deep imports like dep/some/file
or @org/dep/some/thing
are always resolved to their root package.
warning types:
package.json
devDependencies
but imported in production codedependencies
and devDependencies
conv
not yet documented.
fs
# simple example:
bun dler fs --mode copy --s "src/**/*.ts" --d "dist"
bun dler fs --mode rm --target "node_modules"
bun dler fs --mode rename --source "index.ts" --destination "index.ts.bak"
# advanced example:
bun dler fs --mode copy --s ".temp/packages/*/lib/**/*" --d "src/libs/sdk/sdk-impl/rules/external"
bun dler fs --mode rm --target "**/node_modules"
init
not yet documented.
inject
not yet documented.
libs
builds and publishes specific subdirectories of your main project as standalone packages.
usage example:
using dler
to package src/libs/sdk:
// .config/dler.ts
libsactmode: "main-and-libs",
libsdirdist: "dist-libs",
libsdirsrc: "src/libs",
libslist: {
"@reliverse/dler-sdk": {
libdeclarations: true,
libdescription: "@reliverse/dler without cli",
libdirname: "sdk",
libmainfile: "sdk-mod.ts",
libpkgkeepdeps: false,
libtranspileminify: true,
},
},
dler task commands:
// dler-replace-line
tells dler to grab the contents of ../../types.ts
and inject them directly in place of your command definition.
export * from "../../types"; // dler-replace-line
// or:
export type { specificTypeName1, specificTypeName2 } from "../../types"; // dler-replace-line
more magic commands coming soon...
merge
merges multiple files into a single file. The command is built for both CI and interactive use, with support for glob patterns and advanced options.
key features:
@reliverse/rempts
@reliverse/relinka
usage examples:
# simple example:
bun dler merge --s "src/**/*.ts" --d "dist/merged.ts"
# advanced example:
bun dler merge --s ".temp1/packages/*/lib/**/*" --d ".temp2/merged.ts" --sort "mtime" --header "// Header" --footer "// Footer" --dedupe
arguments:
--s
: Input glob patterns (array)--d
: Output file path or directory--ignore
: Extra ignore patterns (array)--format
: Fallback extension when output path is omitted (default: "txt")--stdout
: Print to stdout--noPath
: Don't inject relative path below each file--pathAbove
: Print file path above each file's content (default: true)--separator
: Custom separator (default: "\n\n")--comment
: Custom comment prefix (e.g. '# ')--forceComment
: Force custom comment prefix for all file types--batch
: Disable interactive prompts (CI/non-interactive mode)--recursive
: Recursively process all files in subdirectories (default: true)--preserveStructure
: Preserve source directory structure in output (default: true)--increment
: Attach an incrementing index to each output filename--concurrency
: Number of concurrent file operations (default: 8)--sort
: Sort files by: name, path, mtime, none (default: path)--dryRun
: Show what would be done, but don't write files--backup
: Backup output files before overwriting--dedupe
: Remove duplicate file contents in merge--header
: Header text to add at the start of merged output--footer
: Footer text to add at the end of merged output--select-files
: Prompt for file selection before merging--interactive
: Enable interactive mode with prompts--depth
: Depth level to start processing from (default: 0)--sourcemap
: Generate source map for the merged outputimplementation details:
magic-string
for efficient string manipulation and source map generation@reliverse/reglob
for glob pattern matchingp-map
@reliverse/rempts
@reliverse/relinka
migrate
helps migrate between different libraries and module resolution strategies. currently supports:
anything-bun
: migrate Node.js projects to Bun runtimepath-pathkit
: migrate from node:path and unjs/pathe to pathkit libraryfs-relifso
: migrate from node:fs and fs-extra to relifso librarynodenext-bundler
: migrate between module resolution strategiesreaddir-glob
: migrate from fs.readdir to globby for better file system operationspath-pathkit features:
pathe
and node:path
to @reliverse/pathkit
fs-relifso features:
node:fs
and fs-extra
to @reliverse/relifso
anything-bun features:
node:
prefixpg
/postgres
β Bun.sql
, sqlite3
β bun:sqlite
redis
/ioredis
β Bun.redis
glob
β Bun.Glob
, bcrypt
/argon2
β Bun.password
jest
/vitest
β bun:test
node-ffi
β bun:ffi
Bun.file
APIBun.serve
readdir-glob features:
fs.readdir
and fs.readdirSync
to globby
fs.promises.readdir
migrationusage examples:
# Preview changes without applying them
dler migrate --lib readdir-glob --dryRun
# Apply changes
dler migrate --lib readdir-glob
# Migrate specific project
dler migrate --lib readdir-glob --project ./my-app
module resolution targets:
nodenext
: adds .js
extensions to imports and updates tsconfigbundler
: removes extensions from imports and updates tsconfigusage examples:
# Migrate from node:path and/or pathe to pathkit
dler migrate --lib path-pathkit
# Migrate from node:fs and/or fs-extra to relifso
dler migrate --lib fs-relifso
# Migrate to nodenext module resolution
dler migrate --lib nodenext-bundler --target nodenext
# Migrate to bundler module resolution
dler migrate --lib nodenext-bundler --target bundler
# Preview changes without applying them
dler migrate --lib nodenext-bundler --target nodenext --dryRun
what it does:
console-relinka
:
@reliverse/relinka's best friend. Converts between different logging formats (console, consola method/object, and relinka's function/method/object styles).
# Basic usage
dler relinka --input <file> --from <source> --to <target>
# Examples:
# Convert console.log to relinka function style
dler relinka --input src/app.ts --from console --to relinkaFunction
# Convert consola method to relinka method style
dler relinka --input src/app.ts --from consolaMethod --to relinkaMethod
# Convert between relinka styles
dler relinka --input src/app.ts --from relinkaMethod --to relinkaObject
# Convert to consola object style
dler relinka --input src/app.ts --from relinkaFunction --to consolaObject
Supported formats:
console
: Standard console logging (console.log(message, ...args)
)consolaMethod
: Consola method style (consola.log(message, ...args)
)consolaObject
: Consola object style (consola({ level, message, title?, args? })
)relinkaFunction
: Relinka function style (relinka("level", message, ...args)
)relinkaMethod
: Relinka method style (relinka.level(message, ...args)
)relinkaObject
: Relinka object style (relinka({ level, message, title?, args? })
)Special features:
next steps after migration:
for path-pathkit:
for fs-relifso:
for nodenext-bundler:
for anything-bun:
for readdir-glob:
rempts
@reliverse/rempts's best friend. learn more in its docs.
bun dler rempts
bun dler rempts --init cmd1 cmd2
x
dler x
β your package manager β refined.
bun dler x ...
magic
programmatic usage:
function main() {
// may be useful when your cli is a project bootstrapper tool like @reliverse/rse
// so you can apply spells to each bootstrapped by you cli project's file
await applyMagicSpells(["my-target-dir"]);
}
await main();
or, call it from dler config's hook:
{
hooksAfterBuild: [
async () => {
// useful when you want to apply spells right after dler's build
await applyMagicSpells(["dist-jsr", "dist-npm", "dist-libs"]);
}
],
}
or, use dler magic
:
dler magic --targets "my-target-dir"
available spell types:
replace-line
β injects contents from one file into anotherreplace-range
β replaces a range of lines with content from another filerename-file
β renames the current fileremove-comment
β removes a specific comment from coderemove-line
β removes a specific line from coderemove-file
β deletes the current filetransform-content
β applies a transformation to the file contenttransform-line
β applies a transformation to a specific linecopy-file
β copies the current file to a new locationmove-file
β moves the current file to a new locationinsert-at
β inserts content at a specific position in the fileinsert-before
β inserts content before a specific lineinsert-after
β inserts content after a specific lineconditional-execute
β executes spells conditionallyparams:
params are optional and comma-separated.
hooked
(boolean, default: true
)
true
: disables default behavior, so you can trigger the spell yourself (e.g. from your own cli function)false
: dler handles the spell automatically at postbuildstartLine
(number) β line number to start the operation (for range operations)endLine
(number) β line number to end the operation (for range operations)condition
(string) β condition to check before executing the spellskipIfMissing
(boolean) β whether to skip the spell if the target file doesn't existcreateDir
(boolean) β whether to create the target directory if it doesn't existusage examples:
export * from "../../types"; // dler-replace-line
β injects file contents at this line (hooked=true by default)// @ts-expect-error dler-remove-comment
β removes just this comment (hooked=true by default)// dler-remove-line
β removes this line (hooked=true by default)// dler-remove-file
β deletes this file (hooked=true by default)// dler-rename-file-"tsconfig.json"-{hooked=false}
β renames this file (runs at postbuild because hooked=false
)// dler-replace-range-"../../types.js"-{startLine=1,endLine=5}
β replaces lines 1-5 with content from types.js// dler-transform-line-"return line.toUpperCase()"
β transforms the line to uppercase// dler-insert-before-"import { x } from 'y';"
β inserts import statement before this line// dler-insert-after-"export { x };"
β inserts export statement after this line// dler-conditional-execute-{condition="content.includes('TODO')"}
β executes spells only if file contains TODOusing hooked=false
:
// dler-rename-file-"tsconfig.json"-{hooked=false}
β renames the file immediately at postbuild (not hooked)triggering spells:
from dler's cli:
dler spell --trigger rename-file,... --files tsconfig.json,...
dler spell --trigger all
dler spell
from your own code:
await dler.spell({ spells: ["rename-file"], files: [] });
await dler.spell({}) // all spells, all files
spells: ["all"] // means all spells
spells: [] // also means all spells
files: [] // means all files
p.s. see how rse cli uses hooked=true
Contributors: Please check the docs/cmds/SPELLS.md file for more technical details.
split
splits your code/text file into multiple files.
bun dler split ...
pack
packs a directory of templates into TypeScript modules. This command is useful for creating reusable template packages that can be distributed and used by other projects.
key features:
usage examples:
# Basic usage
dler pack --dir ./templates --output ./dist-templates
# With custom whitelabel
dler pack --dir ./templates --output ./dist-templates --whitelabel MYAPP
# Update specific files only
dler pack --dir ./templates --output ./dist-templates --files "src/index.ts,src/config.ts"
# Force overwrite existing files
dler pack --dir ./templates --output ./dist-templates --force
# Update mode (default: true)
dler pack --dir ./templates --output ./dist-templates --update
arguments:
--dir
: Directory containing templates to process (required)--output
: Output directory for generated modules (default: "my-templates")--whitelabel
: Custom prefix to use instead of 'DLER' (default: "DLER")--cdn
: Remote CDN for binary assets upload (not yet implemented)--force
: Force overwrite existing files (default: false)--update
: Update existing templates and add new ones (default: true)--files
: Comma-separated list of specific files to update--lastUpdate
: Override lastUpdate timestampoutput structure:
output/
βββ impl/
β βββ binaries/ # binary files stored with hash-based names (dler reads/writes this dir when --cdn is not used)
β β βββ [hashed-files]
β βββ template1.ts
β βββ template2.ts
βββ types.ts
βββ mod.ts
--unpack:
creates file structure from packed templates. This command is the counterpart to pack
and is used to extract and restore template files from a packed template package.
key features:
usage examples:
# Basic usage
dler pack ./dist-templates --output ./my-project --unpack
# With custom output directory
dler pack ./dist-templates --output ./custom-location --unpack
# Preview changes without applying
dler pack ./dist-templates --output ./my-project --dry-run --unpack
# Clean up existing template files before unpacking
dler pack ./dist-templates --output ./my-project --cleanup --unpack
arguments:
templatesDir
: Directory containing mod.ts (required)--output
: Where to write files (default: "unpacked")--cdn
: Remote CDN base for binary assets download (not yet implemented)--cleanup
: Clean up template files before unpacking (default: false)--dry-run
: Preview changes without applying them (default: false)implementation details:
jiti
for dynamic template file loadingthe sdk lets you build custom dler cli plugins or even extend your own cli tools.
bun add @reliverse/dler-sdk
usage example: @reliverse/rse leverages this sdk to extend its functionality.
update
updates your project's dependencies to the latest version.
updates not only dependencies
/devDependencies
/peerDependencies
/optionalDependencies
, but also monorepo catalogs.
bun dler update
params:
--with-check-script
(boolean) β runs bun check
after updating (exclusive for bun environment at the moment)example package.json:
{
"scripts": {
"latest": "bun dler update --with-check-script",
"check": "tsc --noEmit && eslint --cache --fix . && biome check --fix --unsafe . && knip"
}
}
coming soon:
C:/foo/bar1/package.json
and C:/foo/bar2/package.json
and using dler update
in C:/foo
).dler has full workspaces and catalogs support for the package management commands. Catalog logic is similar to Bun across all package management commands.
# Add to default catalog
dler install react react-dom --as-catalog default
# Add to named catalog
dler install jest testing-library --as-catalog testing
dler install webpack babel --as-catalog build --catalog-name build
# With workspace filtering
dler install lodash --as-catalog default --filter "pkg-*"
# Remove from default catalog
dler remove react react-dom --from-catalog default
# Remove from named catalog
dler remove jest --from-catalog testing
dler remove webpack --from-catalog build --catalog-name build
# List all catalogs and their dependencies
dler catalog list
dler catalog ls
# Update all catalog dependencies to latest versions
dler update --update-catalogs
^
and ~
prefixes for semver compatibility{
"workspaces": {
"packages": ["packages/*"],
"catalog": {
"react": "^19.0.0",
"react-dom": "^19.0.0"
}
}
}
{
"workspaces": {
"packages": ["packages/*"],
"catalogs": {
"testing": {
"jest": "^30.0.0",
"testing-library": "^14.0.0"
},
"build": {
"webpack": "^5.88.2",
"babel": "^7.22.10"
}
}
}
}
# 1. Add core React dependencies to default catalog
dler install react react-dom react-router-dom --as-catalog default
# 2. Add build tools to named catalog
dler install webpack babel --as-catalog build
# 3. Add testing tools to named catalog
dler install jest react-testing-library --as-catalog testing
# 4. List all catalogs
dler catalog list
# 5. Update all catalogs to latest versions
dler update --update-catalogs
// packages/app/package.json
{
"dependencies": {
"react": "catalog:",
"react-dom": "catalog:",
"react-router-dom": "catalog:"
},
"devDependencies": {
"webpack": "catalog:build",
"jest": "catalog:testing"
}
}
# Add dependencies to specific workspaces as catalogs
dler install lodash --as-catalog default --filter "pkg-*" --filter "!pkg-c"
# Remove dependencies from catalogs in filtered workspaces
dler remove typescript --from-catalog default --filter "pkg-*"
# Update catalogs and then install
dler update --update-catalogs
dler install
libs:pack
: Creates two templates, cfg
and sdk
, based on dist-libs directory structure (using dler pack command).libs:unpack
: Creates a project structure using all templates from the cfg
and sdk
templates (using dler unpack command).libs:example
: Since libs:unpack
's serves as a dist-libs mock, then libs:example
helps easily test dler's features like resolveAllCrossLibs()
.<src | dist-npm | dist-jsr>/libs/<lib-name>/<files live here>
=== dist-libs/<lib-name>/<jsr | npm>/bin/<files live here>
dist-*
-> dist/dist-*
regular
build and publishlibrary
build and publishunbuild
build.config.ts
.config/rse.{ts,jsonc}
π€dler remdn
(@reliverse/remdn) to generate npm/jsr specific readme and a single docs
dir for a whole project (only readmes will be published, docs are only stored in project's source cpde and can be deployed to user's website)defineconfig
(hooksBeforeBuild
and hooksAfterBuild
are now available, plugin's options can be passed directly to plugin's params, e.g. hooksBeforeBuild: [ async () => { await myCoolPlugin({ /* plugin's options */ }); } ],
)mkdist
can be called using bun
, but bun's own bundler is not yet fully supporteddler <command> [...flags] [...args]
usage should support both bun
and dler
own commands and flagsspecial thanks to the project that inspired @reliverse/dler
:
π©· mit Β© 2025 blefnk nazar kornienko
FAQs
@reliverse/dler-sdk without cli. @reliverse/dler-sdk allows you to create new plugins for @reliverse/dler CLI, and even extend your own CLI functionality (you may also try @reliverse/rse-sdk for this case).
We found that @reliverse/dler-sdk demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.Β It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Socket uncovers malicious Rust crates impersonating fast_log to steal Solana and Ethereum wallet keys from source code.
Research
A malicious package uses a QR code as steganography in an innovative technique.
Research
/Security News
Socket identified 80 fake candidates targeting engineering roles, including suspected North Korean operators, exposing the new reality of hiring as a security function.