packages/cli: make src-relative imports work
This commit is contained in:
@@ -5,12 +5,60 @@ const path = require('path');
|
||||
// Figure out whether we're running inside the backstage repo or as an installed dependency
|
||||
const isLocal = require('fs').existsSync(path.resolve(__dirname, '../src'));
|
||||
if (!isLocal) {
|
||||
// src-relative imports are a pain to get to work with plain tsc compilation, as the
|
||||
// transpiled code will maintain the imports as they are in the source. Which means an
|
||||
// import for `helpers/paths` will start like that in the output, which won't work in NodeJS.
|
||||
//
|
||||
// This is a solution for getting src-relative imports to work with typescript/node in
|
||||
// the published package. We're using `module: "amd"` to ship the entire cli implementation
|
||||
// in one file, and it also happens to generate correct module definition and import statements.
|
||||
|
||||
// Minimal AMD implementation
|
||||
const moduleFactories = {};
|
||||
const moduleCache = {};
|
||||
global.define = (name, deps, moduleFunc) => {
|
||||
moduleFactories[name] = () => {
|
||||
const exportsObj = {};
|
||||
const impls = deps.slice(2).map(dep => {
|
||||
const factory = moduleFactories[dep];
|
||||
if (!factory) {
|
||||
return require(dep);
|
||||
}
|
||||
if (!moduleCache[dep]) {
|
||||
moduleCache[dep] = factory();
|
||||
}
|
||||
return moduleCache[dep];
|
||||
});
|
||||
|
||||
moduleFunc(require, exportsObj, ...impls);
|
||||
|
||||
return exportsObj;
|
||||
};
|
||||
};
|
||||
require('../dist');
|
||||
|
||||
// index module is the entrypoint
|
||||
moduleFactories.index();
|
||||
} else {
|
||||
const tsConfigPath = path.resolve(__dirname, '../tsconfig.json');
|
||||
const {
|
||||
baseUrl: relativeBaseUrl,
|
||||
paths = {},
|
||||
} = require(tsConfigPath).compilerOptions;
|
||||
const baseUrl = path.resolve(__dirname, '..', relativeBaseUrl);
|
||||
|
||||
// Use tsconfig-paths to resolve src-relative paths during development
|
||||
const cleanupPaths = require('tsconfig-paths').register({ baseUrl, paths });
|
||||
|
||||
require('ts-node').register({
|
||||
project: path.resolve(__dirname, '../tsconfig.json'),
|
||||
compilerOptions: {
|
||||
module: 'CommonJS',
|
||||
},
|
||||
transpileOnly: true,
|
||||
});
|
||||
|
||||
require('../src');
|
||||
|
||||
cleanupPaths();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user