@unchainedshop/core-languages 4.3.3 → 4.4.0
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.
- package/README.md +81 -2
- package/lib/db/LanguagesCollection.d.ts +1 -2
- package/lib/db/LanguagesCollection.js +1 -2
- package/lib/languages-index.d.ts +2 -3
- package/lib/languages-index.js +2 -3
- package/lib/module/configureLanguagesModule.d.ts +3 -4
- package/lib/module/configureLanguagesModule.js +2 -3
- package/package.json +10 -9
- package/lib/db/LanguagesCollection.d.ts.map +0 -1
- package/lib/db/LanguagesCollection.js.map +0 -1
- package/lib/db/LanguagesSchema.d.ts +0 -3
- package/lib/db/LanguagesSchema.d.ts.map +0 -1
- package/lib/db/LanguagesSchema.js +0 -8
- package/lib/db/LanguagesSchema.js.map +0 -1
- package/lib/languages-index.d.ts.map +0 -1
- package/lib/languages-index.js.map +0 -1
- package/lib/module/configureLanguagesModule.d.ts.map +0 -1
- package/lib/module/configureLanguagesModule.js.map +0 -1
- package/src/db/LanguagesCollection.ts +0 -42
- package/src/languages-index.ts +0 -2
- package/src/module/buildFindSelector.test.ts +0 -28
- package/src/module/configureLanguagesModule.ts +0 -129
- package/tsconfig.json +0 -10
package/README.md
CHANGED
|
@@ -1,3 +1,82 @@
|
|
|
1
|
-
|
|
1
|
+
[](https://npmjs.com/package/@unchainedshop/core-languages)
|
|
2
|
+
[](https://opensource.org/licenses/EUPL-1.2)
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
# @unchainedshop/core-languages
|
|
5
|
+
|
|
6
|
+
Language management module for the Unchained Engine. Manages supported languages with ISO codes for multi-language content.
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install @unchainedshop/core-languages
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import { configureLanguagesModule } from '@unchainedshop/core-languages';
|
|
18
|
+
|
|
19
|
+
const languagesModule = await configureLanguagesModule({ db });
|
|
20
|
+
|
|
21
|
+
// Create a language
|
|
22
|
+
const languageId = await languagesModule.create({
|
|
23
|
+
isoCode: 'en',
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
// Find languages
|
|
27
|
+
const languages = await languagesModule.findLanguages({ includeInactive: false });
|
|
28
|
+
|
|
29
|
+
// Check if language is base language
|
|
30
|
+
const isBase = languagesModule.isBase(language);
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## API Overview
|
|
34
|
+
|
|
35
|
+
### Module Configuration
|
|
36
|
+
|
|
37
|
+
| Export | Description |
|
|
38
|
+
|--------|-------------|
|
|
39
|
+
| `configureLanguagesModule` | Configure and return the languages module |
|
|
40
|
+
|
|
41
|
+
### Queries
|
|
42
|
+
|
|
43
|
+
| Method | Description |
|
|
44
|
+
|--------|-------------|
|
|
45
|
+
| `findLanguage` | Find language by ID or ISO code |
|
|
46
|
+
| `findLanguages` | Find languages with filtering, sorting, and pagination |
|
|
47
|
+
| `count` | Count languages matching query |
|
|
48
|
+
| `languageExists` | Check if a language exists |
|
|
49
|
+
|
|
50
|
+
### Mutations
|
|
51
|
+
|
|
52
|
+
| Method | Description |
|
|
53
|
+
|--------|-------------|
|
|
54
|
+
| `create` | Create a new language |
|
|
55
|
+
| `update` | Update an existing language |
|
|
56
|
+
| `delete` | Soft delete a language |
|
|
57
|
+
|
|
58
|
+
### Helper Methods
|
|
59
|
+
|
|
60
|
+
| Method | Description |
|
|
61
|
+
|--------|-------------|
|
|
62
|
+
| `isBase` | Check if language is the base/system language |
|
|
63
|
+
|
|
64
|
+
### Types
|
|
65
|
+
|
|
66
|
+
| Export | Description |
|
|
67
|
+
|--------|-------------|
|
|
68
|
+
| `Language` | Language document type |
|
|
69
|
+
| `LanguageQuery` | Query parameters type |
|
|
70
|
+
| `LanguagesModule` | Module interface type |
|
|
71
|
+
|
|
72
|
+
## Events
|
|
73
|
+
|
|
74
|
+
| Event | Description |
|
|
75
|
+
|-------|-------------|
|
|
76
|
+
| `LANGUAGE_CREATE` | Emitted when a language is created |
|
|
77
|
+
| `LANGUAGE_UPDATE` | Emitted when a language is updated |
|
|
78
|
+
| `LANGUAGE_REMOVE` | Emitted when a language is removed |
|
|
79
|
+
|
|
80
|
+
## License
|
|
81
|
+
|
|
82
|
+
EUPL-1.2
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { TimestampFields, mongodb } from '@unchainedshop/mongodb';
|
|
1
|
+
import { type TimestampFields, mongodb } from '@unchainedshop/mongodb';
|
|
2
2
|
export type Language = {
|
|
3
3
|
_id: string;
|
|
4
4
|
isoCode: string;
|
|
5
5
|
isActive?: boolean;
|
|
6
6
|
} & TimestampFields;
|
|
7
7
|
export declare const LanguagesCollection: (db: mongodb.Db) => Promise<mongodb.Collection<Language>>;
|
|
8
|
-
//# sourceMappingURL=LanguagesCollection.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildDbIndexes, isDocumentDBCompatModeEnabled, } from '@unchainedshop/mongodb';
|
|
1
|
+
import { buildDbIndexes, isDocumentDBCompatModeEnabled, mongodb, } from '@unchainedshop/mongodb';
|
|
2
2
|
export const LanguagesCollection = async (db) => {
|
|
3
3
|
const Languages = db.collection('languages');
|
|
4
4
|
if (!isDocumentDBCompatModeEnabled()) {
|
|
@@ -25,4 +25,3 @@ export const LanguagesCollection = async (db) => {
|
|
|
25
25
|
]);
|
|
26
26
|
return Languages;
|
|
27
27
|
};
|
|
28
|
-
//# sourceMappingURL=LanguagesCollection.js.map
|
package/lib/languages-index.d.ts
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
export * from './module/configureLanguagesModule.
|
|
2
|
-
export * from './db/LanguagesCollection.
|
|
3
|
-
//# sourceMappingURL=languages-index.d.ts.map
|
|
1
|
+
export * from './module/configureLanguagesModule.ts';
|
|
2
|
+
export * from './db/LanguagesCollection.ts';
|
package/lib/languages-index.js
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
3
|
-
//# sourceMappingURL=languages-index.js.map
|
|
1
|
+
export * from "./module/configureLanguagesModule.js";
|
|
2
|
+
export * from "./db/LanguagesCollection.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { ModuleInput } from '@unchainedshop/mongodb';
|
|
1
|
+
import { type ModuleInput } from '@unchainedshop/mongodb';
|
|
2
2
|
import { mongodb } from '@unchainedshop/mongodb';
|
|
3
|
-
import { SortOption } from '@unchainedshop/utils';
|
|
4
|
-
import { Language } from '../db/LanguagesCollection.
|
|
3
|
+
import { type SortOption } from '@unchainedshop/utils';
|
|
4
|
+
import { type Language } from '../db/LanguagesCollection.ts';
|
|
5
5
|
export type LanguageQuery = mongodb.Filter<Language> & {
|
|
6
6
|
includeInactive?: boolean;
|
|
7
7
|
queryString?: string;
|
|
@@ -28,4 +28,3 @@ export declare const configureLanguagesModule: ({ db }: ModuleInput<Record<strin
|
|
|
28
28
|
delete: (languageId: string) => Promise<number>;
|
|
29
29
|
}>;
|
|
30
30
|
export type LanguagesModule = Awaited<ReturnType<typeof configureLanguagesModule>>;
|
|
31
|
-
//# sourceMappingURL=configureLanguagesModule.d.ts.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { assertDocumentDBCompatMode } from '@unchainedshop/mongodb';
|
|
2
2
|
import { emit, registerEvents } from '@unchainedshop/events';
|
|
3
|
-
import { generateDbFilterById, buildSortOptions, generateDbObjectId, } from '@unchainedshop/mongodb';
|
|
3
|
+
import { generateDbFilterById, buildSortOptions, mongodb, generateDbObjectId, } from '@unchainedshop/mongodb';
|
|
4
4
|
import { SortDirection } from '@unchainedshop/utils';
|
|
5
5
|
import { systemLocale } from '@unchainedshop/utils';
|
|
6
|
-
import { LanguagesCollection } from
|
|
6
|
+
import { LanguagesCollection } from "../db/LanguagesCollection.js";
|
|
7
7
|
const LANGUAGE_EVENTS = ['LANGUAGE_CREATE', 'LANGUAGE_UPDATE', 'LANGUAGE_REMOVE'];
|
|
8
8
|
export const buildFindSelector = ({ includeInactive = false, queryString, ...rest }) => {
|
|
9
9
|
const selector = { deleted: null, ...rest };
|
|
@@ -84,4 +84,3 @@ export const configureLanguagesModule = async ({ db }) => {
|
|
|
84
84
|
},
|
|
85
85
|
};
|
|
86
86
|
};
|
|
87
|
-
//# sourceMappingURL=configureLanguagesModule.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unchainedshop/core-languages",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.4.0",
|
|
4
4
|
"main": "lib/languages-index.js",
|
|
5
5
|
"types": "lib/languages-index.d.ts",
|
|
6
6
|
"type": "module",
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
"build": "tsc -b",
|
|
10
10
|
"prepublishOnly": "npm run clean && npm run build",
|
|
11
11
|
"watch": "tsc -w",
|
|
12
|
-
"test": "
|
|
13
|
-
"test:watch": "
|
|
12
|
+
"test": "node --test",
|
|
13
|
+
"test:watch": "node --test --watch"
|
|
14
14
|
},
|
|
15
15
|
"repository": {
|
|
16
16
|
"type": "git",
|
|
@@ -22,8 +22,10 @@
|
|
|
22
22
|
"core"
|
|
23
23
|
],
|
|
24
24
|
"authors": [
|
|
25
|
-
"
|
|
26
|
-
"
|
|
25
|
+
"Pascal Kaufmann",
|
|
26
|
+
"Mikael Araya",
|
|
27
|
+
"Vedran Rudelj",
|
|
28
|
+
"Joël Meiller"
|
|
27
29
|
],
|
|
28
30
|
"license": "EUPL-1.2",
|
|
29
31
|
"bugs": {
|
|
@@ -31,12 +33,11 @@
|
|
|
31
33
|
},
|
|
32
34
|
"homepage": "https://github.com/unchainedshop/unchained#readme",
|
|
33
35
|
"dependencies": {
|
|
34
|
-
"@unchainedshop/events": "^4.
|
|
35
|
-
"@unchainedshop/utils": "^4.
|
|
36
|
+
"@unchainedshop/events": "^4.4.0",
|
|
37
|
+
"@unchainedshop/utils": "^4.4.0"
|
|
36
38
|
},
|
|
37
39
|
"devDependencies": {
|
|
38
|
-
"@types/node": "^
|
|
39
|
-
"tsx": "^4.20.3",
|
|
40
|
+
"@types/node": "^25.0.0",
|
|
40
41
|
"typescript": "^5.8.3"
|
|
41
42
|
}
|
|
42
43
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LanguagesCollection.d.ts","sourceRoot":"","sources":["../../src/db/LanguagesCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAGf,OAAO,EACR,MAAM,wBAAwB,CAAC;AAEhC,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,eAAe,CAAC;AAEpB,eAAO,MAAM,mBAAmB,GAAU,IAAI,OAAO,CAAC,EAAE,0CA4BvD,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LanguagesCollection.js","sourceRoot":"","sources":["../../src/db/LanguagesCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACd,6BAA6B,GAE9B,MAAM,wBAAwB,CAAC;AAQhC,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,EAAc,EAAE,EAAE;IAC1D,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAW,WAAW,CAAC,CAAC;IAEvD,IAAI,CAAC,6BAA6B,EAAE,EAAE,CAAC;QACrC,MAAM,cAAc,CAAW,SAAS,EAAE;YACxC;gBACE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;gBACvC,OAAO,EAAE;oBACP,OAAO,EAAE;wBACP,GAAG,EAAE,CAAC;wBACN,OAAO,EAAE,CAAC;qBACX;oBACD,IAAI,EAAE,2BAA2B;iBAClC;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,cAAc,CAAW,SAAS,EAAE;QACxC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QACpD;YACE,KAAK,EAAE;gBACL,OAAO,EAAE,CAAC;aACX;SACF;KACF,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LanguagesSchema.d.ts","sourceRoot":"","sources":["../../src/db/LanguagesSchema.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,MAAM,cAAc,CAAC;AAExC,eAAO,MAAM,eAAe,cAO3B,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { Schemas } from '@unchainedshop/utils';
|
|
2
|
-
import SimpleSchema from 'simpl-schema';
|
|
3
|
-
export const LanguagesSchema = new SimpleSchema({
|
|
4
|
-
isoCode: { type: String, required: true },
|
|
5
|
-
isActive: Boolean,
|
|
6
|
-
...Schemas.timestampFields,
|
|
7
|
-
}, { requiredByDefault: false });
|
|
8
|
-
//# sourceMappingURL=LanguagesSchema.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LanguagesSchema.js","sourceRoot":"","sources":["../../src/db/LanguagesSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,YAAY,MAAM,cAAc,CAAC;AAExC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,YAAY,CAC7C;IACE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IACzC,QAAQ,EAAE,OAAO;IACjB,GAAG,OAAO,CAAC,eAAe;CAC3B,EACD,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAC7B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"languages-index.d.ts","sourceRoot":"","sources":["../src/languages-index.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAC;AACrD,cAAc,6BAA6B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"languages-index.js","sourceRoot":"","sources":["../src/languages-index.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAC;AACrD,cAAc,6BAA6B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"configureLanguagesModule.d.ts","sourceRoot":"","sources":["../../src/module/configureLanguagesModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEjF,OAAO,EAGL,OAAO,EAER,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAiB,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAE,QAAQ,EAAuB,MAAM,8BAA8B,CAAC;AAE7E,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG;IACrD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAIF,eAAO,MAAM,iBAAiB,GAAI,2CAAmD,aAAa,6BAQjG,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,QAAQ,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;2BAMxD;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;uDAapE,aAAa,GAAG;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;KACrB,YACS,OAAO,CAAC,WAAW,KAC5B,OAAO,CAAC,QAAQ,EAAE,CAAC;mBAUD,aAAa,KAAG,OAAO,CAAC,MAAM,CAAC;qCAKb;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,KAAG,OAAO,CAAC,OAAO,CAAC;qBAU/D,QAAQ,GAAG,OAAO;kBAK5B,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;yBAc1D,MAAM,OAAO,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;yBAenD,MAAM;EAapC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"configureLanguagesModule.js","sourceRoot":"","sources":["../../src/module/configureLanguagesModule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
TimestampFields,
|
|
3
|
-
buildDbIndexes,
|
|
4
|
-
isDocumentDBCompatModeEnabled,
|
|
5
|
-
mongodb,
|
|
6
|
-
} from '@unchainedshop/mongodb';
|
|
7
|
-
|
|
8
|
-
export type Language = {
|
|
9
|
-
_id: string;
|
|
10
|
-
isoCode: string;
|
|
11
|
-
isActive?: boolean;
|
|
12
|
-
} & TimestampFields;
|
|
13
|
-
|
|
14
|
-
export const LanguagesCollection = async (db: mongodb.Db) => {
|
|
15
|
-
const Languages = db.collection<Language>('languages');
|
|
16
|
-
|
|
17
|
-
if (!isDocumentDBCompatModeEnabled()) {
|
|
18
|
-
await buildDbIndexes<Language>(Languages, [
|
|
19
|
-
{
|
|
20
|
-
index: { isoCode: 'text', _id: 'text' },
|
|
21
|
-
options: {
|
|
22
|
-
weights: {
|
|
23
|
-
_id: 8,
|
|
24
|
-
isoCode: 6,
|
|
25
|
-
},
|
|
26
|
-
name: 'languages_fulltext_search',
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
]);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
await buildDbIndexes<Language>(Languages, [
|
|
33
|
-
{ index: { isoCode: 1 }, options: { unique: true } },
|
|
34
|
-
{
|
|
35
|
-
index: {
|
|
36
|
-
deleted: 1,
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
]);
|
|
40
|
-
|
|
41
|
-
return Languages;
|
|
42
|
-
};
|
package/src/languages-index.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test';
|
|
2
|
-
import assert from 'node:assert';
|
|
3
|
-
import { buildFindSelector } from './configureLanguagesModule.js';
|
|
4
|
-
|
|
5
|
-
describe('buildFindSelector', () => {
|
|
6
|
-
it('Return correct filter object when passed no argument', () => {
|
|
7
|
-
assert.deepStrictEqual(buildFindSelector({}), { deleted: null, isActive: true });
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
it('Return correct filter object includeInactive is set to true', () => {
|
|
11
|
-
assert.deepStrictEqual(buildFindSelector({ includeInactive: true }), { deleted: null });
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it('Return correct filter object when passed includeInactive, queryString', () => {
|
|
15
|
-
assert.deepStrictEqual(buildFindSelector({ includeInactive: true, queryString: 'hello world' }), {
|
|
16
|
-
deleted: null,
|
|
17
|
-
$text: { $search: 'hello world' },
|
|
18
|
-
});
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('Return correct filter object when passed queryString', () => {
|
|
22
|
-
assert.deepStrictEqual(buildFindSelector({ queryString: 'hello world' }), {
|
|
23
|
-
deleted: null,
|
|
24
|
-
isActive: true,
|
|
25
|
-
$text: { $search: 'hello world' },
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
});
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import { assertDocumentDBCompatMode, ModuleInput } from '@unchainedshop/mongodb';
|
|
2
|
-
import { emit, registerEvents } from '@unchainedshop/events';
|
|
3
|
-
import {
|
|
4
|
-
generateDbFilterById,
|
|
5
|
-
buildSortOptions,
|
|
6
|
-
mongodb,
|
|
7
|
-
generateDbObjectId,
|
|
8
|
-
} from '@unchainedshop/mongodb';
|
|
9
|
-
import { SortDirection, SortOption } from '@unchainedshop/utils';
|
|
10
|
-
import { systemLocale } from '@unchainedshop/utils';
|
|
11
|
-
import { Language, LanguagesCollection } from '../db/LanguagesCollection.js';
|
|
12
|
-
|
|
13
|
-
export type LanguageQuery = mongodb.Filter<Language> & {
|
|
14
|
-
includeInactive?: boolean;
|
|
15
|
-
queryString?: string;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
const LANGUAGE_EVENTS: string[] = ['LANGUAGE_CREATE', 'LANGUAGE_UPDATE', 'LANGUAGE_REMOVE'];
|
|
19
|
-
|
|
20
|
-
export const buildFindSelector = ({ includeInactive = false, queryString, ...rest }: LanguageQuery) => {
|
|
21
|
-
const selector: mongodb.Filter<Language> = { deleted: null, ...rest };
|
|
22
|
-
if (!includeInactive) selector.isActive = true;
|
|
23
|
-
if (queryString) {
|
|
24
|
-
assertDocumentDBCompatMode();
|
|
25
|
-
selector.$text = { $search: queryString };
|
|
26
|
-
}
|
|
27
|
-
return selector;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
export const configureLanguagesModule = async ({ db }: ModuleInput<Record<string, never>>) => {
|
|
31
|
-
registerEvents(LANGUAGE_EVENTS);
|
|
32
|
-
|
|
33
|
-
const Languages = await LanguagesCollection(db);
|
|
34
|
-
|
|
35
|
-
return {
|
|
36
|
-
findLanguage: async (params: { languageId: string } | { isoCode: string }) => {
|
|
37
|
-
if ('languageId' in params) {
|
|
38
|
-
return Languages.findOne(generateDbFilterById(params.languageId), {});
|
|
39
|
-
}
|
|
40
|
-
return Languages.findOne({ isoCode: params.isoCode }, {});
|
|
41
|
-
},
|
|
42
|
-
|
|
43
|
-
findLanguages: async (
|
|
44
|
-
{
|
|
45
|
-
limit,
|
|
46
|
-
offset,
|
|
47
|
-
sort,
|
|
48
|
-
...query
|
|
49
|
-
}: LanguageQuery & {
|
|
50
|
-
limit?: number;
|
|
51
|
-
offset?: number;
|
|
52
|
-
sort?: SortOption[];
|
|
53
|
-
},
|
|
54
|
-
options?: mongodb.FindOptions,
|
|
55
|
-
): Promise<Language[]> => {
|
|
56
|
-
const defaultSort = [{ key: 'created', value: SortDirection.ASC }] as SortOption[];
|
|
57
|
-
return Languages.find(buildFindSelector(query), {
|
|
58
|
-
skip: offset,
|
|
59
|
-
limit,
|
|
60
|
-
sort: buildSortOptions(sort || defaultSort),
|
|
61
|
-
...options,
|
|
62
|
-
}).toArray();
|
|
63
|
-
},
|
|
64
|
-
|
|
65
|
-
count: async (query: LanguageQuery): Promise<number> => {
|
|
66
|
-
const count = await Languages.countDocuments(buildFindSelector(query));
|
|
67
|
-
return count;
|
|
68
|
-
},
|
|
69
|
-
|
|
70
|
-
languageExists: async ({ languageId }: { languageId: string }): Promise<boolean> => {
|
|
71
|
-
const languageCount = await Languages.countDocuments(
|
|
72
|
-
generateDbFilterById(languageId, { deleted: null }),
|
|
73
|
-
{
|
|
74
|
-
limit: 1,
|
|
75
|
-
},
|
|
76
|
-
);
|
|
77
|
-
return !!languageCount;
|
|
78
|
-
},
|
|
79
|
-
|
|
80
|
-
isBase(language: Language): boolean {
|
|
81
|
-
return language.isoCode === systemLocale.language;
|
|
82
|
-
},
|
|
83
|
-
|
|
84
|
-
create: async (
|
|
85
|
-
doc: Omit<Language, '_id' | 'created'> & Pick<Partial<Language>, '_id' | 'created'>,
|
|
86
|
-
) => {
|
|
87
|
-
await Languages.deleteOne({ isoCode: doc.isoCode.toLowerCase(), deleted: { $ne: null } });
|
|
88
|
-
const { insertedId: languageId } = await Languages.insertOne({
|
|
89
|
-
_id: generateDbObjectId(),
|
|
90
|
-
created: new Date(),
|
|
91
|
-
...doc,
|
|
92
|
-
isoCode: doc.isoCode.toLowerCase(),
|
|
93
|
-
isActive: true,
|
|
94
|
-
});
|
|
95
|
-
await emit('LANGUAGE_CREATE', { languageId });
|
|
96
|
-
return languageId;
|
|
97
|
-
},
|
|
98
|
-
|
|
99
|
-
update: async (languageId: string, doc: mongodb.UpdateFilter<Language>['$set']) => {
|
|
100
|
-
const modifier = { ...doc };
|
|
101
|
-
if (modifier?.isoCode) {
|
|
102
|
-
modifier.isoCode = modifier.isoCode.toLowerCase();
|
|
103
|
-
}
|
|
104
|
-
await Languages.updateOne(generateDbFilterById(languageId), {
|
|
105
|
-
$set: {
|
|
106
|
-
updated: new Date(),
|
|
107
|
-
...modifier,
|
|
108
|
-
},
|
|
109
|
-
});
|
|
110
|
-
await emit('LANGUAGE_UPDATE', { languageId });
|
|
111
|
-
return languageId;
|
|
112
|
-
},
|
|
113
|
-
|
|
114
|
-
delete: async (languageId: string) => {
|
|
115
|
-
const { modifiedCount: deletedCount } = await Languages.updateOne(
|
|
116
|
-
generateDbFilterById(languageId),
|
|
117
|
-
{
|
|
118
|
-
$set: {
|
|
119
|
-
deleted: new Date(),
|
|
120
|
-
},
|
|
121
|
-
},
|
|
122
|
-
);
|
|
123
|
-
await emit('LANGUAGE_REMOVE', { languageId });
|
|
124
|
-
return deletedCount;
|
|
125
|
-
},
|
|
126
|
-
};
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
export type LanguagesModule = Awaited<ReturnType<typeof configureLanguagesModule>>;
|