diff --git a/javascript/.gitignore b/javascript/.gitignore index 504215abd8..37daa39513 100644 --- a/javascript/.gitignore +++ b/javascript/.gitignore @@ -2,3 +2,6 @@ /binaries /build /dist +load.js +load.js.map +load.d.ts diff --git a/javascript/jest.config.js b/javascript/jest.config.js index 27844f5bfd..1b20124a70 100644 --- a/javascript/jest.config.js +++ b/javascript/jest.config.js @@ -11,4 +11,7 @@ export default { setupFiles: ['./jest.setup.js'], testRegex: '/tests/.*\\.test\\.ts$', extensionsToTreatAsEsm: ['.ts'], + moduleNameMapper: { + '^(\\.\\.?\\/.+)\\.js$': '$1', + }, }; diff --git a/javascript/just.config.cjs b/javascript/just.config.cjs index 520060c7d7..ee2284b338 100644 --- a/javascript/just.config.cjs +++ b/javascript/just.config.cjs @@ -84,6 +84,7 @@ task( declarationDir: 'dist', }), babelTransformTask({src: 'src', dst: 'dist/src'}), + transformLoadEntryPointTask(), 'prepack-package-json', ), ); @@ -98,6 +99,31 @@ function recursiveReplace(obj, pattern, replacement) { } } +function transformLoadEntryPointTask() { + return async () => { + const loadPath = path.join(__dirname, 'load.ts'); + const loadContent = await readFile(loadPath, 'utf-8'); + const transformedContent = loadContent.replace( + /\.\/src\/(.*)\.js/, + './dist/src/$1.js', + ); + await writeFile(loadPath, transformedContent); + + await tscTask({ + project: 'tsconfig.load.json', + rootDir: '.', + outDir: '.', + })(); + + await babelTransformTask({ + src: 'load.ts', + dst: '.', + })(); + + await writeFile(loadPath, loadContent); + }; +} + function babelTransformTask(opts) { return () => { const args = [ diff --git a/javascript/load.ts b/javascript/load.ts new file mode 100644 index 0000000000..1c71bfb5b2 --- /dev/null +++ b/javascript/load.ts @@ -0,0 +1 @@ +export * from './src/load.js'; diff --git a/javascript/package.json b/javascript/package.json index 32e77d586b..7bd7018dc8 100644 --- a/javascript/package.json +++ b/javascript/package.json @@ -19,7 +19,8 @@ "files": [ "dist/binaries/**", "dist/src/**", - "src/**" + "src/**", + "load.*" ], "scripts": { "benchmark": "just benchmark --config just.config.cjs", diff --git a/javascript/src/index.ts b/javascript/src/index.ts index 3028b225a0..0af93a36a6 100644 --- a/javascript/src/index.ts +++ b/javascript/src/index.ts @@ -9,15 +9,15 @@ // @ts-ignore untyped from Emscripten import loadYoga from '../binaries/yoga-wasm-base64-esm.js'; -import wrapAssembly from './wrapAssembly.ts'; +import wrapAssembly from './wrapAssembly.js'; export type { Config, DirtiedFunction, MeasureFunction, Node, -} from './wrapAssembly.ts'; +} from './wrapAssembly.js'; const Yoga = wrapAssembly(await loadYoga()); export default Yoga; -export * from './generated/YGEnums.ts'; +export * from './generated/YGEnums.js'; diff --git a/javascript/src/load.ts b/javascript/src/load.ts index a415a0dd71..7a0e825607 100644 --- a/javascript/src/load.ts +++ b/javascript/src/load.ts @@ -9,7 +9,7 @@ // @ts-ignore untyped from Emscripten import loadYogaImpl from '../binaries/yoga-wasm-base64-esm.js'; -import wrapAssembly from './wrapAssembly.ts'; +import wrapAssembly from './wrapAssembly.js'; export type { Config, @@ -17,9 +17,9 @@ export type { MeasureFunction, Node, Yoga, -} from './wrapAssembly.ts'; +} from './wrapAssembly.js'; export async function loadYoga() { return wrapAssembly(await loadYogaImpl()); } -export * from './generated/YGEnums.ts'; +export * from './generated/YGEnums.js'; diff --git a/javascript/src/wrapAssembly.ts b/javascript/src/wrapAssembly.ts index 9b2dc1e6ec..6ff0e3d611 100644 --- a/javascript/src/wrapAssembly.ts +++ b/javascript/src/wrapAssembly.ts @@ -9,8 +9,8 @@ // @ts-nocheck -import {Unit, Direction} from './generated/YGEnums.ts'; -import YGEnums from './generated/YGEnums.ts'; +import {Unit, Direction} from './generated/YGEnums.js'; +import YGEnums from './generated/YGEnums.js'; import type { Align, @@ -26,7 +26,7 @@ import type { Overflow, PositionType, Wrap, -} from './generated/YGEnums.ts'; +} from './generated/YGEnums.js'; type Layout = { left: number; diff --git a/javascript/tsconfig.load.json b/javascript/tsconfig.load.json new file mode 100644 index 0000000000..cf4babc226 --- /dev/null +++ b/javascript/tsconfig.load.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": ".", + "emitDeclarationOnly": true + }, + "files": ["load.ts"], + "exclude": ["tests/**/*", "src/**/*"] +} diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 2e2a8b1e22..328def342c 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -110,4 +110,5 @@ export default { }, ], }), + plugins: [require.resolve('./plugins/webpack-config.js')], }; diff --git a/website/plugins/webpack-config.js b/website/plugins/webpack-config.js new file mode 100644 index 0000000000..2a2a4e0baa --- /dev/null +++ b/website/plugins/webpack-config.js @@ -0,0 +1,21 @@ +/** @type {import('@docusaurus/types').PluginModule} */ +// eslint-disable-next-line no-unused-vars +export default function webpackPlugin(context, options) { + return { + name: 'webpack-config-plugin', + configureWebpack(config) { + const resolve = config?.resolve ?? {}; + const extensionAlias = resolve?.extensionAlias ?? {}; + + return { + resolve: { + ...resolve, + extensionAlias: { + ...extensionAlias, + '.js': ['.ts', '.js'], + }, + }, + }; + }, + }; +}