├── .eslintignore
├── .eslintrc.json
├── .gitattributes
├── .github
├── dependabot.yml
└── workflows
│ ├── check-dist.yml
│ ├── codeql-analysis.yml
│ └── test.yml
├── .gitignore
├── .prettierignore
├── .prettierrc.json
├── CODEOWNERS
├── LICENSE
├── README.md
├── __tests__
└── main.test.ts
├── action.yml
├── dist
├── 37.index.js
├── 37.index.js.map
├── index.js
├── index.js.map
├── licenses.txt
└── sourcemap-register.js
├── jest.config.js
├── package-lock.json
├── package.json
├── src
├── constant.ts
├── lib
│ ├── fetchPrevReadmeContents.ts
│ ├── fetchScore.ts
│ ├── getActionsParams.ts
│ ├── rewriteReadmeToIncludeCardText.ts
│ └── updateReadme.ts
├── main.ts
└── types
│ └── types.ts
└── tsconfig.json
/.eslintignore:
--------------------------------------------------------------------------------
1 | dist/
2 | **/*.js
3 | node_modules/
4 | jest.config.js
5 |
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "plugins": ["jest", "@typescript-eslint"],
3 | "extends": ["plugin:github/recommended"],
4 | "parser": "@typescript-eslint/parser",
5 | "parserOptions": {
6 | "ecmaVersion": 9,
7 | "sourceType": "module",
8 | "project": "./tsconfig.json"
9 | },
10 | "rules": {
11 | "i18n-text/no-en": "off",
12 | "eslint-comments/no-use": "off",
13 | "import/no-namespace": "off",
14 | "no-unused-vars": "off",
15 | "@typescript-eslint/no-unused-vars": "error",
16 | "@typescript-eslint/explicit-member-accessibility": ["error", {"accessibility": "no-public"}],
17 | "@typescript-eslint/no-require-imports": "error",
18 | "@typescript-eslint/array-type": "error",
19 | "@typescript-eslint/await-thenable": "error",
20 | "@typescript-eslint/ban-ts-comment": "error",
21 | "@typescript-eslint/consistent-type-assertions": "error",
22 | "@typescript-eslint/explicit-function-return-type": ["error", {"allowExpressions": true}],
23 | "@typescript-eslint/func-call-spacing": ["error", "never"],
24 | "@typescript-eslint/no-array-constructor": "error",
25 | "@typescript-eslint/no-empty-interface": "error",
26 | "@typescript-eslint/no-extraneous-class": "error",
27 | "@typescript-eslint/no-for-in-array": "error",
28 | "@typescript-eslint/no-inferrable-types": "error",
29 | "@typescript-eslint/no-misused-new": "error",
30 | "@typescript-eslint/no-namespace": "error",
31 | "@typescript-eslint/no-non-null-assertion": "warn",
32 | "@typescript-eslint/no-unnecessary-qualifier": "error",
33 | "@typescript-eslint/no-unnecessary-type-assertion": "error",
34 | "@typescript-eslint/no-useless-constructor": "error",
35 | "@typescript-eslint/no-var-requires": "error",
36 | "@typescript-eslint/prefer-for-of": "warn",
37 | "@typescript-eslint/prefer-function-type": "warn",
38 | "@typescript-eslint/prefer-includes": "error",
39 | "@typescript-eslint/prefer-string-starts-ends-with": "error",
40 | "@typescript-eslint/promise-function-async": "error",
41 | "@typescript-eslint/require-array-sort-compare": "error",
42 | "@typescript-eslint/restrict-plus-operands": "error",
43 | "semi": "off",
44 | "@typescript-eslint/semi": ["error", "never"],
45 | "@typescript-eslint/type-annotation-spacing": "error",
46 | "@typescript-eslint/unbound-method": "error",
47 | "filenames/match-regex": "off"
48 | },
49 | "env": {
50 | "node": true,
51 | "es6": true,
52 | "jest/globals": true
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | dist/** -diff linguist-generated=true
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: github-actions
4 | directory: /
5 | schedule:
6 | interval: daily
7 |
8 | - package-ecosystem: npm
9 | directory: /
10 | schedule:
11 | interval: daily
12 |
--------------------------------------------------------------------------------
/.github/workflows/check-dist.yml:
--------------------------------------------------------------------------------
1 | # `dist/index.js` is a special file in Actions.
2 | # When you reference an action with `uses:` in a workflow,
3 | # `index.js` is the code that will run.
4 | # For our project, we generate this file through a build process from other source files.
5 | # We need to make sure the checked-in `index.js` actually matches what we expect it to be.
6 | name: Check dist/
7 |
8 | on:
9 | push:
10 | branches:
11 | - main
12 | paths-ignore:
13 | - '**.md'
14 | pull_request:
15 | paths-ignore:
16 | - '**.md'
17 | workflow_dispatch:
18 |
19 | jobs:
20 | check-dist:
21 | runs-on: ubuntu-latest
22 |
23 | steps:
24 | - uses: actions/checkout@v3
25 |
26 | - name: Set Node.js 16.x
27 | uses: actions/setup-node@v3.6.0
28 | with:
29 | node-version: 16.x
30 |
31 | - name: Install dependencies
32 | run: npm ci
33 |
34 | - name: Rebuild the dist/ directory
35 | run: |
36 | npm run build
37 | npm run package
38 |
39 | - name: Compare the expected and actual dist/ directories
40 | run: |
41 | if [ "$(git diff --ignore-space-at-eol dist/ | wc -l)" -gt "0" ]; then
42 | echo "Detected uncommitted changes after build. See status below:"
43 | git diff
44 | exit 1
45 | fi
46 | id: diff
47 |
48 | # If index.js was different than expected, upload the expected version as an artifact
49 | - uses: actions/upload-artifact@v3
50 | if: ${{ failure() && steps.diff.conclusion == 'failure' }}
51 | with:
52 | name: dist
53 | path: dist/
54 |
--------------------------------------------------------------------------------
/.github/workflows/codeql-analysis.yml:
--------------------------------------------------------------------------------
1 | # For most projects, this workflow file will not need changing; you simply need
2 | # to commit it to your repository.
3 | #
4 | # You may wish to alter this file to override the set of languages analyzed,
5 | # or to provide custom queries or build logic.
6 | #
7 | # ******** NOTE ********
8 | # We have attempted to detect the languages in your repository. Please check
9 | # the `language` matrix defined below to confirm you have the correct set of
10 | # supported CodeQL languages.
11 | #
12 | name: "CodeQL"
13 |
14 | on:
15 | push:
16 | branches: [ main ]
17 | pull_request:
18 | # The branches below must be a subset of the branches above
19 | branches: [ main ]
20 | schedule:
21 | - cron: '31 7 * * 3'
22 |
23 | jobs:
24 | analyze:
25 | name: Analyze
26 | runs-on: ubuntu-latest
27 | permissions:
28 | actions: read
29 | contents: read
30 | security-events: write
31 |
32 | strategy:
33 | fail-fast: false
34 | matrix:
35 | language: [ 'TypeScript' ]
36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
37 | # Learn more about CodeQL language support at https://git.io/codeql-language-support
38 |
39 | steps:
40 | - name: Checkout repository
41 | uses: actions/checkout@v3
42 |
43 | # Initializes the CodeQL tools for scanning.
44 | - name: Initialize CodeQL
45 | uses: github/codeql-action/init@v2
46 | with:
47 | languages: ${{ matrix.language }}
48 | source-root: src
49 | # If you wish to specify custom queries, you can do so here or in a config file.
50 | # By default, queries listed here will override any specified in a config file.
51 | # Prefix the list here with "+" to use these queries and those in the config file.
52 | # queries: ./path/to/local/query, your-org/your-repo/queries@main
53 |
54 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
55 | # If this step fails, then you should remove it and run the build manually (see below)
56 | - name: Autobuild
57 | uses: github/codeql-action/autobuild@v2
58 |
59 | # ℹ️ Command-line programs to run using the OS shell.
60 | # 📚 https://git.io/JvXDl
61 |
62 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
63 | # and modify them (or add more) to build your code if your project
64 | # uses a compiled language
65 |
66 | #- run: |
67 | # make bootstrap
68 | # make release
69 |
70 | - name: Perform CodeQL Analysis
71 | uses: github/codeql-action/analyze@v2
72 |
--------------------------------------------------------------------------------
/.github/workflows/test.yml:
--------------------------------------------------------------------------------
1 | name: 'build-test'
2 | on: # rebuild any PRs and main branch changes
3 | pull_request:
4 | push:
5 | branches:
6 | - main
7 | - 'releases/*'
8 |
9 | jobs:
10 | build: # make sure build/ci work properly
11 | runs-on: ubuntu-latest
12 | steps:
13 | - uses: actions/checkout@v3
14 | - run: |
15 | npm install
16 | - run: |
17 | npm run all
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Dependency directory
2 | node_modules
3 |
4 | # Rest pulled from https://github.com/github/gitignore/blob/master/Node.gitignore
5 | # Logs
6 | logs
7 | *.log
8 | npm-debug.log*
9 | yarn-debug.log*
10 | yarn-error.log*
11 | lerna-debug.log*
12 |
13 | # Diagnostic reports (https://nodejs.org/api/report.html)
14 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
15 |
16 | # Runtime data
17 | pids
18 | *.pid
19 | *.seed
20 | *.pid.lock
21 |
22 | # Directory for instrumented libs generated by jscoverage/JSCover
23 | lib-cov
24 |
25 | # Coverage directory used by tools like istanbul
26 | coverage
27 | *.lcov
28 |
29 | # nyc test coverage
30 | .nyc_output
31 |
32 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
33 | .grunt
34 |
35 | # Bower dependency directory (https://bower.io/)
36 | bower_components
37 |
38 | # node-waf configuration
39 | .lock-wscript
40 |
41 | # Compiled binary addons (https://nodejs.org/api/addons.html)
42 | build/Release
43 |
44 | # Dependency directories
45 | jspm_packages/
46 |
47 | # TypeScript v1 declaration files
48 | typings/
49 |
50 | # TypeScript cache
51 | *.tsbuildinfo
52 |
53 | # Optional npm cache directory
54 | .npm
55 |
56 | # Optional eslint cache
57 | .eslintcache
58 |
59 | # Optional REPL history
60 | .node_repl_history
61 |
62 | # Output of 'npm pack'
63 | *.tgz
64 |
65 | # Yarn Integrity file
66 | .yarn-integrity
67 |
68 | # dotenv environment variables file
69 | .env
70 | .env.test
71 |
72 | # parcel-bundler cache (https://parceljs.org/)
73 | .cache
74 |
75 | # next.js build output
76 | .next
77 |
78 | # nuxt.js build output
79 | .nuxt
80 |
81 | # vuepress build output
82 | .vuepress/dist
83 |
84 | # Serverless directories
85 | .serverless/
86 |
87 | # FuseBox cache
88 | .fusebox/
89 |
90 | # DynamoDB Local files
91 | .dynamodb/
92 |
93 | # OS metadata
94 | .DS_Store
95 | Thumbs.db
96 |
97 | # Ignore built ts files
98 | __tests__/runner/*
99 | lib/**/*
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | dist/
2 | lib/
3 | node_modules/
--------------------------------------------------------------------------------
/.prettierrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 80,
3 | "tabWidth": 2,
4 | "useTabs": false,
5 | "semi": false,
6 | "singleQuote": true,
7 | "trailingComma": "none",
8 | "bracketSpacing": false,
9 | "arrowParens": "avoid"
10 | }
11 |
--------------------------------------------------------------------------------
/CODEOWNERS:
--------------------------------------------------------------------------------
1 | * @actions/actions-runtime
2 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 |
2 | The MIT License (MIT)
3 |
4 | Copyright (c) 2018 GitHub, Inc. and contributors
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in
14 | all copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | THE SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # LAPRAS Card Readme
2 |
3 | GitHub Profileに[LAPRAS](https://lapras.com) の現在のスコアをカード画像として埋め込むGitHub Actionsです。
4 |
5 | - [example](https://github.com/kawamataryo)
6 |
7 | |||
8 | |---|---|
9 | |
|
|
10 | |
|
|
11 |
12 | ## 🛠️ 使い方
13 |
14 | ### LAPRASポートフォリオの公開
15 |
16 | このGitHub ActionsではLAPRASの公開ポートフォリオAPIを叩き、最新のスコアを取得しています。
17 | 事前にポートフォリオの公開設定をします。
18 |
19 | - [ポートフォリオ公開設定方法](https://talent-help.lapras.com/ja/articles/3106144-%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AA%E3%82%AA%E3%82%92%E5%85%AC%E9%96%8B%E3%81%99%E3%82%8B)
20 |
21 | ### GitHub Profileの設定
22 |
23 | GitHub Profileリポジトリ `README.md` 内のカードを挿入したい位置に以下のコメントを追加します。
24 |
25 | ```md
26 |
27 |
28 | ```
29 |
30 | そして、`.github/workflows/` に、以下 `lapras-card.yml` を追加し、GitHub Actionsを設定します。
31 | `SHARE_ID`には、自分の公開プロフィールのIDを入力します(`https://lapras.com/public/<:share_id>`)。
32 |
33 | ```yml
34 | name: LAPRAS Card
35 |
36 | on:
37 | workflow_dispatch:
38 | schedule:
39 | - cron: "0 0 * * *"
40 |
41 | jobs:
42 | update-card:
43 | name: LAPRAS Card
44 | runs-on: ubuntu-latest
45 | steps:
46 | - uses: kawamataryo/lapras-card-readme@main
47 | with:
48 | SHARE_ID: "<公開ポートフォリオのID>"
49 | # 以下オプション
50 | # https://lapras-card-generator.vercel.app でカスタマイズしたデザインを設定可能
51 | # ICON_FIRST: "#030E21"
52 | # ICON_SECOND: "#1688BF"
53 | # BACKGROUND_FIRST: "#020E27"
54 | # BACKGROUND_SECOND: "#0E5593"
55 | # LANG: "ja"
56 | # CARD_WIDTH: "400"
57 | # UPDATE_TIME: "true"
58 | # README_FILE: "README.md"
59 | # IS_CENTER: "true"
60 | # ALTERNATIVE_TEXT: "Score of {SHARE_ID} on LAPRAS"
61 | ```
62 |
63 | 初回はGitHub Actionsの **⚠手動実行⚠️** で画像を追加してください。以降は毎日12:00(UTC)に更新されます。
64 |
65 | 
66 |
67 | ## 🎨 オプション
68 |
69 | カードのデザインはさまざまな調整が可能です。
70 |
71 | |property|default|description|
72 | |---|---|---|
73 | |ICON_FIRST|`#030E21`|LAPRASアイコンのグラデーションの start color|
74 | |ICON_SECOND|`#1688BF`|LAPRASアイコンのグラデーションの end color|
75 | |BACKGROUND_FIRST|`#020E27`|カード背景のグラデーションの start color|
76 | |BACKGROUND_END|`#0E5593`|カード背景のグラデーションの end color|
77 | |LANG|`ja`|スコアの表記方法(`ja` or `en`)|
78 | |CARD_WIDTH|`400`|出力する画像のwidth|
79 | |UPDATE_TIME|`true`|スコアの更新日時の表示有無|
80 | |IS_CENTER|`true`|カード画像を中央揃えするかどうか|
81 | |ALTERNATIVE_TEXT|`${shareId}のLAPRASでのスコアは次の通りです: エンジニアリング: ${score.eScore} / 5.0, ビジネス: ${score.bScore} / 5.0, インフルエンス: ${score.iScore} / 5.0。`|カード画像の代替テキスト、スクリーンリーダーでの利便性向上に関係|
82 |
83 | [lapras-card-generator](https://lapras-card-generator.vercel.app) を使うことで生成画像のPreviewや、環境変数の出力も可能です。
84 |
85 |
86 |
87 | Exportボタンの `GitHub Actions params` で、環境変数をコピーできます。
88 |
89 | 
90 |
--------------------------------------------------------------------------------
/__tests__/main.test.ts:
--------------------------------------------------------------------------------
1 | import {shareIdParser} from '../src/lib/getActionsParams'
2 | import {test, expect} from '@jest/globals'
3 | import {rewriteReadmeToIncludeCardText} from '../src/lib/rewriteReadmeToIncludeCardText'
4 |
5 | test.skip('rewriteReadmeToIncludeCardText', () => {
6 | // TODO: add text
7 | rewriteReadmeToIncludeCardText('', {} as any)
8 | })
9 |
10 | test.each([
11 | 'http://lapars.com/public/1234567890',
12 | 'https://lapars.com/public/1234567890'
13 | ])('shareIdParser throw error if get url', (shareId: string) => {
14 | expect(() => shareIdParser.parse(shareId)).toThrow()
15 | })
16 |
17 | test.each(['12345', 'kawamataryo', 'abcd1234'])(
18 | 'shareIdParser don`t throw error',
19 | (shareId: string) => {
20 | expect(() => shareIdParser.parse(shareId)).not.toThrow()
21 | }
22 | )
23 |
--------------------------------------------------------------------------------
/action.yml:
--------------------------------------------------------------------------------
1 | name: 'LAPRAS Card Readme'
2 | description: 'Add LAPRAS Card to your GitHub profile.'
3 | author: 'kawamataryo'
4 | inputs:
5 | GH_TOKEN:
6 | default: ${{ github.token }}
7 | required: false
8 | description: 'GitHub Token'
9 | SHARE_ID:
10 | required: true
11 | description: 'lapras public share id'
12 | README_FILE:
13 | required: false
14 | description: 'your repository readme file name'
15 | default: 'README.md'
16 | ICON_FIRST:
17 | required: false
18 | description: 'icon color 1'
19 | default: '#030E21'
20 | ICON_SECOND:
21 | required: false
22 | description: 'icon color 2'
23 | default: '#1688BF'
24 | BACKGROUND_FIRST:
25 | required: false
26 | description: 'background color 1'
27 | default: '#020E27'
28 | BACKGROUND_SECOND:
29 | required: false
30 | description: 'background color 2'
31 | default: '#0E5593'
32 | LANG:
33 | required: false
34 | description: 'language'
35 | default: 'ja'
36 | CARD_WIDTH:
37 | required: false
38 | description: 'card width'
39 | default: '400'
40 | UPDATE_TIME:
41 | required: false
42 | description: 'display of score update date and time'
43 | default: 'true'
44 | IS_CENTER:
45 | required: false
46 | description: 'Determines if the image is centered in the readme'
47 | default: 'false'
48 | ALTERNATIVE_TEXT:
49 | required: false
50 | description: 'Alternative text for LAPRAS Card, crucial for enhancing accessibility for screen reader users'
51 | default: ''
52 | runs:
53 | using: 'node16'
54 | main: 'dist/index.js'
55 |
56 | branding:
57 | icon: "credit-card"
58 | color: "blue"
59 |
--------------------------------------------------------------------------------
/dist/37.index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | exports.id = 37;
3 | exports.ids = [37];
4 | exports.modules = {
5 |
6 | /***/ 4037:
7 | /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
8 |
9 | __webpack_require__.r(__webpack_exports__);
10 | /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11 | /* harmony export */ "toFormData": () => (/* binding */ toFormData)
12 | /* harmony export */ });
13 | /* harmony import */ var fetch_blob_from_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2777);
14 | /* harmony import */ var formdata_polyfill_esm_min_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8010);
15 |
16 |
17 |
18 | let s = 0;
19 | const S = {
20 | START_BOUNDARY: s++,
21 | HEADER_FIELD_START: s++,
22 | HEADER_FIELD: s++,
23 | HEADER_VALUE_START: s++,
24 | HEADER_VALUE: s++,
25 | HEADER_VALUE_ALMOST_DONE: s++,
26 | HEADERS_ALMOST_DONE: s++,
27 | PART_DATA_START: s++,
28 | PART_DATA: s++,
29 | END: s++
30 | };
31 |
32 | let f = 1;
33 | const F = {
34 | PART_BOUNDARY: f,
35 | LAST_BOUNDARY: f *= 2
36 | };
37 |
38 | const LF = 10;
39 | const CR = 13;
40 | const SPACE = 32;
41 | const HYPHEN = 45;
42 | const COLON = 58;
43 | const A = 97;
44 | const Z = 122;
45 |
46 | const lower = c => c | 0x20;
47 |
48 | const noop = () => {};
49 |
50 | class MultipartParser {
51 | /**
52 | * @param {string} boundary
53 | */
54 | constructor(boundary) {
55 | this.index = 0;
56 | this.flags = 0;
57 |
58 | this.onHeaderEnd = noop;
59 | this.onHeaderField = noop;
60 | this.onHeadersEnd = noop;
61 | this.onHeaderValue = noop;
62 | this.onPartBegin = noop;
63 | this.onPartData = noop;
64 | this.onPartEnd = noop;
65 |
66 | this.boundaryChars = {};
67 |
68 | boundary = '\r\n--' + boundary;
69 | const ui8a = new Uint8Array(boundary.length);
70 | for (let i = 0; i < boundary.length; i++) {
71 | ui8a[i] = boundary.charCodeAt(i);
72 | this.boundaryChars[ui8a[i]] = true;
73 | }
74 |
75 | this.boundary = ui8a;
76 | this.lookbehind = new Uint8Array(this.boundary.length + 8);
77 | this.state = S.START_BOUNDARY;
78 | }
79 |
80 | /**
81 | * @param {Uint8Array} data
82 | */
83 | write(data) {
84 | let i = 0;
85 | const length_ = data.length;
86 | let previousIndex = this.index;
87 | let {lookbehind, boundary, boundaryChars, index, state, flags} = this;
88 | const boundaryLength = this.boundary.length;
89 | const boundaryEnd = boundaryLength - 1;
90 | const bufferLength = data.length;
91 | let c;
92 | let cl;
93 |
94 | const mark = name => {
95 | this[name + 'Mark'] = i;
96 | };
97 |
98 | const clear = name => {
99 | delete this[name + 'Mark'];
100 | };
101 |
102 | const callback = (callbackSymbol, start, end, ui8a) => {
103 | if (start === undefined || start !== end) {
104 | this[callbackSymbol](ui8a && ui8a.subarray(start, end));
105 | }
106 | };
107 |
108 | const dataCallback = (name, clear) => {
109 | const markSymbol = name + 'Mark';
110 | if (!(markSymbol in this)) {
111 | return;
112 | }
113 |
114 | if (clear) {
115 | callback(name, this[markSymbol], i, data);
116 | delete this[markSymbol];
117 | } else {
118 | callback(name, this[markSymbol], data.length, data);
119 | this[markSymbol] = 0;
120 | }
121 | };
122 |
123 | for (i = 0; i < length_; i++) {
124 | c = data[i];
125 |
126 | switch (state) {
127 | case S.START_BOUNDARY:
128 | if (index === boundary.length - 2) {
129 | if (c === HYPHEN) {
130 | flags |= F.LAST_BOUNDARY;
131 | } else if (c !== CR) {
132 | return;
133 | }
134 |
135 | index++;
136 | break;
137 | } else if (index - 1 === boundary.length - 2) {
138 | if (flags & F.LAST_BOUNDARY && c === HYPHEN) {
139 | state = S.END;
140 | flags = 0;
141 | } else if (!(flags & F.LAST_BOUNDARY) && c === LF) {
142 | index = 0;
143 | callback('onPartBegin');
144 | state = S.HEADER_FIELD_START;
145 | } else {
146 | return;
147 | }
148 |
149 | break;
150 | }
151 |
152 | if (c !== boundary[index + 2]) {
153 | index = -2;
154 | }
155 |
156 | if (c === boundary[index + 2]) {
157 | index++;
158 | }
159 |
160 | break;
161 | case S.HEADER_FIELD_START:
162 | state = S.HEADER_FIELD;
163 | mark('onHeaderField');
164 | index = 0;
165 | // falls through
166 | case S.HEADER_FIELD:
167 | if (c === CR) {
168 | clear('onHeaderField');
169 | state = S.HEADERS_ALMOST_DONE;
170 | break;
171 | }
172 |
173 | index++;
174 | if (c === HYPHEN) {
175 | break;
176 | }
177 |
178 | if (c === COLON) {
179 | if (index === 1) {
180 | // empty header field
181 | return;
182 | }
183 |
184 | dataCallback('onHeaderField', true);
185 | state = S.HEADER_VALUE_START;
186 | break;
187 | }
188 |
189 | cl = lower(c);
190 | if (cl < A || cl > Z) {
191 | return;
192 | }
193 |
194 | break;
195 | case S.HEADER_VALUE_START:
196 | if (c === SPACE) {
197 | break;
198 | }
199 |
200 | mark('onHeaderValue');
201 | state = S.HEADER_VALUE;
202 | // falls through
203 | case S.HEADER_VALUE:
204 | if (c === CR) {
205 | dataCallback('onHeaderValue', true);
206 | callback('onHeaderEnd');
207 | state = S.HEADER_VALUE_ALMOST_DONE;
208 | }
209 |
210 | break;
211 | case S.HEADER_VALUE_ALMOST_DONE:
212 | if (c !== LF) {
213 | return;
214 | }
215 |
216 | state = S.HEADER_FIELD_START;
217 | break;
218 | case S.HEADERS_ALMOST_DONE:
219 | if (c !== LF) {
220 | return;
221 | }
222 |
223 | callback('onHeadersEnd');
224 | state = S.PART_DATA_START;
225 | break;
226 | case S.PART_DATA_START:
227 | state = S.PART_DATA;
228 | mark('onPartData');
229 | // falls through
230 | case S.PART_DATA:
231 | previousIndex = index;
232 |
233 | if (index === 0) {
234 | // boyer-moore derrived algorithm to safely skip non-boundary data
235 | i += boundaryEnd;
236 | while (i < bufferLength && !(data[i] in boundaryChars)) {
237 | i += boundaryLength;
238 | }
239 |
240 | i -= boundaryEnd;
241 | c = data[i];
242 | }
243 |
244 | if (index < boundary.length) {
245 | if (boundary[index] === c) {
246 | if (index === 0) {
247 | dataCallback('onPartData', true);
248 | }
249 |
250 | index++;
251 | } else {
252 | index = 0;
253 | }
254 | } else if (index === boundary.length) {
255 | index++;
256 | if (c === CR) {
257 | // CR = part boundary
258 | flags |= F.PART_BOUNDARY;
259 | } else if (c === HYPHEN) {
260 | // HYPHEN = end boundary
261 | flags |= F.LAST_BOUNDARY;
262 | } else {
263 | index = 0;
264 | }
265 | } else if (index - 1 === boundary.length) {
266 | if (flags & F.PART_BOUNDARY) {
267 | index = 0;
268 | if (c === LF) {
269 | // unset the PART_BOUNDARY flag
270 | flags &= ~F.PART_BOUNDARY;
271 | callback('onPartEnd');
272 | callback('onPartBegin');
273 | state = S.HEADER_FIELD_START;
274 | break;
275 | }
276 | } else if (flags & F.LAST_BOUNDARY) {
277 | if (c === HYPHEN) {
278 | callback('onPartEnd');
279 | state = S.END;
280 | flags = 0;
281 | } else {
282 | index = 0;
283 | }
284 | } else {
285 | index = 0;
286 | }
287 | }
288 |
289 | if (index > 0) {
290 | // when matching a possible boundary, keep a lookbehind reference
291 | // in case it turns out to be a false lead
292 | lookbehind[index - 1] = c;
293 | } else if (previousIndex > 0) {
294 | // if our boundary turned out to be rubbish, the captured lookbehind
295 | // belongs to partData
296 | const _lookbehind = new Uint8Array(lookbehind.buffer, lookbehind.byteOffset, lookbehind.byteLength);
297 | callback('onPartData', 0, previousIndex, _lookbehind);
298 | previousIndex = 0;
299 | mark('onPartData');
300 |
301 | // reconsider the current character even so it interrupted the sequence
302 | // it could be the beginning of a new sequence
303 | i--;
304 | }
305 |
306 | break;
307 | case S.END:
308 | break;
309 | default:
310 | throw new Error(`Unexpected state entered: ${state}`);
311 | }
312 | }
313 |
314 | dataCallback('onHeaderField');
315 | dataCallback('onHeaderValue');
316 | dataCallback('onPartData');
317 |
318 | // Update properties for the next call
319 | this.index = index;
320 | this.state = state;
321 | this.flags = flags;
322 | }
323 |
324 | end() {
325 | if ((this.state === S.HEADER_FIELD_START && this.index === 0) ||
326 | (this.state === S.PART_DATA && this.index === this.boundary.length)) {
327 | this.onPartEnd();
328 | } else if (this.state !== S.END) {
329 | throw new Error('MultipartParser.end(): stream ended unexpectedly');
330 | }
331 | }
332 | }
333 |
334 | function _fileName(headerValue) {
335 | // matches either a quoted-string or a token (RFC 2616 section 19.5.1)
336 | const m = headerValue.match(/\bfilename=("(.*?)"|([^()<>@,;:\\"/[\]?={}\s\t]+))($|;\s)/i);
337 | if (!m) {
338 | return;
339 | }
340 |
341 | const match = m[2] || m[3] || '';
342 | let filename = match.slice(match.lastIndexOf('\\') + 1);
343 | filename = filename.replace(/%22/g, '"');
344 | filename = filename.replace(/(\d{4});/g, (m, code) => {
345 | return String.fromCharCode(code);
346 | });
347 | return filename;
348 | }
349 |
350 | async function toFormData(Body, ct) {
351 | if (!/multipart/i.test(ct)) {
352 | throw new TypeError('Failed to fetch');
353 | }
354 |
355 | const m = ct.match(/boundary=(?:"([^"]+)"|([^;]+))/i);
356 |
357 | if (!m) {
358 | throw new TypeError('no or bad content-type header, no multipart boundary');
359 | }
360 |
361 | const parser = new MultipartParser(m[1] || m[2]);
362 |
363 | let headerField;
364 | let headerValue;
365 | let entryValue;
366 | let entryName;
367 | let contentType;
368 | let filename;
369 | const entryChunks = [];
370 | const formData = new formdata_polyfill_esm_min_js__WEBPACK_IMPORTED_MODULE_1__/* .FormData */ .Ct();
371 |
372 | const onPartData = ui8a => {
373 | entryValue += decoder.decode(ui8a, {stream: true});
374 | };
375 |
376 | const appendToFile = ui8a => {
377 | entryChunks.push(ui8a);
378 | };
379 |
380 | const appendFileToFormData = () => {
381 | const file = new fetch_blob_from_js__WEBPACK_IMPORTED_MODULE_0__/* .File */ .$B(entryChunks, filename, {type: contentType});
382 | formData.append(entryName, file);
383 | };
384 |
385 | const appendEntryToFormData = () => {
386 | formData.append(entryName, entryValue);
387 | };
388 |
389 | const decoder = new TextDecoder('utf-8');
390 | decoder.decode();
391 |
392 | parser.onPartBegin = function () {
393 | parser.onPartData = onPartData;
394 | parser.onPartEnd = appendEntryToFormData;
395 |
396 | headerField = '';
397 | headerValue = '';
398 | entryValue = '';
399 | entryName = '';
400 | contentType = '';
401 | filename = null;
402 | entryChunks.length = 0;
403 | };
404 |
405 | parser.onHeaderField = function (ui8a) {
406 | headerField += decoder.decode(ui8a, {stream: true});
407 | };
408 |
409 | parser.onHeaderValue = function (ui8a) {
410 | headerValue += decoder.decode(ui8a, {stream: true});
411 | };
412 |
413 | parser.onHeaderEnd = function () {
414 | headerValue += decoder.decode();
415 | headerField = headerField.toLowerCase();
416 |
417 | if (headerField === 'content-disposition') {
418 | // matches either a quoted-string or a token (RFC 2616 section 19.5.1)
419 | const m = headerValue.match(/\bname=("([^"]*)"|([^()<>@,;:\\"/[\]?={}\s\t]+))/i);
420 |
421 | if (m) {
422 | entryName = m[2] || m[3] || '';
423 | }
424 |
425 | filename = _fileName(headerValue);
426 |
427 | if (filename) {
428 | parser.onPartData = appendToFile;
429 | parser.onPartEnd = appendFileToFormData;
430 | }
431 | } else if (headerField === 'content-type') {
432 | contentType = headerValue;
433 | }
434 |
435 | headerValue = '';
436 | headerField = '';
437 | };
438 |
439 | for await (const chunk of Body) {
440 | parser.write(chunk);
441 | }
442 |
443 | parser.end();
444 |
445 | return formData;
446 | }
447 |
448 |
449 | /***/ })
450 |
451 | };
452 | ;
453 | //# sourceMappingURL=37.index.js.map
--------------------------------------------------------------------------------
/dist/37.index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"37.index.js","mappings":";;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","sources":["webpack://lapras-card-readme/./node_modules/node-fetch/src/utils/multipart-parser.js"],"sourcesContent":["import {File} from 'fetch-blob/from.js';\nimport {FormData} from 'formdata-polyfill/esm.min.js';\n\nlet s = 0;\nconst S = {\n\tSTART_BOUNDARY: s++,\n\tHEADER_FIELD_START: s++,\n\tHEADER_FIELD: s++,\n\tHEADER_VALUE_START: s++,\n\tHEADER_VALUE: s++,\n\tHEADER_VALUE_ALMOST_DONE: s++,\n\tHEADERS_ALMOST_DONE: s++,\n\tPART_DATA_START: s++,\n\tPART_DATA: s++,\n\tEND: s++\n};\n\nlet f = 1;\nconst F = {\n\tPART_BOUNDARY: f,\n\tLAST_BOUNDARY: f *= 2\n};\n\nconst LF = 10;\nconst CR = 13;\nconst SPACE = 32;\nconst HYPHEN = 45;\nconst COLON = 58;\nconst A = 97;\nconst Z = 122;\n\nconst lower = c => c | 0x20;\n\nconst noop = () => {};\n\nclass MultipartParser {\n\t/**\n\t * @param {string} boundary\n\t */\n\tconstructor(boundary) {\n\t\tthis.index = 0;\n\t\tthis.flags = 0;\n\n\t\tthis.onHeaderEnd = noop;\n\t\tthis.onHeaderField = noop;\n\t\tthis.onHeadersEnd = noop;\n\t\tthis.onHeaderValue = noop;\n\t\tthis.onPartBegin = noop;\n\t\tthis.onPartData = noop;\n\t\tthis.onPartEnd = noop;\n\n\t\tthis.boundaryChars = {};\n\n\t\tboundary = '\\r\\n--' + boundary;\n\t\tconst ui8a = new Uint8Array(boundary.length);\n\t\tfor (let i = 0; i < boundary.length; i++) {\n\t\t\tui8a[i] = boundary.charCodeAt(i);\n\t\t\tthis.boundaryChars[ui8a[i]] = true;\n\t\t}\n\n\t\tthis.boundary = ui8a;\n\t\tthis.lookbehind = new Uint8Array(this.boundary.length + 8);\n\t\tthis.state = S.START_BOUNDARY;\n\t}\n\n\t/**\n\t * @param {Uint8Array} data\n\t */\n\twrite(data) {\n\t\tlet i = 0;\n\t\tconst length_ = data.length;\n\t\tlet previousIndex = this.index;\n\t\tlet {lookbehind, boundary, boundaryChars, index, state, flags} = this;\n\t\tconst boundaryLength = this.boundary.length;\n\t\tconst boundaryEnd = boundaryLength - 1;\n\t\tconst bufferLength = data.length;\n\t\tlet c;\n\t\tlet cl;\n\n\t\tconst mark = name => {\n\t\t\tthis[name + 'Mark'] = i;\n\t\t};\n\n\t\tconst clear = name => {\n\t\t\tdelete this[name + 'Mark'];\n\t\t};\n\n\t\tconst callback = (callbackSymbol, start, end, ui8a) => {\n\t\t\tif (start === undefined || start !== end) {\n\t\t\t\tthis[callbackSymbol](ui8a && ui8a.subarray(start, end));\n\t\t\t}\n\t\t};\n\n\t\tconst dataCallback = (name, clear) => {\n\t\t\tconst markSymbol = name + 'Mark';\n\t\t\tif (!(markSymbol in this)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (clear) {\n\t\t\t\tcallback(name, this[markSymbol], i, data);\n\t\t\t\tdelete this[markSymbol];\n\t\t\t} else {\n\t\t\t\tcallback(name, this[markSymbol], data.length, data);\n\t\t\t\tthis[markSymbol] = 0;\n\t\t\t}\n\t\t};\n\n\t\tfor (i = 0; i < length_; i++) {\n\t\t\tc = data[i];\n\n\t\t\tswitch (state) {\n\t\t\t\tcase S.START_BOUNDARY:\n\t\t\t\t\tif (index === boundary.length - 2) {\n\t\t\t\t\t\tif (c === HYPHEN) {\n\t\t\t\t\t\t\tflags |= F.LAST_BOUNDARY;\n\t\t\t\t\t\t} else if (c !== CR) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tindex++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (index - 1 === boundary.length - 2) {\n\t\t\t\t\t\tif (flags & F.LAST_BOUNDARY && c === HYPHEN) {\n\t\t\t\t\t\t\tstate = S.END;\n\t\t\t\t\t\t\tflags = 0;\n\t\t\t\t\t\t} else if (!(flags & F.LAST_BOUNDARY) && c === LF) {\n\t\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\t\tcallback('onPartBegin');\n\t\t\t\t\t\t\tstate = S.HEADER_FIELD_START;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (c !== boundary[index + 2]) {\n\t\t\t\t\t\tindex = -2;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (c === boundary[index + 2]) {\n\t\t\t\t\t\tindex++;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase S.HEADER_FIELD_START:\n\t\t\t\t\tstate = S.HEADER_FIELD;\n\t\t\t\t\tmark('onHeaderField');\n\t\t\t\t\tindex = 0;\n\t\t\t\t\t// falls through\n\t\t\t\tcase S.HEADER_FIELD:\n\t\t\t\t\tif (c === CR) {\n\t\t\t\t\t\tclear('onHeaderField');\n\t\t\t\t\t\tstate = S.HEADERS_ALMOST_DONE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tindex++;\n\t\t\t\t\tif (c === HYPHEN) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (c === COLON) {\n\t\t\t\t\t\tif (index === 1) {\n\t\t\t\t\t\t\t// empty header field\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdataCallback('onHeaderField', true);\n\t\t\t\t\t\tstate = S.HEADER_VALUE_START;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcl = lower(c);\n\t\t\t\t\tif (cl < A || cl > Z) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase S.HEADER_VALUE_START:\n\t\t\t\t\tif (c === SPACE) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tmark('onHeaderValue');\n\t\t\t\t\tstate = S.HEADER_VALUE;\n\t\t\t\t\t// falls through\n\t\t\t\tcase S.HEADER_VALUE:\n\t\t\t\t\tif (c === CR) {\n\t\t\t\t\t\tdataCallback('onHeaderValue', true);\n\t\t\t\t\t\tcallback('onHeaderEnd');\n\t\t\t\t\t\tstate = S.HEADER_VALUE_ALMOST_DONE;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase S.HEADER_VALUE_ALMOST_DONE:\n\t\t\t\t\tif (c !== LF) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tstate = S.HEADER_FIELD_START;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S.HEADERS_ALMOST_DONE:\n\t\t\t\t\tif (c !== LF) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback('onHeadersEnd');\n\t\t\t\t\tstate = S.PART_DATA_START;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S.PART_DATA_START:\n\t\t\t\t\tstate = S.PART_DATA;\n\t\t\t\t\tmark('onPartData');\n\t\t\t\t\t// falls through\n\t\t\t\tcase S.PART_DATA:\n\t\t\t\t\tpreviousIndex = index;\n\n\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t// boyer-moore derrived algorithm to safely skip non-boundary data\n\t\t\t\t\t\ti += boundaryEnd;\n\t\t\t\t\t\twhile (i < bufferLength && !(data[i] in boundaryChars)) {\n\t\t\t\t\t\t\ti += boundaryLength;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ti -= boundaryEnd;\n\t\t\t\t\t\tc = data[i];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (index < boundary.length) {\n\t\t\t\t\t\tif (boundary[index] === c) {\n\t\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\t\tdataCallback('onPartData', true);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tindex++;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (index === boundary.length) {\n\t\t\t\t\t\tindex++;\n\t\t\t\t\t\tif (c === CR) {\n\t\t\t\t\t\t\t// CR = part boundary\n\t\t\t\t\t\t\tflags |= F.PART_BOUNDARY;\n\t\t\t\t\t\t} else if (c === HYPHEN) {\n\t\t\t\t\t\t\t// HYPHEN = end boundary\n\t\t\t\t\t\t\tflags |= F.LAST_BOUNDARY;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (index - 1 === boundary.length) {\n\t\t\t\t\t\tif (flags & F.PART_BOUNDARY) {\n\t\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\t\tif (c === LF) {\n\t\t\t\t\t\t\t\t// unset the PART_BOUNDARY flag\n\t\t\t\t\t\t\t\tflags &= ~F.PART_BOUNDARY;\n\t\t\t\t\t\t\t\tcallback('onPartEnd');\n\t\t\t\t\t\t\t\tcallback('onPartBegin');\n\t\t\t\t\t\t\t\tstate = S.HEADER_FIELD_START;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (flags & F.LAST_BOUNDARY) {\n\t\t\t\t\t\t\tif (c === HYPHEN) {\n\t\t\t\t\t\t\t\tcallback('onPartEnd');\n\t\t\t\t\t\t\t\tstate = S.END;\n\t\t\t\t\t\t\t\tflags = 0;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (index > 0) {\n\t\t\t\t\t\t// when matching a possible boundary, keep a lookbehind reference\n\t\t\t\t\t\t// in case it turns out to be a false lead\n\t\t\t\t\t\tlookbehind[index - 1] = c;\n\t\t\t\t\t} else if (previousIndex > 0) {\n\t\t\t\t\t\t// if our boundary turned out to be rubbish, the captured lookbehind\n\t\t\t\t\t\t// belongs to partData\n\t\t\t\t\t\tconst _lookbehind = new Uint8Array(lookbehind.buffer, lookbehind.byteOffset, lookbehind.byteLength);\n\t\t\t\t\t\tcallback('onPartData', 0, previousIndex, _lookbehind);\n\t\t\t\t\t\tpreviousIndex = 0;\n\t\t\t\t\t\tmark('onPartData');\n\n\t\t\t\t\t\t// reconsider the current character even so it interrupted the sequence\n\t\t\t\t\t\t// it could be the beginning of a new sequence\n\t\t\t\t\t\ti--;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase S.END:\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unexpected state entered: ${state}`);\n\t\t\t}\n\t\t}\n\n\t\tdataCallback('onHeaderField');\n\t\tdataCallback('onHeaderValue');\n\t\tdataCallback('onPartData');\n\n\t\t// Update properties for the next call\n\t\tthis.index = index;\n\t\tthis.state = state;\n\t\tthis.flags = flags;\n\t}\n\n\tend() {\n\t\tif ((this.state === S.HEADER_FIELD_START && this.index === 0) ||\n\t\t\t(this.state === S.PART_DATA && this.index === this.boundary.length)) {\n\t\t\tthis.onPartEnd();\n\t\t} else if (this.state !== S.END) {\n\t\t\tthrow new Error('MultipartParser.end(): stream ended unexpectedly');\n\t\t}\n\t}\n}\n\nfunction _fileName(headerValue) {\n\t// matches either a quoted-string or a token (RFC 2616 section 19.5.1)\n\tconst m = headerValue.match(/\\bfilename=(\"(.*?)\"|([^()<>@,;:\\\\\"/[\\]?={}\\s\\t]+))($|;\\s)/i);\n\tif (!m) {\n\t\treturn;\n\t}\n\n\tconst match = m[2] || m[3] || '';\n\tlet filename = match.slice(match.lastIndexOf('\\\\') + 1);\n\tfilename = filename.replace(/%22/g, '\"');\n\tfilename = filename.replace(/(\\d{4});/g, (m, code) => {\n\t\treturn String.fromCharCode(code);\n\t});\n\treturn filename;\n}\n\nexport async function toFormData(Body, ct) {\n\tif (!/multipart/i.test(ct)) {\n\t\tthrow new TypeError('Failed to fetch');\n\t}\n\n\tconst m = ct.match(/boundary=(?:\"([^\"]+)\"|([^;]+))/i);\n\n\tif (!m) {\n\t\tthrow new TypeError('no or bad content-type header, no multipart boundary');\n\t}\n\n\tconst parser = new MultipartParser(m[1] || m[2]);\n\n\tlet headerField;\n\tlet headerValue;\n\tlet entryValue;\n\tlet entryName;\n\tlet contentType;\n\tlet filename;\n\tconst entryChunks = [];\n\tconst formData = new FormData();\n\n\tconst onPartData = ui8a => {\n\t\tentryValue += decoder.decode(ui8a, {stream: true});\n\t};\n\n\tconst appendToFile = ui8a => {\n\t\tentryChunks.push(ui8a);\n\t};\n\n\tconst appendFileToFormData = () => {\n\t\tconst file = new File(entryChunks, filename, {type: contentType});\n\t\tformData.append(entryName, file);\n\t};\n\n\tconst appendEntryToFormData = () => {\n\t\tformData.append(entryName, entryValue);\n\t};\n\n\tconst decoder = new TextDecoder('utf-8');\n\tdecoder.decode();\n\n\tparser.onPartBegin = function () {\n\t\tparser.onPartData = onPartData;\n\t\tparser.onPartEnd = appendEntryToFormData;\n\n\t\theaderField = '';\n\t\theaderValue = '';\n\t\tentryValue = '';\n\t\tentryName = '';\n\t\tcontentType = '';\n\t\tfilename = null;\n\t\tentryChunks.length = 0;\n\t};\n\n\tparser.onHeaderField = function (ui8a) {\n\t\theaderField += decoder.decode(ui8a, {stream: true});\n\t};\n\n\tparser.onHeaderValue = function (ui8a) {\n\t\theaderValue += decoder.decode(ui8a, {stream: true});\n\t};\n\n\tparser.onHeaderEnd = function () {\n\t\theaderValue += decoder.decode();\n\t\theaderField = headerField.toLowerCase();\n\n\t\tif (headerField === 'content-disposition') {\n\t\t\t// matches either a quoted-string or a token (RFC 2616 section 19.5.1)\n\t\t\tconst m = headerValue.match(/\\bname=(\"([^\"]*)\"|([^()<>@,;:\\\\\"/[\\]?={}\\s\\t]+))/i);\n\n\t\t\tif (m) {\n\t\t\t\tentryName = m[2] || m[3] || '';\n\t\t\t}\n\n\t\t\tfilename = _fileName(headerValue);\n\n\t\t\tif (filename) {\n\t\t\t\tparser.onPartData = appendToFile;\n\t\t\t\tparser.onPartEnd = appendFileToFormData;\n\t\t\t}\n\t\t} else if (headerField === 'content-type') {\n\t\t\tcontentType = headerValue;\n\t\t}\n\n\t\theaderValue = '';\n\t\theaderField = '';\n\t};\n\n\tfor await (const chunk of Body) {\n\t\tparser.write(chunk);\n\t}\n\n\tparser.end();\n\n\treturn formData;\n}\n"],"names":[],"sourceRoot":""}
--------------------------------------------------------------------------------
/dist/licenses.txt:
--------------------------------------------------------------------------------
1 | node-fetch
2 | MIT
3 | The MIT License (MIT)
4 |
5 | Copyright (c) 2016 David Frank
6 |
7 | Permission is hereby granted, free of charge, to any person obtaining a copy
8 | of this software and associated documentation files (the "Software"), to deal
9 | in the Software without restriction, including without limitation the rights
10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | copies of the Software, and to permit persons to whom the Software is
12 | furnished to do so, subject to the following conditions:
13 |
14 | The above copyright notice and this permission notice shall be included in all
15 | copies or substantial portions of the Software.
16 |
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 | SOFTWARE.
24 |
--------------------------------------------------------------------------------
/dist/sourcemap-register.js:
--------------------------------------------------------------------------------
1 | (()=>{var e={650:e=>{var r=Object.prototype.toString;var n=typeof Buffer.alloc==="function"&&typeof Buffer.allocUnsafe==="function"&&typeof Buffer.from==="function";function isArrayBuffer(e){return r.call(e).slice(8,-1)==="ArrayBuffer"}function fromArrayBuffer(e,r,t){r>>>=0;var o=e.byteLength-r;if(o<0){throw new RangeError("'offset' is out of bounds")}if(t===undefined){t=o}else{t>>>=0;if(t>o){throw new RangeError("'length' is out of bounds")}}return n?Buffer.from(e.slice(r,r+t)):new Buffer(new Uint8Array(e.slice(r,r+t)))}function fromString(e,r){if(typeof r!=="string"||r===""){r="utf8"}if(!Buffer.isEncoding(r)){throw new TypeError('"encoding" must be a valid string encoding')}return n?Buffer.from(e,r):new Buffer(e,r)}function bufferFrom(e,r,t){if(typeof e==="number"){throw new TypeError('"value" argument must not be a number')}if(isArrayBuffer(e)){return fromArrayBuffer(e,r,t)}if(typeof e==="string"){return fromString(e,r)}return n?Buffer.from(e):new Buffer(e)}e.exports=bufferFrom},274:(e,r,n)=>{var t=n(339);var o=Object.prototype.hasOwnProperty;var i=typeof Map!=="undefined";function ArraySet(){this._array=[];this._set=i?new Map:Object.create(null)}ArraySet.fromArray=function ArraySet_fromArray(e,r){var n=new ArraySet;for(var t=0,o=e.length;t=0){return r}}else{var n=t.toSetString(e);if(o.call(this._set,n)){return this._set[n]}}throw new Error('"'+e+'" is not in the set.')};ArraySet.prototype.at=function ArraySet_at(e){if(e>=0&&e{var t=n(190);var o=5;var i=1<>1;return r?-n:n}r.encode=function base64VLQ_encode(e){var r="";var n;var i=toVLQSigned(e);do{n=i&a;i>>>=o;if(i>0){n|=u}r+=t.encode(n)}while(i>0);return r};r.decode=function base64VLQ_decode(e,r,n){var i=e.length;var s=0;var l=0;var c,p;do{if(r>=i){throw new Error("Expected more digits in base 64 VLQ value.")}p=t.decode(e.charCodeAt(r++));if(p===-1){throw new Error("Invalid base64 digit: "+e.charAt(r-1))}c=!!(p&u);p&=a;s=s+(p<{var n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");r.encode=function(e){if(0<=e&&e{r.GREATEST_LOWER_BOUND=1;r.LEAST_UPPER_BOUND=2;function recursiveSearch(e,n,t,o,i,a){var u=Math.floor((n-e)/2)+e;var s=i(t,o[u],true);if(s===0){return u}else if(s>0){if(n-u>1){return recursiveSearch(u,n,t,o,i,a)}if(a==r.LEAST_UPPER_BOUND){return n1){return recursiveSearch(e,u,t,o,i,a)}if(a==r.LEAST_UPPER_BOUND){return u}else{return e<0?-1:e}}}r.search=function search(e,n,t,o){if(n.length===0){return-1}var i=recursiveSearch(-1,n.length,e,n,t,o||r.GREATEST_LOWER_BOUND);if(i<0){return-1}while(i-1>=0){if(t(n[i],n[i-1],true)!==0){break}--i}return i}},680:(e,r,n)=>{var t=n(339);function generatedPositionAfter(e,r){var n=e.generatedLine;var o=r.generatedLine;var i=e.generatedColumn;var a=r.generatedColumn;return o>n||o==n&&a>=i||t.compareByGeneratedPositionsInflated(e,r)<=0}function MappingList(){this._array=[];this._sorted=true;this._last={generatedLine:-1,generatedColumn:0}}MappingList.prototype.unsortedForEach=function MappingList_forEach(e,r){this._array.forEach(e,r)};MappingList.prototype.add=function MappingList_add(e){if(generatedPositionAfter(this._last,e)){this._last=e;this._array.push(e)}else{this._sorted=false;this._array.push(e)}};MappingList.prototype.toArray=function MappingList_toArray(){if(!this._sorted){this._array.sort(t.compareByGeneratedPositionsInflated);this._sorted=true}return this._array};r.H=MappingList},758:(e,r)=>{function swap(e,r,n){var t=e[r];e[r]=e[n];e[n]=t}function randomIntInRange(e,r){return Math.round(e+Math.random()*(r-e))}function doQuickSort(e,r,n,t){if(n{var t;var o=n(339);var i=n(345);var a=n(274).I;var u=n(449);var s=n(758).U;function SourceMapConsumer(e,r){var n=e;if(typeof e==="string"){n=o.parseSourceMapInput(e)}return n.sections!=null?new IndexedSourceMapConsumer(n,r):new BasicSourceMapConsumer(n,r)}SourceMapConsumer.fromSourceMap=function(e,r){return BasicSourceMapConsumer.fromSourceMap(e,r)};SourceMapConsumer.prototype._version=3;SourceMapConsumer.prototype.__generatedMappings=null;Object.defineProperty(SourceMapConsumer.prototype,"_generatedMappings",{configurable:true,enumerable:true,get:function(){if(!this.__generatedMappings){this._parseMappings(this._mappings,this.sourceRoot)}return this.__generatedMappings}});SourceMapConsumer.prototype.__originalMappings=null;Object.defineProperty(SourceMapConsumer.prototype,"_originalMappings",{configurable:true,enumerable:true,get:function(){if(!this.__originalMappings){this._parseMappings(this._mappings,this.sourceRoot)}return this.__originalMappings}});SourceMapConsumer.prototype._charIsMappingSeparator=function SourceMapConsumer_charIsMappingSeparator(e,r){var n=e.charAt(r);return n===";"||n===","};SourceMapConsumer.prototype._parseMappings=function SourceMapConsumer_parseMappings(e,r){throw new Error("Subclasses must implement _parseMappings")};SourceMapConsumer.GENERATED_ORDER=1;SourceMapConsumer.ORIGINAL_ORDER=2;SourceMapConsumer.GREATEST_LOWER_BOUND=1;SourceMapConsumer.LEAST_UPPER_BOUND=2;SourceMapConsumer.prototype.eachMapping=function SourceMapConsumer_eachMapping(e,r,n){var t=r||null;var i=n||SourceMapConsumer.GENERATED_ORDER;var a;switch(i){case SourceMapConsumer.GENERATED_ORDER:a=this._generatedMappings;break;case SourceMapConsumer.ORIGINAL_ORDER:a=this._originalMappings;break;default:throw new Error("Unknown order of iteration.")}var u=this.sourceRoot;a.map((function(e){var r=e.source===null?null:this._sources.at(e.source);r=o.computeSourceURL(u,r,this._sourceMapURL);return{source:r,generatedLine:e.generatedLine,generatedColumn:e.generatedColumn,originalLine:e.originalLine,originalColumn:e.originalColumn,name:e.name===null?null:this._names.at(e.name)}}),this).forEach(e,t)};SourceMapConsumer.prototype.allGeneratedPositionsFor=function SourceMapConsumer_allGeneratedPositionsFor(e){var r=o.getArg(e,"line");var n={source:o.getArg(e,"source"),originalLine:r,originalColumn:o.getArg(e,"column",0)};n.source=this._findSourceIndex(n.source);if(n.source<0){return[]}var t=[];var a=this._findMapping(n,this._originalMappings,"originalLine","originalColumn",o.compareByOriginalPositions,i.LEAST_UPPER_BOUND);if(a>=0){var u=this._originalMappings[a];if(e.column===undefined){var s=u.originalLine;while(u&&u.originalLine===s){t.push({line:o.getArg(u,"generatedLine",null),column:o.getArg(u,"generatedColumn",null),lastColumn:o.getArg(u,"lastGeneratedColumn",null)});u=this._originalMappings[++a]}}else{var l=u.originalColumn;while(u&&u.originalLine===r&&u.originalColumn==l){t.push({line:o.getArg(u,"generatedLine",null),column:o.getArg(u,"generatedColumn",null),lastColumn:o.getArg(u,"lastGeneratedColumn",null)});u=this._originalMappings[++a]}}}return t};r.SourceMapConsumer=SourceMapConsumer;function BasicSourceMapConsumer(e,r){var n=e;if(typeof e==="string"){n=o.parseSourceMapInput(e)}var t=o.getArg(n,"version");var i=o.getArg(n,"sources");var u=o.getArg(n,"names",[]);var s=o.getArg(n,"sourceRoot",null);var l=o.getArg(n,"sourcesContent",null);var c=o.getArg(n,"mappings");var p=o.getArg(n,"file",null);if(t!=this._version){throw new Error("Unsupported version: "+t)}if(s){s=o.normalize(s)}i=i.map(String).map(o.normalize).map((function(e){return s&&o.isAbsolute(s)&&o.isAbsolute(e)?o.relative(s,e):e}));this._names=a.fromArray(u.map(String),true);this._sources=a.fromArray(i,true);this._absoluteSources=this._sources.toArray().map((function(e){return o.computeSourceURL(s,e,r)}));this.sourceRoot=s;this.sourcesContent=l;this._mappings=c;this._sourceMapURL=r;this.file=p}BasicSourceMapConsumer.prototype=Object.create(SourceMapConsumer.prototype);BasicSourceMapConsumer.prototype.consumer=SourceMapConsumer;BasicSourceMapConsumer.prototype._findSourceIndex=function(e){var r=e;if(this.sourceRoot!=null){r=o.relative(this.sourceRoot,r)}if(this._sources.has(r)){return this._sources.indexOf(r)}var n;for(n=0;n1){v.source=l+_[1];l+=_[1];v.originalLine=i+_[2];i=v.originalLine;v.originalLine+=1;v.originalColumn=a+_[3];a=v.originalColumn;if(_.length>4){v.name=c+_[4];c+=_[4]}}m.push(v);if(typeof v.originalLine==="number"){d.push(v)}}}s(m,o.compareByGeneratedPositionsDeflated);this.__generatedMappings=m;s(d,o.compareByOriginalPositions);this.__originalMappings=d};BasicSourceMapConsumer.prototype._findMapping=function SourceMapConsumer_findMapping(e,r,n,t,o,a){if(e[n]<=0){throw new TypeError("Line must be greater than or equal to 1, got "+e[n])}if(e[t]<0){throw new TypeError("Column must be greater than or equal to 0, got "+e[t])}return i.search(e,r,o,a)};BasicSourceMapConsumer.prototype.computeColumnSpans=function SourceMapConsumer_computeColumnSpans(){for(var e=0;e=0){var t=this._generatedMappings[n];if(t.generatedLine===r.generatedLine){var i=o.getArg(t,"source",null);if(i!==null){i=this._sources.at(i);i=o.computeSourceURL(this.sourceRoot,i,this._sourceMapURL)}var a=o.getArg(t,"name",null);if(a!==null){a=this._names.at(a)}return{source:i,line:o.getArg(t,"originalLine",null),column:o.getArg(t,"originalColumn",null),name:a}}}return{source:null,line:null,column:null,name:null}};BasicSourceMapConsumer.prototype.hasContentsOfAllSources=function BasicSourceMapConsumer_hasContentsOfAllSources(){if(!this.sourcesContent){return false}return this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some((function(e){return e==null}))};BasicSourceMapConsumer.prototype.sourceContentFor=function SourceMapConsumer_sourceContentFor(e,r){if(!this.sourcesContent){return null}var n=this._findSourceIndex(e);if(n>=0){return this.sourcesContent[n]}var t=e;if(this.sourceRoot!=null){t=o.relative(this.sourceRoot,t)}var i;if(this.sourceRoot!=null&&(i=o.urlParse(this.sourceRoot))){var a=t.replace(/^file:\/\//,"");if(i.scheme=="file"&&this._sources.has(a)){return this.sourcesContent[this._sources.indexOf(a)]}if((!i.path||i.path=="/")&&this._sources.has("/"+t)){return this.sourcesContent[this._sources.indexOf("/"+t)]}}if(r){return null}else{throw new Error('"'+t+'" is not in the SourceMap.')}};BasicSourceMapConsumer.prototype.generatedPositionFor=function SourceMapConsumer_generatedPositionFor(e){var r=o.getArg(e,"source");r=this._findSourceIndex(r);if(r<0){return{line:null,column:null,lastColumn:null}}var n={source:r,originalLine:o.getArg(e,"line"),originalColumn:o.getArg(e,"column")};var t=this._findMapping(n,this._originalMappings,"originalLine","originalColumn",o.compareByOriginalPositions,o.getArg(e,"bias",SourceMapConsumer.GREATEST_LOWER_BOUND));if(t>=0){var i=this._originalMappings[t];if(i.source===n.source){return{line:o.getArg(i,"generatedLine",null),column:o.getArg(i,"generatedColumn",null),lastColumn:o.getArg(i,"lastGeneratedColumn",null)}}}return{line:null,column:null,lastColumn:null}};t=BasicSourceMapConsumer;function IndexedSourceMapConsumer(e,r){var n=e;if(typeof e==="string"){n=o.parseSourceMapInput(e)}var t=o.getArg(n,"version");var i=o.getArg(n,"sections");if(t!=this._version){throw new Error("Unsupported version: "+t)}this._sources=new a;this._names=new a;var u={line:-1,column:0};this._sections=i.map((function(e){if(e.url){throw new Error("Support for url field in sections not implemented.")}var n=o.getArg(e,"offset");var t=o.getArg(n,"line");var i=o.getArg(n,"column");if(t{var t=n(449);var o=n(339);var i=n(274).I;var a=n(680).H;function SourceMapGenerator(e){if(!e){e={}}this._file=o.getArg(e,"file",null);this._sourceRoot=o.getArg(e,"sourceRoot",null);this._skipValidation=o.getArg(e,"skipValidation",false);this._sources=new i;this._names=new i;this._mappings=new a;this._sourcesContents=null}SourceMapGenerator.prototype._version=3;SourceMapGenerator.fromSourceMap=function SourceMapGenerator_fromSourceMap(e){var r=e.sourceRoot;var n=new SourceMapGenerator({file:e.file,sourceRoot:r});e.eachMapping((function(e){var t={generated:{line:e.generatedLine,column:e.generatedColumn}};if(e.source!=null){t.source=e.source;if(r!=null){t.source=o.relative(r,t.source)}t.original={line:e.originalLine,column:e.originalColumn};if(e.name!=null){t.name=e.name}}n.addMapping(t)}));e.sources.forEach((function(t){var i=t;if(r!==null){i=o.relative(r,t)}if(!n._sources.has(i)){n._sources.add(i)}var a=e.sourceContentFor(t);if(a!=null){n.setSourceContent(t,a)}}));return n};SourceMapGenerator.prototype.addMapping=function SourceMapGenerator_addMapping(e){var r=o.getArg(e,"generated");var n=o.getArg(e,"original",null);var t=o.getArg(e,"source",null);var i=o.getArg(e,"name",null);if(!this._skipValidation){this._validateMapping(r,n,t,i)}if(t!=null){t=String(t);if(!this._sources.has(t)){this._sources.add(t)}}if(i!=null){i=String(i);if(!this._names.has(i)){this._names.add(i)}}this._mappings.add({generatedLine:r.line,generatedColumn:r.column,originalLine:n!=null&&n.line,originalColumn:n!=null&&n.column,source:t,name:i})};SourceMapGenerator.prototype.setSourceContent=function SourceMapGenerator_setSourceContent(e,r){var n=e;if(this._sourceRoot!=null){n=o.relative(this._sourceRoot,n)}if(r!=null){if(!this._sourcesContents){this._sourcesContents=Object.create(null)}this._sourcesContents[o.toSetString(n)]=r}else if(this._sourcesContents){delete this._sourcesContents[o.toSetString(n)];if(Object.keys(this._sourcesContents).length===0){this._sourcesContents=null}}};SourceMapGenerator.prototype.applySourceMap=function SourceMapGenerator_applySourceMap(e,r,n){var t=r;if(r==null){if(e.file==null){throw new Error("SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, "+'or the source map\'s "file" property. Both were omitted.')}t=e.file}var a=this._sourceRoot;if(a!=null){t=o.relative(a,t)}var u=new i;var s=new i;this._mappings.unsortedForEach((function(r){if(r.source===t&&r.originalLine!=null){var i=e.originalPositionFor({line:r.originalLine,column:r.originalColumn});if(i.source!=null){r.source=i.source;if(n!=null){r.source=o.join(n,r.source)}if(a!=null){r.source=o.relative(a,r.source)}r.originalLine=i.line;r.originalColumn=i.column;if(i.name!=null){r.name=i.name}}}var l=r.source;if(l!=null&&!u.has(l)){u.add(l)}var c=r.name;if(c!=null&&!s.has(c)){s.add(c)}}),this);this._sources=u;this._names=s;e.sources.forEach((function(r){var t=e.sourceContentFor(r);if(t!=null){if(n!=null){r=o.join(n,r)}if(a!=null){r=o.relative(a,r)}this.setSourceContent(r,t)}}),this)};SourceMapGenerator.prototype._validateMapping=function SourceMapGenerator_validateMapping(e,r,n,t){if(r&&typeof r.line!=="number"&&typeof r.column!=="number"){throw new Error("original.line and original.column are not numbers -- you probably meant to omit "+"the original mapping entirely and only map the generated position. If so, pass "+"null for the original mapping instead of an object with empty or null values.")}if(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0&&!r&&!n&&!t){return}else if(e&&"line"in e&&"column"in e&&r&&"line"in r&&"column"in r&&e.line>0&&e.column>=0&&r.line>0&&r.column>=0&&n){return}else{throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:n,original:r,name:t}))}};SourceMapGenerator.prototype._serializeMappings=function SourceMapGenerator_serializeMappings(){var e=0;var r=1;var n=0;var i=0;var a=0;var u=0;var s="";var l;var c;var p;var f;var g=this._mappings.toArray();for(var h=0,d=g.length;h0){if(!o.compareByGeneratedPositionsInflated(c,g[h-1])){continue}l+=","}}l+=t.encode(c.generatedColumn-e);e=c.generatedColumn;if(c.source!=null){f=this._sources.indexOf(c.source);l+=t.encode(f-u);u=f;l+=t.encode(c.originalLine-1-i);i=c.originalLine-1;l+=t.encode(c.originalColumn-n);n=c.originalColumn;if(c.name!=null){p=this._names.indexOf(c.name);l+=t.encode(p-a);a=p}}s+=l}return s};SourceMapGenerator.prototype._generateSourcesContent=function SourceMapGenerator_generateSourcesContent(e,r){return e.map((function(e){if(!this._sourcesContents){return null}if(r!=null){e=o.relative(r,e)}var n=o.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,n)?this._sourcesContents[n]:null}),this)};SourceMapGenerator.prototype.toJSON=function SourceMapGenerator_toJSON(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};if(this._file!=null){e.file=this._file}if(this._sourceRoot!=null){e.sourceRoot=this._sourceRoot}if(this._sourcesContents){e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)}return e};SourceMapGenerator.prototype.toString=function SourceMapGenerator_toString(){return JSON.stringify(this.toJSON())};r.h=SourceMapGenerator},351:(e,r,n)=>{var t;var o=n(591).h;var i=n(339);var a=/(\r?\n)/;var u=10;var s="$$$isSourceNode$$$";function SourceNode(e,r,n,t,o){this.children=[];this.sourceContents={};this.line=e==null?null:e;this.column=r==null?null:r;this.source=n==null?null:n;this.name=o==null?null:o;this[s]=true;if(t!=null)this.add(t)}SourceNode.fromStringWithSourceMap=function SourceNode_fromStringWithSourceMap(e,r,n){var t=new SourceNode;var o=e.split(a);var u=0;var shiftNextLine=function(){var e=getNextLine();var r=getNextLine()||"";return e+r;function getNextLine(){return u=0;r--){this.prepend(e[r])}}else if(e[s]||typeof e==="string"){this.children.unshift(e)}else{throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e)}return this};SourceNode.prototype.walk=function SourceNode_walk(e){var r;for(var n=0,t=this.children.length;n0){r=[];for(n=0;n{function getArg(e,r,n){if(r in e){return e[r]}else if(arguments.length===3){return n}else{throw new Error('"'+r+'" is a required argument.')}}r.getArg=getArg;var n=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;var t=/^data:.+\,.+$/;function urlParse(e){var r=e.match(n);if(!r){return null}return{scheme:r[1],auth:r[2],host:r[3],port:r[4],path:r[5]}}r.urlParse=urlParse;function urlGenerate(e){var r="";if(e.scheme){r+=e.scheme+":"}r+="//";if(e.auth){r+=e.auth+"@"}if(e.host){r+=e.host}if(e.port){r+=":"+e.port}if(e.path){r+=e.path}return r}r.urlGenerate=urlGenerate;function normalize(e){var n=e;var t=urlParse(e);if(t){if(!t.path){return e}n=t.path}var o=r.isAbsolute(n);var i=n.split(/\/+/);for(var a,u=0,s=i.length-1;s>=0;s--){a=i[s];if(a==="."){i.splice(s,1)}else if(a===".."){u++}else if(u>0){if(a===""){i.splice(s+1,u);u=0}else{i.splice(s,2);u--}}}n=i.join("/");if(n===""){n=o?"/":"."}if(t){t.path=n;return urlGenerate(t)}return n}r.normalize=normalize;function join(e,r){if(e===""){e="."}if(r===""){r="."}var n=urlParse(r);var o=urlParse(e);if(o){e=o.path||"/"}if(n&&!n.scheme){if(o){n.scheme=o.scheme}return urlGenerate(n)}if(n||r.match(t)){return r}if(o&&!o.host&&!o.path){o.host=r;return urlGenerate(o)}var i=r.charAt(0)==="/"?r:normalize(e.replace(/\/+$/,"")+"/"+r);if(o){o.path=i;return urlGenerate(o)}return i}r.join=join;r.isAbsolute=function(e){return e.charAt(0)==="/"||n.test(e)};function relative(e,r){if(e===""){e="."}e=e.replace(/\/$/,"");var n=0;while(r.indexOf(e+"/")!==0){var t=e.lastIndexOf("/");if(t<0){return r}e=e.slice(0,t);if(e.match(/^([^\/]+:\/)?\/*$/)){return r}++n}return Array(n+1).join("../")+r.substr(e.length+1)}r.relative=relative;var o=function(){var e=Object.create(null);return!("__proto__"in e)}();function identity(e){return e}function toSetString(e){if(isProtoString(e)){return"$"+e}return e}r.toSetString=o?identity:toSetString;function fromSetString(e){if(isProtoString(e)){return e.slice(1)}return e}r.fromSetString=o?identity:fromSetString;function isProtoString(e){if(!e){return false}var r=e.length;if(r<9){return false}if(e.charCodeAt(r-1)!==95||e.charCodeAt(r-2)!==95||e.charCodeAt(r-3)!==111||e.charCodeAt(r-4)!==116||e.charCodeAt(r-5)!==111||e.charCodeAt(r-6)!==114||e.charCodeAt(r-7)!==112||e.charCodeAt(r-8)!==95||e.charCodeAt(r-9)!==95){return false}for(var n=r-10;n>=0;n--){if(e.charCodeAt(n)!==36){return false}}return true}function compareByOriginalPositions(e,r,n){var t=strcmp(e.source,r.source);if(t!==0){return t}t=e.originalLine-r.originalLine;if(t!==0){return t}t=e.originalColumn-r.originalColumn;if(t!==0||n){return t}t=e.generatedColumn-r.generatedColumn;if(t!==0){return t}t=e.generatedLine-r.generatedLine;if(t!==0){return t}return strcmp(e.name,r.name)}r.compareByOriginalPositions=compareByOriginalPositions;function compareByGeneratedPositionsDeflated(e,r,n){var t=e.generatedLine-r.generatedLine;if(t!==0){return t}t=e.generatedColumn-r.generatedColumn;if(t!==0||n){return t}t=strcmp(e.source,r.source);if(t!==0){return t}t=e.originalLine-r.originalLine;if(t!==0){return t}t=e.originalColumn-r.originalColumn;if(t!==0){return t}return strcmp(e.name,r.name)}r.compareByGeneratedPositionsDeflated=compareByGeneratedPositionsDeflated;function strcmp(e,r){if(e===r){return 0}if(e===null){return 1}if(r===null){return-1}if(e>r){return 1}return-1}function compareByGeneratedPositionsInflated(e,r){var n=e.generatedLine-r.generatedLine;if(n!==0){return n}n=e.generatedColumn-r.generatedColumn;if(n!==0){return n}n=strcmp(e.source,r.source);if(n!==0){return n}n=e.originalLine-r.originalLine;if(n!==0){return n}n=e.originalColumn-r.originalColumn;if(n!==0){return n}return strcmp(e.name,r.name)}r.compareByGeneratedPositionsInflated=compareByGeneratedPositionsInflated;function parseSourceMapInput(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))}r.parseSourceMapInput=parseSourceMapInput;function computeSourceURL(e,r,n){r=r||"";if(e){if(e[e.length-1]!=="/"&&r[0]!=="/"){e+="/"}r=e+r}if(n){var t=urlParse(n);if(!t){throw new Error("sourceMapURL could not be parsed")}if(t.path){var o=t.path.lastIndexOf("/");if(o>=0){t.path=t.path.substring(0,o+1)}}r=join(urlGenerate(t),r)}return normalize(r)}r.computeSourceURL=computeSourceURL},997:(e,r,n)=>{n(591).h;r.SourceMapConsumer=n(952).SourceMapConsumer;n(351)},284:(e,r,n)=>{e=n.nmd(e);var t=n(997).SourceMapConsumer;var o=n(17);var i;try{i=n(147);if(!i.existsSync||!i.readFileSync){i=null}}catch(e){}var a=n(650);function dynamicRequire(e,r){return e.require(r)}var u=false;var s=false;var l=false;var c="auto";var p={};var f={};var g=/^data:application\/json[^,]+base64,/;var h=[];var d=[];function isInBrowser(){if(c==="browser")return true;if(c==="node")return false;return typeof window!=="undefined"&&typeof XMLHttpRequest==="function"&&!(window.require&&window.module&&window.process&&window.process.type==="renderer")}function hasGlobalProcessEventEmitter(){return typeof process==="object"&&process!==null&&typeof process.on==="function"}function globalProcessVersion(){if(typeof process==="object"&&process!==null){return process.version}else{return""}}function globalProcessStderr(){if(typeof process==="object"&&process!==null){return process.stderr}}function globalProcessExit(e){if(typeof process==="object"&&process!==null&&typeof process.exit==="function"){return process.exit(e)}}function handlerExec(e){return function(r){for(var n=0;n"}var n=this.getLineNumber();if(n!=null){r+=":"+n;var t=this.getColumnNumber();if(t){r+=":"+t}}}var o="";var i=this.getFunctionName();var a=true;var u=this.isConstructor();var s=!(this.isToplevel()||u);if(s){var l=this.getTypeName();if(l==="[object Object]"){l="null"}var c=this.getMethodName();if(i){if(l&&i.indexOf(l)!=0){o+=l+"."}o+=i;if(c&&i.indexOf("."+c)!=i.length-c.length-1){o+=" [as "+c+"]"}}else{o+=l+"."+(c||"")}}else if(u){o+="new "+(i||"")}else if(i){o+=i}else{o+=r;a=false}if(a){o+=" ("+r+")"}return o}function cloneCallSite(e){var r={};Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach((function(n){r[n]=/^(?:is|get)/.test(n)?function(){return e[n].call(e)}:e[n]}));r.toString=CallSiteToString;return r}function wrapCallSite(e,r){if(r===undefined){r={nextPosition:null,curPosition:null}}if(e.isNative()){r.curPosition=null;return e}var n=e.getFileName()||e.getScriptNameOrSourceURL();if(n){var t=e.getLineNumber();var o=e.getColumnNumber()-1;var i=/^v(10\.1[6-9]|10\.[2-9][0-9]|10\.[0-9]{3,}|1[2-9]\d*|[2-9]\d|\d{3,}|11\.11)/;var a=i.test(globalProcessVersion())?0:62;if(t===1&&o>a&&!isInBrowser()&&!e.isEval()){o-=a}var u=mapSourcePosition({source:n,line:t,column:o});r.curPosition=u;e=cloneCallSite(e);var s=e.getFunctionName;e.getFunctionName=function(){if(r.nextPosition==null){return s()}return r.nextPosition.name||s()};e.getFileName=function(){return u.source};e.getLineNumber=function(){return u.line};e.getColumnNumber=function(){return u.column+1};e.getScriptNameOrSourceURL=function(){return u.source};return e}var l=e.isEval()&&e.getEvalOrigin();if(l){l=mapEvalOrigin(l);e=cloneCallSite(e);e.getEvalOrigin=function(){return l};return e}return e}function prepareStackTrace(e,r){if(l){p={};f={}}var n=e.name||"Error";var t=e.message||"";var o=n+": "+t;var i={nextPosition:null,curPosition:null};var a=[];for(var u=r.length-1;u>=0;u--){a.push("\n at "+wrapCallSite(r[u],i));i.nextPosition=i.curPosition}i.curPosition=i.nextPosition=null;return o+a.reverse().join("")}function getErrorSource(e){var r=/\n at [^(]+ \((.*):(\d+):(\d+)\)/.exec(e.stack);if(r){var n=r[1];var t=+r[2];var o=+r[3];var a=p[n];if(!a&&i&&i.existsSync(n)){try{a=i.readFileSync(n,"utf8")}catch(e){a=""}}if(a){var u=a.split(/(?:\r\n|\r|\n)/)[t-1];if(u){return n+":"+t+"\n"+u+"\n"+new Array(o).join(" ")+"^"}}}return null}function printErrorAndExit(e){var r=getErrorSource(e);var n=globalProcessStderr();if(n&&n._handle&&n._handle.setBlocking){n._handle.setBlocking(true)}if(r){console.error();console.error(r)}console.error(e.stack);globalProcessExit(1)}function shimEmitUncaughtException(){var e=process.emit;process.emit=function(r){if(r==="uncaughtException"){var n=arguments[1]&&arguments[1].stack;var t=this.listeners(r).length>0;if(n&&!t){return printErrorAndExit(arguments[1])}}return e.apply(this,arguments)}}var S=h.slice(0);var _=d.slice(0);r.wrapCallSite=wrapCallSite;r.getErrorSource=getErrorSource;r.mapSourcePosition=mapSourcePosition;r.retrieveSourceMap=v;r.install=function(r){r=r||{};if(r.environment){c=r.environment;if(["node","browser","auto"].indexOf(c)===-1){throw new Error("environment "+c+" was unknown. Available options are {auto, browser, node}")}}if(r.retrieveFile){if(r.overrideRetrieveFile){h.length=0}h.unshift(r.retrieveFile)}if(r.retrieveSourceMap){if(r.overrideRetrieveSourceMap){d.length=0}d.unshift(r.retrieveSourceMap)}if(r.hookRequire&&!isInBrowser()){var n=dynamicRequire(e,"module");var t=n.prototype._compile;if(!t.__sourceMapSupport){n.prototype._compile=function(e,r){p[r]=e;f[r]=undefined;return t.call(this,e,r)};n.prototype._compile.__sourceMapSupport=true}}if(!l){l="emptyCacheBetweenOperations"in r?r.emptyCacheBetweenOperations:false}if(!u){u=true;Error.prepareStackTrace=prepareStackTrace}if(!s){var o="handleUncaughtExceptions"in r?r.handleUncaughtExceptions:true;try{var i=dynamicRequire(e,"worker_threads");if(i.isMainThread===false){o=false}}catch(e){}if(o&&hasGlobalProcessEventEmitter()){s=true;shimEmitUncaughtException()}}};r.resetRetrieveHandlers=function(){h.length=0;d.length=0;h=S.slice(0);d=_.slice(0);v=handlerExec(d);m=handlerExec(h)}},147:e=>{"use strict";e.exports=require("fs")},17:e=>{"use strict";e.exports=require("path")}};var r={};function __webpack_require__(n){var t=r[n];if(t!==undefined){return t.exports}var o=r[n]={id:n,loaded:false,exports:{}};var i=true;try{e[n](o,o.exports,__webpack_require__);i=false}finally{if(i)delete r[n]}o.loaded=true;return o.exports}(()=>{__webpack_require__.nmd=e=>{e.paths=[];if(!e.children)e.children=[];return e}})();if(typeof __webpack_require__!=="undefined")__webpack_require__.ab=__dirname+"/";var n={};(()=>{__webpack_require__(284).install()})();module.exports=n})();
--------------------------------------------------------------------------------
/jest.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | clearMocks: true,
3 | moduleFileExtensions: ['js', 'ts'],
4 | testMatch: ['**/*.test.ts'],
5 | transform: {
6 | '^.+\\.ts$': 'ts-jest'
7 | },
8 | verbose: true
9 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "lapras-card-readme",
3 | "version": "1.3.0",
4 | "private": true,
5 | "description": "Add LAPRAS Card to your GitHub profile",
6 | "main": "lib/main.js",
7 | "scripts": {
8 | "build": "tsc",
9 | "format": "prettier --write '**/*.ts'",
10 | "format-check": "prettier --check '**/*.ts'",
11 | "lint": "eslint src/**/*.ts",
12 | "package": "ncc build --source-map --license licenses.txt",
13 | "test": "jest",
14 | "all": "npm run build && npm run format && npm run lint && npm run package && npm test"
15 | },
16 | "repository": {
17 | "type": "git",
18 | "url": "git+https://github.com/actions/typescript-action.git"
19 | },
20 | "keywords": [
21 | "actions",
22 | "node",
23 | "setup"
24 | ],
25 | "author": "",
26 | "license": "MIT",
27 | "dependencies": {
28 | "@actions/core": "^1.10.0",
29 | "@actions/github": "^5.1.1",
30 | "node-fetch": "^3.3.0",
31 | "zod": "^3.20.2"
32 | },
33 | "devDependencies": {
34 | "@types/node": "^18.11.15",
35 | "@typescript-eslint/parser": "^5.46.1",
36 | "@vercel/ncc": "^0.36.0",
37 | "eslint": "^8.29.0",
38 | "eslint-plugin-github": "^4.6.0",
39 | "eslint-plugin-jest": "^27.1.7",
40 | "jest": "^27.2.5",
41 | "js-yaml": "^4.1.0",
42 | "prettier": "2.8.1",
43 | "ts-jest": "^27.1.2",
44 | "typescript": "^4.4.4"
45 | },
46 | "volta": {
47 | "node": "16.18.1"
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/src/constant.ts:
--------------------------------------------------------------------------------
1 | export const MARK = {
2 | START: '',
3 | END: ''
4 | }
5 |
--------------------------------------------------------------------------------
/src/lib/fetchPrevReadmeContents.ts:
--------------------------------------------------------------------------------
1 | import * as github from '@actions/github'
2 |
3 | export const fetchPrevReadmeContent = async (ghToken: string, readmeFile: string): Promise<{ text: string; sha: string }> => {
4 | const octokit = github.getOctokit(ghToken)
5 | const res: any = await octokit.rest.repos.getContent({
6 | repo: github.context.repo.repo,
7 | owner: github.context.repo.owner,
8 | path: readmeFile
9 | })
10 |
11 | const prevReadme = Buffer.from(
12 | res.data.content,
13 | res.data.encoding
14 | ).toString()
15 |
16 | return {
17 | text: prevReadme,
18 | sha: res.data.sha
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/lib/fetchScore.ts:
--------------------------------------------------------------------------------
1 | import { PublicApiResponse, Score } from '../types/types'
2 | import fetch from 'node-fetch'
3 |
4 |
5 | export const fetchScore = async (shareId: string): Promise => {
6 | const res = await fetch(`https://lapras.com/public/${shareId}.json`)
7 | const response = (await res.json()) as PublicApiResponse
8 |
9 | return {
10 | eScore: response.e_score,
11 | bScore: response.b_score,
12 | iScore: response.i_score
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/lib/getActionsParams.ts:
--------------------------------------------------------------------------------
1 | import * as core from '@actions/core'
2 | import { Language, Theme } from '../types/types'
3 | import { z } from 'zod'
4 |
5 | const themeParser: z.ZodType = z.object({
6 | icon: z.object({
7 | first: z.string(),
8 | second: z.string()
9 | }),
10 | background: z.object({
11 | first: z.string(),
12 | second: z.string()
13 | })
14 | })
15 | const languageParser: z.ZodType = z.union([z.literal('en'), z.literal('ja')])
16 | export const shareIdParser = z.string().regex(/^(?!https?:\/\/).*$/)
17 | const stringParser = z.string()
18 |
19 | export const getActionsParams = (): {
20 | shareId: string
21 | readmeFile: string
22 | theme: Theme
23 | lang: Language
24 | cardWidth: string
25 | token: string
26 | showUpdateTime: boolean
27 | isCenter: boolean
28 | alternativeText: string
29 | } => {
30 | const shareIdParseResult = shareIdParser.safeParse(core.getInput('SHARE_ID'))
31 | const lang = languageParser.parse(core.getInput('LANG'))
32 | if (!shareIdParseResult.success) {
33 | switch (lang) {
34 | case 'ja':
35 | throw new Error("SHARE_IDは公開ページのURL全体ではなく、公開URL末尾のIDを設定してください")
36 | case 'en':
37 | default:
38 | throw new Error('Please set SHARE_ID to the ID at the end of the public URL, not the entire public page URL.')
39 | }
40 | }
41 |
42 | const theme = themeParser.parse({
43 | icon: {
44 | first: core.getInput('ICON_FIRST'),
45 | second: core.getInput('ICON_SECOND')
46 | },
47 | background: {
48 | first: core.getInput('BACKGROUND_FIRST'),
49 | second: core.getInput('BACKGROUND_SECOND')
50 | }
51 | })
52 | const cardWidth = stringParser.parse(core.getInput('CARD_WIDTH'))
53 | const token = stringParser.parse(core.getInput('GH_TOKEN'))
54 | const readmeFile = stringParser.parse(core.getInput('README_FILE'))
55 | const showUpdateTime = stringParser.parse(core.getInput('UPDATE_TIME')) === 'true'
56 | const isCenter = stringParser.parse(core.getInput('IS_CENTER')) === 'true'
57 | const alternativeText = stringParser.parse(core.getInput('ALTERNATIVE_TEXT'))
58 |
59 | return { shareId: shareIdParseResult.data, readmeFile, theme, lang, cardWidth, token, showUpdateTime, isCenter, alternativeText }
60 | }
61 |
--------------------------------------------------------------------------------
/src/lib/rewriteReadmeToIncludeCardText.ts:
--------------------------------------------------------------------------------
1 | import { MARK } from '../constant'
2 | import { Language, Score, Theme } from '../types/types'
3 |
4 | const getAlternativeText = ({ alternativeText, lang, shareId, score }: { alternativeText: string, lang: Language, shareId: string, score: Score }): string => {
5 | let text: string
6 | if (alternativeText === '') {
7 | switch (lang) {
8 | case 'ja':
9 | text = `${shareId}のLAPRASでのスコアは次の通りです: エンジニアリング: ${score.eScore} / 5.0, ビジネス: ${score.bScore} / 5.0, インフルエンス: ${score.iScore} / 5.0.`
10 | break
11 | case 'en':
12 | default:
13 | text = `${shareId}'s scores on LAPRAS are as follows: Engineering: ${score.eScore} out of 5.0, Business: ${score.bScore} out of 5.0, Influence: ${score.iScore} out of 5.0.`
14 | break
15 | }
16 | } else {
17 | text = alternativeText
18 | }
19 | return text
20 | }
21 |
22 | const createCardText = ({
23 | shareId,
24 | score,
25 | theme,
26 | lang,
27 | cardWidth,
28 | showUpdateTime,
29 | isCenter,
30 | alternativeText,
31 | }: {
32 | shareId: string
33 | score: Score
34 | theme: Theme
35 | lang: Language
36 | cardWidth: string
37 | showUpdateTime: boolean
38 | isCenter: boolean,
39 | alternativeText: string,
40 | }): string => {
41 | const imageUrl = `https://lapras-card-generator.vercel.app/api/svg?e=${
42 | score.eScore
43 | }&b=${score.bScore}&i=${score.iScore}&b1=${encodeURIComponent(
44 | theme.background.first
45 | )}&b2=${encodeURIComponent(theme.background.second)}&i1=${encodeURIComponent(
46 | theme.icon.first
47 | )}&i2=${encodeURIComponent(theme.icon.second)}&l=${lang}`
48 |
49 | const updateTime = showUpdateTime ? ` \nLast Updated on ${new Date().toLocaleString()}` : ''
50 |
51 | const _alternativeText: string = getAlternativeText({ alternativeText, lang, shareId, score })
52 |
53 | return `
${updateTime}
`
54 | }
55 |
56 | export const rewriteReadmeToIncludeCardText = (
57 | readme: string,
58 | {
59 | shareId,
60 | score,
61 | theme,
62 | lang,
63 | cardWidth,
64 | showUpdateTime,
65 | isCenter,
66 | alternativeText,
67 | }: {
68 | shareId: string
69 | score: Score
70 | theme: Theme
71 | lang: Language
72 | cardWidth: string
73 | showUpdateTime: boolean
74 | isCenter: boolean,
75 | alternativeText: string,
76 | }
77 | ): string => {
78 | const markerPattern = new RegExp(`(${MARK.START})[\\s\\S]*(${MARK.END})`)
79 | if (!markerPattern.test(readme)) {
80 | switch (lang) {
81 | case 'ja':
82 | throw new Error(`Error: README.mdにカードを挿入するためのMARKER文字列が見つかりませんでした。"${MARK.START + MARK.END}" をREADME.mdに追加してください`)
83 | case 'en':
84 | default:
85 | throw new Error(`Error: The MARKER string to insert the card into README.md could not be found. Please add "${MARK.START + MARK.END}" to README.md`)
86 | }
87 | }
88 |
89 | const cardText = createCardText({ shareId, score, theme, lang, cardWidth, showUpdateTime, isCenter, alternativeText })
90 | return readme.replace(markerPattern, `$1\n${cardText}\n$2`)
91 | }
92 |
--------------------------------------------------------------------------------
/src/lib/updateReadme.ts:
--------------------------------------------------------------------------------
1 | import * as github from '@actions/github'
2 |
3 | export const updateReadme = async (params: { ghToken: string, readme: string, sha: string }): Promise => {
4 | const octokit = github.getOctokit(params.ghToken)
5 | await octokit.rest.repos.createOrUpdateFileContents({
6 | repo: github.context.repo.repo,
7 | owner: github.context.repo.owner,
8 | path: 'README.md',
9 | message: 'update README.md',
10 | content: Buffer.from(params.readme).toString('base64'),
11 | committer: {
12 | name: 'github-actions[bot]',
13 | email: '41898282+github-actions[bot]@users.noreply.github.com'
14 | },
15 | sha: params.sha
16 | })
17 | }
18 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import * as core from '@actions/core'
2 | import {updateReadme} from './lib/updateReadme'
3 | import {rewriteReadmeToIncludeCardText} from './lib/rewriteReadmeToIncludeCardText'
4 | import {fetchScore} from './lib/fetchScore'
5 | import {fetchPrevReadmeContent} from './lib/fetchPrevReadmeContents'
6 | import {getActionsParams} from './lib/getActionsParams'
7 |
8 | async function run(): Promise {
9 | try {
10 | const {
11 | shareId,
12 | readmeFile,
13 | theme,
14 | lang,
15 | cardWidth,
16 | token,
17 | showUpdateTime,
18 | isCenter,
19 | alternativeText
20 | } = getActionsParams()
21 | const readmeContent = await fetchPrevReadmeContent(token, readmeFile)
22 | const score = await fetchScore(shareId)
23 |
24 | const readme = rewriteReadmeToIncludeCardText(readmeContent.text, {
25 | shareId,
26 | score,
27 | theme,
28 | lang,
29 | cardWidth,
30 | showUpdateTime,
31 | isCenter,
32 | alternativeText
33 | })
34 |
35 | await updateReadme({ghToken: token, readme, sha: readmeContent.sha})
36 | } catch (error) {
37 | if (error instanceof Error) core.setFailed(error)
38 | }
39 | }
40 |
41 | run()
42 |
--------------------------------------------------------------------------------
/src/types/types.ts:
--------------------------------------------------------------------------------
1 | export type Theme = {
2 | icon: {
3 | first: string
4 | second: string
5 | }
6 | background: {
7 | first: string
8 | second: string
9 | }
10 | }
11 |
12 | export type Score = {
13 | eScore: number
14 | bScore: number
15 | iScore: number
16 | }
17 |
18 | export type Language = 'ja' | 'en'
19 |
20 | export type PublicApiResponse = {
21 | name: string
22 | e_score: number
23 | b_score: number
24 | i_score: number
25 | }
26 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
4 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
5 | "outDir": "./lib", /* Redirect output structure to the directory. */
6 | "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
7 | "strict": true, /* Enable all strict type-checking options. */
8 | "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
9 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
10 | },
11 | "exclude": ["node_modules", "**/*.test.ts"]
12 | }
13 |
--------------------------------------------------------------------------------