├── .gitignore ├── .node-version ├── LICENSE ├── README.md ├── index.ts ├── package-lock.json ├── package.json └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | index.js 3 | index.cjs* 4 | index.esm.js* 5 | index.d.ts -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | 18.17.0 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 toshusai 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # One 2 | 3 | ## What is One? 4 | 5 | https://toshusai.github.io/one-docs/ 6 | 7 | One is a lightweight, easy-to-use framework for building web applications that is simple, transparent, and fast. It consists of a single class contained in a single file of 1.7KB and requires zero dependencies and no build step. 8 | 9 | ## Overview 10 | 11 | One is a lightweight framework that makes it easy to build web applications with its focus on simplicity and transparency. The entire framework is contained within a single class, making it easy to use and understand. At only 11KB TypeScript in size (1.7KB JavaScript when gzip compressed), the class includes implementation of basic features found in modern frameworks, such as if statements, for loops, slots, and props. With zero dependencies and no build step required, One is a great choice for building small to medium-sized web applications. 12 | 13 | ## How to use 14 | 15 | Installation 16 | 17 | ```bash 18 | npm install @toshusai/one 19 | ``` 20 | 21 | ## Usage 22 | 23 | To use One, simply inherit the One class and implement the template method. 24 | 25 | ```ts 26 | import { One } from "@toshusai/one"; 27 | 28 | export class BasicComponent extends One { 29 | render() { 30 | return `
Hello World!
`; 31 | } 32 | 33 | mounted() { 34 | console.log("Can you see me in the console?"); 35 | } 36 | } 37 | ``` 38 | 39 | To initialize the application, create an instance and pass the root HTMLElement as an argument to the mount method. 40 | 41 | ```ts 42 | const element = document.getElementById("app")!; 43 | new BasicComponent().mount(element); 44 | ``` 45 | 46 | ## Features 47 | 48 | One supports the following features: 49 | 50 | - `-if` for if statements 51 | - `-for` for for loops 52 | - `` for multiple slots 53 | - `:value="value"` for two-way binding 54 | - `@click="onClick"` for event listeners 55 | 56 | ## Documentation 57 | 58 | documentation is available on the GitHub Pages site. 59 | https://toshusai.github.io/one-docs/ 60 | 61 | documentation source code is available on GitHub 62 | https://github.com/toshusai/one-docs 63 | 64 | ## License 65 | 66 | MIT License 67 | -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * the One 3 | */ 4 | export class One { 5 | /** 6 | * The dependencies of the component 7 | */ 8 | public deps: Record = {}; 9 | 10 | public els: HTMLElement[] = []; 11 | 12 | /** 13 | * Render the component 14 | * @param el 15 | * @param parent 16 | * @param slots 17 | * @returns 18 | */ 19 | public mount( 20 | el: HTMLElement, 21 | parent?: One, 22 | slots?: Record 23 | ) { 24 | this._i(); 25 | const res = this._h(el, true, {}, parent, slots); 26 | this.mounted(); 27 | return res; 28 | } 29 | 30 | /** 31 | * Emit a event to parent 32 | * @param name 33 | * @param value 34 | */ 35 | protected emit(name: string, value: any) { 36 | this._emits.dispatchEvent(new CustomEvent(name, { detail: value })); 37 | } 38 | 39 | /** 40 | * The template of the component 41 | */ 42 | protected render() { 43 | return ``; 44 | } 45 | 46 | /** 47 | * The lifecycle hook that is called when the component is mounted 48 | */ 49 | protected mounted() {} 50 | 51 | /** 52 | * The EventTarget that inside the component 53 | */ 54 | private _event = new EventTarget(); 55 | 56 | /** 57 | * The EventTarget that between parent and child 58 | */ 59 | private _emits = new EventTarget(); 60 | 61 | /** 62 | * Initialize the component 63 | */ 64 | private _i() { 65 | const props = Object.keys(this); 66 | props.map((p) => { 67 | if (p.startsWith("_") || p === "deps") return; 68 | this._r(p); 69 | }); 70 | } 71 | 72 | /** 73 | * Add a Event listener 74 | * @param event 75 | * @param callback 76 | */ 77 | private _ae(callback: () => void) { 78 | this._event.addEventListener("change", callback); 79 | } 80 | 81 | /** 82 | * Dispatch Event 83 | * @param value 84 | */ 85 | private _de() { 86 | this._event.dispatchEvent(new CustomEvent("change")); 87 | } 88 | 89 | /** 90 | * Handle a element 91 | * @param el 92 | * @param isRoot 93 | * @param scopeObj 94 | * @param parent 95 | * @param slots 96 | * @returns 97 | */ 98 | private _h( 99 | el: HTMLElement, 100 | isRoot: boolean, 101 | scopeObj: Record, 102 | parent?: One, 103 | slots?: Record 104 | ): Record | undefined { 105 | if (el.nodeType == 8) return; 106 | 107 | if (isRoot) { 108 | el.innerHTML = this.render(); 109 | this._de(); 110 | } 111 | let attrs = el.getAttributeNames(); 112 | let end = false; 113 | attrs.forEach((attr) => { 114 | if (end) return; 115 | const attrValue = el.getAttribute(attr); 116 | if (attrValue === null) return; 117 | if (attr.startsWith(":")) { 118 | const isTwoWay = attr.startsWith("::"); 119 | el.removeAttribute(attr); 120 | attr = attr 121 | .replace(/:/g, "") 122 | .replace(/-([a-z])/g, (g) => g[1].toUpperCase()); 123 | const propertyName = attr as keyof this; 124 | if (parent && this[propertyName] !== undefined) { 125 | const handleChange = () => { 126 | this._event.removeEventListener("change", handleChange); 127 | parent._event.removeEventListener("change", handleChange); 128 | const parentKey = attrValue as keyof One; 129 | if (isTwoWay && parent[parentKey]) { 130 | parent[parentKey] = this[propertyName] as any; 131 | } else { 132 | this[propertyName] = parent._f(attrValue as string, scopeObj); 133 | } 134 | this._ae(handleChange); 135 | parent._ae(handleChange); 136 | }; 137 | this[propertyName] = parent._f(attrValue as string, scopeObj); 138 | this._ae(handleChange); 139 | parent._ae(handleChange); 140 | } else { 141 | const handleChange = () => { 142 | const propertyValue = this._f(attrValue, scopeObj); 143 | if (typeof propertyValue == "boolean") { 144 | if (propertyValue) { 145 | el.setAttribute(attr, ""); 146 | } else { 147 | el.removeAttribute(attr); 148 | } 149 | } else if ( 150 | typeof propertyValue == "string" || 151 | typeof propertyValue == "number" 152 | ) { 153 | el.setAttribute(attr, `${propertyValue}`); 154 | } else { 155 | el.removeAttribute(attr); 156 | } 157 | }; 158 | handleChange(); 159 | this._ae(handleChange); 160 | } 161 | } else if (attr.startsWith("@") && typeof attrValue == "string") { 162 | el.removeAttribute(attr); 163 | const eventAttr = attr 164 | .replace("@", "") 165 | .replace(/-([a-z])/g, (g) => g[1].toUpperCase()); 166 | if (parent) { 167 | this._emits.addEventListener(eventAttr, (e) => { 168 | const customEvent = e as CustomEvent; 169 | parent._f(attrValue, scopeObj).call(parent, customEvent.detail); 170 | }); 171 | } else { 172 | el.addEventListener(eventAttr, (e) => { 173 | this._f(attrValue, scopeObj).call(this, e); 174 | }); 175 | } 176 | el.removeAttribute(attr); 177 | } else if (attr == "-text" && typeof attrValue == "string") { 178 | el.removeAttribute(attr); 179 | const handleChange = () => { 180 | el.innerHTML = this._f(attrValue, scopeObj); 181 | }; 182 | this._ae(handleChange); 183 | handleChange(); 184 | } else if (attr == "-if" && typeof attrValue == "string") { 185 | el.removeAttribute(attr); 186 | const parentNode = el.parentNode; 187 | if (!parentNode) return; 188 | let ifComment = document.createComment("if"); 189 | const isTrue = this._f(attrValue, scopeObj); 190 | const hide = () => { 191 | parentNode.insertBefore(ifComment, el); 192 | el = parentNode.removeChild(el); 193 | }; 194 | if (!isTrue) hide(); 195 | 196 | let prevIsTrue = isTrue; 197 | this._ae(() => { 198 | const isTrue = this._f(attrValue, scopeObj); 199 | if (prevIsTrue === isTrue) return; 200 | prevIsTrue = isTrue; 201 | if (isTrue) { 202 | const parentNode = ifComment.parentNode; 203 | if (!parentNode) return; 204 | parentNode?.insertBefore(el, ifComment); 205 | ifComment = parentNode.removeChild(ifComment); 206 | } else { 207 | const parentNode = el.parentNode; 208 | if (!parentNode) return; 209 | hide(); 210 | } 211 | }); 212 | } else if (attr == "-for") { 213 | el.removeAttribute(attr); 214 | let f = attrValue.split(" in "); 215 | let tmpl = el.cloneNode(true) as HTMLElement; 216 | tmpl.removeAttribute("-for"); 217 | let scopeObject: any = {}; 218 | const parentNode = el.parentNode; 219 | if (!parentNode) return; 220 | let forStart = document.createComment("for-s"); 221 | parentNode.insertBefore(forStart, el); 222 | let forEnd = document.createComment("for-e"); 223 | parentNode.insertBefore(forEnd, el.nextSibling); 224 | el = parentNode.removeChild(el); 225 | const onChange = () => { 226 | let endIndex = Array.prototype.indexOf.call( 227 | parentNode.childNodes, 228 | forEnd 229 | ); 230 | let startIndex = Array.prototype.indexOf.call( 231 | parentNode.childNodes, 232 | forEnd 233 | ); 234 | for (let i = endIndex - 1; i > startIndex + 1; i--) { 235 | parentNode.removeChild(parentNode.childNodes[i]); 236 | } 237 | for (let i of this._f(f[1], scopeObject)) { 238 | let cx = tmpl.cloneNode(true) as HTMLElement; 239 | if (cx) { 240 | forEnd.parentNode?.insertBefore(cx, forEnd); 241 | scopeObject[f[0]] = i; 242 | this._h(cx as HTMLElement, false, scopeObject, undefined, slots); 243 | } 244 | } 245 | }; 246 | this._ae(onChange); 247 | onChange(); 248 | end = true; 249 | } else { 250 | const propertyName = attr as keyof this; 251 | if (typeof this[propertyName] == "string") { 252 | this[propertyName] = attrValue as any; 253 | } 254 | } 255 | }); 256 | 257 | if (!end) { 258 | this._hc(el, scopeObj, slots); 259 | } 260 | if (el.tagName.startsWith("SLOT") && slots) { 261 | const slotSuffix = el.tagName.replace("SLOT", ""); 262 | el.innerHTML = ""; 263 | let key = slotSuffix === "" ? "" : slotSuffix; 264 | if (slots[key]) { 265 | el.append(...slots[key]); 266 | } 267 | } 268 | 269 | if (el.tagName.startsWith(`TPL`)) { 270 | const children: HTMLElement[] = []; 271 | for (let i = 0; i < el.childNodes.length; i++) { 272 | children.push(el.childNodes[i] as HTMLElement); 273 | } 274 | const parent = el.parentNode; 275 | if (!parent) return; 276 | parent.removeChild(el); 277 | return { 278 | [el.tagName.replace(`TPL`, "")]: children, 279 | }; 280 | } 281 | if ((isRoot && el.tagName != "DIV") || el.tagName.startsWith("SLOT")) { 282 | const children: HTMLElement[] = []; 283 | const parent = el.parentNode; 284 | if (!parent) return; 285 | const l = el.childNodes.length; 286 | for (let i = 0; i < l; i++) { 287 | children.push(parent.insertBefore(el.childNodes[0], el) as HTMLElement); 288 | } 289 | parent.removeChild(el); 290 | this.els = children; 291 | return { "": children }; 292 | } 293 | return { "": [el] }; 294 | } 295 | 296 | /** 297 | * eval Function 298 | * @param src 299 | * @param scopeObj 300 | * @returns 301 | */ 302 | private _f(src: string, scopeObj: any) { 303 | const props = Object.getOwnPropertyNames(this); 304 | let funcs = Object.getOwnPropertyNames(Object.getPrototypeOf(this)); 305 | const scopeKeys = Object.keys(scopeObj ?? {}); 306 | return new Function(...props, ...funcs, ...scopeKeys, `return ${src}`)( 307 | ...props.map((p) => this[p as keyof One]), 308 | ...funcs.map((f) => this[f as keyof One]), 309 | ...scopeKeys.map((k) => scopeObj[k]) 310 | ); 311 | } 312 | 313 | /** 314 | * Merge Slots 315 | * @param a 316 | * @param b 317 | * @returns 318 | */ 319 | private _ms(a: Record, b: Record) { 320 | const keys = Object.keys(a); 321 | const keys2 = Object.keys(b); 322 | const allKeys = [...keys, ...keys2]; 323 | const ret: Record = {}; 324 | allKeys.forEach((k) => { 325 | ret[k] = [...(a[k] ?? []), ...(b[k] ?? [])]; 326 | }); 327 | return ret; 328 | } 329 | 330 | /** 331 | * Handle Children 332 | * @param el 333 | * @param scopeObj 334 | * @param slots 335 | * @returns 336 | */ 337 | private _hc( 338 | el: HTMLElement, 339 | scopeObj: Record, 340 | slots?: Record 341 | ): Record { 342 | const l = el.childNodes.length; 343 | const allChildren: ChildNode[] = []; 344 | let newSlots: Record = {}; 345 | for (let i = 0; i < l; i++) { 346 | const child = el.childNodes[i]; 347 | allChildren.push(child); 348 | } 349 | allChildren.forEach((child) => { 350 | const lowerTagName = 351 | child instanceof HTMLElement ? child.tagName.toLowerCase() : ""; 352 | const Class = this.deps[lowerTagName]; 353 | if (Class) { 354 | const c = new Class(); 355 | Object.keys(this.deps).forEach((k) => { 356 | if (c.deps[k]) return; 357 | c.deps[k] = this.deps[k]; 358 | }); 359 | 360 | let childSlots = {}; 361 | if (child instanceof HTMLElement) { 362 | childSlots = 363 | c.mount( 364 | child, 365 | this, 366 | this._ms(slots ?? {}, this._hc(child, scopeObj, slots)) 367 | ) ?? {}; 368 | } else { 369 | childSlots = { "": [child] }; 370 | } 371 | if (childSlots) { 372 | newSlots = this._ms(newSlots, childSlots); 373 | } 374 | } else { 375 | const childSlots = 376 | child instanceof HTMLElement 377 | ? this._h(child, false, scopeObj, undefined, slots) 378 | : { "": [child] }; 379 | if (childSlots) { 380 | newSlots = this._ms(newSlots, childSlots); 381 | } 382 | } 383 | }); 384 | return newSlots; 385 | } 386 | 387 | /** 388 | * convert to Reactive 389 | * @param name property name 390 | * @returns 391 | */ 392 | private _r(name: string) { 393 | let _internal = this[name as keyof this] as any; 394 | if (typeof _internal === "function") return; 395 | if (typeof _internal === "object") { 396 | const handler: ProxyHandler = { 397 | get: (obj, k) => new Proxy(obj[k], handler), 398 | }; 399 | this[name as keyof this] = new Proxy(_internal, { 400 | get(obj, k) { 401 | if (typeof obj[k] == "object") { 402 | return new Proxy(obj[k], handler); 403 | } 404 | return obj[k]; 405 | }, 406 | set: (obj, k, v) => { 407 | obj[k] = v; 408 | this._de(); 409 | return true; 410 | }, 411 | }); 412 | } else { 413 | Object.defineProperty(this, name, { 414 | get: () => { 415 | return _internal; 416 | }, 417 | set: (value: any) => { 418 | _internal = value; 419 | this._de(); 420 | }, 421 | }); 422 | } 423 | } 424 | } 425 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@toshusai/one", 3 | "version": "1.0.0-alpha.4", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@toshusai/one", 9 | "version": "1.0.0-alpha.4", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "esbuild": "^0.17.15", 13 | "typescript": "^5.0.3" 14 | } 15 | }, 16 | "node_modules/@esbuild/android-arm": { 17 | "version": "0.17.15", 18 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.15.tgz", 19 | "integrity": "sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==", 20 | "cpu": [ 21 | "arm" 22 | ], 23 | "dev": true, 24 | "optional": true, 25 | "os": [ 26 | "android" 27 | ], 28 | "engines": { 29 | "node": ">=12" 30 | } 31 | }, 32 | "node_modules/@esbuild/android-arm64": { 33 | "version": "0.17.15", 34 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz", 35 | "integrity": "sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==", 36 | "cpu": [ 37 | "arm64" 38 | ], 39 | "dev": true, 40 | "optional": true, 41 | "os": [ 42 | "android" 43 | ], 44 | "engines": { 45 | "node": ">=12" 46 | } 47 | }, 48 | "node_modules/@esbuild/android-x64": { 49 | "version": "0.17.15", 50 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.15.tgz", 51 | "integrity": "sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==", 52 | "cpu": [ 53 | "x64" 54 | ], 55 | "dev": true, 56 | "optional": true, 57 | "os": [ 58 | "android" 59 | ], 60 | "engines": { 61 | "node": ">=12" 62 | } 63 | }, 64 | "node_modules/@esbuild/darwin-arm64": { 65 | "version": "0.17.15", 66 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", 67 | "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", 68 | "cpu": [ 69 | "arm64" 70 | ], 71 | "dev": true, 72 | "optional": true, 73 | "os": [ 74 | "darwin" 75 | ], 76 | "engines": { 77 | "node": ">=12" 78 | } 79 | }, 80 | "node_modules/@esbuild/darwin-x64": { 81 | "version": "0.17.15", 82 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz", 83 | "integrity": "sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==", 84 | "cpu": [ 85 | "x64" 86 | ], 87 | "dev": true, 88 | "optional": true, 89 | "os": [ 90 | "darwin" 91 | ], 92 | "engines": { 93 | "node": ">=12" 94 | } 95 | }, 96 | "node_modules/@esbuild/freebsd-arm64": { 97 | "version": "0.17.15", 98 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz", 99 | "integrity": "sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==", 100 | "cpu": [ 101 | "arm64" 102 | ], 103 | "dev": true, 104 | "optional": true, 105 | "os": [ 106 | "freebsd" 107 | ], 108 | "engines": { 109 | "node": ">=12" 110 | } 111 | }, 112 | "node_modules/@esbuild/freebsd-x64": { 113 | "version": "0.17.15", 114 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz", 115 | "integrity": "sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==", 116 | "cpu": [ 117 | "x64" 118 | ], 119 | "dev": true, 120 | "optional": true, 121 | "os": [ 122 | "freebsd" 123 | ], 124 | "engines": { 125 | "node": ">=12" 126 | } 127 | }, 128 | "node_modules/@esbuild/linux-arm": { 129 | "version": "0.17.15", 130 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz", 131 | "integrity": "sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==", 132 | "cpu": [ 133 | "arm" 134 | ], 135 | "dev": true, 136 | "optional": true, 137 | "os": [ 138 | "linux" 139 | ], 140 | "engines": { 141 | "node": ">=12" 142 | } 143 | }, 144 | "node_modules/@esbuild/linux-arm64": { 145 | "version": "0.17.15", 146 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz", 147 | "integrity": "sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==", 148 | "cpu": [ 149 | "arm64" 150 | ], 151 | "dev": true, 152 | "optional": true, 153 | "os": [ 154 | "linux" 155 | ], 156 | "engines": { 157 | "node": ">=12" 158 | } 159 | }, 160 | "node_modules/@esbuild/linux-ia32": { 161 | "version": "0.17.15", 162 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz", 163 | "integrity": "sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==", 164 | "cpu": [ 165 | "ia32" 166 | ], 167 | "dev": true, 168 | "optional": true, 169 | "os": [ 170 | "linux" 171 | ], 172 | "engines": { 173 | "node": ">=12" 174 | } 175 | }, 176 | "node_modules/@esbuild/linux-loong64": { 177 | "version": "0.17.15", 178 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz", 179 | "integrity": "sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==", 180 | "cpu": [ 181 | "loong64" 182 | ], 183 | "dev": true, 184 | "optional": true, 185 | "os": [ 186 | "linux" 187 | ], 188 | "engines": { 189 | "node": ">=12" 190 | } 191 | }, 192 | "node_modules/@esbuild/linux-mips64el": { 193 | "version": "0.17.15", 194 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz", 195 | "integrity": "sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==", 196 | "cpu": [ 197 | "mips64el" 198 | ], 199 | "dev": true, 200 | "optional": true, 201 | "os": [ 202 | "linux" 203 | ], 204 | "engines": { 205 | "node": ">=12" 206 | } 207 | }, 208 | "node_modules/@esbuild/linux-ppc64": { 209 | "version": "0.17.15", 210 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz", 211 | "integrity": "sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==", 212 | "cpu": [ 213 | "ppc64" 214 | ], 215 | "dev": true, 216 | "optional": true, 217 | "os": [ 218 | "linux" 219 | ], 220 | "engines": { 221 | "node": ">=12" 222 | } 223 | }, 224 | "node_modules/@esbuild/linux-riscv64": { 225 | "version": "0.17.15", 226 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz", 227 | "integrity": "sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==", 228 | "cpu": [ 229 | "riscv64" 230 | ], 231 | "dev": true, 232 | "optional": true, 233 | "os": [ 234 | "linux" 235 | ], 236 | "engines": { 237 | "node": ">=12" 238 | } 239 | }, 240 | "node_modules/@esbuild/linux-s390x": { 241 | "version": "0.17.15", 242 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz", 243 | "integrity": "sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==", 244 | "cpu": [ 245 | "s390x" 246 | ], 247 | "dev": true, 248 | "optional": true, 249 | "os": [ 250 | "linux" 251 | ], 252 | "engines": { 253 | "node": ">=12" 254 | } 255 | }, 256 | "node_modules/@esbuild/linux-x64": { 257 | "version": "0.17.15", 258 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz", 259 | "integrity": "sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==", 260 | "cpu": [ 261 | "x64" 262 | ], 263 | "dev": true, 264 | "optional": true, 265 | "os": [ 266 | "linux" 267 | ], 268 | "engines": { 269 | "node": ">=12" 270 | } 271 | }, 272 | "node_modules/@esbuild/netbsd-x64": { 273 | "version": "0.17.15", 274 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz", 275 | "integrity": "sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==", 276 | "cpu": [ 277 | "x64" 278 | ], 279 | "dev": true, 280 | "optional": true, 281 | "os": [ 282 | "netbsd" 283 | ], 284 | "engines": { 285 | "node": ">=12" 286 | } 287 | }, 288 | "node_modules/@esbuild/openbsd-x64": { 289 | "version": "0.17.15", 290 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz", 291 | "integrity": "sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==", 292 | "cpu": [ 293 | "x64" 294 | ], 295 | "dev": true, 296 | "optional": true, 297 | "os": [ 298 | "openbsd" 299 | ], 300 | "engines": { 301 | "node": ">=12" 302 | } 303 | }, 304 | "node_modules/@esbuild/sunos-x64": { 305 | "version": "0.17.15", 306 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz", 307 | "integrity": "sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==", 308 | "cpu": [ 309 | "x64" 310 | ], 311 | "dev": true, 312 | "optional": true, 313 | "os": [ 314 | "sunos" 315 | ], 316 | "engines": { 317 | "node": ">=12" 318 | } 319 | }, 320 | "node_modules/@esbuild/win32-arm64": { 321 | "version": "0.17.15", 322 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz", 323 | "integrity": "sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==", 324 | "cpu": [ 325 | "arm64" 326 | ], 327 | "dev": true, 328 | "optional": true, 329 | "os": [ 330 | "win32" 331 | ], 332 | "engines": { 333 | "node": ">=12" 334 | } 335 | }, 336 | "node_modules/@esbuild/win32-ia32": { 337 | "version": "0.17.15", 338 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz", 339 | "integrity": "sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==", 340 | "cpu": [ 341 | "ia32" 342 | ], 343 | "dev": true, 344 | "optional": true, 345 | "os": [ 346 | "win32" 347 | ], 348 | "engines": { 349 | "node": ">=12" 350 | } 351 | }, 352 | "node_modules/@esbuild/win32-x64": { 353 | "version": "0.17.15", 354 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz", 355 | "integrity": "sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==", 356 | "cpu": [ 357 | "x64" 358 | ], 359 | "dev": true, 360 | "optional": true, 361 | "os": [ 362 | "win32" 363 | ], 364 | "engines": { 365 | "node": ">=12" 366 | } 367 | }, 368 | "node_modules/esbuild": { 369 | "version": "0.17.15", 370 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.15.tgz", 371 | "integrity": "sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==", 372 | "dev": true, 373 | "hasInstallScript": true, 374 | "bin": { 375 | "esbuild": "bin/esbuild" 376 | }, 377 | "engines": { 378 | "node": ">=12" 379 | }, 380 | "optionalDependencies": { 381 | "@esbuild/android-arm": "0.17.15", 382 | "@esbuild/android-arm64": "0.17.15", 383 | "@esbuild/android-x64": "0.17.15", 384 | "@esbuild/darwin-arm64": "0.17.15", 385 | "@esbuild/darwin-x64": "0.17.15", 386 | "@esbuild/freebsd-arm64": "0.17.15", 387 | "@esbuild/freebsd-x64": "0.17.15", 388 | "@esbuild/linux-arm": "0.17.15", 389 | "@esbuild/linux-arm64": "0.17.15", 390 | "@esbuild/linux-ia32": "0.17.15", 391 | "@esbuild/linux-loong64": "0.17.15", 392 | "@esbuild/linux-mips64el": "0.17.15", 393 | "@esbuild/linux-ppc64": "0.17.15", 394 | "@esbuild/linux-riscv64": "0.17.15", 395 | "@esbuild/linux-s390x": "0.17.15", 396 | "@esbuild/linux-x64": "0.17.15", 397 | "@esbuild/netbsd-x64": "0.17.15", 398 | "@esbuild/openbsd-x64": "0.17.15", 399 | "@esbuild/sunos-x64": "0.17.15", 400 | "@esbuild/win32-arm64": "0.17.15", 401 | "@esbuild/win32-ia32": "0.17.15", 402 | "@esbuild/win32-x64": "0.17.15" 403 | } 404 | }, 405 | "node_modules/typescript": { 406 | "version": "5.0.4", 407 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", 408 | "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", 409 | "dev": true, 410 | "bin": { 411 | "tsc": "bin/tsc", 412 | "tsserver": "bin/tsserver" 413 | }, 414 | "engines": { 415 | "node": ">=12.20" 416 | } 417 | } 418 | }, 419 | "dependencies": { 420 | "@esbuild/android-arm": { 421 | "version": "0.17.15", 422 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.15.tgz", 423 | "integrity": "sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==", 424 | "dev": true, 425 | "optional": true 426 | }, 427 | "@esbuild/android-arm64": { 428 | "version": "0.17.15", 429 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz", 430 | "integrity": "sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==", 431 | "dev": true, 432 | "optional": true 433 | }, 434 | "@esbuild/android-x64": { 435 | "version": "0.17.15", 436 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.15.tgz", 437 | "integrity": "sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==", 438 | "dev": true, 439 | "optional": true 440 | }, 441 | "@esbuild/darwin-arm64": { 442 | "version": "0.17.15", 443 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", 444 | "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", 445 | "dev": true, 446 | "optional": true 447 | }, 448 | "@esbuild/darwin-x64": { 449 | "version": "0.17.15", 450 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz", 451 | "integrity": "sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==", 452 | "dev": true, 453 | "optional": true 454 | }, 455 | "@esbuild/freebsd-arm64": { 456 | "version": "0.17.15", 457 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz", 458 | "integrity": "sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==", 459 | "dev": true, 460 | "optional": true 461 | }, 462 | "@esbuild/freebsd-x64": { 463 | "version": "0.17.15", 464 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz", 465 | "integrity": "sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==", 466 | "dev": true, 467 | "optional": true 468 | }, 469 | "@esbuild/linux-arm": { 470 | "version": "0.17.15", 471 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz", 472 | "integrity": "sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==", 473 | "dev": true, 474 | "optional": true 475 | }, 476 | "@esbuild/linux-arm64": { 477 | "version": "0.17.15", 478 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz", 479 | "integrity": "sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==", 480 | "dev": true, 481 | "optional": true 482 | }, 483 | "@esbuild/linux-ia32": { 484 | "version": "0.17.15", 485 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz", 486 | "integrity": "sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==", 487 | "dev": true, 488 | "optional": true 489 | }, 490 | "@esbuild/linux-loong64": { 491 | "version": "0.17.15", 492 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz", 493 | "integrity": "sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==", 494 | "dev": true, 495 | "optional": true 496 | }, 497 | "@esbuild/linux-mips64el": { 498 | "version": "0.17.15", 499 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz", 500 | "integrity": "sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==", 501 | "dev": true, 502 | "optional": true 503 | }, 504 | "@esbuild/linux-ppc64": { 505 | "version": "0.17.15", 506 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz", 507 | "integrity": "sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==", 508 | "dev": true, 509 | "optional": true 510 | }, 511 | "@esbuild/linux-riscv64": { 512 | "version": "0.17.15", 513 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz", 514 | "integrity": "sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==", 515 | "dev": true, 516 | "optional": true 517 | }, 518 | "@esbuild/linux-s390x": { 519 | "version": "0.17.15", 520 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz", 521 | "integrity": "sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==", 522 | "dev": true, 523 | "optional": true 524 | }, 525 | "@esbuild/linux-x64": { 526 | "version": "0.17.15", 527 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz", 528 | "integrity": "sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==", 529 | "dev": true, 530 | "optional": true 531 | }, 532 | "@esbuild/netbsd-x64": { 533 | "version": "0.17.15", 534 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz", 535 | "integrity": "sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==", 536 | "dev": true, 537 | "optional": true 538 | }, 539 | "@esbuild/openbsd-x64": { 540 | "version": "0.17.15", 541 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz", 542 | "integrity": "sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==", 543 | "dev": true, 544 | "optional": true 545 | }, 546 | "@esbuild/sunos-x64": { 547 | "version": "0.17.15", 548 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz", 549 | "integrity": "sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==", 550 | "dev": true, 551 | "optional": true 552 | }, 553 | "@esbuild/win32-arm64": { 554 | "version": "0.17.15", 555 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz", 556 | "integrity": "sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==", 557 | "dev": true, 558 | "optional": true 559 | }, 560 | "@esbuild/win32-ia32": { 561 | "version": "0.17.15", 562 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz", 563 | "integrity": "sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==", 564 | "dev": true, 565 | "optional": true 566 | }, 567 | "@esbuild/win32-x64": { 568 | "version": "0.17.15", 569 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz", 570 | "integrity": "sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==", 571 | "dev": true, 572 | "optional": true 573 | }, 574 | "esbuild": { 575 | "version": "0.17.15", 576 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.15.tgz", 577 | "integrity": "sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==", 578 | "dev": true, 579 | "requires": { 580 | "@esbuild/android-arm": "0.17.15", 581 | "@esbuild/android-arm64": "0.17.15", 582 | "@esbuild/android-x64": "0.17.15", 583 | "@esbuild/darwin-arm64": "0.17.15", 584 | "@esbuild/darwin-x64": "0.17.15", 585 | "@esbuild/freebsd-arm64": "0.17.15", 586 | "@esbuild/freebsd-x64": "0.17.15", 587 | "@esbuild/linux-arm": "0.17.15", 588 | "@esbuild/linux-arm64": "0.17.15", 589 | "@esbuild/linux-ia32": "0.17.15", 590 | "@esbuild/linux-loong64": "0.17.15", 591 | "@esbuild/linux-mips64el": "0.17.15", 592 | "@esbuild/linux-ppc64": "0.17.15", 593 | "@esbuild/linux-riscv64": "0.17.15", 594 | "@esbuild/linux-s390x": "0.17.15", 595 | "@esbuild/linux-x64": "0.17.15", 596 | "@esbuild/netbsd-x64": "0.17.15", 597 | "@esbuild/openbsd-x64": "0.17.15", 598 | "@esbuild/sunos-x64": "0.17.15", 599 | "@esbuild/win32-arm64": "0.17.15", 600 | "@esbuild/win32-ia32": "0.17.15", 601 | "@esbuild/win32-x64": "0.17.15" 602 | } 603 | }, 604 | "typescript": { 605 | "version": "5.0.4", 606 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", 607 | "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", 608 | "dev": true 609 | } 610 | } 611 | } 612 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@toshusai/one", 3 | "version": "1.0.0-alpha.4", 4 | "description": "a js framework in an 1.7KB one class", 5 | "author": "toshusai", 6 | "license": "MIT", 7 | "main": "dist/cjs/index.js", 8 | "module": "dist/esm/index.js", 9 | "types": "dist/types/index.d.ts", 10 | "scripts": { 11 | "build:base": "esbuild index.ts --bundle --minify", 12 | "build:cjs": "npm run build:base -- --format=cjs --outdir=dist/cjs", 13 | "build:esm": "npm run build:base -- --format=esm --outdir=dist/esm", 14 | "tsc": "tsc --project tsconfig.json --declaration", 15 | "build": "npm run tsc --oudDir=dist/types && npm run build:cjs && npm run build:esm ", 16 | "prepublish": "npm run build" 17 | }, 18 | "devDependencies": { 19 | "esbuild": "^0.17.15", 20 | "typescript": "^5.0.3" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": ["index.ts"], 3 | "compilerOptions": { 4 | "baseUrl": ".", 5 | "typeRoots": ["node_modules/@types"], 6 | "target": "ES6", 7 | "strict": true, 8 | "outDir": "./dist", 9 | "declaration": true, 10 | "declarationDir": "./dist/types", 11 | "emitDeclarationOnly": true 12 | } 13 | } 14 | --------------------------------------------------------------------------------