Quick update v0.2.0, you can now do the following too:

const {require} = imports.require;
const module = require('./file.js');

as long as you have the `gjs-require` path defined.

Basically you can use it stand-alone, as gjs argument, or as gjs module:
pick any of those.

I wish this was possible already like "forever ago".

Best Regards





On Sat, Nov 10, 2018 at 12:31 AM Andrea Giammarchi <
andrea.giammar...@gmail.com> wrote:

> if anyone is interested, without going full NodeJS behavior/core thingy,
> I've just summarized in a 100% GJS way the `require` utility that works
> with regular paths without going full rpm resolution.
>
> https://github.com/WebReflection/gjs-require
>
> It's literally 50 LOC and makes GJS imports a joy to work with.
>
> Hope you like it.
>
> Best Regards
>
>
> On Fri, Nov 9, 2018 at 7:01 PM <makep...@firemail.cc> wrote:
>
>> Very nice program path resolution! I still have to get filenames from
>> Error stack when inside the imported modules, but for the entry point
>> your programInvocationName suggestion is definitely preferable, really
>> clean and doesn't rely on external `realpath` like what I had by now.
>> Thank you.
>>
>> On 2018-11-09 19:42, Andrea Giammarchi wrote:
>> > 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 [1];
>> > 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
>> >
>> >
>> > Links:
>> > ------
>> > [1] http://imports.gi/
>>
>
_______________________________________________
javascript-list mailing list
javascript-list@gnome.org
https://mail.gnome.org/mailman/listinfo/javascript-list

Reply via email to