telefunc
Version:
Remote functions. Instead of API.
63 lines (62 loc) • 2.77 kB
JavaScript
export { importBuild };
import { serverProductionEntryPlugin } from '@brillout/vite-plugin-server-entry/plugin';
import { assert, assertPosixPath, projectInfo, toPosixPath } from '../../utils.js';
import path from 'node:path';
import { getTelefuncManifest } from './importBuild/getTelefuncManifest.js';
import { getOutDirAbsolute } from '../getOutDirs.js';
import { createRequire } from 'node:module';
const require_ = createRequire(import.meta.url);
function importBuild() {
let config;
return [
{
name: 'telefunc:importBuild:config',
enforce: 'post',
configResolved(config_) {
config = config_;
},
},
...serverProductionEntryPlugin({
getServerProductionEntry: () => {
return getServerProductionEntryCode(config);
},
libraryName: projectInfo.projectName,
}),
];
}
function getServerProductionEntryCode(config) {
const importPath = getImportPath(config);
const telefuncManifest = getTelefuncManifest();
const { telefuncFilesGlobFilePath } = globalThis._telefunc;
assert(telefuncFilesGlobFilePath);
// console.log(`\n importPath: ${importPath}\n outDirServer: ${outDirServer}\n importPathAbsolute: ${importPathAbsolute}\n config.build.outDir: ${config.build.outDir}`)
const importerCode = [
`import { setTelefuncLoaders } from '${importPath}';`,
`import * as telefuncFiles from '${telefuncFilesGlobFilePath}';`,
'setTelefuncLoaders({',
` loadTelefuncFiles: () => telefuncFiles,`,
` loadManifest: () => (${JSON.stringify(telefuncManifest, null, 2)})`,
'});',
'',
].join('\n');
return importerCode;
}
function getImportPath(config) {
// We resolve filePathAbsolute even if we don't use it: we use require.resolve() as an assertion that the relative path is correct
const filePathAbsolute = toPosixPath(
// [RELATIVE_PATH_FROM_DIST] Current file: node_modules/telefunc/dist/node/vite/plugins/importBuild.js
require_.resolve(`../../../../dist/node/vite/plugins/importBuild/loadBuild.js`));
if (
// Let's implement a new config if a user needs the import to be a relative path instead of 'telefunc/__internal/loadImportBuild' (AFAIK there is no use case for relative paths for Telefunc)
true) {
return 'telefunc/__internal/loadBuild';
}
else {
assert(config.build.ssr); // outDir needs to be the outDir of the server-side
const outDir = getOutDirAbsolute(config);
assertPosixPath(outDir);
assertPosixPath(filePathAbsolute);
const filePathRelative = path.posix.relative(outDir, filePathAbsolute);
return filePathRelative;
}
}