@codecademy/codebytes 0.6.1 → 0.6.3-alpha.e74dd5.0
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/CHANGELOG.md +16 -0
- package/dist/MonacoEditor/colorsDark.d.ts +32 -0
- package/{src/MonacoEditor/colorsDark.ts → dist/MonacoEditor/colorsDark.js} +8 -16
- package/dist/MonacoEditor/index.d.ts +7 -0
- package/dist/MonacoEditor/index.js +42 -0
- package/dist/MonacoEditor/theme.d.ts +2 -0
- package/dist/MonacoEditor/theme.js +122 -0
- package/dist/MonacoEditor/types.d.ts +1 -0
- package/dist/MonacoEditor/types.js +0 -0
- package/dist/__tests__/codebyte-test.d.ts +1 -0
- package/dist/__tests__/codebyte-test.js +195 -0
- package/dist/__tests__/editor-test.d.ts +1 -0
- package/dist/__tests__/editor-test.js +147 -0
- package/dist/__tests__/helpers-test.d.ts +1 -0
- package/dist/__tests__/helpers-test.js +117 -0
- package/dist/__tests__/language-selection-test.d.ts +1 -0
- package/dist/__tests__/language-selection-test.js +15 -0
- package/dist/__tests__/mocks.d.ts +0 -0
- package/dist/__tests__/mocks.js +13 -0
- package/dist/api.d.ts +12 -0
- package/dist/api.js +39 -0
- package/dist/codeByteEditor.d.ts +13 -0
- package/dist/codeByteEditor.js +134 -0
- package/dist/consts.d.ts +23 -0
- package/dist/consts.js +34 -0
- package/dist/drawers.d.ts +6 -0
- package/dist/drawers.js +148 -0
- package/dist/editor.d.ts +13 -0
- package/dist/editor.js +189 -0
- package/dist/helpers/index.d.ts +15 -0
- package/dist/helpers/index.js +29 -0
- package/{src/index.ts → dist/index.d.ts} +0 -0
- package/dist/index.js +2 -0
- package/dist/languageSelection.d.ts +6 -0
- package/dist/languageSelection.js +22 -0
- package/dist/libs/eventTracking.d.ts +1 -0
- package/dist/libs/eventTracking.js +11 -0
- package/{src → dist}/theme.d.ts +0 -0
- package/dist/types.d.ts +14 -0
- package/dist/types.js +0 -0
- package/package.json +7 -3
- package/babel.config.js +0 -15
- package/jest.config.js +0 -1
- package/src/MonacoEditor/index.tsx +0 -56
- package/src/MonacoEditor/theme.ts +0 -64
- package/src/MonacoEditor/types.ts +0 -1
- package/src/__tests__/codebyte-test.tsx +0 -197
- package/src/__tests__/editor-test.tsx +0 -113
- package/src/__tests__/helpers-test.tsx +0 -121
- package/src/__tests__/language-selection-test.tsx +0 -14
- package/src/__tests__/mocks.ts +0 -8
- package/src/api.ts +0 -28
- package/src/codeByteEditor.tsx +0 -118
- package/src/consts.ts +0 -64
- package/src/drawers.tsx +0 -132
- package/src/editor.tsx +0 -160
- package/src/helpers/index.ts +0 -41
- package/src/languageSelection.tsx +0 -26
- package/src/libs/eventTracking.ts +0 -18
- package/src/types.ts +0 -15
- package/tsconfig.json +0 -8
package/dist/editor.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
2
|
+
import _styled from "@emotion/styled/base";
|
|
3
|
+
|
|
4
|
+
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); } }
|
|
5
|
+
|
|
6
|
+
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); }); }; }
|
|
7
|
+
|
|
8
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
9
|
+
|
|
10
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
11
|
+
|
|
12
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
13
|
+
|
|
14
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
15
|
+
|
|
16
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
17
|
+
|
|
18
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
19
|
+
|
|
20
|
+
function _EMOTION_STRINGIFIED_CSS_ERROR__() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
|
|
21
|
+
|
|
22
|
+
import { FillButton, FlexBox, Spinner, TextButton, ToolTip } from '@codecademy/gamut';
|
|
23
|
+
import { CopyIcon } from '@codecademy/gamut-icons';
|
|
24
|
+
import React, { useState } from 'react';
|
|
25
|
+
import { postSnippet } from './api';
|
|
26
|
+
import { Drawers } from './drawers';
|
|
27
|
+
import { trackClick } from './helpers';
|
|
28
|
+
import { SimpleMonacoEditor } from './MonacoEditor';
|
|
29
|
+
|
|
30
|
+
var Output = _styled("pre", {
|
|
31
|
+
target: "e1lzxy8e1",
|
|
32
|
+
label: "Output"
|
|
33
|
+
})("width:100%;height:100%;margin:0;padding:0 1rem;font-family:Monaco;font-size:0.875rem;overflow:auto;", function (_ref) {
|
|
34
|
+
var hasError = _ref.hasError,
|
|
35
|
+
theme = _ref.theme;
|
|
36
|
+
return "\n color: ".concat(hasError ? theme.colors.orange : theme.colors.white, ";\n background-color: ").concat(theme.colors['navy-900'], ";\n");
|
|
37
|
+
}, ";" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9lZGl0b3IudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWtCZ0QiLCJmaWxlIjoiLi4vc3JjL2VkaXRvci50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBGaWxsQnV0dG9uLFxuICBGbGV4Qm94LFxuICBTcGlubmVyLFxuICBUZXh0QnV0dG9uLFxuICBUb29sVGlwLFxufSBmcm9tICdAY29kZWNhZGVteS9nYW11dCc7XG5pbXBvcnQgeyBDb3B5SWNvbiB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0LWljb25zJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcbmltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgcG9zdFNuaXBwZXQgfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgdHlwZSB7IExhbmd1YWdlT3B0aW9uIH0gZnJvbSAnLi9jb25zdHMnO1xuaW1wb3J0IHsgRHJhd2VycyB9IGZyb20gJy4vZHJhd2Vycyc7XG5pbXBvcnQgeyB0cmFja0NsaWNrIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IFNpbXBsZU1vbmFjb0VkaXRvciB9IGZyb20gJy4vTW9uYWNvRWRpdG9yJztcbmltcG9ydCB7IENvZGVieXRlc0NoYW5nZUhhbmRsZXIgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgT3V0cHV0ID0gc3R5bGVkLnByZTx7IGhhc0Vycm9yOiBib29sZWFuIH0+YFxuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDAgMXJlbTtcbiAgZm9udC1mYW1pbHk6IE1vbmFjbztcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gICR7KHsgaGFzRXJyb3IsIHRoZW1lIH0pID0+IGBcbiAgY29sb3I6ICR7aGFzRXJyb3IgPyB0aGVtZS5jb2xvcnMub3JhbmdlIDogdGhlbWUuY29sb3JzLndoaXRlfTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHt0aGVtZS5jb2xvcnNbJ25hdnktOTAwJ119O1xuYH1cbmA7XG5cbmNvbnN0IENvcHlJY29uU3R5bGVkID0gc3R5bGVkKENvcHlJY29uKWBcbiAgbWFyZ2luLXJpZ2h0OiAwLjVyZW07XG5gO1xuXG5jb25zdCBET0NLRVJfU0lHVEVSTSA9IDE0MztcblxudHlwZSBFZGl0b3JQcm9wcyA9IHtcbiAgaGlkZUNvcHlCdXR0b246IGJvb2xlYW47XG4gIGxhbmd1YWdlOiBMYW5ndWFnZU9wdGlvbjtcbiAgdGV4dDogc3RyaW5nO1xuICBvbkNoYW5nZTogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgc25pcHBldHNCYXNlVXJsPzogc3RyaW5nO1xuICBvbkNvcHk/OiBDb2RlYnl0ZXNDaGFuZ2VIYW5kbGVyO1xufTtcblxuZXhwb3J0IGNvbnN0IEVkaXRvcjogUmVhY3QuRkM8RWRpdG9yUHJvcHM+ID0gKHtcbiAgbGFuZ3VhZ2UsXG4gIHRleHQsXG4gIGhpZGVDb3B5QnV0dG9uLFxuICBvbkNoYW5nZSxcbiAgb25Db3B5LFxuICBzbmlwcGV0c0Jhc2VVcmwsXG59KSA9PiB7XG4gIGNvbnN0IFtvdXRwdXQsIHNldE91dHB1dF0gPSB1c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IFtzdGF0dXMsIHNldFN0YXR1c10gPSB1c2VTdGF0ZTwncmVhZHknIHwgJ3dhaXRpbmcnIHwgJ2Vycm9yJz4oJ3JlYWR5Jyk7XG4gIGNvbnN0IFtpc0NvZGVCeXRlQ29waWVkLCBzZXRJc0NvZGVCeXRlQ29waWVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3Qgb25Db3B5Q2xpY2sgPSAoKSA9PiB7XG4gICAgaWYgKCFpc0NvZGVCeXRlQ29waWVkKSB7XG4gICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkXG4gICAgICAgIC53cml0ZVRleHQodGV4dClcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgLmNhdGNoKCgpID0+IGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjb3B5JykpO1xuICAgICAgc2V0SXNDb2RlQnl0ZUNvcGllZCh0cnVlKTtcbiAgICAgIG9uQ29weT8uKHRleHQsIGxhbmd1YWdlKTtcbiAgICAgIHRyYWNrQ2xpY2soJ2NvcHknKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2V0RXJyb3JTdGF0dXNBbmRPdXRwdXQgPSAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgc2V0T3V0cHV0KG1lc3NhZ2UpO1xuICAgIHNldFN0YXR1cygnZXJyb3InKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdWJtaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHRleHQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbGFuZ3VhZ2UsXG4gICAgICBjb2RlOiB0ZXh0LFxuICAgIH07XG4gICAgc2V0U3RhdHVzKCd3YWl0aW5nJyk7XG4gICAgc2V0T3V0cHV0KCcnKTtcbiAgICB0cmFja0NsaWNrKCdydW4nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RTbmlwcGV0KGRhdGEsIHNuaXBwZXRzQmFzZVVybCk7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RkZXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2V0RXJyb3JTdGF0dXNBbmRPdXRwdXQocmVzcG9uc2Uuc3RkZXJyKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuZXhpdF9jb2RlID09PSBET0NLRVJfU0lHVEVSTSkge1xuICAgICAgICBzZXRFcnJvclN0YXR1c0FuZE91dHB1dChcbiAgICAgICAgICAnWW91ciBjb2RlIHRvb2sgdG9vIGxvbmcgdG8gcmV0dXJuIGEgcmVzdWx0LiBEb3VibGUgY2hlY2sgeW91ciBjb2RlIGZvciBhbnkgaXNzdWVzIGFuZCB0cnkgYWdhaW4hJ1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5leGl0X2NvZGUgIT09IDApIHtcbiAgICAgICAgc2V0RXJyb3JTdGF0dXNBbmRPdXRwdXQoJ0FuIHVua25vd24gZXJyb3Igb2NjdXJlZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldE91dHB1dChyZXNwb25zZS5zdGRvdXQpO1xuICAgICAgICBzZXRTdGF0dXMoJ3JlYWR5Jyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldEVycm9yU3RhdHVzQW5kT3V0cHV0KCdFcnJvcjogJyArIGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPERyYXdlcnNcbiAgICAgICAgbGVmdENoaWxkPXtcbiAgICAgICAgICA8U2ltcGxlTW9uYWNvRWRpdG9yXG4gICAgICAgICAgICB2YWx1ZT17dGV4dH1cbiAgICAgICAgICAgIGxhbmd1YWdlPXtsYW5ndWFnZX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICAgIHJpZ2h0Q2hpbGQ9e1xuICAgICAgICAgIDxPdXRwdXQgaGFzRXJyb3I9e3N0YXR1cyA9PT0gJ2Vycm9yJ30gYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgICAgICAgICB7b3V0cHV0fVxuICAgICAgICAgIDwvT3V0cHV0PlxuICAgICAgICB9XG4gICAgICAvPlxuICAgICAgPEZsZXhCb3hcbiAgICAgICAganVzdGlmeUNvbnRlbnQ9e2hpZGVDb3B5QnV0dG9uID8gJ2ZsZXgtZW5kJyA6ICdzcGFjZS1iZXR3ZWVuJ31cbiAgICAgICAgcGw9ezh9XG4gICAgICA+XG4gICAgICAgIHshaGlkZUNvcHlCdXR0b24gPyAoXG4gICAgICAgICAgPFRvb2xUaXBcbiAgICAgICAgICAgIGlkPVwiY29kZWJ5dGUtY29waWVkXCJcbiAgICAgICAgICAgIGFsaWdubWVudD1cInRvcC1yaWdodFwiXG4gICAgICAgICAgICBtb2RlPVwiZGFya1wiXG4gICAgICAgICAgICB0YXJnZXQ9e1xuICAgICAgICAgICAgICA8VGV4dEJ1dHRvblxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ29weUNsaWNrfVxuICAgICAgICAgICAgICAgIG9uQmx1cj17KCkgPT4gc2V0SXNDb2RlQnl0ZUNvcGllZChmYWxzZSl9XG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJjb3B5LWNvZGVieXRlLWJ0blwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Q29weUljb25TdHlsZWQgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz4gQ29weSBDb2RlYnl0ZVxuICAgICAgICAgICAgICA8L1RleHRCdXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2lzQ29kZUJ5dGVDb3BpZWQgPyAoXG4gICAgICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiY29weS1jb25maXJtYXRpb24tdG9vbHRpcFwiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgICAgIENvcGllZCFcbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJjb3B5LXByb21wdC10b29sdGlwXCI+XG4gICAgICAgICAgICAgICAgQ29weSB0byB5b3VyIGNsaXBib2FyZFxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvVG9vbFRpcD5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDxGaWxsQnV0dG9uIG9uQ2xpY2s9e2hhbmRsZVN1Ym1pdH0+XG4gICAgICAgICAge3N0YXR1cyA9PT0gJ3dhaXRpbmcnID8gPFNwaW5uZXIgLz4gOiAnUnVuJ31cbiAgICAgICAgPC9GaWxsQnV0dG9uPlxuICAgICAgPC9GbGV4Qm94PlxuICAgIDwvPlxuICApO1xufTtcbiJdfQ== */"));
|
|
38
|
+
|
|
39
|
+
var CopyIconStyled = /*#__PURE__*/_styled(CopyIcon, {
|
|
40
|
+
target: "e1lzxy8e0",
|
|
41
|
+
label: "CopyIconStyled"
|
|
42
|
+
})(process.env.NODE_ENV === "production" ? {
|
|
43
|
+
name: "u7ytkp",
|
|
44
|
+
styles: "margin-right:0.5rem"
|
|
45
|
+
} : {
|
|
46
|
+
name: "u7ytkp",
|
|
47
|
+
styles: "margin-right:0.5rem",
|
|
48
|
+
map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9lZGl0b3IudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWdDdUMiLCJmaWxlIjoiLi4vc3JjL2VkaXRvci50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBGaWxsQnV0dG9uLFxuICBGbGV4Qm94LFxuICBTcGlubmVyLFxuICBUZXh0QnV0dG9uLFxuICBUb29sVGlwLFxufSBmcm9tICdAY29kZWNhZGVteS9nYW11dCc7XG5pbXBvcnQgeyBDb3B5SWNvbiB9IGZyb20gJ0Bjb2RlY2FkZW15L2dhbXV0LWljb25zJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcbmltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgcG9zdFNuaXBwZXQgfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgdHlwZSB7IExhbmd1YWdlT3B0aW9uIH0gZnJvbSAnLi9jb25zdHMnO1xuaW1wb3J0IHsgRHJhd2VycyB9IGZyb20gJy4vZHJhd2Vycyc7XG5pbXBvcnQgeyB0cmFja0NsaWNrIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IFNpbXBsZU1vbmFjb0VkaXRvciB9IGZyb20gJy4vTW9uYWNvRWRpdG9yJztcbmltcG9ydCB7IENvZGVieXRlc0NoYW5nZUhhbmRsZXIgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgT3V0cHV0ID0gc3R5bGVkLnByZTx7IGhhc0Vycm9yOiBib29sZWFuIH0+YFxuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDAgMXJlbTtcbiAgZm9udC1mYW1pbHk6IE1vbmFjbztcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gICR7KHsgaGFzRXJyb3IsIHRoZW1lIH0pID0+IGBcbiAgY29sb3I6ICR7aGFzRXJyb3IgPyB0aGVtZS5jb2xvcnMub3JhbmdlIDogdGhlbWUuY29sb3JzLndoaXRlfTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHt0aGVtZS5jb2xvcnNbJ25hdnktOTAwJ119O1xuYH1cbmA7XG5cbmNvbnN0IENvcHlJY29uU3R5bGVkID0gc3R5bGVkKENvcHlJY29uKWBcbiAgbWFyZ2luLXJpZ2h0OiAwLjVyZW07XG5gO1xuXG5jb25zdCBET0NLRVJfU0lHVEVSTSA9IDE0MztcblxudHlwZSBFZGl0b3JQcm9wcyA9IHtcbiAgaGlkZUNvcHlCdXR0b246IGJvb2xlYW47XG4gIGxhbmd1YWdlOiBMYW5ndWFnZU9wdGlvbjtcbiAgdGV4dDogc3RyaW5nO1xuICBvbkNoYW5nZTogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgc25pcHBldHNCYXNlVXJsPzogc3RyaW5nO1xuICBvbkNvcHk/OiBDb2RlYnl0ZXNDaGFuZ2VIYW5kbGVyO1xufTtcblxuZXhwb3J0IGNvbnN0IEVkaXRvcjogUmVhY3QuRkM8RWRpdG9yUHJvcHM+ID0gKHtcbiAgbGFuZ3VhZ2UsXG4gIHRleHQsXG4gIGhpZGVDb3B5QnV0dG9uLFxuICBvbkNoYW5nZSxcbiAgb25Db3B5LFxuICBzbmlwcGV0c0Jhc2VVcmwsXG59KSA9PiB7XG4gIGNvbnN0IFtvdXRwdXQsIHNldE91dHB1dF0gPSB1c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IFtzdGF0dXMsIHNldFN0YXR1c10gPSB1c2VTdGF0ZTwncmVhZHknIHwgJ3dhaXRpbmcnIHwgJ2Vycm9yJz4oJ3JlYWR5Jyk7XG4gIGNvbnN0IFtpc0NvZGVCeXRlQ29waWVkLCBzZXRJc0NvZGVCeXRlQ29waWVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3Qgb25Db3B5Q2xpY2sgPSAoKSA9PiB7XG4gICAgaWYgKCFpc0NvZGVCeXRlQ29waWVkKSB7XG4gICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkXG4gICAgICAgIC53cml0ZVRleHQodGV4dClcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgLmNhdGNoKCgpID0+IGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjb3B5JykpO1xuICAgICAgc2V0SXNDb2RlQnl0ZUNvcGllZCh0cnVlKTtcbiAgICAgIG9uQ29weT8uKHRleHQsIGxhbmd1YWdlKTtcbiAgICAgIHRyYWNrQ2xpY2soJ2NvcHknKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2V0RXJyb3JTdGF0dXNBbmRPdXRwdXQgPSAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgc2V0T3V0cHV0KG1lc3NhZ2UpO1xuICAgIHNldFN0YXR1cygnZXJyb3InKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdWJtaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHRleHQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbGFuZ3VhZ2UsXG4gICAgICBjb2RlOiB0ZXh0LFxuICAgIH07XG4gICAgc2V0U3RhdHVzKCd3YWl0aW5nJyk7XG4gICAgc2V0T3V0cHV0KCcnKTtcbiAgICB0cmFja0NsaWNrKCdydW4nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RTbmlwcGV0KGRhdGEsIHNuaXBwZXRzQmFzZVVybCk7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RkZXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2V0RXJyb3JTdGF0dXNBbmRPdXRwdXQocmVzcG9uc2Uuc3RkZXJyKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuZXhpdF9jb2RlID09PSBET0NLRVJfU0lHVEVSTSkge1xuICAgICAgICBzZXRFcnJvclN0YXR1c0FuZE91dHB1dChcbiAgICAgICAgICAnWW91ciBjb2RlIHRvb2sgdG9vIGxvbmcgdG8gcmV0dXJuIGEgcmVzdWx0LiBEb3VibGUgY2hlY2sgeW91ciBjb2RlIGZvciBhbnkgaXNzdWVzIGFuZCB0cnkgYWdhaW4hJ1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5leGl0X2NvZGUgIT09IDApIHtcbiAgICAgICAgc2V0RXJyb3JTdGF0dXNBbmRPdXRwdXQoJ0FuIHVua25vd24gZXJyb3Igb2NjdXJlZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldE91dHB1dChyZXNwb25zZS5zdGRvdXQpO1xuICAgICAgICBzZXRTdGF0dXMoJ3JlYWR5Jyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldEVycm9yU3RhdHVzQW5kT3V0cHV0KCdFcnJvcjogJyArIGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPERyYXdlcnNcbiAgICAgICAgbGVmdENoaWxkPXtcbiAgICAgICAgICA8U2ltcGxlTW9uYWNvRWRpdG9yXG4gICAgICAgICAgICB2YWx1ZT17dGV4dH1cbiAgICAgICAgICAgIGxhbmd1YWdlPXtsYW5ndWFnZX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICAgIHJpZ2h0Q2hpbGQ9e1xuICAgICAgICAgIDxPdXRwdXQgaGFzRXJyb3I9e3N0YXR1cyA9PT0gJ2Vycm9yJ30gYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgICAgICAgICB7b3V0cHV0fVxuICAgICAgICAgIDwvT3V0cHV0PlxuICAgICAgICB9XG4gICAgICAvPlxuICAgICAgPEZsZXhCb3hcbiAgICAgICAganVzdGlmeUNvbnRlbnQ9e2hpZGVDb3B5QnV0dG9uID8gJ2ZsZXgtZW5kJyA6ICdzcGFjZS1iZXR3ZWVuJ31cbiAgICAgICAgcGw9ezh9XG4gICAgICA+XG4gICAgICAgIHshaGlkZUNvcHlCdXR0b24gPyAoXG4gICAgICAgICAgPFRvb2xUaXBcbiAgICAgICAgICAgIGlkPVwiY29kZWJ5dGUtY29waWVkXCJcbiAgICAgICAgICAgIGFsaWdubWVudD1cInRvcC1yaWdodFwiXG4gICAgICAgICAgICBtb2RlPVwiZGFya1wiXG4gICAgICAgICAgICB0YXJnZXQ9e1xuICAgICAgICAgICAgICA8VGV4dEJ1dHRvblxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ29weUNsaWNrfVxuICAgICAgICAgICAgICAgIG9uQmx1cj17KCkgPT4gc2V0SXNDb2RlQnl0ZUNvcGllZChmYWxzZSl9XG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJjb3B5LWNvZGVieXRlLWJ0blwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Q29weUljb25TdHlsZWQgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz4gQ29weSBDb2RlYnl0ZVxuICAgICAgICAgICAgICA8L1RleHRCdXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2lzQ29kZUJ5dGVDb3BpZWQgPyAoXG4gICAgICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiY29weS1jb25maXJtYXRpb24tdG9vbHRpcFwiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgICAgIENvcGllZCFcbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJjb3B5LXByb21wdC10b29sdGlwXCI+XG4gICAgICAgICAgICAgICAgQ29weSB0byB5b3VyIGNsaXBib2FyZFxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvVG9vbFRpcD5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDxGaWxsQnV0dG9uIG9uQ2xpY2s9e2hhbmRsZVN1Ym1pdH0+XG4gICAgICAgICAge3N0YXR1cyA9PT0gJ3dhaXRpbmcnID8gPFNwaW5uZXIgLz4gOiAnUnVuJ31cbiAgICAgICAgPC9GaWxsQnV0dG9uPlxuICAgICAgPC9GbGV4Qm94PlxuICAgIDwvPlxuICApO1xufTtcbiJdfQ== */",
|
|
49
|
+
toString: _EMOTION_STRINGIFIED_CSS_ERROR__
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
var DOCKER_SIGTERM = 143;
|
|
53
|
+
export var Editor = function Editor(_ref2) {
|
|
54
|
+
var language = _ref2.language,
|
|
55
|
+
text = _ref2.text,
|
|
56
|
+
hideCopyButton = _ref2.hideCopyButton,
|
|
57
|
+
onChange = _ref2.onChange,
|
|
58
|
+
onCopy = _ref2.onCopy,
|
|
59
|
+
snippetsBaseUrl = _ref2.snippetsBaseUrl;
|
|
60
|
+
|
|
61
|
+
var _useState = useState(''),
|
|
62
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
63
|
+
output = _useState2[0],
|
|
64
|
+
setOutput = _useState2[1];
|
|
65
|
+
|
|
66
|
+
var _useState3 = useState('ready'),
|
|
67
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
68
|
+
status = _useState4[0],
|
|
69
|
+
setStatus = _useState4[1];
|
|
70
|
+
|
|
71
|
+
var _useState5 = useState(false),
|
|
72
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
73
|
+
isCodeByteCopied = _useState6[0],
|
|
74
|
+
setIsCodeByteCopied = _useState6[1];
|
|
75
|
+
|
|
76
|
+
var onCopyClick = function onCopyClick() {
|
|
77
|
+
if (!isCodeByteCopied) {
|
|
78
|
+
navigator.clipboard.writeText(text) // eslint-disable-next-line no-console
|
|
79
|
+
["catch"](function () {
|
|
80
|
+
return console.error('Failed to copy');
|
|
81
|
+
});
|
|
82
|
+
setIsCodeByteCopied(true);
|
|
83
|
+
onCopy === null || onCopy === void 0 ? void 0 : onCopy(text, language);
|
|
84
|
+
trackClick('copy');
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
var setErrorStatusAndOutput = function setErrorStatusAndOutput(message) {
|
|
89
|
+
setOutput(message);
|
|
90
|
+
setStatus('error');
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
var handleSubmit = /*#__PURE__*/function () {
|
|
94
|
+
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
95
|
+
var data, response;
|
|
96
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
97
|
+
while (1) {
|
|
98
|
+
switch (_context.prev = _context.next) {
|
|
99
|
+
case 0:
|
|
100
|
+
if (!(text.trim().length === 0)) {
|
|
101
|
+
_context.next = 2;
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return _context.abrupt("return");
|
|
106
|
+
|
|
107
|
+
case 2:
|
|
108
|
+
data = {
|
|
109
|
+
language: language,
|
|
110
|
+
code: text
|
|
111
|
+
};
|
|
112
|
+
setStatus('waiting');
|
|
113
|
+
setOutput('');
|
|
114
|
+
trackClick('run');
|
|
115
|
+
_context.prev = 6;
|
|
116
|
+
_context.next = 9;
|
|
117
|
+
return postSnippet(data, snippetsBaseUrl);
|
|
118
|
+
|
|
119
|
+
case 9:
|
|
120
|
+
response = _context.sent;
|
|
121
|
+
|
|
122
|
+
if (response.stderr.length > 0) {
|
|
123
|
+
setErrorStatusAndOutput(response.stderr);
|
|
124
|
+
} else if (response.exit_code === DOCKER_SIGTERM) {
|
|
125
|
+
setErrorStatusAndOutput('Your code took too long to return a result. Double check your code for any issues and try again!');
|
|
126
|
+
} else if (response.exit_code !== 0) {
|
|
127
|
+
setErrorStatusAndOutput('An unknown error occured.');
|
|
128
|
+
} else {
|
|
129
|
+
setOutput(response.stdout);
|
|
130
|
+
setStatus('ready');
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
_context.next = 16;
|
|
134
|
+
break;
|
|
135
|
+
|
|
136
|
+
case 13:
|
|
137
|
+
_context.prev = 13;
|
|
138
|
+
_context.t0 = _context["catch"](6);
|
|
139
|
+
setErrorStatusAndOutput('Error: ' + _context.t0);
|
|
140
|
+
|
|
141
|
+
case 16:
|
|
142
|
+
case "end":
|
|
143
|
+
return _context.stop();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}, _callee, null, [[6, 13]]);
|
|
147
|
+
}));
|
|
148
|
+
|
|
149
|
+
return function handleSubmit() {
|
|
150
|
+
return _ref3.apply(this, arguments);
|
|
151
|
+
};
|
|
152
|
+
}();
|
|
153
|
+
|
|
154
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Drawers, {
|
|
155
|
+
leftChild: /*#__PURE__*/React.createElement(SimpleMonacoEditor, {
|
|
156
|
+
value: text,
|
|
157
|
+
language: language,
|
|
158
|
+
onChange: onChange
|
|
159
|
+
}),
|
|
160
|
+
rightChild: /*#__PURE__*/React.createElement(Output, {
|
|
161
|
+
hasError: status === 'error',
|
|
162
|
+
"aria-live": "polite"
|
|
163
|
+
}, output)
|
|
164
|
+
}), /*#__PURE__*/React.createElement(FlexBox, {
|
|
165
|
+
justifyContent: hideCopyButton ? 'flex-end' : 'space-between',
|
|
166
|
+
pl: 8
|
|
167
|
+
}, !hideCopyButton ? /*#__PURE__*/React.createElement(ToolTip, {
|
|
168
|
+
id: "codebyte-copied",
|
|
169
|
+
alignment: "top-right",
|
|
170
|
+
mode: "dark",
|
|
171
|
+
target: /*#__PURE__*/React.createElement(TextButton, {
|
|
172
|
+
variant: "secondary",
|
|
173
|
+
onClick: onCopyClick,
|
|
174
|
+
onBlur: function onBlur() {
|
|
175
|
+
return setIsCodeByteCopied(false);
|
|
176
|
+
},
|
|
177
|
+
"data-testid": "copy-codebyte-btn"
|
|
178
|
+
}, /*#__PURE__*/React.createElement(CopyIconStyled, {
|
|
179
|
+
"aria-hidden": "true"
|
|
180
|
+
}), " Copy Codebyte")
|
|
181
|
+
}, isCodeByteCopied ? /*#__PURE__*/React.createElement("span", {
|
|
182
|
+
"data-testid": "copy-confirmation-tooltip",
|
|
183
|
+
role: "alert"
|
|
184
|
+
}, "Copied!") : /*#__PURE__*/React.createElement("span", {
|
|
185
|
+
"data-testid": "copy-prompt-tooltip"
|
|
186
|
+
}, "Copy to your clipboard")) : null, /*#__PURE__*/React.createElement(FillButton, {
|
|
187
|
+
onClick: handleSubmit
|
|
188
|
+
}, status === 'waiting' ? /*#__PURE__*/React.createElement(Spinner, null) : 'Run')));
|
|
189
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare type CodebyteOptions = {
|
|
2
|
+
clientName: string;
|
|
3
|
+
parentPage: string;
|
|
4
|
+
renderMode: string;
|
|
5
|
+
};
|
|
6
|
+
export declare enum CodebytesParams {
|
|
7
|
+
Language = "lang",
|
|
8
|
+
Text = "text",
|
|
9
|
+
CopyMode = "copy-mode",
|
|
10
|
+
ClientName = "client-name",
|
|
11
|
+
Page = "page",
|
|
12
|
+
Mode = "mode"
|
|
13
|
+
}
|
|
14
|
+
export declare const getOptions: () => CodebyteOptions;
|
|
15
|
+
export declare const trackClick: (target: string) => void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { trackUserClick } from '../libs/eventTracking';
|
|
2
|
+
export var CodebytesParams;
|
|
3
|
+
|
|
4
|
+
(function (CodebytesParams) {
|
|
5
|
+
CodebytesParams["Language"] = "lang";
|
|
6
|
+
CodebytesParams["Text"] = "text";
|
|
7
|
+
CodebytesParams["CopyMode"] = "copy-mode";
|
|
8
|
+
CodebytesParams["ClientName"] = "client-name";
|
|
9
|
+
CodebytesParams["Page"] = "page";
|
|
10
|
+
CodebytesParams["Mode"] = "mode";
|
|
11
|
+
})(CodebytesParams || (CodebytesParams = {}));
|
|
12
|
+
|
|
13
|
+
export var getOptions = function getOptions() {
|
|
14
|
+
var currentUri = new URL(window.location.href);
|
|
15
|
+
return {
|
|
16
|
+
clientName: currentUri.searchParams.get(CodebytesParams.ClientName) || 'Unknown',
|
|
17
|
+
parentPage: currentUri.searchParams.get(CodebytesParams.Page) || document.referrer,
|
|
18
|
+
renderMode: currentUri.searchParams.get(CodebytesParams.Mode) || ''
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export var trackClick = function trackClick(target) {
|
|
22
|
+
var options = getOptions();
|
|
23
|
+
var page_name = options.renderMode ? "".concat(options.clientName, "_").concat(options.renderMode) : options.clientName;
|
|
24
|
+
trackUserClick({
|
|
25
|
+
page_name: page_name,
|
|
26
|
+
context: options.parentPage,
|
|
27
|
+
target: target
|
|
28
|
+
});
|
|
29
|
+
};
|
|
File without changes
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Select, Text } from '@codecademy/gamut';
|
|
2
|
+
import { ColorMode } from '@codecademy/gamut-styles';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { LanguageOptions } from './consts';
|
|
5
|
+
export var LanguageSelection = function LanguageSelection(_ref) {
|
|
6
|
+
var _onChange = _ref.onChange;
|
|
7
|
+
return /*#__PURE__*/React.createElement(ColorMode, {
|
|
8
|
+
mode: "dark",
|
|
9
|
+
flex: 1,
|
|
10
|
+
px: 16,
|
|
11
|
+
pt: 48
|
|
12
|
+
}, /*#__PURE__*/React.createElement(Text, {
|
|
13
|
+
mb: 16
|
|
14
|
+
}, "Which language do you want to code in?"), /*#__PURE__*/React.createElement(Select, {
|
|
15
|
+
id: "language-select",
|
|
16
|
+
"aria-label": "Select a language",
|
|
17
|
+
options: LanguageOptions,
|
|
18
|
+
onChange: function onChange(e) {
|
|
19
|
+
return _onChange(e.target.value);
|
|
20
|
+
}
|
|
21
|
+
}));
|
|
22
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const trackUserClick: (data: import("@codecademy/tracking").UserClickData) => void, trackUserVisit: (data: import("@codecademy/tracking").UserVisitData) => void, trackUserImpression: (data: import("@codecademy/tracking").UserImpressionData) => void;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createTracker } from '@codecademy/tracking';
|
|
2
|
+
var IS_DEV = process.env.NODE_ENV === 'development'; // TODO: confirm tracking details and implementation DISC-447
|
|
3
|
+
|
|
4
|
+
var tracker = createTracker({
|
|
5
|
+
apiBaseUrl: typeof window === 'undefined' ? 'https://www.codecademy.com' : window.location.origin,
|
|
6
|
+
verbose: IS_DEV
|
|
7
|
+
});
|
|
8
|
+
var trackUserClick = tracker.click,
|
|
9
|
+
trackUserVisit = tracker.visit,
|
|
10
|
+
trackUserImpression = tracker.impression;
|
|
11
|
+
export { trackUserClick, trackUserVisit, trackUserImpression };
|
package/{src → dist}/theme.d.ts
RENAMED
|
File without changes
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { LanguageOption } from './consts';
|
|
2
|
+
export interface CodebytesChangeHandler {
|
|
3
|
+
(text: string, language: LanguageOption): void;
|
|
4
|
+
}
|
|
5
|
+
export interface CodeByteEditorProps {
|
|
6
|
+
text?: string;
|
|
7
|
+
language?: LanguageOption;
|
|
8
|
+
hideCopyButton?: boolean;
|
|
9
|
+
onCopy?: CodebytesChangeHandler;
|
|
10
|
+
isIFrame?: boolean;
|
|
11
|
+
snippetsBaseUrl?: string;
|
|
12
|
+
onEdit?: CodebytesChangeHandler;
|
|
13
|
+
onLanguageChange?: CodebytesChangeHandler;
|
|
14
|
+
}
|
package/dist/types.js
ADDED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codecademy/codebytes",
|
|
3
3
|
"description": "Codebytes Code Editor",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.3-alpha.e74dd5.0",
|
|
5
5
|
"author": "Codecademy Engineering <dev@codecademy.com>",
|
|
6
6
|
"sideEffects": [
|
|
7
7
|
"**/*.css",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"url": "git@github.com:Codecademy/client-modules.git"
|
|
17
17
|
},
|
|
18
18
|
"peerDependencies": {
|
|
19
|
+
"@codecademy/tracking": "0.18.0",
|
|
19
20
|
"react": ">=16.8.1",
|
|
20
21
|
"react-dom": ">=16.8.1"
|
|
21
22
|
},
|
|
@@ -23,7 +24,6 @@
|
|
|
23
24
|
"@codecademy/gamut": "*",
|
|
24
25
|
"@codecademy/gamut-icons": "*",
|
|
25
26
|
"@codecademy/gamut-styles": "*",
|
|
26
|
-
"@codecademy/tracking": "0.18.0",
|
|
27
27
|
"@codecademy/variance": "*",
|
|
28
28
|
"@emotion/react": "^11.4.0",
|
|
29
29
|
"@emotion/styled": "^11.3.0",
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"license": "MIT",
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@codecademy/gamut-tests": "*",
|
|
48
|
+
"@codecademy/tracking": "0.18.0",
|
|
48
49
|
"@emotion/jest": "^11.3.0",
|
|
49
50
|
"@testing-library/dom": "^7.31.2",
|
|
50
51
|
"@testing-library/react": "^11.0.4",
|
|
@@ -57,5 +58,8 @@
|
|
|
57
58
|
"publishConfig": {
|
|
58
59
|
"access": "public"
|
|
59
60
|
},
|
|
60
|
-
"
|
|
61
|
+
"files": [
|
|
62
|
+
"dist/**"
|
|
63
|
+
],
|
|
64
|
+
"gitHead": "298fb5cbf2aea93bd38e779ad9323c42f6e3bec8"
|
|
61
65
|
}
|
package/babel.config.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
presets: ['codecademy', '@babel/preset-typescript'],
|
|
3
|
-
plugins: [
|
|
4
|
-
[
|
|
5
|
-
'@emotion',
|
|
6
|
-
{
|
|
7
|
-
sourceMap: true,
|
|
8
|
-
autoLabel: 'always',
|
|
9
|
-
labelFormat: '[local]',
|
|
10
|
-
},
|
|
11
|
-
],
|
|
12
|
-
],
|
|
13
|
-
include: ['./src/**/*'],
|
|
14
|
-
ignore: ['__tests__', './**/*.d.ts'],
|
|
15
|
-
};
|
package/jest.config.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
module.exports = require('../../jest.config.base')('codebytes');
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
// DO NOT CHANGE ANYTHING HERE
|
|
2
|
-
// This component is part of the Codebytes MVP and only includes basic configuration around theming
|
|
3
|
-
// We are working on a monaco package in client-modules that has more configuration around themes and languages
|
|
4
|
-
// Monaco as a shared package RFC https://www.notion.so/codecademy/Monaco-editor-as-a-shared-package-1f4484db165b4abc8394c3556451ef6a
|
|
5
|
-
|
|
6
|
-
import ReactMonacoEditor, { OnMount } from '@monaco-editor/react';
|
|
7
|
-
import { editor } from 'monaco-editor/esm/vs/editor/editor.api';
|
|
8
|
-
import React, { useCallback, useRef } from 'react';
|
|
9
|
-
import ResizeObserver from 'react-resize-observer';
|
|
10
|
-
|
|
11
|
-
import { dark } from './theme';
|
|
12
|
-
import { Monaco } from './types';
|
|
13
|
-
|
|
14
|
-
export type SimpleMonacoEditorProps = {
|
|
15
|
-
value: string;
|
|
16
|
-
language: string;
|
|
17
|
-
onChange?: (value: string) => void;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
type ThemedEditor = Parameters<OnMount>[0];
|
|
21
|
-
|
|
22
|
-
export const SimpleMonacoEditor: React.FC<SimpleMonacoEditorProps> = ({
|
|
23
|
-
value,
|
|
24
|
-
language,
|
|
25
|
-
onChange,
|
|
26
|
-
}) => {
|
|
27
|
-
const editorRef = useRef<editor.IStandaloneCodeEditor | null>(null);
|
|
28
|
-
const editorWillMount = useCallback(
|
|
29
|
-
(editor: ThemedEditor, monaco: Monaco) => {
|
|
30
|
-
editorRef.current = editor;
|
|
31
|
-
monaco.editor.defineTheme('dark', dark);
|
|
32
|
-
monaco.editor.setTheme('dark');
|
|
33
|
-
},
|
|
34
|
-
[]
|
|
35
|
-
);
|
|
36
|
-
return (
|
|
37
|
-
<>
|
|
38
|
-
<ResizeObserver
|
|
39
|
-
onResize={({ height, width }) => {
|
|
40
|
-
editorRef.current?.layout({
|
|
41
|
-
height,
|
|
42
|
-
width,
|
|
43
|
-
});
|
|
44
|
-
}}
|
|
45
|
-
/>
|
|
46
|
-
<ReactMonacoEditor
|
|
47
|
-
onMount={editorWillMount}
|
|
48
|
-
onChange={onChange}
|
|
49
|
-
options={{ minimap: { enabled: false } }}
|
|
50
|
-
theme="vs-dark"
|
|
51
|
-
value={value}
|
|
52
|
-
language={language}
|
|
53
|
-
/>
|
|
54
|
-
</>
|
|
55
|
-
);
|
|
56
|
-
};
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
// DO NOT CHANGE ANYTHING HERE
|
|
2
|
-
// This file is part of the Codebytes MVP and only includes basic configuration around theming for the SimpleMonacoEditor component
|
|
3
|
-
// We are working on a monaco package in client-modules that has more configuration around themes and languages
|
|
4
|
-
// Monaco as a shared package RFC https://www.notion.so/codecademy/Monaco-editor-as-a-shared-package-1f4484db165b4abc8394c3556451ef6a
|
|
5
|
-
|
|
6
|
-
import type * as monaco from 'monaco-editor';
|
|
7
|
-
|
|
8
|
-
import * as darkColors from './colorsDark';
|
|
9
|
-
|
|
10
|
-
const c = (color: string) => color.substr(1);
|
|
11
|
-
|
|
12
|
-
const theme = ({
|
|
13
|
-
ui,
|
|
14
|
-
syntax,
|
|
15
|
-
}: {
|
|
16
|
-
ui: darkColors.UIColors;
|
|
17
|
-
syntax: darkColors.SyntaxColors;
|
|
18
|
-
}): monaco.editor.IStandaloneThemeData => ({
|
|
19
|
-
base: 'vs-dark',
|
|
20
|
-
inherit: true,
|
|
21
|
-
rules: [
|
|
22
|
-
// Base
|
|
23
|
-
{ token: '', foreground: c(syntax.basic) },
|
|
24
|
-
{ token: 'regexp', foreground: c(syntax.regexp) },
|
|
25
|
-
{ token: 'annotation', foreground: c(syntax.annotation) },
|
|
26
|
-
{ token: 'type', foreground: c(syntax.annotation) },
|
|
27
|
-
{ token: 'doctype', foreground: c(syntax.comment) },
|
|
28
|
-
{ token: 'delimiter', foreground: c(syntax.decoration) },
|
|
29
|
-
{ token: 'invalid', foreground: c(syntax.invalid) },
|
|
30
|
-
{ token: 'emphasis', fontStyle: 'italic' },
|
|
31
|
-
{ token: 'strong', fontStyle: 'bold' },
|
|
32
|
-
{ token: 'variable', foreground: c(syntax.variable) },
|
|
33
|
-
{ token: 'variable.predefined', foreground: c(syntax.variable) },
|
|
34
|
-
{ token: 'constant', foreground: c(syntax.constant) },
|
|
35
|
-
{ token: 'comment', foreground: c(syntax.comment) },
|
|
36
|
-
{ token: 'number', foreground: c(syntax.number) },
|
|
37
|
-
{ token: 'number.hex', foreground: c(syntax.number) },
|
|
38
|
-
{ token: 'keyword.directive', foreground: c(syntax.comment) },
|
|
39
|
-
{ token: 'include', foreground: c(syntax.comment) },
|
|
40
|
-
{ token: 'key', foreground: c(syntax.property) },
|
|
41
|
-
{ token: 'attribute.name', foreground: c(syntax.attribute) },
|
|
42
|
-
{ token: 'attribute.name-numeric', foreground: c(syntax.string) },
|
|
43
|
-
{ token: 'attribute.value', foreground: c(syntax.property) },
|
|
44
|
-
{ token: 'attribute.value.number', foreground: c(syntax.number) },
|
|
45
|
-
{ token: 'string', foreground: c(syntax.string) },
|
|
46
|
-
{ token: 'string.yaml', foreground: c(syntax.string) },
|
|
47
|
-
{ token: 'tag', foreground: c(syntax.tag) },
|
|
48
|
-
{ token: 'tag.id.jade', foreground: c(syntax.tag) },
|
|
49
|
-
{ token: 'tag.class.jade', foreground: c(syntax.tag) },
|
|
50
|
-
{ token: 'metatag', foreground: c(syntax.comment) },
|
|
51
|
-
{ token: 'attribute.value.unit', foreground: c(syntax.string) },
|
|
52
|
-
{ token: 'keyword', foreground: c(syntax.keyword) },
|
|
53
|
-
{ token: 'keyword.flow', foreground: c(syntax.keyword) },
|
|
54
|
-
],
|
|
55
|
-
colors: {
|
|
56
|
-
'editor.background': ui.background,
|
|
57
|
-
'editor.foreground': ui.text,
|
|
58
|
-
'editorIndentGuide.background': ui.indent.inactive,
|
|
59
|
-
'editorIndentGuide.activeBackground': ui.indent.active,
|
|
60
|
-
'editorWhitespace.foreground': syntax.comment,
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
export const dark = theme(darkColors);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export type Monaco = typeof import('monaco-editor');
|