turbo-mount 0.4.2 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 542c23e61a166213eaf8a9af2dff4fe8f4c8eb269c3137851049d99b675f786c
4
- data.tar.gz: 0f9b33e1dc20a62fbd547b5d49c4440a133a50bcb7b496085a0e429f14628c55
3
+ metadata.gz: b7f554d4713fb45b0eac6e3cc156f9e02b2ffee4f1e8fb19a1286a284975d329
4
+ data.tar.gz: 076d2e1a64a804337ab30e9e19a71c04055c1ecaccfd3ef929719edf3f2638cc
5
5
  SHA512:
6
- metadata.gz: b76578e28d5cda15a60b969239d34741d2a7a903a988610ac3a1dc231cf4cda9afd8716201cbe2e900e54dfc9d0e9fca768a95f3fe0ad025aa1a15acb6d6a305
7
- data.tar.gz: 63eba634666a53e2119ad98fd13e4a81e90864c1ba170904493ee1255356230c829f65146e570986d45498f26c7b83d248e7a05ac07ff7925d045bdd8e746d19
6
+ metadata.gz: 8be457646dd2d8f48186f6c8235732f76485b74f771772ea03c7a3c7b0f22d36337df48ebccf193aa161292d9f57f059911fde3bd2b24ab5b7887c22225e8775
7
+ data.tar.gz: c0e8df4c8dbf721ea75cd1eadca9cee99289db710300938504e0177fe5a21b139dc95cfed7bd365d21d7bea7472c5dce64a2ab044323e14c9441f4bb07d6860a
data/CHANGELOG.md CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning].
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.3] - 2025-06-11
11
+
12
+ ### Added
13
+
14
+ - Support index resolution for component directories. ([@benngarcia])
15
+
10
16
  ## [0.4.2] - 2025-04-23
11
17
 
12
18
  ### Fixed
@@ -100,7 +106,8 @@ and this project adheres to [Semantic Versioning].
100
106
  [@jkogara]: https://github.com/jkogara
101
107
  [@skryukov]: https://github.com/skryukov
102
108
 
103
- [Unreleased]: https://github.com/skryukov/turbo-mount/compare/v0.4.2...HEAD
109
+ [Unreleased]: https://github.com/skryukov/turbo-mount/compare/v0.4.3...HEAD
110
+ [0.4.3]: https://github.com/skryukov/turbo-mount/compare/v0.4.2...v0.4.3
104
111
  [0.4.2]: https://github.com/skryukov/turbo-mount/compare/v0.4.1...v0.4.2
105
112
  [0.4.1]: https://github.com/skryukov/turbo-mount/compare/v0.4.0...v0.4.1
106
113
  [0.4.0]: https://github.com/skryukov/turbo-mount/compare/v0.3.3...v0.4.0
