Skip to content
This repository was archived by the owner on Aug 1, 2023. It is now read-only.
/ hack-router-codegen Public archive

Codegen (eg URI Map generation) on top of hhvm/hack-router

License

Notifications You must be signed in to change notification settings

hhvm/hack-router-codegen

Folders and files

NameName
Last commit message
Last commit date

Latest commit

f204cba · Jun 7, 2022
Jun 7, 2022
Apr 22, 2022
Jun 7, 2022
Apr 22, 2022
Apr 22, 2022
Nov 18, 2021
May 3, 2021
Apr 22, 2022
Feb 21, 2019
Nov 18, 2021
Apr 12, 2018
Nov 18, 2021
Apr 22, 2022
Apr 22, 2022
Oct 5, 2018

Repository files navigation

Hack-Router-Codegen

Continuous Integration

Code generation for controller classes using the UriPattern system from hhvm/hack-router

This currently supports generating:

  • Request routing maps
  • Hack request routing classes for your site

For now, looking at the unit tests is the best way to learn how to use it.

Building a Request Router

<?hh
use \Facebook\HackRouter\Codegen;

final class UpdateCodegen {
  public function main(): void {
    Codegen::forTree(
      __DIR__.'/../src/',
      shape(
        'controllerBase' => WebController::class,
        'router' => shape(
          'abstract' => false,
          'file' => __DIR__.'/../codegen/Router.php',
          'class' => 'Router',
        ),
      ),
    )->build;
  }
}

This will generate a class called 'Router', complete with an automatically-generated route map, based on the URI patterns in your controllers.

WebController is the root controller for your site, and must implement Facebook\HackRouter\IncludeInUriMap, which in turn requires Facebook\HackRouter\HasUriPattern - for example:

public static function getUriPattern(): UriPattern {
  return (new UriPattern())
    ->literal('/')
    ->string('MyString')
    ->literal('/')
    ->int('MyInt')
    ->literal('/')
    ->enum(MyEnum::class, 'MyEnum');
}

Commit Your Codegen!

This is unusual advice, but it's the best approach for Hack code as you otherwise have a circular dependency:

  • HHVM will not execute hack code if there are references to undefined classes
  • Once you use the codegen, you reference the codegen classes
  • ... so you can't build them if you don't already have them

Contributing

We welcome GitHub issues and pull requests - please see CONTRIBUTING.md for details.

License

hack-router-codegen is MIT-licensed.