@mintjamsinc/ichigojs 0.1.12 → 0.1.14

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.
@@ -7228,14 +7228,6 @@
7228
7228
  * The virtual node to which this directive is applied.
7229
7229
  */
7230
7230
  #vNode;
7231
- /**
7232
- * The component ID expression.
7233
- */
7234
- #expression;
7235
- /**
7236
- * Whether the component ID is static (not reactive).
7237
- */
7238
- #isStatic = false;
7239
7231
  /**
7240
7232
  * The component ID to render.
7241
7233
  */
@@ -7250,10 +7242,7 @@
7250
7242
  #isActivated = false;
7251
7243
  constructor(context) {
7252
7244
  this.#vNode = context.vNode;
7253
- this.#expression = context.attribute.value;
7254
- // Check for .static modifier
7255
- const attrName = context.attribute.name;
7256
- this.#isStatic = attrName.includes('.static');
7245
+ this.#componentId = context.attribute.value.trim();
7257
7246
  // Remove the directive attribute from the element
7258
7247
  this.#vNode.node.removeAttribute(context.attribute.name);
7259
7248
  }
@@ -7292,7 +7281,7 @@
7292
7281
  },
7293
7282
  applyToDOM: () => {
7294
7283
  if (!this.#isActivated) {
7295
- this.renderComponent();
7284
+ this.#renderComponent();
7296
7285
  }
7297
7286
  }
7298
7287
  };
@@ -7338,7 +7327,7 @@
7338
7327
  * @inheritdoc
7339
7328
  */
7340
7329
  get onUnmount() {
7341
- return () => this.cleanupComponent();
7330
+ return () => this.#cleanupComponent();
7342
7331
  }
7343
7332
  /**
7344
7333
  * @inheritdoc
@@ -7346,26 +7335,39 @@
7346
7335
  get onUnmounted() {
7347
7336
  return undefined;
7348
7337
  }
7338
+ cloneNode() {
7339
+ // Get component definition from the application's component registry
7340
+ const component = this.#vNode.vApplication.componentRegistry.get(this.#componentId);
7341
+ if (!component) {
7342
+ throw new Error(`Component '${this.#componentId}' not found in registry`);
7343
+ }
7344
+ // Get template element
7345
+ const finalTemplateID = component.templateID || component.id;
7346
+ const templateElement = document.querySelector(`#${finalTemplateID}`);
7347
+ if (!templateElement || !(templateElement instanceof HTMLTemplateElement)) {
7348
+ throw new Error(`Template element '#${finalTemplateID}' not found`);
7349
+ }
7350
+ // Clone template content
7351
+ const fragment = templateElement.content.cloneNode(true);
7352
+ const childNodes = Array.from(fragment.childNodes);
7353
+ // Find the first element node
7354
+ for (const node of childNodes) {
7355
+ if (node.nodeType === Node.ELEMENT_NODE) {
7356
+ return node;
7357
+ }
7358
+ }
7359
+ throw new Error(`No element found in template '#${finalTemplateID}'`);
7360
+ }
7349
7361
  /**
7350
7362
  * @inheritdoc
7351
7363
  */
7352
7364
  destroy() {
7353
- this.cleanupComponent();
7365
+ this.#cleanupComponent();
7354
7366
  }
7355
7367
  /**
7356
7368
  * Renders the component.
7357
7369
  */
7358
- renderComponent() {
7359
- const element = this.#vNode.node;
7360
- if (!element) {
7361
- return;
7362
- }
7363
- // For now, only support static component IDs
7364
- const componentId = this.#expression.trim();
7365
- if (!componentId) {
7366
- console.warn(`Component ID is empty for v-component directive`);
7367
- return;
7368
- }
7370
+ #renderComponent() {
7369
7371
  // Get properties from :options or :options.component directive
7370
7372
  let properties = {};
7371
7373
  const optionsDirective = this.#vNode.directiveManager?.optionsDirective('component');
@@ -7381,63 +7383,24 @@
7381
7383
  properties = result;
7382
7384
  }
7383
7385
  }
7384
- // Store component ID
7385
- this.#componentId = componentId;
7386
7386
  // Get component definition from the application's component registry
7387
- const vApplication = this.#vNode.vApplication;
7388
- if (!vApplication) {
7389
- console.error('VApplication not found on VNode');
7390
- return;
7391
- }
7392
- const component = vApplication.componentRegistry.get(componentId);
7387
+ const component = this.#vNode.vApplication.componentRegistry.get(this.#componentId);
7393
7388
  if (!component) {
7394
- console.error(`Component '${componentId}' not found in registry`);
7395
- return;
7396
- }
7397
- // Get template element
7398
- const finalTemplateID = component.templateID;
7399
- const templateElement = document.querySelector(`#${finalTemplateID}`);
7400
- if (!templateElement || !(templateElement instanceof HTMLTemplateElement)) {
7401
- console.error(`Template element '#${finalTemplateID}' not found`);
7402
- return;
7389
+ throw new Error(`Component '${this.#componentId}' not found in registry`);
7403
7390
  }
