From 254558e9de62fc7f0199d9f528bc2be967d5d15c Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Tue, 18 May 2021 11:58:35 +0200 Subject: [PATCH] chore(xo-server): convert to ESM --- .gitignore | 6 +- packages/xo-server/.babelrc.cjs | 5 + packages/xo-server/.babelrc.js | 1 - .../bin/{xo-server => xo-server.mjs} | 20 ++-- packages/xo-server/{index.js => index.mjs} | 2 +- packages/xo-server/package.json | 13 +-- .../src/{_XenStore.js => _XenStore.mjs} | 0 ..._asyncMapValues.js => _asyncMapValues.mjs} | 0 ...dJsonStream.js => _createNdJsonStream.mjs} | 2 +- .../src/{_ensureArray.js => _ensureArray.mjs} | 0 ...ureArray.spec.js => _ensureArray.spec.mjs} | 2 +- ...tworks.js => _extractIpFromVmNetworks.mjs} | 0 ...andleBackupLog.js => _handleBackupLog.mjs} | 0 ...bounceWithKey.js => _pDebounceWithKey.mjs} | 2 +- ...Key.spec.js => _pDebounceWithKey.spec.mjs} | 2 +- .../src/{_waitAll.js => _waitAll.mjs} | 0 .../xo-server/src/api/{acl.js => acl.mjs} | 0 .../src/api/{backup-ng.js => backup-ng.mjs} | 6 +- .../api/{cloud-config.js => cloud-config.mjs} | 0 .../api/{custom-field.js => custom-field.mjs} | 0 .../xo-server/src/api/{disk.js => disk.mjs} | 2 +- .../src/api/{docker.js => docker.mjs} | 0 .../xo-server/src/api/{group.js => group.mjs} | 0 .../xo-server/src/api/{host.js => host.mjs} | 0 .../src/api/{ip-pool.js => ip-pool.mjs} | 0 .../xo-server/src/api/{job.js => job.mjs} | 0 .../xo-server/src/api/{log.js => log.mjs} | 0 .../src/api/{message.js => message.mjs} | 0 ...metadata-backup.js => metadata-backup.mjs} | 0 .../src/api/{network.js => network.mjs} | 2 +- .../xo-server/src/api/{pbd.js => pbd.mjs} | 0 .../xo-server/src/api/{pif.js => pif.mjs} | 5 +- .../src/api/{plugin.js => plugin.mjs} | 0 .../xo-server/src/api/{pool.js => pool.mjs} | 0 .../xo-server/src/api/{proxy.js => proxy.mjs} | 0 .../src/api/{remote.js => remote.mjs} | 0 .../api/{resource-set.js => resource-set.mjs} | 0 .../xo-server/src/api/{role.js => role.mjs} | 0 .../src/api/{schedule.js => schedule.mjs} | 0 .../src/api/{server.js => server.mjs} | 0 .../src/api/{session.js => session.mjs} | 2 +- packages/xo-server/src/api/{sr.js => sr.mjs} | 8 +- .../src/api/{system.js => system.mjs} | 5 +- .../xo-server/src/api/{tag.js => tag.mjs} | 0 .../xo-server/src/api/{task.js => task.mjs} | 0 .../xo-server/src/api/{test.js => test.mjs} | 0 .../xo-server/src/api/{token.js => token.mjs} | 0 .../xo-server/src/api/{user.js => user.mjs} | 4 +- .../xo-server/src/api/{vbd.js => vbd.mjs} | 0 .../xo-server/src/api/{vdi.js => vdi.mjs} | 4 +- .../xo-server/src/api/{vif.js => vif.mjs} | 2 +- packages/xo-server/src/api/{vm.js => vm.mjs} | 5 +- packages/xo-server/src/api/{xo.js => xo.mjs} | 2 +- .../xo-server/src/api/{xosan.js => xosan.mjs} | 10 +- .../src/{collection.js => collection.mjs} | 4 +- .../src/collection/{redis.js => redis.mjs} | 9 +- .../src/{connection.js => connection.mjs} | 2 +- .../src/{fatfs-buffer.js => fatfs-buffer.mjs} | 2 +- .../src/{glob-matcher.js => glob-matcher.mjs} | 4 +- .../xo-server/src/{index.js => index.mjs} | 106 ++++++++++-------- .../src/{logs-cli.js => logs-cli.mjs} | 9 +- packages/xo-server/src/{math.js => math.mjs} | 0 .../src/{math.spec.js => math.spec.mjs} | 6 +- .../xo-server/src/{model.js => model.mjs} | 2 +- .../xo-server/src/models/{acl.js => acl.mjs} | 6 +- .../src/models/{group.js => group.mjs} | 8 +- ...plugin-metadata.js => plugin-metadata.mjs} | 6 +- .../src/models/{remote.js => remote.mjs} | 8 +- .../src/models/{server.js => server.mjs} | 8 +- .../src/models/{token.js => token.mjs} | 4 +- .../src/models/{user.js => user.mjs} | 6 +- .../src/models/{utils.js => utils.mjs} | 0 .../xo-server/src/{patch.js => patch.mjs} | 0 .../{proxy-console.js => proxy-console.mjs} | 0 ...account-cli.js => recover-account-cli.mjs} | 6 +- .../xo-server/src/schemas/{acl.js => acl.mjs} | 0 .../xo-server/src/schemas/{job.js => job.mjs} | 0 .../xo-server/src/schemas/{log.js => log.mjs} | 0 .../log/{jobCallEnd.js => jobCallEnd.mjs} | 0 .../log/{jobCallStart.js => jobCallStart.mjs} | 0 .../src/schemas/log/{jobEnd.js => jobEnd.mjs} | 0 .../schemas/log/{jobStart.js => jobStart.mjs} | 0 .../schemas/log/{taskEnd.js => taskEnd.mjs} | 0 .../schemas/log/{taskInfo.js => taskInfo.mjs} | 0 .../log/{taskStart.js => taskStart.mjs} | 0 .../log/{taskWarning.js => taskWarning.mjs} | 0 .../src/schemas/{plugin.js => plugin.mjs} | 0 .../src/schemas/{user.js => user.mjs} | 0 ...nsitive-values.js => sensitive-values.mjs} | 0 ...uffer.js => stream-to-existing-buffer.mjs} | 0 ....js => stream-to-existing-buffer.spec.mjs} | 6 +- .../xo-server/src/{utils.js => utils.mjs} | 0 .../src/{utils.spec.js => utils.spec.mjs} | 2 +- ...-object-to-xo.js => xapi-object-to-xo.mjs} | 12 +- .../src/{xapi-stats.js => xapi-stats.mjs} | 17 ++- .../src/xapi/{index.js => index.mjs} | 45 +++++--- .../src/xapi/mixins/{gpu.js => gpu.mjs} | 0 .../mixins/{networking.js => networking.mjs} | 2 +- .../xapi/mixins/{patching.js => patching.mjs} | 15 ++- .../src/xapi/mixins/{pool.js => pool.mjs} | 0 .../xapi/mixins/{storage.js => storage.mjs} | 4 +- .../src/xapi/mixins/{vm.js => vm.mjs} | 13 ++- ...-template.js => other-config-template.mjs} | 0 .../src/xapi/{utils.js => utils.mjs} | 6 +- .../src/xo-mixins/{acls.js => acls.mjs} | 8 +- .../src/xo-mixins/{api.js => api.mjs} | 8 +- .../{authentication.js => authentication.mjs} | 4 +- ...backups-ng-logs.js => backups-ng-logs.mjs} | 7 +- .../backups-ng/{index.js => index.mjs} | 11 +- ...-adapter.js => backups-remote-adapter.mjs} | 0 .../{cloud-configs.js => cloud-configs.mjs} | 4 +- ...ig-management.js => config-management.mjs} | 2 +- ...file-restore-ng.js => file-restore-ng.mjs} | 0 .../src/xo-mixins/{http.js => http.mjs} | 0 .../xo-mixins/{ip-pools.js => ip-pools.mjs} | 4 +- .../{execute-call.js => execute-call.mjs} | 9 +- ...ute-call.spec.js => execute-call.spec.mjs} | 4 +- .../xo-mixins/jobs/{index.js => index.mjs} | 8 +- .../xo-mixins/logs/{index.js => index.mjs} | 2 +- .../loggers/{abstract.js => abstract.mjs} | 0 .../logs/loggers/{leveldb.js => leveldb.mjs} | 4 +- ...tadata-backups.js => metadata-backups.mjs} | 8 +- .../src/xo-mixins/{patches.js => patches.mjs} | 2 +- .../src/xo-mixins/{plugins.js => plugins.mjs} | 4 +- .../src/xo-mixins/{pool.js => pool.mjs} | 10 +- .../src/xo-mixins/{proxies.js => proxies.mjs} | 15 ++- .../src/xo-mixins/{remotes.js => remotes.mjs} | 8 +- .../{resource-sets.js => resource-sets.mjs} | 13 ++- .../{scheduling.js => scheduling.mjs} | 6 +- .../src/xo-mixins/{store.js => store.mjs} | 4 +- .../xo-mixins/{subjects.js => subjects.mjs} | 10 +- .../{xen-servers.js => xen-servers.mjs} | 14 +-- packages/xo-server/src/{xo.js => xo.mjs} | 14 ++- yarn.lock | 19 ++++ 134 files changed, 371 insertions(+), 261 deletions(-) create mode 100644 packages/xo-server/.babelrc.cjs delete mode 100644 packages/xo-server/.babelrc.js rename packages/xo-server/bin/{xo-server => xo-server.mjs} (64%) rename packages/xo-server/{index.js => index.mjs} (84%) rename packages/xo-server/src/{_XenStore.js => _XenStore.mjs} (100%) rename packages/xo-server/src/{_asyncMapValues.js => _asyncMapValues.mjs} (100%) rename packages/xo-server/src/{_createNdJsonStream.js => _createNdJsonStream.mjs} (87%) rename packages/xo-server/src/{_ensureArray.js => _ensureArray.mjs} (100%) rename packages/xo-server/src/{_ensureArray.spec.js => _ensureArray.spec.mjs} (91%) rename packages/xo-server/src/{_extractIpFromVmNetworks.js => _extractIpFromVmNetworks.mjs} (100%) rename packages/xo-server/src/{_handleBackupLog.js => _handleBackupLog.mjs} (100%) rename packages/xo-server/src/{_pDebounceWithKey.js => _pDebounceWithKey.mjs} (97%) rename packages/xo-server/src/{_pDebounceWithKey.spec.js => _pDebounceWithKey.spec.mjs} (98%) rename packages/xo-server/src/{_waitAll.js => _waitAll.mjs} (100%) rename packages/xo-server/src/api/{acl.js => acl.mjs} (100%) rename packages/xo-server/src/api/{backup-ng.js => backup-ng.mjs} (97%) rename packages/xo-server/src/api/{cloud-config.js => cloud-config.mjs} (100%) rename packages/xo-server/src/api/{custom-field.js => custom-field.mjs} (100%) rename packages/xo-server/src/api/{disk.js => disk.mjs} (99%) rename packages/xo-server/src/api/{docker.js => docker.mjs} (100%) rename packages/xo-server/src/api/{group.js => group.mjs} (100%) rename packages/xo-server/src/api/{host.js => host.mjs} (100%) rename packages/xo-server/src/api/{ip-pool.js => ip-pool.mjs} (100%) rename packages/xo-server/src/api/{job.js => job.mjs} (100%) rename packages/xo-server/src/api/{log.js => log.mjs} (100%) rename packages/xo-server/src/api/{message.js => message.mjs} (100%) rename packages/xo-server/src/api/{metadata-backup.js => metadata-backup.mjs} (100%) rename packages/xo-server/src/api/{network.js => network.mjs} (98%) rename packages/xo-server/src/api/{pbd.js => pbd.mjs} (100%) rename packages/xo-server/src/api/{pif.js => pif.mjs} (97%) rename packages/xo-server/src/api/{plugin.js => plugin.mjs} (100%) rename packages/xo-server/src/api/{pool.js => pool.mjs} (100%) rename packages/xo-server/src/api/{proxy.js => proxy.mjs} (100%) rename packages/xo-server/src/api/{remote.js => remote.mjs} (100%) rename packages/xo-server/src/api/{resource-set.js => resource-set.mjs} (100%) rename packages/xo-server/src/api/{role.js => role.mjs} (100%) rename packages/xo-server/src/api/{schedule.js => schedule.mjs} (100%) rename packages/xo-server/src/api/{server.js => server.mjs} (100%) rename packages/xo-server/src/api/{session.js => session.mjs} (97%) rename packages/xo-server/src/api/{sr.js => sr.mjs} (99%) rename packages/xo-server/src/api/{system.js => system.mjs} (94%) rename packages/xo-server/src/api/{tag.js => tag.mjs} (100%) rename packages/xo-server/src/api/{task.js => task.mjs} (100%) rename packages/xo-server/src/api/{test.js => test.mjs} (100%) rename packages/xo-server/src/api/{token.js => token.mjs} (100%) rename packages/xo-server/src/api/{user.js => user.mjs} (97%) rename packages/xo-server/src/api/{vbd.js => vbd.mjs} (100%) rename packages/xo-server/src/api/{vdi.js => vdi.mjs} (97%) rename packages/xo-server/src/api/{vif.js => vif.mjs} (99%) rename packages/xo-server/src/api/{vm.js => vm.mjs} (99%) rename packages/xo-server/src/api/{xo.js => xo.mjs} (97%) rename packages/xo-server/src/api/{xosan.js => xosan.mjs} (99%) rename packages/xo-server/src/{collection.js => collection.mjs} (97%) rename packages/xo-server/src/collection/{redis.js => redis.mjs} (95%) rename packages/xo-server/src/{connection.js => connection.mjs} (96%) rename packages/xo-server/src/{fatfs-buffer.js => fatfs-buffer.mjs} (99%) rename packages/xo-server/src/{glob-matcher.js => glob-matcher.mjs} (92%) rename packages/xo-server/src/{index.js => index.mjs} (89%) rename packages/xo-server/src/{logs-cli.js => logs-cli.mjs} (96%) rename packages/xo-server/src/{math.js => math.mjs} (100%) rename packages/xo-server/src/{math.spec.js => math.spec.mjs} (94%) rename packages/xo-server/src/{model.js => model.mjs} (96%) rename packages/xo-server/src/models/{acl.js => acl.mjs} (92%) rename packages/xo-server/src/models/{group.js => group.mjs} (83%) rename packages/xo-server/src/models/{plugin-metadata.js => plugin-metadata.mjs} (92%) rename packages/xo-server/src/models/{remote.js => remote.mjs} (81%) rename packages/xo-server/src/models/{server.js => server.mjs} (88%) rename packages/xo-server/src/models/{token.js => token.mjs} (73%) rename packages/xo-server/src/models/{user.js => user.mjs} (92%) rename packages/xo-server/src/models/{utils.js => utils.mjs} (100%) rename packages/xo-server/src/{patch.js => patch.mjs} (100%) rename packages/xo-server/src/{proxy-console.js => proxy-console.mjs} (100%) rename packages/xo-server/src/{recover-account-cli.js => recover-account-cli.mjs} (90%) rename packages/xo-server/src/schemas/{acl.js => acl.mjs} (100%) rename packages/xo-server/src/schemas/{job.js => job.mjs} (100%) rename packages/xo-server/src/schemas/{log.js => log.mjs} (100%) rename packages/xo-server/src/schemas/log/{jobCallEnd.js => jobCallEnd.mjs} (100%) rename packages/xo-server/src/schemas/log/{jobCallStart.js => jobCallStart.mjs} (100%) rename packages/xo-server/src/schemas/log/{jobEnd.js => jobEnd.mjs} (100%) rename packages/xo-server/src/schemas/log/{jobStart.js => jobStart.mjs} (100%) rename packages/xo-server/src/schemas/log/{taskEnd.js => taskEnd.mjs} (100%) rename packages/xo-server/src/schemas/log/{taskInfo.js => taskInfo.mjs} (100%) rename packages/xo-server/src/schemas/log/{taskStart.js => taskStart.mjs} (100%) rename packages/xo-server/src/schemas/log/{taskWarning.js => taskWarning.mjs} (100%) rename packages/xo-server/src/schemas/{plugin.js => plugin.mjs} (100%) rename packages/xo-server/src/schemas/{user.js => user.mjs} (100%) rename packages/xo-server/src/{sensitive-values.js => sensitive-values.mjs} (100%) rename packages/xo-server/src/{stream-to-existing-buffer.js => stream-to-existing-buffer.mjs} (100%) rename packages/xo-server/src/{stream-to-existing-buffer.spec.js => stream-to-existing-buffer.spec.mjs} (78%) rename packages/xo-server/src/{utils.js => utils.mjs} (100%) rename packages/xo-server/src/{utils.spec.js => utils.spec.mjs} (99%) rename packages/xo-server/src/{xapi-object-to-xo.js => xapi-object-to-xo.mjs} (99%) rename packages/xo-server/src/{xapi-stats.js => xapi-stats.mjs} (95%) rename packages/xo-server/src/xapi/{index.js => index.mjs} (98%) rename packages/xo-server/src/xapi/mixins/{gpu.js => gpu.mjs} (100%) rename packages/xo-server/src/xapi/mixins/{networking.js => networking.mjs} (97%) rename packages/xo-server/src/xapi/mixins/{patching.js => patching.mjs} (97%) rename packages/xo-server/src/xapi/mixins/{pool.js => pool.mjs} (100%) rename packages/xo-server/src/xapi/mixins/{storage.js => storage.mjs} (96%) rename packages/xo-server/src/xapi/mixins/{vm.js => vm.mjs} (97%) rename packages/xo-server/src/xapi/{other-config-template.js => other-config-template.mjs} (100%) rename packages/xo-server/src/xapi/{utils.js => utils.mjs} (98%) rename packages/xo-server/src/xo-mixins/{acls.js => acls.mjs} (95%) rename packages/xo-server/src/xo-mixins/{api.js => api.mjs} (98%) rename packages/xo-server/src/xo-mixins/{authentication.js => authentication.mjs} (98%) rename packages/xo-server/src/xo-mixins/{backups-ng-logs.js => backups-ng-logs.mjs} (96%) rename packages/xo-server/src/xo-mixins/backups-ng/{index.js => index.mjs} (98%) rename packages/xo-server/src/xo-mixins/{backups-remote-adapter.js => backups-remote-adapter.mjs} (100%) rename packages/xo-server/src/xo-mixins/{cloud-configs.js => cloud-configs.mjs} (93%) rename packages/xo-server/src/xo-mixins/{config-management.js => config-management.mjs} (97%) rename packages/xo-server/src/xo-mixins/{file-restore-ng.js => file-restore-ng.mjs} (100%) rename packages/xo-server/src/xo-mixins/{http.js => http.mjs} (100%) rename packages/xo-server/src/xo-mixins/{ip-pools.js => ip-pools.mjs} (98%) rename packages/xo-server/src/xo-mixins/jobs/{execute-call.js => execute-call.mjs} (91%) rename packages/xo-server/src/xo-mixins/jobs/{execute-call.spec.js => execute-call.spec.mjs} (96%) rename packages/xo-server/src/xo-mixins/jobs/{index.js => index.mjs} (97%) rename packages/xo-server/src/xo-mixins/logs/{index.js => index.mjs} (96%) rename packages/xo-server/src/xo-mixins/logs/loggers/{abstract.js => abstract.mjs} (100%) rename packages/xo-server/src/xo-mixins/logs/loggers/{leveldb.js => leveldb.mjs} (92%) rename packages/xo-server/src/xo-mixins/{metadata-backups.js => metadata-backups.mjs} (98%) rename packages/xo-server/src/xo-mixins/{patches.js => patches.mjs} (88%) rename packages/xo-server/src/xo-mixins/{plugins.js => plugins.mjs} (98%) rename packages/xo-server/src/xo-mixins/{pool.js => pool.mjs} (93%) rename packages/xo-server/src/xo-mixins/{proxies.js => proxies.mjs} (97%) rename packages/xo-server/src/xo-mixins/{remotes.js => remotes.mjs} (96%) rename packages/xo-server/src/xo-mixins/{resource-sets.js => resource-sets.mjs} (96%) rename packages/xo-server/src/xo-mixins/{scheduling.js => scheduling.mjs} (96%) rename packages/xo-server/src/xo-mixins/{store.js => store.mjs} (93%) rename packages/xo-server/src/xo-mixins/{subjects.js => subjects.mjs} (98%) rename packages/xo-server/src/xo-mixins/{xen-servers.js => xen-servers.mjs} (98%) rename packages/xo-server/src/{xo.js => xo.mjs} (95%) diff --git a/.gitignore b/.gitignore index 1502af501..f4ddaca55 100644 --- a/.gitignore +++ b/.gitignore @@ -19,9 +19,9 @@ /packages/xen-api/plot.dat /packages/xo-server/.xo-server.* -/packages/xo-server/src/api/index.js -/packages/xo-server/src/xapi/mixins/index.js -/packages/xo-server/src/xo-mixins/index.js +/packages/xo-server/src/api/index.mjs +/packages/xo-server/src/xapi/mixins/index.mjs +/packages/xo-server/src/xo-mixins/index.mjs /packages/xo-server-auth-ldap/ldap.cache.conf diff --git a/packages/xo-server/.babelrc.cjs b/packages/xo-server/.babelrc.cjs new file mode 100644 index 000000000..e29f3bce3 --- /dev/null +++ b/packages/xo-server/.babelrc.cjs @@ -0,0 +1,5 @@ +module.exports = require('../../@xen-orchestra/babel-config')(require('./package.json'), { + '@babel/preset-env': { + modules: false, + }, +}) diff --git a/packages/xo-server/.babelrc.js b/packages/xo-server/.babelrc.js deleted file mode 100644 index 21d371d72..000000000 --- a/packages/xo-server/.babelrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../../@xen-orchestra/babel-config')(require('./package.json')) diff --git a/packages/xo-server/bin/xo-server b/packages/xo-server/bin/xo-server.mjs similarity index 64% rename from packages/xo-server/bin/xo-server rename to packages/xo-server/bin/xo-server.mjs index f83d09b59..bc13c847d 100755 --- a/packages/xo-server/bin/xo-server +++ b/packages/xo-server/bin/xo-server.mjs @@ -1,6 +1,12 @@ #!/usr/bin/env node -'use strict' +import * as SourceMapSupport from 'source-map-support' +import Bluebird from 'bluebird' +import execPromise from 'exec-promise' +import { catchGlobalErrors } from '@xen-orchestra/log/configure.js' +import { createLogger } from '@xen-orchestra/log' + +import boostrap from '../index.mjs' // =================================================================== @@ -11,22 +17,20 @@ if (process.env.NODE_ENV === undefined) { // Better stack traces if possible. try { - require('source-map-support').install({ + SourceMapSupport.install({ handleUncaughtExceptions: false, }) } catch (_) {} -// Use Bluebird for all promises as it provides better performance and -// less memory usage. -const Bluebird = require('bluebird') - // Enable `async_hooks` because it's used by `@xen-orchestra/backups/Task` via `node-zone` // // See: http://bluebirdjs.com/docs/api/promise.config.html#async-hooks Bluebird.config({ asyncHooks: true }) +// Use Bluebird for all promises as it provides better performance and +// less memory usage. global.Promise = Bluebird -require('@xen-orchestra/log/configure').catchGlobalErrors(require('@xen-orchestra/log').default('xo:xo-server')) +catchGlobalErrors(createLogger('xo:xo-server')) -require('exec-promise')(require('../')) +execPromise(boostrap) diff --git a/packages/xo-server/index.js b/packages/xo-server/index.mjs similarity index 84% rename from packages/xo-server/index.js rename to packages/xo-server/index.mjs index 147059fcc..231e3ad64 100644 --- a/packages/xo-server/index.js +++ b/packages/xo-server/index.mjs @@ -8,4 +8,4 @@ if (process.env.DEBUG === undefined) { } // Import the real main module. -module.exports = require('./dist').default +export { default } from './dist/index.mjs' diff --git a/packages/xo-server/package.json b/packages/xo-server/package.json index d6e84a98c..edc4e6a43 100644 --- a/packages/xo-server/package.json +++ b/packages/xo-server/package.json @@ -22,7 +22,7 @@ "bin": "bin" }, "engines": { - "node": ">=11" + "node": ">=14.13" }, "dependencies": { "@iarna/toml": "^2.2.1", @@ -58,7 +58,7 @@ "cookie": "^0.4.0", "cookie-parser": "^1.4.3", "d3-time-format": "^3.0.0", - "decorator-synchronized": "^0.5.0", + "decorator-synchronized": "^0.6.0", "deptree": "^1.0.0", "exec-promise": "^0.7.0", "execa": "^5.0.0", @@ -142,17 +142,16 @@ "@babel/plugin-proposal-pipeline-operator": "^7.0.0", "@babel/plugin-proposal-throw-expressions": "^7.0.0", "@babel/preset-env": "^7.0.0", - "babel-plugin-lodash": "^3.3.2", "babel-plugin-transform-dev": "^2.0.1", "cross-env": "^7.0.2", - "index-modules": "^0.3.0", + "index-modules": "^0.4.2", "rimraf": "^3.0.0" }, "scripts": { - "build": "cross-env NODE_ENV=production babel --source-maps --out-dir=dist/ src/", + "build": "cross-env NODE_ENV=production babel --keep-file-extension --source-maps --out-dir=dist/ src/", "clean": "rimraf dist/", - "dev": "cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/", - "prebuild": "index-modules src/api src/xapi/mixins src/xo-mixins && yarn run clean", + "dev": "cross-env NODE_ENV=development babel --watch --keep-file-extension --source-maps --out-dir=dist/ src/", + "prebuild": "index-modules --index-file index.mjs src/api src/xapi/mixins src/xo-mixins && yarn run clean", "predev": "yarn run prebuild", "prepublishOnly": "yarn run build", "start": "node bin/xo-server" diff --git a/packages/xo-server/src/_XenStore.js b/packages/xo-server/src/_XenStore.mjs similarity index 100% rename from packages/xo-server/src/_XenStore.js rename to packages/xo-server/src/_XenStore.mjs diff --git a/packages/xo-server/src/_asyncMapValues.js b/packages/xo-server/src/_asyncMapValues.mjs similarity index 100% rename from packages/xo-server/src/_asyncMapValues.js rename to packages/xo-server/src/_asyncMapValues.mjs diff --git a/packages/xo-server/src/_createNdJsonStream.js b/packages/xo-server/src/_createNdJsonStream.mjs similarity index 87% rename from packages/xo-server/src/_createNdJsonStream.js rename to packages/xo-server/src/_createNdJsonStream.mjs index 3a4cc5883..83b9be3e8 100644 --- a/packages/xo-server/src/_createNdJsonStream.js +++ b/packages/xo-server/src/_createNdJsonStream.mjs @@ -12,7 +12,7 @@ function* values(object) { * * @param {(Array|Object)} collection */ -module.exports = asyncIteratorToStream(function* (collection) { +export default asyncIteratorToStream(function* (collection) { for (const value of Array.isArray(collection) ? collection : values(collection)) { yield JSON.stringify(value) yield '\n' diff --git a/packages/xo-server/src/_ensureArray.js b/packages/xo-server/src/_ensureArray.mjs similarity index 100% rename from packages/xo-server/src/_ensureArray.js rename to packages/xo-server/src/_ensureArray.mjs diff --git a/packages/xo-server/src/_ensureArray.spec.js b/packages/xo-server/src/_ensureArray.spec.mjs similarity index 91% rename from packages/xo-server/src/_ensureArray.spec.js rename to packages/xo-server/src/_ensureArray.spec.mjs index 9ae13949d..8bde543b9 100644 --- a/packages/xo-server/src/_ensureArray.spec.js +++ b/packages/xo-server/src/_ensureArray.spec.mjs @@ -1,6 +1,6 @@ /* eslint-env jest */ -import ensureArray from './_ensureArray.js' +import ensureArray from './_ensureArray.mjs' describe('ensureArray()', function () { it('wrap the value in an array', function () { diff --git a/packages/xo-server/src/_extractIpFromVmNetworks.js b/packages/xo-server/src/_extractIpFromVmNetworks.mjs similarity index 100% rename from packages/xo-server/src/_extractIpFromVmNetworks.js rename to packages/xo-server/src/_extractIpFromVmNetworks.mjs diff --git a/packages/xo-server/src/_handleBackupLog.js b/packages/xo-server/src/_handleBackupLog.mjs similarity index 100% rename from packages/xo-server/src/_handleBackupLog.js rename to packages/xo-server/src/_handleBackupLog.mjs diff --git a/packages/xo-server/src/_pDebounceWithKey.js b/packages/xo-server/src/_pDebounceWithKey.mjs similarity index 97% rename from packages/xo-server/src/_pDebounceWithKey.js rename to packages/xo-server/src/_pDebounceWithKey.mjs index c753927a0..671a60b2e 100644 --- a/packages/xo-server/src/_pDebounceWithKey.js +++ b/packages/xo-server/src/_pDebounceWithKey.mjs @@ -1,6 +1,6 @@ import { MultiKeyMap } from '@vates/multi-key-map' -import ensureArray from './_ensureArray.js' +import ensureArray from './_ensureArray.mjs' function removeCacheEntry(cache, keys) { cache.delete(keys) diff --git a/packages/xo-server/src/_pDebounceWithKey.spec.js b/packages/xo-server/src/_pDebounceWithKey.spec.mjs similarity index 98% rename from packages/xo-server/src/_pDebounceWithKey.spec.js rename to packages/xo-server/src/_pDebounceWithKey.spec.mjs index fc1172670..b2cc369f0 100644 --- a/packages/xo-server/src/_pDebounceWithKey.spec.js +++ b/packages/xo-server/src/_pDebounceWithKey.spec.mjs @@ -1,6 +1,6 @@ /* eslint-env jest */ -import { debounceWithKey, REMOVE_CACHE_ENTRY } from './_pDebounceWithKey.js' +import { debounceWithKey, REMOVE_CACHE_ENTRY } from './_pDebounceWithKey.mjs' describe('REMOVE_CACHE_ENTRY', () => { it('clears the cache', async () => { diff --git a/packages/xo-server/src/_waitAll.js b/packages/xo-server/src/_waitAll.mjs similarity index 100% rename from packages/xo-server/src/_waitAll.js rename to packages/xo-server/src/_waitAll.mjs diff --git a/packages/xo-server/src/api/acl.js b/packages/xo-server/src/api/acl.mjs similarity index 100% rename from packages/xo-server/src/api/acl.js rename to packages/xo-server/src/api/acl.mjs diff --git a/packages/xo-server/src/api/backup-ng.js b/packages/xo-server/src/api/backup-ng.mjs similarity index 97% rename from packages/xo-server/src/api/backup-ng.js rename to packages/xo-server/src/api/backup-ng.mjs index d97882631..0373e04ad 100644 --- a/packages/xo-server/src/api/backup-ng.js +++ b/packages/xo-server/src/api/backup-ng.mjs @@ -2,9 +2,9 @@ import { basename } from 'path' import { fromCallback } from 'promise-toolbox' import { pipeline } from 'readable-stream' -import createNdJsonStream from '../_createNdJsonStream.js' -import { REMOVE_CACHE_ENTRY } from '../_pDebounceWithKey.js' -import { safeDateFormat } from '../utils.js' +import createNdJsonStream from '../_createNdJsonStream.mjs' +import { REMOVE_CACHE_ENTRY } from '../_pDebounceWithKey.mjs' +import { safeDateFormat } from '../utils.mjs' export function createJob({ schedules, ...job }) { job.userId = this.user.id diff --git a/packages/xo-server/src/api/cloud-config.js b/packages/xo-server/src/api/cloud-config.mjs similarity index 100% rename from packages/xo-server/src/api/cloud-config.js rename to packages/xo-server/src/api/cloud-config.mjs diff --git a/packages/xo-server/src/api/custom-field.js b/packages/xo-server/src/api/custom-field.mjs similarity index 100% rename from packages/xo-server/src/api/custom-field.js rename to packages/xo-server/src/api/custom-field.mjs diff --git a/packages/xo-server/src/api/disk.js b/packages/xo-server/src/api/disk.mjs similarity index 99% rename from packages/xo-server/src/api/disk.js rename to packages/xo-server/src/api/disk.mjs index 3b5e48479..fa6c13ccc 100644 --- a/packages/xo-server/src/api/disk.js +++ b/packages/xo-server/src/api/disk.mjs @@ -8,7 +8,7 @@ import { noSuchObject } from 'xo-common/api-errors.js' import { peekFooterFromVhdStream } from 'vhd-lib' import { vmdkToVhd } from 'xo-vmdk-to-vhd' -import { VDI_FORMAT_VHD } from '../xapi/index.js' +import { VDI_FORMAT_VHD } from '../xapi/index.mjs' const log = createLogger('xo:disk') diff --git a/packages/xo-server/src/api/docker.js b/packages/xo-server/src/api/docker.mjs similarity index 100% rename from packages/xo-server/src/api/docker.js rename to packages/xo-server/src/api/docker.mjs diff --git a/packages/xo-server/src/api/group.js b/packages/xo-server/src/api/group.mjs similarity index 100% rename from packages/xo-server/src/api/group.js rename to packages/xo-server/src/api/group.mjs diff --git a/packages/xo-server/src/api/host.js b/packages/xo-server/src/api/host.mjs similarity index 100% rename from packages/xo-server/src/api/host.js rename to packages/xo-server/src/api/host.mjs diff --git a/packages/xo-server/src/api/ip-pool.js b/packages/xo-server/src/api/ip-pool.mjs similarity index 100% rename from packages/xo-server/src/api/ip-pool.js rename to packages/xo-server/src/api/ip-pool.mjs diff --git a/packages/xo-server/src/api/job.js b/packages/xo-server/src/api/job.mjs similarity index 100% rename from packages/xo-server/src/api/job.js rename to packages/xo-server/src/api/job.mjs diff --git a/packages/xo-server/src/api/log.js b/packages/xo-server/src/api/log.mjs similarity index 100% rename from packages/xo-server/src/api/log.js rename to packages/xo-server/src/api/log.mjs diff --git a/packages/xo-server/src/api/message.js b/packages/xo-server/src/api/message.mjs similarity index 100% rename from packages/xo-server/src/api/message.js rename to packages/xo-server/src/api/message.mjs diff --git a/packages/xo-server/src/api/metadata-backup.js b/packages/xo-server/src/api/metadata-backup.mjs similarity index 100% rename from packages/xo-server/src/api/metadata-backup.js rename to packages/xo-server/src/api/metadata-backup.mjs diff --git a/packages/xo-server/src/api/network.js b/packages/xo-server/src/api/network.mjs similarity index 98% rename from packages/xo-server/src/api/network.js rename to packages/xo-server/src/api/network.mjs index a0be31744..df75a5329 100644 --- a/packages/xo-server/src/api/network.js +++ b/packages/xo-server/src/api/network.mjs @@ -1,4 +1,4 @@ -import xapiObjectToXo from '../xapi-object-to-xo.js' +import xapiObjectToXo from '../xapi-object-to-xo.mjs' export function getBondModes() { return ['balance-slb', 'active-backup', 'lacp'] diff --git a/packages/xo-server/src/api/pbd.js b/packages/xo-server/src/api/pbd.mjs similarity index 100% rename from packages/xo-server/src/api/pbd.js rename to packages/xo-server/src/api/pbd.mjs diff --git a/packages/xo-server/src/api/pif.js b/packages/xo-server/src/api/pif.mjs similarity index 97% rename from packages/xo-server/src/api/pif.js rename to packages/xo-server/src/api/pif.mjs index fccf2d8ed..ac3b986d2 100644 --- a/packages/xo-server/src/api/pif.js +++ b/packages/xo-server/src/api/pif.mjs @@ -1,8 +1,9 @@ // TODO: too low level, move into host. -import { filter, find } from 'lodash' +import filter from 'lodash/filter.js' +import find from 'lodash/find.js' -import { IPV4_CONFIG_MODES, IPV6_CONFIG_MODES } from '../xapi/index.js' +import { IPV4_CONFIG_MODES, IPV6_CONFIG_MODES } from '../xapi/index.mjs' export function getIpv4ConfigurationModes() { return IPV4_CONFIG_MODES diff --git a/packages/xo-server/src/api/plugin.js b/packages/xo-server/src/api/plugin.mjs similarity index 100% rename from packages/xo-server/src/api/plugin.js rename to packages/xo-server/src/api/plugin.mjs diff --git a/packages/xo-server/src/api/pool.js b/packages/xo-server/src/api/pool.mjs similarity index 100% rename from packages/xo-server/src/api/pool.js rename to packages/xo-server/src/api/pool.mjs diff --git a/packages/xo-server/src/api/proxy.js b/packages/xo-server/src/api/proxy.mjs similarity index 100% rename from packages/xo-server/src/api/proxy.js rename to packages/xo-server/src/api/proxy.mjs diff --git a/packages/xo-server/src/api/remote.js b/packages/xo-server/src/api/remote.mjs similarity index 100% rename from packages/xo-server/src/api/remote.js rename to packages/xo-server/src/api/remote.mjs diff --git a/packages/xo-server/src/api/resource-set.js b/packages/xo-server/src/api/resource-set.mjs similarity index 100% rename from packages/xo-server/src/api/resource-set.js rename to packages/xo-server/src/api/resource-set.mjs diff --git a/packages/xo-server/src/api/role.js b/packages/xo-server/src/api/role.mjs similarity index 100% rename from packages/xo-server/src/api/role.js rename to packages/xo-server/src/api/role.mjs diff --git a/packages/xo-server/src/api/schedule.js b/packages/xo-server/src/api/schedule.mjs similarity index 100% rename from packages/xo-server/src/api/schedule.js rename to packages/xo-server/src/api/schedule.mjs diff --git a/packages/xo-server/src/api/server.js b/packages/xo-server/src/api/server.mjs similarity index 100% rename from packages/xo-server/src/api/server.js rename to packages/xo-server/src/api/server.mjs diff --git a/packages/xo-server/src/api/session.js b/packages/xo-server/src/api/session.mjs similarity index 97% rename from packages/xo-server/src/api/session.js rename to packages/xo-server/src/api/session.mjs index 9b0c24e6d..dabcef24c 100644 --- a/packages/xo-server/src/api/session.js +++ b/packages/xo-server/src/api/session.mjs @@ -1,6 +1,6 @@ import { deprecate } from 'util' -import { getUserPublicProperties } from '../utils.js' +import { getUserPublicProperties } from '../utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/api/sr.js b/packages/xo-server/src/api/sr.mjs similarity index 99% rename from packages/xo-server/src/api/sr.js rename to packages/xo-server/src/api/sr.mjs index 6be4c9fac..dd2c793e5 100644 --- a/packages/xo-server/src/api/sr.js +++ b/packages/xo-server/src/api/sr.mjs @@ -1,9 +1,9 @@ import asyncMapSettled from '@xen-orchestra/async-map/legacy.js' -import { some } from 'lodash' +import some from 'lodash/some.js' -import ensureArray from '../_ensureArray.js' -import { asInteger } from '../xapi/utils.js' -import { forEach, parseXml } from '../utils.js' +import ensureArray from '../_ensureArray.mjs' +import { asInteger } from '../xapi/utils.mjs' +import { forEach, parseXml } from '../utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/api/system.js b/packages/xo-server/src/api/system.mjs similarity index 94% rename from packages/xo-server/src/api/system.js rename to packages/xo-server/src/api/system.mjs index 775b9cc03..6bd017c02 100644 --- a/packages/xo-server/src/api/system.js +++ b/packages/xo-server/src/api/system.mjs @@ -3,7 +3,6 @@ import getKeys from 'lodash/keys.js' import moment from 'moment-timezone' import { noSuchObject } from 'xo-common/api-errors.js' -import { version as xoServerVersion } from '../../package.json' // =================================================================== @@ -30,7 +29,9 @@ getServerTimezone.description = 'return the timezone server' // ------------------------------------------------------------------- -export const getServerVersion = () => xoServerVersion +export function getServerVersion() { + return this.version +} getServerVersion.description = 'return the version of xo-server' getServerVersion.permission = null // user does not need to be authenticated diff --git a/packages/xo-server/src/api/tag.js b/packages/xo-server/src/api/tag.mjs similarity index 100% rename from packages/xo-server/src/api/tag.js rename to packages/xo-server/src/api/tag.mjs diff --git a/packages/xo-server/src/api/task.js b/packages/xo-server/src/api/task.mjs similarity index 100% rename from packages/xo-server/src/api/task.js rename to packages/xo-server/src/api/task.mjs diff --git a/packages/xo-server/src/api/test.js b/packages/xo-server/src/api/test.mjs similarity index 100% rename from packages/xo-server/src/api/test.js rename to packages/xo-server/src/api/test.mjs diff --git a/packages/xo-server/src/api/token.js b/packages/xo-server/src/api/token.mjs similarity index 100% rename from packages/xo-server/src/api/token.js rename to packages/xo-server/src/api/token.mjs diff --git a/packages/xo-server/src/api/user.js b/packages/xo-server/src/api/user.mjs similarity index 97% rename from packages/xo-server/src/api/user.js rename to packages/xo-server/src/api/user.mjs index a1c721153..2aae13c4a 100644 --- a/packages/xo-server/src/api/user.js +++ b/packages/xo-server/src/api/user.mjs @@ -1,6 +1,6 @@ +import isEmpty from 'lodash/isEmpty.js' import { forbiddenOperation, invalidParameters } from 'xo-common/api-errors.js' -import { isEmpty } from 'lodash' -import { getUserPublicProperties } from '../utils.js' +import { getUserPublicProperties } from '../utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/api/vbd.js b/packages/xo-server/src/api/vbd.mjs similarity index 100% rename from packages/xo-server/src/api/vbd.js rename to packages/xo-server/src/api/vbd.mjs diff --git a/packages/xo-server/src/api/vdi.js b/packages/xo-server/src/api/vdi.mjs similarity index 97% rename from packages/xo-server/src/api/vdi.js rename to packages/xo-server/src/api/vdi.mjs index 20f339195..e72609eae 100644 --- a/packages/xo-server/src/api/vdi.js +++ b/packages/xo-server/src/api/vdi.mjs @@ -1,10 +1,10 @@ // FIXME: rename to disk.* +import reduce from 'lodash/reduce.js' import { defer } from 'golike-defer' import { invalidParameters } from 'xo-common/api-errors.js' -import { reduce } from 'lodash' -import { parseSize } from '../utils.js' +import { parseSize } from '../utils.mjs' // ==================================================================== diff --git a/packages/xo-server/src/api/vif.js b/packages/xo-server/src/api/vif.mjs similarity index 99% rename from packages/xo-server/src/api/vif.js rename to packages/xo-server/src/api/vif.mjs index cbd6b8933..1d301051a 100644 --- a/packages/xo-server/src/api/vif.js +++ b/packages/xo-server/src/api/vif.mjs @@ -1,6 +1,6 @@ import { ignoreErrors } from 'promise-toolbox' -import { diffItems } from '../utils.js' +import { diffItems } from '../utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/api/vm.js b/packages/xo-server/src/api/vm.mjs similarity index 99% rename from packages/xo-server/src/api/vm.js rename to packages/xo-server/src/api/vm.mjs index a1eb3dbf0..6b89b2664 100644 --- a/packages/xo-server/src/api/vm.js +++ b/packages/xo-server/src/api/vm.mjs @@ -1,12 +1,13 @@ import * as multiparty from 'multiparty' +import assignWith from 'lodash/assignWith.js' import asyncMapSettled from '@xen-orchestra/async-map/legacy.js' +import concat from 'lodash/concat.js' import getStream from 'get-stream' import { createLogger } from '@xen-orchestra/log' import { defer } from 'golike-defer' import { FAIL_ON_QUEUE } from 'limit-concurrency-decorator' import { format } from 'json-rpc-peer' import { ignoreErrors } from 'promise-toolbox' -import { assignWith, concat } from 'lodash' import { forbiddenOperation, invalidParameters, @@ -15,7 +16,7 @@ import { unauthorized, } from 'xo-common/api-errors.js' -import { forEach, map, mapFilter, parseSize, safeDateFormat } from '../utils.js' +import { forEach, map, mapFilter, parseSize, safeDateFormat } from '../utils.mjs' const log = createLogger('xo:vm') diff --git a/packages/xo-server/src/api/xo.js b/packages/xo-server/src/api/xo.mjs similarity index 97% rename from packages/xo-server/src/api/xo.js rename to packages/xo-server/src/api/xo.mjs index 9f957de2c..9fde5fa17 100644 --- a/packages/xo-server/src/api/xo.js +++ b/packages/xo-server/src/api/xo.mjs @@ -2,7 +2,7 @@ import getStream from 'get-stream' import { fromCallback } from 'promise-toolbox' import { pipeline } from 'readable-stream' -import createNdJsonStream from '../_createNdJsonStream.js' +import createNdJsonStream from '../_createNdJsonStream.mjs' // =================================================================== diff --git a/packages/xo-server/src/api/xosan.js b/packages/xo-server/src/api/xosan.mjs similarity index 99% rename from packages/xo-server/src/api/xosan.js rename to packages/xo-server/src/api/xosan.mjs index 6e63d7ba9..b40f59615 100644 --- a/packages/xo-server/src/api/xosan.js +++ b/packages/xo-server/src/api/xosan.mjs @@ -1,17 +1,21 @@ import assert from 'assert' import asyncMapSettled from '@xen-orchestra/async-map/legacy.js' import execa from 'execa' +import filter from 'lodash/filter.js' +import find from 'lodash/find.js' import fs from 'fs-extra' +import includes from 'lodash/includes.js' import map from 'lodash/map.js' +import range from 'lodash/range.js' +import remove from 'lodash/remove.js' import { createLogger } from '@xen-orchestra/log' import { defer } from 'golike-defer' import { tap, delay } from 'promise-toolbox' import { invalidParameters } from 'xo-common/api-errors.js' -import { includes, remove, filter, find, range } from 'lodash' import { Ref } from 'xen-api' -import ensureArray from '../_ensureArray.js' -import { parseXml } from '../utils.js' +import ensureArray from '../_ensureArray.mjs' +import { parseXml } from '../utils.mjs' const log = createLogger('xo:xosan') diff --git a/packages/xo-server/src/collection.js b/packages/xo-server/src/collection.mjs similarity index 97% rename from packages/xo-server/src/collection.js rename to packages/xo-server/src/collection.mjs index 0c7cd0273..eb29a1ce4 100644 --- a/packages/xo-server/src/collection.js +++ b/packages/xo-server/src/collection.mjs @@ -1,7 +1,7 @@ -import Model from './model.js' +import Model from './model.mjs' import { BaseError } from 'make-error' import { EventEmitter } from 'events' -import { isObject, map } from './utils.js' +import { isObject, map } from './utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/collection/redis.js b/packages/xo-server/src/collection/redis.mjs similarity index 95% rename from packages/xo-server/src/collection/redis.js rename to packages/xo-server/src/collection/redis.mjs index edf5ac71f..730bf18ca 100644 --- a/packages/xo-server/src/collection/redis.js +++ b/packages/xo-server/src/collection/redis.mjs @@ -1,10 +1,15 @@ import asyncMapSettled from '@xen-orchestra/async-map/legacy.js' +import difference from 'lodash/difference.js' +import filter from 'lodash/filter.js' +import forEach from 'lodash/forEach.js' +import getKeys from 'lodash/keys.js' +import isEmpty from 'lodash/isEmpty.js' +import map from 'lodash/map.js' import { createClient as createRedisClient } from 'redis' -import { difference, filter, forEach, isEmpty, keys as getKeys, map } from 'lodash' import { ignoreErrors, promisifyAll } from 'promise-toolbox' import { v4 as generateUuid } from 'uuid' -import Collection, { ModelAlreadyExists } from '../collection.js' +import Collection, { ModelAlreadyExists } from '../collection.mjs' // =================================================================== diff --git a/packages/xo-server/src/connection.js b/packages/xo-server/src/connection.mjs similarity index 96% rename from packages/xo-server/src/connection.js rename to packages/xo-server/src/connection.mjs index 69b0cf9cb..57066ffc7 100644 --- a/packages/xo-server/src/connection.js +++ b/packages/xo-server/src/connection.mjs @@ -1,6 +1,6 @@ import { EventEmitter } from 'events' -import { noop } from './utils.js' +import { noop } from './utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/fatfs-buffer.js b/packages/xo-server/src/fatfs-buffer.mjs similarity index 99% rename from packages/xo-server/src/fatfs-buffer.js rename to packages/xo-server/src/fatfs-buffer.mjs index b36d8f8af..4fc58f4e4 100644 --- a/packages/xo-server/src/fatfs-buffer.js +++ b/packages/xo-server/src/fatfs-buffer.mjs @@ -4,7 +4,7 @@ // // ```js // import fatfs from 'fatfs' -// import fatfsBuffer, { init as fatfsBufferInit } from './fatfs-buffer.js' +// import fatfsBuffer, { init as fatfsBufferInit } from './fatfs-buffer.mjs' // // const buffer = fatfsBufferinit() // diff --git a/packages/xo-server/src/glob-matcher.js b/packages/xo-server/src/glob-matcher.mjs similarity index 92% rename from packages/xo-server/src/glob-matcher.js rename to packages/xo-server/src/glob-matcher.mjs index 943561ab2..39cc22969 100644 --- a/packages/xo-server/src/glob-matcher.js +++ b/packages/xo-server/src/glob-matcher.mjs @@ -1,8 +1,8 @@ // See: https://gist.github.com/julien-f/5b9a3537eb82a34b04e2 -const matcher = require('micromatch').matcher +import { matcher } from 'micromatch' -module.exports = function globMatcher(patterns, opts) { +export default function globMatcher(patterns, opts) { if (!Array.isArray(patterns)) { if (patterns[0] === '!') { const m = matcher(patterns.slice(1), opts) diff --git a/packages/xo-server/src/index.js b/packages/xo-server/src/index.mjs similarity index 89% rename from packages/xo-server/src/index.js rename to packages/xo-server/src/index.mjs index f10c67299..d30cf9bcc 100644 --- a/packages/xo-server/src/index.js +++ b/packages/xo-server/src/index.mjs @@ -2,15 +2,21 @@ import appConf from 'app-conf' import assert from 'assert' import authenticator from 'otplib/authenticator.js' import blocked from 'blocked-at' +import Bluebird from 'bluebird' import compression from 'compression' import createExpress from 'express' import crypto from 'crypto' +import forOwn from 'lodash/forOwn.js' import has from 'lodash/has.js' import helmet from 'helmet' +import httpProxy from 'http-proxy' import includes from 'lodash/includes.js' +import map from 'lodash/map.js' import memoryStoreFactory from 'memorystore' +import merge from 'lodash/merge.js' import ms from 'ms' -import proxyConsole from './proxy-console.js' +import once from 'lodash/once.js' +import proxyConsole from './proxy-console.mjs' import pw from 'pw' import serveStatic from 'serve-static' import stoppable from 'stoppable' @@ -18,23 +24,21 @@ import WebServer from 'http-server-plus' import WebSocket from 'ws' import xdg from 'xdg-basedir' import { createLogger } from '@xen-orchestra/log' -import { forOwn, map, merge, once } from 'lodash' import { genSelfSignedCert } from '@xen-orchestra/self-signed' import { parseDuration } from '@vates/parse-duration' import { URL } from 'url' import { compile as compilePug } from 'pug' -import { createServer as createProxyServer } from 'http-proxy' import { fromCallback, fromEvent } from 'promise-toolbox' import { ifDef } from '@xen-orchestra/defined' import { join as joinPath } from 'path' -import JsonRpcPeer from 'json-rpc-peer' +import fse from 'fs-extra' import { invalidCredentials } from 'xo-common/api-errors.js' -import { ensureDir, outputFile, readdir, readFile } from 'fs-extra' +import { Peer as JsonRpcPeer } from 'json-rpc-peer' -import ensureArray from './_ensureArray.js' -import Xo from './xo.js' +import ensureArray from './_ensureArray.mjs' +import Xo from './xo.mjs' import bodyParser from 'body-parser' import connectFlash from 'connect-flash' @@ -46,7 +50,15 @@ import { Strategy as LocalStrategy } from 'passport-local' import transportConsole from '@xen-orchestra/log/transports/console.js' import { configure } from '@xen-orchestra/log/configure.js' -import { generateToken } from './utils.js' +import { generateToken } from './utils.mjs' + +// =================================================================== + +const APP_DIR = new URL('..', import.meta.url).pathname +const [APP_NAME, APP_VERSION] = (() => { + const { name, version } = JSON.parse(fse.readFileSync(new URL('../package.json', import.meta.url))) + return [name, version] +})() // =================================================================== @@ -67,9 +79,6 @@ const log = createLogger('xo:main') // =================================================================== -const APP_DIR = joinPath(__dirname, '..') -const APP_NAME = 'xo-server' - const DEPRECATED_ENTRIES = ['users', 'servers'] async function loadConfiguration() { @@ -93,9 +102,9 @@ async function loadConfiguration() { const LOCAL_CONFIG_FILE = `${xdg.config}/${APP_NAME}/config.z-auto.json` async function updateLocalConfig(diff) { // TODO lock file - const localConfig = await readFile(LOCAL_CONFIG_FILE).then(JSON.parse, () => ({})) + const localConfig = await fse.readFile(LOCAL_CONFIG_FILE).then(JSON.parse, () => ({})) merge(localConfig, diff) - await outputFile(LOCAL_CONFIG_FILE, JSON.stringify(localConfig), { + await fse.outputFile(LOCAL_CONFIG_FILE, JSON.stringify(localConfig), { mode: 0o600, }) } @@ -160,7 +169,7 @@ async function setUpPassport(express, xo, { authentication: authCfg, http: { coo } // Registers the sign in form. - const signInPage = compilePug(await readFile(joinPath(__dirname, '..', 'signin.pug'))) + const signInPage = compilePug(await fse.readFile(new URL('../signin.pug', import.meta.url))) express.get('/signin', (req, res, next) => { res.send( signInPage({ @@ -282,14 +291,10 @@ async function setUpPassport(express, xo, { authentication: authCfg, http: { coo // =================================================================== async function registerPlugin(pluginPath, pluginName) { - const plugin = require(pluginPath) - const { description, version = 'unknown' } = (() => { - try { - return require(pluginPath + '/package.json') - } catch (_) { - return {} - } - })() + const plugin = (await import(pluginPath)).default + const { description, version = 'unknown' } = await fse + .readFile(pluginPath + '/package.json') + .then(JSON.stringify, error => ({})) // Supports both “normal” CommonJS and Babel's ES2015 modules. let { default: factory = plugin, configurationSchema, configurationPresets, testSchema } = plugin @@ -304,7 +309,7 @@ async function registerPlugin(pluginPath, pluginName) { xo: this, getDataDir: () => { const dir = `${datadir}/${pluginName}` - return ensureDir(dir).then(() => dir) + return fse.ensureDir(dir).then(() => dir) }, }) : factory @@ -343,7 +348,7 @@ function registerPluginWrapper(pluginPath, pluginName) { } async function registerPluginsInPath(path, prefix) { - const files = await readdir(path).catch(error => { + const files = await fse.readdir(path).catch(error => { if (error.code === 'ENOENT') { return [] } @@ -361,7 +366,7 @@ async function registerPluginsInPath(path, prefix) { async function registerPlugins(xo) { await Promise.all( - [`${__dirname}/../node_modules`, '/usr/local/lib/node_modules'].map(path => + [new URL('../node_modules', import.meta.url).pathname, '/usr/local/lib/node_modules'].map(path => Promise.all([ registerPluginsInPath.call(xo, path, 'xo-server-'), registerPluginsInPath.call(xo, `${path}/@xen-orchestra`, 'server-'), @@ -389,7 +394,7 @@ async function makeWebServerListen( try { if (cert && key) { try { - ;[opts.cert, opts.key] = await Promise.all([readFile(cert), readFile(key)]) + ;[opts.cert, opts.key] = await Promise.all([fse.readFile(cert), fse.readFile(key)]) if (opts.key.includes('ENCRYPTED')) { opts.passphrase = await new Promise(resolve => { // eslint-disable-next-line no-console @@ -405,8 +410,8 @@ async function makeWebServerListen( const pems = await genSelfSignedCert() await Promise.all([ - outputFile(cert, pems.cert, { flag: 'wx', mode: 0o400 }), - outputFile(key, pems.key, { flag: 'wx', mode: 0o400 }), + fse.outputFile(cert, pems.cert, { flag: 'wx', mode: 0o400 }), + fse.outputFile(key, pems.key, { flag: 'wx', mode: 0o400 }), ]) log.info('new certificate generated', { cert, key }) opts.cert = pems.cert @@ -448,25 +453,27 @@ const setUpProxies = (express, opts, xo) => { return } - const proxy = createProxyServer({ - changeOrigin: true, - ignorePath: true, - xfwd: true, - }).on('error', (error, req, res) => { - // `res` can be either a `ServerResponse` or a `Socket` (which does not have - // `writeHead`) - if (!res.headersSent && typeof res.writeHead === 'function') { - res.writeHead(500, { 'content-type': 'text/plain' }) - res.write('There was a problem proxying this request.') - } - res.end() - - const { method, url } = req - log.error('failed to proxy request', { - error, - req: { method, url }, + const proxy = httpProxy + .createServer({ + changeOrigin: true, + ignorePath: true, + xfwd: true, + }) + .on('error', (error, req, res) => { + // `res` can be either a `ServerResponse` or a `Socket` (which does not have + // `writeHead`) + if (!res.headersSent && typeof res.writeHead === 'function') { + res.writeHead(500, { 'content-type': 'text/plain' }) + res.write('There was a problem proxying this request.') + } + res.end() + + const { method, url } = req + log.error('failed to proxy request', { + error, + req: { method, url }, + }) }) - }) // TODO: sort proxies by descending prefix length. @@ -673,15 +680,15 @@ const setUpConsoleProxy = (webServer, xo) => { // =================================================================== -const USAGE = (({ name, version }) => `Usage: ${name} [--safe-mode] +const USAGE = `Usage: ${APP_NAME} [--safe-mode] -${name} v${version}`)(require('../package.json')) +${APP_NAME} v${APP_VERSION}` // =================================================================== export default async function main(args) { // makes sure the global Promise has not been changed by a lib - assert(global.Promise === require('bluebird')) + assert(global.Promise === Bluebird) if (includes(args, '--help') || includes(args, '-h')) { return USAGE @@ -725,6 +732,7 @@ export default async function main(args) { const xo = new Xo({ appDir: APP_DIR, appName: APP_NAME, + appVersion: APP_VERSION, config, httpServer: webServer, safeMode, diff --git a/packages/xo-server/src/logs-cli.js b/packages/xo-server/src/logs-cli.mjs similarity index 96% rename from packages/xo-server/src/logs-cli.js rename to packages/xo-server/src/logs-cli.mjs index cf46bc4ab..a8e90fa97 100644 --- a/packages/xo-server/src/logs-cli.js +++ b/packages/xo-server/src/logs-cli.mjs @@ -8,8 +8,8 @@ import sublevel from 'subleveldown' import util from 'util' import { join as joinPath } from 'path' -import { forEach } from './utils.js' -import globMatcher from './glob-matcher.js' +import { forEach } from './utils.mjs' +import globMatcher from './glob-matcher.mjs' // =================================================================== @@ -274,11 +274,14 @@ export default async function main() { } const config = await appConf.load('xo-server', { - appDir: joinPath(__dirname, '..'), + appDir: new URL('..', import.meta.url).pathname, ignoreUnknownFormats: true, }) if (args.repair) { + // TODO: remove once `import.meta.resolve` is stabilized + const require = (await import('module')).createRequire(import.meta.url) + // eslint-disable-next-line node/no-extraneous-require const { repair } = require(require.resolve('level', { paths: [require.resolve('level-party')], diff --git a/packages/xo-server/src/math.js b/packages/xo-server/src/math.mjs similarity index 100% rename from packages/xo-server/src/math.js rename to packages/xo-server/src/math.mjs diff --git a/packages/xo-server/src/math.spec.js b/packages/xo-server/src/math.spec.mjs similarity index 94% rename from packages/xo-server/src/math.spec.js rename to packages/xo-server/src/math.spec.mjs index d436e8322..c98b89362 100644 --- a/packages/xo-server/src/math.spec.js +++ b/packages/xo-server/src/math.spec.mjs @@ -1,8 +1,8 @@ /* eslint-env jest */ -import { forEach } from 'lodash' -import { thunkToArray } from './utils.js' -import { crossProduct, mergeObjects } from './math.js' +import forEach from 'lodash/forEach.js' +import { thunkToArray } from './utils.mjs' +import { crossProduct, mergeObjects } from './math.mjs' describe('mergeObjects', function () { forEach( diff --git a/packages/xo-server/src/model.js b/packages/xo-server/src/model.mjs similarity index 96% rename from packages/xo-server/src/model.js rename to packages/xo-server/src/model.mjs index 55e4228e4..602a23807 100644 --- a/packages/xo-server/src/model.js +++ b/packages/xo-server/src/model.mjs @@ -1,6 +1,6 @@ import { EventEmitter } from 'events' -import { forEach, isEmpty } from './utils.js' +import { forEach, isEmpty } from './utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/models/acl.js b/packages/xo-server/src/models/acl.mjs similarity index 92% rename from packages/xo-server/src/models/acl.js rename to packages/xo-server/src/models/acl.mjs index 9d1c53e8f..5f5c9e35b 100644 --- a/packages/xo-server/src/models/acl.js +++ b/packages/xo-server/src/models/acl.mjs @@ -1,6 +1,6 @@ -import Collection from '../collection/redis.js' -import Model from '../model.js' -import { forEach, multiKeyHash } from '../utils.js' +import Collection from '../collection/redis.mjs' +import Model from '../model.mjs' +import { forEach, multiKeyHash } from '../utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/models/group.js b/packages/xo-server/src/models/group.mjs similarity index 83% rename from packages/xo-server/src/models/group.js rename to packages/xo-server/src/models/group.mjs index 9ab7a77dd..3b98848a9 100644 --- a/packages/xo-server/src/models/group.js +++ b/packages/xo-server/src/models/group.mjs @@ -1,11 +1,11 @@ import isEmpty from 'lodash/isEmpty.js' -import Collection from '../collection/redis.js' -import Model from '../model.js' +import Collection from '../collection/redis.mjs' +import Model from '../model.mjs' -import { forEach } from '../utils.js' +import { forEach } from '../utils.mjs' -import { parseProp } from './utils.js' +import { parseProp } from './utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/models/plugin-metadata.js b/packages/xo-server/src/models/plugin-metadata.mjs similarity index 92% rename from packages/xo-server/src/models/plugin-metadata.js rename to packages/xo-server/src/models/plugin-metadata.mjs index 7306d3000..124f8257c 100644 --- a/packages/xo-server/src/models/plugin-metadata.js +++ b/packages/xo-server/src/models/plugin-metadata.mjs @@ -1,7 +1,7 @@ -import Collection from '../collection/redis.js' -import Model from '../model.js' +import Collection from '../collection/redis.mjs' +import Model from '../model.mjs' import { createLogger } from '@xen-orchestra/log' -import { forEach } from '../utils.js' +import { forEach } from '../utils.mjs' const log = createLogger('xo:plugin-metadata') diff --git a/packages/xo-server/src/models/remote.js b/packages/xo-server/src/models/remote.mjs similarity index 81% rename from packages/xo-server/src/models/remote.js rename to packages/xo-server/src/models/remote.mjs index c0a3b2cdb..3d018c891 100644 --- a/packages/xo-server/src/models/remote.js +++ b/packages/xo-server/src/models/remote.mjs @@ -1,8 +1,8 @@ -import Collection from '../collection/redis.js' -import Model from '../model.js' -import { forEach } from '../utils.js' +import Collection from '../collection/redis.mjs' +import Model from '../model.mjs' +import { forEach } from '../utils.mjs' -import { parseProp } from './utils.js' +import { parseProp } from './utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/models/server.js b/packages/xo-server/src/models/server.mjs similarity index 88% rename from packages/xo-server/src/models/server.js rename to packages/xo-server/src/models/server.mjs index 86dde1bac..e16c400a0 100644 --- a/packages/xo-server/src/models/server.js +++ b/packages/xo-server/src/models/server.mjs @@ -1,8 +1,8 @@ -import Collection from '../collection/redis.js' -import Model from '../model.js' -import { forEach, serializeError } from '../utils.js' +import Collection from '../collection/redis.mjs' +import Model from '../model.mjs' +import { forEach, serializeError } from '../utils.mjs' -import { parseProp } from './utils.js' +import { parseProp } from './utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/models/token.js b/packages/xo-server/src/models/token.mjs similarity index 73% rename from packages/xo-server/src/models/token.js rename to packages/xo-server/src/models/token.mjs index f313cbef6..30210211e 100644 --- a/packages/xo-server/src/models/token.js +++ b/packages/xo-server/src/models/token.mjs @@ -1,5 +1,5 @@ -import Collection from '../collection/redis.js' -import Model from '../model.js' +import Collection from '../collection/redis.mjs' +import Model from '../model.mjs' // =================================================================== diff --git a/packages/xo-server/src/models/user.js b/packages/xo-server/src/models/user.mjs similarity index 92% rename from packages/xo-server/src/models/user.js rename to packages/xo-server/src/models/user.mjs index fff86a9b4..ebc55455e 100644 --- a/packages/xo-server/src/models/user.js +++ b/packages/xo-server/src/models/user.mjs @@ -1,9 +1,9 @@ import isEmpty from 'lodash/isEmpty.js' -import Collection from '../collection/redis.js' -import Model from '../model.js' +import Collection from '../collection/redis.mjs' +import Model from '../model.mjs' -import { parseProp } from './utils.js' +import { parseProp } from './utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/models/utils.js b/packages/xo-server/src/models/utils.mjs similarity index 100% rename from packages/xo-server/src/models/utils.js rename to packages/xo-server/src/models/utils.mjs diff --git a/packages/xo-server/src/patch.js b/packages/xo-server/src/patch.mjs similarity index 100% rename from packages/xo-server/src/patch.js rename to packages/xo-server/src/patch.mjs diff --git a/packages/xo-server/src/proxy-console.js b/packages/xo-server/src/proxy-console.mjs similarity index 100% rename from packages/xo-server/src/proxy-console.js rename to packages/xo-server/src/proxy-console.mjs diff --git a/packages/xo-server/src/recover-account-cli.js b/packages/xo-server/src/recover-account-cli.mjs similarity index 90% rename from packages/xo-server/src/recover-account-cli.js rename to packages/xo-server/src/recover-account-cli.mjs index ff9496ce9..5460df3be 100644 --- a/packages/xo-server/src/recover-account-cli.js +++ b/packages/xo-server/src/recover-account-cli.mjs @@ -2,8 +2,8 @@ import appConf from 'app-conf' import pw from 'pw' import { join as joinPath } from 'path' -import Xo from './xo.js' -import { generateToken } from './utils.js' +import Xo from './xo.mjs' +import { generateToken } from './utils.mjs' const recoverAccount = async ([name]) => { if (name === undefined || name === '--help' || name === '-h') { @@ -27,7 +27,7 @@ xo-server-recover-account const xo = new Xo({ config: await appConf.load('xo-server', { - appDir: joinPath(__dirname, '..'), + appDir: new URL('..', import.meta.url).pathname, ignoreUnknownFormats: true, }), }) diff --git a/packages/xo-server/src/schemas/acl.js b/packages/xo-server/src/schemas/acl.mjs similarity index 100% rename from packages/xo-server/src/schemas/acl.js rename to packages/xo-server/src/schemas/acl.mjs diff --git a/packages/xo-server/src/schemas/job.js b/packages/xo-server/src/schemas/job.mjs similarity index 100% rename from packages/xo-server/src/schemas/job.js rename to packages/xo-server/src/schemas/job.mjs diff --git a/packages/xo-server/src/schemas/log.js b/packages/xo-server/src/schemas/log.mjs similarity index 100% rename from packages/xo-server/src/schemas/log.js rename to packages/xo-server/src/schemas/log.mjs diff --git a/packages/xo-server/src/schemas/log/jobCallEnd.js b/packages/xo-server/src/schemas/log/jobCallEnd.mjs similarity index 100% rename from packages/xo-server/src/schemas/log/jobCallEnd.js rename to packages/xo-server/src/schemas/log/jobCallEnd.mjs diff --git a/packages/xo-server/src/schemas/log/jobCallStart.js b/packages/xo-server/src/schemas/log/jobCallStart.mjs similarity index 100% rename from packages/xo-server/src/schemas/log/jobCallStart.js rename to packages/xo-server/src/schemas/log/jobCallStart.mjs diff --git a/packages/xo-server/src/schemas/log/jobEnd.js b/packages/xo-server/src/schemas/log/jobEnd.mjs similarity index 100% rename from packages/xo-server/src/schemas/log/jobEnd.js rename to packages/xo-server/src/schemas/log/jobEnd.mjs diff --git a/packages/xo-server/src/schemas/log/jobStart.js b/packages/xo-server/src/schemas/log/jobStart.mjs similarity index 100% rename from packages/xo-server/src/schemas/log/jobStart.js rename to packages/xo-server/src/schemas/log/jobStart.mjs diff --git a/packages/xo-server/src/schemas/log/taskEnd.js b/packages/xo-server/src/schemas/log/taskEnd.mjs similarity index 100% rename from packages/xo-server/src/schemas/log/taskEnd.js rename to packages/xo-server/src/schemas/log/taskEnd.mjs diff --git a/packages/xo-server/src/schemas/log/taskInfo.js b/packages/xo-server/src/schemas/log/taskInfo.mjs similarity index 100% rename from packages/xo-server/src/schemas/log/taskInfo.js rename to packages/xo-server/src/schemas/log/taskInfo.mjs diff --git a/packages/xo-server/src/schemas/log/taskStart.js b/packages/xo-server/src/schemas/log/taskStart.mjs similarity index 100% rename from packages/xo-server/src/schemas/log/taskStart.js rename to packages/xo-server/src/schemas/log/taskStart.mjs diff --git a/packages/xo-server/src/schemas/log/taskWarning.js b/packages/xo-server/src/schemas/log/taskWarning.mjs similarity index 100% rename from packages/xo-server/src/schemas/log/taskWarning.js rename to packages/xo-server/src/schemas/log/taskWarning.mjs diff --git a/packages/xo-server/src/schemas/plugin.js b/packages/xo-server/src/schemas/plugin.mjs similarity index 100% rename from packages/xo-server/src/schemas/plugin.js rename to packages/xo-server/src/schemas/plugin.mjs diff --git a/packages/xo-server/src/schemas/user.js b/packages/xo-server/src/schemas/user.mjs similarity index 100% rename from packages/xo-server/src/schemas/user.js rename to packages/xo-server/src/schemas/user.mjs diff --git a/packages/xo-server/src/sensitive-values.js b/packages/xo-server/src/sensitive-values.mjs similarity index 100% rename from packages/xo-server/src/sensitive-values.js rename to packages/xo-server/src/sensitive-values.mjs diff --git a/packages/xo-server/src/stream-to-existing-buffer.js b/packages/xo-server/src/stream-to-existing-buffer.mjs similarity index 100% rename from packages/xo-server/src/stream-to-existing-buffer.js rename to packages/xo-server/src/stream-to-existing-buffer.mjs diff --git a/packages/xo-server/src/stream-to-existing-buffer.spec.js b/packages/xo-server/src/stream-to-existing-buffer.spec.mjs similarity index 78% rename from packages/xo-server/src/stream-to-existing-buffer.spec.js rename to packages/xo-server/src/stream-to-existing-buffer.spec.mjs index dfb537bb3..e79370dd8 100644 --- a/packages/xo-server/src/stream-to-existing-buffer.spec.js +++ b/packages/xo-server/src/stream-to-existing-buffer.spec.mjs @@ -3,13 +3,13 @@ import { createReadStream, readFile } from 'fs' import { fromCallback } from 'promise-toolbox' -import streamToExistingBuffer from './stream-to-existing-buffer.js' +import streamToExistingBuffer from './stream-to-existing-buffer.mjs' describe('streamToExistingBuffer()', () => { it('read the content of a stream in a buffer', async () => { - const stream = createReadStream(__filename) + const stream = createReadStream(import.meta.url) - const expected = await fromCallback(readFile, __filename, 'utf-8') + const expected = await fromCallback(readFile, import.meta.url, 'utf-8') const buf = Buffer.allocUnsafe(expected.length + 1) buf[0] = 'A'.charCodeAt() diff --git a/packages/xo-server/src/utils.js b/packages/xo-server/src/utils.mjs similarity index 100% rename from packages/xo-server/src/utils.js rename to packages/xo-server/src/utils.mjs diff --git a/packages/xo-server/src/utils.spec.js b/packages/xo-server/src/utils.spec.mjs similarity index 99% rename from packages/xo-server/src/utils.spec.js rename to packages/xo-server/src/utils.spec.mjs index f3b009fe8..84cd0debb 100644 --- a/packages/xo-server/src/utils.spec.js +++ b/packages/xo-server/src/utils.spec.mjs @@ -1,6 +1,6 @@ /* eslint-env jest */ -import { camelToSnakeCase, diffItems, extractProperty, generateToken, parseSize, parseXml } from './utils.js' +import { camelToSnakeCase, diffItems, extractProperty, generateToken, parseSize, parseXml } from './utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/xapi-object-to-xo.js b/packages/xo-server/src/xapi-object-to-xo.mjs similarity index 99% rename from packages/xo-server/src/xapi-object-to-xo.js rename to packages/xo-server/src/xapi-object-to-xo.mjs index 967a58b65..8ad6ad9d4 100644 --- a/packages/xo-server/src/xapi-object-to-xo.js +++ b/packages/xo-server/src/xapi-object-to-xo.mjs @@ -1,11 +1,11 @@ import { isDefaultTemplate } from '@xen-orchestra/xapi' -import * as sensitiveValues from './sensitive-values.js' -import ensureArray from './_ensureArray.js' -import { extractIpFromVmNetworks } from './_extractIpFromVmNetworks.js' -import { extractProperty, forEach, isEmpty, mapFilter, parseXml } from './utils.js' -import { getVmDomainType, isHostRunning, isVmRunning, parseDateTime } from './xapi/index.js' -import { useUpdateSystem } from './xapi/utils.js' +import * as sensitiveValues from './sensitive-values.mjs' +import ensureArray from './_ensureArray.mjs' +import { extractIpFromVmNetworks } from './_extractIpFromVmNetworks.mjs' +import { extractProperty, forEach, isEmpty, mapFilter, parseXml } from './utils.mjs' +import { getVmDomainType, isHostRunning, isVmRunning, parseDateTime } from './xapi/index.mjs' +import { useUpdateSystem } from './xapi/utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/xapi-stats.js b/packages/xo-server/src/xapi-stats.mjs similarity index 95% rename from packages/xo-server/src/xapi-stats.js rename to packages/xo-server/src/xapi-stats.mjs index 897039bd2..a3aed3b73 100644 --- a/packages/xo-server/src/xapi-stats.js +++ b/packages/xo-server/src/xapi-stats.mjs @@ -1,10 +1,19 @@ +import defaults from 'lodash/defaults.js' +import findKey from 'lodash/findKey.js' +import forEach from 'lodash/forEach.js' +import identity from 'lodash/identity.js' import JSON5 from 'json5' -import limitConcurrency from 'limit-concurrency-decorator' -import synchronized from 'decorator-synchronized' +import map from 'lodash/map.js' +import mapValues from 'lodash/mapValues.js' +import mean from 'lodash/mean.js' +import sum from 'lodash/sum.js' +import uniq from 'lodash/uniq.js' +import zipWith from 'lodash/zipWith.js' import { BaseError } from 'make-error' -import { defaults, findKey, forEach, identity, map, mapValues, mean, sum, uniq, zipWith } from 'lodash' +import { limitConcurrency } from 'limit-concurrency-decorator' +import { synchronized } from 'decorator-synchronized' -import { parseDateTime } from './xapi/index.js' +import { parseDateTime } from './xapi/index.mjs' export class FaultyGranularity extends BaseError {} diff --git a/packages/xo-server/src/xapi/index.js b/packages/xo-server/src/xapi/index.mjs similarity index 98% rename from packages/xo-server/src/xapi/index.js rename to packages/xo-server/src/xapi/index.mjs index cc2a6f029..a986f3baf 100644 --- a/packages/xo-server/src/xapi/index.js +++ b/packages/xo-server/src/xapi/index.mjs @@ -1,34 +1,45 @@ /* eslint eslint-comments/disable-enable-pair: [error, {allowWholeFile: true}] */ /* eslint-disable camelcase */ import asyncMapSettled from '@xen-orchestra/async-map/legacy.js' -import concurrency from 'limit-concurrency-decorator' import fatfs from 'fatfs' +import filter from 'lodash/filter.js' +import find from 'lodash/find.js' +import flatMap from 'lodash/flatMap.js' +import flatten from 'lodash/flatten.js' +import groupBy from 'lodash/groupBy.js' +import identity from 'lodash/identity.js' +import includes from 'lodash/includes.js' +import isEmpty from 'lodash/isEmpty.js' import mapToArray from 'lodash/map.js' import mixin from '@xen-orchestra/mixin/legacy.js' import ms from 'ms' -import synchronized from 'decorator-synchronized' +import noop from 'lodash/noop.js' +import omit from 'lodash/omit.js' +import once from 'lodash/once.js' +import semver from 'semver' import tarStream from 'tar-stream' +import uniq from 'lodash/uniq.js' import { asyncMap } from '@xen-orchestra/async-map' import { vmdkToVhd } from 'xo-vmdk-to-vhd' import { cancelable, fromEvents, ignoreErrors, pCatch, pRetry } from 'promise-toolbox' import { createLogger } from '@xen-orchestra/log' import { decorateWith } from '@vates/decorate-with' import { defer as deferrable } from 'golike-defer' +import { limitConcurrency } from 'limit-concurrency-decorator' import { parseDuration } from '@vates/parse-duration' import { PassThrough } from 'stream' import { forbiddenOperation, operationFailed } from 'xo-common/api-errors.js' import { Xapi as XapiBase } from '@xen-orchestra/xapi' -import { filter, find, flatMap, flatten, groupBy, identity, includes, isEmpty, noop, omit, once, uniq } from 'lodash' import { Ref } from 'xen-api' -import { satisfies as versionSatisfies } from 'semver' +import { synchronized } from 'decorator-synchronized' -import ensureArray from '../_ensureArray.js' -import fatfsBuffer, { init as fatfsBufferInit } from '../fatfs-buffer.js' -import { asyncMapValues } from '../_asyncMapValues.js' -import { camelToSnakeCase, forEach, map, parseSize, pDelay, promisifyAll } from '../utils.js' +import ensureArray from '../_ensureArray.mjs' +import fatfsBuffer, { init as fatfsBufferInit } from '../fatfs-buffer.mjs' +import { asyncMapValues } from '../_asyncMapValues.mjs' +import { camelToSnakeCase, forEach, map, parseSize, pDelay, promisifyAll } from '../utils.mjs' -import mixins from './mixins/index.js' -import OTHER_CONFIG_TEMPLATE from './other-config-template.js' +import mixins from './mixins/index.mjs' +import OTHER_CONFIG_TEMPLATE from './other-config-template.mjs' import { asBoolean, asInteger, @@ -40,7 +51,7 @@ import { optional, parseDateTime, prepareXapiParam, -} from './utils.js' +} from './utils.mjs' import { createVhdStreamWithLength } from 'vhd-lib' const log = createLogger('xo:xapi') @@ -52,9 +63,7 @@ export const TAG_COPY_SRC = 'xo:copy_of' // =================================================================== -// FIXME: remove this work around when fixed, https://phabricator.babeljs.io/T2877 -// export * from './utils.js' -Object.assign(module.exports, require('./utils.js')) +export * from './utils.mjs' // VDI formats. (Raw is not available for delta vdi.) export const VDI_FORMAT_VHD = 'vhd' @@ -84,10 +93,10 @@ export default class Xapi extends XapiBase { // close event is emitted when the export is canceled via browser. See https://github.com/vatesfr/xen-orchestra/issues/5535 const waitStreamEnd = async stream => fromEvents(await stream, ['end', 'close']) - this._exportVdi = concurrency(vdiExportConcurrency, waitStreamEnd)(this._exportVdi) - this.exportVm = concurrency(vmExportConcurrency, waitStreamEnd)(this.exportVm) + this._exportVdi = limitConcurrency(vdiExportConcurrency, waitStreamEnd)(this._exportVdi) + this.exportVm = limitConcurrency(vmExportConcurrency, waitStreamEnd)(this.exportVm) - this._snapshotVm = concurrency(vmSnapshotConcurrency)(this._snapshotVm) + this._snapshotVm = limitConcurrency(vmSnapshotConcurrency)(this._snapshotVm) // Patch getObject to resolve _xapiId property. this.getObject = (getObject => (...args) => { @@ -665,7 +674,7 @@ export default class Xapi extends XapiBase { ) { const { version } = delta - if (!versionSatisfies(version, '^1')) { + if (!semver.satisfies(version, '^1')) { throw new Error(`Unsupported delta backup version: ${version}`) } diff --git a/packages/xo-server/src/xapi/mixins/gpu.js b/packages/xo-server/src/xapi/mixins/gpu.mjs similarity index 100% rename from packages/xo-server/src/xapi/mixins/gpu.js rename to packages/xo-server/src/xapi/mixins/gpu.mjs diff --git a/packages/xo-server/src/xapi/mixins/networking.js b/packages/xo-server/src/xapi/mixins/networking.mjs similarity index 97% rename from packages/xo-server/src/xapi/mixins/networking.js rename to packages/xo-server/src/xapi/mixins/networking.mjs index cffaf4eb3..03178d136 100644 --- a/packages/xo-server/src/xapi/mixins/networking.js +++ b/packages/xo-server/src/xapi/mixins/networking.mjs @@ -1,4 +1,4 @@ -import { makeEditObject } from '../utils.js' +import { makeEditObject } from '../utils.mjs' export default { async _connectVif(vif) { diff --git a/packages/xo-server/src/xapi/mixins/patching.js b/packages/xo-server/src/xapi/mixins/patching.mjs similarity index 97% rename from packages/xo-server/src/xapi/mixins/patching.js rename to packages/xo-server/src/xapi/mixins/patching.mjs index a0f5c258a..96f240067 100644 --- a/packages/xo-server/src/xapi/mixins/patching.js +++ b/packages/xo-server/src/xapi/mixins/patching.mjs @@ -1,15 +1,20 @@ +import filter from 'lodash/filter.js' +import find from 'lodash/find.js' +import groupBy from 'lodash/groupBy.js' +import mapValues from 'lodash/mapValues.js' +import pickBy from 'lodash/pickBy.js' +import some from 'lodash/some.js' import unzip from 'unzipper' import { createLogger } from '@xen-orchestra/log' import { decorateWith } from '@vates/decorate-with' import { defer as deferrable } from 'golike-defer' -import { filter, find, groupBy, mapValues, pickBy, some } from 'lodash' import { timeout } from 'promise-toolbox' -import ensureArray from '../../_ensureArray.js' -import { debounceWithKey } from '../../_pDebounceWithKey.js' -import { forEach, mapFilter, parseXml } from '../../utils.js' +import ensureArray from '../../_ensureArray.mjs' +import { debounceWithKey } from '../../_pDebounceWithKey.mjs' +import { forEach, mapFilter, parseXml } from '../../utils.mjs' -import { extractOpaqueRef, parseDateTime, useUpdateSystem } from '../utils.js' +import { extractOpaqueRef, parseDateTime, useUpdateSystem } from '../utils.mjs' // TOC ------------------------------------------------------------------------- diff --git a/packages/xo-server/src/xapi/mixins/pool.js b/packages/xo-server/src/xapi/mixins/pool.mjs similarity index 100% rename from packages/xo-server/src/xapi/mixins/pool.js rename to packages/xo-server/src/xapi/mixins/pool.mjs diff --git a/packages/xo-server/src/xapi/mixins/storage.js b/packages/xo-server/src/xapi/mixins/storage.mjs similarity index 96% rename from packages/xo-server/src/xapi/mixins/storage.js rename to packages/xo-server/src/xapi/mixins/storage.mjs index 995d29331..650475cb2 100644 --- a/packages/xo-server/src/xapi/mixins/storage.js +++ b/packages/xo-server/src/xapi/mixins/storage.mjs @@ -1,7 +1,9 @@ +import filter from 'lodash/filter.js' +import forEach from 'lodash/forEach.js' +import groupBy from 'lodash/groupBy.js' import { decorateWith } from '@vates/decorate-with' import { defer } from 'golike-defer' import { createLogger } from '@xen-orchestra/log' -import { filter, forEach, groupBy } from 'lodash' const log = createLogger('xo:storage') diff --git a/packages/xo-server/src/xapi/mixins/vm.js b/packages/xo-server/src/xapi/mixins/vm.mjs similarity index 97% rename from packages/xo-server/src/xapi/mixins/vm.js rename to packages/xo-server/src/xapi/mixins/vm.mjs index 9411ad8a0..585a60f86 100644 --- a/packages/xo-server/src/xapi/mixins/vm.js +++ b/packages/xo-server/src/xapi/mixins/vm.mjs @@ -1,12 +1,19 @@ +import find from 'lodash/find.js' +import gte from 'lodash/gte.js' +import includes from 'lodash/includes.js' +import isEmpty from 'lodash/isEmpty.js' +import lte from 'lodash/lte.js' +import mapToArray from 'lodash/map.js' +import mapValues from 'lodash/mapValues.js' +import noop from 'lodash/noop.js' import { decorateWith } from '@vates/decorate-with' import { defer as deferrable } from 'golike-defer' -import { find, gte, includes, isEmpty, lte, map as mapToArray, mapValues, noop } from 'lodash' import { cancelable, ignoreErrors, pCatch } from 'promise-toolbox' import { Ref } from 'xen-api' -import { forEach, parseSize } from '../../utils.js' +import { forEach, parseSize } from '../../utils.mjs' -import { extractOpaqueRef, isVmHvm, isVmRunning, makeEditObject } from '../utils.js' +import { extractOpaqueRef, isVmHvm, isVmRunning, makeEditObject } from '../utils.mjs' // According to: https://xenserver.org/blog/entry/vga-over-cirrus-in-xenserver-6-2.html. const XEN_VGA_VALUES = ['std', 'cirrus'] diff --git a/packages/xo-server/src/xapi/other-config-template.js b/packages/xo-server/src/xapi/other-config-template.mjs similarity index 100% rename from packages/xo-server/src/xapi/other-config-template.js rename to packages/xo-server/src/xapi/other-config-template.mjs diff --git a/packages/xo-server/src/xapi/utils.js b/packages/xo-server/src/xapi/utils.mjs similarity index 98% rename from packages/xo-server/src/xapi/utils.js rename to packages/xo-server/src/xapi/utils.mjs index 5b97d895d..f088653c6 100644 --- a/packages/xo-server/src/xapi/utils.js +++ b/packages/xo-server/src/xapi/utils.mjs @@ -3,10 +3,10 @@ import camelCase from 'lodash/camelCase.js' import isEqual from 'lodash/isEqual.js' import isPlainObject from 'lodash/isPlainObject.js' import pickBy from 'lodash/pickBy.js' +import semver from 'semver' import { utcParse } from 'd3-time-format' -import { satisfies as versionSatisfies } from 'semver' -import { camelToSnakeCase, forEach, isInteger, map, mapFilter, noop } from '../utils.js' +import { camelToSnakeCase, forEach, isInteger, map, mapFilter, noop } from '../utils.mjs' // =================================================================== @@ -308,7 +308,7 @@ export const makeEditObject = specs => { export const useUpdateSystem = host => { // Match Xen Center's condition: https://github.com/xenserver/xenadmin/blob/f3a64fc54bbff239ca6f285406d9034f57537d64/XenModel/Utils/Helpers.cs#L420 - return versionSatisfies(host.software_version.platform_version, '>=2.1.1') + return semver.satisfies(host.software_version.platform_version, '>=2.1.1') } export const canSrHaveNewVdiOfSize = (sr, minSize) => diff --git a/packages/xo-server/src/xo-mixins/acls.js b/packages/xo-server/src/xo-mixins/acls.mjs similarity index 95% rename from packages/xo-server/src/xo-mixins/acls.js rename to packages/xo-server/src/xo-mixins/acls.mjs index 0c7a7d341..9fe2b537d 100644 --- a/packages/xo-server/src/xo-mixins/acls.js +++ b/packages/xo-server/src/xo-mixins/acls.mjs @@ -1,8 +1,10 @@ import aclResolver from 'xo-acl-resolver' -import { forEach, includes, map } from 'lodash' +import forEach from 'lodash/forEach.js' +import includes from 'lodash/includes.js' +import map from 'lodash/map.js' -import { ModelAlreadyExists } from '../collection.js' -import { Acls } from '../models/acl.js' +import { ModelAlreadyExists } from '../collection.mjs' +import { Acls } from '../models/acl.mjs' // =================================================================== diff --git a/packages/xo-server/src/xo-mixins/api.js b/packages/xo-server/src/xo-mixins/api.mjs similarity index 98% rename from packages/xo-server/src/xo-mixins/api.js rename to packages/xo-server/src/xo-mixins/api.mjs index 73fe61989..245728884 100644 --- a/packages/xo-server/src/xo-mixins/api.js +++ b/packages/xo-server/src/xo-mixins/api.mjs @@ -1,16 +1,16 @@ import emitAsync from '@xen-orchestra/emit-async' import { createLogger } from '@xen-orchestra/log' +import forEach from 'lodash/forEach.js' import kindOf from 'kindof' import ms from 'ms' import schemaInspector from 'schema-inspector' -import { forEach } from 'lodash' import { getBoundPropertyDescriptor } from 'bind-property-descriptor' import { MethodNotFound } from 'json-rpc-peer' -import * as methods from '../api/index.js' -import * as sensitiveValues from '../sensitive-values.js' -import { noop, serializeError } from '../utils.js' +import * as methods from '../api/index.mjs' +import * as sensitiveValues from '../sensitive-values.mjs' +import { noop, serializeError } from '../utils.mjs' import * as errors from 'xo-common/api-errors.js' diff --git a/packages/xo-server/src/xo-mixins/authentication.js b/packages/xo-server/src/xo-mixins/authentication.mjs similarity index 98% rename from packages/xo-server/src/xo-mixins/authentication.js rename to packages/xo-server/src/xo-mixins/authentication.mjs index 20d91427f..3c54a2d05 100644 --- a/packages/xo-server/src/xo-mixins/authentication.js +++ b/packages/xo-server/src/xo-mixins/authentication.mjs @@ -4,8 +4,8 @@ import { ignoreErrors } from 'promise-toolbox' import { invalidCredentials, noSuchObject } from 'xo-common/api-errors.js' import { parseDuration } from '@vates/parse-duration' -import Token, { Tokens } from '../models/token.js' -import { forEach, generateToken } from '../utils.js' +import Token, { Tokens } from '../models/token.mjs' +import { forEach, generateToken } from '../utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/xo-mixins/backups-ng-logs.js b/packages/xo-server/src/xo-mixins/backups-ng-logs.mjs similarity index 96% rename from packages/xo-server/src/xo-mixins/backups-ng-logs.js rename to packages/xo-server/src/xo-mixins/backups-ng-logs.mjs index 888b3bc4c..574a406ef 100644 --- a/packages/xo-server/src/xo-mixins/backups-ng-logs.js +++ b/packages/xo-server/src/xo-mixins/backups-ng-logs.mjs @@ -1,7 +1,10 @@ +import forEach from 'lodash/forEach.js' +import isEmpty from 'lodash/isEmpty.js' +import iteratee from 'lodash/iteratee.js' import ms from 'ms' -import { forEach, isEmpty, iteratee, sortedIndexBy } from 'lodash' +import sortedIndexBy from 'lodash/sortedIndexBy.js' -import { debounceWithKey } from '../_pDebounceWithKey.js' +import { debounceWithKey } from '../_pDebounceWithKey.mjs' const isSkippedError = error => error != null && diff --git a/packages/xo-server/src/xo-mixins/backups-ng/index.js b/packages/xo-server/src/xo-mixins/backups-ng/index.mjs similarity index 98% rename from packages/xo-server/src/xo-mixins/backups-ng/index.js rename to packages/xo-server/src/xo-mixins/backups-ng/index.mjs index 218617f67..7c3e96261 100644 --- a/packages/xo-server/src/xo-mixins/backups-ng/index.js +++ b/packages/xo-server/src/xo-mixins/backups-ng/index.mjs @@ -1,20 +1,21 @@ import asyncMapSettled from '@xen-orchestra/async-map/legacy.js' import Disposable from 'promise-toolbox/Disposable.js' +import forOwn from 'lodash/forOwn.js' +import merge from 'lodash/merge.js' import { Backup } from '@xen-orchestra/backups/Backup.js' import { createLogger } from '@xen-orchestra/log' import { createPredicate } from 'value-matcher' import { decorateWith } from '@vates/decorate-with' import { formatVmBackups } from '@xen-orchestra/backups/formatVmBackups.js' -import { forOwn, merge } from 'lodash' import { ImportVmBackup } from '@xen-orchestra/backups/ImportVmBackup.js' import { invalidParameters } from 'xo-common/api-errors.js' import { runBackupWorker } from '@xen-orchestra/backups/runBackupWorker.js' import { Task } from '@xen-orchestra/backups/Task.js' -import { debounceWithKey, REMOVE_CACHE_ENTRY } from '../../_pDebounceWithKey.js' -import { handleBackupLog } from '../../_handleBackupLog.js' -import { serializeError, unboxIdsFromPattern } from '../../utils.js' -import { waitAll } from '../../_waitAll.js' +import { debounceWithKey, REMOVE_CACHE_ENTRY } from '../../_pDebounceWithKey.mjs' +import { handleBackupLog } from '../../_handleBackupLog.mjs' +import { serializeError, unboxIdsFromPattern } from '../../utils.mjs' +import { waitAll } from '../../_waitAll.mjs' const log = createLogger('xo:xo-mixins:backups-ng') diff --git a/packages/xo-server/src/xo-mixins/backups-remote-adapter.js b/packages/xo-server/src/xo-mixins/backups-remote-adapter.mjs similarity index 100% rename from packages/xo-server/src/xo-mixins/backups-remote-adapter.js rename to packages/xo-server/src/xo-mixins/backups-remote-adapter.mjs diff --git a/packages/xo-server/src/xo-mixins/cloud-configs.js b/packages/xo-server/src/xo-mixins/cloud-configs.mjs similarity index 93% rename from packages/xo-server/src/xo-mixins/cloud-configs.js rename to packages/xo-server/src/xo-mixins/cloud-configs.mjs index 8c22f3e41..767c21c16 100644 --- a/packages/xo-server/src/xo-mixins/cloud-configs.js +++ b/packages/xo-server/src/xo-mixins/cloud-configs.mjs @@ -1,7 +1,7 @@ import { noSuchObject } from 'xo-common/api-errors.js' -import Collection from '../collection/redis.js' -import patch from '../patch.js' +import Collection from '../collection/redis.mjs' +import patch from '../patch.mjs' class CloudConfigs extends Collection { get(properties) { diff --git a/packages/xo-server/src/xo-mixins/config-management.js b/packages/xo-server/src/xo-mixins/config-management.mjs similarity index 97% rename from packages/xo-server/src/xo-mixins/config-management.js rename to packages/xo-server/src/xo-mixins/config-management.mjs index 65dd9ff15..55da942e1 100644 --- a/packages/xo-server/src/xo-mixins/config-management.js +++ b/packages/xo-server/src/xo-mixins/config-management.mjs @@ -2,7 +2,7 @@ import * as openpgp from 'openpgp' import DepTree from 'deptree' import { createLogger } from '@xen-orchestra/log' -import { asyncMapValues } from '../_asyncMapValues.js' +import { asyncMapValues } from '../_asyncMapValues.mjs' const log = createLogger('xo:config-management') diff --git a/packages/xo-server/src/xo-mixins/file-restore-ng.js b/packages/xo-server/src/xo-mixins/file-restore-ng.mjs similarity index 100% rename from packages/xo-server/src/xo-mixins/file-restore-ng.js rename to packages/xo-server/src/xo-mixins/file-restore-ng.mjs diff --git a/packages/xo-server/src/xo-mixins/http.js b/packages/xo-server/src/xo-mixins/http.mjs similarity index 100% rename from packages/xo-server/src/xo-mixins/http.js rename to packages/xo-server/src/xo-mixins/http.mjs diff --git a/packages/xo-server/src/xo-mixins/ip-pools.js b/packages/xo-server/src/xo-mixins/ip-pools.mjs similarity index 98% rename from packages/xo-server/src/xo-mixins/ip-pools.js rename to packages/xo-server/src/xo-mixins/ip-pools.mjs index 31afbe5ab..9eade80a1 100644 --- a/packages/xo-server/src/xo-mixins/ip-pools.js +++ b/packages/xo-server/src/xo-mixins/ip-pools.mjs @@ -11,11 +11,11 @@ import mapToArray from 'lodash/map.js' import mapValues from 'lodash/mapValues.js' import pick from 'lodash/pick.js' import remove from 'lodash/remove.js' -import synchronized from 'decorator-synchronized' import { noSuchObject } from 'xo-common/api-errors.js' import { fromCallback } from 'promise-toolbox' +import { synchronized } from 'decorator-synchronized' -import { forEach, generateUnsecureToken, isEmpty, lightSet, streamToArray, throwFn } from '../utils.js' +import { forEach, generateUnsecureToken, isEmpty, lightSet, streamToArray, throwFn } from '../utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/xo-mixins/jobs/execute-call.js b/packages/xo-server/src/xo-mixins/jobs/execute-call.mjs similarity index 91% rename from packages/xo-server/src/xo-mixins/jobs/execute-call.js rename to packages/xo-server/src/xo-mixins/jobs/execute-call.mjs index e15624699..dd187a918 100644 --- a/packages/xo-server/src/xo-mixins/jobs/execute-call.js +++ b/packages/xo-server/src/xo-mixins/jobs/execute-call.mjs @@ -1,10 +1,13 @@ import asyncMapSettled from '@xen-orchestra/async-map/legacy.js' +import filter from 'lodash/filter.js' +import isEmpty from 'lodash/isEmpty.js' +import map from 'lodash/map.js' +import mapValues from 'lodash/mapValues.js' import { createPredicate } from 'value-matcher' import { timeout } from 'promise-toolbox' -import { filter, isEmpty, map, mapValues } from 'lodash' -import { crossProduct } from '../../math.js' -import { serializeError, thunkToArray } from '../../utils.js' +import { crossProduct } from '../../math.mjs' +import { serializeError, thunkToArray } from '../../utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/xo-mixins/jobs/execute-call.spec.js b/packages/xo-server/src/xo-mixins/jobs/execute-call.spec.mjs similarity index 96% rename from packages/xo-server/src/xo-mixins/jobs/execute-call.spec.js rename to packages/xo-server/src/xo-mixins/jobs/execute-call.spec.mjs index 48edc2e57..3e44fc854 100644 --- a/packages/xo-server/src/xo-mixins/jobs/execute-call.spec.js +++ b/packages/xo-server/src/xo-mixins/jobs/execute-call.spec.mjs @@ -1,7 +1,7 @@ /* eslint-env jest */ -import { forEach } from 'lodash' -import { resolveParamsVector } from './execute-call.js' +import forEach from 'lodash/forEach.js' +import { resolveParamsVector } from './execute-call.mjs' describe('resolveParamsVector', function () { forEach( diff --git a/packages/xo-server/src/xo-mixins/jobs/index.js b/packages/xo-server/src/xo-mixins/jobs/index.mjs similarity index 97% rename from packages/xo-server/src/xo-mixins/jobs/index.js rename to packages/xo-server/src/xo-mixins/jobs/index.mjs index 43c6d052c..d59c501d0 100644 --- a/packages/xo-server/src/xo-mixins/jobs/index.js +++ b/packages/xo-server/src/xo-mixins/jobs/index.mjs @@ -7,11 +7,11 @@ import { CancelToken, ignoreErrors } from 'promise-toolbox' import { defer } from 'golike-defer' import { noSuchObject } from 'xo-common/api-errors.js' -import Collection from '../../collection/redis.js' -import patch from '../../patch.js' -import { serializeError } from '../../utils.js' +import Collection from '../../collection/redis.mjs' +import patch from '../../patch.mjs' +import { serializeError } from '../../utils.mjs' -import executeCall from './execute-call.js' +import executeCall from './execute-call.mjs' // =================================================================== diff --git a/packages/xo-server/src/xo-mixins/logs/index.js b/packages/xo-server/src/xo-mixins/logs/index.mjs similarity index 96% rename from packages/xo-server/src/xo-mixins/logs/index.js rename to packages/xo-server/src/xo-mixins/logs/index.mjs index c47ba7b6c..1dbc35e63 100644 --- a/packages/xo-server/src/xo-mixins/logs/index.js +++ b/packages/xo-server/src/xo-mixins/logs/index.mjs @@ -1,6 +1,6 @@ import { defer, fromEvent } from 'promise-toolbox' -import LevelDbLogger from './loggers/leveldb.js' +import LevelDbLogger from './loggers/leveldb.mjs' export default class Logs { constructor(app) { diff --git a/packages/xo-server/src/xo-mixins/logs/loggers/abstract.js b/packages/xo-server/src/xo-mixins/logs/loggers/abstract.mjs similarity index 100% rename from packages/xo-server/src/xo-mixins/logs/loggers/abstract.js rename to packages/xo-server/src/xo-mixins/logs/loggers/abstract.mjs diff --git a/packages/xo-server/src/xo-mixins/logs/loggers/leveldb.js b/packages/xo-server/src/xo-mixins/logs/loggers/leveldb.mjs similarity index 92% rename from packages/xo-server/src/xo-mixins/logs/loggers/leveldb.js rename to packages/xo-server/src/xo-mixins/logs/loggers/leveldb.mjs index ffa0074c5..0df31df8e 100644 --- a/packages/xo-server/src/xo-mixins/logs/loggers/leveldb.js +++ b/packages/xo-server/src/xo-mixins/logs/loggers/leveldb.mjs @@ -1,9 +1,9 @@ import highland from 'highland' import { ignoreErrors } from 'promise-toolbox' -import AbstractLogger from './abstract.js' +import AbstractLogger from './abstract.mjs' -import { forEach, noop } from '../../../utils.js' +import { forEach, noop } from '../../../utils.mjs' let lastDate = 0 let increment = 0 diff --git a/packages/xo-server/src/xo-mixins/metadata-backups.js b/packages/xo-server/src/xo-mixins/metadata-backups.mjs similarity index 98% rename from packages/xo-server/src/xo-mixins/metadata-backups.js rename to packages/xo-server/src/xo-mixins/metadata-backups.mjs index 5e99b39e9..6e7e289f6 100644 --- a/packages/xo-server/src/xo-mixins/metadata-backups.js +++ b/packages/xo-server/src/xo-mixins/metadata-backups.mjs @@ -7,10 +7,10 @@ import { parseMetadataBackupId } from '@xen-orchestra/backups/parseMetadataBacku import { RestoreMetadataBackup } from '@xen-orchestra/backups/RestoreMetadataBackup.js' import { Task } from '@xen-orchestra/backups/Task.js' -import { debounceWithKey, REMOVE_CACHE_ENTRY } from '../_pDebounceWithKey.js' -import { handleBackupLog } from '../_handleBackupLog.js' -import { waitAll } from '../_waitAll.js' -import { serializeError, unboxIdsFromPattern } from '../utils.js' +import { debounceWithKey, REMOVE_CACHE_ENTRY } from '../_pDebounceWithKey.mjs' +import { handleBackupLog } from '../_handleBackupLog.mjs' +import { waitAll } from '../_waitAll.mjs' +import { serializeError, unboxIdsFromPattern } from '../utils.mjs' const log = createLogger('xo:xo-mixins:metadata-backups') diff --git a/packages/xo-server/src/xo-mixins/patches.js b/packages/xo-server/src/xo-mixins/patches.mjs similarity index 88% rename from packages/xo-server/src/xo-mixins/patches.js rename to packages/xo-server/src/xo-mixins/patches.mjs index 195b90988..52d781d4d 100644 --- a/packages/xo-server/src/xo-mixins/patches.js +++ b/packages/xo-server/src/xo-mixins/patches.mjs @@ -1,4 +1,4 @@ -import { differenceBy } from 'lodash' +import differenceBy from 'lodash/differenceBy.js' export default class { constructor(app) { diff --git a/packages/xo-server/src/xo-mixins/plugins.js b/packages/xo-server/src/xo-mixins/plugins.mjs similarity index 98% rename from packages/xo-server/src/xo-mixins/plugins.js rename to packages/xo-server/src/xo-mixins/plugins.mjs index cc329de26..09f775940 100644 --- a/packages/xo-server/src/xo-mixins/plugins.js +++ b/packages/xo-server/src/xo-mixins/plugins.mjs @@ -3,8 +3,8 @@ import mapToArray from 'lodash/map.js' import { createLogger } from '@xen-orchestra/log' import { invalidParameters, noSuchObject } from 'xo-common/api-errors.js' -import * as sensitiveValues from '../sensitive-values.js' -import { PluginsMetadata } from '../models/plugin-metadata.js' +import * as sensitiveValues from '../sensitive-values.mjs' +import { PluginsMetadata } from '../models/plugin-metadata.mjs' // =================================================================== diff --git a/packages/xo-server/src/xo-mixins/pool.js b/packages/xo-server/src/xo-mixins/pool.mjs similarity index 93% rename from packages/xo-server/src/xo-mixins/pool.js rename to packages/xo-server/src/xo-mixins/pool.mjs index 6064f138b..f7e57c67e 100644 --- a/packages/xo-server/src/xo-mixins/pool.js +++ b/packages/xo-server/src/xo-mixins/pool.mjs @@ -1,5 +1,9 @@ -import { difference, flatten, isEmpty, stubTrue, uniq } from 'lodash' -import { satisfies as versionSatisfies } from 'semver' +import difference from 'lodash/difference.js' +import flatten from 'lodash/flatten.js' +import isEmpty from 'lodash/isEmpty.js' +import semver from 'semver' +import stubTrue from 'lodash/stubTrue.js' +import uniq from 'lodash/uniq.js' export default class Pools { constructor(app) { @@ -119,7 +123,7 @@ export default class Pools { checkPoolName(pool.name_label) && hostsByPool[pool.id].some( host => - (minHostVersion === undefined || versionSatisfies(host.version, `>=${minHostVersion}`)) && + (minHostVersion === undefined || semver.satisfies(host.version, `>=${minHostVersion}`)) && host.cpus.cores >= minHostCpus && host.memory.size - host.memory.usage >= minAvailableHostMemory ) && diff --git a/packages/xo-server/src/xo-mixins/proxies.js b/packages/xo-server/src/xo-mixins/proxies.mjs similarity index 97% rename from packages/xo-server/src/xo-mixins/proxies.js rename to packages/xo-server/src/xo-mixins/proxies.mjs index 1454cacd2..aa87478de 100644 --- a/packages/xo-server/src/xo-mixins/proxies.js +++ b/packages/xo-server/src/xo-mixins/proxies.mjs @@ -2,26 +2,29 @@ import assert from 'assert' import contentType from 'content-type' import cookie from 'cookie' import hrp from 'http-request-plus' +import isEmpty from 'lodash/isEmpty.js' +import mapValues from 'lodash/mapValues.js' +import omit from 'lodash/omit.js' import parseSetCookie from 'set-cookie-parser' import pumpify from 'pumpify' +import some from 'lodash/some.js' import split2 from 'split2' -import synchronized from 'decorator-synchronized' import { compileTemplate } from '@xen-orchestra/template' import { createLogger } from '@xen-orchestra/log' import { decorateWith } from '@vates/decorate-with' import { defer } from 'golike-defer' import { format, parse } from 'json-rpc-peer' import { incorrectState, noSuchObject } from 'xo-common/api-errors.js' -import { isEmpty, mapValues, some, omit } from 'lodash' import { parseDuration } from '@vates/parse-duration' import { readChunk } from '@vates/read-chunk' import { Ref } from 'xen-api' +import { synchronized } from 'decorator-synchronized' import { timeout } from 'promise-toolbox' -import Collection from '../collection/redis.js' -import patch from '../patch.js' -import { extractIpFromVmNetworks } from '../_extractIpFromVmNetworks.js' -import { generateToken } from '../utils.js' +import Collection from '../collection/redis.mjs' +import patch from '../patch.mjs' +import { extractIpFromVmNetworks } from '../_extractIpFromVmNetworks.mjs' +import { generateToken } from '../utils.mjs' const extractProperties = _ => _.properties const omitToken = proxy => omit(proxy, 'authenticationToken') diff --git a/packages/xo-server/src/xo-mixins/remotes.js b/packages/xo-server/src/xo-mixins/remotes.mjs similarity index 96% rename from packages/xo-server/src/xo-mixins/remotes.js rename to packages/xo-server/src/xo-mixins/remotes.mjs index 86deddae7..08ea84727 100644 --- a/packages/xo-server/src/xo-mixins/remotes.js +++ b/packages/xo-server/src/xo-mixins/remotes.mjs @@ -1,13 +1,13 @@ import asyncMapSettled from '@xen-orchestra/async-map/legacy.js' -import synchronized from 'decorator-synchronized' import { format, parse } from 'xo-remote-parser' import { getHandler } from '@xen-orchestra/fs' import { ignoreErrors, timeout } from 'promise-toolbox' import { noSuchObject } from 'xo-common/api-errors.js' +import { synchronized } from 'decorator-synchronized' -import * as sensitiveValues from '../sensitive-values.js' -import patch from '../patch.js' -import { Remotes } from '../models/remote.js' +import * as sensitiveValues from '../sensitive-values.mjs' +import patch from '../patch.mjs' +import { Remotes } from '../models/remote.mjs' // =================================================================== diff --git a/packages/xo-server/src/xo-mixins/resource-sets.js b/packages/xo-server/src/xo-mixins/resource-sets.mjs similarity index 96% rename from packages/xo-server/src/xo-mixins/resource-sets.js rename to packages/xo-server/src/xo-mixins/resource-sets.mjs index d15851d9c..4a8e1f5e5 100644 --- a/packages/xo-server/src/xo-mixins/resource-sets.js +++ b/packages/xo-server/src/xo-mixins/resource-sets.mjs @@ -1,11 +1,18 @@ import asyncMapSettled from '@xen-orchestra/async-map/legacy.js' -import synchronized from 'decorator-synchronized' +import difference from 'lodash/difference.js' +import every from 'lodash/every.js' +import forEach from 'lodash/forEach.js' +import isObject from 'lodash/isObject.js' +import keyBy from 'lodash/keyBy.js' +import mapToArray from 'lodash/map.js' +import remove from 'lodash/remove.js' +import some from 'lodash/some.js' import { decorateWith } from '@vates/decorate-with' import { defer as deferrable } from 'golike-defer' -import { difference, every, forEach, isObject, keyBy, map as mapToArray, remove, some } from 'lodash' import { noSuchObject, notEnoughResources, unauthorized } from 'xo-common/api-errors.js' +import { synchronized } from 'decorator-synchronized' -import { generateUnsecureToken, lightSet, map, streamToArray } from '../utils.js' +import { generateUnsecureToken, lightSet, map, streamToArray } from '../utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/xo-mixins/scheduling.js b/packages/xo-server/src/xo-mixins/scheduling.mjs similarity index 96% rename from packages/xo-server/src/xo-mixins/scheduling.js rename to packages/xo-server/src/xo-mixins/scheduling.mjs index 49decc654..a9134a916 100644 --- a/packages/xo-server/src/xo-mixins/scheduling.js +++ b/packages/xo-server/src/xo-mixins/scheduling.mjs @@ -1,11 +1,11 @@ import asyncMapSettled from '@xen-orchestra/async-map/legacy.js' +import keyBy from 'lodash/keyBy.js' import { createSchedule } from '@xen-orchestra/cron' import { ignoreErrors } from 'promise-toolbox' -import { keyBy } from 'lodash' import { noSuchObject } from 'xo-common/api-errors.js' -import Collection from '../collection/redis.js' -import patch from '../patch.js' +import Collection from '../collection/redis.mjs' +import patch from '../patch.mjs' const normalize = schedule => { const { enabled } = schedule diff --git a/packages/xo-server/src/xo-mixins/store.js b/packages/xo-server/src/xo-mixins/store.mjs similarity index 93% rename from packages/xo-server/src/xo-mixins/store.js rename to packages/xo-server/src/xo-mixins/store.mjs index bd238390f..6a9b10e98 100644 --- a/packages/xo-server/src/xo-mixins/store.js +++ b/packages/xo-server/src/xo-mixins/store.mjs @@ -1,8 +1,8 @@ +import fse from 'fs-extra' import jsonStringifySafe from 'json-stringify-safe' import levelup from 'level-party' import sublevel from 'subleveldown' import { createLogger } from '@xen-orchestra/log' -import { ensureDir } from 'fs-extra' const log = createLogger('xo:store') @@ -50,7 +50,7 @@ const valueEncoding = { export default class { constructor(app) { const dir = `${app.config.get('datadir')}/leveldb` - this._db = ensureDir(dir).then(() => levelup(dir)) + this._db = fse.ensureDir(dir).then(() => levelup(dir)) } async getStore(namespace) { diff --git a/packages/xo-server/src/xo-mixins/subjects.js b/packages/xo-server/src/xo-mixins/subjects.mjs similarity index 98% rename from packages/xo-server/src/xo-mixins/subjects.js rename to packages/xo-server/src/xo-mixins/subjects.mjs index 17f4e75cb..1f8e7f262 100644 --- a/packages/xo-server/src/xo-mixins/subjects.js +++ b/packages/xo-server/src/xo-mixins/subjects.mjs @@ -1,13 +1,13 @@ +import filter from 'lodash/filter.js' import { createLogger } from '@xen-orchestra/log' -import { filter } from 'lodash' import { ignoreErrors } from 'promise-toolbox' import { hash, needsRehash, verify } from 'hashy' import { invalidCredentials, noSuchObject } from 'xo-common/api-errors.js' -import * as XenStore from '../_XenStore.js' -import { Groups } from '../models/group.js' -import { Users } from '../models/user.js' -import { forEach, isEmpty, lightSet } from '../utils.js' +import * as XenStore from '../_XenStore.mjs' +import { Groups } from '../models/group.mjs' +import { Users } from '../models/user.mjs' +import { forEach, isEmpty, lightSet } from '../utils.mjs' // =================================================================== diff --git a/packages/xo-server/src/xo-mixins/xen-servers.js b/packages/xo-server/src/xo-mixins/xen-servers.mjs similarity index 98% rename from packages/xo-server/src/xo-mixins/xen-servers.js rename to packages/xo-server/src/xo-mixins/xen-servers.mjs index bbdcdfa78..36640b4d5 100644 --- a/packages/xo-server/src/xo-mixins/xen-servers.js +++ b/packages/xo-server/src/xo-mixins/xen-servers.mjs @@ -1,16 +1,16 @@ +import findKey from 'lodash/findKey.js' import { BaseError } from 'make-error' import { createLogger } from '@xen-orchestra/log' import { fibonacci } from 'iterable-backoff' -import { findKey } from 'lodash' import { noSuchObject } from 'xo-common/api-errors.js' import { pDelay, ignoreErrors } from 'promise-toolbox' -import * as XenStore from '../_XenStore.js' -import Xapi from '../xapi/index.js' -import xapiObjectToXo from '../xapi-object-to-xo.js' -import XapiStats from '../xapi-stats.js' -import { camelToSnakeCase, forEach, isEmpty, popProperty } from '../utils.js' -import { Servers } from '../models/server.js' +import * as XenStore from '../_XenStore.mjs' +import Xapi from '../xapi/index.mjs' +import xapiObjectToXo from '../xapi-object-to-xo.mjs' +import XapiStats from '../xapi-stats.mjs' +import { camelToSnakeCase, forEach, isEmpty, popProperty } from '../utils.mjs' +import { Servers } from '../models/server.mjs' // =================================================================== diff --git a/packages/xo-server/src/xo.js b/packages/xo-server/src/xo.mjs similarity index 95% rename from packages/xo-server/src/xo.js rename to packages/xo-server/src/xo.mjs index 990848012..958a1092f 100644 --- a/packages/xo-server/src/xo.js +++ b/packages/xo-server/src/xo.mjs @@ -1,20 +1,24 @@ import Config from '@xen-orchestra/mixins/Config.js' +import forEach from 'lodash/forEach.js' import Hooks from '@xen-orchestra/mixins/Hooks.js' +import includes from 'lodash/includes.js' +import isEmpty from 'lodash/isEmpty.js' +import iteratee from 'lodash/iteratee.js' import mixin from '@xen-orchestra/mixin' import mixinLegacy from '@xen-orchestra/mixin/legacy.js' +import stubTrue from 'lodash/stubTrue.js' import { Collection as XoCollection } from 'xo-collection' import { createClient as createRedisClient } from 'redis' import { createDebounceResource } from '@vates/disposable/debounceResource.js' import { createLogger } from '@xen-orchestra/log' import { EventEmitter } from 'events' import { noSuchObject } from 'xo-common/api-errors.js' -import { forEach, includes, isEmpty, iteratee, stubTrue } from 'lodash' import { parseDuration } from '@vates/parse-duration' import { UniqueIndex as XoUniqueIndex } from 'xo-collection/unique-index.js' -import mixins from './xo-mixins/index.js' -import Connection from './connection.js' -import { generateToken, noop } from './utils.js' +import mixins from './xo-mixins/index.mjs' +import Connection from './connection.mjs' +import { generateToken, noop } from './utils.mjs' // =================================================================== @@ -59,6 +63,8 @@ export default class Xo extends EventEmitter { this.hooks.on('stop', debounceResource.flushAll) this.debounceResource = debounceResource + + this.version = opts.appVersion } get objects() { diff --git a/yarn.lock b/yarn.lock index 4e661157b..0fb2abb52 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5284,6 +5284,11 @@ decorator-synchronized@^0.5.0: resolved "https://registry.yarnpkg.com/decorator-synchronized/-/decorator-synchronized-0.5.0.tgz#0d457bafa0685f30e8a796941da512587feecb2c" integrity sha512-PAs5w8+d5TlrvkuEWSAHJ9DJc0I8ElH5F23F+hhUUbK/EUmApG/ZqqYF/+AwExaALI+LxzhBWMH5xVpvsmVFeQ== +decorator-synchronized@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/decorator-synchronized/-/decorator-synchronized-0.6.0.tgz#797321196021b358d31c98780b595112e81b6c56" + integrity sha512-BcJJEuyzjCH2I8/Y1xlnQ8s6AWDFD7+1h6MFamTln8JROeYRrAF+nifscQRHPYs4J4G0lb+LWG5nODLj6m4KFw== + dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -8580,6 +8585,15 @@ index-modules@^0.4.0: lodash "^4.17.4" promise-toolbox "^0.19.0" +index-modules@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/index-modules/-/index-modules-0.4.2.tgz#22199097b5362a11858737541c999fb7fb1b77f3" + integrity sha512-LpnQTsCgdsT0RhfwECfHsnW1CW+j6w/epH4MWskNTXfbXGn/A7766q0ZVKgsxzk52h9RIUkvzbOuXEWQdqfXsQ== + dependencies: + getopts "^2.3.0" + lodash "^4.17.4" + promise-toolbox "^0.19.0" + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -10335,6 +10349,11 @@ limit-concurrency-decorator@^0.5.0: resolved "https://registry.yarnpkg.com/limit-concurrency-decorator/-/limit-concurrency-decorator-0.5.0.tgz#7455fc7c8d12e93ce725cb98dc18b861397dd726" integrity sha512-s5HqdnTpRJhvK/vleMY3qJ3yEfIQ1BUCUqbBJwtXCKngMSc+qpS1Rl6/rxdhr1Z/oQz3keYho6G4XCFSHb7nbA== +limit-concurrency-decorator@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/limit-concurrency-decorator/-/limit-concurrency-decorator-0.5.0.tgz#7455fc7c8d12e93ce725cb98dc18b861397dd726" + integrity sha512-s5HqdnTpRJhvK/vleMY3qJ3yEfIQ1BUCUqbBJwtXCKngMSc+qpS1Rl6/rxdhr1Z/oQz3keYho6G4XCFSHb7nbA== + lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"