XciD HF Staff commited on
Commit
0a4b8cb
Β·
unverified Β·
1 Parent(s): 8014532

Signed-off-by: Adrien <[email protected]>

.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ node_modules/
2
+ dist/
server/lib/Utils.ts CHANGED
@@ -1,6 +1,5 @@
1
  import * as util from 'util';
2
  import * as child_process from 'child_process';
3
- import { ObjectID } from 'mongodb';
4
  const __exec = util.promisify(child_process.exec);
5
 
6
 
@@ -13,7 +12,7 @@ export namespace Utils {
13
  ? maxOrMin + Math.floor(Math.random() * (max - maxOrMin))
14
  : Math.floor(Math.random() * maxOrMin);
15
  }
16
-
17
  /**
18
  * Random element from array (usually not needed b/c we extend Array in Extensions.ts).
19
  */
@@ -38,7 +37,7 @@ export namespace Utils {
38
  ? Array(b - n).fill(0).map((_, i) => n + i)
39
  : Array(n).fill(0).map((_, i) => i);
40
  }
41
-
42
  /**
43
  * Gets the value at path of object, or undefined.
44
  */
@@ -53,7 +52,7 @@ export namespace Utils {
53
  }
54
  return x;
55
  }
56
-
57
  /**
58
  * Asynchronously filter on the given array
59
  */
@@ -61,7 +60,7 @@ export namespace Utils {
61
  const keeps = await Promise.all(array.map(__filter));
62
  return array.filter((e, i) => keeps[i], thisArg);
63
  }
64
-
65
  export function randomStr(length: number): string {
66
  const chars = range(97, 123).map(x => String.fromCharCode(x));
67
  return Array(length).fill(0)
 
1
  import * as util from 'util';
2
  import * as child_process from 'child_process';
 
3
  const __exec = util.promisify(child_process.exec);
4
 
5
 
 
12
  ? maxOrMin + Math.floor(Math.random() * (max - maxOrMin))
13
  : Math.floor(Math.random() * maxOrMin);
14
  }
15
+
16
  /**
17
  * Random element from array (usually not needed b/c we extend Array in Extensions.ts).
18
  */
 
37
  ? Array(b - n).fill(0).map((_, i) => n + i)
38
  : Array(n).fill(0).map((_, i) => i);
39
  }
40
+
41
  /**
42
  * Gets the value at path of object, or undefined.
43
  */
 
52
  }
53
  return x;
54
  }
55
+
56
  /**
57
  * Asynchronously filter on the given array
58
  */
 
60
  const keeps = await Promise.all(array.map(__filter));
61
  return array.filter((e, i) => keeps[i], thisArg);
62
  }
63
+
64
  export function randomStr(length: number): string {
65
  const chars = range(97, 123).map(x => String.fromCharCode(x));
66
  return Array(length).fill(0)
server/models/Database.ts CHANGED
@@ -20,31 +20,31 @@ export class Database {
20
  ];
21
  docs: Collection;
22
  private __promiseConnect: Promise<boolean> | null = null;
23
-
24
-
25
  get isReady(): boolean {
26
  return this.__db !== null;
27
  }
28
-
29
-
30
  private attach() {
31
  for (const c of Database.__collectionNames) {
32
  this[c] = this.__db!.collection(c);
33
  }
34
  }
35
-
36
  collection(name: string): Collection {
37
  return this.__db!.collection(name);
38
  }
39
-
40
  command(command: Object): Promise<any> {
41
  return this.__db!.command(command);
42
  }
43
-
44
  listShards(): Promise<any> {
45
  return this.__db!.admin().command({ listShards: 1 });
46
  }
47
-
48
  database(dbName?: string): Db | null {
49
  if (!dbName) {
50
  return this.__db;
@@ -54,12 +54,11 @@ export class Database {
54
  : null
55
  ;
56
  }
57
-
58
  connect(): Promise<boolean> {
59
  if (!this.__promiseConnect) {
60
- this.__promiseConnect = MongoClient.connect(this.MONGO_URI, {
61
- useNewUrlParser: true,
62
- }).then((client) => {
63
  this.__client = client;
64
  this.__db = this.__client.db(this.MONGO_DBNAME);
65
  this.attach();
@@ -70,14 +69,14 @@ export class Database {
70
  return false;
71
  });
72
  }
73
-
74
  return this.__promiseConnect;
75
  }
76
-
77
  onConnect(handler: () => void) {
78
  this.connect().then(handler);
79
  }
80
-
81
  async close() {
82
  if (this.__client) {
83
  await this.__client.close();
 
20
  ];
21
  docs: Collection;
22
  private __promiseConnect: Promise<boolean> | null = null;
23
+
24
+
25
  get isReady(): boolean {
26
  return this.__db !== null;
27
  }
28
+
29
+
30
  private attach() {
31
  for (const c of Database.__collectionNames) {
32
  this[c] = this.__db!.collection(c);
33
  }
34
  }
35
+
36
  collection(name: string): Collection {
37
  return this.__db!.collection(name);
38
  }
39
+
40
  command(command: Object): Promise<any> {
41
  return this.__db!.command(command);
42
  }
43
+
44
  listShards(): Promise<any> {
45
  return this.__db!.admin().command({ listShards: 1 });
46
  }
47
+
48
  database(dbName?: string): Db | null {
49
  if (!dbName) {
50
  return this.__db;
 
54
  : null
55
  ;
56
  }
57
+
58
  connect(): Promise<boolean> {
59
  if (!this.__promiseConnect) {
60
+ this.__promiseConnect = MongoClient.connect(this.MONGO_URI, {
61
+ }).then((client) => {
 
62
  this.__client = client;
63
  this.__db = this.__client.db(this.MONGO_DBNAME);
64
  this.attach();
 
69
  return false;
70
  });
71
  }
72
+
73
  return this.__promiseConnect;
74
  }
75
+
76
  onConnect(handler: () => void) {
77
  this.connect().then(handler);
78
  }
79
+
80
  async close() {
81
  if (this.__client) {
82
  await this.__client.close();
server/models/Doc.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ObjectID } from 'mongodb';
2
  import { MongoObject } from './MongoObject';
3
  import { Utils } from '../lib/Utils';
4
  import { config } from '../lib/config';
@@ -33,13 +33,13 @@ class Doc extends MongoObject {
33
  protected static __type = Doc;
34
  protected static __collectionName: string = 'docs';
35
  protected static __idField: string = 'shortId';
36
-
37
- _id: ObjectID;
38
  shortId: string;
39
  longId?: string;
40
  model: ModelId;
41
  contents: Doc.Contents;
42
- /**
43
  * Optional reference to another doc's `shortId`.
44
  */
45
  clonedFrom?: string;
@@ -48,11 +48,11 @@ class Doc extends MongoObject {
48
  * Whether to display it on the front page.
49
  */
50
  featured?: boolean;
51
-
52
  static fromObject(o: Partial<Doc>): Doc {
53
  return Object.assign(new Doc(), o);
54
  }
55
-
56
  /**
57
  * Initialize a new doc with random ids.
58
  */
@@ -63,7 +63,7 @@ class Doc extends MongoObject {
63
  model
64
  });
65
  }
66
-
67
  /**
68
  * Insert a new doc duplicated from an existing one.
69
  */
@@ -75,7 +75,7 @@ class Doc extends MongoObject {
75
  await db.docs.insertOne(newdoc);
76
  return newdoc;
77
  }
78
-
79
  /**
80
  * This is displayed next to the doc title in a `<code>` tag.
81
  */
@@ -110,7 +110,7 @@ class Doc extends MongoObject {
110
  get editUrl(): string {
111
  return `${config.transformerAutocompleteUrl}/doc/${this.model}/${this.longId}/edit`;
112
  }
113
-
114
  /**
115
  * Construct a (safe) HTML representation of the quill delta content format.
116
  */
@@ -126,7 +126,7 @@ class Doc extends MongoObject {
126
  return escaped;
127
  }).join("");
128
  }
129
-
130
  /**
131
  * Construct a (safe) JSON representation of the doc.contents.
132
  */
@@ -136,7 +136,7 @@ class Doc extends MongoObject {
136
  }
137
  return JSON.stringify(this.contents).replace(/</g, "&lt;");
138
  }
139
-
140
  duck(): string {
141
  return '___quack___';
142
  }
 
1
+ import { ObjectId } from 'mongodb';
2
  import { MongoObject } from './MongoObject';
3
  import { Utils } from '../lib/Utils';
4
  import { config } from '../lib/config';
 
33
  protected static __type = Doc;
34
  protected static __collectionName: string = 'docs';
35
  protected static __idField: string = 'shortId';
36
+
37
+ _id: ObjectId;
38
  shortId: string;
39
  longId?: string;
40
  model: ModelId;
41
  contents: Doc.Contents;
42
+ /**
43
  * Optional reference to another doc's `shortId`.
44
  */
45
  clonedFrom?: string;
 
48
  * Whether to display it on the front page.
49
  */
50
  featured?: boolean;
51
+
52
  static fromObject(o: Partial<Doc>): Doc {
53
  return Object.assign(new Doc(), o);
54
  }
55
+
56
  /**
57
  * Initialize a new doc with random ids.
58
  */
 
63
  model
64
  });
65
  }
66
+
67
  /**
68
  * Insert a new doc duplicated from an existing one.
69
  */
 
75
  await db.docs.insertOne(newdoc);
76
  return newdoc;
77
  }
78
+
79
  /**
80
  * This is displayed next to the doc title in a `<code>` tag.
81
  */
 
110
  get editUrl(): string {
111
  return `${config.transformerAutocompleteUrl}/doc/${this.model}/${this.longId}/edit`;
112
  }
113
+
114
  /**
115
  * Construct a (safe) HTML representation of the quill delta content format.
116
  */
 
126
  return escaped;
127
  }).join("");
128
  }
129
+
130
  /**
131
  * Construct a (safe) JSON representation of the doc.contents.
132
  */
 
136
  }
137
  return JSON.stringify(this.contents).replace(/</g, "&lt;");
138
  }
139
+
140
  duck(): string {
141
  return '___quack___';
142
  }
server/models/MongoObject.ts CHANGED
@@ -1,7 +1,7 @@
1
  import { Utils } from '../lib/Utils';
2
  import db from '../models/Database';
3
  import * as mongodb from 'mongodb';
4
- import { ObjectID, Cursor } from 'mongodb';
5
 
6
 
