Skip to content
This repository was archived by the owner on Sep 28, 2023. It is now read-only.

Commit 1e1477e

Browse files
Merge pull request #8 from optimizely/pnguen/add-variable-json-support
feat: Support getFeatureVariableJSON API
2 parents 477cb12 + ce77e99 commit 1e1477e

File tree

6 files changed

+69
-6
lines changed

6 files changed

+69
-6
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# vscode extension for Optimizely
22

3+
## Unreleased
4+
- Add new method `getFeatureVariableJSON` to support JSON feature variables.
5+
36
## 0.0.6
47
May 25, 2020
58
- Update README to mention minimum vscode version.

debugdialog.html

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<html>
22
<head>
3-
<script src="https://unpkg.com/@optimizely/optimizely-sdk@4.0/dist/optimizely.browser.umd.min.js"></script>
3+
<script src="https://unpkg.com/@optimizely/optimizely-sdk@4.1/dist/optimizely.browser.umd.min.js"></script>
44
<script>
55
var attributes = []
66
var attributeTableCount = 1
@@ -172,6 +172,18 @@
172172
return attributes
173173
}
174174

175+
function getFeatureVariableType(featureKey, variableKey) {
176+
let feature = optimizelyClientInstance.getOptimizelyConfig().featuresMap[featureKey];
177+
if (feature === undefined) {
178+
return null;
179+
}
180+
var vmap = feature.variablesMap
181+
if (vmap[variableKey] === undefined) {
182+
return null;
183+
}
184+
return vmap[variableKey].type;
185+
}
186+
175187
function run() {
176188
logs = []
177189
var logarea = document.getElementById('logsarea')
@@ -193,6 +205,9 @@
193205
break;
194206
case 'getFeatureVariable':
195207
response = optimizelyClientInstance.getFeatureVariable(key, variable, userid, attributes)
208+
if (getFeatureVariableType(key, variable) === "json") {
209+
response = JSON.stringify(response);
210+
}
196211
break;
197212
case 'getFeatureVariableString':
198213
response = optimizelyClientInstance.getFeatureVariableString(key, variable, userid, attributes)
@@ -206,6 +221,9 @@
206221
case 'getFeatureVariableDouble':
207222
response = optimizelyClientInstance.getFeatureVariableDouble(key, variable, userid, attributes)
208223
break;
224+
case 'getFeatureVariableJSON':
225+
response = JSON.stringify(optimizelyClientInstance.getFeatureVariableJSON(key, variable, userid, attributes))
226+
break;
209227
}
210228

