@analogjs/vite-plugin-angular 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # @analogjs/vite-plugin-angular
2
+
3
+ A Vite plugin for building Angular applications
4
+
5
+ ## Install
6
+
7
+ yarn add @analogjs/vite-plugin-angular
8
+
9
+ ## Setup
10
+
11
+ Add the plugin to the `plugins` array in your Vite config
12
+
13
+ ```ts
14
+ import { defineConfig } from 'vite';
15
+ import angular from '@analogjs/vite-plugin-angular';
16
+
17
+ // https://vitejs.dev/config/
18
+ export default defineConfig({
19
+ resolve: {
20
+ mainFields: ['module'],
21
+ },
22
+
23
+ plugins: [angular()],
24
+ });
25
+ ```
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@analogjs/vite-plugin-angular",
3
+ "description": "Vite Plugin for Angular",
4
+ "version": "0.1.0",
5
+ "keywords": [
6
+ "vite-plugin",
7
+ "angular"
8
+ ],
9
+ "author": "Brandon Roberts <robertsbt@gmail.com>",
10
+ "license": "MIT",
11
+ "bugs": {
12
+ "url": "https://github.com/analogjs/analog/issues"
13
+ },
14
+ "homepage": "https://github.com/analogjs/analog#readme",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/analogjs/analog.git"
18
+ },
19
+ "peerDependencies": {
20
+ "@angular-devkit/build-angular": "^14.0.0",
21
+ "tslib": "^2.0.0"
22
+ },
23
+ "main": "./src/index.js",
24
+ "typings": "./src/index.d.ts",
25
+ "dependencies": {}
26
+ }
package/src/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import { angular } from './lib/angular-vite-plugin';
2
+ export default angular;
package/src/index.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const angular_vite_plugin_1 = require("./lib/angular-vite-plugin");
4
+ exports.default = angular_vite_plugin_1.angular;
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/vite-plugin-angular/src/index.ts"],"names":[],"mappings":";;AAAA,mEAAoD;AAEpD,kBAAe,6BAAO,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { BundleStylesheetOptions } from '@angular-devkit/build-angular/src/builders/browser-esbuild/stylesheets';
2
+ import * as ts from 'typescript';
3
+ import { Plugin } from 'vite';
4
+ interface EmitFileResult {
5
+ content?: string;
6
+ map?: string;
7
+ dependencies: readonly string[];
8
+ hash?: Uint8Array;
9
+ }
10
+ declare type FileEmitter = (file: string) => Promise<EmitFileResult | undefined>;
11
+ export declare function angular(pluginOptions?: {
12
+ tsconfig: string;
13
+ sourcemap: boolean;
14
+ advancedOptimizations: boolean;
15
+ }, styleOptions?: BundleStylesheetOptions): Plugin;
16
+ export declare function createFileEmitter(program: ts.BuilderProgram, transformers?: ts.CustomTransformers, onAfterEmit?: (sourceFile: ts.SourceFile) => void): FileEmitter;
17
+ export {};
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createFileEmitter = exports.angular = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const core_1 = require("@babel/core");
6
+ const fs_1 = require("fs");
7
+ const application_1 = require("@angular-devkit/build-angular/src/babel/presets/application");
8
+ const webpack_loader_1 = require("@angular-devkit/build-angular/src/babel/webpack-loader");
9
+ const ts = require("typescript");
10
+ const compiler_plugin_1 = require("@angular-devkit/build-angular/src/builders/browser-esbuild/compiler-plugin");
11
+ const load_esm_1 = require("@angular-devkit/build-angular/src/utils/load-esm");
12
+ function angular(pluginOptions = {
13
+ tsconfig: './tsconfig.app.json',
14
+ sourcemap: false,
15
+ advancedOptimizations: false,
16
+ }, styleOptions = {
17
+ optimization: false,
18
+ sourcemap: true,
19
+ }) {
20
+ // The file emitter created during `onStart` that will be used during the build in `onLoad` callbacks for TS files
21
+ let fileEmitter;
22
+ let compilerOptions = {};
23
+ // Temporary deep import for transformer support
24
+ const { mergeTransformers, replaceBootstrap, } = require('@ngtools/webpack/src/ivy/transformation');
25
+ const { augmentProgramWithVersioning, } = require('@ngtools/webpack/src/ivy/host');
26
+ let compilerCli;
27
+ let rootNames;
28
+ let host;
29
+ let nextProgram;
30
+ let builderProgram;
31
+ let mode;
32
+ return {
33
+ name: 'vite-plugin-angular',
34
+ config(config, { command }) {
35
+ mode = command;
36
+ return {
37
+ optimizeDeps: {
38
+ exclude: ['rxjs'],
39
+ esbuildOptions: {
40
+ plugins: [
41
+ (0, compiler_plugin_1.createCompilerPlugin)({
42
+ tsconfig: pluginOptions.tsconfig,
43
+ sourcemap: pluginOptions.sourcemap,
44
+ advancedOptimizations: pluginOptions.advancedOptimizations,
45
+ }, {
46
+ sourcemap: styleOptions.sourcemap,
47
+ optimization: styleOptions.optimization,
48
+ }),
49
+ ],
50
+ },
51
+ },
52
+ };
53
+ },
54
+ buildStart() {
55
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
56
+ compilerCli = yield (0, load_esm_1.loadEsmModule)('@angular/compiler-cli');
57
+ const { options: tsCompilerOptions, rootNames: rn } = compilerCli.readConfiguration(pluginOptions.tsconfig, {
58
+ enableIvy: true,
59
+ noEmitOnError: false,
60
+ suppressOutputPathCheck: true,
61
+ outDir: undefined,
62
+ inlineSources: pluginOptions.sourcemap,
63
+ inlineSourceMap: pluginOptions.sourcemap,
64
+ sourceMap: false,
65
+ mapRoot: undefined,
66
+ sourceRoot: undefined,
67
+ declaration: false,
68
+ declarationMap: false,
69
+ allowEmptyCodegenFiles: false,
70
+ annotationsAs: 'decorators',
71
+ enableResourceInlining: false,
72
+ });
73
+ rootNames = rn;
74
+ compilerOptions = tsCompilerOptions;
75
+ host = ts.createIncrementalCompilerHost(compilerOptions);
76
+ });
77
+ },
78
+ transform(code, id) {
79
+ var _a, _b, _c;
80
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
81
+ // Skip transforming rxjs
82
+ if (id.includes('rxjs')) {
83
+ return;
84
+ }
85
+ // Create the Angular specific program that contains the Angular compiler
86
+ const angularProgram = new compilerCli.NgtscProgram(rootNames, compilerOptions, host, nextProgram);
87
+ const angularCompiler = angularProgram.compiler;
88
+ const typeScriptProgram = angularProgram.getTsProgram();
89
+ augmentProgramWithVersioning(typeScriptProgram);
90
+ let builder;
91
+ if (mode === 'serve') {
92
+ builder = builderProgram =
93
+ ts.createEmitAndSemanticDiagnosticsBuilderProgram(typeScriptProgram, host, builderProgram);
94
+ nextProgram = angularProgram;
95
+ }
96
+ else {
97
+ // When not in watch mode, the startup cost of the incremental analysis can be avoided by
98
+ // using an abstract builder that only wraps a TypeScript program.
99
+ builder = ts.createAbstractBuilder(typeScriptProgram, host);
100
+ }
101
+ yield angularCompiler.analyzeAsync();
102
+ fileEmitter = createFileEmitter(builder, mergeTransformers(angularCompiler.prepareEmit().transformers, {
103
+ before: [
104
+ replaceBootstrap(() => builder.getProgram().getTypeChecker()),
105
+ ],
106
+ }), () => []);
107
+ if (/\.[cm]?js$/.test(id) && id.includes('@angular')) {
108
+ const angularPackage = /[\\/]node_modules[\\/]@angular[\\/]/.test(id);
109
+ const linkerPluginCreator = (yield (0, load_esm_1.loadEsmModule)('@angular/compiler-cli/linker/babel')).createEs2015LinkerPlugin;
110
+ const data = yield fs_1.promises.readFile(id, 'utf-8');
111
+ const result = yield (0, core_1.transformAsync)(data, {
112
+ filename: id,
113
+ inputSourceMap: (pluginOptions.sourcemap
114
+ ? undefined
115
+ : false),
116
+ sourceMaps: pluginOptions.sourcemap ? 'inline' : false,
117
+ compact: false,
118
+ configFile: false,
119
+ babelrc: false,
120
+ browserslistConfigFile: false,
121
+ plugins: [],
122
+ presets: [
123
+ [
124
+ application_1.default,
125
+ {
126
+ angularLinker: {
127
+ shouldLink: yield (0, webpack_loader_1.requiresLinking)(id, data),
128
+ jitMode: false,
129
+ linkerPluginCreator,
130
+ },
131
+ forceAsyncTransformation: !/[\\/][_f]?esm2015[\\/]/.test(id) && data.includes('async'),
132
+ optimize: pluginOptions.advancedOptimizations && {
133
+ looseEnums: angularPackage,
134
+ pureTopLevel: angularPackage,
135
+ },
136
+ },
137
+ ],
138
+ ],
139
+ });
140
+ return {
141
+ code: (_a = result === null || result === void 0 ? void 0 : result.code) !== null && _a !== void 0 ? _a : data,
142
+ map: result === null || result === void 0 ? void 0 : result.map,
143
+ };
144
+ }
145
+ if (/\.[cm]?tsx?$/.test(id)) {
146
+ const typescriptResult = yield fileEmitter(id);
147
+ // return fileEmitter
148
+ const data = (_b = typescriptResult === null || typescriptResult === void 0 ? void 0 : typescriptResult.content) !== null && _b !== void 0 ? _b : '';
149
+ // console.log(id, data);
150
+ const babelResult = yield (0, core_1.transformAsync)(data, {
151
+ filename: id,
152
+ inputSourceMap: (pluginOptions.sourcemap
153
+ ? undefined
154
+ : false),
155
+ sourceMaps: pluginOptions.sourcemap ? 'inline' : false,
156
+ compact: false,
157
+ configFile: false,
158
+ babelrc: false,
159
+ browserslistConfigFile: false,
160
+ plugins: [],
161
+ presets: [
162
+ [
163
+ application_1.default,
164
+ {
165
+ forceAsyncTransformation: data.includes('async'),
166
+ optimize: pluginOptions.advancedOptimizations && {},
167
+ },
168
+ ],
169
+ ],
170
+ });
171
+ return {
172
+ code: (_c = babelResult === null || babelResult === void 0 ? void 0 : babelResult.code) !== null && _c !== void 0 ? _c : '',
173
+ map: babelResult === null || babelResult === void 0 ? void 0 : babelResult.map,
174
+ };
175
+ }
176
+ return {
177
+ code,
178
+ };
179
+ });
180
+ },
181
+ };
182
+ }
183
+ exports.angular = angular;
184
+ function createFileEmitter(program, transformers = {}, onAfterEmit) {
185
+ return (file) => tslib_1.__awaiter(this, void 0, void 0, function* () {
186
+ const sourceFile = program.getSourceFile(file);
187
+ if (!sourceFile) {
188
+ return undefined;
189
+ }
190
+ let content;
191
+ program.emit(sourceFile, (filename, data) => {
192
+ if (/\.[cm]?js$/.test(filename)) {
193
+ content = data;
194
+ }
195
+ }, undefined /* cancellationToken */, undefined /* emitOnlyDtsFiles */, transformers);
196
+ onAfterEmit === null || onAfterEmit === void 0 ? void 0 : onAfterEmit(sourceFile);
197
+ return { content, dependencies: [] };
198
+ });
199
+ }
200
+ exports.createFileEmitter = createFileEmitter;
201
+ //# sourceMappingURL=angular-vite-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-vite-plugin.js","sourceRoot":"","sources":["../../../../../packages/vite-plugin-angular/src/lib/angular-vite-plugin.ts"],"names":[],"mappings":"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"}