j-templates 7.0.94 → 7.0.95

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.
package/DOM/elements.js CHANGED
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.dt = exports.dl = exports.li = exports.ol = exports.ul = exports.rp = exports.rt = exports.dfn = exports.time = exports.abbr = exports.small = exports.mark = exports.sup = exports.sub = exports.ins = exports.del = exports.strike = exports.s = exports.u = exports.em = exports.i = exports.strong = exports.b = exports.a = exports.q = exports.cite = exports._var = exports.samp = exports.kbd = exports.code = exports.pre = exports.p = exports.h6 = exports.h5 = exports.h4 = exports.h3 = exports.h2 = exports.h1 = exports.address = exports.blockquote = exports.hr = exports.footer = exports.header = exports.main = exports.nav = exports.aside = exports.article = exports.section = exports.span = exports.div = void 0;
4
- exports.text = exports.slot = exports.template = exports.area = exports.map = exports.svg = exports.canvas = exports.menu = exports.dialog = exports.summary = exports.details = exports.iframe = exports.param = exports.object = exports.embed = exports.track = exports.video = exports.audio = exports.source = exports.picture = exports.figcaption = exports.figure = exports.img = exports.meter = exports.progress = exports.output = exports.datalist = exports.legend = exports.fieldset = exports.label = exports.optgroup = exports.option = exports.select = exports.button = exports.textarea = exports.input = exports.form = exports.colgroup = exports.col = exports.td = exports.th = exports.tr = exports.tfoot = exports.tbody = exports.thead = exports.table = exports.dd = void 0;
4
+ exports.text = exports.fragment = exports.slot = exports.template = exports.area = exports.map = exports.svg = exports.canvas = exports.menu = exports.dialog = exports.summary = exports.details = exports.iframe = exports.param = exports.object = exports.embed = exports.track = exports.video = exports.audio = exports.source = exports.picture = exports.figcaption = exports.figure = exports.img = exports.meter = exports.progress = exports.output = exports.datalist = exports.legend = exports.fieldset = exports.label = exports.optgroup = exports.option = exports.select = exports.button = exports.textarea = exports.input = exports.form = exports.colgroup = exports.col = exports.td = exports.th = exports.tr = exports.tfoot = exports.tbody = exports.thead = exports.table = exports.dd = void 0;
5
5
  const vNode_1 = require("../Node/vNode");
6
+ const vNode_types_1 = require("../Node/vNode.types");
6
7
  // Layout
7
8
  exports.div = vNode_1.vNode.ToFunction("div");
8
9
  exports.span = vNode_1.vNode.ToFunction("span");
@@ -109,8 +110,13 @@ exports.area = vNode_1.vNode.ToFunction("area");
109
110
  // Meta content
110
111
  exports.template = vNode_1.vNode.ToFunction("template");
111
112
  exports.slot = vNode_1.vNode.ToFunction("slot");
113
+ const fragmentElement = vNode_1.vNode.ToFunction(vNode_types_1.FRAGMENT_NODE);
114
+ const fragment = function (config, children) {
115
+ return fragmentElement(config, children);
116
+ };
117
+ exports.fragment = fragment;
112
118
  // Text node
113
- const textElement = vNode_1.vNode.ToFunction("text");
119
+ const textElement = vNode_1.vNode.ToFunction(vNode_types_1.TEXT_NODE);
114
120
  const text = function (callback) {
115
121
  return textElement({ props: () => ({ nodeValue: callback() }) });
116
122
  };
@@ -42,5 +42,6 @@ export interface INodeConfig {
42
42
  getNextSibling(target: any): any;
43
43
  replaceChildren(target: any, children: any[]): void;
44
44
  reconcileChildren(target: any, children: any[]): void;
45
+ reconcileRange(target: any, start: any, end: any, children: any[]): void;
45
46
  }
46
47
  export declare const NodeConfig: INodeConfig;
