diff --git a/bin/templates/platform_www/cdv-electron-main.js b/bin/templates/platform_www/cdv-electron-main.js index 8a0dd38..81e6b3e 100644 --- a/bin/templates/platform_www/cdv-electron-main.js +++ b/bin/templates/platform_www/cdv-electron-main.js @@ -17,8 +17,8 @@ under the License. */ -const fs = require('fs'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); const { cordova } = require('./package.json'); // Module to control application life, browser window and tray. const { diff --git a/lib/Api.js b/lib/Api.js index c45be8a..d509555 100644 --- a/lib/Api.js +++ b/lib/Api.js @@ -21,8 +21,8 @@ this file is found by cordova-lib when you attempt to 'cordova platform add PATH' where path is this repo. */ -const path = require('path'); -const fs = require('fs-extra'); +const path = require('node:path'); +const fs = require('node:fs'); const { ActionStack, ConfigChanges: { PlatformMunger }, @@ -190,7 +190,7 @@ class Api { this._removeModulesInfo(pluginInfo, targetDir); // Remove stale plugin directory // @todo this should be done by plugin files uninstaller - fs.removeSync(path.resolve(this.root, 'Plugins', pluginInfo.id)); + fs.rmSync(path.resolve(this.root, 'Plugins', pluginInfo.id), { recursive: true, force: true }); }); } @@ -303,8 +303,8 @@ class Api { // BOTTOM OF METADATA });`; - fs.ensureDirSync(targetDir); - fs.writeFileSync(path.join(targetDir, 'cordova_plugins.js'), final_contents, 'utf-8'); + fs.mkdirSync(targetDir, { recursive: true }); + fs.writeFileSync(path.join(targetDir, 'cordova_plugins.js'), final_contents, 'utf8'); } /** diff --git a/lib/ManifestJsonParser.js b/lib/ManifestJsonParser.js index 6b17088..6ce67d6 100644 --- a/lib/ManifestJsonParser.js +++ b/lib/ManifestJsonParser.js @@ -17,8 +17,8 @@ under the License. */ -const fs = require('fs-extra'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); class ManifestJsonParser { constructor (wwwDir) { @@ -91,7 +91,7 @@ class ManifestJsonParser { if (fs.existsSync(startUrlPath)) { // fetch start url file content and parse for theme-color. - const contents = fs.readFileSync(startUrlPath, 'utf-8'); + const contents = fs.readFileSync(startUrlPath, 'utf8'); const result = /]*name="theme-color")\s[^>]*content="([^>]*)"/i.exec(contents); // If theme-color exists, the value is in index 1. diff --git a/lib/PackageJsonParser.js b/lib/PackageJsonParser.js index ec866bb..23e16e9 100644 --- a/lib/PackageJsonParser.js +++ b/lib/PackageJsonParser.js @@ -17,15 +17,24 @@ under the License. */ -const fs = require('fs-extra'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); const { getPackageJson } = require('./util'); class PackageJsonParser { constructor (wwwDir, projectRootDir) { - // Electron App Package + // make sure www dir exists + if (!fs.existsSync(wwwDir)) { + fs.mkdirSync(wwwDir, { recursive: true }); + } + this.path = path.join(wwwDir, 'package.json'); - fs.ensureFileSync(this.path); + + if (!fs.existsSync(this.path)) { + fs.writeFileSync(this.path, '{}', 'utf8'); + } + + // Electron App Package this.package = JSON.parse(fs.readFileSync(this.path, 'utf8') || '{}'); // Force settings that are not allowed to change. diff --git a/lib/SettingJsonParser.js b/lib/SettingJsonParser.js index 7997edf..e83551c 100644 --- a/lib/SettingJsonParser.js +++ b/lib/SettingJsonParser.js @@ -17,8 +17,8 @@ under the License. */ -const fs = require('fs-extra'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); const { deepMerge } = require('./util'); class SettingJsonParser { diff --git a/lib/build.js b/lib/build.js index 154b404..382f8c5 100644 --- a/lib/build.js +++ b/lib/build.js @@ -17,8 +17,8 @@ under the License. */ -const fs = require('fs-extra'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); const events = require('cordova-common').events; const { deepMerge, getInstalledElectronVersion } = require('./util'); diff --git a/lib/clean.js b/lib/clean.js index 9bbd86f..d2e5596 100644 --- a/lib/clean.js +++ b/lib/clean.js @@ -17,8 +17,8 @@ under the License. */ -const fs = require('fs-extra'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); const check_reqs = require('./check_reqs'); const platformBuildDir = path.join('platforms', 'electron', 'www'); @@ -32,7 +32,7 @@ module.exports.run = () => { try { if (fs.existsSync(platformBuildDir)) { - fs.removeSync(platformBuildDir); + fs.rmSync(platformBuildDir, { recursive: true, force: true }); } } catch (err) { console.log(`could not remove ${platformBuildDir} : ${err.message}`); diff --git a/lib/create.js b/lib/create.js index 0a02df5..8ad2bbf 100644 --- a/lib/create.js +++ b/lib/create.js @@ -17,8 +17,8 @@ under the License. */ -const fs = require('fs-extra'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); const rootDir = path.resolve(__dirname, '..'); const events = require('cordova-common').events; const check_reqs = require(path.join(rootDir, 'lib/check_reqs')); @@ -46,10 +46,10 @@ module.exports.createProject = (platform_dir, package_name, project_name, option } // Make sure that the platform directory is created if missing. - fs.ensureDirSync(platform_dir); + fs.mkdirSync(platform_dir, { recursive: true }); // copy templates directory to the platform directory recursively - fs.copySync(path.join(rootDir, 'bin/templates'), path.join(platform_dir), { overwrite: false }); + fs.cpSync(path.join(rootDir, 'bin/templates'), path.join(platform_dir), { recursive: true, force: true }); return Promise.resolve(); }; diff --git a/lib/handler.js b/lib/handler.js index daed0ee..f7ff75d 100644 --- a/lib/handler.js +++ b/lib/handler.js @@ -17,8 +17,8 @@ under the License. */ -const path = require('path'); -const fs = require('fs-extra'); +const path = require('node:path'); +const fs = require('node:fs'); const execa = require('execa'); const { events } = require('cordova-common'); const { _orderObject } = require('./PackageJsonParser'); @@ -53,7 +53,7 @@ module.exports = { const moduleName = `${plugin_id}.${jsModule.name || path.basename(jsModule.src, path.extname(jsModule.src))}`; // Read in the file, prepend the cordova.define, and write it back out. - let scriptContent = fs.readFileSync(moduleSource, 'utf-8').replace(/^\ufeff/, ''); // Window BOM + let scriptContent = fs.readFileSync(moduleSource, 'utf8').replace(/^\ufeff/, ''); // Window BOM if (moduleSource.match(/.*\.json$/)) { scriptContent = `module.exports = + ${scriptContent}`; @@ -65,11 +65,11 @@ module.exports = { const moduleDestination = path.resolve(www_dir, 'plugins', plugin_id, jsModule.src); - fs.ensureDirSync(path.dirname(moduleDestination)); - fs.writeFileSync(moduleDestination, scriptContent, 'utf-8'); + fs.mkdirSync(path.dirname(moduleDestination), { recursive: true }); + fs.writeFileSync(moduleDestination, scriptContent, 'utf8'); }, uninstall: (jsModule, www_dir, plugin_id) => { - fs.removeSync(path.join(www_dir, 'plugins', plugin_id)); + fs.rmSync(path.join(www_dir, 'plugins', plugin_id), { recursive: true, force: true }); const pluginRelativePath = path.join('plugins', plugin_id, jsModule.src); // common.removeFileAndParents(www_dir, pluginRelativePath); events.emit('verbose', `js-module uninstall called : ${pluginRelativePath}`); @@ -226,12 +226,12 @@ module.exports = { const dest = path.join(wwwDest, asset.target); const destDir = path.parse(dest).dir; - fs.ensureDirSync(destDir); - fs.copySync(src, dest); + fs.mkdirSync(destDir, { recursive: true }); + fs.cpSync(src, dest, { recursive: true }); }, uninstall: (asset, wwwDest, plugin_id) => { - fs.removeSync(path.join(wwwDest, asset.target)); - fs.removeSync(path.join(wwwDest, 'plugins', plugin_id)); + fs.rmSync(path.join(wwwDest, asset.target), { recursive: true, force: true }); + fs.rmSync(path.join(wwwDest, 'plugins', plugin_id), { recursive: true, force: true }); } } }; diff --git a/lib/parser.js b/lib/parser.js index 8905699..a23ea3c 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -17,8 +17,8 @@ under the License. */ -const fs = require('fs-extra'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); const CordovaError = require('cordova-common').CordovaError; const events = require('cordova-common').events; const FileUpdater = require('cordova-common').FileUpdater; @@ -79,7 +79,7 @@ class Parser { return this.update_from_config() .then( // Copy munged config.xml to platform www dir - () => fs.copySync(path.join(this.www_dir(), '..', 'config.xml'), path.join(this.www_dir(), 'config.xml')) + () => fs.cpSync(path.join(this.www_dir(), '..', 'config.xml'), path.join(this.www_dir(), 'config.xml'), { recursive: true }) ); } } diff --git a/lib/prepare.js b/lib/prepare.js index 310cb6b..99513d5 100644 --- a/lib/prepare.js +++ b/lib/prepare.js @@ -17,8 +17,8 @@ under the License. */ -const fs = require('fs-extra'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); const { ConfigParser, xmlHelpers, events, CordovaError } = require('cordova-common'); const ManifestJsonParser = require('./ManifestJsonParser'); const PackageJsonParser = require('./PackageJsonParser'); @@ -35,13 +35,13 @@ module.exports.prepare = function (cordovaProject, options) { // restored or copy project config into platform if none exists. if (fs.existsSync(defaultConfigPath)) { this.events.emit('verbose', `Generating config.xml from defaults for platform "${this.platform}"`); - fs.copySync(defaultConfigPath, ownConfigPath); + fs.cpSync(defaultConfigPath, ownConfigPath, { recursive: true }); } else if (fs.existsSync(ownConfigPath)) { this.events.emit('verbose', `Generating defaults.xml from own config.xml for platform "${this.platform}"`); - fs.copySync(ownConfigPath, defaultConfigPath); + fs.cpSync(ownConfigPath, defaultConfigPath, { recursive: true }); } else { this.events.emit('verbose', `case 3 "${this.platform}"`); - fs.copySync(sourceCfg.path, ownConfigPath); + fs.cpSync(sourceCfg.path, ownConfigPath, { recursive: true }); } // merge our configs @@ -63,7 +63,7 @@ module.exports.prepare = function (cordovaProject, options) { // todo: validate it? ensure all properties we expect exist? const manifestPath = path.join(this.locations.www, 'manifest.json'); this.events.emit('verbose', `Copying ${srcManifestPath} => ${manifestPath}`); - fs.copySync(srcManifestPath, manifestPath); + fs.cpSync(srcManifestPath, manifestPath, { recursive: true }); } else { this.events.emit('verbose', `Creating new manifest file in => ${this.path}`); @@ -345,7 +345,7 @@ function copyResources (rootDir, resourceMap) { if (elementKeys.length) { const value = elementKeys.map((e) => element[e])[0]; - fs.copySync(path.join(rootDir, elementKeys[0]), value); + fs.cpSync(path.join(rootDir, elementKeys[0]), value, { recursive: true }); } }); } diff --git a/lib/run.js b/lib/run.js index eba0860..6ea5171 100644 --- a/lib/run.js +++ b/lib/run.js @@ -19,7 +19,7 @@ const electron = require('electron'); const execa = require('execa'); -const path = require('path'); +const path = require('node:path'); module.exports.run = function (args = {}) { const electonArgs = args.argv || []; diff --git a/package-lock.json b/package-lock.json index c023e48..df7977a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,8 +13,7 @@ "electron": "^29.0.0", "electron-builder": "^24.12.0", "electron-devtools-installer": "^3.2.0", - "execa": "^5.1.1", - "fs-extra": "^11.2.0" + "execa": "^5.1.1" }, "devDependencies": { "@cordova/eslint-config": "^5.0.0", diff --git a/package.json b/package.json index 3973f7f..512acdb 100644 --- a/package.json +++ b/package.json @@ -24,8 +24,7 @@ "electron": "^29.0.0", "electron-builder": "^24.12.0", "electron-devtools-installer": "^3.2.0", - "execa": "^5.1.1", - "fs-extra": "^11.2.0" + "execa": "^5.1.1" }, "devDependencies": { "@cordova/eslint-config": "^5.0.0", diff --git a/tests/spec/unit/lib/Api.spec.js b/tests/spec/unit/lib/Api.spec.js index 1a9a304..5e825af 100644 --- a/tests/spec/unit/lib/Api.spec.js +++ b/tests/spec/unit/lib/Api.spec.js @@ -17,8 +17,8 @@ under the License. */ -const fs = require('fs-extra'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); const rewire = require('rewire'); const { events, PluginInfo, ConfigParser, CordovaError } = require('cordova-common'); @@ -62,15 +62,15 @@ describe('Api class', () => { let apiEvents; beforeAll(() => { - fs.ensureDirSync(tmpDir); - fs.copySync(path.resolve(fixturesDir, 'testapp'), testProjectDir); + fs.mkdirSync(tmpDir, { recursive: true }); + fs.cpSync(path.resolve(fixturesDir, 'testapp'), testProjectDir, { recursive: true }); apiEvents = Api.__get__('selfEvents'); apiEvents.addListener('verbose', (data) => { }); }); afterAll(() => { - fs.removeSync(tmpDir); + fs.rmSync(tmpDir, { recursive: true, force: true }); apiEvents.removeAllListeners(); }); @@ -152,13 +152,13 @@ describe('Api class', () => { beforeEach(() => { spyOn(events, 'emit'); - fs.removeSync(path.resolve(testProjectDir, 'electron.json')); - fs.removeSync(path.resolve(testProjectDir, 'www')); + fs.rmSync(path.resolve(testProjectDir, 'electron.json'), { recursive: true, force: true }); + fs.rmSync(path.resolve(testProjectDir, 'www'), { recursive: true, force: true }); }); afterEach(() => { - fs.removeSync(path.resolve(testProjectDir, 'electron.json')); - fs.removeSync(path.resolve(testProjectDir, 'www')); + fs.rmSync(path.resolve(testProjectDir, 'electron.json'), { recursive: true, force: true }); + fs.rmSync(path.resolve(testProjectDir, 'www'), { recursive: true, force: true }); apiEvents.removeAllListeners(); }); @@ -208,14 +208,14 @@ describe('Api class', () => { }); it('should have "clobber", "merge", and "run" set when defined in "js-module".', () => { - const { modules } = fs.readJsonSync(path.resolve(testProjectDir, 'electron.json')); + const { modules } = JSON.parse(fs.readFileSync(path.resolve(testProjectDir, 'electron.json'), 'utf8')); expect(modules[0].clobbers).toBeDefined(); expect(modules[0].merges).toBeDefined(); expect(modules[0].runs).toBeDefined(); }); it('should have module id containing the name attribute value.', () => { - const { modules } = fs.readJsonSync(path.resolve(testProjectDir, 'electron.json')); + const { modules } = JSON.parse(fs.readFileSync(path.resolve(testProjectDir, 'electron.json'), 'utf8')); expect(modules[0].id).toBe('org.apache.testplugin.TestPlugin'); }); }); @@ -228,14 +228,14 @@ describe('Api class', () => { }); it('should not have "clobber", "merge", and "run" set when not defined in "js-module".', () => { - const { modules } = fs.readJsonSync(path.resolve(testProjectDir, 'electron.json')); + const { modules } = JSON.parse(fs.readFileSync(path.resolve(testProjectDir, 'electron.json'), 'utf8')); expect(modules[0].clobbers).not.toBeDefined(); expect(modules[0].merges).not.toBeDefined(); expect(modules[0].runs).not.toBeDefined(); }); it('should use js filename for plugin id if name is missing.', () => { - const { modules } = fs.readJsonSync(path.resolve(testProjectDir, 'electron.json')); + const { modules } = JSON.parse(fs.readFileSync(path.resolve(testProjectDir, 'electron.json'), 'utf8')); expect(modules[0].id).toBe('org.apache.testplugin2.MyTestPlugin2'); }); }); @@ -250,7 +250,7 @@ describe('Api class', () => { }); it('should use custom package name.', () => { - const { installed_plugins } = fs.readJsonSync(path.resolve(testProjectDir, 'electron.json')); + const { installed_plugins } = JSON.parse(fs.readFileSync(path.resolve(testProjectDir, 'electron.json'), 'utf8')); expect(installed_plugins['org.apache.testplugin'].PACKAGE_NAME).toEqual('com.foobar.newpackagename'); }); @@ -293,13 +293,13 @@ describe('Api class', () => { beforeEach(() => { spyOn(events, 'emit'); - fs.removeSync(path.resolve(testProjectDir, 'electron.json')); - fs.removeSync(path.resolve(testProjectDir, 'www')); + fs.rmSync(path.resolve(testProjectDir, 'electron.json'), { recursive: true, force: true }); + fs.rmSync(path.resolve(testProjectDir, 'www'), { recursive: true, force: true }); }); afterEach(() => { - fs.removeSync(path.resolve(testProjectDir, 'electron.json')); - fs.removeSync(path.resolve(testProjectDir, 'www')); + fs.rmSync(path.resolve(testProjectDir, 'electron.json'), { recursive: true, force: true }); + fs.rmSync(path.resolve(testProjectDir, 'www'), { recursive: true, force: true }); apiEvents.removeAllListeners(); }); @@ -331,7 +331,7 @@ describe('Api class', () => { it('should remove the empty plugin data from electron.json.', () => { return api.removePlugin(pluginInfo).then( () => { - const { plugin_metadata, modules, installed_plugins } = fs.readJsonSync(path.resolve(testProjectDir, 'electron.json')); + const { plugin_metadata, modules, installed_plugins } = JSON.parse(fs.readFileSync(path.resolve(testProjectDir, 'electron.json'), 'utf8')); expect(plugin_metadata).toEqual({}); expect(modules).toEqual([]); expect(installed_plugins).toEqual({}); @@ -452,12 +452,12 @@ describe('Api prototype methods', () => { let config; beforeEach(() => { - fs.removeSync(tmpDir); + fs.rmSync(tmpDir, { recursive: true, force: true }); config = new ConfigParser(path.join(fixturesDir, 'test-config-empty.xml')); }); afterEach(() => { - fs.removeSync(tmpDir); + fs.rmSync(tmpDir, { recursive: true, force: true }); }); it('should create cordova project at the provided destination', () => { diff --git a/tests/spec/unit/lib/ManifestJsonParser.spec.js b/tests/spec/unit/lib/ManifestJsonParser.spec.js index 0f0d64e..6902003 100644 --- a/tests/spec/unit/lib/ManifestJsonParser.spec.js +++ b/tests/spec/unit/lib/ManifestJsonParser.spec.js @@ -18,8 +18,8 @@ */ const rewire = require('rewire'); -const path = require('path'); -const fs = require('fs-extra'); +const path = require('node:path'); +const fs = require('node:fs'); const { ConfigParser } = require('cordova-common'); const rootDir = path.resolve(__dirname, '../../../..'); diff --git a/tests/spec/unit/lib/PackageJsonParser.spec.js b/tests/spec/unit/lib/PackageJsonParser.spec.js index 8f02b4b..2871a3a 100644 --- a/tests/spec/unit/lib/PackageJsonParser.spec.js +++ b/tests/spec/unit/lib/PackageJsonParser.spec.js @@ -17,15 +17,15 @@ under the License. */ -const path = require('path'); -const fs = require('fs-extra'); -const rewire = require('rewire'); +const path = require('node:path'); +const fs = require('node:fs'); +const os = require('node:os'); const { ConfigParser, events } = require('cordova-common'); const rootDir = path.resolve(__dirname, '../../../..'); const fixturesDir = path.join(rootDir, 'tests/spec/fixtures'); -const PackageJsonParser = rewire(path.join(rootDir, 'lib/PackageJsonParser')); +const PackageJsonParser = require(path.join(rootDir, 'lib/PackageJsonParser')); // Create a real config object before mocking out everything. const cfg = new ConfigParser(path.join(fixturesDir, 'test-config-1.xml')); @@ -50,24 +50,28 @@ const defaultMockProjectPackageJson = { } }; -const locations = { - buildRes: path.join('mock', 'build-res'), - www: path.join('mock', 'www'), - configXml: path.join('mock', 'config.xml') -}; - const defaultInitPackageObj = { main: 'cdv-electron-main.js' }; describe('PackageJsonParser class', () => { let packageJsonParser; + let locations; + let tmpDir; beforeEach(() => { + tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cordovaElectronTest-')); + + locations = { + buildRes: path.join(tmpDir, 'build-res'), + www: path.join(tmpDir, 'www'), + configXml: path.join(tmpDir, 'config.xml') + }; + packageJsonParser = new PackageJsonParser(locations.www, '/root/project'); spyOn(events, 'emit'); }); afterAll(() => { - fs.removeSync('mock'); + fs.rmSync(tmpDir, { recursive: true, force: true }); }); it('should have been constructed with initial values.', () => { @@ -193,3 +197,38 @@ describe('PackageJsonParser class', () => { ); }); }); + +describe('PackageJsonParser (2) class', () => { + it('should have constructed and already detected directories and files', () => { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cordovaElectronTest-')); + const locations = { + buildRes: path.join(tmpDir, 'build-res'), + www: path.join(tmpDir, 'www'), + configXml: path.join(tmpDir, 'config.xml') + }; + const wwwDir = locations.www; + const pkgFile = path.join(wwwDir, 'package.json'); + + fs.mkdirSync(wwwDir, { recursive: true }); + fs.writeFileSync(pkgFile, '{}', 'utf8'); + + spyOn(events, 'emit'); + spyOn(fs, 'readFileSync'); + + // files & directories should already exisy + expect(fs.existsSync(wwwDir)).toBeTruthy(); + expect(fs.existsSync(pkgFile)).toBeTruthy(); + + /* eslint-disable-next-line */ + const packageJsonParser = new PackageJsonParser(wwwDir, '/root/project'); + + expect(fs.readFileSync).toHaveBeenCalled(); + // There should be no change in truthy values. + expect(fs.existsSync(wwwDir)).toBeTruthy(); + expect(fs.existsSync(pkgFile)).toBeTruthy(); + + expect(packageJsonParser.package).toBeDefined(); + + fs.rmSync(tmpDir, { recursive: true, force: true }); + }); +}); diff --git a/tests/spec/unit/lib/SettingJsonParser.spec.js b/tests/spec/unit/lib/SettingJsonParser.spec.js index 6be292c..a99bf12 100644 --- a/tests/spec/unit/lib/SettingJsonParser.spec.js +++ b/tests/spec/unit/lib/SettingJsonParser.spec.js @@ -18,7 +18,7 @@ */ const rewire = require('rewire'); -const path = require('path'); +const path = require('node:path'); const ConfigParser = require('cordova-common').ConfigParser; const rootDir = path.resolve(__dirname, '../../../..'); diff --git a/tests/spec/unit/lib/build.spec.js b/tests/spec/unit/lib/build.spec.js index 8446245..738e234 100644 --- a/tests/spec/unit/lib/build.spec.js +++ b/tests/spec/unit/lib/build.spec.js @@ -19,8 +19,8 @@ */ const rewire = require('rewire'); -const path = require('path'); -const fs = require('fs-extra'); +const path = require('node:path'); +const fs = require('node:fs'); const rootDir = path.resolve(__dirname, '../../../..'); const fixturesDir = path.join(rootDir, 'tests/spec/fixtures'); @@ -35,13 +35,13 @@ describe('Testing build.js:', () => { let api; beforeAll(() => { - fs.ensureDirSync(tmpDir); - fs.copySync(path.resolve(fixturesDir, 'testapp'), path.resolve(tmpDir, 'testapp')); + fs.mkdirSync(tmpDir, { recursive: true }); + fs.cpSync(path.resolve(fixturesDir, 'testapp'), path.resolve(tmpDir, 'testapp'), { recursive: true }); api = new Api(null, testProjectDir); }); afterAll(() => { - fs.removeSync(tmpDir); + fs.rmSync(tmpDir, { recursive: true, force: true }); }); beforeEach(() => { diff --git a/tests/spec/unit/lib/clean.spec.js b/tests/spec/unit/lib/clean.spec.js index d20d13c..0382c82 100644 --- a/tests/spec/unit/lib/clean.spec.js +++ b/tests/spec/unit/lib/clean.spec.js @@ -17,8 +17,8 @@ under the License. */ -const path = require('path'); -const fs = require('fs-extra'); +const path = require('node:path'); +const fs = require('node:fs'); const rootDir = path.resolve(__dirname, '../../../..'); @@ -45,30 +45,30 @@ describe('Clean', () => { it('should not find previous build dir and not attempt to remove.', () => { spyOn(check_reqs, 'run').and.returnValue(true); spyOn(fs, 'existsSync').and.returnValue(false); - spyOn(fs, 'removeSync'); + spyOn(fs, 'rmSync'); clean.run(); expect(fs.existsSync).toHaveBeenCalled(); - expect(fs.removeSync).not.toHaveBeenCalled(); + expect(fs.rmSync).not.toHaveBeenCalled(); }); it('should find previous build dir and attempt to remove.', () => { spyOn(check_reqs, 'run').and.returnValue(true); spyOn(fs, 'existsSync').and.returnValue(true); - spyOn(fs, 'removeSync'); + spyOn(fs, 'rmSync'); clean.run(); expect(fs.existsSync).toHaveBeenCalled(); - expect(fs.removeSync).toHaveBeenCalled(); + expect(fs.rmSync).toHaveBeenCalled(); }); it('should find previous build dir and fail to remove.', () => { spyOn(console, 'log'); spyOn(check_reqs, 'run').and.returnValue(true); spyOn(fs, 'existsSync').and.returnValue(true); - spyOn(fs, 'removeSync').and.callFake(() => { + spyOn(fs, 'rmSync').and.callFake(() => { throw new Error('Fake Error'); }); diff --git a/tests/spec/unit/lib/create.spec.js b/tests/spec/unit/lib/create.spec.js index 176d8ce..a9090f9 100644 --- a/tests/spec/unit/lib/create.spec.js +++ b/tests/spec/unit/lib/create.spec.js @@ -17,9 +17,9 @@ under the License. */ -const os = require('os'); -const fs = require('fs-extra'); -const path = require('path'); +const os = require('node:os'); +const fs = require('node:fs'); +const path = require('node:path'); const rewire = require('rewire'); const rootDir = path.resolve(__dirname, '../../../..'); @@ -37,7 +37,7 @@ describe('create', () => { tmpDir = makeTempDir(); }); afterEach(() => { - fs.removeSync(tmpDir); + fs.rmSync(tmpDir, { recursive: true, force: true }); }); it('creates a project that has the expected files', () => { @@ -58,9 +58,9 @@ describe('create', () => { const projectPath = path.join(tmpDir, projectname); create.__set__('fs', { - ensureDirSync: fs.ensureDirSync, + mkdirSync: fs.mkdirSync, existsSync: path => path !== projectPath, - copySync: () => true + cpSync: () => true }); return create.createProject(projectPath, projectname, projectid).then(() => { diff --git a/tests/spec/unit/lib/handler.spec.js b/tests/spec/unit/lib/handler.spec.js index 28fa984..b77d329 100644 --- a/tests/spec/unit/lib/handler.spec.js +++ b/tests/spec/unit/lib/handler.spec.js @@ -17,8 +17,8 @@ under the License. */ -const path = require('path'); -const fs = require('fs-extra'); +const path = require('node:path'); +const fs = require('node:fs'); const { events } = require('cordova-common'); const rewire = require('rewire'); @@ -78,7 +78,7 @@ describe('Handler export', () => { // spies spyOn(fs, 'readFileSync').and.returnValue(''); // fake scriptContent - spyOn(fs, 'ensureDirSync').and.returnValue(true); + spyOn(fs, 'mkdirSync').and.returnValue(true); spyOn(fs, 'writeFileSync'); handler['js-module'].install(jsModule, plugin_dir, plugin_id, www_dir); @@ -86,8 +86,8 @@ describe('Handler export', () => { const moduleDetination = path.dirname(path.resolve(www_dir, 'plugins', plugin_id, jsModule.src)); const writeFileSyncContent = fs.writeFileSync.calls.argsFor(0)[1]; - expect(fs.readFileSync).toHaveBeenCalledWith(path.resolve(plugin_dir, jsModule.src), 'utf-8'); - expect(fs.ensureDirSync).toHaveBeenCalledWith(moduleDetination); + expect(fs.readFileSync).toHaveBeenCalledWith(path.resolve(plugin_dir, jsModule.src), 'utf8'); + expect(fs.mkdirSync).toHaveBeenCalledWith(moduleDetination, { recursive: true }); expect(writeFileSyncContent).toContain(`cordova.define('${moduleName}'`); return writeFileSyncContent; @@ -119,12 +119,12 @@ describe('Handler export', () => { const plugin_id = 'com.foo.dummy-plugin'; // spies - spyOn(fs, 'removeSync').and.returnValue(true); + spyOn(fs, 'rmSync').and.returnValue(true); spyOn(events, 'emit'); handler['js-module'].uninstall(jsModule, www_dir, plugin_id); - expect(fs.removeSync).toHaveBeenCalledWith(path.join(www_dir, 'plugins', plugin_id)); + expect(fs.rmSync).toHaveBeenCalledWith(path.join(www_dir, 'plugins', plugin_id), { recursive: true, force: true }); expect(events.emit).toHaveBeenCalledWith( 'verbose', `js-module uninstall called : ${path.join('plugins', plugin_id, jsModule.src)}` @@ -138,7 +138,7 @@ describe('Handler export', () => { const wwwDest = 'dest'; describe('asset.install', () => { - it('should copySync assets to destination.', () => { + it('should cpSync assets to destination.', () => { const asset = { itemType: 'asset', src: 'someSrc/ServiceWorker.js', @@ -146,13 +146,13 @@ describe('Handler export', () => { }; // Spies - spyOn(fs, 'copySync'); - spyOn(fs, 'ensureDirSync').and.returnValue(true); + spyOn(fs, 'cpSync'); + spyOn(fs, 'mkdirSync').and.returnValue(true); handler.asset.install(asset, plugin_dir, wwwDest); - expect(fs.ensureDirSync).toHaveBeenCalled(); - expect(fs.copySync).toHaveBeenCalledWith(jasmine.any(String), path.join('dest', asset.target)); + expect(fs.mkdirSync).toHaveBeenCalled(); + expect(fs.cpSync).toHaveBeenCalledWith(jasmine.any(String), path.join('dest', asset.target), { recursive: true }); }); }); @@ -162,13 +162,13 @@ describe('Handler export', () => { const mockPluginId = 'com.foobar.random-plugin-id'; // Spies - spyOn(fs, 'removeSync').and.returnValue(true); + spyOn(fs, 'rmSync').and.returnValue(true); handler.asset.uninstall(asset, wwwDest, mockPluginId); - expect(fs.removeSync).toHaveBeenCalled(); - expect(fs.removeSync.calls.argsFor(0)[0]).toBe(path.join(wwwDest, asset.target)); - expect(fs.removeSync.calls.argsFor(1)[0]).toBe(path.join(wwwDest, 'plugins', mockPluginId)); + expect(fs.rmSync).toHaveBeenCalled(); + expect(fs.rmSync.calls.argsFor(0)[0]).toBe(path.join(wwwDest, asset.target)); + expect(fs.rmSync.calls.argsFor(1)[0]).toBe(path.join(wwwDest, 'plugins', mockPluginId)); }); }); }); @@ -198,14 +198,14 @@ describe('Handler export', () => { const frameworkInstallPluginPackageFile = path.join(frameworkInstallPluginDir, 'src/electron/package.json'); beforeEach(() => { - fs.ensureDirSync(tmpDir); - fs.copySync(path.resolve(fixturesDir, 'test-app-with-electron-plugin'), testProjectDir); + fs.mkdirSync(tmpDir, { recursive: true }); + fs.cpSync(path.resolve(fixturesDir, 'test-app-with-electron-plugin'), testProjectDir, { recursive: true }); spyOn(events, 'emit'); }); afterEach(() => { - fs.removeSync(tmpDir); + fs.rmSync(tmpDir, { recursive: true, force: true }); }); describe('framework.install', () => { diff --git a/tests/spec/unit/lib/parser.spec.js b/tests/spec/unit/lib/parser.spec.js index 90e8818..93e36e0 100644 --- a/tests/spec/unit/lib/parser.spec.js +++ b/tests/spec/unit/lib/parser.spec.js @@ -17,8 +17,8 @@ under the License. */ -const path = require('path'); -const fs = require('fs-extra'); +const path = require('node:path'); +const fs = require('node:fs'); const rewire = require('rewire'); const { CordovaError, events } = require('cordova-common'); @@ -149,14 +149,14 @@ describe('Parser class', () => { describe('update_project method', () => { it('should copy munged config.xml to platform www dir.', () => { - const fsCopySyncSpy = jasmine.createSpy('copySync'); - Parser.__set__('fs', { copySync: fsCopySyncSpy }); + const cpSyncSpy = jasmine.createSpy('cpSync'); + Parser.__set__('fs', { cpSync: cpSyncSpy }); parser.update_project().then(() => { - const actualSrc = fsCopySyncSpy.calls.argsFor(0)[0]; - const actualDest = fsCopySyncSpy.calls.argsFor(0)[1]; + const actualSrc = cpSyncSpy.calls.argsFor(0)[0]; + const actualDest = cpSyncSpy.calls.argsFor(0)[1]; - expect(fsCopySyncSpy).toHaveBeenCalled(); + expect(cpSyncSpy).toHaveBeenCalled(); expect(actualSrc).toBe(path.join(mockProjectPath, 'config.xml')); expect(actualDest).toBe(path.join(mockProjectPath, 'www', 'config.xml')); }); diff --git a/tests/spec/unit/lib/prepare.spec.js b/tests/spec/unit/lib/prepare.spec.js index 26e5e77..8715bac 100644 --- a/tests/spec/unit/lib/prepare.spec.js +++ b/tests/spec/unit/lib/prepare.spec.js @@ -18,8 +18,8 @@ */ const rewire = require('rewire'); -const path = require('path'); -const fs = require('fs-extra'); +const path = require('node:path'); +const fs = require('node:fs'); const CordovaError = require('cordova-common').CordovaError; const rootDir = path.resolve(__dirname, '../../../..'); @@ -223,13 +223,13 @@ describe('Testing prepare.js:', () => { let api; beforeAll(() => { - fs.ensureDirSync(tmpDir); - fs.copySync(path.resolve(fixturesDir, 'testapp'), path.resolve(tmpDir, 'testapp')); + fs.mkdirSync(tmpDir, { recursive: true }); + fs.cpSync(path.resolve(fixturesDir, 'testapp'), path.resolve(tmpDir, 'testapp'), { recursive: true }); api = new Api(null, testProjectDir); }); afterAll(() => { - fs.removeSync(tmpDir); + fs.rmSync(tmpDir, { recursive: true, force: true }); }); beforeEach(() => { @@ -253,12 +253,12 @@ describe('Testing prepare.js:', () => { const defaultConfigPathMock = path.join(api.locations.platformRootDir, 'cordova', 'defaults.xml'); const ownConfigPathMock = api.locations.configXml; - const copySyncSpy = jasmine.createSpy('copySync'); + const cpSyncSpy = jasmine.createSpy('cpSync'); prepare.__set__('fs', { existsSync: function (configPath) { return configPath === defaultConfigPathMock; }, - copySync: copySyncSpy, + cpSync: cpSyncSpy, readFileSync: function (filePath) { if (filePath === path.join('MOCK_PROJECT_ROOT', 'package.json')) { return defaultMockProjectPackageJson; @@ -279,7 +279,7 @@ describe('Testing prepare.js:', () => { prepare.prepare.call(api, cordovaProject, { }, api); - expect(copySyncSpy).toHaveBeenCalledWith(defaultConfigPathMock, ownConfigPathMock); + expect(cpSyncSpy).toHaveBeenCalledWith(defaultConfigPathMock, ownConfigPathMock, { recursive: true }); expect(mergeXmlSpy).toHaveBeenCalled(); expect(updateIconsSpy).toHaveBeenCalled(); expect(updateSplashScreensSpy).toHaveBeenCalled(); @@ -308,12 +308,12 @@ describe('Testing prepare.js:', () => { const defaultConfigPathMock = path.join(api.locations.platformRootDir, 'cordova', 'defaults.xml'); - const copySyncSpy = jasmine.createSpy('copySync'); + const cpSyncSpy = jasmine.createSpy('cpSync'); prepare.__set__('fs', { existsSync: function (configPath) { return configPath === defaultConfigPathMock; }, - copySync: copySyncSpy, + cpSync: cpSyncSpy, readFileSync: function (filePath) { if (filePath === path.join('MOCK_PROJECT_ROOT', 'package.json')) { return defaultMockProjectPackageJson; @@ -357,12 +357,12 @@ describe('Testing prepare.js:', () => { const defaultConfigPathMock = path.join(api.locations.platformRootDir, 'cordova', 'defaults.xml'); - const copySyncSpy = jasmine.createSpy('copySync'); + const cpSyncSpy = jasmine.createSpy('cpSync'); prepare.__set__('fs', { existsSync: function (configPath) { return configPath === defaultConfigPathMock; }, - copySync: copySyncSpy, + cpSync: cpSyncSpy, readFileSync: function (filePath) { if (filePath === path.join('MOCK_PROJECT_ROOT', 'package.json')) { return defaultMockProjectPackageJson; @@ -406,13 +406,13 @@ describe('Testing prepare.js:', () => { const defaultConfigPathMock = path.join(api.locations.platformRootDir, 'cordova', 'defaults.xml'); - const copySyncSpy = jasmine.createSpy('copySync'); + const cpSyncSpy = jasmine.createSpy('cpSync'); prepare.__set__('fs', { existsSync: function (configPath) { if (configPath === defaultConfigPathMock) return true; if (configPath.includes('fail_test_path')) return false; }, - copySync: copySyncSpy, + cpSync: cpSyncSpy, readFileSync: function (filePath) { if (filePath === path.join('MOCK_PROJECT_ROOT', 'package.json')) { return defaultMockProjectPackageJson; @@ -451,13 +451,13 @@ describe('Testing prepare.js:', () => { api.parser.update_project = () => this; const defaultConfigPathMock = path.join(api.locations.platformRootDir, 'cordova', 'defaults.xml'); - const copySyncSpy = jasmine.createSpy('copySync'); + const cpSyncSpy = jasmine.createSpy('cpSync'); prepare.__set__('fs', { existsSync: function (configPath) { if (configPath === defaultConfigPathMock) return true; if (configPath.includes('pass_test_path')) return true; }, - copySync: copySyncSpy, + cpSync: cpSyncSpy, readFileSync: function (filePath) { if (filePath === path.join('MOCK_PROJECT_ROOT', 'package.json')) { return defaultMockProjectPackageJson; @@ -498,12 +498,12 @@ describe('Testing prepare.js:', () => { const defaultConfigPathMock = path.join(api.locations.platformRootDir, 'cordova', 'defaults.xml'); const ownConfigPathMock = api.locations.configXml; - const copySyncSpy = jasmine.createSpy('copySync'); + const cpSyncSpy = jasmine.createSpy('cpSync'); prepare.__set__('fs', { existsSync: function (configPath) { return configPath === ownConfigPathMock; }, - copySync: copySyncSpy, + cpSync: cpSyncSpy, readFileSync: function (filePath) { if (filePath === path.join('MOCK_PROJECT_ROOT', 'package.json')) { return defaultMockProjectPackageJson; @@ -524,7 +524,7 @@ describe('Testing prepare.js:', () => { prepare.prepare.call(api, cordovaProject, { }, api); - expect(copySyncSpy).toHaveBeenCalledWith(ownConfigPathMock, defaultConfigPathMock); + expect(cpSyncSpy).toHaveBeenCalledWith(ownConfigPathMock, defaultConfigPathMock, { recursive: true }); expect(mergeXmlSpy).toHaveBeenCalled(); expect(updateIconsSpy).toHaveBeenCalled(); expect(updateSplashScreensSpy).toHaveBeenCalled(); @@ -555,12 +555,12 @@ describe('Testing prepare.js:', () => { const ownConfigPathMock = api.locations.configXml; const sourceCfgMock = cordovaProject.projectConfig; - const copySyncSpy = jasmine.createSpy('copySync'); + const cpSyncSpy = jasmine.createSpy('cpSync'); prepare.__set__('fs', { existsSync: function (configPath) { return configPath !== ownConfigPathMock && configPath !== defaultConfigPathMock; }, - copySync: copySyncSpy, + cpSync: cpSyncSpy, readFileSync: function (filePath) { if (filePath === path.join('MOCK_PROJECT_ROOT', 'package.json')) { return defaultMockProjectPackageJson; @@ -581,7 +581,7 @@ describe('Testing prepare.js:', () => { prepare.prepare.call(api, cordovaProject, { }, api); - expect(copySyncSpy).toHaveBeenCalledWith(sourceCfgMock.path, ownConfigPathMock); + expect(cpSyncSpy).toHaveBeenCalledWith(sourceCfgMock.path, ownConfigPathMock, { recursive: true }); expect(mergeXmlSpy).toHaveBeenCalled(); expect(updateIconsSpy).toHaveBeenCalled(); expect(updateSplashScreensSpy).toHaveBeenCalled(); @@ -611,12 +611,12 @@ describe('Testing prepare.js:', () => { const srcManifestPathMock = path.join(cordovaProject.locations.www, 'manifest.json'); const manifestPathMock = path.join(api.locations.www, 'manifest.json'); - const copySyncSpy = jasmine.createSpy('copySync'); + const cpSyncSpy = jasmine.createSpy('cpSync'); prepare.__set__('fs', { existsSync: function (srcManifestPath) { return srcManifestPath === srcManifestPathMock; }, - copySync: copySyncSpy, + cpSync: cpSyncSpy, readFileSync: function (filePath) { if (filePath === path.join('MOCK_PROJECT_ROOT', 'package.json')) { return defaultMockProjectPackageJson; @@ -637,7 +637,7 @@ describe('Testing prepare.js:', () => { prepare.prepare.call(api, cordovaProject, { }, api); - expect(copySyncSpy).toHaveBeenCalledWith(srcManifestPathMock, manifestPathMock); + expect(cpSyncSpy).toHaveBeenCalledWith(srcManifestPathMock, manifestPathMock, { recursive: true }); expect(mergeXmlSpy).toHaveBeenCalled(); expect(updateIconsSpy).toHaveBeenCalled(); expect(updateSplashScreensSpy).toHaveBeenCalled(); @@ -666,12 +666,12 @@ describe('Testing prepare.js:', () => { const srcManifestPathMock = path.join(cordovaProject.locations.www, 'manifest.json'); - const copySyncSpy = jasmine.createSpy('copySync'); + const cpSyncSpy = jasmine.createSpy('cpSync'); prepare.__set__('fs', { existsSync: function (srcManifestPath) { return srcManifestPath !== srcManifestPathMock; }, - copySync: copySyncSpy, + cpSync: cpSyncSpy, readFileSync: function (filePath) { if (filePath === path.join('MOCK_PROJECT_ROOT', 'package.json')) { return defaultMockProjectPackageJson; @@ -1758,7 +1758,7 @@ describe('Testing prepare.js:', () => { describe('copyResources method', () => { let copyResources; - let fsCopySyncSpy; + let cpSyncSpy; let cordovaProject; beforeEach(() => { @@ -1767,13 +1767,13 @@ describe('Testing prepare.js:', () => { cordovaProject = Object.assign({}, cordovaProjectDefault); copyResources = prepare.__get__('copyResources'); - fsCopySyncSpy = jasmine.createSpy('copySync'); - prepare.__set__('fs', { copySync: fsCopySyncSpy }); + cpSyncSpy = jasmine.createSpy('cpSync'); + prepare.__set__('fs', { cpSync: cpSyncSpy }); }); it('should not copy as no resources provided.', () => { copyResources(cordovaProject.root, [{}]); - expect(fsCopySyncSpy).not.toHaveBeenCalled(); + expect(cpSyncSpy).not.toHaveBeenCalled(); }); it('should copy provided resources.', () => { @@ -1782,15 +1782,15 @@ describe('Testing prepare.js:', () => { { [path.join('res', 'electron', 'cordova.png')]: path.join(cordovaProject.root, 'www', 'img', 'icon.png') } ]); - expect(fsCopySyncSpy).toHaveBeenCalled(); + expect(cpSyncSpy).toHaveBeenCalled(); - const installerIconSrcPathTest = fsCopySyncSpy.calls.argsFor(0)[0]; - const installerIconDestPathTest = fsCopySyncSpy.calls.argsFor(0)[1]; + const installerIconSrcPathTest = cpSyncSpy.calls.argsFor(0)[0]; + const installerIconDestPathTest = cpSyncSpy.calls.argsFor(0)[1]; expect(installerIconSrcPathTest).toBe(path.join(cordovaProject.root, 'res', 'electron', 'cordova_512.png')); expect(installerIconDestPathTest).toBe(path.join(cordovaProject.root, 'build-res', 'installer.png')); - const appIconSrcPathTest = fsCopySyncSpy.calls.argsFor(1)[0]; - const appIconDestPathTest = fsCopySyncSpy.calls.argsFor(1)[1]; + const appIconSrcPathTest = cpSyncSpy.calls.argsFor(1)[0]; + const appIconDestPathTest = cpSyncSpy.calls.argsFor(1)[1]; expect(appIconSrcPathTest).toBe(path.join(cordovaProject.root, 'res', 'electron', 'cordova.png')); expect(appIconDestPathTest).toBe(path.join(cordovaProject.root, 'www', 'img', 'icon.png')); }); diff --git a/tests/spec/unit/lib/run.spec.js b/tests/spec/unit/lib/run.spec.js index 9ee027f..cc8ad52 100644 --- a/tests/spec/unit/lib/run.spec.js +++ b/tests/spec/unit/lib/run.spec.js @@ -18,7 +18,7 @@ */ const rewire = require('rewire'); -const path = require('path'); +const path = require('node:path'); const rootDir = path.resolve(__dirname, '../../../..'); diff --git a/tests/spec/unit/lib/util.spec.js b/tests/spec/unit/lib/util.spec.js index 556ebd0..d518801 100644 --- a/tests/spec/unit/lib/util.spec.js +++ b/tests/spec/unit/lib/util.spec.js @@ -17,7 +17,7 @@ under the License. */ -const path = require('path'); +const path = require('node:path'); const rootDir = path.resolve(__dirname, '../../../..');