{"version":3,"sources":["jsdelivr-header.js","/npm/gridsome-source-wordpress@0.4.13/index.js"],"names":[],"mappings":"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","file":"/npm/gridsome-source-wordpress@0.4.13/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/gridsome-source-wordpress@0.4.13/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","const pMap = require('p-map')\nconst axios = require('axios')\nconst fs = require('fs')\nconst https = require('https')\nconst path = require('path')\nconst camelCase = require('camelcase')\nconst { mapKeys, isPlainObject, trimEnd, map, find } = require('lodash')\n\nconst TYPE_AUTHOR = 'author'\nconst TYPE_ATTACHEMENT = 'attachment'\nconst TMPDIR = '.temp/downloads'\nconst DOWNLOAD_DIR = 'wp-images'\n\nfunction mkdirSyncRecursive (absDirectory) {\n  const paths = absDirectory.replace(/\\/$/, '').split('/')\n  paths.splice(0, 1)\n\n  let dirPath = '/'\n  paths.forEach(segment => {\n    dirPath += segment + '/'\n    if (!fs.existsSync(dirPath)) fs.mkdirSync(dirPath)\n  })\n}\n\nclass WordPressSource {\n  static defaultOptions () {\n    return {\n      baseUrl: '',\n      apiBase: 'wp-json',\n      perPage: 100,\n      concurrent: 10,\n      routes: {\n        post: '/:slug',\n        post_tag: '/tag/:slug',\n        category: '/category/:slug',\n        author: '/author/:slug'\n      },\n      typeName: 'WordPress',\n      splitPostsIntoFragments: false,\n      downloadRemoteImagesFromPosts: false,\n      downloadRemoteFeaturedImages: false,\n      downloadACFImages: false\n    }\n  }\n\n  constructor (api, options) {\n    const opts = this.options = { ...WordPressSource.defaultOptions, ...options }\n    this.restBases = { posts: {}, taxonomies: {}}\n\n    if (!opts.typeName) {\n      throw new Error(`Missing typeName option.`)\n    }\n\n    if (opts.perPage > 100 || opts.perPage < 1) {\n      throw new Error(`${opts.typeName}: perPage cannot be more than 100 or less than 1.`)\n    }\n\n    const baseUrl = trimEnd(opts.baseUrl, '/')\n\n    this.client = axios.create({\n      baseURL: `${baseUrl}/${opts.apiBase}`\n    })\n\n    this.routes = this.options.routes || {}\n\n    /* Create image directories */\n    mkdirSyncRecursive(path.resolve(DOWNLOAD_DIR))\n    mkdirSyncRecursive(path.resolve(TMPDIR))\n    this.tmpCount = 0\n\n    this.slugify = str => api.store.slugify(str).replace(/-([^-]*)$/, '.$1')\n\n    api.loadSource(async actions => {\n      this.store = actions\n\n      console.log(`Loading data from ${baseUrl}`)\n\n      await this.getPostTypes(actions)\n      await this.getUsers(actions)\n      await this.getTaxonomies(actions)\n      await this.getPosts(actions)\n    })\n  }\n\n  async getPostTypes (actions) {\n    const { data } = await this.fetch('wp/v2/types', {}, {})\n    const addCollection = actions.addCollection || actions.addContentType\n\n    for (const type in data) {\n      const options = data[type]\n\n      this.restBases.posts[type] = options.rest_base\n\n      addCollection({\n        typeName: this.createTypeName(type),\n        route: this.routes[type] || `/${type}/:slug`\n      })\n    }\n  }\n\n  async getUsers (actions) {\n    const { data } = await this.fetch('wp/v2/users')\n    const addCollection = actions.addCollection || actions.addContentType\n\n    const authors = addCollection({\n      typeName: this.createTypeName(TYPE_AUTHOR),\n      route: this.routes.author\n    })\n\n    for (const author of data) {\n      const fields = this.normalizeFields(author)\n      const avatars = mapKeys(author.avatar_urls, (v, key) => `avatar${key}`)\n\n      authors.addNode({\n        ...fields,\n        id: author.id,\n        title: author.name,\n        avatars\n      })\n    }\n  }\n\n  async getTaxonomies (actions) {\n    const { data } = await this.fetch('wp/v2/taxonomies', {}, {})\n    const addCollection = actions.addCollection || actions.addContentType\n\n    for (const type in data) {\n      const options = data[type]\n      const taxonomy = addCollection({\n        typeName: this.createTypeName(type),\n        route: this.routes[type]\n      })\n\n      this.restBases.taxonomies[type] = options.rest_base\n\n      const terms = await this.fetchPaged(`wp/v2/${options.rest_base}`)\n\n      for (const term of terms) {\n        taxonomy.addNode({\n          id: term.id,\n          title: term.name,\n          slug: term.slug,\n          content: term.description,\n          count: term.count\n        })\n      }\n    }\n  }\n\n  extractImagesFromPostHtml (string) {\n    const regex = /<img[^>]* src=\\\"([^\\\"]*)\\\" alt=\\\"([^\\\"]*)\\\"[^>]*>/gm\n\n    const matches = []\n    let m\n    while ((m = regex.exec(string)) !== null) {\n      // This is necessary to avoid infinite loops with zero-width matches\n      if (m.index === regex.lastIndex) {\n        regex.lastIndex++\n      }\n\n      // The result can be accessed through the `m`-variable.\n      m.forEach((match, groupIndex) => {\n        matches.push({\n          url: match[1],\n          alt: match[2]\n        })\n      })\n    }\n\n    return matches\n  }\n\n  async downloadImage (url, destPath, fileName) {\n    const imagePath = path.resolve(destPath, fileName)\n\n    try {\n      if (fs.existsSync(imagePath)) return\n    } catch (err) {\n      console.log(err)\n    }\n\n    const tmpPath = path.resolve(TMPDIR, `${++this.tmpCount}.tmp`)\n\n    return new Promise(function (resolve, reject) {\n      const file = fs.createWriteStream(tmpPath)\n      https.get(url, (response) => {\n        response.pipe(file)\n        file.on('finish', () => {\n          file.close()\n          fs.rename(tmpPath, imagePath, resolve)\n        })\n      }).on('error', (err) => {\n        console.error(err.message)\n        fs.unlinkSync(tmpPath) // Cleanup blank file\n        reject(err)\n      })\n    })\n  }\n\n  processPostFragments (post) {\n    const postImages = this.extractImagesFromPostHtml(post)\n\n    const regex = /<img[^>]* src=\\\"([^\\\"]*)\\\"[^>]*>/\n    const fragments = post.split(regex)\n\n    return map(fragments, (fragment, index) => {\n      const image = find(postImages, (image) => { return image.url === fragment })\n      if (image && this.options.downloadRemoteImagesFromPosts) {\n        const fileName = this.slugify(fragment.split('/').pop())\n        const imageData = {\n          type: 'img',\n          order: index + 1,\n          fragmentData: {\n            remoteUrl: fragment,\n            fileName: fileName,\n            image: path.resolve(DOWNLOAD_DIR, fileName),\n            alt: image.alt\n          }\n        }\n        this.downloadImage(\n          fragment,\n          DOWNLOAD_DIR,\n          fileName\n        )\n        return imageData\n      } else {\n        return {\n          type: 'html',\n          order: index + 1,\n          fragmentData: {\n            html: fragment\n          }\n        }\n      }\n    })\n  }\n\n  async getPosts (actions) {\n    const { createReference } = actions\n    const getCollection = actions.getCollection || actions.getContentType\n\n    const AUTHOR_TYPE_NAME = this.createTypeName(TYPE_AUTHOR)\n    const ATTACHEMENT_TYPE_NAME = this.createTypeName(TYPE_ATTACHEMENT)\n\n    for (const type in this.restBases.posts) {\n      const restBase = this.restBases.posts[type]\n      const typeName = this.createTypeName(type)\n      const posts = getCollection(typeName)\n\n      const data = await this.fetchPaged(`wp/v2/${restBase}?_embed`)\n\n      for (const post of data) {\n        const fields = this.normalizeFields(post)\n        fields.author = createReference(AUTHOR_TYPE_NAME, post.author || '0')\n\n        if (post.type !== TYPE_ATTACHEMENT) {\n          fields.featuredMedia = createReference(ATTACHEMENT_TYPE_NAME, post.featured_media)\n        }\n\n        // add references if post has any taxonomy rest bases as properties\n        for (const type in this.restBases.taxonomies) {\n          const propName = this.restBases.taxonomies[type]\n\n          if (post.hasOwnProperty(propName)) {\n            const typeName = this.createTypeName(type)\n            const ref = createReference(typeName, post[propName])\n            const key = camelCase(propName)\n\n            fields[key] = ref\n          }\n        }\n\n        if (this.options.splitPostsIntoFragments && fields['content']) { fields.postFragments = this.processPostFragments(fields['content']) }\n\n        // download the featured image\n        if (this.options.downloadRemoteFeaturedImages && post._embedded && post._embedded['wp:featuredmedia']) {\n          try {\n            const featuredImageFileName = this.slugify(post._embedded['wp:featuredmedia']['0'].source_url.split('/').pop())\n            await this.downloadImage(\n              post._embedded['wp:featuredmedia']['0'].source_url,\n              DOWNLOAD_DIR,\n              featuredImageFileName\n            )\n            fields.featuredMediaImage = path.resolve(DOWNLOAD_DIR, featuredImageFileName)\n          } catch (err) {\n            console.log(err)\n            console.log('WARNING - No featured image for post ' + post.slug)\n          }\n        }\n\n        posts.addNode({\n          ...fields,\n          id: post.id\n        })\n      }\n    }\n  }\n\n  async fetch (url, params = {}, fallbackData = []) {\n    let res\n\n    try {\n      res = await this.client.request({ url, params })\n    } catch ({ response, code, config }) {\n      if (!response && code) {\n        throw new Error(`${code} - ${config.url}`)\n      }\n\n      const { url } = response.config\n      const { status } = response.data.data\n\n      if ([401, 403].includes(status)) {\n        console.warn(`Error: Status ${status} - ${url}`)\n        return { ...response, data: fallbackData }\n      } else {\n        throw new Error(`${status} - ${url}`)\n      }\n    }\n\n    return res\n  }\n\n  async fetchPaged (path) {\n    const { perPage, concurrent } = this.options\n\n    return new Promise(async (resolve, reject) => {\n      let res\n\n      try {\n        res = await this.fetch(path, { per_page: perPage })\n      } catch (err) {\n        return reject(err)\n      }\n\n      const totalItems = parseInt(res.headers['x-wp-total'], 10)\n      const totalPages = parseInt(res.headers['x-wp-totalpages'], 10)\n\n      try {\n        res.data = ensureArrayData(path, res.data)\n      } catch (err) {\n        return reject(err)\n      }\n\n      if (!totalItems || totalPages <= 1) {\n        return resolve(res.data)\n      }\n\n      const queue = []\n\n      for (let page = 2; page <= totalPages; page++) {\n        queue.push({ per_page: perPage, page })\n      }\n\n      await pMap(queue, async params => {\n        try {\n          const { data } = await this.fetch(path, params)\n          res.data.push(...ensureArrayData(path, data))\n        } catch (err) {\n          console.log(err.message)\n        }\n      }, { concurrency: concurrent })\n\n      resolve(res.data)\n    })\n  }\n\n  normalizeFields (fields, isACF) {\n    const res = {}\n\n    for (const key in fields) {\n      if (key.startsWith('_')) continue // skip links and embeds etc\n      res[camelCase(key)] = this.normalizeFieldValue(fields[key], isACF || key === 'acf')\n    }\n\n    return res\n  }\n\n  normalizeFieldValue (value, isACF) {\n    if (value === null) return null\n    if (value === undefined) return null\n\n    if (Array.isArray(value)) {\n      return value.map(v => this.normalizeFieldValue(v, isACF))\n    }\n\n    if (isPlainObject(value)) {\n      if (value.type === 'image' && value.filename && value.url && isACF && this.options.downloadACFImages) {\n        const filename = this.slugify(value.filename)\n        this.downloadImage(\n          value.url,\n          DOWNLOAD_DIR,\n          filename\n        )\n        return {\n          src: path.resolve(DOWNLOAD_DIR, filename),\n          title: value.title,\n          alt: value.description\n        }\n      } else if (value.post_type && (value.ID || value.id)) {\n        const typeName = this.createTypeName(value.post_type)\n        const id = value.ID || value.id\n\n        return this.store.createReference(typeName, id)\n      } else if (value.filename && (value.ID || value.id)) {\n        const typeName = this.createTypeName(TYPE_ATTACHEMENT)\n        const id = value.ID || value.id\n\n        return this.store.createReference(typeName, id)\n      } else if (value.hasOwnProperty('rendered')) {\n        return value.rendered\n      }\n\n      return this.normalizeFields(value, isACF)\n    }\n\n    if (isACF && this.options.downloadACFImages && String(value).match(/^https:\\/\\/.*\\/.*\\.(jpg|png|svg|jpeg)($|\\?)/i)) {\n      const filename = this.slugify(value.split('/').pop())\n      console.log(`Downloading ${filename}`)\n      this.downloadImage(\n        value,\n        DOWNLOAD_DIR,\n        filename\n      )\n      return path.resolve(DOWNLOAD_DIR, filename)\n    }\n\n    return value\n  }\n\n  createTypeName (name = '') {\n    return camelCase(`${this.options.typeName} ${name}`, { pascalCase: true })\n  }\n}\n\nfunction ensureArrayData (url, data) {\n  if (!Array.isArray(data)) {\n    try {\n      data = JSON.parse(data)\n    } catch (err) {\n      throw new Error(\n        `Failed to fetch ${url}\\n` +\n        `Expected JSON response but received:\\n` +\n        `${data.trim().substring(0, 150)}...\\n`\n      )\n    }\n  }\n  return data\n}\n\nmodule.exports = WordPressSource\n"]}