@webiny/app-website-builder 6.5.0-beta.0 → 6.5.0-beta.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.
- package/Extension.js +3 -0
- package/Extension.js.map +1 -1
- package/domain/Page/Page.d.ts +2 -0
- package/domain/Page/Page.js +1 -0
- package/domain/Page/Page.js.map +1 -1
- package/domain/PageRevision/PageRevision.d.ts +11 -0
- package/domain/PageRevision/PageRevision.js +20 -0
- package/domain/PageRevision/PageRevision.js.map +1 -1
- package/features/pages/createPageRevisionFrom/CreatePageRevisionFrom.test.js +41 -1
- package/features/pages/createPageRevisionFrom/CreatePageRevisionFrom.test.js.map +1 -1
- package/features/pages/createPageRevisionFrom/CreatePageRevisionFromRepository.d.ts +3 -2
- package/features/pages/createPageRevisionFrom/CreatePageRevisionFromRepository.js +8 -2
- package/features/pages/createPageRevisionFrom/CreatePageRevisionFromRepository.js.map +1 -1
- package/features/pages/deletePageRevision/DeletePageRevision.test.d.ts +1 -0
- package/features/pages/deletePageRevision/DeletePageRevision.test.js +67 -0
- package/features/pages/deletePageRevision/DeletePageRevision.test.js.map +1 -0
- package/features/pages/deletePageRevision/DeletePageRevisionGateway.d.ts +1 -1
- package/features/pages/deletePageRevision/DeletePageRevisionGateway.js +2 -3
- package/features/pages/deletePageRevision/DeletePageRevisionGateway.js.map +1 -1
- package/features/pages/deletePageRevision/DeletePageRevisionRepository.d.ts +4 -2
- package/features/pages/deletePageRevision/DeletePageRevisionRepository.js +7 -3
- package/features/pages/deletePageRevision/DeletePageRevisionRepository.js.map +1 -1
- package/features/pages/deletePageRevision/DeletePageRevisionUseCase.js +1 -1
- package/features/pages/deletePageRevision/DeletePageRevisionUseCase.js.map +1 -1
- package/features/pages/deletePageRevision/abstractions.d.ts +2 -3
- package/features/pages/deletePageRevision/abstractions.js.map +1 -1
- package/features/pages/getPage/PageGatewayDto.d.ts +2 -0
- package/features/pages/publishPage/PublishPage.test.js +41 -1
- package/features/pages/publishPage/PublishPage.test.js.map +1 -1
- package/features/pages/publishPage/PublishPageRepository.d.ts +3 -2
- package/features/pages/publishPage/PublishPageRepository.js +15 -4
- package/features/pages/publishPage/PublishPageRepository.js.map +1 -1
- package/features/pages/shared/pageGraphQLFields.js +1 -0
- package/features/pages/shared/pageGraphQLFields.js.map +1 -1
- package/features/pages/unpublishPage/UnpublishPage.test.js +4 -1
- package/features/pages/unpublishPage/UnpublishPage.test.js.map +1 -1
- package/features/pages/unpublishPage/UnpublishPageRepository.d.ts +3 -2
- package/features/pages/unpublishPage/UnpublishPageRepository.js +12 -4
- package/features/pages/unpublishPage/UnpublishPageRepository.js.map +1 -1
- package/inputRenderers/FileInput.js +1 -1
- package/inputRenderers/FileInput.js.map +1 -1
- package/package.json +23 -23
- package/presentation/pages/PageEditor/Revisions/RevisionListDrawer.js +4 -0
- package/presentation/pages/PageEditor/Revisions/RevisionListDrawer.js.map +1 -1
- package/presentation/pages/PageEditor/Revisions/RevisionListItem.d.ts +3 -3
- package/presentation/pages/PageEditor/Revisions/RevisionListItem.js +9 -20
- package/presentation/pages/PageEditor/Revisions/RevisionListItem.js.map +1 -1
- package/presentation/pages/PageEditor/Revisions/RevisionsList.js +7 -19
- package/presentation/pages/PageEditor/Revisions/RevisionsList.js.map +1 -1
- package/presentation/pages/PageEditor/Revisions/useRevision.d.ts +1 -1
- package/presentation/pages/PageEditor/Revisions/useRevision.js +84 -14
- package/presentation/pages/PageEditor/Revisions/useRevision.js.map +1 -1
- package/presentation/pages/PageEditor/Revisions/useRevisionList.d.ts +3 -0
- package/presentation/pages/PageEditor/Revisions/useRevisionList.js +31 -0
- package/presentation/pages/PageEditor/Revisions/useRevisionList.js.map +1 -0
- package/presentation/pages/PageEditor/TopBar/RevisionsMenu.js +7 -19
- package/presentation/pages/PageEditor/TopBar/RevisionsMenu.js.map +1 -1
- package/presentation/pages/PageList/PageListDataSource.js +1 -1
- package/presentation/pages/PageList/PageListDataSource.js.map +1 -1
- package/presentation/pages/PageList/PageListPresenter.test.d.ts +1 -0
- package/presentation/pages/PageList/PageListPresenter.test.js +293 -0
- package/presentation/pages/PageList/PageListPresenter.test.js.map +1 -0
- package/presentation/pages/RevisionList/RevisionListPresenter.d.ts +27 -0
- package/presentation/pages/RevisionList/RevisionListPresenter.js +73 -0
- package/presentation/pages/RevisionList/RevisionListPresenter.js.map +1 -0
- package/presentation/pages/RevisionList/RevisionListPresenter.test.d.ts +1 -0
- package/presentation/pages/RevisionList/RevisionListPresenter.test.js +219 -0
- package/presentation/pages/RevisionList/RevisionListPresenter.test.js.map +1 -0
- package/presentation/pages/RevisionList/abstractions.d.ts +34 -0
- package/presentation/pages/RevisionList/abstractions.js +5 -0
- package/presentation/pages/RevisionList/abstractions.js.map +1 -0
- package/presentation/pages/RevisionList/feature.d.ts +3 -0
- package/presentation/pages/RevisionList/feature.js +17 -0
- package/presentation/pages/RevisionList/feature.js.map +1 -0
- package/presentation/pages/RevisionList/index.d.ts +2 -0
- package/presentation/pages/RevisionList/index.js +1 -0
- package/presentation/redirects/RedirectList/RedirectListDataSource.js +1 -1
- package/presentation/redirects/RedirectList/RedirectListDataSource.js.map +1 -1
- package/presentation/redirects/RedirectList/RedirectListPresenter.test.d.ts +1 -0
- package/presentation/redirects/RedirectList/RedirectListPresenter.test.js +273 -0
- package/presentation/redirects/RedirectList/RedirectListPresenter.test.js.map +1 -0
- package/shared/fileManagerItemToValue.js +3 -1
- package/shared/fileManagerItemToValue.js.map +1 -1
- package/shared/fileManagerItemToValue.test.d.ts +1 -0
- package/shared/fileManagerItemToValue.test.js +73 -0
- package/shared/fileManagerItemToValue.test.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/redirects/RedirectList/RedirectListPresenter.test.js","sources":["../../../../src/presentation/redirects/RedirectList/RedirectListPresenter.test.ts"],"sourcesContent":["import { describe, it, expect, vi, beforeEach } from \"vitest\";\nimport { observable } from \"mobx\";\nimport { Container } from \"@webiny/di\";\nimport { ListCache } from \"@webiny/app-admin/features/listCache/index.js\";\nimport { ListPresenter } from \"@webiny/app-admin/presentation/listPresenter/ListPresenter.js\";\nimport { FolderTreePresenter } from \"@webiny/app-aco/presentation/folderTree/abstractions.js\";\nimport { GetDescendantFoldersUseCase } from \"@webiny/app-aco/features/folders/getDescendantFolders/abstractions.js\";\nimport { Redirect } from \"~/domain/Redirect/Redirect.js\";\nimport { RedirectsListCache } from \"~/features/redirects/shared/abstractions.js\";\nimport {\n ListRedirectsGateway,\n type ListRedirectsGatewayParams,\n type ListRedirectsGatewayResult\n} from \"~/features/redirects/listRedirects/abstractions.js\";\nimport { ListRedirectsUseCase } from \"~/features/redirects/listRedirects/ListRedirectsUseCase.js\";\nimport { ListRedirectsRepository } from \"~/features/redirects/listRedirects/ListRedirectsRepository.js\";\nimport {\n CreateRedirectGateway,\n CreateRedirectUseCase as CreateRedirectUseCaseAbstraction\n} from \"~/features/redirects/createRedirect/abstractions.js\";\nimport { CreateRedirectUseCase } from \"~/features/redirects/createRedirect/CreateRedirectUseCase.js\";\nimport { CreateRedirectRepository } from \"~/features/redirects/createRedirect/CreateRedirectRepository.js\";\nimport {\n UpdateRedirectGateway,\n UpdateRedirectUseCase as UpdateRedirectUseCaseAbstraction,\n type UpdateRedirectParams\n} from \"~/features/redirects/updateRedirect/abstractions.js\";\nimport { UpdateRedirectUseCase } from \"~/features/redirects/updateRedirect/UpdateRedirectUseCase.js\";\nimport { UpdateRedirectRepository } from \"~/features/redirects/updateRedirect/UpdateRedirectRepository.js\";\nimport {\n CreateRedirectPresenter,\n EditRedirectPresenter,\n RedirectListPresenter as Abstraction\n} from \"./abstractions.js\";\nimport { RedirectListPresenter } from \"./RedirectListPresenter.js\";\n\nconst TOTAL_REDIRECTS = 120;\nconst PAGE_SIZE = 50;\nconst BASE_TIME = Date.UTC(2026, 0, 1);\n\nconst minutes = (n: number) => new Date(BASE_TIME + n * 60_000).toISOString();\n\n/**\n * A higher index means a more recently *created* redirect, but a less recently *saved* one,\n * so sorting by `createdOn` and by `savedOn` produce opposite orders.\n */\nfunction createRedirects(count: number): Redirect[] {\n return Array.from({ length: count }, (_, i) =>\n Redirect.create({\n id: `redirect-${i}`,\n location: { folderId: \"root\" },\n redirectFrom: `/from-${i}`,\n redirectTo: `/to-${i}`,\n redirectType: \"permanent\",\n isEnabled: i % 2 === 0,\n createdOn: minutes(i),\n savedOn: minutes(count - i)\n })\n );\n}\n\n/**\n * Sorts like the API: by the requested field, ties keep the original (id) order.\n */\nfunction sortRedirects(redirects: Redirect[], sort = \"createdOn_DESC\"): Redirect[] {\n const [field, direction] = sort.split(\"_\") as [keyof Redirect, \"ASC\" | \"DESC\"];\n const multiplier = direction === \"ASC\" ? 1 : -1;\n return [...redirects].sort((a, b) => {\n const left = String(a[field]);\n const right = String(b[field]);\n return left === right ? 0 : multiplier * (left < right ? -1 : 1);\n });\n}\n\nfunction createListGateway(redirects: Redirect[]): ListRedirectsGateway.Interface {\n return {\n execute: vi.fn(\n async (params: ListRedirectsGatewayParams): Promise<ListRedirectsGatewayResult> => {\n const sorted = sortRedirects(redirects, params.sort?.[0]);\n const offset = params.after ? Number(params.after) : 0;\n const limit = params.limit ?? PAGE_SIZE;\n const data = sorted.slice(offset, offset + limit);\n const next = offset + data.length;\n const hasMoreItems = next < sorted.length;\n return {\n data,\n meta: {\n cursor: hasMoreItems ? String(next) : null,\n hasMoreItems,\n totalCount: sorted.length\n }\n };\n }\n )\n };\n}\n\nfunction createFolderTreePresenter(): FolderTreePresenter.Interface {\n const vm = observable({\n folders: [],\n tree: [],\n currentFolderId: null as string | null,\n currentFolder: null,\n loading: false,\n operation: { active: false, mode: null },\n isRootFolder: true,\n currentFolderTitle: \"All redirects\",\n childFolders: [],\n loadingNodeIds: []\n });\n\n return {\n get vm() {\n return vm as unknown as FolderTreePresenter.Interface[\"vm\"];\n },\n selectFolder: vi.fn(),\n createFolder: vi.fn(),\n editFolder: vi.fn(),\n deleteFolder: vi.fn().mockResolvedValue(undefined),\n moveFolder: vi.fn().mockResolvedValue(undefined),\n loadChildFolders: vi.fn().mockResolvedValue(undefined),\n canManageStructure: vi.fn().mockReturnValue(true),\n getAncestorIds: vi.fn().mockReturnValue([]),\n submitOperation: vi.fn().mockResolvedValue(true),\n cancelOperation: vi.fn(),\n onFolderChange: vi.fn().mockReturnValue(() => {})\n };\n}\n\n/**\n * Expected redirect IDs for a contiguous range of indexes, in the given order.\n */\nfunction range(from: number, to: number): string[] {\n const step = from <= to ? 1 : -1;\n const ids: string[] = [];\n for (let i = from; step > 0 ? i <= to : i >= to; i += step) {\n ids.push(`redirect-${i}`);\n }\n return ids;\n}\n\ndescribe(\"RedirectListPresenter\", () => {\n let presenter: Abstraction.Interface;\n let container: Container;\n let redirects: Redirect[];\n\n const rowIds = () => presenter.vm.list.rows.map(row => row.id);\n\n const waitForQuery = async (field: string, direction: \"ASC\" | \"DESC\") => {\n await vi.waitFor(() => {\n expect(presenter.vm.list.appliedQuery?.sort).toEqual({ field, direction });\n expect(presenter.vm.list.pagination.loading).toBe(false);\n });\n };\n\n const initAndWait = async () => {\n presenter.init();\n await waitForQuery(\"createdOn\", \"DESC\");\n };\n\n const sortAndWait = async (field: string, direction: \"ASC\" | \"DESC\") => {\n presenter.actions.sort.set(field, direction);\n await waitForQuery(field, direction);\n };\n\n const loadAll = async () => {\n while (presenter.vm.list.pagination.hasMore) {\n await presenter.actions.loadMore();\n }\n };\n\n beforeEach(() => {\n container = new Container();\n redirects = createRedirects(TOTAL_REDIRECTS);\n\n container.registerInstance(RedirectsListCache, new ListCache<Redirect>(\"id\"));\n\n container.registerInstance(ListRedirectsGateway, createListGateway(redirects));\n container.register(ListRedirectsRepository).inSingletonScope();\n container.register(ListRedirectsUseCase);\n\n container.registerInstance(CreateRedirectGateway, {\n execute: vi.fn(async params =>\n Redirect.create({\n ...params,\n id: \"redirect-new\",\n createdOn: minutes(TOTAL_REDIRECTS + 1),\n savedOn: minutes(TOTAL_REDIRECTS + 1)\n })\n )\n });\n container.register(CreateRedirectRepository).inSingletonScope();\n container.register(CreateRedirectUseCase);\n\n container.registerInstance(UpdateRedirectGateway, {\n execute: vi.fn(async (params: UpdateRedirectParams) => {\n const existing = redirects.find(r => r.id === params.id)!;\n return Redirect.create({\n ...existing,\n ...params,\n savedOn: minutes(TOTAL_REDIRECTS + 1)\n });\n })\n });\n container.register(UpdateRedirectRepository).inSingletonScope();\n container.register(UpdateRedirectUseCase);\n\n container.register(ListPresenter);\n container.registerInstance(FolderTreePresenter, createFolderTreePresenter());\n container.registerInstance(GetDescendantFoldersUseCase, { execute: () => [] });\n container.registerInstance(CreateRedirectPresenter, {\n vm: {},\n init: vi.fn(),\n save: vi.fn()\n } as unknown as CreateRedirectPresenter.Interface);\n container.registerInstance(EditRedirectPresenter, {\n vm: {},\n loadRedirect: vi.fn(),\n save: vi.fn()\n } as unknown as EditRedirectPresenter.Interface);\n\n container.register(RedirectListPresenter);\n\n presenter = container.resolve(Abstraction);\n });\n\n describe(\"pagination\", () => {\n it(\"should show the most recently created redirects first\", async () => {\n await initAndWait();\n\n expect(rowIds()).toEqual(range(119, 70));\n });\n\n it(\"should append the next batch of redirects to the bottom of the list\", async () => {\n await initAndWait();\n\n await presenter.actions.loadMore();\n\n expect(rowIds()).toEqual(range(119, 20));\n });\n\n it(\"should keep all redirects in order after loading everything\", async () => {\n await initAndWait();\n\n await loadAll();\n\n expect(rowIds()).toEqual(range(119, 0));\n });\n });\n\n describe(\"changing the sort\", () => {\n it(\"should show only the first batch, sorted by the new field\", async () => {\n await initAndWait();\n\n await sortAndWait(\"savedOn\", \"DESC\");\n\n // `savedOn` runs opposite to `createdOn`, so the most recently saved is redirect-0.\n expect(rowIds()).toEqual(range(0, 49));\n });\n\n it(\"should show only the first batch when sorting by a boolean field\", async () => {\n await initAndWait();\n\n await sortAndWait(\"isEnabled\", \"DESC\");\n\n const expected = sortRedirects(redirects, \"isEnabled_DESC\")\n .slice(0, PAGE_SIZE)\n .map(r => r.id);\n expect(rowIds()).toEqual(expected);\n });\n\n it(\"should restore the original order when switching back\", async () => {\n await initAndWait();\n await presenter.actions.loadMore();\n\n await sortAndWait(\"createdOn\", \"ASC\");\n await sortAndWait(\"createdOn\", \"DESC\");\n\n expect(rowIds()).toEqual(range(119, 70));\n });\n });\n\n describe(\"local cache changes\", () => {\n const createRedirect = () =>\n container.resolve(CreateRedirectUseCaseAbstraction).execute({\n location: { folderId: \"root\" },\n redirectFrom: \"/new\",\n redirectTo: \"/target\",\n redirectType: \"permanent\",\n isEnabled: true\n });\n\n const updateRedirect = (id: string) => {\n const existing = redirects.find(r => r.id === id)!;\n return container.resolve(UpdateRedirectUseCaseAbstraction).execute({\n id,\n redirectFrom: existing.redirectFrom,\n redirectTo: \"/changed\",\n redirectType: existing.redirectType,\n isEnabled: existing.isEnabled\n });\n };\n\n it(\"should show a created redirect at the top when it sorts first\", async () => {\n await initAndWait();\n\n await createRedirect();\n\n expect(rowIds()).toEqual([\"redirect-new\", ...range(119, 70)]);\n });\n\n it(\"should not show a created redirect that sorts past the loaded redirects\", async () => {\n await initAndWait();\n await sortAndWait(\"createdOn\", \"ASC\");\n\n await createRedirect();\n\n // The new redirect is the most recently created, so in ASC order it belongs at the\n // very end, after redirects that are not loaded yet.\n expect(rowIds()).toEqual(range(0, 49));\n });\n\n it(\"should keep an updated redirect in its position when sorted by createdOn\", async () => {\n await initAndWait();\n\n await updateRedirect(\"redirect-100\");\n\n expect(rowIds()).toEqual(range(119, 70));\n const updated = presenter.vm.list.rows.find(row => row.id === \"redirect-100\");\n expect(updated?.redirectTo).toBe(\"/changed\");\n });\n\n it(\"should move an updated redirect to the top when sorted by savedOn\", async () => {\n await initAndWait();\n await sortAndWait(\"savedOn\", \"DESC\");\n\n await updateRedirect(\"redirect-30\");\n\n expect(rowIds()).toEqual([\"redirect-30\", ...range(0, 29), ...range(31, 49)]);\n });\n });\n});\n"],"names":["TOTAL_REDIRECTS","PAGE_SIZE","BASE_TIME","Date","minutes","n","createRedirects","count","Array","_","i","Redirect","sortRedirects","redirects","sort","field","direction","multiplier","a","b","left","String","right","createListGateway","vi","params","sorted","offset","Number","limit","data","next","hasMoreItems","createFolderTreePresenter","vm","observable","undefined","range","from","to","step","ids","describe","presenter","container","rowIds","row","waitForQuery","expect","initAndWait","sortAndWait","loadAll","beforeEach","Container","RedirectsListCache","ListCache","ListRedirectsGateway","ListRedirectsRepository","ListRedirectsUseCase","CreateRedirectGateway","CreateRedirectRepository","CreateRedirectUseCase","UpdateRedirectGateway","existing","r","UpdateRedirectRepository","UpdateRedirectUseCase","ListPresenter","FolderTreePresenter","GetDescendantFoldersUseCase","CreateRedirectPresenter","EditRedirectPresenter","RedirectListPresenter","Abstraction","it","expected","createRedirect","CreateRedirectUseCaseAbstraction","updateRedirect","id","UpdateRedirectUseCaseAbstraction","updated"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ const fileManagerItemToValue = (file)=>{
|
|
|
6
6
|
src,
|
|
7
7
|
url: src,
|
|
8
8
|
name: file.name,
|
|
9
|
-
|
|
9
|
+
mimeType: file.type,
|
|
10
10
|
size: file.size
|
|
11
11
|
};
|
|
12
12
|
if ("image" === getAssetCategory(file.type)) {
|
|
@@ -19,6 +19,8 @@ const fileManagerItemToValue = (file)=>{
|
|
|
19
19
|
alt: meta?.alt ?? void 0,
|
|
20
20
|
caption: meta?.caption ?? void 0
|
|
21
21
|
};
|
|
22
|
+
asset.width = asset.image.width;
|
|
23
|
+
asset.height = asset.image.height;
|
|
22
24
|
}
|
|
23
25
|
return asset;
|
|
24
26
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared/fileManagerItemToValue.js","sources":["../../src/shared/fileManagerItemToValue.ts"],"sourcesContent":["import type { FileManagerFileItem } from \"@webiny/app-admin\";\nimport { getAssetCategory, type Asset } from \"@webiny/website-builder-sdk\";\n\n/**\n * Build the unified {@link Asset} value from a picked File Manager item.\n * For images, the per-usage `image` edit is seeded from the asset-level default\n * (set in File Manager); from here it lives on the element value and is editable\n * per placement.\n */\nexport const fileManagerItemToValue = (file: FileManagerFileItem): Asset => {\n const src = file.src || \"\";\n const asset: Asset = {\n id: file.id,\n src,\n url: src,\n name: file.name,\n
|
|
1
|
+
{"version":3,"file":"shared/fileManagerItemToValue.js","sources":["../../src/shared/fileManagerItemToValue.ts"],"sourcesContent":["import type { FileManagerFileItem } from \"@webiny/app-admin\";\nimport { getAssetCategory, type Asset } from \"@webiny/website-builder-sdk\";\n\n/**\n * Build the unified {@link Asset} value from a picked File Manager item.\n * For images, the per-usage `image` edit is seeded from the asset-level default\n * (set in File Manager); from here it lives on the element value and is editable\n * per placement.\n */\nexport const fileManagerItemToValue = (file: FileManagerFileItem): Asset => {\n const src = file.src || \"\";\n const asset: Asset = {\n id: file.id,\n src,\n url: src,\n name: file.name,\n mimeType: file.type,\n size: file.size\n };\n\n if (getAssetCategory(file.type) === \"image\") {\n const meta = file.metadata?.image;\n asset.image = {\n width: meta?.width ?? file.width,\n height: meta?.height ?? file.height,\n crop: meta?.crop ?? undefined,\n focalPoint: meta?.focalPoint ?? undefined,\n alt: meta?.alt ?? undefined,\n caption: meta?.caption ?? undefined\n };\n // Root dimensions for 6.4 frontends, which read `width`/`height` there.\n asset.width = asset.image.width;\n asset.height = asset.image.height;\n }\n\n return asset;\n};\n"],"names":["fileManagerItemToValue","file","src","asset","getAssetCategory","meta","undefined"],"mappings":";AASO,MAAMA,yBAAyB,CAACC;IACnC,MAAMC,MAAMD,KAAK,GAAG,IAAI;IACxB,MAAME,QAAe;QACjB,IAAIF,KAAK,EAAE;QACXC;QACA,KAAKA;QACL,MAAMD,KAAK,IAAI;QACf,UAAUA,KAAK,IAAI;QACnB,MAAMA,KAAK,IAAI;IACnB;IAEA,IAAIG,AAAgC,YAAhCA,iBAAiBH,KAAK,IAAI,GAAe;QACzC,MAAMI,OAAOJ,KAAK,QAAQ,EAAE;QAC5BE,MAAM,KAAK,GAAG;YACV,OAAOE,MAAM,SAASJ,KAAK,KAAK;YAChC,QAAQI,MAAM,UAAUJ,KAAK,MAAM;YACnC,MAAMI,MAAM,QAAQC;YACpB,YAAYD,MAAM,cAAcC;YAChC,KAAKD,MAAM,OAAOC;YAClB,SAASD,MAAM,WAAWC;QAC9B;QAEAH,MAAM,KAAK,GAAGA,MAAM,KAAK,CAAC,KAAK;QAC/BA,MAAM,MAAM,GAAGA,MAAM,KAAK,CAAC,MAAM;IACrC;IAEA,OAAOA;AACX"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { fileManagerItemToValue } from "./fileManagerItemToValue.js";
|
|
3
|
+
describe("fileManagerItemToValue", ()=>{
|
|
4
|
+
it("writes mimeType and image dimensions at the root and in image", ()=>{
|
|
5
|
+
const value = fileManagerItemToValue({
|
|
6
|
+
id: "file-1",
|
|
7
|
+
src: "https://cdn.test/files/file-1/cat.jpg",
|
|
8
|
+
name: "cat.jpg",
|
|
9
|
+
type: "image/jpeg",
|
|
10
|
+
size: 1234,
|
|
11
|
+
width: 1200,
|
|
12
|
+
height: 800
|
|
13
|
+
});
|
|
14
|
+
expect(value).toEqual({
|
|
15
|
+
id: "file-1",
|
|
16
|
+
src: "https://cdn.test/files/file-1/cat.jpg",
|
|
17
|
+
url: "https://cdn.test/files/file-1/cat.jpg",
|
|
18
|
+
name: "cat.jpg",
|
|
19
|
+
mimeType: "image/jpeg",
|
|
20
|
+
size: 1234,
|
|
21
|
+
width: 1200,
|
|
22
|
+
height: 800,
|
|
23
|
+
image: {
|
|
24
|
+
width: 1200,
|
|
25
|
+
height: 800,
|
|
26
|
+
crop: void 0,
|
|
27
|
+
focalPoint: void 0,
|
|
28
|
+
alt: void 0,
|
|
29
|
+
caption: void 0
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
it("prefers the File Manager image metadata for dimensions", ()=>{
|
|
34
|
+
const value = fileManagerItemToValue({
|
|
35
|
+
id: "file-2",
|
|
36
|
+
src: "https://cdn.test/files/file-2/dog.png",
|
|
37
|
+
name: "dog.png",
|
|
38
|
+
type: "image/png",
|
|
39
|
+
size: 10,
|
|
40
|
+
width: 100,
|
|
41
|
+
height: 100,
|
|
42
|
+
metadata: {
|
|
43
|
+
image: {
|
|
44
|
+
width: 640,
|
|
45
|
+
height: 480,
|
|
46
|
+
alt: "A dog"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
expect(value.width).toBe(640);
|
|
51
|
+
expect(value.height).toBe(480);
|
|
52
|
+
expect(value.image).toMatchObject({
|
|
53
|
+
width: 640,
|
|
54
|
+
height: 480,
|
|
55
|
+
alt: "A dog"
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
it("leaves dimensions out for non-image files", ()=>{
|
|
59
|
+
const value = fileManagerItemToValue({
|
|
60
|
+
id: "file-3",
|
|
61
|
+
src: "https://cdn.test/files/file-3/doc.pdf",
|
|
62
|
+
name: "doc.pdf",
|
|
63
|
+
type: "application/pdf",
|
|
64
|
+
size: 99
|
|
65
|
+
});
|
|
66
|
+
expect(value.mimeType).toBe("application/pdf");
|
|
67
|
+
expect(value.width).toBeUndefined();
|
|
68
|
+
expect(value.height).toBeUndefined();
|
|
69
|
+
expect(value.image).toBeUndefined();
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=fileManagerItemToValue.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared/fileManagerItemToValue.test.js","sources":["../../src/shared/fileManagerItemToValue.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { fileManagerItemToValue } from \"./fileManagerItemToValue.js\";\n\ndescribe(\"fileManagerItemToValue\", () => {\n it(\"writes mimeType and image dimensions at the root and in image\", () => {\n const value = fileManagerItemToValue({\n id: \"file-1\",\n src: \"https://cdn.test/files/file-1/cat.jpg\",\n name: \"cat.jpg\",\n type: \"image/jpeg\",\n size: 1234,\n width: 1200,\n height: 800\n });\n\n expect(value).toEqual({\n id: \"file-1\",\n src: \"https://cdn.test/files/file-1/cat.jpg\",\n url: \"https://cdn.test/files/file-1/cat.jpg\",\n name: \"cat.jpg\",\n mimeType: \"image/jpeg\",\n size: 1234,\n width: 1200,\n height: 800,\n image: {\n width: 1200,\n height: 800,\n crop: undefined,\n focalPoint: undefined,\n alt: undefined,\n caption: undefined\n }\n });\n });\n\n it(\"prefers the File Manager image metadata for dimensions\", () => {\n const value = fileManagerItemToValue({\n id: \"file-2\",\n src: \"https://cdn.test/files/file-2/dog.png\",\n name: \"dog.png\",\n type: \"image/png\",\n size: 10,\n width: 100,\n height: 100,\n metadata: { image: { width: 640, height: 480, alt: \"A dog\" } }\n });\n\n expect(value.width).toBe(640);\n expect(value.height).toBe(480);\n expect(value.image).toMatchObject({ width: 640, height: 480, alt: \"A dog\" });\n });\n\n it(\"leaves dimensions out for non-image files\", () => {\n const value = fileManagerItemToValue({\n id: \"file-3\",\n src: \"https://cdn.test/files/file-3/doc.pdf\",\n name: \"doc.pdf\",\n type: \"application/pdf\",\n size: 99\n });\n\n expect(value.mimeType).toBe(\"application/pdf\");\n expect(value.width).toBeUndefined();\n expect(value.height).toBeUndefined();\n expect(value.image).toBeUndefined();\n });\n});\n"],"names":["describe","it","value","fileManagerItemToValue","expect","undefined"],"mappings":";;AAGAA,SAAS,0BAA0B;IAC/BC,GAAG,iEAAiE;QAChE,MAAMC,QAAQC,uBAAuB;YACjC,IAAI;YACJ,KAAK;YACL,MAAM;YACN,MAAM;YACN,MAAM;YACN,OAAO;YACP,QAAQ;QACZ;QAEAC,OAAOF,OAAO,OAAO,CAAC;YAClB,IAAI;YACJ,KAAK;YACL,KAAK;YACL,MAAM;YACN,UAAU;YACV,MAAM;YACN,OAAO;YACP,QAAQ;YACR,OAAO;gBACH,OAAO;gBACP,QAAQ;gBACR,MAAMG;gBACN,YAAYA;gBACZ,KAAKA;gBACL,SAASA;YACb;QACJ;IACJ;IAEAJ,GAAG,0DAA0D;QACzD,MAAMC,QAAQC,uBAAuB;YACjC,IAAI;YACJ,KAAK;YACL,MAAM;YACN,MAAM;YACN,MAAM;YACN,OAAO;YACP,QAAQ;YACR,UAAU;gBAAE,OAAO;oBAAE,OAAO;oBAAK,QAAQ;oBAAK,KAAK;gBAAQ;YAAE;QACjE;QAEAC,OAAOF,MAAM,KAAK,EAAE,IAAI,CAAC;QACzBE,OAAOF,MAAM,MAAM,EAAE,IAAI,CAAC;QAC1BE,OAAOF,MAAM,KAAK,EAAE,aAAa,CAAC;YAAE,OAAO;YAAK,QAAQ;YAAK,KAAK;QAAQ;IAC9E;IAEAD,GAAG,6CAA6C;QAC5C,MAAMC,QAAQC,uBAAuB;YACjC,IAAI;YACJ,KAAK;YACL,MAAM;YACN,MAAM;YACN,MAAM;QACV;QAEAC,OAAOF,MAAM,QAAQ,EAAE,IAAI,CAAC;QAC5BE,OAAOF,MAAM,KAAK,EAAE,aAAa;QACjCE,OAAOF,MAAM,MAAM,EAAE,aAAa;QAClCE,OAAOF,MAAM,KAAK,EAAE,aAAa;IACrC;AACJ"}
|