From 5375d3967bcbe4167fe41a9922dc5633992aeb90 Mon Sep 17 00:00:00 2001 From: Tim Down <158919+timdown@users.noreply.github.com> Date: Thu, 4 Sep 2025 11:18:28 +0100 Subject: [PATCH] Merge pull request #28199 from overleaf/td-ar-script-runner-lint Add ESLint rule to require Script Runner for scripts in web GitOrigin-RevId: 94d5dac806e4c5480b7ed95cf8484a2d13ac8294 --- services/web/.eslintrc.js | 109 +++++++++++++++++++++- services/web/scripts/check_docs.mjs | 4 +- services/web/scripts/lib/ScriptRunner.mjs | 3 + 3 files changed, 113 insertions(+), 3 deletions(-) diff --git a/services/web/.eslintrc.js b/services/web/.eslintrc.js index 4b629698c1..ffaa0c96d9 100644 --- a/services/web/.eslintrc.js +++ b/services/web/.eslintrc.js @@ -228,7 +228,7 @@ module.exports = { }, { // Backend scripts specific rules - files: ['**/scripts/**/*.js'], + files: ['**/scripts/**/*.{js,mjs}'], rules: { 'no-restricted-syntax': [ 'error', @@ -256,6 +256,113 @@ module.exports = { ], }, }, + { + // Insist on using Script Runner for new scripts. Old scripts should be + // converted to use Script Runner in future, but are excluded for now + rules: { + '@overleaf/require-script-runner': 'error', + }, + files: ['**/scripts/**/*.mjs'], // ESM only + excludedFiles: [ + 'modules/admin-roles/scripts/import_admin_role_assignments.mjs', + 'modules/admin-roles/scripts/remove_admin_role_from_user.mjs', + 'modules/admin-roles/scripts/remove_admin_roles_from_non_admins.mjs', + 'modules/admin-roles/scripts/utils.mjs', + 'modules/institutions/scripts/apply_policy_to_institution.mjs', + 'modules/server-ce-scripts/scripts/change-compile-timeout.mjs', + 'modules/server-ce-scripts/scripts/check-mongodb.mjs', + 'modules/server-ce-scripts/scripts/check-redis.mjs', + 'modules/server-ce-scripts/scripts/check-texlive-images.mjs', + 'modules/server-ce-scripts/scripts/create-user.mjs', + 'modules/server-ce-scripts/scripts/delete-user.mjs', + 'modules/server-ce-scripts/scripts/export-user-projects.mjs', + 'modules/server-ce-scripts/scripts/migrate-user-emails.mjs', + 'modules/server-ce-scripts/scripts/rename-tag.mjs', + 'modules/server-ce-scripts/scripts/transfer-all-projects-to-user.mjs', + 'modules/server-ce-scripts/scripts/upgrade-user-features.mjs', + 'modules/subscriptions/scripts/backfill_user_last_trial.mjs', + 'scripts/add_feature_override.mjs', + 'scripts/add_subscription_members_csv.mjs', + 'scripts/analytics/helpers/GoogleBigQueryHelper.mjs', + 'scripts/attach_dangling_comments_to_doc.mjs', + 'scripts/back_fill_doc_rev.mjs', + 'scripts/backfill_mixpanel_user_properties.mjs', + 'scripts/backfill_project_image_name.mjs', + 'scripts/backfill_project_invites_token_hmac.mjs', + 'scripts/backfill_user_properties.mjs', + 'scripts/backfill_users_sso_attribute.mjs', + 'scripts/bench_bcrypt.mjs', + 'scripts/check_institution_users.mjs', + 'scripts/check_overleafModuleImports.mjs', + 'scripts/check_saml_emails.mjs', + 'scripts/clear_feedback_collection.mjs', + 'scripts/clear_sessions_set_must_reconfirm.mjs', + 'scripts/count_files_in_projects.mjs', + 'scripts/count_project_size.mjs', + 'scripts/create_oauth_personal_access_token.mjs', + 'scripts/create_project.mjs', + 'scripts/deactivate_projects.mjs', + 'scripts/delete-duplicate-splittest-versions/delete_test_dupes.mjs', + 'scripts/delete-orphaned-docs/delete-orphaned-docs.mjs', + 'scripts/delete_dangling_comments.mjs', + 'scripts/delete_orphaned_chat_threads.mjs', + 'scripts/delete_orphaned_data_helper.mjs', + 'scripts/delete_subscriptions.mjs', + 'scripts/e2e_test_setup.mjs', + 'scripts/ensure_affiliations.mjs', + 'scripts/esm-check-migration.mjs', + 'scripts/example/script_for_migration.mjs', + 'scripts/fix_collaborator_refs_null.mjs', + 'scripts/fix_comment_id.mjs', + 'scripts/helpers/chunkArray.mjs', + 'scripts/helpers/env_variable_helper.mjs', + 'scripts/inst_table.mjs', + 'scripts/invalidate_tokens.mjs', + 'scripts/ip_matcher_ranges.mjs', + 'scripts/learn/checkSanitize/checkSanitizeOptions.mjs', + 'scripts/learn/checkSanitize/scrape.mjs', + 'scripts/lezer-latex/benchmark.mjs', + 'scripts/lezer-latex/print-tree.mjs', + 'scripts/lezer-latex/random.mjs', + 'scripts/lezer-latex/run.mjs', + 'scripts/lezer-latex/test-incremental-parser.mjs', + 'scripts/mark_migration.mjs', + 'scripts/marketing-exports/error-assistant-export.mjs', + 'scripts/marketing-exports/export.mjs', + 'scripts/marketing-exports/linked-papers-users.mjs', + 'scripts/marketing-exports/papers-export.mjs', + 'scripts/marketing-exports/writefull-export.mjs', + 'scripts/oauth/upgrade_token_scopes.mjs', + 'scripts/plan-prices/plans.mjs', + 'scripts/process_lapsed_reconfirmations.mjs', + 'scripts/purge_non_logged_in_sessions.mjs', + 'scripts/recurly/generate_recurly_prices.mjs', + 'scripts/recurly/get_paypal_accounts_csv.mjs', + 'scripts/recurly/recurly_prices.mjs', + 'scripts/recurly/resync_recurly_state_single_subscription.mjs', + 'scripts/recurly/resync_subscriptions.mjs', + 'scripts/recurly/set_manually_collected_subscriptions.mjs', + 'scripts/refresh_features.mjs', + 'scripts/regenerate_duplicate_referral_ids.mjs', + 'scripts/remove_deleted_users_from_token_access_refs.mjs', + 'scripts/remove_email.mjs', + 'scripts/remove_user_enrollment.mjs', + 'scripts/sso_id_migration_check.mjs', + 'scripts/stress_test.mjs', + 'scripts/suspend_users.mjs', + 'scripts/sync-user-entitlements/sync-user-entitlements.mjs', + 'scripts/update_project_image_name.mjs', + 'scripts/user-export/fs.mjs', + 'scripts/user-export/http.mjs', + 'scripts/user-export/observer.mjs', + 'scripts/user-export/options.mjs', + 'scripts/user-export/project.mjs', + 'scripts/user-export/scrubber.mjs', + 'scripts/user-export/stream.mjs', + 'scripts/user-export/user.mjs', + 'scripts/validate-data-of-model.mjs', + ], + }, { // Cypress specific rules files: [ diff --git a/services/web/scripts/check_docs.mjs b/services/web/scripts/check_docs.mjs index 3b7e17128e..de93f5545a 100644 --- a/services/web/scripts/check_docs.mjs +++ b/services/web/scripts/check_docs.mjs @@ -48,7 +48,7 @@ function parseArgs() { } function usage() { - console.log(`Usage: find_dangling_comments.mjs [OPTS] + console.log(`Usage: check_docs.mjs [OPTS] Options: @@ -205,7 +205,7 @@ async function findDanglingThreadIds(projectId, docs) { return [] } - const rooms = await db.rooms.find( + const rooms = db.rooms.find( { project_id: new ObjectId(projectId), thread_id: { $exists: true } }, { readPreference: READ_PREFERENCE_SECONDARY } ) diff --git a/services/web/scripts/lib/ScriptRunner.mjs b/services/web/scripts/lib/ScriptRunner.mjs index 478a71815b..3cf55d9827 100644 --- a/services/web/scripts/lib/ScriptRunner.mjs +++ b/services/web/scripts/lib/ScriptRunner.mjs @@ -1,3 +1,6 @@ +/* eslint-disable @overleaf/require-script-runner */ +// This *is* ScriptRunner. + import { ScriptLog } from '../../app/src/models/ScriptLog.mjs' import Settings from '@overleaf/settings'