forked from OHIF/Viewers
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrsbuild.config.ts
More file actions
218 lines (211 loc) · 7.73 KB
/
Copy pathrsbuild.config.ts
File metadata and controls
218 lines (211 loc) · 7.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
import { defineConfig } from '@rsbuild/core';
import { pluginReact } from '@rsbuild/plugin-react';
import { pluginNodePolyfill } from '@rsbuild/plugin-node-polyfill';
import path from 'path';
import writePluginImportsFile from './platform/app/.webpack/writePluginImportsFile';
// Module-resolution rules shared with the webpack/rspack build (webpack.base.js)
// so the two pipelines resolve identically.
import resolveConfig from './.webpack/resolveConfig';
import fs from 'fs';
const SRC_DIR = path.resolve(__dirname, './platform/app/src');
const DIST_DIR = path.resolve(__dirname, './platform/app/dist');
const PUBLIC_DIR = path.resolve(__dirname, './platform/app/public');
// Environment variables (similar to webpack.pwa.js)
// rsbuild is used only by the dev server (`dev:fast`), so default to the
// full-featured `config/dev.js` while still honoring an explicit APP_CONFIG.
const APP_CONFIG = process.env.APP_CONFIG || 'config/dev.js';
const PUBLIC_URL = process.env.PUBLIC_URL || '/';
// Add these constants
const NODE_ENV = process.env.NODE_ENV;
const BUILD_NUM = process.env.CIRCLE_BUILD_NUM || '0';
const VERSION_NUMBER = fs.readFileSync(path.join(__dirname, './version.txt'), 'utf8') || '';
const COMMIT_HASH = fs.readFileSync(path.join(__dirname, './commit.txt'), 'utf8') || '';
const PROXY_TARGET = process.env.PROXY_TARGET;
const PROXY_DOMAIN = process.env.PROXY_DOMAIN;
const PROXY_PATH_REWRITE_FROM = process.env.PROXY_PATH_REWRITE_FROM;
const PROXY_PATH_REWRITE_TO = process.env.PROXY_PATH_REWRITE_TO;
// Add port constant
const OHIF_PORT = Number(process.env.OHIF_PORT || 3000);
const OHIF_OPEN = process.env.OHIF_OPEN !== 'false';
// Ignore node_modules except @cornerstonejs (symlinked local development).
const WATCH_IGNORED = /node_modules[\\/](?!@cornerstonejs(?:[\\/]|$))/;
const WATCH_AGGREGATE_TIMEOUT = Number(process.env.WATCH_AGGREGATE_TIMEOUT || 1500);
// `source-map-loader` is not a project dependency — it only serves the local
// cs3d-linking workflow (libs/@cornerstonejs, gitignored), so it is resolved
// opportunistically and the rule is skipped on installs that lack it.
const SOURCE_MAP_LOADER = (() => {
try {
return require.resolve('source-map-loader');
} catch {
return null;
}
})();
export default defineConfig({
dev: {
lazyCompilation: false,
},
source: {
entry: {
index: `${SRC_DIR}/index.js`,
},
define: {
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
'process.env.NODE_DEBUG': JSON.stringify(process.env.NODE_DEBUG),
'process.env.DEBUG': JSON.stringify(process.env.DEBUG),
'process.env.PUBLIC_URL': JSON.stringify(process.env.PUBLIC_URL || '/'),
'process.env.BUILD_NUM': JSON.stringify(BUILD_NUM),
'process.env.VERSION_NUMBER': JSON.stringify(VERSION_NUMBER),
'process.env.COMMIT_HASH': JSON.stringify(COMMIT_HASH),
'process.env.USE_LOCIZE': JSON.stringify(process.env.USE_LOCIZE || ''),
'process.env.LOCIZE_PROJECTID': JSON.stringify(process.env.LOCIZE_PROJECTID || ''),
'process.env.LOCIZE_API_KEY': JSON.stringify(process.env.LOCIZE_API_KEY || ''),
'process.env.REACT_APP_I18N_DEBUG': JSON.stringify(process.env.REACT_APP_I18N_DEBUG || ''),
},
},
plugins: [pluginReact(), pluginNodePolyfill()],
tools: {
rspack: {
experiments: {
asyncWebAssembly: true,
},
// Leave __filename / __dirname references alone. rsbuild's default
// ('warn-mock') noisily warns whenever bundled deps reference them
// (e.g. Emscripten-compiled cornerstone codecs). Those references sit
// inside `if (ENVIRONMENT_IS_NODE)` branches that never execute in the
// browser, so leaving them un-substituted is harmless at runtime.
node: {
__filename: false,
__dirname: false,
},
module: {
rules: [
// Consume the source maps emitted by the linked local Cornerstone
// packages (libs/@cornerstonejs, via cs3d:link + cs3d:watch) so browser
// stack traces and breakpoints resolve to the original .ts instead of
// the bundled dist/esm .js. Scoped to the linked packages only.
...(SOURCE_MAP_LOADER
? [
{
test: /\.js$/,
enforce: 'pre' as const,
use: [SOURCE_MAP_LOADER],
include: /libs[\\/]@cornerstonejs[\\/]packages[\\/][^\\/]+[\\/]dist[\\/]esm/,
},
]
: []),
{
test: /\.css$/,
use: [
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
},
},
},
],
type: 'javascript/auto',
},
{
test: /\.wasm$/,
type: 'asset/resource',
},
],
},
resolve: {
// Extensions/modes are resolved from their source dirs (see the
// resolve.alias above), so their imports of shared OHIF packages
// (@ohif/ui-next, @ohif/core, ...) must resolve against platform/app's
// installed dependencies rather than only the importer-relative
// node_modules. Shared with webpack.base.js via ./.webpack/resolveConfig.
modules: resolveConfig.getModules(SRC_DIR),
fallback: {
buffer: require.resolve('buffer'),
},
},
watchOptions: {
ignored: WATCH_IGNORED,
followSymlinks: true,
aggregateTimeout: WATCH_AGGREGATE_TIMEOUT,
},
},
},
resolve: {
alias: {
// Resolve every extension/mode declared in pluginConfig.json to its
// source directory, so the dynamic import()s in the generated
// pluginImports.js link without the plugins being dependencies of
// platform/app. Merged in separately since it depends on pluginConfig.json.
...writePluginImportsFile.getPluginResolveAliases(),
// App-level aliases (@ohif/app, @, @components, ...) shared with the
// webpack/rspack build via ./.webpack/resolveConfig.
...resolveConfig.alias,
},
},
output: {
copy: [
// Copy plugin files (handled by writePluginImportsFile)
...(writePluginImportsFile(SRC_DIR, DIST_DIR) || []),
// Copy public directory except config and html-templates
{
from: path.resolve(__dirname, 'node_modules/onnxruntime-web/dist'),
to: `${DIST_DIR}/ort`,
force: true,
},
{
from: PUBLIC_DIR,
to: DIST_DIR,
globOptions: {
ignore: ['**/config/**', '**/html-templates/**', '.DS_Store'],
},
},
// Copy Google config
{
from: path.resolve(PUBLIC_DIR, 'config/google.js'),
to: 'google.js',
},
// Copy app config
{
from: path.resolve(PUBLIC_DIR, APP_CONFIG),
to: 'app-config.js',
},
],
},
html: {
template: path.resolve(PUBLIC_DIR, 'html-templates/index.html'),
templateParameters: {
PUBLIC_URL,
},
},
server: {
port: OHIF_PORT,
open: OHIF_OPEN,
// Configure proxy
proxy: {
'/dicomweb': {
target: 'http://localhost:5000',
},
// Add conditional proxy based on env vars
...(PROXY_TARGET && PROXY_DOMAIN
? {
[PROXY_TARGET]: {
target: PROXY_DOMAIN,
changeOrigin: true,
pathRewrite: {
[`^${PROXY_PATH_REWRITE_FROM}`]: PROXY_PATH_REWRITE_TO,
},
},
}
: {}),
},
// Configure history API fallback
historyApiFallback: {
disableDotRule: true,
index: `${PUBLIC_URL}index.html`,
},
},
});