Skip to content

Commit

Permalink
feat(storybook): created a generator as well
Browse files Browse the repository at this point in the history
  • Loading branch information
mandarini committed Mar 15, 2022
1 parent 37a72ab commit 5a347aa
Show file tree
Hide file tree
Showing 21 changed files with 311 additions and 163 deletions.
28 changes: 28 additions & 0 deletions docs/generated/api-angular/generators/change-storybook-targets.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
title: '@nrwl/angular:change-storybook-targets generator'
description: 'Change Storybook targets to use native Storybook builders'
---

# @nrwl/angular:change-storybook-targets

Change Storybook targets to use native Storybook builders

## Usage

```bash
nx generate change-storybook-targets ...
```

By default, Nx will search for `change-storybook-targets` in the default collection provisioned in `workspace.json`.

You can specify the collection explicitly as follows:

```bash
nx g @nrwl/angular:change-storybook-targets ...
```

Show what will be generated without writing to disk:

```bash
nx g change-storybook-targets ... --dry-run
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
title: '@nrwl/storybook:change-storybook-targets generator'
description: 'Change Storybook targets to use native Storybook builders'
---

# @nrwl/storybook:change-storybook-targets

Change Storybook targets to use native Storybook builders

## Usage

```bash
nx generate change-storybook-targets ...
```

By default, Nx will search for `change-storybook-targets` in the default collection provisioned in `workspace.json`.

You can specify the collection explicitly as follows:

```bash
nx g @nrwl/storybook:change-storybook-targets ...
```

Show what will be generated without writing to disk:

```bash
nx g change-storybook-targets ... --dry-run
```
21 changes: 20 additions & 1 deletion docs/map.json
Original file line number Diff line number Diff line change
Expand Up @@ -739,6 +739,16 @@
"id": "storybook-migrate-stories-to-6-2",
"file": "generated/api-angular/generators/storybook-migrate-stories-to-6-2"
},
{
"name": "change-storybook-targets generator",
"id": "change-storybook-targets",
"file": "generated/api-angular/generators/change-storybook-targets"
},
{
"name": "change-storybook-targets generator",
"id": "change-storybook-targets",
"file": "generated/api-angular/generators/change-storybook-targets"
},
{
"name": "upgrade-module generator",
"id": "upgrade-module",
Expand Down Expand Up @@ -938,7 +948,16 @@
"id": "migrate-stories-to-6-2",
"file": "generated/api-storybook/generators/migrate-stories-to-6-2"
},

{
"name": "change-storybook-targets generator",
"id": "change-storybook-targets",
"file": "generated/api-storybook/generators/change-storybook-targets"
},
{
"name": "change-storybook-targets generator",
"id": "change-storybook-targets",
"file": "generated/api-storybook/generators/change-storybook-targets"
},
{
"name": "Executors: Build",
"id": "executors-build",
Expand Down
11 changes: 11 additions & 0 deletions packages/angular/generators.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,12 @@
"factory": "./src/generators/web-worker/compat",
"schema": "./src/generators/web-worker/schema.json",
"description": "Creates a Web Worker."
},
"change-storybook-targets": {
"factory": "./src/generators/change-storybook-targets/compat",
"schema": "./src/generators/change-storybook-targets/schema.json",
"description": "Change Storybook targets to use native Storybook builders",
"hidden": false
}
},
"generators": {
Expand Down Expand Up @@ -290,6 +296,11 @@
"factory": "./src/generators/web-worker/web-worker",
"schema": "./src/generators/web-worker/schema.json",
"description": "Creates a Web Worker."
},
"change-storybook-targets": {
"factory": "./src/generators/change-storybook-targets/change-storybook-targets",
"schema": "./src/generators/change-storybook-targets/schema.json",
"description": "Change Storybook targets to use native Storybook builders"
}
}
}
1 change: 1 addition & 0 deletions packages/angular/generators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,4 @@ export * from './src/generators/component-cypress-spec/component-cypress-spec';
export * from './src/generators/component-story/component-story';
export * from './src/generators/web-worker/web-worker';
export * from './src/generators/mfe-remote/mfe-remote';
export * from './src/generators/change-storybook-targets/change-storybook-targets';
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { Tree } from '@nrwl/devkit';
import { changeStorybookTargetsGenerator } from '@nrwl/storybook';

export async function angularChangeStorybookTargestGenerator(tree: Tree) {
await changeStorybookTargetsGenerator(tree);
}

export default angularChangeStorybookTargestGenerator;
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { convertNxGenerator } from '@nrwl/devkit';
import angularChangeStorybookTargestGenerator from './change-storybook-targets';

export default convertNxGenerator(angularChangeStorybookTargestGenerator);
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"$schema": "http://json-schema.org/schema",
"$id": "NxAngularChangeStorybookTargetsGenerator",
"type": "object",
"cli": "nx",
"properties": {},
"additionalProperties": false,
"required": []
}
12 changes: 12 additions & 0 deletions packages/storybook/generators.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@
"schema": "./src/generators/migrate-stories-to-6-2/schema.json",
"description": "Migrate stories syntax to 6.2",
"hidden": false
},
"change-storybook-targets": {
"factory": "./src/generators/change-storybook-targets/change-storybook-targets#changeStorybookTargetsSchematic",
"schema": "./src/generators/change-storybook-targets/schema.json",
"description": "Change Storybook targets to use native Storybook builders",
"hidden": false
}
},
"generators": {
Expand Down Expand Up @@ -65,6 +71,12 @@
"schema": "./src/generators/migrate-stories-to-6-2/schema.json",
"description": "Generate default Storybook configuration files using Storybook version >=6.x specs, for projects that already have Storybook instances and configurations of versions <6.x.",
"hidden": false
},
"change-storybook-targets": {
"factory": "./src/generators/change-storybook-targets/change-storybook-targets",
"schema": "./src/generators/change-storybook-targets/schema.json",
"description": "Change Storybook targets to use native Storybook builders",
"hidden": false
}
}
}
1 change: 1 addition & 0 deletions packages/storybook/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ export { configurationGenerator } from './src/generators/configuration/configura
export { cypressProjectGenerator } from './src/generators/cypress-project/cypress-project';
export { migrateDefaultsGenerator } from './src/generators/migrate-defaults-5-to-6/migrate-defaults-5-to-6';
export { migrateStoriesTo62Generator } from './src/generators/migrate-stories-to-6-2/migrate-stories-to-6-2';
export { changeStorybookTargetsGenerator } from './src/generators/change-storybook-targets/change-storybook-targets';
export { storybookVersion } from './src/utils/versions';
6 changes: 6 additions & 0 deletions packages/storybook/migrations.json
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,12 @@
"cli": "nx",
"description": "Add projectBuildConfig option to project's Storybook config.",
"factory": "./src/migrations/update-13-4-6/set-project-build-config"
},
"update-14.0.0": {
"version": "14.0.0",
"cli": "nx",
"description": "Change Storybook targets to use native Storybook builders",
"factory": "./src/migrations/update-14-0-0/change-storybook-targets"
}
},
"packageJsonUpdates": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Tree, writeJson } from '@nrwl/devkit';
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
import { readWorkspace } from 'packages/devkit/src/generators/project-configuration';
import changeStorybookTargets from './change-storybook-targets';
import changeStorybookTargetsGenerator from './change-storybook-targets';
import * as defaultConfig from './test-configs/default-config.json';
import * as customNames from './test-configs/custom-names-config.json';
import * as nonAngular from './test-configs/non-angular.json';
Expand All @@ -17,19 +17,19 @@ describe('Change the Storybook targets for Angular projects to use native Storyb

it(`should set the browserTarget correctly in the Storybook config according to the type of project`, async () => {
writeJson(tree, 'workspace.json', defaultConfig);
await changeStorybookTargets(tree);
await changeStorybookTargetsGenerator(tree);
expect(readWorkspace(tree)).toMatchSnapshot();
});

it(`should set the browserTarget correctly even if target names are not the default`, async () => {
writeJson(tree, 'workspace.json', customNames);
await changeStorybookTargets(tree);
await changeStorybookTargetsGenerator(tree);
expect(readWorkspace(tree)).toMatchSnapshot();
});

it(`should keep any extra options added in the target`, async () => {
writeJson(tree, 'workspace.json', extraOptions);
await changeStorybookTargets(tree);
await changeStorybookTargetsGenerator(tree);
expect(readWorkspace(tree)).toMatchSnapshot();
});
});
Expand All @@ -41,7 +41,7 @@ describe('Change the Storybook targets for Angular projects to use native Storyb
});

it(`should not change their Storybook targets`, async () => {
await changeStorybookTargets(tree);
await changeStorybookTargetsGenerator(tree);
expect(readWorkspace(tree)).toMatchSnapshot();
});
});
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
import {
logger,
Tree,
formatFiles,
updateProjectConfiguration,
getProjects,
TargetConfiguration,
ProjectConfiguration,
Target,
convertNxGenerator,
} from '@nrwl/devkit';
import { findStorybookAndBuildTargets } from '../../utils/utilities';

export async function changeStorybookTargetsGenerator(tree: Tree) {
let changesMade = false;
let changesMadeToAtLeastOne = false;
const projects = getProjects(tree);
[...projects.entries()].forEach(([projectName, projectConfiguration]) => {
changesMade = false;
const { storybookBuildTarget, storybookTarget, buildTarget } =
findStorybookAndBuildTargets(projectConfiguration.targets);
if (
projectName &&
storybookTarget &&
projectConfiguration?.targets?.[storybookTarget]?.options?.uiFramework ===
'@storybook/angular'
) {
projectConfiguration.targets[storybookTarget] = updateStorybookTarget(
projectConfiguration,
storybookTarget,
projectName,
buildTarget,
storybookBuildTarget
);
changesMade = true;
changesMadeToAtLeastOne = true;
projectConfiguration.targets[storybookBuildTarget] =
updateStorybookBuildTarget(
projectConfiguration,
projectName,
buildTarget,
storybookBuildTarget
);
} else {
logger.warn(`Could not find a Storybook target for ${projectName}.`);
}
if (changesMade) {
updateProjectConfiguration(tree, projectName, projectConfiguration);
}
});

if (changesMadeToAtLeastOne) {
await formatFiles(tree);
}
}

function updateStorybookTarget(
projectConfiguration: ProjectConfiguration,
storybookTarget: string,
projectName: string,
buildTarget: string,
storybookBuildTarget: string
): TargetConfiguration {
const oldStorybookTargetConfig: TargetConfiguration =
projectConfiguration?.targets?.[storybookTarget];
const newStorybookTargetConfig: TargetConfiguration = {
executor: '@storybook/angular:start-storybook',
options: {
port: oldStorybookTargetConfig.options.port,
configDir: oldStorybookTargetConfig.options.config?.configFolder,
browserTarget: undefined,
compodoc: false,
},
configurations: oldStorybookTargetConfig.configurations,
};

const { project, target } = parseTargetStringCustom(
oldStorybookTargetConfig.options.projectBuildConfig
);
if (project && target) {
newStorybookTargetConfig.options.browserTarget =
oldStorybookTargetConfig.options.projectBuildConfig;
} else {
newStorybookTargetConfig.options.browserTarget = `${projectName}:${
buildTarget ? buildTarget : storybookBuildTarget
}`;
}

const {
uiFramework,
outputPath,
config,
projectBuildConfig,
...optionsToCopy
} = oldStorybookTargetConfig.options;

newStorybookTargetConfig.options = {
...optionsToCopy,
...newStorybookTargetConfig.options,
};

return newStorybookTargetConfig;
}

function updateStorybookBuildTarget(
projectConfiguration: ProjectConfiguration,
projectName: string,
buildTarget: string,
storybookBuildTarget: string
): TargetConfiguration {
const oldStorybookBuildTargetConfig: TargetConfiguration =
projectConfiguration?.targets?.[storybookBuildTarget];
const newStorybookBuildTargetConfig: TargetConfiguration = {
executor: '@storybook/angular:build-storybook',
outputs: oldStorybookBuildTargetConfig.outputs,
options: {
outputDir: oldStorybookBuildTargetConfig.options.outputPath,
configDir: oldStorybookBuildTargetConfig.options.config?.configFolder,
browserTarget: undefined,
compodoc: false,
},
configurations: oldStorybookBuildTargetConfig.configurations,
};

const { project, target } = parseTargetStringCustom(
oldStorybookBuildTargetConfig.options.projectBuildConfig
);
if (project && target) {
newStorybookBuildTargetConfig.options.browserTarget =
oldStorybookBuildTargetConfig.options.projectBuildConfig;
} else {
newStorybookBuildTargetConfig.options.browserTarget = `${projectName}:${
buildTarget ? buildTarget : storybookBuildTarget
}`;
}

const {
uiFramework,
outputPath,
config,
projectBuildConfig,
...optionsToCopy
} = oldStorybookBuildTargetConfig.options;

newStorybookBuildTargetConfig.options = {
...optionsToCopy,
...newStorybookBuildTargetConfig.options,
};

return newStorybookBuildTargetConfig;
}

function parseTargetStringCustom(targetString: string): Target {
const [project, target, configuration] = targetString.split(':');

return {
project,
target,
configuration,
};
}

export default changeStorybookTargetsGenerator;
export const changeStorybookTargetsSchematic = convertNxGenerator(
changeStorybookTargetsGenerator
);

0 comments on commit 5a347aa

Please sign in to comment.