@bquery/bquery 1.0.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/LICENSE.md +21 -0
- package/README.md +266 -0
- package/dist/component/index.d.ts +155 -0
- package/dist/component/index.d.ts.map +1 -0
- package/dist/component.es.mjs +128 -0
- package/dist/component.es.mjs.map +1 -0
- package/dist/core/collection.d.ts +198 -0
- package/dist/core/collection.d.ts.map +1 -0
- package/dist/core/element.d.ts +301 -0
- package/dist/core/element.d.ts.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/selector.d.ts +11 -0
- package/dist/core/selector.d.ts.map +1 -0
- package/dist/core/shared.d.ts +7 -0
- package/dist/core/shared.d.ts.map +1 -0
- package/dist/core/utils.d.ts +300 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core.es.mjs +1015 -0
- package/dist/core.es.mjs.map +1 -0
- package/dist/full.d.ts +48 -0
- package/dist/full.d.ts.map +1 -0
- package/dist/full.es.mjs +43 -0
- package/dist/full.es.mjs.map +1 -0
- package/dist/full.iife.js +2 -0
- package/dist/full.iife.js.map +1 -0
- package/dist/full.umd.js +2 -0
- package/dist/full.umd.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.es.mjs +43 -0
- package/dist/index.es.mjs.map +1 -0
- package/dist/motion/index.d.ts +145 -0
- package/dist/motion/index.d.ts.map +1 -0
- package/dist/motion.es.mjs +104 -0
- package/dist/motion.es.mjs.map +1 -0
- package/dist/platform/buckets.d.ts +44 -0
- package/dist/platform/buckets.d.ts.map +1 -0
- package/dist/platform/cache.d.ts +71 -0
- package/dist/platform/cache.d.ts.map +1 -0
- package/dist/platform/index.d.ts +15 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/notifications.d.ts +52 -0
- package/dist/platform/notifications.d.ts.map +1 -0
- package/dist/platform/storage.d.ts +69 -0
- package/dist/platform/storage.d.ts.map +1 -0
- package/dist/platform.es.mjs +245 -0
- package/dist/platform.es.mjs.map +1 -0
- package/dist/reactive/index.d.ts +8 -0
- package/dist/reactive/index.d.ts.map +1 -0
- package/dist/reactive/signal.d.ts +204 -0
- package/dist/reactive/signal.d.ts.map +1 -0
- package/dist/reactive.es.mjs +123 -0
- package/dist/reactive.es.mjs.map +1 -0
- package/dist/security/index.d.ts +8 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/sanitize.d.ts +99 -0
- package/dist/security/sanitize.d.ts.map +1 -0
- package/dist/security.es.mjs +194 -0
- package/dist/security.es.mjs.map +1 -0
- package/package.json +120 -0
- package/src/component/index.ts +360 -0
- package/src/core/collection.ts +339 -0
- package/src/core/element.ts +493 -0
- package/src/core/index.ts +4 -0
- package/src/core/selector.ts +29 -0
- package/src/core/shared.ts +13 -0
- package/src/core/utils.ts +425 -0
- package/src/full.ts +101 -0
- package/src/index.ts +27 -0
- package/src/motion/index.ts +365 -0
- package/src/platform/buckets.ts +115 -0
- package/src/platform/cache.ts +130 -0
- package/src/platform/index.ts +18 -0
- package/src/platform/notifications.ts +87 -0
- package/src/platform/storage.ts +208 -0
- package/src/reactive/index.ts +9 -0
- package/src/reactive/signal.ts +347 -0
- package/src/security/index.ts +18 -0
- package/src/security/sanitize.ts +446 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
const f = "bquery-sanitizer";
|
|
2
|
+
let i = null;
|
|
3
|
+
const _ = () => typeof window.trustedTypes < "u", y = () => {
|
|
4
|
+
if (i) return i;
|
|
5
|
+
const t = window;
|
|
6
|
+
if (!t.trustedTypes) return null;
|
|
7
|
+
try {
|
|
8
|
+
return i = t.trustedTypes.createPolicy(f, {
|
|
9
|
+
createHTML: (e) => d(e)
|
|
10
|
+
}), i;
|
|
11
|
+
} catch {
|
|
12
|
+
return console.warn(`bQuery: Could not create Trusted Types policy "${f}"`), null;
|
|
13
|
+
}
|
|
14
|
+
}, b = /* @__PURE__ */ new Set([
|
|
15
|
+
"a",
|
|
16
|
+
"abbr",
|
|
17
|
+
"address",
|
|
18
|
+
"article",
|
|
19
|
+
"aside",
|
|
20
|
+
"b",
|
|
21
|
+
"bdi",
|
|
22
|
+
"bdo",
|
|
23
|
+
"blockquote",
|
|
24
|
+
"br",
|
|
25
|
+
"button",
|
|
26
|
+
"caption",
|
|
27
|
+
"cite",
|
|
28
|
+
"code",
|
|
29
|
+
"col",
|
|
30
|
+
"colgroup",
|
|
31
|
+
"data",
|
|
32
|
+
"dd",
|
|
33
|
+
"del",
|
|
34
|
+
"details",
|
|
35
|
+
"dfn",
|
|
36
|
+
"div",
|
|
37
|
+
"dl",
|
|
38
|
+
"dt",
|
|
39
|
+
"em",
|
|
40
|
+
"figcaption",
|
|
41
|
+
"figure",
|
|
42
|
+
"footer",
|
|
43
|
+
"form",
|
|
44
|
+
"h1",
|
|
45
|
+
"h2",
|
|
46
|
+
"h3",
|
|
47
|
+
"h4",
|
|
48
|
+
"h5",
|
|
49
|
+
"h6",
|
|
50
|
+
"header",
|
|
51
|
+
"hgroup",
|
|
52
|
+
"hr",
|
|
53
|
+
"i",
|
|
54
|
+
"img",
|
|
55
|
+
"input",
|
|
56
|
+
"ins",
|
|
57
|
+
"kbd",
|
|
58
|
+
"label",
|
|
59
|
+
"legend",
|
|
60
|
+
"li",
|
|
61
|
+
"main",
|
|
62
|
+
"mark",
|
|
63
|
+
"nav",
|
|
64
|
+
"ol",
|
|
65
|
+
"optgroup",
|
|
66
|
+
"option",
|
|
67
|
+
"p",
|
|
68
|
+
"picture",
|
|
69
|
+
"pre",
|
|
70
|
+
"progress",
|
|
71
|
+
"q",
|
|
72
|
+
"rp",
|
|
73
|
+
"rt",
|
|
74
|
+
"ruby",
|
|
75
|
+
"s",
|
|
76
|
+
"samp",
|
|
77
|
+
"section",
|
|
78
|
+
"select",
|
|
79
|
+
"small",
|
|
80
|
+
"source",
|
|
81
|
+
"span",
|
|
82
|
+
"strong",
|
|
83
|
+
"sub",
|
|
84
|
+
"summary",
|
|
85
|
+
"sup",
|
|
86
|
+
"table",
|
|
87
|
+
"tbody",
|
|
88
|
+
"td",
|
|
89
|
+
"textarea",
|
|
90
|
+
"tfoot",
|
|
91
|
+
"th",
|
|
92
|
+
"thead",
|
|
93
|
+
"time",
|
|
94
|
+
"tr",
|
|
95
|
+
"u",
|
|
96
|
+
"ul",
|
|
97
|
+
"var",
|
|
98
|
+
"wbr"
|
|
99
|
+
]), A = /* @__PURE__ */ new Set([
|
|
100
|
+
"alt",
|
|
101
|
+
"class",
|
|
102
|
+
"dir",
|
|
103
|
+
"height",
|
|
104
|
+
"hidden",
|
|
105
|
+
"href",
|
|
106
|
+
"id",
|
|
107
|
+
"lang",
|
|
108
|
+
"loading",
|
|
109
|
+
"name",
|
|
110
|
+
"role",
|
|
111
|
+
"src",
|
|
112
|
+
"srcset",
|
|
113
|
+
"style",
|
|
114
|
+
"tabindex",
|
|
115
|
+
"title",
|
|
116
|
+
"type",
|
|
117
|
+
"width",
|
|
118
|
+
"aria-*"
|
|
119
|
+
]), L = ["on", "formaction"], S = ["javascript:", "data:", "vbscript:"], C = (t, e, o) => {
|
|
120
|
+
const n = t.toLowerCase();
|
|
121
|
+
for (const l of L)
|
|
122
|
+
if (n.startsWith(l)) return !1;
|
|
123
|
+
return o && n.startsWith("data-") || n.startsWith("aria-") ? !0 : e.has(n);
|
|
124
|
+
}, E = (t) => t.replace(/[\u0000-\u001F\u007F\s]+/g, "").toLowerCase(), N = (t) => {
|
|
125
|
+
const e = E(t);
|
|
126
|
+
for (const o of S)
|
|
127
|
+
if (e.startsWith(o)) return !1;
|
|
128
|
+
return !0;
|
|
129
|
+
}, d = (t, e = {}) => {
|
|
130
|
+
const {
|
|
131
|
+
allowTags: o = [],
|
|
132
|
+
allowAttributes: n = [],
|
|
133
|
+
allowDataAttributes: l = !0,
|
|
134
|
+
stripAllTags: h = !1
|
|
135
|
+
} = e, T = /* @__PURE__ */ new Set([...b, ...o.map((r) => r.toLowerCase())]), g = /* @__PURE__ */ new Set([
|
|
136
|
+
...A,
|
|
137
|
+
...n.map((r) => r.toLowerCase())
|
|
138
|
+
]), a = document.createElement("template");
|
|
139
|
+
if (a.innerHTML = t, h)
|
|
140
|
+
return a.content.textContent ?? "";
|
|
141
|
+
const p = document.createTreeWalker(a.content, NodeFilter.SHOW_ELEMENT), m = [];
|
|
142
|
+
for (; p.nextNode(); ) {
|
|
143
|
+
const r = p.currentNode, w = r.tagName.toLowerCase();
|
|
144
|
+
if (!T.has(w)) {
|
|
145
|
+
m.push(r);
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const u = [];
|
|
149
|
+
for (const s of Array.from(r.attributes)) {
|
|
150
|
+
const c = s.name.toLowerCase();
|
|
151
|
+
if (!C(c, g, l)) {
|
|
152
|
+
u.push(s.name);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
(c === "href" || c === "src" || c === "srcset") && !N(s.value) && u.push(s.name);
|
|
156
|
+
}
|
|
157
|
+
for (const s of u)
|
|
158
|
+
r.removeAttribute(s);
|
|
159
|
+
}
|
|
160
|
+
for (const r of m)
|
|
161
|
+
r.remove();
|
|
162
|
+
return a.innerHTML;
|
|
163
|
+
}, v = (t, e = {}) => d(t, e), H = (t) => {
|
|
164
|
+
const e = y();
|
|
165
|
+
return e ? e.createHTML(t) : v(t);
|
|
166
|
+
}, O = (t) => {
|
|
167
|
+
const e = {
|
|
168
|
+
"&": "&",
|
|
169
|
+
"<": "<",
|
|
170
|
+
">": ">",
|
|
171
|
+
'"': """,
|
|
172
|
+
"'": "'",
|
|
173
|
+
"`": "`"
|
|
174
|
+
};
|
|
175
|
+
return t.replace(/[&<>"'`]/g, (o) => e[o]);
|
|
176
|
+
}, R = (t) => d(t, { stripAllTags: !0 }), x = (t = 16) => {
|
|
177
|
+
const e = new Uint8Array(t);
|
|
178
|
+
return crypto.getRandomValues(e), btoa(String.fromCharCode(...e)).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
179
|
+
}, D = (t) => {
|
|
180
|
+
const e = document.querySelector('meta[http-equiv="Content-Security-Policy"]');
|
|
181
|
+
return e ? (e.getAttribute("content") ?? "").includes(t) : !1;
|
|
182
|
+
};
|
|
183
|
+
export {
|
|
184
|
+
H as createTrustedHtml,
|
|
185
|
+
O as escapeHtml,
|
|
186
|
+
x as generateNonce,
|
|
187
|
+
y as getTrustedTypesPolicy,
|
|
188
|
+
D as hasCSPDirective,
|
|
189
|
+
_ as isTrustedTypesSupported,
|
|
190
|
+
v as sanitize,
|
|
191
|
+
v as sanitizeHtml,
|
|
192
|
+
R as stripTags
|
|
193
|
+
};
|
|
194
|
+
//# sourceMappingURL=security.es.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.es.mjs","sources":["../src/security/sanitize.ts"],"sourcesContent":["/**\n * Security utilities for HTML sanitization, CSP compatibility, and Trusted Types.\n * All DOM writes are sanitized by default to prevent XSS attacks.\n *\n * @module bquery/security\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Sanitizer configuration options.\n */\nexport interface SanitizeOptions {\n /** Allow these additional tags (default: none) */\n allowTags?: string[];\n /** Allow these additional attributes (default: none) */\n allowAttributes?: string[];\n /** Allow data-* attributes (default: true) */\n allowDataAttributes?: boolean;\n /** Strip all tags and return plain text (default: false) */\n stripAllTags?: boolean;\n}\n\n/**\n * Trusted Types policy name.\n */\nconst POLICY_NAME = 'bquery-sanitizer';\n\n// ============================================================================\n// Trusted Types Support\n// ============================================================================\n\n/** Window interface extended with Trusted Types */\ninterface TrustedTypesWindow extends Window {\n trustedTypes?: {\n createPolicy: (\n name: string,\n rules: { createHTML?: (input: string) => string }\n ) => TrustedTypePolicy;\n isHTML?: (value: unknown) => boolean;\n };\n}\n\n/** Trusted Types policy interface */\ninterface TrustedTypePolicy {\n createHTML: (input: string) => TrustedHTML;\n}\n\n/** Trusted HTML type placeholder for environments without Trusted Types */\ninterface TrustedHTML {\n toString(): string;\n}\n\n/** Cached Trusted Types policy */\nlet cachedPolicy: TrustedTypePolicy | null = null;\n\n/**\n * Check if Trusted Types API is available.\n * @returns True if Trusted Types are supported\n */\nexport const isTrustedTypesSupported = (): boolean => {\n return typeof (window as TrustedTypesWindow).trustedTypes !== 'undefined';\n};\n\n/**\n * Get or create the bQuery Trusted Types policy.\n * @returns The Trusted Types policy or null if unsupported\n */\nexport const getTrustedTypesPolicy = (): TrustedTypePolicy | null => {\n if (cachedPolicy) return cachedPolicy;\n\n const win = window as TrustedTypesWindow;\n if (!win.trustedTypes) return null;\n\n try {\n cachedPolicy = win.trustedTypes.createPolicy(POLICY_NAME, {\n createHTML: (input: string) => sanitizeHtmlCore(input),\n });\n return cachedPolicy;\n } catch {\n // Policy may already exist or be blocked by CSP\n console.warn(`bQuery: Could not create Trusted Types policy \"${POLICY_NAME}\"`);\n return null;\n }\n};\n\n// ============================================================================\n// Default Safe Lists\n// ============================================================================\n\n/**\n * Default allowed HTML tags considered safe.\n */\nconst DEFAULT_ALLOWED_TAGS = new Set([\n 'a',\n 'abbr',\n 'address',\n 'article',\n 'aside',\n 'b',\n 'bdi',\n 'bdo',\n 'blockquote',\n 'br',\n 'button',\n 'caption',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'data',\n 'dd',\n 'del',\n 'details',\n 'dfn',\n 'div',\n 'dl',\n 'dt',\n 'em',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'hgroup',\n 'hr',\n 'i',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'label',\n 'legend',\n 'li',\n 'main',\n 'mark',\n 'nav',\n 'ol',\n 'optgroup',\n 'option',\n 'p',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'section',\n 'select',\n 'small',\n 'source',\n 'span',\n 'strong',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'tr',\n 'u',\n 'ul',\n 'var',\n 'wbr',\n]);\n\n/**\n * Default allowed attributes considered safe.\n */\nconst DEFAULT_ALLOWED_ATTRIBUTES = new Set([\n 'alt',\n 'class',\n 'dir',\n 'height',\n 'hidden',\n 'href',\n 'id',\n 'lang',\n 'loading',\n 'name',\n 'role',\n 'src',\n 'srcset',\n 'style',\n 'tabindex',\n 'title',\n 'type',\n 'width',\n 'aria-*',\n]);\n\n/**\n * Dangerous attribute prefixes to always remove.\n */\nconst DANGEROUS_ATTR_PREFIXES = ['on', 'formaction'];\n\n/**\n * Dangerous URL protocols to block.\n */\nconst DANGEROUS_PROTOCOLS = ['javascript:', 'data:', 'vbscript:'];\n\n// ============================================================================\n// Core Sanitization\n// ============================================================================\n\n/**\n * Check if an attribute name is allowed.\n */\nconst isAllowedAttribute = (\n name: string,\n allowedSet: Set<string>,\n allowDataAttrs: boolean\n): boolean => {\n const lowerName = name.toLowerCase();\n\n // Check dangerous prefixes\n for (const prefix of DANGEROUS_ATTR_PREFIXES) {\n if (lowerName.startsWith(prefix)) return false;\n }\n\n // Check data attributes\n if (allowDataAttrs && lowerName.startsWith('data-')) return true;\n\n // Check aria attributes (allowed by default)\n if (lowerName.startsWith('aria-')) return true;\n\n // Check explicit allow list\n return allowedSet.has(lowerName);\n};\n\n/**\n * Normalize URL by removing control characters and whitespace.\n */\nconst normalizeUrl = (value: string): string =>\n value.replace(/[\\u0000-\\u001F\\u007F\\s]+/g, '').toLowerCase();\n\n/**\n * Check if a URL value is safe.\n */\nconst isSafeUrl = (value: string): boolean => {\n const normalized = normalizeUrl(value);\n for (const protocol of DANGEROUS_PROTOCOLS) {\n if (normalized.startsWith(protocol)) return false;\n }\n return true;\n};\n\n/**\n * Core sanitization logic (without Trusted Types wrapper).\n */\nconst sanitizeHtmlCore = (html: string, options: SanitizeOptions = {}): string => {\n const {\n allowTags = [],\n allowAttributes = [],\n allowDataAttributes = true,\n stripAllTags = false,\n } = options;\n\n // Build combined allow sets\n const allowedTags = new Set([...DEFAULT_ALLOWED_TAGS, ...allowTags.map((t) => t.toLowerCase())]);\n const allowedAttrs = new Set([\n ...DEFAULT_ALLOWED_ATTRIBUTES,\n ...allowAttributes.map((a) => a.toLowerCase()),\n ]);\n\n // Use template for parsing\n const template = document.createElement('template');\n template.innerHTML = html;\n\n if (stripAllTags) {\n return template.content.textContent ?? '';\n }\n\n // Walk the DOM tree\n const walker = document.createTreeWalker(template.content, NodeFilter.SHOW_ELEMENT);\n\n const toRemove: Element[] = [];\n\n while (walker.nextNode()) {\n const el = walker.currentNode as Element;\n const tagName = el.tagName.toLowerCase();\n\n // Remove disallowed tags entirely\n if (!allowedTags.has(tagName)) {\n toRemove.push(el);\n continue;\n }\n\n // Process attributes\n const attrsToRemove: string[] = [];\n for (const attr of Array.from(el.attributes)) {\n const attrName = attr.name.toLowerCase();\n\n // Check if attribute is allowed\n if (!isAllowedAttribute(attrName, allowedAttrs, allowDataAttributes)) {\n attrsToRemove.push(attr.name);\n continue;\n }\n\n // Validate URL attributes\n if (\n (attrName === 'href' || attrName === 'src' || attrName === 'srcset') &&\n !isSafeUrl(attr.value)\n ) {\n attrsToRemove.push(attr.name);\n }\n }\n\n // Remove disallowed attributes\n for (const attrName of attrsToRemove) {\n el.removeAttribute(attrName);\n }\n }\n\n // Remove disallowed elements\n for (const el of toRemove) {\n el.remove();\n }\n\n return template.innerHTML;\n};\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Sanitize HTML string, removing dangerous elements and attributes.\n * Uses Trusted Types when available for CSP compliance.\n *\n * @param html - The HTML string to sanitize\n * @param options - Sanitization options\n * @returns Sanitized HTML string\n *\n * @example\n * ```ts\n * const safe = sanitizeHtml('<div onclick=\"alert(1)\">Hello</div>');\n * // Returns: '<div>Hello</div>'\n * ```\n */\nexport const sanitizeHtml = (html: string, options: SanitizeOptions = {}): string => {\n return sanitizeHtmlCore(html, options);\n};\n\n/**\n * Create a Trusted HTML value for use with Trusted Types-enabled sites.\n * Falls back to regular string when Trusted Types are unavailable.\n *\n * @param html - The HTML string to wrap\n * @returns Trusted HTML value or sanitized string\n */\nexport const createTrustedHtml = (html: string): TrustedHTML | string => {\n const policy = getTrustedTypesPolicy();\n if (policy) {\n return policy.createHTML(html);\n }\n return sanitizeHtml(html);\n};\n\n/**\n * Escape HTML entities to prevent XSS.\n * Use this for displaying user content as text.\n *\n * @param text - The text to escape\n * @returns Escaped HTML string\n *\n * @example\n * ```ts\n * escapeHtml('<script>alert(1)</script>');\n * // Returns: '<script>alert(1)</script>'\n * ```\n */\nexport const escapeHtml = (text: string): string => {\n const escapeMap: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`',\n };\n return text.replace(/[&<>\"'`]/g, (char) => escapeMap[char]);\n};\n\n/**\n * Strip all HTML tags and return plain text.\n *\n * @param html - The HTML string to strip\n * @returns Plain text content\n */\nexport const stripTags = (html: string): string => {\n return sanitizeHtmlCore(html, { stripAllTags: true });\n};\n\n// ============================================================================\n// CSP Helpers\n// ============================================================================\n\n/**\n * Generate a nonce for inline scripts/styles.\n * Use with Content-Security-Policy nonce directives.\n *\n * @param length - Nonce length (default: 16)\n * @returns Cryptographically random nonce string\n */\nexport const generateNonce = (length: number = 16): string => {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return btoa(String.fromCharCode(...array))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n};\n\n/**\n * Check if a CSP header is present with specific directive.\n * Useful for feature detection and fallback strategies.\n *\n * @param directive - The CSP directive to check (e.g., 'script-src')\n * @returns True if the directive appears to be enforced\n */\nexport const hasCSPDirective = (directive: string): boolean => {\n // Check meta tag\n const meta = document.querySelector('meta[http-equiv=\"Content-Security-Policy\"]');\n if (meta) {\n const content = meta.getAttribute('content') ?? '';\n return content.includes(directive);\n }\n return false;\n};\n"],"names":["POLICY_NAME","cachedPolicy","isTrustedTypesSupported","getTrustedTypesPolicy","win","input","sanitizeHtmlCore","DEFAULT_ALLOWED_TAGS","DEFAULT_ALLOWED_ATTRIBUTES","DANGEROUS_ATTR_PREFIXES","DANGEROUS_PROTOCOLS","isAllowedAttribute","name","allowedSet","allowDataAttrs","lowerName","prefix","normalizeUrl","value","isSafeUrl","normalized","protocol","html","options","allowTags","allowAttributes","allowDataAttributes","stripAllTags","allowedTags","t","allowedAttrs","a","template","walker","toRemove","el","tagName","attrsToRemove","attr","attrName","sanitizeHtml","createTrustedHtml","policy","escapeHtml","text","escapeMap","char","stripTags","generateNonce","length","array","hasCSPDirective","directive","meta"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bquery/bquery",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "The jQuery for the Modern Web Platform - Zero build, TypeScript-first library with reactivity, components, and motion",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/full.umd.js",
|
|
7
|
+
"module": "./dist/index.es.mjs",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"unpkg": "./dist/full.umd.js",
|
|
10
|
+
"jsdelivr": "./dist/full.umd.js",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.es.mjs",
|
|
14
|
+
"require": "./dist/full.umd.js",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./full": {
|
|
18
|
+
"import": "./dist/full.es.mjs",
|
|
19
|
+
"require": "./dist/full.umd.js",
|
|
20
|
+
"types": "./dist/full.d.ts"
|
|
21
|
+
},
|
|
22
|
+
"./core": {
|
|
23
|
+
"import": "./dist/core.es.mjs",
|
|
24
|
+
"types": "./dist/core/index.d.ts"
|
|
25
|
+
},
|
|
26
|
+
"./reactive": {
|
|
27
|
+
"import": "./dist/reactive.es.mjs",
|
|
28
|
+
"types": "./dist/reactive/index.d.ts"
|
|
29
|
+
},
|
|
30
|
+
"./component": {
|
|
31
|
+
"import": "./dist/component.es.mjs",
|
|
32
|
+
"types": "./dist/component/index.d.ts"
|
|
33
|
+
},
|
|
34
|
+
"./motion": {
|
|
35
|
+
"import": "./dist/motion.es.mjs",
|
|
36
|
+
"types": "./dist/motion/index.d.ts"
|
|
37
|
+
},
|
|
38
|
+
"./security": {
|
|
39
|
+
"import": "./dist/security.es.mjs",
|
|
40
|
+
"types": "./dist/security/index.d.ts"
|
|
41
|
+
},
|
|
42
|
+
"./platform": {
|
|
43
|
+
"import": "./dist/platform.es.mjs",
|
|
44
|
+
"types": "./dist/platform/index.d.ts"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"files": [
|
|
48
|
+
"dist",
|
|
49
|
+
"src",
|
|
50
|
+
"README.md",
|
|
51
|
+
"LICENSE.md"
|
|
52
|
+
],
|
|
53
|
+
"sideEffects": false,
|
|
54
|
+
"scripts": {
|
|
55
|
+
"dev": "vitepress dev docs",
|
|
56
|
+
"build:docs": "vitepress build docs",
|
|
57
|
+
"preview": "vitepress preview docs",
|
|
58
|
+
"playground": "vite dev playground",
|
|
59
|
+
"build": "bun run build:lib && bun run build:umd && bun run build:types",
|
|
60
|
+
"build:lib": "vite build",
|
|
61
|
+
"build:umd": "vite build --config vite.umd.config.ts",
|
|
62
|
+
"build:types": "tsc --emitDeclarationOnly --outDir dist",
|
|
63
|
+
"test": "bun test",
|
|
64
|
+
"test:watch": "bun test --watch",
|
|
65
|
+
"lint": "eslint . --fix",
|
|
66
|
+
"lint:types": "tsc --noEmit",
|
|
67
|
+
"format": "prettier --write .",
|
|
68
|
+
"format:check": "prettier --check .",
|
|
69
|
+
"docs:api": "typedoc",
|
|
70
|
+
"clean": "rimraf dist",
|
|
71
|
+
"prepublishOnly": "bun run clean && bun run build && bun test"
|
|
72
|
+
},
|
|
73
|
+
"keywords": [
|
|
74
|
+
"dom",
|
|
75
|
+
"manipulation",
|
|
76
|
+
"jquery",
|
|
77
|
+
"modern",
|
|
78
|
+
"typescript",
|
|
79
|
+
"signals",
|
|
80
|
+
"reactive",
|
|
81
|
+
"components",
|
|
82
|
+
"web-components",
|
|
83
|
+
"animation",
|
|
84
|
+
"motion",
|
|
85
|
+
"zero-build",
|
|
86
|
+
"cdn"
|
|
87
|
+
],
|
|
88
|
+
"author": "bQuery Contributors",
|
|
89
|
+
"license": "MIT",
|
|
90
|
+
"repository": {
|
|
91
|
+
"type": "git",
|
|
92
|
+
"url": "https://github.com/bquery/bquery.git"
|
|
93
|
+
},
|
|
94
|
+
"homepage": "https://bquery.dev",
|
|
95
|
+
"bugs": {
|
|
96
|
+
"url": "https://github.com/bquery/bquery/issues"
|
|
97
|
+
},
|
|
98
|
+
"publishConfig": {
|
|
99
|
+
"access": "public",
|
|
100
|
+
"registry": "https://registry.npmjs.org/"
|
|
101
|
+
},
|
|
102
|
+
"engines": {
|
|
103
|
+
"node": ">=18.0.0"
|
|
104
|
+
},
|
|
105
|
+
"devDependencies": {
|
|
106
|
+
"@typescript-eslint/eslint-plugin": "^8.18.0",
|
|
107
|
+
"@typescript-eslint/parser": "^8.18.0",
|
|
108
|
+
"bun-types": "^1.1.26",
|
|
109
|
+
"eslint": "^9.8.0",
|
|
110
|
+
"eslint-config-prettier": "^9.1.0",
|
|
111
|
+
"globals": "^15.9.0",
|
|
112
|
+
"happy-dom": "^20.3.4",
|
|
113
|
+
"prettier": "^3.3.3",
|
|
114
|
+
"rimraf": "^5.0.5",
|
|
115
|
+
"typedoc": "^0.25.13",
|
|
116
|
+
"typescript": "^5.5.4",
|
|
117
|
+
"vite": "^5.4.3",
|
|
118
|
+
"vitepress": "^1.3.1"
|
|
119
|
+
}
|
|
120
|
+
}
|