7
  export class ObjectFactory {
@@ -20,60 +20,60 @@ export class MongoObject {
20
  protected static __collectionName: string; // The Mongo collection name
21
  protected static __idField: string = "_id"; // Default id used to findOne
22
  protected static __wlistJsonAttrs: string[] = []; // Whitelist of attributes to serialize.
23
-
24
  // Json serialization.
25
-
26
  private toJsonRepr(): object {
27
  return Utils.pick(this, (<any>this.constructor).__wlistJsonAttrs);
28
  }
29
-
30
  toJson(): string {
31
  return JSON.stringify(this.toJsonRepr());
32
  }
33
-
34
-
35
  /// Find family of methods
36
-
37
- static async findOne<T>(id: string | ObjectID | mongodb.FilterQuery<T>, options?: mongodb.FindOneOptions): Promise<T | null> {
38
- const q = (typeof id === 'string' || id instanceof ObjectID)
39
  ? { [this.__idField]: id }
40
  : id;
41
-
42
  const o = await db.collection(this.__collectionName).findOne(q, options);
43
  if (o) {
44
  return ObjectFactory.create(this.__type, o);
45
  }
46
  return null;
47
  }
48
-
49
- static async findOneAndUpdate<T>(filter: mongodb.FilterQuery<T>, update: Object, options?: mongodb.FindOneAndReplaceOption): Promise<T | null> {
50
  const o = await db.collection(this.__collectionName).findOneAndUpdate(filter, update, options);
51
  if (o && o.value) {
52
  return ObjectFactory.create(this.__type, o.value);
53
  }
54
  return null;
55
  }
56
-
57
- static find<T>(query: mongodb.FilterQuery<T> = {}, options?: mongodb.FindOneOptions): HfCursor<T> {
58
  const cursor = db.collection(this.__collectionName).find(query, options);
59
- return HfCursor.cast<T>(cursor, this.__type);
60
  }
61
  }
62
 
63
 
64
 
65
- export class HfCursor<T> extends Cursor<T> {
66
  protected __type;
67
-
68
- static cast<T>(cursor: Cursor<T>, type: any): HfCursor<T> {
69
  // β€œThe use of __proto__ is controversial, and has been discouraged.”
70
  // see stackoverflow.com/a/32186367
71
  // see developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto
72
  (<any>cursor).__proto__ = HfCursor.prototype;
73
  (<any>cursor).__type = type;
74
- return cursor as HfCursor<T>;
75
  }
76
-
77
  toArray(): Promise<T[]> {
78
  return super.toArray().then((objs) => {
79
  return objs.map((o) => {
@@ -81,17 +81,17 @@ export class HfCursor<T> extends Cursor<T> {
81
  });
82
  });
83
  }
84
-
85
- forEach(__iterator: mongodb.IteratorCallback<T>, __callback: mongodb.EndCallback = () => {}) {
86
- super.forEach((o) => {
87
  const newObject = ObjectFactory.create(this.__type, o);
88
- __iterator(newObject);
89
- }, __callback);
90
  }
91
-
92
-
93
-
94
-
95
  on(event: string, listener: (...args) => void): this {
96
  if (event === 'data') {
97
  super.on('data', (o) => {
@@ -104,7 +104,7 @@ export class HfCursor<T> extends Cursor<T> {
104
  }
105
  return this;
106
  }
107
-
108
  once(event: string, listener: (...args) => void): this {
109
  if (event === 'data') {
110
  super.once('data', (o) => {
@@ -117,26 +117,26 @@ export class HfCursor<T> extends Cursor<T> {
117
  }
118
  return this;
119
  }
120
-
121
  //
122
  // Below: cursor methods are only here to make Typescript
123
  // know that they return the HfCursor object itself.
124
  // (We have checked that the mongo driver does the right thing underneath)
125
  //
126
-
127
- limit(value: number): HfCursor<T> {
128
- return super.limit(value) as HfCursor<T>;
129
- }
130
-
131
- skip(value: number): HfCursor<T> {
132
- return super.skip(value) as HfCursor<T>;
133
- }
134
-
135
- sort(keyOrList: string | Object[] | Object, direction?: number): HfCursor<T> {
136
- return super.sort(keyOrList, direction) as HfCursor<T>;
137
- }
138
-
139
- stream(options?: { transform?: Function }): HfCursor<T> {
140
- return super.stream(options) as HfCursor<T>;
141
- }
142
  }
 
1
  import { Utils } from '../lib/Utils';
2
  import db from '../models/Database';
3
  import * as mongodb from 'mongodb';
4
+ import { ObjectId, FindCursor } from 'mongodb';
5
 
6
 
7
  export class ObjectFactory {
 
20
  protected static __collectionName: string; // The Mongo collection name
21
  protected static __idField: string = "_id"; // Default id used to findOne
22
  protected static __wlistJsonAttrs: string[] = []; // Whitelist of attributes to serialize.
23
+
24
  // Json serialization.
25
+
26
  private toJsonRepr(): object {
27
  return Utils.pick(this, (<any>this.constructor).__wlistJsonAttrs);
28
  }
29
+
30
  toJson(): string {
31
  return JSON.stringify(this.toJsonRepr());
32
  }
33
+
34
+
35
  /// Find family of methods
36
+
37
+ static async findOne<T>(id: string | ObjectId | mongodb.Filter<T>, options?: mongodb.FindOptions): Promise<T | null> {
38
+ const q = (typeof id === 'string' || id instanceof ObjectId)
39
  ? { [this.__idField]: id }
40
  : id;
41
+
42
  const o = await db.collection(this.__collectionName).findOne(q, options);
43
  if (o) {
44
  return ObjectFactory.create(this.__type, o);
45
  }
46
  return null;
47
  }
48
+
49
+ static async findOneAndUpdate<T>(filter: mongodb.Filter<T>, update: Object, options: mongodb.FindOneAndUpdateOptions = {}): Promise<T | null> {
50
  const o = await db.collection(this.__collectionName).findOneAndUpdate(filter, update, options);
51
  if (o && o.value) {
52
  return ObjectFactory.create(this.__type, o.value);
53
  }
54
  return null;
55
  }
56
+
57
+ static find<T>(query: mongodb.Filter<T> = {}, options?: mongodb.FindOptions): HfCursor<T> {
58
  const cursor = db.collection(this.__collectionName).find(query, options);
59
+ return HfCursor.cast<T>(cursor as any, this.__type);
60
  }
61
  }
62
 
63
 
64
 
65
+ export class HfCursor<T> extends FindCursor<T> {
66
  protected __type;
67
+
68
+ static cast<T>(cursor: FindCursor<T>, type: any): HfCursor<T> {
69
  // β€œThe use of __proto__ is controversial, and has been discouraged.”
70
  // see stackoverflow.com/a/32186367
71
  // see developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto
72
  (<any>cursor).__proto__ = HfCursor.prototype;
73
  (<any>cursor).__type = type;
74
+ return cursor as unknown as HfCursor<T>;
75
  }
76
+
77
  toArray(): Promise<T[]> {
78
  return super.toArray().then((objs) => {
79
  return objs.map((o) => {
 
81
  });
82
  });
83
  }
84
+
85
+ forEach(__iterator: (doc: T) => boolean | void): Promise<void> {
86
+ return super.forEach((o) => {
87
  const newObject = ObjectFactory.create(this.__type, o);
88
+ return __iterator(newObject);
89
+ });
90
  }
91
+
92
+
93
+
94
+
95
  on(event: string, listener: (...args) => void): this {
96
  if (event === 'data') {
97
  super.on('data', (o) => {
 
104
  }
105
  return this;
106
  }
107
+
108
  once(event: string, listener: (...args) => void): this {
109
  if (event === 'data') {
110
  super.once('data', (o) => {
 
117
  }
118
  return this;
119
  }
120
+
121
  //
122
  // Below: cursor methods are only here to make Typescript
123
  // know that they return the HfCursor object itself.
124
  // (We have checked that the mongo driver does the right thing underneath)
125
  //
126
+
127
+ // limit(value: number): HfCursor<T> {
128
+ // return super.limit(value) as HfCursor<T>;
129
+ // }
130
+
131
+ // skip(value: number): HfCursor<T> {
132
+ // return super.skip(value) as HfCursor<T>;
133
+ // }
134
+
135
+ // sort(keyOrList: string | Object[] | Object, direction?: number): HfCursor<T> {
136
+ // return super.sort(keyOrList, direction) as HfCursor<T>;
137
+ // }
138
+
139
+ // stream(options?: { transform?: Function }): HfCursor<T> {
140
+ // return super.stream(options) as HfCursor<T>;
141
+ // }
142
  }
server/package-lock.json CHANGED
@@ -1,629 +1,1237 @@
1
  {
2
  "name": "foobar-server",
3
  "version": "1.0.0",
4
- "lockfileVersion": 1,
5
  "requires": true,
6
- "dependencies": {
7
- "@types/body-parser": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  "version": "1.17.1",
9
  "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.1.tgz",
10
  "integrity": "sha512-RoX2EZjMiFMjZh9lmYrwgoP9RTpAjSHiJxdp4oidAQVO02T7HER3xj9UKue5534ULWeqVEkujhWcyvUce+d68w==",
11
- "requires": {
12
  "@types/connect": "*",
13
  "@types/node": "*"
14
  }
15
  },
16
- "@types/bson": {
17
- "version": "4.0.0",
18
- "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.0.tgz",
19
- "integrity": "sha512-pq/rqJwJWkbS10crsG5bgnrisL8pML79KlMKQMoQwLUjlPAkrUHMvHJ3oGwE7WHR61Lv/nadMwXVAD2b+fpD8Q==",
20
- "requires": {
21
- "@types/node": "*"
22
- }
23
- },
24
- "@types/connect": {
25
  "version": "3.4.32",
26
  "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz",
27
  "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==",
28
- "requires": {
29
  "@types/node": "*"
30
  }
31
  },
32
- "@types/events": {
33
- "version": "3.0.0",
34
- "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
35
- "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g=="
36
- },
37
- "@types/express": {
38
- "version": "4.17.2",
39
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.2.tgz",
40
- "integrity": "sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA==",
41
- "requires": {
42
  "@types/body-parser": "*",
43
- "@types/express-serve-static-core": "*",
 
44
  "@types/serve-static": "*"
45
  }
46
  },
47
- "@types/express-serve-static-core": {
48
- "version": "4.17.0",
49
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.0.tgz",
50
- "integrity": "sha512-Xnub7w57uvcBqFdIGoRg1KhNOeEj0vB6ykUM7uFWyxvbdE89GFyqgmUcanAriMr4YOxNFZBAWkfcWIb4WBPt3g==",
51
- "requires": {
 
52
  "@types/node": "*",
53
- "@types/range-parser": "*"
 
 
54
  }
55
  },
56
- "@types/hbs": {
57
  "version": "4.0.1",
58
  "resolved": "https://registry.npmjs.org/@types/hbs/-/hbs-4.0.1.tgz",
59
  "integrity": "sha512-kbgeYPLGOG8LQhqNlAvMm7vMz6Iu3IaXDEufpkEYT/viTko1ZlIrj+b6lvo4cAIDRkh6eg+JdKVZkriDGTisEw==",
60
- "requires": {
61
  "handlebars": "^4.1.0"
62
  }
63
  },
64
- "@types/mime": {
65
- "version": "2.0.1",
66
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz",
67
- "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw=="
68
- },
69
- "@types/mongodb": {
70
- "version": "3.1.2",
71
- "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.1.2.tgz",
72
- "integrity": "sha512-gdaK55B+qLI2QgeE8xXP0gJcVKSYKN20CY2CwvkMzS/LIIEIiQgQM7sIbjoRk1KOGldYjGf8PctXvXqej0qyqg==",
73
- "requires": {
74
- "@types/bson": "*",
75
- "@types/events": "*",
76
- "@types/node": "*"
77
  }
78
  },
79
- "@types/node": {
80
- "version": "12.12.14",
81
- "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.14.tgz",
82
- "integrity": "sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA=="
 
83
  },
84
- "@types/range-parser": {
85
  "version": "1.2.3",
86
  "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz",
87
  "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA=="
88
  },
89
- "@types/serve-static": {
90
- "version": "1.13.3",
91
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz",
92
- "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==",
93
- "requires": {
94
- "@types/express-serve-static-core": "*",
95
- "@types/mime": "*"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  }
97
  },
98
- "accepts": {
99
- "version": "1.3.7",
100
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
101
- "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
102
- "requires": {
103
- "mime-types": "~2.1.24",
104
- "negotiator": "0.6.2"
 
 
 
 
 
 
105
  }
106
  },
107
- "array-flatten": {
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  "version": "1.1.1",
109
  "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
110
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
111
- },
112
- "body-parser": {
113
- "version": "1.19.0",
114
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
115
- "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
116
- "requires": {
117
- "bytes": "3.1.0",
118
- "content-type": "~1.0.4",
 
 
119
  "debug": "2.6.9",
120
- "depd": "~1.1.2",
121
- "http-errors": "1.7.2",
 
122
  "iconv-lite": "0.4.24",
123
- "on-finished": "~2.3.0",
124
- "qs": "6.7.0",
125
- "raw-body": "2.4.0",
126
- "type-is": "~1.6.17"
 
 
 
 
 
127
  }
128
  },
129
- "bson": {
130
- "version": "1.1.1",
131
- "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.1.tgz",
132
- "integrity": "sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg=="
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  },
134
- "bytes": {
135
- "version": "3.1.0",
136
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
137
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
 
 
 
 
 
 
 
 
 
 
 
138
  },
139
- "colors": {
140
  "version": "1.3.3",
141
  "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz",
142
- "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg=="
 
 
 
143
  },
144
- "commander": {
145
  "version": "2.20.0",
146
  "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
147
  "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
148
  "optional": true
149
  },
150
- "content-disposition": {
151
- "version": "0.5.3",
152
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
153
- "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
154
- "requires": {
155
- "safe-buffer": "5.1.2"
 
 
 
 
156
  }
157
  },
158
- "content-type": {
159
- "version": "1.0.4",
160
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
161
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
 
 
 
 
162
  },
163
- "cookie": {
164
- "version": "0.4.0",
165
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
166
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
 
 
 
 
167
  },
168
- "cookie-signature": {
169
  "version": "1.0.6",
170
  "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
171
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
 
172
  },
173
- "debug": {
174
  "version": "2.6.9",
175
  "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
176
  "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
177
- "requires": {
178
  "ms": "2.0.0"
179
  }
180
  },
181
- "depd": {
182
- "version": "1.1.2",
183
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
184
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
 
 
 
 
185
  },
186
- "destroy": {
187
- "version": "1.0.4",
188
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
189
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
190
  },
191
- "ee-first": {
192
  "version": "1.1.1",
193
  "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
194
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
 
195
  },
196
- "encodeurl": {
197
- "version": "1.0.2",
198
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
199
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
200
  },
201
- "escape-html": {
 
 
 
 
 
 
 
 
 
 
 
 
202
  "version": "1.0.3",
203
  "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
204
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
 
205
  },
206
- "etag": {
207
  "version": "1.8.1",
208
  "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
209
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
210
- },
211
- "express": {
212
- "version": "4.17.1",
213
- "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
214
- "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
215
- "requires": {
216
- "accepts": "~1.3.7",
 
 
 
 
 
217
  "array-flatten": "1.1.1",
218
- "body-parser": "1.19.0",
219
- "content-disposition": "0.5.3",
220
  "content-type": "~1.0.4",
221
- "cookie": "0.4.0",
222
  "cookie-signature": "1.0.6",
223
  "debug": "2.6.9",
224
- "depd": "~1.1.2",
225
- "encodeurl": "~1.0.2",
226
  "escape-html": "~1.0.3",
227
  "etag": "~1.8.1",
228
- "finalhandler": "~1.1.2",
229
  "fresh": "0.5.2",
230
- "merge-descriptors": "1.0.1",
 
231
  "methods": "~1.1.2",
232
- "on-finished": "~2.3.0",
233
  "parseurl": "~1.3.3",
234
- "path-to-regexp": "0.1.7",
235
- "proxy-addr": "~2.0.5",
236
- "qs": "6.7.0",
237
  "range-parser": "~1.2.1",
238
- "safe-buffer": "5.1.2",
239
- "send": "0.17.1",
240
- "serve-static": "1.14.1",
241
- "setprototypeof": "1.1.1",
242
- "statuses": "~1.5.0",
243
  "type-is": "~1.6.18",
244
  "utils-merge": "1.0.1",
245
  "vary": "~1.1.2"
 
 
 
 
 
 
 
246
  }
247
  },
248
- "finalhandler": {
249
- "version": "1.1.2",
250
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
251
- "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
252
- "requires": {
 
253
  "debug": "2.6.9",
254
- "encodeurl": "~1.0.2",
255
  "escape-html": "~1.0.3",
256
- "on-finished": "~2.3.0",
257
  "parseurl": "~1.3.3",
258
- "statuses": "~1.5.0",
259
  "unpipe": "~1.0.0"
 
 
 
260
  }
261
  },
262
- "foreachasync": {
263
  "version": "3.0.0",
264
  "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz",
265
  "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY="
266
  },
267
- "forwarded": {
268
- "version": "0.1.2",
269
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
270
- "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
 
 
 
 
271
  },
272
- "fresh": {
273
  "version": "0.5.2",
274
  "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
275
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
276
  },
277
- "handlebars": {
278
  "version": "4.2.0",
279
  "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.2.0.tgz",
280
  "integrity": "sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw==",
281
- "requires": {
282
  "neo-async": "^2.6.0",
283
  "optimist": "^0.6.1",
284
- "source-map": "^0.6.1",
 
 
 
 
 
 
 
 
285
  "uglify-js": "^3.1.4"
286
  }
287
  },
288
- "hbs": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
289
  "version": "4.0.5",
290
  "resolved": "https://registry.npmjs.org/hbs/-/hbs-4.0.5.tgz",
291
  "integrity": "sha512-lzyXY0HalmVqHyhty05cLoPqxY51gNnCI6cMlXiPbrIKvB3BTJh3waQ9de86x25jX9QhU/tkAojsOO4KB6vPfg==",
292
- "requires": {
293
  "handlebars": "4.3.3",
294
  "walk": "2.3.14"
295
  },
 
 
 
 
 
 
 
 
 
296
  "dependencies": {
297
- "handlebars": {
298
- "version": "4.3.3",
299
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.3.3.tgz",
300
- "integrity": "sha512-VupOxR91xcGojfINrzMqrvlyYbBs39sXIrWa7YdaQWeBudOlvKEGvCczMfJPgnuwHE/zyH1M6J+IUP6cgDVyxg==",
301
- "requires": {
302
- "neo-async": "^2.6.0",
303
- "optimist": "^0.6.1",
304
- "source-map": "^0.6.1",
305
- "uglify-js": "^3.1.4"
306
- }
307
- }
 
308
  }
309
  },
310
- "http-errors": {
311
- "version": "1.7.2",
312
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
313
- "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
314
- "requires": {
315
- "depd": "~1.1.2",
316
- "inherits": "2.0.3",
317
- "setprototypeof": "1.1.1",
318
- "statuses": ">= 1.5.0 < 2",
319
- "toidentifier": "1.0.0"
 
 
 
 
320
  }
321
  },
322
- "iconv-lite": {
323
  "version": "0.4.24",
324
  "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
325
  "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
326
- "requires": {
 
327
  "safer-buffer": ">= 2.1.2 < 3"
 
 
 
328
  }
329
  },
330
- "inherits": {
331
- "version": "2.0.3",
332
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
333
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
 
 
 
 
 
 
 
 
 
 
334
  },
335
- "ipaddr.js": {
336
- "version": "1.9.0",
337
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
338
- "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
 
 
 
 
339
  },
340
- "media-typer": {
341
  "version": "0.3.0",
342
  "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
343
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
 
 
 
344
  },
345
- "memory-pager": {
346
  "version": "1.5.0",
347
  "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
348
  "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
349
- "optional": true
350
  },
351
- "merge-descriptors": {
352
- "version": "1.0.1",
353
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
354
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
 
 
 
 
355
  },
356
- "methods": {
357
  "version": "1.1.2",
358
  "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
359
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
 
 
 
 
360
  },
361
- "mime": {
362
  "version": "1.6.0",
363
  "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
364
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
 
 
 
 
 
 
 
365
  },
366
- "mime-db": {
367
- "version": "1.40.0",
368
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
369
- "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
 
 
 
 
370
  },
371
- "mime-types": {
372
- "version": "2.1.24",
373
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
374
- "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
375
- "requires": {
376
- "mime-db": "1.40.0"
 
 
 
 
377
  }
378
  },
379
- "minimist": {
380
  "version": "0.0.10",
381
  "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
382
  "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
383
  },
384
- "mongodb": {
385
- "version": "3.1.10",
386
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.1.10.tgz",
387
- "integrity": "sha512-Uml42GeFxhTGQVml1XQ4cD0o/rp7J2ROy0fdYUcVitoE7vFqEhKH4TYVqRDpQr/bXtCJVxJdNQC1ntRxNREkPQ==",
388
- "requires": {
389
- "mongodb-core": "3.1.9",
390
- "safe-buffer": "^5.1.2"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
391
  }
392
  },
393
- "mongodb-core": {
394
- "version": "3.1.9",
395
- "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.1.9.tgz",
396
- "integrity": "sha512-MJpciDABXMchrZphh3vMcqu8hkNf/Mi+Gk6btOimVg1XMxLXh87j6FAvRm+KmwD1A9fpu3qRQYcbQe4egj23og==",
397
- "requires": {
398
- "bson": "^1.1.0",
399
- "require_optional": "^1.0.1",
400
- "safe-buffer": "^5.1.2",
401
- "saslprep": "^1.0.0"
402
  }
403
  },
404
- "ms": {
405
  "version": "2.0.0",
406
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
407
  "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
408
  },
409
- "negotiator": {
410
- "version": "0.6.2",
411
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
412
- "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
 
 
 
 
413
  },
414
- "neo-async": {
415
  "version": "2.6.1",
416
  "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
417
  "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw=="
418
  },
419
- "on-finished": {
420
- "version": "2.3.0",
421
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
422
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
423
- "requires": {
 
 
 
 
 
 
 
 
 
 
 
 
 
424
  "ee-first": "1.1.1"
 
 
 
425
  }
426
  },
427
- "optimist": {
428
  "version": "0.6.1",
429
  "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
430
  "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
431
- "requires": {
432
  "minimist": "~0.0.1",
433
  "wordwrap": "~0.0.2"
434
  }
435
  },
436
- "parseurl": {
437
  "version": "1.3.3",
438
  "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
439
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
 
 
 
 
440
  },
441
- "path-to-regexp": {
442
- "version": "0.1.7",
443
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
444
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
 
 
 
 
 
 
 
 
 
 
 
 
 
 
445
  },
446
- "proxy-addr": {
447
- "version": "2.0.5",
448
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
449
- "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
450
- "requires": {
451
- "forwarded": "~0.1.2",
452
- "ipaddr.js": "1.9.0"
453
  }
454
  },
455
- "qs": {
456
- "version": "6.7.0",
457
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
458
- "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
 
 
 
 
 
 
 
 
 
 
459
  },
460
- "range-parser": {
461
  "version": "1.2.1",
462
  "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
463
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
464
- },
465
- "raw-body": {
466
- "version": "2.4.0",
467
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
468
- "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
469
- "requires": {
470
- "bytes": "3.1.0",
471
- "http-errors": "1.7.2",
472
- "iconv-lite": "0.4.24",
473
- "unpipe": "1.0.0"
474
  }
475
  },
476
- "require_optional": {
477
- "version": "1.0.1",
478
- "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
479
- "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
480
- "requires": {
481
- "resolve-from": "^2.0.0",
482
- "semver": "^5.1.0"
 
 
 
 
 
 
483
  }
484
  },
485
- "resolve-from": {
486
- "version": "2.0.0",
487
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
488
- "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
489
- },
490
- "safe-buffer": {
491
- "version": "5.1.2",
492
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
493
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
 
 
 
 
 
 
 
 
 
 
494
  },
495
- "safer-buffer": {
496
  "version": "2.1.2",
497
  "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
498
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
499
- },
500
- "saslprep": {
501
- "version": "1.0.3",
502
- "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
503
- "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
504
- "optional": true,
505
- "requires": {
506
- "sparse-bitfield": "^3.0.3"
507
- }
508
- },
509
- "semver": {
510
- "version": "5.7.1",
511
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
512
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
513
- },
514
- "send": {
515
- "version": "0.17.1",
516
- "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
517
- "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
518
- "requires": {
519
  "debug": "2.6.9",
520
- "depd": "~1.1.2",
521
- "destroy": "~1.0.4",
522
  "encodeurl": "~1.0.2",
523
  "escape-html": "~1.0.3",
524
  "etag": "~1.8.1",
525
  "fresh": "0.5.2",
526
- "http-errors": "~1.7.2",
527
  "mime": "1.6.0",
528
- "ms": "2.1.1",
529
- "on-finished": "~2.3.0",
530
  "range-parser": "~1.2.1",
531
- "statuses": "~1.5.0"
532
  },
533
- "dependencies": {
534
- "ms": {
535
- "version": "2.1.1",
536
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
537
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
538
- }
539
  }
540
  },
541
- "serve-static": {
542
- "version": "1.14.1",
543
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
544
- "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
545
- "requires": {
546
- "encodeurl": "~1.0.2",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
547
  "escape-html": "~1.0.3",
548
  "parseurl": "~1.3.3",
549
- "send": "0.17.1"
 
 
 
550
  }
551
  },
552
- "setprototypeof": {
553
- "version": "1.1.1",
554
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
555
- "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
556
  },
557
- "source-map": {
558
  "version": "0.6.1",
559
  "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
560
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
 
 
 
561
  },
562
- "sparse-bitfield": {
563
  "version": "3.0.3",
564
  "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
565
- "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
566
- "optional": true,
567
- "requires": {
568
  "memory-pager": "^1.0.2"
569
  }
570
  },
571
- "statuses": {
572
- "version": "1.5.0",
573
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
574
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
 
 
 
 
575
  },
576
- "toidentifier": {
577
- "version": "1.0.0",
578
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
579
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
 
 
 
 
580
  },
581
- "type-is": {
 
 
 
 
 
 
 
 
 
 
 
 
582
  "version": "1.6.18",
583
  "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
584
  "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
585
- "requires": {
586
  "media-typer": "0.3.0",
587
  "mime-types": "~2.1.24"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
588
  }
589
  },
590
- "uglify-js": {
591
  "version": "3.6.0",
592
  "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz",
593
  "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==",
594
  "optional": true,
595
- "requires": {
596
  "commander": "~2.20.0",
597
  "source-map": "~0.6.1"
 
 
 
 
 
 
598
  }
599
  },
600
- "unpipe": {
 
 
 
 
 
 
601
  "version": "1.0.0",
602
  "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
603
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
 
 
 
 
604
  },
605
- "utils-merge": {
606
  "version": "1.0.1",
607
  "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
608
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
 
 
 
 
609
  },
610
- "vary": {
611
  "version": "1.1.2",
612
  "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
613
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
 
 
 
614
  },
615
- "walk": {
616
  "version": "2.3.14",
617
  "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz",
618
  "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==",
619
- "requires": {
620
  "foreachasync": "^3.0.0"
621
  }
622
  },
623
- "wordwrap": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
624
  "version": "0.0.3",
625
  "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
626
- "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
 
 
 
627
  }
628
  }
629
  }
 
1
  {
2
  "name": "foobar-server",
3
  "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
  "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "foobar-server",
9
+ "version": "1.0.0",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "@types/express": "^4.17.21",
13
+ "@types/hbs": "^4.0.1",
14
+ "@types/node": "^24.0.7",
15
+ "@types/serve-static": "^1.15.8",
16
+ "body-parser": "^1.19.0",
17
+ "colors": "^1.3.3",
18
+ "express": "^4.21.1",
19
+ "hbs": "^4.0.5",
20
+ "mongodb": "^6.17.0"
21
+ },
22
+ "devDependencies": {
23
+ "typescript": "^4.0.3"
24
+ }
25
+ },
26
+ "node_modules/@mongodb-js/saslprep": {
27
+ "version": "1.3.0",
28
+ "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.3.0.tgz",
29
+ "integrity": "sha512-zlayKCsIjYb7/IdfqxorK5+xUMyi4vOKcFy10wKJYc63NSdKI8mNME+uJqfatkPmOSMMUiojrL58IePKBm3gvQ==",
30
+ "license": "MIT",
31
+ "dependencies": {
32
+ "sparse-bitfield": "^3.0.3"
33
+ }
34
+ },
35
+ "node_modules/@types/body-parser": {
36
  "version": "1.17.1",
37
  "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.1.tgz",
38
  "integrity": "sha512-RoX2EZjMiFMjZh9lmYrwgoP9RTpAjSHiJxdp4oidAQVO02T7HER3xj9UKue5534ULWeqVEkujhWcyvUce+d68w==",
39
+ "dependencies": {
40
  "@types/connect": "*",
41
  "@types/node": "*"
42
  }
43
  },
44
+ "node_modules/@types/connect": {
 
 
 
 
 
 
 
 
45
  "version": "3.4.32",
46
  "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz",
47
  "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==",
48
+ "dependencies": {
49
  "@types/node": "*"
50
  }
51
  },
52
+ "node_modules/@types/express": {
53
+ "version": "4.17.23",
54
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz",
55
+ "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==",
56
+ "license": "MIT",
57
+ "dependencies": {
 
 
 
 
58
  "@types/body-parser": "*",
59
+ "@types/express-serve-static-core": "^4.17.33",
60
+ "@types/qs": "*",
61
  "@types/serve-static": "*"
62
  }
63
  },
64
+ "node_modules/@types/express/node_modules/@types/express-serve-static-core": {
65
+ "version": "4.19.6",
66
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
67
+ "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
68
+ "license": "MIT",
69
+ "dependencies": {
70
  "@types/node": "*",
71
+ "@types/qs": "*",
72
+ "@types/range-parser": "*",
73
+ "@types/send": "*"
74
  }
75
  },
76
+ "node_modules/@types/hbs": {
77
  "version": "4.0.1",
78
  "resolved": "https://registry.npmjs.org/@types/hbs/-/hbs-4.0.1.tgz",
79
  "integrity": "sha512-kbgeYPLGOG8LQhqNlAvMm7vMz6Iu3IaXDEufpkEYT/viTko1ZlIrj+b6lvo4cAIDRkh6eg+JdKVZkriDGTisEw==",
80
+ "dependencies": {
81
  "handlebars": "^4.1.0"
82
  }
83
  },
84
+ "node_modules/@types/http-errors": {
85
+ "version": "2.0.5",
86
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
87
+ "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==",
88
+ "license": "MIT"
89
+ },
90
+ "node_modules/@types/node": {
91
+ "version": "24.0.7",
92
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.7.tgz",
93
+ "integrity": "sha512-YIEUUr4yf8q8oQoXPpSlnvKNVKDQlPMWrmOcgzoduo7kvA2UF0/BwJ/eMKFTiTtkNL17I0M6Xe2tvwFU7be6iw==",
94
+ "license": "MIT",
95
+ "dependencies": {
96
+ "undici-types": "~7.8.0"
97
  }
98
  },
99
+ "node_modules/@types/qs": {
100
+ "version": "6.14.0",
101
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
102
+ "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
103
+ "license": "MIT"
104
  },
105
+ "node_modules/@types/range-parser": {
106
  "version": "1.2.3",
107
  "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz",
108
  "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA=="
109
  },
110
+ "node_modules/@types/send": {
111
+ "version": "0.17.5",
112
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz",
113
+ "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==",
114
+ "license": "MIT",
115
+ "dependencies": {
116
+ "@types/mime": "^1",
117
+ "@types/node": "*"
118
+ }
119
+ },
120
+ "node_modules/@types/send/node_modules/@types/mime": {
121
+ "version": "1.3.5",
122
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
123
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
124
+ "license": "MIT"
125
+ },
126
+ "node_modules/@types/serve-static": {
127
+ "version": "1.15.8",
128
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz",
129
+ "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==",
130
+ "license": "MIT",
131
+ "dependencies": {
132
+ "@types/http-errors": "*",
133
+ "@types/node": "*",
134
+ "@types/send": "*"
135
  }
136
  },
137
+ "node_modules/@types/webidl-conversions": {
138
+ "version": "7.0.3",
139
+ "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
140
+ "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==",
141
+ "license": "MIT"
142
+ },
143
+ "node_modules/@types/whatwg-url": {
144
+ "version": "11.0.5",
145
+ "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
146
+ "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
147
+ "license": "MIT",
148
+ "dependencies": {
149
+ "@types/webidl-conversions": "*"
150
  }
151
  },
152
+ "node_modules/accepts": {
153
+ "version": "1.3.8",
154
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
155
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
156
+ "license": "MIT",
157
+ "dependencies": {
158
+ "mime-types": "~2.1.34",
159
+ "negotiator": "0.6.3"
160
+ },
161
+ "engines": {
162
+ "node": ">= 0.6"
163
+ }
164
+ },
165
+ "node_modules/array-flatten": {
166
  "version": "1.1.1",
167
  "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
168
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
169
+ "license": "MIT"
170
+ },
171
+ "node_modules/body-parser": {
172
+ "version": "1.20.3",
173
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
174
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
175
+ "license": "MIT",
176
+ "dependencies": {
177
+ "bytes": "3.1.2",
178
+ "content-type": "~1.0.5",
179
  "debug": "2.6.9",
180
+ "depd": "2.0.0",
181
+ "destroy": "1.2.0",
182
+ "http-errors": "2.0.0",
183
  "iconv-lite": "0.4.24",
184
+ "on-finished": "2.4.1",
185
+ "qs": "6.13.0",
186
+ "raw-body": "2.5.2",
187
+ "type-is": "~1.6.18",
188
+ "unpipe": "1.0.0"
189
+ },
190
+ "engines": {
191
+ "node": ">= 0.8",
192
+ "npm": "1.2.8000 || >= 1.4.16"
193
  }
194
  },
195
+ "node_modules/bson": {
196
+ "version": "6.10.4",
197
+ "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.4.tgz",
198
+ "integrity": "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==",
199
+ "license": "Apache-2.0",
200
+ "engines": {
201
+ "node": ">=16.20.1"
202
+ }
203
+ },
204
+ "node_modules/bytes": {
205
+ "version": "3.1.2",
206
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
207
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
208
+ "license": "MIT",
209
+ "engines": {
210
+ "node": ">= 0.8"
211
+ }
212
+ },
213
+ "node_modules/call-bind-apply-helpers": {
214
+ "version": "1.0.2",
215
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
216
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
217
+ "license": "MIT",
218
+ "dependencies": {
219
+ "es-errors": "^1.3.0",
220
+ "function-bind": "^1.1.2"
221
+ },
222
+ "engines": {
223
+ "node": ">= 0.4"
224
+ }
225
  },
226
+ "node_modules/call-bound": {
227
+ "version": "1.0.4",
228
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
229
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
230
+ "license": "MIT",
231
+ "dependencies": {
232
+ "call-bind-apply-helpers": "^1.0.2",
233
+ "get-intrinsic": "^1.3.0"
234
+ },
235
+ "engines": {
236
+ "node": ">= 0.4"
237
+ },
238
+ "funding": {
239
+ "url": "https://github.com/sponsors/ljharb"
240
+ }
241
  },
242
+ "node_modules/colors": {
243
  "version": "1.3.3",
244
  "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz",
245
+ "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==",
246
+ "engines": {
247
+ "node": ">=0.1.90"
248
+ }
249
  },
250
+ "node_modules/commander": {
251
  "version": "2.20.0",
252
  "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
253
  "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
254
  "optional": true
255
  },
256
+ "node_modules/content-disposition": {
257
+ "version": "0.5.4",
258
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
259
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
260
+ "license": "MIT",
261
+ "dependencies": {
262
+ "safe-buffer": "5.2.1"
263
+ },
264
+ "engines": {
265
+ "node": ">= 0.6"
266
  }
267
  },
268
+ "node_modules/content-type": {
269
+ "version": "1.0.5",
270
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
271
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
272
+ "license": "MIT",
273
+ "engines": {
274
+ "node": ">= 0.6"
275
+ }
276
  },
277
+ "node_modules/cookie": {
278
+ "version": "0.7.1",
279
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
280
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
281
+ "license": "MIT",
282
+ "engines": {
283
+ "node": ">= 0.6"
284
+ }
285
  },
286
+ "node_modules/cookie-signature": {
287
  "version": "1.0.6",
288
  "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
289
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
290
+ "license": "MIT"
291
  },
292
+ "node_modules/debug": {
293
  "version": "2.6.9",
294
  "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
295
  "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
296
+ "dependencies": {
297
  "ms": "2.0.0"
298
  }
299
  },
300
+ "node_modules/depd": {
301
+ "version": "2.0.0",
302
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
303
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
304
+ "license": "MIT",
305
+ "engines": {
306
+ "node": ">= 0.8"
307
+ }
308
  },
309
+ "node_modules/destroy": {
310
+ "version": "1.2.0",
311
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
312
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
313
+ "license": "MIT",
314
+ "engines": {
315
+ "node": ">= 0.8",
316
+ "npm": "1.2.8000 || >= 1.4.16"
317
+ }
318
+ },
319
+ "node_modules/dunder-proto": {
320
+ "version": "1.0.1",
321
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
322
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
323
+ "license": "MIT",
324
+ "dependencies": {
325
+ "call-bind-apply-helpers": "^1.0.1",
326
+ "es-errors": "^1.3.0",
327
+ "gopd": "^1.2.0"
328
+ },
329
+ "engines": {
330
+ "node": ">= 0.4"
331
+ }
332
  },
333
+ "node_modules/ee-first": {
334
  "version": "1.1.1",
335
  "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
336
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
337
+ "license": "MIT"
338
  },
339
+ "node_modules/encodeurl": {
340
+ "version": "2.0.0",
341
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
342
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
343
+ "license": "MIT",
344
+ "engines": {
345
+ "node": ">= 0.8"
346
+ }
347
+ },
348
+ "node_modules/es-define-property": {
349
+ "version": "1.0.1",
350
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
351
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
352
+ "license": "MIT",
353
+ "engines": {
354
+ "node": ">= 0.4"
355
+ }
356
+ },
357
+ "node_modules/es-errors": {
358
+ "version": "1.3.0",
359
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
360
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
361
+ "license": "MIT",
362
+ "engines": {
363
+ "node": ">= 0.4"
364
+ }
365
  },
366
+ "node_modules/es-object-atoms": {
367
+ "version": "1.1.1",
368
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
369
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
370
+ "license": "MIT",
371
+ "dependencies": {
372
+ "es-errors": "^1.3.0"
373
+ },
374
+ "engines": {
375
+ "node": ">= 0.4"
376
+ }
377
+ },
378
+ "node_modules/escape-html": {
379
  "version": "1.0.3",
380
  "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
381
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
382
+ "license": "MIT"
383
  },
384
+ "node_modules/etag": {
385
  "version": "1.8.1",
386
  "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
387
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
388
+ "license": "MIT",
389
+ "engines": {
390
+ "node": ">= 0.6"
391
+ }
392
+ },
393
+ "node_modules/express": {
394
+ "version": "4.21.2",
395
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
396
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
397
+ "license": "MIT",
398
+ "dependencies": {
399
+ "accepts": "~1.3.8",
400
  "array-flatten": "1.1.1",
401
+ "body-parser": "1.20.3",
402
+ "content-disposition": "0.5.4",
403
  "content-type": "~1.0.4",
404
+ "cookie": "0.7.1",
405
  "cookie-signature": "1.0.6",
406
  "debug": "2.6.9",
407
+ "depd": "2.0.0",
408
+ "encodeurl": "~2.0.0",
409
  "escape-html": "~1.0.3",
410
  "etag": "~1.8.1",
411
+ "finalhandler": "1.3.1",
412
  "fresh": "0.5.2",
413
+ "http-errors": "2.0.0",
414
+ "merge-descriptors": "1.0.3",
415
  "methods": "~1.1.2",
416
+ "on-finished": "2.4.1",
417
  "parseurl": "~1.3.3",
418
+ "path-to-regexp": "0.1.12",
419
+ "proxy-addr": "~2.0.7",
420
+ "qs": "6.13.0",
421
  "range-parser": "~1.2.1",
422
+ "safe-buffer": "5.2.1",
423
+ "send": "0.19.0",
424
+ "serve-static": "1.16.2",
425
+ "setprototypeof": "1.2.0",
426
+ "statuses": "2.0.1",
427
  "type-is": "~1.6.18",
428
  "utils-merge": "1.0.1",
429
  "vary": "~1.1.2"
430
+ },
431
+ "engines": {
432
+ "node": ">= 0.10.0"
433
+ },
434
+ "funding": {
435
+ "type": "opencollective",
436
+ "url": "https://opencollective.com/express"
437
  }
438
  },
439
+ "node_modules/finalhandler": {
440
+ "version": "1.3.1",
441
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
442
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
443
+ "license": "MIT",
444
+ "dependencies": {
445
  "debug": "2.6.9",
446
+ "encodeurl": "~2.0.0",
447
  "escape-html": "~1.0.3",
448
+ "on-finished": "2.4.1",
449
  "parseurl": "~1.3.3",
450
+ "statuses": "2.0.1",
451
  "unpipe": "~1.0.0"
452
+ },
453
+ "engines": {
454
+ "node": ">= 0.8"
455
  }
456
  },
457
+ "node_modules/foreachasync": {
458
  "version": "3.0.0",
459
  "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz",
460
  "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY="
461
  },
462
+ "node_modules/forwarded": {
463
+ "version": "0.2.0",
464
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
465
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
466
+ "license": "MIT",
467
+ "engines": {
468
+ "node": ">= 0.6"
469
+ }
470
  },
471
+ "node_modules/fresh": {
472
  "version": "0.5.2",
473
  "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
474
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
475
+ "license": "MIT",
476
+ "engines": {
477
+ "node": ">= 0.6"
478
+ }
479
+ },
480
+ "node_modules/function-bind": {
481
+ "version": "1.1.2",
482
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
483
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
484
+ "license": "MIT",
485
+ "funding": {
486
+ "url": "https://github.com/sponsors/ljharb"
487
+ }
488
+ },
489
+ "node_modules/get-intrinsic": {
490
+ "version": "1.3.0",
491
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
492
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
493
+ "license": "MIT",
494
+ "dependencies": {
495
+ "call-bind-apply-helpers": "^1.0.2",
496
+ "es-define-property": "^1.0.1",
497
+ "es-errors": "^1.3.0",
498
+ "es-object-atoms": "^1.1.1",
499
+ "function-bind": "^1.1.2",
500
+ "get-proto": "^1.0.1",
501
+ "gopd": "^1.2.0",
502
+ "has-symbols": "^1.1.0",
503
+ "hasown": "^2.0.2",
504
+ "math-intrinsics": "^1.1.0"
505
+ },
506
+ "engines": {
507
+ "node": ">= 0.4"
508
+ },
509
+ "funding": {
510
+ "url": "https://github.com/sponsors/ljharb"
511
+ }
512
+ },
513
+ "node_modules/get-proto": {
514
+ "version": "1.0.1",
515
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
516
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
517
+ "license": "MIT",
518
+ "dependencies": {
519
+ "dunder-proto": "^1.0.1",
520
+ "es-object-atoms": "^1.0.0"
521
+ },
522
+ "engines": {
523
+ "node": ">= 0.4"
524
+ }
525
+ },
526
+ "node_modules/gopd": {
527
+ "version": "1.2.0",
528
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
529
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
530
+ "license": "MIT",
531
+ "engines": {
532
+ "node": ">= 0.4"
533
+ },
534
+ "funding": {
535
+ "url": "https://github.com/sponsors/ljharb"
536
+ }
537
  },
538
+ "node_modules/handlebars": {
539
  "version": "4.2.0",
540
  "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.2.0.tgz",
541
  "integrity": "sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw==",
542
+ "dependencies": {
543
  "neo-async": "^2.6.0",
544
  "optimist": "^0.6.1",
545
+ "source-map": "^0.6.1"
546
+ },
547
+ "bin": {
548
+ "handlebars": "bin/handlebars"
549
+ },
550
+ "engines": {
551
+ "node": ">=0.4.7"
552
+ },
553
+ "optionalDependencies": {
554
  "uglify-js": "^3.1.4"
555
  }
556
  },
557
+ "node_modules/has-symbols": {
558
+ "version": "1.1.0",
559
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
560
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
561
+ "license": "MIT",
562
+ "engines": {
563
+ "node": ">= 0.4"
564
+ },
565
+ "funding": {
566
+ "url": "https://github.com/sponsors/ljharb"
567
+ }
568
+ },
569
+ "node_modules/hasown": {
570
+ "version": "2.0.2",
571
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
572
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
573
+ "license": "MIT",
574
+ "dependencies": {
575
+ "function-bind": "^1.1.2"
576
+ },
577
+ "engines": {
578
+ "node": ">= 0.4"
579
+ }
580
+ },
581
+ "node_modules/hbs": {
582
  "version": "4.0.5",
583
  "resolved": "https://registry.npmjs.org/hbs/-/hbs-4.0.5.tgz",
584
  "integrity": "sha512-lzyXY0HalmVqHyhty05cLoPqxY51gNnCI6cMlXiPbrIKvB3BTJh3waQ9de86x25jX9QhU/tkAojsOO4KB6vPfg==",
585
+ "dependencies": {
586
  "handlebars": "4.3.3",
587
  "walk": "2.3.14"
588
  },
589
+ "engines": {
590
+ "node": ">= 0.8",
591
+ "npm": "1.2.8000 || >= 1.4.16"
592
+ }
593
+ },
594
+ "node_modules/hbs/node_modules/handlebars": {
595
+ "version": "4.3.3",
596
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.3.3.tgz",
597
+ "integrity": "sha512-VupOxR91xcGojfINrzMqrvlyYbBs39sXIrWa7YdaQWeBudOlvKEGvCczMfJPgnuwHE/zyH1M6J+IUP6cgDVyxg==",
598
  "dependencies": {
599
+ "neo-async": "^2.6.0",
600
+ "optimist": "^0.6.1",
601
+ "source-map": "^0.6.1"
602
+ },
603
+ "bin": {
604
+ "handlebars": "bin/handlebars"
605
+ },
606
+ "engines": {
607
+ "node": ">=0.4.7"
608
+ },
609
+ "optionalDependencies": {
610
+ "uglify-js": "^3.1.4"
611
  }
612
  },
613
+ "node_modules/http-errors": {
614
+ "version": "2.0.0",
615
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
616
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
617
+ "license": "MIT",
618
+ "dependencies": {
619
+ "depd": "2.0.0",
620
+ "inherits": "2.0.4",
621
+ "setprototypeof": "1.2.0",
622
+ "statuses": "2.0.1",
623
+ "toidentifier": "1.0.1"
624
+ },
625
+ "engines": {
626
+ "node": ">= 0.8"
627
  }
628
  },
629
+ "node_modules/iconv-lite": {
630
  "version": "0.4.24",
631
  "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
632
  "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
633
+ "license": "MIT",
634
+ "dependencies": {
635
  "safer-buffer": ">= 2.1.2 < 3"
636
+ },
637
+ "engines": {
638
+ "node": ">=0.10.0"
639
  }
640
  },
641
+ "node_modules/inherits": {
642
+ "version": "2.0.4",
643
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
644
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
645
+ "license": "ISC"
646
+ },
647
+ "node_modules/ipaddr.js": {
648
+ "version": "1.9.1",
649
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
650
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
651
+ "license": "MIT",
652
+ "engines": {
653
+ "node": ">= 0.10"
654
+ }
655
  },
656
+ "node_modules/math-intrinsics": {
657
+ "version": "1.1.0",
658
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
659
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
660
+ "license": "MIT",
661
+ "engines": {
662
+ "node": ">= 0.4"
663
+ }
664
  },
665
+ "node_modules/media-typer": {
666
  "version": "0.3.0",
667
  "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
668
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
669
+ "engines": {
670
+ "node": ">= 0.6"
671
+ }
672
  },
673
+ "node_modules/memory-pager": {
674
  "version": "1.5.0",
675
  "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
676
  "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
677
+ "license": "MIT"
678
  },
679
+ "node_modules/merge-descriptors": {
680
+ "version": "1.0.3",
681
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
682
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
683
+ "license": "MIT",
684
+ "funding": {
685
+ "url": "https://github.com/sponsors/sindresorhus"
686
+ }
687
  },
688
+ "node_modules/methods": {
689
  "version": "1.1.2",
690
  "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
691
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
692
+ "license": "MIT",
693
+ "engines": {
694
+ "node": ">= 0.6"
695
+ }
696
  },
697
+ "node_modules/mime": {
698
  "version": "1.6.0",
699
  "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
700
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
701
+ "license": "MIT",
702
+ "bin": {
703
+ "mime": "cli.js"
704
+ },
705
+ "engines": {
706
+ "node": ">=4"
707
+ }
708
  },
709
+ "node_modules/mime-db": {
710
+ "version": "1.52.0",
711
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
712
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
713
+ "license": "MIT",
714
+ "engines": {
715
+ "node": ">= 0.6"
716
+ }
717
  },
718
+ "node_modules/mime-types": {
719
+ "version": "2.1.35",
720
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
721
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
722
+ "license": "MIT",
723
+ "dependencies": {
724
+ "mime-db": "1.52.0"
725
+ },
726
+ "engines": {
727
+ "node": ">= 0.6"
728
  }
729
  },
730
+ "node_modules/minimist": {
731
  "version": "0.0.10",
732
  "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
733
  "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
734
  },
735
+ "node_modules/mongodb": {
736
+ "version": "6.17.0",
737
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.17.0.tgz",
738
+ "integrity": "sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA==",
739
+ "license": "Apache-2.0",
740
+ "dependencies": {
741
+ "@mongodb-js/saslprep": "^1.1.9",
742
+ "bson": "^6.10.4",
743
+ "mongodb-connection-string-url": "^3.0.0"
744
+ },
745
+ "engines": {
746
+ "node": ">=16.20.1"
747
+ },
748
+ "peerDependencies": {
749
+ "@aws-sdk/credential-providers": "^3.188.0",
750
+ "@mongodb-js/zstd": "^1.1.0 || ^2.0.0",
751
+ "gcp-metadata": "^5.2.0",
752
+ "kerberos": "^2.0.1",
753
+ "mongodb-client-encryption": ">=6.0.0 <7",
754
+ "snappy": "^7.2.2",
755
+ "socks": "^2.7.1"
756
+ },
757
+ "peerDependenciesMeta": {
758
+ "@aws-sdk/credential-providers": {
759
+ "optional": true
760
+ },
761
+ "@mongodb-js/zstd": {
762
+ "optional": true
763
+ },
764
+ "gcp-metadata": {
765
+ "optional": true
766
+ },
767
+ "kerberos": {
768
+ "optional": true
769
+ },
770
+ "mongodb-client-encryption": {
771
+ "optional": true
772
+ },
773
+ "snappy": {
774
+ "optional": true
775
+ },
776
+ "socks": {
777
+ "optional": true
778
+ }
779
  }
780
  },
781
+ "node_modules/mongodb-connection-string-url": {
782
+ "version": "3.0.2",
783
+ "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz",
784
+ "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==",
785
+ "license": "Apache-2.0",
786
+ "dependencies": {
787
+ "@types/whatwg-url": "^11.0.2",
788
+ "whatwg-url": "^14.1.0 || ^13.0.0"
 
789
  }
790
  },
791
+ "node_modules/ms": {
792
  "version": "2.0.0",
793
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
794
  "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
795
  },
796
+ "node_modules/negotiator": {
797
+ "version": "0.6.3",
798
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
799
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
800
+ "license": "MIT",
801
+ "engines": {
802
+ "node": ">= 0.6"
803
+ }
804
  },
805
+ "node_modules/neo-async": {
806
  "version": "2.6.1",
807
  "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
808
  "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw=="
809
  },
810
+ "node_modules/object-inspect": {
811
+ "version": "1.13.4",
812
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
813
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
814
+ "license": "MIT",
815
+ "engines": {
816
+ "node": ">= 0.4"
817
+ },
818
+ "funding": {
819
+ "url": "https://github.com/sponsors/ljharb"
820
+ }
821
+ },
822
+ "node_modules/on-finished": {
823
+ "version": "2.4.1",
824
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
825
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
826
+ "license": "MIT",
827
+ "dependencies": {
828
  "ee-first": "1.1.1"
829
+ },
830
+ "engines": {
831
+ "node": ">= 0.8"
832
  }
833
  },
834
+ "node_modules/optimist": {
835
  "version": "0.6.1",
836
  "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
837
  "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
838
+ "dependencies": {
839
  "minimist": "~0.0.1",
840
  "wordwrap": "~0.0.2"
841
  }
842
  },
843
+ "node_modules/parseurl": {
844
  "version": "1.3.3",
845
  "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
846
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
847
+ "license": "MIT",
848
+ "engines": {
849
+ "node": ">= 0.8"
850
+ }
851
  },
852
+ "node_modules/path-to-regexp": {
853
+ "version": "0.1.12",
854
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
855
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
856
+ "license": "MIT"
857
+ },
858
+ "node_modules/proxy-addr": {
859
+ "version": "2.0.7",
860
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
861
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
862
+ "license": "MIT",
863
+ "dependencies": {
864
+ "forwarded": "0.2.0",
865
+ "ipaddr.js": "1.9.1"
866
+ },
867
+ "engines": {
868
+ "node": ">= 0.10"
869
+ }
870
  },
871
+ "node_modules/punycode": {
872
+ "version": "2.3.1",
873
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
874
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
875
+ "license": "MIT",
876
+ "engines": {
877
+ "node": ">=6"
878
  }
879
  },
880
+ "node_modules/qs": {
881
+ "version": "6.13.0",
882
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
883
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
884
+ "license": "BSD-3-Clause",
885
+ "dependencies": {
886
+ "side-channel": "^1.0.6"
887
+ },
888
+ "engines": {
889
+ "node": ">=0.6"
890
+ },
891
+ "funding": {
892
+ "url": "https://github.com/sponsors/ljharb"
893
+ }
894
  },
895
+ "node_modules/range-parser": {
896
  "version": "1.2.1",
897
  "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
898
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
899
+ "license": "MIT",
900
+ "engines": {
901
+ "node": ">= 0.6"
 
 
 
 
 
 
 
902
  }
903
  },
904
+ "node_modules/raw-body": {
905
+ "version": "2.5.2",
906
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
907
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
908
+ "license": "MIT",
909
+ "dependencies": {
910
+ "bytes": "3.1.2",
911
+ "http-errors": "2.0.0",
912
+ "iconv-lite": "0.4.24",
913
+ "unpipe": "1.0.0"
914
+ },
915
+ "engines": {
916
+ "node": ">= 0.8"
917
  }
918
  },
919
+ "node_modules/safe-buffer": {
920
+ "version": "5.2.1",
921
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
922
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
923
+ "funding": [
924
+ {
925
+ "type": "github",
926
+ "url": "https://github.com/sponsors/feross"
927
+ },
928
+ {
929
+ "type": "patreon",
930
+ "url": "https://www.patreon.com/feross"
931
+ },
932
+ {
933
+ "type": "consulting",
934
+ "url": "https://feross.org/support"
935
+ }
936
+ ],
937
+ "license": "MIT"
938
  },
939
+ "node_modules/safer-buffer": {
940
  "version": "2.1.2",
941
  "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
942
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
943
+ "license": "MIT"
944
+ },
945
+ "node_modules/send": {
946
+ "version": "0.19.0",
947
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
948
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
949
+ "license": "MIT",
950
+ "dependencies": {
 
 
 
 
 
 
 
 
 
 
 
 
951
  "debug": "2.6.9",
952
+ "depd": "2.0.0",
953
+ "destroy": "1.2.0",
954
  "encodeurl": "~1.0.2",
955
  "escape-html": "~1.0.3",
956
  "etag": "~1.8.1",
957
  "fresh": "0.5.2",
958
+ "http-errors": "2.0.0",
959
  "mime": "1.6.0",
960
+ "ms": "2.1.3",
961
+ "on-finished": "2.4.1",
962
  "range-parser": "~1.2.1",
963
+ "statuses": "2.0.1"
964
  },
965
+ "engines": {
966
+ "node": ">= 0.8.0"
 
 
 
 
967
  }
968
  },
969
+ "node_modules/send/node_modules/encodeurl": {
970
+ "version": "1.0.2",
971
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
972
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
973
+ "license": "MIT",
974
+ "engines": {
975
+ "node": ">= 0.8"
976
+ }
977
+ },
978
+ "node_modules/send/node_modules/ms": {
979
+ "version": "2.1.3",
980
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
981
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
982
+ "license": "MIT"
983
+ },
984
+ "node_modules/serve-static": {
985
+ "version": "1.16.2",
986
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
987
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
988
+ "license": "MIT",
989
+ "dependencies": {
990
+ "encodeurl": "~2.0.0",
991
  "escape-html": "~1.0.3",
992
  "parseurl": "~1.3.3",
993
+ "send": "0.19.0"
994
+ },
995
+ "engines": {
996
+ "node": ">= 0.8.0"
997
  }
998
  },
999
+ "node_modules/setprototypeof": {
1000
+ "version": "1.2.0",
1001
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1002
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1003
+ "license": "ISC"
1004
+ },
1005
+ "node_modules/side-channel": {
1006
+ "version": "1.1.0",
1007
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1008
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1009
+ "license": "MIT",
1010
+ "dependencies": {
1011
+ "es-errors": "^1.3.0",
1012
+ "object-inspect": "^1.13.3",
1013
+ "side-channel-list": "^1.0.0",
1014
+ "side-channel-map": "^1.0.1",
1015
+ "side-channel-weakmap": "^1.0.2"
1016
+ },
1017
+ "engines": {
1018
+ "node": ">= 0.4"
1019
+ },
1020
+ "funding": {
1021
+ "url": "https://github.com/sponsors/ljharb"
1022
+ }
1023
+ },
1024
+ "node_modules/side-channel-list": {
1025
+ "version": "1.0.0",
1026
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1027
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1028
+ "license": "MIT",
1029
+ "dependencies": {
1030
+ "es-errors": "^1.3.0",
1031
+ "object-inspect": "^1.13.3"
1032
+ },
1033
+ "engines": {
1034
+ "node": ">= 0.4"
1035
+ },
1036
+ "funding": {
1037
+ "url": "https://github.com/sponsors/ljharb"
1038
+ }
1039
+ },
1040
+ "node_modules/side-channel-map": {
1041
+ "version": "1.0.1",
1042
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1043
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1044
+ "license": "MIT",
1045
+ "dependencies": {
1046
+ "call-bound": "^1.0.2",
1047
+ "es-errors": "^1.3.0",
1048
+ "get-intrinsic": "^1.2.5",
1049
+ "object-inspect": "^1.13.3"
1050
+ },
1051
+ "engines": {
1052
+ "node": ">= 0.4"
1053
+ },
1054
+ "funding": {
1055
+ "url": "https://github.com/sponsors/ljharb"
1056
+ }
1057
+ },
1058
+ "node_modules/side-channel-weakmap": {
1059
+ "version": "1.0.2",
1060
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1061
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1062
+ "license": "MIT",
1063
+ "dependencies": {
1064
+ "call-bound": "^1.0.2",
1065
+ "es-errors": "^1.3.0",
1066
+ "get-intrinsic": "^1.2.5",
1067
+ "object-inspect": "^1.13.3",
1068
+ "side-channel-map": "^1.0.1"
1069
+ },
1070
+ "engines": {
1071
+ "node": ">= 0.4"
1072
+ },
1073
+ "funding": {
1074
+ "url": "https://github.com/sponsors/ljharb"
1075
+ }
1076
  },
1077
+ "node_modules/source-map": {
1078
  "version": "0.6.1",
1079
  "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1080
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1081
+ "engines": {
1082
+ "node": ">=0.10.0"
1083
+ }
1084
  },
1085
+ "node_modules/sparse-bitfield": {
1086
  "version": "3.0.3",
1087
  "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
1088
+ "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
1089
+ "license": "MIT",
1090
+ "dependencies": {
1091
  "memory-pager": "^1.0.2"
1092
  }
1093
  },
1094
+ "node_modules/statuses": {
1095
+ "version": "2.0.1",
1096
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1097
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1098
+ "license": "MIT",
1099
+ "engines": {
1100
+ "node": ">= 0.8"
1101
+ }
1102
  },
1103
+ "node_modules/toidentifier": {
1104
+ "version": "1.0.1",
1105
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1106
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1107
+ "license": "MIT",
1108
+ "engines": {
1109
+ "node": ">=0.6"
1110
+ }
1111
  },
1112
+ "node_modules/tr46": {
1113
+ "version": "5.1.1",
1114
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
1115
+ "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
1116
+ "license": "MIT",
1117
+ "dependencies": {
1118
+ "punycode": "^2.3.1"
1119
+ },
1120
+ "engines": {
1121
+ "node": ">=18"
1122
+ }
1123
+ },
1124
+ "node_modules/type-is": {
1125
  "version": "1.6.18",
1126
  "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1127
  "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1128
+ "dependencies": {
1129
  "media-typer": "0.3.0",
1130
  "mime-types": "~2.1.24"
1131
+ },
1132
+ "engines": {
1133
+ "node": ">= 0.6"
1134
+ }
1135
+ },
1136
+ "node_modules/typescript": {
1137
+ "version": "4.9.5",
1138
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
1139
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
1140
+ "dev": true,
1141
+ "license": "Apache-2.0",
1142
+ "bin": {
1143
+ "tsc": "bin/tsc",
1144
+ "tsserver": "bin/tsserver"
1145
+ },
1146
+ "engines": {
1147
+ "node": ">=4.2.0"
1148
  }
1149
  },
1150
+ "node_modules/uglify-js": {
1151
  "version": "3.6.0",
1152
  "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz",
1153
  "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==",
1154
  "optional": true,
1155
+ "dependencies": {
1156
  "commander": "~2.20.0",
1157
  "source-map": "~0.6.1"
1158
+ },
1159
+ "bin": {
1160
+ "uglifyjs": "bin/uglifyjs"
1161
+ },
1162
+ "engines": {
1163
+ "node": ">=0.8.0"
1164
  }
1165
  },
1166
+ "node_modules/undici-types": {
1167
+ "version": "7.8.0",
1168
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
1169
+ "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
1170
+ "license": "MIT"
1171
+ },
1172
+ "node_modules/unpipe": {
1173
  "version": "1.0.0",
1174
  "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1175
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1176
+ "license": "MIT",
1177
+ "engines": {
1178
+ "node": ">= 0.8"
1179
+ }
1180
  },
1181
+ "node_modules/utils-merge": {
1182
  "version": "1.0.1",
1183
  "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1184
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1185
+ "license": "MIT",
1186
+ "engines": {
1187
+ "node": ">= 0.4.0"
1188
+ }
1189
  },
1190
+ "node_modules/vary": {
1191
  "version": "1.1.2",
1192
  "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1193
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
1194
+ "engines": {
1195
+ "node": ">= 0.8"
1196
+ }
1197
  },
1198
+ "node_modules/walk": {
1199
  "version": "2.3.14",
1200
  "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz",
1201
  "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==",
1202
+ "dependencies": {
1203
  "foreachasync": "^3.0.0"
1204
  }
1205
  },
1206
+ "node_modules/webidl-conversions": {
1207
+ "version": "7.0.0",
1208
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
1209
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
1210
+ "license": "BSD-2-Clause",
1211
+ "engines": {
1212
+ "node": ">=12"
1213
+ }
1214
+ },
1215
+ "node_modules/whatwg-url": {
1216
+ "version": "14.2.0",
1217
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
1218
+ "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
1219
+ "license": "MIT",
1220
+ "dependencies": {
1221
+ "tr46": "^5.1.0",
1222
+ "webidl-conversions": "^7.0.0"
1223
+ },
1224
+ "engines": {
1225
+ "node": ">=18"
1226
+ }
1227
+ },
1228
+ "node_modules/wordwrap": {
1229
  "version": "0.0.3",
1230
  "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
1231
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
1232
+ "engines": {
1233
+ "node": ">=0.4.0"
1234
+ }
1235
  }
1236
  }
1237
  }
server/package.json CHANGED
@@ -9,15 +9,15 @@
9
  "author": "",
10
  "license": "ISC",
11
  "dependencies": {
12
- "@types/express": "^4.17.2",
13
  "@types/hbs": "^4.0.1",
14
- "@types/mongodb": "^3.1.2",
15
- "@types/node": "^12.12.14",
16
  "body-parser": "^1.19.0",
17
  "colors": "^1.3.3",
18
- "express": "^4.17.1",
19
  "hbs": "^4.0.5",
20
- "mongodb": "^3.1.10"
21
  },
22
  "devDependencies": {
23
  "typescript": "^4.0.3"
 
9
  "author": "",
10
  "license": "ISC",
11
  "dependencies": {
12
+ "@types/express": "^4.17.21",
13
  "@types/hbs": "^4.0.1",
14
+ "@types/node": "^24.0.7",
15
+ "@types/serve-static": "^1.15.8",
16
  "body-parser": "^1.19.0",
17
  "colors": "^1.3.3",
18
+ "express": "^4.21.1",
19
  "hbs": "^4.0.5",
20
+ "mongodb": "^6.17.0"
21
  },
22
  "devDependencies": {
23
  "typescript": "^4.0.3"
server/server.ts CHANGED
@@ -1,5 +1,5 @@
1
  require('./lib/Extensions').install();
2
- import * as express from 'express';
3
  import * as bodyParser from 'body-parser';
4
  import __rootDir from './lib/RootDirFinder';
5
  import { c } from './lib/Log';
@@ -45,14 +45,14 @@ app.get('/', async function(req, res) {
45
  .toArray()
46
  ;
47
  /// ^^ cache this query at some point for performance.
48
-
49
  res.render('landing', {
50
  body_classes: `landing`,
51
  docs
52
  });
53
  });
54
 
55
- app.get('/model/:model', function(req, res) {
56
  const model = req.params.model;
57
  if (! ['arxiv-nlp', 'distil-gpt2', 'ctrl', 'pplm'].includes(model)) {
58
  return res.sendStatus(404);
@@ -80,11 +80,11 @@ app.get('/doc/:model', function(req, res) {
80
  if (! ALL_MODELS.includes(model)) {
81
  return res.sendStatus(404);
82
  }
83
-
84
  const doc = Doc.seed(model as ModelId);
85
  /// ^^ new document. It doesn't exist in the db yet,
86
  /// will only be stored if user presses save.
87
-
88
  res.render('index', {
89
  body_classes: `app`,
90
  editable: true,
@@ -97,7 +97,7 @@ app.get('/doc/:model/:id/edit', async function(req, res) {
97
  if (! ALL_MODELS.includes(model)) {
98
  return res.sendStatus(404);
99
  }
100
-
101
  const doc = await Doc.findOne<Doc>({
102
  longId: req.params.id,
103
  });
@@ -105,7 +105,7 @@ app.get('/doc/:model/:id/edit', async function(req, res) {
105
  return res.sendStatus(404);
106
  }
107
  /// Existing document, accessed through its private edit url.
108
-
109
  res.render('index', {
110
  body_classes: `app`,
111
  editable: true,
@@ -121,7 +121,7 @@ app.get('/share/:shortId', async function(req, res) {
121
  /// Existing document, accessed through its public share url.
122
  /// CAUTION: Make sure we don't expose the edit url!
123
  delete doc.longId;
124
-
125
  res.render('index', {
126
  body_classes: `app`,
127
  editable: false,
@@ -142,14 +142,14 @@ app.post('/edit/:model/:longId/:shortId', async function(req, res) {
142
  };
143
  c.debug(`––`);
144
  c.log(`Attempting to save doc`, query);
145
-
146
  const result = await db.docs.updateOne(
147
  query,
148
  { $set: req.body },
149
  { upsert: true }
150
  );
151
- c.log(result.result);
152
-
153
  res.sendStatus(200);
154
  });
155
 
@@ -158,10 +158,10 @@ app.post('/duplicate/:shortId', async function(req, res) {
158
  if (!doc) {
159
  return res.sendStatus(404);
160
  }
161
-
162
  c.debug(`––`);
163
  c.log(`Duplicating doc`, doc.shortId);
164
-
165
  const newdoc = await doc.duplicate();
166
  res.send(newdoc.editUrl);
167
  });
 
1
  require('./lib/Extensions').install();
2
+ import express from 'express';
3
  import * as bodyParser from 'body-parser';
4
  import __rootDir from './lib/RootDirFinder';
5
  import { c } from './lib/Log';
 
45
  .toArray()
46
  ;
47
  /// ^^ cache this query at some point for performance.
48
+
49
  res.render('landing', {
50
  body_classes: `landing`,
51
  docs
52
  });
53
  });
54
 
55
+ app.get('/model/:model', async function(req, res) {
56
  const model = req.params.model;
57
  if (! ['arxiv-nlp', 'distil-gpt2', 'ctrl', 'pplm'].includes(model)) {
58
  return res.sendStatus(404);
 
80
  if (! ALL_MODELS.includes(model)) {
81
  return res.sendStatus(404);
82
  }
83
+
84
  const doc = Doc.seed(model as ModelId);
85
  /// ^^ new document. It doesn't exist in the db yet,
86
  /// will only be stored if user presses save.
87
+
88
  res.render('index', {
89
  body_classes: `app`,
90
  editable: true,
 
97
  if (! ALL_MODELS.includes(model)) {
98
  return res.sendStatus(404);
99
  }
100
+
101
  const doc = await Doc.findOne<Doc>({
102
  longId: req.params.id,
103
  });
 
105
  return res.sendStatus(404);
106
  }
107
  /// Existing document, accessed through its private edit url.
108
+
109
  res.render('index', {
110
  body_classes: `app`,
111
  editable: true,
 
121
  /// Existing document, accessed through its public share url.
122
  /// CAUTION: Make sure we don't expose the edit url!
123
  delete doc.longId;
124
+
125
  res.render('index', {
126
  body_classes: `app`,
127
  editable: false,
 
142
  };
143
  c.debug(`––`);
144
  c.log(`Attempting to save doc`, query);
145
+
146
  const result = await db.docs.updateOne(
147
  query,
148
  { $set: req.body },
149
  { upsert: true }
150
  );
151
+ c.log(result);
152
+
153
  res.sendStatus(200);
154
  });
155
 
 
158
  if (!doc) {
159
  return res.sendStatus(404);
160
  }
161
+
162
  c.debug(`––`);
163
  c.log(`Duplicating doc`, doc.shortId);
164
+
165
  const newdoc = await doc.duplicate();
166
  res.send(newdoc.editUrl);
167
  });
server/tsconfig.json CHANGED
@@ -6,6 +6,8 @@
6
  "sourceMap": true,
7
  "strictNullChecks": true,
8
  "strictBindCallApply": true,
 
 
9
  "lib": ["es6", "es2016", "es2017", "es2018", "esnext"],
10
  }
11
- }
 
6
  "sourceMap": true,
7
  "strictNullChecks": true,
8
  "strictBindCallApply": true,
9
+ "esModuleInterop": true,
10
+ "allowSyntheticDefaultImports": true,
11
  "lib": ["es6", "es2016", "es2017", "es2018", "esnext"],
12
  }
13
+ }