šŸ¦• Release on NPM and on deno.land/x with a single codebasešŸ¦•

Home - Documentation - Demo repo

šŸ—£ļø If your project has no dependencies and is not using any Node builtins (fs, https, process ectā€¦), you will soon be able to do without Denoify by using TypeScript compiler option moduleResolution: bundler and allowImportingTsExtensions: true.
See this comment for more infos.

šŸ—£ļø Deno now supports NPM modules.
For NPM module authors this means that you jus need to tell your users to import your module like:
import express from "npm:your-module@5";.
Knowing that why would you want to use Denoify?

  • To publish your module on deno.land/x. You have very few chances to see your module be embedded in others Deno modules if you arenā€™t releasing a Deno specific distribution.
  • To ensure your module is retro compatible with Deno versions that do not feature NPM support.
  • If your module belong in the 10% of NPM modules that doesnā€™t work out of the box. Denoify can help you providing Deno implementation for specific file of your module (xxx.deno.ts).
  • Denoify enables to produce a very predictable distribution of your module for Deno with the node builtins ports pinned to a specific version. If you donā€™t use Denoify and users import your module like import abc from "npm:your-module@1.2.3 Deno will pull the last version of https://deno.land/std/node. An update there could theoretically end up breaking your module on Deno.

What it is

A build tool that takes as input a TypeScript codebase that was meant to target node and/or the web and spits out a modified version of the source files ready to be deployed as a Deno module.

what_denoify_does

NOTE: Denoify wonā€™t run on Deno, it is a Node module.

NOTE: Denoify is capable of recursively resolving dependencies!
It works out of the box with dependencies that uses denoify and there are many option for dealing with dependencies that wonā€™t transpile automatically. See specific documentation

This tool is mainly for NPM module maintainer, to enable them to bring first-class citizen Deno support to their modules and do so without introducing breaking changes.

Motivations

  • Although it is quite easy to port a module to Deno no one wants to maintain two codebase.
  • Wouldnā€™t it be great to have a tool able to bring Deno support to NPM modules?

Example of modules using Denoify

Some modules that have been made cross-runtime using Denoify:

Limitations

Coming up next is a detailed guide on how to set up denoify with your project and how to publish on deno.land/x but before anything here are the current limitations you need to be aware of.

  • If your module is vanilla JS it needs to be ported to TypeScript first. (1)
  • require() is not supported.
  • You canā€™t fs.readFile() files that are part of the module ( files inside a res/ directory for example ). (2)

(1) Donā€™t be afraid, renaming your source with .ts and dropping some any here and there will do the trick. You will be able to pull it off even if you arenā€™t familiar with typescript. Ref

(2) In Deno the files that forms your module wonā€™t be pre-fetched and placed in node_module like in node so you wonā€™t be able to access files that are not on the disk.



šŸš€ Get started šŸš€

Whatā€™s new

NEW IN v1.3.1

NEW IN v1.3

  • Support for // @denoify-line-ignore special comment.

NEW IN v1

  • import express from "express"; automatically converted into:
    import express from "npm:express@5";
    (See this update)
    Most project will now transpile successfully out of the box.

NEW IN v0.10

  • Mitigate the risk of comment being accidentally modified.
  • Possibility to specify output directory in the package.jsonā€™s denoify field. See doc.
  • Support module augmentation: declare module .... Example
  • Possibility to explicitly tell where the index.ts is located in the source. Doc

NEW IN v0.9

NEW IN v0.7

  • Support for esm modules. See issue. Thanks to yandeu.

NEW IN v0.7

  • Support for workspaces where node_modules are located in a parent directory.
    Thx @hayes See issue
  • Add basic support for child_process.spawn (#785)

NEW IN v0.6

NEW IN v0.5 Breaking changes

  • All Denoify parameters are now gathered under a uniq "denoify" field.
  • Possibility to specify which files should be copied to the deno_dist directory (Previously only README.md was copied).
    Valid config example

Introduction video

NOTE: New features have been introduced since this meeting was hold

Watch the video