Loading...
Loading...
Best practices, coding conventions, and patterns for backend projects using TypeScript. Use when writing code, tests, or new features in TypeScript backends with src/, Express, PostgreSQL/MongoDB, and Mocha+tsx.
npx skill4agent add marco-meini/cursor yn-be-developer-typescriptcommands/.test.tssrc/env.pgConnectionenv.pgModels"type": "module"dist/.tsfrom "./app.js".ts.mjs--require tsx/cjstsx/register.test.tsexpectassertsinon.stub(controller as any, 'login')__methodNamedescribe('<ClassName>')describe('<methodName>')__res.localsres.locals.idres.locals.limitres.locals.offsetsrc/
controllers/ # HTTP layer (extend Abstract_Controller, bind this.methodName)
lib/ # Utilities, express-middlewares (validIntegerPathParam, parsePaginationParams)
model/
postgres/ # PgModels, Abstract_PgModel; register in pg-models.ts
mongo/ # MongoModels, Abstract_BaseCollection
cronie/ # Batch entry points (e.g. main-cronie.ts)
config/ # config.ts (or config.json)
docs/ # OpenAPI YAML fragments
test/ # .test.ts mirroring src (test/controllers/, test/lib/, test/lib/notifications/, test/model/...)super(env, "<scope>")this.router.get("/", ..., this.methodName.bind(this))__logingetNationsgetAssociations(controller as any).methodName(...)HttpResponseStatusenv.pgConnectionenv.pgModelsvalidIntegerPathParam('<param>')parsePaginationParams(required)validIntegerQueryParam('<param>', required?)res.locals[param]res.locals.idenv.pgConnectionqueryqueryReturnFirstqueryPagedinsertupdateByKeystartTransactioncommitrollbacktransactionClient: ttransactionenv.pgModels.<model>.<method>()Abstract_PgModelgetStatusIdByCode(status)getBySlug(slug)isSlave: true["id_us"]['id_up']id_last_updater_uprequest.session.idUserenv.mongoClientenv.mongoModelsscheduled_phone_settings_spscheduled-phone-settings.model.tsI<TableName>RecordIRetryRowIListItemscheduled_phone_setting_fails_sfIScheduledPhoneSettingFailRecord*RecordIUserRecord_usIUserExtendedfullnamedepartmentFullnamepbxplan| stringJSON.stringify(...)automatic_data_pm?: IAutomaticDataPm | stringIWorkingPlanRecordIWorkingPlanExtended extends IWorkingPlanRecordusers?workingPlan.users?.map(...) ?? []Buffer | string_.isNil(variable)_.isArray(x)if (_.isNil(numbers) || !_.isArray(numbers) || numbers.length === 0)Number.isInteger(id) && id > 0'invalid'result?.rows ?? []auth.controller.tsexpress-middlewares.tsAuthControllerExpressMiddlewares__logingetNationsprivatenext(error).send("ERROR_MESSAGE")STATUS_REQUIREDCATEGORY_NAME_REQUIREDCHOICE_VALUE_ALREADY_EXISTS"MISSING_PARAMS"sendStatusreturn response.status(HttpResponseStatus.MISSING_PARAMS).send("QUESTION_LABEL_REQUIRED");error.statuserror.errors{ maxAge, ... }{}null{ rows }SELECTSELECT row_to_json(q) AS question FROM (...) qquery<{ id_tq: number; mandatory: boolean; type: string; choices: ITicketQuestionChoiceRecord[]; tree: ITicketCustomizedTreesRecord }>LEFT JOINGROUP BYarray_agg(...) FILTER (WHERE ...)COALESCE(..., '{}')::integer[]SELECT tc.id_tc, tc.name_tc, COALESCE(array_agg(tcv.id_user_tcv) FILTER (WHERE tcv.id_user_tcv IS NOT NULL), '{}')::integer[] AS user_ids, ... FROM ticket_categories_tc tc LEFT JOIN ticket_category_visibilities_tcv tcv ON ... WHERE tc.id_customer_tc = $1 GROUP BY tc.id_tc, tc.name_tc ORDER BY tc.name_tcrow_to_json(alias) AS column_namerow_to_json(tct) AS treetree: ITicketCustomizedTreesRecordCOALESCE((SELECT json_agg(row_to_json(alias)) FROM table alias WHERE ...), '[]'::json) AS column_namechoices: ITicketQuestionChoiceRecord[]json_agg(row_to_json(...))I*Record${filterTree.getWhere(false)}const treeWhere = ...addEqualaddInaddConditiongetParameterPlaceHolder(value)$1$2addGreaterThan(col, val, true)>=addLessThan(col, val, true)<=addPagination(limit, offset)getPagination()LIMIT $n OFFSET $maddOrderByCondition(field, direction)getOrderBy()ORDER BY ...new PgFilter(0)getParameterPlaceHolder(id)replacements = where.replacementsconst t = await env.pgConnection.startTransaction()commit(t)rollback(t)transactionClient: tqueryinsertupdateByKeystartTransaction.resolves(t).returns(t)rollbackrollbacknextnext(rollbackError)logger.errornpm testnpm run test:all--require tsx/cjs(controller as any).methodName(...)describe('methodName', ...)__methodNamesinon.stub(controller as any, 'methodName')sendRequestparsePaddingTemplatetransactionClientcalledWithcalledOnceWithupdateByKeyresponse.cookieconfig.pubSubOptionsconfig.getstreamconfig.smsdocumentsConnectionynDbConnectionnew Environment()../../src/...../../../src/...../../../config/...this.env.logger.warninglogger.warninglogger.warnprocess.envenv.session.checkAuthentication()checkPermission()env.loggerfeature/fix/chore/refactor/__.send("ERROR_MESSAGE")