@@ -96,6 +96,7 @@ const fs = require('fs');
96
96
const os = require ( 'os' ) ;
97
97
const { execSync, spawnSync } = require ( 'child_process' ) ;
98
98
99
+ const ts = require ( 'typescript' ) ;
99
100
const webpack = require ( 'webpack' ) ;
100
101
const TerserPlugin = require ( 'terser-webpack-plugin' ) ;
101
102
const ForkTsCheckerWebpackPlugin = require ( 'fork-ts-checker-webpack-plugin' ) ;
@@ -125,7 +126,6 @@ const BASE_DIR = __dirname;
125
126
const BUILD_DIR = path . join ( BASE_DIR , 'build' ) ;
126
127
const BUILD_CJS_DIR = path . join ( BUILD_DIR , 'cjs' ) ;
127
128
const BUILD_ESM_DIR = path . join ( BUILD_DIR , 'esm' ) ;
128
- const BUILD_ESM_SRC_DIR = path . join ( BUILD_ESM_DIR , 'src' ) ;
129
129
const BUILD_IMAGES_CURRENT_DIR = path . join ( BUILD_DIR , 'images' , 'current' ) ;
130
130
const BUILD_IMAGES_REFERENCE_DIR = path . join ( BUILD_DIR , 'images' , 'reference' ) ;
131
131
const REFERENCE_DIR = path . join ( BASE_DIR , 'reference' ) ;
@@ -478,8 +478,9 @@ module.exports = (grunt) => {
478
478
versionInfo . saveESMVersionFile ( ) ;
479
479
}
480
480
481
+ let configFile = 'tsconfig.esm.json' ;
482
+
481
483
log ( 'ESM: Building to ./build/esm/' ) ;
482
- fs . mkdirSync ( BUILD_ESM_SRC_DIR , { recursive : true } ) ;
483
484
// The build/esm/ folder needs a package.json that specifies { "type": "module" }.
484
485
// This indicates that all *.js files in `vexflow/build/esm/` are ES modules.
485
486
fs . writeFileSync ( BUILD_ESM_PACKAGE_JSON_FILE , '{\n "type": "module"\n}\n' ) ;
@@ -494,9 +495,9 @@ module.exports = (grunt) => {
494
495
versionInfo . update ( ) ;
495
496
fixESM ( ) ;
496
497
} ) ;
497
- watch . start ( '-p' , 'tsconfig.esm.json' , '--noClear' ) ;
498
+ watch . start ( '-p' , configFile , '--noClear' ) ;
498
499
} else {
499
- runCommand ( 'tsc' , '-p' , 'tsconfig.esm.json' ) ;
500
+ TypeScript . compile ( configFile ) ;
500
501
fixESM ( ) ;
501
502
}
502
503
} ) ;
@@ -505,7 +506,7 @@ module.exports = (grunt) => {
505
506
// Output *.d.ts files to build/types/.
506
507
grunt . registerTask ( 'build:types' , 'Use tsc to create *.d.ts files in build/types/' , ( ) => {
507
508
log ( 'Types: Building *.d.ts files in build/types/' ) ;
508
- runCommand ( 'tsc' , '-p' , 'tsconfig.types.json' ) ;
509
+ TypeScript . compile ( 'tsconfig.types.json' ) ;
509
510
} ) ;
510
511
511
512
// grunt build:docs
@@ -810,3 +811,48 @@ module.exports = (grunt) => {
810
811
} ) ;
811
812
} ) ;
812
813
} ;
814
+
815
+ // Call tsc programmatically.
816
+ class TypeScript {
817
+ static reportDiagnostics ( diagnostics ) {
818
+ diagnostics . forEach ( ( diagnostic ) => {
819
+ let message = 'Error' ;
820
+ if ( diagnostic . file ) {
821
+ const where = diagnostic . file . getLineAndCharacterOfPosition ( diagnostic . start ) ;
822
+ message += ' ' + diagnostic . file . fileName + ' ' + where . line + ', ' + where . character + 1 ;
823
+ }
824
+ message += ': ' + ts . flattenDiagnosticMessageText ( diagnostic . messageText , '\n' ) ;
825
+ console . log ( message ) ;
826
+ } ) ;
827
+ }
828
+
829
+ static readConfigFile ( configFileName ) {
830
+ const configFileText = fs . readFileSync ( configFileName ) . toString ( ) ;
831
+
832
+ const result = ts . parseConfigFileTextToJson ( configFileName , configFileText ) ;
833
+ const configObject = result . config ;
834
+ if ( ! configObject ) {
835
+ TypeScript . reportDiagnostics ( [ result . error ] ) ;
836
+ process . exit ( 1 ) ;
837
+ }
838
+
839
+ const configParseResult = ts . parseJsonConfigFileContent ( configObject , ts . sys , path . dirname ( configFileName ) ) ;
840
+ if ( configParseResult . errors . length > 0 ) {
841
+ TypeScript . reportDiagnostics ( configParseResult . errors ) ;
842
+ process . exit ( 1 ) ;
843
+ }
844
+ return configParseResult ;
845
+ }
846
+
847
+ static compile ( configFileName ) {
848
+ const config = TypeScript . readConfigFile ( configFileName ) ;
849
+
850
+ const program = ts . createProgram ( config . fileNames , config . options ) ;
851
+ const emitResult = program . emit ( ) ;
852
+
853
+ TypeScript . reportDiagnostics ( ts . getPreEmitDiagnostics ( program ) . concat ( emitResult . diagnostics ) ) ;
854
+
855
+ const exitCode = emitResult . emitSkipped ? 1 : 0 ;
856
+ process . exit ( exitCode ) ;
857
+ }
858
+ }
0 commit comments