Blame utils/routes-loader.js

Packit Service 0246ed
/**
Packit Service 0246ed
 * React Static Boilerplate
Packit Service 0246ed
 * https://github.com/kriasoft/react-static-boilerplate
Packit Service 0246ed
 *
Packit Service 0246ed
 * Copyright © 2015-present Kriasoft, LLC. All rights reserved.
Packit Service 0246ed
 *
Packit Service 0246ed
 * This source code is licensed under the MIT license found in the
Packit Service 0246ed
 * LICENSE.txt file in the root directory of this source tree.
Packit Service 0246ed
 */
Packit Service 0246ed
Packit Service 0246ed
const toRegExp = require("path-to-regexp");
Packit Service 0246ed
Packit Service 0246ed
function escape(text) {
Packit Service 0246ed
  return text.replace("'", "\\'").replace("\\", "\\\\");
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
/**
Packit Service 0246ed
 * Converts application routes from JSON to JavaScript. For example, a route like
Packit Service 0246ed
 *
Packit Service 0246ed
 *   {
Packit Service 0246ed
 *     "path": "/about",
Packit Service 0246ed
 *     "page": "./pages/about"
Packit Service 0246ed
 *   }
Packit Service 0246ed
 *
Packit Service 0246ed
 * becomes
Packit Service 0246ed
 *
Packit Service 0246ed
 *   {
Packit Service 0246ed
 *     path: '/about',
Packit Service 0246ed
 *     pattern: /^\\/about(?:\/(?=$))?$/i,
Packit Service 0246ed
 *     keys: [],
Packit Service 0246ed
 *     page: './pages/about',
Packit Service 0246ed
 *     load: function () { return new Promise(resolve => require(['./pages/about'], resolve)); }
Packit Service 0246ed
 *   }
Packit Service 0246ed
 */
Packit Service 0246ed
module.exports = function routesLoader(source) {
Packit Service 0246ed
  this.cacheable();
Packit Service 0246ed
Packit Service 0246ed
  const output = ["[\n"];
Packit Service 0246ed
  const routes = JSON.parse(source);
Packit Service 0246ed
Packit Service 0246ed
  for (const route of routes) {
Packit Service 0246ed
    const keys = [];
Packit Service 0246ed
    const pattern = toRegExp(route.path, keys);
Packit Service 0246ed
    const required =
Packit Service 0246ed
      route.chunk && route.chunk === "main"
Packit Service 0246ed
        ? (module) => `Promise.resolve(require('${escape(module)}').default)`
Packit Service 0246ed
        : (module) => `new Promise(function (resolve, reject) {
Packit Service 0246ed
        try {
Packit Service 0246ed
          require.ensure(['${escape(module)}'], function (require) {
Packit Service 0246ed
            resolve(require('${escape(module)}').default);
Packit Service 0246ed
          }${typeof route.chunk === "string" ? `, '${escape(route.chunk)}'` : ""});
Packit Service 0246ed
        } catch (err) {
Packit Service 0246ed
          reject(err);
Packit Service 0246ed
        }
Packit Service 0246ed
      })`;
Packit Service 0246ed
    output.push("  {\n");
Packit Service 0246ed
    output.push(`    path: '${escape(route.path)}',\n`);
Packit Service 0246ed
    output.push(`    pattern: ${pattern.toString()},\n`);
Packit Service 0246ed
    output.push(`    keys: ${JSON.stringify(keys)},\n`);
Packit Service 0246ed
    output.push(`    page: '${escape(route.page)}',\n`);
Packit Service 0246ed
    if (route.data) {
Packit Service 0246ed
      output.push(`    data: ${JSON.stringify(route.data)},\n`);
Packit Service 0246ed
    }
Packit Service 0246ed
    output.push(`    load() {\n      return ${required(route.page)};\n    },\n`);
Packit Service 0246ed
    output.push("  },\n");
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  output.push("]");
Packit Service 0246ed
Packit Service 0246ed
  return `module.exports = ${output.join("")};`;
Packit Service 0246ed
};