Handled routes

When we take an unhandled route, and run that through a router plugin, on the other end should come out a handled route. This means a plugin would get a route like this:

/user/:id

and returns something like:

const handledRoutes:HandledRoute[] = [
  {
    route: '/user/1'
    type: 'json'
  },
  {
    route: '/user/2'
    type: 'json'
  },
  ...
  {
    route: '/user/10'
    type: 'json'
  },
]

We will take those routes, and add the config and rawRoute for each of them.

Note: All unhandled routes are being fed to a routerPlugin, even the ones that have no config. Those are handled by the default RouterPlugin

The handled route interface

export interface HandledRoute {
  /** the _complete_ route */
  route: string;
  /** the raw route, will be used by puppeteer over the route.route, will be used as is. must include the http(s):// part and eventual params*/
  rawRoute?: string;
  /** String, must be an existing plugin name. mandatory */
  type?: string;
  /** the relevant part of the scully-config  */
  config?: RouteConfig;
  /** variables exposed to angular _while rendering only!_ */
  exposeToPage?: {
    manualIdle?: boolean;
    transferState?: Serializable;
    [key: string]: Serializable;
  };
  /** data will be injected into the static page */
  injectToPage?: {
    [key: string]: Serializable;
  };
  /** an array with render plugin names that will be executed */
  postRenderers?: (string | symbol)[];
  /** the path to the file for a content file */
  templateFile?: string;
  /** optional title, if data holds a title, that will be used instead */
  title?: string;
  /**
   * additional data that will end up in scully.routes.json
   * the frontMatter data will be added here too.
   */
  data?: RouteData;
  /**
   * Plugin to use for rendering
   * Default to puppeteer
   * this support different renders: puppeteer / imgRender / universal / others
   */
  renderPlugin?: string | symbol;
}


/**
 * The data that will be added to the route in scully.routes.json.
 * The frontmatter data will be added here too.
 */
export interface RouteData {
  title?: string;
  author?: string;
  [prop: string]: any;
}
export interface RouteConfig {
  /** this route does a manual Idle check */
  manualIdleCheck?: boolean;
  /** type of the route  */
  type?: string;
  /**
   * an optional function that will be executed on render.
   * Receives the route string, and the config of this route.
   * When it returns false(not falsy), the route isn't rendered.
   */
  preRenderer?: (route: HandledRoute) => Promise<unknown | false>;
  /** Allow in every other setting possible, depends on plugins */
  [key: string]: any;
}

ContentTextRoute

There is an extension of handled routes specially for the contentTextPlugin

export interface ContentTextRoute extends HandledRoute {
  /** the type of content (MD/HTML this determines what plugin us used for render) */
  contentType?: string;
  /** The actual raw content that will be rendered into scully-content */
  content?: string;
}