Installations
npm install ngc-webpack
Releases
Unable to fetch releases
Developer
shlomiassaf
Developer Guide
Module System
CommonJS
Min. Node Version
Typescript Support
No
Node Version
8.9.1
NPM Version
5.5.1
Statistics
84 Stars
59 Commits
15 Forks
11 Watching
5 Branches
6 Contributors
Updated on 13 Mar 2024
Languages
TypeScript (87.29%)
JavaScript (10.67%)
HTML (1.17%)
CSS (0.48%)
Shell (0.4%)
Total Downloads
Cumulative downloads
Total Downloads
1,990,757
Last day
-35.9%
186
Compared to previous day
Last week
-3.5%
1,199
Compared to previous week
Last month
-8.8%
4,879
Compared to previous month
Last year
-16.8%
53,774
Compared to previous year
Daily Downloads
Weekly Downloads
Monthly Downloads
Yearly Downloads
Dependencies
9
Peer Dependencies
2
Dev Dependencies
49
ngc-webpack
@ngtools/webpack wrapper with hooks into the compilation process and library mode compilation support.
Application mode:
AOT compilation for an application.
Library mode:
AOT compilation for a library.
Library mode is the simple compile process we know from tsc
/ ngc
where each module (TS
file) is compiled into a matching JS
file.
The output files can then bundle up with RollUp to create various bundle formats for published libraries (FESM, FESM2015, UMD, etc.)
This process is fairly simple as is but with the angular AOT compiler in the middle things are a bit more complex.
@ngtools/webpack
does not support library compilation and it is (1.8.x)
designed for application bundling only.
The @angular/compiler-cli
does support library compilation through its
ngc
command line utility but it does not know about webpack,
resources will not go through the loader chain and so using formats not
supported by the angular cli will not work (SCSS, LESS etc).
Additionally, templareUrl
and stylesUrls
are left as is which is not
suitable for libraries, resources must get inlined into the sources code (JS)
and the AOT generated metadata.json
files.
Webpack based projects:
ngc-webpack
library mode allows AOT compilation for libraries through
a CLI interface (ngc-w
) or directly using it via node API with
full support for inline and complete webpack loader chain compilation (for resources).
Angular CLI based projects:
ngc-webpack
also support library compilation for @angular/cli
projects
by importing the configuration from the cli and using it to build libraries.
This works great with monorepos and setup's based on nrwl's Nx
.
Also available by CLI interface (ngc-w-cli
) or node API.
For more information see:
Library mode is experimental as it uses experimental API from angular packages.
Background:
ngc-webpack
started as a wrapper for @angular/compiler-cli
when angular
build tools were limited.
It offered non @angular/cli
users the ability to perform an AOT builds
with all the required operations while still using a dedicated typescript
loader (e.g. ts-loader
, awesome-typescript-loader
).
With version 5 of angular, the compiler-cli
introduces a dramatic
refactor in the compilation process, enabling watch mode for AOT and
moving to a (almost) native TS compilation process using transformers.
The support angular 5, a complete rewrite for ngc-webpack
was required.
Since @ngtools/webpack
is now a mature plugin with a rich feature set
and core team support it is not smart (IMHO) to try and re-implement it.
This is why, from version 4 of ngc-webpack
, the library will wrap
@ngtools/webpack
and only provide hooks into the compilation process.
The implications are:
- Using
ngc-webpack
is safe, at any point you can move to@ngtools/webpack
. - All features of
@ngtools/webpack
will work sincengc-webpack
acts as a proxy. This includes i18n support which was not included inngc-webpack
3.x.x - You can hack your way into the AOT compilation process, which opens a lot of options, especially for library compilation.
- Using a custom typescript loader is no longer supported, you need to
use the loader provided with
@ngtools/webpack
(for JIT see Using custom TypeScript loaders)
Porting to/from `@ngtools/webpack
Using ngc-webpack
as a proxy to @ngtools/webpack
is safe and allows
quick and transparent porting between the libraries.
In fact, if you use ngc-webpack
without using it's extensibility
features you probably better of using @ngtools/webpack
directly instead.
When using ngc-webpack
features, including library compilation mode,
you should be aware that ngc-webpack
is using experimental angular APIs
as well as internal implementation of angular code to allow extensibility.
Usage:
1npm install ngc-webpack -D
webpack.config.js
1{ 2 module: { 3 rules: [ 4 { 5 test: /(?:\.ngfactory\.js|\.ngstyle\.js|\.ts)$/, 6 use: [ '@ngtools/webpack' ] 7 } 8 ] 9 }, 10 plugins: [ 11 new ngcWebpack.NgcWebpackPlugin({ 12 AOT: true, // alias for skipCodeGeneration: false 13 tsConfigPath: './tsconfig.json', 14 mainPath: 'src/main.ts' // will auto-detect the root NgModule. 15 }) 16 ] 17}
Advanced AOT production builds:
Production builds must be AOT compiled, this is clear, but we can optimize
the build even further, and the angular team has us covered using
'@angular-devkit/build-optimizer
:
webpack.config.js
1const PurifyPlugin = require('@angular-devkit/build-optimizer').PurifyPlugin; 2 3const AOT = true; 4 5const tsLoader = { 6 test: /(?:\.ngfactory\.js|\.ngstyle\.js|\.ts)$/, 7 use: [ '@ngtools/webpack' ] 8}; 9 10if (AOT) { 11 tsLoader.use.unshift({ 12 loader: '@angular-devkit/build-optimizer/webpack-loader', 13 // options: { sourceMap: true } 14 }); 15} 16 17return { 18 module: { 19 rules: [ 20 tsLoader 21 ] 22 }, 23 plugins: [ 24 new ngcWebpack.NgcWebpackPlugin({ 25 AOT, // alias for skipCodeGeneration: false 26 tsConfigPath: './tsconfig.json', 27 mainPath: 'src/main.ts' // will auto-detect the root NgModule. 28 }).concat(AOT ? [ new PurifyPlugin() ] : []), 29 ] 30}
The examples above are super simplified and describe the basic units for compilation, the
@angular/cli
uses them but with a lot more loaders/plugins/logic.
For more information about setting up the plugin see @ngtools/webpack
NgcWebpackPluginOptions:
The plugin accepts an options object of type NgcWebpackPluginOptions
.
NgcWebpackPluginOptions
extends AngularCompilerPluginOptions so
all @ngtools/webpack
options apply.
NgcWebpackPluginOptions
adds the following options:
1export interface NgcWebpackPluginOptions extends AngularCompilerPluginOptions { 2 3 /** 4 * An alias for `AngularCompilerPluginOptions.skipCodeGeneration` simply to make it more readable. 5 * If `skipCodeGeneration` is set, this value is ignored. 6 * If this value is not set, the default value is taken from `skipCodeGeneration` 7 * (which means AOT = true) 8 */ 9 AOT?: boolean; 10 11 /** 12 * A hook that invokes before the plugin start the compilation process (compiler 'run' event). 13 * ( resourceCompiler: { get(filename: string): Promise<string> }) => Promise<void>; 14 * 15 * The hook accepts a resource compiler which able (using webpack) to perform compilation on 16 * files using webpack's loader chain and return the final content. 17 * @param resourceCompiler 18 */ 19 beforeRun?: BeforeRunHandler 20 21 /** 22 * Transform a source file (ts, js, metadata.json, summery.json). 23 * If `predicate` is true invokes `transform` 24 * 25 * > Run's in both AOT and JIT mode on all files, internal and external as well as resources. 26 * 27 * 28 * - Do not apply changes to resource files using this hook when in AOT mode, it will not commit. 29 * - Do not apply changes to resource files in watch mode. 30 * 31 * Note that source code transformation is sync, you can't return a promise (contrary to `resourcePathTransformer`). 32 * This means that you can not use webpack compilation (or any other async process) to alter source code context. 33 * If you know the files you need to transform, use the `beforeRun` hook. 34 */ 35 readFileTransformer?: ReadFileTransformer; 36 37 38 /** 39 * Transform the path of a resource (html, css, etc) 40 * (path: string) => string; 41 * 42 * > Run's in AOT mode only and on metadata resource files (templateUrl, styleUrls) 43 */ 44 resourcePathTransformer?: ResourcePathTransformer; 45 46 /** 47 * Transform a resource (html, css etc) 48 * (path: string, source: string) => string | Promise<string>; 49 * 50 * > Run's in AOT mode only and on metadata resource files (templateUrl, styleUrls) 51 */ 52 resourceTransformer?: ResourceTransformer; 53 54 /** 55 * Add custom TypeScript transformers to the compilation process. 56 * 57 * Transformers are applied after the transforms added by `@angular/compiler-cli` and 58 * `@ngtools/webpack`. 59 * 60 * > `after` transformers are currently not supported. 61 */ 62 tsTransformers?: ts.CustomTransformers; 63}
Optional Patching:
ngc-webpack
comes with optional patches to angular, these are workarounds
to existing issue that will probably get fixed in the future making the patch
obsolete. Patch's address specific use case so make sure you apply them only
if required.
disableExpressionLowering
fix (@angular/compiler-cli
):
The compiler-cli
(version 5.0.1) comes with a new feature called
lowering expressions which basically means we can now use arrow
functions in decorator metadata (usually provider metadata)
This feature has bug the will throw when setting an arrow function:
1export function MyPropDecorator(value: () => any) { 2 return (target: Object, key: string) => { } 3} 4 5export class MyClass { 6 @MyPropDecorator(() => 15) // <- will throw because of this 7 prop: string; 8}
The compiler will lower the expression to:
1export const ɵ0 = function () { return 15; };
but in the TS compilation process will fail because of a TS bug.
This is an edge case which you probably don't care about, but if so there are 2 options to workaround:
- Set
disableExpressionLowering
to false intsconfig.json
angularCompilerOptions
- Import a patch, at the top of your webpack config module:
1 require('ngc-webpack/src/patch-angular-compiler-cli');
The issue should be fixed in next versions. See https://github.com/angular/angular/issues/20216
Using custom TypeScript loaders
From ngc-webpack
4 using a custom ts loader is not supported for AOT
compilation and partially supported for JIT.
If you must use your own TS Loader for JIT, you can do so. This is not recommended mainly because of the mis alignment between the compilations.
To use a custom loader (JIT only), remove the @ngtools/webpack
loader
and set your own loader. To support lazy loaded modules, use a module
loader that can detect them (e.g. ng-router-loader)
Use case
The feature set within ngc-webpack
is getting more and more specific.
The target audience is small as most developers will not require hooking
into the compilation.
It is mostly suitable for library builds, where you can control the metadata output, inline code and more...
I personally use it to restyle material from the ground.
The plugin enables re-writing of the index.metadata.json
files on
the fly which allows sending custom styles to the compiler instead of
the ones that comes with material.
Future
Because ngc-webpack
becomes a niche, I believe integrating the hooks
into @ngtools/webpack
makes sense and then deprecating the library while
easy porting to @ngtools/webpack
. If someone would like to help working
on it, please come forward :)
I believe it angular team is open to such idea since @ngtools/webpack
is separated from the cli.
No vulnerabilities found.
Reason
no binaries found in the repo
Reason
license file detected
Details
- Info: project has a license file: LICENSE:0
- Info: FSF or OSI recognized license: MIT License: LICENSE:0
Reason
Found 2/30 approved changesets -- score normalized to 0
Reason
0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Reason
no effort to earn an OpenSSF best practices badge detected
Reason
project is not fuzzed
Details
- Warn: no fuzzer integrations found
Reason
security policy file not detected
Details
- Warn: no security policy file detected
- Warn: no security file to analyze
- Warn: no security file to analyze
- Warn: no security file to analyze
Reason
branch protection not enabled on development/release branches
Details
- Warn: branch protection not enabled for branch 'master'
Reason
SAST tool is not run on all commits -- score normalized to 0
Details
- Warn: 0 commits out of 9 are checked with a SAST tool
Reason
150 existing vulnerabilities detected
Details
- Warn: Project is vulnerable to: GHSA-c75v-2vq8-878f
- Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw
- Warn: Project is vulnerable to: GHSA-whgm-jr23-g3j9
- Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw
- Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25
- Warn: Project is vulnerable to: GHSA-8w4h-3cm3-2pm2
- Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92
- Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7
- Warn: Project is vulnerable to: GHSA-cwfw-4gq5-mrqx
- Warn: Project is vulnerable to: GHSA-g95f-p29q-9xw4
- Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg
- Warn: Project is vulnerable to: GHSA-x9w5-v3q2-3rhw
- Warn: Project is vulnerable to: GHSA-c6rq-rjc2-86v2
- Warn: Project is vulnerable to: GHSA-wxhq-pm8v-cw75
- Warn: Project is vulnerable to: GHSA-257v-vj4p-3w2h
- Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x
- Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275
- Warn: Project is vulnerable to: GHSA-rq8g-5pc5-wrhr
- Warn: Project is vulnerable to: GHSA-p28h-cc7q-c4fg
- Warn: Project is vulnerable to: GHSA-9vvw-cc9w-f27h
- Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c
- Warn: Project is vulnerable to: GHSA-hr2v-3952-633q
- Warn: Project is vulnerable to: GHSA-h6ch-v84p-w6p9
- Warn: Project is vulnerable to: GHSA-3wcq-x3mq-6r9p
- Warn: Project is vulnerable to: GHSA-phwq-j96m-2c2q
- Warn: Project is vulnerable to: GHSA-ghr5-ch3p-vcr6
- Warn: Project is vulnerable to: GHSA-vh7m-p724-62c2
- Warn: Project is vulnerable to: GHSA-r9p9-mrjm-926w
- Warn: Project is vulnerable to: GHSA-434g-2637-qmqr
- Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m
- Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw
- Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p
- Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747
- Warn: Project is vulnerable to: GHSA-4gmj-3p3h-gm8h
- Warn: Project is vulnerable to: GHSA-6h5x-7c5m-7cr7
- Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc
- Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx
- Warn: Project is vulnerable to: GHSA-qrmc-fj45-qfc2
- Warn: Project is vulnerable to: GHSA-8r6j-v8pm-fqw3
- Warn: Project is vulnerable to: MAL-2023-462
- Warn: Project is vulnerable to: GHSA-xf7w-r453-m56c
- Warn: Project is vulnerable to: GHSA-qh2h-chj9-jffq
- Warn: Project is vulnerable to: GHSA-q42p-pg8m-cqh6
- Warn: Project is vulnerable to: GHSA-2cf5-4w76-r9qv
- Warn: Project is vulnerable to: GHSA-3cqr-58rm-57f8
- Warn: Project is vulnerable to: GHSA-g9r4-xpmj-mj65
- Warn: Project is vulnerable to: GHSA-q2c6-c6pm-g3gh
- Warn: Project is vulnerable to: GHSA-w457-6q6x-cgp9
- Warn: Project is vulnerable to: GHSA-9prh-257w-9277
- Warn: Project is vulnerable to: GHSA-765h-qjxv-5f44
- Warn: Project is vulnerable to: GHSA-f2jv-r9rf-7988
- Warn: Project is vulnerable to: GHSA-62gr-4qp9-h98f
- Warn: Project is vulnerable to: GHSA-f52g-6jhx-586p
- Warn: Project is vulnerable to: GHSA-44pw-h2cw-w3vq
- Warn: Project is vulnerable to: GHSA-jp4x-w63m-7wgm
- Warn: Project is vulnerable to: GHSA-c429-5p7v-vgjp
- Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj
- Warn: Project is vulnerable to: GHSA-pfq8-rq6v-vf5m
- Warn: Project is vulnerable to: GHSA-6x33-pw7p-hmpq
- Warn: Project is vulnerable to: GHSA-c7qv-q95q-8v27
- Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37
- Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22
- Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp
- Warn: Project is vulnerable to: GHSA-7r28-3m3f-r2pr
- Warn: Project is vulnerable to: GHSA-r8j5-h5cx-65gg
- Warn: Project is vulnerable to: GHSA-2pr6-76vf-7546
- Warn: Project is vulnerable to: GHSA-8j8c-7jfh-h6hx
- Warn: Project is vulnerable to: GHSA-896r-f27r-55mw
- Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h
- Warn: Project is vulnerable to: GHSA-76p3-8jx3-jpfq
- Warn: Project is vulnerable to: GHSA-3rfm-jhwj-7488
- Warn: Project is vulnerable to: GHSA-hhq3-ff78-jv3g
- Warn: Project is vulnerable to: GHSA-fvqr-27wr-82fm
- Warn: Project is vulnerable to: GHSA-4xc9-xhrj-v574
- Warn: Project is vulnerable to: GHSA-x5rq-j2xg-h7qm
- Warn: Project is vulnerable to: GHSA-jf85-cpcp-j695
- Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw
- Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9
- Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm
- Warn: Project is vulnerable to: GHSA-5947-m4fg-xhqg
- Warn: Project is vulnerable to: GHSA-779f-wgxg-qr8f
- Warn: Project is vulnerable to: GHSA-pp57-mqmh-44h7
- Warn: Project is vulnerable to: GHSA-4xcv-9jjx-gfj3
- Warn: Project is vulnerable to: GHSA-f9cm-qmx5-m98h
- Warn: Project is vulnerable to: GHSA-7wpw-2hjm-89gp
- Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv
- Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3
- Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m / GHSA-xvch-5gv4-984h
- Warn: Project is vulnerable to: GHSA-3mpr-hq3p-49h9
- Warn: Project is vulnerable to: GHSA-fhjf-83wg-r2j9
- Warn: Project is vulnerable to: GHSA-92xj-mqp7-vmcj
- Warn: Project is vulnerable to: GHSA-wxgw-qj99-44c2
- Warn: Project is vulnerable to: GHSA-5rrq-pxf6-6jx5
- Warn: Project is vulnerable to: GHSA-8fr3-hfg3-gpgp
- Warn: Project is vulnerable to: GHSA-gf8q-jrpm-jvxq
- Warn: Project is vulnerable to: GHSA-2r2c-g63r-vccr
- Warn: Project is vulnerable to: GHSA-cfm4-qjh2-4765
- Warn: Project is vulnerable to: GHSA-x4jg-mjrx-434g
- Warn: Project is vulnerable to: GHSA-5fw9-fq32-wv5p
- Warn: Project is vulnerable to: GHSA-9v62-24cr-58cx
- Warn: Project is vulnerable to: GHSA-r8f7-9pfq-mjmv
- Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr
- Warn: Project is vulnerable to: GHSA-6394-6h9h-cfjg
- Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9
- Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j
- Warn: Project is vulnerable to: GHSA-566m-qj78-rww5
- Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j
- Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp
- Warn: Project is vulnerable to: GHSA-hxcm-v35h-mg2x
- Warn: Project is vulnerable to: GHSA-6g33-f262-xjp4
- Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6
- Warn: Project is vulnerable to: GHSA-7mwh-4pqv-wmr8
- Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw
- Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg
- Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p
- Warn: Project is vulnerable to: GHSA-jv35-xqg7-f92r
- Warn: Project is vulnerable to: GHSA-4g88-fppr-53pp
- Warn: Project is vulnerable to: GHSA-4jqc-8m5r-9rpr
- Warn: Project is vulnerable to: GHSA-c9g6-9335-x697
- Warn: Project is vulnerable to: GHSA-2m39-62fm-q8r3
- Warn: Project is vulnerable to: GHSA-325j-24f4-qv5x
- Warn: Project is vulnerable to: GHSA-mf6x-7mm4-x2g7
- Warn: Project is vulnerable to: GHSA-j44m-qm6p-hp7m
- Warn: Project is vulnerable to: GHSA-3jfq-g458-7qm9
- Warn: Project is vulnerable to: GHSA-5955-9wpr-37jh
- Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36
- Warn: Project is vulnerable to: GHSA-jgrx-mgxx-jf9v
- Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3
- Warn: Project is vulnerable to: GHSA-884p-74jh-xrg2
- Warn: Project is vulnerable to: GHSA-j7fq-p9q7-5wfv
- Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v
- Warn: Project is vulnerable to: GHSA-34r7-q49f-h37c
- Warn: Project is vulnerable to: GHSA-c9f4-xj24-8jqx
- Warn: Project is vulnerable to: GHSA-pv4c-p2j5-38j4
- Warn: Project is vulnerable to: GHSA-46c4-8wrp-j99v
- Warn: Project is vulnerable to: GHSA-9m6j-fcg5-2442
- Warn: Project is vulnerable to: GHSA-hh27-ffr2-f2jc
- Warn: Project is vulnerable to: GHSA-rqff-837h-mm52
- Warn: Project is vulnerable to: GHSA-8v38-pw62-9cw2
- Warn: Project is vulnerable to: GHSA-hgjh-723h-mx2j
- Warn: Project is vulnerable to: GHSA-jf5r-8hm2-f872
- Warn: Project is vulnerable to: GHSA-wr3j-pwj9-hqq6
- Warn: Project is vulnerable to: GHSA-cf66-xwfp-gvc4
- Warn: Project is vulnerable to: GHSA-4fc4-chg7-h8gh
- Warn: Project is vulnerable to: GHSA-g78m-2chm-r7qv
- Warn: Project is vulnerable to: GHSA-h6q6-9hqw-rwfv
- Warn: Project is vulnerable to: GHSA-5fg8-2547-mr8q
- Warn: Project is vulnerable to: GHSA-crh6-fp67-6883
- Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh
- Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp
Score
1.7
/10
Last Scanned on 2024-11-18
The Open Source Security Foundation is a cross-industry collaboration to improve the security of open source software (OSS). The Scorecard provides security health metrics for open source projects.
Learn MoreOther packages similar to ngc-webpack
webpack
Packs ECMAScript/CommonJs/AMD modules for the browser. Allows you to split your codebase into multiple bundles, which can be loaded on demand. Supports loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.
terser-webpack-plugin
Terser plugin for webpack
webpack-dev-middleware
A development middleware for webpack
schema-utils
webpack Validation Utils