Files
Umbraco-CMS/src/Umbraco.Web.UI.Client/libs/extensions-api/create-extension-element.function.ts
Jacob Overgaard 62f3c2d6fa Feature/server packages v2 (#574)
* new api models

* use new PackageResource

* do not error out on missing default exports (esmodules auto-execute)

* do not check for js extensions (they might have been registered on the client without a js file)

* prepend the api baseurl to any relataive server JS dependencies

* ignore tsbuildinfo

* create base file for tsconfig

* extend from base config and optimise include/exclude paths

* install rollup plugin to handle json files

* use plugin to bundle json files

* call script for cms builds that builds libs

* add rollup config to utils lib

* add a context token to the extension registry instance itself and provide it through BackofficeElement

* add rollup node resolve

* add node resolve

* only include element mixin in element library

* add error description to module load error

* add types to UmbExtensionRegistry token

* set UmbNotificationService as string in its token to avoid minification

* correct comment

* reverse order of checks

* add host to server extensions and support life-cycle check

* add imports

* use lit rather than lit-html

* correct comment

* add PackageManifestModel

* add import

* run libs build for cms

* revert reorder

* use string name for NotificationContext token

* make alias public readonly of UmbContextToken

* remove TODO

* use UmbContextToken::toString() for all stores

* use string alias for contexts

* move default data so we avoid importing a big lit library just to get default data interface

* add rollup to two extra libraries

* make sure we build uui and lit into our libraries for the few cases we import something

* add lockfile

* add separate options for .js files

* add function to install types of module

* add types output

* remove unused tsconfig-base file for now
2023-03-02 20:29:20 +01:00

32 lines
1.3 KiB
TypeScript

import type { HTMLElementConstructor, ManifestElement } from '../models';
import { hasDefaultExport } from './has-default-export.function';
import { isManifestElementNameType } from './is-manifest-element-name-type.function';
import { loadExtension } from './load-extension.function';
export async function createExtensionElement(manifest: ManifestElement): Promise<HTMLElement | undefined> {
//TODO: Write tests for these extension options:
const js = await loadExtension(manifest);
if (isManifestElementNameType(manifest)) {
// created by manifest method providing HTMLElement
return document.createElement(manifest.elementName);
}
// TODO: Do we need this except for the default() loader?
if (js) {
if (hasDefaultExport<HTMLElementConstructor>(js)) {
// created by default class
return new js.default();
}
console.error('-- Extension did not succeed creating an element, missing a default export of the served JavaScript file', manifest);
// If some JS was loaded and it did not at least contain a default export, then we are safe to assume that it executed its side effects and does not need to be returned
return undefined;
}
console.error('-- Extension did not succeed creating an element, missing a default export or `elementName` in the manifest.', manifest);
return undefined;
}