Hi Evan > The other problem is that my plugin's requirement — "minimize the number of > modules executing before me" — is at odds with the dependency-oriented nature > of startup modules. Modloader doesn't depend on any functionality other than > what's provided by the bootloader.
“Minimize the number of modules executing before me” is the key phrase that triggers my concern about an arms race; I’ve seen it so many times before from CSS to TSRs, and introducing another category is never a good long term answer. The pre-boot approach is attractive precisely because it’s outside the normal mechanisms of TiddlyWiki, and hence can be used to patch/hack those mechanisms. It is there to help avoid the kind of patching-the-rug-you’re-standing-on situation we face here. > Aren’t (the executions before startup) just the cascade of modules requiring > one another? > > Yes. The requirement for my plugin is "run before most modules execute". > There's no best practice for startup modules to discourage them from loading > modules at execution time, and I'm not sure there should be(?), hence the > conundrum. > > You'll notice my modloader plugin eclipses startup.js to move its require() > call into its startup() method. If I don't do this, it's impossible to > modify a large portion of the core (including all widgets). Unfortunately, > this eclipsing is exactly the kind of thing the modloader is designed to > avoid. I’ve no objection to moving existing require() calls into a different scope. > It might be a useful exercise to try to write the documentation for > bootloader modules, and see whether one can explain the difference clearly > without referencing the particular use case that has prompted this discussion. > > "bootloader modules run during the boot process, allowing them to add, remove > and modify tiddlers in the store prior to the wiki's startup process. This > is useful for injecting plugins, code and content that TiddlyWiki isn't > capable of refreshing at runtime. Injected content may be dynamically > generated or loaded from an external source. These modules are encouraged to > minimize their dependency upon other modules in the wiki and to avoid any > dependency on the TiddlyWiki core. > > bootloader modules may safely revise any content in the tiddler store with > the exception of other bootloader modules and their dependencies.” And that sounds pretty much like a description of the existing $tw.preloadTiddlers mechanism. The preboot approach offers the interesting possibility of patching boot.js, too. I’m happy to discuss further but my position remains: * The proposed modifications don’t have any anticipated benefit beyond the usage by the modloader plugin * The proposed modifications are relatively expensive in terms of time and attention from me and the rest of the core team * The modloader plugin already exists and works, with some limitations * The preboot approach already exists as an alternative mechanism that could be used instead, with different limitations Best wishes Jeremy > > > > On Monday, 12 February 2018 16:53:53 UTC-6, Jeremy Ruston wrote: > Hi Evan > > Thanks, I’ll give your arguments more thought, and hope you can join the > hangout tomorrow to discuss further. > >> This is almost, but not quite, the issue. My modloader is the first module >> to have any method called on it. However, TiddlyWiki currently loads (via >> $tw.module.execute) a very large number of modules prior to making any >> method calls. There is no control over the ordering of these executions, >> and they are subsequently impossible to change at boot-time without >> overwriting the core. > > Aren’t those executions just the cascade of modules requiring one another? > >> As I mentioned before, I think there's potentially a meaningful difference >> between startup modules and "bootloader" behaviors. Loading content and >> code into the tiddler store, versus setting up APIs, DOMs and run-time >> functionality. It's much more likely that a loader module would want to >> affect startup behavior than another loader module. > > Bootloader modules feel a bit like an admission of defeat with respect to the > startup module mechanism. > > It might be a useful exercise to try to write the documentation for > bootloader modules, and see whether one can explain the difference clearly > without referencing the particular use case that has prompted this discussion. > > I worry that they are a narrow solution to your specific problem. We could > also be looking at something buggyj has already started: making it easier for > plugins to splice in raw markup code, and possibly adding more hooks to the > boot kernel (eg, an explicit “patch-tiddler” hook). > >> Anyway, the modloader doesn't need this functionality, strictly speaking. >> It just extends its capabilities a bit, so that the whole core can be >> patched by installed plugins. The modloader currently issues a warning when >> trying (and failing) to apply a patch of this nature so it shouldn't catch >> developers by surprise. > > Excellent. > >> The design intent of the modloader is to maintain compatibility with future >> versions of TiddlyWiki. Duplicating bootloader behavior (which is subject >> to change) would detrimental enough to that goal that I'd rather stick with >> the current constraints. > > But I think the code that you’d need to duplicate is code that’s only going > to change if the underlying serialisation formats change? If that happens all > bets are off with respect to future versions of TiddlyWiki maintaining > backwards compatibility with this February 2018 incarnation of the plugin. > > Best wishes > > Jeremy. > >> >> >> On Monday, 12 February 2018 15:10:16 UTC-6, Jeremy Ruston wrote: >> Hi Evan >> >> We’ve got to the point where the changes you are proposing to the core are >> quite deep, and have lots of implications for the rest of the core. It’s >> going to mean a lot of work on verification and testing from me, even if >> somebody else writes the code. I don’t think that burden is justified at >> present. >> >> Better to work with the plugin for a while, and explore the capabilities and >> consequences before we commit to a new mechanism in the core. >> >>> So, as mentioned in the OP I'm pretty leery of the "pre-boot" approach >>> here. The modloader process >>> <http://evanbalster.com/tiddlywiki/formulas.html#%24%3A%2Fplugins%2Febalster%2Fmodloader%2Floader.js> >>> uses quite a lot of $:/boot library functionality to identify and inspect >>> shadow tiddlers as part of the patching process, and to generate the output >>> plugin. >> >> At this point, I don’t see any problem with your plugin duplicating a few >> hundred lines of boot.js; eliminating such duplication would come firmly >> under the heading of optimisation. >> >>> I also worry that working on the pre-boot DOM would create >>> incompatibilities with certain TiddlyWiki environments (but I don't >>> understand this low level stuff very well). >> >> You can see all the code that depends on this stuff. The approach is solid. >> >>> The current modloader can manipulate almost everything in the wiki except >>> for startup modules and the modules they require, hence the request. >> >> Yes, but your proposed solution is just an escalation in an ongoing arms >> race to be the first module to run. >> >>> In most cases, bootloader modules (including modloader) are going to want >>> to generate any output to $:/temp or similar, where they won't create >>> persistent changes in the wiki. >> >> But equally, there’s no limit to the functionality in the boot kernel that >> experimental plugins might want to tweak. Better to be based on a pre-boot >> hook, and have the capability to hook anything, than to be dependent on the >> hooks anticipated and provided by the core. >> >> Best wishes >> >> Jeremy. >> >>> So, as mentioned in the OP I'm pretty leery of the "pre-boot" approach >>> here. The modloader process >>> <http://evanbalster.com/tiddlywiki/formulas.html#%24%3A%2Fplugins%2Febalster%2Fmodloader%2Floader.js> >>> uses quite a lot of $:/boot library functionality to identify and inspect >>> shadow tiddlers as part of the patching process, and to generate the output >>> plugin. I also worry that working on the pre-boot DOM would create >>> incompatibilities with certain TiddlyWiki environments (but I don't >>> understand this low level stuff very well). The current modloader can >>> manipulate almost everything in the wiki except for startup modules and the >>> modules they require, hence the request. >>> >>> In most cases, bootloader modules (including modloader) are going to want >>> to generate any output to $:/temp or similar, where they won't create >>> persistent changes in the wiki. >>> >>> I expect we'll end up discussing in more depth during tomorrow's call. >>> >>> On Monday, 12 February 2018 14:09:17 UTC-6, Jeremy Ruston wrote: >>> Here’s the .tid of the $:/PatchCore.js tiddler, too. >>> >>> Best wishes >>> >>> Jeremy >>> >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "TiddlyWikiDev" group. >>> To unsubscribe from this group and stop receiving emails from it, send an >>> email to tiddlywikide...@ <>googlegroups.com <http://googlegroups.com/>. >>> To post to this group, send email to tiddly...@ <>googlegroups.com >>> <http://googlegroups.com/>. >>> Visit this group at https://groups.google.com/group/tiddlywikidev >>> <https://groups.google.com/group/tiddlywikidev>. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/tiddlywikidev/98a6ce14-9ba5-470d-b396-365f08ddd806%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/tiddlywikidev/98a6ce14-9ba5-470d-b396-365f08ddd806%40googlegroups.com?utm_medium=email&utm_source=footer>. >>> For more options, visit https://groups.google.com/d/optout >>> <https://groups.google.com/d/optout>. >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "TiddlyWikiDev" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to tiddlywikide...@ <>googlegroups.com <http://googlegroups.com/>. >> To post to this group, send email to tiddly...@ <>googlegroups. >> <http://googlegroups.com/>com <http://googlegroups.com/>. >> Visit this group at https://groups.google.com/group/tiddlywikidev >> <https://groups.google.com/group/tiddlywikidev>. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/tiddlywikidev/cf2e1886-225d-49a0-9232-c646ee5352f7%40googlegroups.com >> >> <https://groups.google.com/d/msgid/tiddlywikidev/cf2e1886-225d-49a0-9232-c646ee5352f7%40googlegroups.com?utm_medium=email&utm_source=footer>. >> For more options, visit https://groups.google.com/d/optout >> <https://groups.google.com/d/optout>. > > > -- > You received this message because you are subscribed to the Google Groups > "TiddlyWikiDev" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to tiddlywikidev+unsubscr...@googlegroups.com > <mailto:tiddlywikidev+unsubscr...@googlegroups.com>. > To post to this group, send email to tiddlywikidev@googlegroups.com > <mailto:tiddlywikidev@googlegroups.com>. > Visit this group at https://groups.google.com/group/tiddlywikidev > <https://groups.google.com/group/tiddlywikidev>. > To view this discussion on the web visit > https://groups.google.com/d/msgid/tiddlywikidev/9a8c3a1b-e53c-42b1-9cde-c3a4bbcc7759%40googlegroups.com > > <https://groups.google.com/d/msgid/tiddlywikidev/9a8c3a1b-e53c-42b1-9cde-c3a4bbcc7759%40googlegroups.com?utm_medium=email&utm_source=footer>. > For more options, visit https://groups.google.com/d/optout > <https://groups.google.com/d/optout>. -- You received this message because you are subscribed to the Google Groups "TiddlyWikiDev" group. To unsubscribe from this group and stop receiving emails from it, send an email to tiddlywikidev+unsubscr...@googlegroups.com. To post to this group, send email to tiddlywikidev@googlegroups.com. Visit this group at https://groups.google.com/group/tiddlywikidev. To view this discussion on the web visit https://groups.google.com/d/msgid/tiddlywikidev/162BE208-D20E-434F-9EEA-C59FA64A11A1%40gmail.com. For more options, visit https://groups.google.com/d/optout.