import vm from 'vm'; import React, { ComponentType } from 'react'; import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import json from '@rollup/plugin-json'; import replace from '@rollup/plugin-replace'; import sucrase from '@rollup/plugin-sucrase'; import alias from '@rollup/plugin-alias'; import externalGlobals from 'rollup-plugin-external-globals'; import { createScript } from '../script'; import orgStyled from 'styled-components'; import * as styledExports from 'styled-components'; import ReactHelmetAsync from 'react-helmet-async'; import { resolve } from 'path'; const styled = orgStyled.bind(null); for (let key of Object.keys(orgStyled)) { if (key === 'default') { continue; } (styled as any)[key] = (orgStyled as any)[key]; } for (let key of Object.keys(styledExports)) { if (key === 'default') { continue; } (styled as any)[key] = (styledExports as any)[key]; } const createReact = (path: string) => { const script = createScript({ path, format: 'cjs', plugins: [ replace({ preventAssignment: true, 'process.env.NODE_ENV': JSON.stringify('production'), }), alias({ entries: [{ find: '@', replacement: resolve('content/templates/react') }], }), sucrase({ exclude: ['node_modules/**'], transforms: ['jsx', 'typescript'], }), nodeResolve({ browser: true, preferBuiltins: false, extensions: ['.js', '.ts', '.tsx'], }), json(), commonjs({ include: /node_modules/, }), externalGlobals({ react: 'React', 'styled-components': 'StyledComponents', 'react-helmet-async': 'ReactHelmetAsync', }), ], }); const template = script.pipe>(async () => { const scriptContent = await script.data; const exports: any = {}; const module = { exports }; const globals = { module, exports, React, StyledComponents: styled, ReactHelmetAsync, }; vm.runInNewContext(scriptContent, globals); return module.exports; }); return template; }; export { createReact };