I've replied directly to him but maybe it's interesting for others too.

This is the TL;DR version of how I bootstrap CommonJS equivalent of
`__dirname` and `__filename` at the entry point level.

#!/usr/bin/env gjs
const { GLib, Gio } = imports.gi;
const { File } = Gio;
const PROGRAM_EXE = File.new_for_path(GLib.get_current_dir())

.resolve_relative_path(imports.system.programInvocationName);
const [
  __dirname,
  __filename
] = [
  getProgramDir(PROGRAM_EXE).get_path(),
  PROGRAM_EXE.get_path()
];
print(__dirname);
print(__filename);
function getProgramDir(programFile) {
  const info = programFile.query_info('standard::',
Gio.FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
  if (info.get_is_symlink()) {
    const symlinkFile =
programFile.get_parent().resolve_relative_path(info.get_symlink_target());
    return symlinkFile.get_parent();
  } else {
    return programFile.get_parent();
  }
}

Which gives me an easy way to pollute the import search path as such:

imports.searchPath.push(__dirname);

Now, if inside this very same file, as entry point, you have a folder,
let's call it `test`, and a `module.js` file inside such folder with the
following content:

function waitWhat() {
  print('here I am');
}

this is how you'd use it from the entry point:

const module = imports.test.module;
module.waitWhat();

In few words, when you push `imports` you add paths to synchronously look
for, and anything that leaks in the module scope is exported.

Accordingly, a reasonable patter to export without leaking everything per
each module is to use an IIFE like:

// var because gjs module system is a bit messed up
// so if you use const in the module scope it will
// be exported but it will also trigger warnings
// once accessed, and same goes for let.
var {
  method,
  util
} = (() => {'use strict';
  const method = () => {};
  let util = () => {};
  // your export
  return { method, util };
  function test() {}
})();

// if needed
this.default = method;

As you can see you could even follow the Babel / Webpack pattern of
exporting `default` (but you need to explicitly import that too).

Good luck with the rest of your project 👋

On Fri, Nov 9, 2018 at 6:37 PM Philip Chimento via javascript-list <
javascript-list@gnome.org> wrote:

> For completeness I should mention that there's of course a built-in way to
> have multiple source files. To import "foo.js", use "const Foo =
> imports.foo;", and to import "subdir/bar.js" use "const Bar =
> imports.subdir.bar;"
>
> To set the search path for modules, use "imports.searchPath" which is an
> array so you can push() or unshift() extra entries onto it.
>
> The "imports.package" module simplifies the process of setting up the
> search path a bit. Unfortunately it's not well documented but you can take
> a look at how other apps, e.g. gnome-sound-recorder, use it:
>
> https://gitlab.gnome.org/GNOME/gnome-sound-recorder/blob/master/src/org.gnome.SoundRecorder.in
> https://gitlab.gnome.org/GNOME/gnome-sound-recorder/blob/master/src/main.js
>
> Support for ES6 modules and the "import" keyword is in progress, follow
> along here: https://gitlab.gnome.org/GNOME/gjs/merge_requests/150
>
> Best regards,
> Philip
>
> On Fri, Nov 9, 2018, 11:45 , <makep...@firemail.cc> wrote:
>
>> See also https://github.com/makepost/gunit for a test runner, and
>> https://github.com/sammydre/ts-for-gjs for autocomplete and type
>> checking. I actually think it's good not to replicate core Node modules
>> because we have GLib and other introspected GNOME libs with
>> language-independent APIs.
>>
>> On 2018-11-09 18:22, Andrea Giammarchi via javascript-list wrote:
>> > if you are familiar with CommonJS, I suggest you to use cgjs
>> >
>> > https://github.com/cgjs/cgjs#cgjs--
>> >
>> > it's not really a 1:1 nodejs replica when it comes to core modules,
>> > but at least it doesn't require you to learn a module system that only
>> > GJS uses and that will inevitably fade away as soon as ES2015 static,
>> > or even dynamic import, will be introduced.
>> >
>> > Feel free to see the circus around configuring folders and imports
>> > otherwise directly via GJS.
>> >
>> > On Fri, Nov 9, 2018 at 5:18 PM Tony Houghton <h...@realh.co.uk> wrote:
>> >
>> >> gjs has attracted my attention, but the tutorials and examples are
>> >> rather simple so I can't work out what you're supposed to do to make
>> >> an application with multiple source files. Do you have to write a
>> >> script to concatenate them in the right order, or
>> >> can you use Javascript's import keyword?
>> >>
>> >> --
>> >>
>> >> TH
>>
> _______________________________________________
> javascript-list mailing list
> javascript-list@gnome.org
> https://mail.gnome.org/mailman/listinfo/javascript-list
>
_______________________________________________
javascript-list mailing list
javascript-list@gnome.org
https://mail.gnome.org/mailman/listinfo/javascript-list

Reply via email to