@teambit/react 0.0.800 → 0.0.803

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/apps/web/react-app-options.ts +3 -3
  2. package/apps/web/react.app-type.ts +5 -2
  3. package/apps/web/react.application.ts +117 -23
  4. package/apps/web/ssr/ssr-express.ts +81 -0
  5. package/apps/web/webpack/mutators.ts +20 -0
  6. package/apps/web/webpack/webpack.app.ssr.config.ts +37 -0
  7. package/artifacts/__bit_junit.xml +2 -2
  8. package/artifacts/env-template/public/{411.e47739f4c9a0db3da317.js → 994.bb73ab7fa3ec9ae9dc3b.js} +2 -2
  9. package/artifacts/env-template/public/assets-manifest.json +12 -12
  10. package/artifacts/env-template/public/{compositions.09db10ae938beac3c0e6.js → compositions.0ddd91d78bab5438b2a3.js} +1 -1
  11. package/artifacts/env-template/public/compositions.html +1 -1
  12. package/artifacts/env-template/public/{overview.640c2c85e1e112af0b34.js → overview.952a5d7fc353f1eb661a.js} +1 -1
  13. package/artifacts/env-template/public/overview.html +1 -1
  14. package/artifacts/env-template/public/peers.c5645a5909148532bb95.js +1 -0
  15. package/artifacts/env-template/public/{preview-root.5228227313630d8561a2.js → preview-root.3a0d522c80063747b87d.js} +1 -1
  16. package/artifacts/env-template/public/static/css/{411.90cfc900.css → 994.90cfc900.css} +0 -0
  17. package/artifacts/preview/teambit_react_react-preview.js +2 -2
  18. package/{compositions-1658978882481.js → compositions-1659271062546.js} +0 -0
  19. package/dist/apps/web/react-app-options.d.ts +3 -3
  20. package/dist/apps/web/react-app-options.js.map +1 -1
  21. package/dist/apps/web/react.app-type.d.ts +3 -1
  22. package/dist/apps/web/react.app-type.js +3 -2
  23. package/dist/apps/web/react.app-type.js.map +1 -1
  24. package/dist/apps/web/react.application.d.ts +11 -4
  25. package/dist/apps/web/react.application.js +134 -14
  26. package/dist/apps/web/react.application.js.map +1 -1
  27. package/dist/apps/web/ssr/ssr-express.d.ts +15 -0
  28. package/dist/apps/web/ssr/ssr-express.js +151 -0
  29. package/dist/apps/web/ssr/ssr-express.js.map +1 -0
  30. package/dist/apps/web/webpack/mutators.d.ts +3 -0
  31. package/dist/apps/web/webpack/mutators.js +27 -0
  32. package/dist/apps/web/webpack/mutators.js.map +1 -0
  33. package/dist/apps/web/webpack/webpack.app.ssr.config.d.ts +15 -0
  34. package/dist/apps/web/webpack/webpack.app.ssr.config.js +62 -0
  35. package/dist/apps/web/webpack/webpack.app.ssr.config.js.map +1 -0
  36. package/dist/react.main.runtime.js +1 -1
  37. package/dist/react.main.runtime.js.map +1 -1
  38. package/{overview-1658978882481.js → overview-1659271062546.js} +0 -0
  39. package/package-tar/teambit-react-0.0.803.tgz +0 -0
  40. package/package.json +38 -31
  41. package/{preview-1658978882481.js → preview-1659271062546.js} +2 -2
  42. package/artifacts/env-template/public/peers.19a4a7653682dbe63d61.js +0 -1
  43. package/package-tar/teambit-react-0.0.800.tgz +0 -0
@@ -61,6 +61,16 @@ function _terserWebpackPlugin() {
61
61
  return data;
62
62
  }
63
63
 