data/README.md CHANGED
@@ -166,7 +166,7 @@ export default class extends TurboMountController {
166
166
  get componentProps() {
167
167
  return {
168
168
  ...this.propsValue,
169
- onChange: this.onChange,
169
+ onChange: this.onChange.bind(this),
170
170
  };
171
171
  }
172
172
 
@@ -1 +1 @@
1
- {"version":3,"file":"react.min.js","sources":["../../src/plugins/react/index.ts"],"sourcesContent":["import { buildRegisterFunction, Plugin, TurboMount } from \"turbo-mount\";\nimport { ComponentType, createElement } from \"react\";\nimport { createRoot } from \"react-dom/client\";\n\nconst plugin: Plugin<ComponentType> = {\n mountComponent: (mountProps) => {\n const { el, Component, props } = mountProps;\n const root = createRoot(el);\n root.render(createElement(Component, props));\n\n return () => {\n root.unmount();\n };\n },\n};\n\nconst registerComponent = buildRegisterFunction(plugin);\n\nexport { TurboMount, registerComponent };\n\nexport default plugin;\n"],"names":["plugin","mountComponent","mountProps","el","Component","props","root","createRoot","render","createElement","unmount","registerComponent","buildRegisterFunction"],"mappings":"4KAIA,MAAMA,EAAgC,CACpCC,eAAiBC,IACf,MAAMC,GAAEA,EAAEC,UAAEA,EAASC,MAAEA,GAAUH,EAC3BI,EAAOC,EAAWJ,GAGxB,OAFAG,EAAKE,OAAOC,EAAcL,EAAWC,IAE9B,KACLC,EAAKI,SAAS,CACf,GAICC,EAAoBC,EAAsBZ"}
1
+ {"version":3,"file":"react.min.js","sources":["../../src/plugins/react/index.ts"],"sourcesContent":["import { buildRegisterFunction, Plugin, TurboMount } from \"turbo-mount\";\nimport { ComponentType, createElement } from \"react\";\nimport { createRoot } from \"react-dom/client\";\n\nconst plugin: Plugin<ComponentType> = {\n mountComponent: (mountProps) => {\n const { el, Component, props } = mountProps;\n const root = createRoot(el);\n root.render(createElement(Component, props));\n\n return () => {\n root.unmount();\n };\n },\n};\n\nconst registerComponent = buildRegisterFunction(plugin);\n\nexport { TurboMount, registerComponent };\n\nexport default plugin;\n"],"names":["plugin","mountComponent","mountProps","el","Component","props","root","createRoot","render","createElement","unmount","registerComponent","buildRegisterFunction"],"mappings":"4KAIA,MAAMA,EAAgC,CACpCC,eAAiBC,IACf,MAAMC,GAAEA,EAAEC,UAAEA,EAASC,MAAEA,GAAUH,EAC3BI,EAAOC,EAAWJ,GAGxB,OAFAG,EAAKE,OAAOC,EAAcL,EAAWC,IAE9B,KACLC,EAAKI,aAKLC,EAAoBC,EAAsBZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"svelte.min.js","sources":["../../src/plugins/svelte/index.ts"],"sourcesContent":["import { buildRegisterFunction, Plugin, TurboMount } from \"turbo-mount\";\nimport { Component, mount, unmount } from \"svelte\";\n\nconst plugin: Plugin<Component> = {\n mountComponent: (mountProps) => {\n const { el, Component, props } = mountProps;\n const component = mount(Component, { target: el, props });\n return () => {\n unmount(component);\n };\n },\n};\n\nconst registerComponent = buildRegisterFunction(plugin);\n\nexport { TurboMount, registerComponent };\n\nexport default plugin;\n"],"names":["plugin","mountComponent","mountProps","el","Component","props","component","mount","target","unmount","registerComponent","buildRegisterFunction"],"mappings":"oIAGA,MAAMA,EAA4B,CAChCC,eAAiBC,IACf,MAAMC,GAAEA,EAAEC,UAAEA,EAASC,MAAEA,GAAUH,EAC3BI,EAAYC,EAAMH,EAAW,CAAEI,OAAQL,EAAIE,UACjD,MAAO,KACLI,EAAQH,EAAU,CACnB,GAICI,EAAoBC,EAAsBX"}
1
+ {"version":3,"file":"svelte.min.js","sources":["../../src/plugins/svelte/index.ts"],"sourcesContent":["import { buildRegisterFunction, Plugin, TurboMount } from \"turbo-mount\";\nimport { Component, mount, unmount } from \"svelte\";\n\nconst plugin: Plugin<Component> = {\n mountComponent: (mountProps) => {\n const { el, Component, props } = mountProps;\n const component = mount(Component, { target: el, props });\n return () => {\n unmount(component);\n };\n },\n};\n\nconst registerComponent = buildRegisterFunction(plugin);\n\nexport { TurboMount, registerComponent };\n\nexport default plugin;\n"],"names":["plugin","mountComponent","mountProps","el","Component","props","component","mount","target","unmount","registerComponent","buildRegisterFunction"],"mappings":"oIAGA,MAAMA,EAA4B,CAChCC,eAAiBC,IACf,MAAMC,GAAEA,EAAEC,UAAEA,EAASC,MAAEA,GAAUH,EAC3BI,EAAYC,EAAMH,EAAW,CAAEI,OAAQL,EAAIE,UACjD,MAAO,KACLI,EAAQH,MAKRI,EAAoBC,EAAsBX"}
@@ -1 +1 @@
1
- {"version":3,"file":"svelte4.min.js","sources":["../../src/plugins/svelte4/index.ts"],"sourcesContent":["import { buildRegisterFunction, Plugin, TurboMount } from \"turbo-mount\";\nimport { ComponentType } from \"svelte\";\n\nconst plugin: Plugin<ComponentType> = {\n mountComponent: (mountProps) => {\n const { el, Component, props } = mountProps;\n\n const component = new Component({ target: el, props });\n\n return () => {\n component.$destroy();\n };\n },\n};\n\nconst registerComponent = buildRegisterFunction(plugin);\n\nexport { TurboMount, registerComponent };\n\nexport default plugin;\n"],"names":["plugin","mountComponent","mountProps","el","Component","props","component","target","$destroy","registerComponent","buildRegisterFunction"],"mappings":"wFAGA,MAAMA,EAAgC,CACpCC,eAAiBC,IACf,MAAMC,GAAEA,EAAEC,UAAEA,EAASC,MAAEA,GAAUH,EAE3BI,EAAY,IAAIF,EAAU,CAAEG,OAAQJ,EAAIE,UAE9C,MAAO,KACLC,EAAUE,UAAU,CACrB,GAICC,EAAoBC,EAAsBV"}
1
+ {"version":3,"file":"svelte4.min.js","sources":["../../src/plugins/svelte4/index.ts"],"sourcesContent":["import { buildRegisterFunction, Plugin, TurboMount } from \"turbo-mount\";\nimport { ComponentType } from \"svelte\";\n\nconst plugin: Plugin<ComponentType> = {\n mountComponent: (mountProps) => {\n const { el, Component, props } = mountProps;\n\n const component = new Component({ target: el, props });\n\n return () => {\n component.$destroy();\n };\n },\n};\n\nconst registerComponent = buildRegisterFunction(plugin);\n\nexport { TurboMount, registerComponent };\n\nexport default plugin;\n"],"names":["plugin","mountComponent","mountProps","el","Component","props","component","target","$destroy","registerComponent","buildRegisterFunction"],"mappings":"wFAGA,MAAMA,EAAgC,CACpCC,eAAiBC,IACf,MAAMC,GAAEA,EAAEC,UAAEA,EAASC,MAAEA,GAAUH,EAE3BI,EAAY,IAAIF,EAAU,CAAEG,OAAQJ,EAAIE,UAE9C,MAAO,KACLC,EAAUE,cAKVC,EAAoBC,EAAsBV"}
@@ -1 +1 @@
1
- {"version":3,"file":"vue.min.js","sources":["../../src/plugins/vue/index.ts"],"sourcesContent":["import { buildRegisterFunction, Plugin, TurboMount } from \"turbo-mount\";\nimport { App, createApp } from \"vue\";\n\nconst plugin: Plugin<App> = {\n mountComponent: (mountProps) => {\n const { el, Component, props } = mountProps;\n const app = createApp(Component, props as Record<string, unknown>);\n app.mount(el);\n\n return () => {\n app.unmount();\n };\n },\n};\n\nconst registerComponent = buildRegisterFunction(plugin);\n\nexport { TurboMount, registerComponent };\n\nexport default plugin;\n"],"names":["plugin","mountComponent","mountProps","el","Component","props","app","createApp","mount","unmount","registerComponent","buildRegisterFunction"],"mappings":"wHAGA,MAAMA,EAAsB,CAC1BC,eAAiBC,IACf,MAAMC,GAAEA,EAAEC,UAAEA,EAASC,MAAEA,GAAUH,EAC3BI,EAAMC,EAAUH,EAAWC,GAGjC,OAFAC,EAAIE,MAAML,GAEH,KACLG,EAAIG,SAAS,CACd,GAICC,EAAoBC,EAAsBX"}
1
+ {"version":3,"file":"vue.min.js","sources":["../../src/plugins/vue/index.ts"],"sourcesContent":["import { buildRegisterFunction, Plugin, TurboMount } from \"turbo-mount\";\nimport { App, createApp } from \"vue\";\n\nconst plugin: Plugin<App> = {\n mountComponent: (mountProps) => {\n const { el, Component, props } = mountProps;\n const app = createApp(Component, props as Record<string, unknown>);\n app.mount(el);\n\n return () => {\n app.unmount();\n };\n },\n};\n\nconst registerComponent = buildRegisterFunction(plugin);\n\nexport { TurboMount, registerComponent };\n\nexport default plugin;\n"],"names":["plugin","mountComponent","mountProps","el","Component","props","app","createApp","mount","unmount","registerComponent","buildRegisterFunction"],"mappings":"wHAGA,MAAMA,EAAsB,CAC1BC,eAAiBC,IACf,MAAMC,GAAEA,EAAEC,UAAEA,EAASC,MAAEA,GAAUH,EAC3BI,EAAMC,EAAUH,EAAWC,GAGjC,OAFAC,EAAIE,MAAML,GAEH,KACLG,EAAIG,aAKJC,EAAoBC,EAAsBX"}
@@ -54,7 +54,25 @@ TurboMountController.values = {
54
54
  TurboMountController.targets = ["mount"];
55
55
 
56
56
  const camelToKebabCase = (str) => {
57
- return str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
57
+ return str
58
+ .replace(/([a-z])([A-Z])/g, "$1-$2")
59
+ .replace(/_/g, "-")
60
+ .replace(/\//g, "--")
61
+ .toLowerCase();
62
+ };
63
+ const normalizeFilenameToComponentName = (filename) => {
64
+ return filename.replace(/\.\w*$/, "").replace(/^[./]*components\//, "");
65
+ };
66
+ const generateStimulusIdentifiers = (componentName) => {
67
+ const kebabCaseName = camelToKebabCase(componentName);
68
+ return [`turbo-mount--${kebabCaseName}`, `turbo-mount-${kebabCaseName}`];
69
+ };
70
+ const getShortNameForIndexComponent = (componentName) => {
71
+ if (componentName.endsWith("/index")) {
72
+ const shortName = componentName.replace(/\/index$/, "");
73
+ return shortName || null;
74
+ }
75
+ return null;
58
76
  };
59
77
 
60
78
  class TurboMount {
@@ -80,9 +98,7 @@ class TurboMount {
80
98
  }
81
99
  this.components.set(name, { component, plugin });
82
100
  if (controller) {
83
- const controllerName = `turbo-mount-${camelToKebabCase(name)
84
- .replace(/_/g, "-")
85
- .replace(/\//g, "--")}`;
101
+ const controllerName = `turbo-mount-${camelToKebabCase(name)}`;
86
102
  this.application.register(controllerName, controller);
87
103
  }
88
104
  }
@@ -108,28 +124,48 @@ function buildRegisterFunction(plugin) {
108
124
  };
109
125
  }
110
126
 
111
- const identifierNames = (name) => {
112
- const controllerName = camelToKebabCase(name)
113
- .replace(/_/g, "-")
114
- .replace(/\//g, "--");
115
- return [`turbo-mount--${controllerName}`, `turbo-mount-${controllerName}`];
116
- };
117
- const registerComponentsBase = ({ plugin, turboMount, components, controllers, }) => {
118
- const controllerModules = controllers ?? [];
119
- for (const { module, filename } of components) {
120
- const name = filename
121
- .replace(/\.\w*$/, "")
122
- .replace(/^[./]*components\//, "");
123
- const identifiers = identifierNames(name);
124
- const controller = controllerModules.find(({ identifier }) => identifiers.includes(identifier));
127
+ const registerComponentsBase = ({ plugin, turboMount, components, controllers = [], }) => {
128
+ const registeredNames = new Set();
129
+ const indexComponentsToRegisterLater = [];
130
+ for (const { filename, module } of components) {
131
+ const componentName = normalizeFilenameToComponentName(filename);
125
132
  const component = module.default ?? module;
126
- if (controller) {
127
- turboMount.register(plugin, name, component, controller.controllerConstructor);
133
+ registerSingleComponent({
134
+ plugin,
135
+ turboMount,
136
+ availableControllers: controllers,
137
+ componentName,
138
+ component,
139
+ });
140
+ registeredNames.add(componentName);
141
+ const shortName = getShortNameForIndexComponent(componentName);
142
+ if (shortName) {
143
+ indexComponentsToRegisterLater.push({ name: shortName, module });
128
144
  }
129
- else {
130
- turboMount.register(plugin, name, component);
145
+ }
146
+ for (const { name: shortName, module } of indexComponentsToRegisterLater) {
147
+ if (!registeredNames.has(shortName)) {
148
+ const component = module.default ?? module;
149
+ registerSingleComponent({
150
+ plugin,
151
+ turboMount,
152
+ availableControllers: controllers,
153
+ componentName: shortName,
154
+ component,
155
+ });
156
+ registeredNames.add(shortName);
131
157
  }
132
158
  }
133
159
  };
160
+ const registerSingleComponent = ({ plugin, turboMount, availableControllers, componentName, component, }) => {
161
+ const potentialIdentifiers = generateStimulusIdentifiers(componentName);
162
+ const controllerDefinition = availableControllers.find(({ identifier }) => potentialIdentifiers.includes(identifier));
163
+ if (controllerDefinition) {
164
+ turboMount.register(plugin, componentName, component, controllerDefinition.controllerConstructor);
165
+ }
166
+ else {
167
+ turboMount.register(plugin, componentName, component);
168
+ }
169
+ };
134
170
 
135
171
  export { TurboMount, TurboMountController, buildRegisterFunction, registerComponentsBase };
@@ -1,2 +1,2 @@
1
- import{Controller as t,Application as o}from"@hotwired/stimulus";class e extends t{constructor(){super(...arguments),this.skipPropsChangeCallback=!1}connect(){this._umountComponentCallback||(this._umountComponentCallback=this.mountComponent(this.mountElement,this.resolvedComponent,this.componentProps))}disconnect(){this.umountComponent()}propsValueChanged(){this.skipPropsChangeCallback?this.skipPropsChangeCallback=!1:(this.umountComponent(),this._umountComponentCallback||(this._umountComponentCallback=this.mountComponent(this.mountElement,this.resolvedComponent,this.componentProps)))}get componentProps(){return this.propsValue}get mountElement(){return this.hasMountTarget?this.mountTarget:this.element}get resolvedComponent(){return this.resolveMounted(this.componentValue).component}get resolvedPlugin(){return this.resolveMounted(this.componentValue).plugin}umountComponent(){this._umountComponentCallback?.(),this._umountComponentCallback=void 0}mountComponent(t,o,e){return this.resolvedPlugin.mountComponent({el:t,Component:o,props:e})}resolveMounted(t){return this.application.turboMount.resolve(t)}setComponentProps(t){this.skipPropsChangeCallback=!0,this.propsValue=t}}e.values={props:Object,component:String},e.targets=["mount"];const n=t=>t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase();class r{constructor(t={}){this.components=new Map,this.application=this.findOrStartApplication(t.application),this.application.turboMount=this,this.application.register("turbo-mount",e),document.addEventListener("turbo:before-morph-element",(t=>{const o=t,{target:e,detail:n}=o;e.getAttribute("data-controller")?.includes("turbo-mount")&&(e.setAttribute("data-turbo-mount-props-value",n.newElement.getAttribute("data-turbo-mount-props-value")||"{}"),t.preventDefault())}))}register(t,o,r,s){if(s||(s=e),this.components.has(o))throw new Error(`Component '${o}' is already registered.`);if(this.components.set(o,{component:r,plugin:t}),s){const t=`turbo-mount-${n(o).replace(/_/g,"-").replace(/\//g,"--")}`;this.application.register(t,s)}}resolve(t){const o=this.components.get(t);if(!o)throw new Error(`Unknown component: ${t}`);return o}findOrStartApplication(t){let e=t||window.Stimulus;return e||(e=o.start(),window.Stimulus=e),e}}function s(t){return(o,e,n,r)=>{o.register(t,e,n,r)}}const i=t=>{const o=n(t).replace(/_/g,"-").replace(/\//g,"--");return[`turbo-mount--${o}`,`turbo-mount-${o}`]},u=({plugin:t,turboMount:o,components:e,controllers:n})=>{const r=n??[];for(const{module:n,filename:s}of e){const e=s.replace(/\.\w*$/,"").replace(/^[./]*components\//,""),u=i(e),p=r.find((({identifier:t})=>u.includes(t))),l=n.default??n;p?o.register(t,e,l,p.controllerConstructor):o.register(t,e,l)}};export{r as TurboMount,e as TurboMountController,s as buildRegisterFunction,u as registerComponentsBase};
1
+ import{Controller as t,Application as o}from"@hotwired/stimulus";class n extends t{constructor(){super(...arguments),this.skipPropsChangeCallback=!1}connect(){this._umountComponentCallback||(this._umountComponentCallback=this.mountComponent(this.mountElement,this.resolvedComponent,this.componentProps))}disconnect(){this.umountComponent()}propsValueChanged(){this.skipPropsChangeCallback?this.skipPropsChangeCallback=!1:(this.umountComponent(),this._umountComponentCallback||(this._umountComponentCallback=this.mountComponent(this.mountElement,this.resolvedComponent,this.componentProps)))}get componentProps(){return this.propsValue}get mountElement(){return this.hasMountTarget?this.mountTarget:this.element}get resolvedComponent(){return this.resolveMounted(this.componentValue).component}get resolvedPlugin(){return this.resolveMounted(this.componentValue).plugin}umountComponent(){this._umountComponentCallback?.(),this._umountComponentCallback=void 0}mountComponent(t,o,n){return this.resolvedPlugin.mountComponent({el:t,Component:o,props:n})}resolveMounted(t){return this.application.turboMount.resolve(t)}setComponentProps(t){this.skipPropsChangeCallback=!0,this.propsValue=t}}n.values={props:Object,component:String},n.targets=["mount"];const e=t=>t.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/_/g,"-").replace(/\//g,"--").toLowerCase(),r=t=>t.replace(/\.\w*$/,"").replace(/^[./]*components\//,""),s=t=>{if(t.endsWith("/index")){return t.replace(/\/index$/,"")||null}return null};class i{constructor(t={}){this.components=new Map,this.application=this.findOrStartApplication(t.application),this.application.turboMount=this,this.application.register("turbo-mount",n),document.addEventListener("turbo:before-morph-element",(t=>{const o=t,{target:n,detail:e}=o;n.getAttribute("data-controller")?.includes("turbo-mount")&&(n.setAttribute("data-turbo-mount-props-value",e.newElement.getAttribute("data-turbo-mount-props-value")||"{}"),t.preventDefault())}))}register(t,o,r,s){if(s||(s=n),this.components.has(o))throw new Error(`Component '${o}' is already registered.`);if(this.components.set(o,{component:r,plugin:t}),s){const t=`turbo-mount-${e(o)}`;this.application.register(t,s)}}resolve(t){const o=this.components.get(t);if(!o)throw new Error(`Unknown component: ${t}`);return o}findOrStartApplication(t){let n=t||window.Stimulus;return n||(n=o.start(),window.Stimulus=n),n}}function u(t){return(o,n,e,r)=>{o.register(t,n,e,r)}}const l=({plugin:t,turboMount:o,components:n,controllers:e=[]})=>{const i=new Set,u=[];for(const{filename:l,module:a}of n){const n=r(l),m=a.default??a;p({plugin:t,turboMount:o,availableControllers:e,componentName:n,component:m}),i.add(n);const c=s(n);c&&u.push({name:c,module:a})}for(const{name:n,module:r}of u)if(!i.has(n)){const s=r.default??r;p({plugin:t,turboMount:o,availableControllers:e,componentName:n,component:s}),i.add(n)}},p=({plugin:t,turboMount:o,availableControllers:n,componentName:r,component:s})=>{const i=(t=>{const o=e(t);return[`turbo-mount--${o}`,`turbo-mount-${o}`]})(r),u=n.find((({identifier:t})=>i.includes(t)));u?o.register(t,r,s,u.controllerConstructor):o.register(t,r,s)};export{i as TurboMount,n as TurboMountController,u as buildRegisterFunction,l as registerComponentsBase};
2
2
  //# sourceMappingURL=turbo-mount.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"turbo-mount.min.js","sources":["../src/turbo-mount-controller.ts","../src/helpers.ts","../src/turbo-mount.ts","../src/registerComponentsBase.ts"],"sourcesContent":["import { Controller } from \"@hotwired/stimulus\";\nimport { ApplicationWithTurboMount } from \"./turbo-mount\";\n\nexport class TurboMountController extends Controller {\n static values = {\n props: Object,\n component: String,\n };\n static targets = [\"mount\"];\n\n private skipPropsChangeCallback = false;\n\n declare propsValue: object;\n declare componentValue: string;\n declare readonly hasMountTarget: boolean;\n declare readonly mountTarget: Element;\n\n _umountComponentCallback?: () => void;\n\n connect() {\n this._umountComponentCallback ||= this.mountComponent(\n this.mountElement,\n this.resolvedComponent,\n this.componentProps,\n );\n }\n\n disconnect() {\n this.umountComponent();\n }\n\n propsValueChanged() {\n // Prevent re-mounting the component if the props are being set by the component itself\n if (this.skipPropsChangeCallback) {\n this.skipPropsChangeCallback = false;\n return;\n }\n\n this.umountComponent();\n this._umountComponentCallback ||= this.mountComponent(\n this.mountElement,\n this.resolvedComponent,\n this.componentProps,\n );\n }\n\n get componentProps() {\n return this.propsValue;\n }\n\n get mountElement() {\n return this.hasMountTarget ? this.mountTarget : this.element;\n }\n\n get resolvedComponent() {\n return this.resolveMounted(this.componentValue).component;\n }\n\n get resolvedPlugin() {\n return this.resolveMounted(this.componentValue).plugin;\n }\n\n umountComponent() {\n this._umountComponentCallback?.();\n this._umountComponentCallback = undefined;\n }\n\n mountComponent(el: Element, Component: unknown, props: object) {\n return this.resolvedPlugin.mountComponent({ el, Component, props });\n }\n\n resolveMounted(component: string) {\n const app = this.application as ApplicationWithTurboMount;\n return app.turboMount.resolve(component);\n }\n\n setComponentProps(props: object) {\n this.skipPropsChangeCallback = true;\n this.propsValue = props;\n }\n}\n","export const camelToKebabCase = (str: string) => {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n};\n","import { Application, ControllerConstructor } from \"@hotwired/stimulus\";\n\nimport { camelToKebabCase } from \"./helpers\";\nimport { TurboMountController } from \"./turbo-mount-controller\";\n\ndeclare global {\n interface Window {\n Stimulus?: Application;\n }\n}\n\nexport interface ApplicationWithTurboMount extends Application {\n turboMount: TurboMount;\n}\n\nexport type MountComponentProps<T> = {\n el: Element;\n Component: T;\n props: object;\n};\n\nexport type Plugin<T> = {\n mountComponent: (props: MountComponentProps<T>) => () => void;\n};\n\nexport type TurboMountProps = {\n application?: Application;\n};\n\ntype TurboMountComponents<T> = Map<string, { component: T; plugin: Plugin<T> }>;\n\ninterface TurboMorphEvent extends CustomEvent {\n target: Element;\n detail: {\n newElement: Element;\n };\n}\n\nexport class TurboMount {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n components: TurboMountComponents<any>;\n application: ApplicationWithTurboMount;\n\n constructor(props: TurboMountProps = {}) {\n this.components = new Map();\n this.application = this.findOrStartApplication(props.application);\n this.application.turboMount = this;\n this.application.register(\"turbo-mount\", TurboMountController);\n\n document.addEventListener(\"turbo:before-morph-element\", (event) => {\n const turboMorphEvent = event as unknown as TurboMorphEvent;\n const { target, detail } = turboMorphEvent;\n\n if (target.getAttribute(\"data-controller\")?.includes(\"turbo-mount\")) {\n target.setAttribute(\n \"data-turbo-mount-props-value\",\n detail.newElement.getAttribute(\"data-turbo-mount-props-value\") ||\n \"{}\",\n );\n event.preventDefault();\n }\n });\n }\n\n register<T>(\n plugin: Plugin<T>,\n name: string,\n component: T,\n controller?: ControllerConstructor,\n ) {\n controller ||= TurboMountController;\n if (this.components.has(name)) {\n throw new Error(`Component '${name}' is already registered.`);\n }\n this.components.set(name, { component, plugin });\n\n if (controller) {\n const controllerName = `turbo-mount-${camelToKebabCase(name)\n .replace(/_/g, \"-\")\n .replace(/\\//g, \"--\")}`;\n this.application.register(controllerName, controller);\n }\n }\n\n resolve(name: string) {\n const component = this.components.get(name);\n if (!component) {\n throw new Error(`Unknown component: ${name}`);\n }\n return component;\n }\n\n private findOrStartApplication(hydratedApp?: Application) {\n let application = hydratedApp || window.Stimulus;\n\n if (!application) {\n application = Application.start();\n window.Stimulus = application;\n }\n return application as ApplicationWithTurboMount;\n }\n}\n\nexport function buildRegisterFunction<T>(plugin: Plugin<T>) {\n return (\n turboMount: TurboMount,\n name: string,\n component: T,\n controller?: ControllerConstructor,\n ) => {\n turboMount.register(plugin, name, component, controller);\n };\n}\n","import { Definition } from \"@hotwired/stimulus\";\n\nimport { TurboMount, Plugin } from \"./turbo-mount\";\nimport { camelToKebabCase } from \"./helpers\";\n\nexport type ComponentModule = { default: never } | never;\n\nexport type ComponentDefinition = {\n filename: string;\n module: ComponentModule;\n};\n\ntype RegisterComponentsProps<T> = {\n plugin: Plugin<T>;\n turboMount: TurboMount;\n components: ComponentDefinition[];\n controllers?: Definition[];\n};\n\nconst identifierNames = (name: string) => {\n const controllerName = camelToKebabCase(name)\n .replace(/_/g, \"-\")\n .replace(/\\//g, \"--\");\n\n return [`turbo-mount--${controllerName}`, `turbo-mount-${controllerName}`];\n};\n\nexport const registerComponentsBase = <T>({\n plugin,\n turboMount,\n components,\n controllers,\n}: RegisterComponentsProps<T>) => {\n const controllerModules = controllers ?? [];\n\n for (const { module, filename } of components) {\n const name = filename\n .replace(/\\.\\w*$/, \"\")\n .replace(/^[./]*components\\//, \"\");\n\n const identifiers = identifierNames(name);\n\n const controller = controllerModules.find(({ identifier }) =>\n identifiers.includes(identifier),\n );\n const component = module.default ?? module;\n\n if (controller) {\n turboMount.register(\n plugin,\n name,\n component,\n controller.controllerConstructor,\n );\n } else {\n turboMount.register(plugin, name, component);\n }\n }\n};\n"],"names":["TurboMountController","Controller","constructor","this","skipPropsChangeCallback","connect","_umountComponentCallback","mountComponent","mountElement","resolvedComponent","componentProps","disconnect","umountComponent","propsValueChanged","propsValue","hasMountTarget","mountTarget","element","resolveMounted","componentValue","component","resolvedPlugin","plugin","undefined","el","Component","props","application","turboMount","resolve","setComponentProps","values","Object","String","targets","camelToKebabCase","str","replace","toLowerCase","TurboMount","components","Map","findOrStartApplication","register","document","addEventListener","event","turboMorphEvent","target","detail","getAttribute","includes","setAttribute","newElement","preventDefault","name","controller","has","Error","set","controllerName","get","hydratedApp","window","Stimulus","Application","start","buildRegisterFunction","identifierNames","registerComponentsBase","controllers","controllerModules","module","filename","identifiers","find","identifier","default","controllerConstructor"],"mappings":"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"}
1
+ {"version":3,"file":"turbo-mount.min.js","sources":["../src/turbo-mount-controller.ts","../src/helpers.ts","../src/turbo-mount.ts","../src/registerComponentsBase.ts"],"sourcesContent":["import { Controller } from \"@hotwired/stimulus\";\nimport { ApplicationWithTurboMount } from \"./turbo-mount\";\n\nexport class TurboMountController extends Controller {\n static values = {\n props: Object,\n component: String,\n };\n static targets = [\"mount\"];\n\n private skipPropsChangeCallback = false;\n\n declare propsValue: object;\n declare componentValue: string;\n declare readonly hasMountTarget: boolean;\n declare readonly mountTarget: Element;\n\n _umountComponentCallback?: () => void;\n\n connect() {\n this._umountComponentCallback ||= this.mountComponent(\n this.mountElement,\n this.resolvedComponent,\n this.componentProps,\n );\n }\n\n disconnect() {\n this.umountComponent();\n }\n\n propsValueChanged() {\n // Prevent re-mounting the component if the props are being set by the component itself\n if (this.skipPropsChangeCallback) {\n this.skipPropsChangeCallback = false;\n return;\n }\n\n this.umountComponent();\n this._umountComponentCallback ||= this.mountComponent(\n this.mountElement,\n this.resolvedComponent,\n this.componentProps,\n );\n }\n\n get componentProps() {\n return this.propsValue;\n }\n\n get mountElement() {\n return this.hasMountTarget ? this.mountTarget : this.element;\n }\n\n get resolvedComponent() {\n return this.resolveMounted(this.componentValue).component;\n }\n\n get resolvedPlugin() {\n return this.resolveMounted(this.componentValue).plugin;\n }\n\n umountComponent() {\n this._umountComponentCallback?.();\n this._umountComponentCallback = undefined;\n }\n\n mountComponent(el: Element, Component: unknown, props: object) {\n return this.resolvedPlugin.mountComponent({ el, Component, props });\n }\n\n resolveMounted(component: string) {\n const app = this.application as ApplicationWithTurboMount;\n return app.turboMount.resolve(component);\n }\n\n setComponentProps(props: object) {\n this.skipPropsChangeCallback = true;\n this.propsValue = props;\n }\n}\n","export const camelToKebabCase = (str: string) => {\n return str\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/_/g, \"-\")\n .replace(/\\//g, \"--\")\n .toLowerCase();\n};\n\n// Normalizes a component filename into a standardized component name.\n// Example: './components/users/UserProfile.tsx' -> 'users/UserProfile'\n// Example: 'global/utility/debounce_button.js' -> 'global/utility/debounce_button'\nexport const normalizeFilenameToComponentName = (filename: string): string => {\n return filename.replace(/\\.\\w*$/, \"\").replace(/^[./]*components\\//, \"\");\n};\n\nexport const generateStimulusIdentifiers = (\n componentName: string,\n): string[] => {\n const kebabCaseName = camelToKebabCase(componentName);\n\n return [`turbo-mount--${kebabCaseName}`, `turbo-mount-${kebabCaseName}`];\n};\n\nexport const getShortNameForIndexComponent = (\n componentName: string,\n): string | null => {\n if (componentName.endsWith(\"/index\")) {\n const shortName = componentName.replace(/\\/index$/, \"\");\n return shortName || null;\n }\n return null;\n};\n","import { Application, ControllerConstructor } from \"@hotwired/stimulus\";\n\nimport { camelToKebabCase } from \"./helpers\";\nimport { TurboMountController } from \"./turbo-mount-controller\";\n\ndeclare global {\n interface Window {\n Stimulus?: Application;\n }\n}\n\nexport interface ApplicationWithTurboMount extends Application {\n turboMount: TurboMount;\n}\n\nexport type MountComponentProps<T> = {\n el: Element;\n Component: T;\n props: object;\n};\n\nexport type Plugin<T> = {\n mountComponent: (props: MountComponentProps<T>) => () => void;\n};\n\nexport type TurboMountProps = {\n application?: Application;\n};\n\ntype TurboMountComponents<T> = Map<string, { component: T; plugin: Plugin<T> }>;\n\ninterface TurboMorphEvent extends CustomEvent {\n target: Element;\n detail: {\n newElement: Element;\n };\n}\n\nexport class TurboMount {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n components: TurboMountComponents<any>;\n application: ApplicationWithTurboMount;\n\n constructor(props: TurboMountProps = {}) {\n this.components = new Map();\n this.application = this.findOrStartApplication(props.application);\n this.application.turboMount = this;\n this.application.register(\"turbo-mount\", TurboMountController);\n\n document.addEventListener(\"turbo:before-morph-element\", (event) => {\n const turboMorphEvent = event as unknown as TurboMorphEvent;\n const { target, detail } = turboMorphEvent;\n\n if (target.getAttribute(\"data-controller\")?.includes(\"turbo-mount\")) {\n target.setAttribute(\n \"data-turbo-mount-props-value\",\n detail.newElement.getAttribute(\"data-turbo-mount-props-value\") ||\n \"{}\",\n );\n event.preventDefault();\n }\n });\n }\n\n register<T>(\n plugin: Plugin<T>,\n name: string,\n component: T,\n controller?: ControllerConstructor,\n ) {\n controller ||= TurboMountController;\n if (this.components.has(name)) {\n throw new Error(`Component '${name}' is already registered.`);\n }\n this.components.set(name, { component, plugin });\n\n if (controller) {\n const controllerName = `turbo-mount-${camelToKebabCase(name)}`;\n this.application.register(controllerName, controller);\n }\n }\n\n resolve(name: string) {\n const component = this.components.get(name);\n if (!component) {\n throw new Error(`Unknown component: ${name}`);\n }\n return component;\n }\n\n private findOrStartApplication(hydratedApp?: Application) {\n let application = hydratedApp || window.Stimulus;\n\n if (!application) {\n application = Application.start();\n window.Stimulus = application;\n }\n return application as ApplicationWithTurboMount;\n }\n}\n\nexport function buildRegisterFunction<T>(plugin: Plugin<T>) {\n return (\n turboMount: TurboMount,\n name: string,\n component: T,\n controller?: ControllerConstructor,\n ) => {\n turboMount.register(plugin, name, component, controller);\n };\n}\n","import { Definition } from \"@hotwired/stimulus\";\n\nimport { TurboMount, Plugin } from \"./turbo-mount\";\nimport {\n getShortNameForIndexComponent,\n normalizeFilenameToComponentName,\n generateStimulusIdentifiers,\n} from \"./helpers\";\n\nexport type ComponentModule = { default: never } | never;\n\nexport type ComponentDefinition = {\n filename: string;\n module: ComponentModule;\n};\n\ntype RegisterComponentsProps<T> = {\n plugin: Plugin<T>;\n turboMount: TurboMount;\n components: ComponentDefinition[];\n controllers?: Definition[];\n};\n\n// Registers multiple components with TurboMount, potentially linking them\n// to Stimulus controllers based on naming conventions. Handles index\n// components by registering them under both their full path and the parent\n// directory name if available.\nexport const registerComponentsBase = <T>({\n plugin,\n turboMount,\n components,\n controllers = [],\n}: RegisterComponentsProps<T>) => {\n const registeredNames = new Set<string>();\n const indexComponentsToRegisterLater: Array<{\n name: string;\n module: ComponentModule;\n }> = [];\n\n for (const { filename, module } of components) {\n const componentName = normalizeFilenameToComponentName(filename);\n const component = module.default ?? module;\n\n registerSingleComponent({\n plugin,\n turboMount,\n availableControllers: controllers,\n componentName,\n component,\n });\n registeredNames.add(componentName);\n\n // If component path ends with /index, prepare for possible registration\n // under the shorter directory name in the second pass.\n const shortName = getShortNameForIndexComponent(componentName);\n if (shortName) {\n indexComponentsToRegisterLater.push({ name: shortName, module });\n }\n }\n\n // Second Pass: Register 'index' components using their shorter directory name\n // This pass ensures that an explicit component (e.g., 'button.js') takes\n // precedence over an index component (e.g., 'button/index.js') if both\n // would resolve to the same short name ('button').\n for (const { name: shortName, module } of indexComponentsToRegisterLater) {\n if (!registeredNames.has(shortName)) {\n const component = module.default ?? module;\n\n registerSingleComponent({\n plugin,\n turboMount,\n availableControllers: controllers,\n componentName: shortName,\n component,\n });\n registeredNames.add(shortName);\n }\n }\n};\n\nconst registerSingleComponent = <T>({\n plugin,\n turboMount,\n availableControllers,\n componentName,\n component,\n}: {\n plugin: Plugin<T>;\n turboMount: TurboMount;\n availableControllers: Definition[];\n componentName: string;\n component: T;\n}) => {\n const potentialIdentifiers = generateStimulusIdentifiers(componentName);\n\n const controllerDefinition = availableControllers.find(({ identifier }) =>\n potentialIdentifiers.includes(identifier),\n );\n\n if (controllerDefinition) {\n turboMount.register(\n plugin,\n componentName,\n component,\n controllerDefinition.controllerConstructor,\n );\n } else {\n turboMount.register(plugin, componentName, component);\n }\n};\n"],"names":["TurboMountController","Controller","constructor","this","skipPropsChangeCallback","connect","_umountComponentCallback","mountComponent","mountElement","resolvedComponent","componentProps","disconnect","umountComponent","propsValueChanged","propsValue","hasMountTarget","mountTarget","element","resolveMounted","componentValue","component","resolvedPlugin","plugin","undefined","el","Component","props","application","turboMount","resolve","setComponentProps","values","Object","String","targets","camelToKebabCase","str","replace","toLowerCase","normalizeFilenameToComponentName","filename","getShortNameForIndexComponent","componentName","endsWith","TurboMount","components","Map","findOrStartApplication","register","document","addEventListener","event","turboMorphEvent","target","detail","getAttribute","includes","setAttribute","newElement","preventDefault","name","controller","has","Error","set","controllerName","get","hydratedApp","window","Stimulus","Application","start","buildRegisterFunction","registerComponentsBase","controllers","registeredNames","Set","indexComponentsToRegisterLater","module","default","registerSingleComponent","availableControllers","add","shortName","push","potentialIdentifiers","kebabCaseName","generateStimulusIdentifiers","controllerDefinition","find","identifier","controllerConstructor"],"mappings":"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"}
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Turbo
4
4
  module Mount
5
- VERSION = "0.4.2"
5
+ VERSION = "0.4.3"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: turbo-mount
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Svyatoslav Kryukov
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-04-23 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: railties
@@ -82,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0'
84
84
  requirements: []
85
- rubygems_version: 3.6.2
85
+ rubygems_version: 3.6.7
86
86
  specification_version: 4
87
87
  summary: Use React, Vue, Svelte, and other components with Hotwire.
88
88
  test_files: []