Use rendered() for SPA layout chain, add jqhtml lifecycle docs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
root
2025-12-12 07:19:23 +00:00
parent f625531b81
commit 2f96bb6276
85 changed files with 198 additions and 37 deletions

View File

@@ -848,8 +848,9 @@ class Spa {
// Create component // Create component
const component = $current_container.component(component_name, is_last ? args : {}).component(); const component = $current_container.component(component_name, is_last ? args : {}).component();
// Wait for it to be ready // Wait for render to complete (not full ready - we don't need child data to load)
await component.ready(); // This allows layout navigation to update immediately while action loads
await component.rendered();
if (is_last) { if (is_last) {
// This is the action // This is the action

View File

@@ -1017,9 +1017,11 @@ LIFECYCLE MANIPULATION METHODS
Method Summary (jqhtml v2.2.182+): Method Summary (jqhtml v2.2.182+):
reload() - Restore this.data to defaults, call on_load(), then render() reload() - Restore this.data to defaults, call on_load(), then render()
render() - Re-renders with full lifecycle (waits for children, calls on_ready) render() - Re-renders with full lifecycle (waits for children, calls on_ready)
redraw() - Alias for render() redraw() - Alias for render()
ready() - Returns promise that resolves when full lifecycle complete
rendered() - Returns promise that resolves when render complete (not children)
reload() reload()
Re-fetch data and re-render - Restores this.data to on_create() state, Re-fetch data and re-render - Restores this.data to on_create() state,
@@ -1105,6 +1107,40 @@ LIFECYCLE MANIPULATION METHODS
} }
} }
ready()
Wait for component to complete full lifecycle including all children.
Usage:
const component = $(element).component();
await component.ready();
// Component and all children are now fully loaded
Behavior:
- Returns promise that resolves when full lifecycle is complete
- Waits for on_load() of this component AND all descendants
- Waits for on_ready() of this component AND all descendants
- Use when: You need component to be fully interactive
rendered()
Wait for component's render to complete (does not wait for children's data).
Usage:
const component = $(element).component();
await component.rendered();
// DOM is rendered, but children may still be loading data
Behavior:
- Returns promise that resolves after render phase completes
- Does NOT wait for child components' on_load() or on_ready()
- Use when: You need DOM structure but don't need child data
- Faster than ready() when child data loading is unnecessary
Example - SPA layout navigation:
// Update nav active state without waiting for action to load data
await layout.rendered();
layout.$sid('nav').find('.active').removeClass('active');
layout.$sid('nav').find(`[href="${url}"]`).addClass('active');
SYNCHRONOUS REQUIREMENTS SYNCHRONOUS REQUIREMENTS
CRITICAL: These lifecycle methods MUST be synchronous (no async, no await): CRITICAL: These lifecycle methods MUST be synchronous (no async, no await):

18
node_modules/.package-lock.json generated vendored
View File

