@strapi/admin 5.55.0 → 5.56.0

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 (120) hide show
  1. package/dist/admin/admin/src/components/UpsellBanner.js +9 -16
  2. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  3. package/dist/admin/admin/src/components/UpsellBanner.mjs +11 -18
  4. package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
  5. package/dist/admin/admin/src/render.js +4 -69
  6. package/dist/admin/admin/src/render.js.map +1 -1
  7. package/dist/admin/admin/src/render.mjs +4 -69
  8. package/dist/admin/admin/src/render.mjs.map +1 -1
  9. package/dist/admin/admin/src/translations/en.json.js +10 -0
  10. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  11. package/dist/admin/admin/src/translations/en.json.mjs +10 -0
  12. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  13. package/dist/admin/admin/src/utils/browserStrapi.js +93 -0
  14. package/dist/admin/admin/src/utils/browserStrapi.js.map +1 -0
  15. package/dist/admin/admin/src/utils/browserStrapi.mjs +91 -0
  16. package/dist/admin/admin/src/utils/browserStrapi.mjs.map +1 -0
  17. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.js +2 -1
  18. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.js.map +1 -1
  19. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs +2 -1
  20. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs.map +1 -1
  21. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +11 -1
  22. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
  23. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +11 -1
  24. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
  25. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.js +3 -1
  26. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.js.map +1 -1
  27. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.mjs +3 -1
  28. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.mjs.map +1 -1
  29. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.js +64 -0
  30. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.js.map +1 -0
  31. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.mjs +60 -0
  32. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.mjs.map +1 -0
  33. package/dist/admin/ee/admin/src/services/auditLogs.js +2 -1
  34. package/dist/admin/ee/admin/src/services/auditLogs.js.map +1 -1
  35. package/dist/admin/ee/admin/src/services/auditLogs.mjs +2 -1
  36. package/dist/admin/ee/admin/src/services/auditLogs.mjs.map +1 -1
  37. package/dist/admin/src/components/SubNav.d.ts +2 -2
  38. package/dist/admin/src/utils/browserStrapi.d.ts +11 -0
  39. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +10 -0
  40. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/legacyActions.d.ts +14 -0
  41. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +10 -1
  42. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
  43. package/dist/ee/server/src/controllers/admin.d.ts +2 -28
  44. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  45. package/dist/ee/server/src/controllers/index.d.ts +1 -28
  46. package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
  47. package/dist/ee/server/src/index.d.ts +2 -29
  48. package/dist/ee/server/src/index.d.ts.map +1 -1
  49. package/dist/ee/server/src/services/auth.d.ts +1 -1
  50. package/dist/ee/server/src/services/auth.d.ts.map +1 -1
  51. package/dist/ee/server/src/services/index.d.ts +1 -1
  52. package/dist/ee/server/src/services/user.d.ts.map +1 -1
  53. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +37 -21
  54. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
  55. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +37 -21
  56. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
  57. package/dist/server/ee/server/src/controllers/admin.js +5 -3
  58. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  59. package/dist/server/ee/server/src/controllers/admin.mjs +5 -3
  60. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  61. package/dist/server/ee/server/src/index.js +4 -0
  62. package/dist/server/ee/server/src/index.js.map +1 -1
  63. package/dist/server/ee/server/src/index.mjs +4 -0
  64. package/dist/server/ee/server/src/index.mjs.map +1 -1
  65. package/dist/server/ee/server/src/services/auth.js +1 -6
  66. package/dist/server/ee/server/src/services/auth.js.map +1 -1
  67. package/dist/server/ee/server/src/services/auth.mjs +2 -7
  68. package/dist/server/ee/server/src/services/auth.mjs.map +1 -1
  69. package/dist/server/ee/server/src/services/user.js +36 -4
  70. package/dist/server/ee/server/src/services/user.js.map +1 -1
  71. package/dist/server/ee/server/src/services/user.mjs +36 -4
  72. package/dist/server/ee/server/src/services/user.mjs.map +1 -1
  73. package/dist/server/server/src/audit-logs/admin-users.js +169 -0
  74. package/dist/server/server/src/audit-logs/admin-users.js.map +1 -0
  75. package/dist/server/server/src/audit-logs/admin-users.mjs +157 -0
  76. package/dist/server/server/src/audit-logs/admin-users.mjs.map +1 -0
  77. package/dist/server/server/src/audit-logs/webhooks.js +106 -0
  78. package/dist/server/server/src/audit-logs/webhooks.js.map +1 -0
  79. package/dist/server/server/src/audit-logs/webhooks.mjs +100 -0
  80. package/dist/server/server/src/audit-logs/webhooks.mjs.map +1 -0
  81. package/dist/server/server/src/controllers/admin.js +1 -0
  82. package/dist/server/server/src/controllers/admin.js.map +1 -1
  83. package/dist/server/server/src/controllers/admin.mjs +1 -0
  84. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  85. package/dist/server/server/src/controllers/authentication.js +8 -1
  86. package/dist/server/server/src/controllers/authentication.js.map +1 -1
  87. package/dist/server/server/src/controllers/authentication.mjs +8 -1
  88. package/dist/server/server/src/controllers/authentication.mjs.map +1 -1
  89. package/dist/server/server/src/controllers/webhooks.js +26 -0
  90. package/dist/server/server/src/controllers/webhooks.js.map +1 -1
  91. package/dist/server/server/src/controllers/webhooks.mjs +27 -1
  92. package/dist/server/server/src/controllers/webhooks.mjs.map +1 -1
  93. package/dist/server/server/src/services/auth.js +27 -6
  94. package/dist/server/server/src/services/auth.js.map +1 -1
  95. package/dist/server/server/src/services/auth.mjs +28 -8
  96. package/dist/server/server/src/services/auth.mjs.map +1 -1
  97. package/dist/server/server/src/services/user.js +48 -9
  98. package/dist/server/server/src/services/user.js.map +1 -1
  99. package/dist/server/server/src/services/user.mjs +49 -10
  100. package/dist/server/server/src/services/user.mjs.map +1 -1
  101. package/dist/server/src/audit-logs/admin-users.d.ts +119 -0
  102. package/dist/server/src/audit-logs/admin-users.d.ts.map +1 -0
  103. package/dist/server/src/audit-logs/webhooks.d.ts +59 -0
  104. package/dist/server/src/audit-logs/webhooks.d.ts.map +1 -0
  105. package/dist/server/src/controllers/admin.d.ts +2 -11
  106. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  107. package/dist/server/src/controllers/authentication.d.ts.map +1 -1
  108. package/dist/server/src/controllers/index.d.ts +1 -10
  109. package/dist/server/src/controllers/index.d.ts.map +1 -1
  110. package/dist/server/src/controllers/webhooks.d.ts.map +1 -1
  111. package/dist/server/src/domain/user.d.ts +2 -2
  112. package/dist/server/src/index.d.ts +1 -10
  113. package/dist/server/src/index.d.ts.map +1 -1
  114. package/dist/server/src/services/auth.d.ts +6 -1
  115. package/dist/server/src/services/auth.d.ts.map +1 -1
  116. package/dist/server/src/services/index.d.ts.map +1 -1
  117. package/dist/server/src/services/user.d.ts.map +1 -1
  118. package/dist/shared/contracts/admin.d.ts +36 -2
  119. package/dist/shared/contracts/admin.d.ts.map +1 -1
  120. package/package.json +11 -11
@@ -7,24 +7,11 @@ var designSystem = require('@strapi/design-system');
7
7
  var icons = require('@strapi/icons');
8
8
  var dateFns = require('date-fns');
9
9
  var reactIntl = require('react-intl');
10
- var styledComponents = require('styled-components');
11
10
  var admin = require('../services/admin.js');
11
+ var theme = require('../constants/theme.js');
12
12
  var usePersistentState = require('../hooks/usePersistentState.js');
13
13
  var DismissibleBanner = require('./DismissibleBanner.js');
14
14
 
15
- /**
16
- * Unlike `DismissibleBanner`'s own close button, this has no banner box left to
17
- * anchor to once dismissed (the banner unmounts entirely), so it stays pinned
18
- * to the viewport instead.
19
- */ const FixedButtonWrapper = styledComponents.styled(designSystem.Box)`
20
- position: fixed;
21
- display: flex;
22
- flex-direction: column;
23
- z-index: 1;
24
- align-items: flex-end;
25
- top: 9px;
26
- right: 16px;
27
- `;
28
15
  const Banner = ({ isTrialEndedRecently, onDismiss })=>{
29
16
  const { formatMessage } = reactIntl.useIntl();
30
17
  return /*#__PURE__*/ jsxRuntime.jsx(DismissibleBanner.DismissibleBanner, {
@@ -113,15 +100,21 @@ const UpsellBanner = ()=>{
113
100
  return null;
114
101
  }
115
102
  if (isDismissed) {
116
- return /*#__PURE__*/ jsxRuntime.jsx(FixedButtonWrapper, {
103
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
104
+ justifyContent: "flex-end",
105
+ paddingTop: 1,
106
+ paddingBottom: 1,
107
+ paddingLeft: theme.RESPONSIVE_DEFAULT_SPACING,
108
+ paddingRight: theme.RESPONSIVE_DEFAULT_SPACING,
117
109
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
110
+ variant: "ghost",
118
111
  withTooltip: false,
119
112
  label: formatMessage({
120
113
  id: 'app.components.UpsellBanner.reopen',
121
114
  defaultMessage: 'Reopen banner'
122
115
  }),
123
116
  onClick: handleReopen,
124
- children: /*#__PURE__*/ jsxRuntime.jsx(icons.ArrowsOut, {})
117
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronUp, {})
125
118
  })
126
119
  });
127
120
  }
