UNPKG

@nx/storybook

Version:

The Nx Plugin for Storybook contains executors and generators for allowing your workspace to use the powerful Storybook integration testing & documenting capabilities.

161 lines (160 loc) • 8.52 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildPostTargetTransformer = buildPostTargetTransformer; const devkit_1 = require("@nx/devkit"); const plugin_migration_utils_1 = require("@nx/devkit/src/generators/plugin-migrations/plugin-migration-utils"); const tsquery_1 = require("@phenomnomnominal/tsquery"); const utils_1 = require("./utils"); const utils_2 = require("./utils"); function buildPostTargetTransformer(migrationLogs) { return (target, tree, projectDetails, inferredTargetConfiguration) => { let defaultConfigDir = (0, devkit_1.joinPathFragments)(projectDetails.root, '.storybook'); const configValues = { default: {}, }; if (target.options) { if (target.options.configDir) { defaultConfigDir = target.options.configDir; } handlePropertiesFromTargetOptions(tree, target.options, defaultConfigDir, projectDetails.projectName, projectDetails.root, configValues['default'], migrationLogs); } if (target.configurations) { for (const configurationName in target.configurations) { const configuration = target.configurations[configurationName]; configValues[configurationName] = {}; handlePropertiesFromTargetOptions(tree, configuration, defaultConfigDir, projectDetails.projectName, projectDetails.root, configValues[configurationName], migrationLogs); } for (const configurationName in target.configurations) { const configuration = target.configurations[configurationName]; if (configuration.configDir && configuration.configDir !== (0, plugin_migration_utils_1.toProjectRelativePath)(defaultConfigDir, projectDetails.root)) { const configFilePath = (0, utils_1.getConfigFilePath)(tree, (0, devkit_1.joinPathFragments)(projectDetails.root, configuration.configDir)); (0, utils_1.addConfigValuesToConfigFile)(tree, configFilePath, configValues); (0, utils_1.ensureViteConfigPathIsRelative)(tree, configFilePath, projectDetails.projectName, projectDetails.root, '@nx/storybook:build', migrationLogs); } if (configurationName === 'ci' && Object.keys(configuration).length === 0) { delete target.configurations[configurationName]; } } if (Object.keys(target.configurations).length === 0) { if ('defaultConfiguration' in target) { delete target.defaultConfiguration; } delete target.configurations; } if ('defaultConfiguration' in target && !target.configurations[target.defaultConfiguration]) { delete target.defaultConfiguration; } } if (target.outputs) { (0, plugin_migration_utils_1.processTargetOutputs)(target, [{ newName: 'output-dir', oldName: 'outputDir' }], inferredTargetConfiguration, { projectName: projectDetails.projectName, projectRoot: projectDetails.root, }); } (0, utils_1.addConfigValuesToConfigFile)(tree, (0, utils_1.getConfigFilePath)(tree, defaultConfigDir), configValues); (0, utils_1.ensureViteConfigPathIsRelative)(tree, (0, utils_1.getConfigFilePath)(tree, defaultConfigDir), projectDetails.projectName, projectDetails.root, '@nx/storybook:build', migrationLogs); return target; }; } function handlePropertiesFromTargetOptions(tree, options, defaultConfigDir, projectName, projectRoot, configValues, migrationLogs) { let configDir = defaultConfigDir; if ('configDir' in options) { if (options.configDir !== defaultConfigDir) { configDir = options.configDir; } options.configDir = (0, plugin_migration_utils_1.toProjectRelativePath)(options.configDir, projectRoot); } if (options.outputDir) { options.outputDir = (0, plugin_migration_utils_1.toProjectRelativePath)(options.outputDir, projectRoot); } if ('styles' in options) { delete options.styles; } if ('stylePreprocessorOptions' in options) { delete options.stylePreprocessorOptions; } if ('docsMode' in options) { configValues.docsMode = options.docsMode; moveDocsModeToConfigFile(tree, configDir, projectName, migrationLogs, configDir === defaultConfigDir); delete options.docsMode; } if ('staticDir' in options) { configValues.staticDir = options.staticDir; moveStaticDirToConfigFile(tree, configDir, projectName, migrationLogs, configDir === defaultConfigDir); delete options.staticDir; } const storybookPropMappings = (0, utils_2.getInstalledPackageVersionInfo)(tree, 'storybook')?.major === 8 ? utils_1.STORYBOOK_PROP_MAPPINGS.v8 : utils_1.STORYBOOK_PROP_MAPPINGS.v7; for (const [prevKey, newKey] of Object.entries(storybookPropMappings)) { if (prevKey in options) { let prevValue = options[prevKey]; delete options[prevKey]; options[newKey] = prevValue; } } } function moveDocsModeToConfigFile(tree, configDir, projectName, migrationLogs, useConfigValues = true) { const configFilePath = (0, utils_1.getConfigFilePath)(tree, configDir); const configFileContents = tree.read(configFilePath, 'utf-8'); const sourceFile = (0, tsquery_1.ast)(configFileContents); const CONFIG_OBJECT_SELECTOR = 'VariableDeclaration:has(Identifier[name=config]) ObjectLiteralExpression'; const DOCS_MODE_SELECTOR = 'PropertyAssignment:has(Identifier[name=docs]) PropertyAssignment:has(Identifier[name=docsMode])'; const DOCS_SELECTOR = 'PropertyAssignment:has(Identifier[name=docs])'; const configNodes = (0, tsquery_1.query)(sourceFile, CONFIG_OBJECT_SELECTOR); if (configNodes.length === 0) { // Invalid config file migrationLogs.addLog({ project: projectName, executorName: '@nx/storybook:build', log: 'Could not find a valid Storybook Config to migrate `docsMode`. Update your `main.ts` file to add `docsMode`.', }); return; } const configNode = configNodes[0]; const hasDocsMode = (0, tsquery_1.query)(configNode, DOCS_MODE_SELECTOR).length > 0; if (hasDocsMode) { return; } let startPosition = configNode.getStart() + 1; let needsDocObject = true; const docsNodes = (0, tsquery_1.query)(configNode, DOCS_SELECTOR); if (docsNodes.length > 0) { needsDocObject = false; startPosition = docsNodes[0].getStart() + 1; } const docsModeInsert = `options.docsMode`; const nodeToInsert = needsDocObject ? `docs: { docsMode: ${docsModeInsert} },` : `docsMode: ${docsModeInsert},`; tree.write(configFilePath, `${configFileContents.slice(0, startPosition)}${nodeToInsert}${configFileContents.slice(startPosition)}`); } function moveStaticDirToConfigFile(tree, configDir, projectName, migrationLogs, useConfigValues = true) { const configFilePath = (0, utils_1.getConfigFilePath)(tree, configDir); const configFileContents = tree.read(configFilePath, 'utf-8'); const sourceFile = (0, tsquery_1.ast)(configFileContents); const CONFIG_OBJECT_SELECTOR = 'VariableDeclaration:has(Identifier[name=config]) ObjectLiteralExpression'; const STATIC_DIRS_SELECTOR = 'PropertyAssignment:has(Identifier[name=staticDirs])'; const configNodes = (0, tsquery_1.query)(sourceFile, CONFIG_OBJECT_SELECTOR); if (configNodes.length === 0) { // Invalid config file migrationLogs.addLog({ project: projectName, executorName: '@nx/storybook:build', log: 'Could not find a valid Storybook Config to migrate `staticDir`. Update your `main.ts` file to add `staticDirs`.', }); return; } const configNode = configNodes[0]; const hasStaticDir = (0, tsquery_1.query)(configNode, STATIC_DIRS_SELECTOR).length > 0; if (hasStaticDir) { return; } let startPosition = configNode.getStart() + 1; const nodeToInsert = `staticDirs: options.staticDir,`; tree.write(configFilePath, `${configFileContents.slice(0, startPosition)}${nodeToInsert}${configFileContents.slice(startPosition)}`); }