{"version":3,"file":"index.mjs","sources":["../../server/utils/index.js","../../server/bootstrap.js","../../server/utils/enabledContentTypes.ts","../../server/register.js","../../server/services/query.js","../../server/services/core.js","../../server/services/settings.js","../../server/services/lifecycle.js","../../server/services/index.js","../../server/routes/admin.js","../../server/routes/content-api.js","../../server/routes/index.js","../../server/config.js","../../server/controllers/core.js","../../server/controllers/settings.js","../../server/controllers/index.js","../../server/content-types/index.js","../../server/index.js"],"sourcesContent":["'use strict';\n\nexport const getCoreStore = () => {\n  return strapi.store({ type: 'plugin', name: 'webtools-addon-sitemap' });\n};\n\nexport const getService = (name) => {\n  return strapi.plugin('webtools-addon-sitemap').service(name);\n};\n\nexport const logMessage = (msg = '') => `[webtools-addon-sitemap]: ${msg}`;\n\nexport const noLimit = async (strapi, queryString, parameters, limit = 5000) => {\n  let entries = [];\n  const amountOfEntries = await strapi.entityService.count(queryString, parameters);\n\n  for (let i = 0; i < (amountOfEntries / limit); i++) {\n    /* eslint-disable-next-line */\n    const chunk = await strapi.entityService.findMany(queryString, {\n      ...parameters,\n      limit: limit,\n      start: (i * limit),\n    });\n    if (chunk.id) {\n      entries = [chunk, ...entries];\n    } else {\n      entries = [...chunk, ...entries];\n    }\n  }\n\n  return entries;\n};\n\nexport const isValidUrl = (url) => {\n  try {\n    // eslint-disable-next-line no-new\n    new URL(url);\n    return true;\n  } catch (err) {\n    return false;\n  }\n};\n","import { logMessage, getService } from './utils';\n\nexport default async () => {\n  const sitemap = strapi.plugin('webtools-addon-sitemap');\n  const cron = strapi.config.get('plugin.webtools-addon-sitemap.cron');\n\n  try {\n    // Give the public role permissions to access the public API endpoints.\n    if (strapi.plugin('users-permissions')) {\n      const roles = await strapi\n        .service('plugin::users-permissions.role')\n        .find();\n\n      const publicId = roles.filter((role) => role.type === 'public')[0]?.id;\n\n      if (publicId) {\n        const _public = await strapi\n          .service('plugin::users-permissions.role')\n          .findOne(publicId);\n\n        _public.permissions['plugin::webtools-addon-sitemap'] = {\n          controllers: {\n            core: {\n              getSitemap: { enabled: true },\n              getSitemapXsl: { enabled: true },\n              getSitemapXslCss: { enabled: true },\n              getSitemapXslJs: { enabled: true },\n              getSitemapXslSortable: { enabled: true },\n            },\n          },\n        };\n\n        await strapi\n          .service('plugin::users-permissions.role')\n          .updateRole(_public.id, _public);\n      }\n    }\n\n    // Load lifecycle methods for auto generation of sitemap.\n    await sitemap.service('lifecycle').loadAllLifecycleMethods();\n\n    // Register permission actions.\n    const actions = [\n      {\n        section: 'plugins',\n        displayName: 'Access the plugin settings',\n        uid: 'settings.read',\n        pluginName: 'webtools-addon-sitemap',\n      },\n    ];\n    await strapi.admin.services.permission.actionProvider.registerMany(actions);\n\n    // Schedule cron to generate the sitemap\n    if (cron) {\n      strapi.cron.add({\n        generateSitemap: {\n          task: async ({ strapi }) => {\n            await getService('core').createSitemap();\n          },\n          options: {\n            rule: cron,\n          },\n        },\n      });\n    }\n  } catch (error) {\n    strapi.log.error(logMessage(`Bootstrap failed with error \"${error.message}\".`));\n  }\n};\n","import _ from 'lodash';\nimport { Common, Schema } from '@strapi/strapi';\n\nexport const isContentTypeEnabled = (ct: Common.UID.ContentType | Schema.ContentType) => {\n  let contentType: Schema.ContentType;\n\n  if (typeof ct === 'string') {\n    contentType = strapi.contentTypes[ct];\n  } else {\n    contentType = ct;\n  }\n\n  const { pluginOptions } = contentType;\n  const enabled = _.get(pluginOptions, ['webtools', 'enabled'], false) as boolean;\n\n  if (!enabled) return false;\n\n  return true;\n};\n","\n'use strict';\n\nimport _ from 'lodash';\nimport { isContentTypeEnabled } from './utils/enabledContentTypes';\n\n/**\n * Adds sitemap_exclude field to all the eligable content types.\n * @param {Strapi} strapi - The Strapi instance.\n *\n * @returns {void}\n */\nconst extendContentTypesWithExcludeField = async (strapi) => {\n  Object.values(strapi.contentTypes).forEach((contentType) => {\n    const hasWT = isContentTypeEnabled(contentType);\n\n    if (!hasWT) return;\n\n    const { attributes } = contentType;\n\n    _.set(attributes, 'sitemap_exclude', {\n      writable: true,\n      private: true,\n      configurable: false,\n      visible: false,\n      default: false,\n      type: 'boolean',\n    });\n  });\n};\n\nexport default ({ strapi }) => {\n  extendContentTypesWithExcludeField(strapi);\n};\n","/* eslint-disable camelcase */\n\nimport { get } from 'lodash';\nimport xml2js from 'xml2js';\n\nconst parser = new xml2js.Parser({ attrkey: 'ATTR' });\n\nimport { noLimit, logMessage } from '../utils';\n\n/**\n * Query service.\n */\n\n/**\n * Query the nessecary pages from Strapi to build the sitemap with.\n *\n * @param {obj} config - The config object\n * @param {string} contentType - Query only entities of this type.\n * @param {array} ids - Query only these ids.\n *\n * @returns {object} The pages.\n */\nconst getPages = async (config, contentType, ids) => {\n  const excludeDrafts = config.excludeDrafts && strapi.contentTypes[contentType].options.draftAndPublish;\n  const isLocalized =\n    strapi.contentTypes[contentType].pluginOptions?.i18n?.localized\n    && strapi.plugin('i18n');\n\n  const pages = await noLimit(strapi, contentType, {\n    filters: {\n      $or: [\n        {\n          sitemap_exclude: {\n            $null: true,\n          },\n        },\n        {\n          sitemap_exclude: {\n            $eq: false,\n          },\n        },\n      ],\n      id: ids ? {\n        $in: ids,\n      } : {},\n    },\n    locale: 'all',\n    fields: isLocalized ? 'locale' : undefined,\n    populate: {\n      url_alias: {\n        populate: 'url_path',\n      },\n      localizations: {\n        fields: 'locale',\n        filters: {\n          $or: [\n            {\n              sitemap_exclude: {\n                $null: true,\n              },\n            },\n            {\n              sitemap_exclude: {\n                $eq: false,\n              },\n            },\n          ],\n        },\n        populate: {\n          url_alias: {\n            populate: 'url_path',\n          },\n        },\n      },\n    },\n    orderBy: 'id',\n    publicationState: excludeDrafts ? 'live' : 'preview',\n  });\n\n  return pages;\n};\n\n/**\n * Query the IDs of the corresponding localization entities.\n *\n * @param {obj} contentType - The content type\n * @param {array} ids - Page ids\n *\n * @returns {object} The pages.\n */\nconst getLocalizationIds = async (contentType, ids) => {\n  const isLocalized =\n    strapi.contentTypes[contentType].pluginOptions?.i18n?.localized\n    && strapi.plugin('i18n');\n\n  const localizationIds = [];\n\n  if (isLocalized) {\n    const response = await strapi.entityService.findMany(contentType, {\n      filters: { localizations: ids },\n      locale: 'all',\n      fields: ['id'],\n    });\n\n    response.map((localization) => localizationIds.push(localization.id));\n  }\n\n  return localizationIds;\n};\n\n/**\n * Get a sitemap from the database\n *\n * @param {string} name - The name of the sitemap\n * @param {number} delta - The delta of the sitemap\n * @param {array} fields - The fields array\n *\n * @returns {void}\n */\nconst getSitemap = async (name, delta, fields = ['sitemap_string']) => {\n  const sitemap = await strapi.entityService.findMany('plugin::webtools-addon-sitemap.sitemap', {\n    filters: {\n      name,\n      delta,\n    },\n    fields,\n  });\n\n  return sitemap[0];\n};\n\n/**\n * Delete a sitemap from the database\n *\n * @param {string} name - The name of the sitemap\n *\n * @returns {void}\n */\nconst deleteSitemap = async (name) => {\n  const sitemaps = await strapi.entityService.findMany('plugin::webtools-addon-sitemap.sitemap', {\n    filters: {\n      name,\n    },\n    fields: ['id'],\n  });\n\n  await Promise.all(sitemaps.map(async (sm) => {\n    await strapi.entityService.delete('plugin::webtools-addon-sitemap.sitemap', sm.id);\n  }));\n};\n\n/**\n * Create a sitemap in the database\n *\n * @param {obj} data - The sitemap data\n *\n * @returns {void}\n */\nconst createSitemap = async (data) => {\n  const {\n    name,\n    delta,\n    type,\n    sitemap_string,\n  } = data;\n\n  let linkCount = null;\n\n  parser.parseString(sitemap_string, (error, result) => {\n    if (error) {\n      strapi.log.error(logMessage(`An error occurred while trying to parse the sitemap XML to json. ${error}`));\n      throw new Error();\n    } else if (type === 'index') {\n      linkCount = get(result, 'sitemapindex.sitemap.length') || 0;\n    } else {\n      linkCount = get(result, 'urlset.url.length') || 0;\n    }\n  });\n\n  const sitemap = await strapi.entityService.create('plugin::webtools-addon-sitemap.sitemap', {\n    data: {\n      sitemap_string,\n      name,\n      delta,\n      type,\n      link_count: linkCount,\n    },\n  });\n\n  return sitemap.id;\n};\n\nexport default () => ({\n  getPages,\n  getLocalizationIds,\n  createSitemap,\n  getSitemap,\n  deleteSitemap,\n});\n","'use strict';\n\n/**\n * Sitemap service.\n */\n\nimport { getConfigUrls } from '@strapi/utils';\nimport { SitemapStream, streamToPromise, SitemapAndIndexStream } from 'sitemap';\nimport { isEmpty } from 'lodash';\n\nimport { logMessage, getService, isValidUrl } from '../utils';\n\n/**\n * Add link x-default url to url bundles from strapi i18n plugin default locale.\n *\n * @param {object} config - The config object.\n * @param {object} links - The language links.\n * @param {object} defaultLocale - The language locale.\n *\n * @returns {object | undefined} The default language link.\n */\nconst getDefaultLanguageLink = (config, links, defaultLocale) => {\n  if (config.defaultLanguageUrlType === 'default-locale') {\n    // find url with default locale in generated bundle\n    const url = links.find((link) => link.lang === defaultLocale)?.url;\n    if (url) return { lang: 'x-default', url };\n  }\n\n  if (config.defaultLanguageUrlType === 'other' && config.defaultLanguageUrl) {\n    return { lang: 'x-default', url: config.defaultLanguageUrl };\n  }\n};\n\n/**\n * Get a formatted array of different language URLs of a single page.\n *\n * @param {object} config - The config object.\n * @param {object} page - The entity.\n * @param {string} contentType - The model of the entity.\n * @param {string} defaultURL - The default URL of the different languages.\n * @param {string} defaultLocale - The default locale.\n *\n * @returns {array} The language links.\n */\nconst getLanguageLinks = (config, page, contentType, defaultURL, defaultLocale) => {\n  if (!page.localizations || page.localizations.length === 0) return null;\n\n  const links = [];\n  links.push({ lang: page.locale, url: defaultURL });\n\n  page.localizations.map((translation) => {\n    let { locale } = translation;\n\n    // Return when there is no pattern for the page.\n    if (\n      !config.contentTypes[contentType]['languages'][locale]\n      && config.contentTypes[contentType]['languages']['und']\n    ) {\n      locale = 'und';\n    } else if (\n      !config.contentTypes[contentType]['languages'][locale]\n      && !config.contentTypes[contentType]['languages']['und']\n    ) {\n      return null;\n    }\n\n    if (!translation.url_alias) {\n      return null;\n    }\n\n    const translationUrl = translation.url_alias.url_path;\n\n    let hostnameOverride = config.hostname_overrides[translation.locale] || '';\n    hostnameOverride = hostnameOverride.replace(/\\/+$/, '');\n    links.push({\n      lang: translation.locale,\n      url: `${hostnameOverride}${translationUrl}`,\n    });\n  });\n\n  // add optional x-default link url\n  if (config.defaultLanguageUrlType) {\n    const defaultLink = getService('core').getDefaultLanguageLink(config, links, defaultLocale);\n    if (defaultLink) links.push(defaultLink);\n  }\n\n  return links;\n};\n\n/**\n * Get a formatted sitemap entry object for a single page.\n *\n * @param {object} config - The config object.\n * @param {object} page - The entity.\n * @param {string} contentType - The model of the entity.\n * @param {string} defaultLocale - The default locale.\n * @param {bool} excludeDrafts - Whether to exclude drafts.\n *\n * @returns {object} The sitemap entry data.\n */\nconst getSitemapPageData = async (config, page, contentType, defaultLocale) => {\n  let locale = page.locale || 'und';\n\n  // Return when there is no pattern for the page.\n  if (\n    !config.contentTypes[contentType]['languages'][locale]\n    && config.contentTypes[contentType]['languages']['und']\n  ) {\n    locale = 'und';\n  } else if (\n    !config.contentTypes[contentType]['languages'][locale]\n    && !config.contentTypes[contentType]['languages']['und']\n  ) {\n    return null;\n  }\n\n  if (!page.url_alias) {\n    return null;\n  }\n\n  const path = page.url_alias.url_path;\n  let hostnameOverride = config.hostname_overrides[page.locale] || '';\n  hostnameOverride = hostnameOverride.replace(/\\/+$/, '');\n  const url = `${hostnameOverride}${path}`;\n\n  const pageData = {\n    lastmod: page.updatedAt,\n    url: path,\n    links: getService('core').getLanguageLinks(config, page, contentType, url, defaultLocale),\n    changefreq: config.contentTypes[contentType]['languages'][locale].changefreq || 'monthly',\n    priority: parseFloat(config.contentTypes[contentType]['languages'][locale].priority) || 0.5,\n  };\n\n  if (config.contentTypes[contentType]['languages'][locale].includeLastmod === false) {\n    delete pageData.lastmod;\n  }\n\n  return pageData;\n};\n\n/**\n * Get array of sitemap entries based on the plugins configurations.\n *\n * @returns {object} The sitemap entries.\n */\nconst createSitemapEntries = async () => {\n  const config = await getService('settings').getConfig();\n  let defaultLocale;\n\n  if (strapi.plugin('i18n')) {\n    const { getDefaultLocale } = strapi.plugin('i18n').service('locales');\n    defaultLocale = await getDefaultLocale();\n  }\n\n  const sitemapEntries = [];\n\n  // Collection entries.\n  await Promise.all(Object.keys(config.contentTypes).map(async (contentType) => {\n    // Query all the pages\n    const pages = await getService('query').getPages(config, contentType);\n\n    // Add formatted sitemap page data to the array.\n    await Promise.all(pages.map(async (page, i) => {\n      const pageData = await getService('core').getSitemapPageData(config, page, contentType, defaultLocale);\n      if (pageData) {\n        sitemapEntries.push(pageData);\n      }\n    }));\n\n  }));\n\n\n  // Custom entries.\n  await Promise.all(Object.keys(config.customEntries).map(async (customEntry) => {\n    sitemapEntries.push({\n      url: customEntry,\n      changefreq: config.customEntries[customEntry].changefreq,\n      priority: parseFloat(config.customEntries[customEntry].priority),\n    });\n  }));\n\n  // Custom homepage entry.\n  if (config.includeHomepage) {\n    const hasHomePage = !isEmpty(sitemapEntries.filter((entry) => entry.url === ''));\n\n    // Only add it when no other '/' entry is present.\n    if (!hasHomePage) {\n      sitemapEntries.push({\n        url: '/',\n        changefreq: 'monthly',\n        priority: 1,\n      });\n    }\n  }\n\n  return sitemapEntries;\n};\n\n/**\n * Write the sitemap xml file in the public folder.\n *\n * @param {string} filename - The file name.\n * @param {SitemapStream} sitemap - The SitemapStream instance.\n * @param {bool} isIndex - Is a sitemap index\n *\n * @returns {void}\n */\nconst saveSitemap = async (filename, sitemap, isIndex) => {\n  return streamToPromise(sitemap)\n    .then(async (sm) => {\n      try {\n        return await getService('query').createSitemap({\n          sitemap_string: sm.toString(),\n          name: filename,\n          delta: 0,\n          type: isIndex ? 'index' : 'default_hreflang',\n        });\n      } catch (e) {\n        strapi.log.error(logMessage(`Something went wrong while trying to write the sitemap XML to the database. ${e}`));\n        throw new Error();\n      }\n    })\n    .catch((err) => {\n      strapi.log.error(logMessage(`Something went wrong while trying to build the sitemap with streamToPromise. ${err}`));\n      throw new Error();\n    });\n};\n\n/**\n * Get the SitemapStream instance.\n *\n * @param {number} urlCount - The amount of URLs.\n *\n * @returns {SitemapStream} - The sitemap stream.\n */\nconst getSitemapStream = async (urlCount) => {\n  const config = await getService('settings').getConfig();\n  const LIMIT = strapi.config.get('plugin.webtools-addon-sitemap.limit');\n  const enableXsl = strapi.config.get('plugin.webtools-addon-sitemap.xsl');\n  const { serverUrl } = getConfigUrls(strapi.config);\n\n  const xslObj = {};\n\n  if (enableXsl) {\n    xslObj.xslUrl = 'xsl/sitemap.xsl';\n  }\n\n  if (urlCount <= LIMIT) {\n    return [new SitemapStream({\n      hostname: config.hostname,\n      ...xslObj,\n    }), false];\n  } else {\n\n    return [new SitemapAndIndexStream({\n      limit: LIMIT,\n      ...xslObj,\n      lastmodDateOnly: false,\n      getSitemapStream: (i) => {\n        const sitemapStream = new SitemapStream({\n          hostname: config.hostname,\n          ...xslObj,\n        });\n        const delta = i + 1;\n        const path = `api/sitemap/index.xml?page=${delta}`;\n\n        streamToPromise(sitemapStream)\n          .then((sm) => {\n            getService('query').createSitemap({\n              sitemap_string: sm.toString(),\n              name: 'default',\n              type: 'default_hreflang',\n              delta,\n            });\n          });\n\n        return [new URL(path, serverUrl || 'http://localhost:1337').toString(), sitemapStream];\n      },\n    }), true];\n  }\n};\n\n/**\n * The main sitemap generation service.\n *\n * @returns {void}\n */\nconst createSitemap = async () => {\n  const sitemapEntries = await getService('core').createSitemapEntries();\n\n  const config = await getService('settings').getConfig();\n\n  if (isEmpty(sitemapEntries)) {\n    strapi.log.warn(logMessage('No sitemap XML was generated because there were 0 URLs configured.'));\n    return;\n  }\n\n  if (!config.hostname) {\n    strapi.log.warn(logMessage('No sitemap XML was generated because there was no hostname configured.'));\n    return;\n  }\n\n  if (!isValidUrl(config.hostname)) {\n    strapi.log.warn(logMessage('No sitemap XML was generated because the hostname was invalid'));\n    return;\n  }\n\n  await getService('query').deleteSitemap('default');\n  const [sitemap, isIndex] = await getSitemapStream(sitemapEntries.length);\n\n  sitemapEntries.map((sitemapEntry) => sitemap.write(sitemapEntry));\n  sitemap.end();\n\n  await getService('core').saveSitemap('default', sitemap, isIndex);\n\n  strapi.log.info(logMessage('The sitemap XML has been generated. It can be accessed on /api/sitemap/index.xml.'));\n};\n\nexport default () => ({\n  getDefaultLanguageLink,\n  getLanguageLinks,\n  getSitemapPageData,\n  createSitemapEntries,\n  saveSitemap,\n  createSitemap,\n});\n","'use strict';\n\nimport { Map } from 'immutable';\n\n/**\n * Sitemap.js service\n *\n * @description: A set of functions similar to controller's actions to avoid code duplication.\n */\n\nconst createDefaultConfig = async () => {\n  const pluginStore = strapi.store({\n    environment: '',\n    type: 'plugin',\n    name: 'sitemap',\n  });\n\n  const value = {\n    hostname: '',\n    includeHomepage: true,\n    excludeDrafts: true,\n    defaultLanguageUrlType: '',\n    defaultLanguageUrl: '',\n    hostname_overrides: {},\n    contentTypes: Map({}),\n    customEntries: Map({}),\n  };\n\n  await pluginStore.set({ key: 'settings', value });\n\n  return strapi\n    .store({\n      environment: '',\n      type: 'plugin',\n      name: 'sitemap',\n    })\n    .get({ key: 'settings' });\n};\n\nexport default () => ({\n  getConfig: async () => {\n    let config = await strapi\n      .store({\n        environment: '',\n        type: 'plugin',\n        name: 'sitemap',\n      })\n      .get({ key: 'settings' });\n\n    if (!config) {\n      config = await createDefaultConfig();\n    }\n\n    return config;\n  },\n});\n","'use strict';\n\nimport { getService, logMessage } from '../utils';\n\n/**\n * Gets lifecycle service\n *\n * @returns {object} - Lifecycle service\n */\n\nconst subscribeLifecycleMethods = async (modelName) => {\n  if (strapi.contentTypes[modelName]) {\n    await strapi.db.lifecycles.subscribe({\n      models: [modelName],\n\n      async afterCreate() {\n        await getService('core').createSitemap();\n      },\n\n      async afterCreateMany() {\n        await getService('core').createSitemap();\n      },\n\n      async afterUpdate() {\n        await getService('core').createSitemap();\n      },\n\n      async afterUpdateMany() {\n        await getService('core').createSitemap();\n      },\n\n      async afterDelete() {\n        await getService('core').createSitemap();\n      },\n\n      async afterDeleteMany() {\n        await getService('core').createSitemap();\n      },\n    });\n  } else {\n    strapi.log.error(logMessage(`Could not load lifecycles on model '${modelName}'`));\n  }\n};\n\nexport default () => ({\n  async loadAllLifecycleMethods() {\n    const settings = await getService('settings').getConfig();\n\n    // Loop over configured contentTypes from store.\n    if (settings.contentTypes && strapi.config.get('plugin.webtools-addon-sitemap.autoGenerate')) {\n      Object.keys(settings.contentTypes).map(async (contentType) => {\n        await subscribeLifecycleMethods(contentType);\n      });\n    }\n  },\n\n  async loadLifecycleMethod(modelName) {\n    if (strapi.config.get('plugin.webtools-addon-sitemap.autoGenerate')) {\n      await subscribeLifecycleMethods(modelName);\n    }\n  },\n});\n","'use strict';\n\nimport query from './query';\nimport core from './core';\nimport settings from './settings';\nimport lifecycle from './lifecycle';\n\nexport default {\n  query,\n  core,\n  settings,\n  lifecycle,\n};\n","'use strict';\n\nexport default {\n  type: 'admin',\n  routes: [\n    {\n      method: 'GET',\n      path: '/',\n      handler: 'core.buildSitemap',\n      config: {\n        policies: [],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/info',\n      handler: 'core.info',\n      config: {\n        policies: [],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/settings',\n      handler: 'settings.getSettings',\n      config: {\n        policies: [],\n      },\n    },\n    {\n      method: 'PUT',\n      path: '/settings',\n      handler: 'settings.updateSettings',\n      config: {\n        policies: [],\n      },\n    },\n  ],\n};\n","'use strict';\n\nexport default {\n  type: 'content-api',\n  routes: [\n    {\n      method: 'GET',\n      path: '/sitemap/index.xml',\n      handler: 'core.getSitemap',\n      config: {\n        policies: [],\n        prefix: '',\n\n      },\n    },\n    {\n      method: 'GET',\n      path: '/sitemap/xsl/sitemap.xsl',\n      handler: 'core.getSitemapXsl',\n      config: {\n        policies: [],\n        prefix: '',\n\n      },\n    },\n    {\n      method: 'GET',\n      path: '/sitemap/xsl/sortable.min.js',\n      handler: 'core.getSitemapXslSortable',\n      config: {\n        policies: [],\n        prefix: '',\n\n      },\n    },\n    {\n      method: 'GET',\n      path: '/sitemap/xsl/sitemap.xsl.js',\n      handler: 'core.getSitemapXslJs',\n      config: {\n        policies: [],\n        prefix: '',\n\n      },\n    },\n    {\n      method: 'GET',\n      path: '/sitemap/xsl/sitemap.xsl.css',\n      handler: 'core.getSitemapXslCss',\n      config: {\n        policies: [],\n        prefix: '',\n\n      },\n    },\n  ],\n};\n","'use strict';\n\nimport adminRoutes from './admin';\nimport contentApi from './content-api';\n\nexport default {\n  admin: adminRoutes,\n  'content-api': contentApi,\n};\n","'use strict';\n\nexport default {\n  default: {\n    cron: '0 0 0 * * *',\n    limit: 45000,\n    xsl: true,\n    autoGenerate: false,\n  },\n  validator() {},\n};\n","'use strict';\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { getService } from '../utils';\n\n/**\n * Sitemap.js controller\n *\n * @description: A set of functions called \"actions\" of the `sitemap` plugin.\n */\n\nexport default {\n  buildSitemap: async (ctx) => {\n    try {\n      await getService('core').createSitemap();\n\n      ctx.send({\n        message: 'The sitemap has been generated.',\n      });\n    } catch (err) {\n      ctx.status = err.status || 500;\n      ctx.body = err.message;\n      ctx.app.emit('error', err, ctx);\n    }\n  },\n\n  info: async (ctx) => {\n    const sitemap = await getService('query').getSitemap('default', 0, ['link_count', 'updated_at', 'type']);\n    const sitemapInfo = {};\n\n    if (sitemap) {\n      if (sitemap.type === 'index') {\n        sitemapInfo.sitemaps = sitemap.link_count;\n        sitemapInfo.urls = 0;\n      } else {\n        sitemapInfo.urls = sitemap.link_count;\n        sitemapInfo.sitemaps = 0;\n      }\n\n      sitemapInfo.updateTime = sitemap.updatedAt;\n      sitemapInfo.location = '/api/sitemap/index.xml';\n    }\n\n    sitemapInfo.hasPro = !!strapi.plugin('sitemap-pro');\n\n    ctx.send(sitemapInfo);\n  },\n\n  getSitemap: async (ctx) => {\n    const { page = 0 } = ctx.query;\n    const sitemap = await getService('query').getSitemap('default', page);\n\n    if (!sitemap) {\n      ctx.notFound('Not found');\n      return;\n    }\n\n    ctx.response.set('content-type', 'application/xml');\n    ctx.body = sitemap.sitemap_string;\n  },\n\n  getSitemapXsl: async (ctx) => {\n    const xsl = fs.readFileSync(path.resolve(__dirname, '../../xsl/sitemap.xsl'), 'utf8');\n    ctx.response.set('content-type', 'application/xml');\n    ctx.body = xsl;\n  },\n\n  getSitemapXslJs: async (ctx) => {\n    const xsl = fs.readFileSync(path.resolve(__dirname, '../../xsl/sitemap.xsl.js'), 'utf8');\n    ctx.response.set('content-type', 'text/javascript');\n    ctx.body = xsl;\n  },\n\n  getSitemapXslSortable: async (ctx) => {\n    const xsl = fs.readFileSync(path.resolve(__dirname, '../../xsl/sortable.min.js'), 'utf8');\n    ctx.response.set('content-type', 'text/javascript');\n    ctx.body = xsl;\n  },\n\n  getSitemapXslCss: async (ctx) => {\n    const xsl = fs.readFileSync(path.resolve(__dirname, '../../xsl/sitemap.xsl.css'), 'utf8');\n    ctx.response.set('content-type', 'text/css');\n    ctx.body = xsl;\n  },\n};\n","'use strict';\n\nimport { getService } from '../utils';\n\n/**\n * Sitemap.js controller\n *\n * @description: A set of functions called \"actions\" of the `sitemap` plugin.\n */\n\nexport default {\n  getSettings: async (ctx) => {\n    const config = await getService('settings').getConfig();\n\n    ctx.send(config);\n  },\n\n  updateSettings: async (ctx) => {\n    const config = await getService('settings').getConfig();\n    const newContentTypes = Object.keys(ctx.request.body.contentTypes).filter((x) => !Object.keys(config.contentTypes).includes(x));\n\n    await strapi\n      .store({\n        environment: '',\n        type: 'plugin',\n        name: 'sitemap',\n      })\n      .set({ key: 'settings', value: ctx.request.body });\n\n    // Load lifecycle methods for auto generation of sitemap.\n    await newContentTypes.map(async (contentType) => {\n      await getService('lifecycle').loadLifecycleMethod(contentType);\n    });\n\n    ctx.send({ ok: true });\n  },\n};\n","'use strict';\n\nimport core from './core';\nimport settings from './settings';\n\nexport default {\n  core,\n  settings,\n};\n","import sitemapSchema from './sitemap/schema.json';\n\nexport default {\n  sitemap: {\n    schema: sitemapSchema,\n  },\n};\n","import bootstrap from './bootstrap';\nimport register from './register';\nimport services from './services';\nimport routes from './routes';\nimport config from './config';\nimport controllers from './controllers';\nimport contentTypes from './content-types';\n\nexport default () => {\n  return {\n    bootstrap,\n    register,\n    routes,\n    config,\n    controllers,\n    services,\n    contentTypes,\n  };\n};\n"],"names":["strapi","pluginOptions","attributes","config","createSitemap","path","settings","core"],"mappings":"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"}