2018-07-21 21:14:52 -04: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";
|
2018-07-27 02:51:19 -04:00
|
|
|
import typescriptPlugin from "rollup-plugin-typescript2";
|
2018-07-21 21:14:52 -04:00
|
|
|
import { createFilter } from "rollup-pluginutils";
|
2018-07-27 02:51:19 -04:00
|
|
|
import typescript from "typescript";
|
2018-09-20 02:13:59 -04:00
|
|
|
import MagicString from "magic-string";
|
2018-07-21 21:14:52 -04:00
|
|
|
|
2018-07-31 05:16:53 -04:00
|
|
|
const mockPath = path.join(__dirname, "js", "mock_builtin.js");
|
2018-09-20 02:13:59 -04:00
|
|
|
const platformPath = path.join(__dirname, "js", "platform.ts");
|
2018-07-21 21:14:52 -04:00
|
|
|
const tsconfig = path.join(__dirname, "tsconfig.json");
|
|
|
|
const typescriptPath = `${
|
|
|
|
process.env.BASEPATH
|
|
|
|
}/third_party/node_modules/typescript/lib/typescript.js`;
|
|
|
|
|
2018-07-25 23:07:50 -04: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-09-01 13:47:13 -04:00
|
|
|
// this is a preamble for the `globals.d.ts` file to allow it to be the default
|
|
|
|
// lib for deno.
|
|
|
|
const libPreamble = `/// <reference no-default-lib="true"/>
|
|
|
|
/// <reference lib="esnext" />
|
|
|
|
`;
|
|
|
|
|
2018-07-21 21:14:52 -04: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 16:27:31 -04:00
|
|
|
/**
|
|
|
|
* @param {string} importee
|
|
|
|
*/
|
2018-07-21 21:14:52 -04:00
|
|
|
resolveId(importee) {
|
|
|
|
if (importee.endsWith("!string")) {
|
2018-08-07 16:27:31 -04:00
|
|
|
// strip the `!string` from `importee`
|
|
|
|
importee = importee.slice(0, importee.lastIndexOf("!string"));
|
|
|
|
if (!importee.startsWith("gen/")) {
|
2018-09-01 10:45:26 -04:00
|
|
|
// this is a static asset which is located relative to the root of
|
|
|
|
// the source project
|
2018-08-07 16:27:31 -04:00
|
|
|
return path.resolve(path.join(process.env.BASEPATH, importee));
|
|
|
|
}
|
2018-09-01 10:45:26 -04:00
|
|
|
// 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-21 21:14:52 -04:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2018-08-07 16:27:31 -04:00
|
|
|
/**
|
|
|
|
* @param {any} code
|
|
|
|
* @param {string} id
|
|
|
|
*/
|
2018-07-21 21:14:52 -04:00
|
|
|
transform(code, id) {
|
|
|
|
if (filter(id)) {
|
|
|
|
return {
|
2018-09-01 13:47:13 -04:00
|
|
|
code: `export default ${JSON.stringify(
|
|
|
|
id.endsWith("globals.d.ts") ? libPreamble + code : code
|
|
|
|
)};`,
|
2018-07-21 21:14:52 -04:00
|
|
|
map: { mappings: "" }
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2018-10-02 12:25:49 -04:00
|
|
|
const archNodeToDeno = {
|
|
|
|
x64: "x64"
|
|
|
|
};
|
|
|
|
const osNodeToDeno = {
|
|
|
|
win32: "win",
|
|
|
|
darwin: "mac",
|
|
|
|
linux: "linux"
|
|
|
|
};
|
|
|
|
|
|
|
|
// Inject deno.platform.arch and deno.platform.os
|
2018-09-20 02:13:59 -04: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
|
2018-10-02 12:25:49 -04:00
|
|
|
const arch = archNodeToDeno[process.arch];
|
|
|
|
const os = osNodeToDeno[process.platform];
|
2018-10-04 07:20:14 -04: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 02:13:59 -04:00
|
|
|
const magicString = new MagicString(`
|
2018-10-04 07:20:14 -04:00
|
|
|
export const platform = { arch: "${arch}", os:"${os}" };`);
|
2018-09-20 02:13:59 -04:00
|
|
|
return {
|
|
|
|
code: magicString.toString(),
|
|
|
|
map: magicString.generateMap()
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2018-07-25 23:07:50 -04: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) {
|
2018-09-01 10:45:26 -04:00
|
|
|
if (importee.startsWith("gen/msg_generated")) {
|
2018-07-25 23:07:50 -04:00
|
|
|
const resolved = path.resolve(
|
|
|
|
path.join(process.cwd(), `${importee}.ts`)
|
|
|
|
);
|
|
|
|
return resolved;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2018-07-21 21:14:52 -04:00
|
|
|
export default function makeConfig(commandOptions) {
|
|
|
|
return {
|
|
|
|
output: {
|
|
|
|
format: "iife",
|
|
|
|
name: "denoMain",
|
|
|
|
sourcemap: true
|
|
|
|
},
|
|
|
|
|
|
|
|
plugins: [
|
2018-09-20 02:13:59 -04:00
|
|
|
// inject platform and arch from Node
|
|
|
|
platform({
|
|
|
|
include: [platformPath]
|
|
|
|
}),
|
|
|
|
|
2018-07-21 21:14:52 -04: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 16:27:31 -04:00
|
|
|
// Provides inlining of file contents for `js/assets.ts`
|
|
|
|
strings({
|
|
|
|
include: [
|
|
|
|
"*.d.ts",
|
|
|
|
`${__dirname}/**/*.d.ts`,
|
|
|
|
`${process.cwd()}/**/*.d.ts`
|
|
|
|
]
|
|
|
|
}),
|
|
|
|
|
2018-07-25 23:07:50 -04:00
|
|
|
// Resolves any resources that have been generated at build time
|
|
|
|
resolveGenerated(),
|
|
|
|
|
2018-07-21 21:14:52 -04: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 10:05:14 -04:00
|
|
|
// rollup requires them to be explicitly defined to make them available in the
|
|
|
|
// bundle
|
2018-07-21 21:14:52 -04:00
|
|
|
[typescriptPath]: [
|
|
|
|
"createLanguageService",
|
|
|
|
"formatDiagnosticsWithColorAndContext",
|
|
|
|
"ModuleKind",
|
2018-09-06 10:05:14 -04:00
|
|
|
"ScriptKind",
|
2018-07-21 21:14:52 -04:00
|
|
|
"ScriptSnapshot",
|
|
|
|
"ScriptTarget",
|
|
|
|
"version"
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
|
2018-07-27 02:51:19 -04:00
|
|
|
typescriptPlugin({
|
2018-07-25 23:07:50 -04:00
|
|
|
// The build script is invoked from `out/:target` so passing an absolute file path is needed
|
2018-07-21 21:14:52 -04:00
|
|
|
tsconfig,
|
|
|
|
|
2018-07-25 23:07:50 -04:00
|
|
|
// This provides any overrides to the `tsconfig.json` that are needed to bundle
|
|
|
|
tsconfigOverride,
|
|
|
|
|
2018-07-27 02:51:19 -04:00
|
|
|
// This provides the locally configured version of TypeScript instead of the plugins
|
|
|
|
// default version
|
|
|
|
typescript,
|
|
|
|
|
2018-07-21 21:14:52 -04:00
|
|
|
// By default, the include path only includes the cwd and below, need to include the root of the project
|
2018-07-25 23:07:50 -04: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-21 21:14:52 -04:00
|
|
|
|
|
|
|
// d.ts files are not bundled and by default like include, it only includes the cwd and below
|
2018-07-26 11:01:17 -04:00
|
|
|
exclude: [
|
|
|
|
"*.d.ts",
|
|
|
|
`${__dirname}/**/*.d.ts`,
|
|
|
|
`${process.cwd()}/**/*.d.ts`
|
|
|
|
]
|
2018-07-21 21:14:52 -04: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()
|
|
|
|
]
|
|
|
|
};
|
|
|
|
}
|