Files
yoga/javascript
Nick Gerleman 19aed1d63e Lint and typecheck TypeScript (#1276)
Summary:
Pull Request resolved: https://github.com/facebook/yoga/pull/1276

This change starts to enlighten linting and other repo configuration to TypeScript. This was previously special-cased out of linting, and meant we were not linting everything. It is also a precondition to do real typechecking and linting our definitions with type information.

1. Add TypeScript dependencies
1. Configure ESLint, Babel, tsc for TypeScript
1. Run tsc as part of linting (OSS only for now)

This is continued in another change with adding types to scripts and config files, but more importantly converting hand-written tests and test generation to TypeScript, so we get real-world usage to typecheck against for testing.

Reviewed By: yungsters

Differential Revision: D45508576

fbshipit-source-id: 6d2e48b9d25bb6b1788440ea3515ea5f5c64d346
2023-05-04 08:11:04 -07:00
..
2023-05-03 16:11:20 -07:00
2022-12-28 01:27:12 -08:00
2023-02-20 19:54:03 -08:00
2022-12-28 01:27:12 -08:00

yoga-layout

This package provides prebuilt JavaScript bindings for the Yoga layout engine. Both WebAssembly and asm.js variants are packaged, with the optimal loaded based on platform.

Usage

The default entrypoint provides an asynchronous loader function to return a Yoga instance.

import { loadYoga, ALIGN_CENTER } from "yoga-layout";

const Yoga = await loadYoga();

const node = Yoga.Node.create();
node.setAlignContent(ALIGN_CENTER);

An alternative synchronous API is provided for compatibility, but requires using asm.js in browsers instead of WebAssembly, leading to worse performance and larger assets.

import Yoga, { ALIGN_CENTER } from "yoga-layout/sync";

const node = Yoga.Node.create();
node.setAlignContent(ALIGN_CENTER);

Objects created by Yoga.<>.create() are not automatically garbage collected and should be freed once they are no longer in use.

// Free a config
config.free();

// Free a tree of Nodes
node.freeRecursive();

// Free a single Node
node.free();

Selecting WebAssembly or asm.js

For better performance and smaller packages, WebAssembly is preferred to asm.js where available. yoga-layout tries to provide the right default using export maps so that platforms which can take advantage of WebAssembly use it by default.

A specific entrypoint may be specified on platforms which do not understand export conditions.

import { loadYoga } from "yoga-layout/dist/entrypoint/wasm-async";

Contributing

Requirements

  1. Emscripten SDK
  2. CMake >= 3.13
  3. (Optional) ninja, for faster builds

Building

git clone https://github.com/facebook/yoga.git
cd yoga/javascript
yarn install
yarn build

Testing

# Build and test all entrypoints
yarn test

# Build and test a specific entrypoint
yarn test:asmjs-sync