Skip to content

Commit

Permalink
Fixup TypeScript with export maps (#1284)
Browse files Browse the repository at this point in the history
Summary:
Pull Request resolved: #1284

This makes TypeScript resolution play nicely with export maps, and converts the entrypoints to TypeScript.

We remove the non-export-map fallbacks as well, so the export maps are always followed.

Tests are moved to load yoga from its external export, testing the entrypoints.

This moves the only untyped bit to the binary wrapper, which another diff will move.

Reviewed By: yungsters

Differential Revision: D45713689

fbshipit-source-id: 228e6f2c9d53520230707a81e76c3c35fcd46de5
  • Loading branch information
NickGerleman authored and facebook-github-bot committed May 10, 2023
1 parent 104646d commit af89315
Show file tree
Hide file tree
Showing 25 changed files with 183 additions and 176 deletions.
54 changes: 27 additions & 27 deletions javascript/.eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,65 +7,65 @@
* @format
*/

const path = require("path");
const path = require('path');

module.exports = {
root: true,
ignorePatterns: ["dist/**", "tests/generated/**"],
extends: ["eslint:recommended", "plugin:prettier/recommended"],
plugins: ["prettier"],
ignorePatterns: ['dist/**', 'tests/generated/**'],
extends: ['eslint:recommended', 'plugin:prettier/recommended'],
plugins: ['prettier'],
rules: {
"no-var": "error",
"prefer-arrow-callback": "error",
"prefer-const": "error",
"prefer-object-spread": "error",
"prefer-spread": "error",
"require-await": "error",
'no-var': 'error',
'prefer-arrow-callback': 'error',
'prefer-const': 'error',
'prefer-object-spread': 'error',
'prefer-spread': 'error',
'require-await': 'error',
},
env: {
commonjs: true,
es2018: true,
},
overrides: [
{
files: ["**/*.js"],
parser: "@babel/eslint-parser",
files: ['**/*.js'],
parser: '@babel/eslint-parser',
parserOptions: {
babelOptions: {
configFile: path.join(__dirname, ".babelrc.js"),
configFile: path.join(__dirname, '.babelrc.js'),
},
},
},
{
files: ["**/*.ts"],
extends: ["plugin:@typescript-eslint/recommended"],
parser: "@typescript-eslint/parser",
files: ['**/*.ts'],
extends: ['plugin:@typescript-eslint/recommended'],
parser: '@typescript-eslint/parser',
parserOptions: {
project: path.join(__dirname, "tsconfig.json"),
project: path.join(__dirname, 'tsconfig.json'),
},
plugins: ["@typescript-eslint"],
plugins: ['@typescript-eslint'],
rules: {
"@typescript-eslint/no-var-requires": "off",
'@typescript-eslint/no-var-requires': 'off',
},
},
{
files: ["**/.eslintrc.js", "**/just.config.js"],
files: ['**/.eslintrc.js', '**/just.config.js'],
env: {
node: true,
},
},
{
files: ["jest.*", "tests/**"],
files: ['jest.*', 'tests/**'],
env: {
node: true,
},
extends: ["plugin:jest/recommended"],
extends: ['plugin:jest/recommended'],
globals: {
getMeasureCounter: "writable",
getMeasureCounterMax: "writable",
getMeasureCounterMin: "writable",
Yoga: "writable",
YGBENCHMARK: "writable",
getMeasureCounter: 'writable',
getMeasureCounterMax: 'writable',
getMeasureCounterMin: 'writable',
Yoga: 'writable',
YGBENCHMARK: 'writable',
},
},
],
Expand Down
1 change: 1 addition & 0 deletions javascript/.gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/binaries
/build
/dist
/node_modules
2 changes: 1 addition & 1 deletion javascript/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ link_libraries(embind)

add_library(yogaObjLib OBJECT ${SOURCES})

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dist/build)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/binaries)

add_executable(asmjs-sync $<TARGET_OBJECTS:yogaObjLib>)
target_link_options(asmjs-sync PUBLIC
Expand Down
2 changes: 1 addition & 1 deletion javascript/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ For better performance and smaller packages, WebAssembly is preferred to asm.js
A specific entrypoint may be specified on platforms which do not understand export conditions.

```ts
import {loadYoga} from 'yoga-layout/dist/entrypoint/wasm-async';
import {loadYoga} from 'yoga-layout/wasm-async';
```


Expand Down
8 changes: 4 additions & 4 deletions javascript/jest.setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@

module.exports = async () => {
if (process.env['SYNC'] === '1' && process.env['WASM'] === '1') {
globalThis.Yoga = require('./dist/entrypoint/wasm-sync');
globalThis.Yoga = require('yoga-layout/wasm-sync').default;
} else if (process.env['SYNC'] === '1') {
globalThis.Yoga = require('./dist/entrypoint/asmjs-sync');
globalThis.Yoga = require('yoga-layout/asmjs-sync').default;
} else if (process.env['WASM'] === '1') {
globalThis.Yoga = await require('./dist/entrypoint/wasm-async').loadYoga();
globalThis.Yoga = await require('yoga-layout/wasm-async').loadYoga();
} else {
globalThis.Yoga = await require('./dist/entrypoint/asmjs-async').loadYoga();
globalThis.Yoga = await require('yoga-layout/asmjs-async').loadYoga();
}
};

Expand Down
33 changes: 29 additions & 4 deletions javascript/just.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ import {
tscTask,
} from 'just-scripts';

import {readFile, writeFile} from 'fs/promises';

import glob from 'glob';
import path from 'path';
import which from 'which';
Expand Down Expand Up @@ -84,15 +86,38 @@ task(
),
);