211229
logs.forEach(log => {
@@ -315,6 +333,7 @@ <h2 class="w3-myfont">Optimizely Configuration Debug Dialog</h2>
315333
<option>getFeatureVariableInteger</option>
316334
<option>getFeatureVariableDouble</option>
317335
<option>getFeatureVariableBoolean</option>
336+
<option>getFeatureVariableJSON</option>
318337
</select>
319338
<select id="keys" onchange="changeKey()">
320339
</select>

src/optimizelyService.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,20 +55,23 @@ export class OptimizelyService {
5555

5656
}
5757

58-
allFeatureVariables(featureKey: string, filterByType: string): string[] {
58+
allFeatureVariables(featureKey: string, filterByTypeOrSubType: string): string[] {
5959
if (this.activeInstance != null) {
6060
const flag = this.getFeatureFlag(featureKey);
6161
if (flag != null) {
6262
var variables = new Array<string>()
6363
for (let v of flag.variables) {
64-
if (filterByType == 'all' || filterByType == v.type) {
64+
let type = v.type
65+
if (v.subType) {
66+
type = v.subType
67+
}
68+
if (filterByTypeOrSubType == 'all' || filterByTypeOrSubType == type) {
6569
variables.push(v.key)
6670
}
6771
}
6872
return variables;
6973
}
70-
}
71-
74+
}
7275
}
7376

7477
allFlags(): string[] {

src/providers.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const REGEX_D = /.*\.getFeatureVariableDouble\([\'\"][a-zA-Z0-9\_\-]+[\',\"], ?[
2424
const REGEX_I = /.*\.getFeatureVariableInteger\([\'\"][a-zA-Z0-9\_\-]+[\',\"], ?[\'\"]$/
2525
const REGEX_S = /.*\.getFeatureVariableString\([\'\"][a-zA-Z0-9\_\-]+[\',\"], ?[\'\"]$/
2626
const REGEX_B = /.*\.getFeatureVariableBoolean\([\'\"][a-zA-Z0-9\_\-]+[\',\"], ?[\'\"]$/
27+
const REGEX_J = /.*\.getFeatureVariableJSON\([\'\"][a-zA-Z0-9\_\-]+[\',\"], ?[\'\"]$/
2728
const OP_MODE_TS: vscode.DocumentFilter = {
2829
language: 'typescript',
2930
scheme: 'file',
@@ -250,7 +251,7 @@ class OptimizelyCompletionItemProvider implements vscode.CompletionItemProvider
250251
}
251252

252253
public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position): vscode.CompletionItem[] {
253-
254+
254255
if (this.optimizelyService == null) {
255256
console.log("optimizelyService is null")
256257
return undefined;
@@ -353,6 +354,22 @@ class OptimizelyCompletionItemProvider implements vscode.CompletionItemProvider
353354
});
354355
}
355356

357+
if (linePrefix.match(REGEX_J) != null) {
358+
var matchString = 'getFeatureVariableJSON(\''
359+
var matchDelim = '\''
360+
if (linePrefix.lastIndexOf(matchString) < 0) {
361+
matchString = 'getFeatureVariableJSON(\"'
362+
matchDelim = '\"'
363+
}
364+
let start = linePrefix.lastIndexOf(matchString) + matchString.length
365+
let end = linePrefix.indexOf(matchDelim, start)
366+
let featureKey = linePrefix.substring(start, end)
367+
const variables:string[] = this.optimizelyService.allFeatureVariables(featureKey, 'json');
368+
return variables.map(flag => {
369+
return new vscode.CompletionItem(flag, vscode.CompletionItemKind.Field);
370+
});
371+
}
372+
356373
return undefined;
357374
}
358375
}
@@ -379,6 +396,8 @@ const isFeatureApi = (linePrefix:string): boolean => {
379396
|| linePrefix.endsWith('getFeatureVariableString(\"')
380397
|| linePrefix.endsWith('getFeatureVariableBoolean(\'')
381398
|| linePrefix.endsWith('getFeatureVariableBoolean(\"')
399+
|| linePrefix.endsWith('getFeatureVariableJSON(\'')
400+
|| linePrefix.endsWith('getFeatureVariableJSON(\"')
382401
|| linePrefix.endsWith('<OptimizelyFeature feature=\"')
383402
|| linePrefix.endsWith('<OptimizelyFeature feature=\'')
384403
)
@@ -414,6 +433,9 @@ export function getFeatureRegEx(reg:string): RegExp {
414433
if (reg == 'getFeatureVariableDouble') {
415434
return REGEX_D
416435
}
436+
if (reg == 'getFeatureVariableJSON') {
437+
return REGEX_J
438+
}
417439

418440
return REGEX
419441
}

test/providers.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,20 @@ suite('provider utils tests', () => {
9797
expected: true,
9898
line: 9,
9999
char: 1
100+
},
101+
{
102+
name: "getFeatureVariableJSON",
103+
testname: "getFeatureVariableJSON-singleQuote",
104+
expected: true,
105+
line: 10,
106+
char: 1
107+
},
108+
{
109+
name: "getFeatureVariableJSON",
110+
testname: "getFeatureVariableJSON-doubleQuote",
111+
expected: true,
112+
line: 11,
113+
char: 1
100114
}
101115
];
102116

test/test.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,5 @@ something.getFeatureVariableInteger('someFlagKey', '
88
something.getFeatureVariableInteger("someFlagKey", "
99
something.getFeatureVariableBoolean('someFlagKey', '
1010
something.getFeatureVariableBoolean("someFlagKey", "
11+
something.getFeatureVariableJSON('someFlagKey', '
12+
something.getFeatureVariableJSON("someFlagKey", "

0 commit comments

Comments
 (0)