Skip to content

Allow esm in JS libraries? #22997

@toyobayashi

Description

@toyobayashi

Ref:

With this TypeScript custom transformer and rollup plugin, the JS library can be written in ES Module:

inputoutput
export function x () {
  return 42
}
function _x() {
  return 42
}
(typeof addToLibrary === "function"
  ? addToLibrary :
  (...args) => mergeInto(
    LibraryManager.library, ...args)
)({
  x: _x
})
export function $x () {
  return 42
}
function x() {
  return 42
}
(typeof addToLibrary === "function"
  ? addToLibrary :
  (...args) => mergeInto(
    LibraryManager.library, ...args)
)({
  $x: x
})
export const x = getX()

function getX() {
  return 42
}
const _x = getX()
function getX() {
    return 42;
}
(typeof addToLibrary === "function"
  ? addToLibrary :
  (...args) => mergeInto(
    LibraryManager.library, ...args)
)({
  $getX: getX,
  x: "getX()",
  x__deps: ["$getX"]
});
const localVar = 10

function f () {
  console.log(localVar)
}

function localFunc() {
  f()
  console.log(localVar)
}

export {
  localVar as exportedVar,
  localFunc as exportedFunc
}
const _exportedVar = 10
function f() {
  console.log(_exportedVar)
}
function _exportedFunc() {
  f()
  console.log(_exportedVar)
}
(typeof addToLibrary === "function"
  ? addToLibrary :
  (...args) => mergeInto(
    LibraryManager.library, ...args)
)({
  exportedVar: "10",
  $f: f,
  $f__deps: ["exportedVar"],
  exportedFunc: _exportedFunc,
  exportedFunc__deps: ["$f", "exportedVar"]
})
/** @__deps $external */
export function x() {}

/**
 * @__deps emscripten_resize_heap
 * @__deps $runtimeKeepalivePush
 * @__deps $runtimeKeepalivePop
 * @__sig v
 * @__postset
 * ```
 * console.log(42);
 * console.log(_y);
 * ```
 *
 * @returns {void}
 */
export function y() {
  runtimeKeepalivePush()
  runtimeKeepalivePop()
  _emscripten_resize_heap()
  return x()
}
/** @__deps $external */
function _x() { }
/**
 * @__deps emscripten_resize_heap
 * @__deps $runtimeKeepalivePush
 * @__deps $runtimeKeepalivePop
 * @__sig v
 * @__postset
 * ```
 * console.log(42);
 * console.log(_y);
 * ```
 *
 * @returns {void}
 */
function _y() {
  runtimeKeepalivePush()
  runtimeKeepalivePop()
  _emscripten_resize_heap()
  return _x()
}
(typeof addToLibrary === "function"
  ? addToLibrary :
  (...args) => mergeInto(
    LibraryManager.library, ...args)
)({
  x: _x,
  x__deps: ["$external"],
  y: _y,
  y__deps: [
    "x",
    "emscripten_resize_heap",
    "$runtimeKeepalivePush",
    "$runtimeKeepalivePop"
  ],
  y__sig: "v",
  y__postset: "console.log(42);\nconsole.log(_y);"
})
export function getPointerSize () {
  let result
  // #if MEMORY64
  result = 8
  // #else
  result = 4
  // #endif
  return result
}
function _getPointerSize() {
  let result
#if MEMORY64
  result = 8
#else
  result = 4
#endif
  return result
}
(typeof addToLibrary === "function"
  ? addToLibrary :
  (...args) => mergeInto(
    LibraryManager.library, ...args)
)({
  getPointerSize: _getPointerSize
})
import {
  from64,
  makeSetValue,
  SIZE_TYPE,
  POINTER_SIZE
} from 'emscripten:parse-tools'
import {
  wasmMemory,
  HEAPU8
} from 'emscripten:runtime'

export function getPointerSize (ret) {
  from64('ret')
  makeSetValue('ret', 0, POINTER_SIZE, SIZE_TYPE)
  console.log(HEAPU8.buffer === wasmMemory.buffer)
  return POINTER_SIZE
}
function _getPointerSize(ret) {
  {{{ from64('ret') }}}
  {{{ makeSetValue('ret', 0, POINTER_SIZE, SIZE_TYPE) }}}
  console.log(HEAPU8.buffer === wasmMemory.buffer)
  return {{{ POINTER_SIZE }}}
}
(typeof addToLibrary === "function"
  ? addToLibrary :
  (...args) => mergeInto(
    LibraryManager.library, ...args)
)({
  getPointerSize: _getPointerSize
});

Does emscripten can officially support things like this?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions