@unchainedshop/mongodb 3.0.0-alpha7 → 3.0.0-rc.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import type { Collection, Document, CreateIndexesOptions, IndexDirection } from 'mongodb';
1
+ import { Collection, Document, CreateIndexesOptions, IndexDirection } from 'mongodb';
2
2
  export type Indexes<T extends Document> = Array<{
3
3
  index: {
4
4
  [key in keyof T]?: IndexDirection;
@@ -1 +1 @@
1
- {"version":3,"file":"build-db-indexes.d.ts","sourceRoot":"","sources":["../src/build-db-indexes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAI1F,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,QAAQ,IAAI,KAAK,CAAC;IAC9C,KAAK,EAAE;SAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,cAAc;KAAE,CAAC;IAC7C,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC,CAAC,CAAC;AAkBH,eAAO,MAAM,cAAc,GAAU,CAAC,SAAS,QAAQ,cACzC,UAAU,CAAC,CAAC,CAAC,WAChB,OAAO,CAAC,CAAC,CAAC,qBA0BpB,CAAC"}
1
+ {"version":3,"file":"build-db-indexes.d.ts","sourceRoot":"","sources":["../src/build-db-indexes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAKrF,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,QAAQ,IAAI,KAAK,CAAC;IAC9C,KAAK,EAAE;SAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,cAAc;KAAE,CAAC;IAC7C,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC,CAAC,CAAC;AAkBH,eAAO,MAAM,cAAc,GAAU,CAAC,SAAS,QAAQ,cACzC,UAAU,CAAC,CAAC,CAAC,WAChB,OAAO,CAAC,CAAC,CAAC,qBAwBpB,CAAC"}
@@ -1,11 +1,12 @@
1
- import { log, LogLevel } from '@unchainedshop/logger';
1
+ import { createLogger } from '@unchainedshop/logger';
2
+ const logger = createLogger('unchained:mongodb');
2
3
  const buildIndexes = (collection, indexes) => Promise.all(indexes.map(async ({ index, options }) => {
3
4
  try {
4
5
  await collection.createIndex(index, options);
5
6
  return false;
6
7
  }
7
8
  catch (e) {
8
- log(e, { level: LogLevel.Error });
9
+ logger.error(e);
9
10
  return e;
10
11
  }
11
12
  }));
@@ -21,10 +22,8 @@ export const buildDbIndexes = async (collection, indexes) => {
21
22
  // if (!dropError) {
22
23
  const rebuildErrors = (await buildIndexes(collection, indexes)).filter(Boolean);
23
24
  if (rebuildErrors.length) {
24
- log(`Error building some indexes for ${collection.collectionName}`, {
25
- level: LogLevel.Error,
26
- ...rebuildErrors,
27
- });
25
+ logger.error(`Error building some indexes for ${collection.collectionName}`);
26
+ logger.debug(rebuildErrors);
28
27
  success = false;
29
28
  }
30
29
  // }
@@ -1 +1 @@
1
- {"version":3,"file":"build-db-indexes.js","sourceRoot":"","sources":["../src/build-db-indexes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAOtD,MAAM,YAAY,GAAG,CACnB,UAAyB,EACzB,OAAmB,EACY,EAAE,CACjC,OAAO,CAAC,GAAG,CACT,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;IACvC,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAClC,OAAO,CAAU,CAAC;IACpB,CAAC;AACH,CAAC,CAAC,CACH,CAAC;AAEJ,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,UAAyB,EACzB,OAAmB,EACnB,EAAE;IACF,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,MAAM,WAAW,GAAG,CAAC,MAAM,YAAY,CAAI,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEjF,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACvB,QAAQ;QACR,sDAAsD;QACtD,gBAAgB;QAChB,UAAU;QACV,IAAI;QAEJ,oBAAoB;QACpB,MAAM,aAAa,GAAG,CAAC,MAAM,YAAY,CAAI,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEnF,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YACzB,GAAG,CAAC,mCAAmC,UAAU,CAAC,cAAc,EAAE,EAAE;gBAClE,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,GAAG,aAAa;aACjB,CAAC,CAAC;YACH,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;QACD,IAAI;IACN,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
1
+ {"version":3,"file":"build-db-indexes.js","sourceRoot":"","sources":["../src/build-db-indexes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,MAAM,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;AAOjD,MAAM,YAAY,GAAG,CACnB,UAAyB,EACzB,OAAmB,EACY,EAAE,CACjC,OAAO,CAAC,GAAG,CACT,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;IACvC,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,CAAU,CAAC;IACpB,CAAC;AACH,CAAC,CAAC,CACH,CAAC;AAEJ,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,UAAyB,EACzB,OAAmB,EACnB,EAAE;IACF,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,MAAM,WAAW,GAAG,CAAC,MAAM,YAAY,CAAI,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEjF,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACvB,QAAQ;QACR,sDAAsD;QACtD,gBAAgB;QAChB,UAAU;QACV,IAAI;QAEJ,oBAAoB;QACpB,MAAM,aAAa,GAAG,CAAC,MAAM,YAAY,CAAI,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEnF,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,mCAAmC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;YAC7E,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC5B,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;QACD,IAAI;IACN,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { SortOption } from '@unchainedshop/utils';
2
- import type { Sort } from 'mongodb';
2
+ import { Sort } from 'mongodb';
3
3
  export declare const buildSortOptions: (sort?: Array<SortOption>) => Sort;
4
4
  export default buildSortOptions;
5
5
  //# sourceMappingURL=build-sort-option.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"build-sort-option.d.ts","sourceRoot":"","sources":["../src/build-sort-option.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAOpC,eAAO,MAAM,gBAAgB,UAAU,KAAK,CAAC,UAAU,CAAC,KAAQ,IAM/D,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"build-sort-option.d.ts","sourceRoot":"","sources":["../src/build-sort-option.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAO/B,eAAO,MAAM,gBAAgB,UAAU,KAAK,CAAC,UAAU,CAAC,KAAQ,IAM/D,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { Collection, Document, Filter } from 'mongodb';
1
+ import { Collection, Document, Filter } from 'mongodb';
2
2
  export declare const findLocalizedText: <T extends Document>(collection: Collection<T>, selector: Filter<T>, locale: Intl.Locale) => Promise<T>;
3
3
  export default findLocalizedText;
4
4
  //# sourceMappingURL=find-localized-text.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"find-localized-text.d.ts","sourceRoot":"","sources":["../src/find-localized-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAU5D,eAAO,MAAM,iBAAiB,GAAU,CAAC,SAAS,QAAQ,cAC5C,UAAU,CAAC,CAAC,CAAC,YACf,MAAM,CAAC,CAAC,CAAC,UACX,IAAI,CAAC,MAAM,KAClB,OAAO,CAAC,CAAC,CAwBX,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"find-localized-text.d.ts","sourceRoot":"","sources":["../src/find-localized-text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAUvD,eAAO,MAAM,iBAAiB,GAAU,CAAC,SAAS,QAAQ,cAC5C,UAAU,CAAC,CAAC,CAAC,YACf,MAAM,CAAC,CAAC,CAAC,UACX,IAAI,CAAC,MAAM,KAClB,OAAO,CAAC,CAAC,CAwBX,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -1,3 +1,3 @@
1
- import type { Collection, FindOptions, Filter } from 'mongodb';
1
+ import { Collection, FindOptions, Filter } from 'mongodb';
2
2
  export declare const findPreservingIds: <T>(collection: Collection<T>) => ((selector: Filter<T>, ids: Array<string>, options?: FindOptions) => Promise<Array<T>>);
3
3
  //# sourceMappingURL=find-preserving-ids.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"find-preserving-ids.d.ts","sourceRoot":"","sources":["../src/find-preserving-ids.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAc/D,eAAO,MAAM,iBAAiB,GAC3B,CAAC,cACY,UAAU,CAAC,CAAC,CAAC,KACxB,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CA0BxF,CAAC"}
1
+ {"version":3,"file":"find-preserving-ids.d.ts","sourceRoot":"","sources":["../src/find-preserving-ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAc1D,eAAO,MAAM,iBAAiB,GAC3B,CAAC,cACY,UAAU,CAAC,CAAC,CAAC,KACxB,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CA0BxF,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { Filter } from 'mongodb';
1
+ import { Filter } from 'mongodb';
2
2
  export declare const generateDbFilterById: <T extends {
3
3
  _id?: string;
4
4
  }>(id: unknown, query?: Filter<T>) => Filter<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"generate-db-filter-by-id.d.ts","sourceRoot":"","sources":["../src/generate-db-filter-by-id.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,MACzD,OAAO,UACJ,MAAM,CAAC,CAAC,CAAC,KACf,MAAM,CAAC,CAAC,CAGV,CAAC"}
1
+ {"version":3,"file":"generate-db-filter-by-id.d.ts","sourceRoot":"","sources":["../src/generate-db-filter-by-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,MACzD,OAAO,UACJ,MAAM,CAAC,CAAC,CAAC,KACf,MAAM,CAAC,CAAC,CAGV,CAAC"}
@@ -1,8 +1,2 @@
1
- /**
2
- * @name Random.hexString
3
- * @summary Return a random string of `n` hexadecimal digits.
4
- * @locus Anywhere
5
- * @param {Number} n Length of the string
6
- */
7
1
  export declare const generateDbObjectId: (digits?: number) => string;
8
2
  //# sourceMappingURL=generate-db-object-id.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate-db-object-id.d.ts","sourceRoot":"","sources":["../src/generate-db-object-id.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,uBAAkB,MAehD,CAAC"}
1
+ {"version":3,"file":"generate-db-object-id.d.ts","sourceRoot":"","sources":["../src/generate-db-object-id.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,kBAAkB,uBAAkB,MAKhD,CAAC"}
@@ -1,25 +1,16 @@
1
- import crypto from 'crypto';
2
1
  /**
3
2
  * @name Random.hexString
4
3
  * @summary Return a random string of `n` hexadecimal digits.
5
4
  * @locus Anywhere
6
5
  * @param {Number} n Length of the string
7
6
  */
7
+ function toHex(buffer) {
8
+ return Array.prototype.map.call(buffer, (x) => x.toString(16).padStart(2, '0')).join('');
9
+ }
8
10
  export const generateDbObjectId = (digits = 24) => {
9
11
  const numBytes = Math.ceil(digits / 2);
10
- let bytes;
11
- // Try to get cryptographically strong randomness. Fall back to
12
- // non-cryptographically strong if not available.
13
- try {
14
- bytes = crypto.randomBytes(numBytes);
15
- }
16
- catch {
17
- // XXX should re-throw any error except insufficient entropy
18
- bytes = crypto.pseudoRandomBytes(numBytes);
19
- }
20
- const result = bytes.toString('hex');
21
- // If the number of digits is odd, we'll have generated an extra 4 bits
22
- // of randomness, so we need to trim the last digit.
12
+ const bytes = crypto.getRandomValues(new Uint8Array(numBytes));
13
+ const result = toHex(bytes);
23
14
  return result.substring(0, digits);
24
15
  };
25
16
  //# sourceMappingURL=generate-db-object-id.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate-db-object-id.js","sourceRoot":"","sources":["../src/generate-db-object-id.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAM,GAAG,EAAE,EAAU,EAAE;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC;IACV,+DAA+D;IAC/D,iDAAiD;IACjD,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;QAC5D,KAAK,GAAG,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrC,uEAAuE;IACvE,oDAAoD;IACpD,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC,CAAC"}
1
+ {"version":3,"file":"generate-db-object-id.js","sourceRoot":"","sources":["../src/generate-db-object-id.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,SAAS,KAAK,CAAC,MAAM;IACnB,OAAO,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAM,GAAG,EAAE,EAAU,EAAE;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"initDb.d.ts","sourceRoot":"","sources":["../src/initDb.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAe,MAAM,SAAS,CAAC;AAI1C,eAAO,MAAM,OAAO,uBAgBnB,CAAC;AAEF,eAAO,MAAM,MAAM,qBAElB,CAAC;AAEF,QAAA,MAAM,MAAM,QAAa,OAAO,CAAC,EAAE,CAgBlC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"initDb.d.ts","sourceRoot":"","sources":["../src/initDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAe,MAAM,SAAS,CAAC;AAI1C,eAAO,MAAM,OAAO,uBAwBnB,CAAC;AAEF,eAAO,MAAM,MAAM,qBAElB,CAAC;AAEF,QAAA,MAAM,MAAM,QAAa,OAAO,CAAC,EAAE,CAkBlC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
package/lib/initDb.js CHANGED
@@ -1,22 +1,29 @@
1
- import { mkdirSync } from 'fs';
2
1
  import { MongoClient } from 'mongodb';
3
2
  let mongod;
4
3
  export const startDb = async () => {
5
- const { MongoMemoryServer } = await import('mongodb-memory-server');
6
4
  try {
7
- mkdirSync(`${process.cwd()}/.db`);
5
+ // eslint-disable-next-line
6
+ // @ts-ignore
7
+ const { mkdir } = await import('node:fs/promises');
8
+ const { MongoMemoryServer } = await import('mongodb-memory-server');
9
+ try {
10
+ await mkdir(`${process.cwd()}/.db`);
11
+ }
12
+ catch {
13
+ //
14
+ }
15
+ mongod = await MongoMemoryServer.create({
16
+ instance: {
17
+ dbPath: `${process.cwd()}/.db`,
18
+ storageEngine: 'wiredTiger',
19
+ port: parseInt(process.env.PORT, 10) + 1,
20
+ },
21
+ });
22
+ return `${mongod.getUri()}unchained`;
8
23
  }
9
24
  catch {
10
- //
25
+ throw new Error("Can't connect to MongoDB: could not start mongodb-memory-server and MONGO_URL env is not set");
11
26
  }
12
- mongod = await MongoMemoryServer.create({
13
- instance: {
14
- dbPath: `${process.cwd()}/.db`,
15
- storageEngine: 'wiredTiger',
16
- port: parseInt(process.env.PORT, 10) + 1,
17
- },
18
- });
19
- return `${mongod.getUri()}unchained`;
20
27
  };
21
28
  export const stopDb = async () => {
22
29
  await mongod.stop();
@@ -24,6 +31,8 @@ export const stopDb = async () => {
24
31
  const initDb = async () => {
25
32
  let zstdEnabled = false;
26
33
  try {
34
+ // eslint-disable-next-line
35
+ // @ts-ignore
27
36
  await import('@mongodb-js/zstd');
28
37
  zstdEnabled = true;
29
38
  }
package/lib/initDb.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"initDb.js","sourceRoot":"","sources":["../src/initDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAM,WAAW,EAAE,MAAM,SAAS,CAAC;AAE1C,IAAI,MAAM,CAAC;AAEX,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;IAChC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAEpE,IAAI,CAAC;QACH,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,EAAE;IACJ,CAAC;IACD,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC;QACtC,QAAQ,EAAE;YACR,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM;YAC9B,aAAa,EAAE,YAAY;YAC3B,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC;SACzC;KACF,CAAC,CAAC;IACH,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;IAC/B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,KAAK,IAAiB,EAAE;IACrC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACjC,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,KAAK;IACP,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE;QAClC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,EAAE,CAAC;IACvB,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"initDb.js","sourceRoot":"","sources":["../src/initDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,WAAW,EAAE,MAAM,SAAS,CAAC;AAE1C,IAAI,MAAM,CAAC;AAEX,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;IAChC,IAAI,CAAC;QACH,2BAA2B;QAC3B,aAAa;QACb,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACnD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACpE,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,EAAE;QACJ,CAAC;QACD,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC;YACtC,QAAQ,EAAE;gBACR,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM;gBAC9B,aAAa,EAAE,YAAY;gBAC3B,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC;aACzC;SACF,CAAC,CAAC;QACH,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,8FAA8F,CAC/F,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;IAC/B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,KAAK,IAAiB,EAAE;IACrC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,CAAC;QACH,2BAA2B;QAC3B,aAAa;QACb,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACjC,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,KAAK;IACP,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE;QAClC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,EAAE,CAAC;IACvB,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,17 +1,14 @@
1
1
  {
2
2
  "name": "@unchainedshop/mongodb",
3
- "version": "3.0.0-alpha7",
3
+ "version": "3.0.0-rc.12",
4
4
  "description": "MongoDB provider for unchained platform",
5
5
  "main": "lib/mongodb-index.js",
6
- "exports": {
7
- ".": "./lib/mongodb-index.js",
8
- "./*": "./lib/*"
9
- },
10
6
  "types": "lib/mongodb-index.d.ts",
11
7
  "type": "module",
12
8
  "scripts": {
13
- "clean": "rm -rf lib",
14
- "prepublishOnly": "npm run clean && tsc",
9
+ "clean": "tsc -b --clean",
10
+ "build": "tsc -b",
11
+ "prepublishOnly": "npm run clean && npm run build",
15
12
  "watch": "tsc -w",
16
13
  "test": "NODE_OPTIONS=--experimental-vm-modules jest --detectOpenHandles --forceExit",
17
14
  "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch --detectOpenHandles --forceExit"
@@ -24,25 +21,37 @@
24
21
  "unchained",
25
22
  "ecommerce"
26
23
  ],
27
- "author": "Joël Meiller",
24
+ "authors": [
25
+ "Joël Meiller",
26
+ "Pascal Kaufmann"
27
+ ],
28
28
  "license": "EUPL-1.2",
29
29
  "bugs": {
30
30
  "url": "https://github.com/unchainedshop/unchained/issues"
31
31
  },
32
32
  "homepage": "https://github.com/unchainedshop/unchained#readme",
33
33
  "dependencies": {
34
- "@unchainedshop/utils": "^3.0.0-alpha4"
34
+ "@unchainedshop/utils": "^3.0.0-rc.12"
35
35
  },
36
36
  "peerDependencies": {
37
- "@mongodb-js/zstd": "^1.2.2",
38
- "mongodb": "^6.10.0"
37
+ "@mongodb-js/zstd": ">= 2.0 < 3",
38
+ "mongodb": ">= 6.12 < 7",
39
+ "mongodb-memory-server": ">= 10.1 < 11"
39
40
  },
40
- "optionalDependencies": {
41
- "mongodb-memory-server": "^10.0.0"
41
+ "peerDependenciesMeta": {
42
+ "mongodb": {
43
+ "optional": false
44
+ },
45
+ "@mongodb-js/zstd": {
46
+ "optional": true
47
+ },
48
+ "mongodb-memory-server": {
49
+ "optional": true
50
+ }
42
51
  },
43
52
  "devDependencies": {
44
- "@types/node": "^22.8.1",
53
+ "@types/node": "^22.10.2",
45
54
  "jest": "^29.7.0",
46
- "typescript": "^5.6.3"
55
+ "typescript": "^5.7.2"
47
56
  }
48
57
  }
@@ -1,6 +1,7 @@
1
- import type { Collection, Document, CreateIndexesOptions, IndexDirection } from 'mongodb';
1
+ import { Collection, Document, CreateIndexesOptions, IndexDirection } from 'mongodb';
2
+ import { createLogger } from '@unchainedshop/logger';
2
3
 
3
- import { log, LogLevel } from '@unchainedshop/logger';
4
+ const logger = createLogger('unchained:mongodb');
4
5
 
5
6
  export type Indexes<T extends Document> = Array<{
6
7
  index: { [key in keyof T]?: IndexDirection }; // TODO: Support key with object path (e.g. 'product.proxy.assignments')
@@ -17,7 +18,7 @@ const buildIndexes = <T>(
17
18
  await collection.createIndex(index, options);
18
19
  return false;
19
20
  } catch (e: any) {
20
- log(e, { level: LogLevel.Error });
21
+ logger.error(e);
21
22
  return e as Error;
22
23
  }
23
24
  }),
@@ -41,10 +42,8 @@ export const buildDbIndexes = async <T extends Document>(
41
42
  const rebuildErrors = (await buildIndexes<T>(collection, indexes)).filter(Boolean);
42
43
 
43
44
  if (rebuildErrors.length) {
44
- log(`Error building some indexes for ${collection.collectionName}`, {
45
- level: LogLevel.Error,
46
- ...rebuildErrors,
47
- });
45
+ logger.error(`Error building some indexes for ${collection.collectionName}`);
46
+ logger.debug(rebuildErrors);
48
47
  success = false;
49
48
  }
50
49
  // }
@@ -1,5 +1,5 @@
1
1
  import { SortOption } from '@unchainedshop/utils';
2
- import type { Sort } from 'mongodb';
2
+ import { Sort } from 'mongodb';
3
3
 
4
4
  const SORT_DIRECTIONS = {
5
5
  ASC: 1,
@@ -1,4 +1,4 @@
1
- import type { Collection, Document, Filter } from 'mongodb';
1
+ import { Collection, Document, Filter } from 'mongodb';
2
2
  import { systemLocale } from '@unchainedshop/utils';
3
3
 
4
4
  const extendSelectorWithLocale = (selector, locale) => {
@@ -1,4 +1,4 @@
1
- import type { Collection, FindOptions, Filter } from 'mongodb';
1
+ import { Collection, FindOptions, Filter } from 'mongodb';
2
2
 
3
3
  const { AMAZON_DOCUMENTDB_COMPAT_MODE } = process.env;
4
4
 
@@ -1,4 +1,4 @@
1
- import type { Filter } from 'mongodb';
1
+ import { Filter } from 'mongodb';
2
2
 
3
3
  export const generateDbFilterById = <T extends { _id?: string }>(
4
4
  id: unknown,
@@ -1,24 +1,16 @@
1
- import crypto from 'crypto';
2
-
3
1
  /**
4
2
  * @name Random.hexString
5
3
  * @summary Return a random string of `n` hexadecimal digits.
6
4
  * @locus Anywhere
7
5
  * @param {Number} n Length of the string
8
6
  */
7
+ function toHex(buffer) {
8
+ return Array.prototype.map.call(buffer, (x) => x.toString(16).padStart(2, '0')).join('');
9
+ }
10
+
9
11
  export const generateDbObjectId = (digits = 24): string => {
10
12
  const numBytes = Math.ceil(digits / 2);
11
- let bytes;
12
- // Try to get cryptographically strong randomness. Fall back to
13
- // non-cryptographically strong if not available.
14
- try {
15
- bytes = crypto.randomBytes(numBytes);
16
- } catch {
17
- // XXX should re-throw any error except insufficient entropy
18
- bytes = crypto.pseudoRandomBytes(numBytes);
19
- }
20
- const result = bytes.toString('hex');
21
- // If the number of digits is odd, we'll have generated an extra 4 bits
22
- // of randomness, so we need to trim the last digit.
13
+ const bytes = crypto.getRandomValues(new Uint8Array(numBytes));
14
+ const result = toHex(bytes);
23
15
  return result.substring(0, digits);
24
16
  };
package/src/initDb.ts CHANGED
@@ -1,24 +1,31 @@
1
- import { mkdirSync } from 'fs';
2
1
  import { Db, MongoClient } from 'mongodb';
3
2
 
4
3
  let mongod;
5
4
 
6
5
  export const startDb = async () => {
7
- const { MongoMemoryServer } = await import('mongodb-memory-server');
8
-
9
6
  try {
10
- mkdirSync(`${process.cwd()}/.db`);
7
+ // eslint-disable-next-line
8
+ // @ts-ignore
9
+ const { mkdir } = await import('node:fs/promises');
10
+ const { MongoMemoryServer } = await import('mongodb-memory-server');
11
+ try {
12
+ await mkdir(`${process.cwd()}/.db`);
13
+ } catch {
14
+ //
15
+ }
16
+ mongod = await MongoMemoryServer.create({
17
+ instance: {
18
+ dbPath: `${process.cwd()}/.db`,
19
+ storageEngine: 'wiredTiger',
20
+ port: parseInt(process.env.PORT, 10) + 1,
21
+ },
22
+ });
23
+ return `${mongod.getUri()}unchained`;
11
24
  } catch {
12
- //
25
+ throw new Error(
26
+ "Can't connect to MongoDB: could not start mongodb-memory-server and MONGO_URL env is not set",
27
+ );
13
28
  }
14
- mongod = await MongoMemoryServer.create({
15
- instance: {
16
- dbPath: `${process.cwd()}/.db`,
17
- storageEngine: 'wiredTiger',
18
- port: parseInt(process.env.PORT, 10) + 1,
19
- },
20
- });
21
- return `${mongod.getUri()}unchained`;
22
29
  };
23
30
 
24
31
  export const stopDb = async () => {
@@ -28,6 +35,8 @@ export const stopDb = async () => {
28
35
  const initDb = async (): Promise<Db> => {
29
36
  let zstdEnabled = false;
30
37
  try {
38
+ // eslint-disable-next-line
39
+ // @ts-ignore
31
40
  await import('@mongodb-js/zstd');
32
41
  zstdEnabled = true;
33
42
  } catch {
package/tsconfig.json CHANGED
@@ -1,11 +1,9 @@
1
1
  {
2
2
  "extends": "../shared/base.tsconfig.json",
3
3
  "compilerOptions": {
4
- "rootDir": "src",
5
- "outDir": "lib",
4
+ "declarationDir": "./lib",
5
+ "rootDir": "./src",
6
+ "outDir": "./lib"
6
7
  },
7
- "exclude": ["**/*.test.ts", "**/*.test.js", "tests"],
8
- "include": [
9
- "./src"
10
- ]
11
- }
8
+ "exclude": ["**/*.test.ts", "**/*.test.js", "tests", "lib"]
9
+ }