Attributes
Popular
Official Deno project
Includes Deno configuration
Repository
Current version released
3 years ago
Dependencies
Versions
- 0.40.0Latest
- 0.39.0
- 0.38.1
- 0.38.0
- 0.37.0
- 0.36.0
- 0.35.0
- 0.34.0
- 0.33.1
- 0.33.0
- 0.32.1
- 0.32.0
- 0.31.0
- 0.30.0
- 0.29.1
- 0.29.0
- 0.28.0
- 0.27.0
- 0.26.0
- 0.25.3
- 0.25.2
- 0.25.1
- 0.25.0
- 0.24.0
- 0.23.0
- 0.22.0
- 0.21.2
- 0.21.1
- 0.21.0
- 0.20.1
- 0.20.0
- 0.19.0
- 0.18.1
- 0.18.0
- 0.17.0
- 0.16.1
- 0.16.0
- 0.15.0
- 0.14.0
- 0.13.0
- 0.12.0
- 0.11.1
- 0.11.0
- 0.10.0
- 0.9.0
- 0.8.0
- 0.7.4
- 0.7.3
- 0.7.2
- 0.7.1
- 0.7.0
- 0.6.0
- 0.5.0
- 0.4.1
- 0.4.0
- 0.3.1
- 0.3.0
- 0.2.2
- 0.2.1
- 0.2.0
- 0.1.3
- 0.1.2
- 0.1.1
- 0.1.0
- 0.0.20
- 0.0.19
- 0.0.18
- 0.0.17
- 0.0.16
- 0.0.15
- 0.0.14
- 0.0.13
- 0.0.12
- 0.0.11
- 0.0.10
- 0.0.9
- 0.0.8
- 0.0.7
- 0.0.6
- 0.0.5
- 0.0.4
- 0.0.3
- 0.0.2
- 0.0.1
dnt - Deno to Node Transform
Prototype for a Deno to npm package build tool.
What does this do?
It takes a Deno module and creates an npm package for use in Node.js.
There are several steps done in a pipeline:
- Transforms Deno code to Node/canonical TypeScript including files found by
deno test
.- Rewrites module specifiers.
- Injects a Deno shim for any
Deno
namespace usages. - Rewrites Skypack and ESM specifiers to a bare specifier and includes these dependencies in a package.json.
- When remote modules cannot be resolved to an npm package, it downloads them and rewrites specifiers to make them local.
- Allows mapping any specifier to an npm package.
- Type checks the output.
- Emits ESM, CommonJS, and TypeScript declaration files along with a package.json file.
- Runs the final output in Node through a test runner running all
Deno.test
calls. Deletes the test files when complete.
Setup
- Create a build script file:
// ex. scripts/build_npm.ts
import { build } from "https://deno.land/x/dnt/mod.ts";
await build({
entryPoints: ["./mod.ts"],
outDir: "./npm",
typeCheck: true,
declaration: true,
test: true,
package: {
// package.json properties
name: "my-package",
version: Deno.args[0],
description: "My package.",
license: "MIT",
repository: {
type: "git",
url: "git+https://github.com/dsherret/my-package.git",
},
bugs: {
url: "https://github.com/dsherret/my-package/issues",
},
},
// optional specifier to npm package mappings
mappings: {
"https://deno.land/x/code_block_writer@10.1.1/mod.ts": {
name: "code-block-writer",
version: "^10.1.1",
},
},
});
// post build steps
Deno.copyFileSync("LICENSE", "npm/LICENSE");
Deno.copyFileSync("README.md", "npm/README.md");
- Run it and
npm publish
:
# run script
deno run -A scripts/build_npm.ts 0.1.0
# go to output directory and publish
cd npm
npm publish
Example Build Logs
[dnt] Transforming...
[dnt] Running npm install...
[dnt] Building project...
[dnt] Type checking...
[dnt] Emitting declaration files...
[dnt] Emitting ESM package...
[dnt] Emitting CommonJS package...
[dnt] Running tests...
> test
> node test_runner.js
Running tests in ./umd/mod.test.js...
test escapeForWithinString ... ok
test escapeChar ... ok
Running tests in ./esm/mod.test.js...
test escapeForWithinString ... ok
test escapeChar ... ok
[dnt] Complete!
JS API Example
For only the Deno to canonical TypeScript transform which may be useful for bundlers, use the following:
// docs: https://doc.deno.land/https/deno.land/x/dnt/transform.ts
import { transform } from "https://deno.land/x/dnt/transform.ts";
const outputResult = await transform({
entryPoints: ["./mod.ts"],
testEntryPoints: ["./mod.test.ts"],
shimPackageName: "deno.ns",
// mappings: {}, // optional specifier mappings
});
Rust API Example
use std::path::PathBuf;
use deno_node_transform::ModuleSpecifier;
use deno_node_transform::transform;
use deno_node_transform::TransformOptions;
let output_result = transform(TransformOptions {
entry_points: vec![ModuleSpecifier::from_file_path(PathBuf::from("./mod.ts")).unwrap()],
test_entry_points: vec![ModuleSpecifier::from_file_path(PathBuf::from("./mod.test.ts")).unwrap()],
shim_package_name: "deno.ns".to_string(),
loader: None, // use the default loader
specifier_mappings: None,
}).await?;