Skip to content

Commit

Permalink
refactor: migrate to ESM (#93)
Browse files Browse the repository at this point in the history
  • Loading branch information
toyobayashi authored Dec 1, 2023
1 parent 7eef4fe commit 04d2db5
Show file tree
Hide file tree
Showing 61 changed files with 2,170 additions and 1,273 deletions.
7 changes: 7 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@
},
"license": "MIT",
"devDependencies": {
"@microsoft/api-extractor": "^7.38.3",
"@rollup/plugin-alias": "^5.1.0",
"@rollup/plugin-node-resolve": "^15.2.3",
"@rollup/plugin-replace": "^5.0.5",
"@rollup/plugin-terser": "^0.4.4",
"@rollup/plugin-typescript": "^11.1.5",
"@tybys/cross-zip": "^3.1.0",
"@tybys/ts-transform-pure-class": "^0.1.1",
"@tybys/tsapi": "^0.6.0",
Expand All @@ -41,6 +47,7 @@
"eslint-plugin-n": "^15.6.1",
"eslint-plugin-promise": "^6.1.1",
"fs-extra": "^10.1.0",
"rollup": "^4.5.2",
"ts-clone-node": "^3.0.0",
"typescript": "~5.0.4"
},
Expand Down
6 changes: 0 additions & 6 deletions packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,6 @@
"dependencies": {
"tslib": "^2.4.0"
},
"devDependencies": {
"@rollup/plugin-node-resolve": "^15.1.0",
"@rollup/plugin-replace": "^5.0.2",
"@rollup/plugin-terser": "^0.4.3",
"rollup": "^3.25.1"
},
"scripts": {
"build": "node ./script/build.js"
},
Expand Down
61 changes: 33 additions & 28 deletions packages/core/script/build.js
Original file line number Diff line number Diff line change
@@ -1,40 +1,45 @@
const path = require('path')
const fs = require('fs-extra')
const rollup = require('rollup')
const ts = require('typescript')
const rollupTypescript = require('@rollup/plugin-typescript').default
const rollupNodeResolve = require('@rollup/plugin-node-resolve').default
const rollupReplace = require('@rollup/plugin-replace').default
const rollupTerser = require('@rollup/plugin-terser').default
const dist = path.join(__dirname, '../dist')
const { compile } = require('@tybys/tsapi')

