@storybook/angular-vite 0.0.0-canary-test

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/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ import {
2
+ __definePreview,
3
+ applicationConfig,
4
+ argsToTemplate,
5
+ componentWrapperDecorator,
6
+ moduleMetadata,
7
+ setProjectAnnotations
8
+ } from "./_browser-chunks/chunk-TARB3NLN.js";
9
+ import "./_browser-chunks/chunk-CIJX6X7B.js";
10
+ import "./_browser-chunks/chunk-4WZEHS2U.js";
11
+ import "./_browser-chunks/chunk-6U6AH4EH.js";
12
+ export {
13
+ __definePreview,
14
+ applicationConfig,
15
+ argsToTemplate,
16
+ componentWrapperDecorator,
17
+ __definePreview as definePreview,
18
+ moduleMetadata,
19
+ setProjectAnnotations
20
+ };
@@ -0,0 +1,31 @@
1
+ import { StorybookConfig as StorybookConfig$1, CompatibleString } from 'storybook/internal/types';
2
+ import { StorybookConfigVite, BuilderOptions } from '@storybook/builder-vite';
3
+
4
+ type FrameworkName = CompatibleString<'@storybook/angular-vite'>;
5
+ type BuilderName = CompatibleString<'@storybook/builder-vite'>;
6
+ type FrameworkOptions = {
7
+ builder?: BuilderOptions;
8
+ jit?: boolean;
9
+ liveReload?: boolean;
10
+ inlineStylesExtension?: string;
11
+ tsconfig?: string;
12
+ zoneless?: boolean;
13
+ };
14
+ type StorybookConfigFramework = {
15
+ framework: FrameworkName | {
16
+ name: FrameworkName;
17
+ options: FrameworkOptions;
18
+ };
19
+ core?: StorybookConfig$1['core'] & {
20
+ builder?: BuilderName | {
21
+ name: BuilderName;
22
+ options: BuilderOptions;
23
+ };
24
+ };
25
+ };
26
+ /** The interface for Storybook configuration in `main.ts` files. */
27
+ type StorybookConfig = Omit<StorybookConfig$1, keyof StorybookConfigVite | keyof StorybookConfigFramework> & StorybookConfigVite & StorybookConfigFramework;
28
+
29
+ declare function defineMain(config: StorybookConfig): StorybookConfig;
30
+
31
+ export { type StorybookConfig, defineMain };
@@ -0,0 +1,19 @@
1
+ import CJS_COMPAT_NODE_URL_w331jboqnti from 'node:url';
2
+ import CJS_COMPAT_NODE_PATH_w331jboqnti from 'node:path';
3
+ import CJS_COMPAT_NODE_MODULE_w331jboqnti from "node:module";
4
+
5
+ var __filename = CJS_COMPAT_NODE_URL_w331jboqnti.fileURLToPath(import.meta.url);
6
+ var __dirname = CJS_COMPAT_NODE_PATH_w331jboqnti.dirname(__filename);
7
+ var require = CJS_COMPAT_NODE_MODULE_w331jboqnti.createRequire(import.meta.url);
8
+
9
+ // ------------------------------------------------------------
10
+ // end of CJS compatibility banner, injected by Storybook's esbuild configuration
11
+ // ------------------------------------------------------------
12
+
13
+ // src/node/index.ts
14
+ function defineMain(config) {
15
+ return config;
16
+ }
17
+ export {
18
+ defineMain
19
+ };
package/dist/preset.js ADDED
@@ -0,0 +1,235 @@
1
+ import CJS_COMPAT_NODE_URL_w331jboqnti from 'node:url';
2
+ import CJS_COMPAT_NODE_PATH_w331jboqnti from 'node:path';
3
+ import CJS_COMPAT_NODE_MODULE_w331jboqnti from "node:module";
4
+
5
+ var __filename = CJS_COMPAT_NODE_URL_w331jboqnti.fileURLToPath(import.meta.url);
6
+ var __dirname = CJS_COMPAT_NODE_PATH_w331jboqnti.dirname(__filename);
7
+ var require = CJS_COMPAT_NODE_MODULE_w331jboqnti.createRequire(import.meta.url);
8
+
9
+ // ------------------------------------------------------------
10
+ // end of CJS compatibility banner, injected by Storybook's esbuild configuration
11
+ // ------------------------------------------------------------
12
+
13
+ // src/preset.ts
14
+ import { findConfigFile } from "storybook/internal/common";
15
+ import {
16
+ babelParser,
17
+ extractMockCalls,
18
+ findMockRedirect,
19
+ getAutomockCode,
20
+ getRealPath
21
+ } from "storybook/internal/mocking-utils";
22
+ import { readFileSync } from "node:fs";
23
+ import { resolve } from "node:path";
24
+ import { fileURLToPath } from "node:url";
25
+ var addons = [], previewAnnotations = async (entries = [], options) => {
26
+ let config = fileURLToPath(import.meta.resolve("@storybook/angular-vite/client/config")), annotations = [...entries, config];
27
+ if (options.enableProdMode) {
28
+ let previewProdPath = fileURLToPath(
29
+ import.meta.resolve("@storybook/angular-vite/client/preview-prod")
30
+ );
31
+ annotations.unshift(previewProdPath);
32
+ }
33
+ let docsConfig = await options.presets.apply("docs", {}, options);
34
+ if (Object.keys(docsConfig).length > 0) {
35
+ let docsConfigPath = fileURLToPath(
36
+ import.meta.resolve("@storybook/angular-vite/client/docs/config")
37
+ );
38
+ annotations.push(docsConfigPath);
39
+ }
40
+ return annotations;
41
+ }, core = async (config, options) => {
42
+ let framework = await options.presets.apply("framework");
43
+ return {
44
+ ...config,
45
+ builder: {
46
+ name: import.meta.resolve("@storybook/builder-vite"),
47
+ options: typeof framework == "string" ? {} : framework.options.builder || {}
48
+ }
49
+ };
50
+ };
51
+ function resolveZoneless(frameworkOptions, angularBuilderOptions) {
52
+ return frameworkOptions?.zoneless ?? angularBuilderOptions?.zoneless ?? !0;
53
+ }
54
+ var viteFinal = async (config, options) => {
55
+ config.plugins = (config.plugins ?? []).flat().filter((plugin) => !plugin.name.includes("analogjs")).map((plugin) => plugin?.name === "plugin-csf" && plugin.enforce === "pre" ? { ...plugin, enforce: void 0 } : plugin);
56
+ let { mergeConfig, normalizePath } = await import("vite"), { default: angular } = await import("@analogjs/vite-plugin-angular"), framework = await options.presets.apply("framework"), zoneless = resolveZoneless(framework.options, options?.angularBuilderOptions), angularPlugins = angular({
57
+ jit: typeof framework.options?.jit < "u" ? framework.options?.jit : !0,
58
+ liveReload: typeof framework.options?.liveReload < "u" ? framework.options?.liveReload : !1,
59
+ tsconfig: typeof framework.options?.tsconfig < "u" ? framework.options?.tsconfig : options?.tsConfig ?? "./.storybook/tsconfig.json",
60
+ inlineStylesExtension: typeof framework.options?.inlineStylesExtension < "u" ? framework.options?.inlineStylesExtension : "css"
61
+ }), pluginsToInject = (Array.isArray(angularPlugins) ? angularPlugins : [angularPlugins]).filter(Boolean).map((plugin) => plugin?.name === "@analogjs/vite-plugin-angular" && !plugin.enforce ? { ...plugin, enforce: "pre" } : plugin);
62
+ return mergeConfig(config, {
63
+ // Add dependencies to pre-optimization
64
+ optimizeDeps: {
65
+ include: [
66
+ "@storybook/angular-vite/client",
67
+ "@storybook/angular-vite",
68
+ "@angular/compiler",
69
+ "@angular/platform-browser",
70
+ "@angular/platform-browser/animations",
71
+ "@angular/common/http",
72
+ "tslib",
73
+ ...zoneless ? [] : ["zone.js"]
74
+ ]
75
+ },
76
+ build: {
77
+ rolldownOptions: {
78
+ output: {
79
+ // Preserve original class/function names through the production
80
+ // bundle. Compodoc-derived argTypes are looked up by class name at
81
+ // runtime (`findComponentByName(component.name, …)`), and the
82
+ // angular-vite `cleanArgsDecorator` strips any arg whose argType
83
+ // lacks an `action` or `control` flag. If the bundler renames
84
+ // `ButtonComponent` → `f` the lookup fails, no Output argTypes
85
+ // are emitted, and `onClick`/other handlers get stripped from args
86
+ // before the renderer sees them — manifesting as missing action
87
+ // bindings and unbound @Input() values (e.g. core-argmapping).
88
+ // Rolldown's oxc minifier renames by default, so the production
89
+ // bundle needs this explicit opt-in.
90
+ keepNames: !0,
91
+ // Rolldown's lazy-init wrapper splits @angular/platform-browser and
92
+ // @angular/common/http into separate chunks. The platform-browser
93
+ // chunk extends a class imported from the http xhr chunk but the
94
+ // generated wrapper never invokes the dependent init thunk, leaving
95
+ // the imported class undefined at evaluation time. Merging them keeps
96
+ // the inheritance contiguous in a single chunk.
97
+ manualChunks(id) {
98
+ if (id.includes("@angular/platform-browser") || id.includes("@angular/common"))
99
+ return "angular-platform";
100
+ }
101
+ }
102
+ }
103
+ },
104
+ plugins: [
105
+ ...pluginsToInject,
106
+ angularViteRedirectReapplyPlugin(options),
107
+ angularOptionsPlugin(options, { normalizePath, zoneless }),
108
+ storybookOxcPlugin()
109
+ ],
110
+ define: {
111
+ STORYBOOK_ANGULAR_OPTIONS: JSON.stringify({
112
+ zoneless: !!zoneless
113
+ })
114
+ }
115
+ });
116
+ };
117
+ function angularOptionsPlugin(options, { normalizePath, zoneless }) {
118
+ let resolvedConfig;
119
+ return {
120
+ name: "storybook-angular-vite-options-plugin",
121
+ config(userConfig) {
122
+ resolvedConfig = userConfig;
123
+ let loadPaths = options?.angularBuilderOptions?.stylePreprocessorOptions?.loadPaths, sassOptions = options?.angularBuilderOptions?.stylePreprocessorOptions?.sass;
124
+ if (Array.isArray(loadPaths)) {
125
+ let workspaceRoot = options.angularBuilderContext?.workspaceRoot ?? userConfig?.root ?? process.cwd();
126
+ return {
127
+ css: {
128
+ preprocessorOptions: {
129
+ scss: {
130
+ ...sassOptions,
131
+ loadPaths: loadPaths.map((loadPath) => `${resolve(workspaceRoot, loadPath)}`)
132
+ }
133
+ }
134
+ }
135
+ };
136
+ }
137
+ },
138
+ async transform(code, id) {
139
+ if (normalizePath(id).endsWith(normalizePath(`${options.configDir}/preview.ts`))) {
140
+ let imports = [], styles = options?.angularBuilderOptions?.styles;
141
+ Array.isArray(styles) && styles.forEach((style) => {
142
+ imports.push(style);
143
+ }), zoneless || imports.push("zone.js");
144
+ let projectRoot = resolvedConfig?.root ?? process.cwd();
145
+ return {
146
+ code: `
147
+ ${imports.map((extraImport) => extraImport.startsWith(".") || extraImport.startsWith("src") ? `import '${normalizePath(resolve(projectRoot, extraImport))}';` : `import '${extraImport}';`).join(`
148
+ `)}
149
+ ${code}
150
+ `
151
+ };
152
+ }
153
+ }
154
+ };
155
+ }
156
+ function angularViteRedirectReapplyPlugin(options) {
157
+ let viteConfig = {}, redirects = [], automocks = [];
158
+ return {
159
+ name: "storybook-angular-vite-redirect-reapply",
160
+ configResolved(c) {
161
+ viteConfig = c;
162
+ },
163
+ buildStart() {
164
+ if (!options?.configDir)
165
+ return;
166
+ let previewConfigPath = findConfigFile("preview", options.configDir);
167
+ if (previewConfigPath)
168
+ try {
169
+ let calls = extractMockCalls(
170
+ { previewConfigPath, configDir: options.configDir },
171
+ babelParser,
172
+ viteConfig.root ?? process.cwd(),
173
+ findMockRedirect
174
+ );
175
+ redirects = calls.filter(
176
+ (call) => !!call.redirectPath
177
+ ).map((call) => ({
178
+ absolutePath: call.absolutePath,
179
+ redirectPath: call.redirectPath
180
+ })), automocks = calls.filter((call) => !call.redirectPath && !!call.absolutePath).map((call) => ({ absolutePath: call.absolutePath, spy: !!call.spy }));
181
+ } catch {
182
+ redirects = [], automocks = [];
183
+ }
184
+ },
185
+ async transform(code, id) {
186
+ if (redirects.length === 0 && automocks.length === 0)
187
+ return null;
188
+ let preserveSymlinks = !!viteConfig.resolve?.preserveSymlinks, idNorm = getRealPath(id, preserveSymlinks);
189
+ for (let r of redirects)
190
+ if (getRealPath(r.absolutePath, preserveSymlinks) === idNorm)
191
+ return this.addWatchFile(r.redirectPath), {
192
+ code: readFileSync(r.redirectPath, "utf-8"),
193
+ map: { mappings: "" }
194
+ };
195
+ for (let a of automocks)
196
+ if (getRealPath(a.absolutePath, preserveSymlinks) === idNorm) {
197
+ if (code.includes("__vitest_current_es_module__"))
198
+ return null;
199
+ try {
200
+ let automocked = getAutomockCode(code, a.spy, babelParser);
201
+ return {
202
+ code: automocked.toString(),
203
+ map: automocked.generateMap()
204
+ };
205
+ } catch {
206
+ return null;
207
+ }
208
+ }
209
+ return null;
210
+ }
211
+ };
212
+ }
213
+ function storybookOxcPlugin() {
214
+ return {
215
+ name: "storybook-angular-vite-oxc-config",
216
+ config() {
217
+ return {
218
+ oxc: {
219
+ jsx: { runtime: "automatic" }
220
+ }
221
+ };
222
+ }
223
+ };
224
+ }
225
+ var typescript = async (config) => ({
226
+ ...config,
227
+ skipCompiler: !0
228
+ });
229
+ export {
230
+ addons,
231
+ core,
232
+ previewAnnotations,
233
+ typescript,
234
+ viteFinal
235
+ };
package/package.json ADDED
@@ -0,0 +1,116 @@
1
+ {
2
+ "name": "@storybook/angular-vite",
3
+ "version": "0.0.0-canary-test",
4
+ "description": "Storybook for Angular: Develop, document, and test UI components in isolation",
5
+ "keywords": [
6
+ "storybook",
7
+ "storybook-framework",
8
+ "angular",
9
+ "component",
10
+ "components"
11
+ ],
12
+ "homepage": "https://github.com/storybookjs/storybook/tree/next/code/frameworks/angular-vite",
13
+ "bugs": {
14
+ "url": "https://github.com/storybookjs/storybook/issues"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/storybookjs/storybook.git",
19
+ "directory": "code/frameworks/angular-vite"
20
+ },
21
+ "funding": {
22
+ "type": "opencollective",
23
+ "url": "https://opencollective.com/storybook"
24
+ },
25
+ "license": "MIT",
26
+ "type": "module",
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "code": "./src/index.ts",
31
+ "default": "./dist/index.js"
32
+ },
33
+ "./builders/build-storybook": "./dist/builders/build-storybook/index.js",
34
+ "./builders/start-storybook": "./dist/builders/start-storybook/index.js",
35
+ "./client": "./dist/client/index.js",
36
+ "./client/config": "./dist/client/config.js",
37
+ "./client/docs/config": "./dist/client/docs/config.js",
38
+ "./client/preview-prod": "./dist/client/preview-prod.js",
39
+ "./node": {
40
+ "types": "./dist/node/index.d.ts",
41
+ "code": "./src/node/index.ts",
42
+ "default": "./dist/node/index.js"
43
+ },
44
+ "./package.json": "./package.json",
45
+ "./preset": "./dist/preset.js"
46
+ },
47
+ "files": [
48
+ "builders.json",
49
+ "build-schema.json",
50
+ "start-schema.json",
51
+ "dist/**/*",
52
+ "template/cli/**/*",
53
+ "README.md",
54
+ "*.js",
55
+ "*.mjs",
56
+ "*.d.ts",
57
+ "!src/**/*"
58
+ ],
59
+ "dependencies": {
60
+ "@storybook/builder-vite": "workspace:*",
61
+ "@storybook/global": "^5.0.0",
62
+ "telejson": "8.0.0",
63
+ "ts-dedent": "^2.0.0",
64
+ "vite": ">=8.0.0"
65
+ },
66
+ "devDependencies": {
67
+ "@analogjs/vite-plugin-angular": "^2.5.2",
68
+ "@angular-devkit/architect": "^0.2102.12",
69
+ "@angular-devkit/build-angular": "^21.2.12",
70
+ "@angular-devkit/core": "^21.2.12",
71
+ "@angular/animations": "^21.2.14",
72
+ "@angular/common": "^21.2.14",
73
+ "@angular/compiler": "^21.2.14",
74
+ "@angular/compiler-cli": "^21.2.14",
75
+ "@angular/core": "^21.2.14",
76
+ "@angular/forms": "^21.2.14",
77
+ "@angular/platform-browser": "^21.2.14",
78
+ "@angular/platform-browser-dynamic": "^21.2.14",
79
+ "@types/node": "^22.19.1",
80
+ "empathic": "^2.0.0",
81
+ "rimraf": "^6.0.1",
82
+ "typescript": "^5.9.3",
83
+ "zone.js": "^0.16.2"
84
+ },
85
+ "peerDependencies": {
86
+ "@analogjs/vite-plugin-angular": ">=2.0.0",
87
+ "@angular-devkit/architect": ">=0.2100.0 < 0.2200.0",
88
+ "@angular-devkit/core": ">=21.0.0 < 22.0.0",
89
+ "@angular/animations": ">=21.0.0 < 22.0.0",
90
+ "@angular/build": ">=21.0.0 < 22.0.0",
91
+ "@angular/cli": ">=21.0.0 < 22.0.0",
92
+ "@angular/common": ">=21.0.0 < 22.0.0",
93
+ "@angular/compiler": ">=21.0.0 < 22.0.0",
94
+ "@angular/compiler-cli": ">=21.0.0 < 22.0.0",
95
+ "@angular/core": ">=21.0.0 < 22.0.0",
96
+ "@angular/platform-browser": ">=21.0.0 < 22.0.0",
97
+ "@angular/platform-browser-dynamic": ">=21.0.0 < 22.0.0",
98
+ "rxjs": "^7.4.0",
99
+ "storybook": "workspace:^",
100
+ "typescript": "^5.9.0",
101
+ "vite": ">=8.0.0",
102
+ "zone.js": ">=0.16.0"
103
+ },
104
+ "peerDependenciesMeta": {
105
+ "@angular/cli": {
106
+ "optional": true
107
+ },
108
+ "zone.js": {
109
+ "optional": true
110
+ }
111
+ },
112
+ "publishConfig": {
113
+ "access": "public"
114
+ },
115
+ "builders": "builders.json"
116
+ }
package/preset.js ADDED
@@ -0,0 +1 @@
1
+ export * from './dist/preset.js';
@@ -0,0 +1,227 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "title": "Start Storybook",
4
+ "description": "Serve up storybook in development mode.",
5
+ "type": "object",
6
+ "properties": {
7
+ "browserTarget": {
8
+ "type": "string",
9
+ "description": "Build target to be served in project-name:builder:config format. Should generally target on the builder: '@angular-devkit/build-angular:browser'. Useful for Storybook to use options (styles, assets, ...).",
10
+ "pattern": "^[^:\\s]+:[^:\\s]+(:[^\\s]+)?$"
11
+ },
12
+ "tsConfig": {
13
+ "type": "string",
14
+ "description": "The full path for the TypeScript configuration file, relative to the current workspace."
15
+ },
16
+ "preserveSymlinks": {
17
+ "type": "boolean",
18
+ "description": "Do not use the real path when resolving modules. If true, symlinks are resolved to their real path, if false, symlinks are resolved to their symlinked path.",
19
+ "default": false
20
+ },
21
+ "port": {
22
+ "type": "number",
23
+ "description": "Port to listen on.",
24
+ "default": 9009
25
+ },
26
+ "host": {
27
+ "type": "string",
28
+ "description": "Host to listen on.",
29
+ "default": "localhost"
30
+ },
31
+ "configDir": {
32
+ "type": "string",
33
+ "description": "Directory where to load Storybook configurations from.",
34
+ "default": ".storybook"
35
+ },
36
+ "https": {
37
+ "type": "boolean",
38
+ "description": "Serve Storybook over HTTPS. Note: You must provide your own certificate information.",
39
+ "default": false
40
+ },
41
+ "sslCa": {
42
+ "type": "string",
43
+ "description": "Provide an SSL certificate authority. (Optional with --https, required if using a self-signed certificate)."
44
+ },
45
+ "sslCert": {
46
+ "type": "string",
47
+ "description": "Provide an SSL certificate. (Required with --https)."
48
+ },
49
+ "sslKey": {
50
+ "type": "string",
51
+ "description": "SSL key to use for serving HTTPS."
52
+ },
53
+ "smokeTest": {
54
+ "type": "boolean",
55
+ "description": "Exit after successful start.",
56
+ "default": false
57
+ },
58
+ "ci": {
59
+ "type": "boolean",
60
+ "description": "CI mode (skip interactive prompts, don't open browser).",
61
+ "default": false
62
+ },
63
+ "open": {
64
+ "type": "boolean",
65
+ "description": "Whether to open Storybook automatically in the browser.",
66
+ "default": true
67
+ },
68
+ "quiet": {
69
+ "type": "boolean",
70
+ "description": "Suppress verbose build output.",
71
+ "default": false
72
+ },
73
+ "enableProdMode": {
74
+ "type": "boolean",
75
+ "description": "Disable Angular's development mode, which turns off assertions and other checks within the framework.",
76
+ "default": false
77
+ },
78
+ "docs": {
79
+ "type": "boolean",
80
+ "description": "Starts Storybook in documentation mode. Learn more about it : https://storybook.js.org/docs/writing-docs/build-documentation#preview-storybooks-documentation.",
81
+ "default": false
82
+ },
83
+ "compodoc": {
84
+ "type": "boolean",
85
+ "description": "Execute compodoc before.",
86
+ "default": true
87
+ },
88
+ "compodocArgs": {
89
+ "type": "array",
90
+ "description": "Compodoc options : https://compodoc.app/guides/options.html. Options `-p` with tsconfig path and `-d` with workspace root is always given.",
91
+ "default": ["-e", "json"],
92
+ "items": {
93
+ "type": "string"
94
+ }
95
+ },
96
+ "styles": {
97
+ "type": "array",
98
+ "description": "Global styles to be included in the build.",
99
+ "items": {
100
+ "$ref": "#/definitions/styleElement"
101
+ }
102
+ },
103
+ "stylePreprocessorOptions": {
104
+ "description": "Options to pass to style preprocessors.",
105
+ "type": "object",
106
+ "properties": {
107
+ "includePaths": {
108
+ "description": "Paths to include. Paths will be resolved to workspace root.",
109
+ "type": "array",
110
+ "items": {
111
+ "type": "string"
112
+ }
113
+ }
114
+ },
115
+ "additionalProperties": false
116
+ },
117
+ "assets": {
118
+ "type": "array",
119
+ "description": "List of static application assets.",
120
+ "default": [],
121
+ "items": {
122
+ "$ref": "#/definitions/assetPattern"
123
+ }
124
+ },
125
+ "initialPath": {
126
+ "type": "string",
127
+ "description": "URL path to be appended when visiting Storybook for the first time"
128
+ },
129
+ "statsJson": {
130
+ "type": ["boolean", "string"],
131
+ "description": "Write stats JSON to disk",
132
+ "default": false
133
+ },
134
+ "previewUrl": {
135
+ "type": "string",
136
+ "description": "Disables the default storybook preview and lets you use your own"
137
+ },
138
+ "loglevel": {
139
+ "type": "string",
140
+ "description": "Controls level of logging during build. Can be one of: [trace, debug, info (default), warn, error, silent].",
141
+ "pattern": "(trace|debug|info|warn|error|silent)"
142
+ },
143
+ "logfile": {
144
+ "type": "string",
145
+ "description": "If provided, the log output will be written to the specified file path."
146
+ },
147
+ "sourceMap": {
148
+ "type": ["boolean", "object"],
149
+ "description": "Configure sourcemaps. See: https://angular.io/guide/workspace-config#source-map-configuration",
150
+ "default": false
151
+ },
152
+ "experimentalZoneless": {
153
+ "type": "boolean",
154
+ "description": "Experimental: Use zoneless change detection."
155
+ }
156
+ },
157
+ "additionalProperties": false,
158
+ "definitions": {
159
+ "assetPattern": {
160
+ "oneOf": [
161
+ {
162
+ "type": "object",
163
+ "properties": {
164
+ "followSymlinks": {
165
+ "type": "boolean",
166
+ "default": false,
167
+ "description": "Allow glob patterns to follow symlink directories. This allows subdirectories of the symlink to be searched."
168
+ },
169
+ "glob": {
170
+ "type": "string",
171
+ "description": "The pattern to match."
172
+ },
173
+ "input": {
174
+ "type": "string",
175
+ "description": "The input directory path in which to apply 'glob'. Defaults to the project root."
176
+ },
177
+ "ignore": {
178
+ "description": "An array of globs to ignore.",
179
+ "type": "array",
180
+ "items": {
181
+ "type": "string"
182
+ }
183
+ },
184
+ "output": {
185
+ "type": "string",
186
+ "description": "Absolute path within the output."
187
+ }
188
+ },
189
+ "additionalProperties": false,
190
+ "required": ["glob", "input", "output"]
191
+ },
192
+ {
193
+ "type": "string"
194
+ }
195
+ ]
196
+ },
197
+ "styleElement": {
198
+ "oneOf": [
199
+ {
200
+ "type": "object",
201
+ "properties": {
202
+ "input": {
203
+ "type": "string",
204
+ "description": "The file to include."
205
+ },
206
+ "bundleName": {
207
+ "type": "string",
208
+ "pattern": "^[\\w\\-.]*$",
209
+ "description": "The bundle name for this extra entry point."
210
+ },
211
+ "inject": {
212
+ "type": "boolean",
213
+ "description": "If the bundle will be referenced in the HTML file.",
214
+ "default": true
215
+ }
216
+ },
217
+ "additionalProperties": false,
218
+ "required": ["input"]
219
+ },
220
+ {
221
+ "type": "string",
222
+ "description": "The file to include."
223
+ }
224
+ ]
225
+ }
226
+ }
227
+ }