Denoのライブラリをnpmパッケージ化する
tscでトランスパイル時(declarion生成時)に import/export で .ts を付けてると怒られるから厳しい
declarion内で export * from "foo.ts" みたいに拡張子が残ってしまってnpmパッケージ化したときに解決できない問題
import { foo } from "https://file/to/path" をバンドル時に解決する必要もある
多分一番いい解決法
自分で試せてること
declarationだけを生成するためにtsconfigはこんな感じ
code:tsconfig.json
{
"compilerOptions": {
"target": "es5",
"module": "esnext",
"esModuleInterop": true,
"moduleResolution": "node",
"skipLibCheck": true,
"strict": true,
"rootDir": "src",
"outDir": "dist",
"declaration": true,
"declarationDir": "dist",
"emitDeclarationOnly": true
},
}
deno bundle + tsc
deno bundle を使ってDenoレベルでバンドルしたファイルを生成
tscを使って d.ts ファイルだけ生成する
ファイル名に拡張子 .ts をつけたまま import/export してるからエラーが出るけど .d.ts ファイルの生成自体は成功する
.d.ts ファイルから import/export 内の .ts 拡張子と、URLをimportしている行自体を削除する
perlの正規表現で置換を行っていて、そこがものすごい微妙
code:sh
$ deno bundle src/index.ts > dist/index.ts
$ yarn run tsc
$ scripts/deno_to_node.sh
code:scripts/deno_to_node.sh
perl -i -pe "s/\.ts//g if /^(import|export).+\s+from\s+(\"|').+(\"|');?$/" dist/*.d.ts
perl -i -pe "s/^.*//g if /^(import|export).+\s+from\s+(\"|')https:\/\/.+(\"|');?$/" dist/*.d.ts
rollupでバンドル
普通にTSをrollupでバンドルする
declarationでexportしているファイルに拡張子として .ts が付いてしまうので削除する必要がある
ただこれだとDenoで export { foo } from "https://deno.land/{path}/{file}.ts"; をしているときrollupが解決できない気がするから多分没
code:rollup.config.js
import extensions from "rollup-plugin-extensions";
import typescript from "@rollup/plugin-typescript";
import commonjs from "@rollup/plugin-commonjs";
import resolve from "rollup-plugin-node-resolve";
import command from "rollup-plugin-command";
const config = [
{
input: "./src/mod.ts",
output: {
dir: "dist",
format: "cjs",
},
plugins: [
extensions({
}),
typescript(),
commonjs(),
resolve(),
command("./scripts/deno_to_node.sh"),
],
},
];
export default config;