-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
build-storybook.impl.ts
117 lines (105 loc) · 3.24 KB
/
build-storybook.impl.ts
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
110
111
112
113
114
115
116
117
import 'dotenv/config';
import { basename, join, sep } from 'path';
import { tmpdir } from 'os';
import { constants, copyFileSync, mkdtempSync, statSync } from 'fs';
import * as build from '@storybook/core/standalone';
import { getStorybookFrameworkPath, setStorybookAppProject } from '../utils';
import { ExecutorContext, logger } from '@nrwl/devkit';
export interface StorybookConfig {
configFolder?: string;
configPath?: string;
pluginPath?: string;
srcRoot?: string;
}
export interface StorybookBuilderOptions {
uiFramework: string;
projectBuildConfig?: string;
config: StorybookConfig;
quiet?: boolean;
outputPath?: string;
docsMode?: boolean;
}
export default async function buildStorybookExecutor(
options: StorybookBuilderOptions,
context: ExecutorContext
) {
logger.info(`NX ui framework: ${options.uiFramework}`);
const frameworkPath = getStorybookFrameworkPath(options.uiFramework);
const { default: frameworkOptions } = await import(frameworkPath);
const option = storybookOptionMapper(options, frameworkOptions, context);
logger.info(`NX Storybook builder starting ...`);
await runInstance(option);
logger.info(`NX Storybook builder finished ...`);
logger.info(`NX Storybook files available in ${options.outputPath}`);
return { success: true };
}
function runInstance(options: StorybookBuilderOptions): Promise<void> {
return build({ ...options, ci: true });
}
function storybookOptionMapper(
builderOptions: StorybookBuilderOptions,
frameworkOptions: any,
context: ExecutorContext
) {
setStorybookAppProject(context, builderOptions.projectBuildConfig);
const storybookConfig = findOrCreateConfig(builderOptions.config, context);
const optionsWithFramework = {
...builderOptions,
mode: 'static',
outputDir: builderOptions.outputPath,
configDir: storybookConfig,
...frameworkOptions,
frameworkPresets: [...(frameworkOptions.frameworkPresets || [])],
watch: false,
};
optionsWithFramework.config;
return optionsWithFramework;
}
function findOrCreateConfig(
config: StorybookConfig,
context: ExecutorContext
): string {
if (config.configFolder && statSync(config.configFolder).isDirectory()) {
return config.configFolder;
} else if (
statSync(config.configPath).isFile() &&
statSync(config.pluginPath).isFile() &&
statSync(config.srcRoot).isFile()
) {
return createStorybookConfig(
config.configPath,
config.pluginPath,
config.srcRoot
);
} else {
const sourceRoot = context.workspace.projects[context.projectName].root;
if (statSync(join(context.root, sourceRoot, '.storybook')).isDirectory()) {
return join(context.root, sourceRoot, '.storybook');
}
}
throw new Error('No configuration settings');
}
function createStorybookConfig(
configPath: string,
pluginPath: string,
srcRoot: string
): string {
const tmpDir = tmpdir();
const tmpFolder = mkdtempSync(`${tmpDir}${sep}`);
copyFileSync(
configPath,
`${tmpFolder}${basename(configPath)}`,
constants.COPYFILE_EXCL
);
copyFileSync(
pluginPath,
`${tmpFolder}${basename(pluginPath)}`,
constants.COPYFILE_EXCL
);
copyFileSync(
srcRoot,
`${tmpFolder}${basename(srcRoot)}`,
constants.COPYFILE_EXCL
);
return tmpFolder;
}