@webiny/api-website-builder 6.3.0 → 6.4.0-beta.1
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/constants.js +4 -3
- package/constants.js.map +1 -1
- package/domain/page/EntryToPageMapper.js +30 -28
- package/domain/page/EntryToPageMapper.js.map +1 -1
- package/domain/page/PagePath.js +20 -30
- package/domain/page/PagePath.js.map +1 -1
- package/domain/page/abstractions.d.ts +13 -0
- package/domain/page/abstractions.js +2 -5
- package/domain/page/abstractions.js.map +1 -1
- package/domain/page/errors.js +46 -51
- package/domain/page/errors.js.map +1 -1
- package/domain/page/page.model.d.ts +8 -1
- package/domain/page/page.model.js +25 -30
- package/domain/page/page.model.js.map +1 -1
- package/domain/permissionsSchema.js +49 -28
- package/domain/permissionsSchema.js.map +1 -1
- package/domain/redirect/EntryToRedirectMapper.js +21 -20
- package/domain/redirect/EntryToRedirectMapper.js.map +1 -1
- package/domain/redirect/abstractions.js +2 -9
- package/domain/redirect/abstractions.js.map +1 -1
- package/domain/redirect/errors.js +28 -31
- package/domain/redirect/errors.js.map +1 -1
- package/domain/redirect/redirect.model.d.ts +8 -1
- package/domain/redirect/redirect.model.js +24 -30
- package/domain/redirect/redirect.model.js.map +1 -1
- package/domain/shared/abstractions.js +0 -3
- package/exports/api/website-builder/nextjs.js +0 -2
- package/exports/api/website-builder/page.js +5 -7
- package/exports/api/website-builder/redirect.js +1 -3
- package/features/installer/ApiKeyInstaller.js +33 -30
- package/features/installer/ApiKeyInstaller.js.map +1 -1
- package/features/installer/feature.js +6 -5
- package/features/installer/feature.js.map +1 -1
- package/features/nextjs/MarkdownContentBuilder.js +67 -76
- package/features/nextjs/MarkdownContentBuilder.js.map +1 -1
- package/features/nextjs/MarkdownContentBuilder.test.js +266 -273
- package/features/nextjs/MarkdownContentBuilder.test.js.map +1 -1
- package/features/nextjs/NextjsConfig.js +43 -46
- package/features/nextjs/NextjsConfig.js.map +1 -1
- package/features/nextjs/abstractions.js +2 -2
- package/features/nextjs/abstractions.js.map +1 -1
- package/features/nextjs/feature.js +6 -5
- package/features/nextjs/feature.js.map +1 -1
- package/features/nextjs/index.js +0 -2
- package/features/pages/CreatePage/CreatePageRepository.js +23 -25
- package/features/pages/CreatePage/CreatePageRepository.js.map +1 -1
- package/features/pages/CreatePage/CreatePageUseCase.js +29 -34
- package/features/pages/CreatePage/CreatePageUseCase.js.map +1 -1
- package/features/pages/CreatePage/abstractions.js +5 -30
- package/features/pages/CreatePage/abstractions.js.map +1 -1
- package/features/pages/CreatePage/events.js +16 -14
- package/features/pages/CreatePage/events.js.map +1 -1
- package/features/pages/CreatePage/feature.js +7 -6
- package/features/pages/CreatePage/feature.js.map +1 -1
- package/features/pages/CreatePage/index.js +1 -3
- package/features/pages/CreatePageRevisionFrom/CreatePageRevisionFromRepository.js +30 -36
- package/features/pages/CreatePageRevisionFrom/CreatePageRevisionFromRepository.js.map +1 -1
- package/features/pages/CreatePageRevisionFrom/CreatePageRevisionFromUseCase.js +33 -41
- package/features/pages/CreatePageRevisionFrom/CreatePageRevisionFromUseCase.js.map +1 -1
- package/features/pages/CreatePageRevisionFrom/abstractions.js +5 -30
- package/features/pages/CreatePageRevisionFrom/abstractions.js.map +1 -1
- package/features/pages/CreatePageRevisionFrom/events.js +16 -14
- package/features/pages/CreatePageRevisionFrom/events.js.map +1 -1
- package/features/pages/CreatePageRevisionFrom/feature.js +7 -6
- package/features/pages/CreatePageRevisionFrom/feature.js.map +1 -1
- package/features/pages/CreatePageRevisionFrom/index.js +1 -3
- package/features/pages/DeletePage/DeletePageRepository.js +19 -18
- package/features/pages/DeletePage/DeletePageRepository.js.map +1 -1
- package/features/pages/DeletePage/DeletePageUseCase.js +32 -39
- package/features/pages/DeletePage/DeletePageUseCase.js.map +1 -1
- package/features/pages/DeletePage/abstractions.js +5 -30
- package/features/pages/DeletePage/abstractions.js.map +1 -1
- package/features/pages/DeletePage/events.js +16 -14
- package/features/pages/DeletePage/events.js.map +1 -1
- package/features/pages/DeletePage/feature.js +7 -6
- package/features/pages/DeletePage/feature.js.map +1 -1
- package/features/pages/DeletePage/index.js +1 -3
- package/features/pages/DuplicatePage/DuplicatePageRepository.js +50 -53
- package/features/pages/DuplicatePage/DuplicatePageRepository.js.map +1 -1
- package/features/pages/DuplicatePage/DuplicatePageUseCase.js +35 -43
- package/features/pages/DuplicatePage/DuplicatePageUseCase.js.map +1 -1
- package/features/pages/DuplicatePage/abstractions.js +5 -30
- package/features/pages/DuplicatePage/abstractions.js.map +1 -1
- package/features/pages/DuplicatePage/events.js +16 -14
- package/features/pages/DuplicatePage/events.js.map +1 -1
- package/features/pages/DuplicatePage/feature.js +7 -6
- package/features/pages/DuplicatePage/feature.js.map +1 -1
- package/features/pages/DuplicatePage/index.js +1 -3
- package/features/pages/GetDeletedPageById/GetDeletedPageByIdRepository.js +20 -20
- package/features/pages/GetDeletedPageById/GetDeletedPageByIdRepository.js.map +1 -1
- package/features/pages/GetDeletedPageById/GetDeletedPageByIdUseCase.js +19 -21
- package/features/pages/GetDeletedPageById/GetDeletedPageByIdUseCase.js.map +1 -1
- package/features/pages/GetDeletedPageById/abstractions.js +3 -12
- package/features/pages/GetDeletedPageById/abstractions.js.map +1 -1
- package/features/pages/GetDeletedPageById/feature.js +7 -6
- package/features/pages/GetDeletedPageById/feature.js.map +1 -1
- package/features/pages/GetDeletedPageById/index.js +0 -2
- package/features/pages/GetPageById/GetPageByIdRepository.js +20 -18
- package/features/pages/GetPageById/GetPageByIdRepository.js.map +1 -1
- package/features/pages/GetPageById/GetPageByIdUseCase.js +19 -21
- package/features/pages/GetPageById/GetPageByIdUseCase.js.map +1 -1
- package/features/pages/GetPageById/abstractions.js +3 -13
- package/features/pages/GetPageById/abstractions.js.map +1 -1
- package/features/pages/GetPageById/feature.js +7 -6
- package/features/pages/GetPageById/feature.js.map +1 -1
- package/features/pages/GetPageById/index.js +0 -2
- package/features/pages/GetPageByPath/GetPageByPathRepository.js +26 -26
- package/features/pages/GetPageByPath/GetPageByPathRepository.js.map +1 -1
- package/features/pages/GetPageByPath/GetPageByPathUseCase.js +19 -21
- package/features/pages/GetPageByPath/GetPageByPathUseCase.js.map +1 -1
- package/features/pages/GetPageByPath/abstractions.js +3 -13
- package/features/pages/GetPageByPath/abstractions.js.map +1 -1
- package/features/pages/GetPageByPath/feature.js +7 -6
- package/features/pages/GetPageByPath/feature.js.map +1 -1
- package/features/pages/GetPageByPath/index.js +0 -2
- package/features/pages/GetPageLanguagePaths/GetPageLanguagePathsRepository.js +42 -48
- package/features/pages/GetPageLanguagePaths/GetPageLanguagePathsRepository.js.map +1 -1
- package/features/pages/GetPageLanguagePaths/GetPageLanguagePathsUseCase.js +14 -13
- package/features/pages/GetPageLanguagePaths/GetPageLanguagePathsUseCase.js.map +1 -1
- package/features/pages/GetPageLanguagePaths/abstractions.js +3 -3
- package/features/pages/GetPageLanguagePaths/abstractions.js.map +1 -1
- package/features/pages/GetPageLanguagePaths/feature.js +7 -6
- package/features/pages/GetPageLanguagePaths/feature.js.map +1 -1
- package/features/pages/GetPageLanguagePaths/index.js +0 -2
- package/features/pages/GetPageRevisions/GetPageRevisionsRepository.js +17 -15
- package/features/pages/GetPageRevisions/GetPageRevisionsRepository.js.map +1 -1
- package/features/pages/GetPageRevisions/GetPageRevisionsUseCase.js +22 -24
- package/features/pages/GetPageRevisions/GetPageRevisionsUseCase.js.map +1 -1
- package/features/pages/GetPageRevisions/abstractions.js +3 -13
- package/features/pages/GetPageRevisions/abstractions.js.map +1 -1
- package/features/pages/GetPageRevisions/feature.js +7 -6
- package/features/pages/GetPageRevisions/feature.js.map +1 -1
- package/features/pages/GetPageRevisions/index.js +0 -2
- package/features/pages/ListDeletedPages/ListDeletedPagesRepository.js +37 -36
- package/features/pages/ListDeletedPages/ListDeletedPagesRepository.js.map +1 -1
- package/features/pages/ListDeletedPages/ListDeletedPagesUseCase.js +27 -24
- package/features/pages/ListDeletedPages/ListDeletedPagesUseCase.js.map +1 -1
- package/features/pages/ListDeletedPages/abstractions.js +3 -12
- package/features/pages/ListDeletedPages/abstractions.js.map +1 -1
- package/features/pages/ListDeletedPages/feature.js +7 -6
- package/features/pages/ListDeletedPages/feature.js.map +1 -1
- package/features/pages/ListDeletedPages/index.js +0 -2
- package/features/pages/ListPages/ListPagesRepository.js +37 -36
- package/features/pages/ListPages/ListPagesRepository.js.map +1 -1
- package/features/pages/ListPages/ListPagesUseCase.js +27 -24
- package/features/pages/ListPages/ListPagesUseCase.js.map +1 -1
- package/features/pages/ListPages/abstractions.js +3 -13
- package/features/pages/ListPages/abstractions.js.map +1 -1
- package/features/pages/ListPages/feature.js +7 -6
- package/features/pages/ListPages/feature.js.map +1 -1
- package/features/pages/ListPages/index.js +0 -2
- package/features/pages/MovePage/MovePageRepository.js +25 -27
- package/features/pages/MovePage/MovePageRepository.js.map +1 -1
- package/features/pages/MovePage/MovePageUseCase.js +39 -49
- package/features/pages/MovePage/MovePageUseCase.js.map +1 -1
- package/features/pages/MovePage/abstractions.js +5 -30
- package/features/pages/MovePage/abstractions.js.map +1 -1
- package/features/pages/MovePage/events.js +16 -14
- package/features/pages/MovePage/events.js.map +1 -1
- package/features/pages/MovePage/feature.js +7 -6
- package/features/pages/MovePage/feature.js.map +1 -1
- package/features/pages/MovePage/index.js +1 -3
- package/features/pages/PublishPage/PublishPageRepository.js +26 -28
- package/features/pages/PublishPage/PublishPageRepository.js.map +1 -1
- package/features/pages/PublishPage/PublishPageUseCase.js +36 -46
- package/features/pages/PublishPage/PublishPageUseCase.js.map +1 -1
- package/features/pages/PublishPage/abstractions.js +5 -30
- package/features/pages/PublishPage/abstractions.js.map +1 -1
- package/features/pages/PublishPage/events.js +16 -14
- package/features/pages/PublishPage/events.js.map +1 -1
- package/features/pages/PublishPage/feature.js +7 -6
- package/features/pages/PublishPage/feature.js.map +1 -1
- package/features/pages/PublishPage/index.js +0 -2
- package/features/pages/RestorePage/RestorePageRepository.js +20 -19
- package/features/pages/RestorePage/RestorePageRepository.js.map +1 -1
- package/features/pages/RestorePage/RestorePageUseCase.js +32 -39
- package/features/pages/RestorePage/RestorePageUseCase.js.map +1 -1
- package/features/pages/RestorePage/abstractions.js +5 -27
- package/features/pages/RestorePage/abstractions.js.map +1 -1
- package/features/pages/RestorePage/events.js +16 -14
- package/features/pages/RestorePage/events.js.map +1 -1
- package/features/pages/RestorePage/feature.js +7 -6
- package/features/pages/RestorePage/feature.js.map +1 -1
- package/features/pages/RestorePage/index.js +0 -2
- package/features/pages/TranslatePage/TranslatePageUseCase.js +46 -62
- package/features/pages/TranslatePage/TranslatePageUseCase.js.map +1 -1
- package/features/pages/TranslatePage/abstractions.js +2 -11
- package/features/pages/TranslatePage/abstractions.js.map +1 -1
- package/features/pages/TranslatePage/feature.js +6 -5
- package/features/pages/TranslatePage/feature.js.map +1 -1
- package/features/pages/TranslatePage/index.js +0 -2
- package/features/pages/TrashPage/TrashPageRepository.js +21 -20
- package/features/pages/TrashPage/TrashPageRepository.js.map +1 -1
- package/features/pages/TrashPage/TrashPageUseCase.js +33 -40
- package/features/pages/TrashPage/TrashPageUseCase.js.map +1 -1
- package/features/pages/TrashPage/abstractions.js +5 -27
- package/features/pages/TrashPage/abstractions.js.map +1 -1
- package/features/pages/TrashPage/events.js +16 -14
- package/features/pages/TrashPage/events.js.map +1 -1
- package/features/pages/TrashPage/feature.js +7 -6
- package/features/pages/TrashPage/feature.js.map +1 -1
- package/features/pages/TrashPage/index.js +0 -2
- package/features/pages/UnpublishPage/UnpublishPageRepository.js +26 -28
- package/features/pages/UnpublishPage/UnpublishPageRepository.js.map +1 -1
- package/features/pages/UnpublishPage/UnpublishPageUseCase.js +35 -45
- package/features/pages/UnpublishPage/UnpublishPageUseCase.js.map +1 -1
- package/features/pages/UnpublishPage/abstractions.js +5 -30
- package/features/pages/UnpublishPage/abstractions.js.map +1 -1
- package/features/pages/UnpublishPage/events.js +16 -14
- package/features/pages/UnpublishPage/events.js.map +1 -1
- package/features/pages/UnpublishPage/feature.js +7 -6
- package/features/pages/UnpublishPage/feature.js.map +1 -1
- package/features/pages/UnpublishPage/index.js +0 -2
- package/features/pages/UpdatePage/UpdatePageRepository.js +30 -34
- package/features/pages/UpdatePage/UpdatePageRepository.js.map +1 -1
- package/features/pages/UpdatePage/UpdatePageUseCase.js +44 -54
- package/features/pages/UpdatePage/UpdatePageUseCase.js.map +1 -1
- package/features/pages/UpdatePage/abstractions.js +5 -30
- package/features/pages/UpdatePage/abstractions.js.map +1 -1
- package/features/pages/UpdatePage/events.js +16 -14
- package/features/pages/UpdatePage/events.js.map +1 -1
- package/features/pages/UpdatePage/feature.js +7 -6
- package/features/pages/UpdatePage/feature.js.map +1 -1
- package/features/pages/UpdatePage/index.js +0 -2
- package/features/pages/UpdatePageRevisionDescription/UpdatePageRevisionDescriptionRepository.d.ts +15 -0
- package/features/pages/UpdatePageRevisionDescription/UpdatePageRevisionDescriptionRepository.js +40 -0
- package/features/pages/UpdatePageRevisionDescription/UpdatePageRevisionDescriptionRepository.js.map +1 -0
- package/features/pages/UpdatePageRevisionDescription/UpdatePageRevisionDescriptionUseCase.d.ts +16 -0
- package/features/pages/UpdatePageRevisionDescription/UpdatePageRevisionDescriptionUseCase.js +56 -0
- package/features/pages/UpdatePageRevisionDescription/UpdatePageRevisionDescriptionUseCase.js.map +1 -0
- package/features/pages/UpdatePageRevisionDescription/abstractions.d.ts +67 -0
- package/features/pages/UpdatePageRevisionDescription/abstractions.js +8 -0
- package/features/pages/UpdatePageRevisionDescription/abstractions.js.map +1 -0
- package/features/pages/UpdatePageRevisionDescription/events.d.ts +10 -0
- package/features/pages/UpdatePageRevisionDescription/events.js +21 -0
- package/features/pages/UpdatePageRevisionDescription/events.js.map +1 -0
- package/features/pages/UpdatePageRevisionDescription/feature.d.ts +4 -0
- package/features/pages/UpdatePageRevisionDescription/feature.js +13 -0
- package/features/pages/UpdatePageRevisionDescription/feature.js.map +1 -0
- package/features/pages/UpdatePageRevisionDescription/index.d.ts +1 -0
- package/features/pages/UpdatePageRevisionDescription/index.js +1 -0
- package/features/permissions/abstractions.js +2 -1
- package/features/permissions/abstractions.js.map +1 -1
- package/features/permissions/feature.js +2 -1
- package/features/permissions/feature.js.map +1 -1
- package/features/redirects/CreateRedirect/CreateRedirectRepository.js +23 -21
- package/features/redirects/CreateRedirect/CreateRedirectRepository.js.map +1 -1
- package/features/redirects/CreateRedirect/CreateRedirectUseCase.js +29 -34
- package/features/redirects/CreateRedirect/CreateRedirectUseCase.js.map +1 -1
- package/features/redirects/CreateRedirect/abstractions.js +5 -30
- package/features/redirects/CreateRedirect/abstractions.js.map +1 -1
- package/features/redirects/CreateRedirect/events.js +16 -14
- package/features/redirects/CreateRedirect/events.js.map +1 -1
- package/features/redirects/CreateRedirect/feature.js +7 -6
- package/features/redirects/CreateRedirect/feature.js.map +1 -1
- package/features/redirects/CreateRedirect/index.js +1 -3
- package/features/redirects/DeleteRedirect/DeleteRedirectRepository.js +19 -17
- package/features/redirects/DeleteRedirect/DeleteRedirectRepository.js.map +1 -1
- package/features/redirects/DeleteRedirect/DeleteRedirectUseCase.js +34 -41
- package/features/redirects/DeleteRedirect/DeleteRedirectUseCase.js.map +1 -1
- package/features/redirects/DeleteRedirect/abstractions.js +5 -30
- package/features/redirects/DeleteRedirect/abstractions.js.map +1 -1
- package/features/redirects/DeleteRedirect/events.js +16 -14
- package/features/redirects/DeleteRedirect/events.js.map +1 -1
- package/features/redirects/DeleteRedirect/feature.js +7 -6
- package/features/redirects/DeleteRedirect/feature.js.map +1 -1
- package/features/redirects/DeleteRedirect/index.js +1 -3
- package/features/redirects/GetActiveRedirects/GetActiveRedirectsRepository.js +22 -21
- package/features/redirects/GetActiveRedirects/GetActiveRedirectsRepository.js.map +1 -1
- package/features/redirects/GetActiveRedirects/GetActiveRedirectsUseCase.js +17 -15
- package/features/redirects/GetActiveRedirects/GetActiveRedirectsUseCase.js.map +1 -1
- package/features/redirects/GetActiveRedirects/abstractions.js +3 -13
- package/features/redirects/GetActiveRedirects/abstractions.js.map +1 -1
- package/features/redirects/GetActiveRedirects/feature.js +7 -6
- package/features/redirects/GetActiveRedirects/feature.js.map +1 -1
- package/features/redirects/GetActiveRedirects/index.js +0 -2
- package/features/redirects/GetRedirectById/GetRedirectByIdRepository.js +20 -18
- package/features/redirects/GetRedirectById/GetRedirectByIdRepository.js.map +1 -1
- package/features/redirects/GetRedirectById/GetRedirectByIdUseCase.js +20 -22
- package/features/redirects/GetRedirectById/GetRedirectByIdUseCase.js.map +1 -1
- package/features/redirects/GetRedirectById/abstractions.js +3 -13
- package/features/redirects/GetRedirectById/abstractions.js.map +1 -1
- package/features/redirects/GetRedirectById/feature.js +7 -6
- package/features/redirects/GetRedirectById/feature.js.map +1 -1
- package/features/redirects/GetRedirectById/index.js +0 -2
- package/features/redirects/InvalidateRedirectsCache/InvalidateRedirectsCacheUseCase.js +23 -20
- package/features/redirects/InvalidateRedirectsCache/InvalidateRedirectsCacheUseCase.js.map +1 -1
- package/features/redirects/InvalidateRedirectsCache/RedirectAfterCreateHandler.js +13 -16
- package/features/redirects/InvalidateRedirectsCache/RedirectAfterCreateHandler.js.map +1 -1
- package/features/redirects/InvalidateRedirectsCache/RedirectAfterDeleteHandler.js +13 -16
- package/features/redirects/InvalidateRedirectsCache/RedirectAfterDeleteHandler.js.map +1 -1
- package/features/redirects/InvalidateRedirectsCache/RedirectAfterUpdateHandler.js +13 -17
- package/features/redirects/InvalidateRedirectsCache/RedirectAfterUpdateHandler.js.map +1 -1
- package/features/redirects/InvalidateRedirectsCache/abstractions.js +2 -7
- package/features/redirects/InvalidateRedirectsCache/abstractions.js.map +1 -1
- package/features/redirects/InvalidateRedirectsCache/feature.js +9 -8
- package/features/redirects/InvalidateRedirectsCache/feature.js.map +1 -1
- package/features/redirects/InvalidateRedirectsCache/index.js +0 -2
- package/features/redirects/ListRedirects/ListRedirectsRepository.js +35 -34
- package/features/redirects/ListRedirects/ListRedirectsRepository.js.map +1 -1
- package/features/redirects/ListRedirects/ListRedirectsUseCase.js +28 -25
- package/features/redirects/ListRedirects/ListRedirectsUseCase.js.map +1 -1
- package/features/redirects/ListRedirects/abstractions.js +3 -17
- package/features/redirects/ListRedirects/abstractions.js.map +1 -1
- package/features/redirects/ListRedirects/feature.js +7 -6
- package/features/redirects/ListRedirects/feature.js.map +1 -1
- package/features/redirects/ListRedirects/index.js +0 -2
- package/features/redirects/MoveRedirect/MoveRedirectRepository.js +25 -27
- package/features/redirects/MoveRedirect/MoveRedirectRepository.js.map +1 -1
- package/features/redirects/MoveRedirect/MoveRedirectUseCase.js +39 -49
- package/features/redirects/MoveRedirect/MoveRedirectUseCase.js.map +1 -1
- package/features/redirects/MoveRedirect/abstractions.js +5 -30
- package/features/redirects/MoveRedirect/abstractions.js.map +1 -1
- package/features/redirects/MoveRedirect/events.js +16 -14
- package/features/redirects/MoveRedirect/events.js.map +1 -1
- package/features/redirects/MoveRedirect/feature.js +7 -6
- package/features/redirects/MoveRedirect/feature.js.map +1 -1
- package/features/redirects/MoveRedirect/index.js +1 -3
- package/features/redirects/UpdateRedirect/UpdateRedirectRepository.js +31 -35
- package/features/redirects/UpdateRedirect/UpdateRedirectRepository.js.map +1 -1
- package/features/redirects/UpdateRedirect/UpdateRedirectUseCase.js +44 -54
- package/features/redirects/UpdateRedirect/UpdateRedirectUseCase.js.map +1 -1
- package/features/redirects/UpdateRedirect/abstractions.js +5 -30
- package/features/redirects/UpdateRedirect/abstractions.js.map +1 -1
- package/features/redirects/UpdateRedirect/events.js +16 -14
- package/features/redirects/UpdateRedirect/events.js.map +1 -1
- package/features/redirects/UpdateRedirect/feature.js +7 -6
- package/features/redirects/UpdateRedirect/feature.js.map +1 -1
- package/features/redirects/UpdateRedirect/index.js +0 -2
- package/features/tenantManager/TenantModelExtension.js +52 -32
- package/features/tenantManager/TenantModelExtension.js.map +1 -1
- package/features/tenantManager/feature.js +6 -5
- package/features/tenantManager/feature.js.map +1 -1
- package/graphql/createGraphQL.js +15 -12
- package/graphql/createGraphQL.js.map +1 -1
- package/graphql/nextjs/NextjsGraphQLSchema.js +28 -29
- package/graphql/nextjs/NextjsGraphQLSchema.js.map +1 -1
- package/graphql/pages/pages.gql.js +221 -324
- package/graphql/pages/pages.gql.js.map +1 -1
- package/graphql/pages/pages.typeDefs.d.ts +1 -1
- package/graphql/pages/pages.typeDefs.js +7 -1
- package/graphql/pages/pages.typeDefs.js.map +1 -1
- package/graphql/redirects/redirects.gql.js +56 -86
- package/graphql/redirects/redirects.gql.js.map +1 -1
- package/graphql/redirects/redirects.typeDefs.js +3 -4
- package/graphql/redirects/redirects.typeDefs.js.map +1 -1
- package/index.d.ts +1 -1
- package/index.js +64 -61
- package/index.js.map +1 -1
- package/package.json +20 -20
- package/rest/ActiveRedirectDto.js +0 -3
- package/rest/ActiveRedirectRestMapper.js +10 -9
- package/rest/ActiveRedirectRestMapper.js.map +1 -1
- package/rest/getRedirects.js +19 -26
- package/rest/getRedirects.js.map +1 -1
- package/utils/ensureAuthentication.js +6 -9
- package/utils/ensureAuthentication.js.map +1 -1
- package/utils/resolve.js +7 -6
- package/utils/resolve.js.map +1 -1
- package/domain/shared/abstractions.js.map +0 -1
- package/exports/api/website-builder/nextjs.js.map +0 -1
- package/exports/api/website-builder/page.js.map +0 -1
- package/exports/api/website-builder/redirect.js.map +0 -1
- package/features/nextjs/index.js.map +0 -1
- package/features/pages/CreatePage/index.js.map +0 -1
- package/features/pages/CreatePageRevisionFrom/index.js.map +0 -1
- package/features/pages/DeletePage/index.js.map +0 -1
- package/features/pages/DuplicatePage/index.js.map +0 -1
- package/features/pages/GetDeletedPageById/index.js.map +0 -1
- package/features/pages/GetPageById/index.js.map +0 -1
- package/features/pages/GetPageByPath/index.js.map +0 -1
- package/features/pages/GetPageLanguagePaths/index.js.map +0 -1
- package/features/pages/GetPageRevisions/index.js.map +0 -1
- package/features/pages/ListDeletedPages/index.js.map +0 -1
- package/features/pages/ListPages/index.js.map +0 -1
- package/features/pages/MovePage/index.js.map +0 -1
- package/features/pages/PublishPage/index.js.map +0 -1
- package/features/pages/RestorePage/index.js.map +0 -1
- package/features/pages/TranslatePage/index.js.map +0 -1
- package/features/pages/TrashPage/index.js.map +0 -1
- package/features/pages/UnpublishPage/index.js.map +0 -1
- package/features/pages/UpdatePage/index.js.map +0 -1
- package/features/redirects/CreateRedirect/index.js.map +0 -1
- package/features/redirects/DeleteRedirect/index.js.map +0 -1
- package/features/redirects/GetActiveRedirects/index.js.map +0 -1
- package/features/redirects/GetRedirectById/index.js.map +0 -1
- package/features/redirects/InvalidateRedirectsCache/index.js.map +0 -1
- package/features/redirects/ListRedirects/index.js.map +0 -1
- package/features/redirects/MoveRedirect/index.js.map +0 -1
- package/features/redirects/UpdateRedirect/index.js.map +0 -1
- package/rest/ActiveRedirectDto.js.map +0 -1
|
@@ -1,278 +1,271 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
2
|
import { MarkdownContentBuilder } from "./MarkdownContentBuilder.js";
|
|
3
|
-
describe("MarkdownContentBuilder", ()
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
describe("MarkdownContentBuilder", ()=>{
|
|
4
|
+
let builder;
|
|
5
|
+
beforeEach(()=>{
|
|
6
|
+
builder = new MarkdownContentBuilder();
|
|
7
|
+
});
|
|
8
|
+
describe("add", ()=>{
|
|
9
|
+
it("should add sections to the end by default", ()=>{
|
|
10
|
+
builder.add("section1", "First section").add("section2", "Second section");
|
|
11
|
+
expect(builder.build()).toBe("First section\nSecond section");
|
|
12
|
+
});
|
|
13
|
+
it("should add section before specified id", ()=>{
|
|
14
|
+
builder.add("section1", "First").add("section2", "Second").add("section-middle", "Middle", {
|
|
15
|
+
before: "section2"
|
|
16
|
+
});
|
|
17
|
+
expect(builder.build()).toBe("First\nMiddle\nSecond");
|
|
18
|
+
});
|
|
19
|
+
it("should add section after specified id", ()=>{
|
|
20
|
+
builder.add("section1", "First").add("section2", "Second").add("section-middle", "Middle", {
|
|
21
|
+
after: "section1"
|
|
22
|
+
});
|
|
23
|
+
expect(builder.build()).toBe("First\nMiddle\nSecond");
|
|
24
|
+
});
|
|
25
|
+
it("should append to end if before id not found", ()=>{
|
|
26
|
+
builder.add("section1", "First").add("section2", "Second", {
|
|
27
|
+
before: "non-existent"
|
|
28
|
+
});
|
|
29
|
+
expect(builder.build()).toBe("First\nSecond");
|
|
30
|
+
});
|
|
31
|
+
it("should append to end if after id not found", ()=>{
|
|
32
|
+
builder.add("section1", "First").add("section2", "Second", {
|
|
33
|
+
after: "non-existent"
|
|
34
|
+
});
|
|
35
|
+
expect(builder.build()).toBe("First\nSecond");
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe("remove", ()=>{
|
|
39
|
+
it("should remove section by id", ()=>{
|
|
40
|
+
builder.add("section1", "First").add("section2", "Second").add("section3", "Third").remove("section2");
|
|
41
|
+
expect(builder.build()).toBe("First\nThird");
|
|
42
|
+
});
|
|
43
|
+
it("should handle removing non-existent id gracefully", ()=>{
|
|
44
|
+
builder.add("section1", "First").remove("non-existent");
|
|
45
|
+
expect(builder.build()).toBe("First");
|
|
46
|
+
});
|
|
47
|
+
it("should handle removing from empty builder", ()=>{
|
|
48
|
+
builder.remove("section1");
|
|
49
|
+
expect(builder.build()).toBe("");
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe("replace", ()=>{
|
|
53
|
+
it("should replace section content with string", ()=>{
|
|
54
|
+
builder.add("section1", "Original content").replace("section1", "Replaced content");
|
|
55
|
+
expect(builder.build()).toBe("Replaced content");
|
|
56
|
+
});
|
|
57
|
+
it("should replace section content with callback", ()=>{
|
|
58
|
+
builder.add("section1", "Original content").replace("section1", (current)=>current.toUpperCase());
|
|
59
|
+
expect(builder.build()).toBe("ORIGINAL CONTENT");
|
|
60
|
+
});
|
|
61
|
+
it("should pass current content to callback", ()=>{
|
|
62
|
+
builder.add("section1", "Hello").replace("section1", (current)=>`${current} World`);
|
|
63
|
+
expect(builder.build()).toBe("Hello World");
|
|
64
|
+
});
|
|
65
|
+
it("should handle callback that transforms content", ()=>{
|
|
66
|
+
builder.add("code", '```bash\necho "test"\n```').replace("code", (current)=>current.replace("bash", "javascript"));
|
|
67
|
+
expect(builder.build()).toBe('```javascript\necho "test"\n```');
|
|
68
|
+
});
|
|
69
|
+
it("should handle callback returning empty string", ()=>{
|
|
70
|
+
builder.add("section1", "Original").replace("section1", ()=>"");
|
|
71
|
+
expect(builder.build()).toBe("");
|
|
72
|
+
});
|
|
73
|
+
it("should handle replacing non-existent id with callback gracefully", ()=>{
|
|
74
|
+
builder.add("section1", "First").replace("non-existent", (current)=>current + " modified");
|
|
75
|
+
expect(builder.build()).toBe("First");
|
|
76
|
+
});
|
|
77
|
+
it("should maintain section position when replacing with callback", ()=>{
|
|
78
|
+
builder.add("section1", "First").add("section2", "Second").add("section3", "Third").replace("section2", (current)=>current.toUpperCase());
|
|
79
|
+
expect(builder.build()).toBe("First\nSECOND\nThird");
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe("complex scenarios with callbacks", ()=>{
|
|
83
|
+
it("should support plugin decoration with transformations", ()=>{
|
|
84
|
+
builder.setVariable("API_KEY", "wat_12345").add("section1", "Key: {API_KEY}").add("code", "```bash\nAPI_KEY={API_KEY}\n```");
|
|
85
|
+
builder.replace("code", (current)=>`⚠️ **Security Warning**: Keep this private!\n\n${current}`);
|
|
86
|
+
const result = builder.build();
|
|
87
|
+
expect(result).toContain("Security Warning");
|
|
88
|
+
expect(result).toContain("```bash");
|
|
89
|
+
});
|
|
90
|
+
it("should chain multiple replace operations", ()=>{
|
|
91
|
+
builder.add("text", "hello world").replace("text", (s)=>s.toUpperCase()).replace("text", (s)=>`**${s}**`).replace("text", (s)=>`${s}!!!`);
|
|
92
|
+
expect(builder.build()).toBe("**HELLO WORLD**!!!");
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe("variables", ()=>{
|
|
96
|
+
it("should set and substitute single variable", ()=>{
|
|
97
|
+
builder.setVariable("API_KEY", "wat_12345").add("section1", "Your API key is {API_KEY}");
|
|
98
|
+
expect(builder.build()).toBe("Your API key is wat_12345");
|
|
99
|
+
});
|
|
100
|
+
it("should set and substitute multiple variables", ()=>{
|
|
101
|
+
builder.setVariables({
|
|
102
|
+
API_KEY: "wat_12345",
|
|
103
|
+
HOST: "https://api.example.com",
|
|
104
|
+
TENANT: "root"
|
|
105
|
+
}).add("section1", "Key: {API_KEY}, Host: {HOST}, Tenant: {TENANT}");
|
|
106
|
+
expect(builder.build()).toBe("Key: wat_12345, Host: https://api.example.com, Tenant: root");
|
|
107
|
+
});
|
|
108
|
+
it("should substitute variables in multiple sections", ()=>{
|
|
109
|
+
builder.setVariable("API_KEY", "wat_12345").add("section1", "Section 1: {API_KEY}").add("section2", "Section 2: {API_KEY}");
|
|
110
|
+
expect(builder.build()).toBe("Section 1: wat_12345\nSection 2: wat_12345");
|
|
111
|
+
});
|
|
112
|
+
it("should handle variable replacement in code blocks", ()=>{
|
|
113
|
+
builder.setVariables({
|
|
114
|
+
API_KEY: "wat_12345",
|
|
115
|
+
HOST: "https://api.example.com"
|
|
116
|
+
}).add("code", "```bash\nAPI_KEY={API_KEY}\nHOST={HOST}\n```");
|
|
117
|
+
expect(builder.build()).toBe("```bash\nAPI_KEY=wat_12345\nHOST=https://api.example.com\n```");
|
|
118
|
+
});
|
|
119
|
+
it("should leave unmatched variables unchanged", ()=>{
|
|
120
|
+
builder.setVariable("API_KEY", "wat_12345").add("section1", "Key: {API_KEY}, Unknown: {UNKNOWN}");
|
|
121
|
+
expect(builder.build()).toBe("Key: wat_12345, Unknown: {UNKNOWN}");
|
|
122
|
+
});
|
|
123
|
+
it("should handle variables with special regex characters", ()=>{
|
|
124
|
+
builder.setVariable("VAR.NAME", "value1").setVariable("VAR$NAME", "value2").add("section1", "{VAR.NAME} and {VAR$NAME}");
|
|
125
|
+
expect(builder.build()).toBe("value1 and value2");
|
|
126
|
+
});
|
|
127
|
+
it("should get variable value", ()=>{
|
|
128
|
+
builder.setVariable("API_KEY", "wat_12345");
|
|
129
|
+
expect(builder.getVariable("API_KEY")).toBe("wat_12345");
|
|
130
|
+
});
|
|
131
|
+
it("should return undefined for non-existent variable", ()=>{
|
|
132
|
+
expect(builder.getVariable("NON_EXISTENT")).toBeUndefined();
|
|
133
|
+
});
|
|
134
|
+
it("should override variable when set multiple times", ()=>{
|
|
135
|
+
builder.setVariable("API_KEY", "old_value").setVariable("API_KEY", "new_value").add("section1", "{API_KEY}");
|
|
136
|
+
expect(builder.build()).toBe("new_value");
|
|
137
|
+
});
|
|
138
|
+
it("should handle multiple occurrences of same variable", ()=>{
|
|
139
|
+
builder.setVariable("NAME", "John").add("section1", "Hello {NAME}, welcome {NAME}!");
|
|
140
|
+
expect(builder.build()).toBe("Hello John, welcome John!");
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe("build", ()=>{
|
|
144
|
+
it("should use default newline separator", ()=>{
|
|
145
|
+
builder.add("section1", "First").add("section2", "Second");
|
|
146
|
+
expect(builder.build()).toBe("First\nSecond");
|
|
147
|
+
});
|
|
148
|
+
it("should use custom separator", ()=>{
|
|
149
|
+
builder.add("section1", "First").add("section2", "Second");
|
|
150
|
+
expect(builder.build("\n\n")).toBe("First\n\nSecond");
|
|
151
|
+
});
|
|
152
|
+
it("should return empty string for empty builder", ()=>{
|
|
153
|
+
expect(builder.build()).toBe("");
|
|
154
|
+
});
|
|
155
|
+
it("should handle single section", ()=>{
|
|
156
|
+
builder.add("section1", "Only section");
|
|
157
|
+
expect(builder.build()).toBe("Only section");
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
describe("method chaining", ()=>{
|
|
161
|
+
it("should support fluent interface", ()=>{
|
|
162
|
+
const result = builder.setVariable("NAME", "Test").add("section1", "Hello {NAME}").add("section2", "Second").remove("section2").add("section3", "Third").replace("section3", "Replaced").build();
|
|
163
|
+
expect(result).toBe("Hello Test\nReplaced");
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
describe("complex scenarios", ()=>{
|
|
167
|
+
it("should handle Next.js config example", ()=>{
|
|
168
|
+
const result = builder.setVariables({
|
|
169
|
+
API_KEY: "wat_12345678",
|
|
170
|
+
API_HOST: "https://example.cloudfront.net",
|
|
171
|
+
TENANT: "root"
|
|
172
|
+
}).add("description", "This is a configuration for **Webiny Next.js starter kit**:").add("env-vars", "```bash\nNEXT_PUBLIC_WEBSITE_BUILDER_API_KEY={API_KEY}\nNEXT_PUBLIC_WEBSITE_BUILDER_API_HOST={API_HOST}\nNEXT_PUBLIC_WEBSITE_BUILDER_API_TENANT={TENANT}\n```").build();
|
|
173
|
+
expect(result).toContain("wat_12345678");
|
|
174
|
+
expect(result).toContain("https://example.cloudfront.net");
|
|
175
|
+
expect(result).toContain("root");
|
|
176
|
+
expect(result).toContain("Webiny Next.js starter kit");
|
|
177
|
+
});
|
|
178
|
+
it("should support plugin decoration pattern", ()=>{
|
|
179
|
+
builder.setVariable("API_KEY", "original_key").add("section1", "Key: {API_KEY}");
|
|
180
|
+
builder.setVariable("API_KEY", "plugin_key").add("plugin-section", "Added by plugin: {API_KEY}", {
|
|
181
|
+
after: "section1"
|
|
182
|
+
});
|
|
183
|
+
const result = builder.build();
|
|
184
|
+
expect(result).toBe("Key: plugin_key\nAdded by plugin: plugin_key");
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
describe("deep variable interpolation", ()=>{
|
|
188
|
+
it("should handle single level nested variables", ()=>{
|
|
189
|
+
builder.setVariables({
|
|
190
|
+
LINK: "https://example.com",
|
|
191
|
+
DESCRIPTION: "Visit {LINK} for more info"
|
|
192
|
+
}).add("section1", "{DESCRIPTION}");
|
|
193
|
+
expect(builder.build()).toBe("Visit https://example.com for more info");
|
|
194
|
+
});
|
|
195
|
+
it("should handle multiple levels of nested variables", ()=>{
|
|
196
|
+
builder.setVariables({
|
|
197
|
+
BASE_URL: "https://example.com",
|
|
198
|
+
API_PATH: "{BASE_URL}/api",
|
|
199
|
+
FULL_ENDPOINT: "{API_PATH}/v1/users"
|
|
200
|
+
}).add("section1", "Endpoint: {FULL_ENDPOINT}");
|
|
201
|
+
expect(builder.build()).toBe("Endpoint: https://example.com/api/v1/users");
|
|
202
|
+
});
|
|
203
|
+
it("should handle variables in HTML links", ()=>{
|
|
204
|
+
builder.setVariables({
|
|
205
|
+
STARTER_KIT_LINK: "https://github.com/webiny/website-builder-nextjs",
|
|
206
|
+
DESCRIPTION: '<a href="{STARTER_KIT_LINK}" target="_blank">Webiny Next.js starter kit</a>'
|
|
207
|
+
}).add("section1", "{DESCRIPTION}");
|
|
208
|
+
expect(builder.build()).toBe('<a href="https://github.com/webiny/website-builder-nextjs" target="_blank">Webiny Next.js starter kit</a>');
|
|
209
|
+
});
|
|
210
|
+
it("should handle complex nested scenario from example", ()=>{
|
|
211
|
+
builder.setVariables({
|
|
212
|
+
DESCRIPTION: 'This is a configuration for <a href="{STARTER_KIT_LINK}" target="_blank">Webiny Next.js starter kit:</a>',
|
|
213
|
+
STARTER_KIT_LINK: "https://github.com/webiny/website-builder-nextjs",
|
|
214
|
+
API_TOKEN: "wat_12345",
|
|
215
|
+
API_HOST: "https://api.example.com",
|
|
216
|
+
ADMIN_HOST: "https://admin.example.com",
|
|
217
|
+
TENANT_ID: "root"
|
|
218
|
+
}).add("description", "{DESCRIPTION}");
|
|
219
|
+
const result = builder.build();
|
|
220
|
+
expect(result).toContain("https://github.com/webiny/website-builder-nextjs");
|
|
221
|
+
expect(result).toContain("Webiny Next.js starter kit");
|
|
222
|
+
expect(result).not.toContain("{STARTER_KIT_LINK}");
|
|
223
|
+
});
|
|
224
|
+
it("should handle variable that references another variable multiple times", ()=>{
|
|
225
|
+
builder.setVariables({
|
|
226
|
+
NAME: "John",
|
|
227
|
+
GREETING: "Hello {NAME}, welcome {NAME}!"
|
|
228
|
+
}).add("section1", "{GREETING}");
|
|
229
|
+
expect(builder.build()).toBe("Hello John, welcome John!");
|
|
230
|
+
});
|
|
231
|
+
it("should handle deep nesting (3+ levels)", ()=>{
|
|
232
|
+
builder.setVariables({
|
|
233
|
+
LEVEL_1: "base",
|
|
234
|
+
LEVEL_2: "{LEVEL_1}/path",
|
|
235
|
+
LEVEL_3: "{LEVEL_2}/more",
|
|
236
|
+
LEVEL_4: "{LEVEL_3}/final"
|
|
237
|
+
}).add("section1", "{LEVEL_4}");
|
|
238
|
+
expect(builder.build()).toBe("base/path/more/final");
|
|
239
|
+
});
|
|
240
|
+
it("should handle circular references gracefully", ()=>{
|
|
241
|
+
const consoleSpy = vi.spyOn(console, "warn").mockImplementation(()=>{});
|
|
242
|
+
builder.setVariables({
|
|
243
|
+
VAR_A: "Start {VAR_B}",
|
|
244
|
+
VAR_B: "{VAR_A} End"
|
|
245
|
+
}).add("section1", "{VAR_A}");
|
|
246
|
+
builder.build();
|
|
247
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Maximum interpolation depth reached"));
|
|
248
|
+
consoleSpy.mockRestore();
|
|
249
|
+
});
|
|
250
|
+
it("should stop at undefined variables and leave them as-is", ()=>{
|
|
251
|
+
builder.setVariables({
|
|
252
|
+
DEFINED: "value",
|
|
253
|
+
HAS_UNDEFINED: "{DEFINED} and {UNDEFINED}"
|
|
254
|
+
}).add("section1", "{HAS_UNDEFINED}");
|
|
255
|
+
expect(builder.build()).toBe("value and {UNDEFINED}");
|
|
256
|
+
});
|
|
257
|
+
it("should handle mixed defined and nested variables", ()=>{
|
|
258
|
+
builder.setVariables({
|
|
259
|
+
API_KEY: "key123",
|
|
260
|
+
HOST: "example.com",
|
|
261
|
+
CONFIG: "API_KEY={API_KEY}\nHOST={HOST}\nUNDEFINED={UNKNOWN}"
|
|
262
|
+
}).add("section1", "{CONFIG}");
|
|
263
|
+
const result = builder.build();
|
|
264
|
+
expect(result).toContain("API_KEY=key123");
|
|
265
|
+
expect(result).toContain("HOST=example.com");
|
|
266
|
+
expect(result).toContain("UNDEFINED={UNKNOWN}");
|
|
267
|
+
});
|
|
12
268
|
});
|
|
13
|
-
it("should add section before specified id", () => {
|
|
14
|
-
builder.add("section1", "First").add("section2", "Second").add("section-middle", "Middle", {
|
|
15
|
-
before: "section2"
|
|
16
|
-
});
|
|
17
|
-
expect(builder.build()).toBe("First\nMiddle\nSecond");
|
|
18
|
-
});
|
|
19
|
-
it("should add section after specified id", () => {
|
|
20
|
-
builder.add("section1", "First").add("section2", "Second").add("section-middle", "Middle", {
|
|
21
|
-
after: "section1"
|
|
22
|
-
});
|
|
23
|
-
expect(builder.build()).toBe("First\nMiddle\nSecond");
|
|
24
|
-
});
|
|
25
|
-
it("should append to end if before id not found", () => {
|
|
26
|
-
builder.add("section1", "First").add("section2", "Second", {
|
|
27
|
-
before: "non-existent"
|
|
28
|
-
});
|
|
29
|
-
expect(builder.build()).toBe("First\nSecond");
|
|
30
|
-
});
|
|
31
|
-
it("should append to end if after id not found", () => {
|
|
32
|
-
builder.add("section1", "First").add("section2", "Second", {
|
|
33
|
-
after: "non-existent"
|
|
34
|
-
});
|
|
35
|
-
expect(builder.build()).toBe("First\nSecond");
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
describe("remove", () => {
|
|
39
|
-
it("should remove section by id", () => {
|
|
40
|
-
builder.add("section1", "First").add("section2", "Second").add("section3", "Third").remove("section2");
|
|
41
|
-
expect(builder.build()).toBe("First\nThird");
|
|
42
|
-
});
|
|
43
|
-
it("should handle removing non-existent id gracefully", () => {
|
|
44
|
-
builder.add("section1", "First").remove("non-existent");
|
|
45
|
-
expect(builder.build()).toBe("First");
|
|
46
|
-
});
|
|
47
|
-
it("should handle removing from empty builder", () => {
|
|
48
|
-
builder.remove("section1");
|
|
49
|
-
expect(builder.build()).toBe("");
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
describe("replace", () => {
|
|
53
|
-
it("should replace section content with string", () => {
|
|
54
|
-
builder.add("section1", "Original content").replace("section1", "Replaced content");
|
|
55
|
-
expect(builder.build()).toBe("Replaced content");
|
|
56
|
-
});
|
|
57
|
-
it("should replace section content with callback", () => {
|
|
58
|
-
builder.add("section1", "Original content").replace("section1", current => current.toUpperCase());
|
|
59
|
-
expect(builder.build()).toBe("ORIGINAL CONTENT");
|
|
60
|
-
});
|
|
61
|
-
it("should pass current content to callback", () => {
|
|
62
|
-
builder.add("section1", "Hello").replace("section1", current => `${current} World`);
|
|
63
|
-
expect(builder.build()).toBe("Hello World");
|
|
64
|
-
});
|
|
65
|
-
it("should handle callback that transforms content", () => {
|
|
66
|
-
builder.add("code", '```bash\necho "test"\n```').replace("code", current => current.replace("bash", "javascript"));
|
|
67
|
-
expect(builder.build()).toBe('```javascript\necho "test"\n```');
|
|
68
|
-
});
|
|
69
|
-
it("should handle callback returning empty string", () => {
|
|
70
|
-
builder.add("section1", "Original").replace("section1", () => "");
|
|
71
|
-
expect(builder.build()).toBe("");
|
|
72
|
-
});
|
|
73
|
-
it("should handle replacing non-existent id with callback gracefully", () => {
|
|
74
|
-
builder.add("section1", "First").replace("non-existent", current => current + " modified");
|
|
75
|
-
expect(builder.build()).toBe("First");
|
|
76
|
-
});
|
|
77
|
-
it("should maintain section position when replacing with callback", () => {
|
|
78
|
-
builder.add("section1", "First").add("section2", "Second").add("section3", "Third").replace("section2", current => current.toUpperCase());
|
|
79
|
-
expect(builder.build()).toBe("First\nSECOND\nThird");
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
describe("complex scenarios with callbacks", () => {
|
|
83
|
-
it("should support plugin decoration with transformations", () => {
|
|
84
|
-
builder.setVariable("API_KEY", "wat_12345").add("section1", "Key: {API_KEY}").add("code", "```bash\nAPI_KEY={API_KEY}\n```");
|
|
85
|
-
|
|
86
|
-
// Plugin adds warning to code section
|
|
87
|
-
builder.replace("code", current => {
|
|
88
|
-
return `⚠️ **Security Warning**: Keep this private!\n\n${current}`;
|
|
89
|
-
});
|
|
90
|
-
const result = builder.build();
|
|
91
|
-
expect(result).toContain("Security Warning");
|
|
92
|
-
expect(result).toContain("```bash");
|
|
93
|
-
});
|
|
94
|
-
it("should chain multiple replace operations", () => {
|
|
95
|
-
builder.add("text", "hello world").replace("text", s => s.toUpperCase()).replace("text", s => `**${s}**`).replace("text", s => `${s}!!!`);
|
|
96
|
-
expect(builder.build()).toBe("**HELLO WORLD**!!!");
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
describe("variables", () => {
|
|
100
|
-
it("should set and substitute single variable", () => {
|
|
101
|
-
builder.setVariable("API_KEY", "wat_12345").add("section1", "Your API key is {API_KEY}");
|
|
102
|
-
expect(builder.build()).toBe("Your API key is wat_12345");
|
|
103
|
-
});
|
|
104
|
-
it("should set and substitute multiple variables", () => {
|
|
105
|
-
builder.setVariables({
|
|
106
|
-
API_KEY: "wat_12345",
|
|
107
|
-
HOST: "https://api.example.com",
|
|
108
|
-
TENANT: "root"
|
|
109
|
-
}).add("section1", "Key: {API_KEY}, Host: {HOST}, Tenant: {TENANT}");
|
|
110
|
-
expect(builder.build()).toBe("Key: wat_12345, Host: https://api.example.com, Tenant: root");
|
|
111
|
-
});
|
|
112
|
-
it("should substitute variables in multiple sections", () => {
|
|
113
|
-
builder.setVariable("API_KEY", "wat_12345").add("section1", "Section 1: {API_KEY}").add("section2", "Section 2: {API_KEY}");
|
|
114
|
-
expect(builder.build()).toBe("Section 1: wat_12345\nSection 2: wat_12345");
|
|
115
|
-
});
|
|
116
|
-
it("should handle variable replacement in code blocks", () => {
|
|
117
|
-
builder.setVariables({
|
|
118
|
-
API_KEY: "wat_12345",
|
|
119
|
-
HOST: "https://api.example.com"
|
|
120
|
-
}).add("code", "```bash\nAPI_KEY={API_KEY}\nHOST={HOST}\n```");
|
|
121
|
-
expect(builder.build()).toBe("```bash\nAPI_KEY=wat_12345\nHOST=https://api.example.com\n```");
|
|
122
|
-
});
|
|
123
|
-
it("should leave unmatched variables unchanged", () => {
|
|
124
|
-
builder.setVariable("API_KEY", "wat_12345").add("section1", "Key: {API_KEY}, Unknown: {UNKNOWN}");
|
|
125
|
-
expect(builder.build()).toBe("Key: wat_12345, Unknown: {UNKNOWN}");
|
|
126
|
-
});
|
|
127
|
-
it("should handle variables with special regex characters", () => {
|
|
128
|
-
builder.setVariable("VAR.NAME", "value1").setVariable("VAR$NAME", "value2").add("section1", "{VAR.NAME} and {VAR$NAME}");
|
|
129
|
-
expect(builder.build()).toBe("value1 and value2");
|
|
130
|
-
});
|
|
131
|
-
it("should get variable value", () => {
|
|
132
|
-
builder.setVariable("API_KEY", "wat_12345");
|
|
133
|
-
expect(builder.getVariable("API_KEY")).toBe("wat_12345");
|
|
134
|
-
});
|
|
135
|
-
it("should return undefined for non-existent variable", () => {
|
|
136
|
-
expect(builder.getVariable("NON_EXISTENT")).toBeUndefined();
|
|
137
|
-
});
|
|
138
|
-
it("should override variable when set multiple times", () => {
|
|
139
|
-
builder.setVariable("API_KEY", "old_value").setVariable("API_KEY", "new_value").add("section1", "{API_KEY}");
|
|
140
|
-
expect(builder.build()).toBe("new_value");
|
|
141
|
-
});
|
|
142
|
-
it("should handle multiple occurrences of same variable", () => {
|
|
143
|
-
builder.setVariable("NAME", "John").add("section1", "Hello {NAME}, welcome {NAME}!");
|
|
144
|
-
expect(builder.build()).toBe("Hello John, welcome John!");
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
describe("build", () => {
|
|
148
|
-
it("should use default newline separator", () => {
|
|
149
|
-
builder.add("section1", "First").add("section2", "Second");
|
|
150
|
-
expect(builder.build()).toBe("First\nSecond");
|
|
151
|
-
});
|
|
152
|
-
it("should use custom separator", () => {
|
|
153
|
-
builder.add("section1", "First").add("section2", "Second");
|
|
154
|
-
expect(builder.build("\n\n")).toBe("First\n\nSecond");
|
|
155
|
-
});
|
|
156
|
-
it("should return empty string for empty builder", () => {
|
|
157
|
-
expect(builder.build()).toBe("");
|
|
158
|
-
});
|
|
159
|
-
it("should handle single section", () => {
|
|
160
|
-
builder.add("section1", "Only section");
|
|
161
|
-
expect(builder.build()).toBe("Only section");
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
describe("method chaining", () => {
|
|
165
|
-
it("should support fluent interface", () => {
|
|
166
|
-
const result = builder.setVariable("NAME", "Test").add("section1", "Hello {NAME}").add("section2", "Second").remove("section2").add("section3", "Third").replace("section3", "Replaced").build();
|
|
167
|
-
expect(result).toBe("Hello Test\nReplaced");
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
describe("complex scenarios", () => {
|
|
171
|
-
it("should handle Next.js config example", () => {
|
|
172
|
-
const result = builder.setVariables({
|
|
173
|
-
API_KEY: "wat_12345678",
|
|
174
|
-
API_HOST: "https://example.cloudfront.net",
|
|
175
|
-
TENANT: "root"
|
|
176
|
-
}).add("description", "This is a configuration for **Webiny Next.js starter kit**:").add("env-vars", "```bash\nNEXT_PUBLIC_WEBSITE_BUILDER_API_KEY={API_KEY}\nNEXT_PUBLIC_WEBSITE_BUILDER_API_HOST={API_HOST}\nNEXT_PUBLIC_WEBSITE_BUILDER_API_TENANT={TENANT}\n```").build();
|
|
177
|
-
expect(result).toContain("wat_12345678");
|
|
178
|
-
expect(result).toContain("https://example.cloudfront.net");
|
|
179
|
-
expect(result).toContain("root");
|
|
180
|
-
expect(result).toContain("Webiny Next.js starter kit");
|
|
181
|
-
});
|
|
182
|
-
it("should support plugin decoration pattern", () => {
|
|
183
|
-
// Initial builder
|
|
184
|
-
builder.setVariable("API_KEY", "original_key").add("section1", "Key: {API_KEY}");
|
|
185
|
-
|
|
186
|
-
// Plugin modifies
|
|
187
|
-
builder.setVariable("API_KEY", "plugin_key").add("plugin-section", "Added by plugin: {API_KEY}", {
|
|
188
|
-
after: "section1"
|
|
189
|
-
});
|
|
190
|
-
const result = builder.build();
|
|
191
|
-
expect(result).toBe("Key: plugin_key\nAdded by plugin: plugin_key");
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
describe("deep variable interpolation", () => {
|
|
195
|
-
it("should handle single level nested variables", () => {
|
|
196
|
-
builder.setVariables({
|
|
197
|
-
LINK: "https://example.com",
|
|
198
|
-
DESCRIPTION: "Visit {LINK} for more info"
|
|
199
|
-
}).add("section1", "{DESCRIPTION}");
|
|
200
|
-
expect(builder.build()).toBe("Visit https://example.com for more info");
|
|
201
|
-
});
|
|
202
|
-
it("should handle multiple levels of nested variables", () => {
|
|
203
|
-
builder.setVariables({
|
|
204
|
-
BASE_URL: "https://example.com",
|
|
205
|
-
API_PATH: "{BASE_URL}/api",
|
|
206
|
-
FULL_ENDPOINT: "{API_PATH}/v1/users"
|
|
207
|
-
}).add("section1", "Endpoint: {FULL_ENDPOINT}");
|
|
208
|
-
expect(builder.build()).toBe("Endpoint: https://example.com/api/v1/users");
|
|
209
|
-
});
|
|
210
|
-
it("should handle variables in HTML links", () => {
|
|
211
|
-
builder.setVariables({
|
|
212
|
-
STARTER_KIT_LINK: "https://github.com/webiny/website-builder-nextjs",
|
|
213
|
-
DESCRIPTION: '<a href="{STARTER_KIT_LINK}" target="_blank">Webiny Next.js starter kit</a>'
|
|
214
|
-
}).add("section1", "{DESCRIPTION}");
|
|
215
|
-
expect(builder.build()).toBe('<a href="https://github.com/webiny/website-builder-nextjs" target="_blank">Webiny Next.js starter kit</a>');
|
|
216
|
-
});
|
|
217
|
-
it("should handle complex nested scenario from example", () => {
|
|
218
|
-
builder.setVariables({
|
|
219
|
-
DESCRIPTION: 'This is a configuration for <a href="{STARTER_KIT_LINK}" target="_blank">Webiny Next.js starter kit:</a>',
|
|
220
|
-
STARTER_KIT_LINK: "https://github.com/webiny/website-builder-nextjs",
|
|
221
|
-
API_TOKEN: "wat_12345",
|
|
222
|
-
API_HOST: "https://api.example.com",
|
|
223
|
-
ADMIN_HOST: "https://admin.example.com",
|
|
224
|
-
TENANT_ID: "root"
|
|
225
|
-
}).add("description", "{DESCRIPTION}");
|
|
226
|
-
const result = builder.build();
|
|
227
|
-
expect(result).toContain("https://github.com/webiny/website-builder-nextjs");
|
|
228
|
-
expect(result).toContain("Webiny Next.js starter kit");
|
|
229
|
-
expect(result).not.toContain("{STARTER_KIT_LINK}");
|
|
230
|
-
});
|
|
231
|
-
it("should handle variable that references another variable multiple times", () => {
|
|
232
|
-
builder.setVariables({
|
|
233
|
-
NAME: "John",
|
|
234
|
-
GREETING: "Hello {NAME}, welcome {NAME}!"
|
|
235
|
-
}).add("section1", "{GREETING}");
|
|
236
|
-
expect(builder.build()).toBe("Hello John, welcome John!");
|
|
237
|
-
});
|
|
238
|
-
it("should handle deep nesting (3+ levels)", () => {
|
|
239
|
-
builder.setVariables({
|
|
240
|
-
LEVEL_1: "base",
|
|
241
|
-
LEVEL_2: "{LEVEL_1}/path",
|
|
242
|
-
LEVEL_3: "{LEVEL_2}/more",
|
|
243
|
-
LEVEL_4: "{LEVEL_3}/final"
|
|
244
|
-
}).add("section1", "{LEVEL_4}");
|
|
245
|
-
expect(builder.build()).toBe("base/path/more/final");
|
|
246
|
-
});
|
|
247
|
-
it("should handle circular references gracefully", () => {
|
|
248
|
-
const consoleSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
249
|
-
builder.setVariables({
|
|
250
|
-
VAR_A: "Start {VAR_B}",
|
|
251
|
-
VAR_B: "{VAR_A} End"
|
|
252
|
-
}).add("section1", "{VAR_A}");
|
|
253
|
-
builder.build();
|
|
254
|
-
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Maximum interpolation depth reached"));
|
|
255
|
-
consoleSpy.mockRestore();
|
|
256
|
-
});
|
|
257
|
-
it("should stop at undefined variables and leave them as-is", () => {
|
|
258
|
-
builder.setVariables({
|
|
259
|
-
DEFINED: "value",
|
|
260
|
-
HAS_UNDEFINED: "{DEFINED} and {UNDEFINED}"
|
|
261
|
-
}).add("section1", "{HAS_UNDEFINED}");
|
|
262
|
-
expect(builder.build()).toBe("value and {UNDEFINED}");
|
|
263
|
-
});
|
|
264
|
-
it("should handle mixed defined and nested variables", () => {
|
|
265
|
-
builder.setVariables({
|
|
266
|
-
API_KEY: "key123",
|
|
267
|
-
HOST: "example.com",
|
|
268
|
-
CONFIG: "API_KEY={API_KEY}\nHOST={HOST}\nUNDEFINED={UNKNOWN}"
|
|
269
|
-
}).add("section1", "{CONFIG}");
|
|
270
|
-
const result = builder.build();
|
|
271
|
-
expect(result).toContain("API_KEY=key123");
|
|
272
|
-
expect(result).toContain("HOST=example.com");
|
|
273
|
-
expect(result).toContain("UNDEFINED={UNKNOWN}");
|
|
274
|
-
});
|
|
275
|
-
});
|
|
276
269
|
});
|
|
277
270
|
|
|
278
271
|
//# sourceMappingURL=MarkdownContentBuilder.test.js.map
|