@strapi/admin 5.28.0 → 5.29.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 (30) hide show
  1. package/dist/admin/admin/src/components/FormInputs/Json.js +1 -1
  2. package/dist/admin/admin/src/components/FormInputs/Json.js.map +1 -1
  3. package/dist/admin/admin/src/components/FormInputs/Json.mjs +1 -1
  4. package/dist/admin/admin/src/components/FormInputs/Json.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/SubNav.js +9 -2
  6. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  7. package/dist/admin/admin/src/components/SubNav.mjs +9 -2
  8. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  9. package/dist/admin/admin/src/translations/en.json.js +2 -0
  10. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  11. package/dist/admin/admin/src/translations/en.json.mjs +2 -0
  12. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  13. package/dist/admin/src/components/SubNav.d.ts +1 -1
  14. package/dist/server/server/src/controllers/authentication.js +6 -6
  15. package/dist/server/server/src/controllers/authentication.js.map +1 -1
  16. package/dist/server/server/src/controllers/authentication.mjs +6 -6
  17. package/dist/server/server/src/controllers/authentication.mjs.map +1 -1
  18. package/dist/server/server/src/register.js +2 -1
  19. package/dist/server/server/src/register.js.map +1 -1
  20. package/dist/server/server/src/register.mjs +2 -1
  21. package/dist/server/server/src/register.mjs.map +1 -1
  22. package/dist/server/shared/utils/session-auth.js +11 -4
  23. package/dist/server/shared/utils/session-auth.js.map +1 -1
  24. package/dist/server/shared/utils/session-auth.mjs +11 -4
  25. package/dist/server/shared/utils/session-auth.mjs.map +1 -1
  26. package/dist/server/src/controllers/authentication.d.ts.map +1 -1
  27. package/dist/server/src/register.d.ts.map +1 -1
  28. package/dist/shared/utils/session-auth.d.ts +2 -2
  29. package/dist/shared/utils/session-auth.d.ts.map +1 -1
  30. package/package.json +7 -7
