{"id":13553271,"url":"https://github.com/sachinchoolur/jquery-to-javascript-converter","last_synced_at":"2026-01-23T03:59:16.740Z","repository":{"id":45824724,"uuid":"399382536","full_name":"sachinchoolur/jquery-to-javascript-converter","owner":"sachinchoolur","description":"Automatically finds jQuery methods from existing projects and generates vanilla js alternatives.","archived":false,"fork":false,"pushed_at":"2024-05-08T05:21:51.000Z","size":2894,"stargazers_count":1235,"open_issues_count":1,"forks_count":57,"subscribers_count":23,"default_branch":"main","last_synced_at":"2025-05-09T10:04:28.579Z","etag":null,"topics":["dom","jquery-alternative","js-utils","vanilla-js"],"latest_commit_sha":null,"homepage":"https://www.lightgalleryjs.com/jquery-to-js-converter/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sachinchoolur.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-08-24T07:59:06.000Z","updated_at":"2025-04-26T15:23:26.000Z","dependencies_parsed_at":"2024-05-11T07:13:02.407Z","dependency_job_id":null,"html_url":"https://github.com/sachinchoolur/jquery-to-javascript-converter","commit_stats":null,"previous_names":["sachinchoolur/replace-jquery"],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sachinchoolur%2Fjquery-to-javascript-converter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sachinchoolur%2Fjquery-to-javascript-converter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sachinchoolur%2Fjquery-to-javascript-converter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sachinchoolur%2Fjquery-to-javascript-converter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sachinchoolur","download_url":"https://codeload.github.com/sachinchoolur/jquery-to-javascript-converter/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254414499,"owners_count":22067272,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dom","jquery-alternative","js-utils","vanilla-js"],"created_at":"2024-08-01T12:02:21.132Z","updated_at":"2026-01-23T03:59:16.704Z","avatar_url":"https://github.com/sachinchoolur.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"![npm](https://img.shields.io/npm/v/jquery-to-js.svg?color=red)\n![license](https://badgen.net/github/license/sachinchoolur/jquery-to-javascript-converter)\n\n#### Test coverage\n\n| Statements                                                                      | Functions                                                                   | Lines                                                               |\n| ------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------- |\n| ![Statements](https://img.shields.io/badge/statements-99.64%25-brightgreen.svg) | ![Functions](https://img.shields.io/badge/functions-100%25-brightgreen.svg) | ![Lines](https://img.shields.io/badge/lines-100%25-brightgreen.svg) |\n\n# jQuery to JavaScript converter\n\nAutomatically find jQuery methods from existing projects and generate vanilla js alternatives.\n\n## Why\n\nI've been working on removing jQuery dependency from multiple projects including [lightGallery](https://github.com/sachinchoolur/lightGallery) lately. Most of the projects use only 15% to 20% or less than 30% of the jquery methods\nAnd in most of the cases, I didn't want to support all the edge cases or legacy browsers. The hardest part was finding the jQuery methods in the existing project and writing the alternative vanilla js methods without making much changes in the codebase. So I wrote this library which automatically finds jquery methods in any particular JavaScript file and generates readable, chainable vanilla js alternatives. This can also be useful if you want to generate your own utility methods similar to jQuery.\n\n## Installation and Usage\n\nYou can install jquery-to-js using npm:\n\n```sh\nnpm install -g jquery-to-js\n```\n\n-   Find all jQuery methods from `sample.js` and write vanillaJs alternatives in out.js\n\n```sh\njquery-to-js src/sample.js out.js\n```\n\n-   Find all jQuery methods from all matching files and write vanillaJs alternatives in out.js\n\n```sh\njquery-to-js \"src/*.js\" out.js\n```\n\n-   Build vanillaJs alternatives for the all available jQuery methods\n\n```sh\njquery-to-js --build-all out.js\n```\n\n-   Build vanillaJs alternatives for the specified jQuery methods\n\n```sh\njquery-to-js --methods \"addClass, removeClass, attr\" -o utils.js\n```\n\nPlease note that, the utility functions generated by `jquery-to-js` are not completely equivalent to jQuery methods in all scenarios. Please consider this as a starting point and validate before you adopt it.\n\n## Basic Concepts\n\nThe generated vanilla JS methods are chainable and can be applied to all matching elements like jQuery. \n\nNote: The below code is just to demonstrate the basics concepts and not covered all scenarios. \n\n```js\nexport class Utils {\n  constructor(selector) {\n    this.elements = Utils.getSelector(selector);\n    this.element = this.get(0);\n    return this;\n  }\n\n  static getSelector(selector, context = document) {\n    if (typeof selector !== 'string') {\n      return selector;\n    }\n    if (isId(selector)) {\n      return document.getElementById(selector.substring(1))\n    }\n    return context.querySelectorAll(selector);\n  }\n\n  each(func) {\n    if (!this.elements) {\n      return this;\n    }\n    if (this.elements.length !== undefined) {\n      [].forEach.call(this.elements, func);\n    } else {\n      func(this.element, 0);\n    }\n    return this;\n  }\n\n  siblings() {\n    if (!this.element) {\n      return this;\n    }\n    const elements = [].filter.call(\n      this.element.parentNode.children,\n      (child) =\u003e child !== this.element\n    );\n    return new Utils(elements);\n  }\n\n  get(index) {\n    if (index !== undefined) {\n      return this.elements[index];\n    }\n    return this.elements;\n  }\n\n  addClass(classNames = '') {\n    this.each((el) =\u003e {\n      // IE doesn't support multiple arguments\n      classNames.split(' ').forEach((className) =\u003e {\n        el.classList.add(className);\n      });\n    });\n    return this;\n  }\n}\n\nexport default function $utils(selector) {\n  return new Utils(selector);\n}\n```\n\n#### Usage\n\n```html\n\u003cul\u003e\n  \u003cli class=\"jquery\"\u003ejQuery\u003c/li\u003e\n  \u003cli class=\"react\"\u003eReact\u003c/li\u003e\n  \u003cli class=\"vue\"\u003eVue.js\u003c/li\u003e\n  \u003cli class=\"angular\"\u003eAngular\u003c/li\u003e\n  \u003cli class=\"lit\"\u003eLit\u003c/li\u003e\n\u003c/ul\u003e\n```\n\n```css\n.highlight {\n  background-color: red;\n  color: #fff;\n}\n```\n\n```js\n$utils(\".vue\").siblings().addClass(\"highlight\");\n```\n\nDemo - \u003chttps://codepen.io/sachinchoolur/pen/oNWNdxE\u003e\n\nYou can see that the `addClass` method is depended on the `each` method, so if you generate addClass method using `jquery-to-js --methods \"addClass\" -o utils.js` the output file will contain `addClass` and `each` methods.\n\nSimilarly, all the examples you see below, will add it's dependencies when you generate it using `jquery-to-js`\n\n## List of jQuery alternative methods in alphabetical order\n\n##### addClass\nAdds the specified class(es) to each element in the set of matched elements.\n\n\n\n```js\naddClass(classNames = '') {\n  this.each((el) =\u003e {\n    classNames.split(' ').forEach((className) =\u003e {\n      el.classList.add(className);\n    });\n  });\n  return this;\n}\n```\n\n```js\n// Usage\n$utils('ul li').addClass('myClass yourClass');\n```\n\n##### append\nInsert content, specified by the parameter, to the end of each element in the set of matched elements.\n```js\nappend(html) {\n  this.each((el) =\u003e {\n    if (typeof html === 'string') {\n      el.insertAdjacentHTML('beforeend', html);\n    } else {\n      el.appendChild(html);\n    }\n  });\n  return this;\n}\n```\n\n##### attr\nGet the value of an attribute for the first element in the set of matched elements or set one or more attributes for every matched element.\n\n```js\nattr(name, value) {\n  if (value === undefined) {\n    if (!this.element) {\n      return '';\n    }\n    return this.element.getAttribute(name);\n  }\n  this.each((el) =\u003e {\n    el.setAttribute(name, value);\n  });\n  return this;\n}\n```\n\n##### children\nGet the children of each element in the set of matched elements, optionally filtered by a selector.\n```js\nchildren() {\n  return new Utils(this.element.children);\n}\n```\n\n##### closest\nFor each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\n```js\nclosest(selector) {\n  if (!this.element) {\n    return this;\n  }\n  const matchesSelector =\n    this.element.matches ||\n    this.element.webkitMatchesSelector ||\n    this.element.mozMatchesSelector ||\n    this.element.msMatchesSelector;\n\n  while (this.element) {\n    if (matchesSelector.call(this.element, selector)) {\n      return new Utils(this.element);\n    }\n    this.element = this.element.parentElement;\n  }\n  return this;\n}\n```\n\n##### css\nGet the computed style properties for the first element in the set of matched elements.\n```js\ncss(css, value) {\n  if (value !== undefined) {\n    this.each((el) =\u003e {\n      Utils.setCss(el, css, value);\n    });\n    return this;\n  }\n  if (typeof css === 'object') {\n    for (const property in css) {\n      if (Object.prototype.hasOwnProperty.call(css, property)) {\n        this.each((el) =\u003e {\n          Utils.setCss(el, property, css[property]);\n        });\n      }\n    }\n    return this;\n  }\n  const cssProp = Utils.camelCase(css);\n  const property = Utils.styleSupport(cssProp);\n  return getComputedStyle(this.element)[property];\n}\n```\n\n##### data\n\nStore arbitrary data associated with the matched elements.\n\n```js\ndata(name, value) {\n  return this.attr(`data-${name}`, value);\n}\n```\n\n##### each\n\nIterate over a jQuery object, executing a function for each matched element.\n\n```js\neach(func) {\n    if (!this.elements) {\n        return this;\n    }\n    if (this.elements.length !== undefined) {\n        [].slice.call(this.elements).forEach((el, index) =\u003e {\n            func.call(el, el, index);\n        });\n    } else {\n        func.call(this.element, this.element, 0);\n    }\n    return this;\n}\n```\n\n##### empty\nRemove all child nodes of the set of matched elements from the DOM.\n```js\nempty() {\n  this.each((el) =\u003e {\n    el.innerHTML = '';\n  });\n  return this;\n}\n```\n\n##### eq\nReduce the set of matched elements to the one at the specified index.\n```js\neq(index) {\n  return new Utils(this.elements[index]);\n}\n```\n\n##### find\nGet the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.\n```js\nfind(selector) {\n  return new Utils(Utils.getSelector(selector, this.element));\n}\n```\n\n##### first\nReduce the set of matched elements to the first in the set.\n```js\nfirst() {\n  if (this.elements \u0026\u0026 this.elements.length !== undefined) {\n    return new Utils(this.elements[0]);\n  }\n  return new Utils(this.elements);\n}\n```\n\n##### get\nLoad data from the server using a HTTP GET request.\n```js\nget() {\n  return this.elements;\n}\n```\n\n##### hasClass\nDetermine whether any of the matched elements are assigned the given class.\n```js\nhasClass(className) {\n  if (!this.element) {\n    return false;\n  }\n  return this.element.classList.contains(className);\n}\n```\n\n##### height\nGet the current computed height for the first element in the set of matched elements.\n```js\nheight() {\n  if (!this.element) {\n    return 0;\n  }\n  const style = window.getComputedStyle(this.element, null);\n  return parseFloat(style.height.replace('px', ''));\n}\n```\n\n##### html\nGet the HTML contents of the first element in the set of matched elements.\n```js\nhtml(html) {\n  if (html === undefined) {\n    if (!this.element) {\n      return '';\n    }\n    return this.element.innerHTML;\n  }\n  this.each((el) =\u003e {\n    el.innerHTML = html;\n  });\n  return this;\n}\n```\n\n##### index\n\nSearch for a given element from among the matched elements.\n```js\nindex() {\n  if (!this.element) return -1;\n  let i = 0;\n  do {\n    i++;\n  } while ((this.element = this.element.previousElementSibling));\n  return i;\n}\n```\n\n##### is\nCheck the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.\n```js\nis(el) {\n  if (typeof el === 'string') {\n    return (\n      this.element.matches ||\n      this.element.matchesSelector ||\n      this.element.msMatchesSelector ||\n      this.element.mozMatchesSelector ||\n      this.element.webkitMatchesSelector ||\n      this.element.oMatchesSelector\n    ).call(this.element, el);\n  }\n  return this.element === (el.element || el);\n}\n```\n\n##### next\n\nGet the immediately following sibling of each element in the set of matched elements. If a selector is provided, it retrieves the next sibling only if it matches that selector.\n\n```js\nnext() {\n  if (!this.element) {\n    return this;\n  }\n  return new Utils(this.element.nextElementSibling);\n}\n```\n\n##### nextAll\nGet all following siblings of each element in the set of matched elements, optionally filtered by a selector.\n```js\nnextAll(filter) {\n  if (!this.element) {\n    return this;\n  }\n  const sibs = [];\n  let nextElem = this.element.parentNode.firstChild;\n  do {\n    if (nextElem.nodeType === 3) continue; // ignore text nodes\n    if (nextElem === this.element) continue; // ignore this.element of target\n    if (nextElem === this.element.nextElementSibling) {\n      if (!filter || filter(this.element)) {\n        sibs.push(nextElem);\n        this.element = nextElem;\n      }\n    }\n  } while ((nextElem = nextElem.nextSibling));\n  return new Utils(sibs);\n}\n```\n\n##### off\nRemove an event handler.\n```js\noff(event) {\n  if (!this.elements) {\n    return this;\n  }\n  Object.keys(Utils.eventListeners).forEach((eventName) =\u003e {\n    if (Utils.isEventMatched(event, eventName)) {\n      Utils.eventListeners[eventName].forEach((listener) =\u003e {\n        this.each((el) =\u003e {\n          el.removeEventListener(\n            eventName.split('.')[0],\n            listener\n          );\n        });\n      });\n    }\n  });\n\n  return this;\n}\n```\n\n##### offset\nGet the current coordinates of the first element in the set of matched elements, relative to the document.\n```js\noffset() {\n  if (!this.element) {\n    return {\n      left: 0,\n      top: 0,\n    };\n  }\n  const box = this.element.getBoundingClientRect();\n  return {\n    top:\n      box.top +\n      window.pageYOffset -\n      document.documentElement.clientTop,\n    left:\n      box.left +\n      window.pageXOffset -\n      document.documentElement.clientLeft,\n  };\n}\n```\n\n##### offsetParent\nGet the closest ancestor element that is positioned.\n```js\noffsetParent() {\n  if (!this.element) {\n    return this;\n  }\n  return new Utils(this.element.offsetParent);\n}\n```\n\n##### on\nAttach an event handler function for one or more events to the selected elements.\n```js\non(events, listener) {\n  if (!this.elements) {\n    return this;\n  }\n  events.split(' ').forEach((event) =\u003e {\n    if (!Array.isArray(Utils.eventListeners[event])) {\n      Utils.eventListeners[event] = [];\n    }\n    Utils.eventListeners[event].push(listener);\n    this.each((el) =\u003e {\n      el.addEventListener(event.split('.')[0], listener);\n    });\n  });\n\n  return this;\n}\n```\n\n##### one\nAttach a handler to an event for the elements. The handler is executed at most once per element per event type.\n```js\none(event, listener) {\n  this.each((el) =\u003e {\n    new Utils(el).on(event, () =\u003e {\n      new Utils(el).off(event);\n      listener(event);\n    });\n  });\n  return this;\n}\n```\n\n##### outerHeight\nGet the current computed outer height (including padding, border, and optionally margin) for the first element in the set of matched elements.\n```js\nouterHeight(margin) {\n  if (!this.element) {\n    return 0;\n  }\n  if (margin !== undefined) {\n    let height = this.element.offsetHeight;\n    const style = getComputedStyle(this.element);\n\n    height +=\n      parseInt(style.marginTop, 10) +\n      parseInt(style.marginBottom, 10);\n    return height;\n  }\n  return this.element.offsetHeight;\n}\n```\n\n##### outerWidth\nGet the current computed outer width (including padding, border, and optionally margin) for the first element in the set of matched elements.\n```js\nouterWidth(margin) {\n  if (!this.element) {\n    return 0;\n  }\n  if (margin !== undefined) {\n    let width = this.element.offsetWidth;\n    const style = window.getComputedStyle(this.element);\n\n    width +=\n      parseInt(style.marginLeft, 10) +\n      parseInt(style.marginRight, 10);\n    return width;\n  }\n  return this.element.offsetWidth;\n}\n```\n\n##### parent\n\nGet the parent of each element in the current set of matched elements, optionally filtered by a selector.\n```js\nparent() {\n  return new Utils(this.element.parentElement);\n}\n```\n\n##### parentsUntil\nGet the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object. \n```js\nparentsUntil(selector, filter) {\n  if (!this.element) {\n    return this;\n  }\n  const result = [];\n  const matchesSelector =\n    this.element.matches ||\n    this.element.webkitMatchesSelector ||\n    this.element.mozMatchesSelector ||\n    this.element.msMatchesSelector;\n\n  // match start from parent\n  let el = this.element.parentElement;\n  while (el \u0026\u0026 !matchesSelector.call(el, selector)) {\n    if (!filter) {\n      result.push(el);\n    } else if (matchesSelector.call(el, filter)) {\n      result.push(el);\n    }\n    el = el.parentElement;\n  }\n  return new Utils(result);\n}\n```\n\n##### position\nGet the current coordinates of the first element in the set of matched elements, relative to the offset parent.\n```js\nposition() {\n  return {\n    left: this.element.offsetLeft,\n    top: this.element.offsetTop,\n  };\n}\n```\n\n##### prepend\nInsert content, specified by the parameter, to the beginning of each element in the set of matched elements.\n```js\nprepend(html) {\n  this.each((el) =\u003e {\n    if (typeof html === 'string') {\n      el.insertAdjacentHTML('afterbegin', html);\n    } else {\n      el.insertBefore(html, el.firstChild);\n    }\n  });\n  return this;\n}\n```\n\n##### prev\nGet the immediately preceding sibling of each element in the set of matched elements. If a selector is provided, it retrieves the previous sibling only if it matches that selector.\n```js\nprev() {\n  if (!this.element) {\n    return this;\n  }\n  return new Utils(this.element.previousElementSibling);\n}\n```\n\n##### prevAll\nGet all preceding siblings of each element in the set of matched elements, optionally filtered by a selector, in the reverse document order.\n```js\nprevAll(filter) {\n  if (!this.element) {\n    return this;\n  }\n  const sibs = [];\n  while ((this.element = this.element.previousSibling)) {\n    if (this.element.nodeType === 3) {\n      continue; // ignore text nodes\n    }\n    if (!filter || filter(this.element)) sibs.push(this.element);\n  }\n  return new Utils(sibs);\n}\n```\n\n##### remove\nRemove the set of matched elements from the DOM.\n```js\nremove() {\n  this.each((el) =\u003e {\n    el.parentNode.removeChild(el);\n  });\n  return this;\n}\n```\n\n##### removeAttr\n\nRemove an attribute from each element in the set of matched elements.\n```js\nremoveAttr(attributes) {\n  const attrs = attributes.split(' ');\n  this.each((el) =\u003e {\n    attrs.forEach((attr) =\u003e el.removeAttribute(attr));\n  });\n  return this;\n}\n```\n\n##### removeClass\nRemove a single class or multiple classes from each element in the set of matched elements.\n```js\nremoveClass(classNames) {\n  this.each((el) =\u003e {\n    // IE doesn't support multiple arguments\n    classNames.split(' ').forEach((className) =\u003e {\n      el.classList.remove(className);\n    });\n  });\n  return this;\n}\n```\n\n##### siblings\nGet the siblings of each element in the set of matched elements, optionally filtered by a selector.\n```js\nsiblings() {\n  if (!this.element) {\n    return this;\n  }\n  const elements = Array.prototype.filter.call(\n    this.element.parentNode.children,\n    (child) =\u003e child !== this.element\n  );\n  return new Utils(elements);\n}\n```\n\n##### text\nGet the combined text contents of each element in the set of matched elements, including their descendants.\n```js\ntext(text) {\n  if (text === undefined) {\n    if (!this.element) {\n      return '';\n    }\n    return this.element.textContent;\n  }\n  this.each((el) =\u003e {\n    el.textContent = text;\n  });\n  return this;\n}\n```\n\n##### toggleClass\nAdd or remove one or more classes from each element in the set of matched elements, depending on either the class’s presence or the value of the state argument.\n```js\ntoggleClass(className) {\n  if (!this.element) {\n    return this;\n  }\n  this.element.classList.toggle(className);\n}\n```\n\n##### trigger\nExecute all handlers and behaviors attached to the matched elements for the given event type.\n```js\ntrigger(event, detail) {\n  if (!this.element) {\n    return this;\n  }\n  const eventName = event.split('.')[0];\n  const isNativeEvent =\n    typeof document.body[`on${eventName}`] !== 'undefined';\n  if (isNativeEvent) {\n    this.each((el) =\u003e {\n      el.dispatchEvent(new Event(eventName));\n    });\n    return this;\n  }\n  const customEvent = new CustomEvent(eventName, {\n    detail: detail || null,\n  });\n  this.each((el) =\u003e {\n    el.dispatchEvent(customEvent);\n  });\n  return this;\n}\n```\n\n##### unwrap\nRemove the parents of the set of matched elements from the DOM, leaving the matched elements in their place.\n```js\nunwrap() {\n  this.each((el) =\u003e {\n    const elParentNode = el.parentNode;\n\n    if (elParentNode !== document.body) {\n      elParentNode.parentNode.insertBefore(el, elParentNode);\n      elParentNode.parentNode.removeChild(elParentNode);\n    }\n  });\n  return this;\n}\n```\n\n##### val\nGet the current value of the first element in the set of matched elements.\n```js\nval(value) {\n  if (!this.element) {\n    return '';\n  }\n  if (value === undefined) {\n    return this.element.value;\n  }\n  this.element.value = value;\n}\n```\n\n##### width\nGet the current computed width for the first element in the set of matched elements.\n```js\nwidth() {\n  if (!this.element) {\n    return 0;\n  }\n  const style = window.getComputedStyle(this.element, null);\n  return parseFloat(style.width.replace('px', ''));\n}\n```\n\n##### wrap\nWrap an HTML structure around each element in the set of matched elements.\n```js\nwrap(className) {\n  this.each((el) =\u003e {\n    const wrapper = document.createElement('div');\n    wrapper.className = className;\n    el.parentNode.insertBefore(wrapper, el);\n    wrapper.appendChild(el);\n  });\n  return this;\n}\n```\n\n#### Browser support - IE 11+\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsachinchoolur%2Fjquery-to-javascript-converter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsachinchoolur%2Fjquery-to-javascript-converter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsachinchoolur%2Fjquery-to-javascript-converter/lists"}