64
+ function _bitError() {
65
+ const data = require("@teambit/bit-error");
66
+
67
+ _bitError = function () {
68
+ return data;
69
+ };
70
+
71
+ return data;
72
+ }
73
+
64
74
  function _plugins() {
65
75
  const data = require("./plugins");
66
76
 
@@ -91,10 +101,45 @@ function _computeResults() {
91
101
  return data;
92
102
  }
93
103
 
104
+ function _webpackAppSsr() {
105
+ const data = require("./webpack/webpack.app.ssr.config");
106
+
107
+ _webpackAppSsr = function () {
108
+ return data;
109
+ };
110
+
111
+ return data;
112
+ }
113
+
114
+ function _mutators() {
115
+ const data = require("./webpack/mutators");
116
+
117
+ _mutators = function () {
118
+ return data;
119
+ };
120
+
121
+ return data;
122
+ }
123
+
124
+ function _ssrExpress() {
125
+ const data = require("./ssr/ssr-express");
126
+
127
+ _ssrExpress = function () {
128
+ return data;
129
+ };
130
+
131
+ return data;
132
+ }
133
+
134
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
135
+
136
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2().default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
137
+
94
138
  class ReactApp {
95
- constructor(name, entry, portRange, reactEnv, prerender, bundler, devServer, transformers = [], deploy, favicon) {
139
+ constructor(name, entry, ssr, portRange, reactEnv, prerender, bundler, devServer, transformers = [], deploy, favicon, logger) {
96
140
  this.name = name;
97
141
  this.entry = entry;
142
+ this.ssr = ssr;
98
143
  this.portRange = portRange;
99
144
  this.reactEnv = reactEnv;
100
145
  this.prerender = prerender;
@@ -103,6 +148,7 @@ class ReactApp {
103
148
  this.transformers = transformers;
104
149
  this.deploy = deploy;
105
150
  this.favicon = favicon;
151
+ this.logger = logger;
106
152
  (0, _defineProperty2().default)(this, "applicationType", 'react-common-js');
107
153
  (0, _defineProperty2().default)(this, "dir", 'public');
108
154
  (0, _defineProperty2().default)(this, "getESBuildConfig", (isPrerendering = this.prerender) => {
@@ -169,23 +215,90 @@ class ReactApp {
169
215
  }
170
216
 
171
217
  const devServerContext = await this.getDevServerContext(context);
172
- const devServer = this.reactEnv.getDevServer(devServerContext, [configMutator => configMutator.addTopLevel('devServer', {
173
- historyApiFallback: {
174
- index: '/index.html',
175
- disableDotRule: true,
176
- headers: {
177
- 'Access-Control-Allow-Headers': '*'
178
- }
179
- }
180
- }), configMutator => {
181
- if (!configMutator.raw.output) configMutator.raw.output = {};
182
- configMutator.raw.output.publicPath = '/';
183
- return configMutator;
184
- }, ...this.transformers]);
218
+ const devServer = this.reactEnv.getDevServer(devServerContext, [_mutators().addDevServer, _mutators().setOutput, ...this.transformers]);
185
219
  await devServer.listen(port);
186
220
  return port;
187
221
  }
188
222
 
223
+ async runSsr(context) {
224
+ var _this$logger, _this$logger2, _this$logger3;
225
+
226
+ const [from, to] = this.portRange;
227
+ const port = await _toolboxNetwork().Port.getPort(from, to); // bundle client
228
+
229
+ const clientBundle = await this.buildClient(context);
230
+ if (clientBundle.errors.length > 0) return {
231
+ errors: clientBundle.errors
232
+ };
233
+ (_this$logger = this.logger) === null || _this$logger === void 0 ? void 0 : _this$logger.info('[react.application] [ssr] client bundle - complete'); // bundle server
234
+
235
+ const serverBundle = await this.buildSsr(context);
236
+ if (serverBundle.errors.length > 0) return {
237
+ errors: serverBundle.errors
238
+ };
239
+ (_this$logger2 = this.logger) === null || _this$logger2 === void 0 ? void 0 : _this$logger2.info('[react.application] [ssr] server bundle - complete'); // load server-side runtime
240
+
241
+ const app = await (0, _ssrExpress().loadSsrApp)(context.workdir, context.appName);
242
+ (_this$logger3 = this.logger) === null || _this$logger3 === void 0 ? void 0 : _this$logger3.info('[react.application] [ssr] bundle code - loaded');
243
+ const expressApp = (0, _ssrExpress().createExpressSsr)({
244
+ name: context.appName,
245
+ workdir: context.workdir,
246
+ port,
247
+ app,
248
+ assets: (0, _ssrExpress().parseAssets)(clientBundle.assets),
249
+ logger: this.logger
250
+ });
251
+ expressApp.listen(port);
252
+ return {
253
+ port
254
+ };
255
+ }
256
+
257
+ async buildClient(context) {
258
+ const htmlConfig = [{
259
+ title: context.appName,
260
+ templateContent: (0, _webpack().html)(context.appName),
261
+ minify: false,
262
+ favicon: this.favicon
263
+ }]; // extend, including prototype methods
264
+
265
+ const ctx = Object.assign(Object.create(context), {
266
+ html: htmlConfig,
267
+ targets: [{
268
+ entries: await this.getEntries(),
269
+ components: [context.appComponent],
270
+ outputPath: (0, _path().resolve)(context.workdir, (0, _webpackAppSsr().calcOutputPath)(context.appName, 'browser')),
271
+ hostDependencies: await this.getPeers(),
272
+ aliasHostDependencies: true
273
+ }],
274
+ // @ts-ignore
275
+ capsuleNetwork: undefined,
276
+ previousTasksResults: []
277
+ });
278
+ const bundler = await this.reactEnv.getBundler(ctx, [config => config.merge([(0, _webpackAppSsr().clientConfig)()]), ...this.transformers]);
279
+ const bundleResult = await bundler.run();
280
+ return bundleResult[0];
281
+ }
282
+
283
+ async buildSsr(context) {
284
+ // extend, including prototype methods
285
+ const ctx = Object.assign(Object.create(context), _objectSpread(_objectSpread({}, context), {}, {
286
+ targets: [{
287
+ entries: await this.getSsrEntries(),
288
+ components: [context.appComponent],
289
+ outputPath: (0, _path().resolve)(context.workdir, (0, _webpackAppSsr().calcOutputPath)(context.appName, 'ssr')),
290
+ hostDependencies: await this.getPeers(),
291
+ aliasHostDependencies: true
292
+ }],
293
+ // @ts-ignore
294
+ capsuleNetwork: undefined,
295
+ previousTasksResults: []
296
+ }));
297
+ const bundler = await this.reactEnv.getBundler(ctx, [config => config.merge([(0, _webpackAppSsr().ssrConfig)()]), ...this.transformers]);
298
+ const bundleResult = await bundler.run();
299
+ return bundleResult[0];
300
+ }
301
+
189
302
  async build(context) {
190
303
  const htmlConfig = [{
191
304
  title: context.name,
@@ -227,6 +340,7 @@ class ReactApp {
227
340
  components: [capsule === null || capsule === void 0 ? void 0 : capsule.component],
228
341
  entries,
229
342
  outputPath,
343
+ hostRootDir: capsule === null || capsule === void 0 ? void 0 : capsule.path,
230
344
  hostDependencies: await this.getPeers(),
231
345
  aliasHostDependencies: true
232
346
  }],
@@ -274,6 +388,12 @@ class ReactApp {
274
388
  return this.entry();
275
389
  }
276
390
 
391
+ async getSsrEntries() {
392
+ if (!this.ssr) throw new (_bitError().BitError)('tried to build ssr without ssr entries');
393
+ if (typeof this.ssr === 'string') return [this.ssr];
394
+ return [await this.ssr()];
395
+ }
396
+
277
397
  async getDevServerContext(context) {
278
398
  const entries = await this.getEntries();
279
399
  return Object.assign(context, {
@@ -1 +1 @@
1
- {"version":3,"names":["ReactApp","constructor","name","entry","portRange","reactEnv","prerender","bundler","devServer","transformers","deploy","favicon","isPrerendering","TerserPlugin","extractComments","terserOptions","parse","ecma","compress","warnings","comparisons","inline","mangle","safari10","output","comments","ascii_only","minify","esbuildMinify","run","context","from","to","port","Port","getPort","listen","devServerContext","getDevServerContext","getDevServer","configMutator","addTopLevel","historyApiFallback","index","disableDotRule","headers","raw","publicPath","build","htmlConfig","title","templateContent","html","Object","assign","getBundler","bundleResult","computeResults","publicDir","getPublicDir","artifactsDir","dir","getDefaultBundler","capsule","env","outputPath","join","path","distDir","getCompiler","targetEntries","Array","isArray","entries","map","require","resolve","basename","staticDir","bundlerContext","targets","components","component","hostDependencies","getPeers","aliasHostDependencies","rootPath","metaData","initiator","envId","id","defaultTransformer","config","filename","addPlugin","prerenderPlugin","optimization","minimizer","remove","push","getESBuildConfig","applicationType","getEntries","getPeerDependenciesList"],"sources":["react.application.ts"],"sourcesContent":["import { join, basename } from 'path';\nimport { Application, AppContext, AppBuildContext } from '@teambit/application';\nimport { Bundler, DevServer, BundlerContext, DevServerContext, BundlerHtmlConfig } from '@teambit/bundler';\nimport { Port } from '@teambit/toolbox.network.get-port';\nimport { remove } from 'lodash';\nimport TerserPlugin from 'terser-webpack-plugin';\nimport { WebpackConfigTransformer } from '@teambit/webpack';\nimport { ReactEnv } from '../../react.env';\nimport { prerenderPlugin } from './plugins';\nimport { ReactAppBuildResult } from './react-build-result';\nimport { ReactAppPrerenderOptions } from './react-app-options';\nimport { html } from '../../webpack';\nimport { ReactDeployContext } from '.';\nimport { computeResults } from './compute-results';\n\nexport class ReactApp implements Application {\n constructor(\n readonly name: string,\n readonly entry: string[] | (() => Promise<string[]>),\n readonly portRange: number[],\n private reactEnv: ReactEnv,\n readonly prerender?: ReactAppPrerenderOptions,\n readonly bundler?: Bundler,\n readonly devServer?: DevServer,\n readonly transformers: WebpackConfigTransformer[] = [],\n readonly deploy?: (context: ReactDeployContext) => Promise<void>,\n readonly favicon?: string\n ) {}\n readonly applicationType = 'react-common-js';\n readonly dir = 'public';\n\n async run(context: AppContext): Promise<number> {\n const [from, to] = this.portRange;\n const port = await Port.getPort(from, to);\n if (this.devServer) {\n await this.devServer.listen(port);\n return port;\n }\n const devServerContext = await this.getDevServerContext(context);\n const devServer = this.reactEnv.getDevServer(devServerContext, [\n (configMutator) =>\n configMutator.addTopLevel('devServer', {\n historyApiFallback: {\n index: '/index.html',\n disableDotRule: true,\n headers: {\n 'Access-Control-Allow-Headers': '*',\n },\n },\n }),\n (configMutator) => {\n if (!configMutator.raw.output) configMutator.raw.output = {};\n configMutator.raw.output.publicPath = '/';\n\n return configMutator;\n },\n ...this.transformers,\n ]);\n await devServer.listen(port);\n return port;\n }\n\n async build(context: AppBuildContext): Promise<ReactAppBuildResult> {\n const htmlConfig: BundlerHtmlConfig[] = [\n {\n title: context.name,\n templateContent: html(context.name),\n minify: false,\n favicon: this.favicon,\n // filename: ''.html`,\n },\n ];\n Object.assign(context, {\n html: htmlConfig,\n });\n const bundler = await this.getBundler(context);\n const bundleResult = await bundler.run();\n\n return computeResults(bundleResult, { publicDir: `${this.getPublicDir(context.artifactsDir)}/${this.dir}` });\n }\n\n private getBundler(context: AppBuildContext) {\n if (this.bundler) return this.bundler;\n return this.getDefaultBundler(context);\n }\n private async getDefaultBundler(context: AppBuildContext) {\n const { capsule } = context;\n const reactEnv: ReactEnv = context.env;\n const publicDir = this.getPublicDir(context.artifactsDir);\n const outputPath = join(capsule.path, publicDir);\n const { distDir } = reactEnv.getCompiler();\n const targetEntries = Array.isArray(this.entry) ? this.entry : await this.entry();\n const entries = targetEntries.map((entry) => require.resolve(`${capsule.path}/${distDir}/${basename(entry)}`));\n const staticDir = join(outputPath, this.dir);\n\n const bundlerContext: BundlerContext = Object.assign(context, {\n targets: [\n {\n components: [capsule?.component],\n entries,\n outputPath,\n hostDependencies: await this.getPeers(),\n aliasHostDependencies: true,\n },\n ],\n entry: [],\n rootPath: '/',\n metaData: {\n initiator: `building app: ${context.name}`,\n envId: context.id,\n },\n });\n\n const defaultTransformer: WebpackConfigTransformer = (configMutator) => {\n const config = configMutator.addTopLevel('output', {\n path: staticDir,\n publicPath: `/`,\n filename: '[name].[chunkhash].js',\n });\n if (this.prerender) config.addPlugin(prerenderPlugin(this.prerender));\n if (config.raw.optimization?.minimizer) {\n remove(config.raw.optimization?.minimizer, (minimizer) => {\n return minimizer.constructor.name === 'TerserPlugin';\n });\n\n config.raw.optimization?.minimizer.push(this.getESBuildConfig());\n }\n\n return config;\n };\n const transformers = [defaultTransformer, ...this.transformers];\n const bundler: Bundler = await reactEnv.getBundler(bundlerContext, transformers);\n return bundler;\n }\n private getESBuildConfig = (isPrerendering = this.prerender) => {\n // We don't want to use esbuild in case of prerendering since the headless browser puppeteer doesn't support\n // the output of esbuild\n\n if (isPrerendering) {\n return new TerserPlugin({\n extractComments: false,\n terserOptions: {\n parse: {\n // We want terser to parse ecma 8 code. However, we don't want it\n // to apply any minification steps that turns valid ecma 5 code\n // into invalid ecma 5 code. This is why the 'compress' and 'output'\n // sections only apply transformations that are ecma 5 safe\n // https://github.com/facebook/create-react-app/pull/4234\n ecma: 8,\n },\n compress: {\n ecma: 5,\n warnings: false,\n // Disabled because of an issue with Uglify breaking seemingly valid code:\n // https://github.com/facebook/create-react-app/issues/2376\n // Pending further investigation:\n // https://github.com/mishoo/UglifyJS2/issues/2011\n comparisons: false,\n // Disabled because of an issue with Terser breaking valid code:\n // https://github.com/facebook/create-react-app/issues/5250\n // Pending further investigation:\n // https://github.com/terser-js/terser/issues/120\n inline: 2,\n },\n mangle: {\n safari10: true,\n },\n output: {\n ecma: 5,\n comments: false,\n // Turned on because emoji and regex is not minified properly using default\n // https://github.com/facebook/create-react-app/issues/2488\n ascii_only: true,\n },\n },\n });\n }\n return new TerserPlugin({\n minify: TerserPlugin.esbuildMinify,\n // `terserOptions` options will be passed to `esbuild`\n // Link to options - https://esbuild.github.io/api/#minify\n terserOptions: {\n minify: true,\n },\n });\n };\n\n private getPublicDir(artifactsDir: string) {\n return join(artifactsDir, this.applicationType, this.name);\n }\n\n async getEntries(): Promise<string[]> {\n if (Array.isArray(this.entry)) return this.entry;\n return this.entry();\n }\n\n private async getDevServerContext(context: AppContext): Promise<DevServerContext> {\n const entries = await this.getEntries();\n return Object.assign(context, {\n entry: entries,\n rootPath: '',\n publicPath: `public/${this.name}`,\n title: this.name,\n favicon: this.favicon,\n hostDependencies: await this.getPeers(),\n aliasHostDependencies: true,\n });\n }\n\n private getPeers(): Promise<string[]> {\n return this.reactEnv.getPeerDependenciesList();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["ReactApp","constructor","name","entry","ssr","portRange","reactEnv","prerender","bundler","devServer","transformers","deploy","favicon","logger","isPrerendering","TerserPlugin","extractComments","terserOptions","parse","ecma","compress","warnings","comparisons","inline","mangle","safari10","output","comments","ascii_only","minify","esbuildMinify","run","context","from","to","port","Port","getPort","listen","devServerContext","getDevServerContext","getDevServer","addDevServer","setOutput","runSsr","clientBundle","buildClient","errors","length","info","serverBundle","buildSsr","app","loadSsrApp","workdir","appName","expressApp","createExpressSsr","assets","parseAssets","htmlConfig","title","templateContent","html","ctx","Object","assign","create","targets","entries","getEntries","components","appComponent","outputPath","resolve","calcOutputPath","hostDependencies","getPeers","aliasHostDependencies","capsuleNetwork","undefined","previousTasksResults","getBundler","config","merge","clientConfig","bundleResult","getSsrEntries","ssrConfig","build","computeResults","publicDir","getPublicDir","artifactsDir","dir","getDefaultBundler","capsule","env","join","path","distDir","getCompiler","targetEntries","Array","isArray","map","require","basename","staticDir","bundlerContext","component","hostRootDir","rootPath","metaData","initiator","envId","id","defaultTransformer","configMutator","addTopLevel","publicPath","filename","addPlugin","prerenderPlugin","raw","optimization","minimizer","remove","push","getESBuildConfig","applicationType","BitError","getPeerDependenciesList"],"sources":["react.application.ts"],"sourcesContent":["import { join, resolve, basename } from 'path';\nimport { Application, AppContext, AppBuildContext, AppResult } from '@teambit/application';\nimport type { Bundler, DevServer, BundlerContext, DevServerContext, BundlerHtmlConfig } from '@teambit/bundler';\nimport { Port } from '@teambit/toolbox.network.get-port';\nimport type { Logger } from '@teambit/logger';\nimport { remove } from 'lodash';\nimport TerserPlugin from 'terser-webpack-plugin';\nimport { WebpackConfigTransformer } from '@teambit/webpack';\nimport { BitError } from '@teambit/bit-error';\nimport { ReactEnv } from '../../react.env';\nimport { prerenderPlugin } from './plugins';\nimport { ReactAppBuildResult } from './react-build-result';\nimport { ReactAppPrerenderOptions } from './react-app-options';\nimport { html } from '../../webpack';\nimport { ReactDeployContext } from '.';\nimport { computeResults } from './compute-results';\nimport { clientConfig, ssrConfig, calcOutputPath } from './webpack/webpack.app.ssr.config';\nimport { addDevServer, setOutput } from './webpack/mutators';\nimport { createExpressSsr, loadSsrApp, parseAssets } from './ssr/ssr-express';\n\nexport class ReactApp implements Application {\n constructor(\n readonly name: string,\n readonly entry: string[] | (() => Promise<string[]>),\n readonly ssr: string | (() => Promise<string>) | undefined,\n readonly portRange: [number, number],\n private reactEnv: ReactEnv,\n readonly prerender?: ReactAppPrerenderOptions,\n readonly bundler?: Bundler,\n readonly devServer?: DevServer,\n readonly transformers: WebpackConfigTransformer[] = [],\n readonly deploy?: (context: ReactDeployContext) => Promise<void>,\n readonly favicon?: string,\n private logger?: Logger\n ) {}\n readonly applicationType = 'react-common-js';\n readonly dir = 'public';\n\n async run(context: AppContext): Promise<number> {\n const [from, to] = this.portRange;\n const port = await Port.getPort(from, to);\n\n if (this.devServer) {\n await this.devServer.listen(port);\n return port;\n }\n\n const devServerContext = await this.getDevServerContext(context);\n const devServer = this.reactEnv.getDevServer(devServerContext, [addDevServer, setOutput, ...this.transformers]);\n await devServer.listen(port);\n return port;\n }\n\n async runSsr(context: AppContext): Promise<AppResult> {\n const [from, to] = this.portRange;\n const port = await Port.getPort(from, to);\n\n // bundle client\n const clientBundle = await this.buildClient(context);\n if (clientBundle.errors.length > 0) return { errors: clientBundle.errors };\n this.logger?.info('[react.application] [ssr] client bundle - complete');\n\n // bundle server\n const serverBundle = await this.buildSsr(context);\n if (serverBundle.errors.length > 0) return { errors: serverBundle.errors };\n this.logger?.info('[react.application] [ssr] server bundle - complete');\n\n // load server-side runtime\n const app = await loadSsrApp(context.workdir, context.appName);\n this.logger?.info('[react.application] [ssr] bundle code - loaded');\n\n const expressApp = createExpressSsr({\n name: context.appName,\n workdir: context.workdir,\n port,\n app,\n assets: parseAssets(clientBundle.assets),\n logger: this.logger,\n });\n\n expressApp.listen(port);\n return { port };\n }\n\n private async buildClient(context: AppContext) {\n const htmlConfig: BundlerHtmlConfig[] = [\n {\n title: context.appName,\n templateContent: html(context.appName),\n minify: false,\n favicon: this.favicon,\n },\n ];\n\n // extend, including prototype methods\n const ctx: BundlerContext = Object.assign(Object.create(context), {\n html: htmlConfig,\n targets: [\n {\n entries: await this.getEntries(),\n components: [context.appComponent],\n outputPath: resolve(context.workdir, calcOutputPath(context.appName, 'browser')),\n hostDependencies: await this.getPeers(),\n aliasHostDependencies: true,\n },\n ],\n\n // @ts-ignore\n capsuleNetwork: undefined,\n previousTasksResults: [],\n });\n\n const bundler = await this.reactEnv.getBundler(ctx, [\n (config) => config.merge([clientConfig()]),\n ...this.transformers,\n ]);\n\n const bundleResult = await bundler.run();\n return bundleResult[0];\n }\n\n private async buildSsr(context: AppContext) {\n // extend, including prototype methods\n const ctx: BundlerContext = Object.assign(Object.create(context), {\n ...context,\n targets: [\n {\n entries: await this.getSsrEntries(),\n components: [context.appComponent],\n outputPath: resolve(context.workdir, calcOutputPath(context.appName, 'ssr')),\n hostDependencies: await this.getPeers(),\n aliasHostDependencies: true,\n },\n ],\n\n // @ts-ignore\n capsuleNetwork: undefined,\n previousTasksResults: [],\n });\n\n const bundler = await this.reactEnv.getBundler(ctx, [\n (config) => config.merge([ssrConfig()]),\n ...this.transformers,\n ]);\n\n const bundleResult = await bundler.run();\n return bundleResult[0];\n }\n\n async build(context: AppBuildContext): Promise<ReactAppBuildResult> {\n const htmlConfig: BundlerHtmlConfig[] = [\n {\n title: context.name,\n templateContent: html(context.name),\n minify: false,\n favicon: this.favicon,\n // filename: ''.html`,\n },\n ];\n Object.assign(context, {\n html: htmlConfig,\n });\n const bundler = await this.getBundler(context);\n const bundleResult = await bundler.run();\n\n return computeResults(bundleResult, { publicDir: `${this.getPublicDir(context.artifactsDir)}/${this.dir}` });\n }\n\n private getBundler(context: AppBuildContext) {\n if (this.bundler) return this.bundler;\n return this.getDefaultBundler(context);\n }\n private async getDefaultBundler(context: AppBuildContext) {\n const { capsule } = context;\n const reactEnv: ReactEnv = context.env as ReactEnv;\n const publicDir = this.getPublicDir(context.artifactsDir);\n const outputPath = join(capsule.path, publicDir);\n const { distDir } = reactEnv.getCompiler();\n const targetEntries = Array.isArray(this.entry) ? this.entry : await this.entry();\n const entries = targetEntries.map((entry) => require.resolve(`${capsule.path}/${distDir}/${basename(entry)}`));\n const staticDir = join(outputPath, this.dir);\n\n const bundlerContext: BundlerContext = Object.assign(context, {\n targets: [\n {\n components: [capsule?.component],\n entries,\n outputPath,\n hostRootDir: capsule?.path,\n hostDependencies: await this.getPeers(),\n aliasHostDependencies: true,\n },\n ],\n entry: [],\n rootPath: '/',\n metaData: {\n initiator: `building app: ${context.name}`,\n envId: context.id,\n },\n });\n\n const defaultTransformer: WebpackConfigTransformer = (configMutator) => {\n const config = configMutator.addTopLevel('output', {\n path: staticDir,\n publicPath: `/`,\n filename: '[name].[chunkhash].js',\n });\n if (this.prerender) config.addPlugin(prerenderPlugin(this.prerender));\n if (config.raw.optimization?.minimizer) {\n remove(config.raw.optimization?.minimizer, (minimizer) => {\n return minimizer.constructor.name === 'TerserPlugin';\n });\n\n config.raw.optimization?.minimizer.push(this.getESBuildConfig());\n }\n\n return config;\n };\n const transformers = [defaultTransformer, ...this.transformers];\n const bundler: Bundler = await reactEnv.getBundler(bundlerContext, transformers);\n return bundler;\n }\n private getESBuildConfig = (isPrerendering = this.prerender) => {\n // We don't want to use esbuild in case of prerendering since the headless browser puppeteer doesn't support\n // the output of esbuild\n\n if (isPrerendering) {\n return new TerserPlugin({\n extractComments: false,\n terserOptions: {\n parse: {\n // We want terser to parse ecma 8 code. However, we don't want it\n // to apply any minification steps that turns valid ecma 5 code\n // into invalid ecma 5 code. This is why the 'compress' and 'output'\n // sections only apply transformations that are ecma 5 safe\n // https://github.com/facebook/create-react-app/pull/4234\n ecma: 8,\n },\n compress: {\n ecma: 5,\n warnings: false,\n // Disabled because of an issue with Uglify breaking seemingly valid code:\n // https://github.com/facebook/create-react-app/issues/2376\n // Pending further investigation:\n // https://github.com/mishoo/UglifyJS2/issues/2011\n comparisons: false,\n // Disabled because of an issue with Terser breaking valid code:\n // https://github.com/facebook/create-react-app/issues/5250\n // Pending further investigation:\n // https://github.com/terser-js/terser/issues/120\n inline: 2,\n },\n mangle: {\n safari10: true,\n },\n output: {\n ecma: 5,\n comments: false,\n // Turned on because emoji and regex is not minified properly using default\n // https://github.com/facebook/create-react-app/issues/2488\n ascii_only: true,\n },\n },\n });\n }\n return new TerserPlugin({\n minify: TerserPlugin.esbuildMinify,\n // `terserOptions` options will be passed to `esbuild`\n // Link to options - https://esbuild.github.io/api/#minify\n terserOptions: {\n minify: true,\n },\n });\n };\n\n private getPublicDir(artifactsDir: string) {\n return join(artifactsDir, this.applicationType, this.name);\n }\n\n async getEntries(): Promise<string[]> {\n if (Array.isArray(this.entry)) return this.entry;\n return this.entry();\n }\n\n async getSsrEntries(): Promise<string[]> {\n if (!this.ssr) throw new BitError('tried to build ssr without ssr entries');\n if (typeof this.ssr === 'string') return [this.ssr];\n return [await this.ssr()];\n }\n\n private async getDevServerContext(context: AppContext): Promise<DevServerContext> {\n const entries = await this.getEntries();\n return Object.assign(context, {\n entry: entries,\n rootPath: '',\n publicPath: `public/${this.name}`,\n title: this.name,\n favicon: this.favicon,\n hostDependencies: await this.getPeers(),\n aliasHostDependencies: true,\n });\n }\n\n private getPeers(): Promise<string[]> {\n return this.reactEnv.getPeerDependenciesList();\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Asset } from '@teambit/bundler';
2
+ import { Logger } from '@teambit/logger';
3
+ import type { HtmlAssets } from '@teambit/react.rendering.ssr';
4
+ declare type ExpressSsrOptions = {
5
+ name: string;
6
+ workdir: string;
7
+ port: number;
8
+ app: any;
9
+ assets: HtmlAssets;
10
+ logger?: Logger;
11
+ };
12
+ export declare function createExpressSsr({ name, workdir, port, app, assets, logger }: ExpressSsrOptions): import("express-serve-static-core").Express;
13
+ export declare function loadSsrApp(workdir: string, appName: string): Promise<any>;
14
+ export declare function parseAssets(assets: Asset[], publicPath?: string): HtmlAssets;
15
+ export {};
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ require("core-js/modules/es.array.iterator.js");
6
+
7
+ require("core-js/modules/es.promise.js");
8
+
9
+ Object.defineProperty(exports, "__esModule", {
10
+ value: true
11
+ });
12
+ exports.createExpressSsr = createExpressSsr;
13
+ exports.loadSsrApp = loadSsrApp;
14
+ exports.parseAssets = parseAssets;
15
+
16
+ function _uiFoundationUiPages() {
17
+ const data = require("@teambit/ui-foundation.ui.pages.static-error");
18
+
19
+ _uiFoundationUiPages = function () {
20
+ return data;
21
+ };
22
+
23
+ return data;
24
+ }
25
+
26
+ function _reactRendering() {
27
+ const data = require("@teambit/react.rendering.ssr");
28
+
29
+ _reactRendering = function () {
30
+ return data;
31
+ };
32
+
33
+ return data;
34
+ }
35
+
36
+ function _express() {
37
+ const data = _interopRequireDefault(require("express"));
38
+
39
+ _express = function () {
40
+ return data;
41
+ };
42
+
43
+ return data;
44
+ }
45
+
46
+ function fs() {
47
+ const data = _interopRequireWildcard(require("fs-extra"));
48
+
49
+ fs = function () {
50
+ return data;
51
+ };
52
+
53
+ return data;
54
+ }
55
+
56
+ function _path() {
57
+ const data = require("path");
58
+
59
+ _path = function () {
60
+ return data;
61
+ };
62
+
63
+ return data;
64
+ }
65
+
66
+ function _urlJoin() {
67
+ const data = _interopRequireDefault(require("url-join"));
68
+
69
+ _urlJoin = function () {
70
+ return data;
71
+ };
72
+
73
+ return data;
74
+ }
75
+
76
+ function _webpackAppSsr() {
77
+ const data = require("../webpack/webpack.app.ssr.config");
78
+
79
+ _webpackAppSsr = function () {
80
+ return data;
81
+ };
82
+
83
+ return data;
84
+ }
85
+
86
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
87
+
88
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
89
+
90
+ const MAGIC_FOLDER = 'public'; // idk where this is comping from
91
+
92
+ function createExpressSsr({
93
+ name,
94
+ workdir,
95
+ port,
96
+ app,
97
+ assets,
98
+ logger
99
+ }) {
100
+ const express = (0, _express().default)();
101
+ const publicFolder = (0, _path().resolve)(workdir, (0, _webpackAppSsr().calcOutputPath)(name, 'browser'), MAGIC_FOLDER);
102
+ express.use(_webpackAppSsr().PUBLIC_PATH, _express().default.static(publicFolder));
103
+ express.use((request, response, next) => {
104
+ if (request.query._rendering !== 'client') {
105
+ next();
106
+ return;
107
+ }
108
+
109
+ response.sendFile((0, _path().resolve)(workdir, (0, _webpackAppSsr().calcOutputPath)(name, 'browser'), MAGIC_FOLDER, 'index.html'));
110
+ });
111
+ express.use(async (request, response) => {
112
+ logger === null || logger === void 0 ? void 0 : logger.info(`[react.application] [ssr] handling "${request.url}"`);
113
+ const browser = (0, _reactRendering().browserFromExpress)(request, port);
114
+ const session = {
115
+ assets,
116
+ browser,
117
+ request,
118
+ response
119
+ };
120
+
121
+ try {
122
+ // the app itself controls the response
123
+ await app(session);
124
+ logger === null || logger === void 0 ? void 0 : logger.console(`[react.application] [ssr] success "${request.url}"`);
125
+ } catch (error) {
126
+ logger === null || logger === void 0 ? void 0 : logger.consoleError(`[react.application] [ssr] error at "${request.url}"`, error);
127
+ response.status(500).send((0, _uiFoundationUiPages().serverError)());
128
+ }
129
+ });
130
+ return express;
131
+ }
132
+
133
+ async function loadSsrApp(workdir, appName) {
134
+ const entryFile = (0, _path().resolve)(workdir, (0, _webpackAppSsr().calcOutputPath)(appName, 'ssr'), MAGIC_FOLDER, _webpackAppSsr().SSR_ENTRY_FILE);
135
+ if (!fs().existsSync(entryFile)) throw new Error(`expected ssr bundle entry file at "${entryFile}"`);
136
+ const entry = await Promise.resolve(`${entryFile}`).then(s => _interopRequireWildcard(require(s)));
137
+ const app = entry === null || entry === void 0 ? void 0 : entry.default;
138
+ if (!app) throw new Error(`bundle entry file has no default export (at "${entryFile}")`);
139
+ return app;
140
+ }
141
+
142
+ function parseAssets(assets, publicPath = _webpackAppSsr().PUBLIC_PATH) {
143
+ const deadAssets = assets.filter(x => !x.name);
144
+ if (deadAssets.length > 0) throw new Error('missing some build assets (maybe need to turn on cachedAssets, etc)');
145
+ return {
146
+ css: assets.map(x => x.name).filter(name => name === null || name === void 0 ? void 0 : name.endsWith('.css')).map(name => (0, _urlJoin().default)(publicPath, name)),
147
+ js: assets.map(x => x.name).filter(name => name === null || name === void 0 ? void 0 : name.endsWith('.js')).map(name => (0, _urlJoin().default)(publicPath, name))
148
+ };
149
+ }
150
+
151
+ //# sourceMappingURL=ssr-express.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MAGIC_FOLDER","createExpressSsr","name","workdir","port","app","assets","logger","express","Express","publicFolder","resolve","calcOutputPath","use","PUBLIC_PATH","static","request","response","next","query","_rendering","sendFile","info","url","browser","browserFromExpress","session","console","error","consoleError","status","send","serverError","loadSsrApp","appName","entryFile","SSR_ENTRY_FILE","fs","existsSync","Error","entry","default","parseAssets","publicPath","deadAssets","filter","x","length","css","map","endsWith","urlJoin","js"],"sources":["ssr-express.ts"],"sourcesContent":["import { Asset } from '@teambit/bundler';\nimport { Logger } from '@teambit/logger';\nimport { serverError } from '@teambit/ui-foundation.ui.pages.static-error';\nimport { browserFromExpress } from '@teambit/react.rendering.ssr';\nimport type { HtmlAssets, SsrSession } from '@teambit/react.rendering.ssr';\n\nimport Express from 'express';\nimport * as fs from 'fs-extra';\nimport { resolve } from 'path';\nimport urlJoin from 'url-join';\n\nimport { calcOutputPath, PUBLIC_PATH, SSR_ENTRY_FILE } from '../webpack/webpack.app.ssr.config';\n\nconst MAGIC_FOLDER = 'public'; // idk where this is comping from\n\ntype ExpressSsrOptions = {\n name: string;\n workdir: string;\n port: number;\n app: any;\n assets: HtmlAssets;\n logger?: Logger;\n};\n\nexport function createExpressSsr({ name, workdir, port, app, assets, logger }: ExpressSsrOptions) {\n const express = Express();\n\n const publicFolder = resolve(workdir, calcOutputPath(name, 'browser'), MAGIC_FOLDER);\n\n express.use(PUBLIC_PATH, Express.static(publicFolder));\n express.use((request, response, next) => {\n if (request.query._rendering !== 'client') {\n next();\n return;\n }\n response.sendFile(resolve(workdir, calcOutputPath(name, 'browser'), MAGIC_FOLDER, 'index.html'));\n });\n express.use(async (request, response) => {\n logger?.info(`[react.application] [ssr] handling \"${request.url}\"`);\n const browser = browserFromExpress(request, port);\n const session: SsrSession = { assets, browser, request, response };\n\n try {\n // the app itself controls the response\n await app(session);\n logger?.console(`[react.application] [ssr] success \"${request.url}\"`);\n } catch (error: any) {\n logger?.consoleError(`[react.application] [ssr] error at \"${request.url}\"`, error);\n response.status(500).send(serverError());\n }\n });\n\n return express;\n}\n\nexport async function loadSsrApp(workdir: string, appName: string) {\n const entryFile = resolve(workdir, calcOutputPath(appName, 'ssr'), MAGIC_FOLDER, SSR_ENTRY_FILE);\n if (!fs.existsSync(entryFile)) throw new Error(`expected ssr bundle entry file at \"${entryFile}\"`);\n\n const entry = await import(entryFile);\n const app = entry?.default;\n if (!app) throw new Error(`bundle entry file has no default export (at \"${entryFile}\")`);\n\n return app;\n}\n\nexport function parseAssets(assets: Asset[], publicPath = PUBLIC_PATH): HtmlAssets {\n const deadAssets = assets.filter((x) => !x.name);\n if (deadAssets.length > 0) throw new Error('missing some build assets (maybe need to turn on cachedAssets, etc)');\n\n return {\n css: assets\n .map((x) => x.name)\n .filter((name) => name?.endsWith('.css'))\n .map((name) => urlJoin(publicPath, name)),\n js: assets\n .map((x) => x.name)\n .filter((name) => name?.endsWith('.js'))\n .map((name) => urlJoin(publicPath, name)),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAEA;EAAA;;EAAA;IAAA;EAAA;;EAAA;AAAA;;AACA;EAAA;;EAAA;IAAA;EAAA;;EAAA;AAAA;;AAGA;EAAA;;EAAA;IAAA;EAAA;;EAAA;AAAA;;AACA;EAAA;;EAAA;IAAA;EAAA;;EAAA;AAAA;;AACA;EAAA;;EAAA;IAAA;EAAA;;EAAA;AAAA;;AACA;EAAA;;EAAA;IAAA;EAAA;;EAAA;AAAA;;AAEA;EAAA;;EAAA;IAAA;EAAA;;EAAA;AAAA;;;;;;AAEA,MAAMA,YAAY,GAAG,QAArB,C,CAA+B;;AAWxB,SAASC,gBAAT,CAA0B;EAAEC,IAAF;EAAQC,OAAR;EAAiBC,IAAjB;EAAuBC,GAAvB;EAA4BC,MAA5B;EAAoCC;AAApC,CAA1B,EAA2F;EAChG,MAAMC,OAAO,GAAG,IAAAC,kBAAA,GAAhB;EAEA,MAAMC,YAAY,GAAG,IAAAC,eAAA,EAAQR,OAAR,EAAiB,IAAAS,+BAAA,EAAeV,IAAf,EAAqB,SAArB,CAAjB,EAAkDF,YAAlD,CAArB;EAEAQ,OAAO,CAACK,GAAR,CAAYC,4BAAZ,EAAyBL,kBAAA,CAAQM,MAAR,CAAeL,YAAf,CAAzB;EACAF,OAAO,CAACK,GAAR,CAAY,CAACG,OAAD,EAAUC,QAAV,EAAoBC,IAApB,KAA6B;IACvC,IAAIF,OAAO,CAACG,KAAR,CAAcC,UAAd,KAA6B,QAAjC,EAA2C;MACzCF,IAAI;MACJ;IACD;;IACDD,QAAQ,CAACI,QAAT,CAAkB,IAAAV,eAAA,EAAQR,OAAR,EAAiB,IAAAS,+BAAA,EAAeV,IAAf,EAAqB,SAArB,CAAjB,EAAkDF,YAAlD,EAAgE,YAAhE,CAAlB;EACD,CAND;EAOAQ,OAAO,CAACK,GAAR,CAAY,OAAOG,OAAP,EAAgBC,QAAhB,KAA6B;IACvCV,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAEe,IAAR,CAAc,uCAAsCN,OAAO,CAACO,GAAI,GAAhE;IACA,MAAMC,OAAO,GAAG,IAAAC,oCAAA,EAAmBT,OAAnB,EAA4BZ,IAA5B,CAAhB;IACA,MAAMsB,OAAmB,GAAG;MAAEpB,MAAF;MAAUkB,OAAV;MAAmBR,OAAnB;MAA4BC;IAA5B,CAA5B;;IAEA,IAAI;MACF;MACA,MAAMZ,GAAG,CAACqB,OAAD,CAAT;MACAnB,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAEoB,OAAR,CAAiB,sCAAqCX,OAAO,CAACO,GAAI,GAAlE;IACD,CAJD,CAIE,OAAOK,KAAP,EAAmB;MACnBrB,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAEsB,YAAR,CAAsB,uCAAsCb,OAAO,CAACO,GAAI,GAAxE,EAA4EK,KAA5E;MACAX,QAAQ,CAACa,MAAT,CAAgB,GAAhB,EAAqBC,IAArB,CAA0B,IAAAC,kCAAA,GAA1B;IACD;EACF,CAbD;EAeA,OAAOxB,OAAP;AACD;;AAEM,eAAeyB,UAAf,CAA0B9B,OAA1B,EAA2C+B,OAA3C,EAA4D;EACjE,MAAMC,SAAS,GAAG,IAAAxB,eAAA,EAAQR,OAAR,EAAiB,IAAAS,+BAAA,EAAesB,OAAf,EAAwB,KAAxB,CAAjB,EAAiDlC,YAAjD,EAA+DoC,+BAA/D,CAAlB;EACA,IAAI,CAACC,EAAE,GAACC,UAAH,CAAcH,SAAd,CAAL,EAA+B,MAAM,IAAII,KAAJ,CAAW,sCAAqCJ,SAAU,GAA1D,CAAN;EAE/B,MAAMK,KAAK,GAAG,yBAAaL,SAAb,kDAAd;EACA,MAAM9B,GAAG,GAAGmC,KAAH,aAAGA,KAAH,uBAAGA,KAAK,CAAEC,OAAnB;EACA,IAAI,CAACpC,GAAL,EAAU,MAAM,IAAIkC,KAAJ,CAAW,gDAA+CJ,SAAU,IAApE,CAAN;EAEV,OAAO9B,GAAP;AACD;;AAEM,SAASqC,WAAT,CAAqBpC,MAArB,EAAsCqC,UAAU,GAAG7B,4BAAnD,EAA4E;EACjF,MAAM8B,UAAU,GAAGtC,MAAM,CAACuC,MAAP,CAAeC,CAAD,IAAO,CAACA,CAAC,CAAC5C,IAAxB,CAAnB;EACA,IAAI0C,UAAU,CAACG,MAAX,GAAoB,CAAxB,EAA2B,MAAM,IAAIR,KAAJ,CAAU,qEAAV,CAAN;EAE3B,OAAO;IACLS,GAAG,EAAE1C,MAAM,CACR2C,GADE,CACGH,CAAD,IAAOA,CAAC,CAAC5C,IADX,EAEF2C,MAFE,CAEM3C,IAAD,IAAUA,IAAV,aAAUA,IAAV,uBAAUA,IAAI,CAAEgD,QAAN,CAAe,MAAf,CAFf,EAGFD,GAHE,CAGG/C,IAAD,IAAU,IAAAiD,kBAAA,EAAQR,UAAR,EAAoBzC,IAApB,CAHZ,CADA;IAKLkD,EAAE,EAAE9C,MAAM,CACP2C,GADC,CACIH,CAAD,IAAOA,CAAC,CAAC5C,IADZ,EAED2C,MAFC,CAEO3C,IAAD,IAAUA,IAAV,aAAUA,IAAV,uBAAUA,IAAI,CAAEgD,QAAN,CAAe,KAAf,CAFhB,EAGDD,GAHC,CAGI/C,IAAD,IAAU,IAAAiD,kBAAA,EAAQR,UAAR,EAAoBzC,IAApB,CAHb;EALC,CAAP;AAUD"}
@@ -0,0 +1,3 @@
1
+ import { WebpackConfigMutator } from '@teambit/webpack';
2
+ export declare function addDevServer(configMutator: WebpackConfigMutator): WebpackConfigMutator;
3
+ export declare function setOutput(configMutator: WebpackConfigMutator): WebpackConfigMutator;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.addDevServer = addDevServer;
7
+ exports.setOutput = setOutput;
8
+
9
+ function addDevServer(configMutator) {
10
+ return configMutator.addTopLevel('devServer', {
11
+ historyApiFallback: {
12
+ index: '/index.html',
13
+ disableDotRule: true
14
+ },
15
+ headers: {
16
+ 'Access-Control-Allow-Origin': '*'
17
+ }
18
+ });
19
+ }
20
+
21
+ function setOutput(configMutator) {
22
+ if (!configMutator.raw.output) configMutator.raw.output = {};
23
+ configMutator.raw.output.publicPath = '/';
24
+ return configMutator;
25
+ }
26
+
27
+ //# sourceMappingURL=mutators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["addDevServer","configMutator","addTopLevel","historyApiFallback","index","disableDotRule","headers","setOutput","raw","output","publicPath"],"sources":["mutators.ts"],"sourcesContent":["import { WebpackConfigMutator } from '@teambit/webpack';\n\nexport function addDevServer(configMutator: WebpackConfigMutator) {\n return configMutator.addTopLevel('devServer', {\n historyApiFallback: {\n index: '/index.html',\n disableDotRule: true,\n },\n headers: {\n 'Access-Control-Allow-Origin': '*',\n },\n });\n}\n\nexport function setOutput(configMutator: WebpackConfigMutator) {\n if (!configMutator.raw.output) configMutator.raw.output = {};\n configMutator.raw.output.publicPath = '/';\n\n return configMutator;\n}\n"],"mappings":";;;;;;;;AAEO,SAASA,YAAT,CAAsBC,aAAtB,EAA2D;EAChE,OAAOA,aAAa,CAACC,WAAd,CAA0B,WAA1B,EAAuC;IAC5CC,kBAAkB,EAAE;MAClBC,KAAK,EAAE,aADW;MAElBC,cAAc,EAAE;IAFE,CADwB;IAK5CC,OAAO,EAAE;MACP,+BAA+B;IADxB;EALmC,CAAvC,CAAP;AASD;;AAEM,SAASC,SAAT,CAAmBN,aAAnB,EAAwD;EAC7D,IAAI,CAACA,aAAa,CAACO,GAAd,CAAkBC,MAAvB,EAA+BR,aAAa,CAACO,GAAd,CAAkBC,MAAlB,GAA2B,EAA3B;EAC/BR,aAAa,CAACO,GAAd,CAAkBC,MAAlB,CAAyBC,UAAzB,GAAsC,GAAtC;EAEA,OAAOT,aAAP;AACD"}
@@ -0,0 +1,15 @@
1
+ import type { Configuration } from 'webpack';
2
+ export declare const SSR_ENTRY_FILE = "index.js";
3
+ /** _external_ base url for static files. (is not a folder)
4
+ * @example
5
+ * "http://localhost:3000/public/main.88a88d47d86aaabc0230.js"
6
+ */
7
+ export declare const PUBLIC_PATH = "/public";
8
+ declare enum Targets {
9
+ ssr = "ssr",
10
+ browser = "browser"
11
+ }
12
+ export declare function calcOutputPath(appName: string, target: Targets | keyof typeof Targets): string;
13
+ export declare function clientConfig(): Configuration;
14
+ export declare function ssrConfig(): Configuration;
15
+ export {};
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SSR_ENTRY_FILE = exports.PUBLIC_PATH = void 0;
7
+ exports.calcOutputPath = calcOutputPath;
8
+ exports.clientConfig = clientConfig;
9
+ exports.ssrConfig = ssrConfig;
10
+
11
+ function _path() {
12
+ const data = require("path");
13
+
14
+ _path = function () {
15
+ return data;
16
+ };
17
+
18
+ return data;
19
+ }
20
+
21
+ const OUTPUT_FOLDER = 'public/bit-apps';
22
+ const SSR_ENTRY_FILE = 'index.js';
23
+ /** _external_ base url for static files. (is not a folder)
24
+ * @example
25
+ * "http://localhost:3000/public/main.88a88d47d86aaabc0230.js"
26
+ */
27
+
28
+ exports.SSR_ENTRY_FILE = SSR_ENTRY_FILE;
29
+ const PUBLIC_PATH = '/public';
30
+ exports.PUBLIC_PATH = PUBLIC_PATH;
31
+ var Targets;
32
+
33
+ (function (Targets) {
34
+ Targets["ssr"] = "ssr";
35
+ Targets["browser"] = "browser";
36
+ })(Targets || (Targets = {}));
37
+
38
+ function calcOutputPath(appName, target) {
39
+ return (0, _path().join)(OUTPUT_FOLDER, appName, target);
40
+ }
41
+
42
+ function clientConfig() {
43
+ return {
44
+ output: {
45
+ publicPath: PUBLIC_PATH,
46
+ filename: '[name].[chunkhash].js'
47
+ }
48
+ };
49
+ }
50
+
51
+ function ssrConfig() {
52
+ return {
53
+ target: 'node',
54
+ devtool: 'eval-cheap-source-map',
55
+ output: {
56
+ libraryTarget: 'commonjs',
57
+ filename: SSR_ENTRY_FILE
58
+ }
59
+ };
60
+ }
61
+
62
+ //# sourceMappingURL=webpack.app.ssr.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["OUTPUT_FOLDER","SSR_ENTRY_FILE","PUBLIC_PATH","Targets","calcOutputPath","appName","target","join","clientConfig","output","publicPath","filename","ssrConfig","devtool","libraryTarget"],"sources":["webpack.app.ssr.config.ts"],"sourcesContent":["import { join } from 'path';\nimport type { Configuration } from 'webpack';\n\nconst OUTPUT_FOLDER = 'public/bit-apps';\nexport const SSR_ENTRY_FILE = 'index.js';\n/** _external_ base url for static files. (is not a folder)\n * @example\n * \"http://localhost:3000/public/main.88a88d47d86aaabc0230.js\"\n */\nexport const PUBLIC_PATH = '/public';\n\nenum Targets {\n ssr = 'ssr',\n browser = 'browser',\n}\n\nexport function calcOutputPath(appName: string, target: Targets | keyof typeof Targets) {\n return join(OUTPUT_FOLDER, appName, target);\n}\n\nexport function clientConfig(): Configuration {\n return {\n output: { publicPath: PUBLIC_PATH, filename: '[name].[chunkhash].js' },\n };\n}\n\nexport function ssrConfig(): Configuration {\n return {\n target: 'node',\n devtool: 'eval-cheap-source-map',\n\n output: {\n libraryTarget: 'commonjs',\n filename: SSR_ENTRY_FILE,\n },\n };\n}\n"],"mappings":";;;;;;;;;;AAAA;EAAA;;EAAA;IAAA;EAAA;;EAAA;AAAA;;AAGA,MAAMA,aAAa,GAAG,iBAAtB;AACO,MAAMC,cAAc,GAAG,UAAvB;AACP;AACA;AACA;AACA;;;AACO,MAAMC,WAAW,GAAG,SAApB;;IAEFC,O;;WAAAA,O;EAAAA,O;EAAAA,O;GAAAA,O,KAAAA,O;;AAKE,SAASC,cAAT,CAAwBC,OAAxB,EAAyCC,MAAzC,EAAiF;EACtF,OAAO,IAAAC,YAAA,EAAKP,aAAL,EAAoBK,OAApB,EAA6BC,MAA7B,CAAP;AACD;;AAEM,SAASE,YAAT,GAAuC;EAC5C,OAAO;IACLC,MAAM,EAAE;MAAEC,UAAU,EAAER,WAAd;MAA2BS,QAAQ,EAAE;IAArC;EADH,CAAP;AAGD;;AAEM,SAASC,SAAT,GAAoC;EACzC,OAAO;IACLN,MAAM,EAAE,MADH;IAELO,OAAO,EAAE,uBAFJ;IAILJ,MAAM,EAAE;MACNK,aAAa,EAAE,UADT;MAENH,QAAQ,EAAEV;IAFJ;EAJH,CAAP;AASD"}
@@ -588,7 +588,7 @@ class ReactMain {
588
588
  static async provider([envs, jestAspect, tsAspect, compiler, webpack, workspace, graphql, pkg, tester, eslint, prettier, application, generator, dependencyResolver, loggerMain], config) {
589
589
  const logger = loggerMain.createLogger(_react().ReactAspect.id);
590
590
  const reactEnv = new (_react2().ReactEnv)(jestAspect, tsAspect, compiler, webpack, workspace, pkg, tester, config, eslint, prettier, dependencyResolver, logger, _compiler().CompilerAspect.id);
591
- const appType = new (_web().ReactAppType)('react-app', reactEnv);
591
+ const appType = new (_web().ReactAppType)('react-app', reactEnv, logger);
592
592
  const react = new ReactMain(reactEnv, envs, application, appType);
593
593
  graphql.register((0, _react3().reactSchema)(react));
594
594
  envs.registerEnv(reactEnv);