@nuskin/contentstack-lib 1.0.0-pur-1208.2 → 2.0.0-pa-954.1
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/.releaserc +1 -1
- package/README.md +14 -12
- package/__tests__/api.spec.js +40 -55
- package/config/dev.json +3 -1
- package/config/prod.json +3 -1
- package/config/stage.json +3 -1
- package/config/test.json +3 -1
- package/docs/CHANGELOG.md +1 -1
- package/package.json +1 -1
- package/src/api.js +42 -17
- package/gl-sbom-npm-yarn.cdx.json +0 -10278
package/.releaserc
CHANGED
package/README.md
CHANGED
|
@@ -1,36 +1,38 @@
|
|
|
1
|
-
# @nuskin/
|
|
1
|
+
# @nuskin/contentstack-lib
|
|
2
2
|
|
|
3
3
|
This project extends the Contentstack delivery sdk, to be shared between the backend (AWS Lambda) and frontend.
|
|
4
4
|
1. It simplifies initializing the Stack object.
|
|
5
5
|
2. It extends the stack with a new function getSingletonEntries most commonly used to get translations
|
|
6
6
|
3. CONTENTSTACK DOES NOT MERGE COMMON ENGLISH WITH US-en STRINGS. FALLBACK IN CONTENTSTACK DOES NOT WORK AS EXPECTED.
|
|
7
7
|
getSingletonEntries TAKES AN OPTION CALLED mergeWithFallback. IF THAT IS SET TO TRUE THEN IT WILL MERGE THE RESULTS
|
|
8
|
-
FOR COMMON SPANISH AND MX-es FOR EXAMPLE.
|
|
8
|
+
FOR COMMON SPANISH AND MX-es FOR EXAMPLE.
|
|
9
9
|
4. getSingletonEntries also allows you to convert the keys from snake case to camel case.
|
|
10
10
|
|
|
11
11
|
## Installing
|
|
12
12
|
|
|
13
|
-
Update the .npmrc in your project to use the nexus registry @ns:registry=https://nexus3.nuskin.net/repository/npm-internal/
|
|
14
|
-
|
|
15
13
|
Usng npm:
|
|
16
14
|
|
|
17
15
|
```bash
|
|
18
|
-
npm install @
|
|
16
|
+
npm install @nuskin/contentstack-lib
|
|
19
17
|
```
|
|
20
18
|
|
|
21
19
|
Usng yarn:
|
|
22
20
|
|
|
23
21
|
```bash
|
|
24
|
-
yarn add @
|
|
22
|
+
yarn add @nuskin/contentstack-lib
|
|
25
23
|
```
|
|
26
24
|
|
|
27
25
|
## Example usage
|
|
28
26
|
|
|
29
27
|
```js
|
|
30
|
-
const { getStack } = require('@
|
|
28
|
+
const { getStack, init } = require('@nuskin/contentstack-lib')
|
|
29
|
+
|
|
30
|
+
// Initialize the module with params needed for connecting to contentstack
|
|
31
|
+
// These fields can be gotten from the parameter store
|
|
32
|
+
init({env, apiKey, deliveryToken})
|
|
31
33
|
|
|
32
|
-
//
|
|
33
|
-
const Stack = getStack(
|
|
34
|
+
// Call getStack to get the stack object
|
|
35
|
+
const Stack = getStack()
|
|
34
36
|
|
|
35
37
|
// get all languages
|
|
36
38
|
const languages = await Stack.ContentType('supported_language').Query().toJSON().find();
|
|
@@ -44,7 +46,7 @@ const translations = Stack.getStrings({
|
|
|
44
46
|
contentTypes: ['checkout_adr_strings', 'checkout_cart_strings'], // List of content types you want to get translations for
|
|
45
47
|
language: 'en',
|
|
46
48
|
country: 'US',
|
|
47
|
-
merge: true // Will combine checkout_adr_strings and checkout_cart_strings object with single list of strings
|
|
49
|
+
merge: true // Will combine checkout_adr_strings and checkout_cart_strings object with single list of strings
|
|
48
50
|
});
|
|
49
51
|
|
|
50
52
|
// Use this function instead to get your translations
|
|
@@ -65,12 +67,12 @@ const [
|
|
|
65
67
|
mergeWithFallback: true
|
|
66
68
|
});
|
|
67
69
|
|
|
68
|
-
// We could possibly add functionality to return the list of regions markets and languages in a single object structure
|
|
70
|
+
// We could possibly add functionality to return the list of regions markets and languages in a single object structure
|
|
69
71
|
```
|
|
70
72
|
|
|
71
73
|
## Resources
|
|
72
74
|
|
|
73
|
-
- https://code.tls.nuskin.io/ns-am/utility/npm/
|
|
75
|
+
- https://code.tls.nuskin.io/ns-am/utility/npm/contentstack-lib
|
|
74
76
|
|
|
75
77
|
## License
|
|
76
78
|
|
package/__tests__/api.spec.js
CHANGED
|
@@ -8,12 +8,38 @@ const singleCheckoutAdrStringsCommon = require('./resources/singleCheckoutAdrStr
|
|
|
8
8
|
const singleCheckoutCartStrings = require('./resources/singleCheckoutCartStrings.json');
|
|
9
9
|
const singleCheckoutAdrCamelResult = require('./resources/singleCheckoutAdrStringsCamel.json');
|
|
10
10
|
const singleCheckoutCartCamelResult = require('./resources/singleCheckoutCartStringsCamel.json');
|
|
11
|
+
const {contentstack: devEnvConfig} = require(`../config/dev.json`);
|
|
12
|
+
const {contentstack: testEnvConfig} = require(`../config/test.json`);
|
|
13
|
+
const {contentstack: stageEnvConfig} = require(`../config/stage.json`);
|
|
14
|
+
const {contentstack: prodEnvConfig} = require(`../config/prod.json`);
|
|
11
15
|
const mockPromiseResult = jest.fn();
|
|
12
16
|
const mockSinglePromiseResult = jest.fn();
|
|
13
17
|
const mockStack = jest.fn();
|
|
14
18
|
|
|
15
|
-
|
|
16
|
-
|
|
19
|
+
function getConfig(env) {
|
|
20
|
+
let config = {};
|
|
21
|
+
|
|
22
|
+
switch (env) {
|
|
23
|
+
case 'dev': {
|
|
24
|
+
config = devEnvConfig;
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
case 'test': {
|
|
28
|
+
config = testEnvConfig;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
case 'stage': {
|
|
32
|
+
config = stageEnvConfig;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
case 'prod': {
|
|
36
|
+
config = prodEnvConfig;
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return config;
|
|
42
|
+
}
|
|
17
43
|
|
|
18
44
|
beforeEach(() => {
|
|
19
45
|
mockStack.mockImplementation(() => ({
|
|
@@ -48,43 +74,6 @@ const mockResults = () => {
|
|
|
48
74
|
}
|
|
49
75
|
|
|
50
76
|
describe("ContentstackApi", () => {
|
|
51
|
-
// test("retries with just the language if can't get strings for country", async () => {
|
|
52
|
-
// mockPromiseResult.mockClear();
|
|
53
|
-
// mockPromiseResult.mockRejectedValueOnce(new Error("Failed"));
|
|
54
|
-
// mockResults();
|
|
55
|
-
// const {getStack} = require('../src/api');
|
|
56
|
-
// const Stack = getStack('dev');
|
|
57
|
-
// await Stack.getStrings({contentTypes: ['checkout_adr_strings', 'checkout_cart_strings'], language: 'en', country: 'US', merge: true});
|
|
58
|
-
// expect(mockPromiseResult).toHaveBeenCalledTimes(4);
|
|
59
|
-
// });
|
|
60
|
-
|
|
61
|
-
// test("getStrings for multiple contentTypes", async () => {
|
|
62
|
-
// mockResults();
|
|
63
|
-
// const {getStack} = require('../src/api');
|
|
64
|
-
// const Stack = getStack('dev');
|
|
65
|
-
// const strings = await Stack.getStrings({contentTypes: ['checkout_adr_strings', 'checkout_cart_strings'], language: 'en', merge: false});
|
|
66
|
-
// expect(strings).toStrictEqual(stringsResult);
|
|
67
|
-
// });
|
|
68
|
-
|
|
69
|
-
// test("getStrings merged", async () => {
|
|
70
|
-
// mockResults();
|
|
71
|
-
// const {getStack} = require('../src/api');
|
|
72
|
-
// const Stack = getStack('dev');
|
|
73
|
-
// const strings = await Stack.getStrings({contentTypes: ['checkout_adr_strings', 'checkout_cart_strings'], language: 'en', merge: true});
|
|
74
|
-
// expect(strings).toStrictEqual(mergedResult);
|
|
75
|
-
// });
|
|
76
|
-
|
|
77
|
-
// test("getStrings throws error", async () => {
|
|
78
|
-
// mockResults();
|
|
79
|
-
// const {getStack} = require('../src/api');
|
|
80
|
-
// const Stack = getStack('dev');
|
|
81
|
-
// try {
|
|
82
|
-
// await Stack.getStrings({});
|
|
83
|
-
// } catch(err) {
|
|
84
|
-
// expect(err).toStrictEqual(new Error('Call to getStrings: options.contentTypes and language are required'));
|
|
85
|
-
// }
|
|
86
|
-
// })
|
|
87
|
-
|
|
88
77
|
test("getSingletonEntries", async () => {
|
|
89
78
|
mockResults();
|
|
90
79
|
const {getStack} = require('../src/api');
|
|
@@ -96,9 +85,8 @@ describe("ContentstackApi", () => {
|
|
|
96
85
|
|
|
97
86
|
test("getSingletonEntries in camelcase", async () => {
|
|
98
87
|
mockResults();
|
|
99
|
-
const {getStack
|
|
100
|
-
|
|
101
|
-
const Stack = getStack();
|
|
88
|
+
const {getStack} = require('../src/api');
|
|
89
|
+
const Stack = getStack('dev');
|
|
102
90
|
const [checkoutAdrStrings, checkoutCartStrings] = await Stack.getSingletonEntries({contentTypeUIDs: ['checkout_adr_strings', 'checkout_cart_strings'], language: 'en', camelcase: true});
|
|
103
91
|
expect(checkoutAdrStrings).toStrictEqual(singleCheckoutAdrCamelResult);
|
|
104
92
|
expect(checkoutCartStrings).toStrictEqual(singleCheckoutCartCamelResult);
|
|
@@ -109,9 +97,8 @@ describe("ContentstackApi", () => {
|
|
|
109
97
|
mockSinglePromiseResult.mockResolvedValueOnce(singleCheckoutAdrStringsCommon);
|
|
110
98
|
// The second api call is for en_US
|
|
111
99
|
mockSinglePromiseResult.mockResolvedValueOnce(singleCheckoutAdrStrings);
|
|
112
|
-
const {getStack
|
|
113
|
-
|
|
114
|
-
const Stack = getStack();
|
|
100
|
+
const {getStack} = require('../src/api');
|
|
101
|
+
const Stack = getStack('dev');
|
|
115
102
|
const [checkoutAdrStrings] = await Stack.getSingletonEntries({contentTypeUIDs: ['checkout_adr_strings'], language: 'en', country: 'US', mergeWithFallback: true});
|
|
116
103
|
expect(checkoutAdrStrings.overridden_value).toEqual("This value overrides the common value");
|
|
117
104
|
expect(checkoutAdrStrings.new_value).toEqual("This value only exists in en_US");
|
|
@@ -120,8 +107,7 @@ describe("ContentstackApi", () => {
|
|
|
120
107
|
|
|
121
108
|
test("getSingletonEntries throws error", async () => {
|
|
122
109
|
mockResults();
|
|
123
|
-
const {getStack
|
|
124
|
-
init({deliveryToken, apiKey});
|
|
110
|
+
const {getStack} = require('../src/api');
|
|
125
111
|
const Stack = getStack();
|
|
126
112
|
try {
|
|
127
113
|
await Stack.getSingletonEntries({});
|
|
@@ -132,10 +118,9 @@ describe("ContentstackApi", () => {
|
|
|
132
118
|
|
|
133
119
|
test("getStack initialized using sdk", () => {
|
|
134
120
|
mockResults();
|
|
135
|
-
const {getStack
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
expect(mockStack).toHaveBeenCalledWith({api_key: apiKey, delivery_token: deliveryToken, environment: 'test'});
|
|
121
|
+
const {getStack} = require('../src/api');
|
|
122
|
+
getStack('dev');
|
|
123
|
+
expect(mockStack).toHaveBeenCalledWith({api_key: devEnvConfig.apiKey, delivery_token: devEnvConfig.deliveryToken, environment: 'public-dev'});
|
|
139
124
|
});
|
|
140
125
|
|
|
141
126
|
test('getStack without environment', () => {
|
|
@@ -143,13 +128,13 @@ describe("ContentstackApi", () => {
|
|
|
143
128
|
const hostnames = ['dev.nuskin.com', 'test.nuskin.com', 'stage.nuskin.com', 'www.nuskin.com'];
|
|
144
129
|
const env = ['dev', 'test', 'stage', 'prod'];
|
|
145
130
|
hostnames.forEach((hostname, index) => {
|
|
131
|
+
const csCfg = getConfig(env[index]);
|
|
146
132
|
delete global.window.location;
|
|
147
133
|
global.window = Object.create(window);
|
|
148
134
|
global.window.location = { hostname };
|
|
149
|
-
const {getStack
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
expect(mockStack).toHaveBeenCalledWith({api_key: apiKey, delivery_token: deliveryToken, environment: env[index]});
|
|
135
|
+
const {getStack} = require('../src/api');
|
|
136
|
+
getStack(env[index]);
|
|
137
|
+
expect(mockStack).toHaveBeenCalledWith({api_key: csCfg.apiKey, delivery_token: csCfg.deliveryToken, environment: csCfg.environment});
|
|
153
138
|
})
|
|
154
139
|
})
|
|
155
140
|
});
|
package/config/dev.json
CHANGED
package/config/prod.json
CHANGED
package/config/stage.json
CHANGED
package/config/test.json
CHANGED
package/docs/CHANGELOG.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
# [
|
|
1
|
+
# [2.0.0-pa-954.1](https://code.tls.nuskin.io/ns-am/utility/npm/contentstack-lib/compare/v1.0.0...v2.0.0-pa-954.1) (2026-03-09)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nuskin/contentstack-lib",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-pa-954.1",
|
|
4
4
|
"description": "This project contains configuration and api code to access Contentstack, to be shared between the backend (AWS Lambda) and frontend (Vue, etc).",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"scripts": {
|
package/src/api.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
const Contentstack = require('contentstack');
|
|
4
|
+
const {contentstack: devEnvConfig} = require(`../config/dev.json`);
|
|
5
|
+
const {contentstack: testEnvConfig} = require(`../config/test.json`);
|
|
6
|
+
const {contentstack: stageEnvConfig} = require(`../config/stage.json`);
|
|
7
|
+
const {contentstack: prodEnvConfig} = require(`../config/prod.json`);
|
|
8
|
+
|
|
4
9
|
let env = null;
|
|
5
10
|
let Stack = null;
|
|
6
11
|
|
|
7
|
-
let api_key;
|
|
8
|
-
let delivery_token;
|
|
9
|
-
let environment;
|
|
10
|
-
|
|
11
12
|
const COMMON_LANGUAGES = {
|
|
12
13
|
'da': 'da-dk',
|
|
13
14
|
'id': 'id-id',
|
|
@@ -21,6 +22,36 @@ const COMMON_LANGUAGES = {
|
|
|
21
22
|
'tr': 'tr-tr'
|
|
22
23
|
};
|
|
23
24
|
|
|
25
|
+
/**
|
|
26
|
+
* Gets the correct contentstack config settings
|
|
27
|
+
* @param {string} env
|
|
28
|
+
* @returns {object}
|
|
29
|
+
*/
|
|
30
|
+
function getConfig(env) {
|
|
31
|
+
let config = {};
|
|
32
|
+
|
|
33
|
+
switch (env) {
|
|
34
|
+
case 'dev': {
|
|
35
|
+
config = devEnvConfig;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
case 'test': {
|
|
39
|
+
config = testEnvConfig;
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
case 'stage': {
|
|
43
|
+
config = stageEnvConfig;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case 'prod': {
|
|
47
|
+
config = prodEnvConfig;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return config;
|
|
53
|
+
}
|
|
54
|
+
|
|
24
55
|
/**
|
|
25
56
|
* Convert string from snake case to camel case
|
|
26
57
|
* @param {string} snakeCasedString
|
|
@@ -144,23 +175,24 @@ async function getSingletonEntries(options) {
|
|
|
144
175
|
|
|
145
176
|
/**
|
|
146
177
|
* Returns contentstack Stack object initialized with the api key, deliveryToken, and extended with custom functionality
|
|
147
|
-
* @param {'dev' | 'test' | 'stage' | 'prod'}
|
|
178
|
+
* @param {'dev' | 'test' | 'stage' | 'prod'} envrnmnt
|
|
148
179
|
* @return {Object} Stack - contentstack Stack sdk object with additional getStrings function
|
|
149
180
|
*/
|
|
150
|
-
function getStack() {
|
|
151
|
-
if (!
|
|
181
|
+
function getStack(envrnmnt) {
|
|
182
|
+
if (!envrnmnt) {
|
|
152
183
|
if (!window || !window.location) {
|
|
153
184
|
throw new Error('Environment must be passed into getStack');
|
|
154
185
|
}
|
|
155
|
-
|
|
186
|
+
envrnmnt = _getEnv();
|
|
156
187
|
}
|
|
157
188
|
|
|
158
189
|
// If the environment requested hasn't changed return the stack we already have
|
|
159
|
-
if (
|
|
190
|
+
if (envrnmnt === env && Stack) {
|
|
160
191
|
return Stack;
|
|
161
192
|
}
|
|
162
193
|
|
|
163
|
-
env =
|
|
194
|
+
env = envrnmnt;
|
|
195
|
+
const {apiKey: api_key, deliveryToken: delivery_token, environment} = getConfig(env)
|
|
164
196
|
Stack = Contentstack.Stack({api_key, delivery_token, environment})
|
|
165
197
|
|
|
166
198
|
// extend the Stack with a custom function to get translations
|
|
@@ -169,13 +201,6 @@ function getStack() {
|
|
|
169
201
|
return Stack;
|
|
170
202
|
}
|
|
171
203
|
|
|
172
|
-
function init({env, apiKey, deliveryToken}) {
|
|
173
|
-
environment = env;
|
|
174
|
-
api_key = apiKey;
|
|
175
|
-
delivery_token = deliveryToken;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
204
|
module.exports = {
|
|
179
|
-
init,
|
|
180
205
|
getStack
|
|
181
206
|
};
|