@flusys/ng-iam 9.1.0 → 9.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/fesm2022/flusys-ng-iam-action-form-page.component-DJ-A1gc2.mjs +685 -0
  2. package/fesm2022/flusys-ng-iam-action-form-page.component-DJ-A1gc2.mjs.map +1 -0
  3. package/fesm2022/{flusys-ng-iam-action-list-page.component-Cf4Dhh5S.mjs → flusys-ng-iam-action-list-page.component-Br0PbgRa.mjs} +369 -166
  4. package/fesm2022/flusys-ng-iam-action-list-page.component-Br0PbgRa.mjs.map +1 -0
  5. package/fesm2022/flusys-ng-iam-iam-container.component-CIdxVCSW.mjs +141 -0
  6. package/fesm2022/flusys-ng-iam-iam-container.component-CIdxVCSW.mjs.map +1 -0
  7. package/fesm2022/flusys-ng-iam-permission-api.service-C7-Yxvz8.mjs +76 -0
  8. package/fesm2022/flusys-ng-iam-permission-api.service-C7-Yxvz8.mjs.map +1 -0
  9. package/fesm2022/flusys-ng-iam-permission-page.component-BlNt83uR.mjs +306 -0
  10. package/fesm2022/flusys-ng-iam-permission-page.component-BlNt83uR.mjs.map +1 -0
  11. package/fesm2022/flusys-ng-iam-role-api.service-OwPgmSFc.mjs +33 -0
  12. package/fesm2022/flusys-ng-iam-role-api.service-OwPgmSFc.mjs.map +1 -0
  13. package/fesm2022/flusys-ng-iam-role-form-page.component-DnkWkbTF.mjs +427 -0
  14. package/fesm2022/flusys-ng-iam-role-form-page.component-DnkWkbTF.mjs.map +1 -0
  15. package/fesm2022/flusys-ng-iam-role-list-page.component-BCO_gQ8k.mjs +685 -0
  16. package/fesm2022/flusys-ng-iam-role-list-page.component-BCO_gQ8k.mjs.map +1 -0
  17. package/fesm2022/flusys-ng-iam-tree-utils-B1pBG4At.mjs +110 -0
  18. package/fesm2022/flusys-ng-iam-tree-utils-B1pBG4At.mjs.map +1 -0
  19. package/fesm2022/flusys-ng-iam-user-action-selector.component-CAXEmJWx.mjs +4592 -0
  20. package/fesm2022/flusys-ng-iam-user-action-selector.component-CAXEmJWx.mjs.map +1 -0
  21. package/fesm2022/flusys-ng-iam.mjs +2051 -2
  22. package/fesm2022/flusys-ng-iam.mjs.map +1 -1
  23. package/package.json +5 -5
  24. package/types/flusys-ng-iam.d.ts +621 -604
  25. package/fesm2022/flusys-ng-iam-action-form-page.component-Dn0TD1Zu.mjs +0 -509
  26. package/fesm2022/flusys-ng-iam-action-form-page.component-Dn0TD1Zu.mjs.map +0 -1
  27. package/fesm2022/flusys-ng-iam-action-list-page.component-Cf4Dhh5S.mjs.map +0 -1
  28. package/fesm2022/flusys-ng-iam-flusys-ng-iam-Y7U2lGZk.mjs +0 -5584
  29. package/fesm2022/flusys-ng-iam-flusys-ng-iam-Y7U2lGZk.mjs.map +0 -1
  30. package/fesm2022/flusys-ng-iam-iam-container.component-XBoIeQ0t.mjs +0 -105
  31. package/fesm2022/flusys-ng-iam-iam-container.component-XBoIeQ0t.mjs.map +0 -1
  32. package/fesm2022/flusys-ng-iam-permission-page.component-CCAQuZSJ.mjs +0 -204
  33. package/fesm2022/flusys-ng-iam-permission-page.component-CCAQuZSJ.mjs.map +0 -1
  34. package/fesm2022/flusys-ng-iam-role-form-page.component-EFjxhBRY.mjs +0 -352
  35. package/fesm2022/flusys-ng-iam-role-form-page.component-EFjxhBRY.mjs.map +0 -1
  36. package/fesm2022/flusys-ng-iam-role-list-page.component-DBfhjdkM.mjs +0 -486
  37. package/fesm2022/flusys-ng-iam-role-list-page.component-DBfhjdkM.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flusys-ng-iam-role-list-page.component-BCO_gQ8k.mjs","names":[],"sources":["../../../projects/ng-iam/pages/role/role-list-page.component.ts"],"sourcesContent":["import {\n Component,\n computed,\n effect,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport {\n APP_CONFIG,\n DEFAULT_APP_NAME,\n getPermissionMode,\n isCompanyFeatureEnabled,\n} from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport {\n HasPermissionDirective,\n ROLE_PERMISSIONS,\n TranslatePipe,\n TranslateService,\n USER_ROLE_PERMISSIONS,\n} from '@flusys/ng-shared';\nimport {\n ConfirmationService,\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n MessageService,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport { RolePermittedUsersDialogComponent } from '../../components/role-permitted-users-dialog.component';\nimport { IRole } from '../../interfaces/role.interface';\nimport { RoleApiService } from '../../services/role-api.service';\n\n@Component({\n selector: 'lib-role-list-page',\n imports: [\n FButtonDirective,\n FormsModule,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n HasPermissionDirective,\n RolePermittedUsersDialogComponent,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold\">\n {{ 'iam.role.title' | translate }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'iam.company.title' | translate }}: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <div class=\"flex flex-wrap items-center gap-2 w-full sm:w-auto\">\n <f-iconfield class=\"w-full sm:w-64\">\n <f-inputicon icon=\"search\" />\n <input\n fInputText\n type=\"text\"\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"onSearchChange($event)\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\n <button\n fButton\n *hasPermission=\"ROLE_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'iam.role.new' | translate }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <f-table\n [value]=\"roles()\"\n [loading]=\"isLoading()\"\n [paginator]=\"total() > 0\"\n [rows]=\"pageSize()\"\n [first]=\"first()\"\n [totalRecords]=\"total()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [scrollable]=\"true\"\n [tableStyle]=\"{ 'min-width': '40rem' }\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'iam.role.name' | translate }}</th>\n <th class=\"hidden md:table-cell\">\n {{ 'shared.description' | translate }}\n </th>\n <th>{{ 'shared.active' | translate }}</th>\n <th class=\"hidden sm:table-cell\">\n {{ 'shared.read.only' | translate }}\n </th>\n <th class=\"w-[120px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-role>\n <tr>\n <td>{{ role.name }}</td>\n <td class=\"hidden md:table-cell\">\n {{ role.description ?? '-' }}\n </td>\n <td>\n <f-tag\n [value]=\"\n role.isActive\n ? ('shared.active' | translate)\n : ('shared.inactive' | translate)\n \"\n [severity]=\"role.isActive ? 'success' : 'secondary'\"\n />\n </td>\n <td class=\"hidden sm:table-cell\">\n <f-tag\n [value]=\"\n role.readOnly\n ? ('shared.yes' | translate)\n : ('shared.no' | translate)\n \"\n [severity]=\"role.readOnly ? 'warn' : 'secondary'\"\n />\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n *hasPermission=\"ROLE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [disabled]=\"role.readOnly\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEdit(role)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n @if (showRoleUsers()) {\n <button\n fButton\n *hasPermission=\"USER_ROLE_PERMISSIONS.READ\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [fTooltip]=\"'iam.permission.view.users' | translate\"\n (click)=\"onViewUsers(role)\"\n >\n <ui-icon pButtonIcon name=\"users\"></ui-icon>\n </button>\n }\n <button\n fButton\n *hasPermission=\"ROLE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [fTooltip]=\"'shared.delete' | translate\"\n [disabled]=\"role.readOnly\"\n (click)=\"onDelete(role)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"5\" class=\"text-center py-4 text-muted-color\">\n {{ 'iam.role.no.roles' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n\n <flusys-role-permitted-users-dialog\n [visible]=\"permittedUsersDialogVisible()\"\n [role]=\"selectedRole()\"\n (closed)=\"permittedUsersDialogVisible.set(false)\"\n />\n `,\n})\nexport class RoleListPageComponent {\n readonly ROLE_PERMISSIONS = ROLE_PERMISSIONS;\n readonly USER_ROLE_PERMISSIONS = USER_ROLE_PERMISSIONS;\n\n private readonly router = inject(Router);\n private readonly appConfig = inject(APP_CONFIG);\n private readonly companyContext = inject(LAYOUT_AUTH_STATE);\n private readonly roleApi = inject(RoleApiService);\n private readonly messageService = inject(MessageService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly roles = signal<IRole[]>([]);\n readonly isLoading = signal(false);\n readonly total = signal(0);\n readonly pageSize = signal(10);\n readonly first = signal(0);\n private readonly _searchTerm = signal('');\n readonly searchTerm = this._searchTerm.asReadonly();\n readonly showCompanyInfo = computed(\n () => this.appConfig.enableCompanyFeature,\n );\n readonly showRoleUsers = computed(() => {\n const permissionMode = getPermissionMode(this.appConfig);\n return permissionMode === 'rbac' || permissionMode === 'full';\n });\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n readonly permittedUsersDialogVisible = signal(false);\n readonly selectedRole = signal<IRole | null>(null);\n\n private previousCompanyId: string | undefined | null = undefined;\n\n constructor() {\n effect(() => {\n const currentCompanyId =\n this.companyContext.currentCompanyInfo()?.id ?? null;\n if (this.previousCompanyId === undefined) {\n this.previousCompanyId = currentCompanyId;\n return;\n }\n if (this.previousCompanyId === currentCompanyId) return;\n this.previousCompanyId = currentCompanyId;\n untracked(() => {\n this.first.set(0);\n this.loadRoles();\n });\n });\n }\n\n private async loadRoles(): Promise<void> {\n this.isLoading.set(true);\n try {\n const enableCompanyFeature = isCompanyFeatureEnabled(this.appConfig);\n const companyId = enableCompanyFeature\n ? this.companyContext.currentCompanyInfo()?.id || undefined\n : undefined;\n\n const selectFields = [\n 'id',\n 'name',\n 'description',\n 'isActive',\n 'readOnly',\n 'serial',\n 'createdAt',\n 'deletedAt',\n ];\n if (enableCompanyFeature) {\n selectFields.push('companyId');\n }\n\n const response = await this.roleApi.getAll(\n {\n filter: companyId ? { companyId } : undefined,\n pagination: {\n currentPage: Math.floor(this.first() / this.pageSize()),\n pageSize: this.pageSize(),\n },\n select: selectFields,\n sort: { id: 'ASC' },\n },\n this._searchTerm(),\n );\n\n this.roles.set(response?.data ?? []);\n this.total.set(response?.meta?.total ?? 0);\n } catch {\n // Error toast handled by global interceptor\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCreate(): void {\n this.router.navigate(['/iam/roles/new']);\n }\n\n onEdit(role: IRole): void {\n this.router.navigate(['/iam/roles', role.id]);\n }\n\n onViewUsers(role: IRole): void {\n this.selectedRole.set(role);\n this.permittedUsersDialogVisible.set(true);\n }\n\n onDelete(role: IRole): void {\n this.confirmationService.confirm({\n message: this.translate('shared.confirm.delete.item', {\n name: role.name,\n }),\n header: this.translate('iam.role.delete.title'),\n icon: 'exclamation-triangle',\n accept: async () => {\n try {\n const response = await this.roleApi.delete({\n id: role.id,\n type: 'permanent',\n });\n\n this.roles.update((list) => list.filter((r) => r.id !== role.id));\n this.total.update((t) => Math.max(0, t - 1));\n\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: response?.messageKey\n ? this.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : response?.message,\n });\n } catch {\n // Error toast handled by global interceptor\n }\n },\n });\n }\n\n onLazyLoad(event: { first?: number | null; rows?: number | null }): void {\n this.first.set(event.first ?? 0);\n this.pageSize.set(event.rows ?? 10);\n this.loadRoles();\n }\n\n onSearchChange(value: string): void {\n this._searchTerm.set(value);\n this.first.set(0);\n this.loadRoles();\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ import * as i0 from "@angular/core";
2
+ import { Service, inject } from "@angular/core";
3
+ import { ApiResourceService } from "@flusys/ng-shared";
4
+ import { APP_CONFIG, getServiceUrl } from "@flusys/ng-core";
5
+ var ActionApiService = class ActionApiService extends ApiResourceService {
6
+ appConfig = inject(APP_CONFIG);
7
+ constructor() {
8
+ super("actions", "iam");
9
+ }
10
+ getActionsForPermission(companyId) {
11
+ const iamBaseUrl = getServiceUrl(this.appConfig, "iam");
12
+ return this.http.post(`${iamBaseUrl}/actions/tree-for-permission`, { companyId });
13
+ }
14
+ getTree(search, isActive, withDeleted) {
15
+ const body = {};
16
+ if (search?.trim()) body.search = search.trim();
17
+ if (isActive !== void 0) body.isActive = isActive;
18
+ if (withDeleted !== void 0) body.withDeleted = withDeleted;
19
+ const iamBaseUrl = getServiceUrl(this.appConfig, "iam");
20
+ return this.http.post(`${iamBaseUrl}/actions/tree`, body);
21
+ }
22
+ static ɵfac = i0.ɵɵngDeclareFactory({
23
+ minVersion: "12.0.0",
24
+ version: "22.2.1",
25
+ ngImport: i0,
26
+ type: ActionApiService,
27
+ deps: [],
28
+ target: i0.ɵɵFactoryTarget.Service
29
+ });
30
+ static ɵprov = i0.ɵɵngDeclareService({
31
+ minVersion: "22.0.0",
32
+ version: "22.2.1",
33
+ ngImport: i0,
34
+ type: ActionApiService
35
+ });
36
+ };
37
+ i0.ɵɵngDeclareClassMetadata({
38
+ minVersion: "12.0.0",
39
+ version: "22.2.1",
40
+ ngImport: i0,
41
+ type: ActionApiService,
42
+ decorators: [{ type: Service }],
43
+ ctorParameters: () => []
44
+ });
45
+ function flattenTree(tree) {
46
+ if (!tree?.length) return [];
47
+ const result = [];
48
+ const flatten = (nodes) => {
49
+ for (const node of nodes) {
50
+ result.push(node);
51
+ if (node.children?.length) flatten(node.children);
52
+ }
53
+ };
54
+ flatten(tree);
55
+ return result;
56
+ }
57
+ function buildTreeFromFlat(flatList) {
58
+ if (!flatList?.length) return [];
59
+ const itemMap = /* @__PURE__ */ new Map();
60
+ const rootItems = [];
61
+ flatList.forEach((item) => {
62
+ if (item.id) itemMap.set(item.id, {
63
+ ...item,
64
+ children: []
65
+ });
66
+ });
67
+ flatList.forEach((item) => {
68
+ if (!item.id) return;
69
+ const node = itemMap.get(item.id);
70
+ if (!node) return;
71
+ if (!item.parentId) rootItems.push(node);
72
+ else {
73
+ const parent = itemMap.get(item.parentId);
74
+ if (parent) parent.children.push(node);
75
+ else rootItems.push(node);
76
+ }
77
+ });
78
+ return rootItems;
79
+ }
80
+ function convertActionToTreeNode(actions) {
81
+ if (!actions?.length) return [];
82
+ const convert = (action) => {
83
+ const { children, ...actionData } = action;
84
+ return {
85
+ data: actionData,
86
+ children: children?.map(convert) ?? [],
87
+ leaf: !children?.length,
88
+ expanded: false
89
+ };
90
+ };
91
+ return actions.map(convert);
92
+ }
93
+ function buildActionParentTree(actions, excludeId) {
94
+ const tree = buildTreeFromFlat(actions);
95
+ const convert = (nodes) => nodes.filter((node) => node.id !== excludeId).map((node) => {
96
+ const { children, ...data } = node;
97
+ const converted = convert(children);
98
+ return {
99
+ key: node.id,
100
+ label: node.name,
101
+ data,
102
+ children: converted.length ? converted : void 0,
103
+ leaf: converted.length === 0
104
+ };
105
+ });
106
+ return convert(tree);
107
+ }
108
+ export { ActionApiService as a, flattenTree as i, buildTreeFromFlat as n, convertActionToTreeNode as r, buildActionParentTree as t };
109
+
110
+ //# sourceMappingURL=flusys-ng-iam-tree-utils-B1pBG4At.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flusys-ng-iam-tree-utils-B1pBG4At.mjs","names":[],"sources":["../../../projects/ng-iam/services/action-api.service.ts","../../../projects/ng-iam/utils/tree-utils.ts"],"sourcesContent":["import { inject, Service } from '@angular/core';\nimport { APP_CONFIG, getServiceUrl, IAppConfig } from '@flusys/ng-core';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n IAction,\n IActionTreeDto,\n IUpdateActionDto,\n} from '../interfaces/action.interface';\n\n@Service()\nexport class ActionApiService extends ApiResourceService<\n IUpdateActionDto,\n IAction\n> {\n private readonly appConfig = inject<IAppConfig>(APP_CONFIG);\n\n constructor() {\n super('actions', 'iam');\n }\n\n /** Get actions filtered by company whitelist for permission assignment */\n getActionsForPermission(\n companyId?: string,\n ): Observable<ISingleResponse<IActionTreeDto[]>> {\n const iamBaseUrl = getServiceUrl(this.appConfig, 'iam');\n return this.http.post<ISingleResponse<IActionTreeDto[]>>(\n `${iamBaseUrl}/actions/tree-for-permission`,\n { companyId },\n );\n }\n\n /** Get actions in hierarchical tree structure */\n getTree(\n search?: string,\n isActive?: boolean,\n withDeleted?: boolean,\n ): Observable<ISingleResponse<IActionTreeDto[]>> {\n const body: { search?: string; isActive?: boolean; withDeleted?: boolean } =\n {};\n if (search?.trim()) body.search = search.trim();\n if (isActive !== undefined) body.isActive = isActive;\n if (withDeleted !== undefined) body.withDeleted = withDeleted;\n\n const iamBaseUrl = getServiceUrl(this.appConfig, 'iam');\n return this.http.post<ISingleResponse<IActionTreeDto[]>>(\n `${iamBaseUrl}/actions/tree`,\n body,\n );\n }\n}\n","import { IAction, IActionTreeDto } from '../interfaces/action.interface';\nimport { TreeNode } from '@flusys/ng-ui';\n\nexport function flattenTree<T extends { children?: T[] }>(tree: T[]): T[] {\n if (!tree?.length) return [];\n\n const result: T[] = [];\n const flatten = (nodes: T[]): void => {\n for (const node of nodes) {\n result.push(node);\n if (node.children?.length) flatten(node.children);\n }\n };\n flatten(tree);\n return result;\n}\n\nexport function buildTreeFromFlat<\n T extends { id?: string | null; parentId?: string | null },\n>(flatList: T[]): (T & { children: T[] })[] {\n if (!flatList?.length) return [];\n\n const itemMap = new Map<string, T & { children: T[] }>();\n const rootItems: (T & { children: T[] })[] = [];\n\n flatList.forEach((item) => {\n if (item.id) itemMap.set(item.id, { ...item, children: [] });\n });\n\n flatList.forEach((item) => {\n if (!item.id) return;\n const node = itemMap.get(item.id);\n if (!node) return;\n\n if (!item.parentId) {\n rootItems.push(node);\n } else {\n const parent = itemMap.get(item.parentId);\n if (parent) {\n parent.children.push(node);\n } else {\n rootItems.push(node);\n }\n }\n });\n\n return rootItems;\n}\n\nexport function convertActionToTreeNode(\n actions: IActionTreeDto[],\n): TreeNode<IAction>[] {\n if (!actions?.length) return [];\n\n const convert = (action: IActionTreeDto): TreeNode<IAction> => {\n const { children, ...actionData } = action;\n return {\n data: actionData,\n children: children?.map(convert) ?? [],\n leaf: !children?.length,\n expanded: false,\n };\n };\n\n return actions.map(convert);\n}\n\nexport function buildActionParentTree(\n actions: IAction[],\n excludeId?: string | null,\n): TreeNode<IAction>[] {\n const tree = buildTreeFromFlat(actions);\n\n const convert = (\n nodes: (IAction & { children: IAction[] })[],\n ): TreeNode<IAction>[] =>\n nodes\n .filter((node) => node.id !== excludeId)\n .map((node) => {\n const { children, ...data } = node;\n const converted = convert(\n children as (IAction & { children: IAction[] })[],\n );\n return {\n key: node.id,\n label: node.name,\n data,\n children: converted.length ? converted : undefined,\n leaf: converted.length === 0,\n };\n });\n\n return convert(tree);\n}\n"],"mappings":"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"}