@unchainedshop/core-languages 4.3.4 → 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 CHANGED
@@ -1,3 +1,82 @@
1
- # Languages (Unchained Engine)
1
+ [![npm version](https://img.shields.io/npm/v/@unchainedshop/core-languages.svg)](https://npmjs.com/package/@unchainedshop/core-languages)
2
+ [![License: EUPL-1.2](https://img.shields.io/badge/License-EUPL--1.2-blue.svg)](https://opensource.org/licenses/EUPL-1.2)
2
3
 
3
- This package contains business logic and database abstraction for languages in Unchained.
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
@@ -1,3 +1,2 @@
1
- export * from './module/configureLanguagesModule.js';
2
- export * from './db/LanguagesCollection.js';
3
- //# sourceMappingURL=languages-index.d.ts.map
1
+ export * from './module/configureLanguagesModule.ts';
2
+ export * from './db/LanguagesCollection.ts';
@@ -1,3 +1,2 @@
1
- export * from './module/configureLanguagesModule.js';
2
- export * from './db/LanguagesCollection.js';
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.js';
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 '../db/LanguagesCollection.js';
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.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": "tsx --test",
13
- "test:watch": "tsx --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
- "Joël Meiller",
26
- "Pascal Kaufmann"
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.3.0",
35
- "@unchainedshop/utils": "^4.3.0"
36
+ "@unchainedshop/events": "^4.4.0",
37
+ "@unchainedshop/utils": "^4.4.0"
36
38
  },
37
39
  "devDependencies": {
38
- "@types/node": "^24.0.13",
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":"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
- };
@@ -1,2 +0,0 @@
1
- export * from './module/configureLanguagesModule.js';
2
- export * from './db/LanguagesCollection.js';
@@ -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>>;
package/tsconfig.json DELETED
@@ -1,10 +0,0 @@
1
- {
2
- "extends": "../shared/base.tsconfig.json",
3
- "compilerOptions": {
4
- "declarationDir": "./lib",
5
- "rootDir": "./src",
6
- "outDir": "./lib",
7
-
8
- },
9
- "exclude": ["**/*.test.ts", "**/*.test.js", "tests", "lib"]
10
- }