@strapi/plugin-documentation 5.48.1 → 5.50.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.
- package/dist/admin/components/SettingsForm.js +4 -3
- package/dist/admin/components/SettingsForm.js.map +1 -1
- package/dist/admin/pages/App.js +3 -2
- package/dist/admin/pages/App.js.map +1 -1
- package/dist/server/controllers/documentation.js +29 -21
- package/dist/server/controllers/documentation.js.map +1 -1
- package/dist/server/middlewares/documentation.js +8 -2
- package/dist/server/middlewares/documentation.js.map +1 -1
- package/dist/server/public/index.html.js +1 -1
- package/dist/server/public/index.html.mjs +1 -1
- package/dist/server/public/login.html.js +1 -1
- package/dist/server/public/login.html.mjs +1 -1
- package/dist/server/services/documentation.js +16 -11
- package/dist/server/services/documentation.js.map +1 -1
- package/dist/server/services/helpers/build-api-endpoint-path.js +9 -5
- package/dist/server/services/helpers/build-api-endpoint-path.js.map +1 -1
- package/dist/server/services/helpers/build-component-schema.js +5 -1
- package/dist/server/services/helpers/build-component-schema.js.map +1 -1
- package/dist/server/services/helpers/utils/clean-schema-attributes.js.map +1 -1
- package/dist/server/services/helpers/utils/clean-schema-attributes.mjs.map +1 -1
- package/dist/server/services/helpers/utils/loop-content-type-names.js +6 -2
- package/dist/server/services/helpers/utils/loop-content-type-names.js.map +1 -1
- package/dist/server/services/helpers/utils/pascal-case.js +5 -1
- package/dist/server/services/helpers/utils/pascal-case.js.map +1 -1
- package/dist/server/src/controllers/documentation.d.ts +2 -2
- package/dist/server/src/controllers/documentation.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +2 -3
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +5 -6
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/middlewares/documentation.d.ts.map +1 -1
- package/dist/server/src/middlewares/restrict-access.d.ts.map +1 -1
- package/dist/server/src/routes/index.d.ts +0 -1
- package/dist/server/src/routes/index.d.ts.map +1 -1
- package/dist/server/src/services/documentation.d.ts.map +1 -1
- package/dist/server/src/services/helpers/build-api-endpoint-path.d.ts.map +1 -1
- package/dist/server/src/services/helpers/build-component-schema.d.ts.map +1 -1
- package/dist/server/src/services/helpers/utils/clean-schema-attributes.d.ts +1 -1
- package/dist/server/src/services/helpers/utils/clean-schema-attributes.d.ts.map +1 -1
- package/dist/server/src/services/helpers/utils/get-api-responses.d.ts.map +1 -1
- package/dist/server/src/services/helpers/utils/get-schema-data.d.ts.map +1 -1
- package/dist/server/src/services/helpers/utils/loop-content-type-names.d.ts.map +1 -1
- package/dist/server/src/services/helpers/utils/pascal-case.d.ts.map +1 -1
- package/dist/server/src/services/helpers/utils/routes.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +3 -3
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/override.d.ts.map +1 -1
- package/dist/server/src/services/utils/get-plugins-that-need-documentation.d.ts.map +1 -1
- package/dist/server/src/utils.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -12,7 +12,8 @@ var yup = require('yup');
|
|
|
12
12
|
var constants = require('../constants.js');
|
|
13
13
|
var getTrad = require('../utils/getTrad.js');
|
|
14
14
|
|
|
15
|
-
function
|
|
15
|
+
function _interopNamespace(e) {
|
|
16
|
+
if (e && e.__esModule) return e;
|
|
16
17
|
var n = Object.create(null);
|
|
17
18
|
if (e) {
|
|
18
19
|
Object.keys(e).forEach(function (k) {
|
|
@@ -29,8 +30,8 @@ function _interopNamespaceDefault(e) {
|
|
|
29
30
|
return Object.freeze(n);
|
|
30
31
|
}
|
|
31
32
|
|
|
32
|
-
var React__namespace = /*#__PURE__*/
|
|
33
|
-
var yup__namespace = /*#__PURE__*/
|
|
33
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
34
|
+
var yup__namespace = /*#__PURE__*/_interopNamespace(yup);
|
|
34
35
|
|
|
35
36
|
const schema = yup__namespace.object().shape({
|
|
36
37
|
restrictedAccess: yup__namespace.boolean(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsForm.js","sources":["../../../admin/src/components/SettingsForm.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Button,\n Flex,\n Grid,\n TextInput,\n Toggle,\n Typography,\n Field,\n} from '@strapi/design-system';\n// Strapi Icons\nimport { Check, Eye as Show, EyeStriked as Hide } from '@strapi/icons';\nimport { translatedErrors, useRBAC, Layouts } from '@strapi/strapi/admin';\nimport { Form, Formik, FormikHelpers } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\nimport * as yup from 'yup';\n\nimport { PERMISSIONS } from '../constants';\nimport { DocumentInfos, SettingsInput } from '../types';\nimport { getTrad } from '../utils';\n\nconst schema = yup.object().shape({\n restrictedAccess: yup.boolean(),\n password: yup.string().when('restrictedAccess', (value, initSchema) => {\n return value\n ? initSchema\n .required(translatedErrors.required.id)\n .min(8)\n .matches(/[a-z]/, 'components.Input.error.contain.lowercase')\n .matches(/[A-Z]/, 'components.Input.error.contain.uppercase')\n .matches(/\\d/, 'components.Input.error.contain.number')\n : initSchema;\n }),\n});\n\nconst FieldActionWrapper = styled(Field.Action)`\n svg {\n height: 1.6rem;\n width: 1.6rem;\n path {\n fill: ${({ theme }) => theme.colors.neutral600};\n }\n }\n`;\n\ntype SettingsFormProps = {\n data?: DocumentInfos;\n onSubmit: (body: SettingsInput, formik: FormikHelpers<SettingsInput>) => Promise<void>;\n};\n\nexport const SettingsForm = ({ data, onSubmit }: SettingsFormProps) => {\n const { formatMessage } = useIntl();\n const [passwordShown, setPasswordShown] = React.useState(false);\n const { allowedActions } = useRBAC(PERMISSIONS);\n\n return (\n <Formik\n enableReinitialize\n initialValues={{\n restrictedAccess: data?.documentationAccess.restrictedAccess || false,\n password: '',\n }}\n onSubmit={onSubmit}\n validationSchema={schema}\n >\n {({\n handleSubmit,\n values,\n handleChange,\n errors,\n setFieldTouched,\n setFieldValue,\n setFieldError,\n dirty,\n }) => {\n return (\n <Form noValidate onSubmit={handleSubmit}>\n <Layouts.Header\n title={formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: 'Documentation',\n })}\n subtitle={formatMessage({\n id: getTrad('pages.SettingsPage.header.description'),\n defaultMessage: 'Configure the documentation plugin',\n })}\n primaryAction={\n <Button\n type=\"submit\"\n startIcon={<Check />}\n disabled={!dirty && allowedActions.canUpdate}\n fullWidth\n >\n {formatMessage({\n id: getTrad('pages.SettingsPage.Button.save'),\n defaultMessage: 'Save',\n })}\n </Button>\n }\n />\n <Layouts.Content>\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid.Root gap={4}>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n name=\"restrictedAccess\"\n hint={formatMessage({\n id: getTrad('pages.SettingsPage.toggle.hint'),\n defaultMessage: 'Make the documentation endpoint private',\n })}\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('pages.SettingsPage.toggle.label'),\n defaultMessage: 'Restricted Access',\n })}\n </Field.Label>\n <Toggle\n checked={values.restrictedAccess}\n onChange={() => {\n if (values.restrictedAccess === true) {\n setFieldValue('password', '', false);\n setFieldTouched('password', false, false);\n setFieldError('password', undefined);\n }\n\n setFieldValue('restrictedAccess', !values.restrictedAccess, false);\n }}\n onLabel=\"On\"\n offLabel=\"Off\"\n />\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n {values.restrictedAccess && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n name=\"password\"\n error={\n errors.password\n ? formatMessage({\n id: errors.password,\n defaultMessage: errors.password,\n })\n : undefined\n }\n >\n <Field.Label>\n {formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n })}\n </Field.Label>\n <TextInput\n placeholder=\"**********\"\n type={passwordShown ? 'text' : 'password'}\n value={values.password}\n onChange={handleChange}\n endAction={\n <FieldActionWrapper\n onClick={(e) => {\n e.stopPropagation();\n setPasswordShown((prev) => !prev);\n }}\n label={formatMessage(\n passwordShown\n ? {\n id: 'Auth.form.password.show-password',\n defaultMessage: 'Show password',\n }\n : {\n id: 'Auth.form.password.hide-password',\n defaultMessage: 'Hide password',\n }\n )}\n >\n {passwordShown ? <Show /> : <Hide />}\n </FieldActionWrapper>\n }\n />\n <Field.Error />\n </Field.Root>\n </Grid.Item>\n )}\n </Grid.Root>\n </Flex>\n </Box>\n </Layouts.Content>\n </Form>\n );\n }}\n </Formik>\n );\n};\n"],"names":["schema","yup","object","shape","restrictedAccess","boolean","password","string","when","value","initSchema","required","translatedErrors","id","min","matches","FieldActionWrapper","styled","Field","Action","theme","colors","neutral600","SettingsForm","data","onSubmit","formatMessage","useIntl","passwordShown","setPasswordShown","React","useState","allowedActions","useRBAC","PERMISSIONS","_jsx","Formik","enableReinitialize","initialValues","documentationAccess","validationSchema","handleSubmit","values","handleChange","errors","setFieldTouched","setFieldValue","setFieldError","dirty","_jsxs","Form","noValidate","Layouts","Header","title","getTrad","defaultMessage","subtitle","primaryAction","Button","type","startIcon","Check","disabled","canUpdate","fullWidth","Content","Box","background","hasRadius","shadow","paddingTop","paddingBottom","paddingLeft","paddingRight","Flex","direction","alignItems","gap","Typography","variant","tag","Grid","Root","Item","col","xs","name","hint","Label","Toggle","checked","onChange","undefined","onLabel","offLabel","Hint","error","TextInput","placeholder","endAction","onClick","e","stopPropagation","prev","label","Show","Hide","Error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SettingsForm.js","sources":["../../../admin/src/components/SettingsForm.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Button,\n Flex,\n Grid,\n TextInput,\n Toggle,\n Typography,\n Field,\n} from '@strapi/design-system';\n// Strapi Icons\nimport { Check, Eye as Show, EyeStriked as Hide } from '@strapi/icons';\nimport { translatedErrors, useRBAC, Layouts } from '@strapi/strapi/admin';\nimport { Form, Formik, FormikHelpers } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\nimport * as yup from 'yup';\n\nimport { PERMISSIONS } from '../constants';\nimport { DocumentInfos, SettingsInput } from '../types';\nimport { getTrad } from '../utils';\n\nconst schema = yup.object().shape({\n restrictedAccess: yup.boolean(),\n password: yup.string().when('restrictedAccess', (value, initSchema) => {\n return value\n ? initSchema\n .required(translatedErrors.required.id)\n .min(8)\n .matches(/[a-z]/, 'components.Input.error.contain.lowercase')\n .matches(/[A-Z]/, 'components.Input.error.contain.uppercase')\n .matches(/\\d/, 'components.Input.error.contain.number')\n : initSchema;\n }),\n});\n\nconst FieldActionWrapper = styled(Field.Action)`\n svg {\n height: 1.6rem;\n width: 1.6rem;\n path {\n fill: ${({ theme }) => theme.colors.neutral600};\n }\n }\n`;\n\ntype SettingsFormProps = {\n data?: DocumentInfos;\n onSubmit: (body: SettingsInput, formik: FormikHelpers<SettingsInput>) => Promise<void>;\n};\n\nexport const SettingsForm = ({ data, onSubmit }: SettingsFormProps) => {\n const { formatMessage } = useIntl();\n const [passwordShown, setPasswordShown] = React.useState(false);\n const { allowedActions } = useRBAC(PERMISSIONS);\n\n return (\n <Formik\n enableReinitialize\n initialValues={{\n restrictedAccess: data?.documentationAccess.restrictedAccess || false,\n password: '',\n }}\n onSubmit={onSubmit}\n validationSchema={schema}\n >\n {({\n handleSubmit,\n values,\n handleChange,\n errors,\n setFieldTouched,\n setFieldValue,\n setFieldError,\n dirty,\n }) => {\n return (\n <Form noValidate onSubmit={handleSubmit}>\n <Layouts.Header\n title={formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: 'Documentation',\n })}\n subtitle={formatMessage({\n id: getTrad('pages.SettingsPage.header.description'),\n defaultMessage: 'Configure the documentation plugin',\n })}\n primaryAction={\n <Button\n type=\"submit\"\n startIcon={<Check />}\n disabled={!dirty && allowedActions.canUpdate}\n fullWidth\n >\n {formatMessage({\n id: getTrad('pages.SettingsPage.Button.save'),\n defaultMessage: 'Save',\n })}\n </Button>\n }\n />\n <Layouts.Content>\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid.Root gap={4}>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n name=\"restrictedAccess\"\n hint={formatMessage({\n id: getTrad('pages.SettingsPage.toggle.hint'),\n defaultMessage: 'Make the documentation endpoint private',\n })}\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('pages.SettingsPage.toggle.label'),\n defaultMessage: 'Restricted Access',\n })}\n </Field.Label>\n <Toggle\n checked={values.restrictedAccess}\n onChange={() => {\n if (values.restrictedAccess === true) {\n setFieldValue('password', '', false);\n setFieldTouched('password', false, false);\n setFieldError('password', undefined);\n }\n\n setFieldValue('restrictedAccess', !values.restrictedAccess, false);\n }}\n onLabel=\"On\"\n offLabel=\"Off\"\n />\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n {values.restrictedAccess && (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n name=\"password\"\n error={\n errors.password\n ? formatMessage({\n id: errors.password,\n defaultMessage: errors.password,\n })\n : undefined\n }\n >\n <Field.Label>\n {formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n })}\n </Field.Label>\n <TextInput\n placeholder=\"**********\"\n type={passwordShown ? 'text' : 'password'}\n value={values.password}\n onChange={handleChange}\n endAction={\n <FieldActionWrapper\n onClick={(e) => {\n e.stopPropagation();\n setPasswordShown((prev) => !prev);\n }}\n label={formatMessage(\n passwordShown\n ? {\n id: 'Auth.form.password.show-password',\n defaultMessage: 'Show password',\n }\n : {\n id: 'Auth.form.password.hide-password',\n defaultMessage: 'Hide password',\n }\n )}\n >\n {passwordShown ? <Show /> : <Hide />}\n </FieldActionWrapper>\n }\n />\n <Field.Error />\n </Field.Root>\n </Grid.Item>\n )}\n </Grid.Root>\n </Flex>\n </Box>\n </Layouts.Content>\n </Form>\n );\n }}\n </Formik>\n );\n};\n"],"names":["schema","yup","object","shape","restrictedAccess","boolean","password","string","when","value","initSchema","required","translatedErrors","id","min","matches","FieldActionWrapper","styled","Field","Action","theme","colors","neutral600","SettingsForm","data","onSubmit","formatMessage","useIntl","passwordShown","setPasswordShown","React","useState","allowedActions","useRBAC","PERMISSIONS","_jsx","Formik","enableReinitialize","initialValues","documentationAccess","validationSchema","handleSubmit","values","handleChange","errors","setFieldTouched","setFieldValue","setFieldError","dirty","_jsxs","Form","noValidate","Layouts","Header","title","getTrad","defaultMessage","subtitle","primaryAction","Button","type","startIcon","Check","disabled","canUpdate","fullWidth","Content","Box","background","hasRadius","shadow","paddingTop","paddingBottom","paddingLeft","paddingRight","Flex","direction","alignItems","gap","Typography","variant","tag","Grid","Root","Item","col","xs","name","hint","Label","Toggle","checked","onChange","undefined","onLabel","offLabel","Hint","error","TextInput","placeholder","endAction","onClick","e","stopPropagation","prev","label","Show","Hide","Error"],"mappings":"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"}
|
package/dist/admin/pages/App.js
CHANGED
|
@@ -11,7 +11,8 @@ var constants = require('../constants.js');
|
|
|
11
11
|
var api = require('../services/api.js');
|
|
12
12
|
var getTrad = require('../utils/getTrad.js');
|
|
13
13
|
|
|
14
|
-
function
|
|
14
|
+
function _interopNamespace(e) {
|
|
15
|
+
if (e && e.__esModule) return e;
|
|
15
16
|
var n = Object.create(null);
|
|
16
17
|
if (e) {
|
|
17
18
|
Object.keys(e).forEach(function (k) {
|
|
@@ -28,7 +29,7 @@ function _interopNamespaceDefault(e) {
|
|
|
28
29
|
return Object.freeze(n);
|
|
29
30
|
}
|
|
30
31
|
|
|
31
|
-
var React__namespace = /*#__PURE__*/
|
|
32
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
32
33
|
|
|
33
34
|
const App = ()=>{
|
|
34
35
|
const { formatMessage } = reactIntl.useIntl();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sources":["../../../admin/src/pages/App.tsx"],"sourcesContent":["/* eslint-disable import/no-default-export */\nimport * as React from 'react';\n\nimport {\n LinkButton,\n Flex,\n IconButton,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n Typography,\n EmptyStateLayout,\n Dialog,\n} from '@strapi/design-system';\nimport { Eye as Show, ArrowClockwise as Reload, Trash } from '@strapi/icons';\nimport {\n ConfirmDialog,\n useRBAC,\n Page,\n useAPIErrorHandler,\n useNotification,\n Layouts,\n} from '@strapi/strapi/admin';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { PERMISSIONS } from '../constants';\nimport {\n useGetInfoQuery,\n useRegenerateDocMutation,\n useDeleteVersionMutation,\n} from '../services/api';\nimport { getTrad } from '../utils';\n\nconst App = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const { data, isLoading: isLoadingInfo, isError } = useGetInfoQuery();\n const [regenerate] = useRegenerateDocMutation();\n const [deleteVersion] = useDeleteVersionMutation();\n const [showConfirmDelete, setShowConfirmDelete] = React.useState<boolean>(false);\n const [versionToDelete, setVersionToDelete] = React.useState<string>();\n const { allowedActions, isLoading: isLoadingRBAC } = useRBAC(PERMISSIONS);\n\n const isLoading = isLoadingInfo || isLoadingRBAC;\n\n const colCount = 4;\n const rowCount = (data?.docVersions?.length || 0) + 1;\n\n const handleRegenerateDoc = (version: string) => {\n regenerate({ version })\n .unwrap()\n .then(() => {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('notification.generate.success'),\n defaultMessage: 'Successfully generated documentation',\n }),\n });\n })\n .catch((err) => {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(err),\n });\n });\n };\n\n const handleShowConfirmDelete = () => {\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleConfirmDelete = async () => {\n if (!versionToDelete) {\n // nothing to delete\n return;\n }\n\n await deleteVersion({ version: versionToDelete })\n .unwrap()\n .then(() => {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('notification.delete.success'),\n defaultMessage: 'Successfully deleted documentation',\n }),\n });\n })\n .catch((err) => {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(err),\n });\n });\n\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleClickDelete = (version: string) => {\n setVersionToDelete(version);\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const title = formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: 'Documentation',\n });\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (isError) {\n return <Page.Error />;\n }\n\n return (\n <Layouts.Root>\n <Page.Title>{title}</Page.Title>\n <Page.Main>\n <Layouts.Header\n title={title}\n subtitle={formatMessage({\n id: getTrad('pages.PluginPage.header.description'),\n defaultMessage: 'Configure the documentation plugin',\n })}\n primaryAction={\n <OpenDocLink\n disabled={!allowedActions.canRead || !data?.currentVersion || !data?.prefix}\n href={createDocumentationHref(`${data?.prefix}/v${data?.currentVersion}`)}\n startIcon={<Show />}\n fullWidth\n >\n {formatMessage({\n id: getTrad('pages.PluginPage.Button.open'),\n defaultMessage: 'Open Documentation',\n })}\n </OpenDocLink>\n }\n />\n <Layouts.Content>\n {data?.docVersions.length ? (\n <Table colCount={colCount} rowCount={rowCount}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('pages.PluginPage.table.version'),\n defaultMessage: 'Version',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('pages.PluginPage.table.generated'),\n defaultMessage: 'Last Generated',\n })}\n </Typography>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {data.docVersions\n .slice(0)\n .sort((a, b) => (a.generatedDate < b.generatedDate ? 1 : -1))\n .map((doc) => (\n <Tr key={doc.version}>\n <Td width=\"50%\">\n <Typography>{doc.version}</Typography>\n </Td>\n <Td width=\"50%\">\n <Typography>{doc.generatedDate}</Typography>\n </Td>\n <Td>\n <Flex justifyContent=\"end\" onClick={(e) => e.stopPropagation()}>\n <IconButton\n tag=\"a\"\n disabled={!allowedActions.canRead}\n href={createDocumentationHref(`${data.prefix}/v${doc.version}`)}\n variant=\"ghost\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n label={formatMessage(\n {\n id: getTrad('pages.PluginPage.table.icon.show'),\n defaultMessage: 'Open {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Show />\n </IconButton>\n {allowedActions.canRegenerate ? (\n <IconButton\n onClick={() => handleRegenerateDoc(doc.version)}\n variant=\"ghost\"\n label={formatMessage(\n {\n id: getTrad('pages.PluginPage.table.icon.regenerate'),\n defaultMessage: 'Regenerate {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Reload />\n </IconButton>\n ) : null}\n {allowedActions.canUpdate && doc.version !== data.currentVersion ? (\n <IconButton\n onClick={() => handleClickDelete(doc.version)}\n variant=\"ghost\"\n label={formatMessage(\n {\n id: 'global.delete-target',\n defaultMessage: 'Delete {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Trash />\n </IconButton>\n ) : null}\n </Flex>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n ) : (\n <EmptyStateLayout content=\"\" icon={null} />\n )}\n </Layouts.Content>\n <Dialog.Root open={showConfirmDelete} onOpenChange={setShowConfirmDelete}>\n <ConfirmDialog onConfirm={handleConfirmDelete} />\n </Dialog.Root>\n </Page.Main>\n </Layouts.Root>\n );\n};\n\n/**\n * TODO: should this be fixed in the DS?\n */\nconst OpenDocLink = styled(LinkButton)`\n text-decoration: none;\n`;\n\nconst createDocumentationHref = (path: string) => {\n if (path.startsWith('http')) {\n return path;\n }\n\n if (path.startsWith('/')) {\n return `${window.strapi.backendURL}${path}`;\n }\n\n return `${window.strapi.backendURL}/${path}`;\n};\n\nexport { App };\n"],"names":["App","formatMessage","useIntl","toggleNotification","useNotification","formatAPIError","useAPIErrorHandler","data","isLoading","isLoadingInfo","isError","useGetInfoQuery","regenerate","useRegenerateDocMutation","deleteVersion","useDeleteVersionMutation","showConfirmDelete","setShowConfirmDelete","React","useState","versionToDelete","setVersionToDelete","allowedActions","isLoadingRBAC","useRBAC","PERMISSIONS","colCount","rowCount","docVersions","length","handleRegenerateDoc","version","unwrap","then","type","message","id","getTrad","defaultMessage","catch","err","handleConfirmDelete","handleClickDelete","title","_jsx","Page","Loading","Error","_jsxs","Layouts","Root","Title","Main","Header","subtitle","primaryAction","OpenDocLink","disabled","canRead","currentVersion","prefix","href","createDocumentationHref","startIcon","Show","fullWidth","Content","Table","Thead","Tr","Th","Typography","variant","textColor","Tbody","slice","sort","a","b","generatedDate","map","doc","Td","width","Flex","justifyContent","onClick","e","stopPropagation","IconButton","tag","target","rel","label","canRegenerate","Reload","canUpdate","Trash","EmptyStateLayout","content","icon","Dialog","open","onOpenChange","ConfirmDialog","onConfirm","styled","LinkButton","path","startsWith","window","strapi","backendURL"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"App.js","sources":["../../../admin/src/pages/App.tsx"],"sourcesContent":["/* eslint-disable import/no-default-export */\nimport * as React from 'react';\n\nimport {\n LinkButton,\n Flex,\n IconButton,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n Typography,\n EmptyStateLayout,\n Dialog,\n} from '@strapi/design-system';\nimport { Eye as Show, ArrowClockwise as Reload, Trash } from '@strapi/icons';\nimport {\n ConfirmDialog,\n useRBAC,\n Page,\n useAPIErrorHandler,\n useNotification,\n Layouts,\n} from '@strapi/strapi/admin';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { PERMISSIONS } from '../constants';\nimport {\n useGetInfoQuery,\n useRegenerateDocMutation,\n useDeleteVersionMutation,\n} from '../services/api';\nimport { getTrad } from '../utils';\n\nconst App = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const { data, isLoading: isLoadingInfo, isError } = useGetInfoQuery();\n const [regenerate] = useRegenerateDocMutation();\n const [deleteVersion] = useDeleteVersionMutation();\n const [showConfirmDelete, setShowConfirmDelete] = React.useState<boolean>(false);\n const [versionToDelete, setVersionToDelete] = React.useState<string>();\n const { allowedActions, isLoading: isLoadingRBAC } = useRBAC(PERMISSIONS);\n\n const isLoading = isLoadingInfo || isLoadingRBAC;\n\n const colCount = 4;\n const rowCount = (data?.docVersions?.length || 0) + 1;\n\n const handleRegenerateDoc = (version: string) => {\n regenerate({ version })\n .unwrap()\n .then(() => {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('notification.generate.success'),\n defaultMessage: 'Successfully generated documentation',\n }),\n });\n })\n .catch((err) => {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(err),\n });\n });\n };\n\n const handleShowConfirmDelete = () => {\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleConfirmDelete = async () => {\n if (!versionToDelete) {\n // nothing to delete\n return;\n }\n\n await deleteVersion({ version: versionToDelete })\n .unwrap()\n .then(() => {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('notification.delete.success'),\n defaultMessage: 'Successfully deleted documentation',\n }),\n });\n })\n .catch((err) => {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(err),\n });\n });\n\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleClickDelete = (version: string) => {\n setVersionToDelete(version);\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const title = formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: 'Documentation',\n });\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (isError) {\n return <Page.Error />;\n }\n\n return (\n <Layouts.Root>\n <Page.Title>{title}</Page.Title>\n <Page.Main>\n <Layouts.Header\n title={title}\n subtitle={formatMessage({\n id: getTrad('pages.PluginPage.header.description'),\n defaultMessage: 'Configure the documentation plugin',\n })}\n primaryAction={\n <OpenDocLink\n disabled={!allowedActions.canRead || !data?.currentVersion || !data?.prefix}\n href={createDocumentationHref(`${data?.prefix}/v${data?.currentVersion}`)}\n startIcon={<Show />}\n fullWidth\n >\n {formatMessage({\n id: getTrad('pages.PluginPage.Button.open'),\n defaultMessage: 'Open Documentation',\n })}\n </OpenDocLink>\n }\n />\n <Layouts.Content>\n {data?.docVersions.length ? (\n <Table colCount={colCount} rowCount={rowCount}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('pages.PluginPage.table.version'),\n defaultMessage: 'Version',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('pages.PluginPage.table.generated'),\n defaultMessage: 'Last Generated',\n })}\n </Typography>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {data.docVersions\n .slice(0)\n .sort((a, b) => (a.generatedDate < b.generatedDate ? 1 : -1))\n .map((doc) => (\n <Tr key={doc.version}>\n <Td width=\"50%\">\n <Typography>{doc.version}</Typography>\n </Td>\n <Td width=\"50%\">\n <Typography>{doc.generatedDate}</Typography>\n </Td>\n <Td>\n <Flex justifyContent=\"end\" onClick={(e) => e.stopPropagation()}>\n <IconButton\n tag=\"a\"\n disabled={!allowedActions.canRead}\n href={createDocumentationHref(`${data.prefix}/v${doc.version}`)}\n variant=\"ghost\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n label={formatMessage(\n {\n id: getTrad('pages.PluginPage.table.icon.show'),\n defaultMessage: 'Open {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Show />\n </IconButton>\n {allowedActions.canRegenerate ? (\n <IconButton\n onClick={() => handleRegenerateDoc(doc.version)}\n variant=\"ghost\"\n label={formatMessage(\n {\n id: getTrad('pages.PluginPage.table.icon.regenerate'),\n defaultMessage: 'Regenerate {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Reload />\n </IconButton>\n ) : null}\n {allowedActions.canUpdate && doc.version !== data.currentVersion ? (\n <IconButton\n onClick={() => handleClickDelete(doc.version)}\n variant=\"ghost\"\n label={formatMessage(\n {\n id: 'global.delete-target',\n defaultMessage: 'Delete {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Trash />\n </IconButton>\n ) : null}\n </Flex>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n ) : (\n <EmptyStateLayout content=\"\" icon={null} />\n )}\n </Layouts.Content>\n <Dialog.Root open={showConfirmDelete} onOpenChange={setShowConfirmDelete}>\n <ConfirmDialog onConfirm={handleConfirmDelete} />\n </Dialog.Root>\n </Page.Main>\n </Layouts.Root>\n );\n};\n\n/**\n * TODO: should this be fixed in the DS?\n */\nconst OpenDocLink = styled(LinkButton)`\n text-decoration: none;\n`;\n\nconst createDocumentationHref = (path: string) => {\n if (path.startsWith('http')) {\n return path;\n }\n\n if (path.startsWith('/')) {\n return `${window.strapi.backendURL}${path}`;\n }\n\n return `${window.strapi.backendURL}/${path}`;\n};\n\nexport { App };\n"],"names":["App","formatMessage","useIntl","toggleNotification","useNotification","formatAPIError","useAPIErrorHandler","data","isLoading","isLoadingInfo","isError","useGetInfoQuery","regenerate","useRegenerateDocMutation","deleteVersion","useDeleteVersionMutation","showConfirmDelete","setShowConfirmDelete","React","useState","versionToDelete","setVersionToDelete","allowedActions","isLoadingRBAC","useRBAC","PERMISSIONS","colCount","rowCount","docVersions","length","handleRegenerateDoc","version","unwrap","then","type","message","id","getTrad","defaultMessage","catch","err","handleConfirmDelete","handleClickDelete","title","_jsx","Page","Loading","Error","_jsxs","Layouts","Root","Title","Main","Header","subtitle","primaryAction","OpenDocLink","disabled","canRead","currentVersion","prefix","href","createDocumentationHref","startIcon","Show","fullWidth","Content","Table","Thead","Tr","Th","Typography","variant","textColor","Tbody","slice","sort","a","b","generatedDate","map","doc","Td","width","Flex","justifyContent","onClick","e","stopPropagation","IconButton","tag","target","rel","label","canRegenerate","Reload","canUpdate","Trash","EmptyStateLayout","content","icon","Dialog","open","onOpenChange","ConfirmDialog","onConfirm","styled","LinkButton","path","startsWith","window","strapi","backendURL"],"mappings":"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"}
|
|
@@ -8,8 +8,16 @@ var koaStatic = require('koa-static');
|
|
|
8
8
|
var utils = require('@strapi/utils');
|
|
9
9
|
var utils$1 = require('../utils.js');
|
|
10
10
|
|
|
11
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
|
|
11
13
|
function _interopNamespaceDefaultOnly (e) { return Object.freeze({ __proto__: null, default: e }); }
|
|
12
14
|
|
|
15
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
16
|
+
var bcrypt__default = /*#__PURE__*/_interopDefault(bcrypt);
|
|
17
|
+
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
18
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
19
|
+
var koaStatic__default = /*#__PURE__*/_interopDefault(koaStatic);
|
|
20
|
+
|
|
13
21
|
const validation = {
|
|
14
22
|
validateSettings: utils.validateYupSchema(utils.yup.object().shape({
|
|
15
23
|
restrictedAccess: utils.yup.boolean(),
|
|
@@ -43,23 +51,23 @@ var documentation = {
|
|
|
43
51
|
*/ const { major, minor, patch } = ctx.params;
|
|
44
52
|
const version = major && minor && patch ? `${major}.${minor}.${patch}` : utils$1.getService('documentation').getDocumentationVersion();
|
|
45
53
|
const extensionsDir = strapi.config.environment === 'production' ? strapi.dirs.dist.extensions : strapi.dirs.app.extensions;
|
|
46
|
-
const openAPISpecsPath =
|
|
54
|
+
const openAPISpecsPath = path__default.default.join(extensionsDir, 'documentation', 'documentation', version, 'full_documentation.json');
|
|
47
55
|
try {
|
|
48
|
-
const documentation =
|
|
56
|
+
const documentation = fs__default.default.readFileSync(openAPISpecsPath, 'utf8');
|
|
49
57
|
const layout = (await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('../public/index.html.js')); })).default;
|
|
50
|
-
const filledLayout =
|
|
58
|
+
const filledLayout = ___default.default.template(layout)({
|
|
51
59
|
backendUrl: strapi.config.server.url,
|
|
52
60
|
spec: JSON.stringify(JSON.parse(documentation))
|
|
53
61
|
});
|
|
54
62
|
try {
|
|
55
|
-
const layoutPath =
|
|
56
|
-
await
|
|
57
|
-
await
|
|
63
|
+
const layoutPath = path__default.default.resolve(extensionsDir, 'documentation', 'public', 'index.html');
|
|
64
|
+
await fs__default.default.ensureFile(layoutPath);
|
|
65
|
+
await fs__default.default.writeFile(layoutPath, filledLayout);
|
|
58
66
|
// Serve the file.
|
|
59
|
-
ctx.url =
|
|
67
|
+
ctx.url = path__default.default.basename(`${ctx.url}/index.html`);
|
|
60
68
|
try {
|
|
61
|
-
const staticFolder =
|
|
62
|
-
return
|
|
69
|
+
const staticFolder = path__default.default.resolve(extensionsDir, 'documentation', 'public');
|
|
70
|
+
return koaStatic__default.default(staticFolder)(ctx, next);
|
|
63
71
|
} catch (e) {
|
|
64
72
|
strapi.log.error(e);
|
|
65
73
|
}
|
|
@@ -80,19 +88,19 @@ var documentation = {
|
|
|
80
88
|
const { error } = ctx.query;
|
|
81
89
|
try {
|
|
82
90
|
const layout = (await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('../public/login.html.js')); })).default;
|
|
83
|
-
const filledLayout =
|
|
91
|
+
const filledLayout = ___default.default.template(layout.toString())({
|
|
84
92
|
actionUrl: `${strapi.config.server.url}/documentation/login`
|
|
85
93
|
});
|
|
86
94
|
const $ = cheerio.load(filledLayout);
|
|
87
|
-
$('.error').text(
|
|
95
|
+
$('.error').text(___default.default.isEmpty(error) ? '' : 'Wrong password...');
|
|
88
96
|
try {
|
|
89
|
-
const layoutPath =
|
|
90
|
-
await
|
|
91
|
-
await
|
|
92
|
-
ctx.url =
|
|
97
|
+
const layoutPath = path__default.default.resolve(strapi.dirs.app.extensions, 'documentation', 'public', 'login.html');
|
|
98
|
+
await fs__default.default.ensureFile(layoutPath);
|
|
99
|
+
await fs__default.default.writeFile(layoutPath, $.html());
|
|
100
|
+
ctx.url = path__default.default.basename(`${ctx.url}/login.html`);
|
|
93
101
|
try {
|
|
94
|
-
const staticFolder =
|
|
95
|
-
return
|
|
102
|
+
const staticFolder = path__default.default.resolve(strapi.dirs.app.extensions, 'documentation', 'public');
|
|
103
|
+
return koaStatic__default.default(staticFolder)(ctx, next);
|
|
96
104
|
} catch (e) {
|
|
97
105
|
strapi.log.error(e);
|
|
98
106
|
}
|
|
@@ -110,7 +118,7 @@ var documentation = {
|
|
|
110
118
|
name: 'documentation',
|
|
111
119
|
key: 'config'
|
|
112
120
|
}).get();
|
|
113
|
-
const isValid = await
|
|
121
|
+
const isValid = await bcrypt__default.default.compare(password, hash);
|
|
114
122
|
let querystring = '?error=password';
|
|
115
123
|
if (isValid && ctx.session) {
|
|
116
124
|
ctx.session.documentation = {
|
|
@@ -124,7 +132,7 @@ var documentation = {
|
|
|
124
132
|
const { version } = ctx.request.body;
|
|
125
133
|
const service = utils$1.getService('documentation');
|
|
126
134
|
const documentationVersions = service.getDocumentationVersions().map((el)=>el.version);
|
|
127
|
-
if (
|
|
135
|
+
if (___default.default.isEmpty(version)) {
|
|
128
136
|
return ctx.badRequest('Please provide a version.');
|
|
129
137
|
}
|
|
130
138
|
if (!documentationVersions.includes(version)) {
|
|
@@ -144,7 +152,7 @@ var documentation = {
|
|
|
144
152
|
const { version } = ctx.params;
|
|
145
153
|
const service = utils$1.getService('documentation');
|
|
146
154
|
const documentationVersions = service.getDocumentationVersions().map((el)=>el.version);
|
|
147
|
-
if (
|
|
155
|
+
if (___default.default.isEmpty(version)) {
|
|
148
156
|
return ctx.badRequest('Please provide a version.');
|
|
149
157
|
}
|
|
150
158
|
if (!documentationVersions.includes(version)) {
|
|
@@ -170,7 +178,7 @@ var documentation = {
|
|
|
170
178
|
restrictedAccess: Boolean(data.restrictedAccess)
|
|
171
179
|
};
|
|
172
180
|
if (data.password) {
|
|
173
|
-
config.password = await
|
|
181
|
+
config.password = await bcrypt__default.default.hash(data.password, 10);
|
|
174
182
|
}
|
|
175
183
|
await pluginStore.set({
|
|
176
184
|
key: 'config',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documentation.js","sources":["../../../server/src/controllers/documentation.ts"],"sourcesContent":["import path from 'path';\nimport bcrypt from 'bcryptjs';\nimport fs from 'fs-extra';\nimport _ from 'lodash';\nimport koaStatic from 'koa-static';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type Koa from 'koa';\nimport type {} from 'koa-body';\n\nimport { getService } from '../utils';\nimport type { Config } from '../types';\n\nconst validation = {\n validateSettings: validateYupSchema(\n yup.object().shape({\n restrictedAccess: yup.boolean(),\n password: yup\n .string()\n .min(8)\n .matches(/[a-z]/, '${path} must contain at least one lowercase character')\n .matches(/[A-Z]/, '${path} must contain at least one uppercase character')\n .matches(/\\d/, '${path} must contain at least one number')\n .when('restrictedAccess', (value, initSchema) => {\n return value ? initSchema.required('password is required') : initSchema;\n }),\n })\n ),\n};\n\nexport default {\n async getInfos(ctx: Koa.Context) {\n try {\n const docService = getService('documentation');\n const docVersions = docService.getDocumentationVersions();\n const documentationAccess = await docService.getDocumentationAccess();\n\n ctx.send({\n docVersions,\n currentVersion: docService.getDocumentationVersion(),\n prefix: '/documentation',\n documentationAccess,\n });\n } catch (err) {\n strapi.log.error(err);\n ctx.badRequest();\n }\n },\n\n async index(ctx: Koa.Context, next: Koa.Next) {\n try {\n /**\n * We don't expose the specs using koa-static or something else due to security reasons.\n * That's why, we need to read the file localy and send the specs through it when we serve the Swagger UI.\n */\n const { major, minor, patch } = ctx.params;\n const version =\n major && minor && patch\n ? `${major}.${minor}.${patch}`\n : getService('documentation').getDocumentationVersion();\n\n const extensionsDir =\n strapi.config.environment === 'production'\n ? strapi.dirs.dist.extensions\n : strapi.dirs.app.extensions;\n\n const openAPISpecsPath = path.join(\n extensionsDir,\n 'documentation',\n 'documentation',\n version,\n 'full_documentation.json'\n );\n\n try {\n const documentation = fs.readFileSync(openAPISpecsPath, 'utf8');\n\n const layout = (await import('../public/index.html')).default;\n\n const filledLayout = _.template(layout)({\n backendUrl: strapi.config.server.url,\n spec: JSON.stringify(JSON.parse(documentation)),\n });\n\n try {\n const layoutPath = path.resolve(extensionsDir, 'documentation', 'public', 'index.html');\n await fs.ensureFile(layoutPath);\n await fs.writeFile(layoutPath, filledLayout);\n\n // Serve the file.\n ctx.url = path.basename(`${ctx.url}/index.html`);\n\n try {\n const staticFolder = path.resolve(extensionsDir, 'documentation', 'public');\n return koaStatic(staticFolder)(ctx, next);\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n },\n\n async loginView(ctx: Koa.Context, next: Koa.Next) {\n // lazy require cheerio\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const cheerio = require('cheerio');\n\n const { error } = ctx.query;\n\n try {\n const layout = (await import('../public/login.html')).default;\n\n const filledLayout = _.template(layout.toString())({\n actionUrl: `${strapi.config.server.url}/documentation/login`,\n });\n\n const $ = cheerio.load(filledLayout);\n\n $('.error').text(_.isEmpty(error) ? '' : 'Wrong password...');\n\n try {\n const layoutPath = path.resolve(\n strapi.dirs.app.extensions,\n 'documentation',\n 'public',\n 'login.html'\n );\n await fs.ensureFile(layoutPath);\n await fs.writeFile(layoutPath, $.html());\n\n ctx.url = path.basename(`${ctx.url}/login.html`);\n\n try {\n const staticFolder = path.resolve(strapi.dirs.app.extensions, 'documentation', 'public');\n return koaStatic(staticFolder)(ctx, next);\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n },\n\n async login(ctx: Koa.Context) {\n const {\n body: { password },\n } = ctx.request;\n\n const { password: hash } = (await strapi\n .store({ type: 'plugin', name: 'documentation', key: 'config' })\n .get()) as { password: string };\n\n const isValid = await bcrypt.compare(password, hash);\n\n let querystring = '?error=password';\n\n if (isValid && ctx.session) {\n ctx.session.documentation = {\n logged: true,\n };\n\n querystring = '';\n }\n\n ctx.redirect(`${strapi.config.server.url}/documentation${querystring}`);\n },\n\n async regenerateDoc(ctx: Koa.Context) {\n const { version } = ctx.request.body;\n\n const service = getService('documentation');\n\n const documentationVersions = service.getDocumentationVersions().map((el) => el.version);\n\n if (_.isEmpty(version)) {\n return ctx.badRequest('Please provide a version.');\n }\n\n if (!documentationVersions.includes(version)) {\n return ctx.badRequest('The version you are trying to generate does not exist.');\n }\n\n try {\n strapi.reload.isWatching = false;\n await service.generateFullDoc(version);\n ctx.send({ ok: true });\n } finally {\n strapi.reload.isWatching = true;\n }\n },\n\n async deleteDoc(ctx: Koa.Context) {\n const { version } = ctx.params;\n\n const service = getService('documentation');\n\n const documentationVersions = service.getDocumentationVersions().map((el) => el.version);\n\n if (_.isEmpty(version)) {\n return ctx.badRequest('Please provide a version.');\n }\n\n if (!documentationVersions.includes(version)) {\n return ctx.badRequest('The version you are trying to delete does not exist.');\n }\n\n try {\n strapi.reload.isWatching = false;\n await service.deleteDocumentation(version);\n ctx.send({ ok: true });\n } finally {\n strapi.reload.isWatching = true;\n }\n },\n\n async updateSettings(ctx: Koa.Context) {\n const pluginStore = strapi.store({ type: 'plugin', name: 'documentation' });\n\n const data = await validation.validateSettings(ctx.request.body);\n\n const config: Config = {\n restrictedAccess: Boolean(data.restrictedAccess),\n };\n\n if (data.password) {\n config.password = await bcrypt.hash(data.password, 10);\n }\n\n await pluginStore.set({ key: 'config', value: config });\n\n return ctx.send({ ok: true });\n },\n};\n"],"names":["validation","validateSettings","validateYupSchema","yup","object","shape","restrictedAccess","boolean","password","string","min","matches","when","value","initSchema","required","getInfos","ctx","docService","getService","docVersions","getDocumentationVersions","documentationAccess","getDocumentationAccess","send","currentVersion","getDocumentationVersion","prefix","err","strapi","log","error","badRequest","index","next","major","minor","patch","params","version","extensionsDir","config","environment","dirs","dist","extensions","app","openAPISpecsPath","path","join","documentation","fs","readFileSync","layout","default","filledLayout","_","template","backendUrl","server","url","spec","JSON","stringify","parse","layoutPath","resolve","ensureFile","writeFile","basename","staticFolder","koaStatic","e","loginView","cheerio","require","query","toString","actionUrl","$","load","text","isEmpty","html","login","body","request","hash","store","type","name","key","get","isValid","bcrypt","compare","querystring","session","logged","redirect","regenerateDoc","service","documentationVersions","map","el","includes","reload","isWatching","generateFullDoc","ok","deleteDoc","deleteDocumentation","updateSettings","pluginStore","data","Boolean","set"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"documentation.js","sources":["../../../server/src/controllers/documentation.ts"],"sourcesContent":["import path from 'path';\nimport bcrypt from 'bcryptjs';\nimport fs from 'fs-extra';\nimport _ from 'lodash';\nimport koaStatic from 'koa-static';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type Koa from 'koa';\nimport type {} from 'koa-body';\n\nimport { getService } from '../utils';\nimport type { Config } from '../types';\n\nconst validation = {\n validateSettings: validateYupSchema(\n yup.object().shape({\n restrictedAccess: yup.boolean(),\n password: yup\n .string()\n .min(8)\n .matches(/[a-z]/, '${path} must contain at least one lowercase character')\n .matches(/[A-Z]/, '${path} must contain at least one uppercase character')\n .matches(/\\d/, '${path} must contain at least one number')\n .when('restrictedAccess', (value, initSchema) => {\n return value ? initSchema.required('password is required') : initSchema;\n }),\n })\n ),\n};\n\nexport default {\n async getInfos(ctx: Koa.Context) {\n try {\n const docService = getService('documentation');\n const docVersions = docService.getDocumentationVersions();\n const documentationAccess = await docService.getDocumentationAccess();\n\n ctx.send({\n docVersions,\n currentVersion: docService.getDocumentationVersion(),\n prefix: '/documentation',\n documentationAccess,\n });\n } catch (err) {\n strapi.log.error(err);\n ctx.badRequest();\n }\n },\n\n async index(ctx: Koa.Context, next: Koa.Next) {\n try {\n /**\n * We don't expose the specs using koa-static or something else due to security reasons.\n * That's why, we need to read the file localy and send the specs through it when we serve the Swagger UI.\n */\n const { major, minor, patch } = ctx.params;\n const version =\n major && minor && patch\n ? `${major}.${minor}.${patch}`\n : getService('documentation').getDocumentationVersion();\n\n const extensionsDir =\n strapi.config.environment === 'production'\n ? strapi.dirs.dist.extensions\n : strapi.dirs.app.extensions;\n\n const openAPISpecsPath = path.join(\n extensionsDir,\n 'documentation',\n 'documentation',\n version,\n 'full_documentation.json'\n );\n\n try {\n const documentation = fs.readFileSync(openAPISpecsPath, 'utf8');\n\n const layout = (await import('../public/index.html')).default;\n\n const filledLayout = _.template(layout)({\n backendUrl: strapi.config.server.url,\n spec: JSON.stringify(JSON.parse(documentation)),\n });\n\n try {\n const layoutPath = path.resolve(extensionsDir, 'documentation', 'public', 'index.html');\n await fs.ensureFile(layoutPath);\n await fs.writeFile(layoutPath, filledLayout);\n\n // Serve the file.\n ctx.url = path.basename(`${ctx.url}/index.html`);\n\n try {\n const staticFolder = path.resolve(extensionsDir, 'documentation', 'public');\n return koaStatic(staticFolder)(ctx, next);\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n },\n\n async loginView(ctx: Koa.Context, next: Koa.Next) {\n // lazy require cheerio\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const cheerio = require('cheerio');\n\n const { error } = ctx.query;\n\n try {\n const layout = (await import('../public/login.html')).default;\n\n const filledLayout = _.template(layout.toString())({\n actionUrl: `${strapi.config.server.url}/documentation/login`,\n });\n\n const $ = cheerio.load(filledLayout);\n\n $('.error').text(_.isEmpty(error) ? '' : 'Wrong password...');\n\n try {\n const layoutPath = path.resolve(\n strapi.dirs.app.extensions,\n 'documentation',\n 'public',\n 'login.html'\n );\n await fs.ensureFile(layoutPath);\n await fs.writeFile(layoutPath, $.html());\n\n ctx.url = path.basename(`${ctx.url}/login.html`);\n\n try {\n const staticFolder = path.resolve(strapi.dirs.app.extensions, 'documentation', 'public');\n return koaStatic(staticFolder)(ctx, next);\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n },\n\n async login(ctx: Koa.Context) {\n const {\n body: { password },\n } = ctx.request;\n\n const { password: hash } = (await strapi\n .store({ type: 'plugin', name: 'documentation', key: 'config' })\n .get()) as { password: string };\n\n const isValid = await bcrypt.compare(password, hash);\n\n let querystring = '?error=password';\n\n if (isValid && ctx.session) {\n ctx.session.documentation = {\n logged: true,\n };\n\n querystring = '';\n }\n\n ctx.redirect(`${strapi.config.server.url}/documentation${querystring}`);\n },\n\n async regenerateDoc(ctx: Koa.Context) {\n const { version } = ctx.request.body;\n\n const service = getService('documentation');\n\n const documentationVersions = service.getDocumentationVersions().map((el) => el.version);\n\n if (_.isEmpty(version)) {\n return ctx.badRequest('Please provide a version.');\n }\n\n if (!documentationVersions.includes(version)) {\n return ctx.badRequest('The version you are trying to generate does not exist.');\n }\n\n try {\n strapi.reload.isWatching = false;\n await service.generateFullDoc(version);\n ctx.send({ ok: true });\n } finally {\n strapi.reload.isWatching = true;\n }\n },\n\n async deleteDoc(ctx: Koa.Context) {\n const { version } = ctx.params;\n\n const service = getService('documentation');\n\n const documentationVersions = service.getDocumentationVersions().map((el) => el.version);\n\n if (_.isEmpty(version)) {\n return ctx.badRequest('Please provide a version.');\n }\n\n if (!documentationVersions.includes(version)) {\n return ctx.badRequest('The version you are trying to delete does not exist.');\n }\n\n try {\n strapi.reload.isWatching = false;\n await service.deleteDocumentation(version);\n ctx.send({ ok: true });\n } finally {\n strapi.reload.isWatching = true;\n }\n },\n\n async updateSettings(ctx: Koa.Context) {\n const pluginStore = strapi.store({ type: 'plugin', name: 'documentation' });\n\n const data = await validation.validateSettings(ctx.request.body);\n\n const config: Config = {\n restrictedAccess: Boolean(data.restrictedAccess),\n };\n\n if (data.password) {\n config.password = await bcrypt.hash(data.password, 10);\n }\n\n await pluginStore.set({ key: 'config', value: config });\n\n return ctx.send({ ok: true });\n },\n};\n"],"names":["validation","validateSettings","validateYupSchema","yup","object","shape","restrictedAccess","boolean","password","string","min","matches","when","value","initSchema","required","getInfos","ctx","docService","getService","docVersions","getDocumentationVersions","documentationAccess","getDocumentationAccess","send","currentVersion","getDocumentationVersion","prefix","err","strapi","log","error","badRequest","index","next","major","minor","patch","params","version","extensionsDir","config","environment","dirs","dist","extensions","app","openAPISpecsPath","path","join","documentation","fs","readFileSync","layout","default","filledLayout","_","template","backendUrl","server","url","spec","JSON","stringify","parse","layoutPath","resolve","ensureFile","writeFile","basename","staticFolder","koaStatic","e","loginView","cheerio","require","query","toString","actionUrl","$","load","text","isEmpty","html","login","body","request","hash","store","type","name","key","get","isValid","bcrypt","compare","querystring","session","logged","redirect","regenerateDoc","service","documentationVersions","map","el","includes","reload","isWatching","generateFullDoc","ok","deleteDoc","deleteDocumentation","updateSettings","pluginStore","data","Boolean","set"],"mappings":"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"}
|
|
@@ -4,14 +4,20 @@ var path = require('path');
|
|
|
4
4
|
var koaStatic = require('koa-static');
|
|
5
5
|
var swaggerUi = require('swagger-ui-dist');
|
|
6
6
|
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
10
|
+
var koaStatic__default = /*#__PURE__*/_interopDefault(koaStatic);
|
|
11
|
+
var swaggerUi__default = /*#__PURE__*/_interopDefault(swaggerUi);
|
|
12
|
+
|
|
7
13
|
const addDocumentMiddlewares = async ({ strapi })=>{
|
|
8
14
|
strapi.server.routes([
|
|
9
15
|
{
|
|
10
16
|
method: 'GET',
|
|
11
17
|
path: '/plugins/documentation/(.*)',
|
|
12
18
|
async handler (ctx, next) {
|
|
13
|
-
ctx.url =
|
|
14
|
-
return
|
|
19
|
+
ctx.url = path__default.default.basename(ctx.url);
|
|
20
|
+
return koaStatic__default.default(swaggerUi__default.default.getAbsoluteFSPath(), {
|
|
15
21
|
maxage: 86400000,
|
|
16
22
|
defer: true
|
|
17
23
|
})(ctx, next);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documentation.js","sources":["../../../server/src/middlewares/documentation.ts"],"sourcesContent":["import path from 'path';\nimport koaStatic from 'koa-static';\nimport swaggerUi from 'swagger-ui-dist';\n\nimport type { Core } from '@strapi/types';\n\nexport const addDocumentMiddlewares = async ({ strapi }: { strapi: Core.Strapi }) => {\n strapi.server.routes([\n {\n method: 'GET',\n path: '/plugins/documentation/(.*)',\n async handler(ctx, next) {\n ctx.url = path.basename(ctx.url);\n\n return koaStatic(swaggerUi.getAbsoluteFSPath(), {\n maxage: 86400000,\n defer: true,\n })(ctx, next);\n },\n config: {\n auth: false,\n },\n },\n ]);\n};\n"],"names":["addDocumentMiddlewares","strapi","server","routes","method","path","handler","ctx","next","url","basename","koaStatic","swaggerUi","getAbsoluteFSPath","maxage","defer","config","auth"],"mappings":"
|
|
1
|
+
{"version":3,"file":"documentation.js","sources":["../../../server/src/middlewares/documentation.ts"],"sourcesContent":["import path from 'path';\nimport koaStatic from 'koa-static';\nimport swaggerUi from 'swagger-ui-dist';\n\nimport type { Core } from '@strapi/types';\n\nexport const addDocumentMiddlewares = async ({ strapi }: { strapi: Core.Strapi }) => {\n strapi.server.routes([\n {\n method: 'GET',\n path: '/plugins/documentation/(.*)',\n async handler(ctx, next) {\n ctx.url = path.basename(ctx.url);\n\n return koaStatic(swaggerUi.getAbsoluteFSPath(), {\n maxage: 86400000,\n defer: true,\n })(ctx, next);\n },\n config: {\n auth: false,\n },\n },\n ]);\n};\n"],"names":["addDocumentMiddlewares","strapi","server","routes","method","path","handler","ctx","next","url","basename","koaStatic","swaggerUi","getAbsoluteFSPath","maxage","defer","config","auth"],"mappings":";;;;;;;;;;;;AAMO,MAAMA,sBAAAA,GAAyB,OAAO,EAAEC,MAAM,EAA2B,GAAA;IAC9EA,MAAAA,CAAOC,MAAM,CAACC,MAAM,CAAC;AACnB,QAAA;YACEC,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,6BAAA;YACN,MAAMC,OAAAA,CAAAA,CAAQC,GAAG,EAAEC,IAAI,EAAA;AACrBD,gBAAAA,GAAAA,CAAIE,GAAG,GAAGJ,qBAAAA,CAAKK,QAAQ,CAACH,IAAIE,GAAG,CAAA;gBAE/B,OAAOE,0BAAAA,CAAUC,0BAAAA,CAAUC,iBAAiB,EAAA,EAAI;oBAC9CC,MAAAA,EAAQ,QAAA;oBACRC,KAAAA,EAAO;AACT,iBAAA,CAAA,CAAGR,GAAAA,EAAKC,IAAAA,CAAAA;AACV,YAAA,CAAA;YACAQ,MAAAA,EAAQ;gBACNC,IAAAA,EAAM;AACR;AACF;AACD,KAAA,CAAA;AACH;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var index = "<!-- HTML for static distribution bundle build --><!
|
|
3
|
+
var index = "<!-- HTML for static distribution bundle build --><!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <title>Swagger UI</title>\n <link rel=\"stylesheet\" type=\"text/css\" href=\"<%=backendUrl%>/plugins/documentation/swagger-ui.css\">\n <link rel=\"icon\" type=\"image/png\" href=\"<%=backendUrl%>/plugins/documentation/favicon-32x32.png\" sizes=\"32x32\">\n <link rel=\"icon\" type=\"image/png\" href=\"<%=backendUrl%>/plugins/documentation/favicon-16x16.png\" sizes=\"16x16\">\n <style>\n html {\n box-sizing: border-box;\n overflow: -moz-scrollbars-vertical;\n overflow-y: scroll;\n }\n\n *,\n *:before,\n *:after {\n box-sizing: inherit;\n }\n\n body {\n margin: 0;\n background: #fafafa;\n }\n </style>\n </head>\n\n <body>\n <div id=\"swagger-ui\"></div>\n <script class=\"custom-swagger-ui\">\n window.onload = function() {\n const ui = SwaggerUIBundle({\n url: \"https://petstore.swagger.io/v2/swagger.json\",\n spec: <%=spec%>,\n dom_id: '#swagger-ui',\n docExpansion: \"none\",\n deepLinking: true,\n presets: [\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset,\n ],\n plugins: [\n SwaggerUIBundle.plugins.DownloadUrl,\n ],\n layout: \"StandaloneLayout\",\n });\n\n window.ui = ui;\n }\n </script>\n\n <script src=\"<%=backendUrl%>/plugins/documentation/swagger-ui-bundle.js\"></script>\n <script src=\"<%=backendUrl%>/plugins/documentation/swagger-ui-standalone-preset.js\"></script>\n </body>\n</html>\n";
|
|
4
4
|
|
|
5
5
|
module.exports = index;
|
|
6
6
|
//# sourceMappingURL=index.html.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var index = "<!-- HTML for static distribution bundle build --><!
|
|
1
|
+
var index = "<!-- HTML for static distribution bundle build --><!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <title>Swagger UI</title>\n <link rel=\"stylesheet\" type=\"text/css\" href=\"<%=backendUrl%>/plugins/documentation/swagger-ui.css\">\n <link rel=\"icon\" type=\"image/png\" href=\"<%=backendUrl%>/plugins/documentation/favicon-32x32.png\" sizes=\"32x32\">\n <link rel=\"icon\" type=\"image/png\" href=\"<%=backendUrl%>/plugins/documentation/favicon-16x16.png\" sizes=\"16x16\">\n <style>\n html {\n box-sizing: border-box;\n overflow: -moz-scrollbars-vertical;\n overflow-y: scroll;\n }\n\n *,\n *:before,\n *:after {\n box-sizing: inherit;\n }\n\n body {\n margin: 0;\n background: #fafafa;\n }\n </style>\n </head>\n\n <body>\n <div id=\"swagger-ui\"></div>\n <script class=\"custom-swagger-ui\">\n window.onload = function() {\n const ui = SwaggerUIBundle({\n url: \"https://petstore.swagger.io/v2/swagger.json\",\n spec: <%=spec%>,\n dom_id: '#swagger-ui',\n docExpansion: \"none\",\n deepLinking: true,\n presets: [\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset,\n ],\n plugins: [\n SwaggerUIBundle.plugins.DownloadUrl,\n ],\n layout: \"StandaloneLayout\",\n });\n\n window.ui = ui;\n }\n </script>\n\n <script src=\"<%=backendUrl%>/plugins/documentation/swagger-ui-bundle.js\"></script>\n <script src=\"<%=backendUrl%>/plugins/documentation/swagger-ui-standalone-preset.js\"></script>\n </body>\n</html>\n";
|
|
2
2
|
|
|
3
3
|
export { index as default };
|
|
4
4
|
//# sourceMappingURL=index.html.mjs.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var login = "<!
|
|
3
|
+
var login = "<!doctype html>\n<html>\n <head>\n <title>Login - Documentation</title>\n <link href=\"https://fonts.googleapis.com/css?family=Lato:400,700\" rel=\"stylesheet\">\n <style>\n html {\n font-size: 62.5%;\n height: 100%;\n margin: 0;\n padding: 0;\n }\n\n body {\n height: 100%;\n margin: 0;\n background-color: #ffffff;\n font-family: 'Lato';\n font-size: 1.4rem;\n font-weight: 400;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .login {\n height: 100%;\n background-color: #f6f9fc;\n }\n\n .login .login-form {\n height: calc(100% - 70px);\n padding: 68px 0 0;\n text-align: center;\n }\n\n .login .login-form form {\n position: relative;\n max-width: 460px;\n padding: 26px 30px;\n margin: 55px auto 0;\n background-color: #ffffff;\n border-radius: 3px;\n box-shadow: 0px 2px 4px rgba(91, 107, 174, 0.15);\n text-align: center;\n }\n\n .login .login-form form:before {\n position: absolute;\n content: '';\n top: 0px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 2px;\n background-color: #2b66cc;\n }\n\n .login .login-form form .error {\n display: block;\n color: #ff4e00;\n padding-bottom: 20px;\n }\n\n .login .login-form .sub-title {\n margin-top: 35px;\n font-size: 1.6rem;\n font-weight: 400;\n }\n\n .login .login-form .logo {\n max-height: 40px;\n }\n\n .login .login-form form label {\n display: block;\n margin-bottom: 18px;\n width: 100%;\n text-align: left;\n font-weight: 600;\n }\n\n .login .login-form form input {\n outline: none;\n width: calc(100% - 30px);\n height: 36px;\n padding: 0 15px;\n border: 1px solid #ececec;\n border-radius: 2px;\n margin-bottom: 20px;\n line-height: 36px;\n text-align: left;\n }\n\n .login .login-form form input[type='submit'] {\n cursor: pointer;\n display: inline-block;\n width: auto;\n margin: 12px auto 0;\n padding: 0 75px;\n background: transparent;\n border-radius: 36px;\n border: 1px solid #2b66cc;\n color: #2b66cc;\n text-transform: uppercase;\n font-size: 1.4rem;\n font-weight: 700;\n transition: all 0.2s ease-out;\n }\n\n .login .login-form form input[type='submit']:hover {\n background: #2b66cc;\n color: #ffffff;\n }\n </style>\n </head>\n <body>\n <div class=\"login\">\n <section class=\"login-form\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-lg-6 col-lg-offset-3 col-md-12\">\n <img alt=\"Strapi logo\" class=\"logo\" src=\"https://strapi.io/assets/images/logo_login.png\">\n <h2 class=\"sub-title\">Enter the password to access the documentation.</h2>\n <form method=\"post\" action=\"<%=actionUrl%>\">\n <span class=\"error\">Wrong password...</span>\n <label>Password</label>\n <input type=\"password\" name=\"password\" placeholder=\"•••••••••\">\n <input type=\"submit\" value=\"Login\">\n </form>\n </div>\n </div>\n </div>\n </section>\n </div>\n </body>\n</html>\n";
|
|
4
4
|
|
|
5
5
|
module.exports = login;
|
|
6
6
|
//# sourceMappingURL=login.html.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var login = "<!
|
|
1
|
+
var login = "<!doctype html>\n<html>\n <head>\n <title>Login - Documentation</title>\n <link href=\"https://fonts.googleapis.com/css?family=Lato:400,700\" rel=\"stylesheet\">\n <style>\n html {\n font-size: 62.5%;\n height: 100%;\n margin: 0;\n padding: 0;\n }\n\n body {\n height: 100%;\n margin: 0;\n background-color: #ffffff;\n font-family: 'Lato';\n font-size: 1.4rem;\n font-weight: 400;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .login {\n height: 100%;\n background-color: #f6f9fc;\n }\n\n .login .login-form {\n height: calc(100% - 70px);\n padding: 68px 0 0;\n text-align: center;\n }\n\n .login .login-form form {\n position: relative;\n max-width: 460px;\n padding: 26px 30px;\n margin: 55px auto 0;\n background-color: #ffffff;\n border-radius: 3px;\n box-shadow: 0px 2px 4px rgba(91, 107, 174, 0.15);\n text-align: center;\n }\n\n .login .login-form form:before {\n position: absolute;\n content: '';\n top: 0px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 2px;\n background-color: #2b66cc;\n }\n\n .login .login-form form .error {\n display: block;\n color: #ff4e00;\n padding-bottom: 20px;\n }\n\n .login .login-form .sub-title {\n margin-top: 35px;\n font-size: 1.6rem;\n font-weight: 400;\n }\n\n .login .login-form .logo {\n max-height: 40px;\n }\n\n .login .login-form form label {\n display: block;\n margin-bottom: 18px;\n width: 100%;\n text-align: left;\n font-weight: 600;\n }\n\n .login .login-form form input {\n outline: none;\n width: calc(100% - 30px);\n height: 36px;\n padding: 0 15px;\n border: 1px solid #ececec;\n border-radius: 2px;\n margin-bottom: 20px;\n line-height: 36px;\n text-align: left;\n }\n\n .login .login-form form input[type='submit'] {\n cursor: pointer;\n display: inline-block;\n width: auto;\n margin: 12px auto 0;\n padding: 0 75px;\n background: transparent;\n border-radius: 36px;\n border: 1px solid #2b66cc;\n color: #2b66cc;\n text-transform: uppercase;\n font-size: 1.4rem;\n font-weight: 700;\n transition: all 0.2s ease-out;\n }\n\n .login .login-form form input[type='submit']:hover {\n background: #2b66cc;\n color: #ffffff;\n }\n </style>\n </head>\n <body>\n <div class=\"login\">\n <section class=\"login-form\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-lg-6 col-lg-offset-3 col-md-12\">\n <img alt=\"Strapi logo\" class=\"logo\" src=\"https://strapi.io/assets/images/logo_login.png\">\n <h2 class=\"sub-title\">Enter the password to access the documentation.</h2>\n <form method=\"post\" action=\"<%=actionUrl%>\">\n <span class=\"error\">Wrong password...</span>\n <label>Password</label>\n <input type=\"password\" name=\"password\" placeholder=\"•••••••••\">\n <input type=\"submit\" value=\"Login\">\n </form>\n </div>\n </div>\n </div>\n </section>\n </div>\n </body>\n</html>\n";
|
|
2
2
|
|
|
3
3
|
export { login as default };
|
|
4
4
|
//# sourceMappingURL=login.html.mjs.map
|
|
@@ -8,6 +8,11 @@ var buildComponentSchema = require('./helpers/build-component-schema.js');
|
|
|
8
8
|
var getPluginsThatNeedDocumentation = require('./utils/get-plugins-that-need-documentation.js');
|
|
9
9
|
var utils = require('../utils.js');
|
|
10
10
|
|
|
11
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
|
|
13
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
14
|
+
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
15
|
+
|
|
11
16
|
const createService = ({ strapi })=>{
|
|
12
17
|
const config = strapi.config.get('plugin::documentation');
|
|
13
18
|
const pluginsThatNeedDocumentation = getPluginsThatNeedDocumentation.getPluginsThatNeedDocumentation(config);
|
|
@@ -20,13 +25,13 @@ const createService = ({ strapi })=>{
|
|
|
20
25
|
// In production, documentation files live under dist/src/extensions/
|
|
21
26
|
// after the build step. Use dist.extensions for reading.
|
|
22
27
|
const extensionsDir = strapi.config.environment === 'production' ? strapi.dirs.dist.extensions : strapi.dirs.app.extensions;
|
|
23
|
-
return
|
|
28
|
+
return path__default.default.join(extensionsDir, 'documentation', 'documentation');
|
|
24
29
|
},
|
|
25
30
|
getDocumentationVersions () {
|
|
26
|
-
return
|
|
31
|
+
return fs__default.default.readdirSync(this.getFullDocumentationPath()).map((version)=>{
|
|
27
32
|
try {
|
|
28
|
-
const filePath =
|
|
29
|
-
const doc = JSON.parse(
|
|
33
|
+
const filePath = path__default.default.resolve(this.getFullDocumentationPath(), version, 'full_documentation.json');
|
|
34
|
+
const doc = JSON.parse(fs__default.default.readFileSync(filePath).toString());
|
|
30
35
|
const generatedDate = doc.info['x-generation-date'];
|
|
31
36
|
return {
|
|
32
37
|
version,
|
|
@@ -55,17 +60,17 @@ const createService = ({ strapi })=>{
|
|
|
55
60
|
const isProduction = strapi.config.environment === 'production';
|
|
56
61
|
if (api.getter === 'plugin') {
|
|
57
62
|
const extensionsDir = isProduction ? strapi.dirs.dist.extensions : strapi.dirs.app.extensions;
|
|
58
|
-
return
|
|
63
|
+
return path__default.default.join(extensionsDir, api.name, 'documentation');
|
|
59
64
|
}
|
|
60
65
|
const apiDir = isProduction ? strapi.dirs.dist.api : strapi.dirs.app.api;
|
|
61
|
-
return
|
|
66
|
+
return path__default.default.join(apiDir, api.name, 'documentation');
|
|
62
67
|
},
|
|
63
68
|
async deleteDocumentation (version) {
|
|
64
69
|
const apis = this.getPluginAndApiInfo();
|
|
65
70
|
for (const api of apis){
|
|
66
|
-
await
|
|
71
|
+
await fs__default.default.remove(path__default.default.join(this.getApiDocumentationPath(api), version));
|
|
67
72
|
}
|
|
68
|
-
await
|
|
73
|
+
await fs__default.default.remove(path__default.default.join(this.getFullDocumentationPath(), version));
|
|
69
74
|
},
|
|
70
75
|
getPluginAndApiInfo () {
|
|
71
76
|
const pluginsToDocument = pluginsThatNeedDocumentation.map((plugin)=>{
|
|
@@ -174,10 +179,10 @@ const createService = ({ strapi })=>{
|
|
|
174
179
|
const userMutatesDocumentation = config['x-strapi-config'].mutateDocumentation;
|
|
175
180
|
const finalDocumentation = userMutatesDocumentation ? immer.produce(generatedDocumentation, userMutatesDocumentation) : generatedDocumentation;
|
|
176
181
|
// Get the file path for the final documentation
|
|
177
|
-
const fullDocJsonPath =
|
|
182
|
+
const fullDocJsonPath = path__default.default.join(this.getFullDocumentationPath(), version, 'full_documentation.json');
|
|
178
183
|
// Write the documentation to the file system
|
|
179
|
-
await
|
|
180
|
-
await
|
|
184
|
+
await fs__default.default.ensureFile(fullDocJsonPath);
|
|
185
|
+
await fs__default.default.writeJson(fullDocJsonPath, finalDocumentation, {
|
|
181
186
|
spaces: 2
|
|
182
187
|
});
|
|
183
188
|
}
|