function build () {
compile(path.join(__dirname, '../tsconfig.json'), {
optionsToExtend: {
target: require('typescript').ScriptTarget.ES5,
outDir: path.join(__dirname, '../lib/es5')
}
})
compile(path.join(__dirname, '../tsconfig.json'), {
optionsToExtend: {
target: require('typescript').ScriptTarget.ES2019,
outDir: path.join(__dirname, '../lib/es2019'),
removeComments: true,
downlevelIteration: false
}
})

/**
* @param {'es5' | 'es2019'} esversion
* @param {ts.ScriptTarget} esversion
* @param {boolean=} minify
* @returns {rollup.RollupOptions}
*/
function createInput (esversion, minify, options) {
function createInput (esversion, minify, external) {
return {
input: path.join(__dirname, '../lib', esversion, 'index.js'),
input: path.join(__dirname, '../src/index.js'),
external,
plugins: [
rollupTypescript({
tsconfig: path.join(__dirname, '../tsconfig.json'),
tslib: path.join(
path.dirname(require.resolve('tslib')),
JSON.parse(fs.readFileSync(path.join(path.dirname(require.resolve('tslib')), 'package.json'))).module
),
compilerOptions: {
target: esversion,
...(esversion !== ts.ScriptTarget.ES5 ? { removeComments: true, downlevelIteration: false } : {})
},
include: [
'./src/**/*'
],
transformers: {
after: [
require('@tybys/ts-transform-pure-class').default
]
}
}),
rollupNodeResolve({
mainFields: ['module', 'main'],
...((options && options.resolveOnly) ? { resolveOnly: options.resolveOnly } : {})
mainFields: ['module', 'main']
}),
rollupReplace({
preventAssignment: true,
Expand All @@ -59,7 +64,7 @@ function build () {

return Promise.all(([
{
input: createInput('es5', false),
input: createInput(ts.ScriptTarget.ES5, false),
output: {
file: path.join(dist, 'emnapi-core.js'),
format: 'umd',
Expand All @@ -69,7 +74,7 @@ function build () {
}
},
{
input: createInput('es5', true),
input: createInput(ts.ScriptTarget.ES5, true),
output: {
file: path.join(dist, 'emnapi-core.min.js'),
format: 'umd',
Expand All @@ -79,7 +84,7 @@ function build () {
}
},
{
input: createInput('es2019', false, { resolveOnly: [/^(?!(tslib)).*?$/] }),
input: createInput(ts.ScriptTarget.ES2019, false, ['tslib']),
output: {
file: path.join(dist, 'emnapi-core.cjs.js'),
format: 'cjs',
Expand All @@ -89,7 +94,7 @@ function build () {
}
},
{
input: createInput('es2019', true, { resolveOnly: [/^(?!(tslib)).*?$/] }),
input: createInput(ts.ScriptTarget.ES2019, true, ['tslib']),
output: {
file: path.join(dist, 'emnapi-core.cjs.min.js'),
format: 'cjs',
Expand All @@ -99,7 +104,7 @@ function build () {
}
},
{
input: createInput('es2019', false, { resolveOnly: [/^(?!(tslib)).*?$/] }),
input: createInput(ts.ScriptTarget.ES2019, false, ['tslib']),
output: {
file: path.join(dist, 'emnapi-core.mjs'),
format: 'esm',
Expand All @@ -109,7 +114,7 @@ function build () {
}
},
{
input: createInput('es2019', true, { resolveOnly: [/^(?!(tslib)).*?$/] }),
input: createInput(ts.ScriptTarget.ES2019, true, ['tslib']),
output: {
file: path.join(dist, 'emnapi-core.min.mjs'),
format: 'esm',
Expand All @@ -119,7 +124,7 @@ function build () {
}
},
{
input: createInput('es5', false, { resolveOnly: [/^(?!(tslib)).*?$/] }),
input: createInput(ts.ScriptTarget.ES5, false, ['tslib']),
output: {
file: path.join(dist, 'emnapi-core.esm-bundler.js'),
format: 'esm',
Expand Down
13 changes: 3 additions & 10 deletions packages/core/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
"allowJs": true,
"target": "ES5",
"module": "ESNext",
"moduleResolution": "Bundler",
"noEmitHelpers": true,
"importHelpers": true,
"importsNotUsedAsValues": "error",
"outDir": "lib",
"paths": {
"tslib" : ["../../node_modules/tslib/tslib.d.ts"]
},
Expand All @@ -17,17 +18,9 @@
"ES2021.WeakRef",
"ES2017.SharedMemory",
"DOM"
],
"plugins": [
{
"transform": "@tybys/ts-transform-pure-class",
"type": "raw",
"after": true
}
]
},
"include": [
"./src/**/*.ts",
"./src/**/*.js"
"./src/**/*"
]
}
154 changes: 126 additions & 28 deletions packages/emnapi/script/build.js
Original file line number Diff line number Diff line change
@@ -1,51 +1,149 @@
const fs = require('fs')
const path = require('path')
const { EOL } = require('os')
const { createRequire } = require('module')
const ts = require('typescript')
const { compile } = require('@tybys/tsapi')
const rollupTypescript = require('@rollup/plugin-typescript').default
const rollupAlias = require('@rollup/plugin-alias').default
const { rollup } = require('rollup')

// const {
// runtimeOut
// } = require('../../runtime/script/build.js')

function replaceParseTool (code) {
return code
.replace(/(\r?\n)\s*\/\/\s+(#((if)|(else)|(elif)|(endif)))/g, '$1$2')
.replace(/\$POINTER_SIZE/g, '{{{ POINTER_SIZE }}}')
.replace(/\$(from64\(.*?\))/g, '{{{ $1 }}}')
.replace(/\$(to64\(.*?\))/g, '{{{ $1 }}}')
.replace(/\$(makeGetValue\(.*?\))/g, '{{{ $1 }}}')
.replace(/\$(makeSetValue\(.*?\))/g, '{{{ $1 }}}')
.replace(/\$(makeDynCall\(.*?\))/g, '{{{ $1 }}}')
// .replace(/\$(makeMalloc\(.*?\))/g, '{{{ $1 }}}')
.replace(/\$(getUnsharedTextDecoderView\(.*?\))/g, '{{{ $1 }}}')
}

async function build () {
const transformerTsconfigPath = path.join(__dirname, '../transformer/tsconfig.json')
compile(transformerTsconfigPath)

const libTsconfigPath = path.join(__dirname, '../tsconfig.json')
compile(libTsconfigPath)
// compile(libTsconfigPath)
const libTsconfig = JSON.parse(fs.readFileSync(libTsconfigPath, 'utf8'))

const libOut = path.join(path.dirname(libTsconfigPath), libTsconfig.compilerOptions.outFile)
const libOut = path.join(path.dirname(libTsconfigPath), './dist/library_napi.js')
const runtimeRequire = createRequire(path.join(__dirname, '../../runtime/index.js'))

// const runtimeCode = fs.readFileSync(runtimeOut, 'utf8')
const libCode = fs.readFileSync(libOut, 'utf8')
const emnapiRollupBuild = await rollup({
input: path.join(__dirname, '../src/emscripten/index.ts'),
treeshake: false,
plugins: [
rollupTypescript({
tsconfig: libTsconfigPath,
tslib: path.join(
path.dirname(runtimeRequire.resolve('tslib')),
JSON.parse(fs.readFileSync(path.join(path.dirname(runtimeRequire.resolve('tslib')), 'package.json'))).module
),
compilerOptions: {
module: ts.ModuleKind.ESNext
},
include: libTsconfig.include.map(s => path.join(__dirname, '..', s)),
transformers: {
before: [
{
type: 'program',
factory: require('../transformer/out/macro.js').default
},
{
type: 'program',
factory: () => {
return (context) => {
return (src) => {
if (src.isDeclarationFile) return src
const statements = src.statements
const newStatements = statements.filter(s => {
return !(ts.isImportDeclaration(s) && ts.isStringLiteral(s.moduleSpecifier) && (s.moduleSpecifier.text === 'emnapi:emscripten-runtime'))
})
return context.factory.updateSourceFile(src, newStatements)
}
}
}
}
]
}
}),
rollupAlias({
entries: [
{ find: 'emnapi:shared', replacement: path.join(__dirname, '../src/emscripten/init.ts') }
]
}),
require('./rollup-plugin-emscripten.js').default({
defaultLibraryFuncsToInclude: ['$emnapiInit'],
exportedRuntimeMethods: ['emnapiInit'],
modifyOutput (output) {
return output
.replace(/\$POINTER_SIZE/g, '{{{ POINTER_SIZE }}}')
.replace(/\$(from64\(.*?\))/g, '{{{ $1 }}}')
.replace(/\$(to64\(.*?\))/g, '{{{ $1 }}}')
.replace(/\$(makeGetValue\(.*?\))/g, '{{{ $1 }}}')
.replace(/\$(makeSetValue\(.*?\))/g, '{{{ $1 }}}')
.replace(/\$(makeDynCall\(.*?\))/g, '{{{ $1 }}}')
// .replace(/\$(makeMalloc\(.*?\))/g, '{{{ $1 }}}')
.replace(/\$(getUnsharedTextDecoderView\(.*?\))/g, '{{{ $1 }}}')
}
})
]
})
await emnapiRollupBuild.write({
file: libOut,
format: 'esm',
exports: 'named',
strict: false
})

fs.writeFileSync(libOut,
'{{{ ((DEFAULT_LIBRARY_FUNCS_TO_INCLUDE.indexOf("$emnapiInit") === -1 ? DEFAULT_LIBRARY_FUNCS_TO_INCLUDE.push("$emnapiInit") : undefined), "") }}}' + EOL +
'{{{ ((EXPORTED_RUNTIME_METHODS.indexOf("emnapiInit") === -1 ? EXPORTED_RUNTIME_METHODS.push("emnapiInit") : undefined), "") }}}' + EOL +
replaceParseTool(
libCode
),
'utf8'
)
// const runtimeCode = fs.readFileSync(runtimeOut, 'utf8')

const coreTsconfigPath = path.join(__dirname, '../src/core/tsconfig.json')
compile(coreTsconfigPath)
// compile(coreTsconfigPath)
const coreTsconfig = JSON.parse(fs.readFileSync(coreTsconfigPath, 'utf8'))
const coreOut = path.join(path.dirname(coreTsconfigPath), coreTsconfig.compilerOptions.outFile)
const coreOut = path.join(path.dirname(coreTsconfigPath), '../../dist/emnapi-core.js')

const coreRollupBuild = await rollup({
input: path.join(__dirname, '../src/core/index.ts'),
treeshake: false,
plugins: [
rollupTypescript({
tsconfig: coreTsconfigPath,
tslib: path.join(
path.dirname(runtimeRequire.resolve('tslib')),
JSON.parse(fs.readFileSync(path.join(path.dirname(runtimeRequire.resolve('tslib')), 'package.json'))).module
),
compilerOptions: {
module: ts.ModuleKind.ESNext
},
include: coreTsconfig.include.map(s => path.join(__dirname, '../src/core', s)),
transformers: {
before: [
{
type: 'program',
factory: require('../transformer/out/macro.js').default
},
{
type: 'program',
factory (program) {
return require('../transformer/out/index.js').default(program, {
defines: {
MEMORY64: 0
}
})
}
}
]
}
}),
rollupAlias({
entries: [
{ find: 'emnapi:shared', replacement: path.join(__dirname, '../src/core/init.ts') },
{ find: 'emnapi:emscripten-runtime', replacement: path.join(__dirname, '../src/core/init.ts') }
]
})
]
})
await coreRollupBuild.write({
file: coreOut,
format: 'iife',
name: 'napiModule',
strict: false
})

const coreCode = fs.readFileSync(coreOut, 'utf8')
const { Compiler } = require('./preprocess.js')
const compiler = new Compiler({
Expand Down
Loading

0 comments on commit 04d2db5

Please sign in to comment.