@cybozu/duck
Serves and builds an app with Google Closure Compiler/Library/Templates. An alternative to plovr.
Install
$ npm i -D @cybozu/duck
Usage
duck <command>
Commands:
duck serve [entryConfigDir] Start dev server
duck build [entryConfigDir] Build Soy, deps.js and JS
duck build:js [entryConfigDir] Compile JS files
duck build:soy Compile Soy templates
duck build:deps Generate deps.js
duck clean:soy Remove all compiled .soy.js
duck clean:deps Remove generated deps.js
duck completion Generate completion script for bash/zsh
Options:
-v, --version Show version number [boolean]
-h, --help Show help [boolean]
CLI options overwrite config file
duck serve
duck serve [entryConfigDir]
Start dev server
Options:
--inputsRoot A root directory to serve [string]
--closureLibraryDir A root directory of Closure Library [string]
--depsJs A path to deps.js to save and load [string]
--depsWorkers The number of workers to analyze deps [number] [default: 4]
--config A path to duck.config.js, the extension can be ommited [string]
--nonTTY, --noTTY, -n Output in nonTTY mode [boolean] [default: false]
--skipInitialBuild, -s Skip initial building of Soy and deps.js [boolean] [default: false]
--port A port number to listen [number] [default: 9810]
--host A host to listen [string] [default: "localhost"]
-v, --version Show version number [boolean]
-h, --help Show help [boolean]
duck build
duck build [entryConfigDir]
Build Soy, deps.js and JS
Options:
--entryConfigs, -e Entry config files (this option ignores entryConfigDir) [array]
--closureLibraryDir A root directory of Closure Library [string]
--config A path to duck.config.js, the extension can be ommited [string]
--concurrency, -c Concurrency limit of Closure Compiler [number]
--batch Build in batch mode (on AWS or local for debug)[choices: "aws", "local"]
--reporters Test reporters ("text", "xunit" or "json") [array] [default: ["text"]]
--reporterOptions Test reporter options
--printConfig, -p Print effective configs for compilers [boolean] [default: false]
--depsJs A path to deps.js to save and load [string]
--nonTTY, --noTTY, -n Output in nonTTY mode [boolean] [default: false]
--depsWorkers The number of workers to analyze deps [number] [default: 4]
--skipInitialBuild, -s Skip initial building of Soy and deps.js [boolean] [default: false]
--soyJarPath A path to Soy.jar [string]
--soyFileRoots Root directories of soy files [array]
--soyClasspaths Classpaths for Closure Templates [array]
--watch, -w Re-compile incrementally when files change [boolean] [default: false]
-v, --version Show version number [boolean]
-h, --help Show help [boolean]
duck.config.js
Create a config file duck.config.js
or duck.config.json
on your project root.
Set every path as a relative path from the location of duck.config.js
.
module.exports = {
closureLibraryDir: "node_modules/google-closure-library",
entryConfigDir: "entry-configs",
depsJs: "build/deps.js",
depsJsIgnoreDirs: ["src/third_party"],
depsWorkers: 2,
soyJarPath: "lib/closure-templates.jar",
soyFileRoots: ["src/js"],
soyClasspaths: ["lib/plugin.jar"],
soySrcsRelativeFrom: "src",
soyOptions: {
outputDirectory: "src/js/soy",
},
concurrency: 4,
batch: "aws",
batchAwsCustomCompiler: {
name: "my-custom-closure-compiler",
version: "^1.0.0",
},
batchMaxChunkSize?: number;
batchOptions: {},
reporters: ["text", "xunit"],
reporterOptions: {
text: {
stderr: false,
outputDir: "test-results/text",
},
xunit: {},
},
inputsRoot: "src/inputs",
host: "localhost",
port: 1234,
http2: true,
https: {
keyPath: "path/to/key.pem",
certPath: "path/to/cert.pem",
},
};
Also see examples
.
Limitation
- Closure Compiler >=
v20180910.0.0
- Closure Templates >=
2019-03-07
- Closure Library <
v20200224.0.0
(partial)
- google-closure-deps >=
v20210406
Tips
Batch mode using AWS Lambda
duck provides batch mode that compiles all entry points simultaneously in parallel on AWS Lambda with faast.js.
- Setting AWS credentials in Node.js (See AWS document)
- Configure
batchOptions
in duck.config.js
. It's used for faast.js as AWSOptions.
const closureVersion = require("google-closure-compiler/package.json").version;
module.exports = {
batchOptions: {
region: "ap-northeast-1",
awsLambdaOptions: {
Runtime: "nodejs10.x",
},
include: ["path/to/your/source/**/*.js"],
exclude: ["**/*_spec.js"],
packageJson: {
dependencies: {
"google-closure-compiler-linux": closureVersion,
"google-closure-library": closureVersion,
},
},
},
};
- Run
build
or build:js
command with --batch aws
.
$ duck build --batch aws
How to debug in batch mode?
- Use
--batch local
for local debugging - Use
DEBUG=faast:info
or other log level to get more debug information - Get
logUrl
from debug info and view it in CloudWatch logs - Use
FAAST_PACKAGE_DIR=foo/bar
to investigate a package sent to Lambda
Also see faast.js document for more information.
How to use HTTPS and HTTP2 in duck serve
?
Create a self-signed certificate like
$ openssl req -x509 -newkey rsa:4096 -keyout duck-key.pem -out duck-cert.pem -days 365 -nodes -subj '/CN=localhost'
Then specify them and enable http2
in duck.config.js
.
module.exports = {
http2: true,
https: {
keyPath: "./path/to/duck-key.pem",
certPath: "./path/to/duck-cert.pem",
},
};
bash/zsh-completion for commands and options
Initial setting:
$ duck completion >> ~/.bashrc
# or
$ duck completion >> ~/.zshrc
Then, you can complete commands and options with TAB !
$ duck build:<TAB>
build:deps -- Generate deps.js
build:js -- Compile JS files
build:soy -- Compile Soy templates
License
MIT License: Cybozu, Inc.