@oscarpalmer/abydon 0.2.0 → 0.4.0
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/bun.lockb +0 -0
- package/dist/index.js +72 -3
- package/package.json +4 -1
- package/src/fragment.ts +40 -0
- package/src/helpers/dom.ts +27 -0
- package/src/html.ts +26 -0
- package/src/index.ts +2 -0
- package/types/fragment.d.ts +9 -0
- package/types/helpers/dom.d.ts +2 -0
- package/types/html.d.ts +3 -0
- package/types/index.d.ts +2 -1
- package/dist/index.mjs +0 -5
package/bun.lockb
CHANGED
|
Binary file
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,74 @@
|
|
|
1
|
-
//
|
|
2
|
-
var
|
|
1
|
+
// node_modules/@oscarpalmer/atoms/dist/js/string/index.mjs
|
|
2
|
+
var getString = function(value) {
|
|
3
|
+
if (typeof value === "string") {
|
|
4
|
+
return value;
|
|
5
|
+
}
|
|
6
|
+
if (typeof value !== "object" || value == null) {
|
|
7
|
+
return String(value);
|
|
8
|
+
}
|
|
9
|
+
const valueOff = value.valueOf?.() ?? value;
|
|
10
|
+
const asString = valueOff?.toString?.() ?? String(valueOff);
|
|
11
|
+
return asString.startsWith("[object ") ? JSON.stringify(value) : asString;
|
|
12
|
+
};
|
|
13
|
+
// node_modules/@oscarpalmer/atoms/dist/js/is.mjs
|
|
14
|
+
var isNullableOrWhitespace = function(value) {
|
|
15
|
+
return value == null || /^\s*$/.test(getString(value));
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// src/helpers/dom.ts
|
|
19
|
+
function createTemplate(html) {
|
|
20
|
+
const template = document.createElement("template");
|
|
21
|
+
template.innerHTML = html;
|
|
22
|
+
const cloned = template.content.cloneNode(true);
|
|
23
|
+
const scripts = [
|
|
24
|
+
...cloned instanceof Element ? cloned.querySelectorAll("script") : []
|
|
25
|
+
];
|
|
26
|
+
const { length } = scripts;
|
|
27
|
+
for (let index = 0;index < length; index += 1) {
|
|
28
|
+
scripts[index].remove();
|
|
29
|
+
}
|
|
30
|
+
cloned.normalize();
|
|
31
|
+
return cloned;
|
|
32
|
+
}
|
|
33
|
+
function getNodes(node) {
|
|
34
|
+
return /^documentfragment$/i.test(node.constructor.name) ? [...node.childNodes] : [node];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// src/fragment.ts
|
|
38
|
+
function createFragment(strings, expressions) {
|
|
39
|
+
const data = {
|
|
40
|
+
expressions,
|
|
41
|
+
strings,
|
|
42
|
+
nodes: []
|
|
43
|
+
};
|
|
44
|
+
const instance = Object.create({
|
|
45
|
+
append(parent) {
|
|
46
|
+
if (data.nodes.length > 0) {
|
|
47
|
+
return parent.append(...data.nodes);
|
|
48
|
+
}
|
|
49
|
+
const parsed = parse(data);
|
|
50
|
+
const templated = createTemplate(parsed);
|
|
51
|
+
data.nodes.splice(0, data.nodes.length, ...getNodes(templated));
|
|
52
|
+
parent.append(...data.nodes);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
return instance;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// src/html.ts
|
|
59
|
+
function html2(strings, ...values) {
|
|
60
|
+
return createFragment(strings, values);
|
|
61
|
+
}
|
|
62
|
+
function parse(data) {
|
|
63
|
+
const { length } = data.strings;
|
|
64
|
+
let template = "";
|
|
65
|
+
for (let index = 0;index < length; index += 1) {
|
|
66
|
+
const part = data.strings[index];
|
|
67
|
+
const expression = data.expressions[index];
|
|
68
|
+
template += isNullableOrWhitespace(expression) ? part : `${part}${expression}`;
|
|
69
|
+
}
|
|
70
|
+
return template;
|
|
71
|
+
}
|
|
3
72
|
export {
|
|
4
|
-
|
|
73
|
+
html2 as html
|
|
5
74
|
};
|
package/package.json
CHANGED
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
"name": "Oscar Palmér",
|
|
4
4
|
"url": "https://oscarpalmer.se"
|
|
5
5
|
},
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"@oscarpalmer/atoms": "^0.61.0"
|
|
8
|
+
},
|
|
6
9
|
"devDependencies": {
|
|
7
10
|
"@biomejs/biome": "^1.8.3",
|
|
8
11
|
"@types/bun": "^1.1.6",
|
|
@@ -32,5 +35,5 @@
|
|
|
32
35
|
"watch": "bun build ./src/index.ts --outfile ./dist/index.js --watch"
|
|
33
36
|
},
|
|
34
37
|
"types": "src/types.d.ts",
|
|
35
|
-
"version": "0.
|
|
38
|
+
"version": "0.4.0"
|
|
36
39
|
}
|
package/src/fragment.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import {createTemplate, getNodes} from './helpers/dom';
|
|
2
|
+
import {parse} from './html';
|
|
3
|
+
|
|
4
|
+
export type Fragment = {
|
|
5
|
+
append(parent: Node): void;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export type FragmentData = {
|
|
9
|
+
expressions: unknown[];
|
|
10
|
+
nodes: Node[];
|
|
11
|
+
strings: TemplateStringsArray;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export function createFragment(
|
|
15
|
+
strings: TemplateStringsArray,
|
|
16
|
+
expressions: unknown[],
|
|
17
|
+
): Fragment {
|
|
18
|
+
const data: FragmentData = {
|
|
19
|
+
expressions,
|
|
20
|
+
strings,
|
|
21
|
+
nodes: [],
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const instance = Object.create({
|
|
25
|
+
append(parent: ParentNode) {
|
|
26
|
+
if (data.nodes.length > 0) {
|
|
27
|
+
return parent.append(...data.nodes);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const parsed = parse(data);
|
|
31
|
+
const templated = createTemplate(parsed);
|
|
32
|
+
|
|
33
|
+
data.nodes.splice(0, data.nodes.length, ...getNodes(templated));
|
|
34
|
+
|
|
35
|
+
parent.append(...data.nodes);
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
return instance;
|
|
40
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export function createTemplate(html: string): Node {
|
|
2
|
+
const template = document.createElement('template');
|
|
3
|
+
|
|
4
|
+
template.innerHTML = html;
|
|
5
|
+
|
|
6
|
+
const cloned = template.content.cloneNode(true);
|
|
7
|
+
|
|
8
|
+
const scripts = [
|
|
9
|
+
...(cloned instanceof Element ? cloned.querySelectorAll('script') : []),
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
const {length} = scripts;
|
|
13
|
+
|
|
14
|
+
for (let index = 0; index < length; index += 1) {
|
|
15
|
+
scripts[index].remove();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
cloned.normalize();
|
|
19
|
+
|
|
20
|
+
return cloned;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function getNodes(node: Node): Node[] {
|
|
24
|
+
return /^documentfragment$/i.test(node.constructor.name)
|
|
25
|
+
? [...node.childNodes]
|
|
26
|
+
: [node];
|
|
27
|
+
}
|
package/src/html.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import {isNullableOrWhitespace} from '@oscarpalmer/atoms/is';
|
|
2
|
+
import {createFragment, type FragmentData, type Fragment} from './fragment';
|
|
3
|
+
|
|
4
|
+
export function html(
|
|
5
|
+
strings: TemplateStringsArray,
|
|
6
|
+
...values: unknown[]
|
|
7
|
+
): Fragment {
|
|
8
|
+
return createFragment(strings, values);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function parse(data: FragmentData): string {
|
|
12
|
+
const {length} = data.strings;
|
|
13
|
+
|
|
14
|
+
let template = '';
|
|
15
|
+
|
|
16
|
+
for (let index = 0; index < length; index += 1) {
|
|
17
|
+
const part = data.strings[index];
|
|
18
|
+
const expression = data.expressions[index];
|
|
19
|
+
|
|
20
|
+
template += isNullableOrWhitespace(expression)
|
|
21
|
+
? part
|
|
22
|
+
: `${part}${expression}`;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return template;
|
|
26
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type Fragment = {
|
|
2
|
+
append(parent: Node): void;
|
|
3
|
+
};
|
|
4
|
+
export type FragmentData = {
|
|
5
|
+
expressions: unknown[];
|
|
6
|
+
nodes: Node[];
|
|
7
|
+
strings: TemplateStringsArray;
|
|
8
|
+
};
|
|
9
|
+
export declare function createFragment(strings: TemplateStringsArray, expressions: unknown[]): Fragment;
|
package/types/html.d.ts
ADDED
package/types/index.d.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export {};
|
|
1
|
+
export type { Fragment } from './fragment';
|
|
2
|
+
export { html } from './html';
|