task('prepack-package-json', async () => {
const packageJsonPath = path.join(__dirname, 'package.json');
const packageJsonContents = await readFile(packageJsonPath);
const packageJson = JSON.parse(packageJsonContents.toString('utf-8'));

recursiveReplace(packageJson, /(.\/src\/.*)\.ts/, '$1.js');
await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));
});

task(
'prepublish',
parallel(
'build',
tscTask({emitDeclarationOnly: true}),
'prepack',
series(
parallel('build', tscTask({emitDeclarationOnly: true})),
babelTransformTask({dir: 'src'}),
'prepack-package-json',
),
);

function recursiveReplace(
obj: Record<string, unknown>,
pattern: RegExp,
replacement: string,
) {
for (const [key, value] of Object.entries(obj)) {
if (typeof value === 'string') {
obj[key] = value.replace(pattern, replacement);
} else if (typeof value === 'object' && value != null) {
recursiveReplace(value as Record<string, unknown>, pattern, replacement);
}
}
}

function babelTransformTask(opts: {dir: string}) {
return () => {
const args = [
Expand Down
24 changes: 13 additions & 11 deletions javascript/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,24 @@
"type": "git",
"url": "git@github.com:facebook/yoga.git"
},
"main": "./src/index.js",
"types": "./src/index.d.ts",
"exports": {
".": {
"browser": "./src/entrypoint/wasm-async.js",
"node": "./src/entrypoint/wasm-async.js",
"default": "./src/entrypoint/asmjs-async.js"
"browser": "./src/entrypoint/wasm-async.ts",
"node": "./src/entrypoint/wasm-async.ts",
"default": "./src/entrypoint/asmjs-async.ts"
},
"./sync": {
"browser": "./src/entrypoint/asmjs-sync.js",
"node": "./src/entrypoint/wasm-sync.js",
"default": "./src/entrypoint/asmjs-sync.js"
}
"browser": "./src/entrypoint/asmjs-sync.ts",
"node": "./src/entrypoint/wasm-sync.ts",
"default": "./src/entrypoint/asmjs-sync.ts"
},
"./asmjs-async": "./src/entrypoint/asmjs-async.ts",
"./asmjs-sync": "./src/entrypoint/asmjs-sync.ts",
"./wasm-async": "./src/entrypoint/wasm-async.ts",
"./wasm-sync": "./src/entrypoint/wasm-sync.ts"
},
"files": [
"dist/**",
"binaries/**",
"src/**"
],
"scripts": {
Expand All @@ -31,7 +33,7 @@
"clean": "just clean",
"lint": "just lint",
"lint:fix": "just lint --fix",
"prepublish": "just prepublish",
"prepack": "just prepack",
"test": "just test",
"test:asmjs-async": "just test:asmjs-async",
"test:asmjs-sync": "just test:asmjs-sync",
Expand Down
15 changes: 0 additions & 15 deletions javascript/src/entrypoint/_entryAsync.js

This file was deleted.

11 changes: 0 additions & 11 deletions javascript/src/entrypoint/_entrySync.js

This file was deleted.

11 changes: 0 additions & 11 deletions javascript/src/entrypoint/asmjs-async.js

This file was deleted.

26 changes: 26 additions & 0 deletions javascript/src/entrypoint/asmjs-async.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/

import wrapAssembly from '../wrapAssembly';
import type {Yoga} from '../wrapAssembly';

export * from '../generated/YGEnums';
export type {
Config,
DirtiedFunction,
MeasureFunction,
Node,
Yoga,
} from '../wrapAssembly';

const loadAssembly = require('../../binaries/asmjs-async');

export async function loadYoga(): Promise<Yoga> {
return wrapAssembly(await loadAssembly());
}
11 changes: 0 additions & 11 deletions javascript/src/entrypoint/asmjs-sync.js

This file was deleted.

23 changes: 23 additions & 0 deletions javascript/src/entrypoint/asmjs-sync.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/

import wrapAssembly from '../wrapAssembly';

export * from '../generated/YGEnums';
export type {
Config,
DirtiedFunction,
MeasureFunction,
Node,
Yoga,
} from '../wrapAssembly';

const loadAssembly = require('../../binaries/asmjs-sync');
const Yoga = wrapAssembly(loadAssembly());
export default Yoga;
11 changes: 0 additions & 11 deletions javascript/src/entrypoint/wasm-async.js

This file was deleted.

26 changes: 26 additions & 0 deletions javascript/src/entrypoint/wasm-async.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/

import wrapAssembly from '../wrapAssembly';
import type {Yoga} from '../wrapAssembly';

export * from '../generated/YGEnums';
export type {
Config,
DirtiedFunction,
MeasureFunction,
Node,
Yoga,
} from '../wrapAssembly';

const loadAssembly = require('../../binaries/wasm-async');

export async function loadYoga(): Promise<Yoga> {
return wrapAssembly(await loadAssembly());
}
11 changes: 0 additions & 11 deletions javascript/src/entrypoint/wasm-sync.js

This file was deleted.

Loading

0 comments on commit af89315

Please sign in to comment.