compartmentOptions = (...args) => {
  if (args.length === 0) {
    return {};
  }
  if (
    args.length === 1 &&
    typeof args[0] === 'object' &&
    args[0] !== null &&
    '__options__' in args[0]
  ) {
    const { __options__, ...options } = args[0];
    assert(
      __options__ === true,
      `Compartment constructor only supports true __options__ sigil, got ${__options__}`,
    );
    return options;
  } else {
    const [
      globals = /** @type {Map<string, any>} */ ({}),
      modules = /** @type {Map<string, ModuleDescriptor>} */ ({}),
      options = {},
    ] = /** @type {LegacyCompartmentOptionsArgs} */ (args);
    assertEqual(
      options.modules,
      undefined,
      `Compartment constructor must receive either a module map argument or modules option, not both`,
    );
    assertEqual(
      options.globals,
      undefined,
      `Compartment constructor must receive either globals argument or option, not both`,
    );
    return {
      ...options,
      globals,
      modules,
    };
  }
}
In order to facilitate migration from the deprecated signature of the
compartment constructor,

`new Compartent(globals?, modules?, options?)`

to the new signature:

`new Compartment(options?)`

...where globals and modules are expressed in the options bag instead of
positional arguments, this function detects the temporary sigil __options__
on the first argument and coerces compartments arguments into a single
compartments object.
@param {CompartmentOptionsArgs|LegacyCompartmentOptionsArgs} args
@returns {CompartmentOptions}