diff --git a/.gitignore b/.gitignore index 2a1ccad..da8ebd8 100644 --- a/.gitignore +++ b/.gitignore @@ -85,4 +85,5 @@ typings/ # End of https://www.gitignore.io/api/node -dist/ \ No newline at end of file +dist/ +lib/ diff --git a/README.md b/README.md index 199b466..c174a32 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ LeetCode 中国的前端团队工作内容: #### 展现你的能力 +- [基础编程能力](./fondations_zh.md) - [编写复杂的 TypeScript 类型](./typescript_zh.md) - [用 Webpack 实现 predictable long term cache](./webpack_zh.md) - [编写工程化的组件](./engineering_zh.md) diff --git a/fondations-zh/package.json b/fondations-zh/package.json new file mode 100644 index 0000000..26e793f --- /dev/null +++ b/fondations-zh/package.json @@ -0,0 +1,19 @@ +{ + "name": "@leetcode-hire/fondations-zh", + "version": "1.0.0", + "description": "Frontend fondation problem for leetcode-cn.com", + "main": "lib/index.js", + "repository": "https://github.com/LeetCode-OpenSource/hire", + "author": "lynweklm@gmail.com", + "license": "MIT", + "scripts": { + "build": "shx rm -rf lib && tsc -p tsconfig.json --outDir lib" + }, + "devDependencies": { + "shx": "^0.3.2", + "typescript": "^3.6.2" + }, + "dependencies": { + "tslib": "^1.10.0" + } +} diff --git a/fondations-zh/src/index.ts b/fondations-zh/src/index.ts new file mode 100644 index 0000000..766f2b4 --- /dev/null +++ b/fondations-zh/src/index.ts @@ -0,0 +1,12 @@ +export interface ErrorMessage { + message: string + stack: Array<{ + line: number + column: number + filename: string + }> +} + +export function parseError(err: Error): ErrorMessage { + // implement +} diff --git a/fondations-zh/tsconfig.json b/fondations-zh/tsconfig.json new file mode 100644 index 0000000..bb5c37b --- /dev/null +++ b/fondations-zh/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "strict": true, + "moduleResolution": "node", + "target": "esnext", + "module": "esnext", + "noUnusedLocals": true, + "noUnusedParameters": true, + "importHelpers": true, + "noEmitHelpers": true + } +} diff --git a/fondations-zh/yarn.lock b/fondations-zh/yarn.lock new file mode 100644 index 0000000..d8319e1 --- /dev/null +++ b/fondations-zh/yarn.lock @@ -0,0 +1,137 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +es6-object-assign@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +glob@^7.0.0: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +interpret@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +resolve@^1.1.6: + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== + dependencies: + path-parse "^1.0.6" + +shelljs@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" + integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shx@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.2.tgz#40501ce14eb5e0cbcac7ddbd4b325563aad8c123" + integrity sha512-aS0mWtW3T2sHAenrSrip2XGv39O9dXIFUqxAEWHEOS1ePtGIBavdPJY1kE2IHl14V/4iCbUiNDPGdyYTtmhSoA== + dependencies: + es6-object-assign "^1.0.3" + minimist "^1.2.0" + shelljs "^0.8.1" + +tslib@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +typescript@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.2.tgz#105b0f1934119dde543ac8eb71af3a91009efe54" + integrity sha512-lmQ4L+J6mnu3xweP8+rOrUwzmN+MRAj7TgtJtDaXE5PMyX2kCrklhg3rvOsOIfNeAWMQWO2F1GPc1kMD2vLAfw== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= diff --git a/fondations_zh.md b/fondations_zh.md new file mode 100644 index 0000000..71358b0 --- /dev/null +++ b/fondations_zh.md @@ -0,0 +1,81 @@ +# 运用你的编程能力解决现实问题 + +## 问题描述 +假设我们在业务中有一个需求是将浏览器中的错误上报到日志中心。 +在上报前,我们需要在前端先将错误的各种信息序列化为日志中心可以处理的 `JSON` 形式。 + +## 输入 +输入是一个 `Error` 对象,但是在不同的浏览器下它有着细微的区别。 + +在 `Chrome` 中,我们捕获到的错误的 `stack` 属性是以下格式: + +```js +const fixtureStack = `TypeError: Error raised + at bar http://192.168.31.8:8000/c.js:2:9 + at foo http://192.168.31.8:8000/b.js:4:15 + at calc http://192.168.31.8:8000/a.js:4:3 + at :1:11 + at http://192.168.31.8:8000/a.js:22:3 +` +``` + +在 `Firefox` 中,我们捕获到的错误的 `stack` 属性是以下格式: + +```js +const fixtureFirefoxStack = ` + bar@http://192.168.31.8:8000/c.js:2:9 + foo@http://192.168.31.8:8000/b.js:4:15 + calc@http://192.168.31.8:8000/a.js:4:3 + :1:11 + http://192.168.31.8:8000/a.js:22:3 +` +``` + +如果 `stack` 中某一行不带文件路径,则忽略掉这行信息 + +## 输出 +日志中心接受这样格式的数据: + +```ts +interface ErrorMessage { + message: string + stack: Array<{ + line: number + column: number + filename: string + }> +} +``` + +如果输入: +```ts +TypeError: Error raised + at bar http://192.168.31.8:8000/c.js:2:9 +``` + +则输出: + +```ts +{ + message: 'Error raised', + stack: [ + { + line: 2, + column: 9, + filename: 'http://192.168.31.8:8000/c.js' + } + ] +} +``` + +## 要求 +请使用 `TypeScript` 完成 [index.ts](./fondations-zh/src/index.ts) 中的函数. +可以引入部分工具类第三方库,比如 `Lodash`. + +## 评判标准 + +- 完成所描述功能. `50 分` +- 完整的单元测试,覆盖 `输入` 中举例的 `Chrome` 和 `Firefox` 的两个 `Fixture`. `30 分` +- 配置 `lint` 与 `formart`. `10 分` +- 配置 `precommit` 与 `commitlint`. `10 分` +- 配置 `CI`, 并且在 `CI` 上运行 `单元测试与 Lint`. `30 分`