V14: generate dynamic importmap (#15710)

* register a new IPackageManifestReader to allow to scan the /umbraco/backoffice path for umbraco packages

* add constant

* add logic to extract the importmap from umbraco package manifests

* add html helper to render an importmap

* replace static importmap with new dynamic importmap

* update tests and be more specific about scopes

* remove recursion from PackageManifestReader.cs

* add extra test to validate the importmap

* combine all string manipulation to produce an importmap into HtmlHelperBackOfficeExtensions.cs

* rename IStaticFileHostGenerator to something reflecting its actual usage, and also fix the file names

* use auto properties where applicable

* add getter for BackOfficeHash and use to simplify BackofficeAssetsPath

* ensure BackOffice is always spelled with capital O

* add a way to replace the cachebuster for assets imported through an importmap and ensure magic strings are encapsulated into business logic or constants

* Review changes

* convert primary constructors to explicit and add comments

* convert primary constructor to explicit

---------

Co-authored-by: kjac <kja@umbraco.dk>
This commit is contained in:
Jacob Overgaard
2024-02-15 15:23:01 +01:00
committed by GitHub
parent cc082e191c
commit d0145ed7e9
20 changed files with 312 additions and 357 deletions

View File

@@ -1,20 +1,15 @@
@using System.Globalization
@using Microsoft.Extensions.Options
@using Umbraco.Cms.Core.Configuration.Models
@using Umbraco.Cms.Core.Hosting
@using Umbraco.Cms.Core.Manifest
@using Umbraco.Cms.Core.Serialization
@using Umbraco.Cms.Web.Common.Hosting
@using Umbraco.Extensions
@inject IHostingEnvironment HostingEnvironment
@inject IOptions<GlobalSettings> GlobalSettings
@inject IStaticFilePathGenerator StaticFilePathGenerator
@inject IBackOfficePathGenerator BackOfficePathGenerator
@inject IPackageManifestService PackageManifestService
@inject IJsonSerializer JsonSerializer
@{
var backOfficePath = GlobalSettings.Value.GetBackOfficePath(HostingEnvironment);
var backofficeAssetsPath = StaticFilePathGenerator.BackofficeAssetsPath;
}
@functions {
private static string ImportMapValue(string alias, string path) => $"\"{alias}\": \"{path}\"";
var backOfficePath = BackOfficePathGenerator.BackOfficePath;
var backOfficeAssetsPath = BackOfficePathGenerator.BackOfficeAssetsPath;
}
<!DOCTYPE html>
@@ -23,126 +18,13 @@
<head>
<base href="@backOfficePath.EnsureEndsWith('/')" />
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="@backofficeAssetsPath/assets/favicon.svg" />
<link rel="icon" type="image/svg+xml" href="@backOfficeAssetsPath/assets/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Umbraco</title>
<link rel="stylesheet" href="@backofficeAssetsPath/css/umb-css.css" />
<link rel="stylesheet" href="@backofficeAssetsPath/css/uui-css.css" />
<script type="importmap">
{
"imports": {
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/app", backofficeAssetsPath + "/apps/app/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/backend-api", backofficeAssetsPath + "/external/backend-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/lit", backofficeAssetsPath + "/external/lit/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/lodash", backofficeAssetsPath + "/external/lodash/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/monaco-editor", backofficeAssetsPath + "/external/monaco-editor/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/openid", backofficeAssetsPath + "/external/openid/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/router-slot", backofficeAssetsPath + "/external/router-slot/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/rxjs", backofficeAssetsPath + "/external/rxjs/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/tinymce", backofficeAssetsPath + "/external/tinymce/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/uui", backofficeAssetsPath + "/external/uui/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/uuid", backofficeAssetsPath + "/external/uuid/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/dompurify", backofficeAssetsPath + "/external/dompurify/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/marked", backofficeAssetsPath + "/external/marked/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/class-api", backofficeAssetsPath + "/libs/class-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/context-api", backofficeAssetsPath + "/libs/context-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/controller-api", backofficeAssetsPath + "/libs/controller-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/element-api", backofficeAssetsPath + "/libs/element-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/extension-api", backofficeAssetsPath + "/libs/extension-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/localization-api", backofficeAssetsPath + "/libs/localization-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/observable-api", backofficeAssetsPath + "/libs/observable-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/auth", backofficeAssetsPath + "/shared/auth/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/event", backofficeAssetsPath + "/packages/core/event/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/lit-element", backofficeAssetsPath + "/packages/core/lit-element/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/icon", backofficeAssetsPath + "/shared/icon-registry/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/models", backofficeAssetsPath + "/shared/models/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/resources", backofficeAssetsPath + "/shared/resources/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/router", backofficeAssetsPath + "/shared/router/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/style", backofficeAssetsPath + "/shared/style/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/utils", backofficeAssetsPath + "/shared/utils/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/action", backofficeAssetsPath + "/packages/core/action/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/collection", backofficeAssetsPath + "/packages/core/collection/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/components", backofficeAssetsPath + "/packages/core/components/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/content-type", backofficeAssetsPath + "/packages/core/content-type/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/culture", backofficeAssetsPath + "/packages/core/culture/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/data-type", backofficeAssetsPath + "/packages/core/data-type/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/debug", backofficeAssetsPath + "/packages/core/debug/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/entity-action", backofficeAssetsPath + "/packages/core/entity-action/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/entity-bulk-action", backofficeAssetsPath + "/packages/core/entity-bulk-action/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/extension-registry", backofficeAssetsPath + "/packages/core/extension-registry/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/server-file-system", backofficeAssetsPath + "/packages/core/server-file-system/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/id", backofficeAssetsPath + "/packages/core/id/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/localization", backofficeAssetsPath + "/packages/core/localization/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/menu", backofficeAssetsPath + "/packages/core/menu/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/modal", backofficeAssetsPath + "/packages/core/modal/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/notification", backofficeAssetsPath + "/packages/core/notification/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/picker-input", backofficeAssetsPath + "/packages/core/picker-input/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/property", backofficeAssetsPath + "/packages/core/property/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/property-action", backofficeAssetsPath + "/packages/core/property-action/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/property-editor", backofficeAssetsPath + "/packages/core/property-editor/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/section", backofficeAssetsPath + "/packages/core/section/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/sorter", backofficeAssetsPath + "/packages/core/sorter/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/store", backofficeAssetsPath + "/packages/core/store/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/themes", backofficeAssetsPath + "/packages/core/themes/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/tree", backofficeAssetsPath + "/packages/core/tree/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/variant", backofficeAssetsPath + "/packages/core/variant/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/workspace", backofficeAssetsPath + "/packages/core/workspace/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/repository", backofficeAssetsPath + "/packages/core/repository/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/temporary-file", backofficeAssetsPath + "/packages/core/temporary-file/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/block", backofficeAssetsPath + "/packages/block/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/audit-log", backofficeAssetsPath + "/packages/audit-log/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/dictionary", backofficeAssetsPath + "/packages/dictionary/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/document", backofficeAssetsPath + "/packages/documents/documents/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/document-blueprint", backofficeAssetsPath + "/packages/documents/document-blueprints/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/document-type", backofficeAssetsPath + "/packages/documents/document-types/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/media", backofficeAssetsPath + "/packages/media/media/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/media-type", backofficeAssetsPath + "/packages/media/media-types/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/member", backofficeAssetsPath + "/packages/members/members/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/member-group", backofficeAssetsPath + "/packages/members/member-groups/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/member-type", backofficeAssetsPath + "/packages/members/member-types/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/package", backofficeAssetsPath + "/packages/packages/package/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/language", backofficeAssetsPath + "/packages/language/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/dynamic-root", backofficeAssetsPath + "/packages/dynamic-root/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/log-viewer", backofficeAssetsPath + "/packages/packages/log-viewer/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/relation-types", backofficeAssetsPath + "/packages/settings/relation-types/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/relations", backofficeAssetsPath + "/packages/settings/relations/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/tags", backofficeAssetsPath + "/packages/tags/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/static-file", backofficeAssetsPath + "/packages/static-file/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/partial-view", backofficeAssetsPath + "/packages/templating/partial-views/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/stylesheet", backofficeAssetsPath + "/packages/templating/stylesheets/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/template", backofficeAssetsPath + "/packages/templating/templates/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/user-group", backofficeAssetsPath + "/packages/user/user-group/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/current-user", backofficeAssetsPath + "/packages/user/current-user/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/user", backofficeAssetsPath + "/packages/user/user/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/user-permission", backofficeAssetsPath + "/packages/user/user-permission/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/code-editor", backofficeAssetsPath + "/packages/templating/code-editor/index.js"))
}
}
</script>
<script type="module" src="@backofficeAssetsPath/apps/app/app.element.js"></script>
<link rel="stylesheet" href="@backOfficeAssetsPath/css/umb-css.css" />
<link rel="stylesheet" href="@backOfficeAssetsPath/css/uui-css.css" />
@await Html.BackOfficeImportMapScriptAsync(JsonSerializer, BackOfficePathGenerator, PackageManifestService)
<script type="module" src="@backOfficeAssetsPath/apps/app/app.element.js"></script>
</head>
<body class="uui-font uui-text" style="margin: 0; padding: 0; overflow: hidden">

View File

@@ -1,20 +1,15 @@
@using System.Globalization
@using Microsoft.Extensions.Options
@using Umbraco.Cms.Core.Configuration.Models
@using Umbraco.Cms.Core.Hosting
@using Umbraco.Cms.Core.Manifest
@using Umbraco.Cms.Core.Serialization
@using Umbraco.Cms.Web.Common.Hosting
@using Umbraco.Extensions
@inject IHostingEnvironment HostingEnvironment
@inject IOptions<GlobalSettings> GlobalSettings
@inject IStaticFilePathGenerator StaticFilePathGenerator
@inject IBackOfficePathGenerator BackOfficePathGenerator
@inject IPackageManifestService PackageManifestService
@inject IJsonSerializer JsonSerializer
@{
var backOfficePath = GlobalSettings.Value.GetBackOfficePath(HostingEnvironment);
var backofficeAssetsPath = StaticFilePathGenerator.BackofficeAssetsPath;
}
@functions {
private static string ImportMapValue(string alias, string path) => $"\"{alias}\": \"{path}\"";
var backOfficePath = BackOfficePathGenerator.BackOfficePath;
var backOfficeAssetsPath = BackOfficePathGenerator.BackOfficeAssetsPath;
}
<!DOCTYPE html>
@@ -23,126 +18,13 @@
<head>
<base href="@backOfficePath.EnsureEndsWith('/')" />
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="@backofficeAssetsPath/assets/favicon.svg" />
<link rel="icon" type="image/svg+xml" href="@backOfficeAssetsPath/assets/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Umbraco</title>
<link rel="stylesheet" href="@backofficeAssetsPath/css/umb-css.css" />
<link rel="stylesheet" href="@backofficeAssetsPath/css/uui-css.css" />
<script type="importmap">
{
"imports": {
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/app", backofficeAssetsPath + "/apps/app/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/backend-api", backofficeAssetsPath + "/external/backend-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/lit", backofficeAssetsPath + "/external/lit/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/lodash", backofficeAssetsPath + "/external/lodash/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/monaco-editor", backofficeAssetsPath + "/external/monaco-editor/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/openid", backofficeAssetsPath + "/external/openid/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/router-slot", backofficeAssetsPath + "/external/router-slot/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/rxjs", backofficeAssetsPath + "/external/rxjs/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/tinymce", backofficeAssetsPath + "/external/tinymce/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/uui", backofficeAssetsPath + "/external/uui/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/uuid", backofficeAssetsPath + "/external/uuid/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/dompurify", backofficeAssetsPath + "/external/dompurify/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/external/marked", backofficeAssetsPath + "/external/marked/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/class-api", backofficeAssetsPath + "/libs/class-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/context-api", backofficeAssetsPath + "/libs/context-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/controller-api", backofficeAssetsPath + "/libs/controller-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/element-api", backofficeAssetsPath + "/libs/element-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/extension-api", backofficeAssetsPath + "/libs/extension-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/localization-api", backofficeAssetsPath + "/libs/localization-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/observable-api", backofficeAssetsPath + "/libs/observable-api/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/auth", backofficeAssetsPath + "/shared/auth/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/event", backofficeAssetsPath + "/packages/core/event/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/lit-element", backofficeAssetsPath + "/packages/core/lit-element/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/icon", backofficeAssetsPath + "/shared/icon-registry/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/models", backofficeAssetsPath + "/shared/models/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/resources", backofficeAssetsPath + "/shared/resources/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/router", backofficeAssetsPath + "/shared/router/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/style", backofficeAssetsPath + "/shared/style/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/utils", backofficeAssetsPath + "/shared/utils/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/action", backofficeAssetsPath + "/packages/core/action/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/collection", backofficeAssetsPath + "/packages/core/collection/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/components", backofficeAssetsPath + "/packages/core/components/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/content-type", backofficeAssetsPath + "/packages/core/content-type/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/culture", backofficeAssetsPath + "/packages/core/culture/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/data-type", backofficeAssetsPath + "/packages/core/data-type/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/debug", backofficeAssetsPath + "/packages/core/debug/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/entity-action", backofficeAssetsPath + "/packages/core/entity-action/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/entity-bulk-action", backofficeAssetsPath + "/packages/core/entity-bulk-action/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/extension-registry", backofficeAssetsPath + "/packages/core/extension-registry/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/server-file-system", backofficeAssetsPath + "/packages/core/server-file-system/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/id", backofficeAssetsPath + "/packages/core/id/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/localization", backofficeAssetsPath + "/packages/core/localization/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/menu", backofficeAssetsPath + "/packages/core/menu/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/modal", backofficeAssetsPath + "/packages/core/modal/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/notification", backofficeAssetsPath + "/packages/core/notification/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/picker-input", backofficeAssetsPath + "/packages/core/picker-input/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/property", backofficeAssetsPath + "/packages/core/property/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/property-action", backofficeAssetsPath + "/packages/core/property-action/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/property-editor", backofficeAssetsPath + "/packages/core/property-editor/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/section", backofficeAssetsPath + "/packages/core/section/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/sorter", backofficeAssetsPath + "/packages/core/sorter/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/store", backofficeAssetsPath + "/packages/core/store/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/themes", backofficeAssetsPath + "/packages/core/themes/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/tree", backofficeAssetsPath + "/packages/core/tree/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/variant", backofficeAssetsPath + "/packages/core/variant/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/workspace", backofficeAssetsPath + "/packages/core/workspace/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/repository", backofficeAssetsPath + "/packages/core/repository/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/temporary-file", backofficeAssetsPath + "/packages/core/temporary-file/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/block", backofficeAssetsPath + "/packages/block/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/audit-log", backofficeAssetsPath + "/packages/audit-log/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/dictionary", backofficeAssetsPath + "/packages/dictionary/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/document", backofficeAssetsPath + "/packages/documents/documents/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/document-blueprint", backofficeAssetsPath + "/packages/documents/document-blueprints/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/document-type", backofficeAssetsPath + "/packages/documents/document-types/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/media", backofficeAssetsPath + "/packages/media/media/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/media-type", backofficeAssetsPath + "/packages/media/media-types/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/member", backofficeAssetsPath + "/packages/members/members/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/member-group", backofficeAssetsPath + "/packages/members/member-groups/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/member-type", backofficeAssetsPath + "/packages/members/member-types/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/package", backofficeAssetsPath + "/packages/packages/package/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/language", backofficeAssetsPath + "/packages/language/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/dynamic-root", backofficeAssetsPath + "/packages/dynamic-root/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/log-viewer", backofficeAssetsPath + "/packages/packages/log-viewer/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/relation-types", backofficeAssetsPath + "/packages/settings/relation-types/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/relations", backofficeAssetsPath + "/packages/settings/relations/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/tags", backofficeAssetsPath + "/packages/tags/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/static-file", backofficeAssetsPath + "/packages/static-file/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/partial-view", backofficeAssetsPath + "/packages/templating/partial-views/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/stylesheet", backofficeAssetsPath + "/packages/templating/stylesheets/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/template", backofficeAssetsPath + "/packages/templating/templates/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/user-group", backofficeAssetsPath + "/packages/user/user-group/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/current-user", backofficeAssetsPath + "/packages/user/current-user/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/user", backofficeAssetsPath + "/packages/user/user/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/user-permission", backofficeAssetsPath + "/packages/user/user-permission/index.js")),
@Html.Raw(ImportMapValue("@umbraco-cms/backoffice/code-editor", backofficeAssetsPath + "/packages/templating/code-editor/index.js"))
}
}
</script>
<script type="module" src="@backofficeAssetsPath/apps/app/app.element.js"></script>
<link rel="stylesheet" href="@backOfficeAssetsPath/css/umb-css.css" />
<link rel="stylesheet" href="@backOfficeAssetsPath/css/uui-css.css" />
@await Html.BackOfficeImportMapScriptAsync(JsonSerializer, BackOfficePathGenerator, PackageManifestService)
<script type="module" src="@backOfficeAssetsPath/apps/app/app.element.js"></script>
</head>
<body class="uui-font uui-text" style="margin: 0; padding: 0; overflow: hidden">