Having considered all of the above approaches, we have settled on the 3rd one - a major refactor.
First logical step was to improve the architecture. Before the version 1.0, GlueStick was just one package installed globally, which had a serious drawback - GlueStick’s version was not tied to a specific project, meaning that whenever new version was released, there was a high chance of breaking other projects, especially in major zero stage (0.x).
Our team decided to go with a solution similar to React Native CLI - by having a global gluestick-cli and a local gluestick project dependency. The former creates a new project and redirects other commands to local gluestick module, which holds the implementation and is specific to a project.
To simplify the process of creating new components, containers or reducers, the generators API was designed, that would create a file based on options and template.
Each one of the team members has been handed over some specific functionalities to refactor, remove inconsistencies and add Flowtypes to check for possible errors. We have migrated the unit test to Jest, which later allowed a single test runner to execute tests from different packages.
For a bundler, considering the requirements, there was only a single choice - Webpack. It’s maturity and flexibility offered a fine-grained control and simplified the process of creating a server for Server Side Rendering of React applications.
We have converted GlueStick repository to a monorepo. Now those two packages could be stored in a single repository thanks to Lerna - a monorepo management tool.
The continuous integration service was replaced with CircleCI 1.0 due to being more developed and stable. Later on we upgraded to CircleCI 2.0, which allowed to define workflow and parallelize stages.
Since each client’s project had different requirements, we created a plugin system in an attempt to support the specific needs - different styling solutions, which combined with Server Side Rendering, had to be handled individually.
Our client have received a stable product for internal use, with no rejections for QA team. It helps them shipping their products and new features faster and with much greater confidence.