Skip to content

Commit 20a1931

Browse files
authored
Changes needed for moving to the ES modules. (#12)
1 parent 5747e14 commit 20a1931

File tree

7 files changed

+211
-43
lines changed

7 files changed

+211
-43
lines changed

src/__tests__/createGetDataElementValue.test.js

Lines changed: 111 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,23 @@ const createGetDataElementDefinitionDefault = (dataDef) =>
2727
return null;
2828
});
2929

30+
const createGetModuleProvider = (o = {}) => {
31+
return {
32+
getModuleExports: () => (context) => context.utils.getSettings().foo,
33+
getModuleDefinition: () => ({
34+
extensionName: 'someextension'
35+
}),
36+
getExtensionDefinition: () => ({
37+
getSettings: () => ({ data: 'extension settings' })
38+
}),
39+
...o
40+
};
41+
};
42+
3043
const createGetDataElementValue = (
3144
delegateDefinition,
3245
{
33-
moduleProvider = {
34-
getModuleExports: () => (context) => context.utils.getSettings().foo
35-
},
46+
moduleProvider = createGetModuleProvider(),
3647
createGetDataElementDefinition = createGetDataElementDefinitionDefault
3748
} = {}
3849
) => {
@@ -46,7 +57,7 @@ const createGetDataElementValue = (
4657
};
4758

4859
describe('function returned by createGetDataElementValue', () => {
49-
test('returns a value from the settings object as value', () => {
60+
test('returns a value from the settings object as value', async () => {
5061
const getDataElementValue = createGetDataElementValue({
5162
settings: {
5263
foo: 'bar'
@@ -58,7 +69,7 @@ describe('function returned by createGetDataElementValue', () => {
5869
);
5970
});
6071

61-
test('returns a value from the contextData object as value', () => {
72+
test('returns a value from the contextData object as value', async () => {
6273
const context = {
6374
arcAndUtils: {
6475
arc: {
@@ -67,9 +78,9 @@ describe('function returned by createGetDataElementValue', () => {
6778
}
6879
};
6980

70-
const moduleProvider = {
81+
const moduleProvider = createGetModuleProvider({
7182
getModuleExports: () => (c) => c.arc.foo
72-
};
83+
});
7384

7485
const getDataElementValue = createGetDataElementValue(
7586
{},
@@ -81,7 +92,79 @@ describe('function returned by createGetDataElementValue', () => {
8192
);
8293
});
8394

84-
test('cleans the value when cleanText = true', () => {
95+
test('gives extension settings access to the data element module', async () => {
96+
const moduleProvider = createGetModuleProvider({
97+
getModuleExports:
98+
() =>
99+
({ utils }) =>
100+
utils.getExtensionSettings()
101+
});
102+
103+
const getDataElementValue = createGetDataElementValue(
104+
{},
105+
{ moduleProvider }
106+
);
107+
108+
return getDataElementValue('testDataElement', defaultContext).then(
109+
(dataElementValue) =>
110+
expect(dataElementValue).toEqual({ data: 'extension settings' })
111+
);
112+
});
113+
114+
test('gives env access to the data element module called by the core extension', async () => {
115+
const context = {
116+
arcAndUtils: {},
117+
env: {
118+
foo: 'bar'
119+
}
120+
};
121+
122+
const moduleProvider = createGetModuleProvider({
123+
getModuleDefinition: () => ({
124+
extensionName: 'core'
125+
}),
126+
getModuleExports:
127+
() =>
128+
({ utils }) =>
129+
utils.getEnv()
130+
});
131+
132+
const getDataElementValue = createGetDataElementValue(
133+
{},
134+
{ moduleProvider }
135+
);
136+
137+
return getDataElementValue('testDataElement', context).then(
138+
(dataElementValue) => expect(dataElementValue).toEqual({ foo: 'bar' })
139+
);
140+
});
141+
142+
test('does not give env access to the data element module called by extensions that are not core', async () => {
143+
const context = {
144+
arcAndUtils: {},
145+
env: {
146+
foo: 'bar'
147+
}
148+
};
149+
150+
const moduleProvider = createGetModuleProvider({
151+
getModuleExports:
152+
() =>
153+
({ utils }) =>
154+
utils.getEnv()
155+
});
156+
157+
const getDataElementValue = createGetDataElementValue(
158+
{},
159+
{ moduleProvider }
160+
);
161+
162+
return getDataElementValue('testDataElement', context).then(
163+
(dataElementValue) => expect(dataElementValue).toEqual({})
164+
);
165+
});
166+
167+
test('cleans the value when cleanText = true', async () => {
85168
const getDataElementValue = createGetDataElementValue({
86169
cleanText: true,
87170
settings: { foo: 'bar' }
@@ -93,11 +176,11 @@ describe('function returned by createGetDataElementValue', () => {
93176
});
94177

95178
[undefined, null].forEach((testDataElementValue) => {
96-
const moduleProvider = {
179+
const moduleProvider = createGetModuleProvider({
97180
getModuleExports: () => () => testDataElementValue
98-
};
181+
});
99182

100-
test(`returns a default value if data element value is ${testDataElementValue}`, () => {
183+
test(`returns a default value if data element value is ${testDataElementValue}`, async () => {
101184
const getDataElementValue = createGetDataElementValue(
102185
{
103186
defaultValue: 'defaultValue',
@@ -112,7 +195,7 @@ describe('function returned by createGetDataElementValue', () => {
112195
});
113196

114197
test(`returns ${testDataElementValue} if data element value is ${testDataElementValue}
115-
and default is undefined`, () => {
198+
and default is undefined`, async () => {
116199
const getDataElementValue = createGetDataElementValue(
117200
{
118201
settings: {}
@@ -128,11 +211,11 @@ describe('function returned by createGetDataElementValue', () => {
128211
});
129212

130213
['', 0, false, NaN].forEach((testDataElementValue) => {
131-
const moduleProvider = {
214+
const moduleProvider = createGetModuleProvider({
132215
getModuleExports: () => () => testDataElementValue
133-
};
216+
});
134217

135-
test(`does not return a default value if value is ${testDataElementValue}`, () => {
218+
test(`does not return a default value if value is ${testDataElementValue}`, async () => {
136219
const getDataElementValue = createGetDataElementValue(
137220
{
138221
defaultValue: 'defaultValue',
@@ -148,7 +231,7 @@ describe('function returned by createGetDataElementValue', () => {
148231
});
149232
});
150233

151-
test('lowercases the value if forceLowerCase = true', () => {
234+
test('lowercases the value if forceLowerCase = true', async () => {
152235
const getDataElementValue = createGetDataElementValue({
153236
forceLowerCase: true,
154237
settings: {
@@ -161,7 +244,7 @@ describe('function returned by createGetDataElementValue', () => {
161244
);
162245
});
163246

164-
test('lowercases the default value if forceLowerCase = true', () => {
247+
test('lowercases the default value if forceLowerCase = true', async () => {
165248
const getDataElementValue = createGetDataElementValue({
166249
forceLowerCase: true,
167250
defaultValue: 'bAr',
@@ -173,12 +256,12 @@ describe('function returned by createGetDataElementValue', () => {
173256
);
174257
});
175258

176-
test('throws an error when calling data element module exports fails', () => {
177-
const moduleProvider = {
259+
test('throws an error when calling data element module exports fails', async () => {
260+
const moduleProvider = createGetModuleProvider({
178261
getModuleExports: () => () => {
179262
throw new Error('noob tried to divide by zero');
180263
}
181-
};
264+
});
182265

183266
const getDataElementValue = createGetDataElementValue(
184267
{
@@ -195,12 +278,12 @@ describe('function returned by createGetDataElementValue', () => {
195278
});
196279
});
197280

198-
test('throws an error when calling data element module exports fails', () => {
199-
const moduleProvider = {
281+
test('throws an error when calling data element module exports fails', async () => {
282+
const moduleProvider = createGetModuleProvider({
200283
getModuleExports: () => () => {
201284
throw new Error('noob tried to divide by zero');
202285
}
203-
};
286+
});
204287

205288
const getDataElementValue = createGetDataElementValue(
206289
{
@@ -221,7 +304,7 @@ describe('function returned by createGetDataElementValue', () => {
221304
});
222305
});
223306

224-
test('throws an error when data element definition is not found', () => {
307+
test('throws an error when data element definition is not found', async () => {
225308
const getDataElementValue = createGetDataElementValue(
226309
{
227310
settings: {}
@@ -240,7 +323,7 @@ describe('function returned by createGetDataElementValue', () => {
240323
});
241324
});
242325

243-
test('throws an error when data element circular reference is detected', () => {
326+
test('throws an error when data element circular reference is detected', async () => {
244327
const getDataElementValue = createGetDataElementValue({
245328
settings: {
246329
foo: 'bar'
@@ -261,13 +344,13 @@ describe('function returned by createGetDataElementValue', () => {
261344
});
262345
});
263346

264-
test('provides access to getComponent method when it calls the data element module ', () => {
265-
const moduleProvider = {
347+
test('provides access to getComponent method when it calls the data element module ', async () => {
348+
const moduleProvider = createGetModuleProvider({
266349
getModuleExports:
267350
() =>
268351
({ utils: { getComponent } }) =>
269352
getComponent()
270-
};
353+
});
271354

272355
const getDataElementValue = createGetDataElementValue(
273356
{

src/constants.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
Copyright 2024 Adobe. All rights reserved.
3+
This file is licensed to you under the Apache License, Version 2.0 (the "License");
4+
you may not use this file except in compliance with the License. You may obtain a copy
5+
of the License at http://www.apache.org/licenses/LICENSE-2.0
6+
Unless required by applicable law or agreed to in writing, software distributed under
7+
the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
8+
OF ANY KIND, either express or implied. See the License for the specific language
9+
governing permissions and limitations under the License.
10+
*/
11+
12+
module.exports = { CORE: 'core' };

src/createGetDataElementValue.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,17 @@ governing permissions and limitations under the License.
1010
*/
1111

1212
const cleanTextFn = require('./cleanText');
13+
const constants = require('./constants');
14+
15+
const { CORE } = constants;
1316

1417
const enhanceErrorMessage = (dataElementName, e) => {
1518
e.message = `Failed to execute module for data element "${dataElementName}". ${e.message}`;
1619
};
1720

1821
module.exports =
1922
(moduleProvider, getDataElementDefinition) => (dataElementName, context) => {
20-
const { dataElementCallStack = [], arcAndUtils } = context;
23+
const { dataElementCallStack = [], arcAndUtils, env } = context;
2124
const { utils } = arcAndUtils;
2225

2326
const dataDef = getDataElementDefinition(dataElementName);
@@ -54,14 +57,23 @@ module.exports =
5457
} = dataDef;
5558

5659
const moduleExports = moduleProvider.getModuleExports(modulePath);
57-
const valuePromise = getSettings(context).then((settings) => {
60+
const moduleDefinition = moduleProvider.getModuleDefinition(modulePath);
61+
const { getSettings: getExtensionSettings = () => Promise.resolve({}) } =
62+
moduleProvider.getExtensionDefinition(modulePath);
63+
64+
const valuePromise = Promise.all([
65+
getSettings(context),
66+
getExtensionSettings(context)
67+
]).then(([settings, extensionSettings]) => {
5868
try {
5969
return moduleExports({
6070
...arcAndUtils,
6171
utils: {
6272
...utils,
6373
getSettings: () => settings,
64-
getComponent: () => ({ id, name })
74+
getExtensionSettings: () => extensionSettings,
75+
getComponent: () => ({ id, name }),
76+
getEnv: () => (moduleDefinition.extensionName === CORE ? env : {})
6577
}
6678
});
6779
} catch (e) {

src/executeRules.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,16 @@ module.exports = (
2424
container,
2525
globalFetch,
2626
callData,
27+
env,
2728
{ headersForSubrequests } = {}
2829
) => {
2930
const rulePromises = [];
3031

3132
const {
3233
rules = [],
33-
headerOverrides = [],
34-
logSensitiveTokens = [],
34+
35+
getHeaderOverrides = () => [],
36+
getLogSensitiveTokens = () => [],
3537
buildInfo
3638
} = container;
3739

@@ -40,11 +42,14 @@ module.exports = (
4042
rules.forEach((rule) => {
4143
const { id, name } = rule;
4244

43-
const logger = createNewLogger({ ruleId: rule.id }, logSensitiveTokens);
45+
const logger = createNewLogger(
46+
{ ruleId: rule.id },
47+
getLogSensitiveTokens(env)
48+
);
4449

4550
const fetch = getRuleFetchFn(
4651
globalFetch,
47-
headerOverrides,
52+
getHeaderOverrides(env),
4853
headersForSubrequests,
4954
logger
5055
);
@@ -57,6 +62,7 @@ module.exports = (
5762
};
5863

5964
const initialContext = {
65+
env,
6066
arcAndUtils: {
6167
utils,
6268
arc: {

0 commit comments

Comments
 (0)