{"version":3,"file":"index.mjs","sources":["../../server/utils/index.js","../../server/utils/pluginId.ts","../../server/utils/getPluginService.ts","../../server/bootstrap.js","../../server/utils/enabledContentTypes.ts","../../server/middlewares/auto-generate.js","../../server/register.js","../../server/services/query.js","../../server/services/core.js","../../server/migrations/migrate-config-object-to-array.js","../../server/services/settings.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 logMessage = (msg = '') => `[webtools-addon-sitemap]: ${msg}`;\n\nexport const noLimit = async (queryString, parameters, limit = 5000) => {\n  let entries = [];\n  const amountOfEntries = await strapi.documents(queryString).count(parameters);\n\n  for (let i = 0; i < (amountOfEntries / limit); i++) {\n    /* eslint-disable-next-line */\n    const chunk = await strapi.documents(queryString).findMany({\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","\n\nimport pluginPkg from '../../package.json';\n\n/**\n * A helper function to obtain the plugin id.\n *\n * @return {string} The plugin id.\n */\nexport const pluginId = pluginPkg.strapi.name;\n","import type config from '..';\nimport { pluginId } from './pluginId';\n\ntype Config = typeof config;\ntype Services = Config['services'];\n/**\n * A helper function to obtain a plugin service.\n * @param {string} name The name of the service.\n *\n * @return {any} service.\n */\nexport const getPluginService = <ServiceName extends keyof Services>(name: ServiceName) => {\n  const service = strapi.service(`plugin::${pluginId}.${name}`);\n  return service as ReturnType<Services[ServiceName]>;\n};\n","import { logMessage } from './utils';\nimport { getPluginService } from './utils/getPluginService';\n\nexport default async () => {\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    // 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        generateDefaultSitemap: {\n          task: async ({ strapi }) => {\n            const id = 'default';\n\n            const config = await getPluginService('settings').getConfig();\n            const sitemapConfig = config.sitemaps[id];\n\n            // Gracefully exit if no sitemap config found\n            if (!sitemapConfig) {\n              return;\n            }\n\n            getPluginService('core').createSitemap(id);\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 get from 'lodash/get';\nimport { Schema } from '@strapi/strapi';\n\n\nexport const isContentTypeEnabled = (contentType: Schema.ContentType) => {\n  const { pluginOptions } = contentType;\n  return get(pluginOptions, ['webtools', 'enabled'], false) as boolean;\n};\n","import { getPluginService } from '../utils/getPluginService';\n\n// eslint-disable-next-line max-len\nconst autoGenerateMiddleware = async (context, next) => {\n  const { uid, action } = context;\n\n  // Only add the middleware if auto-generate is enabled.\n  if (!strapi.config.get('plugin::webtools-addon-sitemap.autoGenerate')) {\n    return next();\n  }\n\n  const settings = await getPluginService('settings').getConfig();\n  const defaultSitemapSettings = settings?.sitemaps?.default;\n\n  // Only add the middleware if the content type is added to the sitemap.\n  if (!defaultSitemapSettings?.contentTypes || !Object.keys(defaultSitemapSettings?.contentTypes).includes(uid)) {\n    return next();\n  }\n\n  // Only add the middleware for the create, update and delete action.\n  if (!['create', 'update', 'delete'].includes(action)) {\n    return next();\n  }\n\n  // Perform the action.\n  const document = await next();\n\n  // Generate the sitemap.\n  setTimeout(() => {\n    getPluginService('core').createSitemap('default');\n  }, 0);\n\n  // Return the document\n  return document;\n};\n\nexport default autoGenerateMiddleware;\n","\n'use strict';\n\nimport _ from 'lodash';\nimport { isContentTypeEnabled } from './utils/enabledContentTypes';\nimport autoGenerateMiddleware from './middlewares/auto-generate';\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  strapi.documents.use(autoGenerateMiddleware);\n  extendContentTypesWithExcludeField(strapi);\n};\n","import { 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} languageFilter - A language to filter on.\n *\n * @returns {object} The pages.\n */\nconst getPages = async (config, contentType, languageFilter) => {\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 locales = isLocalized ? await noLimit('plugin::i18n.locale', { fields: 'code' }) : ['und'];\n  let allPages = [];\n\n  await Promise.all(locales.map(async (locale) => {\n    if (isLocalized && languageFilter && languageFilter !== 'off' && locale.code !== languageFilter) {\n      return;\n    }\n\n    const pages = await noLimit(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      },\n      ...(isLocalized ? { locale: locale.code } : {}),\n      fields: isLocalized ? ['locale', 'updatedAt'] : ['updatedAt'],\n      populate: {\n        url_alias: {\n          populate: '*',\n        },\n        localizations: {\n          fields: isLocalized ? ['locale', 'updatedAt'] : ['updatedAt'],\n          filters: {\n            $or: [\n              {\n                sitemap_exclude: {\n                  $null: true,\n                },\n              },\n              {\n                sitemap_exclude: {\n                  $eq: false,\n                },\n              },\n            ],\n            locale: isLocalized && languageFilter && languageFilter !== 'off' ? {\n              $in: [languageFilter],\n            } : {},\n          },\n          populate: {\n            url_alias: {\n              populate: '*',\n            },\n          },\n        },\n      },\n      orderBy: 'id',\n      status: excludeDrafts ? 'published' : 'draft',\n    });\n    allPages = [...allPages, ...pages];\n  }));\n\n  return allPages;\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.documents('plugin::webtools-addon-sitemap.sitemap').findMany({\n    filters: {\n      name,\n      delta,\n    },\n    fields,\n  });\n\n  return sitemap[0];\n};\n\n/**\n * Get all sitemaps from the database\n *\n * @param {object} query - The query object\n *\n * @returns {void}\n */\nconst getAllSitemaps = async (query) => {\n  const sitemaps = await strapi.documents('plugin::webtools-addon-sitemap.sitemap').findMany({\n    ...query,\n  });\n\n  return sitemaps;\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.documents('plugin::webtools-addon-sitemap.sitemap').findMany({\n    filters: {\n      name,\n    },\n    fields: ['id'],\n  });\n\n  await Promise.all(sitemaps.map(async (sm) => {\n    await strapi.documents('plugin::webtools-addon-sitemap.sitemap').delete({\n      documentId: sm.documentId,\n    });\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.documents('plugin::webtools-addon-sitemap.sitemap').create({\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  getAllSitemaps,\n  getPages,\n  createSitemap,\n  getSitemap,\n  deleteSitemap,\n});\n","'use strict';\n\n/**\n * Sitemap service.\n */\n\nimport { SitemapStream, streamToPromise, SitemapAndIndexStream } from 'sitemap';\nimport { isEmpty } from 'lodash';\n\nimport { logMessage, isValidUrl } from '../utils';\nimport { getPluginService } from '../utils/getPluginService';\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[0]) {\n      return null;\n    }\n\n    const translationUrl = translation.url_alias[0].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 = getPluginService('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[0]) {\n    return null;\n  }\n\n  const path = page.url_alias[0].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,\n    links: getPluginService('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 * @param {string} id - The sitemap ID.\n *\n * @returns {object} The sitemap entries.\n */\nconst createSitemapEntries = async (id) => {\n  const config = await getPluginService('settings').getConfig();\n  const sitemapConfig = config.sitemaps[id];\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(sitemapConfig.contentTypes).map(async (contentType) => {\n    // Query all the pages\n    const pages = await getPluginService('query').getPages(sitemapConfig, contentType, sitemapConfig.languageFilter);\n\n    // Add formatted sitemap page data to the array.\n    await Promise.all(pages.map(async (page, i) => {\n      const pageData = await getPluginService('core').getSitemapPageData(sitemapConfig, 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(sitemapConfig.customEntries).map(async (customEntry) => {\n    sitemapEntries.push({\n      url: customEntry,\n      changefreq: sitemapConfig.customEntries[customEntry].changefreq,\n      priority: parseFloat(sitemapConfig.customEntries[customEntry].priority),\n    });\n  }));\n\n  // Custom homepage entry.\n  if (sitemapConfig.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  // Filter out duplicates.\n  const allSitemapUrls = new Set();\n  const uniqueSitemapEntries = sitemapEntries.filter((entry) => {\n    if (allSitemapUrls.has(entry.url)) {\n      return false;\n    }\n    allSitemapUrls.add(entry.url);\n    return true;\n  });\n\n  return uniqueSitemapEntries;\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 getPluginService('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 * @param {string} id - The sitemap ID.\n *\n * @returns {SitemapStream} - The sitemap stream.\n */\nconst getSitemapStream = async (urlCount, id) => {\n  const config = await getPluginService('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 = strapi.config.get('server.serverUrl');\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.sitemaps[id].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.sitemaps[id].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            getPluginService('query').createSitemap({\n              sitemap_string: sm.toString(),\n              name: id,\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 * @param {string} id - The sitemap ID.\n *\n * @returns {void}\n */\nconst createSitemap = async (id) => {\n  const sitemapEntries = await getPluginService('core').createSitemapEntries(id);\n\n  const config = await getPluginService('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.sitemaps[id].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.sitemaps[id].hostname)) {\n    strapi.log.warn(logMessage('No sitemap XML was generated because the hostname was invalid'));\n    return;\n  }\n\n  await getPluginService('query').deleteSitemap(id);\n  const [sitemap, isIndex] = await getSitemapStream(sitemapEntries.length, id);\n\n  sitemapEntries.map((sitemapEntry) => sitemap.write(sitemapEntry));\n  sitemap.end();\n\n  await getPluginService('core').saveSitemap(id, sitemap, isIndex);\n\n  strapi.log.info(logMessage(`The sitemap XML has been generated. It can be accessed on /api/sitemap/${id}.xml.`));\n};\n\nexport default () => ({\n  getDefaultLanguageLink,\n  getLanguageLinks,\n  getSitemapPageData,\n  createSitemapEntries,\n  saveSitemap,\n  createSitemap,\n});\n","import packageJson from '../../package.json';\n\nexport const migrateToNewConfigObject = (oldConfig) => {\n  return {\n    version: packageJson.version,\n    sitemaps: {\n      default: oldConfig,\n    },\n  };\n};\n\nexport const isOldConfigFormat = (config) => {\n  return config.version === undefined;\n};\n","'use strict';\n\nimport { Map } from 'immutable';\nimport { isOldConfigFormat, migrateToNewConfigObject } from '../migrations/migrate-config-object-to-array';\nimport packageJson from '../../package.json';\n\n/**\n * Sitemap.js service\n *\n * @description: A set of functions similar to controller's actions to avoid code duplication.\n */\n\nexport const pluginStore = strapi.store({\n  environment: '',\n  type: 'plugin',\n  name: 'sitemap',\n});\n\nconst createDefaultConfig = async () => {\n  const value = {\n    version: packageJson.version,\n    sitemaps: {\n      default: {\n        hostname: '',\n        includeHomepage: true,\n        excludeDrafts: true,\n        defaultLanguageUrlType: '',\n        defaultLanguageUrl: '',\n        hostname_overrides: {},\n        languageFilter: 'off',\n        contentTypes: Map({}),\n        customEntries: Map({}),\n      },\n    },\n  };\n\n  await pluginStore.set({ key: 'settings', value });\n  return pluginStore.get({ key: 'settings' });\n};\n\nexport default () => ({\n  getConfig: async () => {\n    let config = await pluginStore.get({ key: 'settings' });\n\n    // Create default config if none is found\n    if (!config) {\n      config = await createDefaultConfig();\n    }\n\n    // Migrate old config format to new one\n    if (isOldConfigFormat(config)) {\n      config = migrateToNewConfigObject(config);\n    }\n\n    // Update the stored config version\n    await pluginStore.set({\n      key: 'settings',\n      value: {\n        ...config,\n        version: packageJson.version,\n      },\n    });\n\n    // Return the final config\n    const finalConfig = await pluginStore.get({ key: 'settings' });\n    return finalConfig;\n  },\n});\n","'use strict';\n\nimport query from './query';\nimport core from './core';\nimport settings from './settings';\n\nexport default {\n  query,\n  core,\n  settings,\n};\n","'use strict';\n\nexport default {\n  type: 'admin',\n  routes: [\n    {\n      method: 'GET',\n      path: '/build-sitemap/:id',\n      handler: 'core.buildSitemap',\n      config: {\n        policies: [],\n      },\n    },\n    {\n      method: 'GET',\n      path: '/info/:id',\n      handler: 'core.info',\n      config: {\n        policies: [],\n      },\n    },\n    {\n      method: 'POST',\n      path: '/create-new-sitemap',\n      handler: 'settings.createNewSitemap',\n      config: {\n        policies: [],\n      },\n    },\n    {\n      method: 'DELETE',\n      path: '/:id',\n      handler: 'settings.deleteSitemap',\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/:id',\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/:id.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';\nimport { getPluginService } from '../utils/getPluginService';\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 getPluginService('core').createSitemap(ctx.params.id);\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 getPluginService('query').getSitemap(ctx.params.id, 0, ['link_count', 'updatedAt', '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/${ctx.params.id}.xml`;\n    }\n\n    ctx.send(sitemapInfo);\n  },\n\n  getSitemap: async (ctx) => {\n    const { page = 0 } = ctx.query;\n    let { id } = ctx.params;\n\n    let sitemap = await getPluginService('query').getSitemap(id, page);\n\n    // If the sitemap that is being queried has id 'index', and none is found,\n    // try to get a sitemap with the id 'default'. This adds backwards compatibility\n    // for users upgrading from older versions of the plugin.\n    if (!sitemap && id === 'index') {\n      sitemap = await getPluginService('query').getSitemap('default', page);\n    }\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  getSitemapTypes: async (ctx) => {\n    ctx.body = ['hreflang'];\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 { Map } from 'immutable';\nimport { pluginStore } from '../services/settings';\nimport { getPluginService } from '../utils/getPluginService';\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 getPluginService('settings').getConfig();\n\n    ctx.send(config);\n  },\n\n  updateSettings: async (ctx) => {\n    const settings = await getPluginService('settings').getConfig();\n    settings.sitemaps[ctx.params.id] = ctx.request.body;\n\n    await pluginStore.set({ key: 'settings', value: settings });\n    ctx.send({ ok: true });\n  },\n\n  deleteSitemap: async (ctx) => {\n    const { id } = ctx.params;\n\n    const settings = await getPluginService('settings').getConfig();\n    delete settings.sitemaps[id];\n    await pluginStore.set({ key: 'settings', value: settings });\n\n    ctx.send('Sitemap was successfully deleted');\n  },\n\n  createNewSitemap: async (ctx) => {\n    const { name } = ctx.request.body;\n    const settings = await getPluginService('settings').getConfig();\n\n    const isAvailable = !Object.keys(settings.sitemaps).includes(name);\n\n    if (!isAvailable) {\n      ctx.throw(400, 'Sitemap name is already in use');\n    }\n\n    settings.sitemaps[name] = {\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: settings });\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  bootstrap,\n  register,\n  routes,\n  config,\n  controllers,\n  services,\n  contentTypes,\n};\n"],"names":["pluginPkg","strapi","config","pluginOptions","settings","attributes","query","createSitemap","get","path","core"],"mappings":"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"}