@angular/build 20.2.0 → 21.0.0-next.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/.browserslistrc +5 -5
- package/package.json +15 -15
- package/src/builders/dev-server/builder.js +2 -2
- package/src/builders/dev-server/vite/hmr.d.ts +25 -0
- package/src/builders/dev-server/vite/hmr.js +113 -0
- package/src/builders/dev-server/vite/index.d.ts +21 -0
- package/src/builders/dev-server/{vite-server.js → vite/index.js} +19 -359
- package/src/builders/dev-server/vite/server.d.ts +15 -0
- package/src/builders/dev-server/vite/server.js +229 -0
- package/src/builders/dev-server/vite/utils.d.ts +36 -0
- package/src/builders/dev-server/vite/utils.js +76 -0
- package/src/builders/unit-test/builder.d.ts +1 -1
- package/src/builders/unit-test/builder.js +187 -289
- package/src/builders/unit-test/options.d.ts +1 -0
- package/src/builders/unit-test/options.js +2 -1
- package/src/builders/unit-test/runners/api.d.ts +47 -0
- package/src/builders/unit-test/runners/api.js +9 -0
- package/src/builders/unit-test/runners/karma/executor.d.ts +17 -0
- package/src/builders/unit-test/runners/karma/executor.js +93 -0
- package/src/builders/unit-test/runners/karma/index.d.ts +13 -0
- package/src/builders/unit-test/runners/karma/index.js +26 -0
- package/src/builders/unit-test/runners/vitest/browser-provider.d.ts +11 -0
- package/src/builders/unit-test/runners/vitest/browser-provider.js +69 -0
- package/src/builders/unit-test/runners/vitest/build-options.d.ts +11 -0
- package/src/builders/unit-test/runners/vitest/build-options.js +87 -0
- package/src/builders/unit-test/runners/vitest/executor.d.ts +22 -0
- package/src/builders/unit-test/runners/vitest/executor.js +160 -0
- package/src/builders/unit-test/runners/vitest/index.d.ts +13 -0
- package/src/builders/unit-test/runners/vitest/index.js +30 -0
- package/src/builders/unit-test/schema.d.ts +4 -0
- package/src/builders/unit-test/schema.json +4 -0
- package/src/builders/unit-test/test-discovery.d.ts +8 -0
- package/src/builders/unit-test/test-discovery.js +14 -0
- package/src/private.d.ts +1 -1
- package/src/private.js +2 -2
- package/src/utils/environment-options.d.ts +43 -0
- package/src/utils/environment-options.js +84 -30
- package/src/utils/normalize-cache.js +1 -1
- package/src/utils/version.js +1 -1
- package/src/builders/dev-server/vite-server.d.ts +0 -42
- package/src/builders/unit-test/karma-bridge.d.ts +0 -10
- package/src/builders/unit-test/karma-bridge.js +0 -82
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright Google LLC All Rights Reserved.
|
|
5
|
+
*
|
|
6
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
7
|
+
* found in the LICENSE file at https://angular.dev/license
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.setupServer = setupServer;
|
|
44
|
+
const promises_1 = require("node:fs/promises");
|
|
45
|
+
const node_path_1 = require("node:path");
|
|
46
|
+
const plugins_1 = require("../../../tools/vite/plugins");
|
|
47
|
+
const utils_1 = require("../../../tools/vite/utils");
|
|
48
|
+
const utils_2 = require("../../../utils");
|
|
49
|
+
const load_esm_1 = require("../../../utils/load-esm");
|
|
50
|
+
async function createServerConfig(serverOptions, assets, ssrMode, preTransformRequests, cacheDir) {
|
|
51
|
+
const proxy = await (0, utils_2.loadProxyConfiguration)(serverOptions.workspaceRoot, serverOptions.proxyConfig);
|
|
52
|
+
// Files used for SSR warmup.
|
|
53
|
+
let ssrFiles;
|
|
54
|
+
switch (ssrMode) {
|
|
55
|
+
case plugins_1.ServerSsrMode.InternalSsrMiddleware:
|
|
56
|
+
ssrFiles = ['./main.server.mjs'];
|
|
57
|
+
break;
|
|
58
|
+
case plugins_1.ServerSsrMode.ExternalSsrMiddleware:
|
|
59
|
+
ssrFiles = ['./main.server.mjs', './server.mjs'];
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
const server = {
|
|
63
|
+
preTransformRequests,
|
|
64
|
+
warmup: {
|
|
65
|
+
ssrFiles,
|
|
66
|
+
},
|
|
67
|
+
port: serverOptions.port,
|
|
68
|
+
strictPort: true,
|
|
69
|
+
host: serverOptions.host,
|
|
70
|
+
open: serverOptions.open,
|
|
71
|
+
allowedHosts: serverOptions.allowedHosts,
|
|
72
|
+
headers: serverOptions.headers,
|
|
73
|
+
// Disable the websocket if live reload is disabled (false/undefined are the only valid values)
|
|
74
|
+
ws: serverOptions.liveReload === false && serverOptions.hmr === false ? false : undefined,
|
|
75
|
+
// When server-side rendering (SSR) is enabled togather with SSL and Express is being used,
|
|
76
|
+
// we must configure Vite to use HTTP/1.1.
|
|
77
|
+
// This is necessary because Express does not support HTTP/2.
|
|
78
|
+
// We achieve this by defining an empty proxy.
|
|
79
|
+
// See: https://github.com/vitejs/vite/blob/c4b532cc900bf988073583511f57bd581755d5e3/packages/vite/src/node/http.ts#L106
|
|
80
|
+
proxy: serverOptions.ssl && ssrMode === plugins_1.ServerSsrMode.ExternalSsrMiddleware ? (proxy ?? {}) : proxy,
|
|
81
|
+
cors: {
|
|
82
|
+
// This will add the header `Access-Control-Allow-Origin: http://example.com`,
|
|
83
|
+
// where `http://example.com` is the requesting origin.
|
|
84
|
+
origin: true,
|
|
85
|
+
// Allow preflight requests to be proxied.
|
|
86
|
+
preflightContinue: true,
|
|
87
|
+
},
|
|
88
|
+
// File watching is handled by the build directly. `null` disables file watching for Vite.
|
|
89
|
+
watch: null,
|
|
90
|
+
fs: {
|
|
91
|
+
// Ensure cache directory, node modules, and all assets are accessible by the client.
|
|
92
|
+
// The first two are required for Vite to function in prebundling mode (the default) and to load
|
|
93
|
+
// the Vite client-side code for browser reloading. These would be available by default but when
|
|
94
|
+
// the `allow` option is explicitly configured, they must be included manually.
|
|
95
|
+
allow: [
|
|
96
|
+
cacheDir,
|
|
97
|
+
(0, node_path_1.join)(serverOptions.workspaceRoot, 'node_modules'),
|
|
98
|
+
...[...assets.values()].map(({ source }) => source),
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
if (serverOptions.ssl) {
|
|
103
|
+
if (serverOptions.sslCert && serverOptions.sslKey) {
|
|
104
|
+
server.https = {
|
|
105
|
+
cert: await (0, promises_1.readFile)(serverOptions.sslCert),
|
|
106
|
+
key: await (0, promises_1.readFile)(serverOptions.sslKey),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return server;
|
|
111
|
+
}
|
|
112
|
+
function createSsrConfig(externalMetadata, serverOptions, prebundleTransformer, zoneless, target, prebundleLoaderExtensions, thirdPartySourcemaps, define) {
|
|
113
|
+
return {
|
|
114
|
+
// Note: `true` and `/.*/` have different sematics. When true, the `external` option is ignored.
|
|
115
|
+
noExternal: /.*/,
|
|
116
|
+
// Exclude any Node.js built in module and provided dependencies (currently build defined externals)
|
|
117
|
+
external: externalMetadata.explicitServer,
|
|
118
|
+
optimizeDeps: (0, utils_1.getDepOptimizationConfig)({
|
|
119
|
+
// Only enable with caching since it causes prebundle dependencies to be cached
|
|
120
|
+
disabled: serverOptions.prebundle === false,
|
|
121
|
+
// Exclude any explicitly defined dependencies (currently build defined externals and node.js built-ins)
|
|
122
|
+
exclude: externalMetadata.explicitServer,
|
|
123
|
+
// Include all implict dependencies from the external packages internal option
|
|
124
|
+
include: externalMetadata.implicitServer,
|
|
125
|
+
ssr: true,
|
|
126
|
+
prebundleTransformer,
|
|
127
|
+
zoneless,
|
|
128
|
+
target,
|
|
129
|
+
loader: prebundleLoaderExtensions,
|
|
130
|
+
thirdPartySourcemaps,
|
|
131
|
+
define,
|
|
132
|
+
}),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
async function setupServer(serverOptions, outputFiles, assets, preserveSymlinks, externalMetadata, ssrMode, prebundleTransformer, target, zoneless, componentStyles, templateUpdates, prebundleLoaderExtensions, define, extensionMiddleware, indexHtmlTransformer, thirdPartySourcemaps = false) {
|
|
136
|
+
// dynamically import Vite for ESM compatibility
|
|
137
|
+
const { normalizePath } = await (0, load_esm_1.loadEsmModule)('vite');
|
|
138
|
+
// Path will not exist on disk and only used to provide separate path for Vite requests
|
|
139
|
+
const virtualProjectRoot = normalizePath((0, node_path_1.join)(serverOptions.workspaceRoot, `.angular/vite-root`, serverOptions.buildTarget.project));
|
|
140
|
+
/**
|
|
141
|
+
* Required when using `externalDependencies` to prevent Vite load errors.
|
|
142
|
+
*
|
|
143
|
+
* @note Can be removed if Vite introduces native support for externals.
|
|
144
|
+
* @note Vite misresolves browser modules in SSR when accessing URLs with multiple segments
|
|
145
|
+
* (e.g., 'foo/bar'), as they are not correctly re-based from the base href.
|
|
146
|
+
*/
|
|
147
|
+
const preTransformRequests = externalMetadata.explicitBrowser.length === 0 && ssrMode === plugins_1.ServerSsrMode.NoSsr;
|
|
148
|
+
const cacheDir = (0, node_path_1.join)(serverOptions.cacheOptions.path, serverOptions.buildTarget.project, 'vite');
|
|
149
|
+
const configuration = {
|
|
150
|
+
configFile: false,
|
|
151
|
+
envFile: false,
|
|
152
|
+
cacheDir,
|
|
153
|
+
root: virtualProjectRoot,
|
|
154
|
+
publicDir: false,
|
|
155
|
+
esbuild: false,
|
|
156
|
+
mode: 'development',
|
|
157
|
+
// We use custom as we do not rely on Vite's htmlFallbackMiddleware and indexHtmlMiddleware.
|
|
158
|
+
appType: 'custom',
|
|
159
|
+
css: {
|
|
160
|
+
devSourcemap: true,
|
|
161
|
+
},
|
|
162
|
+
// Ensure custom 'file' loader build option entries are handled by Vite in application code that
|
|
163
|
+
// reference third-party libraries. Relative usage is handled directly by the build and not Vite.
|
|
164
|
+
// Only 'file' loader entries are currently supported directly by Vite.
|
|
165
|
+
assetsInclude: prebundleLoaderExtensions &&
|
|
166
|
+
Object.entries(prebundleLoaderExtensions)
|
|
167
|
+
.filter(([, value]) => value === 'file')
|
|
168
|
+
// Create a file extension glob for each key
|
|
169
|
+
.map(([key]) => '*' + key),
|
|
170
|
+
// Vite will normalize the `base` option by adding a leading slash.
|
|
171
|
+
base: serverOptions.servePath,
|
|
172
|
+
resolve: {
|
|
173
|
+
mainFields: ['es2020', 'browser', 'module', 'main'],
|
|
174
|
+
preserveSymlinks,
|
|
175
|
+
},
|
|
176
|
+
dev: {
|
|
177
|
+
preTransformRequests,
|
|
178
|
+
},
|
|
179
|
+
server: await createServerConfig(serverOptions, assets, ssrMode, preTransformRequests, cacheDir),
|
|
180
|
+
ssr: createSsrConfig(externalMetadata, serverOptions, prebundleTransformer, zoneless, target, prebundleLoaderExtensions, thirdPartySourcemaps, define),
|
|
181
|
+
plugins: [
|
|
182
|
+
(0, plugins_1.createAngularLocaleDataPlugin)(),
|
|
183
|
+
(0, plugins_1.createAngularSetupMiddlewaresPlugin)({
|
|
184
|
+
outputFiles,
|
|
185
|
+
assets,
|
|
186
|
+
indexHtmlTransformer,
|
|
187
|
+
extensionMiddleware,
|
|
188
|
+
componentStyles,
|
|
189
|
+
templateUpdates,
|
|
190
|
+
ssrMode,
|
|
191
|
+
resetComponentUpdates: () => templateUpdates.clear(),
|
|
192
|
+
projectRoot: serverOptions.projectRoot,
|
|
193
|
+
}),
|
|
194
|
+
(0, plugins_1.createRemoveIdPrefixPlugin)(externalMetadata.explicitBrowser),
|
|
195
|
+
await (0, plugins_1.createAngularSsrTransformPlugin)(serverOptions.workspaceRoot),
|
|
196
|
+
await (0, plugins_1.createAngularMemoryPlugin)({
|
|
197
|
+
virtualProjectRoot,
|
|
198
|
+
outputFiles,
|
|
199
|
+
templateUpdates,
|
|
200
|
+
external: externalMetadata.explicitBrowser,
|
|
201
|
+
disableViteTransport: !serverOptions.liveReload,
|
|
202
|
+
}),
|
|
203
|
+
],
|
|
204
|
+
// Browser only optimizeDeps. (This does not run for SSR dependencies).
|
|
205
|
+
optimizeDeps: (0, utils_1.getDepOptimizationConfig)({
|
|
206
|
+
// Only enable with caching since it causes prebundle dependencies to be cached
|
|
207
|
+
disabled: serverOptions.prebundle === false,
|
|
208
|
+
// Exclude any explicitly defined dependencies (currently build defined externals)
|
|
209
|
+
exclude: externalMetadata.explicitBrowser,
|
|
210
|
+
// Include all implict dependencies from the external packages internal option
|
|
211
|
+
include: externalMetadata.implicitBrowser,
|
|
212
|
+
ssr: false,
|
|
213
|
+
prebundleTransformer,
|
|
214
|
+
target,
|
|
215
|
+
zoneless,
|
|
216
|
+
loader: prebundleLoaderExtensions,
|
|
217
|
+
thirdPartySourcemaps,
|
|
218
|
+
define,
|
|
219
|
+
}),
|
|
220
|
+
};
|
|
221
|
+
if (serverOptions.ssl) {
|
|
222
|
+
if (!serverOptions.sslCert || !serverOptions.sslKey) {
|
|
223
|
+
const { default: basicSslPlugin } = await Promise.resolve().then(() => __importStar(require('@vitejs/plugin-basic-ssl')));
|
|
224
|
+
configuration.plugins ??= [];
|
|
225
|
+
configuration.plugins.push(basicSslPlugin());
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return configuration;
|
|
229
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google LLC All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.dev/license
|
|
7
|
+
*/
|
|
8
|
+
import type { ComponentStyleRecord } from '../../../tools/vite/middlewares';
|
|
9
|
+
import type { ResultFile } from '../../application/results';
|
|
10
|
+
import { BuildOutputFileType, type ExternalResultMetadata } from '../internal';
|
|
11
|
+
export interface OutputFileRecord {
|
|
12
|
+
contents: Uint8Array;
|
|
13
|
+
size: number;
|
|
14
|
+
hash: string;
|
|
15
|
+
updated: boolean;
|
|
16
|
+
servable: boolean;
|
|
17
|
+
type: BuildOutputFileType;
|
|
18
|
+
}
|
|
19
|
+
export interface OutputAssetRecord {
|
|
20
|
+
source: string;
|
|
21
|
+
updated: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface DevServerExternalResultMetadata extends Omit<ExternalResultMetadata, 'explicit'> {
|
|
24
|
+
explicitBrowser: string[];
|
|
25
|
+
explicitServer: string[];
|
|
26
|
+
}
|
|
27
|
+
export declare function updateResultRecord(outputPath: string, file: ResultFile, normalizePath: (id: string) => string, htmlIndexPath: string, generatedFiles: Map<string, OutputFileRecord>, assetFiles: Map<string, OutputAssetRecord>, componentStyles: Map<string, ComponentStyleRecord>, initial?: boolean): void;
|
|
28
|
+
/**
|
|
29
|
+
* Checks if the given value is an absolute URL.
|
|
30
|
+
*
|
|
31
|
+
* This function helps in avoiding Vite's prebundling from processing absolute URLs (http://, https://, //) as files.
|
|
32
|
+
*
|
|
33
|
+
* @param value - The URL or path to check.
|
|
34
|
+
* @returns `true` if the value is not an absolute URL; otherwise, `false`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isAbsoluteUrl(value: string): boolean;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright Google LLC All Rights Reserved.
|
|
5
|
+
*
|
|
6
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
7
|
+
* found in the LICENSE file at https://angular.dev/license
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.updateResultRecord = updateResultRecord;
|
|
11
|
+
exports.isAbsoluteUrl = isAbsoluteUrl;
|
|
12
|
+
const internal_1 = require("../internal");
|
|
13
|
+
function updateResultRecord(outputPath, file, normalizePath, htmlIndexPath, generatedFiles, assetFiles, componentStyles, initial = false) {
|
|
14
|
+
if (file.origin === 'disk') {
|
|
15
|
+
assetFiles.set('/' + normalizePath(outputPath), {
|
|
16
|
+
source: normalizePath(file.inputPath),
|
|
17
|
+
updated: !initial,
|
|
18
|
+
});
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
let filePath;
|
|
22
|
+
if (outputPath === htmlIndexPath) {
|
|
23
|
+
// Convert custom index output path to standard index path for dev-server usage.
|
|
24
|
+
// This mimics the Webpack dev-server behavior.
|
|
25
|
+
filePath = '/index.html';
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
filePath = '/' + normalizePath(outputPath);
|
|
29
|
+
}
|
|
30
|
+
const servable = file.type === internal_1.BuildOutputFileType.Browser || file.type === internal_1.BuildOutputFileType.Media;
|
|
31
|
+
// Skip analysis of sourcemaps
|
|
32
|
+
if (filePath.endsWith('.map')) {
|
|
33
|
+
generatedFiles.set(filePath, {
|
|
34
|
+
contents: file.contents,
|
|
35
|
+
servable,
|
|
36
|
+
size: file.contents.byteLength,
|
|
37
|
+
hash: file.hash,
|
|
38
|
+
type: file.type,
|
|
39
|
+
updated: false,
|
|
40
|
+
});
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// New or updated file
|
|
44
|
+
generatedFiles.set(filePath, {
|
|
45
|
+
contents: file.contents,
|
|
46
|
+
size: file.contents.byteLength,
|
|
47
|
+
hash: file.hash,
|
|
48
|
+
// Consider the files updated except on the initial build result
|
|
49
|
+
updated: !initial,
|
|
50
|
+
type: file.type,
|
|
51
|
+
servable,
|
|
52
|
+
});
|
|
53
|
+
// Record any external component styles
|
|
54
|
+
if (filePath.endsWith('.css') && /^\/[a-f0-9]{64}\.css$/.test(filePath)) {
|
|
55
|
+
const componentStyle = componentStyles.get(filePath);
|
|
56
|
+
if (componentStyle) {
|
|
57
|
+
componentStyle.rawContent = file.contents;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
componentStyles.set(filePath, {
|
|
61
|
+
rawContent: file.contents,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Checks if the given value is an absolute URL.
|
|
68
|
+
*
|
|
69
|
+
* This function helps in avoiding Vite's prebundling from processing absolute URLs (http://, https://, //) as files.
|
|
70
|
+
*
|
|
71
|
+
* @param value - The URL or path to check.
|
|
72
|
+
* @returns `true` if the value is not an absolute URL; otherwise, `false`.
|
|
73
|
+
*/
|
|
74
|
+
function isAbsoluteUrl(value) {
|
|
75
|
+
return /^(?:https?:)?\/\//.test(value);
|
|
76
|
+
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Use of this source code is governed by an MIT-style license that can be
|
|
6
6
|
* found in the LICENSE file at https://angular.dev/license
|
|
7
7
|
*/
|
|
8
|
-
import type
|
|
8
|
+
import { type BuilderContext, type BuilderOutput } from '@angular-devkit/architect';
|
|
9
9
|
import type { ApplicationBuilderExtensions } from '../application/options';
|
|
10
10
|
import type { Schema as UnitTestBuilderOptions } from './schema';
|
|
11
11
|
export type { UnitTestBuilderOptions };
|