Avoid circular dependencies between our craft/paint/render modules.

Review Request #13947 — Created June 5, 2024 and submitted

Information

Ink
master

Reviewers

We had some pretty rough circular dependencies between craft.ts,
paint.ts, and dom.ts. The crafting code would need to paint, and the
paint could would sometimes need to craft. The paint could would also
need to call setProps from dom.ts, but that module also had
renderInto, which needed to craft.

We're taking the following approach to resolving this issue:

  1. dom.ts is now split into sub-modules for different purposes.
    props.ts handles property management, and render.ts handles
    render logic. dom/index.ts wraps both.

  2. The main, co-dependent craft/paint machinery now lives in a
    _craftAndPaint.ts module. Some of this is private, and some public.
    craft.ts and paint.ts re-export these along with their purely
    public-facing methods.

This fully avoids the nasty circular dependencies and makes areas of
responsibility a bit more clear. Mostly.

There aren't any logic changes anywhere. This change is entirely code
motion.

Rollup still warns us about other circular dependencies, but these
should be ignored. These are cases where we have an index.ts that
includes a module that eventually includes another module. The resolver
is going back through index.ts as part of module resolution, and
that's tripping up Rollup. This seems to be documented in Rollup.js
ticket #2271 (https://github.com/rollup/rollup/issues/2271), and at the
moment there are no good options. Fortunately, it's not considered a
dangerous circular dependency.

Unit tests passed.

Builds passed.

Storybook ran as expected.

Summary ID
Avoid circular dependencies between our craft/paint/render modules.
We had some pretty rough circular dependencies between `craft.ts`, `paint.ts`, and `dom.ts`. The crafting code would need to paint, and the paint could would sometimes need to craft. The paint could would also need to call `setProps` from `dom.ts`, but that module also had `renderInto`, which needed to craft. We're taking the following approach to resolving this issue: 1. `dom.ts` is now split into sub-modules for different purposes. `props.ts` handles property management, and `render.ts` handles render logic. `dom/index.ts` wraps both. 2. The main, co-dependent craft/paint machinery now lives in a `_craftAndPaint.ts` module. Some of this is private, and some public. `craft.ts` and `paint.ts` re-export these along with their purely public-facing methods. This fully avoids the nasty circular dependencies and makes areas of responsibility a bit more clear. Mostly. Rollup still warns us about other circular dependencies, but these should be ignored. These are cases where we have an `index.ts` that includes a module that eventually includes another module. The resolver is going back through `index.ts` as part of module resolution, and that's tripping up Rollup. This seems to be documented in Rollup.js ticket #2271 (https://github.com/rollup/rollup/issues/2271), and at the moment there are no good options. Fortunately, it's not considered a dangerous circular dependency.
05f7107c9955f03bca45b32a00be76e00c291103
david
  1. Ship It!
  2. 
      
chipx86
Review request changed
Status:
Completed
Change Summary:
Pushed to master (aa4c254)