deno/rollup.config.js

250 lines
7.6 KiB
JavaScript
Raw Normal View History

2018-10-19 19:25:29 +00:00
// Copyright 2018 the Deno authors. All rights reserved. MIT license.
2018-07-22 01:14:52 +00:00
import path from "path";
import alias from "rollup-plugin-alias";
import { plugin as analyze } from "rollup-plugin-analyzer";
import commonjs from "rollup-plugin-commonjs";
import globals from "rollup-plugin-node-globals";
import nodeResolve from "rollup-plugin-node-resolve";
import typescriptPlugin from "rollup-plugin-typescript2";
2018-07-22 01:14:52 +00:00
import { createFilter } from "rollup-pluginutils";
import typescript from "typescript";
2018-09-20 06:13:59 +00:00
import MagicString from "magic-string";
2018-07-22 01:14:52 +00:00
const mockPath = path.join(__dirname, "js", "mock_builtin.js");
2018-09-20 06:13:59 +00:00
const platformPath = path.join(__dirname, "js", "platform.ts");
2018-07-22 01:14:52 +00:00
const tsconfig = path.join(__dirname, "tsconfig.json");
const typescriptPath = `${
process.env.BASEPATH
}/third_party/node_modules/typescript/lib/typescript.js`;
2018-07-26 03:07:50 +00:00
// We will allow generated modules to be resolvable by TypeScript based on
// the current build path
const tsconfigOverride = {
compilerOptions: {
paths: {
"*": ["*", path.join(process.cwd(), "*")]
}
}
};
2018-07-22 01:14:52 +00:00
// this is a rollup plugin which will look for imports ending with `!string` and resolve
// them with a module that will inline the contents of the file as a string. Needed to
// support `js/assets.ts`.
function strings({ include, exclude } = {}) {
if (!include) {
throw new Error("include option must be passed");
}
const filter = createFilter(include, exclude);
return {
name: "strings",
2018-08-07 20:27:31 +00:00
/**
* @param {string} importee
*/
2018-07-22 01:14:52 +00:00
resolveId(importee) {
if (importee.endsWith("!string")) {
2018-08-07 20:27:31 +00:00
// strip the `!string` from `importee`
importee = importee.slice(0, importee.lastIndexOf("!string"));
if (!importee.startsWith("gen/")) {
// this is a static asset which is located relative to the root of
// the source project
2018-08-07 20:27:31 +00:00
return path.resolve(path.join(process.env.BASEPATH, importee));
}
// this is an asset which has been generated, therefore it will be
// located within the build path
return path.resolve(path.join(process.cwd(), importee));
2018-07-22 01:14:52 +00:00
}
},
2018-08-07 20:27:31 +00:00
/**
* @param {any} code
* @param {string} id
*/
2018-07-22 01:14:52 +00:00
transform(code, id) {
if (filter(id)) {
return {
code: `export default ${JSON.stringify(code)};`,
2018-07-22 01:14:52 +00:00
map: { mappings: "" }
};
}
}
};
}
const archNodeToDeno = {
x64: "x64"
};
const osNodeToDeno = {
win32: "win",
darwin: "mac",
linux: "linux"
};
// Inject deno.platform.arch and deno.platform.os
2018-09-20 06:13:59 +00:00
function platform({ include, exclude } = {}) {
if (!include) {
throw new Error("include option must be passed");
}
const filter = createFilter(include, exclude);
return {
name: "platform",
/**
* @param {any} _code
* @param {string} id
*/
transform(_code, id) {
if (filter(id)) {
// Adapted from https://github.com/rollup/rollup-plugin-inject/blob/master/src/index.js
const arch = archNodeToDeno[process.arch];
const os = osNodeToDeno[process.platform];
2018-10-04 11:20:14 +00:00
// We do not have to worry about the interface here, because this is just to generate
// the actual runtime code, not any type information integrated into Deno
2018-09-20 06:13:59 +00:00
const magicString = new MagicString(`
2018-10-04 11:20:14 +00:00
export const platform = { arch: "${arch}", os:"${os}" };`);
2018-09-20 06:13:59 +00:00
return {
code: magicString.toString(),
map: magicString.generateMap()
};
}
}
};
}
2018-07-26 03:07:50 +00:00
// This plugin resolves at bundle time any generated resources that are
// in the build path under `gen` and specified with a MID starting with `gen/`.
// The plugin assumes that the MID needs to have the `.ts` extension appended.
function resolveGenerated() {
return {
name: "resolve-msg-generated",
resolveId(importee) {
if (importee.startsWith("gen/msg_generated")) {
2018-07-26 03:07:50 +00:00
const resolved = path.resolve(
path.join(process.cwd(), `${importee}.ts`)
);
return resolved;
}
}
};
}
2018-07-22 01:14:52 +00:00
export default function makeConfig(commandOptions) {
return {
output: {
format: "iife",
name: "denoMain",
sourcemap: true
},
plugins: [
2018-09-20 06:13:59 +00:00
// inject platform and arch from Node
platform({
include: [platformPath]
}),
2018-07-22 01:14:52 +00:00
// would prefer to use `rollup-plugin-virtual` to inject the empty module, but there
// is an issue with `rollup-plugin-commonjs` which causes errors when using the
// virtual plugin (see: rollup/rollup-plugin-commonjs#315), this means we have to use
// a physical module to substitute
alias({
fs: mockPath,
path: mockPath,
os: mockPath,
crypto: mockPath,
buffer: mockPath,
module: mockPath
}),
2018-08-07 20:27:31 +00:00
// Provides inlining of file contents for `js/assets.ts`
strings({
include: [
"*.d.ts",
`${__dirname}/**/*.d.ts`,
`${process.cwd()}/**/*.d.ts`
]
}),
2018-07-26 03:07:50 +00:00
// Resolves any resources that have been generated at build time
resolveGenerated(),
2018-07-22 01:14:52 +00:00
// Allows rollup to resolve modules based on Node.js resolution
nodeResolve({
jsnext: true,
main: true
}),
// Allows rollup to import CommonJS modules
commonjs({
namedExports: {
// Static analysis of `typescript.js` does detect the exports properly, therefore
2018-09-06 14:05:14 +00:00
// rollup requires them to be explicitly defined to make them available in the
// bundle
2018-07-22 01:14:52 +00:00
[typescriptPath]: [
"createLanguageService",
"formatDiagnosticsWithColorAndContext",
"ModuleKind",
2018-09-06 14:05:14 +00:00
"ScriptKind",
2018-07-22 01:14:52 +00:00
"ScriptSnapshot",
"ScriptTarget",
"version"
]
}
}),
typescriptPlugin({
2018-07-26 03:07:50 +00:00
// The build script is invoked from `out/:target` so passing an absolute file path is needed
2018-07-22 01:14:52 +00:00
tsconfig,
2018-07-26 03:07:50 +00:00
// This provides any overrides to the `tsconfig.json` that are needed to bundle
tsconfigOverride,
// This provides the locally configured version of TypeScript instead of the plugins
// default version
typescript,
2018-07-22 01:14:52 +00:00
// By default, the include path only includes the cwd and below, need to include the root of the project
2018-07-26 03:07:50 +00:00
// and build path to be passed to this plugin. This is different front tsconfig.json include
include: ["*.ts", `${__dirname}/**/*.ts`, `${process.cwd()}/**/*.ts`],
2018-07-22 01:14:52 +00:00
// d.ts files are not bundled and by default like include, it only includes the cwd and below
2018-07-26 15:01:17 +00:00
exclude: [
"*.d.ts",
`${__dirname}/**/*.d.ts`,
`${process.cwd()}/**/*.d.ts`
]
2018-07-22 01:14:52 +00:00
}),
// Provide some concise information about the bundle
analyze({
skipFormatted: true,
onAnalysis({
bundleSize,
bundleOrigSize,
bundleReduction,
moduleCount
}) {
if (!commandOptions.silent) {
console.log(
`Bundle size: ${Math.round((bundleSize / 1000000) * 100) / 100}Mb`
);
console.log(
`Original size: ${Math.round((bundleOrigSize / 1000000) * 100) /
100}Mb`
);
console.log(`Reduction: ${bundleReduction}%`);
console.log(`Module count: ${moduleCount}`);
}
}
}),
// source-map-support, which is required by TypeScript to support source maps, requires Node.js Buffer
// implementation. This needs to come at the end of the plugins because of the impact it has on
// the existing runtime environment, which breaks other plugins and features of the bundler.
globals()
]
};
}