From de647bbfaf7964edf520a96212755c9a3dfc5c2c Mon Sep 17 00:00:00 2001 From: Philip Chimento Date: Sun, 26 Feb 2023 20:16:59 -0800 Subject: 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. --- installed-tests/js/testESModules.js | 6 ++++++ 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); -- cgit v1.2.1