diff --git a/Domhandler/build-profile.json5 b/Domhandler/build-profile.json5 index 130b18c956cfcc6d4e0ae66aa6018bba4c8824df..e3bd8a8539b7de55f194935ca4a9537103e24ae6 100644 --- a/Domhandler/build-profile.json5 +++ b/Domhandler/build-profile.json5 @@ -6,10 +6,9 @@ { "name": "default", "signingConfig": "default", - "compileSdkVersion": 10, - "compatibleSdkVersion": 10, - "targetSdkVersion": 10, - "runtimeOS": "OpenHarmony", + "compileSdkVersion": 12, + "compatibleSdkVersion": 12, + "runtimeOS": "OpenHarmony" } ], "buildModeSet": [ diff --git a/Domhandler/entry/src/main/ets/pages/Index.ets b/Domhandler/entry/src/main/ets/pages/Index.ets index 266eb58fb7b13cca64e4811a7f9ba2e75c01ea80..54b75e852186a3d02b5331d4cfc344e9e1d6e903 100644 --- a/Domhandler/entry/src/main/ets/pages/Index.ets +++ b/Domhandler/entry/src/main/ets/pages/Index.ets @@ -25,14 +25,30 @@ */ -import { Element } from 'domhandler'; import { - Parser, - parseDocument, - DomUtils, + Node, + DataNode, + Comment, + ProcessingInstruction, + NodeWithChildren, + CDATA, + ParentNode, Document, - createDocumentStream, -} from '@ohos/htmlparser2' + Element, + isTag, + isCDATA, + isText, + isComment, + isDirective, + isDocument, + hasChildren, + ChildNode, + cloneNode, + DomHandler +} from "domhandler" + +import { Parser, parseDocument, DomUtils, createDocumentStream, } from '@ohos/htmlparser2' +import * as helper from './helper' const html = ` @@ -66,72 +82,128 @@ const html = ` ` + @Entry @Component struct Index { @State result: string = ""; - getResourceString(res:Resource){ + scroller: Scroller = new Scroller() + getResourceString(res: Resource) { return getContext().resourceManager.getStringSync(res.id) } + build() { Row() { Column() { - Text( this.getResourceString($r('app.string.Analysis_results'))+"\r\n " + this.result) - .fontSize(15) - .margin({ top: 55, left: 10, right: 10 }) - Text($r('app.string.parseDocument')) - .width('90%') - .height(60) - .backgroundColor(0xFFFFFF) - .borderRadius(15) - .border({ width: 2, color: '#666666', radius: 6 }) - .fontSize(16) - .textAlign(TextAlign.Center) - .margin({ top: 20 }) - .onClick(event => { - this.result = "" - let dom: Document = parseDocument(html); - let element: Element[] = DomUtils.getElementsByTagName('style', dom); - let text:string = DomUtils.textContent(element); - this.result += "text:" + text + "\r\n" - let isTag :boolean= DomUtils.isTag(element[0]); - this.result += "isTag:" + isTag + "\r\n" - let isCDATA:boolean = DomUtils.isCDATA(element[0]); - this.result += "isCDATA:" + isCDATA + "\r\n" - let isText:boolean = DomUtils.isText(element[0]); - this.result += "isText:" + isText + "\r\n" - let isComment :boolean= DomUtils.isComment(element[0]); - this.result += "isComment:" + isComment + "\r\n" - this.result += "isComment:" + element[0].name + "\r\n" - }); + Scroll(this.scroller) { + Text(this.getResourceString($r('app.string.Analysis_results')) + "\r\n " + this.result) + .fontSize(15) + .margin({ top: 55, left: 10, right: 10 }) + }.height("80%") + Column() { - Text($r('app.string.createDocumentStream')) + Button($r('app.string.createDocumentStream')) .width('90%') .height(60) + .fontColor(Color.Black) .backgroundColor(0xFFFFFF) .borderRadius(15) .fontSize(16) .border({ width: 2, color: '#666666', radius: 6 }) - .textAlign(TextAlign.Center) .margin({ top: 20 }) - .onClick(event => { + .onClick(() => { this.result = "" let parser: Parser = createDocumentStream((error: Error | null, dom: Document) => { if (!!error) { this.result = JSON.stringify(error) return } - let element : Element[]= DomUtils.getElementsByTagName('style', dom); - let text:string = DomUtils.textContent(element); + let element: Element[] = DomUtils.getElementsByTagName('style', dom); + let text: string = DomUtils.textContent(element); this.result += "text:" + text + "\r\n" - let isTag :boolean= DomUtils.isTag(element[0]); - this.result += "isTag:" + isTag + "\r\n" - let isCDATA :boolean= DomUtils.isCDATA(element[0]); - this.result += "isCDATA:" + isCDATA + "\r\n" - let isText:boolean = DomUtils.isText(element[0]); - this.result += "isText:" + isText + "\r\n" - let isComment :boolean= DomUtils.isComment(element[0]); - this.result += "isComment:" + isComment + "\r\n" + + let isTag1: boolean = isTag(element[0]); + this.result += "isTag:" + isTag1 + "\r\n" + + let isCDATA1: boolean = isCDATA(element[0]); + this.result += "isCDATA:" + isCDATA1 + "\r\n" + + let isText1: boolean = isText(element[0]); + this.result += "isText:" + isText1 + "\r\n" + + let isComment1: boolean = isComment(element[0]); + this.result += "isComment:" + isComment1 + "\r\n" + + let isDirectiveResult: boolean = isDirective(element[0]); + this.result += "isDirective:" + isDirectiveResult + "\r\n" + + let isDocumentResult: boolean = isDocument(element[0]); + this.result += "isDocument:" + isDocumentResult + "\r\n" + + let hasChildrenResult: boolean = hasChildren(element[0]); + this.result += "hasChildren:" + hasChildrenResult + "\r\n" + + let cloneNodeResult = cloneNode(element[0]); + this.result += "cloneNode:" + JSON.stringify(cloneNodeResult) + "\r\n" + + let firstChild: ChildNode | null = element[0].firstChild + this.result += "firstChild:" + (firstChild != null) + "\r\n" + + let lastChild: ChildNode | null = element[0].lastChild + this.result += "lastChild:" + (lastChild != null) + "\r\n" + + let childNodes: ChildNode[] = element[0].childNodes + this.result += "childNodes:" + (childNodes.length > 0) + "\r\n" + + let processingInstruction: ProcessingInstruction = new ProcessingInstruction("china", "Chinese") + this.result += "ProcessingInstruction.nodeType:" + (processingInstruction.nodeType) + "\r\n" + this.result += "ProcessingInstruction.data:" + (processingInstruction.data) + "\r\n" + + this.result += "Element.nodeType:" + (element[0].nodeType) + "\r\n" + + this.result += "Element.tagName:" + (element[0].tagName) + "\r\n" + + element[0].tagName="style1" + this.result += "Element.tagName:" + (element[0].tagName) + "\r\n" + + this.result += "Element.attribs:" + (JSON.stringify(element[0].attributes)) + "\r\n" + + this.result += "Node.parentNode:" + (element[0].parentNode!=null) + "\r\n" + this.result += "Node.nextSibling:" + (element[0].nextSibling!=null) + "\r\n" + this.result += "Node.cloneNode:" + (JSON.stringify(element[0].cloneNode())) + "\r\n" + + const rawHtml = + "Xyz "; + const handler = new DomHandler((error, dom) => { + if (error) { + } else { + this.result += "DomHandler:" + (dom[0].nodeType) + "\r\n" + } + }); + const parser = new Parser(handler); + parser.write(rawHtml); + parser.end(); + + + let arr: Array = new Array() + const handler1 = helper.getEventCollector((error, actual: ESObject) => { + if (error) { + this.result = this.result + getContext().resourceManager.getStringByNameSync('Parse_fail') + ":" + JSON.stringify(error) + return + } + + if (actual.$event == "text") { + arr.push(actual.data) + } + + if (actual.$event == "end") { + this.result += "callback:" + (JSON.stringify(arr)) + "\r\n" + } + }); + const parser1: Parser = new Parser(handler1); + parser1.write("china ",); + parser1.end(); + }); parser.write(html); parser.end(); @@ -142,4 +214,9 @@ struct Index { } .height('100%') } -} \ No newline at end of file +} + + + + + diff --git a/Domhandler/entry/src/main/ets/pages/helper.ts b/Domhandler/entry/src/main/ets/pages/helper.ts new file mode 100644 index 0000000000000000000000000000000000000000..4ae163cc5394ebea70ebbe5cf1fc67f6945128f1 --- /dev/null +++ b/Domhandler/entry/src/main/ets/pages/helper.ts @@ -0,0 +1,137 @@ +/** + * + * Copyright (c) 2024 Huawei Device Co., Ltd. + * + * All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice,this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, + * + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import type { Parser,DomHandler } from "@ohos/htmlparser2"; + +interface Event { + $event: string; + data: unknown[]; + startIndex: number; + endIndex: number; +} + +/** + * Creates a handler that calls the supplied callback with simplified events on + * completion. + * + * @internal + * @param callback Function to call with all events. + */ +export function getEventCollector( + callback: (error: Error | null, data?: ESObject) => void, +): Partial { + const events: Event[] = []; + let parser: Parser; + + function handle(event: string, data: unknown[]): void { + switch (event) { + case "onerror": { + callback(data[0] as Error); + break; + } + case "onend": { + callback(null, { + $event: event.slice(2), + startIndex: parser.startIndex, + endIndex: parser.endIndex, + data, + }); + break; + } + case "onreset": { + events.length = 0; + break; + } + case "onparserinit": { + parser = data[0] as Parser; + break; + } + + case "onopentag": { + callback(null, { + $event: event.slice(2), + startIndex: parser.startIndex, + endIndex: parser.endIndex, + data, + }); + break; + } + + case "ontext": { + callback(null, { + $event: event.slice(2), + startIndex: parser.startIndex, + endIndex: parser.endIndex, + data: data[0], + }) + break; + } + + case "onclosetag": { + if (data[0] === "script") { + console.info("htmlparser2--That's it?!"); + } + break; + } + default: { + const last = events[events.length - 1]; + if (event === "ontext" && last && last.$event === "text") { + (last.data[0] as string) += data[0]; + last.endIndex = parser.endIndex; + break; + } + + if (event === "onattribute" && data[2] === undefined) { + data.pop(); + } + + if (!(parser.startIndex <= parser.endIndex)) { + throw new Error( + `Invalid start/end index ${parser.startIndex} > ${parser.endIndex}`, + ); + } + + events.push({ + $event: event.slice(2), + startIndex: parser.startIndex, + endIndex: parser.endIndex, + data, + }); + parser.endIndex; + } + } + } + + return new Proxy( + {}, + { + get: + (_, event: string) => + (...data: unknown[]) => + handle(event, data), + }, + ); +} diff --git a/Domhandler/entry/src/ohosTest/ets/test/Domhandler.test.ets b/Domhandler/entry/src/ohosTest/ets/test/Domhandler.test.ets index b5b140cbec756196c10e3277ebf3720c4493e123..4286b26d43de4f934c00b1c35aaeff71d22f66e7 100644 --- a/Domhandler/entry/src/ohosTest/ets/test/Domhandler.test.ets +++ b/Domhandler/entry/src/ohosTest/ets/test/Domhandler.test.ets @@ -24,14 +24,8 @@ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import { - Node, - DataNode, - Text, - Comment, +import DomHandler, { ProcessingInstruction, - NodeWithChildren, - CDATA, ParentNode, Document, Element, @@ -44,15 +38,10 @@ import { hasChildren, ChildNode, cloneNode, - DomHandler } from "domhandler" +import * as helper from './helper' -import { - Parser, - parseDocument, - DomUtils, - createDocumentStream, ElementType, -} from '@ohos/htmlparser2' +import { Parser, parseDocument, DomUtils, createDocumentStream, ElementType, } from '@ohos/htmlparser2' import { describe, expect, it } from '@ohos/hypium' @@ -95,78 +84,78 @@ export default function dommhandler() { describe('dommhandler', () => { it('isTag', 0, () => { - let isTagResult :boolean= isTag(element[0]); + let isTagResult: boolean = isTag(element[0]); expect(isTagResult).assertTrue(); }) it('isCDATA', 0, () => { - let isCDATAResult :boolean= isCDATA(element[0]); + let isCDATAResult: boolean = isCDATA(element[0]); expect(isCDATAResult).assertFalse(); }) it('isText', 0, () => { - let isTextResult :boolean= isText(element[0]); + let isTextResult: boolean = isText(element[0]); expect(isTextResult).assertFalse(); }) it('isComment', 0, () => { - let isCommentResult :boolean= isComment(element[0]); + let isCommentResult: boolean = isComment(element[0]); expect(isCommentResult).assertFalse(); }) it('isDirective', 0, () => { - let isDirectiveResult :boolean= isDirective(element[0]); + let isDirectiveResult: boolean = isDirective(element[0]); expect(isDirectiveResult).assertFalse(); }) it('isDocument', 0, () => { - let isDocumentResult :boolean= isDocument(element[0]); + let isDocumentResult: boolean = isDocument(element[0]); expect(isDocumentResult).assertFalse(); }) it('hasChildren', 0, () => { - let hasChildrenResult :boolean= hasChildren(element[0]); + let hasChildrenResult: boolean = hasChildren(element[0]); expect(hasChildrenResult).assertTrue(); }) it('cloneNode', 0, () => { - let cloneNodeResult= cloneNode(element[0]); + let cloneNodeResult = cloneNode(element[0]); expect(cloneNodeResult != null).assertTrue(); }) it('node_name', 0, () => { - let elementTwo : Element = new Element("style",{}) + let elementTwo: Element = new Element("style", {}) expect(elementTwo.name).assertEqual("style"); }) it('tagNmae', 0, () => { - let elementTwo : Element = new Element("style",{}) + let elementTwo: Element = new Element("style", {}) expect(elementTwo.tagName).assertEqual("style"); }) it('firstChild', 0, () => { - let firstChild : ChildNode | null = element[0].firstChild + let firstChild: ChildNode | null = element[0].firstChild expect(firstChild != null).assertTrue() }) it('lastChild', 0, () => { - let lastChild : ChildNode | null = element[0].lastChild + let lastChild: ChildNode | null = element[0].lastChild expect(lastChild != null).assertTrue() }) it('childNodes', 0, () => { - let childNodes : ChildNode[] = element[0].childNodes + let childNodes: ChildNode[] = element[0].childNodes expect(childNodes.length > 0).assertTrue() }) it('ProcessingInstruction_name', 0, () => { - let processingInstruction : ProcessingInstruction = new ProcessingInstruction("china", "Chinese") + let processingInstruction: ProcessingInstruction = new ProcessingInstruction("china", "Chinese") expect(processingInstruction.name).assertEqual("china") }) it('ProcessingInstruction_data', 0, () => { - let processingInstruction : ProcessingInstruction = new ProcessingInstruction("china", "Chinese") + let processingInstruction: ProcessingInstruction = new ProcessingInstruction("china", "Chinese") expect(processingInstruction.data).assertEqual("Chinese") }) @@ -182,10 +171,10 @@ export default function dommhandler() { let childNode: ChildNode | null = element[0].firstChild if (childNode != null) { let parentNode: ParentNode | null = childNode.parent - if(parentNode != null) { - let prevNode :ChildNode | null = parentNode.prev - expect(prevNode != null).assertTrue() - } + if (parentNode != null) { + let prevNode: ChildNode | null = parentNode.prev + expect(prevNode != null).assertTrue() + } } }) @@ -193,19 +182,61 @@ export default function dommhandler() { let childNode: ChildNode | null = element[0].firstChild if (childNode != null) { let parentNode: ParentNode | null = childNode.parent - if(parentNode != null) { + if (parentNode != null) { let nextNode: ChildNode | null = parentNode.next - expect(nextNode!= null).assertTrue() + expect(nextNode != null).assertTrue() } + } + }) + + it('previousSibling', 0, () => { + let childNode: ChildNode | null = element[0].firstChild + if (childNode != null) { + let previousSibling: ChildNode | null = childNode.previousSibling + expect(previousSibling != null).assertTrue() + } + }) + + it('parentNode', 0, () => { + let childNode: ChildNode | null = element[0].firstChild + if (childNode != null) { + let parentNode: ChildNode | null = childNode.parentNode + expect(parentNode != null).assertTrue() + } + }) + it('nextSibling', 0, () => { + let childNode: ChildNode | null = element[0].firstChild + if (childNode != null) { + let nextSibling: ChildNode | null = childNode.nextSibling + expect(nextSibling != null).assertTrue() } }) + it('attribs', 0, () => { + let parser: Parser = createDocumentStream((error: Error | null, dom: Document) => { + if (!!error) { + expect().assertFail() + return + } + let element: Element[] = DomUtils.getElementsByTagName('style', dom); + expect(element[0].nodeType).assertEqual(1); + expect(element[0].tagName).assertEqual('style'); + element[0].tagName = "style1" + expect(element[0].tagName).assertEqual('style1'); + element[0].tagName = "style1" + + expect(JSON.stringify(element[0].attributes)).assertEqual('[]'); + }); + parser.write(html); + parser.end(); + }) + it('startIndex', 0, () => { let childNode: ChildNode | null = element[0].firstChild if (childNode != null) { let parentNode: ParentNode | null = childNode.parent - if(parentNode != null) { + if (parentNode != null) { let startIndex: number | null = parentNode.startIndex if (startIndex != null) { expect(startIndex >= 0).assertTrue() @@ -218,7 +249,7 @@ export default function dommhandler() { let childNode: ChildNode | null = element[0].firstChild if (childNode != null) { let parentNode: ParentNode | null = childNode.parent - if(parentNode != null) { + if (parentNode != null) { let endIndex: number | null = parentNode.endIndex if (endIndex != null) { expect(endIndex >= 0).assertTrue() @@ -227,6 +258,43 @@ export default function dommhandler() { } }) + it('callback', 0, () => { + let arr: Array = new Array() + const handler = helper.getEventCollector((error, actual: ESObject) => { + if (error) { + expect().assertFail() + return + } + + if (actual.$event == "text") { + arr.push(actual.data) + } + + if (actual.$event == "end") { + expect(true).assertTrue() + } + }); + const parser: Parser = new Parser(handler); + parser.write("china ",); + parser.end(); + }) + + + it('DomHandler', 0, () => { + const rawHtml = + "Xyz "; + const handler = new DomHandler((error, dom) => { + if (error) { + expect().assertFail() + } else { + expect(true).assertTrue() + } + }); + const parser = new Parser(handler); + parser.write(rawHtml); + parser.end(); + }) + }) } diff --git a/Domhandler/entry/src/ohosTest/ets/test/helper.ts b/Domhandler/entry/src/ohosTest/ets/test/helper.ts new file mode 100644 index 0000000000000000000000000000000000000000..4ae163cc5394ebea70ebbe5cf1fc67f6945128f1 --- /dev/null +++ b/Domhandler/entry/src/ohosTest/ets/test/helper.ts @@ -0,0 +1,137 @@ +/** + * + * Copyright (c) 2024 Huawei Device Co., Ltd. + * + * All rights reserved. + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice,this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, + * + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import type { Parser,DomHandler } from "@ohos/htmlparser2"; + +interface Event { + $event: string; + data: unknown[]; + startIndex: number; + endIndex: number; +} + +/** + * Creates a handler that calls the supplied callback with simplified events on + * completion. + * + * @internal + * @param callback Function to call with all events. + */ +export function getEventCollector( + callback: (error: Error | null, data?: ESObject) => void, +): Partial { + const events: Event[] = []; + let parser: Parser; + + function handle(event: string, data: unknown[]): void { + switch (event) { + case "onerror": { + callback(data[0] as Error); + break; + } + case "onend": { + callback(null, { + $event: event.slice(2), + startIndex: parser.startIndex, + endIndex: parser.endIndex, + data, + }); + break; + } + case "onreset": { + events.length = 0; + break; + } + case "onparserinit": { + parser = data[0] as Parser; + break; + } + + case "onopentag": { + callback(null, { + $event: event.slice(2), + startIndex: parser.startIndex, + endIndex: parser.endIndex, + data, + }); + break; + } + + case "ontext": { + callback(null, { + $event: event.slice(2), + startIndex: parser.startIndex, + endIndex: parser.endIndex, + data: data[0], + }) + break; + } + + case "onclosetag": { + if (data[0] === "script") { + console.info("htmlparser2--That's it?!"); + } + break; + } + default: { + const last = events[events.length - 1]; + if (event === "ontext" && last && last.$event === "text") { + (last.data[0] as string) += data[0]; + last.endIndex = parser.endIndex; + break; + } + + if (event === "onattribute" && data[2] === undefined) { + data.pop(); + } + + if (!(parser.startIndex <= parser.endIndex)) { + throw new Error( + `Invalid start/end index ${parser.startIndex} > ${parser.endIndex}`, + ); + } + + events.push({ + $event: event.slice(2), + startIndex: parser.startIndex, + endIndex: parser.endIndex, + data, + }); + parser.endIndex; + } + } + } + + return new Proxy( + {}, + { + get: + (_, event: string) => + (...data: unknown[]) => + handle(event, data), + }, + ); +} diff --git a/Domhandler/oh-package.json5 b/Domhandler/oh-package.json5 index 9ba764a6c17d52414e7e29ca4ddd29e51a215e8e..678beacfc408c11e572ab9a6dc5d736610355a65 100644 --- a/Domhandler/oh-package.json5 +++ b/Domhandler/oh-package.json5 @@ -1,4 +1,5 @@ { + "modelVersion": "5.0.3", "license": "BSD License", "devDependencies": { "@ohos/hypium": "1.0.11" @@ -9,4 +10,4 @@ "main": "", "version": "1.0.0", "dependencies": {} -} +} \ No newline at end of file