UNPKG

@storybook/angular

Version:

Storybook for Angular: Develop, document, and test UI components in isolation

24 lines (18 loc) • 14.1 kB
'use strict'; var nodeLogger = require('storybook/internal/node-logger'); var serverErrors = require('storybook/internal/server-errors'); var builderWebpack5 = require('@storybook/builder-webpack5'); var architect = require('@angular-devkit/architect'); var core = require('@angular-devkit/core'); var path2 = require('path'); var process2 = require('process'); var fs = require('fs'); var url = require('url'); var common = require('storybook/internal/common'); function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } var path2__default = /*#__PURE__*/_interopDefault(path2); var process2__default = /*#__PURE__*/_interopDefault(process2); var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __esm=(fn,res)=>function(){return fn&&(res=(0, fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var __commonJS=(cb,mod)=>function(){return mod||(0, cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0});},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var filter_out_styling_rules_exports={};__export(filter_out_styling_rules_exports,{filterOutStylingRules:()=>filterOutStylingRules});var isStylingRule,filterOutStylingRules,init_filter_out_styling_rules=__esm({"src/server/utils/filter-out-styling-rules.ts"(){isStylingRule=rule=>{let{test}=rule;return !test||!(test instanceof RegExp)?!1:test.test(".css")||test.test(".scss")||test.test(".sass")},filterOutStylingRules=config=>config.module.rules.filter(rule=>!isStylingRule(rule));}});var storybook_normalize_angular_entry_plugin_exports={};__export(storybook_normalize_angular_entry_plugin_exports,{default:()=>StorybookNormalizeAngularEntryPlugin});var PLUGIN_NAME,StorybookNormalizeAngularEntryPlugin,init_storybook_normalize_angular_entry_plugin=__esm({"src/server/plugins/storybook-normalize-angular-entry-plugin.js"(){PLUGIN_NAME="storybook-normalize-angular-entry-plugin",StorybookNormalizeAngularEntryPlugin=class{constructor(options){this.options=options;}apply(compiler){compiler.hooks.environment.tap(PLUGIN_NAME,()=>{let originalEntry=compiler.options.entry;compiler.options.entry=async()=>{let entryResult;if(typeof originalEntry=="function")try{entryResult=await originalEntry();}catch(error){throw console.error("Failed to execute the entry function:",error),error}else entryResult=originalEntry;return entryResult&&entryResult.main&&entryResult.styles?{main:{import:Array.from(new Set([...entryResult.main.import,...entryResult.styles.import]))}}:entryResult};}),compiler.hooks.thisCompilation.tap(PLUGIN_NAME,compilation=>{this.compilation=compilation;});}};}});var require_angular_cli_webpack=__commonJS({"src/server/angular-cli-webpack.js"(exports){var{generateI18nBrowserWebpackConfigFromContext}=__require("@angular-devkit/build-angular/src/utils/webpack-browser-config"),TsconfigPathsPlugin=__require("tsconfig-paths-webpack-plugin"),{filterOutStylingRules:filterOutStylingRules2}=(init_filter_out_styling_rules(),__toCommonJS(filter_out_styling_rules_exports)),{default:StorybookNormalizeAngularEntryPlugin2}=(init_storybook_normalize_angular_entry_plugin(),__toCommonJS(storybook_normalize_angular_entry_plugin_exports)),{getCommonConfig,getStylesConfig,getDevServerConfig,getTypeScriptConfig}=__require("@angular-devkit/build-angular/src/tools/webpack/configs");exports.getWebpackConfig=async(baseConfig,{builderOptions,builderContext})=>{async function getCustomStylesConfig(wco){let{root}=wco;if((()=>{try{return __require.resolve("@tailwindcss/postcss",{paths:[root]}),!0}catch{return !1}})()){let fs3=__require("fs/promises"),originalReaddir=fs3.readdir;fs3.readdir=async function(path3,options){let results=await originalReaddir.call(this,path3,options),tailwindFiles=["tailwind.config.js","tailwind.config.cjs","tailwind.config.mjs","tailwind.config.ts"];return results.filter(file=>!tailwindFiles.includes(file))};let styleConfig=await getStylesConfig(wco);fs3.readdir=originalReaddir;let tailwindPackagePath=__require.resolve("@tailwindcss/postcss",{paths:[root]}),extraPostcssPlugins=[__require(tailwindPackagePath)()];return styleConfig.module.rules.map(rule=>rule.rules).forEach(rule=>{rule.forEach(r=>{r.oneOf?.forEach?.(oneOfRule=>oneOfRule.use.forEach(use=>{if(use.loader.includes("postcss-loader")&&use.options.postcssOptions){let originalOptionsFn=use.options.postcssOptions;use.options.postcssOptions=loaderOptions=>{let originalOptions=originalOptionsFn(loaderOptions);return {...originalOptions,plugins:[...originalOptions.plugins,...extraPostcssPlugins]}};}}));});}),styleConfig}else return getStylesConfig(wco)}let{config:cliConfig}=await generateI18nBrowserWebpackConfigFromContext({index:"noop-index",main:"noop-main",...builderOptions,styles:builderOptions.styles?.map(style=>typeof style=="string"?style:style.input).filter(style=>typeof style=="string"||style.inject!==!1),outputPath:typeof builderOptions.outputPath=="string"?builderOptions.outputPath:builderOptions.outputPath?.base??"noop-out",optimization:!1,namedChunks:!1,progress:!1,buildOptimizer:!1,aot:!1},builderContext,wco=>[getCommonConfig(wco),getCustomStylesConfig(wco),getTypeScriptConfig?getTypeScriptConfig(wco):getDevServerConfig(wco)]);!builderOptions.experimentalZoneless&&!cliConfig.entry.polyfills?.includes("zone.js")&&(cliConfig.entry.polyfills??=[],cliConfig.entry.polyfills.push("zone.js"));let entry=[...cliConfig.entry.polyfills??[],...baseConfig.entry,...cliConfig.entry.styles??[]],rulesExcludingStyles=filterOutStylingRules2(baseConfig),module2={...baseConfig.module,rules:[...cliConfig.module.rules,...rulesExcludingStyles]},plugins=[...cliConfig.plugins??[],...baseConfig.plugins,new StorybookNormalizeAngularEntryPlugin2],resolve={...baseConfig.resolve,modules:Array.from(new Set([...baseConfig.resolve.modules,...cliConfig.resolve.modules])),plugins:[new TsconfigPathsPlugin({configFile:builderOptions.tsConfig,mainFields:["browser","module","main"]})]};return {...baseConfig,entry,module:module2,plugins,resolve,resolveLoader:cliConfig.resolveLoader}};}});var Node=class{value;next;constructor(value){this.value=value;}},Queue=class{#head;#tail;#size;constructor(){this.clear();}enqueue(value){let node=new Node(value);this.#head?(this.#tail.next=node,this.#tail=node):(this.#head=node,this.#tail=node),this.#size++;}dequeue(){let current=this.#head;if(current)return this.#head=this.#head.next,this.#size--,current.value}peek(){if(this.#head)return this.#head.value}clear(){this.#head=void 0,this.#tail=void 0,this.#size=0;}get size(){return this.#size}*[Symbol.iterator](){let current=this.#head;for(;current;)yield current.value,current=current.next;}*drain(){for(;this.#head;)yield this.dequeue();}};function pLimit(concurrency){if(!((Number.isInteger(concurrency)||concurrency===Number.POSITIVE_INFINITY)&&concurrency>0))throw new TypeError("Expected `concurrency` to be a number from 1 and up");let queue=new Queue,activeCount=0,next=()=>{activeCount--,queue.size>0&&queue.dequeue()();},run=async(fn,resolve,args)=>{activeCount++;let result=(async()=>fn(...args))();resolve(result);try{await result;}catch{}next();},enqueue=(fn,resolve,args)=>{queue.enqueue(run.bind(void 0,fn,resolve,args)),(async()=>(await Promise.resolve(),activeCount<concurrency&&queue.size>0&&queue.dequeue()()))();},generator=(fn,...args)=>new Promise(resolve=>{enqueue(fn,resolve,args);});return Object.defineProperties(generator,{activeCount:{get:()=>activeCount},pendingCount:{get:()=>queue.size},clearQueue:{value:()=>{queue.clear();}}}),generator}var EndError=class extends Error{constructor(value){super(),this.value=value;}},testElement=async(element,tester)=>tester(await element),finder=async element=>{let values=await Promise.all(element);if(values[1]===!0)throw new EndError(values[0]);return !1};async function pLocate(iterable,tester,{concurrency=Number.POSITIVE_INFINITY,preserveOrder=!0}={}){let limit=pLimit(concurrency),items=[...iterable].map(element=>[element,limit(testElement,element,tester)]),checkLimit=pLimit(preserveOrder?1:Number.POSITIVE_INFINITY);try{await Promise.all(items.map(element=>checkLimit(finder,element)));}catch(error){if(error instanceof EndError)return error.value;throw error}}var typeMappings={directory:"isDirectory",file:"isFile"};function checkType(type){if(!Object.hasOwnProperty.call(typeMappings,type))throw new Error(`Invalid type specified: ${type}`)}var matchType=(type,stat)=>stat[typeMappings[type]](),toPath=urlOrPath=>urlOrPath instanceof URL?url.fileURLToPath(urlOrPath):urlOrPath;async function locatePath(paths,{cwd=process2__default.default.cwd(),type="file",allowSymlinks=!0,concurrency,preserveOrder}={}){checkType(type),cwd=toPath(cwd);let statFunction=allowSymlinks?fs.promises.stat:fs.promises.lstat;return pLocate(paths,async path_=>{try{let stat=await statFunction(path2__default.default.resolve(cwd,path_));return matchType(type,stat)}catch{return !1}},{concurrency,preserveOrder})}function toPath2(urlOrPath){return urlOrPath instanceof URL?url.fileURLToPath(urlOrPath):urlOrPath}var findUpStop=Symbol("findUpStop");async function findUpMultiple(name,options={}){let directory=path2__default.default.resolve(toPath2(options.cwd)??""),{root}=path2__default.default.parse(directory),stopAt=path2__default.default.resolve(directory,toPath2(options.stopAt??root)),limit=options.limit??Number.POSITIVE_INFINITY,paths=[name].flat(),runMatcher=async locateOptions=>{if(typeof name!="function")return locatePath(paths,locateOptions);let foundPath=await name(locateOptions.cwd);return typeof foundPath=="string"?locatePath([foundPath],locateOptions):foundPath},matches=[];for(;;){let foundPath=await runMatcher({...options,cwd:directory});if(foundPath===findUpStop||(foundPath&&matches.push(path2__default.default.resolve(directory,foundPath)),directory===stopAt||matches.length>=limit))break;directory=path2__default.default.dirname(directory);}return matches}async function findUp(name,options={}){return (await findUpMultiple(name,{...options,limit:1}))[0]}var import_angular_cli_webpack=__toESM(require_angular_cli_webpack());var moduleIsAvailable=moduleName=>{try{return __require.resolve(moduleName),!0}catch{return !1}};async function webpackFinal(baseConfig,options){if(!moduleIsAvailable("@angular-devkit/build-angular"))return nodeLogger.logger.info('=> Using base config because "@angular-devkit/build-angular" is not installed'),baseConfig;checkForLegacyBuildOptions(options);let builderContext=getBuilderContext(options),builderOptions=await getBuilderOptions(options,builderContext),webpackConfig=await(0, import_angular_cli_webpack.getWebpackConfig)(baseConfig,{builderOptions:{watch:options.configType==="DEVELOPMENT",...builderOptions},builderContext});webpackConfig.plugins=webpackConfig.plugins??[];let miniCssPlugin=webpackConfig?.plugins?.find(plugin=>plugin?.constructor?.name==="MiniCssExtractPlugin");miniCssPlugin&&"options"in miniCssPlugin&&(miniCssPlugin.options.filename="[name].[contenthash].css",miniCssPlugin.options.chunkFilename="[name].iframe.[contenthash].css"),webpackConfig.plugins.push(new builderWebpack5.WebpackDefinePlugin({STORYBOOK_ANGULAR_OPTIONS:JSON.stringify({experimentalZoneless:builderOptions.experimentalZoneless})}));try{__require.resolve("@angular/animations");}catch{webpackConfig.plugins.push(new builderWebpack5.WebpackIgnorePlugin({resourceRegExp:/@angular\/platform-browser\/animations$/}));}return webpackConfig}function getBuilderContext(options){return options.angularBuilderContext??{target:{project:"noop-project",builder:"",options:{}},workspaceRoot:process.cwd(),getProjectMetadata:()=>({}),getTargetOptions:()=>({}),logger:new core.logging.Logger("Storybook")}}function deepMerge(target,source){let result={...target};for(let key in source)source[key]!==void 0&&source[key]!==null&&(typeof source[key]=="object"&&!Array.isArray(source[key])&&typeof target[key]=="object"&&!Array.isArray(target[key])&&target[key]!==null?result[key]=deepMerge(target[key],source[key]):result[key]=source[key]);return result}async function getBuilderOptions(options,builderContext){let browserTargetOptions={};if(options.angularBrowserTarget){let browserTarget=architect.targetFromTargetString(options.angularBrowserTarget);nodeLogger.logger.info(`=> Using angular browser target options from "${browserTarget.project}:${browserTarget.target}${browserTarget.configuration?`:${browserTarget.configuration}`:""}"`),browserTargetOptions=await builderContext.getTargetOptions(browserTarget);}let builderOptions=deepMerge(browserTargetOptions,options.angularBuilderOptions||{});return builderOptions.tsConfig=options.tsConfig??await findUp("tsconfig.json",{cwd:options.configDir,stopAt:common.getProjectRoot()})??browserTargetOptions.tsConfig,nodeLogger.logger.info(`=> Using angular project with "tsConfig:${builderOptions.tsConfig}"`),builderOptions}function checkForLegacyBuildOptions(options){if(options.angularBrowserTarget===void 0)throw new serverErrors.AngularLegacyBuildOptionsError} exports.deepMerge = deepMerge; exports.getBuilderOptions = getBuilderOptions; exports.webpackFinal = webpackFinal;