workspace: build: enable ts build cache

pull/431/head
undefined 2 years ago
parent 15b88f00a9
commit 307b26ba4c

@ -2,6 +2,7 @@ const fs = require('fs');
const path = require('path'); const path = require('path');
const dir = path.dirname(path.dirname(require.resolve('@types/node/package.json'))); const dir = path.dirname(path.dirname(require.resolve('@types/node/package.json')));
const types = fs.readdirSync(dir).filter((i) => !['sharedworker', 'serviceworker'].includes(i));
const compilerOptionsBase = { const compilerOptionsBase = {
target: 'es2020', target: 'es2020',
@ -14,21 +15,19 @@ const compilerOptionsBase = {
strictBindCallApply: true, strictBindCallApply: true,
experimentalDecorators: true, experimentalDecorators: true,
// emitDecoratorMetadata: true, // emitDecoratorMetadata: true,
noEmit: true,
incremental: true, incremental: true,
types: fs.readdirSync(dir).filter((i) => !['sharedworker', 'serviceworker'].includes(i)), types,
}; };
const baseOutDir = path.resolve(__dirname, '../.cache/ts-out');
const config = { const config = {
compilerOptions: compilerOptionsBase, compilerOptions: compilerOptionsBase,
references: [ references: [],
{ path: 'packages/hydrooj' },
],
files: [], files: [],
}; };
const configSrc = { const configSrc = (name) => ({
compilerOptions: { compilerOptions: {
...compilerOptionsBase, ...compilerOptionsBase,
outDir: 'src', outDir: path.join(baseOutDir, name),
rootDir: 'src', rootDir: 'src',
}, },
include: ['src'], include: ['src'],
@ -37,18 +36,8 @@ const configSrc = {
'bin', 'bin',
'dist', 'dist',
], ],
}; });
const configFlat = { const configFlat = (name) => (name === 'packages/ui-default' ? {
compilerOptions: {
...compilerOptionsBase,
outDir: '.',
rootDir: '.',
},
include: ['**/*.ts'],
exclude: [],
};
fs.writeFileSync(path.resolve(process.cwd(), 'packages', 'ui-default', 'tsconfig.json'), JSON.stringify({
exclude: [ exclude: [
'./public', './public',
], ],
@ -60,40 +49,50 @@ fs.writeFileSync(path.resolve(process.cwd(), 'packages', 'ui-default', 'tsconfig
target: 'es2020', target: 'es2020',
baseUrl: '.', baseUrl: '.',
moduleResolution: 'node', moduleResolution: 'node',
types,
paths: { paths: {
'vj/*': [ 'vj/*': [
'./*', './*',
], ],
}, },
}, },
})); } : {
compilerOptions: {
...compilerOptionsBase,
outDir: path.join(baseOutDir, name),
rootDir: '.',
},
include: ['**/*.ts'],
exclude: [],
});
if (!fs.existsSync(path.resolve(process.cwd(), 'plugins'))) { if (!fs.existsSync(path.resolve(process.cwd(), 'plugins'))) {
fs.mkdirSync(path.resolve(process.cwd(), 'plugins')); fs.mkdirSync(path.resolve(process.cwd(), 'plugins'));
} }
for (const type of ['packages', 'plugins']) { const modules = [
const packages = fs.readdirSync(path.resolve(process.cwd(), type)); 'packages/hydrooj',
for (const package of packages) { ...fs.readdirSync(path.resolve(process.cwd(), 'packages')).map((i) => `packages/${i}`),
if (package === 'ui-default') continue; ...fs.readdirSync(path.resolve(process.cwd(), 'plugins')).map((i) => `plugins/${i}`),
const basedir = path.resolve(process.cwd(), type, package); ].filter((i) => !i.includes('/.')).filter((i) => fs.statSync(path.resolve(process.cwd(), i)).isDirectory());
if (!fs.statSync(basedir).isDirectory()) continue;
const files = fs.readdirSync(basedir); for (const package of modules) {
if (!files.includes('src') && !files.map((n) => n.split('.')[1]).includes('ts') && package !== 'utils') continue; config.references.push({ path: package });
if (package !== 'hydrooj') config.references.push({ path: `${type}/${package}` }); const basedir = path.resolve(process.cwd(), package);
fs.writeFileSync( const files = fs.readdirSync(basedir);
path.resolve(basedir, 'tsconfig.json'), if (!files.includes('src') && !files.filter((i) => i.endsWith('.ts')).length && package !== 'packages/utils') continue;
files.includes('src') ? JSON.stringify(configSrc) : JSON.stringify(configFlat), const expectedConfig = JSON.stringify((files.includes('src') ? configSrc : configFlat)(package));
); const configPath = path.resolve(basedir, 'tsconfig.json');
if (files.includes('src')) { const currentConfig = fs.existsSync(configPath) ? fs.readFileSync(configPath, 'utf-8') : '';
const inner = fs.readdirSync(path.resolve(basedir, 'src')); if (expectedConfig !== currentConfig) fs.writeFileSync(configPath, expectedConfig);
for (const file of inner) { if (!files.includes('src')) continue;
if (!fs.statSync(path.resolve(basedir, 'src', file)).isFile()) continue; // Create mapping entry
const name = file.split('.')[0]; for (const file of fs.readdirSync(path.resolve(basedir, 'src'))) {
if (['handler', 'service', 'lib', 'model', 'script'].includes(name)) { if (!fs.statSync(path.resolve(basedir, 'src', file)).isFile()) continue;
fs.writeFileSync(path.resolve(basedir, `${name}.js`), `module.exports = require('./src/${name}');\n`); const name = file.split('.')[0];
} const filePath = path.resolve(basedir, `${name}.js`);
} if (['handler', 'service', 'lib', 'model', 'script', 'index'].includes(name)) {
if (!fs.existsSync(filePath)) fs.writeFileSync(filePath, `module.exports = require('./src/${name}');\n`);
} }
} }
} }

Loading…
Cancel
Save