cordova-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jesse MacFadyen <>
Subject Re: Moving plugin JS files around
Date Fri, 11 Jan 2013 18:48:57 GMT
Hi Andrew,

Having spent some time with this, I don't think it's awful, but I am
worried about complexity.

To me, a better approach is:

- all plugins are simply ripped out of cordova-js
- each plugin is distributed 'built' meaning for an API like file or
contacts, there is only 1 js file, and while it depends on cordova.js,
it is not part of it. ( or possibly just a concat )
- plugman does the work of adding/removing but it is really just
changing script tags for the js portion

This means all our core plugs will need to be modified as the
currently depend on the builder to wrap them.

I spent some time working with your approach Andrew, and I think it
sounds better than it is. Blackberry has 4 inter-related branches to
consider, webos shares hardly any code with the other platforms, ... I
am more keen on adding consistency than  I am to making the tool work
around it.

If we were only concerned with iOS, Android, and windows phone, then
your  approach might be best, but there are some messes in there.

I will continue to push for the simpler solution, but I won't block
you anymore.
I do think you should dive a little deeper into your approach, and
possibly prove me wrong. I am completely open to further discussion on
the point.


Sent from my iPhone5

On 2013-01-10, at 8:09 PM, Andrew Grieve <> wrote:

On Wed, Jan 9, 2013 at 10:28 AM, Gord Tanner <> wrote:

> Ideally the require paths should stay true to the following rules (not that
> we follow them exactly now but we are close):
> 1. should always start with cordova (in case we ever share a require
> framework)
> 2. should follow as close as possible to the folder structure.
> We don't really do this now (but we are close).  It is mainly to help with
> navigation of the project from a require statement:
>    var foo = require('cordova/plugin/foo/submodule')
> Ideally I should be able to navigate to a file that lives in:
>    ~/cordova.js/plugin/foo/submodule.js
> But realistically we are probably going to see:
>   ~/cordova.js/plugin/foo/js/submodule.js
> Assuming we are dumping everything into a js folder here is the "mapping"
> off the top of my head:
>   var foo = require('cordova/plugin/foo')
>   ~/cordova.js/plugin/foo/js/index.js
>   var foo = require('cordova/plugin/foo/ios')
>   ~/cordova.js/plugin/foo/js/ios.js
>   var foo = require('cordova/plugin/foo/blackberry/qnx')
>   ~/cordova.js/plugin/foo/js/blackberry/qnx.js
> What does a plugin (native and js code) folder structure look like?

Have a look at this plugin:

With the JS changes I'm proposing, it would look like:
/src/ios/*.h, *.m
/www  <- empty!

So, the idea behind moving all of the plugins to /plugin/$PLUGIN_NAME
within cordova-js, is that when they move out, there will be the mapping:
cordova-js/plugin/$PLUGIN_NAME --->  $PLUGIN_REPO/src/js

When a plugin is installed into a project via cordova-cli, I suggest that
we get a structure like this:

MyApp/platforms/ios/... same as before ...
MyApp/cordova-js/... copy of cordova-js

So, the idea here is that the cordova-js will have no top-level plugin/
directory, but one will be added when plugins are added.

Also, like other sources, .js file should be listed in the plugin.xml so
that they can be reliably removed.

About the require paths. I think for files in cordova-js, the prefix should
be "cordova/", but for plugin files, it should be "plugin/" (or maybe
"cordovaplugin/"?), so that plugin JS doesn't accidentally clobber core
cordova modules.

For the keychain example: require('cordovaplugin/keychain/keychain')

In terms of changes to the builder, we'd need to add the idea of multiple
roots. Instead of just 'lib', there will also be 'plugin' as a root.

> On Wed, Jan 9, 2013 at 9:42 AM, Andrew Grieve <> wrote:
>> I'd like to take a first step towards moving plugin JS into separate
> repos
>> by first moving them around within cordova-js.
>> Here is my proposal:
>> Current structure:
>>       lib/common/plugin/*.js
>>       lib/$PLATFORM/plugin/*.js
>> New structure:
>>       plugin/$PLUGIN_NAME/js/common/*.js
>>       plugin/$PLUGIN_NAME/js/$PLATFORM/*.js
>> The require path will need to change. Going from:
>>       cordova.require('cordova/plugin/FileTransferError')
>> To:
>>       cordova.require('plugin/file/FileTransferError')
>> I'll obviously need to update the builder scripts accordingly. The idea
>> here is that we:
>>       1. "cordova plugin add" will copy files into a project's plugins
>> directory
>>       2. "cordova build ios" will use the cordova-js packager and pass
> it
>> the plugin/ directory to use
>> This will not involve changing how we export modules onto namespaces in
>> common.js / platform.js. That will come next though.
>> The resulting structure will look like:
>> plugin/accelerometer/js/common/Acceleration.js
>> plugin/accelerometer/js/common/accelerometer.js
>> plugin/battery/js/common/battery.js
>> plugin/compass/js/common/Compass*.js
>> plugin/contacts/js/common/Contact*.js
>> plugin/device/js/common/device.js
>> plugin/geolocation/js/common/Coordinates.js
>> plugin/geolocation/js/common/Position*.js
>> plugin/globalization/js/common/Globalization*.js
>> plugin/inappbrowser/js/common/InAppBrowser.js
>> plugin/logger/js/common/logger.js
>> plugin/logger/js/common/console-via-logger.js
>> plugin/media/js/common/Capture*.js
>> plugin/media/js/common/ConfigurationData.js
>> plugin/media/js/common/Media*.js
>> plugin/network/js/common/Connection.js
>> plugin/notification/js/common/notification.js
>> plugin/camera/js/common/Camera*.js
>> plugin/echo/js/common/echo.js
>> plugin/file/js/common/Directory*.js
>> plugin/file/js/common/Entry.js
>> plugin/file/js/common/File*.js
>> plugin/file/js/common/Flags.js
>> plugin/file/js/common/LocalFileSystem.js
>> plugin/file/js/common/Metadata.js
>> plugin/file/js/common/ProgressEvent.js
>> plugin/splashscreen/js/common/splashscreen.js

View raw message