package/Node/vNode.d.ts CHANGED
@@ -1,21 +1,10 @@
1
- import { RecursivePartial } from "../Utils/utils.types";
2
- import { vNode as vNodeType, vNodeDefinition, FunctionOr, vNodeEvents, vNodeChildrenFunction, vElementNode } from "./vNode.types";
3
- type vNodeConfig<P = HTMLElement, E = HTMLElementEventMap, T = never> = {
4
- props?: FunctionOr<RecursivePartial<P>>;
5
- attrs?: FunctionOr<{
6
- [name: string]: string;
7
- }>;
8
- on?: FunctionOr<vNodeEvents<E>>;
9
- data?: () => T | Array<T> | Promise<Array<T>> | Promise<T>;
10
- };
1
+ import { vNode as vNodeType, vNodeDefinition, vNodeChildrenFunction, vElementNode, vNodeConfig, TEXT_NODE, FRAGMENT_NODE } from "./vNode.types";
11
2
  export declare namespace vNode {
12
3
  function Create<P = HTMLElement, E = HTMLElementEventMap, T = never>(definition: vNodeDefinition<P, E, T>): vElementNode;
13
- function CreateText(text: string): vNodeType;
14
- function Init(vnode: vNodeType): void;
15
- function InitAll(vnodes: vNodeType[]): void;
4
+ function Init(vnode: vNodeType, parentNode?: vElementNode): void;
5
+ function InitAll(vnodes: vNodeType[], parentNode?: vElementNode): void;
16
6
  function Destroy(vnode: vNodeType): void;
17
7
  function DestroyAll(vnodes: vNodeType[]): void;
18
- function ToFunction<P = HTMLElement, E = HTMLElementEventMap>(type: string, namespace?: string): <T>(config: vNodeConfig<P, E, T>, children?: vNodeType[] | vNodeChildrenFunction<T>) => vElementNode;
8
+ function ToFunction<P = HTMLElement, E = HTMLElementEventMap>(type: string | typeof TEXT_NODE | typeof FRAGMENT_NODE, namespace?: string): <T>(config: vNodeConfig<P, E, T>, children?: vNodeType[] | vNodeChildrenFunction<T>) => vElementNode;
19
9
  function Attach(node: any, vnode: vNodeType): vNodeType;
20
10
  }
21
- export {};
package/Node/vNode.js CHANGED
@@ -20,6 +20,7 @@ var vNode;
20
20
  return new injector_1.Injector();
21
21
  })
22
22
  : (injector_1.Injector.Current() ?? new injector_1.Injector()),
23
+ parentNode: null,
23
24
  node: definition.node ?? null,
24
25
  children: null,
25
26
  destroyed: false,
@@ -29,29 +30,15 @@ var vNode;
29
30
  };
30
31
  }
31
32
  vNode.Create = Create;
