npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

cordova-js

v6.1.0

Published

Cordova JavaScript: a unified JavaScript layer for the Cordova suite of projects enabling cross-platform native mobile development of applications using HTML, CSS and JavaScript.

Downloads

18,974

Readme

cordova-js

NPM

Node CI

A unified JavaScript layer for Apache Cordova projects.

Project Structure

./
  |-build-tools/ ......... custom bundler for our CommonJS-like modules
  |-pkg/ ................. generated platform cordova.js files
  |
  |-src/ ................. the code that makes up Cordova's JavaScript runtime
  |  |-cordova.js ........ common Cordova stuff
  |  |
  |  |-common/ ........... base modules shared across platfoms
  |  |  |-argscheck.js ... utility for type-checking arguments during runtime
  |  |  |-base64.js ...... base64 utilites (toArrayBuffer & fromArrayBuffer)
  |  |  |-builder.js ..... utilities to install a set of properties onto an object
  |  |  |-channel.js ..... pub/sub implementation for custom framework events
  |  |  |-init.js ........ bootstraps the Cordova platform, inject APIs and fire events
  |  |  |-utils.js ....... closures, uuids, object, cloning, extending prototypes
  |  |  |
  |  |  '-exec/ .......... exec methods
  |  |     '-proxy.js .... utility for adding and removing exec proxy methods
  |  |
  |  '-scripts/ .......... non-module JS that gets concatenated to cordova.<platform>.js
  |     |-bootstrap.js ... bootstrap the Cordova platform, inject APIs and fire events
  |     '-require.js ..... module definition and require() implementation
  |
  '-tests/ ............... unit tests

How It Works

The build-tools/build.js process is a Node.js script that concatenates all of the core Cordova plugins in this repository into a cordova.<platform>.js file under the pkg/ folder. It also wraps the plugins with a RequireJS-compatible module syntax that works in both browser and node environments. We end up with a cordova.js file that wraps each Cordova plugin into its own module.

Cordova defines a channel module under src/common/channel.js, which is a publish/subscribe implementation that the project uses for event management.

The Cordova native-to-webview bridge is initialized in src/scripts/bootstrap.js. This file attaches the boot function to the channel.onNativeReady event - fired by native with a call to:

cordova.require('cordova/channel').onNativeReady.fire()

The boot method does all the work. First, it grabs the common platform definition (under src/common/common.js) and injects all of the objects defined there onto window and other global namespaces. Next, it grabs all of the platform-specific object definitions (as defined under src/<platform>/platform.js) and overrides those onto window.

Finally, it calls the platform-specific initialize function (located in the platform definition). At this point, Cordova is fully initialized and ready to roll. Last thing we do is wait for the DOMContentLoaded event to fire to make sure the page has loaded properly. Once that is done, Cordova fires the deviceready event where you can safely attach functions that consume the Cordova APIs.

Testing

Tests run in a bundled headless Chromium instance. They can be run with:

npm test

Final testing should always be done with the Mobile Spec test application.

Creating a New Platform

In your platform repository:

  1. Create the cordova-js-src directory.

  2. Write a module that encapsulates your platform's exec method and call it exec.js. This file should be added into the <platform-repo>/cordova-js-src directory which was created from step 1.

    The exec method is a JavaScript function that enables communication from the platform's JavaScript environment into the platform's native environment. Each platform uses a different mechanism to enable this bridge. We recommend you check out the other platform exec definitions for inspiration.

    The exec method has the following method signature: function(success, fail, service, action, args)

    Methods Arguments:

    • success: a success function callback
    • fail: a failure function callback
    • service: a string identifier that the platform can resolve to a native class
    • action: a string identifier that the platform can resolve to a specific method inside the class pointed to by service
    • args: an array of parameters to pass to the native method invoked by the exec call

    It is required that new platform additions be as consistent as possible with the existing service and action labels.

  3. Define your platform definition object and name it platform.js. This file should be added into the <platform-repo>/cordova-js-src directory which was created from step 1.

    This file should export an object with the following properties:

    • id: a string representing the platform. This should match the name of the .js file.
    • bootstrap: A function that sets up the platform. Must fire the onNativeReady channel when done.
    • initialize: an optional function that is called after the global scope setup is done (i.e. Cordova and all plugins are ready)

    The following is a simple example of a platform definition:

    module.exports = {
        id: 'atari',
        bootstrap: function() {
            require('cordova/channel').onNativeReady.fire();
        }
    };
  4. Bundle the modules from cordova-js/src and <platform-repo>/cordova-js-src into a file that ends up in <platform-project>/platform_www/cordova.js. This can be done in various ways. The following is recommended:

    • Add cordova-js as a devDependency: npm i -D cordova-js
    • Build cordova.js when preparing your platform's npm package. You can do that by adding the NPM prepare hook script to your package.json:
      "scripts": {
        "prepare": "cordova-js build > project-template/platform_www/cordova.js",
        // ...
      }
    • During project creation, make sure that the cordova.js file created by the prepare script ends up where your platform expects it