@unchainedshop/core-languages 1.1.3
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/.versions +18 -0
- package/README.md +3 -0
- package/lib/db/LanguagesCollection.d.ts +3 -0
- package/lib/db/LanguagesCollection.js +19 -0
- package/lib/db/LanguagesCollection.js.map +1 -0
- package/lib/db/LanguagesSchema.d.ts +1 -0
- package/lib/db/LanguagesSchema.js +9 -0
- package/lib/db/LanguagesSchema.js.map +1 -0
- package/lib/languages-index.d.ts +1 -0
- package/lib/languages-index.js +2 -0
- package/lib/languages-index.js.map +1 -0
- package/lib/module/configureLanguagesModule.d.ts +3 -0
- package/lib/module/configureLanguagesModule.js +70 -0
- package/lib/module/configureLanguagesModule.js.map +1 -0
- package/package.js +29 -0
- package/package.json +42 -0
- package/src/db/LanguagesCollection.ts +23 -0
- package/src/db/LanguagesSchema.js +12 -0
- package/src/languages-index.ts +1 -0
- package/src/module/configureLanguagesModule.ts +98 -0
- package/tests/languages-index.test.ts +47 -0
- package/tsconfig.build.json +26 -0
- package/tsconfig.json +8 -0
package/.versions
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
babel-compiler@7.9.0
|
|
2
|
+
babel-runtime@1.5.1
|
|
3
|
+
dynamic-import@0.7.2
|
|
4
|
+
ecmascript@0.16.2
|
|
5
|
+
ecmascript-runtime@0.8.0
|
|
6
|
+
ecmascript-runtime-client@0.12.1
|
|
7
|
+
ecmascript-runtime-server@0.11.0
|
|
8
|
+
fetch@0.1.1
|
|
9
|
+
inter-process-messaging@0.1.1
|
|
10
|
+
local-test:unchained:core-languages@1.1.1
|
|
11
|
+
meteor@1.10.0
|
|
12
|
+
modern-browsers@0.1.8
|
|
13
|
+
modules@0.18.0
|
|
14
|
+
modules-runtime@0.13.0
|
|
15
|
+
promise@0.12.0
|
|
16
|
+
react-fast-refresh@0.2.3
|
|
17
|
+
typescript@4.5.4
|
|
18
|
+
unchained:core-languages@1.1.1
|
package/README.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { buildDbIndexes } from '@unchainedshop/utils';
|
|
2
|
+
export const LanguagesCollection = async (db) => {
|
|
3
|
+
const Languages = db.collection('languages');
|
|
4
|
+
await buildDbIndexes(Languages, [
|
|
5
|
+
{ index: { isoCode: 1 }, options: { unique: true } },
|
|
6
|
+
{
|
|
7
|
+
index: { isoCode: 'text', _id: 'text' },
|
|
8
|
+
options: {
|
|
9
|
+
weights: {
|
|
10
|
+
_id: 8,
|
|
11
|
+
isoCode: 6,
|
|
12
|
+
},
|
|
13
|
+
name: 'languages_fulltext_search',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
]);
|
|
17
|
+
return Languages;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=LanguagesCollection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LanguagesCollection.js","sourceRoot":"","sources":["../../src/db/LanguagesCollection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,EAAM,EAAE,EAAE;IAClD,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAW,WAAW,CAAC,CAAC;IAEvD,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,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;YACvC,OAAO,EAAE;gBACP,OAAO,EAAE;oBACP,GAAG,EAAE,CAAC;oBACN,OAAO,EAAE,CAAC;iBACX;gBACD,IAAI,EAAE,2BAA2B;aAClC;SACF;KACF,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const LanguagesSchema: any;
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
authorId: { type: String, required: true },
|
|
7
|
+
...Schemas.timestampFields,
|
|
8
|
+
}, { requiredByDefault: false });
|
|
9
|
+
//# sourceMappingURL=LanguagesSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LanguagesSchema.js","sourceRoot":"","sources":["../../src/db/LanguagesSchema.js"],"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,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC1C,GAAG,OAAO,CAAC,eAAe;CAC3B,EACD,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { configureLanguagesModule } from './module/configureLanguagesModule';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"languages-index.js","sourceRoot":"","sources":["../src/languages-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { emit, registerEvents } from '@unchainedshop/events';
|
|
2
|
+
import { generateDbMutations, generateDbFilterById, systemLocale, buildSortOptions, } from '@unchainedshop/utils';
|
|
3
|
+
import { LanguagesCollection } from '../db/LanguagesCollection';
|
|
4
|
+
import { LanguagesSchema } from '../db/LanguagesSchema';
|
|
5
|
+
const LANGUAGE_EVENTS = ['LANGUAGE_CREATE', 'LANGUAGE_UPDATE', 'LANGUAGE_REMOVE'];
|
|
6
|
+
const buildFindSelector = ({ includeInactive = false, queryString }) => {
|
|
7
|
+
const selector = { deleted: null };
|
|
8
|
+
if (!includeInactive)
|
|
9
|
+
selector.isActive = true;
|
|
10
|
+
if (queryString) {
|
|
11
|
+
selector.$text = { $search: queryString };
|
|
12
|
+
}
|
|
13
|
+
return selector;
|
|
14
|
+
};
|
|
15
|
+
export const configureLanguagesModule = async ({ db, }) => {
|
|
16
|
+
registerEvents(LANGUAGE_EVENTS);
|
|
17
|
+
const Languages = await LanguagesCollection(db);
|
|
18
|
+
const mutations = generateDbMutations(Languages, LanguagesSchema);
|
|
19
|
+
return {
|
|
20
|
+
findLanguage: async ({ languageId, isoCode }) => {
|
|
21
|
+
return Languages.findOne(languageId ? generateDbFilterById(languageId) : { isoCode }, {});
|
|
22
|
+
},
|
|
23
|
+
findLanguages: async ({ limit, offset, sort, ...query }, options) => {
|
|
24
|
+
return Languages.find(buildFindSelector(query), {
|
|
25
|
+
skip: offset,
|
|
26
|
+
limit,
|
|
27
|
+
sort: buildSortOptions(sort),
|
|
28
|
+
...options,
|
|
29
|
+
}).toArray();
|
|
30
|
+
},
|
|
31
|
+
count: async (query) => {
|
|
32
|
+
const count = await Languages.countDocuments(buildFindSelector(query));
|
|
33
|
+
return count;
|
|
34
|
+
},
|
|
35
|
+
languageExists: async ({ languageId }) => {
|
|
36
|
+
const languageCount = await Languages.countDocuments(generateDbFilterById(languageId, { deleted: null }), {
|
|
37
|
+
limit: 1,
|
|
38
|
+
});
|
|
39
|
+
return !!languageCount;
|
|
40
|
+
},
|
|
41
|
+
isBase: (language) => {
|
|
42
|
+
return language.isoCode === systemLocale.language;
|
|
43
|
+
},
|
|
44
|
+
create: async (doc, userId) => {
|
|
45
|
+
await Languages.deleteOne({ isoCode: doc.isoCode.toLowerCase(), deleted: { $ne: null } });
|
|
46
|
+
const languageId = await mutations.create({
|
|
47
|
+
...doc,
|
|
48
|
+
isoCode: doc.isoCode.toLowerCase(),
|
|
49
|
+
isActive: true,
|
|
50
|
+
}, userId);
|
|
51
|
+
emit('LANGUAGE_CREATE', { languageId });
|
|
52
|
+
return languageId;
|
|
53
|
+
},
|
|
54
|
+
update: async (languageId, doc, userId) => {
|
|
55
|
+
await mutations.update(languageId, {
|
|
56
|
+
...doc,
|
|
57
|
+
isoCode: doc.isoCode.toLowerCase(),
|
|
58
|
+
}, userId);
|
|
59
|
+
emit('LANGUAGE_UPDATE', { languageId });
|
|
60
|
+
return languageId;
|
|
61
|
+
},
|
|
62
|
+
delete: async (languageId, userId) => {
|
|
63
|
+
const deletedCount = await mutations.delete(languageId, userId);
|
|
64
|
+
emit('LANGUAGE_REMOVE', { languageId });
|
|
65
|
+
return deletedCount;
|
|
66
|
+
},
|
|
67
|
+
deletePermanently: mutations.deletePermanently,
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=configureLanguagesModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configureLanguagesModule.js","sourceRoot":"","sources":["../../src/module/configureLanguagesModule.ts"],"names":[],"mappings":"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"}
|
package/package.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
Package.describe({
|
|
2
|
+
name: 'unchained:core-languages',
|
|
3
|
+
version: '1.1.3',
|
|
4
|
+
summary: 'Unchained Engine Core: Languages',
|
|
5
|
+
git: 'https://github.com/unchainedshop/unchained',
|
|
6
|
+
documentation: 'README.md',
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
Npm.depends({
|
|
10
|
+
'@unchainedshop/utils': '1.1.3',
|
|
11
|
+
// '@unchainedshop/events': '1.1.4', // PEER
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
Package.onUse((api) => {
|
|
15
|
+
api.versionsFrom('2.7.3');
|
|
16
|
+
api.use('ecmascript');
|
|
17
|
+
api.use('typescript');
|
|
18
|
+
|
|
19
|
+
api.mainModule('src/languages-index.ts', 'server');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
Package.onTest((api) => {
|
|
23
|
+
api.use('ecmascript');
|
|
24
|
+
api.use('typescript');
|
|
25
|
+
|
|
26
|
+
api.use('unchained:core-languages');
|
|
27
|
+
|
|
28
|
+
api.mainModule('tests/languages-index.test.ts');
|
|
29
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@unchainedshop/core-languages",
|
|
3
|
+
"version": "1.1.3",
|
|
4
|
+
"main": "lib/languages-index.js",
|
|
5
|
+
"types": "lib/languages-index.d.ts",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"clean": "rm -rf lib",
|
|
9
|
+
"build": "npm run clean && tsc -p tsconfig.build.json",
|
|
10
|
+
"watch": "tsc --watch",
|
|
11
|
+
"link:core": "npm link @unchainedshop/types",
|
|
12
|
+
"test": "cross-env METEOR_PACKAGE_DIRS=../ TEST_CLIENT=0 TEST_WATCH=1 meteor test-packages ./ --driver-package meteortesting:mocha --port 4200"
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/unchainedshop/unchained.git"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"unchained",
|
|
20
|
+
"ecommerce",
|
|
21
|
+
"core"
|
|
22
|
+
],
|
|
23
|
+
"author": "Joël Meiller",
|
|
24
|
+
"license": "EUPL-1.2",
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/unchainedshop/unchained/issues"
|
|
27
|
+
},
|
|
28
|
+
"homepage": "https://github.com/unchainedshop/unchained#readme",
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@unchainedshop/events": "latest",
|
|
31
|
+
"@unchainedshop/utils": "latest",
|
|
32
|
+
"simpl-schema": "^1.12.2"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/chai": "^4.3.1",
|
|
36
|
+
"@types/mocha": "^9.1.1",
|
|
37
|
+
"@unchainedshop/types": "latest",
|
|
38
|
+
"chai": "^4.3.6",
|
|
39
|
+
"cross-env": "^7.0.3",
|
|
40
|
+
"typescript": "^4.7.4"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Db } from '@unchainedshop/types/common';
|
|
2
|
+
import { Language } from '@unchainedshop/types/languages';
|
|
3
|
+
import { buildDbIndexes } from '@unchainedshop/utils';
|
|
4
|
+
|
|
5
|
+
export const LanguagesCollection = async (db: Db) => {
|
|
6
|
+
const Languages = db.collection<Language>('languages');
|
|
7
|
+
|
|
8
|
+
await buildDbIndexes<Language>(Languages, [
|
|
9
|
+
{ index: { isoCode: 1 }, options: { unique: true } },
|
|
10
|
+
{
|
|
11
|
+
index: { isoCode: 'text', _id: 'text' },
|
|
12
|
+
options: {
|
|
13
|
+
weights: {
|
|
14
|
+
_id: 8,
|
|
15
|
+
isoCode: 6,
|
|
16
|
+
},
|
|
17
|
+
name: 'languages_fulltext_search',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
]);
|
|
21
|
+
|
|
22
|
+
return Languages;
|
|
23
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Schemas } from '@unchainedshop/utils';
|
|
2
|
+
import SimpleSchema from 'simpl-schema';
|
|
3
|
+
|
|
4
|
+
export const LanguagesSchema = new SimpleSchema(
|
|
5
|
+
{
|
|
6
|
+
isoCode: { type: String, required: true },
|
|
7
|
+
isActive: Boolean,
|
|
8
|
+
authorId: { type: String, required: true },
|
|
9
|
+
...Schemas.timestampFields,
|
|
10
|
+
},
|
|
11
|
+
{ requiredByDefault: false },
|
|
12
|
+
);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { configureLanguagesModule } from './module/configureLanguagesModule';
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { ModuleInput } from '@unchainedshop/types/common';
|
|
2
|
+
import { LanguagesModule, Language, LanguageQuery } from '@unchainedshop/types/languages';
|
|
3
|
+
import { emit, registerEvents } from '@unchainedshop/events';
|
|
4
|
+
import {
|
|
5
|
+
generateDbMutations,
|
|
6
|
+
generateDbFilterById,
|
|
7
|
+
systemLocale,
|
|
8
|
+
buildSortOptions,
|
|
9
|
+
} from '@unchainedshop/utils';
|
|
10
|
+
import { LanguagesCollection } from '../db/LanguagesCollection';
|
|
11
|
+
import { LanguagesSchema } from '../db/LanguagesSchema';
|
|
12
|
+
|
|
13
|
+
const LANGUAGE_EVENTS: string[] = ['LANGUAGE_CREATE', 'LANGUAGE_UPDATE', 'LANGUAGE_REMOVE'];
|
|
14
|
+
|
|
15
|
+
const buildFindSelector = ({ includeInactive = false, queryString }: LanguageQuery) => {
|
|
16
|
+
const selector: { isActive?: true; deleted?: Date; $text?: any } = { deleted: null };
|
|
17
|
+
if (!includeInactive) selector.isActive = true;
|
|
18
|
+
if (queryString) {
|
|
19
|
+
selector.$text = { $search: queryString };
|
|
20
|
+
}
|
|
21
|
+
return selector;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const configureLanguagesModule = async ({
|
|
25
|
+
db,
|
|
26
|
+
}: ModuleInput<Record<string, never>>): Promise<LanguagesModule> => {
|
|
27
|
+
registerEvents(LANGUAGE_EVENTS);
|
|
28
|
+
|
|
29
|
+
const Languages = await LanguagesCollection(db);
|
|
30
|
+
|
|
31
|
+
const mutations = generateDbMutations<Language>(Languages, LanguagesSchema);
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
findLanguage: async ({ languageId, isoCode }) => {
|
|
35
|
+
return Languages.findOne(languageId ? generateDbFilterById(languageId) : { isoCode }, {});
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
findLanguages: async ({ limit, offset, sort, ...query }, options) => {
|
|
39
|
+
return Languages.find(buildFindSelector(query), {
|
|
40
|
+
skip: offset,
|
|
41
|
+
limit,
|
|
42
|
+
sort: buildSortOptions(sort),
|
|
43
|
+
...options,
|
|
44
|
+
}).toArray();
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
count: async (query) => {
|
|
48
|
+
const count = await Languages.countDocuments(buildFindSelector(query));
|
|
49
|
+
return count;
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
languageExists: async ({ languageId }) => {
|
|
53
|
+
const languageCount = await Languages.countDocuments(
|
|
54
|
+
generateDbFilterById(languageId, { deleted: null }),
|
|
55
|
+
{
|
|
56
|
+
limit: 1,
|
|
57
|
+
},
|
|
58
|
+
);
|
|
59
|
+
return !!languageCount;
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
isBase: (language) => {
|
|
63
|
+
return language.isoCode === systemLocale.language;
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
create: async (doc: Language, userId?: string) => {
|
|
67
|
+
await Languages.deleteOne({ isoCode: doc.isoCode.toLowerCase(), deleted: { $ne: null } });
|
|
68
|
+
const languageId = await mutations.create(
|
|
69
|
+
{
|
|
70
|
+
...doc,
|
|
71
|
+
isoCode: doc.isoCode.toLowerCase(),
|
|
72
|
+
isActive: true,
|
|
73
|
+
},
|
|
74
|
+
userId,
|
|
75
|
+
);
|
|
76
|
+
emit('LANGUAGE_CREATE', { languageId });
|
|
77
|
+
return languageId;
|
|
78
|
+
},
|
|
79
|
+
update: async (languageId, doc, userId) => {
|
|
80
|
+
await mutations.update(
|
|
81
|
+
languageId,
|
|
82
|
+
{
|
|
83
|
+
...doc,
|
|
84
|
+
isoCode: doc.isoCode.toLowerCase(),
|
|
85
|
+
},
|
|
86
|
+
userId,
|
|
87
|
+
);
|
|
88
|
+
emit('LANGUAGE_UPDATE', { languageId });
|
|
89
|
+
return languageId;
|
|
90
|
+
},
|
|
91
|
+
delete: async (languageId, userId) => {
|
|
92
|
+
const deletedCount = await mutations.delete(languageId, userId);
|
|
93
|
+
emit('LANGUAGE_REMOVE', { languageId });
|
|
94
|
+
return deletedCount;
|
|
95
|
+
},
|
|
96
|
+
deletePermanently: mutations.deletePermanently,
|
|
97
|
+
};
|
|
98
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { assert } from 'chai';
|
|
2
|
+
import { initDb } from 'meteor/unchained:mongodb';
|
|
3
|
+
import { configureLanguagesModule } from 'meteor/unchained:core-languages';
|
|
4
|
+
|
|
5
|
+
describe('Test exports', () => {
|
|
6
|
+
let module;
|
|
7
|
+
|
|
8
|
+
before(async () => {
|
|
9
|
+
const db = await initDb();
|
|
10
|
+
module = await configureLanguagesModule({ db });
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('Check Bookmarks module', async () => {
|
|
14
|
+
assert.ok(module);
|
|
15
|
+
assert.isFunction(module.findLanguage);
|
|
16
|
+
assert.isFunction(module.findLanguages);
|
|
17
|
+
assert.isFunction(module.languageExists);
|
|
18
|
+
assert.isFunction(module.create);
|
|
19
|
+
assert.isFunction(module.update);
|
|
20
|
+
assert.isFunction(module.delete);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('Mutate language', async () => {
|
|
24
|
+
const languageId = await module.create(
|
|
25
|
+
{
|
|
26
|
+
authorId: 'Test-User-1',
|
|
27
|
+
isoCode: 'CHF',
|
|
28
|
+
},
|
|
29
|
+
'Test-User-1'
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
assert.ok(languageId);
|
|
33
|
+
const language = await module.findLanguage(languageId);
|
|
34
|
+
|
|
35
|
+
assert.ok(language);
|
|
36
|
+
assert.equal(language._id, languageId);
|
|
37
|
+
assert.equal(language.isoCode, 'CHF');
|
|
38
|
+
assert.equal(language.userId, 'Test-User-1');
|
|
39
|
+
assert.isDefined(language.created);
|
|
40
|
+
assert.isUndefined(language.updated);
|
|
41
|
+
assert.isUndefined(language.updatedBy);
|
|
42
|
+
assert.equal(language.createdBy, 'Test-User-1');
|
|
43
|
+
|
|
44
|
+
const deletedCount = await module.delete(languageId);
|
|
45
|
+
assert.equal(deletedCount, 1);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"allowJs": true,
|
|
4
|
+
"allowSyntheticDefaultImports": true,
|
|
5
|
+
"declaration": true,
|
|
6
|
+
"esModuleInterop": true,
|
|
7
|
+
"experimentalDecorators": true,
|
|
8
|
+
"forceConsistentCasingInFileNames": true,
|
|
9
|
+
"lib": ["esnext"],
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "node",
|
|
12
|
+
"noImplicitReturns": true,
|
|
13
|
+
"noUnusedLocals": false,
|
|
14
|
+
"outDir": "lib",
|
|
15
|
+
"preserveWatchOutput": true,
|
|
16
|
+
"skipLibCheck": true,
|
|
17
|
+
"sourceMap": true,
|
|
18
|
+
"target": "esnext",
|
|
19
|
+
"types": ["node"],
|
|
20
|
+
"baseUrl": ".", // This must be specified if "paths" is.
|
|
21
|
+
"paths": {
|
|
22
|
+
"meteor/unchained:*": ["node_modules/@unchainedshop/types/index.d.ts"]
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"include": ["src"]
|
|
26
|
+
}
|