@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "branches": [
3
- "master", {"name":"PUR-1208", "channel":"prerelease", "prerelease":"pur-1208"}
3
+ "master", {"name":"PA-954", "channel":"prerelease", "prerelease":"pa-954"}
4
4
  ],
5
5
  "plugins": [
6
6
  "@semantic-release/release-notes-generator",
package/README.md CHANGED
@@ -1,36 +1,38 @@
1
- # @nuskin/ns-contentstack-lib
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 @ns/ns-contentstack-lib
16
+ npm install @nuskin/contentstack-lib
19
17
  ```
20
18
 
21
19
  Usng yarn:
22
20
 
23
21
  ```bash
24
- yarn add @ns/ns-contentstack-lib
22
+ yarn add @nuskin/contentstack-lib
25
23
  ```
26
24
 
27
25
  ## Example usage
28
26
 
29
27
  ```js
30
- const { getStack } = require('@ns/ns-contentstack-lib')
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
- // Pass the environment to getStack (dev, test, stage, prod)
33
- const Stack = getStack('dev')
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/ns-contentstack-lib
75
+ - https://code.tls.nuskin.io/ns-am/utility/npm/contentstack-lib
74
76
 
75
77
  ## License
76
78
 
@@ -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
- const apiKey = 'testkey';
16
- const deliveryToken = 'testDeliveryToken';
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, init} = require('../src/api');
100
- init({env: 'dev'})
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, init} = require('../src/api');
113
- init({})
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, init} = require('../src/api');
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, init} = require('../src/api');
136
- init({apiKey, deliveryToken, env: 'test'});
137
- getStack();
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, init} = require('../src/api');
150
- init({apiKey, deliveryToken})
151
- getStack();
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
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "contentstack": {
3
3
  "baseUrl": "https://cdn.contentstack.io",
4
- "environment": "public-dev"
4
+ "environment": "public-dev",
5
+ "apiKey": "blt7d4c4f4a1bf5a819",
6
+ "deliveryToken": "csb0f10375c807538aad91a5e7"
5
7
  }
6
8
  }
package/config/prod.json CHANGED
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "contentstack": {
3
3
  "baseUrl": "https://cdn.contentstack.io",
4
- "environment": "public-prod"
4
+ "environment": "public-prod",
5
+ "apiKey": "blt7d4c4f4a1bf5a819",
6
+ "deliveryToken": "cs7029c5e32f0e99978efc683d"
5
7
  }
6
8
  }
package/config/stage.json CHANGED
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "contentstack": {
3
3
  "baseUrl": "https://cdn.contentstack.io",
4
- "environment": "public-stage"
4
+ "environment": "public-stage",
5
+ "apiKey": "blt7d4c4f4a1bf5a819",
6
+ "deliveryToken": "cs4c1de6b00d219e11c4863215"
5
7
  }
6
8
  }
package/config/test.json CHANGED
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "contentstack": {
3
3
  "baseUrl": "https://cdn.contentstack.io",
4
- "environment": "public-test"
4
+ "environment": "public-test",
5
+ "apiKey": "blt7d4c4f4a1bf5a819",
6
+ "deliveryToken": "cs9a111e7615cf94011266b5e6"
5
7
  }
6
8
  }
package/docs/CHANGELOG.md CHANGED
@@ -1 +1 @@
1
- # [1.0.0-pur-1208.2](https://code.tls.nuskin.io/ns-am/utility/npm/contentstack-lib/compare/v1.0.0-pur-1208.1...v1.0.0-pur-1208.2) (2024-09-17)
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": "1.0.0-pur-1208.2",
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'} environment
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 (!environment) {
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
- environment = _getEnv();
186
+ envrnmnt = _getEnv();
156
187
  }
157
188
 
158
189
  // If the environment requested hasn't changed return the stack we already have
159
- if (environment === env && Stack) {
190
+ if (envrnmnt === env && Stack) {
160
191
  return Stack;
161
192
  }
162
193
 
163
- env = environment;
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
  };