Skip to content

Commit 30f25f3

Browse files
authored
Merge branch 'main' into copilot/fix-963
2 parents b657b6e + 9412f31 commit 30f25f3

File tree

222 files changed

+7843
-2934
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

222 files changed

+7843
-2934
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
name: Zero Shot Compass Issue Creator
2+
description: Creates an issue for Compass based on user input
3+
model: openai/gpt-5-nano
4+
modelParameters:
5+
response_format: text
6+
reasoning_effort: high
7+
max_tokens: 131072
8+
messages:
9+
- role: system
10+
content: >-
11+
You are a helpful assistant that doubles as a product owner and product
12+
manager for a software engineering team building a calendar app for
13+
scheduling events and organizing tasks called Compass.
14+
15+
You're tasked with creating issues for software engineering tasks, bugs
16+
and features applicable to the application development.
17+
18+
The following context about Compass and the product are available to
19+
deduce answers to questions you might have while creating these issues:
20+
21+
- Compass documentation: https://docs.compasscalendar.com/docs
22+
- Repository: https://github.com/SwitchbackTech/compass
23+
- Roadmap: https://github.com/orgs/SwitchbackTech/projects/4
24+
- role: user
25+
content: >-
26+
<issue>{{issue}}</issue>
27+
28+
Create this issue with these specific sections alone in the order they
29+
appear:
30+
31+
- Title
32+
- Description
33+
- Scope
34+
- Acceptance criteria
35+
- Business use case
36+
- Additional context
37+
testData:
38+
- issue: |
39+
As a user, I want to be able to create recurring events in the calendar app so that I can easily schedule events that happen on a regular basis without having to manually enter each occurrence.
40+
evaluators:
41+
- name: Outputs a title
42+
string:
43+
startsWith: "Title"

jest.config.js

