diff --git a/services/web/modules/server-ce-scripts/scripts/export-legacy-user-projects.mjs b/services/web/modules/server-ce-scripts/scripts/export-legacy-user-projects.mjs index 376b6619b4..d7fcbed45d 100644 --- a/services/web/modules/server-ce-scripts/scripts/export-legacy-user-projects.mjs +++ b/services/web/modules/server-ce-scripts/scripts/export-legacy-user-projects.mjs @@ -1,18 +1,19 @@ -const minimist = require('minimist') -const { +/* eslint-disable @overleaf/require-script-runner */ +import minimist from 'minimist' +import { mkdirSync, createWriteStream, existsSync, unlinkSync, renameSync, -} = require('fs') -const mongodb = require('../app/src/infrastructure/mongodb') -const DocumentUpdaterHandler = require('../app/src/Features/DocumentUpdater/DocumentUpdaterHandler.js') -const ProjectZipStreamManager = require('../app/src/Features/Downloads/ProjectZipStreamManager.js') -const logger = require('logger-sharelatex') -const { Project } = require('../app/src/models/Project.js') -const { User } = require('../app/src/models/User.js') -const readline = require('readline') +} from 'fs' +import mongodb from '../../../app/src/infrastructure/mongodb.js' +import DocumentUpdaterHandler from '../../../app/src/Features/DocumentUpdater/DocumentUpdaterHandler.js' +import ProjectZipStreamManager from '../../../app/src/Features/Downloads/ProjectZipStreamManager.js' +import logger from 'logger-sharelatex' +import { Project } from '../../../app/src/models/Project.js' +import { User } from '../../../app/src/models/User.js' +import readline from 'readline' function parseArgs() { return minimist(process.argv.slice(2), { diff --git a/services/web/scripts/check_project_files.mjs b/services/web/scripts/check_project_files.mjs index 41d023e72f..e6ca2d1602 100644 --- a/services/web/scripts/check_project_files.mjs +++ b/services/web/scripts/check_project_files.mjs @@ -1,19 +1,22 @@ -const Path = require('path') -const DocstoreManager = require('../app/src/Features/Docstore/DocstoreManager') -const DocumentUpdaterHandler = require('../app/src/Features/DocumentUpdater/DocumentUpdaterHandler') -const ProjectGetter = require('../app/src/Features/Project/ProjectGetter') -const ProjectEntityMongoUpdateHandler = require('../app/src/Features/Project/ProjectEntityMongoUpdateHandler') -const { waitForDb, db, ObjectId } = require('../app/src/infrastructure/mongodb') -const HistoryManager = require('../app/src/Features/History/HistoryManager') -const logger = require('@overleaf/logger').logger +import { scriptRunner } from './lib/ScriptRunner.mjs' +import Path from 'node:path' +import DocstoreManager from '../app/src/Features/Docstore/DocstoreManager.js' +import DocumentUpdaterHandler from '../app/src/Features/DocumentUpdater/DocumentUpdaterHandler.js' +import ProjectGetter from '../app/src/Features/Project/ProjectGetter.js' +import ProjectEntityMongoUpdateHandler from '../app/src/Features/Project/ProjectEntityMongoUpdateHandler.js' +import { waitForDb, db, ObjectId } from '../app/src/infrastructure/mongodb.js' +import HistoryManager from '../app/src/Features/History/HistoryManager.js' +import logger from '@overleaf/logger' +import minimist from 'minimist' -const args = require('minimist')(process.argv.slice(2), { +const args = minimist(process.argv.slice(2), { boolean: ['verbose', 'fix'], }) + const verbose = args.verbose if (!verbose) { - logger.level('error') + logger.logger.level('error') } // no remaining arguments, print usage @@ -254,7 +257,7 @@ async function main() { } } -main() +scriptRunner(main, args) .then(() => { console.log('DONE') process.exit(0) diff --git a/services/web/scripts/extract_day1_churn_users.mjs b/services/web/scripts/extract_day1_churn_users.mjs index 5bc17c5481..0dd50e2099 100644 --- a/services/web/scripts/extract_day1_churn_users.mjs +++ b/services/web/scripts/extract_day1_churn_users.mjs @@ -1,7 +1,8 @@ -const csv = require('csv') -const fs = require('fs') -const minimist = require('minimist') -const { User } = require('../app/src/models/User') +import { scriptRunner } from './lib/ScriptRunner.mjs' +import * as csv from 'csv' +import fs from 'node:fs' +import minimist from 'minimist' +import { User } from '../app/src/models/User.js' /** * This script extracts users who churned after day 1 - ie. their last session was within 24 hours of registering @@ -205,9 +206,9 @@ async function getDay1ChurnUsers({ return allChurnUsers } -async function runScript() { - const args = parseArgs() +const args = parseArgs() +async function runScript() { console.log( `Starting Day 1 churn extraction with lookback period: ${args.lookbackMonths} months` ) @@ -268,7 +269,7 @@ async function runScript() { ) } -runScript().catch(err => { +scriptRunner(runScript, args).catch(err => { console.error('Script failed:', err) process.exit(1) }) diff --git a/services/web/scripts/extract_onboardingdatacollection_csv.mjs b/services/web/scripts/extract_onboardingdatacollection_csv.mjs index 3f47e2c6c9..a485a623dd 100644 --- a/services/web/scripts/extract_onboardingdatacollection_csv.mjs +++ b/services/web/scripts/extract_onboardingdatacollection_csv.mjs @@ -1,8 +1,7 @@ -const csv = require('csv') -const fs = require('fs') -const { - OnboardingDataCollection, -} = require('../app/src/models/OnboardingDataCollection') +import { scriptRunner } from './lib/ScriptRunner.mjs' +import * as csv from 'csv' +import fs from 'node:fs' +import { OnboardingDataCollection } from '../app/src/models/OnboardingDataCollection.js' /** * This script extracts the OnboardingDataCollection collection from the database @@ -90,7 +89,7 @@ const runScript = async () => { csvWriter.on('error', err => console.error('CSV Writer Error:', err)) } -runScript().catch(err => { +scriptRunner(runScript).catch(err => { console.error(err) process.exit(1) }) diff --git a/services/web/scripts/extract_onboardingdatacollection_never_used_latex.mjs b/services/web/scripts/extract_onboardingdatacollection_never_used_latex.mjs index 0d038df870..313d074115 100644 --- a/services/web/scripts/extract_onboardingdatacollection_never_used_latex.mjs +++ b/services/web/scripts/extract_onboardingdatacollection_never_used_latex.mjs @@ -1,13 +1,12 @@ -const csv = require('csv') -const fs = require('fs') -const minimist = require('minimist') -const { - OnboardingDataCollection, -} = require('../app/src/models/OnboardingDataCollection') -const { User } = require('../app/src/models/User') -const SubscriptionLocator = require('../app/src/Features/Subscription/SubscriptionLocator') -const Settings = require('@overleaf/settings') -const { fetchJson } = require('@overleaf/fetch-utils') +import { scriptRunner } from './lib/ScriptRunner.mjs' +import * as csv from 'csv' +import fs from 'node:fs' +import minimist from 'minimist' +import { OnboardingDataCollection } from '../app/src/models/OnboardingDataCollection.js' +import { User } from '../app/src/models/User.js' +import SubscriptionLocator from '../app/src/Features/Subscription/SubscriptionLocator.js' +import Settings from '@overleaf/settings' +import { fetchJson } from '@overleaf/fetch-utils' /** * This script extracts ODC data with some extra fields, and filters on registration date and LaTeX experience @@ -146,12 +145,11 @@ async function getUserCountries(institutions) { } return countryCodes } +const args = parseArgs() async function runScript() { const columns = ['email'] - const args = parseArgs() - if (args.includeSignUpDate) { columns.push('signUpDate') } @@ -196,7 +194,7 @@ async function runScript() { ) } -runScript().catch(err => { +scriptRunner(runScript, args).catch(err => { console.error(err) process.exit(1) }) diff --git a/services/web/scripts/lezer-latex/generate.mjs b/services/web/scripts/lezer-latex/generate.mjs index b2e73ffc04..98406b16e6 100644 --- a/services/web/scripts/lezer-latex/generate.mjs +++ b/services/web/scripts/lezer-latex/generate.mjs @@ -1,33 +1,35 @@ -const { buildParserFile } = require('@lezer/generator') -const { writeFileSync, readFileSync } = require('fs') -const path = require('path') +/* eslint-disable @overleaf/require-script-runner */ +// This script doesn't work with ScriptRunner because it is run during the build process. +import { buildParserFile } from '@lezer/generator' +import { writeFileSync, readFileSync } from 'node:fs' +import path from 'node:path' const grammars = [ { grammarPath: path.resolve( - __dirname, + import.meta.dirname, '../../frontend/js/features/source-editor/lezer-latex/latex.grammar' ), parserOutputPath: path.resolve( - __dirname, + import.meta.dirname, '../../frontend/js/features/source-editor/lezer-latex/latex.mjs' ), termsOutputPath: path.resolve( - __dirname, + import.meta.dirname, '../../frontend/js/features/source-editor/lezer-latex/latex.terms.mjs' ), }, { grammarPath: path.resolve( - __dirname, + import.meta.dirname, '../../frontend/js/features/source-editor/lezer-bibtex/bibtex.grammar' ), parserOutputPath: path.resolve( - __dirname, + import.meta.dirname, '../../frontend/js/features/source-editor/lezer-bibtex/bibtex.mjs' ), termsOutputPath: path.resolve( - __dirname, + import.meta.dirname, '../../frontend/js/features/source-editor/lezer-bibtex/bibtex.terms.mjs' ), }, @@ -56,9 +58,12 @@ function compile(grammar) { console.info('Done!') } -module.exports = { compile, grammars } +export default { compile, grammars } -if (require.main === module) { +if ( + import.meta.url === process.argv[1] || + import.meta.url === `file://${process.argv[1]}` +) { try { grammars.forEach(compile) process.exit(0) diff --git a/services/web/scripts/recurly/setup_assistant_addon.mjs b/services/web/scripts/recurly/setup_assistant_addon.mjs index bba4cb3e04..51ef64e9e3 100644 --- a/services/web/scripts/recurly/setup_assistant_addon.mjs +++ b/services/web/scripts/recurly/setup_assistant_addon.mjs @@ -1,9 +1,9 @@ // @ts-check - -const _ = require('lodash') -const recurly = require('recurly') -const minimist = require('minimist') -const Settings = require('@overleaf/settings') +import { scriptRunner } from '../lib/ScriptRunner.mjs' +import _ from 'lodash' +import recurly from 'recurly' +import minimist from 'minimist' +import Settings from '@overleaf/settings' const ADD_ON_CODE = 'assistant' const ADD_ON_NAME = 'AI Assist' @@ -209,7 +209,7 @@ function getAddOnConfig(prices) { } } -main() +scriptRunner(main) .then(() => { process.exit(0) })