@@ -1 +1 @@
1
- {"version":3,"file":"UpsellBanner.js","sources":["../../../../../admin/src/components/UpsellBanner.tsx"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport { Box, IconButton, LinkButton, Typography } from '@strapi/design-system';\nimport { ArrowsOut } from '@strapi/icons';\nimport { isAfter, isValid, subDays } from 'date-fns';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useGetLicenseTrialTimeLeftQuery } from '../../src/services/admin';\nimport { useScopedPersistentState } from '../hooks/usePersistentState';\n\nimport { DismissibleBanner } from './DismissibleBanner';\n\n/**\n * Unlike `DismissibleBanner`'s own close button, this has no banner box left to\n * anchor to once dismissed (the banner unmounts entirely), so it stays pinned\n * to the viewport instead.\n */\nconst FixedButtonWrapper = styled(Box)`\n position: fixed;\n display: flex;\n flex-direction: column;\n z-index: 1;\n align-items: flex-end;\n top: 9px;\n right: 16px;\n`;\n\nconst Banner = ({\n isTrialEndedRecently,\n onDismiss,\n}: {\n isTrialEndedRecently: boolean;\n onDismiss: () => void;\n}) => {\n const { formatMessage } = useIntl();\n\n return (\n <DismissibleBanner\n onDismiss={onDismiss}\n closeLabel={formatMessage({\n id: 'app.components.UpsellBanner.close',\n defaultMessage: 'Close',\n })}\n message={\n <>\n <Typography\n variant=\"delta\"\n fontWeight=\"bold\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n fontSize={2}\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.intro.ended',\n defaultMessage: 'Your trial has ended: ',\n }\n : {\n id: 'app.components.UpsellBanner.intro',\n defaultMessage: 'Access to Growth plan features: ',\n }\n )}\n </Typography>\n <Typography\n variant=\"delta\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n paddingRight={4}\n fontSize={2}\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.text.ended',\n defaultMessage: 'Keep access to Growth features by upgrading now.',\n }\n : {\n id: 'app.components.UpsellBanner.text',\n defaultMessage:\n 'As part of your trial, you can explore premium tools such as Content History, Releases, and Single Sign-On (SSO).',\n }\n )}\n </Typography>\n </>\n }\n action={\n <LinkButton\n width=\"max-content\"\n variant=\"tertiary\"\n href=\"https://billing.strapi.io\"\n target=\"_blank\"\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.button.ended',\n defaultMessage: 'Keep Growth plan',\n }\n : {\n id: 'app.components.UpsellBanner.button',\n defaultMessage: 'Upgrade now',\n }\n )}\n </LinkButton>\n }\n />\n );\n};\n\nconst UpsellBanner = () => {\n const { license } = useLicenseLimits();\n const { formatMessage } = useIntl();\n\n const [cachedTrialEndsAt, setCachedTrialEndsAt] = useScopedPersistentState<string | undefined>(\n 'STRAPI_FREE_TRIAL_ENDS_AT',\n undefined\n );\n\n const [dismissedFor, setDismissedFor] = useScopedPersistentState<string | undefined>(\n 'STRAPI_UPSELL_BANNER_DISMISSED_FOR',\n undefined\n );\n\n const sevenDaysAgo = subDays(new Date(), 7);\n\n const timeLeftData = useGetLicenseTrialTimeLeftQuery(undefined, {\n skip: !license?.isTrial,\n });\n\n useEffect(() => {\n if (timeLeftData.data?.trialEndsAt) {\n setCachedTrialEndsAt(timeLeftData.data.trialEndsAt);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [timeLeftData.data?.trialEndsAt]);\n\n // When the license is not a trial + not EE, and the cached trial end date is found in the localstorage, that means the trial has ended\n // We show the banner to encourage the user to upgrade (for 7 days after the trial ends)\n const isTrialEndedRecently = Boolean(\n !license?.isTrial &&\n !window.strapi.isEE &&\n cachedTrialEndsAt &&\n isAfter(new Date(cachedTrialEndsAt), sevenDaysAgo)\n );\n\n const trialEndsAt = timeLeftData.data?.trialEndsAt ?? cachedTrialEndsAt;\n\n const toCanonicalISO = (v: string | undefined): string | undefined => {\n if (!v) return undefined;\n const date = new Date(v);\n return isValid(date) ? date.toISOString() : undefined;\n };\n\n const isDismissed = Boolean(\n trialEndsAt && toCanonicalISO(dismissedFor) === toCanonicalISO(trialEndsAt)\n );\n\n const handleDismiss = () => setDismissedFor(toCanonicalISO(trialEndsAt));\n const handleReopen = () => setDismissedFor(undefined);\n\n if (!(timeLeftData.data?.trialEndsAt || isTrialEndedRecently)) {\n return null;\n }\n\n if (isDismissed) {\n return (\n <FixedButtonWrapper>\n <IconButton\n withTooltip={false}\n label={formatMessage({\n id: 'app.components.UpsellBanner.reopen',\n defaultMessage: 'Reopen banner',\n })}\n onClick={handleReopen}\n >\n <ArrowsOut />\n </IconButton>\n </FixedButtonWrapper>\n );\n }\n\n return <Banner isTrialEndedRecently={isTrialEndedRecently} onDismiss={handleDismiss} />;\n};\n\nexport { UpsellBanner };\n"],"names":["FixedButtonWrapper","styled","Box","Banner","isTrialEndedRecently","onDismiss","formatMessage","useIntl","_jsx","DismissibleBanner","closeLabel","id","defaultMessage","message","_jsxs","_Fragment","Typography","variant","fontWeight","textColor","textAlign","fontSize","paddingRight","action","LinkButton","width","href","target","UpsellBanner","license","useLicenseLimits","cachedTrialEndsAt","setCachedTrialEndsAt","useScopedPersistentState","undefined","dismissedFor","setDismissedFor","sevenDaysAgo","subDays","Date","timeLeftData","useGetLicenseTrialTimeLeftQuery","skip","isTrial","useEffect","data","trialEndsAt","Boolean","window","strapi","isEE","isAfter","toCanonicalISO","v","date","isValid","toISOString","isDismissed","handleDismiss","handleReopen","IconButton","withTooltip","label","onClick","ArrowsOut"],"mappings":"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"}
1
+ {"version":3,"file":"UpsellBanner.js","sources":["../../../../../admin/src/components/UpsellBanner.tsx"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport { Flex, IconButton, LinkButton, Typography } from '@strapi/design-system';\nimport { ChevronUp } from '@strapi/icons';\nimport { isAfter, isValid, subDays } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nimport { useGetLicenseTrialTimeLeftQuery } from '../../src/services/admin';\nimport { RESPONSIVE_DEFAULT_SPACING } from '../constants/theme';\nimport { useScopedPersistentState } from '../hooks/usePersistentState';\n\nimport { DismissibleBanner } from './DismissibleBanner';\n\nconst Banner = ({\n isTrialEndedRecently,\n onDismiss,\n}: {\n isTrialEndedRecently: boolean;\n onDismiss: () => void;\n}) => {\n const { formatMessage } = useIntl();\n\n return (\n <DismissibleBanner\n onDismiss={onDismiss}\n closeLabel={formatMessage({\n id: 'app.components.UpsellBanner.close',\n defaultMessage: 'Close',\n })}\n message={\n <>\n <Typography\n variant=\"delta\"\n fontWeight=\"bold\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n fontSize={2}\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.intro.ended',\n defaultMessage: 'Your trial has ended: ',\n }\n : {\n id: 'app.components.UpsellBanner.intro',\n defaultMessage: 'Access to Growth plan features: ',\n }\n )}\n </Typography>\n <Typography\n variant=\"delta\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n paddingRight={4}\n fontSize={2}\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.text.ended',\n defaultMessage: 'Keep access to Growth features by upgrading now.',\n }\n : {\n id: 'app.components.UpsellBanner.text',\n defaultMessage:\n 'As part of your trial, you can explore premium tools such as Content History, Releases, and Single Sign-On (SSO).',\n }\n )}\n </Typography>\n </>\n }\n action={\n <LinkButton\n width=\"max-content\"\n variant=\"tertiary\"\n href=\"https://billing.strapi.io\"\n target=\"_blank\"\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.button.ended',\n defaultMessage: 'Keep Growth plan',\n }\n : {\n id: 'app.components.UpsellBanner.button',\n defaultMessage: 'Upgrade now',\n }\n )}\n </LinkButton>\n }\n />\n );\n};\n\nconst UpsellBanner = () => {\n const { license } = useLicenseLimits();\n const { formatMessage } = useIntl();\n\n const [cachedTrialEndsAt, setCachedTrialEndsAt] = useScopedPersistentState<string | undefined>(\n 'STRAPI_FREE_TRIAL_ENDS_AT',\n undefined\n );\n\n const [dismissedFor, setDismissedFor] = useScopedPersistentState<string | undefined>(\n 'STRAPI_UPSELL_BANNER_DISMISSED_FOR',\n undefined\n );\n\n const sevenDaysAgo = subDays(new Date(), 7);\n\n const timeLeftData = useGetLicenseTrialTimeLeftQuery(undefined, {\n skip: !license?.isTrial,\n });\n\n useEffect(() => {\n if (timeLeftData.data?.trialEndsAt) {\n setCachedTrialEndsAt(timeLeftData.data.trialEndsAt);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [timeLeftData.data?.trialEndsAt]);\n\n // When the license is not a trial + not EE, and the cached trial end date is found in the localstorage, that means the trial has ended\n // We show the banner to encourage the user to upgrade (for 7 days after the trial ends)\n const isTrialEndedRecently = Boolean(\n !license?.isTrial &&\n !window.strapi.isEE &&\n cachedTrialEndsAt &&\n isAfter(new Date(cachedTrialEndsAt), sevenDaysAgo)\n );\n\n const trialEndsAt = timeLeftData.data?.trialEndsAt ?? cachedTrialEndsAt;\n\n const toCanonicalISO = (v: string | undefined): string | undefined => {\n if (!v) return undefined;\n const date = new Date(v);\n return isValid(date) ? date.toISOString() : undefined;\n };\n\n const isDismissed = Boolean(\n trialEndsAt && toCanonicalISO(dismissedFor) === toCanonicalISO(trialEndsAt)\n );\n\n const handleDismiss = () => setDismissedFor(toCanonicalISO(trialEndsAt));\n const handleReopen = () => setDismissedFor(undefined);\n\n if (!(timeLeftData.data?.trialEndsAt || isTrialEndedRecently)) {\n return null;\n }\n\n if (isDismissed) {\n return (\n <Flex\n justifyContent=\"flex-end\"\n paddingTop={1}\n paddingBottom={1}\n paddingLeft={RESPONSIVE_DEFAULT_SPACING}\n paddingRight={RESPONSIVE_DEFAULT_SPACING}\n >\n <IconButton\n variant=\"ghost\"\n withTooltip={false}\n label={formatMessage({\n id: 'app.components.UpsellBanner.reopen',\n defaultMessage: 'Reopen banner',\n })}\n onClick={handleReopen}\n >\n <ChevronUp />\n </IconButton>\n </Flex>\n );\n }\n\n return <Banner isTrialEndedRecently={isTrialEndedRecently} onDismiss={handleDismiss} />;\n};\n\nexport { UpsellBanner };\n"],"names":["Banner","isTrialEndedRecently","onDismiss","formatMessage","useIntl","_jsx","DismissibleBanner","closeLabel","id","defaultMessage","message","_jsxs","_Fragment","Typography","variant","fontWeight","textColor","textAlign","fontSize","paddingRight","action","LinkButton","width","href","target","UpsellBanner","license","useLicenseLimits","cachedTrialEndsAt","setCachedTrialEndsAt","useScopedPersistentState","undefined","dismissedFor","setDismissedFor","sevenDaysAgo","subDays","Date","timeLeftData","useGetLicenseTrialTimeLeftQuery","skip","isTrial","useEffect","data","trialEndsAt","Boolean","window","strapi","isEE","isAfter","toCanonicalISO","v","date","isValid","toISOString","isDismissed","handleDismiss","handleReopen","Flex","justifyContent","paddingTop","paddingBottom","paddingLeft","RESPONSIVE_DEFAULT_SPACING","IconButton","withTooltip","label","onClick","ChevronUp"],"mappings":"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"}
@@ -1,28 +1,15 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { useEffect } from 'react';
3
3
  import { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';
4
- import { IconButton, Box, LinkButton, Typography } from '@strapi/design-system';
5
- import { ArrowsOut } from '@strapi/icons';
4
+ import { Flex, IconButton, LinkButton, Typography } from '@strapi/design-system';
5
+ import { ChevronUp } from '@strapi/icons';
6
6
  import { subDays, isAfter, isValid } from 'date-fns';
7
7
  import { useIntl } from 'react-intl';
8
- import { styled } from 'styled-components';
9
8
  import { useGetLicenseTrialTimeLeftQuery } from '../services/admin.mjs';
9
+ import { RESPONSIVE_DEFAULT_SPACING } from '../constants/theme.mjs';
10
10
  import { useScopedPersistentState } from '../hooks/usePersistentState.mjs';
11
11
  import { DismissibleBanner } from './DismissibleBanner.mjs';
12
12
 
13
- /**
14
- * Unlike `DismissibleBanner`'s own close button, this has no banner box left to
15
- * anchor to once dismissed (the banner unmounts entirely), so it stays pinned
16
- * to the viewport instead.
17
- */ const FixedButtonWrapper = styled(Box)`
18
- position: fixed;
19
- display: flex;
20
- flex-direction: column;
21
- z-index: 1;
22
- align-items: flex-end;
23
- top: 9px;
24
- right: 16px;
25
- `;
26
13
  const Banner = ({ isTrialEndedRecently, onDismiss })=>{
27
14
  const { formatMessage } = useIntl();
28
15
  return /*#__PURE__*/ jsx(DismissibleBanner, {
@@ -111,15 +98,21 @@ const UpsellBanner = ()=>{
111
98
  return null;
112
99
  }
113
100
  if (isDismissed) {
114
- return /*#__PURE__*/ jsx(FixedButtonWrapper, {
101
+ return /*#__PURE__*/ jsx(Flex, {
102
+ justifyContent: "flex-end",
103
+ paddingTop: 1,
104
+ paddingBottom: 1,
105
+ paddingLeft: RESPONSIVE_DEFAULT_SPACING,
106
+ paddingRight: RESPONSIVE_DEFAULT_SPACING,
115
107
  children: /*#__PURE__*/ jsx(IconButton, {
108
+ variant: "ghost",
116
109
  withTooltip: false,
117
110
  label: formatMessage({
118
111
  id: 'app.components.UpsellBanner.reopen',
119
112
  defaultMessage: 'Reopen banner'
120
113
  }),
121
114
  onClick: handleReopen,
122
- children: /*#__PURE__*/ jsx(ArrowsOut, {})
115
+ children: /*#__PURE__*/ jsx(ChevronUp, {})
123
116
  })
124
117
  });
125
118
  }
@@ -1 +1 @@
1
- {"version":3,"file":"UpsellBanner.mjs","sources":["../../../../../admin/src/components/UpsellBanner.tsx"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport { Box, IconButton, LinkButton, Typography } from '@strapi/design-system';\nimport { ArrowsOut } from '@strapi/icons';\nimport { isAfter, isValid, subDays } from 'date-fns';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useGetLicenseTrialTimeLeftQuery } from '../../src/services/admin';\nimport { useScopedPersistentState } from '../hooks/usePersistentState';\n\nimport { DismissibleBanner } from './DismissibleBanner';\n\n/**\n * Unlike `DismissibleBanner`'s own close button, this has no banner box left to\n * anchor to once dismissed (the banner unmounts entirely), so it stays pinned\n * to the viewport instead.\n */\nconst FixedButtonWrapper = styled(Box)`\n position: fixed;\n display: flex;\n flex-direction: column;\n z-index: 1;\n align-items: flex-end;\n top: 9px;\n right: 16px;\n`;\n\nconst Banner = ({\n isTrialEndedRecently,\n onDismiss,\n}: {\n isTrialEndedRecently: boolean;\n onDismiss: () => void;\n}) => {\n const { formatMessage } = useIntl();\n\n return (\n <DismissibleBanner\n onDismiss={onDismiss}\n closeLabel={formatMessage({\n id: 'app.components.UpsellBanner.close',\n defaultMessage: 'Close',\n })}\n message={\n <>\n <Typography\n variant=\"delta\"\n fontWeight=\"bold\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n fontSize={2}\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.intro.ended',\n defaultMessage: 'Your trial has ended: ',\n }\n : {\n id: 'app.components.UpsellBanner.intro',\n defaultMessage: 'Access to Growth plan features: ',\n }\n )}\n </Typography>\n <Typography\n variant=\"delta\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n paddingRight={4}\n fontSize={2}\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.text.ended',\n defaultMessage: 'Keep access to Growth features by upgrading now.',\n }\n : {\n id: 'app.components.UpsellBanner.text',\n defaultMessage:\n 'As part of your trial, you can explore premium tools such as Content History, Releases, and Single Sign-On (SSO).',\n }\n )}\n </Typography>\n </>\n }\n action={\n <LinkButton\n width=\"max-content\"\n variant=\"tertiary\"\n href=\"https://billing.strapi.io\"\n target=\"_blank\"\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.button.ended',\n defaultMessage: 'Keep Growth plan',\n }\n : {\n id: 'app.components.UpsellBanner.button',\n defaultMessage: 'Upgrade now',\n }\n )}\n </LinkButton>\n }\n />\n );\n};\n\nconst UpsellBanner = () => {\n const { license } = useLicenseLimits();\n const { formatMessage } = useIntl();\n\n const [cachedTrialEndsAt, setCachedTrialEndsAt] = useScopedPersistentState<string | undefined>(\n 'STRAPI_FREE_TRIAL_ENDS_AT',\n undefined\n );\n\n const [dismissedFor, setDismissedFor] = useScopedPersistentState<string | undefined>(\n 'STRAPI_UPSELL_BANNER_DISMISSED_FOR',\n undefined\n );\n\n const sevenDaysAgo = subDays(new Date(), 7);\n\n const timeLeftData = useGetLicenseTrialTimeLeftQuery(undefined, {\n skip: !license?.isTrial,\n });\n\n useEffect(() => {\n if (timeLeftData.data?.trialEndsAt) {\n setCachedTrialEndsAt(timeLeftData.data.trialEndsAt);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [timeLeftData.data?.trialEndsAt]);\n\n // When the license is not a trial + not EE, and the cached trial end date is found in the localstorage, that means the trial has ended\n // We show the banner to encourage the user to upgrade (for 7 days after the trial ends)\n const isTrialEndedRecently = Boolean(\n !license?.isTrial &&\n !window.strapi.isEE &&\n cachedTrialEndsAt &&\n isAfter(new Date(cachedTrialEndsAt), sevenDaysAgo)\n );\n\n const trialEndsAt = timeLeftData.data?.trialEndsAt ?? cachedTrialEndsAt;\n\n const toCanonicalISO = (v: string | undefined): string | undefined => {\n if (!v) return undefined;\n const date = new Date(v);\n return isValid(date) ? date.toISOString() : undefined;\n };\n\n const isDismissed = Boolean(\n trialEndsAt && toCanonicalISO(dismissedFor) === toCanonicalISO(trialEndsAt)\n );\n\n const handleDismiss = () => setDismissedFor(toCanonicalISO(trialEndsAt));\n const handleReopen = () => setDismissedFor(undefined);\n\n if (!(timeLeftData.data?.trialEndsAt || isTrialEndedRecently)) {\n return null;\n }\n\n if (isDismissed) {\n return (\n <FixedButtonWrapper>\n <IconButton\n withTooltip={false}\n label={formatMessage({\n id: 'app.components.UpsellBanner.reopen',\n defaultMessage: 'Reopen banner',\n })}\n onClick={handleReopen}\n >\n <ArrowsOut />\n </IconButton>\n </FixedButtonWrapper>\n );\n }\n\n return <Banner isTrialEndedRecently={isTrialEndedRecently} onDismiss={handleDismiss} />;\n};\n\nexport { UpsellBanner };\n"],"names":["FixedButtonWrapper","styled","Box","Banner","isTrialEndedRecently","onDismiss","formatMessage","useIntl","_jsx","DismissibleBanner","closeLabel","id","defaultMessage","message","_jsxs","_Fragment","Typography","variant","fontWeight","textColor","textAlign","fontSize","paddingRight","action","LinkButton","width","href","target","UpsellBanner","license","useLicenseLimits","cachedTrialEndsAt","setCachedTrialEndsAt","useScopedPersistentState","undefined","dismissedFor","setDismissedFor","sevenDaysAgo","subDays","Date","timeLeftData","useGetLicenseTrialTimeLeftQuery","skip","isTrial","useEffect","data","trialEndsAt","Boolean","window","strapi","isEE","isAfter","toCanonicalISO","v","date","isValid","toISOString","isDismissed","handleDismiss","handleReopen","IconButton","withTooltip","label","onClick","ArrowsOut"],"mappings":"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"}
1
+ {"version":3,"file":"UpsellBanner.mjs","sources":["../../../../../admin/src/components/UpsellBanner.tsx"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport { Flex, IconButton, LinkButton, Typography } from '@strapi/design-system';\nimport { ChevronUp } from '@strapi/icons';\nimport { isAfter, isValid, subDays } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nimport { useGetLicenseTrialTimeLeftQuery } from '../../src/services/admin';\nimport { RESPONSIVE_DEFAULT_SPACING } from '../constants/theme';\nimport { useScopedPersistentState } from '../hooks/usePersistentState';\n\nimport { DismissibleBanner } from './DismissibleBanner';\n\nconst Banner = ({\n isTrialEndedRecently,\n onDismiss,\n}: {\n isTrialEndedRecently: boolean;\n onDismiss: () => void;\n}) => {\n const { formatMessage } = useIntl();\n\n return (\n <DismissibleBanner\n onDismiss={onDismiss}\n closeLabel={formatMessage({\n id: 'app.components.UpsellBanner.close',\n defaultMessage: 'Close',\n })}\n message={\n <>\n <Typography\n variant=\"delta\"\n fontWeight=\"bold\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n fontSize={2}\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.intro.ended',\n defaultMessage: 'Your trial has ended: ',\n }\n : {\n id: 'app.components.UpsellBanner.intro',\n defaultMessage: 'Access to Growth plan features: ',\n }\n )}\n </Typography>\n <Typography\n variant=\"delta\"\n textColor=\"neutral0\"\n textAlign=\"center\"\n paddingRight={4}\n fontSize={2}\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.text.ended',\n defaultMessage: 'Keep access to Growth features by upgrading now.',\n }\n : {\n id: 'app.components.UpsellBanner.text',\n defaultMessage:\n 'As part of your trial, you can explore premium tools such as Content History, Releases, and Single Sign-On (SSO).',\n }\n )}\n </Typography>\n </>\n }\n action={\n <LinkButton\n width=\"max-content\"\n variant=\"tertiary\"\n href=\"https://billing.strapi.io\"\n target=\"_blank\"\n >\n {formatMessage(\n isTrialEndedRecently\n ? {\n id: 'app.components.UpsellBanner.button.ended',\n defaultMessage: 'Keep Growth plan',\n }\n : {\n id: 'app.components.UpsellBanner.button',\n defaultMessage: 'Upgrade now',\n }\n )}\n </LinkButton>\n }\n />\n );\n};\n\nconst UpsellBanner = () => {\n const { license } = useLicenseLimits();\n const { formatMessage } = useIntl();\n\n const [cachedTrialEndsAt, setCachedTrialEndsAt] = useScopedPersistentState<string | undefined>(\n 'STRAPI_FREE_TRIAL_ENDS_AT',\n undefined\n );\n\n const [dismissedFor, setDismissedFor] = useScopedPersistentState<string | undefined>(\n 'STRAPI_UPSELL_BANNER_DISMISSED_FOR',\n undefined\n );\n\n const sevenDaysAgo = subDays(new Date(), 7);\n\n const timeLeftData = useGetLicenseTrialTimeLeftQuery(undefined, {\n skip: !license?.isTrial,\n });\n\n useEffect(() => {\n if (timeLeftData.data?.trialEndsAt) {\n setCachedTrialEndsAt(timeLeftData.data.trialEndsAt);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [timeLeftData.data?.trialEndsAt]);\n\n // When the license is not a trial + not EE, and the cached trial end date is found in the localstorage, that means the trial has ended\n // We show the banner to encourage the user to upgrade (for 7 days after the trial ends)\n const isTrialEndedRecently = Boolean(\n !license?.isTrial &&\n !window.strapi.isEE &&\n cachedTrialEndsAt &&\n isAfter(new Date(cachedTrialEndsAt), sevenDaysAgo)\n );\n\n const trialEndsAt = timeLeftData.data?.trialEndsAt ?? cachedTrialEndsAt;\n\n const toCanonicalISO = (v: string | undefined): string | undefined => {\n if (!v) return undefined;\n const date = new Date(v);\n return isValid(date) ? date.toISOString() : undefined;\n };\n\n const isDismissed = Boolean(\n trialEndsAt && toCanonicalISO(dismissedFor) === toCanonicalISO(trialEndsAt)\n );\n\n const handleDismiss = () => setDismissedFor(toCanonicalISO(trialEndsAt));\n const handleReopen = () => setDismissedFor(undefined);\n\n if (!(timeLeftData.data?.trialEndsAt || isTrialEndedRecently)) {\n return null;\n }\n\n if (isDismissed) {\n return (\n <Flex\n justifyContent=\"flex-end\"\n paddingTop={1}\n paddingBottom={1}\n paddingLeft={RESPONSIVE_DEFAULT_SPACING}\n paddingRight={RESPONSIVE_DEFAULT_SPACING}\n >\n <IconButton\n variant=\"ghost\"\n withTooltip={false}\n label={formatMessage({\n id: 'app.components.UpsellBanner.reopen',\n defaultMessage: 'Reopen banner',\n })}\n onClick={handleReopen}\n >\n <ChevronUp />\n </IconButton>\n </Flex>\n );\n }\n\n return <Banner isTrialEndedRecently={isTrialEndedRecently} onDismiss={handleDismiss} />;\n};\n\nexport { UpsellBanner };\n"],"names":["Banner","isTrialEndedRecently","onDismiss","formatMessage","useIntl","_jsx","DismissibleBanner","closeLabel","id","defaultMessage","message","_jsxs","_Fragment","Typography","variant","fontWeight","textColor","textAlign","fontSize","paddingRight","action","LinkButton","width","href","target","UpsellBanner","license","useLicenseLimits","cachedTrialEndsAt","setCachedTrialEndsAt","useScopedPersistentState","undefined","dismissedFor","setDismissedFor","sevenDaysAgo","subDays","Date","timeLeftData","useGetLicenseTrialTimeLeftQuery","skip","isTrial","useEffect","data","trialEndsAt","Boolean","window","strapi","isEE","isAfter","toCanonicalISO","v","date","isValid","toISOString","isDismissed","handleDismiss","handleReopen","Flex","justifyContent","paddingTop","paddingBottom","paddingLeft","RESPONSIVE_DEFAULT_SPACING","IconButton","withTooltip","label","onClick","ChevronUp"],"mappings":"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"}
@@ -2,80 +2,15 @@
2
2
 
3
3
  var client = require('react-dom/client');
4
4
  var StrapiApp = require('./StrapiApp.js');
5
- var getFetchClient = require('./utils/getFetchClient.js');
6
- var getProjectType = require('./utils/getProjectType.js');
7
- var urls = require('./utils/urls.js');
5
+ var browserStrapi = require('./utils/browserStrapi.js');
8
6
 
9
7
  const renderAdmin = async (mountNode, { plugins, customisations, features })=>{
10
8
  if (!mountNode) {
11
9
  throw new Error('[@strapi/admin]: Could not find the root element to mount the admin app');
12
10
  }
13
- window.strapi = {
14
- /**
15
- * This ENV variable is passed from the strapi instance, by default no url is set
16
- * in the config and therefore the instance returns you an empty string so URLs are relative.
17
- *
18
- * To ensure that the backendURL is always set, we use the window.location.origin as a fallback.
19
- */ backendURL: urls.createAbsoluteUrl(process.env.STRAPI_ADMIN_BACKEND_URL),
20
- isEE: false,
21
- isTrial: false,
22
- telemetryDisabled: process.env.STRAPI_TELEMETRY_DISABLED === 'true',
23
- future: {
24
- isEnabled: (name)=>{
25
- return features?.future?.[name] === true;
26
- }
27
- },
28
- featureFlags: {
29
- isEnabled: (name)=>{
30
- return features?.[name] === true;
31
- }
32
- },
33
- // eslint-disable-next-line
34
- // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision. Cannot use @ts-expect-error because of build:code and build:types context collision.
35
- features: {
36
- SSO: 'sso',
37
- AUDIT_LOGS: 'audit-logs',
38
- REVIEW_WORKFLOWS: 'review-workflows',
39
- /**
40
- * If we don't get the license then we know it's not EE
41
- * so no feature is enabled.
42
- */ isEnabled: ()=>false
43
- },
44
- projectType: 'Community',
45
- flags: {
46
- nps: false,
47
- promoteEE: true,
48
- docLinks: true
49
- },
50
- // eslint-disable-next-line
51
- // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.
52
- ai: {
53
- enabled: false
54
- }
55
- };
56
- const { get } = getFetchClient.getFetchClient();
57
- try {
58
- const { data: { data: { isEE, isTrial, features, flags, ai, planPriceId } } } = await get('/admin/project-type');
59
- window.strapi.isEE = isEE;
60
- window.strapi.isTrialLicense = isTrial;
61
- window.strapi.flags = flags;
62
- window.strapi.features = {
63
- ...window.strapi.features,
64
- isEnabled: (featureName)=>features.some((feature)=>feature.name === featureName)
65
- };
66
- window.strapi.projectType = getProjectType.getProjectType({
67
- isEE,
68
- planPriceId
69
- });
70
- // eslint-disable-next-line
71
- // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.
72
- window.strapi.ai = ai;
73
- } catch (err) {
74
- /**
75
- * If this fails, we simply don't activate any EE features.
76
- * Should we warn clearer in the UI?
77
- */ console.error(err);
78
- }
11
+ const browserStrapi$1 = await browserStrapi.createBrowserStrapi(features);
12
+ // @ts-expect-error - conflicting global.Strapi with window.BrowserStrapi
13
+ window.strapi = browserStrapi$1;
79
14
  const app = new StrapiApp.StrapiApp({
80
15
  config: customisations?.config,
81
16
  appPlugins: plugins
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sources":["../../../../admin/src/render.ts"],"sourcesContent":["/* eslint-disable no-undef */\nimport { createRoot } from 'react-dom/client';\n\nimport { StrapiApp, StrapiAppConstructorArgs } from './StrapiApp';\nimport { getFetchClient } from './utils/getFetchClient';\nimport { getProjectType } from './utils/getProjectType';\nimport { createAbsoluteUrl } from './utils/urls';\n\nimport type { Modules } from '@strapi/types';\n\ninterface RenderAdminArgs {\n customisations: {\n register?: (app: StrapiApp) => Promise<void> | void;\n bootstrap?: (app: StrapiApp) => Promise<void> | void;\n config?: StrapiAppConstructorArgs['config'];\n };\n plugins: StrapiAppConstructorArgs['appPlugins'];\n features?: Modules.Features.FeaturesService['config'];\n}\n\nconst renderAdmin = async (\n mountNode: HTMLElement | null,\n { plugins, customisations, features }: RenderAdminArgs\n) => {\n if (!mountNode) {\n throw new Error('[@strapi/admin]: Could not find the root element to mount the admin app');\n }\n\n window.strapi = {\n /**\n * This ENV variable is passed from the strapi instance, by default no url is set\n * in the config and therefore the instance returns you an empty string so URLs are relative.\n *\n * To ensure that the backendURL is always set, we use the window.location.origin as a fallback.\n */\n backendURL: createAbsoluteUrl(process.env.STRAPI_ADMIN_BACKEND_URL),\n isEE: false,\n isTrial: false,\n telemetryDisabled: process.env.STRAPI_TELEMETRY_DISABLED === 'true',\n future: {\n isEnabled: (name: keyof NonNullable<Modules.Features.FeaturesConfig['future']>) => {\n return features?.future?.[name] === true;\n },\n },\n featureFlags: {\n isEnabled: (name: keyof Omit<Modules.Features.FeaturesConfig, 'future'>) => {\n return features?.[name] === true;\n },\n },\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision. Cannot use @ts-expect-error because of build:code and build:types context collision.\n features: {\n SSO: 'sso',\n AUDIT_LOGS: 'audit-logs',\n REVIEW_WORKFLOWS: 'review-workflows',\n /**\n * If we don't get the license then we know it's not EE\n * so no feature is enabled.\n */\n isEnabled: () => false,\n },\n projectType: 'Community',\n flags: {\n nps: false,\n promoteEE: true,\n docLinks: true,\n },\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.\n ai: {\n enabled: false,\n },\n };\n\n const { get } = getFetchClient();\n\n interface ProjectType extends Pick<Window['strapi'], 'flags'> {\n isEE: boolean;\n isTrial: boolean;\n /**\n * The licensed plan price id, sent by the license registry (EE only).\n * Used to distinguish the Growth plan from other Enterprise plans.\n */\n planPriceId?: string;\n features: {\n name: string;\n }[];\n ai: Window['strapi']['ai'];\n }\n\n try {\n const {\n data: {\n data: { isEE, isTrial, features, flags, ai, planPriceId },\n },\n } = await get<{ data: ProjectType }>('/admin/project-type');\n\n window.strapi.isEE = isEE;\n window.strapi.isTrialLicense = isTrial;\n window.strapi.flags = flags;\n window.strapi.features = {\n ...window.strapi.features,\n isEnabled: (featureName: string | undefined) =>\n features.some((feature) => feature.name === featureName),\n };\n window.strapi.projectType = getProjectType({ isEE, planPriceId });\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.\n window.strapi.ai = ai;\n } catch (err) {\n /**\n * If this fails, we simply don't activate any EE features.\n * Should we warn clearer in the UI?\n */\n console.error(err);\n }\n\n const app = new StrapiApp({\n config: customisations?.config,\n appPlugins: plugins,\n });\n\n await app.register(customisations?.register);\n await app.bootstrap(customisations?.bootstrap);\n await app.loadTrads(customisations?.config?.translations);\n\n createRoot(mountNode).render(app.render());\n\n if (\n typeof module !== 'undefined' &&\n module &&\n 'hot' in module &&\n typeof module.hot === 'object' &&\n module.hot !== null &&\n 'accept' in module.hot &&\n typeof module.hot.accept === 'function'\n ) {\n module.hot.accept();\n }\n\n if (typeof import.meta.hot?.accept === 'function') {\n import.meta.hot.accept();\n }\n};\n\nexport { renderAdmin };\nexport type { RenderAdminArgs };\n"],"names":["renderAdmin","mountNode","plugins","customisations","features","Error","window","strapi","backendURL","createAbsoluteUrl","process","env","STRAPI_ADMIN_BACKEND_URL","isEE","isTrial","telemetryDisabled","STRAPI_TELEMETRY_DISABLED","future","isEnabled","name","featureFlags","SSO","AUDIT_LOGS","REVIEW_WORKFLOWS","projectType","flags","nps","promoteEE","docLinks","ai","enabled","get","getFetchClient","data","planPriceId","isTrialLicense","featureName","some","feature","getProjectType","err","console","error","app","StrapiApp","config","appPlugins","register","bootstrap","loadTrads","translations","createRoot","render","module","hot","accept"],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sources":["../../../../admin/src/render.ts"],"sourcesContent":["/* eslint-disable no-undef */\nimport { createRoot } from 'react-dom/client';\n\nimport { StrapiApp, StrapiAppConstructorArgs } from './StrapiApp';\nimport { createBrowserStrapi } from './utils/browserStrapi';\n\nimport type { Modules } from '@strapi/types';\n\ninterface RenderAdminArgs {\n customisations: {\n register?: (app: StrapiApp) => Promise<void> | void;\n bootstrap?: (app: StrapiApp) => Promise<void> | void;\n config?: StrapiAppConstructorArgs['config'];\n };\n plugins: StrapiAppConstructorArgs['appPlugins'];\n features?: Modules.Features.FeaturesService['config'];\n}\n\nconst renderAdmin = async (\n mountNode: HTMLElement | null,\n { plugins, customisations, features }: RenderAdminArgs\n) => {\n if (!mountNode) {\n throw new Error('[@strapi/admin]: Could not find the root element to mount the admin app');\n }\n\n const browserStrapi = await createBrowserStrapi(features);\n\n // @ts-expect-error - conflicting global.Strapi with window.BrowserStrapi\n window.strapi = browserStrapi;\n\n const app = new StrapiApp({\n config: customisations?.config,\n appPlugins: plugins,\n });\n\n await app.register(customisations?.register);\n await app.bootstrap(customisations?.bootstrap);\n await app.loadTrads(customisations?.config?.translations);\n\n createRoot(mountNode).render(app.render());\n\n if (\n typeof module !== 'undefined' &&\n module &&\n 'hot' in module &&\n typeof module.hot === 'object' &&\n module.hot !== null &&\n 'accept' in module.hot &&\n typeof module.hot.accept === 'function'\n ) {\n module.hot.accept();\n }\n\n if (typeof import.meta.hot?.accept === 'function') {\n import.meta.hot.accept();\n }\n};\n\nexport { renderAdmin };\nexport type { RenderAdminArgs };\n"],"names":["renderAdmin","mountNode","plugins","customisations","features","Error","browserStrapi","createBrowserStrapi","window","strapi","app","StrapiApp","config","appPlugins","register","bootstrap","loadTrads","translations","createRoot","render","module","hot","accept"],"mappings":";;;;;;AAkBA,MAAMA,WAAAA,GAAc,OAClBC,SAAAA,EACA,EAAEC,OAAO,EAAEC,cAAc,EAAEC,QAAQ,EAAmB,GAAA;AAEtD,IAAA,IAAI,CAACH,SAAAA,EAAW;AACd,QAAA,MAAM,IAAII,KAAAA,CAAM,yEAAA,CAAA;AAClB,IAAA;IAEA,MAAMC,eAAAA,GAAgB,MAAMC,iCAAAA,CAAoBH,QAAAA,CAAAA;;AAGhDI,IAAAA,MAAAA,CAAOC,MAAM,GAAGH,eAAAA;IAEhB,MAAMI,GAAAA,GAAM,IAAIC,mBAAAA,CAAU;AACxBC,QAAAA,MAAAA,EAAQT,cAAAA,EAAgBS,MAAAA;QACxBC,UAAAA,EAAYX;AACd,KAAA,CAAA;IAEA,MAAMQ,GAAAA,CAAII,QAAQ,CAACX,cAAAA,EAAgBW,QAAAA,CAAAA;IACnC,MAAMJ,GAAAA,CAAIK,SAAS,CAACZ,cAAAA,EAAgBY,SAAAA,CAAAA;AACpC,IAAA,MAAML,GAAAA,CAAIM,SAAS,CAACb,cAAAA,EAAgBS,MAAAA,EAAQK,YAAAA,CAAAA;AAE5CC,IAAAA,iBAAAA,CAAWjB,SAAAA,CAAAA,CAAWkB,MAAM,CAACT,GAAAA,CAAIS,MAAM,EAAA,CAAA;IAEvC,IACE,OAAOC,MAAAA,KAAW,WAAA,IAClBA,MAAAA,IACA,KAAA,IAASA,UACT,OAAOA,MAAAA,CAAOC,GAAG,KAAK,QAAA,IACtBD,MAAAA,CAAOC,GAAG,KAAK,IAAA,IACf,QAAA,IAAYD,MAAAA,CAAOC,GAAG,IACtB,OAAOD,MAAAA,CAAOC,GAAG,CAACC,MAAM,KAAK,UAAA,EAC7B;QACAF,MAAAA,CAAOC,GAAG,CAACC,MAAM,EAAA;AACnB,IAAA;AAEA,IAAA,IAAI,OAAO,SAAe,EAAEA,WAAW,UAAA,EAAY;QACjD,SAAe,CAACA,MAAM,EAAA;AACxB,IAAA;AACF;;;;"}
@@ -1,79 +1,14 @@
1
1
  import { createRoot } from 'react-dom/client';
2
2
  import { StrapiApp } from './StrapiApp.mjs';
3
- import { getFetchClient } from './utils/getFetchClient.mjs';
4
- import { getProjectType } from './utils/getProjectType.mjs';
5
- import { createAbsoluteUrl } from './utils/urls.mjs';
3
+ import { createBrowserStrapi } from './utils/browserStrapi.mjs';
6
4
 
7
5
  const renderAdmin = async (mountNode, { plugins, customisations, features })=>{
8
6
  if (!mountNode) {
9
7
  throw new Error('[@strapi/admin]: Could not find the root element to mount the admin app');
10
8
  }
11
- window.strapi = {
12
- /**
13
- * This ENV variable is passed from the strapi instance, by default no url is set
14
- * in the config and therefore the instance returns you an empty string so URLs are relative.
15
- *
16
- * To ensure that the backendURL is always set, we use the window.location.origin as a fallback.
17
- */ backendURL: createAbsoluteUrl(process.env.STRAPI_ADMIN_BACKEND_URL),
18
- isEE: false,
19
- isTrial: false,
20
- telemetryDisabled: process.env.STRAPI_TELEMETRY_DISABLED === 'true',
21
- future: {
22
- isEnabled: (name)=>{
23
- return features?.future?.[name] === true;
24
- }
25
- },
26
- featureFlags: {
27
- isEnabled: (name)=>{
28
- return features?.[name] === true;
29
- }
30
- },
31
- // eslint-disable-next-line
32
- // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision. Cannot use @ts-expect-error because of build:code and build:types context collision.
33
- features: {
34
- SSO: 'sso',
35
- AUDIT_LOGS: 'audit-logs',
36
- REVIEW_WORKFLOWS: 'review-workflows',
37
- /**
38
- * If we don't get the license then we know it's not EE
39
- * so no feature is enabled.
40
- */ isEnabled: ()=>false
41
- },
42
- projectType: 'Community',
43
- flags: {
44
- nps: false,
45
- promoteEE: true,
46
- docLinks: true
47
- },
48
- // eslint-disable-next-line
49
- // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.
50
- ai: {
51
- enabled: false
52
- }
53
- };
54
- const { get } = getFetchClient();
55
- try {
56
- const { data: { data: { isEE, isTrial, features, flags, ai, planPriceId } } } = await get('/admin/project-type');
57
- window.strapi.isEE = isEE;
58
- window.strapi.isTrialLicense = isTrial;
59
- window.strapi.flags = flags;
60
- window.strapi.features = {
61
- ...window.strapi.features,
62
- isEnabled: (featureName)=>features.some((feature)=>feature.name === featureName)
63
- };
64
- window.strapi.projectType = getProjectType({
65
- isEE,
66
- planPriceId
67
- });
68
- // eslint-disable-next-line
69
- // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.
70
- window.strapi.ai = ai;
71
- } catch (err) {
72
- /**
73
- * If this fails, we simply don't activate any EE features.
74
- * Should we warn clearer in the UI?
75
- */ console.error(err);
76
- }
9
+ const browserStrapi = await createBrowserStrapi(features);
10
+ // @ts-expect-error - conflicting global.Strapi with window.BrowserStrapi
11
+ window.strapi = browserStrapi;
77
12
  const app = new StrapiApp({
78
13
  config: customisations?.config,
79
14
  appPlugins: plugins
@@ -1 +1 @@
1
- {"version":3,"file":"render.mjs","sources":["../../../../admin/src/render.ts"],"sourcesContent":["/* eslint-disable no-undef */\nimport { createRoot } from 'react-dom/client';\n\nimport { StrapiApp, StrapiAppConstructorArgs } from './StrapiApp';\nimport { getFetchClient } from './utils/getFetchClient';\nimport { getProjectType } from './utils/getProjectType';\nimport { createAbsoluteUrl } from './utils/urls';\n\nimport type { Modules } from '@strapi/types';\n\ninterface RenderAdminArgs {\n customisations: {\n register?: (app: StrapiApp) => Promise<void> | void;\n bootstrap?: (app: StrapiApp) => Promise<void> | void;\n config?: StrapiAppConstructorArgs['config'];\n };\n plugins: StrapiAppConstructorArgs['appPlugins'];\n features?: Modules.Features.FeaturesService['config'];\n}\n\nconst renderAdmin = async (\n mountNode: HTMLElement | null,\n { plugins, customisations, features }: RenderAdminArgs\n) => {\n if (!mountNode) {\n throw new Error('[@strapi/admin]: Could not find the root element to mount the admin app');\n }\n\n window.strapi = {\n /**\n * This ENV variable is passed from the strapi instance, by default no url is set\n * in the config and therefore the instance returns you an empty string so URLs are relative.\n *\n * To ensure that the backendURL is always set, we use the window.location.origin as a fallback.\n */\n backendURL: createAbsoluteUrl(process.env.STRAPI_ADMIN_BACKEND_URL),\n isEE: false,\n isTrial: false,\n telemetryDisabled: process.env.STRAPI_TELEMETRY_DISABLED === 'true',\n future: {\n isEnabled: (name: keyof NonNullable<Modules.Features.FeaturesConfig['future']>) => {\n return features?.future?.[name] === true;\n },\n },\n featureFlags: {\n isEnabled: (name: keyof Omit<Modules.Features.FeaturesConfig, 'future'>) => {\n return features?.[name] === true;\n },\n },\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision. Cannot use @ts-expect-error because of build:code and build:types context collision.\n features: {\n SSO: 'sso',\n AUDIT_LOGS: 'audit-logs',\n REVIEW_WORKFLOWS: 'review-workflows',\n /**\n * If we don't get the license then we know it's not EE\n * so no feature is enabled.\n */\n isEnabled: () => false,\n },\n projectType: 'Community',\n flags: {\n nps: false,\n promoteEE: true,\n docLinks: true,\n },\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.\n ai: {\n enabled: false,\n },\n };\n\n const { get } = getFetchClient();\n\n interface ProjectType extends Pick<Window['strapi'], 'flags'> {\n isEE: boolean;\n isTrial: boolean;\n /**\n * The licensed plan price id, sent by the license registry (EE only).\n * Used to distinguish the Growth plan from other Enterprise plans.\n */\n planPriceId?: string;\n features: {\n name: string;\n }[];\n ai: Window['strapi']['ai'];\n }\n\n try {\n const {\n data: {\n data: { isEE, isTrial, features, flags, ai, planPriceId },\n },\n } = await get<{ data: ProjectType }>('/admin/project-type');\n\n window.strapi.isEE = isEE;\n window.strapi.isTrialLicense = isTrial;\n window.strapi.flags = flags;\n window.strapi.features = {\n ...window.strapi.features,\n isEnabled: (featureName: string | undefined) =>\n features.some((feature) => feature.name === featureName),\n };\n window.strapi.projectType = getProjectType({ isEE, planPriceId });\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.\n window.strapi.ai = ai;\n } catch (err) {\n /**\n * If this fails, we simply don't activate any EE features.\n * Should we warn clearer in the UI?\n */\n console.error(err);\n }\n\n const app = new StrapiApp({\n config: customisations?.config,\n appPlugins: plugins,\n });\n\n await app.register(customisations?.register);\n await app.bootstrap(customisations?.bootstrap);\n await app.loadTrads(customisations?.config?.translations);\n\n createRoot(mountNode).render(app.render());\n\n if (\n typeof module !== 'undefined' &&\n module &&\n 'hot' in module &&\n typeof module.hot === 'object' &&\n module.hot !== null &&\n 'accept' in module.hot &&\n typeof module.hot.accept === 'function'\n ) {\n module.hot.accept();\n }\n\n if (typeof import.meta.hot?.accept === 'function') {\n import.meta.hot.accept();\n }\n};\n\nexport { renderAdmin };\nexport type { RenderAdminArgs };\n"],"names":["renderAdmin","mountNode","plugins","customisations","features","Error","window","strapi","backendURL","createAbsoluteUrl","process","env","STRAPI_ADMIN_BACKEND_URL","isEE","isTrial","telemetryDisabled","STRAPI_TELEMETRY_DISABLED","future","isEnabled","name","featureFlags","SSO","AUDIT_LOGS","REVIEW_WORKFLOWS","projectType","flags","nps","promoteEE","docLinks","ai","enabled","get","getFetchClient","data","planPriceId","isTrialLicense","featureName","some","feature","getProjectType","err","console","error","app","StrapiApp","config","appPlugins","register","bootstrap","loadTrads","translations","createRoot","render","module","hot","accept"],"mappings":"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"}
1
+ {"version":3,"file":"render.mjs","sources":["../../../../admin/src/render.ts"],"sourcesContent":["/* eslint-disable no-undef */\nimport { createRoot } from 'react-dom/client';\n\nimport { StrapiApp, StrapiAppConstructorArgs } from './StrapiApp';\nimport { createBrowserStrapi } from './utils/browserStrapi';\n\nimport type { Modules } from '@strapi/types';\n\ninterface RenderAdminArgs {\n customisations: {\n register?: (app: StrapiApp) => Promise<void> | void;\n bootstrap?: (app: StrapiApp) => Promise<void> | void;\n config?: StrapiAppConstructorArgs['config'];\n };\n plugins: StrapiAppConstructorArgs['appPlugins'];\n features?: Modules.Features.FeaturesService['config'];\n}\n\nconst renderAdmin = async (\n mountNode: HTMLElement | null,\n { plugins, customisations, features }: RenderAdminArgs\n) => {\n if (!mountNode) {\n throw new Error('[@strapi/admin]: Could not find the root element to mount the admin app');\n }\n\n const browserStrapi = await createBrowserStrapi(features);\n\n // @ts-expect-error - conflicting global.Strapi with window.BrowserStrapi\n window.strapi = browserStrapi;\n\n const app = new StrapiApp({\n config: customisations?.config,\n appPlugins: plugins,\n });\n\n await app.register(customisations?.register);\n await app.bootstrap(customisations?.bootstrap);\n await app.loadTrads(customisations?.config?.translations);\n\n createRoot(mountNode).render(app.render());\n\n if (\n typeof module !== 'undefined' &&\n module &&\n 'hot' in module &&\n typeof module.hot === 'object' &&\n module.hot !== null &&\n 'accept' in module.hot &&\n typeof module.hot.accept === 'function'\n ) {\n module.hot.accept();\n }\n\n if (typeof import.meta.hot?.accept === 'function') {\n import.meta.hot.accept();\n }\n};\n\nexport { renderAdmin };\nexport type { RenderAdminArgs };\n"],"names":["renderAdmin","mountNode","plugins","customisations","features","Error","browserStrapi","createBrowserStrapi","window","strapi","app","StrapiApp","config","appPlugins","register","bootstrap","loadTrads","translations","createRoot","render","module","hot","accept"],"mappings":";;;;AAkBA,MAAMA,WAAAA,GAAc,OAClBC,SAAAA,EACA,EAAEC,OAAO,EAAEC,cAAc,EAAEC,QAAQ,EAAmB,GAAA;AAEtD,IAAA,IAAI,CAACH,SAAAA,EAAW;AACd,QAAA,MAAM,IAAII,KAAAA,CAAM,yEAAA,CAAA;AAClB,IAAA;IAEA,MAAMC,aAAAA,GAAgB,MAAMC,mBAAAA,CAAoBH,QAAAA,CAAAA;;AAGhDI,IAAAA,MAAAA,CAAOC,MAAM,GAAGH,aAAAA;IAEhB,MAAMI,GAAAA,GAAM,IAAIC,SAAAA,CAAU;AACxBC,QAAAA,MAAAA,EAAQT,cAAAA,EAAgBS,MAAAA;QACxBC,UAAAA,EAAYX;AACd,KAAA,CAAA;IAEA,MAAMQ,GAAAA,CAAII,QAAQ,CAACX,cAAAA,EAAgBW,QAAAA,CAAAA;IACnC,MAAMJ,GAAAA,CAAIK,SAAS,CAACZ,cAAAA,EAAgBY,SAAAA,CAAAA;AACpC,IAAA,MAAML,GAAAA,CAAIM,SAAS,CAACb,cAAAA,EAAgBS,MAAAA,EAAQK,YAAAA,CAAAA;AAE5CC,IAAAA,UAAAA,CAAWjB,SAAAA,CAAAA,CAAWkB,MAAM,CAACT,GAAAA,CAAIS,MAAM,EAAA,CAAA;IAEvC,IACE,OAAOC,MAAAA,KAAW,WAAA,IAClBA,MAAAA,IACA,KAAA,IAASA,UACT,OAAOA,MAAAA,CAAOC,GAAG,KAAK,QAAA,IACtBD,MAAAA,CAAOC,GAAG,KAAK,IAAA,IACf,QAAA,IAAYD,MAAAA,CAAOC,GAAG,IACtB,OAAOD,MAAAA,CAAOC,GAAG,CAACC,MAAM,KAAK,UAAA,EAC7B;QACAF,MAAAA,CAAOC,GAAG,CAACC,MAAM,EAAA;AACnB,IAAA;AAEA,IAAA,IAAI,OAAO,MAAA,CAAA,IAAA,CAAYD,GAAG,EAAEC,WAAW,UAAA,EAAY;QACjD,MAAA,CAAA,IAAA,CAAYD,GAAG,CAACC,MAAM,EAAA;AACxB,IAAA;AACF;;;;"}
@@ -182,6 +182,13 @@ var en = {
182
182
  "Settings.global": "Global Settings",
183
183
  "Settings.permissions": "Administration panel",
184
184
  "Settings.permissions.auditLogs.action": "Action",
185
+ "Settings.permissions.auditLogs.admin-user.create": "Create user",
186
+ "Settings.permissions.auditLogs.admin-user.delete": "Delete user",
187
+ "Settings.permissions.auditLogs.admin-user.invite.accept": "Accept invitation",
188
+ "Settings.permissions.auditLogs.admin-user.password-reset.confirm": "Reset password",
189
+ "Settings.permissions.auditLogs.admin-user.password-reset.create": "Request password reset",
190
+ "Settings.permissions.auditLogs.admin-user.password.update": "Update password",
191
+ "Settings.permissions.auditLogs.admin-user.update": "Update user",
185
192
  "Settings.permissions.auditLogs.admin.auth.success": "Admin login",
186
193
  "Settings.permissions.auditLogs.admin.logout": "Admin logout",
187
194
  "Settings.permissions.auditLogs.audit-log.export": "Export audit logs",
@@ -242,6 +249,9 @@ var en = {
242
249
  "Settings.permissions.auditLogs.user.fullname": "{firstname} {lastname}",
243
250
  "Settings.permissions.auditLogs.user.update": "Update user",
244
251
  "Settings.permissions.auditLogs.userId": "User ID",
252
+ "Settings.permissions.auditLogs.webhook.create": "Create webhook",
253
+ "Settings.permissions.auditLogs.webhook.delete": "Delete webhook",
254
+ "Settings.permissions.auditLogs.webhook.update": "Update webhook",
245
255
  "Settings.permissions.category": "Permissions settings for the {category}",
246
256
  "Settings.permissions.category.plugins": "Permissions settings for the {category} plugin",
247
257
  "Settings.permissions.conditions.anytime": "Anytime",
@@ -1 +1 @@
1
- {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -178,6 +178,13 @@ var en = {
178
178
  "Settings.global": "Global Settings",
179
179
  "Settings.permissions": "Administration panel",
180
180
  "Settings.permissions.auditLogs.action": "Action",
181
+ "Settings.permissions.auditLogs.admin-user.create": "Create user",
182
+ "Settings.permissions.auditLogs.admin-user.delete": "Delete user",
183
+ "Settings.permissions.auditLogs.admin-user.invite.accept": "Accept invitation",
184
+ "Settings.permissions.auditLogs.admin-user.password-reset.confirm": "Reset password",
185
+ "Settings.permissions.auditLogs.admin-user.password-reset.create": "Request password reset",
186
+ "Settings.permissions.auditLogs.admin-user.password.update": "Update password",
187
+ "Settings.permissions.auditLogs.admin-user.update": "Update user",
181
188
  "Settings.permissions.auditLogs.admin.auth.success": "Admin login",
182
189
  "Settings.permissions.auditLogs.admin.logout": "Admin logout",
183
190
  "Settings.permissions.auditLogs.audit-log.export": "Export audit logs",
@@ -238,6 +245,9 @@ var en = {
238
245
  "Settings.permissions.auditLogs.user.fullname": "{firstname} {lastname}",
239
246
  "Settings.permissions.auditLogs.user.update": "Update user",
240
247
  "Settings.permissions.auditLogs.userId": "User ID",
248
+ "Settings.permissions.auditLogs.webhook.create": "Create webhook",
249
+ "Settings.permissions.auditLogs.webhook.delete": "Delete webhook",
250
+ "Settings.permissions.auditLogs.webhook.update": "Update webhook",
241
251
  "Settings.permissions.category": "Permissions settings for the {category}",
242
252
  "Settings.permissions.category.plugins": "Permissions settings for the {category} plugin",
243
253
  "Settings.permissions.conditions.anytime": "Anytime",
@@ -1 +1 @@
1
- {"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,93 @@
1
+ 'use strict';
2
+
3
+ var getProjectType = require('./getProjectType.js');
4
+ var urls = require('./urls.js');
5
+
6
+ /**
7
+ * Builds the `window.strapi` object: Community defaults, then the license response.
8
+ * Returned rather than assigned so the caller publishes it to `window` exactly once.
9
+ *
10
+ * Nothing here may read `window.strapi` — it does not exist yet, and the `#strapi`
11
+ * mount node shadows it as a named window property, so reads silently yield the
12
+ * element instead of throwing.
13
+ */ const createBrowserStrapi = async (features)=>{
14
+ const browserStrapi = {
15
+ /**
16
+ * This ENV variable is passed from the strapi instance, by default no url is set
17
+ * in the config and therefore the instance returns you an empty string so URLs are relative.
18
+ *
19
+ * To ensure that the backendURL is always set, we use the window.location.origin as a fallback.
20
+ */ backendURL: urls.createAbsoluteUrl(process.env.STRAPI_ADMIN_BACKEND_URL),
21
+ isEE: false,
22
+ isTrial: false,
23
+ isTrialLicense: false,
24
+ telemetryDisabled: process.env.STRAPI_TELEMETRY_DISABLED === 'true',
25
+ future: {
26
+ isEnabled: (name)=>{
27
+ return features?.future?.[name] === true;
28
+ }
29
+ },
30
+ featureFlags: {
31
+ isEnabled: (name)=>{
32
+ return features?.[name] === true;
33
+ }
34
+ },
35
+ features: {
36
+ SSO: 'sso',
37
+ AUDIT_LOGS: 'audit-logs',
38
+ REVIEW_WORKFLOWS: 'review-workflows',
39
+ /**
40
+ * If we don't get the license then we know it's not EE
41
+ * so no feature is enabled.
42
+ */ isEnabled: ()=>false
43
+ },
44
+ projectType: 'Community',
45
+ flags: {
46
+ nps: false,
47
+ promoteEE: true,
48
+ docLinks: true
49
+ },
50
+ ai: {
51
+ enabled: false
52
+ }
53
+ };
54
+ try {
55
+ /**
56
+ * Plain `fetch` rather than `getFetchClient`: the fetch client resolves its
57
+ * backend from `window.strapi`, which does not exist yet. The route is public,
58
+ * so it needs neither the auth header nor the token refresh the client adds.
59
+ */ const response = await fetch(`${browserStrapi.backendURL}/admin/project-type`, {
60
+ headers: {
61
+ Accept: 'application/json'
62
+ }
63
+ });
64
+ if (!response.ok) {
65
+ throw new Error(`[@strapi/admin]: /admin/project-type responded with ${response.status}`);
66
+ }
67
+ const { data: { isEE, isTrial, features: licensedFeatures, flags, ai, planPriceId } } = await response.json();
68
+ // Runtime defense: the payload is only typed by convention, not validated.
69
+ const trial = isTrial ?? false;
70
+ browserStrapi.isEE = isEE;
71
+ browserStrapi.isTrial = trial;
72
+ browserStrapi.isTrialLicense = trial;
73
+ browserStrapi.flags = flags;
74
+ browserStrapi.features = {
75
+ ...browserStrapi.features,
76
+ isEnabled: (featureName)=>licensedFeatures.some((feature)=>feature.name === featureName)
77
+ };
78
+ browserStrapi.projectType = getProjectType.getProjectType({
79
+ isEE,
80
+ planPriceId
81
+ });
82
+ browserStrapi.ai = ai;
83
+ } catch (err) {
84
+ /**
85
+ * If this fails, we simply don't activate any EE features.
86
+ * Should we warn clearer in the UI?
87
+ */ console.error(err);
88
+ }
89
+ return browserStrapi;
90
+ };
91
+
92
+ exports.createBrowserStrapi = createBrowserStrapi;
93
+ //# sourceMappingURL=browserStrapi.js.map