142 lines
4.5 KiB
JavaScript
142 lines
4.5 KiB
JavaScript
import url from '@rollup/plugin-url';
|
|
import resolve from '@rollup/plugin-node-resolve';
|
|
import commonjs from '@rollup/plugin-commonjs';
|
|
import json from '@rollup/plugin-json';
|
|
import terser from '@rollup/plugin-terser';
|
|
import replace from '@rollup/plugin-replace';
|
|
import path from 'path';
|
|
import fs from 'fs/promises';
|
|
|
|
const source = process.env.BUILD_SOURCE ?? "IIIF";
|
|
const envBuild = process.env.BUILD ?? "test";
|
|
const production = process.env.IS_PROD === 'true';
|
|
const outDistDir = path.join('dist', envBuild);
|
|
const isLibraryBuild = envBuild === 'library';
|
|
const entryFileName = isLibraryBuild && production
|
|
? 'dfg_3dviewer.min.js'
|
|
: 'dfg_3dviewer-module.js';
|
|
|
|
console.log('[rollup] build:', envBuild);
|
|
console.log('[rollup] outDir:', outDistDir);
|
|
console.log('[rollup] entry:', entryFileName);
|
|
|
|
async function copyDirectory(sourceDir, target) {
|
|
await fs.cp(sourceDir, target, { recursive: true });
|
|
}
|
|
|
|
function copyBuildAssets() {
|
|
return {
|
|
name: 'copy-build-assets',
|
|
async writeBundle() {
|
|
await fs.mkdir(outDistDir, { recursive: true });
|
|
|
|
const assetCopyTasks = [
|
|
copyDirectory('node_modules/three/examples/jsm/libs/draco', path.join(outDistDir, 'assets/draco')),
|
|
copyDirectory('node_modules/web-ifc', path.join(outDistDir, 'assets/ifc')),
|
|
copyDirectory('viewer/css', path.join(outDistDir, 'assets/css')),
|
|
copyDirectory('viewer/img', path.join(outDistDir, 'assets/img')),
|
|
copyDirectory('viewer/fonts', path.join(outDistDir, 'assets/fonts')),
|
|
copyDirectory('viewer/js/maps', path.join(outDistDir, 'assets/maps')),
|
|
];
|
|
|
|
if (!isLibraryBuild) {
|
|
assetCopyTasks.push(
|
|
copyDirectory('viewer/examples', path.join(outDistDir, 'examples')),
|
|
fs.copyFile('index.html', path.join(outDistDir, 'index.html')),
|
|
fs.copyFile('embed.html', path.join(outDistDir, 'embed.html')),
|
|
);
|
|
}
|
|
|
|
await Promise.all(assetCopyTasks);
|
|
|
|
const viewerSettingsTarget = path.join(outDistDir, 'viewer-settings.json');
|
|
const viewerSettings = JSON.parse(
|
|
await fs.readFile('viewer/viewer-settings-example.json', 'utf8')
|
|
);
|
|
viewerSettings.viewer.lightweight = 1;
|
|
|
|
let viewerSettingsMain;
|
|
try {
|
|
viewerSettingsMain = JSON.parse(await fs.readFile('viewer-settings.json', 'utf8'));
|
|
} catch {
|
|
viewerSettingsMain = { ...viewerSettings };
|
|
}
|
|
|
|
if (isLibraryBuild) {
|
|
viewerSettingsMain.baseModulePath = '/libraries/dfg-3dviewer/assets';
|
|
} else if (envBuild === 'test' || envBuild === 'dev') {
|
|
viewerSettingsMain.viewer.gallery.build = false;
|
|
viewerSettingsMain.viewer.editor = true;
|
|
viewerSettingsMain.viewer.lightweight = true;
|
|
viewerSettingsMain.mainUrl = 'localhost';
|
|
}
|
|
|
|
await fs.writeFile(viewerSettingsTarget, JSON.stringify(viewerSettingsMain, null, 2), { flag: 'wx' })
|
|
.catch(err => {
|
|
if (err.code !== 'EEXIST') {
|
|
throw err;
|
|
}
|
|
});
|
|
},
|
|
};
|
|
}
|
|
|
|
export default {
|
|
input: 'viewer/main.js',
|
|
treeshake: {
|
|
moduleSideEffects: false,
|
|
propertyReadSideEffects: false,
|
|
tryCatchDeoptimization: false,
|
|
},
|
|
plugins: [
|
|
replace({
|
|
preventAssignment: true,
|
|
values: {
|
|
__BUILD_SOURCE__: JSON.stringify(source),
|
|
__BUILD__: JSON.stringify(envBuild),
|
|
__IS_PROD__: JSON.stringify(production),
|
|
__MODULES_PATH__: JSON.stringify(''),
|
|
__ENV_SUBDIR__: JSON.stringify(''),
|
|
},
|
|
}),
|
|
resolve({
|
|
browser: true,
|
|
preferBuiltins: false,
|
|
mainFields: ['module', 'browser', 'main'],
|
|
extensions: ['.js'],
|
|
dedupe: ['three'],
|
|
preserveSymlinks: false,
|
|
exportConditions: ['module'],
|
|
}),
|
|
commonjs({
|
|
include: [/node_modules/],
|
|
exclude: ['node_modules/three/**'],
|
|
transformMixedEsModules: true,
|
|
ignoreDynamicRequires: true,
|
|
requireReturnsDefault: 'auto',
|
|
}),
|
|
json(),
|
|
url({
|
|
include: ['viewer/**/*.{svg,png,jpg,gif,hdr}'],
|
|
limit: 0,
|
|
fileName: 'assets/[name][extname]',
|
|
publicPath: 'assets/',
|
|
}),
|
|
copyBuildAssets(),
|
|
production && terser(),
|
|
].filter(Boolean),
|
|
output: {
|
|
dir: outDistDir,
|
|
entryFileNames: entryFileName,
|
|
chunkFileNames: 'assets/[name].js',
|
|
assetFileNames: 'assets/[name][extname]',
|
|
sourcemapFileNames: 'assets/[name].js.map',
|
|
format: 'es',
|
|
manualChunks(id) {
|
|
if (id.includes('node_modules/three')) {
|
|
return 'three';
|
|
}
|
|
},
|
|
sourcemap: true,
|
|
},
|
|
};
|