@storybook/telemetry 6.5.0-beta.2

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.
Files changed (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/cjs/anonymous-id.js +49 -0
  4. package/dist/cjs/get-monorepo-type.js +55 -0
  5. package/dist/cjs/index.js +130 -0
  6. package/dist/cjs/notify.js +72 -0
  7. package/dist/cjs/one-way-hash.js +21 -0
  8. package/dist/cjs/package-versions.js +95 -0
  9. package/dist/cjs/sanitize.js +57 -0
  10. package/dist/cjs/storybook-metadata.js +346 -0
  11. package/dist/cjs/telemetry.js +150 -0
  12. package/dist/cjs/types.js +5 -0
  13. package/dist/esm/anonymous-id.js +29 -0
  14. package/dist/esm/get-monorepo-type.js +34 -0
  15. package/dist/esm/index.js +94 -0
  16. package/dist/esm/notify.js +54 -0
  17. package/dist/esm/one-way-hash.js +11 -0
  18. package/dist/esm/package-versions.js +72 -0
  19. package/dist/esm/sanitize.js +42 -0
  20. package/dist/esm/storybook-metadata.js +304 -0
  21. package/dist/esm/telemetry.js +127 -0
  22. package/dist/esm/types.js +1 -0
  23. package/dist/modern/anonymous-id.js +27 -0
  24. package/dist/modern/get-monorepo-type.js +30 -0
  25. package/dist/modern/index.js +39 -0
  26. package/dist/modern/notify.js +22 -0
  27. package/dist/modern/one-way-hash.js +11 -0
  28. package/dist/modern/package-versions.js +21 -0
  29. package/dist/modern/sanitize.js +32 -0
  30. package/dist/modern/storybook-metadata.js +188 -0
  31. package/dist/modern/telemetry.js +66 -0
  32. package/dist/modern/types.js +1 -0
  33. package/dist/ts3.4/anonymous-id.d.ts +1 -0
  34. package/dist/ts3.4/get-monorepo-type.d.ts +9 -0
  35. package/dist/ts3.4/index.d.ts +3 -0
  36. package/dist/ts3.4/notify.d.ts +1 -0
  37. package/dist/ts3.4/one-way-hash.d.ts +2 -0
  38. package/dist/ts3.4/package-versions.d.ts +9 -0
  39. package/dist/ts3.4/sanitize.d.ts +8 -0
  40. package/dist/ts3.4/storybook-metadata.d.ts +8 -0
  41. package/dist/ts3.4/telemetry.d.ts +2 -0
  42. package/dist/ts3.4/types.d.ts +56 -0
  43. package/dist/ts3.9/anonymous-id.d.ts +1 -0
  44. package/dist/ts3.9/get-monorepo-type.d.ts +9 -0
  45. package/dist/ts3.9/index.d.ts +3 -0
  46. package/dist/ts3.9/notify.d.ts +1 -0
  47. package/dist/ts3.9/one-way-hash.d.ts +2 -0
  48. package/dist/ts3.9/package-versions.d.ts +9 -0
  49. package/dist/ts3.9/sanitize.d.ts +8 -0
  50. package/dist/ts3.9/storybook-metadata.d.ts +8 -0
  51. package/dist/ts3.9/telemetry.d.ts +2 -0
  52. package/dist/ts3.9/types.d.ts +56 -0
  53. package/package.json +61 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Kadira Inc. <hello@kadira.io>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # Storybook Telemetry
2
+
3
+ Storybook collects completely anonymous telemetry data about general usage. Participation in this program is optional and it’s easy to opt-out.
4
+
5
+ For more information visit: [storybook.js.org/telemetry](https://storybook.js.org/telemetry)
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getAnonymousProjectId = void 0;
7
+
8
+ require("core-js/modules/es.array.concat.js");
9
+
10
+ require("core-js/modules/es.string.trim.js");
11
+
12
+ var _path = _interopRequireDefault(require("path"));
13
+
14
+ var _child_process = require("child_process");
15
+
16
+ var _coreCommon = require("@storybook/core-common");
17
+
18
+ var _oneWayHash = require("./one-way-hash");
19
+
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+
22
+ var anonymousProjectId;
23
+
24
+ var getAnonymousProjectId = function getAnonymousProjectId() {
25
+ if (anonymousProjectId) {
26
+ return anonymousProjectId;
27
+ }
28
+
29
+ var unhashedProjectId;
30
+
31
+ try {
32
+ var projectRoot = (0, _coreCommon.getProjectRoot)();
33
+
34
+ var projectRootPath = _path.default.relative(projectRoot, process.cwd());
35
+
36
+ var originBuffer = (0, _child_process.execSync)("git config --local --get remote.origin.url", {
37
+ timeout: 1000,
38
+ stdio: "pipe"
39
+ }); // we use a combination of remoteUrl and working directory
40
+ // to separate multiple storybooks from the same project (e.g. monorepo)
41
+
42
+ unhashedProjectId = "".concat(String(originBuffer).trim()).concat(projectRootPath); // eslint-disable-next-line no-empty
43
+ } catch (_) {}
44
+
45
+ anonymousProjectId = (0, _oneWayHash.oneWayHash)(unhashedProjectId);
46
+ return anonymousProjectId;
47
+ };
48
+
49
+ exports.getAnonymousProjectId = getAnonymousProjectId;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.monorepoConfigs = exports.getMonorepoType = void 0;
7
+
8
+ require("core-js/modules/es.array.find.js");
9
+
10
+ require("core-js/modules/es.object.to-string.js");
11
+
12
+ require("core-js/modules/es.object.keys.js");
13
+
14
+ require("core-js/modules/es.array.join.js");
15
+
16
+ var _fsExtra = _interopRequireDefault(require("fs-extra"));
17
+
18
+ var _path = _interopRequireDefault(require("path"));
19
+
20
+ var _coreCommon = require("@storybook/core-common");
21
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
24
+ var monorepoConfigs = {
25
+ Nx: 'nx.json',
26
+ Turborepo: 'turbo.json',
27
+ Lerna: 'lerna.json',
28
+ Rush: 'rush.json',
29
+ Lage: 'lage.config.json'
30
+ };
31
+ exports.monorepoConfigs = monorepoConfigs;
32
+
33
+ var getMonorepoType = function getMonorepoType() {
34
+ var projectRootPath = (0, _coreCommon.getProjectRoot)();
35
+ if (!projectRootPath) return undefined;
36
+ var monorepoType = Object.keys(monorepoConfigs).find(function (monorepo) {
37
+ var configFile = _path.default.join(projectRootPath, monorepoConfigs[monorepo]);
38
+
39
+ return _fsExtra.default.existsSync(configFile);
40
+ });
41
+
42
+ if (monorepoType) {
43
+ return monorepoType;
44
+ }
45
+
46
+ var packageJson = _fsExtra.default.readJsonSync(_path.default.join(projectRootPath, 'package.json'));
47
+
48
+ if (packageJson !== null && packageJson !== void 0 && packageJson.workspaces) {
49
+ return 'Workspaces';
50
+ }
51
+
52
+ return undefined;
53
+ };
54
+
55
+ exports.getMonorepoType = getMonorepoType;
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/web.dom-collections.for-each.js");
4
+
5
+ require("core-js/modules/es.object.keys.js");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ var _exportNames = {
11
+ telemetry: true
12
+ };
13
+ exports.telemetry = void 0;
14
+
15
+ require("core-js/modules/es.object.to-string.js");
16
+
17
+ require("core-js/modules/es.promise.js");
18
+
19
+ require("regenerator-runtime/runtime.js");
20
+
21
+ var _clientLogger = require("@storybook/client-logger");
22
+
23
+ var _storybookMetadata = require("./storybook-metadata");
24
+
25
+ Object.keys(_storybookMetadata).forEach(function (key) {
26
+ if (key === "default" || key === "__esModule") return;
27
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
28
+ if (key in exports && exports[key] === _storybookMetadata[key]) return;
29
+ Object.defineProperty(exports, key, {
30
+ enumerable: true,
31
+ get: function get() {
32
+ return _storybookMetadata[key];
33
+ }
34
+ });
35
+ });
36
+
37
+ var _telemetry = require("./telemetry");
38
+
39
+ var _notify = require("./notify");
40
+
41
+ var _sanitize = require("./sanitize");
42
+
43
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
44
+
45
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
46
+
47
+ var telemetry = /*#__PURE__*/function () {
48
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(eventType) {
49
+ var payload,
50
+ options,
51
+ telemetryData,
52
+ error,
53
+ _process$env,
54
+ _args = arguments;
55
+
56
+ return regeneratorRuntime.wrap(function _callee$(_context) {
57
+ while (1) {
58
+ switch (_context.prev = _context.next) {
59
+ case 0:
60
+ payload = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};
61
+ options = _args.length > 2 ? _args[2] : undefined;
62
+ _context.next = 4;
63
+ return (0, _notify.notify)();
64
+
65
+ case 4:
66
+ telemetryData = {
67
+ eventType: eventType,
68
+ payload: payload
69
+ };
70
+ _context.prev = 5;
71
+ _context.next = 8;
72
+ return (0, _storybookMetadata.getStorybookMetadata)(options.configDir);
73
+
74
+ case 8:
75
+ telemetryData.metadata = _context.sent;
76
+ _context.next = 14;
77
+ break;
78
+
79
+ case 11:
80
+ _context.prev = 11;
81
+ _context.t0 = _context["catch"](5);
82
+ if (!telemetryData.payload.error) telemetryData.payload.error = _context.t0;
83
+
84
+ case 14:
85
+ _context.prev = 14;
86
+ error = telemetryData.payload.error;
87
+
88
+ if (error) {
89
+ // make sure to anonymise possible paths from error messages
90
+ telemetryData.payload.error = (0, _sanitize.sanitizeError)(error);
91
+ }
92
+
93
+ if (!(!telemetryData.payload.error || options.enableCrashReports)) {
94
+ _context.next = 25;
95
+ break;
96
+ }
97
+
98
+ if (!((_process$env = process.env) !== null && _process$env !== void 0 && _process$env.STORYBOOK_DEBUG_TELEMETRY)) {
99
+ _context.next = 23;
100
+ break;
101
+ }
102
+
103
+ _clientLogger.logger.info('\n[telemetry]');
104
+
105
+ _clientLogger.logger.info(JSON.stringify(telemetryData, null, 2));
106
+
107
+ _context.next = 25;
108
+ break;
109
+
110
+ case 23:
111
+ _context.next = 25;
112
+ return (0, _telemetry.sendTelemetry)(telemetryData, options);
113
+
114
+ case 25:
115
+ return _context.finish(14);
116
+
117
+ case 26:
118
+ case "end":
119
+ return _context.stop();
120
+ }
121
+ }
122
+ }, _callee, null, [[5, 11, 14, 26]]);
123
+ }));
124
+
125
+ return function telemetry(_x) {
126
+ return _ref.apply(this, arguments);
127
+ };
128
+ }();
129
+
130
+ exports.telemetry = telemetry;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.notify = void 0;
7
+
8
+ require("regenerator-runtime/runtime.js");
9
+
10
+ require("core-js/modules/es.string.bold.js");
11
+
12
+ require("core-js/modules/es.object.to-string.js");
13
+
14
+ require("core-js/modules/es.promise.js");
15
+
16
+ var _chalk = _interopRequireDefault(require("chalk"));
17
+
18
+ var _coreCommon = require("@storybook/core-common");
19
+
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+
22
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
23
+
24
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
25
+
26
+ var TELEMETRY_KEY_NOTIFY_DATE = 'telemetry-notification-date';
27
+ var logger = console;
28
+
29
+ var notify = /*#__PURE__*/function () {
30
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
31
+ var telemetryNotifyDate;
32
+ return regeneratorRuntime.wrap(function _callee$(_context) {
33
+ while (1) {
34
+ switch (_context.prev = _context.next) {
35
+ case 0:
36
+ _context.next = 2;
37
+ return _coreCommon.cache.get(TELEMETRY_KEY_NOTIFY_DATE, null);
38
+
39
+ case 2:
40
+ telemetryNotifyDate = _context.sent;
41
+
42
+ if (!telemetryNotifyDate) {
43
+ _context.next = 5;
44
+ break;
45
+ }
46
+
47
+ return _context.abrupt("return");
48
+
49
+ case 5:
50
+ _coreCommon.cache.set(TELEMETRY_KEY_NOTIFY_DATE, Date.now());
51
+
52
+ logger.log();
53
+ logger.log("".concat(_chalk.default.magenta.bold('attention'), " => Storybook now collects completely anonymous telemetry regarding usage."));
54
+ logger.log("This information is used to shape Storybook's roadmap and prioritize features.");
55
+ logger.log("You can learn more, including how to opt-out if you'd not like to participate in this anonymous program, by visiting the following URL:");
56
+ logger.log(_chalk.default.cyan('https://storybook.js.org/telemetry'));
57
+ logger.log();
58
+
59
+ case 12:
60
+ case "end":
61
+ return _context.stop();
62
+ }
63
+ }
64
+ }, _callee);
65
+ }));
66
+
67
+ return function notify() {
68
+ return _ref.apply(this, arguments);
69
+ };
70
+ }();
71
+
72
+ exports.notify = notify;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.oneWayHash = void 0;
7
+
8
+ var _crypto = require("crypto");
9
+
10
+ var oneWayHash = function oneWayHash(payload) {
11
+ var hash = (0, _crypto.createHash)('sha256'); // Always prepend the payload value with salt. This ensures the hash is truly
12
+ // one-way.
13
+
14
+ hash.update('storybook-telemetry-salt'); // Update is an append operation, not a replacement. The salt from the prior
15
+ // update is still present!
16
+
17
+ hash.update(payload);
18
+ return hash.digest('hex');
19
+ };
20
+
21
+ exports.oneWayHash = oneWayHash;
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getActualPackageVersions = exports.getActualPackageVersion = void 0;
7
+
8
+ require("regenerator-runtime/runtime.js");
9
+
10
+ require("core-js/modules/es.object.keys.js");
11
+
12
+ require("core-js/modules/es.array.iterator.js");
13
+
14
+ require("core-js/modules/es.object.to-string.js");
15
+
16
+ require("core-js/modules/es.promise.js");
17
+
18
+ require("core-js/modules/es.string.iterator.js");
19
+
20
+ require("core-js/modules/web.dom-collections.iterator.js");
21
+
22
+ require("core-js/modules/es.array.map.js");
23
+
24
+ require("core-js/modules/es.array.join.js");
25
+
26
+ var _path = _interopRequireDefault(require("path"));
27
+
28
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
+
30
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
31
+
32
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
33
+
34
+ var getActualPackageVersions = /*#__PURE__*/function () {
35
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(packages) {
36
+ var packageNames;
37
+ return regeneratorRuntime.wrap(function _callee$(_context) {
38
+ while (1) {
39
+ switch (_context.prev = _context.next) {
40
+ case 0:
41
+ packageNames = Object.keys(packages);
42
+ return _context.abrupt("return", Promise.all(packageNames.map(getActualPackageVersion)));
43
+
44
+ case 2:
45
+ case "end":
46
+ return _context.stop();
47
+ }
48
+ }
49
+ }, _callee);
50
+ }));
51
+
52
+ return function getActualPackageVersions(_x) {
53
+ return _ref.apply(this, arguments);
54
+ };
55
+ }();
56
+
57
+ exports.getActualPackageVersions = getActualPackageVersions;
58
+
59
+ var getActualPackageVersion = /*#__PURE__*/function () {
60
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(packageName) {
61
+ var packageJson;
62
+ return regeneratorRuntime.wrap(function _callee2$(_context2) {
63
+ while (1) {
64
+ switch (_context2.prev = _context2.next) {
65
+ case 0:
66
+ _context2.prev = 0;
67
+ // eslint-disable-next-line import/no-dynamic-require,global-require
68
+ packageJson = require(_path.default.join(packageName, 'package.json'));
69
+ return _context2.abrupt("return", {
70
+ name: packageName,
71
+ version: packageJson.version
72
+ });
73
+
74
+ case 5:
75
+ _context2.prev = 5;
76
+ _context2.t0 = _context2["catch"](0);
77
+ return _context2.abrupt("return", {
78
+ name: packageName,
79
+ version: null
80
+ });
81
+
82
+ case 8:
83
+ case "end":
84
+ return _context2.stop();
85
+ }
86
+ }
87
+ }, _callee2, null, [[0, 5]]);
88
+ }));
89
+
90
+ return function getActualPackageVersion(_x2) {
91
+ return _ref2.apply(this, arguments);
92
+ };
93
+ }();
94
+
95
+ exports.getActualPackageVersion = getActualPackageVersion;
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.cleanPaths = cleanPaths;
7
+ exports.sanitizeError = sanitizeError;
8
+
9
+ require("core-js/modules/es.regexp.exec.js");
10
+
11
+ require("core-js/modules/es.string.replace.js");
12
+
13
+ require("core-js/modules/es.string.split.js");
14
+
15
+ require("core-js/modules/es.array.join.js");
16
+
17
+ require("core-js/modules/es.regexp.constructor.js");
18
+
19
+ require("core-js/modules/es.regexp.to-string.js");
20
+
21
+ require("core-js/modules/es.object.get-own-property-names.js");
22
+
23
+ var _path = require("path");
24
+
25
+ /* eslint-disable no-param-reassign */
26
+ // Removes all user paths
27
+ function regexpEscape(str) {
28
+ return str.replace(/[-[/{}()*+?.\\^$|]/g, "\\$&");
29
+ }
30
+
31
+ function cleanPaths(str) {
32
+ var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _path.sep;
33
+ if (!str) return str;
34
+ var stack = process.cwd().split(separator);
35
+
36
+ while (stack.length > 1) {
37
+ var currentPath = stack.join(separator);
38
+ var currentRegex = new RegExp(regexpEscape(currentPath), "g");
39
+ str = str.replace(currentRegex, "$SNIP");
40
+ var currentPath2 = stack.join(separator + separator);
41
+ var currentRegex2 = new RegExp(regexpEscape(currentPath2), "g");
42
+ str = str.replace(currentRegex2, "$SNIP");
43
+ stack.pop();
44
+ }
45
+
46
+ return str;
47
+ } // Takes an Error and returns a sanitized JSON String
48
+
49
+
50
+ function sanitizeError(error) {
51
+ var pathSeparator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _path.sep;
52
+ // Hack because Node
53
+ error = JSON.parse(JSON.stringify(error, Object.getOwnPropertyNames(error))); // Removes all user paths
54
+
55
+ var errorString = cleanPaths(JSON.stringify(error), pathSeparator);
56
+ return JSON.parse(errorString);
57
+ }