@@ -41,7 +41,7 @@ const JsonInput = /*#__PURE__*/ React__namespace.forwardRef(({ name, required, l
41
41
  }),
42
42
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.JSONInput, {
43
43
  ref: composedRefs,
44
- value: typeof field.value == 'object' ? JSON.stringify(field.value, null, 2) : field.value,
44
+ value: typeof field.value === 'object' || typeof field.value === 'boolean' || typeof field.value === 'number' ? JSON.stringify(field.value, null, 2) : field.value,
45
45
  onChange: (json)=>{
46
46
  // Default to null when the field is not required and there is no input value
47
47
  const value = required && !json.length ? null : json;
@@ -1 +1 @@
1
- {"version":3,"file":"Json.js","sources":["../../../../../../admin/src/components/FormInputs/Json.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n JSONInput as JSONInputImpl,\n useComposedRefs,\n Field,\n JSONInputRef,\n} from '@strapi/design-system';\n\nimport { useFocusInputField } from '../../hooks/useFocusInputField';\nimport { useField } from '../Form';\n\nimport { InputProps } from './types';\n\nconst JsonInput = React.forwardRef<JSONInputRef, InputProps>(\n ({ name, required, label, hint, labelAction, ...props }, ref) => {\n const field = useField(name);\n const fieldRef = useFocusInputField(name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n <Field.Root error={field.error} name={name} hint={hint} required={required}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <JSONInputImpl\n ref={composedRefs}\n value={\n typeof field.value == 'object' ? JSON.stringify(field.value, null, 2) : field.value\n }\n onChange={(json) => {\n // Default to null when the field is not required and there is no input value\n const value = required && !json.length ? null : json;\n field.onChange(name, value);\n }}\n minHeight={`25.2rem`}\n maxHeight={`50.4rem`}\n {...props}\n />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n }\n);\n\nconst MemoizedJsonInput = React.memo(JsonInput);\n\nexport { MemoizedJsonInput as JsonInput };\n"],"names":["JsonInput","React","forwardRef","name","required","label","hint","labelAction","props","ref","field","useField","fieldRef","useFocusInputField","composedRefs","useComposedRefs","_jsxs","Field","Root","error","_jsx","Label","action","JSONInputImpl","value","JSON","stringify","onChange","json","length","minHeight","maxHeight","Hint","Error","MemoizedJsonInput","memo"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,MAAMA,0BAAYC,gBAAMC,CAAAA,UAAU,CAChC,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,IAAI,EAAEC,WAAW,EAAE,GAAGC,OAAO,EAAEC,GAAAA,GAAAA;AACvD,IAAA,MAAMC,QAAQC,aAASR,CAAAA,IAAAA,CAAAA;AACvB,IAAA,MAAMS,WAAWC,qCAAmBV,CAAAA,IAAAA,CAAAA;IAEpC,MAAMW,YAAAA,GAAeC,6BAAgBN,GAAKG,EAAAA,QAAAA,CAAAA;IAE1C,qBACEI,eAAA,CAACC,mBAAMC,IAAI,EAAA;AAACC,QAAAA,KAAAA,EAAOT,MAAMS,KAAK;QAAEhB,IAAMA,EAAAA,IAAAA;QAAMG,IAAMA,EAAAA,IAAAA;QAAMF,QAAUA,EAAAA,QAAAA;;AAChE,0BAAAgB,cAAA,CAACH,mBAAMI,KAAK,EAAA;gBAACC,MAAQf,EAAAA,WAAAA;AAAcF,gBAAAA,QAAAA,EAAAA;;0BACnCe,cAACG,CAAAA,sBAAAA,EAAAA;gBACCd,GAAKK,EAAAA,YAAAA;AACLU,gBAAAA,KAAAA,EACE,OAAOd,KAAAA,CAAMc,KAAK,IAAI,WAAWC,IAAKC,CAAAA,SAAS,CAAChB,KAAAA,CAAMc,KAAK,EAAE,IAAM,EAAA,CAAA,CAAA,GAAKd,MAAMc,KAAK;AAErFG,gBAAAA,QAAAA,EAAU,CAACC,IAAAA,GAAAA;;AAET,oBAAA,MAAMJ,QAAQpB,QAAY,IAAA,CAACwB,IAAKC,CAAAA,MAAM,GAAG,IAAOD,GAAAA,IAAAA;oBAChDlB,KAAMiB,CAAAA,QAAQ,CAACxB,IAAMqB,EAAAA,KAAAA,CAAAA;AACvB,iBAAA;gBACAM,SAAW,EAAA,CAAC,OAAO,CAAC;gBACpBC,SAAW,EAAA,CAAC,OAAO,CAAC;AACnB,gBAAA,GAAGvB;;AAEN,0BAAAY,cAAA,CAACH,mBAAMe,IAAI,EAAA,EAAA,CAAA;AACX,0BAAAZ,cAAA,CAACH,mBAAMgB,KAAK,EAAA,EAAA;;;AAGlB,CAAA,CAAA;AAGIC,MAAAA,iBAAAA,iBAAoBjC,gBAAMkC,CAAAA,IAAI,CAACnC,SAAAA;;;;"}
1
+ {"version":3,"file":"Json.js","sources":["../../../../../../admin/src/components/FormInputs/Json.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n JSONInput as JSONInputImpl,\n useComposedRefs,\n Field,\n JSONInputRef,\n} from '@strapi/design-system';\n\nimport { useFocusInputField } from '../../hooks/useFocusInputField';\nimport { useField } from '../Form';\n\nimport { InputProps } from './types';\n\nconst JsonInput = React.forwardRef<JSONInputRef, InputProps>(\n ({ name, required, label, hint, labelAction, ...props }, ref) => {\n const field = useField(name);\n const fieldRef = useFocusInputField(name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n <Field.Root error={field.error} name={name} hint={hint} required={required}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <JSONInputImpl\n ref={composedRefs}\n value={\n typeof field.value === 'object' ||\n typeof field.value === 'boolean' ||\n typeof field.value === 'number'\n ? JSON.stringify(field.value, null, 2)\n : field.value\n }\n onChange={(json) => {\n // Default to null when the field is not required and there is no input value\n const value = required && !json.length ? null : json;\n field.onChange(name, value);\n }}\n minHeight={`25.2rem`}\n maxHeight={`50.4rem`}\n {...props}\n />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n }\n);\n\nconst MemoizedJsonInput = React.memo(JsonInput);\n\nexport { MemoizedJsonInput as JsonInput };\n"],"names":["JsonInput","React","forwardRef","name","required","label","hint","labelAction","props","ref","field","useField","fieldRef","useFocusInputField","composedRefs","useComposedRefs","_jsxs","Field","Root","error","_jsx","Label","action","JSONInputImpl","value","JSON","stringify","onChange","json","length","minHeight","maxHeight","Hint","Error","MemoizedJsonInput","memo"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,MAAMA,0BAAYC,gBAAMC,CAAAA,UAAU,CAChC,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,IAAI,EAAEC,WAAW,EAAE,GAAGC,OAAO,EAAEC,GAAAA,GAAAA;AACvD,IAAA,MAAMC,QAAQC,aAASR,CAAAA,IAAAA,CAAAA;AACvB,IAAA,MAAMS,WAAWC,qCAAmBV,CAAAA,IAAAA,CAAAA;IAEpC,MAAMW,YAAAA,GAAeC,6BAAgBN,GAAKG,EAAAA,QAAAA,CAAAA;IAE1C,qBACEI,eAAA,CAACC,mBAAMC,IAAI,EAAA;AAACC,QAAAA,KAAAA,EAAOT,MAAMS,KAAK;QAAEhB,IAAMA,EAAAA,IAAAA;QAAMG,IAAMA,EAAAA,IAAAA;QAAMF,QAAUA,EAAAA,QAAAA;;AAChE,0BAAAgB,cAAA,CAACH,mBAAMI,KAAK,EAAA;gBAACC,MAAQf,EAAAA,WAAAA;AAAcF,gBAAAA,QAAAA,EAAAA;;0BACnCe,cAACG,CAAAA,sBAAAA,EAAAA;gBACCd,GAAKK,EAAAA,YAAAA;gBACLU,KACE,EAAA,OAAOd,KAAMc,CAAAA,KAAK,KAAK,QAAA,IACvB,OAAOd,KAAMc,CAAAA,KAAK,KAAK,SAAA,IACvB,OAAOd,KAAAA,CAAMc,KAAK,KAAK,QAAA,GACnBC,IAAKC,CAAAA,SAAS,CAAChB,KAAAA,CAAMc,KAAK,EAAE,IAAA,EAAM,CAClCd,CAAAA,GAAAA,KAAAA,CAAMc,KAAK;AAEjBG,gBAAAA,QAAAA,EAAU,CAACC,IAAAA,GAAAA;;AAET,oBAAA,MAAMJ,QAAQpB,QAAY,IAAA,CAACwB,IAAKC,CAAAA,MAAM,GAAG,IAAOD,GAAAA,IAAAA;oBAChDlB,KAAMiB,CAAAA,QAAQ,CAACxB,IAAMqB,EAAAA,KAAAA,CAAAA;AACvB,iBAAA;gBACAM,SAAW,EAAA,CAAC,OAAO,CAAC;gBACpBC,SAAW,EAAA,CAAC,OAAO,CAAC;AACnB,gBAAA,GAAGvB;;AAEN,0BAAAY,cAAA,CAACH,mBAAMe,IAAI,EAAA,EAAA,CAAA;AACX,0BAAAZ,cAAA,CAACH,mBAAMgB,KAAK,EAAA,EAAA;;;AAGlB,CAAA,CAAA;AAGIC,MAAAA,iBAAAA,iBAAoBjC,gBAAMkC,CAAAA,IAAI,CAACnC,SAAAA;;;;"}
@@ -20,7 +20,7 @@ const JsonInput = /*#__PURE__*/ React.forwardRef(({ name, required, label, hint,
20
20
  }),
21
21
  /*#__PURE__*/ jsx(JSONInput, {
22
22
  ref: composedRefs,
23
- value: typeof field.value == 'object' ? JSON.stringify(field.value, null, 2) : field.value,
23
+ value: typeof field.value === 'object' || typeof field.value === 'boolean' || typeof field.value === 'number' ? JSON.stringify(field.value, null, 2) : field.value,
24
24
  onChange: (json)=>{
25
25
  // Default to null when the field is not required and there is no input value
26
26
  const value = required && !json.length ? null : json;
@@ -1 +1 @@
1
- {"version":3,"file":"Json.mjs","sources":["../../../../../../admin/src/components/FormInputs/Json.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n JSONInput as JSONInputImpl,\n useComposedRefs,\n Field,\n JSONInputRef,\n} from '@strapi/design-system';\n\nimport { useFocusInputField } from '../../hooks/useFocusInputField';\nimport { useField } from '../Form';\n\nimport { InputProps } from './types';\n\nconst JsonInput = React.forwardRef<JSONInputRef, InputProps>(\n ({ name, required, label, hint, labelAction, ...props }, ref) => {\n const field = useField(name);\n const fieldRef = useFocusInputField(name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n <Field.Root error={field.error} name={name} hint={hint} required={required}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <JSONInputImpl\n ref={composedRefs}\n value={\n typeof field.value == 'object' ? JSON.stringify(field.value, null, 2) : field.value\n }\n onChange={(json) => {\n // Default to null when the field is not required and there is no input value\n const value = required && !json.length ? null : json;\n field.onChange(name, value);\n }}\n minHeight={`25.2rem`}\n maxHeight={`50.4rem`}\n {...props}\n />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n }\n);\n\nconst MemoizedJsonInput = React.memo(JsonInput);\n\nexport { MemoizedJsonInput as JsonInput };\n"],"names":["JsonInput","React","forwardRef","name","required","label","hint","labelAction","props","ref","field","useField","fieldRef","useFocusInputField","composedRefs","useComposedRefs","_jsxs","Field","Root","error","_jsx","Label","action","JSONInputImpl","value","JSON","stringify","onChange","json","length","minHeight","maxHeight","Hint","Error","MemoizedJsonInput","memo"],"mappings":";;;;;;AAcA,MAAMA,0BAAYC,KAAMC,CAAAA,UAAU,CAChC,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,IAAI,EAAEC,WAAW,EAAE,GAAGC,OAAO,EAAEC,GAAAA,GAAAA;AACvD,IAAA,MAAMC,QAAQC,QAASR,CAAAA,IAAAA,CAAAA;AACvB,IAAA,MAAMS,WAAWC,kBAAmBV,CAAAA,IAAAA,CAAAA;IAEpC,MAAMW,YAAAA,GAAeC,gBAAgBN,GAAKG,EAAAA,QAAAA,CAAAA;IAE1C,qBACEI,IAAA,CAACC,MAAMC,IAAI,EAAA;AAACC,QAAAA,KAAAA,EAAOT,MAAMS,KAAK;QAAEhB,IAAMA,EAAAA,IAAAA;QAAMG,IAAMA,EAAAA,IAAAA;QAAMF,QAAUA,EAAAA,QAAAA;;AAChE,0BAAAgB,GAAA,CAACH,MAAMI,KAAK,EAAA;gBAACC,MAAQf,EAAAA,WAAAA;AAAcF,gBAAAA,QAAAA,EAAAA;;0BACnCe,GAACG,CAAAA,SAAAA,EAAAA;gBACCd,GAAKK,EAAAA,YAAAA;AACLU,gBAAAA,KAAAA,EACE,OAAOd,KAAAA,CAAMc,KAAK,IAAI,WAAWC,IAAKC,CAAAA,SAAS,CAAChB,KAAAA,CAAMc,KAAK,EAAE,IAAM,EAAA,CAAA,CAAA,GAAKd,MAAMc,KAAK;AAErFG,gBAAAA,QAAAA,EAAU,CAACC,IAAAA,GAAAA;;AAET,oBAAA,MAAMJ,QAAQpB,QAAY,IAAA,CAACwB,IAAKC,CAAAA,MAAM,GAAG,IAAOD,GAAAA,IAAAA;oBAChDlB,KAAMiB,CAAAA,QAAQ,CAACxB,IAAMqB,EAAAA,KAAAA,CAAAA;AACvB,iBAAA;gBACAM,SAAW,EAAA,CAAC,OAAO,CAAC;gBACpBC,SAAW,EAAA,CAAC,OAAO,CAAC;AACnB,gBAAA,GAAGvB;;AAEN,0BAAAY,GAAA,CAACH,MAAMe,IAAI,EAAA,EAAA,CAAA;AACX,0BAAAZ,GAAA,CAACH,MAAMgB,KAAK,EAAA,EAAA;;;AAGlB,CAAA,CAAA;AAGIC,MAAAA,iBAAAA,iBAAoBjC,KAAMkC,CAAAA,IAAI,CAACnC,SAAAA;;;;"}
1
+ {"version":3,"file":"Json.mjs","sources":["../../../../../../admin/src/components/FormInputs/Json.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n JSONInput as JSONInputImpl,\n useComposedRefs,\n Field,\n JSONInputRef,\n} from '@strapi/design-system';\n\nimport { useFocusInputField } from '../../hooks/useFocusInputField';\nimport { useField } from '../Form';\n\nimport { InputProps } from './types';\n\nconst JsonInput = React.forwardRef<JSONInputRef, InputProps>(\n ({ name, required, label, hint, labelAction, ...props }, ref) => {\n const field = useField(name);\n const fieldRef = useFocusInputField(name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n <Field.Root error={field.error} name={name} hint={hint} required={required}>\n <Field.Label action={labelAction}>{label}</Field.Label>\n <JSONInputImpl\n ref={composedRefs}\n value={\n typeof field.value === 'object' ||\n typeof field.value === 'boolean' ||\n typeof field.value === 'number'\n ? JSON.stringify(field.value, null, 2)\n : field.value\n }\n onChange={(json) => {\n // Default to null when the field is not required and there is no input value\n const value = required && !json.length ? null : json;\n field.onChange(name, value);\n }}\n minHeight={`25.2rem`}\n maxHeight={`50.4rem`}\n {...props}\n />\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n }\n);\n\nconst MemoizedJsonInput = React.memo(JsonInput);\n\nexport { MemoizedJsonInput as JsonInput };\n"],"names":["JsonInput","React","forwardRef","name","required","label","hint","labelAction","props","ref","field","useField","fieldRef","useFocusInputField","composedRefs","useComposedRefs","_jsxs","Field","Root","error","_jsx","Label","action","JSONInputImpl","value","JSON","stringify","onChange","json","length","minHeight","maxHeight","Hint","Error","MemoizedJsonInput","memo"],"mappings":";;;;;;AAcA,MAAMA,0BAAYC,KAAMC,CAAAA,UAAU,CAChC,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,IAAI,EAAEC,WAAW,EAAE,GAAGC,OAAO,EAAEC,GAAAA,GAAAA;AACvD,IAAA,MAAMC,QAAQC,QAASR,CAAAA,IAAAA,CAAAA;AACvB,IAAA,MAAMS,WAAWC,kBAAmBV,CAAAA,IAAAA,CAAAA;IAEpC,MAAMW,YAAAA,GAAeC,gBAAgBN,GAAKG,EAAAA,QAAAA,CAAAA;IAE1C,qBACEI,IAAA,CAACC,MAAMC,IAAI,EAAA;AAACC,QAAAA,KAAAA,EAAOT,MAAMS,KAAK;QAAEhB,IAAMA,EAAAA,IAAAA;QAAMG,IAAMA,EAAAA,IAAAA;QAAMF,QAAUA,EAAAA,QAAAA;;AAChE,0BAAAgB,GAAA,CAACH,MAAMI,KAAK,EAAA;gBAACC,MAAQf,EAAAA,WAAAA;AAAcF,gBAAAA,QAAAA,EAAAA;;0BACnCe,GAACG,CAAAA,SAAAA,EAAAA;gBACCd,GAAKK,EAAAA,YAAAA;gBACLU,KACE,EAAA,OAAOd,KAAMc,CAAAA,KAAK,KAAK,QAAA,IACvB,OAAOd,KAAMc,CAAAA,KAAK,KAAK,SAAA,IACvB,OAAOd,KAAAA,CAAMc,KAAK,KAAK,QAAA,GACnBC,IAAKC,CAAAA,SAAS,CAAChB,KAAAA,CAAMc,KAAK,EAAE,IAAA,EAAM,CAClCd,CAAAA,GAAAA,KAAAA,CAAMc,KAAK;AAEjBG,gBAAAA,QAAAA,EAAU,CAACC,IAAAA,GAAAA;;AAET,oBAAA,MAAMJ,QAAQpB,QAAY,IAAA,CAACwB,IAAKC,CAAAA,MAAM,GAAG,IAAOD,GAAAA,IAAAA;oBAChDlB,KAAMiB,CAAAA,QAAQ,CAACxB,IAAMqB,EAAAA,KAAAA,CAAAA;AACvB,iBAAA;gBACAM,SAAW,EAAA,CAAC,OAAO,CAAC;gBACpBC,SAAW,EAAA,CAAC,OAAO,CAAC;AACnB,gBAAA,GAAGvB;;AAEN,0BAAAY,GAAA,CAACH,MAAMe,IAAI,EAAA,EAAA,CAAA;AACX,0BAAAZ,GAAA,CAACH,MAAMgB,KAAK,EAAA,EAAA;;;AAGlB,CAAA,CAAA;AAGIC,MAAAA,iBAAAA,iBAAoBjC,KAAMkC,CAAAA,IAAI,CAACnC,SAAAA;;;;"}
@@ -93,7 +93,10 @@ const Link = (props)=>{
93
93
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
94
94
  tag: "div",
95
95
  lineHeight: "32px",
96
- width: "100%",
96
+ width: {
97
+ initial: '80dvw',
98
+ medium: '100%'
99
+ },
97
100
  overflow: "hidden",
98
101
  style: {
99
102
  textOverflow: 'ellipsis',
@@ -136,8 +139,12 @@ const Sections = ({ children, ...props })=>{
136
139
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
137
140
  paddingTop: 4,
138
141
  paddingBottom: 4,
142
+ maxWidth: {
143
+ initial: '100%',
144
+ medium: '23.2rem'
145
+ },
139
146
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
140
- tag: "ol",
147
+ tag: "ul",
141
148
  gap: "5",
142
149
  direction: "column",
143
150
  alignItems: "stretch",
@@ -1 +1 @@
1
- {"version":3,"file":"SubNav.js","sources":["../../../../../admin/src/components/SubNav.tsx"],"sourcesContent":["import { useId, useState } from 'react';\n\nimport {\n Box,\n SubNav as DSSubNav,\n Flex,\n Typography,\n IconButton,\n Badge,\n ScrollArea,\n} from '@strapi/design-system';\nimport { ChevronDown, Plus } from '@strapi/icons';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { HEIGHT_TOP_NAVIGATION } from '../constants/theme';\n\nimport { tours } from './GuidedTour/Tours';\n\nconst MainSubNav = styled(DSSubNav)`\n width: 100%;\n height: calc(100dvh - ${HEIGHT_TOP_NAVIGATION} - 1px);\n overflow: hidden;\n background-color: ${({ theme }) => theme.colors.neutral0};\n display: flex;\n flex-direction: column;\n border-right: 0;\n box-shadow: none;\n position: fixed;\n top: calc(${HEIGHT_TOP_NAVIGATION} + 1px);\n left: 0;\n z-index: 2;\n\n ${({ theme }) => theme.breakpoints.medium} {\n position: sticky;\n top: 0;\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n ${({ theme }) => theme.breakpoints.large} {\n height: 100dvh;\n }\n`;\n\nconst Main = ({ children, ...props }: { children: React.ReactNode; isFullPage?: boolean }) => (\n <MainSubNav {...props}>{children}</MainSubNav>\n);\n\nconst StyledLink = styled(NavLink)`\n display: flex;\n align-items: center;\n justify-content: space-between;\n text-decoration: none;\n height: 32px;\n\n color: ${({ theme }) => theme.colors.neutral800};\n\n &.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n color: ${theme.colors.primary700};\n font-weight: 500;\n `;\n }}\n }\n\n &:hover.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n `;\n }}\n }\n\n &:hover > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.neutral100};\n `;\n }}\n }\n\n &:focus-visible {\n outline-offset: -2px;\n }\n`;\n\nconst Link = (\n props: Omit<React.ComponentProps<typeof StyledLink>, 'label'> & {\n label: React.ReactNode;\n endAction?: React.ReactNode;\n handleClick?: () => void;\n }\n) => {\n const { label, endAction, handleClick, ...rest } = props;\n\n return (\n <StyledLink {...rest} onClick={handleClick}>\n <Box width={'100%'} paddingLeft={3} paddingRight={3} borderRadius={1}>\n <Flex justifyContent=\"space-between\" width=\"100%\" gap={1}>\n <Typography\n tag=\"div\"\n lineHeight=\"32px\"\n width=\"100%\"\n overflow=\"hidden\"\n style={{ textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\n >\n {label}\n </Typography>\n <Flex gap={2}>{endAction}</Flex>\n </Flex>\n </Box>\n </StyledLink>\n );\n};\n\nconst StyledHeader = styled(Flex)`\n flex: 0 0 ${HEIGHT_TOP_NAVIGATION};\n height: ${HEIGHT_TOP_NAVIGATION};\n`;\n\nconst Header = ({ label }: { label: string }) => {\n return (\n <StyledHeader\n justifyContent=\"space-between\"\n paddingLeft={{\n initial: 4,\n large: 5,\n }}\n paddingRight={{\n initial: 4,\n large: 5,\n }}\n >\n <Typography variant=\"beta\" tag=\"h2\">\n {label}\n </Typography>\n </StyledHeader>\n );\n};\n\nconst Sections = ({ children, ...props }: { children: React.ReactNode[]; [key: string]: any }) => {\n return (\n <Box paddingTop={4} paddingBottom={4}>\n <Flex tag=\"ol\" gap=\"5\" direction=\"column\" alignItems=\"stretch\" {...props}>\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Box>\n );\n};\n\n/**\n * TODO:\n * This would be better in the content-type-builder package directly but currently\n * the SubNav API does not expose a way to wrap the link, instead it wraps the link and the list\n */\nconst GuidedTourTooltip = ({\n sectionId,\n children,\n}: {\n sectionId?: string;\n children: React.ReactNode;\n}) => {\n switch (sectionId) {\n case 'models':\n return (\n <tours.contentTypeBuilder.CollectionTypes>\n <tours.contentTypeBuilder.YourTurn>{children}</tours.contentTypeBuilder.YourTurn>\n </tours.contentTypeBuilder.CollectionTypes>\n );\n case 'singleTypes':\n return (\n <tours.contentTypeBuilder.SingleTypes>{children}</tours.contentTypeBuilder.SingleTypes>\n );\n case 'components':\n return <tours.contentTypeBuilder.Components>{children}</tours.contentTypeBuilder.Components>;\n default:\n return children;\n }\n};\n\nconst Section = ({\n label,\n children,\n link,\n sectionId,\n badgeLabel,\n}: {\n label: string;\n children: React.ReactNode[];\n link?: { label: string; onClick: () => void };\n sectionId?: string;\n badgeLabel?: string;\n}) => {\n const listId = useId();\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Box\n paddingLeft={{\n initial: 4,\n large: 5,\n }}\n paddingRight={{\n initial: 4,\n large: 5,\n }}\n >\n <Flex position=\"relative\" justifyContent=\"space-between\" gap={2}>\n <Flex>\n <Box paddingRight={1}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {label}\n </Typography>\n </Box>\n </Flex>\n <Flex gap={1}>\n {badgeLabel && (\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral600\">\n {badgeLabel}\n </Badge>\n )}\n {link && (\n <GuidedTourTooltip sectionId={sectionId}>\n <IconButton\n label={link.label}\n variant=\"ghost\"\n withTooltip\n onClick={link.onClick}\n size=\"XS\"\n >\n <Plus />\n </IconButton>\n </GuidedTourTooltip>\n )}\n </Flex>\n </Flex>\n </Box>\n <Flex\n tag=\"ol\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n marginLeft={{\n initial: 1,\n large: 2,\n }}\n marginRight={{\n initial: 1,\n large: 2,\n }}\n >\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Flex>\n );\n};\n\nconst SubSectionHeader = styled.button`\n cursor: pointer;\n width: 100%;\n border: none;\n padding: 0;\n background: transparent;\n display: flex;\n align-items: center;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding-left: ${({ theme }) => theme.spaces[3]};\n padding-right: ${({ theme }) => theme.spaces[3]};\n padding-top: ${({ theme }) => theme.spaces[2]};\n padding-bottom: ${({ theme }) => theme.spaces[2]};\n\n &:hover {\n background-color: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\nconst SubSectionLinkWrapper = styled.li`\n ${StyledLink} > div {\n padding-left: 36px;\n }\n`;\n\nconst SubSection = ({ label, children }: { label: string; children: React.ReactNode[] }) => {\n const [isOpen, setOpenLinks] = useState(true);\n const listId = useId();\n\n const handleClick = () => {\n setOpenLinks((prev) => !prev);\n };\n\n return (\n <Box>\n <Flex justifyContent=\"space-between\">\n <SubSectionHeader onClick={handleClick} aria-expanded={isOpen} aria-controls={listId}>\n <ChevronDown\n aria-hidden\n fill=\"neutral500\"\n style={{\n transform: `rotate(${isOpen ? '0deg' : '-90deg'})`,\n transition: 'transform 0.5s',\n }}\n />\n <Box paddingLeft={2}>\n <Typography tag=\"span\" fontWeight=\"semiBold\" textColor=\"neutral800\">\n {label}\n </Typography>\n </Box>\n </SubSectionHeader>\n </Flex>\n {\n <Flex\n tag=\"ul\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n style={{\n maxHeight: isOpen ? '1000px' : 0,\n overflow: 'hidden',\n transition: isOpen\n ? 'max-height 1s ease-in-out'\n : 'max-height 0.5s cubic-bezier(0, 1, 0, 1)',\n }}\n >\n {children.map((child, index) => {\n return <SubSectionLinkWrapper key={index}>{child}</SubSectionLinkWrapper>;\n })}\n </Flex>\n }\n </Box>\n );\n};\n\nconst PageWrapper = styled(Box)`\n ${MainSubNav} {\n background-color: transparent;\n border-right: none;\n }\n\n ${({ theme }) => theme.breakpoints.medium} {\n ${MainSubNav} {\n top: 0;\n }\n }\n`;\n\nconst Content = ({ children }: { children: React.ReactNode }) => {\n return <ScrollArea>{children}</ScrollArea>;\n};\n\nexport const SubNav = {\n Main,\n Content,\n Header,\n Link,\n Sections,\n Section,\n SubSection,\n PageWrapper,\n};\n"],"names":["MainSubNav","styled","DSSubNav","HEIGHT_TOP_NAVIGATION","theme","colors","neutral0","breakpoints","medium","neutral150","large","Main","children","props","_jsx","StyledLink","NavLink","neutral800","primary100","primary700","neutral100","Link","label","endAction","handleClick","rest","onClick","Box","width","paddingLeft","paddingRight","borderRadius","_jsxs","Flex","justifyContent","gap","Typography","tag","lineHeight","overflow","style","textOverflow","whiteSpace","StyledHeader","Header","initial","variant","Sections","paddingTop","paddingBottom","direction","alignItems","map","child","index","li","GuidedTourTooltip","sectionId","tours","contentTypeBuilder","CollectionTypes","YourTurn","SingleTypes","Components","Section","link","badgeLabel","listId","useId","position","textColor","Badge","backgroundColor","IconButton","withTooltip","size","Plus","id","marginLeft","marginRight","SubSectionHeader","button","spaces","SubSectionLinkWrapper","SubSection","isOpen","setOpenLinks","useState","prev","aria-expanded","aria-controls","ChevronDown","aria-hidden","fill","transform","transition","fontWeight","maxHeight","PageWrapper","Content","ScrollArea","SubNav"],"mappings":"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"}
1
+ {"version":3,"file":"SubNav.js","sources":["../../../../../admin/src/components/SubNav.tsx"],"sourcesContent":["import { useId, useState } from 'react';\n\nimport {\n Box,\n SubNav as DSSubNav,\n Flex,\n Typography,\n IconButton,\n Badge,\n ScrollArea,\n} from '@strapi/design-system';\nimport { ChevronDown, Plus } from '@strapi/icons';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { HEIGHT_TOP_NAVIGATION } from '../constants/theme';\n\nimport { tours } from './GuidedTour/Tours';\n\nconst MainSubNav = styled(DSSubNav)`\n width: 100%;\n height: calc(100dvh - ${HEIGHT_TOP_NAVIGATION} - 1px);\n overflow: hidden;\n background-color: ${({ theme }) => theme.colors.neutral0};\n display: flex;\n flex-direction: column;\n border-right: 0;\n box-shadow: none;\n position: fixed;\n top: calc(${HEIGHT_TOP_NAVIGATION} + 1px);\n left: 0;\n z-index: 2;\n\n ${({ theme }) => theme.breakpoints.medium} {\n position: sticky;\n top: 0;\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n ${({ theme }) => theme.breakpoints.large} {\n height: 100dvh;\n }\n`;\n\nconst Main = ({ children, ...props }: { children: React.ReactNode; isFullPage?: boolean }) => (\n <MainSubNav {...props}>{children}</MainSubNav>\n);\n\nconst StyledLink = styled(NavLink)`\n display: flex;\n align-items: center;\n justify-content: space-between;\n text-decoration: none;\n height: 32px;\n\n color: ${({ theme }) => theme.colors.neutral800};\n\n &.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n color: ${theme.colors.primary700};\n font-weight: 500;\n `;\n }}\n }\n\n &:hover.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n `;\n }}\n }\n\n &:hover > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.neutral100};\n `;\n }}\n }\n\n &:focus-visible {\n outline-offset: -2px;\n }\n`;\n\nconst Link = (\n props: Omit<React.ComponentProps<typeof StyledLink>, 'label'> & {\n label: React.ReactNode;\n endAction?: React.ReactNode;\n handleClick?: () => void;\n }\n) => {\n const { label, endAction, handleClick, ...rest } = props;\n\n return (\n <StyledLink {...rest} onClick={handleClick}>\n <Box width={'100%'} paddingLeft={3} paddingRight={3} borderRadius={1}>\n <Flex justifyContent=\"space-between\" width=\"100%\" gap={1}>\n <Typography\n tag=\"div\"\n lineHeight=\"32px\"\n width={{ initial: '80dvw', medium: '100%' }}\n overflow=\"hidden\"\n style={{ textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\n >\n {label}\n </Typography>\n <Flex gap={2}>{endAction}</Flex>\n </Flex>\n </Box>\n </StyledLink>\n );\n};\n\nconst StyledHeader = styled(Flex)`\n flex: 0 0 ${HEIGHT_TOP_NAVIGATION};\n height: ${HEIGHT_TOP_NAVIGATION};\n`;\n\nconst Header = ({ label }: { label: string }) => {\n return (\n <StyledHeader\n justifyContent=\"space-between\"\n paddingLeft={{\n initial: 4,\n large: 5,\n }}\n paddingRight={{\n initial: 4,\n large: 5,\n }}\n >\n <Typography variant=\"beta\" tag=\"h2\">\n {label}\n </Typography>\n </StyledHeader>\n );\n};\n\nconst Sections = ({\n children,\n ...props\n}: {\n children: React.ReactNode[];\n [key: string]: unknown;\n}) => {\n return (\n <Box paddingTop={4} paddingBottom={4} maxWidth={{ initial: '100%', medium: '23.2rem' }}>\n <Flex tag=\"ul\" gap=\"5\" direction=\"column\" alignItems=\"stretch\" {...props}>\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Box>\n );\n};\n\n/**\n * TODO:\n * This would be better in the content-type-builder package directly but currently\n * the SubNav API does not expose a way to wrap the link, instead it wraps the link and the list\n */\nconst GuidedTourTooltip = ({\n sectionId,\n children,\n}: {\n sectionId?: string;\n children: React.ReactNode;\n}) => {\n switch (sectionId) {\n case 'models':\n return (\n <tours.contentTypeBuilder.CollectionTypes>\n <tours.contentTypeBuilder.YourTurn>{children}</tours.contentTypeBuilder.YourTurn>\n </tours.contentTypeBuilder.CollectionTypes>\n );\n case 'singleTypes':\n return (\n <tours.contentTypeBuilder.SingleTypes>{children}</tours.contentTypeBuilder.SingleTypes>\n );\n case 'components':\n return <tours.contentTypeBuilder.Components>{children}</tours.contentTypeBuilder.Components>;\n default:\n return children;\n }\n};\n\nconst Section = ({\n label,\n children,\n link,\n sectionId,\n badgeLabel,\n}: {\n label: string;\n children: React.ReactNode[];\n link?: { label: string; onClick: () => void };\n sectionId?: string;\n badgeLabel?: string;\n}) => {\n const listId = useId();\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Box\n paddingLeft={{\n initial: 4,\n large: 5,\n }}\n paddingRight={{\n initial: 4,\n large: 5,\n }}\n >\n <Flex position=\"relative\" justifyContent=\"space-between\" gap={2}>\n <Flex>\n <Box paddingRight={1}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {label}\n </Typography>\n </Box>\n </Flex>\n <Flex gap={1}>\n {badgeLabel && (\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral600\">\n {badgeLabel}\n </Badge>\n )}\n {link && (\n <GuidedTourTooltip sectionId={sectionId}>\n <IconButton\n label={link.label}\n variant=\"ghost\"\n withTooltip\n onClick={link.onClick}\n size=\"XS\"\n >\n <Plus />\n </IconButton>\n </GuidedTourTooltip>\n )}\n </Flex>\n </Flex>\n </Box>\n <Flex\n tag=\"ol\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n marginLeft={{\n initial: 1,\n large: 2,\n }}\n marginRight={{\n initial: 1,\n large: 2,\n }}\n >\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Flex>\n );\n};\n\nconst SubSectionHeader = styled.button`\n cursor: pointer;\n width: 100%;\n border: none;\n padding: 0;\n background: transparent;\n display: flex;\n align-items: center;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding-left: ${({ theme }) => theme.spaces[3]};\n padding-right: ${({ theme }) => theme.spaces[3]};\n padding-top: ${({ theme }) => theme.spaces[2]};\n padding-bottom: ${({ theme }) => theme.spaces[2]};\n\n &:hover {\n background-color: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\nconst SubSectionLinkWrapper = styled.li`\n ${StyledLink} > div {\n padding-left: 36px;\n }\n`;\n\nconst SubSection = ({ label, children }: { label: string; children: React.ReactNode[] }) => {\n const [isOpen, setOpenLinks] = useState(true);\n const listId = useId();\n\n const handleClick = () => {\n setOpenLinks((prev) => !prev);\n };\n\n return (\n <Box>\n <Flex justifyContent=\"space-between\">\n <SubSectionHeader onClick={handleClick} aria-expanded={isOpen} aria-controls={listId}>\n <ChevronDown\n aria-hidden\n fill=\"neutral500\"\n style={{\n transform: `rotate(${isOpen ? '0deg' : '-90deg'})`,\n transition: 'transform 0.5s',\n }}\n />\n <Box paddingLeft={2}>\n <Typography tag=\"span\" fontWeight=\"semiBold\" textColor=\"neutral800\">\n {label}\n </Typography>\n </Box>\n </SubSectionHeader>\n </Flex>\n <Flex\n tag=\"ul\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n style={{\n maxHeight: isOpen ? '1000px' : 0,\n overflow: 'hidden',\n transition: isOpen\n ? 'max-height 1s ease-in-out'\n : 'max-height 0.5s cubic-bezier(0, 1, 0, 1)',\n }}\n >\n {children.map((child, index) => {\n return <SubSectionLinkWrapper key={index}>{child}</SubSectionLinkWrapper>;\n })}\n </Flex>\n </Box>\n );\n};\n\nconst PageWrapper = styled(Box)`\n ${MainSubNav} {\n background-color: transparent;\n border-right: none;\n }\n\n ${({ theme }) => theme.breakpoints.medium} {\n ${MainSubNav} {\n top: 0;\n }\n }\n`;\n\nconst Content = ({ children }: { children: React.ReactNode }) => {\n return <ScrollArea>{children}</ScrollArea>;\n};\n\nexport const SubNav = {\n Main,\n Content,\n Header,\n Link,\n Sections,\n Section,\n SubSection,\n PageWrapper,\n};\n"],"names":["MainSubNav","styled","DSSubNav","HEIGHT_TOP_NAVIGATION","theme","colors","neutral0","breakpoints","medium","neutral150","large","Main","children","props","_jsx","StyledLink","NavLink","neutral800","primary100","primary700","neutral100","Link","label","endAction","handleClick","rest","onClick","Box","width","paddingLeft","paddingRight","borderRadius","_jsxs","Flex","justifyContent","gap","Typography","tag","lineHeight","initial","overflow","style","textOverflow","whiteSpace","StyledHeader","Header","variant","Sections","paddingTop","paddingBottom","maxWidth","direction","alignItems","map","child","index","li","GuidedTourTooltip","sectionId","tours","contentTypeBuilder","CollectionTypes","YourTurn","SingleTypes","Components","Section","link","badgeLabel","listId","useId","position","textColor","Badge","backgroundColor","IconButton","withTooltip","size","Plus","id","marginLeft","marginRight","SubSectionHeader","button","spaces","SubSectionLinkWrapper","SubSection","isOpen","setOpenLinks","useState","prev","aria-expanded","aria-controls","ChevronDown","aria-hidden","fill","transform","transition","fontWeight","maxHeight","PageWrapper","Content","ScrollArea","SubNav"],"mappings":"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"}
@@ -91,7 +91,10 @@ const Link = (props)=>{
91
91
  /*#__PURE__*/ jsx(Typography, {
92
92
  tag: "div",
93
93
  lineHeight: "32px",
94
- width: "100%",
94
+ width: {
95
+ initial: '80dvw',
96
+ medium: '100%'
97
+ },
95
98
  overflow: "hidden",
96
99
  style: {
97
100
  textOverflow: 'ellipsis',
@@ -134,8 +137,12 @@ const Sections = ({ children, ...props })=>{
134
137
  return /*#__PURE__*/ jsx(Box, {
135
138
  paddingTop: 4,
136
139
  paddingBottom: 4,
140
+ maxWidth: {
141
+ initial: '100%',
142
+ medium: '23.2rem'
143
+ },
137
144
  children: /*#__PURE__*/ jsx(Flex, {
138
- tag: "ol",
145
+ tag: "ul",
139
146
  gap: "5",
140
147
  direction: "column",
141
148
  alignItems: "stretch",
@@ -1 +1 @@
1
- {"version":3,"file":"SubNav.mjs","sources":["../../../../../admin/src/components/SubNav.tsx"],"sourcesContent":["import { useId, useState } from 'react';\n\nimport {\n Box,\n SubNav as DSSubNav,\n Flex,\n Typography,\n IconButton,\n Badge,\n ScrollArea,\n} from '@strapi/design-system';\nimport { ChevronDown, Plus } from '@strapi/icons';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { HEIGHT_TOP_NAVIGATION } from '../constants/theme';\n\nimport { tours } from './GuidedTour/Tours';\n\nconst MainSubNav = styled(DSSubNav)`\n width: 100%;\n height: calc(100dvh - ${HEIGHT_TOP_NAVIGATION} - 1px);\n overflow: hidden;\n background-color: ${({ theme }) => theme.colors.neutral0};\n display: flex;\n flex-direction: column;\n border-right: 0;\n box-shadow: none;\n position: fixed;\n top: calc(${HEIGHT_TOP_NAVIGATION} + 1px);\n left: 0;\n z-index: 2;\n\n ${({ theme }) => theme.breakpoints.medium} {\n position: sticky;\n top: 0;\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n ${({ theme }) => theme.breakpoints.large} {\n height: 100dvh;\n }\n`;\n\nconst Main = ({ children, ...props }: { children: React.ReactNode; isFullPage?: boolean }) => (\n <MainSubNav {...props}>{children}</MainSubNav>\n);\n\nconst StyledLink = styled(NavLink)`\n display: flex;\n align-items: center;\n justify-content: space-between;\n text-decoration: none;\n height: 32px;\n\n color: ${({ theme }) => theme.colors.neutral800};\n\n &.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n color: ${theme.colors.primary700};\n font-weight: 500;\n `;\n }}\n }\n\n &:hover.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n `;\n }}\n }\n\n &:hover > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.neutral100};\n `;\n }}\n }\n\n &:focus-visible {\n outline-offset: -2px;\n }\n`;\n\nconst Link = (\n props: Omit<React.ComponentProps<typeof StyledLink>, 'label'> & {\n label: React.ReactNode;\n endAction?: React.ReactNode;\n handleClick?: () => void;\n }\n) => {\n const { label, endAction, handleClick, ...rest } = props;\n\n return (\n <StyledLink {...rest} onClick={handleClick}>\n <Box width={'100%'} paddingLeft={3} paddingRight={3} borderRadius={1}>\n <Flex justifyContent=\"space-between\" width=\"100%\" gap={1}>\n <Typography\n tag=\"div\"\n lineHeight=\"32px\"\n width=\"100%\"\n overflow=\"hidden\"\n style={{ textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\n >\n {label}\n </Typography>\n <Flex gap={2}>{endAction}</Flex>\n </Flex>\n </Box>\n </StyledLink>\n );\n};\n\nconst StyledHeader = styled(Flex)`\n flex: 0 0 ${HEIGHT_TOP_NAVIGATION};\n height: ${HEIGHT_TOP_NAVIGATION};\n`;\n\nconst Header = ({ label }: { label: string }) => {\n return (\n <StyledHeader\n justifyContent=\"space-between\"\n paddingLeft={{\n initial: 4,\n large: 5,\n }}\n paddingRight={{\n initial: 4,\n large: 5,\n }}\n >\n <Typography variant=\"beta\" tag=\"h2\">\n {label}\n </Typography>\n </StyledHeader>\n );\n};\n\nconst Sections = ({ children, ...props }: { children: React.ReactNode[]; [key: string]: any }) => {\n return (\n <Box paddingTop={4} paddingBottom={4}>\n <Flex tag=\"ol\" gap=\"5\" direction=\"column\" alignItems=\"stretch\" {...props}>\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Box>\n );\n};\n\n/**\n * TODO:\n * This would be better in the content-type-builder package directly but currently\n * the SubNav API does not expose a way to wrap the link, instead it wraps the link and the list\n */\nconst GuidedTourTooltip = ({\n sectionId,\n children,\n}: {\n sectionId?: string;\n children: React.ReactNode;\n}) => {\n switch (sectionId) {\n case 'models':\n return (\n <tours.contentTypeBuilder.CollectionTypes>\n <tours.contentTypeBuilder.YourTurn>{children}</tours.contentTypeBuilder.YourTurn>\n </tours.contentTypeBuilder.CollectionTypes>\n );\n case 'singleTypes':\n return (\n <tours.contentTypeBuilder.SingleTypes>{children}</tours.contentTypeBuilder.SingleTypes>\n );\n case 'components':\n return <tours.contentTypeBuilder.Components>{children}</tours.contentTypeBuilder.Components>;\n default:\n return children;\n }\n};\n\nconst Section = ({\n label,\n children,\n link,\n sectionId,\n badgeLabel,\n}: {\n label: string;\n children: React.ReactNode[];\n link?: { label: string; onClick: () => void };\n sectionId?: string;\n badgeLabel?: string;\n}) => {\n const listId = useId();\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Box\n paddingLeft={{\n initial: 4,\n large: 5,\n }}\n paddingRight={{\n initial: 4,\n large: 5,\n }}\n >\n <Flex position=\"relative\" justifyContent=\"space-between\" gap={2}>\n <Flex>\n <Box paddingRight={1}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {label}\n </Typography>\n </Box>\n </Flex>\n <Flex gap={1}>\n {badgeLabel && (\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral600\">\n {badgeLabel}\n </Badge>\n )}\n {link && (\n <GuidedTourTooltip sectionId={sectionId}>\n <IconButton\n label={link.label}\n variant=\"ghost\"\n withTooltip\n onClick={link.onClick}\n size=\"XS\"\n >\n <Plus />\n </IconButton>\n </GuidedTourTooltip>\n )}\n </Flex>\n </Flex>\n </Box>\n <Flex\n tag=\"ol\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n marginLeft={{\n initial: 1,\n large: 2,\n }}\n marginRight={{\n initial: 1,\n large: 2,\n }}\n >\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Flex>\n );\n};\n\nconst SubSectionHeader = styled.button`\n cursor: pointer;\n width: 100%;\n border: none;\n padding: 0;\n background: transparent;\n display: flex;\n align-items: center;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding-left: ${({ theme }) => theme.spaces[3]};\n padding-right: ${({ theme }) => theme.spaces[3]};\n padding-top: ${({ theme }) => theme.spaces[2]};\n padding-bottom: ${({ theme }) => theme.spaces[2]};\n\n &:hover {\n background-color: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\nconst SubSectionLinkWrapper = styled.li`\n ${StyledLink} > div {\n padding-left: 36px;\n }\n`;\n\nconst SubSection = ({ label, children }: { label: string; children: React.ReactNode[] }) => {\n const [isOpen, setOpenLinks] = useState(true);\n const listId = useId();\n\n const handleClick = () => {\n setOpenLinks((prev) => !prev);\n };\n\n return (\n <Box>\n <Flex justifyContent=\"space-between\">\n <SubSectionHeader onClick={handleClick} aria-expanded={isOpen} aria-controls={listId}>\n <ChevronDown\n aria-hidden\n fill=\"neutral500\"\n style={{\n transform: `rotate(${isOpen ? '0deg' : '-90deg'})`,\n transition: 'transform 0.5s',\n }}\n />\n <Box paddingLeft={2}>\n <Typography tag=\"span\" fontWeight=\"semiBold\" textColor=\"neutral800\">\n {label}\n </Typography>\n </Box>\n </SubSectionHeader>\n </Flex>\n {\n <Flex\n tag=\"ul\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n style={{\n maxHeight: isOpen ? '1000px' : 0,\n overflow: 'hidden',\n transition: isOpen\n ? 'max-height 1s ease-in-out'\n : 'max-height 0.5s cubic-bezier(0, 1, 0, 1)',\n }}\n >\n {children.map((child, index) => {\n return <SubSectionLinkWrapper key={index}>{child}</SubSectionLinkWrapper>;\n })}\n </Flex>\n }\n </Box>\n );\n};\n\nconst PageWrapper = styled(Box)`\n ${MainSubNav} {\n background-color: transparent;\n border-right: none;\n }\n\n ${({ theme }) => theme.breakpoints.medium} {\n ${MainSubNav} {\n top: 0;\n }\n }\n`;\n\nconst Content = ({ children }: { children: React.ReactNode }) => {\n return <ScrollArea>{children}</ScrollArea>;\n};\n\nexport const SubNav = {\n Main,\n Content,\n Header,\n Link,\n Sections,\n Section,\n SubSection,\n PageWrapper,\n};\n"],"names":["MainSubNav","styled","DSSubNav","HEIGHT_TOP_NAVIGATION","theme","colors","neutral0","breakpoints","medium","neutral150","large","Main","children","props","_jsx","StyledLink","NavLink","neutral800","primary100","primary700","neutral100","Link","label","endAction","handleClick","rest","onClick","Box","width","paddingLeft","paddingRight","borderRadius","_jsxs","Flex","justifyContent","gap","Typography","tag","lineHeight","overflow","style","textOverflow","whiteSpace","StyledHeader","Header","initial","variant","Sections","paddingTop","paddingBottom","direction","alignItems","map","child","index","li","GuidedTourTooltip","sectionId","tours","contentTypeBuilder","CollectionTypes","YourTurn","SingleTypes","Components","Section","link","badgeLabel","listId","useId","position","textColor","Badge","backgroundColor","IconButton","withTooltip","size","Plus","id","marginLeft","marginRight","SubSectionHeader","button","spaces","SubSectionLinkWrapper","SubSection","isOpen","setOpenLinks","useState","prev","aria-expanded","aria-controls","ChevronDown","aria-hidden","fill","transform","transition","fontWeight","maxHeight","PageWrapper","Content","ScrollArea","SubNav"],"mappings":"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"}
1
+ {"version":3,"file":"SubNav.mjs","sources":["../../../../../admin/src/components/SubNav.tsx"],"sourcesContent":["import { useId, useState } from 'react';\n\nimport {\n Box,\n SubNav as DSSubNav,\n Flex,\n Typography,\n IconButton,\n Badge,\n ScrollArea,\n} from '@strapi/design-system';\nimport { ChevronDown, Plus } from '@strapi/icons';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { HEIGHT_TOP_NAVIGATION } from '../constants/theme';\n\nimport { tours } from './GuidedTour/Tours';\n\nconst MainSubNav = styled(DSSubNav)`\n width: 100%;\n height: calc(100dvh - ${HEIGHT_TOP_NAVIGATION} - 1px);\n overflow: hidden;\n background-color: ${({ theme }) => theme.colors.neutral0};\n display: flex;\n flex-direction: column;\n border-right: 0;\n box-shadow: none;\n position: fixed;\n top: calc(${HEIGHT_TOP_NAVIGATION} + 1px);\n left: 0;\n z-index: 2;\n\n ${({ theme }) => theme.breakpoints.medium} {\n position: sticky;\n top: 0;\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n }\n ${({ theme }) => theme.breakpoints.large} {\n height: 100dvh;\n }\n`;\n\nconst Main = ({ children, ...props }: { children: React.ReactNode; isFullPage?: boolean }) => (\n <MainSubNav {...props}>{children}</MainSubNav>\n);\n\nconst StyledLink = styled(NavLink)`\n display: flex;\n align-items: center;\n justify-content: space-between;\n text-decoration: none;\n height: 32px;\n\n color: ${({ theme }) => theme.colors.neutral800};\n\n &.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n color: ${theme.colors.primary700};\n font-weight: 500;\n `;\n }}\n }\n\n &:hover.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n `;\n }}\n }\n\n &:hover > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.neutral100};\n `;\n }}\n }\n\n &:focus-visible {\n outline-offset: -2px;\n }\n`;\n\nconst Link = (\n props: Omit<React.ComponentProps<typeof StyledLink>, 'label'> & {\n label: React.ReactNode;\n endAction?: React.ReactNode;\n handleClick?: () => void;\n }\n) => {\n const { label, endAction, handleClick, ...rest } = props;\n\n return (\n <StyledLink {...rest} onClick={handleClick}>\n <Box width={'100%'} paddingLeft={3} paddingRight={3} borderRadius={1}>\n <Flex justifyContent=\"space-between\" width=\"100%\" gap={1}>\n <Typography\n tag=\"div\"\n lineHeight=\"32px\"\n width={{ initial: '80dvw', medium: '100%' }}\n overflow=\"hidden\"\n style={{ textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\n >\n {label}\n </Typography>\n <Flex gap={2}>{endAction}</Flex>\n </Flex>\n </Box>\n </StyledLink>\n );\n};\n\nconst StyledHeader = styled(Flex)`\n flex: 0 0 ${HEIGHT_TOP_NAVIGATION};\n height: ${HEIGHT_TOP_NAVIGATION};\n`;\n\nconst Header = ({ label }: { label: string }) => {\n return (\n <StyledHeader\n justifyContent=\"space-between\"\n paddingLeft={{\n initial: 4,\n large: 5,\n }}\n paddingRight={{\n initial: 4,\n large: 5,\n }}\n >\n <Typography variant=\"beta\" tag=\"h2\">\n {label}\n </Typography>\n </StyledHeader>\n );\n};\n\nconst Sections = ({\n children,\n ...props\n}: {\n children: React.ReactNode[];\n [key: string]: unknown;\n}) => {\n return (\n <Box paddingTop={4} paddingBottom={4} maxWidth={{ initial: '100%', medium: '23.2rem' }}>\n <Flex tag=\"ul\" gap=\"5\" direction=\"column\" alignItems=\"stretch\" {...props}>\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Box>\n );\n};\n\n/**\n * TODO:\n * This would be better in the content-type-builder package directly but currently\n * the SubNav API does not expose a way to wrap the link, instead it wraps the link and the list\n */\nconst GuidedTourTooltip = ({\n sectionId,\n children,\n}: {\n sectionId?: string;\n children: React.ReactNode;\n}) => {\n switch (sectionId) {\n case 'models':\n return (\n <tours.contentTypeBuilder.CollectionTypes>\n <tours.contentTypeBuilder.YourTurn>{children}</tours.contentTypeBuilder.YourTurn>\n </tours.contentTypeBuilder.CollectionTypes>\n );\n case 'singleTypes':\n return (\n <tours.contentTypeBuilder.SingleTypes>{children}</tours.contentTypeBuilder.SingleTypes>\n );\n case 'components':\n return <tours.contentTypeBuilder.Components>{children}</tours.contentTypeBuilder.Components>;\n default:\n return children;\n }\n};\n\nconst Section = ({\n label,\n children,\n link,\n sectionId,\n badgeLabel,\n}: {\n label: string;\n children: React.ReactNode[];\n link?: { label: string; onClick: () => void };\n sectionId?: string;\n badgeLabel?: string;\n}) => {\n const listId = useId();\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Box\n paddingLeft={{\n initial: 4,\n large: 5,\n }}\n paddingRight={{\n initial: 4,\n large: 5,\n }}\n >\n <Flex position=\"relative\" justifyContent=\"space-between\" gap={2}>\n <Flex>\n <Box paddingRight={1}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {label}\n </Typography>\n </Box>\n </Flex>\n <Flex gap={1}>\n {badgeLabel && (\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral600\">\n {badgeLabel}\n </Badge>\n )}\n {link && (\n <GuidedTourTooltip sectionId={sectionId}>\n <IconButton\n label={link.label}\n variant=\"ghost\"\n withTooltip\n onClick={link.onClick}\n size=\"XS\"\n >\n <Plus />\n </IconButton>\n </GuidedTourTooltip>\n )}\n </Flex>\n </Flex>\n </Box>\n <Flex\n tag=\"ol\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n marginLeft={{\n initial: 1,\n large: 2,\n }}\n marginRight={{\n initial: 1,\n large: 2,\n }}\n >\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Flex>\n );\n};\n\nconst SubSectionHeader = styled.button`\n cursor: pointer;\n width: 100%;\n border: none;\n padding: 0;\n background: transparent;\n display: flex;\n align-items: center;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding-left: ${({ theme }) => theme.spaces[3]};\n padding-right: ${({ theme }) => theme.spaces[3]};\n padding-top: ${({ theme }) => theme.spaces[2]};\n padding-bottom: ${({ theme }) => theme.spaces[2]};\n\n &:hover {\n background-color: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\nconst SubSectionLinkWrapper = styled.li`\n ${StyledLink} > div {\n padding-left: 36px;\n }\n`;\n\nconst SubSection = ({ label, children }: { label: string; children: React.ReactNode[] }) => {\n const [isOpen, setOpenLinks] = useState(true);\n const listId = useId();\n\n const handleClick = () => {\n setOpenLinks((prev) => !prev);\n };\n\n return (\n <Box>\n <Flex justifyContent=\"space-between\">\n <SubSectionHeader onClick={handleClick} aria-expanded={isOpen} aria-controls={listId}>\n <ChevronDown\n aria-hidden\n fill=\"neutral500\"\n style={{\n transform: `rotate(${isOpen ? '0deg' : '-90deg'})`,\n transition: 'transform 0.5s',\n }}\n />\n <Box paddingLeft={2}>\n <Typography tag=\"span\" fontWeight=\"semiBold\" textColor=\"neutral800\">\n {label}\n </Typography>\n </Box>\n </SubSectionHeader>\n </Flex>\n <Flex\n tag=\"ul\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n style={{\n maxHeight: isOpen ? '1000px' : 0,\n overflow: 'hidden',\n transition: isOpen\n ? 'max-height 1s ease-in-out'\n : 'max-height 0.5s cubic-bezier(0, 1, 0, 1)',\n }}\n >\n {children.map((child, index) => {\n return <SubSectionLinkWrapper key={index}>{child}</SubSectionLinkWrapper>;\n })}\n </Flex>\n </Box>\n );\n};\n\nconst PageWrapper = styled(Box)`\n ${MainSubNav} {\n background-color: transparent;\n border-right: none;\n }\n\n ${({ theme }) => theme.breakpoints.medium} {\n ${MainSubNav} {\n top: 0;\n }\n }\n`;\n\nconst Content = ({ children }: { children: React.ReactNode }) => {\n return <ScrollArea>{children}</ScrollArea>;\n};\n\nexport const SubNav = {\n Main,\n Content,\n Header,\n Link,\n Sections,\n Section,\n SubSection,\n PageWrapper,\n};\n"],"names":["MainSubNav","styled","DSSubNav","HEIGHT_TOP_NAVIGATION","theme","colors","neutral0","breakpoints","medium","neutral150","large","Main","children","props","_jsx","StyledLink","NavLink","neutral800","primary100","primary700","neutral100","Link","label","endAction","handleClick","rest","onClick","Box","width","paddingLeft","paddingRight","borderRadius","_jsxs","Flex","justifyContent","gap","Typography","tag","lineHeight","initial","overflow","style","textOverflow","whiteSpace","StyledHeader","Header","variant","Sections","paddingTop","paddingBottom","maxWidth","direction","alignItems","map","child","index","li","GuidedTourTooltip","sectionId","tours","contentTypeBuilder","CollectionTypes","YourTurn","SingleTypes","Components","Section","link","badgeLabel","listId","useId","position","textColor","Badge","backgroundColor","IconButton","withTooltip","size","Plus","id","marginLeft","marginRight","SubSectionHeader","button","spaces","SubSectionLinkWrapper","SubSection","isOpen","setOpenLinks","useState","prev","aria-expanded","aria-controls","ChevronDown","aria-hidden","fill","transform","transition","fontWeight","maxHeight","PageWrapper","Content","ScrollArea","SubNav"],"mappings":"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"}
@@ -553,6 +553,8 @@ var en = {
553
553
  "app.components.PluginCard.more-details": "More details",
554
554
  "app.components.ToggleCheckbox.off-label": "False",
555
555
  "app.components.ToggleCheckbox.on-label": "True",
556
+ "app.components.ToggleCheckbox.enabled-label": "Enabled",
557
+ "app.components.ToggleCheckbox.disabled-label": "Disabled",
556
558
  "app.components.UpsellBanner.button": "Upgrade now",
557
559
  "app.components.UpsellBanner.intro": "Access to Growth plan features: ",
558
560
  "app.components.UpsellBanner.text": "As part of your trial, you can explore premium tools such as Content History, Releases, and Single Sign-On (SSO).",
@@ -1 +1 @@
1
- {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -549,6 +549,8 @@ var en = {
549
549
  "app.components.PluginCard.more-details": "More details",
550
550
  "app.components.ToggleCheckbox.off-label": "False",
551
551
  "app.components.ToggleCheckbox.on-label": "True",
552
+ "app.components.ToggleCheckbox.enabled-label": "Enabled",
553
+ "app.components.ToggleCheckbox.disabled-label": "Disabled",
552
554
  "app.components.UpsellBanner.button": "Upgrade now",
553
555
  "app.components.UpsellBanner.intro": "Access to Growth plan features: ",
554
556
  "app.components.UpsellBanner.text": "As part of your trial, you can explore premium tools such as Content History, Releases, and Single Sign-On (SSO).",
@@ -1 +1 @@
1
- {"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -20,7 +20,7 @@ export declare const SubNav: {
20
20
  }) => import("react/jsx-runtime").JSX.Element;
21
21
  Sections: ({ children, ...props }: {
22
22
  children: React.ReactNode[];
23
- [key: string]: any;
23
+ [key: string]: unknown;
24
24
  }) => import("react/jsx-runtime").JSX.Element;
25
25
  Section: ({ label, children, link, sectionId, badgeLabel, }: {
26
26
  label: string;
@@ -63,7 +63,7 @@ var authentication = {
63
63
  const { token: refreshToken, absoluteExpiresAt } = await sessionManager('admin').generateRefreshToken(userId, deviceId, {
64
64
  type: rememberMe ? 'refresh' : 'session'
65
65
  });
66
- const cookieOptions = sessionAuth.buildCookieOptionsWithExpiry(rememberMe ? 'refresh' : 'session', absoluteExpiresAt);
66
+ const cookieOptions = sessionAuth.buildCookieOptionsWithExpiry(rememberMe ? 'refresh' : 'session', absoluteExpiresAt, ctx.request.secure);
67
67
  ctx.cookies.set(sessionAuth.REFRESH_COOKIE_NAME, refreshToken, cookieOptions);
68
68
  const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);
69
69
  if ('error' in accessResult) {
@@ -108,7 +108,7 @@ var authentication = {
108
108
  const { token: refreshToken, absoluteExpiresAt } = await sessionManager('admin').generateRefreshToken(userId, deviceId, {
109
109
  type: rememberMe ? 'refresh' : 'session'
110
110
  });
111
- const cookieOptions = sessionAuth.buildCookieOptionsWithExpiry(rememberMe ? 'refresh' : 'session', absoluteExpiresAt);
111
+ const cookieOptions = sessionAuth.buildCookieOptionsWithExpiry(rememberMe ? 'refresh' : 'session', absoluteExpiresAt, ctx.request.secure);
112
112
  ctx.cookies.set(sessionAuth.REFRESH_COOKIE_NAME, refreshToken, cookieOptions);
113
113
  const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);
114
114
  if ('error' in accessResult) {
@@ -157,7 +157,7 @@ var authentication = {
157
157
  const { token: refreshToken, absoluteExpiresAt } = await sessionManager('admin').generateRefreshToken(userId, deviceId, {
158
158
  type: rememberMe ? 'refresh' : 'session'
159
159
  });
160
- const cookieOptions = sessionAuth.buildCookieOptionsWithExpiry(rememberMe ? 'refresh' : 'session', absoluteExpiresAt);
160
+ const cookieOptions = sessionAuth.buildCookieOptionsWithExpiry(rememberMe ? 'refresh' : 'session', absoluteExpiresAt, ctx.request.secure);
161
161
  ctx.cookies.set(sessionAuth.REFRESH_COOKIE_NAME, refreshToken, cookieOptions);
162
162
  const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);
163
163
  if ('error' in accessResult) {
@@ -200,7 +200,7 @@ var authentication = {
200
200
  type: 'session'
201
201
  });
202
202
  // No rememberMe flow here; expire with session by default (session cookie)
203
- const cookieOptions = sessionAuth.buildCookieOptionsWithExpiry('session', absoluteExpiresAt);
203
+ const cookieOptions = sessionAuth.buildCookieOptionsWithExpiry('session', absoluteExpiresAt, ctx.request.secure);
204
204
  ctx.cookies.set(sessionAuth.REFRESH_COOKIE_NAME, refreshToken, cookieOptions);
205
205
  const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);
206
206
  if ('error' in accessResult) {
@@ -240,7 +240,7 @@ var authentication = {
240
240
  }
241
241
  const { token } = result;
242
242
  // Preserve session-vs-remember mode using rotation.type and rotation.absoluteExpiresAt
243
- const opts = sessionAuth.buildCookieOptionsWithExpiry(rotation.type, rotation.absoluteExpiresAt);
243
+ const opts = sessionAuth.buildCookieOptionsWithExpiry(rotation.type, rotation.absoluteExpiresAt, ctx.request.secure);
244
244
  ctx.cookies.set(sessionAuth.REFRESH_COOKIE_NAME, rotation.token, opts);
245
245
  ctx.body = {
246
246
  data: {
@@ -261,7 +261,7 @@ var authentication = {
261
261
  const deviceId = typeof bodyDeviceId === 'string' ? bodyDeviceId : undefined;
262
262
  // Clear cookie regardless of token validity
263
263
  ctx.cookies.set(sessionAuth.REFRESH_COOKIE_NAME, '', {
264
- ...sessionAuth.getRefreshCookieOptions(),
264
+ ...sessionAuth.getRefreshCookieOptions(ctx.request.secure),
265
265
  expires: new Date(0)
266
266
  });
267
267
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"authentication.js","sources":["../../../../../server/src/controllers/authentication.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport passport from 'koa-passport';\nimport compose from 'koa-compose';\nimport '@strapi/types';\nimport { errors } from '@strapi/utils';\nimport { getService } from '../utils';\nimport {\n REFRESH_COOKIE_NAME,\n buildCookieOptionsWithExpiry,\n getSessionManager,\n extractDeviceParams,\n generateDeviceId,\n getRefreshCookieOptions,\n} from '../../../shared/utils/session-auth';\n\nimport {\n validateRegistrationInput,\n validateAdminRegistrationInput,\n validateRegistrationInfoQuery,\n validateForgotPasswordInput,\n validateResetPasswordInput,\n validateLoginSessionInput,\n} from '../validation/authentication';\n\nimport type {\n ForgotPassword,\n Login,\n Register,\n RegistrationInfo,\n ResetPassword,\n} from '../../../shared/contracts/authentication';\nimport { AdminUser } from '../../../shared/contracts/shared';\n\nconst { ApplicationError, ValidationError } = errors;\n\nexport default {\n login: compose([\n async (ctx: Context, next: Next) => {\n await validateLoginSessionInput(ctx.request.body ?? {});\n return next();\n },\n (ctx: Context, next: Next) => {\n return passport.authenticate('local', { session: false }, (err, user, info) => {\n if (err) {\n strapi.eventHub.emit('admin.auth.error', { error: err, provider: 'local' });\n // if this is a recognized error, allow it to bubble up to user\n if (err.details?.code === 'LOGIN_NOT_ALLOWED') {\n throw err;\n }\n\n // for all other errors throw a generic error to prevent leaking info\n return ctx.notImplemented();\n }\n\n if (!user) {\n strapi.eventHub.emit('admin.auth.error', {\n error: new Error(info.message),\n provider: 'local',\n });\n throw new ApplicationError(info.message);\n }\n\n const query = ctx.state as Login.Request['query'];\n query.user = user;\n\n const sanitizedUser = getService('user').sanitizeUser(user);\n strapi.eventHub.emit('admin.auth.success', { user: sanitizedUser, provider: 'local' });\n\n return next();\n })(ctx, next);\n },\n async (ctx: Context) => {\n const { user } = ctx.state as { user: AdminUser };\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n const userId = String(user.id);\n const { deviceId, rememberMe } = extractDeviceParams(ctx.request.body);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, {\n type: rememberMe ? 'refresh' : 'session',\n });\n\n const cookieOptions = buildCookieOptionsWithExpiry(\n rememberMe ? 'refresh' : 'session',\n absoluteExpiresAt\n );\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token: accessToken } = accessResult;\n\n ctx.body = {\n data: {\n token: accessToken,\n accessToken,\n user: getService('user').sanitizeUser(ctx.state.user),\n },\n } satisfies Login.Response;\n } catch (error) {\n strapi.log.error('Failed to create admin refresh session', error);\n return ctx.internalServerError();\n }\n },\n ]),\n\n async registrationInfo(ctx: Context) {\n await validateRegistrationInfoQuery(ctx.request.query);\n\n const { registrationToken } = ctx.request.query as RegistrationInfo.Request['query'];\n\n const registrationInfo = await getService('user').findRegistrationInfo(registrationToken);\n\n if (!registrationInfo) {\n throw new ValidationError('Invalid registrationToken');\n }\n\n ctx.body = { data: registrationInfo } satisfies RegistrationInfo.Response;\n },\n\n async register(ctx: Context) {\n const input = ctx.request.body as Register.Request['body'];\n\n await validateRegistrationInput(input);\n\n const user = await getService('user').register(input);\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n const userId = String(user.id);\n const { deviceId, rememberMe } = extractDeviceParams(ctx.request.body);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, { type: rememberMe ? 'refresh' : 'session' });\n\n const cookieOptions = buildCookieOptionsWithExpiry(\n rememberMe ? 'refresh' : 'session',\n absoluteExpiresAt\n );\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token: accessToken } = accessResult;\n\n ctx.body = {\n data: {\n token: accessToken,\n accessToken,\n user: getService('user').sanitizeUser(user),\n },\n } satisfies Register.Response;\n } catch (error) {\n strapi.log.error('Failed to create admin refresh session during register', error);\n return ctx.internalServerError();\n }\n },\n\n async registerAdmin(ctx: Context) {\n const input = ctx.request.body as Register.Request['body'];\n\n await validateAdminRegistrationInput(input);\n\n const hasAdmin = await getService('user').exists();\n\n if (hasAdmin) {\n throw new ApplicationError('You cannot register a new super admin');\n }\n\n const superAdminRole = await getService('role').getSuperAdmin();\n\n if (!superAdminRole) {\n throw new ApplicationError(\n \"Cannot register the first admin because the super admin role doesn't exist.\"\n );\n }\n\n const user = await getService('user').create({\n ...input,\n registrationToken: null,\n isActive: true,\n roles: superAdminRole ? [superAdminRole.id] : [],\n });\n\n strapi.telemetry.send('didCreateFirstAdmin');\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n const userId = String(user.id);\n const { deviceId, rememberMe } = extractDeviceParams(ctx.request.body);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, { type: rememberMe ? 'refresh' : 'session' });\n\n const cookieOptions = buildCookieOptionsWithExpiry(\n rememberMe ? 'refresh' : 'session',\n absoluteExpiresAt\n );\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token: accessToken } = accessResult;\n\n ctx.body = {\n data: {\n token: accessToken,\n accessToken,\n user: getService('user').sanitizeUser(user),\n },\n };\n } catch (error) {\n strapi.log.error('Failed to create admin refresh session during register-admin', error);\n return ctx.internalServerError();\n }\n },\n\n async forgotPassword(ctx: Context) {\n const input = ctx.request.body as ForgotPassword.Request['body'];\n\n await validateForgotPasswordInput(input);\n\n getService('auth').forgotPassword(input);\n\n ctx.status = 204;\n },\n\n async resetPassword(ctx: Context) {\n const input = ctx.request.body as ResetPassword.Request['body'];\n\n await validateResetPasswordInput(input);\n\n const user = await getService('auth').resetPassword(input);\n\n // Issue a new admin refresh session and access token after password reset.\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n\n const userId = String(user.id);\n const deviceId = generateDeviceId();\n\n // Invalidate all existing sessions before creating a new one\n await sessionManager('admin').invalidateRefreshToken(userId);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, { type: 'session' });\n\n // No rememberMe flow here; expire with session by default (session cookie)\n const cookieOptions = buildCookieOptionsWithExpiry('session', absoluteExpiresAt);\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token } = accessResult;\n\n ctx.body = {\n data: {\n token,\n user: getService('user').sanitizeUser(user),\n },\n } satisfies ResetPassword.Response;\n } catch (err) {\n strapi.log.error('Failed to create admin refresh session during reset-password', err as any);\n return ctx.internalServerError();\n }\n },\n\n async accessToken(ctx: Context) {\n const refreshToken = ctx.cookies.get(REFRESH_COOKIE_NAME);\n\n if (!refreshToken) {\n return ctx.unauthorized('Missing refresh token');\n }\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n\n // Single-use renewal: rotate on access exchange, then create access token\n // from the new refresh token\n const rotation = await sessionManager('admin').rotateRefreshToken(refreshToken);\n if ('error' in rotation) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const result = await sessionManager('admin').generateAccessToken(rotation.token);\n if ('error' in result) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const { token } = result;\n // Preserve session-vs-remember mode using rotation.type and rotation.absoluteExpiresAt\n const opts = buildCookieOptionsWithExpiry(rotation.type, rotation.absoluteExpiresAt);\n\n ctx.cookies.set(REFRESH_COOKIE_NAME, rotation.token, opts);\n ctx.body = { data: { token } };\n } catch (err) {\n strapi.log.error('Failed to generate access token from refresh token', err as any);\n return ctx.internalServerError();\n }\n },\n\n async logout(ctx: Context) {\n const sanitizedUser = getService('user').sanitizeUser(ctx.state.user);\n strapi.eventHub.emit('admin.logout', { user: sanitizedUser });\n\n const bodyDeviceId = ctx.request.body?.deviceId as string | undefined;\n const deviceId = typeof bodyDeviceId === 'string' ? bodyDeviceId : undefined;\n\n // Clear cookie regardless of token validity\n ctx.cookies.set(REFRESH_COOKIE_NAME, '', {\n ...getRefreshCookieOptions(),\n expires: new Date(0),\n });\n\n try {\n const sessionManager = getSessionManager();\n if (sessionManager) {\n const userId = String(ctx.state.user.id);\n await sessionManager('admin').invalidateRefreshToken(userId, deviceId);\n }\n } catch (err) {\n strapi.log.error('Failed to revoke admin sessions during logout', err as any);\n }\n\n ctx.body = { data: {} };\n },\n};\n"],"names":["ApplicationError","ValidationError","errors","login","compose","ctx","next","validateLoginSessionInput","request","body","passport","authenticate","session","err","user","info","strapi","eventHub","emit","error","provider","details","code","notImplemented","Error","message","query","state","sanitizedUser","getService","sanitizeUser","sessionManager","getSessionManager","internalServerError","userId","String","id","deviceId","rememberMe","extractDeviceParams","token","refreshToken","absoluteExpiresAt","generateRefreshToken","type","cookieOptions","buildCookieOptionsWithExpiry","cookies","set","REFRESH_COOKIE_NAME","accessResult","generateAccessToken","accessToken","data","log","registrationInfo","validateRegistrationInfoQuery","registrationToken","findRegistrationInfo","register","input","validateRegistrationInput","registerAdmin","validateAdminRegistrationInput","hasAdmin","exists","superAdminRole","getSuperAdmin","create","isActive","roles","telemetry","send","forgotPassword","validateForgotPasswordInput","status","resetPassword","validateResetPasswordInput","generateDeviceId","invalidateRefreshToken","get","unauthorized","rotation","rotateRefreshToken","result","opts","logout","bodyDeviceId","undefined","getRefreshCookieOptions","expires","Date"],"mappings":"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"}
1
+ {"version":3,"file":"authentication.js","sources":["../../../../../server/src/controllers/authentication.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport passport from 'koa-passport';\nimport compose from 'koa-compose';\nimport '@strapi/types';\nimport { errors } from '@strapi/utils';\nimport { getService } from '../utils';\nimport {\n REFRESH_COOKIE_NAME,\n buildCookieOptionsWithExpiry,\n getSessionManager,\n extractDeviceParams,\n generateDeviceId,\n getRefreshCookieOptions,\n} from '../../../shared/utils/session-auth';\n\nimport {\n validateRegistrationInput,\n validateAdminRegistrationInput,\n validateRegistrationInfoQuery,\n validateForgotPasswordInput,\n validateResetPasswordInput,\n validateLoginSessionInput,\n} from '../validation/authentication';\n\nimport type {\n ForgotPassword,\n Login,\n Register,\n RegistrationInfo,\n ResetPassword,\n} from '../../../shared/contracts/authentication';\nimport { AdminUser } from '../../../shared/contracts/shared';\n\nconst { ApplicationError, ValidationError } = errors;\n\nexport default {\n login: compose([\n async (ctx: Context, next: Next) => {\n await validateLoginSessionInput(ctx.request.body ?? {});\n return next();\n },\n (ctx: Context, next: Next) => {\n return passport.authenticate('local', { session: false }, (err, user, info) => {\n if (err) {\n strapi.eventHub.emit('admin.auth.error', { error: err, provider: 'local' });\n // if this is a recognized error, allow it to bubble up to user\n if (err.details?.code === 'LOGIN_NOT_ALLOWED') {\n throw err;\n }\n\n // for all other errors throw a generic error to prevent leaking info\n return ctx.notImplemented();\n }\n\n if (!user) {\n strapi.eventHub.emit('admin.auth.error', {\n error: new Error(info.message),\n provider: 'local',\n });\n throw new ApplicationError(info.message);\n }\n\n const query = ctx.state as Login.Request['query'];\n query.user = user;\n\n const sanitizedUser = getService('user').sanitizeUser(user);\n strapi.eventHub.emit('admin.auth.success', { user: sanitizedUser, provider: 'local' });\n\n return next();\n })(ctx, next);\n },\n async (ctx: Context) => {\n const { user } = ctx.state as { user: AdminUser };\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n const userId = String(user.id);\n const { deviceId, rememberMe } = extractDeviceParams(ctx.request.body);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, {\n type: rememberMe ? 'refresh' : 'session',\n });\n\n const cookieOptions = buildCookieOptionsWithExpiry(\n rememberMe ? 'refresh' : 'session',\n absoluteExpiresAt,\n ctx.request.secure\n );\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token: accessToken } = accessResult;\n\n ctx.body = {\n data: {\n token: accessToken,\n accessToken,\n user: getService('user').sanitizeUser(ctx.state.user),\n },\n } satisfies Login.Response;\n } catch (error) {\n strapi.log.error('Failed to create admin refresh session', error);\n return ctx.internalServerError();\n }\n },\n ]),\n\n async registrationInfo(ctx: Context) {\n await validateRegistrationInfoQuery(ctx.request.query);\n\n const { registrationToken } = ctx.request.query as RegistrationInfo.Request['query'];\n\n const registrationInfo = await getService('user').findRegistrationInfo(registrationToken);\n\n if (!registrationInfo) {\n throw new ValidationError('Invalid registrationToken');\n }\n\n ctx.body = { data: registrationInfo } satisfies RegistrationInfo.Response;\n },\n\n async register(ctx: Context) {\n const input = ctx.request.body as Register.Request['body'];\n\n await validateRegistrationInput(input);\n\n const user = await getService('user').register(input);\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n const userId = String(user.id);\n const { deviceId, rememberMe } = extractDeviceParams(ctx.request.body);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, { type: rememberMe ? 'refresh' : 'session' });\n\n const cookieOptions = buildCookieOptionsWithExpiry(\n rememberMe ? 'refresh' : 'session',\n absoluteExpiresAt,\n ctx.request.secure\n );\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token: accessToken } = accessResult;\n\n ctx.body = {\n data: {\n token: accessToken,\n accessToken,\n user: getService('user').sanitizeUser(user),\n },\n } satisfies Register.Response;\n } catch (error) {\n strapi.log.error('Failed to create admin refresh session during register', error);\n return ctx.internalServerError();\n }\n },\n\n async registerAdmin(ctx: Context) {\n const input = ctx.request.body as Register.Request['body'];\n\n await validateAdminRegistrationInput(input);\n\n const hasAdmin = await getService('user').exists();\n\n if (hasAdmin) {\n throw new ApplicationError('You cannot register a new super admin');\n }\n\n const superAdminRole = await getService('role').getSuperAdmin();\n\n if (!superAdminRole) {\n throw new ApplicationError(\n \"Cannot register the first admin because the super admin role doesn't exist.\"\n );\n }\n\n const user = await getService('user').create({\n ...input,\n registrationToken: null,\n isActive: true,\n roles: superAdminRole ? [superAdminRole.id] : [],\n });\n\n strapi.telemetry.send('didCreateFirstAdmin');\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n const userId = String(user.id);\n const { deviceId, rememberMe } = extractDeviceParams(ctx.request.body);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, { type: rememberMe ? 'refresh' : 'session' });\n\n const cookieOptions = buildCookieOptionsWithExpiry(\n rememberMe ? 'refresh' : 'session',\n absoluteExpiresAt,\n ctx.request.secure\n );\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token: accessToken } = accessResult;\n\n ctx.body = {\n data: {\n token: accessToken,\n accessToken,\n user: getService('user').sanitizeUser(user),\n },\n };\n } catch (error) {\n strapi.log.error('Failed to create admin refresh session during register-admin', error);\n return ctx.internalServerError();\n }\n },\n\n async forgotPassword(ctx: Context) {\n const input = ctx.request.body as ForgotPassword.Request['body'];\n\n await validateForgotPasswordInput(input);\n\n getService('auth').forgotPassword(input);\n\n ctx.status = 204;\n },\n\n async resetPassword(ctx: Context) {\n const input = ctx.request.body as ResetPassword.Request['body'];\n\n await validateResetPasswordInput(input);\n\n const user = await getService('auth').resetPassword(input);\n\n // Issue a new admin refresh session and access token after password reset.\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n\n const userId = String(user.id);\n const deviceId = generateDeviceId();\n\n // Invalidate all existing sessions before creating a new one\n await sessionManager('admin').invalidateRefreshToken(userId);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, { type: 'session' });\n\n // No rememberMe flow here; expire with session by default (session cookie)\n const cookieOptions = buildCookieOptionsWithExpiry(\n 'session',\n absoluteExpiresAt,\n ctx.request.secure\n );\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token } = accessResult;\n\n ctx.body = {\n data: {\n token,\n user: getService('user').sanitizeUser(user),\n },\n } satisfies ResetPassword.Response;\n } catch (err) {\n strapi.log.error('Failed to create admin refresh session during reset-password', err as any);\n return ctx.internalServerError();\n }\n },\n\n async accessToken(ctx: Context) {\n const refreshToken = ctx.cookies.get(REFRESH_COOKIE_NAME);\n\n if (!refreshToken) {\n return ctx.unauthorized('Missing refresh token');\n }\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n\n // Single-use renewal: rotate on access exchange, then create access token\n // from the new refresh token\n const rotation = await sessionManager('admin').rotateRefreshToken(refreshToken);\n if ('error' in rotation) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const result = await sessionManager('admin').generateAccessToken(rotation.token);\n if ('error' in result) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const { token } = result;\n // Preserve session-vs-remember mode using rotation.type and rotation.absoluteExpiresAt\n const opts = buildCookieOptionsWithExpiry(\n rotation.type,\n rotation.absoluteExpiresAt,\n ctx.request.secure\n );\n\n ctx.cookies.set(REFRESH_COOKIE_NAME, rotation.token, opts);\n ctx.body = { data: { token } };\n } catch (err) {\n strapi.log.error('Failed to generate access token from refresh token', err as any);\n return ctx.internalServerError();\n }\n },\n\n async logout(ctx: Context) {\n const sanitizedUser = getService('user').sanitizeUser(ctx.state.user);\n strapi.eventHub.emit('admin.logout', { user: sanitizedUser });\n\n const bodyDeviceId = ctx.request.body?.deviceId as string | undefined;\n const deviceId = typeof bodyDeviceId === 'string' ? bodyDeviceId : undefined;\n\n // Clear cookie regardless of token validity\n ctx.cookies.set(REFRESH_COOKIE_NAME, '', {\n ...getRefreshCookieOptions(ctx.request.secure),\n expires: new Date(0),\n });\n\n try {\n const sessionManager = getSessionManager();\n if (sessionManager) {\n const userId = String(ctx.state.user.id);\n await sessionManager('admin').invalidateRefreshToken(userId, deviceId);\n }\n } catch (err) {\n strapi.log.error('Failed to revoke admin sessions during logout', err as any);\n }\n\n ctx.body = { data: {} };\n },\n};\n"],"names":["ApplicationError","ValidationError","errors","login","compose","ctx","next","validateLoginSessionInput","request","body","passport","authenticate","session","err","user","info","strapi","eventHub","emit","error","provider","details","code","notImplemented","Error","message","query","state","sanitizedUser","getService","sanitizeUser","sessionManager","getSessionManager","internalServerError","userId","String","id","deviceId","rememberMe","extractDeviceParams","token","refreshToken","absoluteExpiresAt","generateRefreshToken","type","cookieOptions","buildCookieOptionsWithExpiry","secure","cookies","set","REFRESH_COOKIE_NAME","accessResult","generateAccessToken","accessToken","data","log","registrationInfo","validateRegistrationInfoQuery","registrationToken","findRegistrationInfo","register","input","validateRegistrationInput","registerAdmin","validateAdminRegistrationInput","hasAdmin","exists","superAdminRole","getSuperAdmin","create","isActive","roles","telemetry","send","forgotPassword","validateForgotPasswordInput","status","resetPassword","validateResetPasswordInput","generateDeviceId","invalidateRefreshToken","get","unauthorized","rotation","rotateRefreshToken","result","opts","logout","bodyDeviceId","undefined","getRefreshCookieOptions","expires","Date"],"mappings":"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"}
@@ -61,7 +61,7 @@ var authentication = {
61
61
  const { token: refreshToken, absoluteExpiresAt } = await sessionManager('admin').generateRefreshToken(userId, deviceId, {
62
62
  type: rememberMe ? 'refresh' : 'session'
63
63
  });
64
- const cookieOptions = buildCookieOptionsWithExpiry(rememberMe ? 'refresh' : 'session', absoluteExpiresAt);
64
+ const cookieOptions = buildCookieOptionsWithExpiry(rememberMe ? 'refresh' : 'session', absoluteExpiresAt, ctx.request.secure);
65
65
  ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);
66
66
  const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);
67
67
  if ('error' in accessResult) {
@@ -106,7 +106,7 @@ var authentication = {
106
106
  const { token: refreshToken, absoluteExpiresAt } = await sessionManager('admin').generateRefreshToken(userId, deviceId, {
107
107
  type: rememberMe ? 'refresh' : 'session'
108
108
  });
109
- const cookieOptions = buildCookieOptionsWithExpiry(rememberMe ? 'refresh' : 'session', absoluteExpiresAt);
109
+ const cookieOptions = buildCookieOptionsWithExpiry(rememberMe ? 'refresh' : 'session', absoluteExpiresAt, ctx.request.secure);
110
110
  ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);
111
111
  const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);
112
112
  if ('error' in accessResult) {
@@ -155,7 +155,7 @@ var authentication = {
155
155
  const { token: refreshToken, absoluteExpiresAt } = await sessionManager('admin').generateRefreshToken(userId, deviceId, {
156
156
  type: rememberMe ? 'refresh' : 'session'
157
157
  });
158
- const cookieOptions = buildCookieOptionsWithExpiry(rememberMe ? 'refresh' : 'session', absoluteExpiresAt);
158
+ const cookieOptions = buildCookieOptionsWithExpiry(rememberMe ? 'refresh' : 'session', absoluteExpiresAt, ctx.request.secure);
159
159
  ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);
160
160
  const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);
161
161
  if ('error' in accessResult) {
@@ -198,7 +198,7 @@ var authentication = {
198
198
  type: 'session'
199
199
  });
200
200
  // No rememberMe flow here; expire with session by default (session cookie)
201
- const cookieOptions = buildCookieOptionsWithExpiry('session', absoluteExpiresAt);
201
+ const cookieOptions = buildCookieOptionsWithExpiry('session', absoluteExpiresAt, ctx.request.secure);
202
202
  ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);
203
203
  const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);
204
204
  if ('error' in accessResult) {
@@ -238,7 +238,7 @@ var authentication = {
238
238
  }
239
239
  const { token } = result;
240
240
  // Preserve session-vs-remember mode using rotation.type and rotation.absoluteExpiresAt
241
- const opts = buildCookieOptionsWithExpiry(rotation.type, rotation.absoluteExpiresAt);
241
+ const opts = buildCookieOptionsWithExpiry(rotation.type, rotation.absoluteExpiresAt, ctx.request.secure);
242
242
  ctx.cookies.set(REFRESH_COOKIE_NAME, rotation.token, opts);
243
243
  ctx.body = {
244
244
  data: {
@@ -259,7 +259,7 @@ var authentication = {
259
259
  const deviceId = typeof bodyDeviceId === 'string' ? bodyDeviceId : undefined;
260
260
  // Clear cookie regardless of token validity
261
261
  ctx.cookies.set(REFRESH_COOKIE_NAME, '', {
262
- ...getRefreshCookieOptions(),
262
+ ...getRefreshCookieOptions(ctx.request.secure),
263
263
  expires: new Date(0)
264
264
  });
265
265
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"authentication.mjs","sources":["../../../../../server/src/controllers/authentication.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport passport from 'koa-passport';\nimport compose from 'koa-compose';\nimport '@strapi/types';\nimport { errors } from '@strapi/utils';\nimport { getService } from '../utils';\nimport {\n REFRESH_COOKIE_NAME,\n buildCookieOptionsWithExpiry,\n getSessionManager,\n extractDeviceParams,\n generateDeviceId,\n getRefreshCookieOptions,\n} from '../../../shared/utils/session-auth';\n\nimport {\n validateRegistrationInput,\n validateAdminRegistrationInput,\n validateRegistrationInfoQuery,\n validateForgotPasswordInput,\n validateResetPasswordInput,\n validateLoginSessionInput,\n} from '../validation/authentication';\n\nimport type {\n ForgotPassword,\n Login,\n Register,\n RegistrationInfo,\n ResetPassword,\n} from '../../../shared/contracts/authentication';\nimport { AdminUser } from '../../../shared/contracts/shared';\n\nconst { ApplicationError, ValidationError } = errors;\n\nexport default {\n login: compose([\n async (ctx: Context, next: Next) => {\n await validateLoginSessionInput(ctx.request.body ?? {});\n return next();\n },\n (ctx: Context, next: Next) => {\n return passport.authenticate('local', { session: false }, (err, user, info) => {\n if (err) {\n strapi.eventHub.emit('admin.auth.error', { error: err, provider: 'local' });\n // if this is a recognized error, allow it to bubble up to user\n if (err.details?.code === 'LOGIN_NOT_ALLOWED') {\n throw err;\n }\n\n // for all other errors throw a generic error to prevent leaking info\n return ctx.notImplemented();\n }\n\n if (!user) {\n strapi.eventHub.emit('admin.auth.error', {\n error: new Error(info.message),\n provider: 'local',\n });\n throw new ApplicationError(info.message);\n }\n\n const query = ctx.state as Login.Request['query'];\n query.user = user;\n\n const sanitizedUser = getService('user').sanitizeUser(user);\n strapi.eventHub.emit('admin.auth.success', { user: sanitizedUser, provider: 'local' });\n\n return next();\n })(ctx, next);\n },\n async (ctx: Context) => {\n const { user } = ctx.state as { user: AdminUser };\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n const userId = String(user.id);\n const { deviceId, rememberMe } = extractDeviceParams(ctx.request.body);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, {\n type: rememberMe ? 'refresh' : 'session',\n });\n\n const cookieOptions = buildCookieOptionsWithExpiry(\n rememberMe ? 'refresh' : 'session',\n absoluteExpiresAt\n );\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token: accessToken } = accessResult;\n\n ctx.body = {\n data: {\n token: accessToken,\n accessToken,\n user: getService('user').sanitizeUser(ctx.state.user),\n },\n } satisfies Login.Response;\n } catch (error) {\n strapi.log.error('Failed to create admin refresh session', error);\n return ctx.internalServerError();\n }\n },\n ]),\n\n async registrationInfo(ctx: Context) {\n await validateRegistrationInfoQuery(ctx.request.query);\n\n const { registrationToken } = ctx.request.query as RegistrationInfo.Request['query'];\n\n const registrationInfo = await getService('user').findRegistrationInfo(registrationToken);\n\n if (!registrationInfo) {\n throw new ValidationError('Invalid registrationToken');\n }\n\n ctx.body = { data: registrationInfo } satisfies RegistrationInfo.Response;\n },\n\n async register(ctx: Context) {\n const input = ctx.request.body as Register.Request['body'];\n\n await validateRegistrationInput(input);\n\n const user = await getService('user').register(input);\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n const userId = String(user.id);\n const { deviceId, rememberMe } = extractDeviceParams(ctx.request.body);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, { type: rememberMe ? 'refresh' : 'session' });\n\n const cookieOptions = buildCookieOptionsWithExpiry(\n rememberMe ? 'refresh' : 'session',\n absoluteExpiresAt\n );\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token: accessToken } = accessResult;\n\n ctx.body = {\n data: {\n token: accessToken,\n accessToken,\n user: getService('user').sanitizeUser(user),\n },\n } satisfies Register.Response;\n } catch (error) {\n strapi.log.error('Failed to create admin refresh session during register', error);\n return ctx.internalServerError();\n }\n },\n\n async registerAdmin(ctx: Context) {\n const input = ctx.request.body as Register.Request['body'];\n\n await validateAdminRegistrationInput(input);\n\n const hasAdmin = await getService('user').exists();\n\n if (hasAdmin) {\n throw new ApplicationError('You cannot register a new super admin');\n }\n\n const superAdminRole = await getService('role').getSuperAdmin();\n\n if (!superAdminRole) {\n throw new ApplicationError(\n \"Cannot register the first admin because the super admin role doesn't exist.\"\n );\n }\n\n const user = await getService('user').create({\n ...input,\n registrationToken: null,\n isActive: true,\n roles: superAdminRole ? [superAdminRole.id] : [],\n });\n\n strapi.telemetry.send('didCreateFirstAdmin');\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n const userId = String(user.id);\n const { deviceId, rememberMe } = extractDeviceParams(ctx.request.body);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, { type: rememberMe ? 'refresh' : 'session' });\n\n const cookieOptions = buildCookieOptionsWithExpiry(\n rememberMe ? 'refresh' : 'session',\n absoluteExpiresAt\n );\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token: accessToken } = accessResult;\n\n ctx.body = {\n data: {\n token: accessToken,\n accessToken,\n user: getService('user').sanitizeUser(user),\n },\n };\n } catch (error) {\n strapi.log.error('Failed to create admin refresh session during register-admin', error);\n return ctx.internalServerError();\n }\n },\n\n async forgotPassword(ctx: Context) {\n const input = ctx.request.body as ForgotPassword.Request['body'];\n\n await validateForgotPasswordInput(input);\n\n getService('auth').forgotPassword(input);\n\n ctx.status = 204;\n },\n\n async resetPassword(ctx: Context) {\n const input = ctx.request.body as ResetPassword.Request['body'];\n\n await validateResetPasswordInput(input);\n\n const user = await getService('auth').resetPassword(input);\n\n // Issue a new admin refresh session and access token after password reset.\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n\n const userId = String(user.id);\n const deviceId = generateDeviceId();\n\n // Invalidate all existing sessions before creating a new one\n await sessionManager('admin').invalidateRefreshToken(userId);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, { type: 'session' });\n\n // No rememberMe flow here; expire with session by default (session cookie)\n const cookieOptions = buildCookieOptionsWithExpiry('session', absoluteExpiresAt);\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token } = accessResult;\n\n ctx.body = {\n data: {\n token,\n user: getService('user').sanitizeUser(user),\n },\n } satisfies ResetPassword.Response;\n } catch (err) {\n strapi.log.error('Failed to create admin refresh session during reset-password', err as any);\n return ctx.internalServerError();\n }\n },\n\n async accessToken(ctx: Context) {\n const refreshToken = ctx.cookies.get(REFRESH_COOKIE_NAME);\n\n if (!refreshToken) {\n return ctx.unauthorized('Missing refresh token');\n }\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n\n // Single-use renewal: rotate on access exchange, then create access token\n // from the new refresh token\n const rotation = await sessionManager('admin').rotateRefreshToken(refreshToken);\n if ('error' in rotation) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const result = await sessionManager('admin').generateAccessToken(rotation.token);\n if ('error' in result) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const { token } = result;\n // Preserve session-vs-remember mode using rotation.type and rotation.absoluteExpiresAt\n const opts = buildCookieOptionsWithExpiry(rotation.type, rotation.absoluteExpiresAt);\n\n ctx.cookies.set(REFRESH_COOKIE_NAME, rotation.token, opts);\n ctx.body = { data: { token } };\n } catch (err) {\n strapi.log.error('Failed to generate access token from refresh token', err as any);\n return ctx.internalServerError();\n }\n },\n\n async logout(ctx: Context) {\n const sanitizedUser = getService('user').sanitizeUser(ctx.state.user);\n strapi.eventHub.emit('admin.logout', { user: sanitizedUser });\n\n const bodyDeviceId = ctx.request.body?.deviceId as string | undefined;\n const deviceId = typeof bodyDeviceId === 'string' ? bodyDeviceId : undefined;\n\n // Clear cookie regardless of token validity\n ctx.cookies.set(REFRESH_COOKIE_NAME, '', {\n ...getRefreshCookieOptions(),\n expires: new Date(0),\n });\n\n try {\n const sessionManager = getSessionManager();\n if (sessionManager) {\n const userId = String(ctx.state.user.id);\n await sessionManager('admin').invalidateRefreshToken(userId, deviceId);\n }\n } catch (err) {\n strapi.log.error('Failed to revoke admin sessions during logout', err as any);\n }\n\n ctx.body = { data: {} };\n },\n};\n"],"names":["ApplicationError","ValidationError","errors","login","compose","ctx","next","validateLoginSessionInput","request","body","passport","authenticate","session","err","user","info","strapi","eventHub","emit","error","provider","details","code","notImplemented","Error","message","query","state","sanitizedUser","getService","sanitizeUser","sessionManager","getSessionManager","internalServerError","userId","String","id","deviceId","rememberMe","extractDeviceParams","token","refreshToken","absoluteExpiresAt","generateRefreshToken","type","cookieOptions","buildCookieOptionsWithExpiry","cookies","set","REFRESH_COOKIE_NAME","accessResult","generateAccessToken","accessToken","data","log","registrationInfo","validateRegistrationInfoQuery","registrationToken","findRegistrationInfo","register","input","validateRegistrationInput","registerAdmin","validateAdminRegistrationInput","hasAdmin","exists","superAdminRole","getSuperAdmin","create","isActive","roles","telemetry","send","forgotPassword","validateForgotPasswordInput","status","resetPassword","validateResetPasswordInput","generateDeviceId","invalidateRefreshToken","get","unauthorized","rotation","rotateRefreshToken","result","opts","logout","bodyDeviceId","undefined","getRefreshCookieOptions","expires","Date"],"mappings":"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"}
1
+ {"version":3,"file":"authentication.mjs","sources":["../../../../../server/src/controllers/authentication.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport passport from 'koa-passport';\nimport compose from 'koa-compose';\nimport '@strapi/types';\nimport { errors } from '@strapi/utils';\nimport { getService } from '../utils';\nimport {\n REFRESH_COOKIE_NAME,\n buildCookieOptionsWithExpiry,\n getSessionManager,\n extractDeviceParams,\n generateDeviceId,\n getRefreshCookieOptions,\n} from '../../../shared/utils/session-auth';\n\nimport {\n validateRegistrationInput,\n validateAdminRegistrationInput,\n validateRegistrationInfoQuery,\n validateForgotPasswordInput,\n validateResetPasswordInput,\n validateLoginSessionInput,\n} from '../validation/authentication';\n\nimport type {\n ForgotPassword,\n Login,\n Register,\n RegistrationInfo,\n ResetPassword,\n} from '../../../shared/contracts/authentication';\nimport { AdminUser } from '../../../shared/contracts/shared';\n\nconst { ApplicationError, ValidationError } = errors;\n\nexport default {\n login: compose([\n async (ctx: Context, next: Next) => {\n await validateLoginSessionInput(ctx.request.body ?? {});\n return next();\n },\n (ctx: Context, next: Next) => {\n return passport.authenticate('local', { session: false }, (err, user, info) => {\n if (err) {\n strapi.eventHub.emit('admin.auth.error', { error: err, provider: 'local' });\n // if this is a recognized error, allow it to bubble up to user\n if (err.details?.code === 'LOGIN_NOT_ALLOWED') {\n throw err;\n }\n\n // for all other errors throw a generic error to prevent leaking info\n return ctx.notImplemented();\n }\n\n if (!user) {\n strapi.eventHub.emit('admin.auth.error', {\n error: new Error(info.message),\n provider: 'local',\n });\n throw new ApplicationError(info.message);\n }\n\n const query = ctx.state as Login.Request['query'];\n query.user = user;\n\n const sanitizedUser = getService('user').sanitizeUser(user);\n strapi.eventHub.emit('admin.auth.success', { user: sanitizedUser, provider: 'local' });\n\n return next();\n })(ctx, next);\n },\n async (ctx: Context) => {\n const { user } = ctx.state as { user: AdminUser };\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n const userId = String(user.id);\n const { deviceId, rememberMe } = extractDeviceParams(ctx.request.body);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, {\n type: rememberMe ? 'refresh' : 'session',\n });\n\n const cookieOptions = buildCookieOptionsWithExpiry(\n rememberMe ? 'refresh' : 'session',\n absoluteExpiresAt,\n ctx.request.secure\n );\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token: accessToken } = accessResult;\n\n ctx.body = {\n data: {\n token: accessToken,\n accessToken,\n user: getService('user').sanitizeUser(ctx.state.user),\n },\n } satisfies Login.Response;\n } catch (error) {\n strapi.log.error('Failed to create admin refresh session', error);\n return ctx.internalServerError();\n }\n },\n ]),\n\n async registrationInfo(ctx: Context) {\n await validateRegistrationInfoQuery(ctx.request.query);\n\n const { registrationToken } = ctx.request.query as RegistrationInfo.Request['query'];\n\n const registrationInfo = await getService('user').findRegistrationInfo(registrationToken);\n\n if (!registrationInfo) {\n throw new ValidationError('Invalid registrationToken');\n }\n\n ctx.body = { data: registrationInfo } satisfies RegistrationInfo.Response;\n },\n\n async register(ctx: Context) {\n const input = ctx.request.body as Register.Request['body'];\n\n await validateRegistrationInput(input);\n\n const user = await getService('user').register(input);\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n const userId = String(user.id);\n const { deviceId, rememberMe } = extractDeviceParams(ctx.request.body);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, { type: rememberMe ? 'refresh' : 'session' });\n\n const cookieOptions = buildCookieOptionsWithExpiry(\n rememberMe ? 'refresh' : 'session',\n absoluteExpiresAt,\n ctx.request.secure\n );\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token: accessToken } = accessResult;\n\n ctx.body = {\n data: {\n token: accessToken,\n accessToken,\n user: getService('user').sanitizeUser(user),\n },\n } satisfies Register.Response;\n } catch (error) {\n strapi.log.error('Failed to create admin refresh session during register', error);\n return ctx.internalServerError();\n }\n },\n\n async registerAdmin(ctx: Context) {\n const input = ctx.request.body as Register.Request['body'];\n\n await validateAdminRegistrationInput(input);\n\n const hasAdmin = await getService('user').exists();\n\n if (hasAdmin) {\n throw new ApplicationError('You cannot register a new super admin');\n }\n\n const superAdminRole = await getService('role').getSuperAdmin();\n\n if (!superAdminRole) {\n throw new ApplicationError(\n \"Cannot register the first admin because the super admin role doesn't exist.\"\n );\n }\n\n const user = await getService('user').create({\n ...input,\n registrationToken: null,\n isActive: true,\n roles: superAdminRole ? [superAdminRole.id] : [],\n });\n\n strapi.telemetry.send('didCreateFirstAdmin');\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n const userId = String(user.id);\n const { deviceId, rememberMe } = extractDeviceParams(ctx.request.body);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, { type: rememberMe ? 'refresh' : 'session' });\n\n const cookieOptions = buildCookieOptionsWithExpiry(\n rememberMe ? 'refresh' : 'session',\n absoluteExpiresAt,\n ctx.request.secure\n );\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token: accessToken } = accessResult;\n\n ctx.body = {\n data: {\n token: accessToken,\n accessToken,\n user: getService('user').sanitizeUser(user),\n },\n };\n } catch (error) {\n strapi.log.error('Failed to create admin refresh session during register-admin', error);\n return ctx.internalServerError();\n }\n },\n\n async forgotPassword(ctx: Context) {\n const input = ctx.request.body as ForgotPassword.Request['body'];\n\n await validateForgotPasswordInput(input);\n\n getService('auth').forgotPassword(input);\n\n ctx.status = 204;\n },\n\n async resetPassword(ctx: Context) {\n const input = ctx.request.body as ResetPassword.Request['body'];\n\n await validateResetPasswordInput(input);\n\n const user = await getService('auth').resetPassword(input);\n\n // Issue a new admin refresh session and access token after password reset.\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n\n const userId = String(user.id);\n const deviceId = generateDeviceId();\n\n // Invalidate all existing sessions before creating a new one\n await sessionManager('admin').invalidateRefreshToken(userId);\n\n const { token: refreshToken, absoluteExpiresAt } = await sessionManager(\n 'admin'\n ).generateRefreshToken(userId, deviceId, { type: 'session' });\n\n // No rememberMe flow here; expire with session by default (session cookie)\n const cookieOptions = buildCookieOptionsWithExpiry(\n 'session',\n absoluteExpiresAt,\n ctx.request.secure\n );\n ctx.cookies.set(REFRESH_COOKIE_NAME, refreshToken, cookieOptions);\n\n const accessResult = await sessionManager('admin').generateAccessToken(refreshToken);\n if ('error' in accessResult) {\n return ctx.internalServerError();\n }\n\n const { token } = accessResult;\n\n ctx.body = {\n data: {\n token,\n user: getService('user').sanitizeUser(user),\n },\n } satisfies ResetPassword.Response;\n } catch (err) {\n strapi.log.error('Failed to create admin refresh session during reset-password', err as any);\n return ctx.internalServerError();\n }\n },\n\n async accessToken(ctx: Context) {\n const refreshToken = ctx.cookies.get(REFRESH_COOKIE_NAME);\n\n if (!refreshToken) {\n return ctx.unauthorized('Missing refresh token');\n }\n\n try {\n const sessionManager = getSessionManager();\n if (!sessionManager) {\n return ctx.internalServerError();\n }\n\n // Single-use renewal: rotate on access exchange, then create access token\n // from the new refresh token\n const rotation = await sessionManager('admin').rotateRefreshToken(refreshToken);\n if ('error' in rotation) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const result = await sessionManager('admin').generateAccessToken(rotation.token);\n if ('error' in result) {\n return ctx.unauthorized('Invalid refresh token');\n }\n\n const { token } = result;\n // Preserve session-vs-remember mode using rotation.type and rotation.absoluteExpiresAt\n const opts = buildCookieOptionsWithExpiry(\n rotation.type,\n rotation.absoluteExpiresAt,\n ctx.request.secure\n );\n\n ctx.cookies.set(REFRESH_COOKIE_NAME, rotation.token, opts);\n ctx.body = { data: { token } };\n } catch (err) {\n strapi.log.error('Failed to generate access token from refresh token', err as any);\n return ctx.internalServerError();\n }\n },\n\n async logout(ctx: Context) {\n const sanitizedUser = getService('user').sanitizeUser(ctx.state.user);\n strapi.eventHub.emit('admin.logout', { user: sanitizedUser });\n\n const bodyDeviceId = ctx.request.body?.deviceId as string | undefined;\n const deviceId = typeof bodyDeviceId === 'string' ? bodyDeviceId : undefined;\n\n // Clear cookie regardless of token validity\n ctx.cookies.set(REFRESH_COOKIE_NAME, '', {\n ...getRefreshCookieOptions(ctx.request.secure),\n expires: new Date(0),\n });\n\n try {\n const sessionManager = getSessionManager();\n if (sessionManager) {\n const userId = String(ctx.state.user.id);\n await sessionManager('admin').invalidateRefreshToken(userId, deviceId);\n }\n } catch (err) {\n strapi.log.error('Failed to revoke admin sessions during logout', err as any);\n }\n\n ctx.body = { data: {} };\n },\n};\n"],"names":["ApplicationError","ValidationError","errors","login","compose","ctx","next","validateLoginSessionInput","request","body","passport","authenticate","session","err","user","info","strapi","eventHub","emit","error","provider","details","code","notImplemented","Error","message","query","state","sanitizedUser","getService","sanitizeUser","sessionManager","getSessionManager","internalServerError","userId","String","id","deviceId","rememberMe","extractDeviceParams","token","refreshToken","absoluteExpiresAt","generateRefreshToken","type","cookieOptions","buildCookieOptionsWithExpiry","secure","cookies","set","REFRESH_COOKIE_NAME","accessResult","generateAccessToken","accessToken","data","log","registrationInfo","validateRegistrationInfoQuery","registrationToken","findRegistrationInfo","register","input","validateRegistrationInput","registerAdmin","validateAdminRegistrationInput","hasAdmin","exists","superAdminRole","getSuperAdmin","create","isActive","roles","telemetry","send","forgotPassword","validateForgotPasswordInput","status","resetPassword","validateResetPasswordInput","generateDeviceId","invalidateRefreshToken","get","unauthorized","rotation","rotateRefreshToken","result","opts","logout","bodyDeviceId","undefined","getRefreshCookieOptions","expires","Date"],"mappings":"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"}
@@ -9,7 +9,8 @@ var register = (({ strapi })=>{
9
9
  strapi.server.api('admin').use(passportMiddleware);
10
10
  strapi.get('auth').register('admin', admin.default);
11
11
  strapi.get('auth').register('content-api', apiToken.default);
12
- if (strapi.config.get('admin.serveAdminPanel')) {
12
+ const shouldServeAdminPanel = strapi.config.get('admin.serveAdminPanel');
13
+ if (shouldServeAdminPanel) {
13
14
  serveAdminPanel({
14
15
  strapi
15
16
  });
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sources":["../../../../server/src/register.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport registerAdminPanelRoute from './routes/serve-admin-panel';\nimport adminAuthStrategy from './strategies/admin';\nimport apiTokenAuthStrategy from './strategies/api-token';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const passportMiddleware = strapi.service('admin::passport').init();\n\n strapi.server.api('admin').use(passportMiddleware);\n strapi.get('auth').register('admin', adminAuthStrategy);\n strapi.get('auth').register('content-api', apiTokenAuthStrategy);\n\n if (strapi.config.get('admin.serveAdminPanel')) {\n registerAdminPanelRoute({ strapi });\n }\n};\n"],"names":["strapi","passportMiddleware","service","init","server","api","use","get","register","adminAuthStrategy","apiTokenAuthStrategy","config","registerAdminPanelRoute"],"mappings":";;;;;;AAKA,eAAe,CAAA,CAAC,EAAEA,MAAM,EAA2B,GAAA;AACjD,IAAA,MAAMC,kBAAqBD,GAAAA,MAAAA,CAAOE,OAAO,CAAC,mBAAmBC,IAAI,EAAA;AAEjEH,IAAAA,MAAAA,CAAOI,MAAM,CAACC,GAAG,CAAC,OAAA,CAAA,CAASC,GAAG,CAACL,kBAAAA,CAAAA;AAC/BD,IAAAA,MAAAA,CAAOO,GAAG,CAAC,MAAQC,CAAAA,CAAAA,QAAQ,CAAC,OAASC,EAAAA,aAAAA,CAAAA;AACrCT,IAAAA,MAAAA,CAAOO,GAAG,CAAC,MAAQC,CAAAA,CAAAA,QAAQ,CAAC,aAAeE,EAAAA,gBAAAA,CAAAA;AAE3C,IAAA,IAAIV,MAAOW,CAAAA,MAAM,CAACJ,GAAG,CAAC,uBAA0B,CAAA,EAAA;QAC9CK,eAAwB,CAAA;AAAEZ,YAAAA;AAAO,SAAA,CAAA;AACnC;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"register.js","sources":["../../../../server/src/register.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport registerAdminPanelRoute from './routes/serve-admin-panel';\nimport adminAuthStrategy from './strategies/admin';\nimport apiTokenAuthStrategy from './strategies/api-token';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const passportMiddleware = strapi.service('admin::passport').init();\n\n strapi.server.api('admin').use(passportMiddleware);\n strapi.get('auth').register('admin', adminAuthStrategy);\n strapi.get('auth').register('content-api', apiTokenAuthStrategy);\n\n const shouldServeAdminPanel = strapi.config.get('admin.serveAdminPanel');\n\n if (shouldServeAdminPanel) {\n registerAdminPanelRoute({ strapi });\n }\n};\n"],"names":["strapi","passportMiddleware","service","init","server","api","use","get","register","adminAuthStrategy","apiTokenAuthStrategy","shouldServeAdminPanel","config","registerAdminPanelRoute"],"mappings":";;;;;;AAKA,eAAe,CAAA,CAAC,EAAEA,MAAM,EAA2B,GAAA;AACjD,IAAA,MAAMC,kBAAqBD,GAAAA,MAAAA,CAAOE,OAAO,CAAC,mBAAmBC,IAAI,EAAA;AAEjEH,IAAAA,MAAAA,CAAOI,MAAM,CAACC,GAAG,CAAC,OAAA,CAAA,CAASC,GAAG,CAACL,kBAAAA,CAAAA;AAC/BD,IAAAA,MAAAA,CAAOO,GAAG,CAAC,MAAQC,CAAAA,CAAAA,QAAQ,CAAC,OAASC,EAAAA,aAAAA,CAAAA;AACrCT,IAAAA,MAAAA,CAAOO,GAAG,CAAC,MAAQC,CAAAA,CAAAA,QAAQ,CAAC,aAAeE,EAAAA,gBAAAA,CAAAA;AAE3C,IAAA,MAAMC,qBAAwBX,GAAAA,MAAAA,CAAOY,MAAM,CAACL,GAAG,CAAC,uBAAA,CAAA;AAEhD,IAAA,IAAII,qBAAuB,EAAA;QACzBE,eAAwB,CAAA;AAAEb,YAAAA;AAAO,SAAA,CAAA;AACnC;AACF,CAAA;;;;"}
@@ -7,7 +7,8 @@ var register = (({ strapi })=>{
7
7
  strapi.server.api('admin').use(passportMiddleware);
8
8
  strapi.get('auth').register('admin', adminAuthStrategy);
9
9
  strapi.get('auth').register('content-api', apiTokenAuthStrategy);
10
- if (strapi.config.get('admin.serveAdminPanel')) {
10
+ const shouldServeAdminPanel = strapi.config.get('admin.serveAdminPanel');
11
+ if (shouldServeAdminPanel) {
11
12
  registerAdminPanelRoute({
12
13
  strapi
13
14
  });
@@ -1 +1 @@
1
- {"version":3,"file":"register.mjs","sources":["../../../../server/src/register.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport registerAdminPanelRoute from './routes/serve-admin-panel';\nimport adminAuthStrategy from './strategies/admin';\nimport apiTokenAuthStrategy from './strategies/api-token';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const passportMiddleware = strapi.service('admin::passport').init();\n\n strapi.server.api('admin').use(passportMiddleware);\n strapi.get('auth').register('admin', adminAuthStrategy);\n strapi.get('auth').register('content-api', apiTokenAuthStrategy);\n\n if (strapi.config.get('admin.serveAdminPanel')) {\n registerAdminPanelRoute({ strapi });\n }\n};\n"],"names":["strapi","passportMiddleware","service","init","server","api","use","get","register","adminAuthStrategy","apiTokenAuthStrategy","config","registerAdminPanelRoute"],"mappings":";;;;AAKA,eAAe,CAAA,CAAC,EAAEA,MAAM,EAA2B,GAAA;AACjD,IAAA,MAAMC,kBAAqBD,GAAAA,MAAAA,CAAOE,OAAO,CAAC,mBAAmBC,IAAI,EAAA;AAEjEH,IAAAA,MAAAA,CAAOI,MAAM,CAACC,GAAG,CAAC,OAAA,CAAA,CAASC,GAAG,CAACL,kBAAAA,CAAAA;AAC/BD,IAAAA,MAAAA,CAAOO,GAAG,CAAC,MAAQC,CAAAA,CAAAA,QAAQ,CAAC,OAASC,EAAAA,iBAAAA,CAAAA;AACrCT,IAAAA,MAAAA,CAAOO,GAAG,CAAC,MAAQC,CAAAA,CAAAA,QAAQ,CAAC,aAAeE,EAAAA,oBAAAA,CAAAA;AAE3C,IAAA,IAAIV,MAAOW,CAAAA,MAAM,CAACJ,GAAG,CAAC,uBAA0B,CAAA,EAAA;QAC9CK,uBAAwB,CAAA;AAAEZ,YAAAA;AAAO,SAAA,CAAA;AACnC;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"register.mjs","sources":["../../../../server/src/register.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport registerAdminPanelRoute from './routes/serve-admin-panel';\nimport adminAuthStrategy from './strategies/admin';\nimport apiTokenAuthStrategy from './strategies/api-token';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const passportMiddleware = strapi.service('admin::passport').init();\n\n strapi.server.api('admin').use(passportMiddleware);\n strapi.get('auth').register('admin', adminAuthStrategy);\n strapi.get('auth').register('content-api', apiTokenAuthStrategy);\n\n const shouldServeAdminPanel = strapi.config.get('admin.serveAdminPanel');\n\n if (shouldServeAdminPanel) {\n registerAdminPanelRoute({ strapi });\n }\n};\n"],"names":["strapi","passportMiddleware","service","init","server","api","use","get","register","adminAuthStrategy","apiTokenAuthStrategy","shouldServeAdminPanel","config","registerAdminPanelRoute"],"mappings":";;;;AAKA,eAAe,CAAA,CAAC,EAAEA,MAAM,EAA2B,GAAA;AACjD,IAAA,MAAMC,kBAAqBD,GAAAA,MAAAA,CAAOE,OAAO,CAAC,mBAAmBC,IAAI,EAAA;AAEjEH,IAAAA,MAAAA,CAAOI,MAAM,CAACC,GAAG,CAAC,OAAA,CAAA,CAASC,GAAG,CAACL,kBAAAA,CAAAA;AAC/BD,IAAAA,MAAAA,CAAOO,GAAG,CAAC,MAAQC,CAAAA,CAAAA,QAAQ,CAAC,OAASC,EAAAA,iBAAAA,CAAAA;AACrCT,IAAAA,MAAAA,CAAOO,GAAG,CAAC,MAAQC,CAAAA,CAAAA,QAAQ,CAAC,aAAeE,EAAAA,oBAAAA,CAAAA;AAE3C,IAAA,MAAMC,qBAAwBX,GAAAA,MAAAA,CAAOY,MAAM,CAACL,GAAG,CAAC,uBAAA,CAAA;AAEhD,IAAA,IAAII,qBAAuB,EAAA;QACzBE,uBAAwB,CAAA;AAAEb,YAAAA;AAAO,SAAA,CAAA;AACnC;AACF,CAAA;;;;"}
@@ -7,13 +7,20 @@ const DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN = 30 * 24 * 60 * 60;
7
7
  const DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN = 14 * 24 * 60 * 60;
8
8
  const DEFAULT_MAX_SESSION_LIFESPAN = 1 * 24 * 60 * 60;
9
9
  const DEFAULT_IDLE_SESSION_LIFESPAN = 2 * 60 * 60;
10
- const getRefreshCookieOptions = ()=>{
10
+ const getRefreshCookieOptions = (secureRequest)=>{
11
11
  const configuredSecure = strapi.config.get('admin.auth.cookie.secure');
12
12
  const isProduction = process.env.NODE_ENV === 'production';
13
13
  const domain = strapi.config.get('admin.auth.cookie.domain') || strapi.config.get('admin.auth.domain');
14
14
  const path = strapi.config.get('admin.auth.cookie.path', '/admin');
15
15
  const sameSite = strapi.config.get('admin.auth.cookie.sameSite') ?? 'lax';
16
- const isSecure = typeof configuredSecure === 'boolean' ? configuredSecure : isProduction;
16
+ let isSecure;
17
+ if (typeof configuredSecure === 'boolean') {
18
+ isSecure = configuredSecure;
19
+ } else if (secureRequest !== undefined) {
20
+ isSecure = isProduction && secureRequest;
21
+ } else {
22
+ isSecure = isProduction;
23
+ }
17
24
  return {
18
25
  httpOnly: true,
19
26
  secure: isSecure,
@@ -34,8 +41,8 @@ const getLifespansForType = (type)=>{
34
41
  };
35
42
  }
36
43
  };
37
- const buildCookieOptionsWithExpiry = (type, absoluteExpiresAtISO)=>{
38
- const base = getRefreshCookieOptions();
44
+ const buildCookieOptionsWithExpiry = (type, absoluteExpiresAtISO, secureRequest)=>{
45
+ const base = getRefreshCookieOptions(secureRequest);
39
46
  if (type === 'session') {
40
47
  return base;
41
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-auth.js","sources":["../../../../shared/utils/session-auth.ts"],"sourcesContent":["import crypto from 'crypto';\nimport type { Modules } from '@strapi/types';\n\nexport const REFRESH_COOKIE_NAME = 'strapi_admin_refresh';\n\nexport const DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN = 30 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN = 14 * 24 * 60 * 60;\nexport const DEFAULT_MAX_SESSION_LIFESPAN = 1 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_SESSION_LIFESPAN = 2 * 60 * 60;\n\nexport const getRefreshCookieOptions = () => {\n const configuredSecure = strapi.config.get('admin.auth.cookie.secure');\n const isProduction = process.env.NODE_ENV === 'production';\n\n const domain: string | undefined =\n strapi.config.get('admin.auth.cookie.domain') || strapi.config.get('admin.auth.domain');\n const path: string = strapi.config.get('admin.auth.cookie.path', '/admin');\n\n const sameSite: boolean | 'lax' | 'strict' | 'none' =\n strapi.config.get('admin.auth.cookie.sameSite') ?? 'lax';\n\n const isSecure = typeof configuredSecure === 'boolean' ? configuredSecure : isProduction;\n\n return {\n httpOnly: true,\n secure: isSecure,\n overwrite: true,\n domain,\n path,\n sameSite,\n maxAge: undefined,\n };\n};\n\nconst getLifespansForType = (\n type: 'refresh' | 'session'\n): { idleSeconds: number; maxSeconds: number } => {\n if (type === 'refresh') {\n const idleSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.idleRefreshTokenLifespan',\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN\n )\n );\n const maxSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.maxRefreshTokenLifespan',\n DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN\n )\n );\n\n return { idleSeconds, maxSeconds };\n }\n\n const idleSeconds = Number(\n strapi.config.get('admin.auth.sessions.idleSessionLifespan', DEFAULT_IDLE_SESSION_LIFESPAN)\n );\n const maxSeconds = Number(\n strapi.config.get('admin.auth.sessions.maxSessionLifespan', DEFAULT_MAX_SESSION_LIFESPAN)\n );\n\n return { idleSeconds, maxSeconds };\n};\n\nexport const buildCookieOptionsWithExpiry = (\n type: 'refresh' | 'session',\n absoluteExpiresAtISO?: string\n) => {\n const base = getRefreshCookieOptions();\n if (type === 'session') {\n return base;\n }\n\n const { idleSeconds } = getLifespansForType('refresh');\n const now = Date.now();\n const idleExpiry = now + idleSeconds * 1000;\n const absoluteExpiry = absoluteExpiresAtISO\n ? new Date(absoluteExpiresAtISO).getTime()\n : idleExpiry;\n const chosen = new Date(Math.min(idleExpiry, absoluteExpiry));\n\n return { ...base, expires: chosen, maxAge: Math.max(0, chosen.getTime() - now) };\n};\n\nexport const getSessionManager = (): Modules.SessionManager.SessionManagerService | null => {\n const manager = strapi.sessionManager as Modules.SessionManager.SessionManagerService | undefined;\n return manager ?? null;\n};\n\nexport const generateDeviceId = (): string => crypto.randomUUID();\n\nexport const extractDeviceParams = (\n requestBody: unknown\n): { deviceId: string; rememberMe: boolean } => {\n const body = (requestBody ?? {}) as { deviceId?: string; rememberMe?: boolean };\n const deviceId = body.deviceId || generateDeviceId();\n const rememberMe = Boolean(body.rememberMe);\n\n return { deviceId, rememberMe };\n};\n"],"names":["REFRESH_COOKIE_NAME","DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN","DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN","DEFAULT_MAX_SESSION_LIFESPAN","DEFAULT_IDLE_SESSION_LIFESPAN","getRefreshCookieOptions","configuredSecure","strapi","config","get","isProduction","process","env","NODE_ENV","domain","path","sameSite","isSecure","httpOnly","secure","overwrite","maxAge","undefined","getLifespansForType","type","idleSeconds","Number","maxSeconds","buildCookieOptionsWithExpiry","absoluteExpiresAtISO","base","now","Date","idleExpiry","absoluteExpiry","getTime","chosen","Math","min","expires","max","getSessionManager","manager","sessionManager","generateDeviceId","crypto","randomUUID","extractDeviceParams","requestBody","body","deviceId","rememberMe","Boolean"],"mappings":"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"}
1
+ {"version":3,"file":"session-auth.js","sources":["../../../../shared/utils/session-auth.ts"],"sourcesContent":["import crypto from 'crypto';\nimport type { Modules } from '@strapi/types';\n\nexport const REFRESH_COOKIE_NAME = 'strapi_admin_refresh';\n\nexport const DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN = 30 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN = 14 * 24 * 60 * 60;\nexport const DEFAULT_MAX_SESSION_LIFESPAN = 1 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_SESSION_LIFESPAN = 2 * 60 * 60;\n\nexport const getRefreshCookieOptions = (secureRequest?: boolean) => {\n const configuredSecure = strapi.config.get('admin.auth.cookie.secure');\n const isProduction = process.env.NODE_ENV === 'production';\n\n const domain: string | undefined =\n strapi.config.get('admin.auth.cookie.domain') || strapi.config.get('admin.auth.domain');\n const path: string = strapi.config.get('admin.auth.cookie.path', '/admin');\n\n const sameSite: boolean | 'lax' | 'strict' | 'none' =\n strapi.config.get('admin.auth.cookie.sameSite') ?? 'lax';\n\n let isSecure: boolean;\n if (typeof configuredSecure === 'boolean') {\n isSecure = configuredSecure;\n } else if (secureRequest !== undefined) {\n isSecure = isProduction && secureRequest;\n } else {\n isSecure = isProduction;\n }\n\n return {\n httpOnly: true,\n secure: isSecure,\n overwrite: true,\n domain,\n path,\n sameSite,\n maxAge: undefined,\n };\n};\n\nconst getLifespansForType = (\n type: 'refresh' | 'session'\n): { idleSeconds: number; maxSeconds: number } => {\n if (type === 'refresh') {\n const idleSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.idleRefreshTokenLifespan',\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN\n )\n );\n const maxSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.maxRefreshTokenLifespan',\n DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN\n )\n );\n\n return { idleSeconds, maxSeconds };\n }\n\n const idleSeconds = Number(\n strapi.config.get('admin.auth.sessions.idleSessionLifespan', DEFAULT_IDLE_SESSION_LIFESPAN)\n );\n const maxSeconds = Number(\n strapi.config.get('admin.auth.sessions.maxSessionLifespan', DEFAULT_MAX_SESSION_LIFESPAN)\n );\n\n return { idleSeconds, maxSeconds };\n};\n\nexport const buildCookieOptionsWithExpiry = (\n type: 'refresh' | 'session',\n absoluteExpiresAtISO?: string,\n secureRequest?: boolean\n) => {\n const base = getRefreshCookieOptions(secureRequest);\n if (type === 'session') {\n return base;\n }\n\n const { idleSeconds } = getLifespansForType('refresh');\n const now = Date.now();\n const idleExpiry = now + idleSeconds * 1000;\n const absoluteExpiry = absoluteExpiresAtISO\n ? new Date(absoluteExpiresAtISO).getTime()\n : idleExpiry;\n const chosen = new Date(Math.min(idleExpiry, absoluteExpiry));\n\n return { ...base, expires: chosen, maxAge: Math.max(0, chosen.getTime() - now) };\n};\n\nexport const getSessionManager = (): Modules.SessionManager.SessionManagerService | null => {\n const manager = strapi.sessionManager as Modules.SessionManager.SessionManagerService | undefined;\n return manager ?? null;\n};\n\nexport const generateDeviceId = (): string => crypto.randomUUID();\n\nexport const extractDeviceParams = (\n requestBody: unknown\n): { deviceId: string; rememberMe: boolean } => {\n const body = (requestBody ?? {}) as { deviceId?: string; rememberMe?: boolean };\n const deviceId = body.deviceId || generateDeviceId();\n const rememberMe = Boolean(body.rememberMe);\n\n return { deviceId, rememberMe };\n};\n"],"names":["REFRESH_COOKIE_NAME","DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN","DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN","DEFAULT_MAX_SESSION_LIFESPAN","DEFAULT_IDLE_SESSION_LIFESPAN","getRefreshCookieOptions","secureRequest","configuredSecure","strapi","config","get","isProduction","process","env","NODE_ENV","domain","path","sameSite","isSecure","undefined","httpOnly","secure","overwrite","maxAge","getLifespansForType","type","idleSeconds","Number","maxSeconds","buildCookieOptionsWithExpiry","absoluteExpiresAtISO","base","now","Date","idleExpiry","absoluteExpiry","getTime","chosen","Math","min","expires","max","getSessionManager","manager","sessionManager","generateDeviceId","crypto","randomUUID","extractDeviceParams","requestBody","body","deviceId","rememberMe","Boolean"],"mappings":"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"}
@@ -5,13 +5,20 @@ const DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN = 30 * 24 * 60 * 60;
5
5
  const DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN = 14 * 24 * 60 * 60;
6
6
  const DEFAULT_MAX_SESSION_LIFESPAN = 1 * 24 * 60 * 60;
7
7
  const DEFAULT_IDLE_SESSION_LIFESPAN = 2 * 60 * 60;
8
- const getRefreshCookieOptions = ()=>{
8
+ const getRefreshCookieOptions = (secureRequest)=>{
9
9
  const configuredSecure = strapi.config.get('admin.auth.cookie.secure');
10
10
  const isProduction = process.env.NODE_ENV === 'production';
11
11
  const domain = strapi.config.get('admin.auth.cookie.domain') || strapi.config.get('admin.auth.domain');
12
12
  const path = strapi.config.get('admin.auth.cookie.path', '/admin');
13
13
  const sameSite = strapi.config.get('admin.auth.cookie.sameSite') ?? 'lax';
14
- const isSecure = typeof configuredSecure === 'boolean' ? configuredSecure : isProduction;
14
+ let isSecure;
15
+ if (typeof configuredSecure === 'boolean') {
16
+ isSecure = configuredSecure;
17
+ } else if (secureRequest !== undefined) {
18
+ isSecure = isProduction && secureRequest;
19
+ } else {
20
+ isSecure = isProduction;
21
+ }
15
22
  return {
16
23
  httpOnly: true,
17
24
  secure: isSecure,
@@ -32,8 +39,8 @@ const getLifespansForType = (type)=>{
32
39
  };
33
40
  }
34
41
  };
35
- const buildCookieOptionsWithExpiry = (type, absoluteExpiresAtISO)=>{
36
- const base = getRefreshCookieOptions();
42
+ const buildCookieOptionsWithExpiry = (type, absoluteExpiresAtISO, secureRequest)=>{
43
+ const base = getRefreshCookieOptions(secureRequest);
37
44
  if (type === 'session') {
38
45
  return base;
39
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-auth.mjs","sources":["../../../../shared/utils/session-auth.ts"],"sourcesContent":["import crypto from 'crypto';\nimport type { Modules } from '@strapi/types';\n\nexport const REFRESH_COOKIE_NAME = 'strapi_admin_refresh';\n\nexport const DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN = 30 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN = 14 * 24 * 60 * 60;\nexport const DEFAULT_MAX_SESSION_LIFESPAN = 1 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_SESSION_LIFESPAN = 2 * 60 * 60;\n\nexport const getRefreshCookieOptions = () => {\n const configuredSecure = strapi.config.get('admin.auth.cookie.secure');\n const isProduction = process.env.NODE_ENV === 'production';\n\n const domain: string | undefined =\n strapi.config.get('admin.auth.cookie.domain') || strapi.config.get('admin.auth.domain');\n const path: string = strapi.config.get('admin.auth.cookie.path', '/admin');\n\n const sameSite: boolean | 'lax' | 'strict' | 'none' =\n strapi.config.get('admin.auth.cookie.sameSite') ?? 'lax';\n\n const isSecure = typeof configuredSecure === 'boolean' ? configuredSecure : isProduction;\n\n return {\n httpOnly: true,\n secure: isSecure,\n overwrite: true,\n domain,\n path,\n sameSite,\n maxAge: undefined,\n };\n};\n\nconst getLifespansForType = (\n type: 'refresh' | 'session'\n): { idleSeconds: number; maxSeconds: number } => {\n if (type === 'refresh') {\n const idleSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.idleRefreshTokenLifespan',\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN\n )\n );\n const maxSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.maxRefreshTokenLifespan',\n DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN\n )\n );\n\n return { idleSeconds, maxSeconds };\n }\n\n const idleSeconds = Number(\n strapi.config.get('admin.auth.sessions.idleSessionLifespan', DEFAULT_IDLE_SESSION_LIFESPAN)\n );\n const maxSeconds = Number(\n strapi.config.get('admin.auth.sessions.maxSessionLifespan', DEFAULT_MAX_SESSION_LIFESPAN)\n );\n\n return { idleSeconds, maxSeconds };\n};\n\nexport const buildCookieOptionsWithExpiry = (\n type: 'refresh' | 'session',\n absoluteExpiresAtISO?: string\n) => {\n const base = getRefreshCookieOptions();\n if (type === 'session') {\n return base;\n }\n\n const { idleSeconds } = getLifespansForType('refresh');\n const now = Date.now();\n const idleExpiry = now + idleSeconds * 1000;\n const absoluteExpiry = absoluteExpiresAtISO\n ? new Date(absoluteExpiresAtISO).getTime()\n : idleExpiry;\n const chosen = new Date(Math.min(idleExpiry, absoluteExpiry));\n\n return { ...base, expires: chosen, maxAge: Math.max(0, chosen.getTime() - now) };\n};\n\nexport const getSessionManager = (): Modules.SessionManager.SessionManagerService | null => {\n const manager = strapi.sessionManager as Modules.SessionManager.SessionManagerService | undefined;\n return manager ?? null;\n};\n\nexport const generateDeviceId = (): string => crypto.randomUUID();\n\nexport const extractDeviceParams = (\n requestBody: unknown\n): { deviceId: string; rememberMe: boolean } => {\n const body = (requestBody ?? {}) as { deviceId?: string; rememberMe?: boolean };\n const deviceId = body.deviceId || generateDeviceId();\n const rememberMe = Boolean(body.rememberMe);\n\n return { deviceId, rememberMe };\n};\n"],"names":["REFRESH_COOKIE_NAME","DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN","DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN","DEFAULT_MAX_SESSION_LIFESPAN","DEFAULT_IDLE_SESSION_LIFESPAN","getRefreshCookieOptions","configuredSecure","strapi","config","get","isProduction","process","env","NODE_ENV","domain","path","sameSite","isSecure","httpOnly","secure","overwrite","maxAge","undefined","getLifespansForType","type","idleSeconds","Number","maxSeconds","buildCookieOptionsWithExpiry","absoluteExpiresAtISO","base","now","Date","idleExpiry","absoluteExpiry","getTime","chosen","Math","min","expires","max","getSessionManager","manager","sessionManager","generateDeviceId","crypto","randomUUID","extractDeviceParams","requestBody","body","deviceId","rememberMe","Boolean"],"mappings":"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"}
1
+ {"version":3,"file":"session-auth.mjs","sources":["../../../../shared/utils/session-auth.ts"],"sourcesContent":["import crypto from 'crypto';\nimport type { Modules } from '@strapi/types';\n\nexport const REFRESH_COOKIE_NAME = 'strapi_admin_refresh';\n\nexport const DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN = 30 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN = 14 * 24 * 60 * 60;\nexport const DEFAULT_MAX_SESSION_LIFESPAN = 1 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_SESSION_LIFESPAN = 2 * 60 * 60;\n\nexport const getRefreshCookieOptions = (secureRequest?: boolean) => {\n const configuredSecure = strapi.config.get('admin.auth.cookie.secure');\n const isProduction = process.env.NODE_ENV === 'production';\n\n const domain: string | undefined =\n strapi.config.get('admin.auth.cookie.domain') || strapi.config.get('admin.auth.domain');\n const path: string = strapi.config.get('admin.auth.cookie.path', '/admin');\n\n const sameSite: boolean | 'lax' | 'strict' | 'none' =\n strapi.config.get('admin.auth.cookie.sameSite') ?? 'lax';\n\n let isSecure: boolean;\n if (typeof configuredSecure === 'boolean') {\n isSecure = configuredSecure;\n } else if (secureRequest !== undefined) {\n isSecure = isProduction && secureRequest;\n } else {\n isSecure = isProduction;\n }\n\n return {\n httpOnly: true,\n secure: isSecure,\n overwrite: true,\n domain,\n path,\n sameSite,\n maxAge: undefined,\n };\n};\n\nconst getLifespansForType = (\n type: 'refresh' | 'session'\n): { idleSeconds: number; maxSeconds: number } => {\n if (type === 'refresh') {\n const idleSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.idleRefreshTokenLifespan',\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN\n )\n );\n const maxSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.maxRefreshTokenLifespan',\n DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN\n )\n );\n\n return { idleSeconds, maxSeconds };\n }\n\n const idleSeconds = Number(\n strapi.config.get('admin.auth.sessions.idleSessionLifespan', DEFAULT_IDLE_SESSION_LIFESPAN)\n );\n const maxSeconds = Number(\n strapi.config.get('admin.auth.sessions.maxSessionLifespan', DEFAULT_MAX_SESSION_LIFESPAN)\n );\n\n return { idleSeconds, maxSeconds };\n};\n\nexport const buildCookieOptionsWithExpiry = (\n type: 'refresh' | 'session',\n absoluteExpiresAtISO?: string,\n secureRequest?: boolean\n) => {\n const base = getRefreshCookieOptions(secureRequest);\n if (type === 'session') {\n return base;\n }\n\n const { idleSeconds } = getLifespansForType('refresh');\n const now = Date.now();\n const idleExpiry = now + idleSeconds * 1000;\n const absoluteExpiry = absoluteExpiresAtISO\n ? new Date(absoluteExpiresAtISO).getTime()\n : idleExpiry;\n const chosen = new Date(Math.min(idleExpiry, absoluteExpiry));\n\n return { ...base, expires: chosen, maxAge: Math.max(0, chosen.getTime() - now) };\n};\n\nexport const getSessionManager = (): Modules.SessionManager.SessionManagerService | null => {\n const manager = strapi.sessionManager as Modules.SessionManager.SessionManagerService | undefined;\n return manager ?? null;\n};\n\nexport const generateDeviceId = (): string => crypto.randomUUID();\n\nexport const extractDeviceParams = (\n requestBody: unknown\n): { deviceId: string; rememberMe: boolean } => {\n const body = (requestBody ?? {}) as { deviceId?: string; rememberMe?: boolean };\n const deviceId = body.deviceId || generateDeviceId();\n const rememberMe = Boolean(body.rememberMe);\n\n return { deviceId, rememberMe };\n};\n"],"names":["REFRESH_COOKIE_NAME","DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN","DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN","DEFAULT_MAX_SESSION_LIFESPAN","DEFAULT_IDLE_SESSION_LIFESPAN","getRefreshCookieOptions","secureRequest","configuredSecure","strapi","config","get","isProduction","process","env","NODE_ENV","domain","path","sameSite","isSecure","undefined","httpOnly","secure","overwrite","maxAge","getLifespansForType","type","idleSeconds","Number","maxSeconds","buildCookieOptionsWithExpiry","absoluteExpiresAtISO","base","now","Date","idleExpiry","absoluteExpiry","getTime","chosen","Math","min","expires","max","getSessionManager","manager","sessionManager","generateDeviceId","crypto","randomUUID","extractDeviceParams","requestBody","body","deviceId","rememberMe","Boolean"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"authentication.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/authentication.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAQ,MAAM,KAAK,CAAC;AAGzC,OAAO,eAAe,CAAC;;;0BAgHO,OAAO;kBAcf,OAAO;uBA6CF,OAAO;wBAkEN,OAAO;uBAUR,OAAO;qBA+CT,OAAO;gBAqCZ,OAAO;;AA3S3B,wBAoUE"}
1
+ {"version":3,"file":"authentication.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/authentication.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAQ,MAAM,KAAK,CAAC;AAGzC,OAAO,eAAe,CAAC;;;0BAiHO,OAAO;kBAcf,OAAO;uBA8CF,OAAO;wBAmEN,OAAO;uBAUR,OAAO;qBAmDT,OAAO;gBAyCZ,OAAO;;AAtT3B,wBA+UE"}
@@ -1 +1 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../server/src/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;qCAKd;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;AAAnD,wBAUE"}
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../server/src/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;qCAKd;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;AAAnD,wBAYE"}
@@ -4,7 +4,7 @@ export declare const DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN: number;
4
4
  export declare const DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN: number;
5
5
  export declare const DEFAULT_MAX_SESSION_LIFESPAN: number;
6
6
  export declare const DEFAULT_IDLE_SESSION_LIFESPAN: number;
7
- export declare const getRefreshCookieOptions: () => {
7
+ export declare const getRefreshCookieOptions: (secureRequest?: boolean) => {
8
8
  httpOnly: boolean;
9
9
  secure: boolean;
10
10
  overwrite: boolean;
@@ -13,7 +13,7 @@ export declare const getRefreshCookieOptions: () => {
13
13
  sameSite: boolean | "none" | "strict" | "lax";
14
14
  maxAge: undefined;
15
15
  };
16
- export declare const buildCookieOptionsWithExpiry: (type: 'refresh' | 'session', absoluteExpiresAtISO?: string) => {
16
+ export declare const buildCookieOptionsWithExpiry: (type: 'refresh' | 'session', absoluteExpiresAtISO?: string, secureRequest?: boolean) => {
17
17
  httpOnly: boolean;
18
18
  secure: boolean;
19
19
  overwrite: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"session-auth.d.ts","sourceRoot":"","sources":["../../../shared/utils/session-auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAO,MAAM,mBAAmB,yBAAyB,CAAC;AAE1D,eAAO,MAAM,kCAAkC,QAAoB,CAAC;AACpE,eAAO,MAAM,mCAAmC,QAAoB,CAAC;AACrE,eAAO,MAAM,4BAA4B,QAAmB,CAAC;AAC7D,eAAO,MAAM,6BAA6B,QAAc,CAAC;AAEzD,eAAO,MAAM,uBAAuB;;;;;;;;CAsBnC,CAAC;AAgCF,eAAO,MAAM,4BAA4B,SACjC,SAAS,GAAG,SAAS,yBACJ,MAAM;;;;;;;;;;;;;;;;;CAgB9B,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAAO,QAAQ,cAAc,CAAC,qBAAqB,GAAG,IAGnF,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAO,MAA6B,CAAC;AAElE,eAAO,MAAM,mBAAmB,gBACjB,OAAO,KACnB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAMzC,CAAC"}
1
+ {"version":3,"file":"session-auth.d.ts","sourceRoot":"","sources":["../../../shared/utils/session-auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAO,MAAM,mBAAmB,yBAAyB,CAAC;AAE1D,eAAO,MAAM,kCAAkC,QAAoB,CAAC;AACpE,eAAO,MAAM,mCAAmC,QAAoB,CAAC;AACrE,eAAO,MAAM,4BAA4B,QAAmB,CAAC;AAC7D,eAAO,MAAM,6BAA6B,QAAc,CAAC;AAEzD,eAAO,MAAM,uBAAuB,mBAAoB,OAAO;;;;;;;;CA6B9D,CAAC;AAgCF,eAAO,MAAM,4BAA4B,SACjC,SAAS,GAAG,SAAS,yBACJ,MAAM,kBACb,OAAO;;;;;;;;;;;;;;;;;CAgBxB,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAAO,QAAQ,cAAc,CAAC,qBAAqB,GAAG,IAGnF,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAO,MAA6B,CAAC;AAElE,eAAO,MAAM,mBAAmB,gBACjB,OAAO,KACnB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAMzC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/admin",
3
- "version": "5.28.0",
3
+ "version": "5.29.0",
4
4
  "description": "Strapi Admin",
5
5
  "repository": {
6
6
  "type": "git",
@@ -86,10 +86,10 @@
86
86
  "@reduxjs/toolkit": "1.9.7",
87
87
  "@strapi/design-system": "2.0.0-rc.30",
88
88
  "@strapi/icons": "2.0.0-rc.30",
89
- "@strapi/permissions": "5.28.0",
90
- "@strapi/types": "5.28.0",
91
- "@strapi/typescript-utils": "5.28.0",
92
- "@strapi/utils": "5.28.0",
89
+ "@strapi/permissions": "5.29.0",
90
+ "@strapi/types": "5.29.0",
91
+ "@strapi/typescript-utils": "5.29.0",
92
+ "@strapi/utils": "5.29.0",
93
93
  "@testing-library/dom": "10.1.0",
94
94
  "@testing-library/react": "15.0.7",
95
95
  "@testing-library/user-event": "14.5.2",
@@ -143,8 +143,8 @@
143
143
  "zod": "3.25.67"
144
144
  },
145
145
  "devDependencies": {
146
- "@strapi/admin-test-utils": "5.28.0",
147
- "@strapi/data-transfer": "5.28.0",
146
+ "@strapi/admin-test-utils": "5.29.0",
147
+ "@strapi/data-transfer": "5.29.0",
148
148
  "@types/codemirror5": "npm:@types/codemirror@^5.60.15",
149
149
  "@types/fs-extra": "11.0.4",
150
150
  "@types/invariant": "2.2.36",