32
- function CreateText(text) {
33
- return {
34
- definition: null,
35
- type: "text",
36
- injector: null,
37
- node: nodeConfig_1.NodeConfig.createTextNode(text),
38
- children: null,
39
- destroyed: false,
40
- onDestroyed: null,
41
- component: null,
42
- scopes: [],
43
- };
44
- }
45
- vNode.CreateText = CreateText;
46
- function Init(vnode) {
33
+ function Init(vnode, parentNode = null) {
47
34
  if ((0, vNode_types_1.isStringNode)(vnode) || vnode.definition === null)
48
35
  return;
49
- InitNode(vnode);
36
+ InitNode(vnode, parentNode);
50
37
  }
51
38
  vNode.Init = Init;
52
- function InitAll(vnodes) {
39
+ function InitAll(vnodes, parentNode = null) {
53
40
  for (let x = 0; x < vnodes.length; x++)
54
- Init(vnodes[x]);
41
+ Init(vnodes[x], parentNode);
55
42
  }
56
43
  vNode.InitAll = InitAll;
57
44
  function Destroy(vnode) {
@@ -85,6 +72,9 @@ var vNode;
85
72
  }
86
73
  vNode.ToFunction = ToFunction;
87
74
  function Attach(node, vnode) {
75
+ if (vnode.type === vNode_types_1.FRAGMENT_NODE)
76
+ throw new Error("Cannot attach a fragment directly. A fragment has no DOM node — " +
77
+ "wrap it in a real element (e.g. div) before attaching.");
88
78
  Init(vnode);
89
79
  nodeConfig_1.NodeConfig.addChild(node, vnode.node);
90
80
  return vnode;
@@ -94,11 +84,21 @@ var vNode;
94
84
  function ComponentChildren() {
95
85
  return this.Template();
96
86
  }
97
- function InitNode(vnode) {
87
+ function InitNode(vnode, parentNode) {
98
88
  const { type, namespace, props, attrs, on, data, componentFactory, children, childrenArray, } = vnode.definition;
99
- const node = (vnode.node =
100
- vnode.definition.node ?? nodeConfig_1.NodeConfig.createNode(type, namespace));
89
+ let node = null;
90
+ switch (vnode.type) {
91
+ case vNode_types_1.FRAGMENT_NODE:
92
+ break;
93
+ case vNode_types_1.TEXT_NODE:
94
+ vnode.node = node = vnode.definition.node ?? nodeConfig_1.NodeConfig.createTextNode();
95
+ break;
96
+ default:
97
+ vnode.node = node = vnode.definition.node ?? nodeConfig_1.NodeConfig.createNode(type, namespace);
98
+ break;
99
+ }
101
100
  vnode.definition = null;
101
+ vnode.parentNode = parentNode;
102
102
  if (props) {
103
103
  if (typeof props === "function") {
104
104
  const assignProperties = nodeConfig_1.NodeConfig.createPropertyAssignment(node);
@@ -139,7 +139,7 @@ function InitNode(vnode) {
139
139
  }
140
140
  else if (childrenArray) {
141
141
  vnode.children = childrenArray;
142
- vNode.InitAll(childrenArray);
142
+ vNode.InitAll(childrenArray, vnode);
143
143
  }
144
144
  else if (children) {
145
145
  Children(vnode, children, data);
@@ -174,6 +174,9 @@ function CreateChildrenScope(vnode, children, data) {
174
174
  }
175
175
  return Store_1.ObservableScope.Create(DynamicChildrenFunction.bind(null, vnode.injector, children, data));
176
176
  }
177
+ function ToVNodeType(children) {
178
+ return typeof children === "string" ? { type: vNode_types_1.STRING_NODE, node: children } : children;
179
+ }
177
180
  function GetNextNodes(injector, children, data) {
178
181
  return ToVNodeType(injector_1.Injector.Scope(injector, children, data));
179
182
  }
@@ -201,11 +204,13 @@ function ToArray(result) {
201
204
  return result;
202
205
  return [result];
203
206
  }
204
- function ToVNodeType(children) {
205
- return typeof children === "string" ? { type: "string", node: children } : children;
206
- }
207
207
  function GetNode(vnode) {
208
- return vnode.node;
208
+ switch (vnode.type) {
209
+ case vNode_types_1.FRAGMENT_NODE:
210
+ return vnode.children.flatMap(GetNode);
211
+ default:
212
+ return vnode.node;
213
+ }
209
214
  }
210
215
  function UpdateChildren(vnode, init = false, skipInit = false) {
211
216
  if (!vnode.children)
@@ -220,22 +225,33 @@ function UpdateChildren(vnode, init = false, skipInit = false) {
220
225
  (0, thread_1.Schedule)(function () {
221
226
  if (vnode.destroyed || children !== vnode.children)
222
227
  return;
223
- vNode.Init(childNode);
228
+ vNode.Init(childNode, vnode);
224
229
  });
225
230
  }
226
231
  }
227
232
  (0, thread_1.Thread)(function (async) {
228
233
  if (vnode.destroyed || children !== vnode.children)
229
234
  return;
230
- if (init || !async) {
231
- nodeConfig_1.NodeConfig.reconcileChildren(vnode.node, vnode.children.map(GetNode));
235
+ if (init) {
236
+ if (vnode.node !== null)
237
+ nodeConfig_1.NodeConfig.reconcileChildren(vnode.node, vnode.children.flatMap(GetNode));
232
238
  }
233
- else
239
+ else if (!async) {
240
+ let reconcileNode = vnode;
241
+ while (reconcileNode.node === null)
242
+ reconcileNode = reconcileNode.parentNode;
243
+ nodeConfig_1.NodeConfig.reconcileChildren(reconcileNode.node, reconcileNode.children.flatMap(GetNode));
244
+ }
245
+ else {
234
246
  nodeConfig_1.NodeConfig.scheduleUpdate(function () {
235
247
  if (vnode.destroyed || children !== vnode.children)
236
248
  return;
237
- nodeConfig_1.NodeConfig.reconcileChildren(vnode.node, vnode.children.map(GetNode));
249
+ let reconcileNode = vnode;
250
+ while (reconcileNode.node === null)
251
+ reconcileNode = reconcileNode.parentNode;
252
+ nodeConfig_1.NodeConfig.reconcileChildren(reconcileNode.node, reconcileNode.children.flatMap(GetNode));
238
253
  });
254
+ }
239
255
  });
240
256
  });
241
257
  }
@@ -3,6 +3,9 @@ import { IObservableScope } from "../Store/Tree/observableScope";
3
3
  import { Injector } from "../Utils/injector";
4
4
  import { RecursivePartial } from "../Utils/utils.types";
5
5
  import { Emitter } from "../Utils/emitter";
6
+ export declare const STRING_NODE: unique symbol;
7
+ export declare const TEXT_NODE: unique symbol;
8
+ export declare const FRAGMENT_NODE: unique symbol;
6
9
  export type FunctionOr<T> = {
7
10
  (): T | Promise<T>;
8
11
  } | T;
@@ -14,14 +17,23 @@ export type vNodeEvents<E extends {
14
17
  };
15
18
  };
16
19
  export type vNodeChildrenFunction<T> = ((data: T) => vNode | vNode[]) | ((data: T) => string);
20
+ export type vNodeConfig<P = HTMLElement, E = HTMLElementEventMap, T = never> = {
21
+ props?: FunctionOr<RecursivePartial<P>>;
22
+ attrs?: FunctionOr<{
23
+ [name: string]: string;
24
+ }>;
25
+ on?: FunctionOr<vNodeEvents<E>>;
26
+ data?: () => T | Array<T> | Promise<Array<T>> | Promise<T>;
27
+ };
17
28
  export type vStringNode = {
18
- type: "string";
29
+ type: typeof STRING_NODE;
19
30
  node: string;
20
31
  };
21
32
  export type vElementNode = {
22
- type: string;
33
+ type: string | typeof TEXT_NODE | typeof FRAGMENT_NODE;
23
34
  definition: vNodeDefinition<any, any, any>;
24
35
  injector: Injector;
36
+ parentNode: vElementNode | null;
25
37
  node: Node | null;
26
38
  children: vNode[];
27
39
  destroyed: boolean;
@@ -32,7 +44,7 @@ export type vElementNode = {
32
44
  export type vNode = vStringNode | vElementNode;
33
45
  export declare function isStringNode(vnode: vNode): vnode is vStringNode;
34
46
  export type vNodeDefinition<P = HTMLElement, E = HTMLElementEventMap, T = never> = {
35
- type: string;
47
+ type: string | typeof TEXT_NODE | typeof FRAGMENT_NODE;
36
48
  node?: Node;
37
49
  namespace: string | null;
38
50
  props?: FunctionOr<RecursivePartial<P>>;
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FRAGMENT_NODE = exports.TEXT_NODE = exports.STRING_NODE = void 0;
3
4
  exports.isStringNode = isStringNode;
5
+ exports.STRING_NODE = Symbol("STRING_NODE");
6
+ exports.TEXT_NODE = Symbol("TEXT_NODE");
7
+ exports.FRAGMENT_NODE = Symbol("FRAGMENT_NODE");
4
8
  function isStringNode(vnode) {
5
- return vnode.type === "string";
9
+ return vnode.type === exports.STRING_NODE;
6
10
  }
@@ -7,6 +7,7 @@ exports.GateScope = GateScope;
7
7
  exports.PeekScope = PeekScope;
8
8
  const emitter_1 = require("../../Utils/emitter");
9
9
  const functions_1 = require("../../Utils/functions");
10
+ const scheduling_1 = require("../../Utils/scheduling");
10
11
  function Invoke(param, callback) {
11
12
  return callback(param);
12
13
  }
@@ -87,9 +88,9 @@ function ProcessScopeQueue() {
87
88
  * @param scope The scope to queue for update.
88
89
  */
89
90
  function OnSetQueued(scope) {
90
- if (scopeQueue.length === 0)
91
- queueMicrotask(ProcessScopeQueue);
92
91
  scopeQueue.push(scope);
92
+ if (scopeQueue.length === 1)
93
+ (0, scheduling_1._queueMicrotask)(ProcessScopeQueue);
93
94
  }
94
95
  /**
95
96
  * Marks a scope as dirty and triggers update behavior based on scope type.
package/Utils/emitter.js CHANGED
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Emitter = void 0;
4
- const scheduleCallback = typeof requestIdleCallback !== "undefined"
5
- ? requestIdleCallback
6
- : setTimeout;
4
+ const scheduling_1 = require("./scheduling");
7
5
  const pendingCompactEmitters = new Set();
8
6
  function Compact(emitter) {
9
7
  if (emitter.length === 1 || emitter[0] === 0)
@@ -16,7 +14,7 @@ function ScheduleCompact() {
16
14
  if (compactScheduled)
17
15
  return;
18
16
  compactScheduled = true;
19
- scheduleCallback(PerformCompact);
17
+ (0, scheduling_1._requestIdleCallback)(PerformCompact);
20
18
  }
21
19
  function PerformCompact() {
22
20
  compactScheduled = false;
@@ -0,0 +1,4 @@
1
+ export declare const _requestAnimationFrame: typeof window.requestAnimationFrame;
2
+ export declare const _setTimeout: typeof window.setTimeout;
3
+ export declare const _queueMicrotask: typeof window.queueMicrotask;
4
+ export declare const _requestIdleCallback: typeof window.requestIdleCallback;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports._requestIdleCallback = exports._queueMicrotask = exports._setTimeout = exports._requestAnimationFrame = void 0;
4
+ const IMMEDIATE_OVERRIDE = typeof process !== "undefined" ?
5
+ process.env.SYNC_SCHEDULING === 'true' :
6
+ false;
7
+ exports._requestAnimationFrame = IMMEDIATE_OVERRIDE ?
8
+ function immediateRequestAnimationFrame(callback) {
9
+ callback(0);
10
+ return 0;
11
+ } : window.requestAnimationFrame;
12
+ exports._setTimeout = IMMEDIATE_OVERRIDE ?
13
+ function immediateSetTimeout(handler, timeout, ...args) {
14
+ if (typeof handler === "function")
15
+ handler(...args);
16
+ return 0;
17
+ } : window.setTimeout;
18
+ exports._queueMicrotask = IMMEDIATE_OVERRIDE ?
19
+ function immediateQueueMicrotask(callback) {
20
+ callback();
21
+ } : window.queueMicrotask;
22
+ exports._requestIdleCallback = IMMEDIATE_OVERRIDE ?
23
+ function immediateRequestIdleCallback(callback, options) {
24
+ callback({ didTimeout: false, timeRemaining: () => 0 });
25
+ return 0;
26
+ } : window.requestIdleCallback ?? window.setTimeout;
package/Utils/thread.js CHANGED
@@ -7,6 +7,7 @@ exports.Synch = Synch;
7
7
  exports.Thread = Thread;
8
8
  exports.ThreadAsync = ThreadAsync;
9
9
  const list_1 = require("./list");
10
+ const scheduling_1 = require("./scheduling");
10
11
  // Constants
11
12
  /**
12
13
  * The maximum time allowed for work execution in milliseconds
@@ -19,9 +20,6 @@ const contextQueue = list_1.List.Create();
19
20
  // State variables
20
21
  let threadContext = null;
21
22
  let timeoutRunning = false;
22
- // Callback scheduling functions
23
- const scheduleInitialCallback = queueMicrotask;
24
- const scheduleCallback = setTimeout;
25
23
  /**
26
24
  * Calculates the remaining time until the deadline
27
25
  * @param this - The deadline object
@@ -49,7 +47,7 @@ function ProcessQueue(deadline = createDeadline()) {
49
47
  while (deadline.timeRemaining() > 0 && (ctx = list_1.List.Pop(contextQueue)))
50
48
  DoWork(ctx, deadline);
51
49
  if (contextQueue.size > 0)
52
- scheduleCallback(ProcessQueue);
50
+ (0, scheduling_1._setTimeout)(ProcessQueue);
53
51
  else
54
52
  timeoutRunning = false;
55
53
  }
@@ -62,7 +60,7 @@ function ScheduleWork(ctx) {
62
60
  if (timeoutRunning)
63
61
  return;
64
62
  timeoutRunning = true;
65
- scheduleInitialCallback(ProcessQueue);
63
+ (0, scheduling_1._queueMicrotask)(ProcessQueue);
66
64
  }
67
65
  /**
68
66
  * Invokes a callback in the specified thread context
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "j-templates",
3
- "version": "7.0.94",
3
+ "version": "7.0.95",
4
4
  "description": "j-templates",
5
5
  "license": "MIT",
6
6
  "repository": "https://github.com/TypesInCode/jTemplates",
package/DOM/window.d.ts DELETED
@@ -1 +0,0 @@
1
- export declare const wndw: Window;
package/DOM/window.js DELETED
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.wndw = void 0;
4
- function jsdomWindow() {
5
- try {
6
- return require("jsdom").JSDOM("").window;
7
- }
8
- catch (err) {
9
- return undefined;
10
- }
11
- }
12
- exports.wndw = typeof window !== "undefined" ? window : jsdomWindow();