@tamagui/next-plugin 1.0.1-beta.227 → 1.0.1-beta.228
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.
- package/dist/cjs/withTamagui.js +52 -16
- package/dist/cjs/withTamagui.js.map +3 -3
- package/dist/esm/withTamagui.js +52 -16
- package/dist/esm/withTamagui.js.map +2 -2
- package/dist/jsx/index.js +2 -0
- package/dist/jsx/index.js.map +7 -0
- package/dist/jsx/withTamagui.js +320 -0
- package/dist/jsx/withTamagui.js.map +7 -0
- package/package.json +8 -6
- package/src/withTamagui.ts +59 -18
- package/types/withTamagui.d.ts +1 -0
package/dist/cjs/withTamagui.js
CHANGED
|
@@ -30,7 +30,9 @@ module.exports = __toCommonJS(withTamagui_exports);
|
|
|
30
30
|
var import_fs = require("fs");
|
|
31
31
|
var import_path = __toESM(require("path"));
|
|
32
32
|
var import_browserslist = __toESM(require("browserslist"));
|
|
33
|
+
var import_css_minimizer_webpack_plugin = __toESM(require("css-minimizer-webpack-plugin"));
|
|
33
34
|
var import_esm_resolve = __toESM(require("esm-resolve"));
|
|
35
|
+
var import_mini_css_extract_plugin = __toESM(require("mini-css-extract-plugin"));
|
|
34
36
|
var import_css = require("next/dist/build/webpack/config/blocks/css");
|
|
35
37
|
var import_loaders = require("next/dist/build/webpack/config/blocks/css/loaders");
|
|
36
38
|
var import_tamagui_loader = require("tamagui-loader");
|
|
@@ -183,6 +185,18 @@ const withTamagui = (tamaguiOptions) => {
|
|
|
183
185
|
delete webpackConfig.resolve.plugins[0].paths["tamagui"];
|
|
184
186
|
}
|
|
185
187
|
}
|
|
188
|
+
if (!dev && tamaguiOptions.enableCSSOptimizations) {
|
|
189
|
+
const cssMin = webpackConfig.optimization.minimizer.find(
|
|
190
|
+
(x) => x.toString().includes("css-minimizer-plugin")
|
|
191
|
+
);
|
|
192
|
+
if (cssMin) {
|
|
193
|
+
webpackConfig.optimization.minimizer = webpackConfig.optimization.minimizer.slice(
|
|
194
|
+
cssMin.index,
|
|
195
|
+
1
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
webpackConfig.optimization.minimizer.push(new import_css_minimizer_webpack_plugin.default());
|
|
199
|
+
}
|
|
186
200
|
if (isServer) {
|
|
187
201
|
const externalize = (context, request) => {
|
|
188
202
|
const fullPath = request[0] === "." ? import_path.default.join(context, request) : request;
|
|
@@ -261,24 +275,46 @@ const withTamagui = (tamaguiOptions) => {
|
|
|
261
275
|
]
|
|
262
276
|
});
|
|
263
277
|
}
|
|
278
|
+
const cssLoader = (0, import_loaders.getGlobalCssLoader)(
|
|
279
|
+
{
|
|
280
|
+
assetPrefix: options.config.assetPrefix || config.assetPrefix,
|
|
281
|
+
future: nextConfig.future,
|
|
282
|
+
experimental: nextConfig.experimental || {},
|
|
283
|
+
isEdgeRuntime: true,
|
|
284
|
+
isProduction: !dev,
|
|
285
|
+
targetWeb: true,
|
|
286
|
+
isClient: !isServer,
|
|
287
|
+
isServer,
|
|
288
|
+
isDevelopment: dev
|
|
289
|
+
},
|
|
290
|
+
() => (0, import_css.lazyPostCSS)(dir, getSupportedBrowsers(dir, dev)),
|
|
291
|
+
[]
|
|
292
|
+
);
|
|
293
|
+
const cssTest = tamaguiOptions.includeCSSTest ?? /\.css$/;
|
|
294
|
+
if (!dev && tamaguiOptions.enableCSSOptimizations) {
|
|
295
|
+
const postCSSLoader = cssLoader[cssLoader.length - 1];
|
|
296
|
+
cssRules.unshift({
|
|
297
|
+
test: cssTest,
|
|
298
|
+
use: [import_mini_css_extract_plugin.default.loader, "css-loader", postCSSLoader],
|
|
299
|
+
sideEffects: true
|
|
300
|
+
});
|
|
301
|
+
webpackConfig.plugins.push(
|
|
302
|
+
new import_mini_css_extract_plugin.default({
|
|
303
|
+
filename: "static/css/[contenthash].css",
|
|
304
|
+
ignoreOrder: true
|
|
305
|
+
})
|
|
306
|
+
);
|
|
307
|
+
} else {
|
|
308
|
+
cssRules.unshift({
|
|
309
|
+
test: cssTest,
|
|
310
|
+
sideEffects: true,
|
|
311
|
+
use: cssLoader
|
|
312
|
+
});
|
|
313
|
+
}
|
|
264
314
|
cssRules.unshift({
|
|
265
|
-
test:
|
|
315
|
+
test: cssTest,
|
|
266
316
|
sideEffects: true,
|
|
267
|
-
use:
|
|
268
|
-
{
|
|
269
|
-
assetPrefix: options.config.assetPrefix || config.assetPrefix,
|
|
270
|
-
future: nextConfig.future,
|
|
271
|
-
experimental: nextConfig.experimental || {},
|
|
272
|
-
isEdgeRuntime: true,
|
|
273
|
-
isProduction: !dev,
|
|
274
|
-
targetWeb: true,
|
|
275
|
-
isClient: !isServer,
|
|
276
|
-
isServer,
|
|
277
|
-
isDevelopment: dev
|
|
278
|
-
},
|
|
279
|
-
() => (0, import_css.lazyPostCSS)(dir, getSupportedBrowsers(dir, dev)),
|
|
280
|
-
[]
|
|
281
|
-
)
|
|
317
|
+
use: cssLoader
|
|
282
318
|
});
|
|
283
319
|
}
|
|
284
320
|
webpackConfig.plugins.push(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/withTamagui.ts"],
|
|
4
|
-
"sourcesContent": ["import { existsSync, fstat } from 'fs'\nimport path, { dirname, join } from 'path'\n\nimport type { TamaguiOptions } from '@tamagui/static'\nimport browserslist from 'browserslist'\nimport buildResolver from 'esm-resolve'\nimport { lazyPostCSS } from 'next/dist/build/webpack/config/blocks/css'\nimport { getGlobalCssLoader } from 'next/dist/build/webpack/config/blocks/css/loaders'\nimport { TamaguiPlugin, shouldExclude as shouldExcludeDefault } from 'tamagui-loader'\nimport webpack from 'webpack'\n\nexport type WithTamaguiProps = TamaguiOptions & {\n useReactNativeWebLite: boolean\n disableFontSupport?: boolean\n aliasReactPackages?: boolean\n includeCSSTest?: RegExp | ((path: string) => boolean)\n shouldExtract?: (path: string, projectRoot: string) => boolean | undefined\n shouldExcludeFromServer?: (props: {\n context: string\n request: string\n fullPath: string\n }) => boolean | string | undefined\n}\n\nexport const withTamagui = (tamaguiOptions: WithTamaguiProps) => {\n return (nextConfig: any = {}) => {\n return {\n ...nextConfig,\n webpack: (webpackConfig: any, options: any) => {\n const { dir, config, dev, isServer } = options\n\n const resolver = buildResolver(join(dir, 'index.js'), {\n constraints: 'node',\n })\n\n // @ts-ignore\n if (typeof globalThis['__DEV__'] === 'undefined') {\n // @ts-ignore\n globalThis['__DEV__'] = dev\n }\n\n const isNext12 = typeof options.config?.swcMinify === 'boolean'\n if (!isNext12) {\n throw new Error(`Next.js 12 only supported`)\n }\n\n const prefix = `${isServer ? ' ssr ' : ' web '} |`\n\n const safeResolves = (resolves: [string, string][], multiple = false) => {\n const res: string[][] = []\n for (const [out, mod] of resolves) {\n if (out.endsWith('$')) {\n res.push([out, mod])\n continue\n }\n try {\n res.push([out, resolveEsm(mod)])\n if (multiple) {\n res.push([out, resolveEsm(mod, true)])\n }\n } catch (err) {\n if (out.includes(`@gorhom/bottom-sheet`)) {\n continue\n }\n if (process.env.DEBUG?.startsWith('tamagui')) {\n // eslint-disable-next-line no-console\n console.log(prefix, `withTamagui skipping resolving ${out}`, err)\n }\n }\n }\n return res\n }\n\n const resolveEsm = (relativePath: string, onlyRequire = false) => {\n if (isServer || onlyRequire) {\n return require.resolve(relativePath)\n }\n const esm = resolver(relativePath)\n return esm ? path.join(dir, esm) : require.resolve(relativePath)\n }\n\n const SEP = path.sep\n\n // automatically compile our given components\n const componentsFullPaths = safeResolves(\n tamaguiOptions.components.map(\n (moduleName) => [moduleName, moduleName] as [string, string]\n ),\n true\n )\n\n const componentsBaseDirs = componentsFullPaths.map(([_, fullPath]) => {\n let rootPath = dirname(fullPath as string)\n while (rootPath.length > 1) {\n const pkg = join(rootPath, 'package.json')\n const hasPkg = existsSync(pkg)\n if (hasPkg) {\n return rootPath\n } else {\n rootPath = join(rootPath, '..')\n }\n }\n throw new Error(`Couldn't find package.json in any path above: ${fullPath}`)\n })\n\n function isInComponentModule(fullPath: string) {\n return componentsBaseDirs.some((componentDir) => fullPath.startsWith(componentDir))\n }\n\n // allows configuration\n const shouldExclude = (path: string, projectRoot: string) => {\n const res = tamaguiOptions.shouldExtract?.(path, projectRoot)\n if (typeof res === 'boolean') {\n return !res\n }\n if (isInComponentModule(path)) {\n return false\n }\n return shouldExcludeDefault(path, projectRoot)\n }\n\n const rnw = tamaguiOptions.useReactNativeWebLite\n ? 'react-native-web-lite'\n : 'react-native-web'\n\n const tamaguiAliases = Object.fromEntries(\n safeResolves([\n ['@tamagui/core/reset.css', '@tamagui/core/reset.css'],\n ['@tamagui/core', '@tamagui/core'],\n ['react-native-svg', '@tamagui/react-native-svg'],\n // fixes https://github.com/kentcdodds/mdx-bundler/issues/143\n ['react/jsx-runtime.js', 'react/jsx-runtime'],\n ['react/jsx-runtime', 'react/jsx-runtime'],\n ['react/jsx-dev-runtime.js', 'react/jsx-dev-runtime'],\n ['react/jsx-dev-runtime', 'react/jsx-dev-runtime'],\n ['react-native-reanimated', 'react-native-reanimated'],\n ['react-native$', rnw],\n ['react-native-web$', rnw],\n ['@testing-library/react-native', '@tamagui/proxy-worm'],\n ['@gorhom/bottom-sheet$', '@gorhom/bottom-sheet'],\n // fix reanimated 3\n ['react-native/Libraries/Renderer/shims/ReactFabric', '@tamagui/proxy-worm'],\n ...(tamaguiOptions.aliasReactPackages\n ? ([\n ['react', 'react'],\n ['react-dom', 'react-dom'],\n ] as any)\n : []),\n ])\n )\n\n const alias = {\n ...(webpackConfig.resolve.alias || {}),\n ...tamaguiAliases,\n }\n\n if (process.env.DEBUG) {\n // eslint-disable-next-line no-console\n console.log('Tamagui alias:', alias)\n }\n\n if (process.env.ANALYZE === 'true') {\n Object.assign(webpackConfig.optimization, {\n concatenateModules: false,\n })\n }\n\n webpackConfig.resolve.alias = alias\n\n webpackConfig.plugins.push(\n new webpack.DefinePlugin({\n 'process.env.IS_STATIC': '\"\"',\n 'process.env.TAMAGUI_TARGET': '\"web\"',\n __DEV__: JSON.stringify(dev),\n })\n )\n\n const excludeExports = tamaguiOptions.excludeReactNativeWebExports\n if (Array.isArray(excludeExports)) {\n try {\n const regexStr = `react-native-web(-lite)?/.*(${excludeExports.join('|')}).*js`\n const regex = new RegExp(regexStr)\n // console.log(prefix, 'exclude', regexStr)\n webpackConfig.plugins.push(\n new webpack.NormalModuleReplacementPlugin(regex, resolveEsm('@tamagui/proxy-worm'))\n )\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\n `Invalid names provided to excludeReactNativeWebExports: ${excludeExports.join(', ')}`\n )\n }\n }\n\n if (process.env.IGNORE_TS_CONFIG_PATHS) {\n if (process.env.DEBUG) {\n // eslint-disable-next-line no-console\n console.log(prefix, 'ignoring tsconfig paths')\n }\n if (webpackConfig.resolve.plugins[0]) {\n delete webpackConfig.resolve.plugins[0].paths['@tamagui/*']\n delete webpackConfig.resolve.plugins[0].paths['tamagui']\n }\n }\n\n /**\n * Server react-native compat\n */\n if (isServer) {\n const externalize = (context: string, request: string) => {\n const fullPath = request[0] === '.' ? path.join(context, request) : request\n\n if (tamaguiOptions.shouldExcludeFromServer) {\n const userRes = tamaguiOptions.shouldExcludeFromServer({\n context,\n request,\n fullPath,\n })\n if (userRes !== undefined) {\n return userRes\n }\n }\n\n if (isInComponentModule(fullPath)) {\n return false\n }\n\n if (fullPath.includes('react-native-web-lite')) {\n // always inline react-native-web-lite due to errors where next.js resolved the path to esm\n return false\n }\n\n // must inline react-native so we can alias to react-native-web\n if (fullPath === 'react-native' || fullPath.startsWith(`react-native${SEP}`)) {\n return false\n }\n\n if (\n // feather icons uses react-native-svg which needs to be aliased\n // fullPath.includes('/lucide-icons/') ||\n fullPath.startsWith('react-native-web') ||\n fullPath.includes(`node_modules${SEP}react-native-web`) ||\n new RegExp(`^(react-dom|react)${SEP}$`).test(fullPath)\n ) {\n return `commonjs ${fullPath}`\n }\n if (\n fullPath.startsWith('moti') ||\n fullPath.startsWith('solito') ||\n fullPath === 'tamagui' ||\n fullPath.startsWith('@tamagui') ||\n fullPath === 'react-native-safe-area-context' ||\n fullPath === 'expo-linear-gradient' ||\n fullPath.startsWith('@react-navigation') ||\n fullPath.startsWith('@gorhom')\n ) {\n return\n }\n if (/^@?react-native-/.test(request)) {\n return false\n }\n return true\n }\n\n // externalize react native things from bundle\n webpackConfig.externals = [\n ...webpackConfig.externals.map((external) => {\n if (typeof external !== 'function') {\n return external\n }\n // only runs on server\n return (ctx, cb) => {\n const isCb = typeof cb === 'function'\n const res = externalize(ctx.context, ctx.request)\n if (isCb) {\n if (typeof res === 'string') {\n return cb(null, res)\n }\n if (res) {\n return external(ctx, cb)\n }\n return cb()\n }\n return !res\n ? Promise.resolve(undefined)\n : typeof res === 'string'\n ? Promise.resolve(res)\n : external(ctx)\n }\n }),\n ]\n }\n\n const cssRules = webpackConfig.module.rules.find(\n (rule) =>\n Array.isArray(rule.oneOf) &&\n rule.oneOf.some(\n ({ test }) =>\n typeof test === 'object' &&\n typeof test.test === 'function' &&\n test.test('filename.css')\n )\n ).oneOf\n\n /**\n * Font Support\n */\n if (cssRules) {\n if (!tamaguiOptions.disableFontSupport) {\n // fonts support\n cssRules.unshift({\n test: /\\.(woff(2)?|eot|ttf|otf)(\\?v=\\d+\\.\\d+\\.\\d+)?$/,\n use: [\n {\n loader: require.resolve('url-loader'),\n options: {\n limit: nextConfig.inlineFontLimit || 1024,\n fallback: require.resolve('file-loader'),\n publicPath: `${nextConfig.assetPrefix || ''}/_next/static/chunks/fonts/`,\n outputPath: `${isServer ? '../' : ''}static/chunks/fonts/`,\n name: '[name].[ext]',\n },\n },\n ],\n })\n }\n\n /**\n * CSS Support\n */\n cssRules.unshift({\n test: tamaguiOptions.includeCSSTest ?? /\\.css$/,\n sideEffects: true,\n use: getGlobalCssLoader(\n // @ts-ignore\n {\n assetPrefix: options.config.assetPrefix || config.assetPrefix,\n future: nextConfig.future,\n experimental: nextConfig.experimental || {},\n isEdgeRuntime: true,\n isProduction: !dev,\n targetWeb: true,\n isClient: !isServer,\n isServer,\n isDevelopment: dev,\n },\n // @ts-ignore\n () => lazyPostCSS(dir, getSupportedBrowsers(dir, dev)),\n []\n ),\n })\n }\n\n webpackConfig.plugins.push(\n new TamaguiPlugin({\n commonjs: isServer,\n exclude: (path: string) => {\n const res = shouldExclude(path, options.dir)\n // console.log(`shouldExclude`, res, path)\n return res\n },\n ...tamaguiOptions,\n })\n )\n\n if (typeof nextConfig.webpack === 'function') {\n return nextConfig.webpack(webpackConfig, options)\n }\n\n return webpackConfig\n },\n }\n }\n}\n\nfunction getSupportedBrowsers(dir, isDevelopment) {\n let browsers\n try {\n browsers = browserslist.loadConfig({\n path: dir,\n env: isDevelopment ? 'development' : 'production',\n })\n } catch {\n //\n }\n return browsers\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAkC;AAClC,kBAAoC;AAGpC,0BAAyB;AACzB,yBAA0B;AAC1B,iBAA4B;AAC5B,qBAAmC;AACnC,4BAAqE;AACrE,qBAAoB;
|
|
6
|
-
"names": ["buildResolver", "_a", "path", "shouldExcludeDefault", "webpack", "browserslist"]
|
|
4
|
+
"sourcesContent": ["import { existsSync, fstat } from 'fs'\nimport path, { dirname, join } from 'path'\n\nimport type { TamaguiOptions } from '@tamagui/static'\nimport browserslist from 'browserslist'\nimport CssMinimizerPlugin from 'css-minimizer-webpack-plugin'\nimport buildResolver from 'esm-resolve'\nimport MiniCSSExtractPlugin from 'mini-css-extract-plugin'\nimport { lazyPostCSS } from 'next/dist/build/webpack/config/blocks/css'\nimport { getGlobalCssLoader } from 'next/dist/build/webpack/config/blocks/css/loaders'\nimport { TamaguiPlugin, shouldExclude as shouldExcludeDefault } from 'tamagui-loader'\nimport webpack from 'webpack'\n\nexport type WithTamaguiProps = TamaguiOptions & {\n useReactNativeWebLite: boolean\n disableFontSupport?: boolean\n enableCSSOptimizations?: boolean\n aliasReactPackages?: boolean\n includeCSSTest?: RegExp | ((path: string) => boolean)\n shouldExtract?: (path: string, projectRoot: string) => boolean | undefined\n shouldExcludeFromServer?: (props: {\n context: string\n request: string\n fullPath: string\n }) => boolean | string | undefined\n}\n\nexport const withTamagui = (tamaguiOptions: WithTamaguiProps) => {\n return (nextConfig: any = {}) => {\n return {\n ...nextConfig,\n webpack: (webpackConfig: any, options: any) => {\n const { dir, config, dev, isServer } = options\n\n const resolver = buildResolver(join(dir, 'index.js'), {\n constraints: 'node',\n })\n\n // @ts-ignore\n if (typeof globalThis['__DEV__'] === 'undefined') {\n // @ts-ignore\n globalThis['__DEV__'] = dev\n }\n\n const isNext12 = typeof options.config?.swcMinify === 'boolean'\n if (!isNext12) {\n throw new Error(`Next.js 12 only supported`)\n }\n\n const prefix = `${isServer ? ' ssr ' : ' web '} |`\n\n const safeResolves = (resolves: [string, string][], multiple = false) => {\n const res: string[][] = []\n for (const [out, mod] of resolves) {\n if (out.endsWith('$')) {\n res.push([out, mod])\n continue\n }\n try {\n res.push([out, resolveEsm(mod)])\n if (multiple) {\n res.push([out, resolveEsm(mod, true)])\n }\n } catch (err) {\n if (out.includes(`@gorhom/bottom-sheet`)) {\n continue\n }\n if (process.env.DEBUG?.startsWith('tamagui')) {\n // eslint-disable-next-line no-console\n console.log(prefix, `withTamagui skipping resolving ${out}`, err)\n }\n }\n }\n return res\n }\n\n const resolveEsm = (relativePath: string, onlyRequire = false) => {\n if (isServer || onlyRequire) {\n return require.resolve(relativePath)\n }\n const esm = resolver(relativePath)\n return esm ? path.join(dir, esm) : require.resolve(relativePath)\n }\n\n const SEP = path.sep\n\n // automatically compile our given components\n const componentsFullPaths = safeResolves(\n tamaguiOptions.components.map(\n (moduleName) => [moduleName, moduleName] as [string, string]\n ),\n true\n )\n\n const componentsBaseDirs = componentsFullPaths.map(([_, fullPath]) => {\n let rootPath = dirname(fullPath as string)\n while (rootPath.length > 1) {\n const pkg = join(rootPath, 'package.json')\n const hasPkg = existsSync(pkg)\n if (hasPkg) {\n return rootPath\n } else {\n rootPath = join(rootPath, '..')\n }\n }\n throw new Error(`Couldn't find package.json in any path above: ${fullPath}`)\n })\n\n function isInComponentModule(fullPath: string) {\n return componentsBaseDirs.some((componentDir) => fullPath.startsWith(componentDir))\n }\n\n // allows configuration\n const shouldExclude = (path: string, projectRoot: string) => {\n const res = tamaguiOptions.shouldExtract?.(path, projectRoot)\n if (typeof res === 'boolean') {\n return !res\n }\n if (isInComponentModule(path)) {\n return false\n }\n return shouldExcludeDefault(path, projectRoot)\n }\n\n const rnw = tamaguiOptions.useReactNativeWebLite\n ? 'react-native-web-lite'\n : 'react-native-web'\n\n const tamaguiAliases = Object.fromEntries(\n safeResolves([\n ['@tamagui/core/reset.css', '@tamagui/core/reset.css'],\n ['@tamagui/core', '@tamagui/core'],\n ['react-native-svg', '@tamagui/react-native-svg'],\n // fixes https://github.com/kentcdodds/mdx-bundler/issues/143\n ['react/jsx-runtime.js', 'react/jsx-runtime'],\n ['react/jsx-runtime', 'react/jsx-runtime'],\n ['react/jsx-dev-runtime.js', 'react/jsx-dev-runtime'],\n ['react/jsx-dev-runtime', 'react/jsx-dev-runtime'],\n ['react-native-reanimated', 'react-native-reanimated'],\n ['react-native$', rnw],\n ['react-native-web$', rnw],\n ['@testing-library/react-native', '@tamagui/proxy-worm'],\n ['@gorhom/bottom-sheet$', '@gorhom/bottom-sheet'],\n // fix reanimated 3\n ['react-native/Libraries/Renderer/shims/ReactFabric', '@tamagui/proxy-worm'],\n ...(tamaguiOptions.aliasReactPackages\n ? ([\n ['react', 'react'],\n ['react-dom', 'react-dom'],\n ] as any)\n : []),\n ])\n )\n\n const alias = {\n ...(webpackConfig.resolve.alias || {}),\n ...tamaguiAliases,\n }\n\n if (process.env.DEBUG) {\n // eslint-disable-next-line no-console\n console.log('Tamagui alias:', alias)\n }\n\n if (process.env.ANALYZE === 'true') {\n Object.assign(webpackConfig.optimization, {\n concatenateModules: false,\n })\n }\n\n webpackConfig.resolve.alias = alias\n\n webpackConfig.plugins.push(\n new webpack.DefinePlugin({\n 'process.env.IS_STATIC': '\"\"',\n 'process.env.TAMAGUI_TARGET': '\"web\"',\n __DEV__: JSON.stringify(dev),\n })\n )\n\n const excludeExports = tamaguiOptions.excludeReactNativeWebExports\n if (Array.isArray(excludeExports)) {\n try {\n const regexStr = `react-native-web(-lite)?/.*(${excludeExports.join('|')}).*js`\n const regex = new RegExp(regexStr)\n // console.log(prefix, 'exclude', regexStr)\n webpackConfig.plugins.push(\n new webpack.NormalModuleReplacementPlugin(regex, resolveEsm('@tamagui/proxy-worm'))\n )\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\n `Invalid names provided to excludeReactNativeWebExports: ${excludeExports.join(', ')}`\n )\n }\n }\n\n if (process.env.IGNORE_TS_CONFIG_PATHS) {\n if (process.env.DEBUG) {\n // eslint-disable-next-line no-console\n console.log(prefix, 'ignoring tsconfig paths')\n }\n if (webpackConfig.resolve.plugins[0]) {\n delete webpackConfig.resolve.plugins[0].paths['@tamagui/*']\n delete webpackConfig.resolve.plugins[0].paths['tamagui']\n }\n }\n\n if (!dev && tamaguiOptions.enableCSSOptimizations) {\n const cssMin = webpackConfig.optimization.minimizer.find((x) =>\n x.toString().includes('css-minimizer-plugin')\n )\n if (cssMin) {\n webpackConfig.optimization.minimizer = webpackConfig.optimization.minimizer.slice(\n cssMin.index,\n 1\n )\n }\n webpackConfig.optimization.minimizer.push(new CssMinimizerPlugin())\n }\n\n /**\n * Server react-native compat\n */\n if (isServer) {\n const externalize = (context: string, request: string) => {\n const fullPath = request[0] === '.' ? path.join(context, request) : request\n\n if (tamaguiOptions.shouldExcludeFromServer) {\n const userRes = tamaguiOptions.shouldExcludeFromServer({\n context,\n request,\n fullPath,\n })\n if (userRes !== undefined) {\n return userRes\n }\n }\n\n if (isInComponentModule(fullPath)) {\n return false\n }\n\n if (fullPath.includes('react-native-web-lite')) {\n // always inline react-native-web-lite due to errors where next.js resolved the path to esm\n return false\n }\n\n // must inline react-native so we can alias to react-native-web\n if (fullPath === 'react-native' || fullPath.startsWith(`react-native${SEP}`)) {\n return false\n }\n\n if (\n // feather icons uses react-native-svg which needs to be aliased\n // fullPath.includes('/lucide-icons/') ||\n fullPath.startsWith('react-native-web') ||\n fullPath.includes(`node_modules${SEP}react-native-web`) ||\n new RegExp(`^(react-dom|react)${SEP}$`).test(fullPath)\n ) {\n return `commonjs ${fullPath}`\n }\n if (\n fullPath.startsWith('moti') ||\n fullPath.startsWith('solito') ||\n fullPath === 'tamagui' ||\n fullPath.startsWith('@tamagui') ||\n fullPath === 'react-native-safe-area-context' ||\n fullPath === 'expo-linear-gradient' ||\n fullPath.startsWith('@react-navigation') ||\n fullPath.startsWith('@gorhom')\n ) {\n return\n }\n if (/^@?react-native-/.test(request)) {\n return false\n }\n return true\n }\n\n // externalize react native things from bundle\n webpackConfig.externals = [\n ...webpackConfig.externals.map((external) => {\n if (typeof external !== 'function') {\n return external\n }\n // only runs on server\n return (ctx, cb) => {\n const isCb = typeof cb === 'function'\n const res = externalize(ctx.context, ctx.request)\n if (isCb) {\n if (typeof res === 'string') {\n return cb(null, res)\n }\n if (res) {\n return external(ctx, cb)\n }\n return cb()\n }\n return !res\n ? Promise.resolve(undefined)\n : typeof res === 'string'\n ? Promise.resolve(res)\n : external(ctx)\n }\n }),\n ]\n }\n\n const cssRules = webpackConfig.module.rules.find(\n (rule) =>\n Array.isArray(rule.oneOf) &&\n rule.oneOf.some(\n ({ test }) =>\n typeof test === 'object' &&\n typeof test.test === 'function' &&\n test.test('filename.css')\n )\n ).oneOf\n\n /**\n * Font Support\n */\n if (cssRules) {\n if (!tamaguiOptions.disableFontSupport) {\n // fonts support\n cssRules.unshift({\n test: /\\.(woff(2)?|eot|ttf|otf)(\\?v=\\d+\\.\\d+\\.\\d+)?$/,\n use: [\n {\n loader: require.resolve('url-loader'),\n options: {\n limit: nextConfig.inlineFontLimit || 1024,\n fallback: require.resolve('file-loader'),\n publicPath: `${nextConfig.assetPrefix || ''}/_next/static/chunks/fonts/`,\n outputPath: `${isServer ? '../' : ''}static/chunks/fonts/`,\n name: '[name].[ext]',\n },\n },\n ],\n })\n }\n\n /**\n * CSS Support\n */\n const cssLoader = getGlobalCssLoader(\n // @ts-ignore\n {\n assetPrefix: options.config.assetPrefix || config.assetPrefix,\n future: nextConfig.future,\n experimental: nextConfig.experimental || {},\n isEdgeRuntime: true,\n isProduction: !dev,\n targetWeb: true,\n isClient: !isServer,\n isServer,\n isDevelopment: dev,\n },\n // @ts-ignore\n () => lazyPostCSS(dir, getSupportedBrowsers(dir, dev)),\n []\n )\n\n const cssTest = tamaguiOptions.includeCSSTest ?? /\\.css$/\n\n if (!dev && tamaguiOptions.enableCSSOptimizations) {\n const postCSSLoader = cssLoader[cssLoader.length - 1]\n // replace nextjs picky style rules with simple minicssextract\n cssRules.unshift({\n test: cssTest,\n use: [MiniCSSExtractPlugin.loader, 'css-loader', postCSSLoader],\n sideEffects: true,\n })\n webpackConfig.plugins.push(\n new MiniCSSExtractPlugin({\n filename: 'static/css/[contenthash].css',\n ignoreOrder: true,\n })\n )\n } else {\n cssRules.unshift({\n test: cssTest,\n sideEffects: true,\n use: cssLoader,\n })\n }\n cssRules.unshift({\n test: cssTest,\n sideEffects: true,\n use: cssLoader,\n })\n }\n\n webpackConfig.plugins.push(\n new TamaguiPlugin({\n commonjs: isServer,\n exclude: (path: string) => {\n const res = shouldExclude(path, options.dir)\n // console.log(`shouldExclude`, res, path)\n return res\n },\n ...tamaguiOptions,\n })\n )\n\n if (typeof nextConfig.webpack === 'function') {\n return nextConfig.webpack(webpackConfig, options)\n }\n\n return webpackConfig\n },\n }\n }\n}\n\nfunction getSupportedBrowsers(dir, isDevelopment) {\n let browsers\n try {\n browsers = browserslist.loadConfig({\n path: dir,\n env: isDevelopment ? 'development' : 'production',\n })\n } catch {\n //\n }\n return browsers\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["buildResolver", "_a", "path", "shouldExcludeDefault", "webpack", "CssMinimizerPlugin", "MiniCSSExtractPlugin", "browserslist"]
|
|
7
7
|
}
|
package/dist/esm/withTamagui.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { existsSync } from "fs";
|
|
2
2
|
import path, { dirname, join } from "path";
|
|
3
3
|
import browserslist from "browserslist";
|
|
4
|
+
import CssMinimizerPlugin from "css-minimizer-webpack-plugin";
|
|
4
5
|
import buildResolver from "esm-resolve";
|
|
6
|
+
import MiniCSSExtractPlugin from "mini-css-extract-plugin";
|
|
5
7
|
import { lazyPostCSS } from "next/dist/build/webpack/config/blocks/css";
|
|
6
8
|
import { getGlobalCssLoader } from "next/dist/build/webpack/config/blocks/css/loaders";
|
|
7
9
|
import { TamaguiPlugin, shouldExclude as shouldExcludeDefault } from "tamagui-loader";
|
|
@@ -154,6 +156,18 @@ const withTamagui = (tamaguiOptions) => {
|
|
|
154
156
|
delete webpackConfig.resolve.plugins[0].paths["tamagui"];
|
|
155
157
|
}
|
|
156
158
|
}
|
|
159
|
+
if (!dev && tamaguiOptions.enableCSSOptimizations) {
|
|
160
|
+
const cssMin = webpackConfig.optimization.minimizer.find(
|
|
161
|
+
(x) => x.toString().includes("css-minimizer-plugin")
|
|
162
|
+
);
|
|
163
|
+
if (cssMin) {
|
|
164
|
+
webpackConfig.optimization.minimizer = webpackConfig.optimization.minimizer.slice(
|
|
165
|
+
cssMin.index,
|
|
166
|
+
1
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
webpackConfig.optimization.minimizer.push(new CssMinimizerPlugin());
|
|
170
|
+
}
|
|
157
171
|
if (isServer) {
|
|
158
172
|
const externalize = (context, request) => {
|
|
159
173
|
const fullPath = request[0] === "." ? path.join(context, request) : request;
|
|
@@ -232,24 +246,46 @@ const withTamagui = (tamaguiOptions) => {
|
|
|
232
246
|
]
|
|
233
247
|
});
|
|
234
248
|
}
|
|
249
|
+
const cssLoader = getGlobalCssLoader(
|
|
250
|
+
{
|
|
251
|
+
assetPrefix: options.config.assetPrefix || config.assetPrefix,
|
|
252
|
+
future: nextConfig.future,
|
|
253
|
+
experimental: nextConfig.experimental || {},
|
|
254
|
+
isEdgeRuntime: true,
|
|
255
|
+
isProduction: !dev,
|
|
256
|
+
targetWeb: true,
|
|
257
|
+
isClient: !isServer,
|
|
258
|
+
isServer,
|
|
259
|
+
isDevelopment: dev
|
|
260
|
+
},
|
|
261
|
+
() => lazyPostCSS(dir, getSupportedBrowsers(dir, dev)),
|
|
262
|
+
[]
|
|
263
|
+
);
|
|
264
|
+
const cssTest = tamaguiOptions.includeCSSTest ?? /\.css$/;
|
|
265
|
+
if (!dev && tamaguiOptions.enableCSSOptimizations) {
|
|
266
|
+
const postCSSLoader = cssLoader[cssLoader.length - 1];
|
|
267
|
+
cssRules.unshift({
|
|
268
|
+
test: cssTest,
|
|
269
|
+
use: [MiniCSSExtractPlugin.loader, "css-loader", postCSSLoader],
|
|
270
|
+
sideEffects: true
|
|
271
|
+
});
|
|
272
|
+
webpackConfig.plugins.push(
|
|
273
|
+
new MiniCSSExtractPlugin({
|
|
274
|
+
filename: "static/css/[contenthash].css",
|
|
275
|
+
ignoreOrder: true
|
|
276
|
+
})
|
|
277
|
+
);
|
|
278
|
+
} else {
|
|
279
|
+
cssRules.unshift({
|
|
280
|
+
test: cssTest,
|
|
281
|
+
sideEffects: true,
|
|
282
|
+
use: cssLoader
|
|
283
|
+
});
|
|
284
|
+
}
|
|
235
285
|
cssRules.unshift({
|
|
236
|
-
test:
|
|
286
|
+
test: cssTest,
|
|
237
287
|
sideEffects: true,
|
|
238
|
-
use:
|
|
239
|
-
{
|
|
240
|
-
assetPrefix: options.config.assetPrefix || config.assetPrefix,
|
|
241
|
-
future: nextConfig.future,
|
|
242
|
-
experimental: nextConfig.experimental || {},
|
|
243
|
-
isEdgeRuntime: true,
|
|
244
|
-
isProduction: !dev,
|
|
245
|
-
targetWeb: true,
|
|
246
|
-
isClient: !isServer,
|
|
247
|
-
isServer,
|
|
248
|
-
isDevelopment: dev
|
|
249
|
-
},
|
|
250
|
-
() => lazyPostCSS(dir, getSupportedBrowsers(dir, dev)),
|
|
251
|
-
[]
|
|
252
|
-
)
|
|
288
|
+
use: cssLoader
|
|
253
289
|
});
|
|
254
290
|
}
|
|
255
291
|
webpackConfig.plugins.push(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/withTamagui.ts"],
|
|
4
|
-
"sourcesContent": ["import { existsSync, fstat } from 'fs'\nimport path, { dirname, join } from 'path'\n\nimport type { TamaguiOptions } from '@tamagui/static'\nimport browserslist from 'browserslist'\nimport buildResolver from 'esm-resolve'\nimport { lazyPostCSS } from 'next/dist/build/webpack/config/blocks/css'\nimport { getGlobalCssLoader } from 'next/dist/build/webpack/config/blocks/css/loaders'\nimport { TamaguiPlugin, shouldExclude as shouldExcludeDefault } from 'tamagui-loader'\nimport webpack from 'webpack'\n\nexport type WithTamaguiProps = TamaguiOptions & {\n useReactNativeWebLite: boolean\n disableFontSupport?: boolean\n aliasReactPackages?: boolean\n includeCSSTest?: RegExp | ((path: string) => boolean)\n shouldExtract?: (path: string, projectRoot: string) => boolean | undefined\n shouldExcludeFromServer?: (props: {\n context: string\n request: string\n fullPath: string\n }) => boolean | string | undefined\n}\n\nexport const withTamagui = (tamaguiOptions: WithTamaguiProps) => {\n return (nextConfig: any = {}) => {\n return {\n ...nextConfig,\n webpack: (webpackConfig: any, options: any) => {\n const { dir, config, dev, isServer } = options\n\n const resolver = buildResolver(join(dir, 'index.js'), {\n constraints: 'node',\n })\n\n // @ts-ignore\n if (typeof globalThis['__DEV__'] === 'undefined') {\n // @ts-ignore\n globalThis['__DEV__'] = dev\n }\n\n const isNext12 = typeof options.config?.swcMinify === 'boolean'\n if (!isNext12) {\n throw new Error(`Next.js 12 only supported`)\n }\n\n const prefix = `${isServer ? ' ssr ' : ' web '} |`\n\n const safeResolves = (resolves: [string, string][], multiple = false) => {\n const res: string[][] = []\n for (const [out, mod] of resolves) {\n if (out.endsWith('$')) {\n res.push([out, mod])\n continue\n }\n try {\n res.push([out, resolveEsm(mod)])\n if (multiple) {\n res.push([out, resolveEsm(mod, true)])\n }\n } catch (err) {\n if (out.includes(`@gorhom/bottom-sheet`)) {\n continue\n }\n if (process.env.DEBUG?.startsWith('tamagui')) {\n // eslint-disable-next-line no-console\n console.log(prefix, `withTamagui skipping resolving ${out}`, err)\n }\n }\n }\n return res\n }\n\n const resolveEsm = (relativePath: string, onlyRequire = false) => {\n if (isServer || onlyRequire) {\n return require.resolve(relativePath)\n }\n const esm = resolver(relativePath)\n return esm ? path.join(dir, esm) : require.resolve(relativePath)\n }\n\n const SEP = path.sep\n\n // automatically compile our given components\n const componentsFullPaths = safeResolves(\n tamaguiOptions.components.map(\n (moduleName) => [moduleName, moduleName] as [string, string]\n ),\n true\n )\n\n const componentsBaseDirs = componentsFullPaths.map(([_, fullPath]) => {\n let rootPath = dirname(fullPath as string)\n while (rootPath.length > 1) {\n const pkg = join(rootPath, 'package.json')\n const hasPkg = existsSync(pkg)\n if (hasPkg) {\n return rootPath\n } else {\n rootPath = join(rootPath, '..')\n }\n }\n throw new Error(`Couldn't find package.json in any path above: ${fullPath}`)\n })\n\n function isInComponentModule(fullPath: string) {\n return componentsBaseDirs.some((componentDir) => fullPath.startsWith(componentDir))\n }\n\n // allows configuration\n const shouldExclude = (path: string, projectRoot: string) => {\n const res = tamaguiOptions.shouldExtract?.(path, projectRoot)\n if (typeof res === 'boolean') {\n return !res\n }\n if (isInComponentModule(path)) {\n return false\n }\n return shouldExcludeDefault(path, projectRoot)\n }\n\n const rnw = tamaguiOptions.useReactNativeWebLite\n ? 'react-native-web-lite'\n : 'react-native-web'\n\n const tamaguiAliases = Object.fromEntries(\n safeResolves([\n ['@tamagui/core/reset.css', '@tamagui/core/reset.css'],\n ['@tamagui/core', '@tamagui/core'],\n ['react-native-svg', '@tamagui/react-native-svg'],\n // fixes https://github.com/kentcdodds/mdx-bundler/issues/143\n ['react/jsx-runtime.js', 'react/jsx-runtime'],\n ['react/jsx-runtime', 'react/jsx-runtime'],\n ['react/jsx-dev-runtime.js', 'react/jsx-dev-runtime'],\n ['react/jsx-dev-runtime', 'react/jsx-dev-runtime'],\n ['react-native-reanimated', 'react-native-reanimated'],\n ['react-native$', rnw],\n ['react-native-web$', rnw],\n ['@testing-library/react-native', '@tamagui/proxy-worm'],\n ['@gorhom/bottom-sheet$', '@gorhom/bottom-sheet'],\n // fix reanimated 3\n ['react-native/Libraries/Renderer/shims/ReactFabric', '@tamagui/proxy-worm'],\n ...(tamaguiOptions.aliasReactPackages\n ? ([\n ['react', 'react'],\n ['react-dom', 'react-dom'],\n ] as any)\n : []),\n ])\n )\n\n const alias = {\n ...(webpackConfig.resolve.alias || {}),\n ...tamaguiAliases,\n }\n\n if (process.env.DEBUG) {\n // eslint-disable-next-line no-console\n console.log('Tamagui alias:', alias)\n }\n\n if (process.env.ANALYZE === 'true') {\n Object.assign(webpackConfig.optimization, {\n concatenateModules: false,\n })\n }\n\n webpackConfig.resolve.alias = alias\n\n webpackConfig.plugins.push(\n new webpack.DefinePlugin({\n 'process.env.IS_STATIC': '\"\"',\n 'process.env.TAMAGUI_TARGET': '\"web\"',\n __DEV__: JSON.stringify(dev),\n })\n )\n\n const excludeExports = tamaguiOptions.excludeReactNativeWebExports\n if (Array.isArray(excludeExports)) {\n try {\n const regexStr = `react-native-web(-lite)?/.*(${excludeExports.join('|')}).*js`\n const regex = new RegExp(regexStr)\n // console.log(prefix, 'exclude', regexStr)\n webpackConfig.plugins.push(\n new webpack.NormalModuleReplacementPlugin(regex, resolveEsm('@tamagui/proxy-worm'))\n )\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\n `Invalid names provided to excludeReactNativeWebExports: ${excludeExports.join(', ')}`\n )\n }\n }\n\n if (process.env.IGNORE_TS_CONFIG_PATHS) {\n if (process.env.DEBUG) {\n // eslint-disable-next-line no-console\n console.log(prefix, 'ignoring tsconfig paths')\n }\n if (webpackConfig.resolve.plugins[0]) {\n delete webpackConfig.resolve.plugins[0].paths['@tamagui/*']\n delete webpackConfig.resolve.plugins[0].paths['tamagui']\n }\n }\n\n /**\n * Server react-native compat\n */\n if (isServer) {\n const externalize = (context: string, request: string) => {\n const fullPath = request[0] === '.' ? path.join(context, request) : request\n\n if (tamaguiOptions.shouldExcludeFromServer) {\n const userRes = tamaguiOptions.shouldExcludeFromServer({\n context,\n request,\n fullPath,\n })\n if (userRes !== undefined) {\n return userRes\n }\n }\n\n if (isInComponentModule(fullPath)) {\n return false\n }\n\n if (fullPath.includes('react-native-web-lite')) {\n // always inline react-native-web-lite due to errors where next.js resolved the path to esm\n return false\n }\n\n // must inline react-native so we can alias to react-native-web\n if (fullPath === 'react-native' || fullPath.startsWith(`react-native${SEP}`)) {\n return false\n }\n\n if (\n // feather icons uses react-native-svg which needs to be aliased\n // fullPath.includes('/lucide-icons/') ||\n fullPath.startsWith('react-native-web') ||\n fullPath.includes(`node_modules${SEP}react-native-web`) ||\n new RegExp(`^(react-dom|react)${SEP}$`).test(fullPath)\n ) {\n return `commonjs ${fullPath}`\n }\n if (\n fullPath.startsWith('moti') ||\n fullPath.startsWith('solito') ||\n fullPath === 'tamagui' ||\n fullPath.startsWith('@tamagui') ||\n fullPath === 'react-native-safe-area-context' ||\n fullPath === 'expo-linear-gradient' ||\n fullPath.startsWith('@react-navigation') ||\n fullPath.startsWith('@gorhom')\n ) {\n return\n }\n if (/^@?react-native-/.test(request)) {\n return false\n }\n return true\n }\n\n // externalize react native things from bundle\n webpackConfig.externals = [\n ...webpackConfig.externals.map((external) => {\n if (typeof external !== 'function') {\n return external\n }\n // only runs on server\n return (ctx, cb) => {\n const isCb = typeof cb === 'function'\n const res = externalize(ctx.context, ctx.request)\n if (isCb) {\n if (typeof res === 'string') {\n return cb(null, res)\n }\n if (res) {\n return external(ctx, cb)\n }\n return cb()\n }\n return !res\n ? Promise.resolve(undefined)\n : typeof res === 'string'\n ? Promise.resolve(res)\n : external(ctx)\n }\n }),\n ]\n }\n\n const cssRules = webpackConfig.module.rules.find(\n (rule) =>\n Array.isArray(rule.oneOf) &&\n rule.oneOf.some(\n ({ test }) =>\n typeof test === 'object' &&\n typeof test.test === 'function' &&\n test.test('filename.css')\n )\n ).oneOf\n\n /**\n * Font Support\n */\n if (cssRules) {\n if (!tamaguiOptions.disableFontSupport) {\n // fonts support\n cssRules.unshift({\n test: /\\.(woff(2)?|eot|ttf|otf)(\\?v=\\d+\\.\\d+\\.\\d+)?$/,\n use: [\n {\n loader: require.resolve('url-loader'),\n options: {\n limit: nextConfig.inlineFontLimit || 1024,\n fallback: require.resolve('file-loader'),\n publicPath: `${nextConfig.assetPrefix || ''}/_next/static/chunks/fonts/`,\n outputPath: `${isServer ? '../' : ''}static/chunks/fonts/`,\n name: '[name].[ext]',\n },\n },\n ],\n })\n }\n\n /**\n * CSS Support\n */\n cssRules.unshift({\n test: tamaguiOptions.includeCSSTest ?? /\\.css$/,\n sideEffects: true,\n use: getGlobalCssLoader(\n // @ts-ignore\n {\n assetPrefix: options.config.assetPrefix || config.assetPrefix,\n future: nextConfig.future,\n experimental: nextConfig.experimental || {},\n isEdgeRuntime: true,\n isProduction: !dev,\n targetWeb: true,\n isClient: !isServer,\n isServer,\n isDevelopment: dev,\n },\n // @ts-ignore\n () => lazyPostCSS(dir, getSupportedBrowsers(dir, dev)),\n []\n ),\n })\n }\n\n webpackConfig.plugins.push(\n new TamaguiPlugin({\n commonjs: isServer,\n exclude: (path: string) => {\n const res = shouldExclude(path, options.dir)\n // console.log(`shouldExclude`, res, path)\n return res\n },\n ...tamaguiOptions,\n })\n )\n\n if (typeof nextConfig.webpack === 'function') {\n return nextConfig.webpack(webpackConfig, options)\n }\n\n return webpackConfig\n },\n }\n }\n}\n\nfunction getSupportedBrowsers(dir, isDevelopment) {\n let browsers\n try {\n browsers = browserslist.loadConfig({\n path: dir,\n env: isDevelopment ? 'development' : 'production',\n })\n } catch {\n //\n }\n return browsers\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,kBAAyB;AAClC,OAAO,QAAQ,SAAS,YAAY;AAGpC,OAAO,kBAAkB;AACzB,OAAO,mBAAmB;AAC1B,SAAS,mBAAmB;AAC5B,SAAS,0BAA0B;AACnC,SAAS,eAAe,iBAAiB,4BAA4B;AACrE,OAAO,aAAa;
|
|
4
|
+
"sourcesContent": ["import { existsSync, fstat } from 'fs'\nimport path, { dirname, join } from 'path'\n\nimport type { TamaguiOptions } from '@tamagui/static'\nimport browserslist from 'browserslist'\nimport CssMinimizerPlugin from 'css-minimizer-webpack-plugin'\nimport buildResolver from 'esm-resolve'\nimport MiniCSSExtractPlugin from 'mini-css-extract-plugin'\nimport { lazyPostCSS } from 'next/dist/build/webpack/config/blocks/css'\nimport { getGlobalCssLoader } from 'next/dist/build/webpack/config/blocks/css/loaders'\nimport { TamaguiPlugin, shouldExclude as shouldExcludeDefault } from 'tamagui-loader'\nimport webpack from 'webpack'\n\nexport type WithTamaguiProps = TamaguiOptions & {\n useReactNativeWebLite: boolean\n disableFontSupport?: boolean\n enableCSSOptimizations?: boolean\n aliasReactPackages?: boolean\n includeCSSTest?: RegExp | ((path: string) => boolean)\n shouldExtract?: (path: string, projectRoot: string) => boolean | undefined\n shouldExcludeFromServer?: (props: {\n context: string\n request: string\n fullPath: string\n }) => boolean | string | undefined\n}\n\nexport const withTamagui = (tamaguiOptions: WithTamaguiProps) => {\n return (nextConfig: any = {}) => {\n return {\n ...nextConfig,\n webpack: (webpackConfig: any, options: any) => {\n const { dir, config, dev, isServer } = options\n\n const resolver = buildResolver(join(dir, 'index.js'), {\n constraints: 'node',\n })\n\n // @ts-ignore\n if (typeof globalThis['__DEV__'] === 'undefined') {\n // @ts-ignore\n globalThis['__DEV__'] = dev\n }\n\n const isNext12 = typeof options.config?.swcMinify === 'boolean'\n if (!isNext12) {\n throw new Error(`Next.js 12 only supported`)\n }\n\n const prefix = `${isServer ? ' ssr ' : ' web '} |`\n\n const safeResolves = (resolves: [string, string][], multiple = false) => {\n const res: string[][] = []\n for (const [out, mod] of resolves) {\n if (out.endsWith('$')) {\n res.push([out, mod])\n continue\n }\n try {\n res.push([out, resolveEsm(mod)])\n if (multiple) {\n res.push([out, resolveEsm(mod, true)])\n }\n } catch (err) {\n if (out.includes(`@gorhom/bottom-sheet`)) {\n continue\n }\n if (process.env.DEBUG?.startsWith('tamagui')) {\n // eslint-disable-next-line no-console\n console.log(prefix, `withTamagui skipping resolving ${out}`, err)\n }\n }\n }\n return res\n }\n\n const resolveEsm = (relativePath: string, onlyRequire = false) => {\n if (isServer || onlyRequire) {\n return require.resolve(relativePath)\n }\n const esm = resolver(relativePath)\n return esm ? path.join(dir, esm) : require.resolve(relativePath)\n }\n\n const SEP = path.sep\n\n // automatically compile our given components\n const componentsFullPaths = safeResolves(\n tamaguiOptions.components.map(\n (moduleName) => [moduleName, moduleName] as [string, string]\n ),\n true\n )\n\n const componentsBaseDirs = componentsFullPaths.map(([_, fullPath]) => {\n let rootPath = dirname(fullPath as string)\n while (rootPath.length > 1) {\n const pkg = join(rootPath, 'package.json')\n const hasPkg = existsSync(pkg)\n if (hasPkg) {\n return rootPath\n } else {\n rootPath = join(rootPath, '..')\n }\n }\n throw new Error(`Couldn't find package.json in any path above: ${fullPath}`)\n })\n\n function isInComponentModule(fullPath: string) {\n return componentsBaseDirs.some((componentDir) => fullPath.startsWith(componentDir))\n }\n\n // allows configuration\n const shouldExclude = (path: string, projectRoot: string) => {\n const res = tamaguiOptions.shouldExtract?.(path, projectRoot)\n if (typeof res === 'boolean') {\n return !res\n }\n if (isInComponentModule(path)) {\n return false\n }\n return shouldExcludeDefault(path, projectRoot)\n }\n\n const rnw = tamaguiOptions.useReactNativeWebLite\n ? 'react-native-web-lite'\n : 'react-native-web'\n\n const tamaguiAliases = Object.fromEntries(\n safeResolves([\n ['@tamagui/core/reset.css', '@tamagui/core/reset.css'],\n ['@tamagui/core', '@tamagui/core'],\n ['react-native-svg', '@tamagui/react-native-svg'],\n // fixes https://github.com/kentcdodds/mdx-bundler/issues/143\n ['react/jsx-runtime.js', 'react/jsx-runtime'],\n ['react/jsx-runtime', 'react/jsx-runtime'],\n ['react/jsx-dev-runtime.js', 'react/jsx-dev-runtime'],\n ['react/jsx-dev-runtime', 'react/jsx-dev-runtime'],\n ['react-native-reanimated', 'react-native-reanimated'],\n ['react-native$', rnw],\n ['react-native-web$', rnw],\n ['@testing-library/react-native', '@tamagui/proxy-worm'],\n ['@gorhom/bottom-sheet$', '@gorhom/bottom-sheet'],\n // fix reanimated 3\n ['react-native/Libraries/Renderer/shims/ReactFabric', '@tamagui/proxy-worm'],\n ...(tamaguiOptions.aliasReactPackages\n ? ([\n ['react', 'react'],\n ['react-dom', 'react-dom'],\n ] as any)\n : []),\n ])\n )\n\n const alias = {\n ...(webpackConfig.resolve.alias || {}),\n ...tamaguiAliases,\n }\n\n if (process.env.DEBUG) {\n // eslint-disable-next-line no-console\n console.log('Tamagui alias:', alias)\n }\n\n if (process.env.ANALYZE === 'true') {\n Object.assign(webpackConfig.optimization, {\n concatenateModules: false,\n })\n }\n\n webpackConfig.resolve.alias = alias\n\n webpackConfig.plugins.push(\n new webpack.DefinePlugin({\n 'process.env.IS_STATIC': '\"\"',\n 'process.env.TAMAGUI_TARGET': '\"web\"',\n __DEV__: JSON.stringify(dev),\n })\n )\n\n const excludeExports = tamaguiOptions.excludeReactNativeWebExports\n if (Array.isArray(excludeExports)) {\n try {\n const regexStr = `react-native-web(-lite)?/.*(${excludeExports.join('|')}).*js`\n const regex = new RegExp(regexStr)\n // console.log(prefix, 'exclude', regexStr)\n webpackConfig.plugins.push(\n new webpack.NormalModuleReplacementPlugin(regex, resolveEsm('@tamagui/proxy-worm'))\n )\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\n `Invalid names provided to excludeReactNativeWebExports: ${excludeExports.join(', ')}`\n )\n }\n }\n\n if (process.env.IGNORE_TS_CONFIG_PATHS) {\n if (process.env.DEBUG) {\n // eslint-disable-next-line no-console\n console.log(prefix, 'ignoring tsconfig paths')\n }\n if (webpackConfig.resolve.plugins[0]) {\n delete webpackConfig.resolve.plugins[0].paths['@tamagui/*']\n delete webpackConfig.resolve.plugins[0].paths['tamagui']\n }\n }\n\n if (!dev && tamaguiOptions.enableCSSOptimizations) {\n const cssMin = webpackConfig.optimization.minimizer.find((x) =>\n x.toString().includes('css-minimizer-plugin')\n )\n if (cssMin) {\n webpackConfig.optimization.minimizer = webpackConfig.optimization.minimizer.slice(\n cssMin.index,\n 1\n )\n }\n webpackConfig.optimization.minimizer.push(new CssMinimizerPlugin())\n }\n\n /**\n * Server react-native compat\n */\n if (isServer) {\n const externalize = (context: string, request: string) => {\n const fullPath = request[0] === '.' ? path.join(context, request) : request\n\n if (tamaguiOptions.shouldExcludeFromServer) {\n const userRes = tamaguiOptions.shouldExcludeFromServer({\n context,\n request,\n fullPath,\n })\n if (userRes !== undefined) {\n return userRes\n }\n }\n\n if (isInComponentModule(fullPath)) {\n return false\n }\n\n if (fullPath.includes('react-native-web-lite')) {\n // always inline react-native-web-lite due to errors where next.js resolved the path to esm\n return false\n }\n\n // must inline react-native so we can alias to react-native-web\n if (fullPath === 'react-native' || fullPath.startsWith(`react-native${SEP}`)) {\n return false\n }\n\n if (\n // feather icons uses react-native-svg which needs to be aliased\n // fullPath.includes('/lucide-icons/') ||\n fullPath.startsWith('react-native-web') ||\n fullPath.includes(`node_modules${SEP}react-native-web`) ||\n new RegExp(`^(react-dom|react)${SEP}$`).test(fullPath)\n ) {\n return `commonjs ${fullPath}`\n }\n if (\n fullPath.startsWith('moti') ||\n fullPath.startsWith('solito') ||\n fullPath === 'tamagui' ||\n fullPath.startsWith('@tamagui') ||\n fullPath === 'react-native-safe-area-context' ||\n fullPath === 'expo-linear-gradient' ||\n fullPath.startsWith('@react-navigation') ||\n fullPath.startsWith('@gorhom')\n ) {\n return\n }\n if (/^@?react-native-/.test(request)) {\n return false\n }\n return true\n }\n\n // externalize react native things from bundle\n webpackConfig.externals = [\n ...webpackConfig.externals.map((external) => {\n if (typeof external !== 'function') {\n return external\n }\n // only runs on server\n return (ctx, cb) => {\n const isCb = typeof cb === 'function'\n const res = externalize(ctx.context, ctx.request)\n if (isCb) {\n if (typeof res === 'string') {\n return cb(null, res)\n }\n if (res) {\n return external(ctx, cb)\n }\n return cb()\n }\n return !res\n ? Promise.resolve(undefined)\n : typeof res === 'string'\n ? Promise.resolve(res)\n : external(ctx)\n }\n }),\n ]\n }\n\n const cssRules = webpackConfig.module.rules.find(\n (rule) =>\n Array.isArray(rule.oneOf) &&\n rule.oneOf.some(\n ({ test }) =>\n typeof test === 'object' &&\n typeof test.test === 'function' &&\n test.test('filename.css')\n )\n ).oneOf\n\n /**\n * Font Support\n */\n if (cssRules) {\n if (!tamaguiOptions.disableFontSupport) {\n // fonts support\n cssRules.unshift({\n test: /\\.(woff(2)?|eot|ttf|otf)(\\?v=\\d+\\.\\d+\\.\\d+)?$/,\n use: [\n {\n loader: require.resolve('url-loader'),\n options: {\n limit: nextConfig.inlineFontLimit || 1024,\n fallback: require.resolve('file-loader'),\n publicPath: `${nextConfig.assetPrefix || ''}/_next/static/chunks/fonts/`,\n outputPath: `${isServer ? '../' : ''}static/chunks/fonts/`,\n name: '[name].[ext]',\n },\n },\n ],\n })\n }\n\n /**\n * CSS Support\n */\n const cssLoader = getGlobalCssLoader(\n // @ts-ignore\n {\n assetPrefix: options.config.assetPrefix || config.assetPrefix,\n future: nextConfig.future,\n experimental: nextConfig.experimental || {},\n isEdgeRuntime: true,\n isProduction: !dev,\n targetWeb: true,\n isClient: !isServer,\n isServer,\n isDevelopment: dev,\n },\n // @ts-ignore\n () => lazyPostCSS(dir, getSupportedBrowsers(dir, dev)),\n []\n )\n\n const cssTest = tamaguiOptions.includeCSSTest ?? /\\.css$/\n\n if (!dev && tamaguiOptions.enableCSSOptimizations) {\n const postCSSLoader = cssLoader[cssLoader.length - 1]\n // replace nextjs picky style rules with simple minicssextract\n cssRules.unshift({\n test: cssTest,\n use: [MiniCSSExtractPlugin.loader, 'css-loader', postCSSLoader],\n sideEffects: true,\n })\n webpackConfig.plugins.push(\n new MiniCSSExtractPlugin({\n filename: 'static/css/[contenthash].css',\n ignoreOrder: true,\n })\n )\n } else {\n cssRules.unshift({\n test: cssTest,\n sideEffects: true,\n use: cssLoader,\n })\n }\n cssRules.unshift({\n test: cssTest,\n sideEffects: true,\n use: cssLoader,\n })\n }\n\n webpackConfig.plugins.push(\n new TamaguiPlugin({\n commonjs: isServer,\n exclude: (path: string) => {\n const res = shouldExclude(path, options.dir)\n // console.log(`shouldExclude`, res, path)\n return res\n },\n ...tamaguiOptions,\n })\n )\n\n if (typeof nextConfig.webpack === 'function') {\n return nextConfig.webpack(webpackConfig, options)\n }\n\n return webpackConfig\n },\n }\n }\n}\n\nfunction getSupportedBrowsers(dir, isDevelopment) {\n let browsers\n try {\n browsers = browserslist.loadConfig({\n path: dir,\n env: isDevelopment ? 'development' : 'production',\n })\n } catch {\n //\n }\n return browsers\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["_a", "path"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { existsSync } from "fs";
|
|
2
|
+
import path, { dirname, join } from "path";
|
|
3
|
+
import browserslist from "browserslist";
|
|
4
|
+
import CssMinimizerPlugin from "css-minimizer-webpack-plugin";
|
|
5
|
+
import buildResolver from "esm-resolve";
|
|
6
|
+
import MiniCSSExtractPlugin from "mini-css-extract-plugin";
|
|
7
|
+
import { lazyPostCSS } from "next/dist/build/webpack/config/blocks/css";
|
|
8
|
+
import { getGlobalCssLoader } from "next/dist/build/webpack/config/blocks/css/loaders";
|
|
9
|
+
import { TamaguiPlugin, shouldExclude as shouldExcludeDefault } from "tamagui-loader";
|
|
10
|
+
import webpack from "webpack";
|
|
11
|
+
const withTamagui = (tamaguiOptions) => {
|
|
12
|
+
return (nextConfig = {}) => {
|
|
13
|
+
return {
|
|
14
|
+
...nextConfig,
|
|
15
|
+
webpack: (webpackConfig, options) => {
|
|
16
|
+
const { dir, config, dev, isServer } = options;
|
|
17
|
+
const resolver = buildResolver(join(dir, "index.js"), {
|
|
18
|
+
constraints: "node"
|
|
19
|
+
});
|
|
20
|
+
if (typeof globalThis["__DEV__"] === "undefined") {
|
|
21
|
+
globalThis["__DEV__"] = dev;
|
|
22
|
+
}
|
|
23
|
+
const isNext12 = typeof options.config?.swcMinify === "boolean";
|
|
24
|
+
if (!isNext12) {
|
|
25
|
+
throw new Error(`Next.js 12 only supported`);
|
|
26
|
+
}
|
|
27
|
+
const prefix = `${isServer ? " ssr " : " web "} |`;
|
|
28
|
+
const safeResolves = (resolves, multiple = false) => {
|
|
29
|
+
const res = [];
|
|
30
|
+
for (const [out, mod] of resolves) {
|
|
31
|
+
if (out.endsWith("$")) {
|
|
32
|
+
res.push([out, mod]);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
res.push([out, resolveEsm(mod)]);
|
|
37
|
+
if (multiple) {
|
|
38
|
+
res.push([out, resolveEsm(mod, true)]);
|
|
39
|
+
}
|
|
40
|
+
} catch (err) {
|
|
41
|
+
if (out.includes(`@gorhom/bottom-sheet`)) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (process.env.DEBUG?.startsWith("tamagui")) {
|
|
45
|
+
console.log(prefix, `withTamagui skipping resolving ${out}`, err);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return res;
|
|
50
|
+
};
|
|
51
|
+
const resolveEsm = (relativePath, onlyRequire = false) => {
|
|
52
|
+
if (isServer || onlyRequire) {
|
|
53
|
+
return require.resolve(relativePath);
|
|
54
|
+
}
|
|
55
|
+
const esm = resolver(relativePath);
|
|
56
|
+
return esm ? path.join(dir, esm) : require.resolve(relativePath);
|
|
57
|
+
};
|
|
58
|
+
const SEP = path.sep;
|
|
59
|
+
const componentsFullPaths = safeResolves(
|
|
60
|
+
tamaguiOptions.components.map(
|
|
61
|
+
(moduleName) => [moduleName, moduleName]
|
|
62
|
+
),
|
|
63
|
+
true
|
|
64
|
+
);
|
|
65
|
+
const componentsBaseDirs = componentsFullPaths.map(([_, fullPath]) => {
|
|
66
|
+
let rootPath = dirname(fullPath);
|
|
67
|
+
while (rootPath.length > 1) {
|
|
68
|
+
const pkg = join(rootPath, "package.json");
|
|
69
|
+
const hasPkg = existsSync(pkg);
|
|
70
|
+
if (hasPkg) {
|
|
71
|
+
return rootPath;
|
|
72
|
+
} else {
|
|
73
|
+
rootPath = join(rootPath, "..");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
throw new Error(`Couldn't find package.json in any path above: ${fullPath}`);
|
|
77
|
+
});
|
|
78
|
+
function isInComponentModule(fullPath) {
|
|
79
|
+
return componentsBaseDirs.some((componentDir) => fullPath.startsWith(componentDir));
|
|
80
|
+
}
|
|
81
|
+
const shouldExclude = (path2, projectRoot) => {
|
|
82
|
+
const res = tamaguiOptions.shouldExtract?.(path2, projectRoot);
|
|
83
|
+
if (typeof res === "boolean") {
|
|
84
|
+
return !res;
|
|
85
|
+
}
|
|
86
|
+
if (isInComponentModule(path2)) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
return shouldExcludeDefault(path2, projectRoot);
|
|
90
|
+
};
|
|
91
|
+
const rnw = tamaguiOptions.useReactNativeWebLite ? "react-native-web-lite" : "react-native-web";
|
|
92
|
+
const tamaguiAliases = Object.fromEntries(
|
|
93
|
+
safeResolves([
|
|
94
|
+
["@tamagui/core/reset.css", "@tamagui/core/reset.css"],
|
|
95
|
+
["@tamagui/core", "@tamagui/core"],
|
|
96
|
+
["react-native-svg", "@tamagui/react-native-svg"],
|
|
97
|
+
["react/jsx-runtime.js", "react/jsx-runtime"],
|
|
98
|
+
["react/jsx-runtime", "react/jsx-runtime"],
|
|
99
|
+
["react/jsx-dev-runtime.js", "react/jsx-dev-runtime"],
|
|
100
|
+
["react/jsx-dev-runtime", "react/jsx-dev-runtime"],
|
|
101
|
+
["react-native-reanimated", "react-native-reanimated"],
|
|
102
|
+
["react-native$", rnw],
|
|
103
|
+
["react-native-web$", rnw],
|
|
104
|
+
["@testing-library/react-native", "@tamagui/proxy-worm"],
|
|
105
|
+
["@gorhom/bottom-sheet$", "@gorhom/bottom-sheet"],
|
|
106
|
+
["react-native/Libraries/Renderer/shims/ReactFabric", "@tamagui/proxy-worm"],
|
|
107
|
+
...tamaguiOptions.aliasReactPackages ? [
|
|
108
|
+
["react", "react"],
|
|
109
|
+
["react-dom", "react-dom"]
|
|
110
|
+
] : []
|
|
111
|
+
])
|
|
112
|
+
);
|
|
113
|
+
const alias = {
|
|
114
|
+
...webpackConfig.resolve.alias || {},
|
|
115
|
+
...tamaguiAliases
|
|
116
|
+
};
|
|
117
|
+
if (process.env.DEBUG) {
|
|
118
|
+
console.log("Tamagui alias:", alias);
|
|
119
|
+
}
|
|
120
|
+
if (process.env.ANALYZE === "true") {
|
|
121
|
+
Object.assign(webpackConfig.optimization, {
|
|
122
|
+
concatenateModules: false
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
webpackConfig.resolve.alias = alias;
|
|
126
|
+
webpackConfig.plugins.push(
|
|
127
|
+
new webpack.DefinePlugin({
|
|
128
|
+
"process.env.IS_STATIC": '""',
|
|
129
|
+
"process.env.TAMAGUI_TARGET": '"web"',
|
|
130
|
+
__DEV__: JSON.stringify(dev)
|
|
131
|
+
})
|
|
132
|
+
);
|
|
133
|
+
const excludeExports = tamaguiOptions.excludeReactNativeWebExports;
|
|
134
|
+
if (Array.isArray(excludeExports)) {
|
|
135
|
+
try {
|
|
136
|
+
const regexStr = `react-native-web(-lite)?/.*(${excludeExports.join("|")}).*js`;
|
|
137
|
+
const regex = new RegExp(regexStr);
|
|
138
|
+
webpackConfig.plugins.push(
|
|
139
|
+
new webpack.NormalModuleReplacementPlugin(regex, resolveEsm("@tamagui/proxy-worm"))
|
|
140
|
+
);
|
|
141
|
+
} catch (err) {
|
|
142
|
+
console.warn(
|
|
143
|
+
`Invalid names provided to excludeReactNativeWebExports: ${excludeExports.join(", ")}`
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (process.env.IGNORE_TS_CONFIG_PATHS) {
|
|
148
|
+
if (process.env.DEBUG) {
|
|
149
|
+
console.log(prefix, "ignoring tsconfig paths");
|
|
150
|
+
}
|
|
151
|
+
if (webpackConfig.resolve.plugins[0]) {
|
|
152
|
+
delete webpackConfig.resolve.plugins[0].paths["@tamagui/*"];
|
|
153
|
+
delete webpackConfig.resolve.plugins[0].paths["tamagui"];
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (!dev && tamaguiOptions.enableCSSOptimizations) {
|
|
157
|
+
const cssMin = webpackConfig.optimization.minimizer.find(
|
|
158
|
+
(x) => x.toString().includes("css-minimizer-plugin")
|
|
159
|
+
);
|
|
160
|
+
if (cssMin) {
|
|
161
|
+
webpackConfig.optimization.minimizer = webpackConfig.optimization.minimizer.slice(
|
|
162
|
+
cssMin.index,
|
|
163
|
+
1
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
webpackConfig.optimization.minimizer.push(new CssMinimizerPlugin());
|
|
167
|
+
}
|
|
168
|
+
if (isServer) {
|
|
169
|
+
const externalize = (context, request) => {
|
|
170
|
+
const fullPath = request[0] === "." ? path.join(context, request) : request;
|
|
171
|
+
if (tamaguiOptions.shouldExcludeFromServer) {
|
|
172
|
+
const userRes = tamaguiOptions.shouldExcludeFromServer({
|
|
173
|
+
context,
|
|
174
|
+
request,
|
|
175
|
+
fullPath
|
|
176
|
+
});
|
|
177
|
+
if (userRes !== void 0) {
|
|
178
|
+
return userRes;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (isInComponentModule(fullPath)) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
if (fullPath.includes("react-native-web-lite")) {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
if (fullPath === "react-native" || fullPath.startsWith(`react-native${SEP}`)) {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
if (fullPath.startsWith("react-native-web") || fullPath.includes(`node_modules${SEP}react-native-web`) || new RegExp(`^(react-dom|react)${SEP}$`).test(fullPath)) {
|
|
191
|
+
return `commonjs ${fullPath}`;
|
|
192
|
+
}
|
|
193
|
+
if (fullPath.startsWith("moti") || fullPath.startsWith("solito") || fullPath === "tamagui" || fullPath.startsWith("@tamagui") || fullPath === "react-native-safe-area-context" || fullPath === "expo-linear-gradient" || fullPath.startsWith("@react-navigation") || fullPath.startsWith("@gorhom")) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (/^@?react-native-/.test(request)) {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
return true;
|
|
200
|
+
};
|
|
201
|
+
webpackConfig.externals = [
|
|
202
|
+
...webpackConfig.externals.map((external) => {
|
|
203
|
+
if (typeof external !== "function") {
|
|
204
|
+
return external;
|
|
205
|
+
}
|
|
206
|
+
return (ctx, cb) => {
|
|
207
|
+
const isCb = typeof cb === "function";
|
|
208
|
+
const res = externalize(ctx.context, ctx.request);
|
|
209
|
+
if (isCb) {
|
|
210
|
+
if (typeof res === "string") {
|
|
211
|
+
return cb(null, res);
|
|
212
|
+
}
|
|
213
|
+
if (res) {
|
|
214
|
+
return external(ctx, cb);
|
|
215
|
+
}
|
|
216
|
+
return cb();
|
|
217
|
+
}
|
|
218
|
+
return !res ? Promise.resolve(void 0) : typeof res === "string" ? Promise.resolve(res) : external(ctx);
|
|
219
|
+
};
|
|
220
|
+
})
|
|
221
|
+
];
|
|
222
|
+
}
|
|
223
|
+
const cssRules = webpackConfig.module.rules.find(
|
|
224
|
+
(rule) => Array.isArray(rule.oneOf) && rule.oneOf.some(
|
|
225
|
+
({ test }) => typeof test === "object" && typeof test.test === "function" && test.test("filename.css")
|
|
226
|
+
)
|
|
227
|
+
).oneOf;
|
|
228
|
+
if (cssRules) {
|
|
229
|
+
if (!tamaguiOptions.disableFontSupport) {
|
|
230
|
+
cssRules.unshift({
|
|
231
|
+
test: /\.(woff(2)?|eot|ttf|otf)(\?v=\d+\.\d+\.\d+)?$/,
|
|
232
|
+
use: [
|
|
233
|
+
{
|
|
234
|
+
loader: require.resolve("url-loader"),
|
|
235
|
+
options: {
|
|
236
|
+
limit: nextConfig.inlineFontLimit || 1024,
|
|
237
|
+
fallback: require.resolve("file-loader"),
|
|
238
|
+
publicPath: `${nextConfig.assetPrefix || ""}/_next/static/chunks/fonts/`,
|
|
239
|
+
outputPath: `${isServer ? "../" : ""}static/chunks/fonts/`,
|
|
240
|
+
name: "[name].[ext]"
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
]
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
const cssLoader = getGlobalCssLoader(
|
|
247
|
+
{
|
|
248
|
+
assetPrefix: options.config.assetPrefix || config.assetPrefix,
|
|
249
|
+
future: nextConfig.future,
|
|
250
|
+
experimental: nextConfig.experimental || {},
|
|
251
|
+
isEdgeRuntime: true,
|
|
252
|
+
isProduction: !dev,
|
|
253
|
+
targetWeb: true,
|
|
254
|
+
isClient: !isServer,
|
|
255
|
+
isServer,
|
|
256
|
+
isDevelopment: dev
|
|
257
|
+
},
|
|
258
|
+
() => lazyPostCSS(dir, getSupportedBrowsers(dir, dev)),
|
|
259
|
+
[]
|
|
260
|
+
);
|
|
261
|
+
const cssTest = tamaguiOptions.includeCSSTest ?? /\.css$/;
|
|
262
|
+
if (!dev && tamaguiOptions.enableCSSOptimizations) {
|
|
263
|
+
const postCSSLoader = cssLoader[cssLoader.length - 1];
|
|
264
|
+
cssRules.unshift({
|
|
265
|
+
test: cssTest,
|
|
266
|
+
use: [MiniCSSExtractPlugin.loader, "css-loader", postCSSLoader],
|
|
267
|
+
sideEffects: true
|
|
268
|
+
});
|
|
269
|
+
webpackConfig.plugins.push(
|
|
270
|
+
new MiniCSSExtractPlugin({
|
|
271
|
+
filename: "static/css/[contenthash].css",
|
|
272
|
+
ignoreOrder: true
|
|
273
|
+
})
|
|
274
|
+
);
|
|
275
|
+
} else {
|
|
276
|
+
cssRules.unshift({
|
|
277
|
+
test: cssTest,
|
|
278
|
+
sideEffects: true,
|
|
279
|
+
use: cssLoader
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
cssRules.unshift({
|
|
283
|
+
test: cssTest,
|
|
284
|
+
sideEffects: true,
|
|
285
|
+
use: cssLoader
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
webpackConfig.plugins.push(
|
|
289
|
+
new TamaguiPlugin({
|
|
290
|
+
commonjs: isServer,
|
|
291
|
+
exclude: (path2) => {
|
|
292
|
+
const res = shouldExclude(path2, options.dir);
|
|
293
|
+
return res;
|
|
294
|
+
},
|
|
295
|
+
...tamaguiOptions
|
|
296
|
+
})
|
|
297
|
+
);
|
|
298
|
+
if (typeof nextConfig.webpack === "function") {
|
|
299
|
+
return nextConfig.webpack(webpackConfig, options);
|
|
300
|
+
}
|
|
301
|
+
return webpackConfig;
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
};
|
|
305
|
+
};
|
|
306
|
+
function getSupportedBrowsers(dir, isDevelopment) {
|
|
307
|
+
let browsers;
|
|
308
|
+
try {
|
|
309
|
+
browsers = browserslist.loadConfig({
|
|
310
|
+
path: dir,
|
|
311
|
+
env: isDevelopment ? "development" : "production"
|
|
312
|
+
});
|
|
313
|
+
} catch {
|
|
314
|
+
}
|
|
315
|
+
return browsers;
|
|
316
|
+
}
|
|
317
|
+
export {
|
|
318
|
+
withTamagui
|
|
319
|
+
};
|
|
320
|
+
//# sourceMappingURL=withTamagui.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/withTamagui.ts"],
|
|
4
|
+
"sourcesContent": ["import { existsSync, fstat } from 'fs'\nimport path, { dirname, join } from 'path'\n\nimport type { TamaguiOptions } from '@tamagui/static'\nimport browserslist from 'browserslist'\nimport CssMinimizerPlugin from 'css-minimizer-webpack-plugin'\nimport buildResolver from 'esm-resolve'\nimport MiniCSSExtractPlugin from 'mini-css-extract-plugin'\nimport { lazyPostCSS } from 'next/dist/build/webpack/config/blocks/css'\nimport { getGlobalCssLoader } from 'next/dist/build/webpack/config/blocks/css/loaders'\nimport { TamaguiPlugin, shouldExclude as shouldExcludeDefault } from 'tamagui-loader'\nimport webpack from 'webpack'\n\nexport type WithTamaguiProps = TamaguiOptions & {\n useReactNativeWebLite: boolean\n disableFontSupport?: boolean\n enableCSSOptimizations?: boolean\n aliasReactPackages?: boolean\n includeCSSTest?: RegExp | ((path: string) => boolean)\n shouldExtract?: (path: string, projectRoot: string) => boolean | undefined\n shouldExcludeFromServer?: (props: {\n context: string\n request: string\n fullPath: string\n }) => boolean | string | undefined\n}\n\nexport const withTamagui = (tamaguiOptions: WithTamaguiProps) => {\n return (nextConfig: any = {}) => {\n return {\n ...nextConfig,\n webpack: (webpackConfig: any, options: any) => {\n const { dir, config, dev, isServer } = options\n\n const resolver = buildResolver(join(dir, 'index.js'), {\n constraints: 'node',\n })\n\n // @ts-ignore\n if (typeof globalThis['__DEV__'] === 'undefined') {\n // @ts-ignore\n globalThis['__DEV__'] = dev\n }\n\n const isNext12 = typeof options.config?.swcMinify === 'boolean'\n if (!isNext12) {\n throw new Error(`Next.js 12 only supported`)\n }\n\n const prefix = `${isServer ? ' ssr ' : ' web '} |`\n\n const safeResolves = (resolves: [string, string][], multiple = false) => {\n const res: string[][] = []\n for (const [out, mod] of resolves) {\n if (out.endsWith('$')) {\n res.push([out, mod])\n continue\n }\n try {\n res.push([out, resolveEsm(mod)])\n if (multiple) {\n res.push([out, resolveEsm(mod, true)])\n }\n } catch (err) {\n if (out.includes(`@gorhom/bottom-sheet`)) {\n continue\n }\n if (process.env.DEBUG?.startsWith('tamagui')) {\n // eslint-disable-next-line no-console\n console.log(prefix, `withTamagui skipping resolving ${out}`, err)\n }\n }\n }\n return res\n }\n\n const resolveEsm = (relativePath: string, onlyRequire = false) => {\n if (isServer || onlyRequire) {\n return require.resolve(relativePath)\n }\n const esm = resolver(relativePath)\n return esm ? path.join(dir, esm) : require.resolve(relativePath)\n }\n\n const SEP = path.sep\n\n // automatically compile our given components\n const componentsFullPaths = safeResolves(\n tamaguiOptions.components.map(\n (moduleName) => [moduleName, moduleName] as [string, string]\n ),\n true\n )\n\n const componentsBaseDirs = componentsFullPaths.map(([_, fullPath]) => {\n let rootPath = dirname(fullPath as string)\n while (rootPath.length > 1) {\n const pkg = join(rootPath, 'package.json')\n const hasPkg = existsSync(pkg)\n if (hasPkg) {\n return rootPath\n } else {\n rootPath = join(rootPath, '..')\n }\n }\n throw new Error(`Couldn't find package.json in any path above: ${fullPath}`)\n })\n\n function isInComponentModule(fullPath: string) {\n return componentsBaseDirs.some((componentDir) => fullPath.startsWith(componentDir))\n }\n\n // allows configuration\n const shouldExclude = (path: string, projectRoot: string) => {\n const res = tamaguiOptions.shouldExtract?.(path, projectRoot)\n if (typeof res === 'boolean') {\n return !res\n }\n if (isInComponentModule(path)) {\n return false\n }\n return shouldExcludeDefault(path, projectRoot)\n }\n\n const rnw = tamaguiOptions.useReactNativeWebLite\n ? 'react-native-web-lite'\n : 'react-native-web'\n\n const tamaguiAliases = Object.fromEntries(\n safeResolves([\n ['@tamagui/core/reset.css', '@tamagui/core/reset.css'],\n ['@tamagui/core', '@tamagui/core'],\n ['react-native-svg', '@tamagui/react-native-svg'],\n // fixes https://github.com/kentcdodds/mdx-bundler/issues/143\n ['react/jsx-runtime.js', 'react/jsx-runtime'],\n ['react/jsx-runtime', 'react/jsx-runtime'],\n ['react/jsx-dev-runtime.js', 'react/jsx-dev-runtime'],\n ['react/jsx-dev-runtime', 'react/jsx-dev-runtime'],\n ['react-native-reanimated', 'react-native-reanimated'],\n ['react-native$', rnw],\n ['react-native-web$', rnw],\n ['@testing-library/react-native', '@tamagui/proxy-worm'],\n ['@gorhom/bottom-sheet$', '@gorhom/bottom-sheet'],\n // fix reanimated 3\n ['react-native/Libraries/Renderer/shims/ReactFabric', '@tamagui/proxy-worm'],\n ...(tamaguiOptions.aliasReactPackages\n ? ([\n ['react', 'react'],\n ['react-dom', 'react-dom'],\n ] as any)\n : []),\n ])\n )\n\n const alias = {\n ...(webpackConfig.resolve.alias || {}),\n ...tamaguiAliases,\n }\n\n if (process.env.DEBUG) {\n // eslint-disable-next-line no-console\n console.log('Tamagui alias:', alias)\n }\n\n if (process.env.ANALYZE === 'true') {\n Object.assign(webpackConfig.optimization, {\n concatenateModules: false,\n })\n }\n\n webpackConfig.resolve.alias = alias\n\n webpackConfig.plugins.push(\n new webpack.DefinePlugin({\n 'process.env.IS_STATIC': '\"\"',\n 'process.env.TAMAGUI_TARGET': '\"web\"',\n __DEV__: JSON.stringify(dev),\n })\n )\n\n const excludeExports = tamaguiOptions.excludeReactNativeWebExports\n if (Array.isArray(excludeExports)) {\n try {\n const regexStr = `react-native-web(-lite)?/.*(${excludeExports.join('|')}).*js`\n const regex = new RegExp(regexStr)\n // console.log(prefix, 'exclude', regexStr)\n webpackConfig.plugins.push(\n new webpack.NormalModuleReplacementPlugin(regex, resolveEsm('@tamagui/proxy-worm'))\n )\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\n `Invalid names provided to excludeReactNativeWebExports: ${excludeExports.join(', ')}`\n )\n }\n }\n\n if (process.env.IGNORE_TS_CONFIG_PATHS) {\n if (process.env.DEBUG) {\n // eslint-disable-next-line no-console\n console.log(prefix, 'ignoring tsconfig paths')\n }\n if (webpackConfig.resolve.plugins[0]) {\n delete webpackConfig.resolve.plugins[0].paths['@tamagui/*']\n delete webpackConfig.resolve.plugins[0].paths['tamagui']\n }\n }\n\n if (!dev && tamaguiOptions.enableCSSOptimizations) {\n const cssMin = webpackConfig.optimization.minimizer.find((x) =>\n x.toString().includes('css-minimizer-plugin')\n )\n if (cssMin) {\n webpackConfig.optimization.minimizer = webpackConfig.optimization.minimizer.slice(\n cssMin.index,\n 1\n )\n }\n webpackConfig.optimization.minimizer.push(new CssMinimizerPlugin())\n }\n\n /**\n * Server react-native compat\n */\n if (isServer) {\n const externalize = (context: string, request: string) => {\n const fullPath = request[0] === '.' ? path.join(context, request) : request\n\n if (tamaguiOptions.shouldExcludeFromServer) {\n const userRes = tamaguiOptions.shouldExcludeFromServer({\n context,\n request,\n fullPath,\n })\n if (userRes !== undefined) {\n return userRes\n }\n }\n\n if (isInComponentModule(fullPath)) {\n return false\n }\n\n if (fullPath.includes('react-native-web-lite')) {\n // always inline react-native-web-lite due to errors where next.js resolved the path to esm\n return false\n }\n\n // must inline react-native so we can alias to react-native-web\n if (fullPath === 'react-native' || fullPath.startsWith(`react-native${SEP}`)) {\n return false\n }\n\n if (\n // feather icons uses react-native-svg which needs to be aliased\n // fullPath.includes('/lucide-icons/') ||\n fullPath.startsWith('react-native-web') ||\n fullPath.includes(`node_modules${SEP}react-native-web`) ||\n new RegExp(`^(react-dom|react)${SEP}$`).test(fullPath)\n ) {\n return `commonjs ${fullPath}`\n }\n if (\n fullPath.startsWith('moti') ||\n fullPath.startsWith('solito') ||\n fullPath === 'tamagui' ||\n fullPath.startsWith('@tamagui') ||\n fullPath === 'react-native-safe-area-context' ||\n fullPath === 'expo-linear-gradient' ||\n fullPath.startsWith('@react-navigation') ||\n fullPath.startsWith('@gorhom')\n ) {\n return\n }\n if (/^@?react-native-/.test(request)) {\n return false\n }\n return true\n }\n\n // externalize react native things from bundle\n webpackConfig.externals = [\n ...webpackConfig.externals.map((external) => {\n if (typeof external !== 'function') {\n return external\n }\n // only runs on server\n return (ctx, cb) => {\n const isCb = typeof cb === 'function'\n const res = externalize(ctx.context, ctx.request)\n if (isCb) {\n if (typeof res === 'string') {\n return cb(null, res)\n }\n if (res) {\n return external(ctx, cb)\n }\n return cb()\n }\n return !res\n ? Promise.resolve(undefined)\n : typeof res === 'string'\n ? Promise.resolve(res)\n : external(ctx)\n }\n }),\n ]\n }\n\n const cssRules = webpackConfig.module.rules.find(\n (rule) =>\n Array.isArray(rule.oneOf) &&\n rule.oneOf.some(\n ({ test }) =>\n typeof test === 'object' &&\n typeof test.test === 'function' &&\n test.test('filename.css')\n )\n ).oneOf\n\n /**\n * Font Support\n */\n if (cssRules) {\n if (!tamaguiOptions.disableFontSupport) {\n // fonts support\n cssRules.unshift({\n test: /\\.(woff(2)?|eot|ttf|otf)(\\?v=\\d+\\.\\d+\\.\\d+)?$/,\n use: [\n {\n loader: require.resolve('url-loader'),\n options: {\n limit: nextConfig.inlineFontLimit || 1024,\n fallback: require.resolve('file-loader'),\n publicPath: `${nextConfig.assetPrefix || ''}/_next/static/chunks/fonts/`,\n outputPath: `${isServer ? '../' : ''}static/chunks/fonts/`,\n name: '[name].[ext]',\n },\n },\n ],\n })\n }\n\n /**\n * CSS Support\n */\n const cssLoader = getGlobalCssLoader(\n // @ts-ignore\n {\n assetPrefix: options.config.assetPrefix || config.assetPrefix,\n future: nextConfig.future,\n experimental: nextConfig.experimental || {},\n isEdgeRuntime: true,\n isProduction: !dev,\n targetWeb: true,\n isClient: !isServer,\n isServer,\n isDevelopment: dev,\n },\n // @ts-ignore\n () => lazyPostCSS(dir, getSupportedBrowsers(dir, dev)),\n []\n )\n\n const cssTest = tamaguiOptions.includeCSSTest ?? /\\.css$/\n\n if (!dev && tamaguiOptions.enableCSSOptimizations) {\n const postCSSLoader = cssLoader[cssLoader.length - 1]\n // replace nextjs picky style rules with simple minicssextract\n cssRules.unshift({\n test: cssTest,\n use: [MiniCSSExtractPlugin.loader, 'css-loader', postCSSLoader],\n sideEffects: true,\n })\n webpackConfig.plugins.push(\n new MiniCSSExtractPlugin({\n filename: 'static/css/[contenthash].css',\n ignoreOrder: true,\n })\n )\n } else {\n cssRules.unshift({\n test: cssTest,\n sideEffects: true,\n use: cssLoader,\n })\n }\n cssRules.unshift({\n test: cssTest,\n sideEffects: true,\n use: cssLoader,\n })\n }\n\n webpackConfig.plugins.push(\n new TamaguiPlugin({\n commonjs: isServer,\n exclude: (path: string) => {\n const res = shouldExclude(path, options.dir)\n // console.log(`shouldExclude`, res, path)\n return res\n },\n ...tamaguiOptions,\n })\n )\n\n if (typeof nextConfig.webpack === 'function') {\n return nextConfig.webpack(webpackConfig, options)\n }\n\n return webpackConfig\n },\n }\n }\n}\n\nfunction getSupportedBrowsers(dir, isDevelopment) {\n let browsers\n try {\n browsers = browserslist.loadConfig({\n path: dir,\n env: isDevelopment ? 'development' : 'production',\n })\n } catch {\n //\n }\n return browsers\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path"]
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tamagui/next-plugin",
|
|
3
|
-
"version": "1.0.1-beta.
|
|
3
|
+
"version": "1.0.1-beta.228",
|
|
4
4
|
"source": "src/index.ts",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"types": "./types/index.d.ts",
|
|
@@ -21,23 +21,25 @@
|
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@babel/preset-react": "^7.18.6",
|
|
24
|
-
"@tamagui/proxy-worm": "^1.0.1-beta.
|
|
25
|
-
"@tamagui/react-native-svg": "^1.0.1-beta.
|
|
26
|
-
"@tamagui/static": "^1.0.1-beta.
|
|
24
|
+
"@tamagui/proxy-worm": "^1.0.1-beta.228",
|
|
25
|
+
"@tamagui/react-native-svg": "^1.0.1-beta.228",
|
|
26
|
+
"@tamagui/static": "^1.0.1-beta.228",
|
|
27
27
|
"babel-loader": "^8.2.5",
|
|
28
28
|
"browserslist": "^4.21.1",
|
|
29
29
|
"css-loader": "^5.2.4",
|
|
30
|
+
"css-minimizer-webpack-plugin": "^4.2.2",
|
|
30
31
|
"esbuild-loader": "^2.19.0",
|
|
31
32
|
"esm-resolve": "^1.0.8",
|
|
32
33
|
"file-loader": "^6.2.0",
|
|
33
34
|
"html-inline-css-webpack-plugin": "^1.11.1",
|
|
34
35
|
"html-webpack-plugin": "^5.5.0",
|
|
35
|
-
"
|
|
36
|
+
"mini-css-extract-plugin": "^2.7.1",
|
|
37
|
+
"tamagui-loader": "^1.0.1-beta.228",
|
|
36
38
|
"thread-loader": "^3.0.4",
|
|
37
39
|
"url-loader": "^4.1.1"
|
|
38
40
|
},
|
|
39
41
|
"devDependencies": {
|
|
40
|
-
"@tamagui/build": "^1.0.1-beta.
|
|
42
|
+
"@tamagui/build": "^1.0.1-beta.228",
|
|
41
43
|
"next": "^13.0.2"
|
|
42
44
|
},
|
|
43
45
|
"peerDependencies": {
|
package/src/withTamagui.ts
CHANGED
|
@@ -3,7 +3,9 @@ import path, { dirname, join } from 'path'
|
|
|
3
3
|
|
|
4
4
|
import type { TamaguiOptions } from '@tamagui/static'
|
|
5
5
|
import browserslist from 'browserslist'
|
|
6
|
+
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin'
|
|
6
7
|
import buildResolver from 'esm-resolve'
|
|
8
|
+
import MiniCSSExtractPlugin from 'mini-css-extract-plugin'
|
|
7
9
|
import { lazyPostCSS } from 'next/dist/build/webpack/config/blocks/css'
|
|
8
10
|
import { getGlobalCssLoader } from 'next/dist/build/webpack/config/blocks/css/loaders'
|
|
9
11
|
import { TamaguiPlugin, shouldExclude as shouldExcludeDefault } from 'tamagui-loader'
|
|
@@ -12,6 +14,7 @@ import webpack from 'webpack'
|
|
|
12
14
|
export type WithTamaguiProps = TamaguiOptions & {
|
|
13
15
|
useReactNativeWebLite: boolean
|
|
14
16
|
disableFontSupport?: boolean
|
|
17
|
+
enableCSSOptimizations?: boolean
|
|
15
18
|
aliasReactPackages?: boolean
|
|
16
19
|
includeCSSTest?: RegExp | ((path: string) => boolean)
|
|
17
20
|
shouldExtract?: (path: string, projectRoot: string) => boolean | undefined
|
|
@@ -203,6 +206,19 @@ export const withTamagui = (tamaguiOptions: WithTamaguiProps) => {
|
|
|
203
206
|
}
|
|
204
207
|
}
|
|
205
208
|
|
|
209
|
+
if (!dev && tamaguiOptions.enableCSSOptimizations) {
|
|
210
|
+
const cssMin = webpackConfig.optimization.minimizer.find((x) =>
|
|
211
|
+
x.toString().includes('css-minimizer-plugin')
|
|
212
|
+
)
|
|
213
|
+
if (cssMin) {
|
|
214
|
+
webpackConfig.optimization.minimizer = webpackConfig.optimization.minimizer.slice(
|
|
215
|
+
cssMin.index,
|
|
216
|
+
1
|
|
217
|
+
)
|
|
218
|
+
}
|
|
219
|
+
webpackConfig.optimization.minimizer.push(new CssMinimizerPlugin())
|
|
220
|
+
}
|
|
221
|
+
|
|
206
222
|
/**
|
|
207
223
|
* Server react-native compat
|
|
208
224
|
*/
|
|
@@ -328,26 +344,51 @@ export const withTamagui = (tamaguiOptions: WithTamaguiProps) => {
|
|
|
328
344
|
/**
|
|
329
345
|
* CSS Support
|
|
330
346
|
*/
|
|
347
|
+
const cssLoader = getGlobalCssLoader(
|
|
348
|
+
// @ts-ignore
|
|
349
|
+
{
|
|
350
|
+
assetPrefix: options.config.assetPrefix || config.assetPrefix,
|
|
351
|
+
future: nextConfig.future,
|
|
352
|
+
experimental: nextConfig.experimental || {},
|
|
353
|
+
isEdgeRuntime: true,
|
|
354
|
+
isProduction: !dev,
|
|
355
|
+
targetWeb: true,
|
|
356
|
+
isClient: !isServer,
|
|
357
|
+
isServer,
|
|
358
|
+
isDevelopment: dev,
|
|
359
|
+
},
|
|
360
|
+
// @ts-ignore
|
|
361
|
+
() => lazyPostCSS(dir, getSupportedBrowsers(dir, dev)),
|
|
362
|
+
[]
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
const cssTest = tamaguiOptions.includeCSSTest ?? /\.css$/
|
|
366
|
+
|
|
367
|
+
if (!dev && tamaguiOptions.enableCSSOptimizations) {
|
|
368
|
+
const postCSSLoader = cssLoader[cssLoader.length - 1]
|
|
369
|
+
// replace nextjs picky style rules with simple minicssextract
|
|
370
|
+
cssRules.unshift({
|
|
371
|
+
test: cssTest,
|
|
372
|
+
use: [MiniCSSExtractPlugin.loader, 'css-loader', postCSSLoader],
|
|
373
|
+
sideEffects: true,
|
|
374
|
+
})
|
|
375
|
+
webpackConfig.plugins.push(
|
|
376
|
+
new MiniCSSExtractPlugin({
|
|
377
|
+
filename: 'static/css/[contenthash].css',
|
|
378
|
+
ignoreOrder: true,
|
|
379
|
+
})
|
|
380
|
+
)
|
|
381
|
+
} else {
|
|
382
|
+
cssRules.unshift({
|
|
383
|
+
test: cssTest,
|
|
384
|
+
sideEffects: true,
|
|
385
|
+
use: cssLoader,
|
|
386
|
+
})
|
|
387
|
+
}
|
|
331
388
|
cssRules.unshift({
|
|
332
|
-
test:
|
|
389
|
+
test: cssTest,
|
|
333
390
|
sideEffects: true,
|
|
334
|
-
use:
|
|
335
|
-
// @ts-ignore
|
|
336
|
-
{
|
|
337
|
-
assetPrefix: options.config.assetPrefix || config.assetPrefix,
|
|
338
|
-
future: nextConfig.future,
|
|
339
|
-
experimental: nextConfig.experimental || {},
|
|
340
|
-
isEdgeRuntime: true,
|
|
341
|
-
isProduction: !dev,
|
|
342
|
-
targetWeb: true,
|
|
343
|
-
isClient: !isServer,
|
|
344
|
-
isServer,
|
|
345
|
-
isDevelopment: dev,
|
|
346
|
-
},
|
|
347
|
-
// @ts-ignore
|
|
348
|
-
() => lazyPostCSS(dir, getSupportedBrowsers(dir, dev)),
|
|
349
|
-
[]
|
|
350
|
-
),
|
|
391
|
+
use: cssLoader,
|
|
351
392
|
})
|
|
352
393
|
}
|
|
353
394
|
|
package/types/withTamagui.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { TamaguiOptions } from '@tamagui/static';
|
|
|
2
2
|
export declare type WithTamaguiProps = TamaguiOptions & {
|
|
3
3
|
useReactNativeWebLite: boolean;
|
|
4
4
|
disableFontSupport?: boolean;
|
|
5
|
+
enableCSSOptimizations?: boolean;
|
|
5
6
|
aliasReactPackages?: boolean;
|
|
6
7
|
includeCSSTest?: RegExp | ((path: string) => boolean);
|
|
7
8
|
shouldExtract?: (path: string, projectRoot: string) => boolean | undefined;
|