Lines changed: 70 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,42 @@
11
/*
22
* For a detailed explanation regarding each configuration property, visit:
33
* https://jestjs.io/docs/configuration
4+
*
45
*/
6+
7+
/** @type { Exclude<Exclude<import("jest").Config["projects"], undefined>[number], string>} */
8+
const backendProject = {
9+
displayName: "backend",
10+
moduleNameMapper: {
11+
"^@core(/(.*)$)?": "<rootDir>/packages/core/src/$1",
12+
"^@backend/auth(/(.*)$)?": "<rootDir>/packages/backend/src/auth/$1",
13+
"^@backend/calendar(/(.*)$)?": "<rootDir>/packages/backend/src/calendar/$1",
14+
"^@backend/common(/(.*)$)?": "<rootDir>/packages/backend/src/common/$1",
15+
"^@backend/dev(/(.*)$)?": "<rootDir>/packages/backend/src/dev/$1",
16+
"^@backend/email(/(.*)$)?": "<rootDir>/packages/backend/src/email/$1",
17+
"^@backend/event(/(.*)$)?": "<rootDir>/packages/backend/src/event/$1",
18+
"^@backend/priority(/(.*)$)?": "<rootDir>/packages/backend/src/priority/$1",
19+
"^@backend/servers(/(.*)$)?": "<rootDir>/packages/backend/src/servers/$1",
20+
"^@backend/sync(/(.*)$)?": "<rootDir>/packages/backend/src/sync/$1",
21+
"^@backend/user(/(.*)$)?": "<rootDir>/packages/backend/src/user/$1",
22+
"^@backend/waitlist(/(.*)$)?": "<rootDir>/packages/backend/src/waitlist/$1",
23+
"^@backend/__tests__(/(.*)$)?":
24+
"<rootDir>/packages/backend/src/__tests__/$1",
25+
},
26+
27+
setupFiles: ["<rootDir>/packages/core/src/__tests__/core.test.init.ts"],
28+
setupFilesAfterEnv: [
29+
// backend init intentionally here to accommodate @shelf/mongodb preset
30+
"<rootDir>/packages/backend/src/__tests__/backend.test.init.ts",
31+
"<rootDir>/packages/backend/src/__tests__/backend.test.start.ts",
32+
],
33+
testMatch: ["<rootDir>/packages/backend/**/?(*.)+(spec|test).[tj]s?(x)"],
34+
// A preset that is used as a base for Jest's configuration
35+
preset: "@shelf/jest-mongodb", // https://jestjs.io/docs/mongodb,
36+
};
37+
538
/** @type { import("jest").Config } */
6-
module.exports = {
39+
const config = {
740
// All imported modules in your tests should be mocked automatically
841
// automock: false,
942

@@ -85,7 +118,7 @@ module.exports = {
85118
// moduleNameMapper: {}
86119

87120
// An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader
88-
// modulePathIgnorePatterns: [],
121+
modulePathIgnorePatterns: ["<rootDir>/build"],
89122

90123
// Activates notifications for test results
91124
// notify: false,
@@ -97,29 +130,33 @@ module.exports = {
97130
{
98131
displayName: "core",
99132
moduleNameMapper: {
100-
"^@core/(.*)$": "<rootDir>/packages/core/src/$1",
133+
"^@core(/(.*)$)?": "<rootDir>/packages/core/src/$1",
101134
},
102135
testEnvironment: "node",
103136
testMatch: ["<rootDir>/packages/core/**/?(*.)+(spec|test).[tj]s?(x)"],
104137
setupFiles: ["<rootDir>/packages/core/src/__tests__/core.test.init.ts"],
138+
setupFilesAfterEnv: [
139+
"<rootDir>/packages/core/src/__tests__/core.test.start.ts",
140+
],
105141
},
106142
{
107143
displayName: "web",
108144
moduleNameMapper: {
109145
"\\.(jpg|jpeg|png|gif)$":
110146
"<rootDir>/packages/web/src/__tests__/__mocks__/file.stub.js",
111-
"^@core/(.*)$": "<rootDir>/packages/core/src/$1",
112-
"^@web/__tests__/(.*)$": "<rootDir>/packages/web/src/__tests__/$1",
113-
"^@web/assets/(.*)$": "<rootDir>/packages/web/src/assets/$1",
114-
"^@web/auth/(.*)$": "<rootDir>/packages/web/src/auth/$1",
115-
"^@web/common/(.*)$": "<rootDir>/packages/web/src/common/$1",
116-
"^@web/components/(.*)$": "<rootDir>/packages/web/src/components/$1",
117-
"^@web/containers/(.*)$": "<rootDir>/packages/web/src/containers/$1",
118-
"^@web/ducks/(.*)$": "<rootDir>/packages/web/src/ducks/$1",
119-
"^@web/public/(.*)$": "<rootDir>/packages/web/src/public/$1",
120-
"^@web/routers/(.*)$": "<rootDir>/packages/web/src/routers/",
121-
"^@web/store/(.*)$": "<rootDir>/packages/web/src/store/$1",
122-
"^@web/views/(.*)$": "<rootDir>/packages/web/src/views/$1",
147+
"^@core(/(.*)$)?": "<rootDir>/packages/core/src/$1",
148+
"^@web/__tests__(/(.*)$)?": "<rootDir>/packages/web/src/__tests__/$1",
149+
"^@web/assets(/(.*)$)?": "<rootDir>/packages/web/src/assets/$1",
150+
"^@web/auth(/(.*)$)?": "<rootDir>/packages/web/src/auth/$1",
151+
"^@web/common(/(.*)$)?": "<rootDir>/packages/web/src/common/$1",
152+
"^@web/components(/(.*)$)?": "<rootDir>/packages/web/src/components/$1",
153+
"^@web/containers(/(.*)$)?": "<rootDir>/packages/web/src/containers/$1",
154+
"^@web/ducks(/(.*)$)?": "<rootDir>/packages/web/src/ducks/$1",
155+
"^@web/public(/(.*)$)?": "<rootDir>/packages/web/src/public/$1",
156+
"^@web/routers(/(.*)$)?": "<rootDir>/packages/web/src/routers/",
157+
"^@web/store((/(.*)$)?)?": "<rootDir>/packages/web/src/store/$1",
158+
"^@web/socket(/(.*)$)?": "<rootDir>/packages/web/src/socket/$1",
159+
"^@web/views(/(.*)$)?": "<rootDir>/packages/web/src/views/$1",
123160
"^.+\\.(css|less)$":
124161
"<rootDir>/packages/web/src/__tests__/__mocks__/css.stub.js",
125162
"\\.(svg)$":
@@ -140,35 +177,24 @@ module.exports = {
140177
"/node_modules/(?!react-dnd|dnd-core|@react-dnd)",
141178
],
142179
},
180+
backendProject,
143181
{
144-
displayName: "backend",
182+
displayName: "scripts",
145183
moduleNameMapper: {
146-
"^@core/(.*)$": "<rootDir>/packages/core/src/$1",
147-
"^@backend/auth/(.*)$": "<rootDir>/packages/backend/src/auth/$1",
148-
"^@backend/calendar/(.*)$":
149-
"<rootDir>/packages/backend/src/calendar/$1",
150-
"^@backend/common/(.*)$": "<rootDir>/packages/backend/src/common/$1",
151-
"^@backend/dev/(.*)$": "<rootDir>/packages/backend/src/dev/$1",
152-
"^@backend/email/(.*)$": "<rootDir>/packages/backend/src/email/$1",
153-
"^@backend/event/(.*)$": "<rootDir>/packages/backend/src/event/$1",
154-
"^@backend/priority/(.*)$":
155-
"<rootDir>/packages/backend/src/priority/$1",
156-
"^@backend/servers/(.*)$": "<rootDir>/packages/backend/src/servers/$1",
157-
"^@backend/sync/(.*)$": "<rootDir>/packages/backend/src/sync/$1",
158-
"^@backend/user/(.*)$": "<rootDir>/packages/backend/src/user/$1",
159-
"^@backend/waitlist/(.*)$":
160-
"<rootDir>/packages/backend/src/waitlist/$1",
161-
"^@backend/__tests__/(.*)$":
162-
"<rootDir>/packages/backend/src/__tests__/$1",
184+
...backendProject.moduleNameMapper,
185+
"^@scripts(/(.*)$)?": "<rootDir>/packages/scripts/src/$1",
186+
"^@scripts/commands(/(.*)$)?":
187+
"<rootDir>/packages/scripts/src/commands/$1",
188+
"^@scripts/common(/(.*)$)?": "<rootDir>/packages/scripts/src/common/$1",
189+
"^@scripts/migrations(/(.*)$)?":
190+
"<rootDir>/packages/scripts/src/migrations/$1",
191+
"^@scripts/seeders(/(.*)$)?":
192+
"<rootDir>/packages/scripts/src/seeders/$1",
163193
},
164194

165-
setupFiles: ["<rootDir>/packages/core/src/__tests__/core.test.init.ts"],
166-
setupFilesAfterEnv: [
167-
// backend init intentionally here to accommodate @shelf/mongodb preset
168-
"<rootDir>/packages/backend/src/__tests__/backend.test.init.ts",
169-
"<rootDir>/packages/backend/src/__tests__/backend.test.start.ts",
170-
],
171-
testMatch: ["<rootDir>/packages/backend/**/?(*.)+(spec|test).[tj]s?(x)"],
195+
setupFiles: [...backendProject.setupFiles],
196+
setupFilesAfterEnv: [...backendProject.setupFilesAfterEnv],
197+
testMatch: ["<rootDir>/packages/scripts/**/?(*.)+(spec|test).[tj]s?(x)"],
172198
// A preset that is used as a base for Jest's configuration
173199
preset: "@shelf/jest-mongodb", // https://jestjs.io/docs/mongodb,
174200
},
@@ -192,6 +218,7 @@ module.exports = {
192218
// rootDir: 'packages/web/',
193219
// rootDir: 'packages/backend/',
194220
rootDir: "./",
221+
passWithNoTests: true,
195222

196223
// A list of paths to directories that Jest should use to search for files in
197224
// roots: [
@@ -267,3 +294,6 @@ module.exports = {
267294
// Whether to use watchman for file crawling
268295
// watchman: true,
269296
};
297+
298+
// eslint-disable-next-line no-undef
299+
module.exports = config;

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
"test": "cross-env-shell TZ=Etc/UTC yarn jest",
3131
"test:backend": "yarn test backend",
3232
"test:core": "yarn test core",
33-
"test:web": "yarn test web"
33+
"test:web": "yarn test web",
34+
"test:scripts": "yarn test scripts"
3435
},
3536
"dependencies": {
3637
"@compass/backend": "*",

packages/backend/src/event/classes/compass.event.parser.ts

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { ClientSession, ObjectId, WithId } from "mongodb";
22
import { Logger } from "@core/logger/winston.logger";
3-
import { MapEvent } from "@core/mappers/map.event";
43
import {
54
CalendarProvider,
65
Categories_Recurrence,
@@ -25,7 +24,6 @@ import {
2524
_createCompassEvent,
2625
_createGcal,
2726
_deleteGcal,
28-
_deleteInstances,
2927
_deleteInstancesAfterUntil,
3028
_deleteSeries,
3129
_deleteSingleCompassEvent,
@@ -261,11 +259,12 @@ export class CompassEventParser {
261259
* *************************************************************************
262260
* const instances = this.rrule!.instances();
263261
* const availableStarts = instances.map((i) => i.startDate);
264-
* await _deleteInstances(
262+
* await _deleteSeries(
265263
* userId,
266264
* this.#event._id.toString(),
267265
* { startDate: { $nin: availableStarts } },
268266
* session,
267+
* true,
269268
* );
270269
* *************************************************************************
271270
* We will respect only the UNTIL recurrence rule param for now
@@ -292,7 +291,7 @@ export class CompassEventParser {
292291
);
293292
} else {
294293
// recreate instances
295-
await _deleteInstances(userId, this.#event._id.toString(), {}, session);
294+
await _deleteSeries(userId, this.#event._id.toString(), session, true);
296295

297296
cEvent = await _createCompassEvent(
298297
{ ...compassEvent, user: userId },
@@ -360,27 +359,20 @@ export class CompassEventParser {
360359
);
361360

362361
const calendarProvider = CalendarProvider.GOOGLE;
363-
const userId = this.#event.user!;
364-
const _id = new ObjectId();
362+
const user = this.#event.user!;
365363
const operation: Operation_Sync = `${this.category}_UPDATED`;
366364
const operationSummary = this.#getOperationSummary(operation);
367365

368-
await _deleteSingleCompassEvent({ ...this.#event, user: userId }, session);
369-
370366
await _createCompassEvent(
371-
Object.assign(MapEvent.removeIdentifyingData(this.#event), {
372-
_id,
373-
user: userId,
374-
isSomeday: true,
375-
}),
367+
{ ...this.#event, user, isSomeday: true },
376368
calendarProvider,
377369
null,
378370
session,
379371
);
380372

381373
switch (calendarProvider) {
382374
case CalendarProvider.GOOGLE: {
383-
const ok = await _deleteGcal(userId, this.#event.gEventId!);
375+
const ok = await _deleteGcal(user, this.#event.gEventId!);
384376

385377
return ok ? [operationSummary] : [];
386378
}
@@ -395,28 +387,27 @@ export class CompassEventParser {
395387
);
396388

397389
const calendarProvider = CalendarProvider.GOOGLE;
398-
const userId = this.#event.user!;
399-
const _id = new ObjectId();
390+
const user = this.#event.user!;
400391
const operation: Operation_Sync = `${this.category}_UPDATED`;
401392
const operationSummary = this.#getOperationSummary(operation);
402393

403-
await _deleteSeries(userId, this.#event._id.toString(), session);
394+
await _deleteSeries(user, this.#event._id.toString(), session, true);
404395

405396
await _createCompassEvent(
406-
Object.assign(MapEvent.removeIdentifyingData(this.#event), {
407-
_id,
408-
user: userId,
409-
isSomeday: true,
397+
{
398+
...this.#event,
399+
user,
410400
recurrence: this.#event.recurrence,
411-
}),
401+
isSomeday: true,
402+
},
412403
calendarProvider,
413404
null,
414405
session,
415406
);
416407

417408
switch (calendarProvider) {
418409
case CalendarProvider.GOOGLE: {
419-
const ok = await _deleteGcal(userId, this.#event.gEventId!);
410+
const ok = await _deleteGcal(user, this.#event.gEventId!);
420411

421412
return ok ? [operationSummary] : [];
422413
}
@@ -437,7 +428,7 @@ export class CompassEventParser {
437428
const operation: Operation_Sync = `${this.category}_UPDATED`;
438429
const operationSummary = this.#getOperationSummary(operation);
439430

440-
await _deleteInstances(userId, this.#event._id.toString(), {}, session);
431+
await _deleteSeries(userId, this.#event._id.toString(), session, true);
441432

442433
const cEvent = (await _updateCompassEvent(
443434
{ ...this.#event, user: userId },

packages/backend/src/event/classes/gcal.event.rrule.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ describe("GcalEventRRule: ", () => {
4444
});
4545

4646
expect(rrule.toString()).toContain("RRULE:FREQ=DAILY");
47-
expect(rrule.toString()).toContain(`COUNT=${GCAL_MAX_RECURRENCES}`);
4847
expect(rrule.count()).toBe(GCAL_MAX_RECURRENCES);
4948
expect(rrule.all()).toHaveLength(GCAL_MAX_RECURRENCES);
5049
});

0 commit comments

Comments
 (0)