-
-
Notifications
You must be signed in to change notification settings - Fork 9.9k
Expand file tree
/
Copy pathsetup.ts
More file actions
109 lines (96 loc) · 3.13 KB
/
setup.ts
File metadata and controls
109 lines (96 loc) · 3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import { Target, targetFromTargetString } from '@angular-devkit/architect';
import { BuilderContext } from '@angular-devkit/architect';
import { JsonObject, logging } from '@angular-devkit/core';
import { sync as findUpSync } from 'find-up';
import { BrowserBuilderOptions } from '@angular-devkit/build-angular';
import { logger } from '@storybook/node-logger';
export type AngularBuilderOptions = BrowserBuilderOptions & {
browserTarget?: string | null;
configDir?: string;
};
export async function setup(
{ stylePreprocessorOptions, styles, assets, sourceMap, ...options }: AngularBuilderOptions,
context: BuilderContext
) {
let browserOptions: BrowserBuilderOptions | undefined;
let browserTarget: Target | undefined;
if (options.browserTarget) {
browserTarget = targetFromTargetString(options.browserTarget);
browserOptions = await context.validateOptions<any>(
await context.getTargetOptions(browserTarget),
await context.getBuilderNameForTarget(browserTarget)
);
}
const tsConfig =
options.tsConfig ??
findUpSync('tsconfig.json', { cwd: options.configDir }) ??
browserOptions.tsConfig;
const angularBuilderContext = getBuilderContext(context);
const angularBuilderOptions = await getBuilderOptions(
options.browserTarget,
{
...options,
...(stylePreprocessorOptions ? { stylePreprocessorOptions } : {}),
...(styles ? { styles } : {}),
...(assets ? { assets } : {}),
sourceMap: sourceMap ?? false,
},
tsConfig,
options.configDir,
angularBuilderContext
);
return {
tsConfig,
angularBuilderContext,
angularBuilderOptions,
};
}
/**
* Get Builder Context
* If storybook is not start by angular builder create dumb BuilderContext
*/
function getBuilderContext(builderContext: BuilderContext): BuilderContext {
return (
builderContext ??
({
target: { project: 'noop-project', builder: '', options: {} },
workspaceRoot: process.cwd(),
getProjectMetadata: () => ({}),
getTargetOptions: () => ({}),
logger: new logging.Logger('Storybook'),
} as unknown as BuilderContext)
);
}
/**
* Get builder options
* Merge target options from browser target and from storybook options
*/
async function getBuilderOptions(
angularBrowserTarget: string,
angularBuilderOptions: AngularBuilderOptions,
tsConfig: string,
configDir: string,
builderContext: BuilderContext
): Promise<BrowserBuilderOptions> {
/**
* Get Browser Target options
*/
let browserTargetOptions: JsonObject = {};
if (angularBrowserTarget) {
const browserTarget = targetFromTargetString(angularBrowserTarget);
browserTargetOptions = await builderContext.getTargetOptions(browserTarget);
}
/**
* Merge target options from browser target options and from storybook options
*/
const builderOptions = {
...browserTargetOptions,
...angularBuilderOptions,
tsConfig:
tsConfig ??
findUpSync('tsconfig.json', { cwd: configDir }) ??
(browserTargetOptions.tsConfig as string),
};
logger.info(`=> Using angular project with "tsConfig:${builderOptions.tsConfig}"`);
return builderOptions;
}