11cb0ef41Sopenharmony_ci# To be or not to be in core
21cb0ef41Sopenharmony_ci
31cb0ef41Sopenharmony_ciThis document explains things to consider when deciding whether a component
41cb0ef41Sopenharmony_cishould be in core or not.
51cb0ef41Sopenharmony_ci
61cb0ef41Sopenharmony_ciA component may be included in core as a dependency, a module, or integrated
71cb0ef41Sopenharmony_ciinto the code base. The same arguments for including/not including in core
81cb0ef41Sopenharmony_cigenerally apply in all of these cases.
91cb0ef41Sopenharmony_ci
101cb0ef41Sopenharmony_ci## Strong arguments for including a component in core
111cb0ef41Sopenharmony_ci
121cb0ef41Sopenharmony_ci1. The component provides functionality that is standardized (such as a
131cb0ef41Sopenharmony_ci   [Web API][]) and overlaps with existing functionality.
141cb0ef41Sopenharmony_ci2. The component can only be implemented in core.
151cb0ef41Sopenharmony_ci3. The component can only be implemented in a performant way in core.
161cb0ef41Sopenharmony_ci4. Developer experience is significantly improved if the component is in core.
171cb0ef41Sopenharmony_ci5. The component provides functionality that can be expected to solve at
181cb0ef41Sopenharmony_ci   least one common use case Node.js users face.
191cb0ef41Sopenharmony_ci6. The component requires native bindings. Inclusion in core enables
201cb0ef41Sopenharmony_ci   utility across operating systems and architectures without requiring
211cb0ef41Sopenharmony_ci   users to have a native compilation toolchain.
221cb0ef41Sopenharmony_ci7. Part or all of the component will also be re-used or duplicated in core.
231cb0ef41Sopenharmony_ci
241cb0ef41Sopenharmony_ci## Strong arguments against including a component in core
251cb0ef41Sopenharmony_ci
261cb0ef41Sopenharmony_ci1. None of the arguments listed in the previous section apply.
271cb0ef41Sopenharmony_ci2. The component has a license that prohibits Node.js from including it in core
281cb0ef41Sopenharmony_ci   without also changing its own license.
291cb0ef41Sopenharmony_ci3. There is already similar functionality in core and adding the component will
301cb0ef41Sopenharmony_ci   provide a second API to do the same thing.
311cb0ef41Sopenharmony_ci4. A component (or/and the standard it is based on) is deprecated and there is
321cb0ef41Sopenharmony_ci   a non-deprecated alternative.
331cb0ef41Sopenharmony_ci5. The component is evolving quickly and inclusion in core will require frequent
341cb0ef41Sopenharmony_ci   API changes.
351cb0ef41Sopenharmony_ci
361cb0ef41Sopenharmony_ci## Benefits and challenges
371cb0ef41Sopenharmony_ci
381cb0ef41Sopenharmony_ciWhen it is unclear whether a component should be included in core, it might be
391cb0ef41Sopenharmony_cihelpful to consider these additional factors.
401cb0ef41Sopenharmony_ci
411cb0ef41Sopenharmony_ci### Benefits
421cb0ef41Sopenharmony_ci
431cb0ef41Sopenharmony_ci1. The component will receive more frequent testing with Node.js CI and CITGM.
441cb0ef41Sopenharmony_ci2. The component will be integrated into the LTS workflow.
451cb0ef41Sopenharmony_ci3. Documentation will be integrated with core.
461cb0ef41Sopenharmony_ci4. There is no dependency on npm.
471cb0ef41Sopenharmony_ci
481cb0ef41Sopenharmony_ci### Challenges
491cb0ef41Sopenharmony_ci
501cb0ef41Sopenharmony_ci1. Inclusion in core, rather than as an ecosystem module, is likely to reduce
511cb0ef41Sopenharmony_ci   code merging velocity. The Node.js process for code review and merging is
521cb0ef41Sopenharmony_ci   more time-consuming than that of most separate modules.
531cb0ef41Sopenharmony_ci2. By being bound to the Node.js release cycle, it is harder and slower to
541cb0ef41Sopenharmony_ci   publish patches.
551cb0ef41Sopenharmony_ci3. Less flexibility for users. They can't update the component
561cb0ef41Sopenharmony_ci   when they choose without also updating Node.js.
571cb0ef41Sopenharmony_ci
581cb0ef41Sopenharmony_ci[Web API]: https://developer.mozilla.org/en-US/docs/Web/API
59