From adf5df9de0f8498b7a2b49e0ad0e4d9e0c91d63a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Thu, 19 Dec 2024 14:54:38 +0100 Subject: [PATCH 01/11] add ObjectID alias to backward compatible of meteor packages --- packages/mongo/mongo_common.js | 4 +++- packages/mongo/tests/mongo_livedata_tests.js | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/mongo/mongo_common.js b/packages/mongo/mongo_common.js index af2ec849c5..ee5c575443 100644 --- a/packages/mongo/mongo_common.js +++ b/packages/mongo/mongo_common.js @@ -1,7 +1,9 @@ import clone from 'lodash.clone' /** @type {import('mongodb')} */ -export const MongoDB = NpmModuleMongodb; +export const MongoDB = Object.assign(NpmModuleMongodb, { + ObjectID: NpmModuleMongodb.ObjectId, +}); // The write methods block until the database has confirmed the write (it may // not be replicated or stable on disk, but one server has confirmed it) if no diff --git a/packages/mongo/tests/mongo_livedata_tests.js b/packages/mongo/tests/mongo_livedata_tests.js index 48ad53fc2b..c17202dd21 100644 --- a/packages/mongo/tests/mongo_livedata_tests.js +++ b/packages/mongo/tests/mongo_livedata_tests.js @@ -3967,6 +3967,11 @@ Meteor.isServer && typeof MongoInternals.NpmModules.mongodb.module.ObjectId, 'function' ); + test.equal( + MongoInternals.NpmModule.ObjectID, + MongoInternals.NpmModule.ObjectId, + 'MongoInternals.ObjectID should be an alias for MongoInternals.ObjectId' + ); var c = new Mongo.Collection(Random.id()); var rawCollection = c.rawCollection(); From 2070514ffd56e07ed86589534c29475f24f23320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Thu, 19 Dec 2024 16:26:37 +0100 Subject: [PATCH 02/11] use a proxy for deprecation --- packages/mongo/mongo_driver.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/mongo/mongo_driver.js b/packages/mongo/mongo_driver.js index 6518967967..441a503670 100644 --- a/packages/mongo/mongo_driver.js +++ b/packages/mongo/mongo_driver.js @@ -18,7 +18,17 @@ MongoInternals.NpmModules = { // MongoInternals.NpmModules.mongodb.module. It was never documented, but // people do use it. // XXX COMPAT WITH 1.0.3.2 -MongoInternals.NpmModule = MongoDB; +MongoInternals.NpmModule = new Proxy(MongoDB, { + get(target, propertyKey, receiver) { + if (propertyKey === 'ObjectID') { + console.warn( + `Accessing 'MongoInternals.NpmModule.ObjectID' directly is deprecated. ` + + `Use 'MongoInternals.NpmModules.mongodb.module.ObjectId' instead.` + ); + } + return Reflect.get(target, propertyKey, receiver); + }, +}); MongoInternals.OplogHandle = OplogHandle; From 560e2e5f70512d21325f3ae682057e062bf4a65e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Thu, 19 Dec 2024 16:33:03 +0100 Subject: [PATCH 03/11] fix log --- packages/mongo/mongo_driver.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mongo/mongo_driver.js b/packages/mongo/mongo_driver.js index 441a503670..5933bff913 100644 --- a/packages/mongo/mongo_driver.js +++ b/packages/mongo/mongo_driver.js @@ -23,7 +23,7 @@ MongoInternals.NpmModule = new Proxy(MongoDB, { if (propertyKey === 'ObjectID') { console.warn( `Accessing 'MongoInternals.NpmModule.ObjectID' directly is deprecated. ` + - `Use 'MongoInternals.NpmModules.mongodb.module.ObjectId' instead.` + `Use 'MongoInternals.NpmModule.ObjectId' instead.` ); } return Reflect.get(target, propertyKey, receiver); From 601820f7e5f2b6a32d219cccd7981140d7bcafca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Thu, 19 Dec 2024 18:02:40 +0100 Subject: [PATCH 04/11] implement machinery to Meteor.deprecate --- packages/meteor/deprecate.js | 35 +++++++++++++++++++++++++++++++++++ packages/meteor/package.js | 1 + 2 files changed, 36 insertions(+) create mode 100644 packages/meteor/deprecate.js diff --git a/packages/meteor/deprecate.js b/packages/meteor/deprecate.js new file mode 100644 index 0000000000..aee1b303e9 --- /dev/null +++ b/packages/meteor/deprecate.js @@ -0,0 +1,35 @@ +function cleanStackTrace(stackTrace) { + if (!stackTrace) return []; + const lines = stackTrace.split('\n'); + const trace = []; + for (const line of lines) { + const _line = line.trim(); + if (_line.includes('Meteor.deprecate')) continue; + if (_line.includes('packages/')) { + trace.push(_line); + } else if (_line && _line.includes('/')) { + // Stop processing if a valid path that does not start with 'packages/**' is found + break; + } + } + return trace.join('\n'); +} + +Meteor.deprecate = function (...messages) { + if (!Meteor.isDevelopment) { + return; + } + if (typeof console !== 'undefined' && typeof console.warn !== 'undefined') { + const stackStrace = cleanStackTrace(new Error().stack || ''); + console.warn( + '[DEPRECATION]', + ...messages, + ...stackStrace?.length > 0 && [ + '\n\n', + 'Trace:', + '\n', + stackStrace + ] || [] + ); + } +}; diff --git a/packages/meteor/package.js b/packages/meteor/package.js index 9a0b55cd0a..42b1de6c62 100644 --- a/packages/meteor/package.js +++ b/packages/meteor/package.js @@ -41,6 +41,7 @@ Package.onUse(function (api) { api.addFiles('startup_client.js', ['client']); api.addFiles('startup_server.js', ['server']); api.addFiles('debug.js', ['client', 'server']); + api.addFiles('deprecate.js', ['client', 'server']); api.addFiles('string_utils.js', ['client', 'server']); api.addFiles('test_environment.js', ['client', 'server']); From e44a14e99dcb7779f8a60c665a04bddc68b2e615 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Thu, 19 Dec 2024 18:13:57 +0100 Subject: [PATCH 05/11] apply Meteor.deprecate on allow-deny and ObjectID --- packages/allow-deny/allow-deny.js | 2 +- packages/mongo/mongo_driver.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/allow-deny/allow-deny.js b/packages/allow-deny/allow-deny.js index cd071c4b4f..802cd467dd 100644 --- a/packages/allow-deny/allow-deny.js +++ b/packages/allow-deny/allow-deny.js @@ -554,7 +554,7 @@ function addValidator(collection, allowOrDeny, options) { const isAsyncKey = key.includes('Async'); if (isAsyncKey) { const syncKey = key.replace('Async', ''); - console.warn(allowOrDeny + `: The "${key}" key is deprecated. Use "${syncKey}" instead.`); + Meteor.deprecate(allowOrDeny + `: The "${key}" key is deprecated. Use "${syncKey}" instead.`); } }); diff --git a/packages/mongo/mongo_driver.js b/packages/mongo/mongo_driver.js index 5933bff913..1f7a014c5b 100644 --- a/packages/mongo/mongo_driver.js +++ b/packages/mongo/mongo_driver.js @@ -21,7 +21,7 @@ MongoInternals.NpmModules = { MongoInternals.NpmModule = new Proxy(MongoDB, { get(target, propertyKey, receiver) { if (propertyKey === 'ObjectID') { - console.warn( + Meteor.deprecate( `Accessing 'MongoInternals.NpmModule.ObjectID' directly is deprecated. ` + `Use 'MongoInternals.NpmModule.ObjectId' instead.` ); From 7b775016bf457d9130247adcb5676bc43c59773d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Thu, 19 Dec 2024 18:14:48 +0100 Subject: [PATCH 06/11] remove updateAsync as update rule already covers it --- packages/accounts-base/accounts_server.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/packages/accounts-base/accounts_server.js b/packages/accounts-base/accounts_server.js index cf8f573b1d..ed45af5a0f 100644 --- a/packages/accounts-base/accounts_server.js +++ b/packages/accounts-base/accounts_server.js @@ -1806,21 +1806,6 @@ const setupUsersCollection = async users => { return true; }, - updateAsync: (userId, user, fields, modifier) => { - // make sure it is our record - if (user._id !== userId) { - return false; - } - - // user can only modify the 'profile' field. sets to multiple - // sub-keys (eg profile.foo and profile.bar) are merged into entry - // in the fields list. - if (fields.length !== 1 || fields[0] !== 'profile') { - return false; - } - - return true; - }, fetch: ['_id'] // we only look at _id. }); @@ -1861,4 +1846,3 @@ const generateCasePermutationsForString = string => { } return permutations; } - From fe96f3df56dd7f56103284d0343ea4981dc22c9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Thu, 19 Dec 2024 18:23:50 +0100 Subject: [PATCH 07/11] replace const by var --- packages/meteor/deprecate.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/meteor/deprecate.js b/packages/meteor/deprecate.js index aee1b303e9..b19eb25e1e 100644 --- a/packages/meteor/deprecate.js +++ b/packages/meteor/deprecate.js @@ -1,9 +1,9 @@ function cleanStackTrace(stackTrace) { if (!stackTrace) return []; - const lines = stackTrace.split('\n'); - const trace = []; - for (const line of lines) { - const _line = line.trim(); + var lines = stackTrace.split('\n'); + var trace = []; + for (var line of lines) { + var _line = line.trim(); if (_line.includes('Meteor.deprecate')) continue; if (_line.includes('packages/')) { trace.push(_line); @@ -20,7 +20,7 @@ Meteor.deprecate = function (...messages) { return; } if (typeof console !== 'undefined' && typeof console.warn !== 'undefined') { - const stackStrace = cleanStackTrace(new Error().stack || ''); + var stackStrace = cleanStackTrace(new Error().stack || ''); console.warn( '[DEPRECATION]', ...messages, From 3b6363455d50b450d624dbeed127333ea327d75e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Thu, 19 Dec 2024 18:37:44 +0100 Subject: [PATCH 08/11] transform code --- packages/meteor/deprecate.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/meteor/deprecate.js b/packages/meteor/deprecate.js index b19eb25e1e..284a01a07a 100644 --- a/packages/meteor/deprecate.js +++ b/packages/meteor/deprecate.js @@ -2,12 +2,12 @@ function cleanStackTrace(stackTrace) { if (!stackTrace) return []; var lines = stackTrace.split('\n'); var trace = []; - for (var line of lines) { - var _line = line.trim(); - if (_line.includes('Meteor.deprecate')) continue; - if (_line.includes('packages/')) { + for (var i = 0; i < lines.length; i++) { + var _line = lines[i].trim(); + if (_line.indexOf('Meteor.deprecate') !== -1) continue; + if (_line.indexOf('packages/') !== -1) { trace.push(_line); - } else if (_line && _line.includes('/')) { + } else if (_line && _line.indexOf('/') !== -1) { // Stop processing if a valid path that does not start with 'packages/**' is found break; } From fc543ae4b6865a5eb28455777804b6a339592d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Thu, 19 Dec 2024 18:40:45 +0100 Subject: [PATCH 09/11] transform code --- packages/meteor/deprecate.js | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/meteor/deprecate.js b/packages/meteor/deprecate.js index 284a01a07a..d49dc045e4 100644 --- a/packages/meteor/deprecate.js +++ b/packages/meteor/deprecate.js @@ -15,21 +15,18 @@ function cleanStackTrace(stackTrace) { return trace.join('\n'); } -Meteor.deprecate = function (...messages) { +Meteor.deprecate = function () { if (!Meteor.isDevelopment) { return; } if (typeof console !== 'undefined' && typeof console.warn !== 'undefined') { var stackStrace = cleanStackTrace(new Error().stack || ''); - console.warn( - '[DEPRECATION]', - ...messages, - ...stackStrace?.length > 0 && [ - '\n\n', - 'Trace:', - '\n', - stackStrace - ] || [] - ); + var messages = Array.prototype.slice.call(arguments); // Convert arguments to array + + if (stackStrace.length > 0) { + messages.push('\n\n', 'Trace:', '\n', stackStrace); + } + + console.warn.apply(console, ['[DEPRECATION]'].concat(messages)); } }; From f0da097ae892a5febb4be8a1c55635aec41935d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Fri, 20 Dec 2024 05:48:18 +0100 Subject: [PATCH 10/11] safety update to avoid crashes --- packages/meteor/deprecate.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/meteor/deprecate.js b/packages/meteor/deprecate.js index d49dc045e4..d10af51110 100644 --- a/packages/meteor/deprecate.js +++ b/packages/meteor/deprecate.js @@ -1,16 +1,20 @@ function cleanStackTrace(stackTrace) { - if (!stackTrace) return []; + if (!stackTrace || typeof stackTrace !== 'string') return []; var lines = stackTrace.split('\n'); var trace = []; - for (var i = 0; i < lines.length; i++) { - var _line = lines[i].trim(); - if (_line.indexOf('Meteor.deprecate') !== -1) continue; - if (_line.indexOf('packages/') !== -1) { - trace.push(_line); - } else if (_line && _line.indexOf('/') !== -1) { - // Stop processing if a valid path that does not start with 'packages/**' is found - break; + try { + for (var i = 0; i < lines.length; i++) { + var _line = lines[i].trim(); + if (_line.indexOf('Meteor.deprecate') !== -1) continue; + if (_line.indexOf('packages/') !== -1) { + trace.push(_line); + } else if (_line && _line.indexOf('/') !== -1) { + // Stop processing if a valid path that does not start with 'packages/**' is found + break; + } } + } catch (e) { + console.error('Error cleaning stack trace: ', e); } return trace.join('\n'); } From 4d2ff467510d82017e951df5951d9fb95d30405e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Fri, 20 Dec 2024 05:54:26 +0100 Subject: [PATCH 11/11] trace the line that caused the stop --- packages/meteor/deprecate.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/meteor/deprecate.js b/packages/meteor/deprecate.js index d10af51110..1e213ceeab 100644 --- a/packages/meteor/deprecate.js +++ b/packages/meteor/deprecate.js @@ -10,6 +10,7 @@ function cleanStackTrace(stackTrace) { trace.push(_line); } else if (_line && _line.indexOf('/') !== -1) { // Stop processing if a valid path that does not start with 'packages/**' is found + trace.push(_line); break; } }