@@ -2211,9 +2211,9 @@
} }
}, },
"node_modules/@jqhtml/core": { "node_modules/@jqhtml/core": {
"version": "2.3.19", "version": "2.3.20",
"resolved": "http://privatenpm.hanson.xyz/@jqhtml/core/-/core-2.3.19.tgz", "resolved": "http://privatenpm.hanson.xyz/@jqhtml/core/-/core-2.3.20.tgz",
"integrity": "sha512-yizJWqsDp58kQ/pU6kdYdLyWoLtlb7Utiu9tkPvFaYLf4Qz1OfwHudR8QbhGRk1dSEW/Qo0YhREP7nkSn8VisQ==", "integrity": "sha512-5C1+0cFzt6/p1EtxPGOW7aqMVQRE5XIuntQNAOaNbmELdHSRfxcGcg3jv3lKh0qq7cFBEs7Jm1EmsGZ83B3wPQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@rollup/plugin-node-resolve": "^16.0.1", "@rollup/plugin-node-resolve": "^16.0.1",
@@ -2237,9 +2237,9 @@
} }
}, },
"node_modules/@jqhtml/parser": { "node_modules/@jqhtml/parser": {
"version": "2.3.19", "version": "2.3.20",
"resolved": "http://privatenpm.hanson.xyz/@jqhtml/parser/-/parser-2.3.19.tgz", "resolved": "http://privatenpm.hanson.xyz/@jqhtml/parser/-/parser-2.3.20.tgz",
"integrity": "sha512-YVzTFcocglukGo2HgXgdL7Er8JadjdaPXZwwfqBDG50jkpTz8ye0DPhaWUoRKMP3HLvC54OJZaQpTWscQR0VwQ==", "integrity": "sha512-lrzfeCuQ/n6eqepk6Gjlxj25qFzQJCkezMirXhO99WtaGLm4T7sAMfcpVhdGstq2rqdCuAoEka370myd4LBTeA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/jest": "^29.5.11", "@types/jest": "^29.5.11",
@@ -2277,9 +2277,9 @@
} }
}, },
"node_modules/@jqhtml/vscode-extension": { "node_modules/@jqhtml/vscode-extension": {
"version": "2.3.19", "version": "2.3.20",
"resolved": "http://privatenpm.hanson.xyz/@jqhtml/vscode-extension/-/vscode-extension-2.3.19.tgz", "resolved": "http://privatenpm.hanson.xyz/@jqhtml/vscode-extension/-/vscode-extension-2.3.20.tgz",
"integrity": "sha512-V7T6qA1BRTRA+oDBYl3IiyzK/g6T14YkSnD5AO4Z7uNHIjLVkgJiQhsLYTknOcp8eBomdEg7PZsRXj7fS6EyiQ==", "integrity": "sha512-xmMHcWVekFx3DWDCNqz8e+Q/JIJzVIG/1ww+r+6jz6gvaoc1nkNGKAzxbkJeZuNQWOzkEsfECJbVGeZsCOK5+A==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"vscode": "^1.74.0" "vscode": "^1.74.0"

0
node_modules/@jqhtml/core/dist/boot.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/boot.d.ts.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/component-registry.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/component-registry.d.ts.map generated vendored Normal file → Executable file
View File

19
node_modules/@jqhtml/core/dist/component.d.ts generated vendored Normal file → Executable file
View File

@@ -53,6 +53,7 @@ export declare class Jqhtml_Component {
private _use_cached_data_hit; private _use_cached_data_hit;
private _skip_render_and_ready; private _skip_render_and_ready;
private _skip_ready; private _skip_ready;
private _has_rendered;
constructor(element?: any, args?: Record<string, any>); constructor(element?: any, args?: Record<string, any>);
/** /**
* Protect lifecycle methods from manual invocation * Protect lifecycle methods from manual invocation
@@ -157,6 +158,24 @@ export declare class Jqhtml_Component {
* @param callback Optional callback to execute when ready * @param callback Optional callback to execute when ready
*/ */
ready(callback?: () => void): Promise<void>; ready(callback?: () => void): Promise<void>;
/**
* Returns a promise that resolves when the component has completed its
* synchronous render chain (after on_load's re-render if applicable,
* or after first render if no on_load override).
*
* This fires BEFORE on_ready() and before children are waited on.
* Use this when you need to know the component's DOM is stable but
* don't need to wait for the full async ready phase.
*
* The 'rendered' event fires exactly once per component lifecycle.
*
* @example
* await component.rendered();
* // DOM is now stable, on_render has completed
*
* @param callback Optional callback to execute when rendered
*/
rendered(callback?: () => void): Promise<void>;
/** /**
* Wait for all child components to reach ready state * Wait for all child components to reach ready state
* Ensures bottom-up ordering (children ready before parent) * Ensures bottom-up ordering (children ready before parent)

2
node_modules/@jqhtml/core/dist/component.d.ts.map generated vendored Normal file → Executable file
View File

@@ -1 +1 @@
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"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"} {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"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"}

0
node_modules/@jqhtml/core/dist/debug-entry.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/debug-entry.d.ts.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/debug.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/debug.d.ts.map generated vendored Normal file → Executable file
View File

37
node_modules/@jqhtml/core/dist/index.cjs generated vendored Normal file → Executable file
View File

@@ -98,6 +98,12 @@ class LifecycleManager {
if (component._stopped) if (component._stopped)
return; return;
} }
// Fire 'rendered' event - component has completed its synchronous render chain
// This happens once, after the final on_render (whether from first render or re-render after on_load)
if (!component._has_rendered) {
component._has_rendered = true;
component.trigger('rendered');
}
// Check if this render is still current before proceeding to ready // Check if this render is still current before proceeding to ready
// If _render_count changed, another render happened and we should skip ready // If _render_count changed, another render happened and we should skip ready
if (component._render_count !== render_id) { if (component._render_count !== render_id) {
@@ -2129,6 +2135,9 @@ class Jqhtml_Component {
// skip_ready feature - skip on_ready only // skip_ready feature - skip on_ready only
// Component reports ready after on_render completes // Component reports ready after on_render completes
this._skip_ready = false; this._skip_ready = false;
// rendered event - fires once after the synchronous render chain completes
// (after on_load's re-render if applicable, or after first render if no on_load)
this._has_rendered = false;
this._cid = this._generate_cid(); this._cid = this._generate_cid();
this._lifecycle_manager = LifecycleManager.get_instance(); this._lifecycle_manager = LifecycleManager.get_instance();
// Create or wrap element // Create or wrap element
@@ -3117,6 +3126,32 @@ class Jqhtml_Component {
}); });
}); });
} }
/**
* Returns a promise that resolves when the component has completed its
* synchronous render chain (after on_load's re-render if applicable,
* or after first render if no on_load override).
*
* This fires BEFORE on_ready() and before children are waited on.
* Use this when you need to know the component's DOM is stable but
* don't need to wait for the full async ready phase.
*
* The 'rendered' event fires exactly once per component lifecycle.
*
* @example
* await component.rendered();
* // DOM is now stable, on_render has completed
*
* @param callback Optional callback to execute when rendered
*/
rendered(callback) {
return new Promise((resolve) => {
this.on('rendered', () => {
if (callback)
callback();
resolve();
});
});
}
/** /**
* Wait for all child components to reach ready state * Wait for all child components to reach ready state
* Ensures bottom-up ordering (children ready before parent) * Ensures bottom-up ordering (children ready before parent)
@@ -4782,7 +4817,7 @@ function init(jQuery) {
} }
} }
// Version - will be replaced during build with actual version from package.json // Version - will be replaced during build with actual version from package.json
const version = '2.3.19'; const version = '2.3.20';
// Default export with all functionality // Default export with all functionality
const jqhtml = { const jqhtml = {
// Core // Core

2
node_modules/@jqhtml/core/dist/index.cjs.map generated vendored Normal file → Executable file

File diff suppressed because one or more lines are too long

0
node_modules/@jqhtml/core/dist/index.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/index.d.ts.map generated vendored Normal file → Executable file
View File

37
node_modules/@jqhtml/core/dist/index.js generated vendored Normal file → Executable file
View File

@@ -94,6 +94,12 @@ class LifecycleManager {
if (component._stopped) if (component._stopped)
return; return;
} }
// Fire 'rendered' event - component has completed its synchronous render chain
// This happens once, after the final on_render (whether from first render or re-render after on_load)
if (!component._has_rendered) {
component._has_rendered = true;
component.trigger('rendered');
}
// Check if this render is still current before proceeding to ready // Check if this render is still current before proceeding to ready
// If _render_count changed, another render happened and we should skip ready // If _render_count changed, another render happened and we should skip ready
if (component._render_count !== render_id) { if (component._render_count !== render_id) {
@@ -2125,6 +2131,9 @@ class Jqhtml_Component {
// skip_ready feature - skip on_ready only // skip_ready feature - skip on_ready only
// Component reports ready after on_render completes // Component reports ready after on_render completes
this._skip_ready = false; this._skip_ready = false;
// rendered event - fires once after the synchronous render chain completes
// (after on_load's re-render if applicable, or after first render if no on_load)
this._has_rendered = false;
this._cid = this._generate_cid(); this._cid = this._generate_cid();
this._lifecycle_manager = LifecycleManager.get_instance(); this._lifecycle_manager = LifecycleManager.get_instance();
// Create or wrap element // Create or wrap element
@@ -3113,6 +3122,32 @@ class Jqhtml_Component {
}); });
}); });
} }
/**
* Returns a promise that resolves when the component has completed its
* synchronous render chain (after on_load's re-render if applicable,
* or after first render if no on_load override).
*
* This fires BEFORE on_ready() and before children are waited on.
* Use this when you need to know the component's DOM is stable but
* don't need to wait for the full async ready phase.
*
* The 'rendered' event fires exactly once per component lifecycle.
*
* @example
* await component.rendered();
* // DOM is now stable, on_render has completed
*
* @param callback Optional callback to execute when rendered
*/
rendered(callback) {
return new Promise((resolve) => {
this.on('rendered', () => {
if (callback)
callback();
resolve();
});
});
}
/** /**
* Wait for all child components to reach ready state * Wait for all child components to reach ready state
* Ensures bottom-up ordering (children ready before parent) * Ensures bottom-up ordering (children ready before parent)
@@ -4778,7 +4813,7 @@ function init(jQuery) {
} }
} }
// Version - will be replaced during build with actual version from package.json // Version - will be replaced during build with actual version from package.json
const version = '2.3.19'; const version = '2.3.20';
// Default export with all functionality // Default export with all functionality
const jqhtml = { const jqhtml = {
// Core // Core

2
node_modules/@jqhtml/core/dist/index.js.map generated vendored Normal file → Executable file

File diff suppressed because one or more lines are too long

0
node_modules/@jqhtml/core/dist/instruction-processor.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/instruction-processor.d.ts.map generated vendored Normal file → Executable file
View File

39
node_modules/@jqhtml/core/dist/jqhtml-core.esm.js generated vendored Normal file → Executable file
View File

@@ -1,5 +1,5 @@
/** /**
* JQHTML Core v2.3.19 * JQHTML Core v2.3.20
* (c) 2025 JQHTML Team * (c) 2025 JQHTML Team
* Released under the MIT License * Released under the MIT License
*/ */
@@ -99,6 +99,12 @@ class LifecycleManager {
if (component._stopped) if (component._stopped)
return; return;
} }
// Fire 'rendered' event - component has completed its synchronous render chain
// This happens once, after the final on_render (whether from first render or re-render after on_load)
if (!component._has_rendered) {
component._has_rendered = true;
component.trigger('rendered');
}
// Check if this render is still current before proceeding to ready // Check if this render is still current before proceeding to ready
// If _render_count changed, another render happened and we should skip ready // If _render_count changed, another render happened and we should skip ready
if (component._render_count !== render_id) { if (component._render_count !== render_id) {
@@ -2130,6 +2136,9 @@ class Jqhtml_Component {
// skip_ready feature - skip on_ready only // skip_ready feature - skip on_ready only
// Component reports ready after on_render completes // Component reports ready after on_render completes
this._skip_ready = false; this._skip_ready = false;
// rendered event - fires once after the synchronous render chain completes
// (after on_load's re-render if applicable, or after first render if no on_load)
this._has_rendered = false;
this._cid = this._generate_cid(); this._cid = this._generate_cid();
this._lifecycle_manager = LifecycleManager.get_instance(); this._lifecycle_manager = LifecycleManager.get_instance();
// Create or wrap element // Create or wrap element
@@ -3118,6 +3127,32 @@ class Jqhtml_Component {
}); });
}); });
} }
/**
* Returns a promise that resolves when the component has completed its
* synchronous render chain (after on_load's re-render if applicable,
* or after first render if no on_load override).
*
* This fires BEFORE on_ready() and before children are waited on.
* Use this when you need to know the component's DOM is stable but
* don't need to wait for the full async ready phase.
*
* The 'rendered' event fires exactly once per component lifecycle.
*
* @example
* await component.rendered();
* // DOM is now stable, on_render has completed
*
* @param callback Optional callback to execute when rendered
*/
rendered(callback) {
return new Promise((resolve) => {
this.on('rendered', () => {
if (callback)
callback();
resolve();
});
});
}
/** /**
* Wait for all child components to reach ready state * Wait for all child components to reach ready state
* Ensures bottom-up ordering (children ready before parent) * Ensures bottom-up ordering (children ready before parent)
@@ -4783,7 +4818,7 @@ function init(jQuery) {
} }
} }
// Version - will be replaced during build with actual version from package.json // Version - will be replaced during build with actual version from package.json
const version = '2.3.19'; const version = '2.3.20';
// Default export with all functionality // Default export with all functionality
const jqhtml = { const jqhtml = {
// Core // Core

2
node_modules/@jqhtml/core/dist/jqhtml-core.esm.js.map generated vendored Normal file → Executable file

File diff suppressed because one or more lines are too long

0
node_modules/@jqhtml/core/dist/jqhtml-debug.esm.js generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/jqhtml-debug.esm.js.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/jquery-plugin.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/jquery-plugin.d.ts.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/lifecycle-manager.d.ts generated vendored Normal file → Executable file
View File

2
node_modules/@jqhtml/core/dist/lifecycle-manager.d.ts.map generated vendored Normal file → Executable file
View File

@@ -1 +1 @@
{"version":3,"file":"lifecycle-manager.d.ts","sourceRoot":"","sources":["../src/lifecycle-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmB;IAC1C,OAAO,CAAC,iBAAiB,CAAoC;IAE7D,MAAM,CAAC,YAAY,IAAI,gBAAgB;;IAevC;;;;;;;;;OASG;IACG,cAAc,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwGhE;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAIvD;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAetC"} {"version":3,"file":"lifecycle-manager.d.ts","sourceRoot":"","sources":["../src/lifecycle-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmB;IAC1C,OAAO,CAAC,iBAAiB,CAAoC;IAE7D,MAAM,CAAC,YAAY,IAAI,gBAAgB;;IAevC;;;;;;;;;OASG;IACG,cAAc,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+GhE;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAIvD;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAetC"}

0
node_modules/@jqhtml/core/dist/load-coordinator.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/load-coordinator.d.ts.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/local-storage.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/local-storage.d.ts.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/template-renderer.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/core/dist/template-renderer.d.ts.map generated vendored Normal file → Executable file
View File

2
node_modules/@jqhtml/core/package.json generated vendored Normal file → Executable file
View File

@@ -1,6 +1,6 @@
{ {
"name": "@jqhtml/core", "name": "@jqhtml/core",
"version": "2.3.19", "version": "2.3.20",
"description": "Core runtime library for JQHTML", "description": "Core runtime library for JQHTML",
"type": "module", "type": "module",
"main": "./dist/index.js", "main": "./dist/index.js",

0
node_modules/@jqhtml/parser/dist/ast.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/ast.d.ts.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/ast.js generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/ast.js.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/codegen.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/codegen.d.ts.map generated vendored Normal file → Executable file
View File

2
node_modules/@jqhtml/parser/dist/codegen.js generated vendored Normal file → Executable file
View File

@@ -1377,7 +1377,7 @@ export class CodeGenerator {
for (const [name, component] of this.components) { for (const [name, component] of this.components) {
code += `// Component: ${name}\n`; code += `// Component: ${name}\n`;
code += `jqhtml_components.set('${name}', {\n`; code += `jqhtml_components.set('${name}', {\n`;
code += ` _jqhtml_version: '2.3.19',\n`; // Version will be replaced during build code += ` _jqhtml_version: '2.3.20',\n`; // Version will be replaced during build
code += ` name: '${name}',\n`; code += ` name: '${name}',\n`;
code += ` tag: '${component.tagName}',\n`; code += ` tag: '${component.tagName}',\n`;
code += ` defaultAttributes: ${this.serializeAttributeObject(component.defaultAttributes)},\n`; code += ` defaultAttributes: ${this.serializeAttributeObject(component.defaultAttributes)},\n`;

0
node_modules/@jqhtml/parser/dist/codegen.js.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/compiler.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/compiler.d.ts.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/compiler.js generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/compiler.js.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/errors.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/errors.d.ts.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/errors.js generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/errors.js.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/index.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/index.d.ts.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/index.js generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/index.js.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/integration.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/integration.d.ts.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/integration.js generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/integration.js.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/lexer.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/lexer.d.ts.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/lexer.js generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/lexer.js.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/parser.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/parser.d.ts.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/parser.js generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/parser.js.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/runtime.d.ts generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/runtime.d.ts.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/runtime.js generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/parser/dist/runtime.js.map generated vendored Normal file → Executable file
View File

2
node_modules/@jqhtml/parser/package.json generated vendored Normal file → Executable file
View File

@@ -1,6 +1,6 @@
{ {
"name": "@jqhtml/parser", "name": "@jqhtml/parser",
"version": "2.3.19", "version": "2.3.20",
"description": "JQHTML template parser - converts templates to JavaScript", "description": "JQHTML template parser - converts templates to JavaScript",
"type": "module", "type": "module",
"main": "dist/index.js", "main": "dist/index.js",

View File

@@ -1 +1 @@
2.3.19 2.3.20

0
node_modules/@jqhtml/vscode-extension/blade-language-configuration.json generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/vscode-extension/out/blade_component_provider.js generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/vscode-extension/out/blade_component_provider.js.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/vscode-extension/out/blade_language_config.js generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/vscode-extension/out/blade_language_config.js.map generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/vscode-extension/out/blade_spacer.js generated vendored Normal file → Executable file
View File

0
node_modules/@jqhtml/vscode-extension/out/blade_spacer.js.map generated vendored Normal file → Executable file
View File

2
node_modules/@jqhtml/vscode-extension/package.json generated vendored Normal file → Executable file
View File

@@ -2,7 +2,7 @@
"name": "@jqhtml/vscode-extension", "name": "@jqhtml/vscode-extension",
"displayName": "JQHTML", "displayName": "JQHTML",
"description": "Syntax highlighting and language support for JQHTML template files", "description": "Syntax highlighting and language support for JQHTML template files",
"version": "2.3.19", "version": "2.3.20",
"publisher": "jqhtml", "publisher": "jqhtml",
"license": "MIT", "license": "MIT",
"publishConfig": { "publishConfig": {

0
node_modules/@jqhtml/vscode-extension/syntaxes/blade-jqhtml.tmLanguage.json generated vendored Normal file → Executable file
View File

18
package-lock.json generated
View File

@@ -2658,9 +2658,9 @@
} }
}, },
"node_modules/@jqhtml/core": { "node_modules/@jqhtml/core": {
"version": "2.3.19", "version": "2.3.20",
"resolved": "http://privatenpm.hanson.xyz/@jqhtml/core/-/core-2.3.19.tgz", "resolved": "http://privatenpm.hanson.xyz/@jqhtml/core/-/core-2.3.20.tgz",
"integrity": "sha512-yizJWqsDp58kQ/pU6kdYdLyWoLtlb7Utiu9tkPvFaYLf4Qz1OfwHudR8QbhGRk1dSEW/Qo0YhREP7nkSn8VisQ==", "integrity": "sha512-5C1+0cFzt6/p1EtxPGOW7aqMVQRE5XIuntQNAOaNbmELdHSRfxcGcg3jv3lKh0qq7cFBEs7Jm1EmsGZ83B3wPQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@rollup/plugin-node-resolve": "^16.0.1", "@rollup/plugin-node-resolve": "^16.0.1",
@@ -2684,9 +2684,9 @@
} }
}, },
"node_modules/@jqhtml/parser": { "node_modules/@jqhtml/parser": {
"version": "2.3.19", "version": "2.3.20",
"resolved": "http://privatenpm.hanson.xyz/@jqhtml/parser/-/parser-2.3.19.tgz", "resolved": "http://privatenpm.hanson.xyz/@jqhtml/parser/-/parser-2.3.20.tgz",
"integrity": "sha512-YVzTFcocglukGo2HgXgdL7Er8JadjdaPXZwwfqBDG50jkpTz8ye0DPhaWUoRKMP3HLvC54OJZaQpTWscQR0VwQ==", "integrity": "sha512-lrzfeCuQ/n6eqepk6Gjlxj25qFzQJCkezMirXhO99WtaGLm4T7sAMfcpVhdGstq2rqdCuAoEka370myd4LBTeA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/jest": "^29.5.11", "@types/jest": "^29.5.11",
@@ -2724,9 +2724,9 @@
} }
}, },
"node_modules/@jqhtml/vscode-extension": { "node_modules/@jqhtml/vscode-extension": {
"version": "2.3.19", "version": "2.3.20",
"resolved": "http://privatenpm.hanson.xyz/@jqhtml/vscode-extension/-/vscode-extension-2.3.19.tgz", "resolved": "http://privatenpm.hanson.xyz/@jqhtml/vscode-extension/-/vscode-extension-2.3.20.tgz",
"integrity": "sha512-V7T6qA1BRTRA+oDBYl3IiyzK/g6T14YkSnD5AO4Z7uNHIjLVkgJiQhsLYTknOcp8eBomdEg7PZsRXj7fS6EyiQ==", "integrity": "sha512-xmMHcWVekFx3DWDCNqz8e+Q/JIJzVIG/1ww+r+6jz6gvaoc1nkNGKAzxbkJeZuNQWOzkEsfECJbVGeZsCOK5+A==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"vscode": "^1.74.0" "vscode": "^1.74.0"