7404
- // Clone template content
7405
- const fragment = templateElement.content.cloneNode(true);
7406
- const childNodes = Array.from(fragment.childNodes);
7407
- // Find the first element node
7408
- let componentElement;
7409
- for (const node of childNodes) {
7410
- if (node.nodeType === Node.ELEMENT_NODE) {
7411
- componentElement = node;
7412
- break;
7413
- }
7414
- }
7415
- if (!componentElement) {
7416
- console.error(`No element found in template '#${finalTemplateID}'`);
7417
- return;
7418
- }
7419
- // Replace element with component element
7420
- const parent = element.parentNode;
7421
- if (!parent) {
7422
- console.error(`Element has no parent node. Component '${componentId}' cannot be mounted.`);
7423
- return;
7424
- }
7425
- parent.insertBefore(componentElement, element);
7426
- parent.removeChild(element);
7427
7391
  // Create component instance
7428
7392
  const instance = component.createInstance(properties);
7429
7393
  // Create and mount child application using the parent application's registries
7430
- this.#childApp = vApplication.createChildApp(instance);
7431
- this.#childApp.mount(componentElement);
7394
+ this.#childApp = this.#vNode.vApplication.createChildApp(instance);
7395
+ this.#childApp.mount(this.#vNode.node);
7432
7396
  this.#isActivated = true;
7433
7397
  }
7434
7398
  /**
7435
7399
  * Cleans up the component.
7436
7400
  */
7437
- cleanupComponent() {
7401
+ #cleanupComponent() {
7438
7402
  if (this.#childApp) {
7439
- // TODO: Implement unmount when available in VApplication
7440
- // this.#childApp.unmount();
7403
+ this.#childApp.unmount();
7441
7404
  this.#childApp = undefined;
7442
7405
  }
7443
7406
  this.#isActivated = false;
@@ -7775,6 +7738,11 @@
7775
7738
  * The keys are directive names (e.g., 'options', 'options.intersection').
7776
7739
  */
7777
7740
  #optionsDirectives = {};
7741
+ /**
7742
+ * The v-component directive associated with this node, if any.
7743
+ * This may be undefined if there is no v-component directive.
7744
+ */
7745
+ #componentDirective;
7778
7746
  constructor(vNode) {
7779
7747
  // Directives can only be associated with element nodes
7780
7748
  if (vNode.nodeType !== Node.ELEMENT_NODE) {
@@ -7833,11 +7801,11 @@
7833
7801
  return this.#keyDirective;
7834
7802
  }
7835
7803
  /**
7836
- * Gets a record of VBindDirectives for options specific to certain directives.
7837
- * The keys are directive names (e.g., 'options', 'options.intersection').
7804
+ * Gets the v-component directive associated with this node, if any.
7805
+ * This may be undefined if there is no v-component directive.
7838
7806
  */
7839
- get optionsDirectives() {
7840
- return this.#optionsDirectives;
7807
+ get componentDirective() {
7808
+ return this.#componentDirective;
7841
7809
  }
7842
7810
  /**
7843
7811
  * Gets the VBindDirective for options specific to the given directive name.
@@ -7928,6 +7896,10 @@
7928
7896
  this.#optionsDirectives[attrName] = bindDirective;
7929
7897
  }
7930
7898
  }
7899
+ // If this is a v-component directive, store it separately
7900
+ if (directive.name === StandardDirectiveName.V_COMPONENT) {
7901
+ this.#componentDirective = directive;
7902
+ }
7931
7903
  }
7932
7904
  }
7933
7905
  // Sort directives by priority: v-for > v-if > v-else-if > v-else > v-show > others
@@ -8881,8 +8853,15 @@
8881
8853
  * Clones the template element and creates a new VNode for the cloned element.
8882
8854
  */
8883
8855
  #cloneTemplate() {
8884
- const element = this.#vNode.node;
8885
- const clone = element.cloneNode(true);
8856
+ // Clone the original element
8857
+ let clone;
8858
+ if (this.vNode.directiveManager?.componentDirective) {
8859
+ clone = this.vNode.directiveManager.componentDirective.cloneNode();
8860
+ }
8861
+ else {
8862
+ const element = this.#vNode.node;
8863
+ clone = element.cloneNode(true);
8864
+ }
8886
8865
  // Create a new VNode for the cloned element
8887
8866
  const vNode = new VNode({
8888
8867
  node: clone,
@@ -9317,8 +9296,15 @@
9317
9296
  * Clone template element for each iteration and create a new VNode
9318
9297
  */
9319
9298
  #cloneTemplate(context) {
9320
- const element = this.#vNode.node;
9321
- const clone = element.cloneNode(true);
9299
+ // Clone the original element
9300
+ let clone;
9301
+ if (this.vNode.directiveManager?.componentDirective) {
9302
+ clone = this.vNode.directiveManager.componentDirective.cloneNode();
9303
+ }
9304
+ else {
9305
+ const element = this.#vNode.node;
9306
+ clone = element.cloneNode(true);
9307
+ }
9322
9308
  // Prepare identifiers for the item
9323
9309
  this.#itemName;
9324
9310
  this.#indexName;
@@ -11223,6 +11209,16 @@
11223
11209
  this.#vNode.update();
11224
11210
  this.#logger.info('Application mounted.');
11225
11211
  }
11212
+ /**
11213
+ * Unmounts the application and cleans up resources.
11214
+ */
11215
+ unmount() {
11216
+ if (this.#vNode) {
11217
+ this.#vNode.destroy();
11218
+ this.#vNode = undefined;
11219
+ }
11220
+ this.#logger.info('Application unmounted.');
11221
+ }
11226
11222
  /**
11227
11223
  * Creates a child application instance with the same registries.
11228
11224
  * @param options The application options for the child.