diff options
author | Philip Chimento <philip.chimento@gmail.com> | 2023-02-26 20:16:59 -0800 |
---|---|---|
committer | Philip Chimento <philip.chimento@gmail.com> | 2023-03-04 23:40:32 -0800 |
commit | de647bbfaf7964edf520a96212755c9a3dfc5c2c (patch) | |
tree | a928f42e1bfdd0369a0292f077de2b8d752e7341 | |
parent | 9633f54961f83dbe06871eb9b9c11b997cc9d577 (diff) | |
download | gjs-de647bbfaf7964edf520a96212755c9a3dfc5c2c.tar.gz |
gi: Roll back change to imports.gi.versions object if gi.require() fails
If something like gi.require('GLib', '1.75') fails, then we don't want the
faulty version number remaining on the imports.gi.versions object.
-rw-r--r-- | installed-tests/js/testESModules.js | 6 | ||||
-rw-r--r-- | modules/esm/gi.js | 19 |
2 files changed, 19 insertions, 6 deletions
diff --git a/installed-tests/js/testESModules.js b/installed-tests/js/testESModules.js index 30db17e4..e727c790 100644 --- a/installed-tests/js/testESModules.js +++ b/installed-tests/js/testESModules.js @@ -27,26 +27,32 @@ describe('ES module imports', function () { it('import with version parameter', function () { expect(gi.require('GObject', '2.0')).toBe(gi.require('GObject')); + expect(imports.gi.versions['GObject']).toBe('2.0'); }); it('import again with other version parameter', function () { expect(() => gi.require('GObject', '1.75')).toThrow(); + expect(imports.gi.versions['GObject']).toBe('2.0'); }); it('import for the first time with wrong version', function () { expect(() => gi.require('Gtk', '1.75')).toThrow(); + expect(imports.gi.versions['Gtk']).not.toBeDefined(); }); it('import with another version after a failed import', function () { expect(gi.require('Gtk', '3.0').toString()).toEqual('[object GIRepositoryNamespace]'); + expect(imports.gi.versions['Gtk']).toBe('3.0'); }); it('import nonexistent module', function () { expect(() => gi.require('PLib')).toThrow(); + expect(imports.gi.versions['PLib']).not.toBeDefined(); }); it('GObject introspection import via URL scheme', function () { expect(Gio.toString()).toEqual('[object GIRepositoryNamespace]'); + expect(imports.gi.versions['Gio']).toBe('2.0'); }); it('import.meta.url', function () { diff --git a/modules/esm/gi.js b/modules/esm/gi.js index 126ce7e7..b49cf120 100644 --- a/modules/esm/gi.js +++ b/modules/esm/gi.js @@ -8,17 +8,24 @@ const Gi = { if (namespace === 'versions') throw new Error('Cannot import namespace "versions", use the version parameter of Gi.require to specify versions.'); + let oldVersion = gi.versions[namespace]; if (version !== undefined) gi.versions[namespace] = version; - const module = gi[namespace]; + try { + const module = gi[namespace]; - if (version !== undefined && version !== module.__version__) { - throw new Error(`Version ${module.__version__} of GI module ${ - namespace} already loaded, cannot load version ${version}`); - } + if (version !== undefined && version !== module.__version__) { + throw new Error(`Version ${module.__version__} of GI module ${ + namespace} already loaded, cannot load version ${version}`); + } - return module; + return module; + } catch (error) { + // Roll back change to versions object if import failed + gi.versions[namespace] = oldVersion; + throw error; + } }, }; Object.freeze(Gi); |