You've already forked dynamic-badges-action
Compare commits
116 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c5522a81a6 | |||
| 6440ffc708 | |||
| 001178768a | |||
| 4ba87a7f3c | |||
| 22fd46189b | |||
| 8b04e20b05 | |||
| 1952930e4d | |||
| 2329d5dd80 | |||
| 46dee54362 | |||
| 5fce6bdccf | |||
| 33748372a2 | |||
| b348384cf9 | |||
|
|
7142847813 | ||
|
|
51bbdc7e8a | ||
|
|
e9a478b161 | ||
|
|
9c9369564f | ||
|
|
0b9acddcd9 | ||
|
|
6fc1f63194 | ||
|
|
21aa491bfe | ||
|
|
85d3a60c7c | ||
|
|
4f84090196 | ||
|
|
df99dd9ef9 | ||
|
|
15bd3e7cdb | ||
|
|
6f4d615b2f | ||
|
|
856e1f2e74 | ||
|
|
e7fa53f37a | ||
|
|
37eecceda2 | ||
|
|
5ab7837fab | ||
|
|
d5f166a320 | ||
|
|
1929292faa | ||
|
|
d57076bbf1 | ||
|
|
cb47279d08 | ||
|
|
5dcfe114e3 | ||
|
|
606d12105c | ||
|
|
efee8f7380 | ||
|
|
ab9ff3b656 | ||
|
|
a8a8d67cdc | ||
|
|
f2c09261b6 | ||
|
|
2312543959 | ||
|
|
8a2e8ac875 | ||
|
|
125de5dc2e | ||
|
|
a87eb6e585 | ||
|
|
e403e5ef44 | ||
|
|
371e351370 | ||
|
|
f8242b8176 | ||
|
|
bedec0d40d | ||
|
|
1f41b12ce6 | ||
|
|
a2d3829b14 | ||
|
|
b7809ee0af | ||
|
|
5d424ad406 | ||
|
|
fcf5e8e35f | ||
|
|
ecdb0478a8 | ||
|
|
e88b2ac0cd | ||
|
|
457e3c5b74 | ||
|
|
c125fff2e3 | ||
|
|
9eb9ef9448 | ||
|
|
9e75560bc1 | ||
|
|
a1164e8505 | ||
|
|
e1f1d9b472 | ||
|
|
4c062c0414 | ||
|
|
f0dea330d9 | ||
|
|
18582780c1 | ||
|
|
d3f06731f1 | ||
|
|
bbc75b53e0 | ||
|
|
2dc28ead4a | ||
|
|
c5926f1df3 | ||
|
|
2e7c161443 | ||
|
|
eb045a2aa0 | ||
|
|
00d9e32032 | ||
|
|
e99491d01b | ||
|
|
8fb0b06275 | ||
|
|
df67159685 | ||
|
|
6e5aa605f7 | ||
|
|
8de5789faf | ||
|
|
3d8e621361 | ||
|
|
d93cff94c6 | ||
|
|
d4e218a2a3 | ||
|
|
bb112192a3 | ||
|
|
a64434e3b0 | ||
|
|
9cba6db19f | ||
|
|
e2f3a9df03 | ||
|
|
4dbb581c4c | ||
|
|
2a87c9f45e | ||
|
|
aac224f235 | ||
|
|
61bac52a23 | ||
|
|
54d929a33e | ||
|
|
69871bdad6 | ||
|
|
383ef89559 | ||
|
|
b82eb1a788 | ||
|
|
2973573357 | ||
|
|
3425d0daa8 | ||
|
|
5673706ac3 | ||
|
|
a6775a6487 | ||
|
|
7ce4e745e5 | ||
|
|
a3f7e7f029 | ||
|
|
6511e529e9 | ||
|
|
e43bdee88e | ||
|
|
3dd7c22d76 | ||
|
|
ee320739c6 | ||
|
|
9bce11bffe | ||
|
|
53c821a382 | ||
|
|
6363528813 | ||
|
|
f3547450fa | ||
|
|
6d79bf4c0a | ||
|
|
b718050283 | ||
|
|
0ba52741d3 | ||
|
|
a690d6b4cb | ||
|
|
517bd6931a | ||
|
|
3bcfbf7edc | ||
|
|
8da8f7816f | ||
|
|
65787a717d | ||
|
|
cfd1eebb35 | ||
|
|
42207bfa4c | ||
|
|
4c1242cfa4 | ||
|
|
7788d4f27b | ||
|
|
a298000e06 |
@@ -1,3 +0,0 @@
|
||||
BasedOnStyle: Google
|
||||
AlignConsecutiveAssignments: true
|
||||
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||
10
.github/FUNDING.yml
vendored
Normal file
10
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
# SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
github: schneegans
|
||||
ko_fi: schneegans
|
||||
custom:
|
||||
[
|
||||
"https://www.paypal.com/donate/?hosted_button_id=3F7UFL8KLVPXE",
|
||||
https://schneegans.cb.id,
|
||||
]
|
||||
46
.github/workflows/badges.yml
vendored
46
.github/workflows/badges.yml
vendored
@@ -1,3 +1,6 @@
|
||||
# SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
name: Build Badges
|
||||
|
||||
on: [push]
|
||||
@@ -10,12 +13,41 @@ jobs:
|
||||
- name: Get the Numbers
|
||||
run: echo "ANSWER=42" >> $GITHUB_ENV
|
||||
- name: Create the Badge
|
||||
uses: schneegans/dynamic-badges-action@master
|
||||
uses: https://hub.cybercinch.nz/cybercinch/dynamic-badges-action@master
|
||||
with:
|
||||
auth: ${{ secrets.GIST_SECRET }}
|
||||
gistID: 2ab8f1d386f13aaebccbd87dac94068d
|
||||
filename: answer.json
|
||||
label: The Answer is
|
||||
message: ${{ env.ANSWER }}
|
||||
color: green
|
||||
auth: ${{ secrets.BADGE_API_TOKEN }}
|
||||
host: https://badges.cybercinch.nz/cybercinch/dynamic-badges-action/answer
|
||||
label: The Answer
|
||||
message: is ${{ env.ANSWER }}
|
||||
valColorRange: ${{ env.ANSWER }}
|
||||
maxColorRange: 100
|
||||
minColorRange: 0
|
||||
|
||||
color-range-badges:
|
||||
name: "Create Color Range Badges"
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
total:
|
||||
- 0
|
||||
- 10
|
||||
- 20
|
||||
- 30
|
||||
- 40
|
||||
- 50
|
||||
- 60
|
||||
- 70
|
||||
- 80
|
||||
- 90
|
||||
- 100
|
||||
steps:
|
||||
- name: "Make badge"
|
||||
uses: https://hub.cybercinch.nz/cybercinch/dynamic-badges-action@master
|
||||
with:
|
||||
auth: ${{ secrets.BADGE_API_TOKEN }}
|
||||
host: https://badges.cybercinch.nz/cybercinch/dynamic-badges-action/color_badge_${{ matrix.total }}
|
||||
label: Coverage
|
||||
message: ${{ matrix.total }}%
|
||||
minColorRange: 50
|
||||
maxColorRange: 90
|
||||
valColorRange: ${{ matrix.total }}
|
||||
|
||||
18
.github/workflows/checks.yml
vendored
Normal file
18
.github/workflows/checks.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
# SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
name: Checks
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- "**"
|
||||
|
||||
jobs:
|
||||
reuse:
|
||||
name: Check REUSE
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: REUSE Compliance Check
|
||||
uses: fsfe/reuse-action@v1
|
||||
41
.reuse/dep5
Normal file
41
.reuse/dep5
Normal file
@@ -0,0 +1,41 @@
|
||||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
|
||||
Files: package.json package-lock.json node_modules/.package-lock.json
|
||||
Copyright: Simon Schneegans <code@simonschneegans.de>
|
||||
License: CC0-1.0
|
||||
|
||||
Files: node_modules/@actions/*
|
||||
Copyright: GitHub
|
||||
License: MIT
|
||||
|
||||
Files: node_modules/anafanafo/* node_modules/char-width-table-consumer/*
|
||||
Copyright: Metabolize LLC
|
||||
License: MIT
|
||||
|
||||
Files: node_modules/badge-maker/*
|
||||
Copyright: Thaddée Tyl <thaddee.tyl@gmail.com>
|
||||
License: CC0-1.0
|
||||
|
||||
Files: node_modules/binary-search/*
|
||||
Copyright: The Dark Sky Company, LLC
|
||||
License: CC0-1.0
|
||||
|
||||
Files: node_modules/color-convert/*
|
||||
Copyright: Heather Arthur <fayearthur@gmail.com>
|
||||
License: MIT
|
||||
|
||||
Files: node_modules/color-name/*
|
||||
Copyright: DY <dfcreative@gmail.com>
|
||||
License: MIT
|
||||
|
||||
Files: node_modules/css-color-converter/* node_modules/css-unit-converter/*
|
||||
Copyright: Andy Jansson
|
||||
License: MIT
|
||||
|
||||
Files: node_modules/tunnel/*
|
||||
Copyright: Koichi Kobayashi
|
||||
License: MIT
|
||||
|
||||
Files: node_modules/uuid/*
|
||||
Copyright: Robert Kieffer and other contributors
|
||||
License: MIT
|
||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 Simon Schneegans
|
||||
Copyright (c) 2023 Simon Schneegans
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
156
LICENSES/CC-BY-4.0.txt
Normal file
156
LICENSES/CC-BY-4.0.txt
Normal file
@@ -0,0 +1,156 @@
|
||||
Creative Commons Attribution 4.0 International
|
||||
|
||||
Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible.
|
||||
|
||||
Using Creative Commons Public Licenses
|
||||
|
||||
Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses.
|
||||
|
||||
Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors.
|
||||
|
||||
Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public.
|
||||
|
||||
Creative Commons Attribution 4.0 International Public License
|
||||
|
||||
By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.
|
||||
|
||||
Section 1 – Definitions.
|
||||
|
||||
a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.
|
||||
|
||||
b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.
|
||||
|
||||
c. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
|
||||
|
||||
d. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.
|
||||
|
||||
e. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.
|
||||
|
||||
f. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.
|
||||
|
||||
g. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.
|
||||
|
||||
h. Licensor means the individual(s) or entity(ies) granting rights under this Public License.
|
||||
|
||||
i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.
|
||||
|
||||
j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.
|
||||
|
||||
k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.
|
||||
|
||||
Section 2 – Scope.
|
||||
|
||||
a. License grant.
|
||||
|
||||
1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:
|
||||
|
||||
A. reproduce and Share the Licensed Material, in whole or in part; and
|
||||
|
||||
B. produce, reproduce, and Share Adapted Material.
|
||||
|
||||
2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.
|
||||
|
||||
3. Term. The term of this Public License is specified in Section 6(a).
|
||||
|
||||
4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.
|
||||
|
||||
5. Downstream recipients.
|
||||
|
||||
A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.
|
||||
|
||||
B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.
|
||||
|
||||
6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).
|
||||
|
||||
b. Other rights.
|
||||
|
||||
1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.
|
||||
|
||||
2. Patent and trademark rights are not licensed under this Public License.
|
||||
|
||||
3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties.
|
||||
|
||||
Section 3 – License Conditions.
|
||||
|
||||
Your exercise of the Licensed Rights is expressly made subject to the following conditions.
|
||||
|
||||
a. Attribution.
|
||||
|
||||
1. If You Share the Licensed Material (including in modified form), You must:
|
||||
|
||||
A. retain the following if it is supplied by the Licensor with the Licensed Material:
|
||||
|
||||
i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);
|
||||
|
||||
ii. a copyright notice;
|
||||
|
||||
iii. a notice that refers to this Public License;
|
||||
|
||||
iv. a notice that refers to the disclaimer of warranties;
|
||||
|
||||
v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
|
||||
|
||||
B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and
|
||||
|
||||
C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.
|
||||
|
||||
2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.
|
||||
|
||||
3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.
|
||||
|
||||
4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License.
|
||||
|
||||
Section 4 – Sui Generis Database Rights.
|
||||
|
||||
Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:
|
||||
|
||||
a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database;
|
||||
|
||||
b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and
|
||||
|
||||
c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.
|
||||
For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.
|
||||
|
||||
Section 5 – Disclaimer of Warranties and Limitation of Liability.
|
||||
|
||||
a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.
|
||||
|
||||
b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.
|
||||
|
||||
c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.
|
||||
|
||||
Section 6 – Term and Termination.
|
||||
|
||||
a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.
|
||||
|
||||
b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:
|
||||
|
||||
1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or
|
||||
|
||||
2. upon express reinstatement by the Licensor.
|
||||
|
||||
c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.
|
||||
|
||||
d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.
|
||||
|
||||
e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
|
||||
|
||||
Section 7 – Other Terms and Conditions.
|
||||
|
||||
a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.
|
||||
|
||||
b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.
|
||||
|
||||
Section 8 – Interpretation.
|
||||
|
||||
a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.
|
||||
|
||||
b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.
|
||||
|
||||
c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.
|
||||
|
||||
d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.
|
||||
|
||||
Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.
|
||||
|
||||
Creative Commons may be contacted at creativecommons.org.
|
||||
121
LICENSES/CC0-1.0.txt
Normal file
121
LICENSES/CC0-1.0.txt
Normal file
@@ -0,0 +1,121 @@
|
||||
Creative Commons Legal Code
|
||||
|
||||
CC0 1.0 Universal
|
||||
|
||||
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
|
||||
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
|
||||
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
|
||||
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
|
||||
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
|
||||
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
|
||||
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
|
||||
HEREUNDER.
|
||||
|
||||
Statement of Purpose
|
||||
|
||||
The laws of most jurisdictions throughout the world automatically confer
|
||||
exclusive Copyright and Related Rights (defined below) upon the creator
|
||||
and subsequent owner(s) (each and all, an "owner") of an original work of
|
||||
authorship and/or a database (each, a "Work").
|
||||
|
||||
Certain owners wish to permanently relinquish those rights to a Work for
|
||||
the purpose of contributing to a commons of creative, cultural and
|
||||
scientific works ("Commons") that the public can reliably and without fear
|
||||
of later claims of infringement build upon, modify, incorporate in other
|
||||
works, reuse and redistribute as freely as possible in any form whatsoever
|
||||
and for any purposes, including without limitation commercial purposes.
|
||||
These owners may contribute to the Commons to promote the ideal of a free
|
||||
culture and the further production of creative, cultural and scientific
|
||||
works, or to gain reputation or greater distribution for their Work in
|
||||
part through the use and efforts of others.
|
||||
|
||||
For these and/or other purposes and motivations, and without any
|
||||
expectation of additional consideration or compensation, the person
|
||||
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
|
||||
is an owner of Copyright and Related Rights in the Work, voluntarily
|
||||
elects to apply CC0 to the Work and publicly distribute the Work under its
|
||||
terms, with knowledge of his or her Copyright and Related Rights in the
|
||||
Work and the meaning and intended legal effect of CC0 on those rights.
|
||||
|
||||
1. Copyright and Related Rights. A Work made available under CC0 may be
|
||||
protected by copyright and related or neighboring rights ("Copyright and
|
||||
Related Rights"). Copyright and Related Rights include, but are not
|
||||
limited to, the following:
|
||||
|
||||
i. the right to reproduce, adapt, distribute, perform, display,
|
||||
communicate, and translate a Work;
|
||||
ii. moral rights retained by the original author(s) and/or performer(s);
|
||||
iii. publicity and privacy rights pertaining to a person's image or
|
||||
likeness depicted in a Work;
|
||||
iv. rights protecting against unfair competition in regards to a Work,
|
||||
subject to the limitations in paragraph 4(a), below;
|
||||
v. rights protecting the extraction, dissemination, use and reuse of data
|
||||
in a Work;
|
||||
vi. database rights (such as those arising under Directive 96/9/EC of the
|
||||
European Parliament and of the Council of 11 March 1996 on the legal
|
||||
protection of databases, and under any national implementation
|
||||
thereof, including any amended or successor version of such
|
||||
directive); and
|
||||
vii. other similar, equivalent or corresponding rights throughout the
|
||||
world based on applicable law or treaty, and any national
|
||||
implementations thereof.
|
||||
|
||||
2. Waiver. To the greatest extent permitted by, but not in contravention
|
||||
of, applicable law, Affirmer hereby overtly, fully, permanently,
|
||||
irrevocably and unconditionally waives, abandons, and surrenders all of
|
||||
Affirmer's Copyright and Related Rights and associated claims and causes
|
||||
of action, whether now known or unknown (including existing as well as
|
||||
future claims and causes of action), in the Work (i) in all territories
|
||||
worldwide, (ii) for the maximum duration provided by applicable law or
|
||||
treaty (including future time extensions), (iii) in any current or future
|
||||
medium and for any number of copies, and (iv) for any purpose whatsoever,
|
||||
including without limitation commercial, advertising or promotional
|
||||
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
|
||||
member of the public at large and to the detriment of Affirmer's heirs and
|
||||
successors, fully intending that such Waiver shall not be subject to
|
||||
revocation, rescission, cancellation, termination, or any other legal or
|
||||
equitable action to disrupt the quiet enjoyment of the Work by the public
|
||||
as contemplated by Affirmer's express Statement of Purpose.
|
||||
|
||||
3. Public License Fallback. Should any part of the Waiver for any reason
|
||||
be judged legally invalid or ineffective under applicable law, then the
|
||||
Waiver shall be preserved to the maximum extent permitted taking into
|
||||
account Affirmer's express Statement of Purpose. In addition, to the
|
||||
extent the Waiver is so judged Affirmer hereby grants to each affected
|
||||
person a royalty-free, non transferable, non sublicensable, non exclusive,
|
||||
irrevocable and unconditional license to exercise Affirmer's Copyright and
|
||||
Related Rights in the Work (i) in all territories worldwide, (ii) for the
|
||||
maximum duration provided by applicable law or treaty (including future
|
||||
time extensions), (iii) in any current or future medium and for any number
|
||||
of copies, and (iv) for any purpose whatsoever, including without
|
||||
limitation commercial, advertising or promotional purposes (the
|
||||
"License"). The License shall be deemed effective as of the date CC0 was
|
||||
applied by Affirmer to the Work. Should any part of the License for any
|
||||
reason be judged legally invalid or ineffective under applicable law, such
|
||||
partial invalidity or ineffectiveness shall not invalidate the remainder
|
||||
of the License, and in such case Affirmer hereby affirms that he or she
|
||||
will not (i) exercise any of his or her remaining Copyright and Related
|
||||
Rights in the Work or (ii) assert any associated claims and causes of
|
||||
action with respect to the Work, in either case contrary to Affirmer's
|
||||
express Statement of Purpose.
|
||||
|
||||
4. Limitations and Disclaimers.
|
||||
|
||||
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
||||
surrendered, licensed or otherwise affected by this document.
|
||||
b. Affirmer offers the Work as-is and makes no representations or
|
||||
warranties of any kind concerning the Work, express, implied,
|
||||
statutory or otherwise, including without limitation warranties of
|
||||
title, merchantability, fitness for a particular purpose, non
|
||||
infringement, or the absence of latent or other defects, accuracy, or
|
||||
the present or absence of errors, whether or not discoverable, all to
|
||||
the greatest extent permissible under applicable law.
|
||||
c. Affirmer disclaims responsibility for clearing rights of other persons
|
||||
that may apply to the Work or any use thereof, including without
|
||||
limitation any person's Copyright and Related Rights in the Work.
|
||||
Further, Affirmer disclaims responsibility for obtaining any necessary
|
||||
consents, permissions or other rights required for any use of the
|
||||
Work.
|
||||
d. Affirmer understands and acknowledges that Creative Commons is not a
|
||||
party to this document and has no duty or obligation with respect to
|
||||
this CC0 or use of the Work.
|
||||
9
LICENSES/MIT.txt
Normal file
9
LICENSES/MIT.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) <year> <copyright holders>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
202
README.md
202
README.md
@@ -1,15 +1,23 @@
|
||||
# Dynamic Badges Action
|
||||
<!--
|
||||
SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
|
||||
SPDX-License-Identifier: CC-BY-4.0
|
||||
-->
|
||||
|
||||
# 🏷️ Dynamic Badges Action
|
||||
|
||||
[](https://github.com/Schneegans/dynamic-badges-action/actions)
|
||||
[](LICENSE)
|
||||
[](https://api.reuse.software/info/github.com/schneegans/dynamic-badges-action)
|
||||
[](https://github.com/marketplace/actions/dynamic-badges)
|
||||
[](https://schneegans.github.io/sponsors/)
|
||||
|
||||
This action allows you to create badges for your README.md with [shields.io](https://shields.io) which may change with every commit. To do this, this action does not need to push anything to your repository!
|
||||
|
||||
This action supports all [configuration options of shields.io/endpoint](https://shields.io/endpoint) and can be used in various ways:
|
||||
* Show custom CI statistics from GitHub actions, such as code coverage or detailed test results.
|
||||
* Show metadata of your repository such as [lines of code, comment line percentage](https://schneegans.github.io/tutorials/2020/08/16/badges), ...
|
||||
* Basically anything which may change from commit to commit!
|
||||
|
||||
- Show custom CI statistics from GitHub actions, such as code coverage or detailed test results.
|
||||
- Show metadata of your repository such as [lines of code, comment line percentage](https://schneegans.github.io/tutorials/2022/04/18/badges), ...
|
||||
- Basically anything which may change from commit to commit!
|
||||
|
||||
## How Does It Work?
|
||||
|
||||
@@ -25,108 +33,180 @@ This JSON object may look like this:
|
||||
}
|
||||
```
|
||||
|
||||
This JSON object is then uploaded as a file to a *gist* ([click here for an example](https://gist.github.com/Schneegans/2ab8f1d386f13aaebccbd87dac94068d)) and can be transformed to a badge like [](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d/raw/hello-world.json) with the **shields.io/endpoint**. Here is the URL of this example badge:
|
||||
This JSON object is then uploaded to a _gist_ ([click here for an example](https://gist.github.com/Schneegans/2ab8f1d386f13aaebccbd87dac94068d)) and automatically transformed to [](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d/raw/hello-world.json) with the **shields.io/endpoint**.
|
||||
|
||||
```
|
||||
https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d/raw/hello-world.json
|
||||
<details><summary>Show Markdown of this Badge!</summary>
|
||||
|
||||
```md
|
||||

|
||||
```
|
||||
|
||||
## Configuration
|
||||
</details>
|
||||
|
||||
1. Head over to [gist.github.com](https://gist.github.com/) and create a new gist. You will need the ID of the gist (this is the long alphanumerical part of its URL) later.
|
||||
2. Navigate to [github.com/settings/tokens](https://github.com/settings/tokens) and create a new token with the *gist* scope.
|
||||
3. Go to the *Secrets* page of the settings of your repository and add this token as a new secret. You can give it any name, for example `GIST_SECRET`.
|
||||
### SVG Mode
|
||||
|
||||
The action also supports an _SVG mode_ in which the badge is created directly by the action and uploaded as image to the gist.
|
||||
This mode does not support all features of shields.io but is useful if you cannot use shields.io for some reason.
|
||||
[](https://gist.githubusercontent.com/Schneegans/2ab8f1d386f13aaebccbd87dac94068d/raw/badge.svg) which is directly stored in a gist.
|
||||
|
||||
<details><summary>Show Markdown of this Badge!</summary>
|
||||
|
||||
```md
|
||||

|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
### Use Emoji!
|
||||
|
||||
Both, JSON and SVG mode support emoji in the label and message.
|
||||
However, this is especially great in SVG mode which does not support icons. Here's an SVG emoji badge which does not use shields.io at all: .
|
||||
|
||||
## 🛠️ Configuration
|
||||
|
||||
1. Head over to [gist.github.com](https://gist.github.com/) and create a new gist. You can name the file `test.json`, but this can be changed later as well. You will need the ID of the gist (this is the long alphanumerical part of its URL) later.
|
||||
2. Navigate to [github.com/settings/tokens](https://github.com/settings/tokens) and create a new token with the _gist_ scope.
|
||||
3. Go to the _Secrets_ page of the settings of your repository (Settings > Secrets > Actions) and add this token as a new secret. You can give it any name, for example `GIST_SECRET`. **If you use Dependabot to automatically update dependencies of your repository, you also have to add this secret to Dependabot's secrets (Settings > Secrets > Dependabot).**
|
||||
4. Add something like the following to your workflow:
|
||||
|
||||
```yml
|
||||
- name: Create Awesome Badge
|
||||
uses: schneegans/dynamic-badges-action@v1.0.0
|
||||
uses: schneegans/dynamic-badges-action@v1.7.0
|
||||
with:
|
||||
auth: ${{ secrets.GIST_SECRET }}
|
||||
gistID: <gist-ID>
|
||||
filename: test.json
|
||||
filename: test.json # Use test.svg if you want to use the SVG mode.
|
||||
label: Hello
|
||||
message: World
|
||||
color: orange
|
||||
```
|
||||
|
||||
Once the action is executed, go to your gist.
|
||||
There should be a new file called `test.json`.
|
||||
You can view the raw content of this file at `https://gist.githubusercontent.com/<user>/<gist-ID>/raw/test.json`.
|
||||
There should be a new file called `test.json` (or `test.svg` if you used SVG mode).
|
||||
Embed the badge with:
|
||||
|
||||
```markdown
|
||||

|
||||
```
|
||||
|
||||
### Input Parameters
|
||||
### Required Input Parameters
|
||||
|
||||
The **Badge Parameters** are directly passed to [shields.io](https://shields.io). See the [official documentation](https://shields.io/endpoint) for more detailed explanations.
|
||||
| Parameter | Description |
|
||||
| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `auth` | A secret token with the _gist_ scope. |
|
||||
| `gistID` | The ID of the target gist. Something like `8f6459c2417de7534f64d98360dde866`. |
|
||||
| `filename` | The target filename - each gist may contain several files. This should have a `.json` extension if you want to use **shields.io/endpoint** or an `.svg` extension if you want to use the **SVG mode** described above. |
|
||||
|
||||
Gist Parameter | Description
|
||||
----------|------------
|
||||
`auth` | Required. A secret token with the *gist* scope.
|
||||
`gistID` | Required. The ID of the target gist. Something like `8f6459c2417de7534f64d98360dde866`.
|
||||
`filename` | Required. The target filename - each gist may contain several files. This should have the `.json` extension.
|
||||
**Badge Parameter** | **Description**
|
||||
`label` | Required. The left text of the badge.
|
||||
`message` | Required. The right text of the badge.
|
||||
`labelColor` | The left color of the badge.
|
||||
`color` | The right color of the badge.
|
||||
`isError` | The color will be red and cannot be overridden.
|
||||
`namedLogo` | A logo name from [simpleicons.org](http://simpleicons.org/).
|
||||
`logoSvg` | An svg-string to be used as logo.
|
||||
`logoColor` | The color for the logo.
|
||||
`logoWidth` | The space allocated for the logo.
|
||||
`logoPosition` | The position of the logo.
|
||||
`style` | The style like "flat" or "social".
|
||||
`cacheSeconds` | The cache lifetime in seconds (must be greater than 300).
|
||||
### Optional Input Parameters
|
||||
|
||||
### Using Environment Variables as Parameters [](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d/raw/answer.json)
|
||||
| Parameter | Description | Supported in SVG Mode |
|
||||
| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- |
|
||||
| `host` | Default is `https://api.github.com/gists/`. You can change this if you're using GitHub enterprise. The URL will be something like `https://github-enterprise-hostname/api/v3/gists/`. | ✅ |
|
||||
| `forceUpdate` | Default is `false`. If set to `true`, the gist will be updated even if the content did not change. | ✅ |
|
||||
|
||||
A common usage pattern of this action is to create environment variables in previous steps of a job and later use them as message in your badge. This can be achieved like this:
|
||||
### Shields.io Parameters (optional)
|
||||
|
||||
All these parameters are optional.
|
||||
They are directly passed to [shields.io](https://shields.io). See the [official documentation](https://shields.io/endpoint) for more detailed explanations.
|
||||
|
||||
| Parameter | Description | Supported in SVG Mode |
|
||||
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- |
|
||||
| `label` | Required. The left text of the badge. | ✅ |
|
||||
| `message` | Required. The right text of the badge. | ✅ |
|
||||
| `labelColor` | The left color of the badge. | ✅ |
|
||||
| `color` | The right color of the badge. For custom colors wrap color string in quotes `"#bf155b"`. This parameter is ignored if the `valColorRange`, `maxColorRange`, and `minColorRange` are set. | ✅ |
|
||||
| `isError` | The color will be red and cannot be overridden. | |
|
||||
| `namedLogo` | A logo name from [simpleicons.org](http://simpleicons.org/). | |
|
||||
| `logoSvg` | An svg-string to be used as logo. | |
|
||||
| `logoColor` | The color for the logo. | |
|
||||
| `logoWidth` | The space allocated for the logo. | |
|
||||
| `logoPosition` | The position of the logo. | |
|
||||
| `style` | The style like "flat" or "social". | ✅ |
|
||||
| `cacheSeconds` | The cache lifetime in seconds (must be greater than 300). | |
|
||||
|
||||
### Color Range Parameters (optional)
|
||||
|
||||
Starting with version 1.3.0 of this action, the color of the right side of the badge can be computed automatically on a green-to-red color-scale. For example, these badges have been colored with `minColorRange: 50` and `maxColorRange: 90`:
|
||||
|
||||
[](https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d)
|
||||
[](https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d)
|
||||
[](https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d)
|
||||
[](https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d)
|
||||
[](https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d)
|
||||
[](https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d)<br>
|
||||
[](https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d)
|
||||
[](https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d)
|
||||
[](https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d)
|
||||
[](https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d)
|
||||
[](https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d)
|
||||
|
||||
For this, the following parameters can be used.
|
||||
|
||||
| Parameter | Description | Supported in SVG Mode |
|
||||
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------- |
|
||||
| `valColorRange` | A numerical value used to define the message color. Usually this should be between `maxColorRange` and `minColorRange`. This is required if you want to use the color range feature. | ✅ |
|
||||
| `maxColorRange` | If `valColorRange` assumes this value, the badge will be green. This is required if you want to use the color range feature. | ✅ |
|
||||
| `minColorRange` | If `valColorRange` assumes this value, the badge will be red. This is required if you want to use the color range feature. | ✅ |
|
||||
| `invertColorRange` | If the range should be inverted, causing a smaller value to have green color. Defaults to `false`. | ✅ |
|
||||
| `colorRangeSaturation` | Saturation used by the color range feature. Defaults to 100. | ✅ |
|
||||
| `colorRangeLightness` | Lightness used by the color range feature. Defaults to 40. | ✅ |
|
||||
|
||||
### Using Environment Variables as Parameters [](https://gist.githubusercontent.com/schneegans/2ab8f1d386f13aaebccbd87dac94068d)
|
||||
|
||||
A common usage pattern of this action is to create environment variables in previous steps of a job and later use them as message in your badge.
|
||||
How this can be done, is shown in the following example.
|
||||
|
||||
This example also shows how to use the automatic color range feature: If the answer is <= 0, the badge will be red, if it's >= 100 it will be green.
|
||||
For all values in between, the color will be interpolated.
|
||||
|
||||
```yml
|
||||
- name: Get the Numbers
|
||||
run: echo "ANSWER=42" >> $GITHUB_ENV
|
||||
- name: Create the Badge
|
||||
uses: schneegans/dynamic-badges-action@v1.0.0
|
||||
uses: schneegans/dynamic-badges-action@v1.7.0
|
||||
with:
|
||||
auth: ${{ secrets.GIST_SECRET }}
|
||||
gistID: <gist-ID>
|
||||
filename: answer.json
|
||||
label: The Answer is
|
||||
message: ${{ env.ANSWER }}
|
||||
color: green
|
||||
label: The Answer
|
||||
message: is ${{ env.ANSWER }}
|
||||
valColorRange: ${{ env.ANSWER }}
|
||||
maxColorRange: 100
|
||||
minColorRange: 0
|
||||
```
|
||||
|
||||
# Contributing to Dynamic Badges Action
|
||||
### Self-hosted runner compatibility
|
||||
|
||||
Whenever you encounter a :beetle: **bug** or have :tada: **feature request**,
|
||||
report this via [Github issues](https://github.com/schneegans/dynamic-badges-action/issues).
|
||||
The current action is compatible with `node20` only. In order to use it with a self-hosted runner, you must use runner with `node20` installed. Your runner version must be equal or higher than [v2.308.0](https://github.com/actions/runner/releases/tag/v2.308.0).
|
||||
|
||||
We are happy to receive contributions in the form of **pull requests** via Github.
|
||||
## Contributing to Dynamic Badges Action
|
||||
|
||||
Whenever you encounter a :beetle: **bug** or have :tada: **feature request**,
|
||||
report this via [GitHub issues](https://github.com/schneegans/dynamic-badges-action/issues).
|
||||
|
||||
We are happy to receive contributions in the form of **pull requests** via GitHub.
|
||||
Feel free to fork the repository, implement your changes and create a merge request to the `master` branch.
|
||||
|
||||
## Git Commit Messages
|
||||
### Git Commit Messages
|
||||
|
||||
Commits should start with a Capital letter and should be written in present tense (e.g. __:tada: Add cool new feature__ instead of __:tada: Added cool new feature__).
|
||||
Commits should start with a Capital letter and should be written in present tense (e.g. **:tada: Add cool new feature** instead of **:tada: Added cool new feature**).
|
||||
You should also start your commit message with **one** applicable emoji. This does not only look great but also makes you rethink what to add to a commit. Make many but small commits!
|
||||
|
||||
Emoji | Description
|
||||
------|------------
|
||||
:tada: `:tada:` | When you added a cool new feature.
|
||||
:wrench: `:wrench:` | When you refactored / improved a small piece of code.
|
||||
:hammer: `:hammer:` | When you refactored / improved large parts of the code.
|
||||
:sparkles: `:sparkles:` | When you applied clang-format.
|
||||
:art: `:art:` | When you improved / added assets like themes.
|
||||
:rocket: `:rocket:` | When you improved performance.
|
||||
:memo: `:memo:` | When you wrote documentation.
|
||||
:beetle: `:beetle:` | When you fixed a bug.
|
||||
:twisted_rightwards_arrows: `:twisted_rightwards_arrows:` | When you merged a branch.
|
||||
:fire: `:fire:` | When you removed something.
|
||||
:truck: `:truck:` | When you moved / renamed something.
|
||||
| Emoji | Description |
|
||||
| --------------------------------------------------------- | ------------------------------------------------------- |
|
||||
| :tada: `:tada:` | When you added a cool new feature. |
|
||||
| :wrench: `:wrench:` | When you refactored / improved a small piece of code. |
|
||||
| :hammer: `:hammer:` | When you refactored / improved large parts of the code. |
|
||||
| :sparkles: `:sparkles:` | When you applied clang-format. |
|
||||
| :art: `:art:` | When you improved / added assets like themes. |
|
||||
| :rocket: `:rocket:` | When you improved performance. |
|
||||
| :memo: `:memo:` | When you wrote documentation. |
|
||||
| :beetle: `:beetle:` | When you fixed a bug. |
|
||||
| :twisted_rightwards_arrows: `:twisted_rightwards_arrows:` | When you merged a branch. |
|
||||
| :fire: `:fire:` | When you removed something. |
|
||||
| :truck: `:truck:` | When you moved / renamed something. |
|
||||
|
||||
## Version Numbers
|
||||
### Version Numbers
|
||||
|
||||
Version numbers will be assigned according to the [Semantic Versioning](https://semver.org/) scheme.
|
||||
This means, given a version number MAJOR.MINOR.PATCH, we will increment the:
|
||||
|
||||
67
action.yml
67
action.yml
@@ -1,54 +1,73 @@
|
||||
name: 'Dynamic Badges'
|
||||
description: 'Creates badge descriptions to be used with shields.io/endpoint and uploads them to a gist.'
|
||||
# SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
name: "Dynamic Badges"
|
||||
description: "Create badges via shields.io/endpoint for your README.md which may change with every commit."
|
||||
branding:
|
||||
icon: 'tag'
|
||||
color: 'green'
|
||||
icon: "tag"
|
||||
color: "green"
|
||||
inputs:
|
||||
auth:
|
||||
description: 'Your secret with the gist scope'
|
||||
required: true
|
||||
gistID:
|
||||
description: 'The ID of the gist to use'
|
||||
required: true
|
||||
filename:
|
||||
description: 'The *.json filename of the badge data'
|
||||
description: "Your secret token"
|
||||
required: true
|
||||
label:
|
||||
description: 'The left text of the badge'
|
||||
description: "The left text of the badge"
|
||||
required: true
|
||||
message:
|
||||
description: 'The right text of the badge'
|
||||
description: "The right text of the badge"
|
||||
required: true
|
||||
host:
|
||||
description: "The base URL of the badgestor API"
|
||||
default: "https://badges.mydomain.com/"
|
||||
required: true
|
||||
labelColor:
|
||||
description: 'The left color of the badge'
|
||||
description: "The left color of the badge"
|
||||
required: false
|
||||
color:
|
||||
description: 'The right color of the badge'
|
||||
description: "The right color of the badge"
|
||||
required: false
|
||||
isError:
|
||||
description: 'The color will be red and cannot be overridden'
|
||||
description: "The color will be red and cannot be overridden"
|
||||
required: false
|
||||
namedLogo:
|
||||
description: 'A logo name from simpleicons.org'
|
||||
description: "A logo name from simpleicons.org"
|
||||
required: false
|
||||
logoSvg:
|
||||
description: 'An svg-string to be used as logo'
|
||||
description: "An svg-string to be used as logo"
|
||||
required: false
|
||||
logoColor:
|
||||
description: 'The color for the logo'
|
||||
description: "The color for the logo"
|
||||
required: false
|
||||
logoWidth:
|
||||
description: 'The space allocated for the logo'
|
||||
description: "The space allocated for the logo"
|
||||
required: false
|
||||
logoPosition:
|
||||
description: 'The position of the logo'
|
||||
description: "The position of the logo"
|
||||
required: false
|
||||
style:
|
||||
description: 'The style like "flat" or "social"'
|
||||
required: false
|
||||
cacheSeconds:
|
||||
description: 'The cache lifetime in seconds (must be greater than 300)'
|
||||
description: "The cache lifetime in seconds (must be greater than 300)"
|
||||
required: false
|
||||
valColorRange:
|
||||
description: "A numerical value used to define the message color. Usually this should be between maxColorRange and minColorRange. This is required if you want to use the color range feature."
|
||||
required: false
|
||||
maxColorRange:
|
||||
description: "If valColorRange assumes this value, the badge will be green. This is required if you want to use the color range feature."
|
||||
required: false
|
||||
minColorRange:
|
||||
description: "If valColorRange assumes this value, the badge will be red. This is required if you want to use the color range feature."
|
||||
required: false
|
||||
invertColorRange:
|
||||
description: "If the range should be inverted, causing a smaller value to have green color. Defaults to false."
|
||||
required: false
|
||||
colorRangeSaturation:
|
||||
description: "Saturation used by the color range feature. Defaults to 100."
|
||||
required: false
|
||||
colorRangeLightness:
|
||||
description: "Lightness used by the color range feature. Defaults to 40."
|
||||
required: false
|
||||
runs:
|
||||
using: 'node12'
|
||||
main: 'index.js'
|
||||
using: "node20"
|
||||
main: "index.js"
|
||||
|
||||
79
changelog.md
Normal file
79
changelog.md
Normal file
@@ -0,0 +1,79 @@
|
||||
<!--
|
||||
SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
|
||||
SPDX-License-Identifier: CC-BY-4.0
|
||||
-->
|
||||
|
||||
# Changelog of the Dynamic Badges Action
|
||||
|
||||
## [Dynamic Badges Action 1.7.0](https://github.com/Schneegans/dynamic-badges-action/tree/v1.7.0)
|
||||
|
||||
**Release Date:** 2023-10-19
|
||||
|
||||
#### Changes
|
||||
|
||||
- **SVG Mode:** If your gist filename ends with `.svg` instead of `.json`, the action will now generate an SVG badge instead of a JSON file. This is useful if you cannot use shields.io for some reason. However, this SVG mode does not support all features of shields.io. Thanks to [@runarberg](https://github.com/runarberg) for this contribution!
|
||||
- **New `host` Parameter:** You can now specify the host for the gist API. This is useful if you want to use the action on a GitHub enterprise instance. Thanks to [@LucBerge](https://github.com/LucBerge) for this idea!
|
||||
- Fixed a bug which caused the gist not to be updated if the label or message of the badge contained characters which have a different encoding length in UTF8 and UTF16,
|
||||
- The code has received some major refactoring. If you encounter any problems, please open an issue!
|
||||
- The action now runs on Node 20 instead of Node 16.
|
||||
- The repository is now compliant with the [REUSE Specification](https://reuse.software/) of the Free Software Foundation Europe.
|
||||
|
||||
## [Dynamic Badges Action 1.6.0](https://github.com/Schneegans/dynamic-badges-action/tree/v1.6.0)
|
||||
|
||||
**Release Date:** 2022-10-13
|
||||
|
||||
#### Changes
|
||||
|
||||
- The action now runs on Node 16 instead of the deprecated Node 12.
|
||||
|
||||
## [Dynamic Badges Action 1.5.0](https://github.com/Schneegans/dynamic-badges-action/tree/v1.5.0)
|
||||
|
||||
**Release Date:** 2022-10-09
|
||||
|
||||
#### Changes
|
||||
|
||||
- The gist is now not updated anymore if the content did not change. This prevents many gist revisions without actual changes. You can restore the original behavior by setting the optional `forceUpdate` parameter to `true`. A BIG thanks to [@MishaKav](https://github.com/MishaKav) for this contribution!
|
||||
- Example color range badges have been added to the README.
|
||||
- All node dependencies have been updated.
|
||||
|
||||
## [Dynamic Badges Action 1.4.0](https://github.com/Schneegans/dynamic-badges-action/tree/v1.4.0)
|
||||
|
||||
**Release Date:** 2022-05-15
|
||||
|
||||
#### Changes
|
||||
|
||||
- Fixed a bug which caused the action to fail if the value for the automatic color range was out of bounds. Thanks to [@LucasWolfgang](https://github.com/LucasWolfgang) for this fix!
|
||||
|
||||
## [Dynamic Badges Action 1.3.0](https://github.com/Schneegans/dynamic-badges-action/tree/v1.3.0)
|
||||
|
||||
**Release Date:** 2022-04-18
|
||||
|
||||
#### Changes
|
||||
|
||||
- Added the possibility to generate the badge color automatically between red and green based on a numerical value and its bounds. Thanks to [@LucasWolfgang](https://github.com/LucasWolfgang) for this contribution!
|
||||
|
||||
## [Dynamic Badges Action 1.2.0](https://github.com/Schneegans/dynamic-badges-action/tree/v1.2.0)
|
||||
|
||||
**Release Date:** 2022-03-26
|
||||
|
||||
#### Changes
|
||||
|
||||
- The action does not log the response of writing the Gist anymore.
|
||||
- Added this changelog.
|
||||
|
||||
## [Dynamic Badges Action 1.1.0](https://github.com/Schneegans/dynamic-badges-action/tree/v1.1.0)
|
||||
|
||||
**Release Date:** 2021-06-16
|
||||
|
||||
#### Changes
|
||||
|
||||
- The action now logs an error message when writing the Gist failed.
|
||||
- Used new API for setting environment variables in the README.md examples.
|
||||
|
||||
## [Dynamic Badges Action 1.0.0](https://github.com/Schneegans/dynamic-badges-action/tree/v1.0.0)
|
||||
|
||||
**Release Date:** 2020-08-16
|
||||
|
||||
#### Changes
|
||||
|
||||
- Initial publication on GitHub.
|
||||
242
index.js
242
index.js
@@ -1,102 +1,170 @@
|
||||
const core = require('@actions/core');
|
||||
const http = require('https');
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// This file is part of the Dynamic Badges Action //
|
||||
// It may be used under the terms of the MIT license. See the LICENSE file for details. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
try {
|
||||
// SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// This object will be stringified and uploaded to the gist. The
|
||||
// schemaVersion, label and message attributes are always required. All others
|
||||
// are optional and added to the content object only if they are given to the
|
||||
// action.
|
||||
let content = {
|
||||
schemaVersion: 1,
|
||||
label: core.getInput('label'),
|
||||
message: core.getInput('message')
|
||||
};
|
||||
import core from "@actions/core";
|
||||
import { makeBadge } from "badge-maker";
|
||||
import { createRequire } from "module";
|
||||
const require = createRequire(import.meta.url);
|
||||
|
||||
// Get all optional attributes and add them to the content object if given.
|
||||
const labelColor = core.getInput('labelColor');
|
||||
const color = core.getInput('color');
|
||||
const isError = core.getInput('isError');
|
||||
const namedLogo = core.getInput('namedLogo');
|
||||
const logoSvg = core.getInput('logoSvg');
|
||||
const logoColor = core.getInput('logoColor');
|
||||
const logoWidth = core.getInput('logoWidth');
|
||||
const logoPosition = core.getInput('logoPosition');
|
||||
const style = core.getInput('style');
|
||||
const cacheSeconds = core.getInput('cacheSeconds');
|
||||
const util = require('util');
|
||||
|
||||
if (labelColor != '') {
|
||||
content.labelColor = labelColor;
|
||||
}
|
||||
const hostUrl = new URL(core.getInput("host"));
|
||||
|
||||
if (color != '') {
|
||||
content.color = color;
|
||||
}
|
||||
// This uses the method above to update a gist with the given data. The user agent is
|
||||
// required as defined in https://developer.github.com/v3/#user-agent-required
|
||||
async function updateBadge(body) {
|
||||
const headers = new Headers([
|
||||
["Content-Type", "application/json"],
|
||||
["Content-Length", new TextEncoder().encode(body).length],
|
||||
["User-Agent", "gitea-dynamic-badges"],
|
||||
["x-api-key", `${core.getInput("auth")}`],
|
||||
]);
|
||||
|
||||
if (isError != '') {
|
||||
content.isError = isError;
|
||||
}
|
||||
console.log("Making post request to: %s", hostUrl);
|
||||
|
||||
if (namedLogo != '') {
|
||||
content.namedLogo = namedLogo;
|
||||
}
|
||||
|
||||
if (logoSvg != '') {
|
||||
content.logoSvg = logoSvg;
|
||||
}
|
||||
|
||||
if (logoColor != '') {
|
||||
content.logoColor = logoColor;
|
||||
}
|
||||
|
||||
if (logoWidth != '') {
|
||||
content.logoWidth = parseInt(logoWidth);
|
||||
}
|
||||
|
||||
if (logoPosition != '') {
|
||||
content.logoPosition = logoPosition;
|
||||
}
|
||||
|
||||
if (style != '') {
|
||||
content.style = style;
|
||||
}
|
||||
|
||||
if (cacheSeconds != '') {
|
||||
content.cacheSeconds = parseInt(cacheSeconds);
|
||||
}
|
||||
|
||||
// For the POST request, the above content is set as file contents for the
|
||||
// given filename.
|
||||
const request = JSON.stringify({
|
||||
files: {[core.getInput('filename')]: {content: JSON.stringify(content)}}
|
||||
const response = await fetch(hostUrl, {
|
||||
method: "POST",
|
||||
headers,
|
||||
body,
|
||||
});
|
||||
|
||||
// Perform the actual request. The user agent is required as defined in
|
||||
// https://developer.github.com/v3/#user-agent-required
|
||||
const req = http.request(
|
||||
{
|
||||
host: 'api.github.com',
|
||||
path: '/gists/' + core.getInput('gistID'),
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Content-Length': request.length,
|
||||
'User-Agent': 'Schneegans',
|
||||
'Authorization': 'token ' + core.getInput('auth'),
|
||||
}
|
||||
},
|
||||
res => {
|
||||
if (res.statusCode < 200 || res.statusCode >= 400) {
|
||||
core.setFailed('Failed to create gist, response status code: ' + res.statusCode + ', status message: ' + res.statusMessage);
|
||||
}
|
||||
let body = '';
|
||||
res.on('data', data => body += data);
|
||||
res.on('end', () => console.log('result:' + body));
|
||||
if (!response.ok) {
|
||||
console.log("Returned: %j", response.body);
|
||||
if (response.status === 409) {
|
||||
// This means likely the badge already exists. Try to patch
|
||||
console.log("Running patch on %s", hostUrl);
|
||||
const response2 = await fetch(hostUrl, {
|
||||
method: 'PATCH',
|
||||
headers,
|
||||
body,
|
||||
});
|
||||
if (!response2.ok) {
|
||||
core.setFailed(
|
||||
`Failed to create gist, response status code: ${response.status} ${response.statusText}`
|
||||
);
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
req.write(request);
|
||||
req.end();
|
||||
console.log("Success!");
|
||||
}
|
||||
|
||||
|
||||
// We wrap the entire action in a try / catch block so we can set it to "failed" if
|
||||
// something goes wrong.
|
||||
try {
|
||||
// This object will be stringified and uploaded to the gist. The schemaVersion, label
|
||||
// and message attributes are always required. All others are optional and added to the
|
||||
// content object only if they are given to the action.
|
||||
let data = {
|
||||
schemaVersion: 1,
|
||||
label: core.getInput("label"),
|
||||
message: core.getInput("message"),
|
||||
};
|
||||
|
||||
|
||||
// Compute the message color based on the given inputs.
|
||||
const color = core.getInput("color");
|
||||
const valColorRange = core.getInput("valColorRange");
|
||||
const minColorRange = core.getInput("minColorRange");
|
||||
const maxColorRange = core.getInput("maxColorRange");
|
||||
const invertColorRange = core.getInput("invertColorRange");
|
||||
const colorRangeSaturation = core.getInput("colorRangeSaturation");
|
||||
const colorRangeLightness = core.getInput("colorRangeLightness");
|
||||
|
||||
if (minColorRange != "" && maxColorRange != "" && valColorRange != "") {
|
||||
const max = parseFloat(maxColorRange);
|
||||
const min = parseFloat(minColorRange);
|
||||
let val = parseFloat(valColorRange);
|
||||
|
||||
if (val < min) val = min;
|
||||
if (val > max) val = max;
|
||||
|
||||
let hue = 0;
|
||||
if (invertColorRange == "") {
|
||||
hue = Math.floor(((val - min) / (max - min)) * 120);
|
||||
} else {
|
||||
hue = Math.floor(((max - val) / (max - min)) * 120);
|
||||
}
|
||||
|
||||
let sat = 100;
|
||||
if (colorRangeSaturation != "") {
|
||||
sat = parseFloat(colorRangeSaturation);
|
||||
}
|
||||
|
||||
let lig = 40;
|
||||
if (colorRangeLightness != "") {
|
||||
lig = parseFloat(colorRangeLightness);
|
||||
}
|
||||
|
||||
data.color = "hsl(" + hue + ", " + sat + "%, " + lig + "%)";
|
||||
} else if (color != "") {
|
||||
data.color = color;
|
||||
}
|
||||
|
||||
// Get all optional attributes and add them to the content object if given.
|
||||
const labelColor = core.getInput("labelColor");
|
||||
const isError = core.getInput("isError");
|
||||
const namedLogo = core.getInput("namedLogo");
|
||||
const logoSvg = core.getInput("logoSvg");
|
||||
const logoColor = core.getInput("logoColor");
|
||||
const logoWidth = core.getInput("logoWidth");
|
||||
const logoPosition = core.getInput("logoPosition");
|
||||
const style = core.getInput("style");
|
||||
const cacheSeconds = core.getInput("cacheSeconds");
|
||||
|
||||
if (labelColor != "") {
|
||||
data.labelColor = labelColor;
|
||||
}
|
||||
|
||||
if (isError != "") {
|
||||
data.isError = isError;
|
||||
}
|
||||
|
||||
if (namedLogo != "") {
|
||||
data.namedLogo = namedLogo;
|
||||
}
|
||||
|
||||
if (logoSvg != "") {
|
||||
data.logoSvg = logoSvg;
|
||||
}
|
||||
|
||||
if (logoColor != "") {
|
||||
data.logoColor = logoColor;
|
||||
}
|
||||
|
||||
if (logoWidth != "") {
|
||||
data.logoWidth = parseInt(logoWidth);
|
||||
}
|
||||
|
||||
if (logoPosition != "") {
|
||||
data.logoPosition = logoPosition;
|
||||
}
|
||||
|
||||
if (style != "") {
|
||||
data.style = style;
|
||||
}
|
||||
|
||||
if (cacheSeconds != "") {
|
||||
data.cacheSeconds = parseInt(cacheSeconds);
|
||||
}
|
||||
|
||||
let content = "";
|
||||
|
||||
content = JSON.stringify({ payload: data });
|
||||
|
||||
console.log("Body of request: %s", content);
|
||||
|
||||
updateBadge(content);
|
||||
|
||||
} catch (error) {
|
||||
core.setFailed(error);
|
||||
}
|
||||
|
||||
1
node_modules/.bin/badge
generated
vendored
Symbolic link
1
node_modules/.bin/badge
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../badge-maker/lib/badge-cli.js
|
||||
1
node_modules/.bin/uuid
generated
vendored
Symbolic link
1
node_modules/.bin/uuid
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../uuid/dist/bin/uuid
|
||||
103
node_modules/.package-lock.json
generated
vendored
Normal file
103
node_modules/.package-lock.json
generated
vendored
Normal file
@@ -0,0 +1,103 @@
|
||||
{
|
||||
"name": "dynamic-badges-action",
|
||||
"version": "1.5.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"node_modules/@actions/core": {
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz",
|
||||
"integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==",
|
||||
"dependencies": {
|
||||
"@actions/http-client": "^2.0.1",
|
||||
"uuid": "^8.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@actions/http-client": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz",
|
||||
"integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==",
|
||||
"dependencies": {
|
||||
"tunnel": "^0.0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/anafanafo": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/anafanafo/-/anafanafo-2.0.0.tgz",
|
||||
"integrity": "sha512-Nlfq7NC4AOkTJerWRIZcOAiMNtIDVIGWGvQ98O7Jl6Kr2Dk0dX5u4MqN778kSRTy5KRqchpLdF2RtLFEz9FVkQ==",
|
||||
"dependencies": {
|
||||
"char-width-table-consumer": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/badge-maker": {
|
||||
"version": "3.3.1",
|
||||
"resolved": "https://registry.npmjs.org/badge-maker/-/badge-maker-3.3.1.tgz",
|
||||
"integrity": "sha512-OO/PS7Zg2E6qaUWzHEHt21Q5VjcFBAJVA8ztgT/fIdSZFBUwoyeo0ZhA6V5tUM8Vcjq8DJl6jfGhpjESssyqMQ==",
|
||||
"dependencies": {
|
||||
"anafanafo": "2.0.0",
|
||||
"css-color-converter": "^2.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"badge": "lib/badge-cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10",
|
||||
"npm": ">= 5"
|
||||
}
|
||||
},
|
||||
"node_modules/binary-search": {
|
||||
"version": "1.3.6",
|
||||
"resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz",
|
||||
"integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA=="
|
||||
},
|
||||
"node_modules/char-width-table-consumer": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/char-width-table-consumer/-/char-width-table-consumer-1.0.0.tgz",
|
||||
"integrity": "sha512-Fz4UD0LBpxPgL9i29CJ5O4KANwaMnX/OhhbxzvNa332h+9+nRKyeuLw4wA51lt/ex67+/AdsoBQJF3kgX2feYQ==",
|
||||
"dependencies": {
|
||||
"binary-search": "^1.3.5"
|
||||
}
|
||||
},
|
||||
"node_modules/color-convert": {
|
||||
"version": "0.5.3",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz",
|
||||
"integrity": "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling=="
|
||||
},
|
||||
"node_modules/color-name": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
|
||||
},
|
||||
"node_modules/css-color-converter": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/css-color-converter/-/css-color-converter-2.0.0.tgz",
|
||||
"integrity": "sha512-oLIG2soZz3wcC3aAl/7Us5RS8Hvvc6I8G8LniF/qfMmrm7fIKQ8RIDDRZeKyGL2SrWfNqYspuLShbnjBMVWm8g==",
|
||||
"dependencies": {
|
||||
"color-convert": "^0.5.2",
|
||||
"color-name": "^1.1.4",
|
||||
"css-unit-converter": "^1.1.2"
|
||||
}
|
||||
},
|
||||
"node_modules/css-unit-converter": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz",
|
||||
"integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA=="
|
||||
},
|
||||
"node_modules/tunnel": {
|
||||
"version": "0.0.6",
|
||||
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
|
||||
"integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
|
||||
"engines": {
|
||||
"node": ">=0.6.11 <=0.7.0 || >=0.7.3"
|
||||
}
|
||||
},
|
||||
"node_modules/uuid": {
|
||||
"version": "8.3.2",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
|
||||
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
|
||||
"bin": {
|
||||
"uuid": "dist/bin/uuid"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
9
node_modules/@actions/core/LICENSE.md
generated
vendored
Normal file
9
node_modules/@actions/core/LICENSE.md
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright 2019 GitHub
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
203
node_modules/@actions/core/README.md
generated
vendored
203
node_modules/@actions/core/README.md
generated
vendored
@@ -16,11 +16,14 @@ import * as core from '@actions/core';
|
||||
|
||||
#### Inputs/Outputs
|
||||
|
||||
Action inputs can be read with `getInput`. Outputs can be set with `setOutput` which makes them available to be mapped into inputs of other actions to ensure they are decoupled.
|
||||
Action inputs can be read with `getInput` which returns a `string` or `getBooleanInput` which parses a boolean based on the [yaml 1.2 specification](https://yaml.org/spec/1.2/spec.html#id2804923). If `required` set to be false, the input should have a default value in `action.yml`.
|
||||
|
||||
Outputs can be set with `setOutput` which makes them available to be mapped into inputs of other actions to ensure they are decoupled.
|
||||
|
||||
```js
|
||||
const myInput = core.getInput('inputName', { required: true });
|
||||
|
||||
const myBooleanInput = core.getBooleanInput('booleanInputName', { required: true });
|
||||
const myMultilineInput = core.getMultilineInput('multilineInputName', { required: true });
|
||||
core.setOutput('outputKey', 'outputVal');
|
||||
```
|
||||
|
||||
@@ -62,11 +65,10 @@ catch (err) {
|
||||
// setFailed logs the message and sets a failing exit code
|
||||
core.setFailed(`Action failed with error ${err}`);
|
||||
}
|
||||
```
|
||||
|
||||
Note that `setNeutral` is not yet implemented in actions V2 but equivalent functionality is being planned.
|
||||
|
||||
```
|
||||
|
||||
#### Logging
|
||||
|
||||
Finally, this library provides some utilities for logging. Note that debug logging is hidden from the logs by default. This behavior can be toggled by enabling the [Step Debug Logs](../../docs/action-debugging.md#step-debug-logs).
|
||||
@@ -89,6 +91,9 @@ try {
|
||||
}
|
||||
|
||||
// Do stuff
|
||||
core.info('Output to the actions build log')
|
||||
|
||||
core.notice('This is a message that will also emit an annotation')
|
||||
}
|
||||
catch (err) {
|
||||
core.error(`Error ${err}, action may still succeed though`);
|
||||
@@ -112,11 +117,123 @@ const result = await core.group('Do something async', async () => {
|
||||
})
|
||||
```
|
||||
|
||||
#### Annotations
|
||||
|
||||
This library has 3 methods that will produce [annotations](https://docs.github.com/en/rest/reference/checks#create-a-check-run).
|
||||
```js
|
||||
core.error('This is a bad error. This will also fail the build.')
|
||||
|
||||
core.warning('Something went wrong, but it\'s not bad enough to fail the build.')
|
||||
|
||||
core.notice('Something happened that you might want to know about.')
|
||||
```
|
||||
|
||||
These will surface to the UI in the Actions page and on Pull Requests. They look something like this:
|
||||
|
||||

|
||||
|
||||
These annotations can also be attached to particular lines and columns of your source files to show exactly where a problem is occuring.
|
||||
|
||||
These options are:
|
||||
```typescript
|
||||
export interface AnnotationProperties {
|
||||
/**
|
||||
* A title for the annotation.
|
||||
*/
|
||||
title?: string
|
||||
|
||||
/**
|
||||
* The name of the file for which the annotation should be created.
|
||||
*/
|
||||
file?: string
|
||||
|
||||
/**
|
||||
* The start line for the annotation.
|
||||
*/
|
||||
startLine?: number
|
||||
|
||||
/**
|
||||
* The end line for the annotation. Defaults to `startLine` when `startLine` is provided.
|
||||
*/
|
||||
endLine?: number
|
||||
|
||||
/**
|
||||
* The start column for the annotation. Cannot be sent when `startLine` and `endLine` are different values.
|
||||
*/
|
||||
startColumn?: number
|
||||
|
||||
/**
|
||||
* The start column for the annotation. Cannot be sent when `startLine` and `endLine` are different values.
|
||||
* Defaults to `startColumn` when `startColumn` is provided.
|
||||
*/
|
||||
endColumn?: number
|
||||
}
|
||||
```
|
||||
|
||||
#### Styling output
|
||||
|
||||
Colored output is supported in the Action logs via standard [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code). 3/4 bit, 8 bit and 24 bit colors are all supported.
|
||||
|
||||
Foreground colors:
|
||||
|
||||
```js
|
||||
// 3/4 bit
|
||||
core.info('\u001b[35mThis foreground will be magenta')
|
||||
|
||||
// 8 bit
|
||||
core.info('\u001b[38;5;6mThis foreground will be cyan')
|
||||
|
||||
// 24 bit
|
||||
core.info('\u001b[38;2;255;0;0mThis foreground will be bright red')
|
||||
```
|
||||
|
||||
Background colors:
|
||||
|
||||
```js
|
||||
// 3/4 bit
|
||||
core.info('\u001b[43mThis background will be yellow');
|
||||
|
||||
// 8 bit
|
||||
core.info('\u001b[48;5;6mThis background will be cyan')
|
||||
|
||||
// 24 bit
|
||||
core.info('\u001b[48;2;255;0;0mThis background will be bright red')
|
||||
```
|
||||
|
||||
Special styles:
|
||||
|
||||
```js
|
||||
core.info('\u001b[1mBold text')
|
||||
core.info('\u001b[3mItalic text')
|
||||
core.info('\u001b[4mUnderlined text')
|
||||
```
|
||||
|
||||
ANSI escape codes can be combined with one another:
|
||||
|
||||
```js
|
||||
core.info('\u001b[31;46mRed foreground with a cyan background and \u001b[1mbold text at the end');
|
||||
```
|
||||
|
||||
> Note: Escape codes reset at the start of each line
|
||||
|
||||
```js
|
||||
core.info('\u001b[35mThis foreground will be magenta')
|
||||
core.info('This foreground will reset to the default')
|
||||
```
|
||||
|
||||
Manually typing escape codes can be a little difficult, but you can use third party modules such as [ansi-styles](https://github.com/chalk/ansi-styles).
|
||||
|
||||
```js
|
||||
const style = require('ansi-styles');
|
||||
core.info(style.color.ansi16m.hex('#abcdef') + 'Hello world!')
|
||||
```
|
||||
|
||||
#### Action state
|
||||
|
||||
You can use this library to save state and get state for sharing information between a given wrapper action:
|
||||
You can use this library to save state and get state for sharing information between a given wrapper action:
|
||||
|
||||
**action.yml**:
|
||||
|
||||
**action.yml**
|
||||
```yaml
|
||||
name: 'Wrapper action sample'
|
||||
inputs:
|
||||
@@ -137,10 +254,82 @@ core.saveState("pidToKill", 12345);
|
||||
```
|
||||
|
||||
In action's `cleanup.js`:
|
||||
|
||||
```js
|
||||
const core = require('@actions/core');
|
||||
|
||||
var pid = core.getState("pidToKill");
|
||||
|
||||
process.kill(pid);
|
||||
```
|
||||
```
|
||||
|
||||
#### OIDC Token
|
||||
|
||||
You can use these methods to interact with the GitHub OIDC provider and get a JWT ID token which would help to get access token from third party cloud providers.
|
||||
|
||||
**Method Name**: getIDToken()
|
||||
|
||||
**Inputs**
|
||||
|
||||
audience : optional
|
||||
|
||||
**Outputs**
|
||||
|
||||
A [JWT](https://jwt.io/) ID Token
|
||||
|
||||
In action's `main.ts`:
|
||||
```js
|
||||
const core = require('@actions/core');
|
||||
async function getIDTokenAction(): Promise<void> {
|
||||
|
||||
const audience = core.getInput('audience', {required: false})
|
||||
|
||||
const id_token1 = await core.getIDToken() // ID Token with default audience
|
||||
const id_token2 = await core.getIDToken(audience) // ID token with custom audience
|
||||
|
||||
// this id_token can be used to get access token from third party cloud providers
|
||||
}
|
||||
getIDTokenAction()
|
||||
```
|
||||
|
||||
In action's `actions.yml`:
|
||||
|
||||
```yaml
|
||||
name: 'GetIDToken'
|
||||
description: 'Get ID token from Github OIDC provider'
|
||||
inputs:
|
||||
audience:
|
||||
description: 'Audience for which the ID token is intended for'
|
||||
required: false
|
||||
outputs:
|
||||
id_token1:
|
||||
description: 'ID token obtained from OIDC provider'
|
||||
id_token2:
|
||||
description: 'ID token obtained from OIDC provider'
|
||||
runs:
|
||||
using: 'node12'
|
||||
main: 'dist/index.js'
|
||||
```
|
||||
|
||||
#### Filesystem path helpers
|
||||
|
||||
You can use these methods to manipulate file paths across operating systems.
|
||||
|
||||
The `toPosixPath` function converts input paths to Posix-style (Linux) paths.
|
||||
The `toWin32Path` function converts input paths to Windows-style paths. These
|
||||
functions work independently of the underlying runner operating system.
|
||||
|
||||
```js
|
||||
toPosixPath('\\foo\\bar') // => /foo/bar
|
||||
toWin32Path('/foo/bar') // => \foo\bar
|
||||
```
|
||||
|
||||
The `toPlatformPath` function converts input paths to the expected value on the runner's operating system.
|
||||
|
||||
```js
|
||||
// On a Windows runner.
|
||||
toPlatformPath('/foo/bar') // => \foo\bar
|
||||
|
||||
// On a Linux runner.
|
||||
toPlatformPath('\\foo\\bar') // => /foo/bar
|
||||
```
|
||||
|
||||
8
node_modules/@actions/core/lib/command.d.ts
generated
vendored
8
node_modules/@actions/core/lib/command.d.ts
generated
vendored
@@ -1,4 +1,4 @@
|
||||
interface CommandProperties {
|
||||
export interface CommandProperties {
|
||||
[key: string]: any;
|
||||
}
|
||||
/**
|
||||
@@ -13,9 +13,3 @@ interface CommandProperties {
|
||||
*/
|
||||
export declare function issueCommand(command: string, properties: CommandProperties, message: any): void;
|
||||
export declare function issue(name: string, message?: string): void;
|
||||
/**
|
||||
* Sanitizes an input into a string so it can be passed into issueCommand safely
|
||||
* @param input input to sanitize into a string
|
||||
*/
|
||||
export declare function toCommandValue(input: any): string;
|
||||
export {};
|
||||
|
||||
36
node_modules/@actions/core/lib/command.js
generated
vendored
36
node_modules/@actions/core/lib/command.js
generated
vendored
@@ -1,13 +1,27 @@
|
||||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||
result["default"] = mod;
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.issue = exports.issueCommand = void 0;
|
||||
const os = __importStar(require("os"));
|
||||
const utils_1 = require("./utils");
|
||||
/**
|
||||
* Commands
|
||||
*
|
||||
@@ -61,28 +75,14 @@ class Command {
|
||||
return cmdStr;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Sanitizes an input into a string so it can be passed into issueCommand safely
|
||||
* @param input input to sanitize into a string
|
||||
*/
|
||||
function toCommandValue(input) {
|
||||
if (input === null || input === undefined) {
|
||||
return '';
|
||||
}
|
||||
else if (typeof input === 'string' || input instanceof String) {
|
||||
return input;
|
||||
}
|
||||
return JSON.stringify(input);
|
||||
}
|
||||
exports.toCommandValue = toCommandValue;
|
||||
function escapeData(s) {
|
||||
return toCommandValue(s)
|
||||
return utils_1.toCommandValue(s)
|
||||
.replace(/%/g, '%25')
|
||||
.replace(/\r/g, '%0D')
|
||||
.replace(/\n/g, '%0A');
|
||||
}
|
||||
function escapeProperty(s) {
|
||||
return toCommandValue(s)
|
||||
return utils_1.toCommandValue(s)
|
||||
.replace(/%/g, '%25')
|
||||
.replace(/\r/g, '%0D')
|
||||
.replace(/\n/g, '%0A')
|
||||
|
||||
2
node_modules/@actions/core/lib/command.js.map
generated
vendored
2
node_modules/@actions/core/lib/command.js.map
generated
vendored
@@ -1 +1 @@
|
||||
{"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":";;;;;;;;;AAAA,uCAAwB;AAWxB;;;;;;;;;GASG;AACH,SAAgB,YAAY,CAC1B,OAAe,EACf,UAA6B,EAC7B,OAAY;IAEZ,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;AAC/C,CAAC;AAPD,oCAOC;AAED,SAAgB,KAAK,CAAC,IAAY,EAAE,UAAkB,EAAE;IACtD,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;AACjC,CAAC;AAFD,sBAEC;AAED,MAAM,UAAU,GAAG,IAAI,CAAA;AAEvB,MAAM,OAAO;IAKX,YAAY,OAAe,EAAE,UAA6B,EAAE,OAAe;QACzE,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,GAAG,iBAAiB,CAAA;SAC5B;QAED,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,QAAQ;QACN,IAAI,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC,OAAO,CAAA;QAEtC,IAAI,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YAC9D,MAAM,IAAI,GAAG,CAAA;YACb,IAAI,KAAK,GAAG,IAAI,CAAA;YAChB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE;gBACjC,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;oBACvC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;oBAChC,IAAI,GAAG,EAAE;wBACP,IAAI,KAAK,EAAE;4BACT,KAAK,GAAG,KAAK,CAAA;yBACd;6BAAM;4BACL,MAAM,IAAI,GAAG,CAAA;yBACd;wBAED,MAAM,IAAI,GAAG,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAA;qBAC1C;iBACF;aACF;SACF;QAED,MAAM,IAAI,GAAG,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAA;QACpD,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,KAAU;IACvC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;QACzC,OAAO,EAAE,CAAA;KACV;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,YAAY,MAAM,EAAE;QAC/D,OAAO,KAAe,CAAA;KACvB;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;AAC9B,CAAC;AAPD,wCAOC;AAED,SAAS,UAAU,CAAC,CAAM;IACxB,OAAO,cAAc,CAAC,CAAC,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,SAAS,cAAc,CAAC,CAAM;IAC5B,OAAO,cAAc,CAAC,CAAC,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AACzB,CAAC"}
|
||||
{"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAwB;AACxB,mCAAsC;AAWtC;;;;;;;;;GASG;AACH,SAAgB,YAAY,CAC1B,OAAe,EACf,UAA6B,EAC7B,OAAY;IAEZ,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;AAC/C,CAAC;AAPD,oCAOC;AAED,SAAgB,KAAK,CAAC,IAAY,EAAE,OAAO,GAAG,EAAE;IAC9C,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;AACjC,CAAC;AAFD,sBAEC;AAED,MAAM,UAAU,GAAG,IAAI,CAAA;AAEvB,MAAM,OAAO;IAKX,YAAY,OAAe,EAAE,UAA6B,EAAE,OAAe;QACzE,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,GAAG,iBAAiB,CAAA;SAC5B;QAED,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,QAAQ;QACN,IAAI,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC,OAAO,CAAA;QAEtC,IAAI,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YAC9D,MAAM,IAAI,GAAG,CAAA;YACb,IAAI,KAAK,GAAG,IAAI,CAAA;YAChB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE;gBACjC,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;oBACvC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;oBAChC,IAAI,GAAG,EAAE;wBACP,IAAI,KAAK,EAAE;4BACT,KAAK,GAAG,KAAK,CAAA;yBACd;6BAAM;4BACL,MAAM,IAAI,GAAG,CAAA;yBACd;wBAED,MAAM,IAAI,GAAG,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAA;qBAC1C;iBACF;aACF;SACF;QAED,MAAM,IAAI,GAAG,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAA;QACpD,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAED,SAAS,UAAU,CAAC,CAAM;IACxB,OAAO,sBAAc,CAAC,CAAC,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,SAAS,cAAc,CAAC,CAAM;IAC5B,OAAO,sBAAc,CAAC,CAAC,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AACzB,CAAC"}
|
||||
84
node_modules/@actions/core/lib/core.d.ts
generated
vendored
84
node_modules/@actions/core/lib/core.d.ts
generated
vendored
@@ -4,6 +4,8 @@
|
||||
export interface InputOptions {
|
||||
/** Optional. Whether the input is required. If required and not present, will throw. Defaults to false */
|
||||
required?: boolean;
|
||||
/** Optional. Whether leading/trailing whitespace will be trimmed for the input. Defaults to true */
|
||||
trimWhitespace?: boolean;
|
||||
}
|
||||
/**
|
||||
* The code to exit an action
|
||||
@@ -18,6 +20,37 @@ export declare enum ExitCode {
|
||||
*/
|
||||
Failure = 1
|
||||
}
|
||||
/**
|
||||
* Optional properties that can be sent with annotatation commands (notice, error, and warning)
|
||||
* See: https://docs.github.com/en/rest/reference/checks#create-a-check-run for more information about annotations.
|
||||
*/
|
||||
export interface AnnotationProperties {
|
||||
/**
|
||||
* A title for the annotation.
|
||||
*/
|
||||
title?: string;
|
||||
/**
|
||||
* The path of the file for which the annotation should be created.
|
||||
*/
|
||||
file?: string;
|
||||
/**
|
||||
* The start line for the annotation.
|
||||
*/
|
||||
startLine?: number;
|
||||
/**
|
||||
* The end line for the annotation. Defaults to `startLine` when `startLine` is provided.
|
||||
*/
|
||||
endLine?: number;
|
||||
/**
|
||||
* The start column for the annotation. Cannot be sent when `startLine` and `endLine` are different values.
|
||||
*/
|
||||
startColumn?: number;
|
||||
/**
|
||||
* The start column for the annotation. Cannot be sent when `startLine` and `endLine` are different values.
|
||||
* Defaults to `startColumn` when `startColumn` is provided.
|
||||
*/
|
||||
endColumn?: number;
|
||||
}
|
||||
/**
|
||||
* Sets env variable for this action and future actions in the job
|
||||
* @param name the name of the variable to set
|
||||
@@ -35,13 +68,35 @@ export declare function setSecret(secret: string): void;
|
||||
*/
|
||||
export declare function addPath(inputPath: string): void;
|
||||
/**
|
||||
* Gets the value of an input. The value is also trimmed.
|
||||
* Gets the value of an input.
|
||||
* Unless trimWhitespace is set to false in InputOptions, the value is also trimmed.
|
||||
* Returns an empty string if the value is not defined.
|
||||
*
|
||||
* @param name name of the input to get
|
||||
* @param options optional. See InputOptions.
|
||||
* @returns string
|
||||
*/
|
||||
export declare function getInput(name: string, options?: InputOptions): string;
|
||||
/**
|
||||
* Gets the values of an multiline input. Each value is also trimmed.
|
||||
*
|
||||
* @param name name of the input to get
|
||||
* @param options optional. See InputOptions.
|
||||
* @returns string[]
|
||||
*
|
||||
*/
|
||||
export declare function getMultilineInput(name: string, options?: InputOptions): string[];
|
||||
/**
|
||||
* Gets the input value of the boolean type in the YAML 1.2 "core schema" specification.
|
||||
* Support boolean input list: `true | True | TRUE | false | False | FALSE` .
|
||||
* The return value is also in boolean type.
|
||||
* ref: https://yaml.org/spec/1.2/spec.html#id2804923
|
||||
*
|
||||
* @param name name of the input to get
|
||||
* @param options optional. See InputOptions.
|
||||
* @returns boolean
|
||||
*/
|
||||
export declare function getBooleanInput(name: string, options?: InputOptions): boolean;
|
||||
/**
|
||||
* Sets the value of an output.
|
||||
*
|
||||
@@ -73,13 +128,21 @@ export declare function debug(message: string): void;
|
||||
/**
|
||||
* Adds an error issue
|
||||
* @param message error issue message. Errors will be converted to string via toString()
|
||||
* @param properties optional properties to add to the annotation.
|
||||
*/
|
||||
export declare function error(message: string | Error): void;
|
||||
export declare function error(message: string | Error, properties?: AnnotationProperties): void;
|
||||
/**
|
||||
* Adds an warning issue
|
||||
* Adds a warning issue
|
||||
* @param message warning issue message. Errors will be converted to string via toString()
|
||||
* @param properties optional properties to add to the annotation.
|
||||
*/
|
||||
export declare function warning(message: string | Error): void;
|
||||
export declare function warning(message: string | Error, properties?: AnnotationProperties): void;
|
||||
/**
|
||||
* Adds a notice issue
|
||||
* @param message notice issue message. Errors will be converted to string via toString()
|
||||
* @param properties optional properties to add to the annotation.
|
||||
*/
|
||||
export declare function notice(message: string | Error, properties?: AnnotationProperties): void;
|
||||
/**
|
||||
* Writes info to log with console.log.
|
||||
* @param message info message
|
||||
@@ -120,3 +183,16 @@ export declare function saveState(name: string, value: any): void;
|
||||
* @returns string
|
||||
*/
|
||||
export declare function getState(name: string): string;
|
||||
export declare function getIDToken(aud?: string): Promise<string>;
|
||||
/**
|
||||
* Summary exports
|
||||
*/
|
||||
export { summary } from './summary';
|
||||
/**
|
||||
* @deprecated use core.summary
|
||||
*/
|
||||
export { markdownSummary } from './summary';
|
||||
/**
|
||||
* Path exports
|
||||
*/
|
||||
export { toPosixPath, toWin32Path, toPlatformPath } from './path-utils';
|
||||
|
||||
148
node_modules/@actions/core/lib/core.js
generated
vendored
148
node_modules/@actions/core/lib/core.js
generated
vendored
@@ -1,4 +1,23 @@
|
||||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
@@ -8,17 +27,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
||||
result["default"] = mod;
|
||||
return result;
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0;
|
||||
const command_1 = require("./command");
|
||||
const file_command_1 = require("./file-command");
|
||||
const utils_1 = require("./utils");
|
||||
const os = __importStar(require("os"));
|
||||
const path = __importStar(require("path"));
|
||||
const oidc_utils_1 = require("./oidc-utils");
|
||||
/**
|
||||
* The code to exit an action
|
||||
*/
|
||||
@@ -43,8 +59,12 @@ var ExitCode;
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
function exportVariable(name, val) {
|
||||
const convertedVal = command_1.toCommandValue(val);
|
||||
const convertedVal = utils_1.toCommandValue(val);
|
||||
process.env[name] = convertedVal;
|
||||
const filePath = process.env['GITHUB_ENV'] || '';
|
||||
if (filePath) {
|
||||
return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
|
||||
}
|
||||
command_1.issueCommand('set-env', { name }, convertedVal);
|
||||
}
|
||||
exports.exportVariable = exportVariable;
|
||||
@@ -61,12 +81,20 @@ exports.setSecret = setSecret;
|
||||
* @param inputPath
|
||||
*/
|
||||
function addPath(inputPath) {
|
||||
command_1.issueCommand('add-path', {}, inputPath);
|
||||
const filePath = process.env['GITHUB_PATH'] || '';
|
||||
if (filePath) {
|
||||
file_command_1.issueFileCommand('PATH', inputPath);
|
||||
}
|
||||
else {
|
||||
command_1.issueCommand('add-path', {}, inputPath);
|
||||
}
|
||||
process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;
|
||||
}
|
||||
exports.addPath = addPath;
|
||||
/**
|
||||
* Gets the value of an input. The value is also trimmed.
|
||||
* Gets the value of an input.
|
||||
* Unless trimWhitespace is set to false in InputOptions, the value is also trimmed.
|
||||
* Returns an empty string if the value is not defined.
|
||||
*
|
||||
* @param name name of the input to get
|
||||
* @param options optional. See InputOptions.
|
||||
@@ -77,9 +105,52 @@ function getInput(name, options) {
|
||||
if (options && options.required && !val) {
|
||||
throw new Error(`Input required and not supplied: ${name}`);
|
||||
}
|
||||
if (options && options.trimWhitespace === false) {
|
||||
return val;
|
||||
}
|
||||
return val.trim();
|
||||
}
|
||||
exports.getInput = getInput;
|
||||
/**
|
||||
* Gets the values of an multiline input. Each value is also trimmed.
|
||||
*
|
||||
* @param name name of the input to get
|
||||
* @param options optional. See InputOptions.
|
||||
* @returns string[]
|
||||
*
|
||||
*/
|
||||
function getMultilineInput(name, options) {
|
||||
const inputs = getInput(name, options)
|
||||
.split('\n')
|
||||
.filter(x => x !== '');
|
||||
if (options && options.trimWhitespace === false) {
|
||||
return inputs;
|
||||
}
|
||||
return inputs.map(input => input.trim());
|
||||
}
|
||||
exports.getMultilineInput = getMultilineInput;
|
||||
/**
|
||||
* Gets the input value of the boolean type in the YAML 1.2 "core schema" specification.
|
||||
* Support boolean input list: `true | True | TRUE | false | False | FALSE` .
|
||||
* The return value is also in boolean type.
|
||||
* ref: https://yaml.org/spec/1.2/spec.html#id2804923
|
||||
*
|
||||
* @param name name of the input to get
|
||||
* @param options optional. See InputOptions.
|
||||
* @returns boolean
|
||||
*/
|
||||
function getBooleanInput(name, options) {
|
||||
const trueValue = ['true', 'True', 'TRUE'];
|
||||
const falseValue = ['false', 'False', 'FALSE'];
|
||||
const val = getInput(name, options);
|
||||
if (trueValue.includes(val))
|
||||
return true;
|
||||
if (falseValue.includes(val))
|
||||
return false;
|
||||
throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` +
|
||||
`Support boolean input list: \`true | True | TRUE | false | False | FALSE\``);
|
||||
}
|
||||
exports.getBooleanInput = getBooleanInput;
|
||||
/**
|
||||
* Sets the value of an output.
|
||||
*
|
||||
@@ -88,7 +159,12 @@ exports.getInput = getInput;
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
function setOutput(name, value) {
|
||||
command_1.issueCommand('set-output', { name }, value);
|
||||
const filePath = process.env['GITHUB_OUTPUT'] || '';
|
||||
if (filePath) {
|
||||
return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
|
||||
}
|
||||
process.stdout.write(os.EOL);
|
||||
command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
|
||||
}
|
||||
exports.setOutput = setOutput;
|
||||
/**
|
||||
@@ -134,19 +210,30 @@ exports.debug = debug;
|
||||
/**
|
||||
* Adds an error issue
|
||||
* @param message error issue message. Errors will be converted to string via toString()
|
||||
* @param properties optional properties to add to the annotation.
|
||||
*/
|
||||
function error(message) {
|
||||
command_1.issue('error', message instanceof Error ? message.toString() : message);
|
||||
function error(message, properties = {}) {
|
||||
command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);
|
||||
}
|
||||
exports.error = error;
|
||||
/**
|
||||
* Adds an warning issue
|
||||
* Adds a warning issue
|
||||
* @param message warning issue message. Errors will be converted to string via toString()
|
||||
* @param properties optional properties to add to the annotation.
|
||||
*/
|
||||
function warning(message) {
|
||||
command_1.issue('warning', message instanceof Error ? message.toString() : message);
|
||||
function warning(message, properties = {}) {
|
||||
command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);
|
||||
}
|
||||
exports.warning = warning;
|
||||
/**
|
||||
* Adds a notice issue
|
||||
* @param message notice issue message. Errors will be converted to string via toString()
|
||||
* @param properties optional properties to add to the annotation.
|
||||
*/
|
||||
function notice(message, properties = {}) {
|
||||
command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);
|
||||
}
|
||||
exports.notice = notice;
|
||||
/**
|
||||
* Writes info to log with console.log.
|
||||
* @param message info message
|
||||
@@ -206,7 +293,11 @@ exports.group = group;
|
||||
*/
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
function saveState(name, value) {
|
||||
command_1.issueCommand('save-state', { name }, value);
|
||||
const filePath = process.env['GITHUB_STATE'] || '';
|
||||
if (filePath) {
|
||||
return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
|
||||
}
|
||||
command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
|
||||
}
|
||||
exports.saveState = saveState;
|
||||
/**
|
||||
@@ -219,4 +310,27 @@ function getState(name) {
|
||||
return process.env[`STATE_${name}`] || '';
|
||||
}
|
||||
exports.getState = getState;
|
||||
function getIDToken(aud) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return yield oidc_utils_1.OidcClient.getIDToken(aud);
|
||||
});
|
||||
}
|
||||
exports.getIDToken = getIDToken;
|
||||
/**
|
||||
* Summary exports
|
||||
*/
|
||||
var summary_1 = require("./summary");
|
||||
Object.defineProperty(exports, "summary", { enumerable: true, get: function () { return summary_1.summary; } });
|
||||
/**
|
||||
* @deprecated use core.summary
|
||||
*/
|
||||
var summary_2 = require("./summary");
|
||||
Object.defineProperty(exports, "markdownSummary", { enumerable: true, get: function () { return summary_2.markdownSummary; } });
|
||||
/**
|
||||
* Path exports
|
||||
*/
|
||||
var path_utils_1 = require("./path-utils");
|
||||
Object.defineProperty(exports, "toPosixPath", { enumerable: true, get: function () { return path_utils_1.toPosixPath; } });
|
||||
Object.defineProperty(exports, "toWin32Path", { enumerable: true, get: function () { return path_utils_1.toWin32Path; } });
|
||||
Object.defineProperty(exports, "toPlatformPath", { enumerable: true, get: function () { return path_utils_1.toPlatformPath; } });
|
||||
//# sourceMappingURL=core.js.map
|
||||
2
node_modules/@actions/core/lib/core.js.map
generated
vendored
2
node_modules/@actions/core/lib/core.js.map
generated
vendored
File diff suppressed because one or more lines are too long
2
node_modules/@actions/core/lib/file-command.d.ts
generated
vendored
Normal file
2
node_modules/@actions/core/lib/file-command.d.ts
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
export declare function issueFileCommand(command: string, message: any): void;
|
||||
export declare function prepareKeyValueMessage(key: string, value: any): string;
|
||||
58
node_modules/@actions/core/lib/file-command.js
generated
vendored
Normal file
58
node_modules/@actions/core/lib/file-command.js
generated
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
"use strict";
|
||||
// For internal use, subject to change.
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
|
||||
// We use any as a valid input type
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
const fs = __importStar(require("fs"));
|
||||
const os = __importStar(require("os"));
|
||||
const uuid_1 = require("uuid");
|
||||
const utils_1 = require("./utils");
|
||||
function issueFileCommand(command, message) {
|
||||
const filePath = process.env[`GITHUB_${command}`];
|
||||
if (!filePath) {
|
||||
throw new Error(`Unable to find environment variable for file command ${command}`);
|
||||
}
|
||||
if (!fs.existsSync(filePath)) {
|
||||
throw new Error(`Missing file at path: ${filePath}`);
|
||||
}
|
||||
fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, {
|
||||
encoding: 'utf8'
|
||||
});
|
||||
}
|
||||
exports.issueFileCommand = issueFileCommand;
|
||||
function prepareKeyValueMessage(key, value) {
|
||||
const delimiter = `ghadelimiter_${uuid_1.v4()}`;
|
||||
const convertedValue = utils_1.toCommandValue(value);
|
||||
// These should realistically never happen, but just in case someone finds a
|
||||
// way to exploit uuid generation let's not allow keys or values that contain
|
||||
// the delimiter.
|
||||
if (key.includes(delimiter)) {
|
||||
throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
|
||||
}
|
||||
if (convertedValue.includes(delimiter)) {
|
||||
throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
|
||||
}
|
||||
return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
|
||||
}
|
||||
exports.prepareKeyValueMessage = prepareKeyValueMessage;
|
||||
//# sourceMappingURL=file-command.js.map
|
||||
1
node_modules/@actions/core/lib/file-command.js.map
generated
vendored
Normal file
1
node_modules/@actions/core/lib/file-command.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"file-command.js","sourceRoot":"","sources":["../src/file-command.ts"],"names":[],"mappings":";AAAA,uCAAuC;;;;;;;;;;;;;;;;;;;;;;AAEvC,mCAAmC;AACnC,uDAAuD;AAEvD,uCAAwB;AACxB,uCAAwB;AACxB,+BAAiC;AACjC,mCAAsC;AAEtC,SAAgB,gBAAgB,CAAC,OAAe,EAAE,OAAY;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAA;IACjD,IAAI,CAAC,QAAQ,EAAE;QACb,MAAM,IAAI,KAAK,CACb,wDAAwD,OAAO,EAAE,CAClE,CAAA;KACF;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;QAC5B,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAA;KACrD;IAED,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,sBAAc,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;QACjE,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAA;AACJ,CAAC;AAdD,4CAcC;AAED,SAAgB,sBAAsB,CAAC,GAAW,EAAE,KAAU;IAC5D,MAAM,SAAS,GAAG,gBAAgB,SAAM,EAAE,EAAE,CAAA;IAC5C,MAAM,cAAc,GAAG,sBAAc,CAAC,KAAK,CAAC,CAAA;IAE5C,4EAA4E;IAC5E,6EAA6E;IAC7E,iBAAiB;IACjB,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;QAC3B,MAAM,IAAI,KAAK,CACb,4DAA4D,SAAS,GAAG,CACzE,CAAA;KACF;IAED,IAAI,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;QACtC,MAAM,IAAI,KAAK,CACb,6DAA6D,SAAS,GAAG,CAC1E,CAAA;KACF;IAED,OAAO,GAAG,GAAG,KAAK,SAAS,GAAG,EAAE,CAAC,GAAG,GAAG,cAAc,GAAG,EAAE,CAAC,GAAG,GAAG,SAAS,EAAE,CAAA;AAC9E,CAAC;AApBD,wDAoBC"}
|
||||
7
node_modules/@actions/core/lib/oidc-utils.d.ts
generated
vendored
Normal file
7
node_modules/@actions/core/lib/oidc-utils.d.ts
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
export declare class OidcClient {
|
||||
private static createHttpClient;
|
||||
private static getRequestToken;
|
||||
private static getIDTokenUrl;
|
||||
private static getCall;
|
||||
static getIDToken(audience?: string): Promise<string>;
|
||||
}
|
||||
77
node_modules/@actions/core/lib/oidc-utils.js
generated
vendored
Normal file
77
node_modules/@actions/core/lib/oidc-utils.js
generated
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.OidcClient = void 0;
|
||||
const http_client_1 = require("@actions/http-client");
|
||||
const auth_1 = require("@actions/http-client/lib/auth");
|
||||
const core_1 = require("./core");
|
||||
class OidcClient {
|
||||
static createHttpClient(allowRetry = true, maxRetry = 10) {
|
||||
const requestOptions = {
|
||||
allowRetries: allowRetry,
|
||||
maxRetries: maxRetry
|
||||
};
|
||||
return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions);
|
||||
}
|
||||
static getRequestToken() {
|
||||
const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN'];
|
||||
if (!token) {
|
||||
throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable');
|
||||
}
|
||||
return token;
|
||||
}
|
||||
static getIDTokenUrl() {
|
||||
const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL'];
|
||||
if (!runtimeUrl) {
|
||||
throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable');
|
||||
}
|
||||
return runtimeUrl;
|
||||
}
|
||||
static getCall(id_token_url) {
|
||||
var _a;
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
const httpclient = OidcClient.createHttpClient();
|
||||
const res = yield httpclient
|
||||
.getJson(id_token_url)
|
||||
.catch(error => {
|
||||
throw new Error(`Failed to get ID Token. \n
|
||||
Error Code : ${error.statusCode}\n
|
||||
Error Message: ${error.result.message}`);
|
||||
});
|
||||
const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value;
|
||||
if (!id_token) {
|
||||
throw new Error('Response json body do not have ID Token field');
|
||||
}
|
||||
return id_token;
|
||||
});
|
||||
}
|
||||
static getIDToken(audience) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
try {
|
||||
// New ID Token is requested from action service
|
||||
let id_token_url = OidcClient.getIDTokenUrl();
|
||||
if (audience) {
|
||||
const encodedAudience = encodeURIComponent(audience);
|
||||
id_token_url = `${id_token_url}&audience=${encodedAudience}`;
|
||||
}
|
||||
core_1.debug(`ID token url is ${id_token_url}`);
|
||||
const id_token = yield OidcClient.getCall(id_token_url);
|
||||
core_1.setSecret(id_token);
|
||||
return id_token;
|
||||
}
|
||||
catch (error) {
|
||||
throw new Error(`Error message: ${error.message}`);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
exports.OidcClient = OidcClient;
|
||||
//# sourceMappingURL=oidc-utils.js.map
|
||||
1
node_modules/@actions/core/lib/oidc-utils.js.map
generated
vendored
Normal file
1
node_modules/@actions/core/lib/oidc-utils.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"oidc-utils.js","sourceRoot":"","sources":["../src/oidc-utils.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,sDAA+C;AAC/C,wDAAqE;AACrE,iCAAuC;AAKvC,MAAa,UAAU;IACb,MAAM,CAAC,gBAAgB,CAC7B,UAAU,GAAG,IAAI,EACjB,QAAQ,GAAG,EAAE;QAEb,MAAM,cAAc,GAAmB;YACrC,YAAY,EAAE,UAAU;YACxB,UAAU,EAAE,QAAQ;SACrB,CAAA;QAED,OAAO,IAAI,wBAAU,CACnB,qBAAqB,EACrB,CAAC,IAAI,8BAAuB,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC,EAC3D,cAAc,CACf,CAAA;IACH,CAAC;IAEO,MAAM,CAAC,eAAe;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;QAC3D,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAA;SACF;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAEO,MAAM,CAAC,aAAa;QAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;QAC9D,IAAI,CAAC,UAAU,EAAE;YACf,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;SAC3E;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IAEO,MAAM,CAAO,OAAO,CAAC,YAAoB;;;YAC/C,MAAM,UAAU,GAAG,UAAU,CAAC,gBAAgB,EAAE,CAAA;YAEhD,MAAM,GAAG,GAAG,MAAM,UAAU;iBACzB,OAAO,CAAgB,YAAY,CAAC;iBACpC,KAAK,CAAC,KAAK,CAAC,EAAE;gBACb,MAAM,IAAI,KAAK,CACb;uBACa,KAAK,CAAC,UAAU;yBACd,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CACtC,CAAA;YACH,CAAC,CAAC,CAAA;YAEJ,MAAM,QAAQ,SAAG,GAAG,CAAC,MAAM,0CAAE,KAAK,CAAA;YAClC,IAAI,CAAC,QAAQ,EAAE;gBACb,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;aACjE;YACD,OAAO,QAAQ,CAAA;;KAChB;IAED,MAAM,CAAO,UAAU,CAAC,QAAiB;;YACvC,IAAI;gBACF,gDAAgD;gBAChD,IAAI,YAAY,GAAW,UAAU,CAAC,aAAa,EAAE,CAAA;gBACrD,IAAI,QAAQ,EAAE;oBACZ,MAAM,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;oBACpD,YAAY,GAAG,GAAG,YAAY,aAAa,eAAe,EAAE,CAAA;iBAC7D;gBAED,YAAK,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAA;gBAExC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;gBACvD,gBAAS,CAAC,QAAQ,CAAC,CAAA;gBACnB,OAAO,QAAQ,CAAA;aAChB;YAAC,OAAO,KAAK,EAAE;gBACd,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;aACnD;QACH,CAAC;KAAA;CACF;AAzED,gCAyEC"}
|
||||
25
node_modules/@actions/core/lib/path-utils.d.ts
generated
vendored
Normal file
25
node_modules/@actions/core/lib/path-utils.d.ts
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* toPosixPath converts the given path to the posix form. On Windows, \\ will be
|
||||
* replaced with /.
|
||||
*
|
||||
* @param pth. Path to transform.
|
||||
* @return string Posix path.
|
||||
*/
|
||||
export declare function toPosixPath(pth: string): string;
|
||||
/**
|
||||
* toWin32Path converts the given path to the win32 form. On Linux, / will be
|
||||
* replaced with \\.
|
||||
*
|
||||
* @param pth. Path to transform.
|
||||
* @return string Win32 path.
|
||||
*/
|
||||
export declare function toWin32Path(pth: string): string;
|
||||
/**
|
||||
* toPlatformPath converts the given path to a platform-specific path. It does
|
||||
* this by replacing instances of / and \ with the platform-specific path
|
||||
* separator.
|
||||
*
|
||||
* @param pth The path to platformize.
|
||||
* @return string The platform-specific path.
|
||||
*/
|
||||
export declare function toPlatformPath(pth: string): string;
|
||||
58
node_modules/@actions/core/lib/path-utils.js
generated
vendored
Normal file
58
node_modules/@actions/core/lib/path-utils.js
generated
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = void 0;
|
||||
const path = __importStar(require("path"));
|
||||
/**
|
||||
* toPosixPath converts the given path to the posix form. On Windows, \\ will be
|
||||
* replaced with /.
|
||||
*
|
||||
* @param pth. Path to transform.
|
||||
* @return string Posix path.
|
||||
*/
|
||||
function toPosixPath(pth) {
|
||||
return pth.replace(/[\\]/g, '/');
|
||||
}
|
||||
exports.toPosixPath = toPosixPath;
|
||||
/**
|
||||
* toWin32Path converts the given path to the win32 form. On Linux, / will be
|
||||
* replaced with \\.
|
||||
*
|
||||
* @param pth. Path to transform.
|
||||
* @return string Win32 path.
|
||||
*/
|
||||
function toWin32Path(pth) {
|
||||
return pth.replace(/[/]/g, '\\');
|
||||
}
|
||||
exports.toWin32Path = toWin32Path;
|
||||
/**
|
||||
* toPlatformPath converts the given path to a platform-specific path. It does
|
||||
* this by replacing instances of / and \ with the platform-specific path
|
||||
* separator.
|
||||
*
|
||||
* @param pth The path to platformize.
|
||||
* @return string The platform-specific path.
|
||||
*/
|
||||
function toPlatformPath(pth) {
|
||||
return pth.replace(/[/\\]/g, path.sep);
|
||||
}
|
||||
exports.toPlatformPath = toPlatformPath;
|
||||
//# sourceMappingURL=path-utils.js.map
|
||||
1
node_modules/@actions/core/lib/path-utils.js.map
generated
vendored
Normal file
1
node_modules/@actions/core/lib/path-utils.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../src/path-utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA4B;AAE5B;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;AAClC,CAAC;AAFD,kCAEC;AAED;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AAClC,CAAC;AAFD,kCAEC;AAED;;;;;;;GAOG;AACH,SAAgB,cAAc,CAAC,GAAW;IACxC,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;AACxC,CAAC;AAFD,wCAEC"}
|
||||
202
node_modules/@actions/core/lib/summary.d.ts
generated
vendored
Normal file
202
node_modules/@actions/core/lib/summary.d.ts
generated
vendored
Normal file
@@ -0,0 +1,202 @@
|
||||
export declare const SUMMARY_ENV_VAR = "GITHUB_STEP_SUMMARY";
|
||||
export declare const SUMMARY_DOCS_URL = "https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary";
|
||||
export declare type SummaryTableRow = (SummaryTableCell | string)[];
|
||||
export interface SummaryTableCell {
|
||||
/**
|
||||
* Cell content
|
||||
*/
|
||||
data: string;
|
||||
/**
|
||||
* Render cell as header
|
||||
* (optional) default: false
|
||||
*/
|
||||
header?: boolean;
|
||||
/**
|
||||
* Number of columns the cell extends
|
||||
* (optional) default: '1'
|
||||
*/
|
||||
colspan?: string;
|
||||
/**
|
||||
* Number of rows the cell extends
|
||||
* (optional) default: '1'
|
||||
*/
|
||||
rowspan?: string;
|
||||
}
|
||||
export interface SummaryImageOptions {
|
||||
/**
|
||||
* The width of the image in pixels. Must be an integer without a unit.
|
||||
* (optional)
|
||||
*/
|
||||
width?: string;
|
||||
/**
|
||||
* The height of the image in pixels. Must be an integer without a unit.
|
||||
* (optional)
|
||||
*/
|
||||
height?: string;
|
||||
}
|
||||
export interface SummaryWriteOptions {
|
||||
/**
|
||||
* Replace all existing content in summary file with buffer contents
|
||||
* (optional) default: false
|
||||
*/
|
||||
overwrite?: boolean;
|
||||
}
|
||||
declare class Summary {
|
||||
private _buffer;
|
||||
private _filePath?;
|
||||
constructor();
|
||||
/**
|
||||
* Finds the summary file path from the environment, rejects if env var is not found or file does not exist
|
||||
* Also checks r/w permissions.
|
||||
*
|
||||
* @returns step summary file path
|
||||
*/
|
||||
private filePath;
|
||||
/**
|
||||
* Wraps content in an HTML tag, adding any HTML attributes
|
||||
*
|
||||
* @param {string} tag HTML tag to wrap
|
||||
* @param {string | null} content content within the tag
|
||||
* @param {[attribute: string]: string} attrs key-value list of HTML attributes to add
|
||||
*
|
||||
* @returns {string} content wrapped in HTML element
|
||||
*/
|
||||
private wrap;
|
||||
/**
|
||||
* Writes text in the buffer to the summary buffer file and empties buffer. Will append by default.
|
||||
*
|
||||
* @param {SummaryWriteOptions} [options] (optional) options for write operation
|
||||
*
|
||||
* @returns {Promise<Summary>} summary instance
|
||||
*/
|
||||
write(options?: SummaryWriteOptions): Promise<Summary>;
|
||||
/**
|
||||
* Clears the summary buffer and wipes the summary file
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
clear(): Promise<Summary>;
|
||||
/**
|
||||
* Returns the current summary buffer as a string
|
||||
*
|
||||
* @returns {string} string of summary buffer
|
||||
*/
|
||||
stringify(): string;
|
||||
/**
|
||||
* If the summary buffer is empty
|
||||
*
|
||||
* @returns {boolen} true if the buffer is empty
|
||||
*/
|
||||
isEmptyBuffer(): boolean;
|
||||
/**
|
||||
* Resets the summary buffer without writing to summary file
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
emptyBuffer(): Summary;
|
||||
/**
|
||||
* Adds raw text to the summary buffer
|
||||
*
|
||||
* @param {string} text content to add
|
||||
* @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false)
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addRaw(text: string, addEOL?: boolean): Summary;
|
||||
/**
|
||||
* Adds the operating system-specific end-of-line marker to the buffer
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addEOL(): Summary;
|
||||
/**
|
||||
* Adds an HTML codeblock to the summary buffer
|
||||
*
|
||||
* @param {string} code content to render within fenced code block
|
||||
* @param {string} lang (optional) language to syntax highlight code
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addCodeBlock(code: string, lang?: string): Summary;
|
||||
/**
|
||||
* Adds an HTML list to the summary buffer
|
||||
*
|
||||
* @param {string[]} items list of items to render
|
||||
* @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false)
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addList(items: string[], ordered?: boolean): Summary;
|
||||
/**
|
||||
* Adds an HTML table to the summary buffer
|
||||
*
|
||||
* @param {SummaryTableCell[]} rows table rows
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addTable(rows: SummaryTableRow[]): Summary;
|
||||
/**
|
||||
* Adds a collapsable HTML details element to the summary buffer
|
||||
*
|
||||
* @param {string} label text for the closed state
|
||||
* @param {string} content collapsable content
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addDetails(label: string, content: string): Summary;
|
||||
/**
|
||||
* Adds an HTML image tag to the summary buffer
|
||||
*
|
||||
* @param {string} src path to the image you to embed
|
||||
* @param {string} alt text description of the image
|
||||
* @param {SummaryImageOptions} options (optional) addition image attributes
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addImage(src: string, alt: string, options?: SummaryImageOptions): Summary;
|
||||
/**
|
||||
* Adds an HTML section heading element
|
||||
*
|
||||
* @param {string} text heading text
|
||||
* @param {number | string} [level=1] (optional) the heading level, default: 1
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addHeading(text: string, level?: number | string): Summary;
|
||||
/**
|
||||
* Adds an HTML thematic break (<hr>) to the summary buffer
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addSeparator(): Summary;
|
||||
/**
|
||||
* Adds an HTML line break (<br>) to the summary buffer
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addBreak(): Summary;
|
||||
/**
|
||||
* Adds an HTML blockquote to the summary buffer
|
||||
*
|
||||
* @param {string} text quote text
|
||||
* @param {string} cite (optional) citation url
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addQuote(text: string, cite?: string): Summary;
|
||||
/**
|
||||
* Adds an HTML anchor tag to the summary buffer
|
||||
*
|
||||
* @param {string} text link text/content
|
||||
* @param {string} href hyperlink
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addLink(text: string, href: string): Summary;
|
||||
}
|
||||
/**
|
||||
* @deprecated use `core.summary`
|
||||
*/
|
||||
export declare const markdownSummary: Summary;
|
||||
export declare const summary: Summary;
|
||||
export {};
|
||||
283
node_modules/@actions/core/lib/summary.js
generated
vendored
Normal file
283
node_modules/@actions/core/lib/summary.js
generated
vendored
Normal file
@@ -0,0 +1,283 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0;
|
||||
const os_1 = require("os");
|
||||
const fs_1 = require("fs");
|
||||
const { access, appendFile, writeFile } = fs_1.promises;
|
||||
exports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY';
|
||||
exports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary';
|
||||
class Summary {
|
||||
constructor() {
|
||||
this._buffer = '';
|
||||
}
|
||||
/**
|
||||
* Finds the summary file path from the environment, rejects if env var is not found or file does not exist
|
||||
* Also checks r/w permissions.
|
||||
*
|
||||
* @returns step summary file path
|
||||
*/
|
||||
filePath() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
if (this._filePath) {
|
||||
return this._filePath;
|
||||
}
|
||||
const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR];
|
||||
if (!pathFromEnv) {
|
||||
throw new Error(`Unable to find environment variable for $${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`);
|
||||
}
|
||||
try {
|
||||
yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK);
|
||||
}
|
||||
catch (_a) {
|
||||
throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`);
|
||||
}
|
||||
this._filePath = pathFromEnv;
|
||||
return this._filePath;
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Wraps content in an HTML tag, adding any HTML attributes
|
||||
*
|
||||
* @param {string} tag HTML tag to wrap
|
||||
* @param {string | null} content content within the tag
|
||||
* @param {[attribute: string]: string} attrs key-value list of HTML attributes to add
|
||||
*
|
||||
* @returns {string} content wrapped in HTML element
|
||||
*/
|
||||
wrap(tag, content, attrs = {}) {
|
||||
const htmlAttrs = Object.entries(attrs)
|
||||
.map(([key, value]) => ` ${key}="${value}"`)
|
||||
.join('');
|
||||
if (!content) {
|
||||
return `<${tag}${htmlAttrs}>`;
|
||||
}
|
||||
return `<${tag}${htmlAttrs}>${content}</${tag}>`;
|
||||
}
|
||||
/**
|
||||
* Writes text in the buffer to the summary buffer file and empties buffer. Will append by default.
|
||||
*
|
||||
* @param {SummaryWriteOptions} [options] (optional) options for write operation
|
||||
*
|
||||
* @returns {Promise<Summary>} summary instance
|
||||
*/
|
||||
write(options) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite);
|
||||
const filePath = yield this.filePath();
|
||||
const writeFunc = overwrite ? writeFile : appendFile;
|
||||
yield writeFunc(filePath, this._buffer, { encoding: 'utf8' });
|
||||
return this.emptyBuffer();
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Clears the summary buffer and wipes the summary file
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
clear() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return this.emptyBuffer().write({ overwrite: true });
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Returns the current summary buffer as a string
|
||||
*
|
||||
* @returns {string} string of summary buffer
|
||||
*/
|
||||
stringify() {
|
||||
return this._buffer;
|
||||
}
|
||||
/**
|
||||
* If the summary buffer is empty
|
||||
*
|
||||
* @returns {boolen} true if the buffer is empty
|
||||
*/
|
||||
isEmptyBuffer() {
|
||||
return this._buffer.length === 0;
|
||||
}
|
||||
/**
|
||||
* Resets the summary buffer without writing to summary file
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
emptyBuffer() {
|
||||
this._buffer = '';
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Adds raw text to the summary buffer
|
||||
*
|
||||
* @param {string} text content to add
|
||||
* @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false)
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addRaw(text, addEOL = false) {
|
||||
this._buffer += text;
|
||||
return addEOL ? this.addEOL() : this;
|
||||
}
|
||||
/**
|
||||
* Adds the operating system-specific end-of-line marker to the buffer
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addEOL() {
|
||||
return this.addRaw(os_1.EOL);
|
||||
}
|
||||
/**
|
||||
* Adds an HTML codeblock to the summary buffer
|
||||
*
|
||||
* @param {string} code content to render within fenced code block
|
||||
* @param {string} lang (optional) language to syntax highlight code
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addCodeBlock(code, lang) {
|
||||
const attrs = Object.assign({}, (lang && { lang }));
|
||||
const element = this.wrap('pre', this.wrap('code', code), attrs);
|
||||
return this.addRaw(element).addEOL();
|
||||
}
|
||||
/**
|
||||
* Adds an HTML list to the summary buffer
|
||||
*
|
||||
* @param {string[]} items list of items to render
|
||||
* @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false)
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addList(items, ordered = false) {
|
||||
const tag = ordered ? 'ol' : 'ul';
|
||||
const listItems = items.map(item => this.wrap('li', item)).join('');
|
||||
const element = this.wrap(tag, listItems);
|
||||
return this.addRaw(element).addEOL();
|
||||
}
|
||||
/**
|
||||
* Adds an HTML table to the summary buffer
|
||||
*
|
||||
* @param {SummaryTableCell[]} rows table rows
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addTable(rows) {
|
||||
const tableBody = rows
|
||||
.map(row => {
|
||||
const cells = row
|
||||
.map(cell => {
|
||||
if (typeof cell === 'string') {
|
||||
return this.wrap('td', cell);
|
||||
}
|
||||
const { header, data, colspan, rowspan } = cell;
|
||||
const tag = header ? 'th' : 'td';
|
||||
const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan }));
|
||||
return this.wrap(tag, data, attrs);
|
||||
})
|
||||
.join('');
|
||||
return this.wrap('tr', cells);
|
||||
})
|
||||
.join('');
|
||||
const element = this.wrap('table', tableBody);
|
||||
return this.addRaw(element).addEOL();
|
||||
}
|
||||
/**
|
||||
* Adds a collapsable HTML details element to the summary buffer
|
||||
*
|
||||
* @param {string} label text for the closed state
|
||||
* @param {string} content collapsable content
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addDetails(label, content) {
|
||||
const element = this.wrap('details', this.wrap('summary', label) + content);
|
||||
return this.addRaw(element).addEOL();
|
||||
}
|
||||
/**
|
||||
* Adds an HTML image tag to the summary buffer
|
||||
*
|
||||
* @param {string} src path to the image you to embed
|
||||
* @param {string} alt text description of the image
|
||||
* @param {SummaryImageOptions} options (optional) addition image attributes
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addImage(src, alt, options) {
|
||||
const { width, height } = options || {};
|
||||
const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height }));
|
||||
const element = this.wrap('img', null, Object.assign({ src, alt }, attrs));
|
||||
return this.addRaw(element).addEOL();
|
||||
}
|
||||
/**
|
||||
* Adds an HTML section heading element
|
||||
*
|
||||
* @param {string} text heading text
|
||||
* @param {number | string} [level=1] (optional) the heading level, default: 1
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addHeading(text, level) {
|
||||
const tag = `h${level}`;
|
||||
const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag)
|
||||
? tag
|
||||
: 'h1';
|
||||
const element = this.wrap(allowedTag, text);
|
||||
return this.addRaw(element).addEOL();
|
||||
}
|
||||
/**
|
||||
* Adds an HTML thematic break (<hr>) to the summary buffer
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addSeparator() {
|
||||
const element = this.wrap('hr', null);
|
||||
return this.addRaw(element).addEOL();
|
||||
}
|
||||
/**
|
||||
* Adds an HTML line break (<br>) to the summary buffer
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addBreak() {
|
||||
const element = this.wrap('br', null);
|
||||
return this.addRaw(element).addEOL();
|
||||
}
|
||||
/**
|
||||
* Adds an HTML blockquote to the summary buffer
|
||||
*
|
||||
* @param {string} text quote text
|
||||
* @param {string} cite (optional) citation url
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addQuote(text, cite) {
|
||||
const attrs = Object.assign({}, (cite && { cite }));
|
||||
const element = this.wrap('blockquote', text, attrs);
|
||||
return this.addRaw(element).addEOL();
|
||||
}
|
||||
/**
|
||||
* Adds an HTML anchor tag to the summary buffer
|
||||
*
|
||||
* @param {string} text link text/content
|
||||
* @param {string} href hyperlink
|
||||
*
|
||||
* @returns {Summary} summary instance
|
||||
*/
|
||||
addLink(text, href) {
|
||||
const element = this.wrap('a', text, { href });
|
||||
return this.addRaw(element).addEOL();
|
||||
}
|
||||
}
|
||||
const _summary = new Summary();
|
||||
/**
|
||||
* @deprecated use `core.summary`
|
||||
*/
|
||||
exports.markdownSummary = _summary;
|
||||
exports.summary = _summary;
|
||||
//# sourceMappingURL=summary.js.map
|
||||
1
node_modules/@actions/core/lib/summary.js.map
generated
vendored
Normal file
1
node_modules/@actions/core/lib/summary.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
14
node_modules/@actions/core/lib/utils.d.ts
generated
vendored
Normal file
14
node_modules/@actions/core/lib/utils.d.ts
generated
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
import { AnnotationProperties } from './core';
|
||||
import { CommandProperties } from './command';
|
||||
/**
|
||||
* Sanitizes an input into a string so it can be passed into issueCommand safely
|
||||
* @param input input to sanitize into a string
|
||||
*/
|
||||
export declare function toCommandValue(input: any): string;
|
||||
/**
|
||||
*
|
||||
* @param annotationProperties
|
||||
* @returns The command properties to send with the actual annotation command
|
||||
* See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646
|
||||
*/
|
||||
export declare function toCommandProperties(annotationProperties: AnnotationProperties): CommandProperties;
|
||||
40
node_modules/@actions/core/lib/utils.js
generated
vendored
Normal file
40
node_modules/@actions/core/lib/utils.js
generated
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
"use strict";
|
||||
// We use any as a valid input type
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.toCommandProperties = exports.toCommandValue = void 0;
|
||||
/**
|
||||
* Sanitizes an input into a string so it can be passed into issueCommand safely
|
||||
* @param input input to sanitize into a string
|
||||
*/
|
||||
function toCommandValue(input) {
|
||||
if (input === null || input === undefined) {
|
||||
return '';
|
||||
}
|
||||
else if (typeof input === 'string' || input instanceof String) {
|
||||
return input;
|
||||
}
|
||||
return JSON.stringify(input);
|
||||
}
|
||||
exports.toCommandValue = toCommandValue;
|
||||
/**
|
||||
*
|
||||
* @param annotationProperties
|
||||
* @returns The command properties to send with the actual annotation command
|
||||
* See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646
|
||||
*/
|
||||
function toCommandProperties(annotationProperties) {
|
||||
if (!Object.keys(annotationProperties).length) {
|
||||
return {};
|
||||
}
|
||||
return {
|
||||
title: annotationProperties.title,
|
||||
file: annotationProperties.file,
|
||||
line: annotationProperties.startLine,
|
||||
endLine: annotationProperties.endLine,
|
||||
col: annotationProperties.startColumn,
|
||||
endColumn: annotationProperties.endColumn
|
||||
};
|
||||
}
|
||||
exports.toCommandProperties = toCommandProperties;
|
||||
//# sourceMappingURL=utils.js.map
|
||||
1
node_modules/@actions/core/lib/utils.js.map
generated
vendored
Normal file
1
node_modules/@actions/core/lib/utils.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";AAAA,mCAAmC;AACnC,uDAAuD;;;AAKvD;;;GAGG;AACH,SAAgB,cAAc,CAAC,KAAU;IACvC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;QACzC,OAAO,EAAE,CAAA;KACV;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,YAAY,MAAM,EAAE;QAC/D,OAAO,KAAe,CAAA;KACvB;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;AAC9B,CAAC;AAPD,wCAOC;AAED;;;;;GAKG;AACH,SAAgB,mBAAmB,CACjC,oBAA0C;IAE1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,MAAM,EAAE;QAC7C,OAAO,EAAE,CAAA;KACV;IAED,OAAO;QACL,KAAK,EAAE,oBAAoB,CAAC,KAAK;QACjC,IAAI,EAAE,oBAAoB,CAAC,IAAI;QAC/B,IAAI,EAAE,oBAAoB,CAAC,SAAS;QACpC,OAAO,EAAE,oBAAoB,CAAC,OAAO;QACrC,GAAG,EAAE,oBAAoB,CAAC,WAAW;QACrC,SAAS,EAAE,oBAAoB,CAAC,SAAS;KAC1C,CAAA;AACH,CAAC;AAfD,kDAeC"}
|
||||
69
node_modules/@actions/core/package.json
generated
vendored
69
node_modules/@actions/core/package.json
generated
vendored
@@ -1,54 +1,24 @@
|
||||
{
|
||||
"_from": "@actions/core@^1.2.4",
|
||||
"_id": "@actions/core@1.2.4",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-YJCEq8BE3CdN8+7HPZ/4DxJjk/OkZV2FFIf+DlZTC/4iBlzYCD5yjRR6eiOS5llO11zbRltIRuKAjMKaWTE6cg==",
|
||||
"_location": "/@actions/core",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "@actions/core@^1.2.4",
|
||||
"name": "@actions/core",
|
||||
"escapedName": "@actions%2fcore",
|
||||
"scope": "@actions",
|
||||
"rawSpec": "^1.2.4",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^1.2.4"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"#USER",
|
||||
"/"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.4.tgz",
|
||||
"_shasum": "96179dbf9f8d951dd74b40a0dbd5c22555d186ab",
|
||||
"_spec": "@actions/core@^1.2.4",
|
||||
"_where": "/home/simon/Projects/dynamic-badges-action",
|
||||
"bugs": {
|
||||
"url": "https://github.com/actions/toolkit/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"deprecated": false,
|
||||
"name": "@actions/core",
|
||||
"version": "1.10.0",
|
||||
"description": "Actions core lib",
|
||||
"devDependencies": {
|
||||
"@types/node": "^12.0.2"
|
||||
},
|
||||
"directories": {
|
||||
"lib": "lib",
|
||||
"test": "__tests__"
|
||||
},
|
||||
"files": [
|
||||
"lib"
|
||||
],
|
||||
"homepage": "https://github.com/actions/toolkit/tree/master/packages/core",
|
||||
"keywords": [
|
||||
"github",
|
||||
"actions",
|
||||
"core"
|
||||
],
|
||||
"homepage": "https://github.com/actions/toolkit/tree/main/packages/core",
|
||||
"license": "MIT",
|
||||
"main": "lib/core.js",
|
||||
"name": "@actions/core",
|
||||
"types": "lib/core.d.ts",
|
||||
"directories": {
|
||||
"lib": "lib",
|
||||
"test": "__tests__"
|
||||
},
|
||||
"files": [
|
||||
"lib",
|
||||
"!.DS_Store"
|
||||
],
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
@@ -58,10 +28,19 @@
|
||||
"directory": "packages/core"
|
||||
},
|
||||
"scripts": {
|
||||
"audit-moderate": "npm install && npm audit --audit-level=moderate",
|
||||
"audit-moderate": "npm install && npm audit --json --audit-level=moderate > audit.json",
|
||||
"test": "echo \"Error: run tests from root\" && exit 1",
|
||||
"tsc": "tsc"
|
||||
},
|
||||
"types": "lib/core.d.ts",
|
||||
"version": "1.2.4"
|
||||
"bugs": {
|
||||
"url": "https://github.com/actions/toolkit/issues"
|
||||
},
|
||||
"dependencies": {
|
||||
"@actions/http-client": "^2.0.1",
|
||||
"uuid": "^8.3.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^12.0.2",
|
||||
"@types/uuid": "^8.3.4"
|
||||
}
|
||||
}
|
||||
|
||||
21
node_modules/@actions/http-client/LICENSE
generated
vendored
Normal file
21
node_modules/@actions/http-client/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
Actions Http Client for Node.js
|
||||
|
||||
Copyright (c) GitHub, Inc.
|
||||
|
||||
All rights reserved.
|
||||
|
||||
MIT License
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
||||
associated documentation files (the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
73
node_modules/@actions/http-client/README.md
generated
vendored
Normal file
73
node_modules/@actions/http-client/README.md
generated
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
# `@actions/http-client`
|
||||
|
||||
A lightweight HTTP client optimized for building actions.
|
||||
|
||||
## Features
|
||||
|
||||
- HTTP client with TypeScript generics and async/await/Promises
|
||||
- Typings included!
|
||||
- [Proxy support](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/about-self-hosted-runners#using-a-proxy-server-with-self-hosted-runners) just works with actions and the runner
|
||||
- Targets ES2019 (runner runs actions with node 12+). Only supported on node 12+.
|
||||
- Basic, Bearer and PAT Support out of the box. Extensible handlers for others.
|
||||
- Redirects supported
|
||||
|
||||
Features and releases [here](./RELEASES.md)
|
||||
|
||||
## Install
|
||||
|
||||
```
|
||||
npm install @actions/http-client --save
|
||||
```
|
||||
|
||||
## Samples
|
||||
|
||||
See the [tests](./__tests__) for detailed examples.
|
||||
|
||||
## Errors
|
||||
|
||||
### HTTP
|
||||
|
||||
The HTTP client does not throw unless truly exceptional.
|
||||
|
||||
* A request that successfully executes resulting in a 404, 500 etc... will return a response object with a status code and a body.
|
||||
* Redirects (3xx) will be followed by default.
|
||||
|
||||
See the [tests](./__tests__) for detailed examples.
|
||||
|
||||
## Debugging
|
||||
|
||||
To enable detailed console logging of all HTTP requests and responses, set the NODE_DEBUG environment varible:
|
||||
|
||||
```shell
|
||||
export NODE_DEBUG=http
|
||||
```
|
||||
|
||||
## Node support
|
||||
|
||||
The http-client is built using the latest LTS version of Node 12. It may work on previous node LTS versions but it's tested and officially supported on Node12+.
|
||||
|
||||
## Support and Versioning
|
||||
|
||||
We follow semver and will hold compatibility between major versions and increment the minor version with new features and capabilities (while holding compat).
|
||||
|
||||
## Contributing
|
||||
|
||||
We welcome PRs. Please create an issue and if applicable, a design before proceeding with code.
|
||||
|
||||
once:
|
||||
|
||||
```
|
||||
npm install
|
||||
```
|
||||
|
||||
To build:
|
||||
|
||||
```
|
||||
npm run build
|
||||
```
|
||||
|
||||
To run all tests:
|
||||
|
||||
```
|
||||
npm test
|
||||
```
|
||||
26
node_modules/@actions/http-client/lib/auth.d.ts
generated
vendored
Normal file
26
node_modules/@actions/http-client/lib/auth.d.ts
generated
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
/// <reference types="node" />
|
||||
import * as http from 'http';
|
||||
import * as ifm from './interfaces';
|
||||
import { HttpClientResponse } from './index';
|
||||
export declare class BasicCredentialHandler implements ifm.RequestHandler {
|
||||
username: string;
|
||||
password: string;
|
||||
constructor(username: string, password: string);
|
||||
prepareRequest(options: http.RequestOptions): void;
|
||||
canHandleAuthentication(): boolean;
|
||||
handleAuthentication(): Promise<HttpClientResponse>;
|
||||
}
|
||||
export declare class BearerCredentialHandler implements ifm.RequestHandler {
|
||||
token: string;
|
||||
constructor(token: string);
|
||||
prepareRequest(options: http.RequestOptions): void;
|
||||
canHandleAuthentication(): boolean;
|
||||
handleAuthentication(): Promise<HttpClientResponse>;
|
||||
}
|
||||
export declare class PersonalAccessTokenCredentialHandler implements ifm.RequestHandler {
|
||||
token: string;
|
||||
constructor(token: string);
|
||||
prepareRequest(options: http.RequestOptions): void;
|
||||
canHandleAuthentication(): boolean;
|
||||
handleAuthentication(): Promise<HttpClientResponse>;
|
||||
}
|
||||
81
node_modules/@actions/http-client/lib/auth.js
generated
vendored
Normal file
81
node_modules/@actions/http-client/lib/auth.js
generated
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0;
|
||||
class BasicCredentialHandler {
|
||||
constructor(username, password) {
|
||||
this.username = username;
|
||||
this.password = password;
|
||||
}
|
||||
prepareRequest(options) {
|
||||
if (!options.headers) {
|
||||
throw Error('The request has no headers');
|
||||
}
|
||||
options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`;
|
||||
}
|
||||
// This handler cannot handle 401
|
||||
canHandleAuthentication() {
|
||||
return false;
|
||||
}
|
||||
handleAuthentication() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
throw new Error('not implemented');
|
||||
});
|
||||
}
|
||||
}
|
||||
exports.BasicCredentialHandler = BasicCredentialHandler;
|
||||
class BearerCredentialHandler {
|
||||
constructor(token) {
|
||||
this.token = token;
|
||||
}
|
||||
// currently implements pre-authorization
|
||||
// TODO: support preAuth = false where it hooks on 401
|
||||
prepareRequest(options) {
|
||||
if (!options.headers) {
|
||||
throw Error('The request has no headers');
|
||||
}
|
||||
options.headers['Authorization'] = `Bearer ${this.token}`;
|
||||
}
|
||||
// This handler cannot handle 401
|
||||
canHandleAuthentication() {
|
||||
return false;
|
||||
}
|
||||
handleAuthentication() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
throw new Error('not implemented');
|
||||
});
|
||||
}
|
||||
}
|
||||
exports.BearerCredentialHandler = BearerCredentialHandler;
|
||||
class PersonalAccessTokenCredentialHandler {
|
||||
constructor(token) {
|
||||
this.token = token;
|
||||
}
|
||||
// currently implements pre-authorization
|
||||
// TODO: support preAuth = false where it hooks on 401
|
||||
prepareRequest(options) {
|
||||
if (!options.headers) {
|
||||
throw Error('The request has no headers');
|
||||
}
|
||||
options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`;
|
||||
}
|
||||
// This handler cannot handle 401
|
||||
canHandleAuthentication() {
|
||||
return false;
|
||||
}
|
||||
handleAuthentication() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
throw new Error('not implemented');
|
||||
});
|
||||
}
|
||||
}
|
||||
exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler;
|
||||
//# sourceMappingURL=auth.js.map
|
||||
1
node_modules/@actions/http-client/lib/auth.js.map
generated
vendored
Normal file
1
node_modules/@actions/http-client/lib/auth.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":";;;;;;;;;;;;AAIA,MAAa,sBAAsB;IAIjC,YAAY,QAAgB,EAAE,QAAgB;QAC5C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAED,cAAc,CAAC,OAA4B;QACzC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACpB,MAAM,KAAK,CAAC,4BAA4B,CAAC,CAAA;SAC1C;QACD,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,MAAM,CAAC,IAAI,CACrD,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CACpC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAA;IACxB,CAAC;IAED,iCAAiC;IACjC,uBAAuB;QACrB,OAAO,KAAK,CAAA;IACd,CAAC;IAEK,oBAAoB;;YACxB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;QACpC,CAAC;KAAA;CACF;AA1BD,wDA0BC;AAED,MAAa,uBAAuB;IAGlC,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAED,yCAAyC;IACzC,sDAAsD;IACtD,cAAc,CAAC,OAA4B;QACzC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACpB,MAAM,KAAK,CAAC,4BAA4B,CAAC,CAAA;SAC1C;QACD,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,KAAK,EAAE,CAAA;IAC3D,CAAC;IAED,iCAAiC;IACjC,uBAAuB;QACrB,OAAO,KAAK,CAAA;IACd,CAAC;IAEK,oBAAoB;;YACxB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;QACpC,CAAC;KAAA;CACF;AAxBD,0DAwBC;AAED,MAAa,oCAAoC;IAI/C,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAED,yCAAyC;IACzC,sDAAsD;IACtD,cAAc,CAAC,OAA4B;QACzC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACpB,MAAM,KAAK,CAAC,4BAA4B,CAAC,CAAA;SAC1C;QACD,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,MAAM,CAAC,IAAI,CACrD,OAAO,IAAI,CAAC,KAAK,EAAE,CACpB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAA;IACxB,CAAC;IAED,iCAAiC;IACjC,uBAAuB;QACrB,OAAO,KAAK,CAAA;IACd,CAAC;IAEK,oBAAoB;;YACxB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;QACpC,CAAC;KAAA;CACF;AA3BD,oFA2BC"}
|
||||
123
node_modules/@actions/http-client/lib/index.d.ts
generated
vendored
Normal file
123
node_modules/@actions/http-client/lib/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,123 @@
|
||||
/// <reference types="node" />
|
||||
import * as http from 'http';
|
||||
import * as ifm from './interfaces';
|
||||
export declare enum HttpCodes {
|
||||
OK = 200,
|
||||
MultipleChoices = 300,
|
||||
MovedPermanently = 301,
|
||||
ResourceMoved = 302,
|
||||
SeeOther = 303,
|
||||
NotModified = 304,
|
||||
UseProxy = 305,
|
||||
SwitchProxy = 306,
|
||||
TemporaryRedirect = 307,
|
||||
PermanentRedirect = 308,
|
||||
BadRequest = 400,
|
||||
Unauthorized = 401,
|
||||
PaymentRequired = 402,
|
||||
Forbidden = 403,
|
||||
NotFound = 404,
|
||||
MethodNotAllowed = 405,
|
||||
NotAcceptable = 406,
|
||||
ProxyAuthenticationRequired = 407,
|
||||
RequestTimeout = 408,
|
||||
Conflict = 409,
|
||||
Gone = 410,
|
||||
TooManyRequests = 429,
|
||||
InternalServerError = 500,
|
||||
NotImplemented = 501,
|
||||
BadGateway = 502,
|
||||
ServiceUnavailable = 503,
|
||||
GatewayTimeout = 504
|
||||
}
|
||||
export declare enum Headers {
|
||||
Accept = "accept",
|
||||
ContentType = "content-type"
|
||||
}
|
||||
export declare enum MediaTypes {
|
||||
ApplicationJson = "application/json"
|
||||
}
|
||||
/**
|
||||
* Returns the proxy URL, depending upon the supplied url and proxy environment variables.
|
||||
* @param serverUrl The server URL where the request will be sent. For example, https://api.github.com
|
||||
*/
|
||||
export declare function getProxyUrl(serverUrl: string): string;
|
||||
export declare class HttpClientError extends Error {
|
||||
constructor(message: string, statusCode: number);
|
||||
statusCode: number;
|
||||
result?: any;
|
||||
}
|
||||
export declare class HttpClientResponse {
|
||||
constructor(message: http.IncomingMessage);
|
||||
message: http.IncomingMessage;
|
||||
readBody(): Promise<string>;
|
||||
}
|
||||
export declare function isHttps(requestUrl: string): boolean;
|
||||
export declare class HttpClient {
|
||||
userAgent: string | undefined;
|
||||
handlers: ifm.RequestHandler[];
|
||||
requestOptions: ifm.RequestOptions | undefined;
|
||||
private _ignoreSslError;
|
||||
private _socketTimeout;
|
||||
private _allowRedirects;
|
||||
private _allowRedirectDowngrade;
|
||||
private _maxRedirects;
|
||||
private _allowRetries;
|
||||
private _maxRetries;
|
||||
private _agent;
|
||||
private _proxyAgent;
|
||||
private _keepAlive;
|
||||
private _disposed;
|
||||
constructor(userAgent?: string, handlers?: ifm.RequestHandler[], requestOptions?: ifm.RequestOptions);
|
||||
options(requestUrl: string, additionalHeaders?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
get(requestUrl: string, additionalHeaders?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
del(requestUrl: string, additionalHeaders?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
post(requestUrl: string, data: string, additionalHeaders?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
patch(requestUrl: string, data: string, additionalHeaders?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
put(requestUrl: string, data: string, additionalHeaders?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
head(requestUrl: string, additionalHeaders?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
sendStream(verb: string, requestUrl: string, stream: NodeJS.ReadableStream, additionalHeaders?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
/**
|
||||
* Gets a typed object from an endpoint
|
||||
* Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise
|
||||
*/
|
||||
getJson<T>(requestUrl: string, additionalHeaders?: http.OutgoingHttpHeaders): Promise<ifm.TypedResponse<T>>;
|
||||
postJson<T>(requestUrl: string, obj: any, additionalHeaders?: http.OutgoingHttpHeaders): Promise<ifm.TypedResponse<T>>;
|
||||
putJson<T>(requestUrl: string, obj: any, additionalHeaders?: http.OutgoingHttpHeaders): Promise<ifm.TypedResponse<T>>;
|
||||
patchJson<T>(requestUrl: string, obj: any, additionalHeaders?: http.OutgoingHttpHeaders): Promise<ifm.TypedResponse<T>>;
|
||||
/**
|
||||
* Makes a raw http request.
|
||||
* All other methods such as get, post, patch, and request ultimately call this.
|
||||
* Prefer get, del, post and patch
|
||||
*/
|
||||
request(verb: string, requestUrl: string, data: string | NodeJS.ReadableStream | null, headers?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
/**
|
||||
* Needs to be called if keepAlive is set to true in request options.
|
||||
*/
|
||||
dispose(): void;
|
||||
/**
|
||||
* Raw request.
|
||||
* @param info
|
||||
* @param data
|
||||
*/
|
||||
requestRaw(info: ifm.RequestInfo, data: string | NodeJS.ReadableStream | null): Promise<HttpClientResponse>;
|
||||
/**
|
||||
* Raw request with callback.
|
||||
* @param info
|
||||
* @param data
|
||||
* @param onResult
|
||||
*/
|
||||
requestRawWithCallback(info: ifm.RequestInfo, data: string | NodeJS.ReadableStream | null, onResult: (err?: Error, res?: HttpClientResponse) => void): void;
|
||||
/**
|
||||
* Gets an http agent. This function is useful when you need an http agent that handles
|
||||
* routing through a proxy server - depending upon the url and proxy environment variables.
|
||||
* @param serverUrl The server URL where the request will be sent. For example, https://api.github.com
|
||||
*/
|
||||
getAgent(serverUrl: string): http.Agent;
|
||||
private _prepareRequest;
|
||||
private _mergeHeaders;
|
||||
private _getExistingOrDefaultHeader;
|
||||
private _getAgent;
|
||||
private _performExponentialBackoff;
|
||||
private _processResponse;
|
||||
}
|
||||
605
node_modules/@actions/http-client/lib/index.js
generated
vendored
Normal file
605
node_modules/@actions/http-client/lib/index.js
generated
vendored
Normal file
@@ -0,0 +1,605 @@
|
||||
"use strict";
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0;
|
||||
const http = __importStar(require("http"));
|
||||
const https = __importStar(require("https"));
|
||||
const pm = __importStar(require("./proxy"));
|
||||
const tunnel = __importStar(require("tunnel"));
|
||||
var HttpCodes;
|
||||
(function (HttpCodes) {
|
||||
HttpCodes[HttpCodes["OK"] = 200] = "OK";
|
||||
HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices";
|
||||
HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently";
|
||||
HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved";
|
||||
HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther";
|
||||
HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified";
|
||||
HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy";
|
||||
HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy";
|
||||
HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect";
|
||||
HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect";
|
||||
HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest";
|
||||
HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized";
|
||||
HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired";
|
||||
HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden";
|
||||
HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound";
|
||||
HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed";
|
||||
HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable";
|
||||
HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired";
|
||||
HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout";
|
||||
HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict";
|
||||
HttpCodes[HttpCodes["Gone"] = 410] = "Gone";
|
||||
HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests";
|
||||
HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError";
|
||||
HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented";
|
||||
HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway";
|
||||
HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable";
|
||||
HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout";
|
||||
})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {}));
|
||||
var Headers;
|
||||
(function (Headers) {
|
||||
Headers["Accept"] = "accept";
|
||||
Headers["ContentType"] = "content-type";
|
||||
})(Headers = exports.Headers || (exports.Headers = {}));
|
||||
var MediaTypes;
|
||||
(function (MediaTypes) {
|
||||
MediaTypes["ApplicationJson"] = "application/json";
|
||||
})(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {}));
|
||||
/**
|
||||
* Returns the proxy URL, depending upon the supplied url and proxy environment variables.
|
||||
* @param serverUrl The server URL where the request will be sent. For example, https://api.github.com
|
||||
*/
|
||||
function getProxyUrl(serverUrl) {
|
||||
const proxyUrl = pm.getProxyUrl(new URL(serverUrl));
|
||||
return proxyUrl ? proxyUrl.href : '';
|
||||
}
|
||||
exports.getProxyUrl = getProxyUrl;
|
||||
const HttpRedirectCodes = [
|
||||
HttpCodes.MovedPermanently,
|
||||
HttpCodes.ResourceMoved,
|
||||
HttpCodes.SeeOther,
|
||||
HttpCodes.TemporaryRedirect,
|
||||
HttpCodes.PermanentRedirect
|
||||
];
|
||||
const HttpResponseRetryCodes = [
|
||||
HttpCodes.BadGateway,
|
||||
HttpCodes.ServiceUnavailable,
|
||||
HttpCodes.GatewayTimeout
|
||||
];
|
||||
const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD'];
|
||||
const ExponentialBackoffCeiling = 10;
|
||||
const ExponentialBackoffTimeSlice = 5;
|
||||
class HttpClientError extends Error {
|
||||
constructor(message, statusCode) {
|
||||
super(message);
|
||||
this.name = 'HttpClientError';
|
||||
this.statusCode = statusCode;
|
||||
Object.setPrototypeOf(this, HttpClientError.prototype);
|
||||
}
|
||||
}
|
||||
exports.HttpClientError = HttpClientError;
|
||||
class HttpClientResponse {
|
||||
constructor(message) {
|
||||
this.message = message;
|
||||
}
|
||||
readBody() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
|
||||
let output = Buffer.alloc(0);
|
||||
this.message.on('data', (chunk) => {
|
||||
output = Buffer.concat([output, chunk]);
|
||||
});
|
||||
this.message.on('end', () => {
|
||||
resolve(output.toString());
|
||||
});
|
||||
}));
|
||||
});
|
||||
}
|
||||
}
|
||||
exports.HttpClientResponse = HttpClientResponse;
|
||||
function isHttps(requestUrl) {
|
||||
const parsedUrl = new URL(requestUrl);
|
||||
return parsedUrl.protocol === 'https:';
|
||||
}
|
||||
exports.isHttps = isHttps;
|
||||
class HttpClient {
|
||||
constructor(userAgent, handlers, requestOptions) {
|
||||
this._ignoreSslError = false;
|
||||
this._allowRedirects = true;
|
||||
this._allowRedirectDowngrade = false;
|
||||
this._maxRedirects = 50;
|
||||
this._allowRetries = false;
|
||||
this._maxRetries = 1;
|
||||
this._keepAlive = false;
|
||||
this._disposed = false;
|
||||
this.userAgent = userAgent;
|
||||
this.handlers = handlers || [];
|
||||
this.requestOptions = requestOptions;
|
||||
if (requestOptions) {
|
||||
if (requestOptions.ignoreSslError != null) {
|
||||
this._ignoreSslError = requestOptions.ignoreSslError;
|
||||
}
|
||||
this._socketTimeout = requestOptions.socketTimeout;
|
||||
if (requestOptions.allowRedirects != null) {
|
||||
this._allowRedirects = requestOptions.allowRedirects;
|
||||
}
|
||||
if (requestOptions.allowRedirectDowngrade != null) {
|
||||
this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade;
|
||||
}
|
||||
if (requestOptions.maxRedirects != null) {
|
||||
this._maxRedirects = Math.max(requestOptions.maxRedirects, 0);
|
||||
}
|
||||
if (requestOptions.keepAlive != null) {
|
||||
this._keepAlive = requestOptions.keepAlive;
|
||||
}
|
||||
if (requestOptions.allowRetries != null) {
|
||||
this._allowRetries = requestOptions.allowRetries;
|
||||
}
|
||||
if (requestOptions.maxRetries != null) {
|
||||
this._maxRetries = requestOptions.maxRetries;
|
||||
}
|
||||
}
|
||||
}
|
||||
options(requestUrl, additionalHeaders) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return this.request('OPTIONS', requestUrl, null, additionalHeaders || {});
|
||||
});
|
||||
}
|
||||
get(requestUrl, additionalHeaders) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return this.request('GET', requestUrl, null, additionalHeaders || {});
|
||||
});
|
||||
}
|
||||
del(requestUrl, additionalHeaders) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return this.request('DELETE', requestUrl, null, additionalHeaders || {});
|
||||
});
|
||||
}
|
||||
post(requestUrl, data, additionalHeaders) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return this.request('POST', requestUrl, data, additionalHeaders || {});
|
||||
});
|
||||
}
|
||||
patch(requestUrl, data, additionalHeaders) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return this.request('PATCH', requestUrl, data, additionalHeaders || {});
|
||||
});
|
||||
}
|
||||
put(requestUrl, data, additionalHeaders) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return this.request('PUT', requestUrl, data, additionalHeaders || {});
|
||||
});
|
||||
}
|
||||
head(requestUrl, additionalHeaders) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return this.request('HEAD', requestUrl, null, additionalHeaders || {});
|
||||
});
|
||||
}
|
||||
sendStream(verb, requestUrl, stream, additionalHeaders) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return this.request(verb, requestUrl, stream, additionalHeaders);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Gets a typed object from an endpoint
|
||||
* Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise
|
||||
*/
|
||||
getJson(requestUrl, additionalHeaders = {}) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
|
||||
const res = yield this.get(requestUrl, additionalHeaders);
|
||||
return this._processResponse(res, this.requestOptions);
|
||||
});
|
||||
}
|
||||
postJson(requestUrl, obj, additionalHeaders = {}) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
const data = JSON.stringify(obj, null, 2);
|
||||
additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
|
||||
additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);
|
||||
const res = yield this.post(requestUrl, data, additionalHeaders);
|
||||
return this._processResponse(res, this.requestOptions);
|
||||
});
|
||||
}
|
||||
putJson(requestUrl, obj, additionalHeaders = {}) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
const data = JSON.stringify(obj, null, 2);
|
||||
additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
|
||||
additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);
|
||||
const res = yield this.put(requestUrl, data, additionalHeaders);
|
||||
return this._processResponse(res, this.requestOptions);
|
||||
});
|
||||
}
|
||||
patchJson(requestUrl, obj, additionalHeaders = {}) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
const data = JSON.stringify(obj, null, 2);
|
||||
additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
|
||||
additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);
|
||||
const res = yield this.patch(requestUrl, data, additionalHeaders);
|
||||
return this._processResponse(res, this.requestOptions);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Makes a raw http request.
|
||||
* All other methods such as get, post, patch, and request ultimately call this.
|
||||
* Prefer get, del, post and patch
|
||||
*/
|
||||
request(verb, requestUrl, data, headers) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
if (this._disposed) {
|
||||
throw new Error('Client has already been disposed.');
|
||||
}
|
||||
const parsedUrl = new URL(requestUrl);
|
||||
let info = this._prepareRequest(verb, parsedUrl, headers);
|
||||
// Only perform retries on reads since writes may not be idempotent.
|
||||
const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb)
|
||||
? this._maxRetries + 1
|
||||
: 1;
|
||||
let numTries = 0;
|
||||
let response;
|
||||
do {
|
||||
response = yield this.requestRaw(info, data);
|
||||
// Check if it's an authentication challenge
|
||||
if (response &&
|
||||
response.message &&
|
||||
response.message.statusCode === HttpCodes.Unauthorized) {
|
||||
let authenticationHandler;
|
||||
for (const handler of this.handlers) {
|
||||
if (handler.canHandleAuthentication(response)) {
|
||||
authenticationHandler = handler;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (authenticationHandler) {
|
||||
return authenticationHandler.handleAuthentication(this, info, data);
|
||||
}
|
||||
else {
|
||||
// We have received an unauthorized response but have no handlers to handle it.
|
||||
// Let the response return to the caller.
|
||||
return response;
|
||||
}
|
||||
}
|
||||
let redirectsRemaining = this._maxRedirects;
|
||||
while (response.message.statusCode &&
|
||||
HttpRedirectCodes.includes(response.message.statusCode) &&
|
||||
this._allowRedirects &&
|
||||
redirectsRemaining > 0) {
|
||||
const redirectUrl = response.message.headers['location'];
|
||||
if (!redirectUrl) {
|
||||
// if there's no location to redirect to, we won't
|
||||
break;
|
||||
}
|
||||
const parsedRedirectUrl = new URL(redirectUrl);
|
||||
if (parsedUrl.protocol === 'https:' &&
|
||||
parsedUrl.protocol !== parsedRedirectUrl.protocol &&
|
||||
!this._allowRedirectDowngrade) {
|
||||
throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.');
|
||||
}
|
||||
// we need to finish reading the response before reassigning response
|
||||
// which will leak the open socket.
|
||||
yield response.readBody();
|
||||
// strip authorization header if redirected to a different hostname
|
||||
if (parsedRedirectUrl.hostname !== parsedUrl.hostname) {
|
||||
for (const header in headers) {
|
||||
// header names are case insensitive
|
||||
if (header.toLowerCase() === 'authorization') {
|
||||
delete headers[header];
|
||||
}
|
||||
}
|
||||
}
|
||||
// let's make the request with the new redirectUrl
|
||||
info = this._prepareRequest(verb, parsedRedirectUrl, headers);
|
||||
response = yield this.requestRaw(info, data);
|
||||
redirectsRemaining--;
|
||||
}
|
||||
if (!response.message.statusCode ||
|
||||
!HttpResponseRetryCodes.includes(response.message.statusCode)) {
|
||||
// If not a retry code, return immediately instead of retrying
|
||||
return response;
|
||||
}
|
||||
numTries += 1;
|
||||
if (numTries < maxTries) {
|
||||
yield response.readBody();
|
||||
yield this._performExponentialBackoff(numTries);
|
||||
}
|
||||
} while (numTries < maxTries);
|
||||
return response;
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Needs to be called if keepAlive is set to true in request options.
|
||||
*/
|
||||
dispose() {
|
||||
if (this._agent) {
|
||||
this._agent.destroy();
|
||||
}
|
||||
this._disposed = true;
|
||||
}
|
||||
/**
|
||||
* Raw request.
|
||||
* @param info
|
||||
* @param data
|
||||
*/
|
||||
requestRaw(info, data) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return new Promise((resolve, reject) => {
|
||||
function callbackForResult(err, res) {
|
||||
if (err) {
|
||||
reject(err);
|
||||
}
|
||||
else if (!res) {
|
||||
// If `err` is not passed, then `res` must be passed.
|
||||
reject(new Error('Unknown error'));
|
||||
}
|
||||
else {
|
||||
resolve(res);
|
||||
}
|
||||
}
|
||||
this.requestRawWithCallback(info, data, callbackForResult);
|
||||
});
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Raw request with callback.
|
||||
* @param info
|
||||
* @param data
|
||||
* @param onResult
|
||||
*/
|
||||
requestRawWithCallback(info, data, onResult) {
|
||||
if (typeof data === 'string') {
|
||||
if (!info.options.headers) {
|
||||
info.options.headers = {};
|
||||
}
|
||||
info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8');
|
||||
}
|
||||
let callbackCalled = false;
|
||||
function handleResult(err, res) {
|
||||
if (!callbackCalled) {
|
||||
callbackCalled = true;
|
||||
onResult(err, res);
|
||||
}
|
||||
}
|
||||
const req = info.httpModule.request(info.options, (msg) => {
|
||||
const res = new HttpClientResponse(msg);
|
||||
handleResult(undefined, res);
|
||||
});
|
||||
let socket;
|
||||
req.on('socket', sock => {
|
||||
socket = sock;
|
||||
});
|
||||
// If we ever get disconnected, we want the socket to timeout eventually
|
||||
req.setTimeout(this._socketTimeout || 3 * 60000, () => {
|
||||
if (socket) {
|
||||
socket.end();
|
||||
}
|
||||
handleResult(new Error(`Request timeout: ${info.options.path}`));
|
||||
});
|
||||
req.on('error', function (err) {
|
||||
// err has statusCode property
|
||||
// res should have headers
|
||||
handleResult(err);
|
||||
});
|
||||
if (data && typeof data === 'string') {
|
||||
req.write(data, 'utf8');
|
||||
}
|
||||
if (data && typeof data !== 'string') {
|
||||
data.on('close', function () {
|
||||
req.end();
|
||||
});
|
||||
data.pipe(req);
|
||||
}
|
||||
else {
|
||||
req.end();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Gets an http agent. This function is useful when you need an http agent that handles
|
||||
* routing through a proxy server - depending upon the url and proxy environment variables.
|
||||
* @param serverUrl The server URL where the request will be sent. For example, https://api.github.com
|
||||
*/
|
||||
getAgent(serverUrl) {
|
||||
const parsedUrl = new URL(serverUrl);
|
||||
return this._getAgent(parsedUrl);
|
||||
}
|
||||
_prepareRequest(method, requestUrl, headers) {
|
||||
const info = {};
|
||||
info.parsedUrl = requestUrl;
|
||||
const usingSsl = info.parsedUrl.protocol === 'https:';
|
||||
info.httpModule = usingSsl ? https : http;
|
||||
const defaultPort = usingSsl ? 443 : 80;
|
||||
info.options = {};
|
||||
info.options.host = info.parsedUrl.hostname;
|
||||
info.options.port = info.parsedUrl.port
|
||||
? parseInt(info.parsedUrl.port)
|
||||
: defaultPort;
|
||||
info.options.path =
|
||||
(info.parsedUrl.pathname || '') + (info.parsedUrl.search || '');
|
||||
info.options.method = method;
|
||||
info.options.headers = this._mergeHeaders(headers);
|
||||
if (this.userAgent != null) {
|
||||
info.options.headers['user-agent'] = this.userAgent;
|
||||
}
|
||||
info.options.agent = this._getAgent(info.parsedUrl);
|
||||
// gives handlers an opportunity to participate
|
||||
if (this.handlers) {
|
||||
for (const handler of this.handlers) {
|
||||
handler.prepareRequest(info.options);
|
||||
}
|
||||
}
|
||||
return info;
|
||||
}
|
||||
_mergeHeaders(headers) {
|
||||
if (this.requestOptions && this.requestOptions.headers) {
|
||||
return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {}));
|
||||
}
|
||||
return lowercaseKeys(headers || {});
|
||||
}
|
||||
_getExistingOrDefaultHeader(additionalHeaders, header, _default) {
|
||||
let clientHeader;
|
||||
if (this.requestOptions && this.requestOptions.headers) {
|
||||
clientHeader = lowercaseKeys(this.requestOptions.headers)[header];
|
||||
}
|
||||
return additionalHeaders[header] || clientHeader || _default;
|
||||
}
|
||||
_getAgent(parsedUrl) {
|
||||
let agent;
|
||||
const proxyUrl = pm.getProxyUrl(parsedUrl);
|
||||
const useProxy = proxyUrl && proxyUrl.hostname;
|
||||
if (this._keepAlive && useProxy) {
|
||||
agent = this._proxyAgent;
|
||||
}
|
||||
if (this._keepAlive && !useProxy) {
|
||||
agent = this._agent;
|
||||
}
|
||||
// if agent is already assigned use that agent.
|
||||
if (agent) {
|
||||
return agent;
|
||||
}
|
||||
const usingSsl = parsedUrl.protocol === 'https:';
|
||||
let maxSockets = 100;
|
||||
if (this.requestOptions) {
|
||||
maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets;
|
||||
}
|
||||
// This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis.
|
||||
if (proxyUrl && proxyUrl.hostname) {
|
||||
const agentOptions = {
|
||||
maxSockets,
|
||||
keepAlive: this._keepAlive,
|
||||
proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && {
|
||||
proxyAuth: `${proxyUrl.username}:${proxyUrl.password}`
|
||||
})), { host: proxyUrl.hostname, port: proxyUrl.port })
|
||||
};
|
||||
let tunnelAgent;
|
||||
const overHttps = proxyUrl.protocol === 'https:';
|
||||
if (usingSsl) {
|
||||
tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp;
|
||||
}
|
||||
else {
|
||||
tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp;
|
||||
}
|
||||
agent = tunnelAgent(agentOptions);
|
||||
this._proxyAgent = agent;
|
||||
}
|
||||
// if reusing agent across request and tunneling agent isn't assigned create a new agent
|
||||
if (this._keepAlive && !agent) {
|
||||
const options = { keepAlive: this._keepAlive, maxSockets };
|
||||
agent = usingSsl ? new https.Agent(options) : new http.Agent(options);
|
||||
this._agent = agent;
|
||||
}
|
||||
// if not using private agent and tunnel agent isn't setup then use global agent
|
||||
if (!agent) {
|
||||
agent = usingSsl ? https.globalAgent : http.globalAgent;
|
||||
}
|
||||
if (usingSsl && this._ignoreSslError) {
|
||||
// we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
|
||||
// http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options
|
||||
// we have to cast it to any and change it directly
|
||||
agent.options = Object.assign(agent.options || {}, {
|
||||
rejectUnauthorized: false
|
||||
});
|
||||
}
|
||||
return agent;
|
||||
}
|
||||
_performExponentialBackoff(retryNumber) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber);
|
||||
const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber);
|
||||
return new Promise(resolve => setTimeout(() => resolve(), ms));
|
||||
});
|
||||
}
|
||||
_processResponse(res, options) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
||||
const statusCode = res.message.statusCode || 0;
|
||||
const response = {
|
||||
statusCode,
|
||||
result: null,
|
||||
headers: {}
|
||||
};
|
||||
// not found leads to null obj returned
|
||||
if (statusCode === HttpCodes.NotFound) {
|
||||
resolve(response);
|
||||
}
|
||||
// get the result from the body
|
||||
function dateTimeDeserializer(key, value) {
|
||||
if (typeof value === 'string') {
|
||||
const a = new Date(value);
|
||||
if (!isNaN(a.valueOf())) {
|
||||
return a;
|
||||
}
|
||||
}
|
||||
return value;
|
||||
}
|
||||
let obj;
|
||||
let contents;
|
||||
try {
|
||||
contents = yield res.readBody();
|
||||
if (contents && contents.length > 0) {
|
||||
if (options && options.deserializeDates) {
|
||||
obj = JSON.parse(contents, dateTimeDeserializer);
|
||||
}
|
||||
else {
|
||||
obj = JSON.parse(contents);
|
||||
}
|
||||
response.result = obj;
|
||||
}
|
||||
response.headers = res.message.headers;
|
||||
}
|
||||
catch (err) {
|
||||
// Invalid resource (contents not json); leaving result obj null
|
||||
}
|
||||
// note that 3xx redirects are handled by the http layer.
|
||||
if (statusCode > 299) {
|
||||
let msg;
|
||||
// if exception/error in body, attempt to get better error
|
||||
if (obj && obj.message) {
|
||||
msg = obj.message;
|
||||
}
|
||||
else if (contents && contents.length > 0) {
|
||||
// it may be the case that the exception is in the body message as string
|
||||
msg = contents;
|
||||
}
|
||||
else {
|
||||
msg = `Failed request: (${statusCode})`;
|
||||
}
|
||||
const err = new HttpClientError(msg, statusCode);
|
||||
err.result = response.result;
|
||||
reject(err);
|
||||
}
|
||||
else {
|
||||
resolve(response);
|
||||
}
|
||||
}));
|
||||
});
|
||||
}
|
||||
}
|
||||
exports.HttpClient = HttpClient;
|
||||
const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
node_modules/@actions/http-client/lib/index.js.map
generated
vendored
Normal file
1
node_modules/@actions/http-client/lib/index.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
44
node_modules/@actions/http-client/lib/interfaces.d.ts
generated
vendored
Normal file
44
node_modules/@actions/http-client/lib/interfaces.d.ts
generated
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
/// <reference types="node" />
|
||||
import * as http from 'http';
|
||||
import * as https from 'https';
|
||||
import { HttpClientResponse } from './index';
|
||||
export interface HttpClient {
|
||||
options(requestUrl: string, additionalHeaders?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
get(requestUrl: string, additionalHeaders?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
del(requestUrl: string, additionalHeaders?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
post(requestUrl: string, data: string, additionalHeaders?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
patch(requestUrl: string, data: string, additionalHeaders?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
put(requestUrl: string, data: string, additionalHeaders?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
sendStream(verb: string, requestUrl: string, stream: NodeJS.ReadableStream, additionalHeaders?: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
request(verb: string, requestUrl: string, data: string | NodeJS.ReadableStream, headers: http.OutgoingHttpHeaders): Promise<HttpClientResponse>;
|
||||
requestRaw(info: RequestInfo, data: string | NodeJS.ReadableStream): Promise<HttpClientResponse>;
|
||||
requestRawWithCallback(info: RequestInfo, data: string | NodeJS.ReadableStream, onResult: (err?: Error, res?: HttpClientResponse) => void): void;
|
||||
}
|
||||
export interface RequestHandler {
|
||||
prepareRequest(options: http.RequestOptions): void;
|
||||
canHandleAuthentication(response: HttpClientResponse): boolean;
|
||||
handleAuthentication(httpClient: HttpClient, requestInfo: RequestInfo, data: string | NodeJS.ReadableStream | null): Promise<HttpClientResponse>;
|
||||
}
|
||||
export interface RequestInfo {
|
||||
options: http.RequestOptions;
|
||||
parsedUrl: URL;
|
||||
httpModule: typeof http | typeof https;
|
||||
}
|
||||
export interface RequestOptions {
|
||||
headers?: http.OutgoingHttpHeaders;
|
||||
socketTimeout?: number;
|
||||
ignoreSslError?: boolean;
|
||||
allowRedirects?: boolean;
|
||||
allowRedirectDowngrade?: boolean;
|
||||
maxRedirects?: number;
|
||||
maxSockets?: number;
|
||||
keepAlive?: boolean;
|
||||
deserializeDates?: boolean;
|
||||
allowRetries?: boolean;
|
||||
maxRetries?: number;
|
||||
}
|
||||
export interface TypedResponse<T> {
|
||||
statusCode: number;
|
||||
result: T | null;
|
||||
headers: http.IncomingHttpHeaders;
|
||||
}
|
||||
3
node_modules/@actions/http-client/lib/interfaces.js
generated
vendored
Normal file
3
node_modules/@actions/http-client/lib/interfaces.js
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=interfaces.js.map
|
||||
1
node_modules/@actions/http-client/lib/interfaces.js.map
generated
vendored
Normal file
1
node_modules/@actions/http-client/lib/interfaces.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":""}
|
||||
2
node_modules/@actions/http-client/lib/proxy.d.ts
generated
vendored
Normal file
2
node_modules/@actions/http-client/lib/proxy.d.ts
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
export declare function getProxyUrl(reqUrl: URL): URL | undefined;
|
||||
export declare function checkBypass(reqUrl: URL): boolean;
|
||||
61
node_modules/@actions/http-client/lib/proxy.js
generated
vendored
Normal file
61
node_modules/@actions/http-client/lib/proxy.js
generated
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.checkBypass = exports.getProxyUrl = void 0;
|
||||
function getProxyUrl(reqUrl) {
|
||||
const usingSsl = reqUrl.protocol === 'https:';
|
||||
if (checkBypass(reqUrl)) {
|
||||
return undefined;
|
||||
}
|
||||
const proxyVar = (() => {
|
||||
if (usingSsl) {
|
||||
return process.env['https_proxy'] || process.env['HTTPS_PROXY'];
|
||||
}
|
||||
else {
|
||||
return process.env['http_proxy'] || process.env['HTTP_PROXY'];
|
||||
}
|
||||
})();
|
||||
if (proxyVar) {
|
||||
return new URL(proxyVar);
|
||||
}
|
||||
else {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
exports.getProxyUrl = getProxyUrl;
|
||||
function checkBypass(reqUrl) {
|
||||
if (!reqUrl.hostname) {
|
||||
return false;
|
||||
}
|
||||
const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || '';
|
||||
if (!noProxy) {
|
||||
return false;
|
||||
}
|
||||
// Determine the request port
|
||||
let reqPort;
|
||||
if (reqUrl.port) {
|
||||
reqPort = Number(reqUrl.port);
|
||||
}
|
||||
else if (reqUrl.protocol === 'http:') {
|
||||
reqPort = 80;
|
||||
}
|
||||
else if (reqUrl.protocol === 'https:') {
|
||||
reqPort = 443;
|
||||
}
|
||||
// Format the request hostname and hostname with port
|
||||
const upperReqHosts = [reqUrl.hostname.toUpperCase()];
|
||||
if (typeof reqPort === 'number') {
|
||||
upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`);
|
||||
}
|
||||
// Compare request host against noproxy
|
||||
for (const upperNoProxyItem of noProxy
|
||||
.split(',')
|
||||
.map(x => x.trim().toUpperCase())
|
||||
.filter(x => x)) {
|
||||
if (upperReqHosts.some(x => x === upperNoProxyItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
exports.checkBypass = checkBypass;
|
||||
//# sourceMappingURL=proxy.js.map
|
||||
1
node_modules/@actions/http-client/lib/proxy.js.map
generated
vendored
Normal file
1
node_modules/@actions/http-client/lib/proxy.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":";;;AAAA,SAAgB,WAAW,CAAC,MAAW;IACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAA;IAE7C,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE;QACvB,OAAO,SAAS,CAAA;KACjB;IAED,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE;QACrB,IAAI,QAAQ,EAAE;YACZ,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;SAChE;aAAM;YACL,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;SAC9D;IACH,CAAC,CAAC,EAAE,CAAA;IAEJ,IAAI,QAAQ,EAAE;QACZ,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAA;KACzB;SAAM;QACL,OAAO,SAAS,CAAA;KACjB;AACH,CAAC;AApBD,kCAoBC;AAED,SAAgB,WAAW,CAAC,MAAW;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;QACpB,OAAO,KAAK,CAAA;KACb;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAA;IACxE,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,KAAK,CAAA;KACb;IAED,6BAA6B;IAC7B,IAAI,OAA2B,CAAA;IAC/B,IAAI,MAAM,CAAC,IAAI,EAAE;QACf,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;KAC9B;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE;QACtC,OAAO,GAAG,EAAE,CAAA;KACb;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE;QACvC,OAAO,GAAG,GAAG,CAAA;KACd;IAED,qDAAqD;IACrD,MAAM,aAAa,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;IACrD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAC/B,aAAa,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAA;KACrD;IAED,uCAAuC;IACvC,KAAK,MAAM,gBAAgB,IAAI,OAAO;SACnC,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SAChC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QACjB,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,gBAAgB,CAAC,EAAE;YACnD,OAAO,IAAI,CAAA;SACZ;KACF;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AArCD,kCAqCC"}
|
||||
48
node_modules/@actions/http-client/package.json
generated
vendored
Normal file
48
node_modules/@actions/http-client/package.json
generated
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"name": "@actions/http-client",
|
||||
"version": "2.0.1",
|
||||
"description": "Actions Http Client",
|
||||
"keywords": [
|
||||
"github",
|
||||
"actions",
|
||||
"http"
|
||||
],
|
||||
"homepage": "https://github.com/actions/toolkit/tree/main/packages/http-client",
|
||||
"license": "MIT",
|
||||
"main": "lib/index.js",
|
||||
"types": "lib/index.d.ts",
|
||||
"directories": {
|
||||
"lib": "lib",
|
||||
"test": "__tests__"
|
||||
},
|
||||
"files": [
|
||||
"lib",
|
||||
"!.DS_Store"
|
||||
],
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/actions/toolkit.git",
|
||||
"directory": "packages/http-client"
|
||||
},
|
||||
"scripts": {
|
||||
"audit-moderate": "npm install && npm audit --json --audit-level=moderate > audit.json",
|
||||
"test": "echo \"Error: run tests from root\" && exit 1",
|
||||
"build": "tsc",
|
||||
"format": "prettier --write **/*.ts",
|
||||
"format-check": "prettier --check **/*.ts",
|
||||
"tsc": "tsc"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/actions/toolkit/issues"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/tunnel": "0.0.3",
|
||||
"proxy": "^1.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"tunnel": "^0.0.6"
|
||||
}
|
||||
}
|
||||
43
node_modules/anafanafo/CHANGELOG.md
generated
vendored
Normal file
43
node_modules/anafanafo/CHANGELOG.md
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
# Changelog
|
||||
|
||||
## 2.0.0 – Oct 15, 2020
|
||||
|
||||
Same as 2.0.0-beta.1.
|
||||
|
||||
### BREAKING CHANGES
|
||||
|
||||
- Support the font variants used by Shields:
|
||||
- 10px Verdana
|
||||
- bold 10px Verdana
|
||||
- 11px Verdana
|
||||
- bold 11px Helvetica
|
||||
|
||||
## 2.0.0-beta.1 – Oct 11, 2020
|
||||
|
||||
### BREAKING CHANGES
|
||||
|
||||
- Support the font variants used by Shields:
|
||||
- 10px Verdana
|
||||
- bold 10px Verdana
|
||||
- 11px Verdana
|
||||
- bold 11px Helvetica
|
||||
|
||||
## 2.0.0-beta.0 – Oct 11, 2020
|
||||
|
||||
### BREAKING CHANGES
|
||||
|
||||
- Support 10px and 11px Verdana, in normal and bold.
|
||||
|
||||
## 1.0.0 – Apr 12, 2018
|
||||
|
||||
- Update dependencies.
|
||||
- Stable API.
|
||||
|
||||
## 0.1.1 – Nov 15, 2018
|
||||
|
||||
- Require the JSON file (instead of `loadSync`-ing it) to play well with
|
||||
module bundlers.
|
||||
|
||||
## 0.1.0 – Nov 13, 2018
|
||||
|
||||
Initial release.
|
||||
21
node_modules/anafanafo/LICENSE
generated
vendored
Normal file
21
node_modules/anafanafo/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018 Metabolize LLC
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
40
node_modules/anafanafo/README.md
generated
vendored
Normal file
40
node_modules/anafanafo/README.md
generated
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
# anafanafo
|
||||
|
||||
[][npm]
|
||||
[][npm]
|
||||
[][build]
|
||||
[][bundlephobia]
|
||||
[][prettier]
|
||||
[][lerna]
|
||||
|
||||
[npm]: https://npmjs.com/anafanafo
|
||||
[build]: https://circleci.com/gh/metabolize/anafanafo/tree/main
|
||||
[bundlephobia]: https://bundlephobia.com/result?p=anafanafo
|
||||
[prettier]: https://prettier.io/
|
||||
[lerna]: https://lernajs.io/
|
||||
|
||||
Efficiently compute text width in Verdana and Helvetica using
|
||||
[char-width-table-consumer][] and lookup tables.
|
||||
|
||||
Built with [Shields][] in mind.
|
||||
|
||||
(And because Verdana always makes me think of [this][the name game].)
|
||||
|
||||
[char-width-table-consumer]: https://www.npmjs.com/package/char-width-table-consumer
|
||||
[shields]: https://github.com/badges/shields/
|
||||
[the name game]: https://www.youtube.com/watch?v=5MJLi5_dyn0
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
const anafanafo = require('anafanafo')
|
||||
|
||||
// Supports '11px Verdana', '10px Verdana', 'bold 10px Verdana', and 'bold 11px Helvetica'.
|
||||
const width = anafanafo('Shirley Shirley', { font: '11px Verdana' })
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
All rights to Verdana are owned by Microsoft Corp.
|
||||
|
||||
The remainder of this project is licensed under the MIT license.
|
||||
1
node_modules/anafanafo/data/helvetica-11px-bold.json
generated
vendored
Normal file
1
node_modules/anafanafo/data/helvetica-11px-bold.json
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
1
node_modules/anafanafo/data/verdana-10px-bold.json
generated
vendored
Normal file
1
node_modules/anafanafo/data/verdana-10px-bold.json
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
1
node_modules/anafanafo/data/verdana-10px-normal.json
generated
vendored
Normal file
1
node_modules/anafanafo/data/verdana-10px-normal.json
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
1
node_modules/anafanafo/data/verdana-11px-normal.json
generated
vendored
Normal file
1
node_modules/anafanafo/data/verdana-11px-normal.json
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
22
node_modules/anafanafo/index.js
generated
vendored
Normal file
22
node_modules/anafanafo/index.js
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
'use strict'
|
||||
|
||||
const { createConsumer } = require('char-width-table-consumer')
|
||||
|
||||
const consumers = {
|
||||
'10px Verdana': createConsumer(require('./data/verdana-10px-normal.json')),
|
||||
'bold 10px Verdana': createConsumer(require('./data/verdana-10px-bold.json')),
|
||||
'11px Verdana': createConsumer(require('./data/verdana-11px-normal.json')),
|
||||
'bold 11px Helvetica': createConsumer(
|
||||
require('./data/helvetica-11px-bold.json')
|
||||
),
|
||||
}
|
||||
|
||||
module.exports = function measure(text, { font, ...rest }) {
|
||||
const consumer = consumers[font]
|
||||
if (!consumer) {
|
||||
throw Error(
|
||||
`Unknown font "${font}", expected ${Object.keys(consumers).join(', ')}`
|
||||
)
|
||||
}
|
||||
return consumer.widthOf(text, { ...rest })
|
||||
}
|
||||
18
node_modules/anafanafo/package.json
generated
vendored
Normal file
18
node_modules/anafanafo/package.json
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "anafanafo",
|
||||
"version": "2.0.0",
|
||||
"repository": "metabolize/anafanafo",
|
||||
"description": "Compute text width in Verdana",
|
||||
"scripts": {
|
||||
"test": "../../node_modules/.bin/mocha test.js"
|
||||
},
|
||||
"author": "Metabolize",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"char-width-table-consumer": "^1.0.0"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"data/*.json"
|
||||
]
|
||||
}
|
||||
277
node_modules/badge-maker/CHANGELOG.md
generated
vendored
Normal file
277
node_modules/badge-maker/CHANGELOG.md
generated
vendored
Normal file
@@ -0,0 +1,277 @@
|
||||
# Changelog
|
||||
|
||||
## 3.3.1
|
||||
|
||||
- Improve font measuring in for-the-badge and social styles
|
||||
- Make for-the-badge letter spacing more predictable
|
||||
|
||||
## 3.3.0
|
||||
|
||||
- Readability improvements: a dark font color is automatically used when the badge's background is too light. For example: 
|
||||
- Better CSS color compliance: thanks to a switch from _is-css-color_ to _[css-color-converter](https://www.npmjs.com/package/css-color-converter)_, you can use a wider range of color formats from the latest CSS specification, for example `rgb(0 255 0)`
|
||||
- Less dependencies: _badge-maker_ no longer depends on _camelcase_
|
||||
|
||||
## 3.2.0
|
||||
|
||||
- Accessibility improvements: Help users of assistive technologies to read the badges when used inline
|
||||
|
||||
## 3.1.0
|
||||
|
||||
- Add TypeScript definitions
|
||||
|
||||
## 3.0.1
|
||||
|
||||
- Fix missing dependency
|
||||
|
||||
## 3.0.0
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Dropped support for node < 10
|
||||
- Package name has changed to `badge-maker` and moved to https://www.npmjs.com/package/badge-maker
|
||||
- `BadgeFactory` class is removed and replaced by `makeBadge()` function.
|
||||
- Deprecated parameters have been removed. In version 2.2.0 the `colorA`, `colorB` and `colorscheme` params were deprecated. In version 3.0.0 these have been removed.
|
||||
- Only SVG output format is now provided. JSON format has been dropped and the `format` key has been removed.
|
||||
- The `text` array has been replaced by `label` and `message` keys.
|
||||
- The `template` key has been renamed `style`.
|
||||
To upgrade from v2.1.1, change your code from:
|
||||
```js
|
||||
const { BadgeFactory } = require('gh-badges')
|
||||
const bf = new BadgeFactory()
|
||||
const svg = bf.create({
|
||||
text: ['build', 'passed'],
|
||||
format: 'svg',
|
||||
template: 'flat-square',
|
||||
})
|
||||
```
|
||||
to:
|
||||
```js
|
||||
const { makeBadge } = require('badge-maker')
|
||||
const svg = makeBadge({
|
||||
label: 'build',
|
||||
message: 'passed',
|
||||
style: 'flat-square',
|
||||
})
|
||||
```
|
||||
- `ValidationError` had been added and inputs are now validated. In previous releases, invalid inputs would be discarded and replaced with defaults. For example, in 2.2.1
|
||||
```js
|
||||
const { BadgeFactory } = require('gh-badges')
|
||||
const bf = new BadgeFactory()
|
||||
const svg = bf.create({
|
||||
text: ['build', 'passed'],
|
||||
template: 'some invalid value',
|
||||
})
|
||||
```
|
||||
would generate an SVG badge. In version >=3
|
||||
```js
|
||||
const { makeBadge } = require('badge-maker')
|
||||
const svg = makeBadge({
|
||||
label: 'build',
|
||||
message: 'passed',
|
||||
style: 'some invalid value',
|
||||
})
|
||||
```
|
||||
will throw a `ValidationError`.
|
||||
- Raster support has been removed from the CLI. It will now only output SVG. On the console, the output of `badge` can be piped to a utility like [imagemagick](https://imagemagick.org/script/command-line-processing.php). If you were previously using
|
||||
```sh
|
||||
badge build passed :green .gif
|
||||
```
|
||||
this could be replaced by
|
||||
```sh
|
||||
badge build passed :green | magick svg:- gif:-
|
||||
```
|
||||
|
||||
### Security
|
||||
|
||||
- Removed dependency on doT library which has known vulnerabilities.
|
||||
|
||||
## 2.2.1 - 2019-05-30
|
||||
|
||||
### Fixes
|
||||
|
||||
- Escape logos to prevent XSS vulnerability
|
||||
- Update docblock for BadgeFactory.create()
|
||||
|
||||
## 2.2.0 - 2019-05-29
|
||||
|
||||
### Deprecations
|
||||
|
||||
- `labelColor` and `color` are now the recommended attribute names for label color and message color.
|
||||
|
||||
- `colorA` (now an alias for `labelColor`),
|
||||
- `colorB` (now an alias for `color`) and
|
||||
- `colorscheme` (now an alias for `color`)
|
||||
|
||||
are now deprecated and will be removed in some future release.
|
||||
|
||||
### New Features
|
||||
|
||||
- Semantic color aliases. Add support for:
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- Add directory field to package.json (to help tools find this package in the repo)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- Prevent bad letter spacing when whitespace surrounds badge text
|
||||
|
||||
### Dependencies
|
||||
|
||||
- Bump anafanafo
|
||||
- Use caret instead of tilde for dependencies
|
||||
|
||||
### Internals
|
||||
|
||||
- Generate JSON badges without using a template
|
||||
- Refactoring
|
||||
- Testing improvements
|
||||
|
||||
### Node support
|
||||
|
||||
- Declare support for all currently maintained Node versions
|
||||
- Explicitly test on all supported versions
|
||||
|
||||
## 2.1.0 - 2018-11-18
|
||||
|
||||
gh-badges v2.1.0 implements a new text width measurer which uses a lookup table, removing the dependency
|
||||
on PDFKit. It is no longer necessary to provide a local copy of Verdana for accurate text width computation.
|
||||
|
||||
As such, the `fontPath` and `precomputeWidths` parameters are now deprecated. The recommended call to create an instance of `BadgeFactory` is now
|
||||
|
||||
```js
|
||||
const bf = new BadgeFactory()
|
||||
```
|
||||
|
||||
For backwards compatibility you can still construct an instance of `BadgeFactory` with a call like
|
||||
|
||||
```js
|
||||
const bf = new BadgeFactory({
|
||||
fontPath: '/path/to/Verdana.ttf',
|
||||
precomputeWidths: true,
|
||||
})
|
||||
```
|
||||
|
||||
However, the function will issue a warning.
|
||||
|
||||
To clear the warning, change the code to:
|
||||
|
||||
```js
|
||||
const bf = new BadgeFactory()
|
||||
```
|
||||
|
||||
These arguments will be removed in a future release.
|
||||
|
||||
To upgrade from v1.3.0, change your code from:
|
||||
|
||||
```js
|
||||
const badge = require('gh-badges')
|
||||
|
||||
const format = {
|
||||
text: ['build', 'passed'],
|
||||
colorscheme: 'green',
|
||||
template: 'flat',
|
||||
}
|
||||
|
||||
badge.loadFont('/path/to/Verdana.ttf', err => {
|
||||
badge(format, (svg, err) => {
|
||||
// svg is a string containing your badge
|
||||
})
|
||||
})
|
||||
```
|
||||
|
||||
to:
|
||||
|
||||
```js
|
||||
const { BadgeFactory } = require('gh-badges')
|
||||
|
||||
const bf = new BadgeFactory()
|
||||
|
||||
const format = {
|
||||
text: ['build', 'passed'],
|
||||
colorscheme: 'green',
|
||||
template: 'flat',
|
||||
}
|
||||
|
||||
const svg = bf.create(format)
|
||||
```
|
||||
|
||||
### Other changes in this release:
|
||||
|
||||
- Remove unnecessary dependencies
|
||||
- Documentation improvements
|
||||
|
||||
## 2.0.0 - 2018-11-09
|
||||
|
||||
gh-badges v2.0.0 declares a new public interface which is synchronous.
|
||||
If your version 1.3.0 code looked like this:
|
||||
|
||||
```js
|
||||
const badge = require('gh-badges')
|
||||
|
||||
const format = {
|
||||
text: ['build', 'passed'],
|
||||
colorscheme: 'green',
|
||||
template: 'flat',
|
||||
}
|
||||
|
||||
badge.loadFont('/path/to/Verdana.ttf', err => {
|
||||
badge(format, (svg, err) => {
|
||||
// svg is a string containing your badge
|
||||
})
|
||||
})
|
||||
```
|
||||
|
||||
To upgrade to version 2.0.0, refactor you code to:
|
||||
|
||||
```js
|
||||
const { BadgeFactory } = require('gh-badges')
|
||||
|
||||
const bf = new BadgeFactory({ fontPath: '/path/to/Verdana.ttf' })
|
||||
|
||||
const format = {
|
||||
text: ['build', 'passed'],
|
||||
colorscheme: 'green',
|
||||
template: 'flat',
|
||||
}
|
||||
|
||||
const svg = bf.create(format)
|
||||
```
|
||||
|
||||
You can generate badges without a copy of Verdana, however font width computation is approximate and badges may be distorted.
|
||||
|
||||
```js
|
||||
const bf = new BadgeFactory({ fallbackFontPath: 'Helvetica' })
|
||||
```
|
||||
|
||||
## 1.3.0 - 2016-09-07
|
||||
|
||||
Add support for optionally specifying the path to `Verdana.ttf`. In earlier versions, the file needed to be in the directory containing Shields.
|
||||
|
||||
Without font path:
|
||||
|
||||
```js
|
||||
const badge = require('gh-badges')
|
||||
|
||||
badge({ text: ['build', 'passed'], colorscheme: 'green' }, (svg, err) => {
|
||||
// svg is a string containing your badge
|
||||
})
|
||||
```
|
||||
|
||||
With font path:
|
||||
|
||||
```js
|
||||
const badge = require('gh-badges')
|
||||
|
||||
// Optional step, to have accurate text width computation.
|
||||
badge.loadFont('/path/to/Verdana.ttf', err => {
|
||||
badge(
|
||||
{ text: ['build', 'passed'], colorscheme: 'green', template: 'flat' },
|
||||
(svg, err) => {
|
||||
// svg is a string containing your badge
|
||||
}
|
||||
)
|
||||
})
|
||||
```
|
||||
116
node_modules/badge-maker/LICENSE
generated
vendored
Normal file
116
node_modules/badge-maker/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,116 @@
|
||||
CC0 1.0 Universal
|
||||
|
||||
Statement of Purpose
|
||||
|
||||
The laws of most jurisdictions throughout the world automatically confer
|
||||
exclusive Copyright and Related Rights (defined below) upon the creator and
|
||||
subsequent owner(s) (each and all, an "owner") of an original work of
|
||||
authorship and/or a database (each, a "Work").
|
||||
|
||||
Certain owners wish to permanently relinquish those rights to a Work for the
|
||||
purpose of contributing to a commons of creative, cultural and scientific
|
||||
works ("Commons") that the public can reliably and without fear of later
|
||||
claims of infringement build upon, modify, incorporate in other works, reuse
|
||||
and redistribute as freely as possible in any form whatsoever and for any
|
||||
purposes, including without limitation commercial purposes. These owners may
|
||||
contribute to the Commons to promote the ideal of a free culture and the
|
||||
further production of creative, cultural and scientific works, or to gain
|
||||
reputation or greater distribution for their Work in part through the use and
|
||||
efforts of others.
|
||||
|
||||
For these and/or other purposes and motivations, and without any expectation
|
||||
of additional consideration or compensation, the person associating CC0 with a
|
||||
Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
|
||||
and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
|
||||
and publicly distribute the Work under its terms, with knowledge of his or her
|
||||
Copyright and Related Rights in the Work and the meaning and intended legal
|
||||
effect of CC0 on those rights.
|
||||
|
||||
1. Copyright and Related Rights. A Work made available under CC0 may be
|
||||
protected by copyright and related or neighboring rights ("Copyright and
|
||||
Related Rights"). Copyright and Related Rights include, but are not limited
|
||||
to, the following:
|
||||
|
||||
i. the right to reproduce, adapt, distribute, perform, display, communicate,
|
||||
and translate a Work;
|
||||
|
||||
ii. moral rights retained by the original author(s) and/or performer(s);
|
||||
|
||||
iii. publicity and privacy rights pertaining to a person's image or likeness
|
||||
depicted in a Work;
|
||||
|
||||
iv. rights protecting against unfair competition in regards to a Work,
|
||||
subject to the limitations in paragraph 4(a), below;
|
||||
|
||||
v. rights protecting the extraction, dissemination, use and reuse of data in
|
||||
a Work;
|
||||
|
||||
vi. database rights (such as those arising under Directive 96/9/EC of the
|
||||
European Parliament and of the Council of 11 March 1996 on the legal
|
||||
protection of databases, and under any national implementation thereof,
|
||||
including any amended or successor version of such directive); and
|
||||
|
||||
vii. other similar, equivalent or corresponding rights throughout the world
|
||||
based on applicable law or treaty, and any national implementations thereof.
|
||||
|
||||
2. Waiver. To the greatest extent permitted by, but not in contravention of,
|
||||
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
|
||||
unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
|
||||
and Related Rights and associated claims and causes of action, whether now
|
||||
known or unknown (including existing as well as future claims and causes of
|
||||
action), in the Work (i) in all territories worldwide, (ii) for the maximum
|
||||
duration provided by applicable law or treaty (including future time
|
||||
extensions), (iii) in any current or future medium and for any number of
|
||||
copies, and (iv) for any purpose whatsoever, including without limitation
|
||||
commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
|
||||
the Waiver for the benefit of each member of the public at large and to the
|
||||
detriment of Affirmer's heirs and successors, fully intending that such Waiver
|
||||
shall not be subject to revocation, rescission, cancellation, termination, or
|
||||
any other legal or equitable action to disrupt the quiet enjoyment of the Work
|
||||
by the public as contemplated by Affirmer's express Statement of Purpose.
|
||||
|
||||
3. Public License Fallback. Should any part of the Waiver for any reason be
|
||||
judged legally invalid or ineffective under applicable law, then the Waiver
|
||||
shall be preserved to the maximum extent permitted taking into account
|
||||
Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
|
||||
is so judged Affirmer hereby grants to each affected person a royalty-free,
|
||||
non transferable, non sublicensable, non exclusive, irrevocable and
|
||||
unconditional license to exercise Affirmer's Copyright and Related Rights in
|
||||
the Work (i) in all territories worldwide, (ii) for the maximum duration
|
||||
provided by applicable law or treaty (including future time extensions), (iii)
|
||||
in any current or future medium and for any number of copies, and (iv) for any
|
||||
purpose whatsoever, including without limitation commercial, advertising or
|
||||
promotional purposes (the "License"). The License shall be deemed effective as
|
||||
of the date CC0 was applied by Affirmer to the Work. Should any part of the
|
||||
License for any reason be judged legally invalid or ineffective under
|
||||
applicable law, such partial invalidity or ineffectiveness shall not
|
||||
invalidate the remainder of the License, and in such case Affirmer hereby
|
||||
affirms that he or she will not (i) exercise any of his or her remaining
|
||||
Copyright and Related Rights in the Work or (ii) assert any associated claims
|
||||
and causes of action with respect to the Work, in either case contrary to
|
||||
Affirmer's express Statement of Purpose.
|
||||
|
||||
4. Limitations and Disclaimers.
|
||||
|
||||
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
||||
surrendered, licensed or otherwise affected by this document.
|
||||
|
||||
b. Affirmer offers the Work as-is and makes no representations or warranties
|
||||
of any kind concerning the Work, express, implied, statutory or otherwise,
|
||||
including without limitation warranties of title, merchantability, fitness
|
||||
for a particular purpose, non infringement, or the absence of latent or
|
||||
other defects, accuracy, or the present or absence of errors, whether or not
|
||||
discoverable, all to the greatest extent permissible under applicable law.
|
||||
|
||||
c. Affirmer disclaims responsibility for clearing rights of other persons
|
||||
that may apply to the Work or any use thereof, including without limitation
|
||||
any person's Copyright and Related Rights in the Work. Further, Affirmer
|
||||
disclaims responsibility for obtaining any necessary consents, permissions
|
||||
or other rights required for any use of the Work.
|
||||
|
||||
d. Affirmer understands and acknowledges that Creative Commons is not a
|
||||
party to this document and has no duty or obligation with respect to this
|
||||
CC0 or use of the Work.
|
||||
|
||||
For more information, please see
|
||||
<http://creativecommons.org/publicdomain/zero/1.0/>
|
||||
142
node_modules/badge-maker/README.md
generated
vendored
Normal file
142
node_modules/badge-maker/README.md
generated
vendored
Normal file
@@ -0,0 +1,142 @@
|
||||
# badge-maker
|
||||
|
||||
[](https://npmjs.org/package/badge-maker)
|
||||
[](https://npmjs.org/package/badge-maker)
|
||||
[](https://npmjs.org/package/badge-maker)
|
||||
|
||||
## Installation
|
||||
|
||||
```sh
|
||||
npm install badge-maker
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### On the console
|
||||
|
||||
```sh
|
||||
npm install -g badge-maker
|
||||
badge build passed :green > mybadge.svg
|
||||
```
|
||||
|
||||
### As a library
|
||||
|
||||
With CommonJS in JavaScript,
|
||||
|
||||
```js
|
||||
const { makeBadge, ValidationError } = require('badge-maker')
|
||||
```
|
||||
|
||||
With ESM or TypeScript,
|
||||
|
||||
```ts
|
||||
import { makeBadge, ValidationError } from 'badge-maker'
|
||||
```
|
||||
|
||||
```js
|
||||
const format = {
|
||||
label: 'build',
|
||||
message: 'passed',
|
||||
color: 'green',
|
||||
}
|
||||
|
||||
const svg = makeBadge(format)
|
||||
console.log(svg) // <svg...
|
||||
|
||||
try {
|
||||
makeBadge({})
|
||||
} catch (e) {
|
||||
console.log(e) // ValidationError: Field `message` is required
|
||||
}
|
||||
```
|
||||
|
||||
### Node version support
|
||||
|
||||
The latest version of badge-maker supports all currently maintained Node
|
||||
versions. See the [Node Release Schedule][].
|
||||
|
||||
[node release schedule]: https://github.com/nodejs/Release#release-schedule
|
||||
|
||||
## Format
|
||||
|
||||
The format is the following:
|
||||
|
||||
```js
|
||||
{
|
||||
label: 'build', // (Optional) Badge label
|
||||
message: 'passed', // (Required) Badge message
|
||||
labelColor: '#555', // (Optional) Label color
|
||||
color: '#4c1', // (Optional) Message color
|
||||
|
||||
// (Optional) One of: 'plastic', 'flat', 'flat-square', 'for-the-badge' or 'social'
|
||||
// Each offers a different visual design.
|
||||
style: 'flat',
|
||||
}
|
||||
```
|
||||
|
||||
## Colors
|
||||
|
||||
There are three ways to specify `color` and `labelColor`:
|
||||
|
||||
1. One of the [Shields named colors](./lib/color.js):
|
||||
|
||||
- ![][brightgreen]
|
||||
- ![][green]
|
||||
- ![][yellow]
|
||||
- ![][yellowgreen]
|
||||
- ![][orange]
|
||||
- ![][red]
|
||||
- ![][blue]
|
||||
- ![][grey] ![][gray] – the default `labelColor`
|
||||
- ![][lightgrey] ![][lightgray] – the default `color`
|
||||
|
||||
- ![][success]
|
||||
- ![][important]
|
||||
- ![][critical]
|
||||
- ![][informational]
|
||||
- ![][inactive] – the default `color`
|
||||
|
||||
2. A three- or six-character hex color, optionally prefixed with `#`:
|
||||
|
||||
- ![][9cf]
|
||||
- ![][#007fff]
|
||||
- etc.
|
||||
|
||||
3. [Any valid CSS color][css color], e.g.
|
||||
|
||||
- `rgb(...)`, `rgba(...)`
|
||||
- `hsl(...)`, `hsla(...)`
|
||||
- ![][aqua] ![][fuchsia] ![][lightslategray] etc.
|
||||
|
||||
[brightgreen]: https://img.shields.io/badge/brightgreen-brightgreen.svg
|
||||
[success]: https://img.shields.io/badge/success-success.svg
|
||||
[green]: https://img.shields.io/badge/green-green.svg
|
||||
[yellow]: https://img.shields.io/badge/yellow-yellow.svg
|
||||
[yellowgreen]: https://img.shields.io/badge/yellowgreen-yellowgreen.svg
|
||||
[orange]: https://img.shields.io/badge/orange-orange.svg
|
||||
[important]: https://img.shields.io/badge/important-important.svg
|
||||
[red]: https://img.shields.io/badge/red-red.svg
|
||||
[critical]: https://img.shields.io/badge/critical-critical.svg
|
||||
[blue]: https://img.shields.io/badge/blue-blue.svg
|
||||
[informational]: https://img.shields.io/badge/informational-informational.svg
|
||||
[grey]: https://img.shields.io/badge/grey-grey.svg
|
||||
[gray]: https://img.shields.io/badge/gray-gray.svg
|
||||
[lightgrey]: https://img.shields.io/badge/lightgrey-lightgrey.svg
|
||||
[lightgray]: https://img.shields.io/badge/lightgray-lightgray.svg
|
||||
[inactive]: https://img.shields.io/badge/inactive-inactive.svg
|
||||
[9cf]: https://img.shields.io/badge/9cf-9cf.svg
|
||||
[#007fff]: https://img.shields.io/badge/%23007fff-007fff.svg
|
||||
[aqua]: https://img.shields.io/badge/aqua-aqua.svg
|
||||
[fuchsia]: https://img.shields.io/badge/fuchsia-fuchsia.svg
|
||||
[lightslategray]: https://img.shields.io/badge/lightslategray-lightslategray.svg
|
||||
[css color]: https://developer.mozilla.org/en-US/docs/Web/CSS/color_value
|
||||
[css/svg color]: http://www.w3.org/TR/SVG/types.html#DataTypeColor
|
||||
|
||||
## Raster Formats
|
||||
|
||||
Conversion to raster formats is no longer directly supported. In javascript
|
||||
code, SVG badges can be converted to raster formats using a library like
|
||||
[gm](https://www.npmjs.com/package/gm). On the console, the output of `badge`
|
||||
can be piped to a utility like
|
||||
[imagemagick](https://imagemagick.org/script/command-line-processing.php)
|
||||
e.g: `badge build passed :green | magick svg:- gif:-`.
|
||||
11
node_modules/badge-maker/index.d.ts
generated
vendored
Normal file
11
node_modules/badge-maker/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
interface Format {
|
||||
label?: string
|
||||
message: string
|
||||
labelColor?: string
|
||||
color?: string
|
||||
style?: 'plastic' | 'flat' | 'flat-square' | 'for-the-badge' | 'social'
|
||||
}
|
||||
|
||||
export declare class ValidationError extends Error {}
|
||||
|
||||
export declare function makeBadge(format: Format): string
|
||||
65
node_modules/badge-maker/lib/badge-cli.js
generated
vendored
Executable file
65
node_modules/badge-maker/lib/badge-cli.js
generated
vendored
Executable file
@@ -0,0 +1,65 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
'use strict'
|
||||
|
||||
const { namedColors } = require('./color')
|
||||
const { makeBadge } = require('./index')
|
||||
|
||||
if (process.argv.length < 4) {
|
||||
console.log('Usage: badge label message [:color] [@style]')
|
||||
console.log('Or: badge label message color [labelColor] [@style]')
|
||||
console.log()
|
||||
console.log(' color, labelColor:')
|
||||
console.log(` one of ${Object.keys(namedColors).join(', ')}.`)
|
||||
console.log(' #xxx (three hex digits)')
|
||||
console.log(' #xxxxxx (six hex digits)')
|
||||
console.log(' color (CSS color)')
|
||||
console.log()
|
||||
console.log('Eg: badge cactus grown :green @flat')
|
||||
console.log()
|
||||
process.exit()
|
||||
}
|
||||
|
||||
// Find a format specifier.
|
||||
let style = ''
|
||||
for (let i = 4; i < process.argv.length; i++) {
|
||||
if (process.argv[i][0] === '@') {
|
||||
style = process.argv[i].slice(1)
|
||||
process.argv.splice(i, 1)
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
const label = process.argv[2]
|
||||
const message = process.argv[3]
|
||||
let color = process.argv[4] || ':green'
|
||||
const labelColor = process.argv[5]
|
||||
|
||||
const badgeData = { label, message }
|
||||
if (style) {
|
||||
badgeData.style = style
|
||||
}
|
||||
|
||||
if (color[0] === ':') {
|
||||
color = color.slice(1)
|
||||
if (namedColors[color] == null) {
|
||||
// Colorscheme not found.
|
||||
console.error('Invalid color scheme.')
|
||||
process.exit(1)
|
||||
}
|
||||
badgeData.color = color
|
||||
} else {
|
||||
badgeData.color = color
|
||||
if (labelColor) {
|
||||
badgeData.labelColor = labelColor
|
||||
}
|
||||
}
|
||||
|
||||
;(() => {
|
||||
try {
|
||||
console.log(makeBadge(badgeData))
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
process.exit(1)
|
||||
}
|
||||
})()
|
||||
807
node_modules/badge-maker/lib/badge-renderers.js
generated
vendored
Normal file
807
node_modules/badge-maker/lib/badge-renderers.js
generated
vendored
Normal file
@@ -0,0 +1,807 @@
|
||||
'use strict'
|
||||
|
||||
const anafanafo = require('anafanafo')
|
||||
const { brightness } = require('./color')
|
||||
const { XmlElement, escapeXml } = require('./xml')
|
||||
|
||||
// https://github.com/badges/shields/pull/1132
|
||||
const FONT_SCALE_UP_FACTOR = 10
|
||||
const FONT_SCALE_DOWN_VALUE = 'scale(.1)'
|
||||
|
||||
const FONT_FAMILY = 'Verdana,Geneva,DejaVu Sans,sans-serif'
|
||||
const fontFamily = `font-family="${FONT_FAMILY}"`
|
||||
const socialFontFamily =
|
||||
'font-family="Helvetica Neue,Helvetica,Arial,sans-serif"'
|
||||
const brightnessThreshold = 0.69
|
||||
|
||||
function capitalize(s) {
|
||||
return `${s.charAt(0).toUpperCase()}${s.slice(1)}`
|
||||
}
|
||||
|
||||
function colorsForBackground(color) {
|
||||
if (brightness(color) <= brightnessThreshold) {
|
||||
return { textColor: '#fff', shadowColor: '#010101' }
|
||||
} else {
|
||||
return { textColor: '#333', shadowColor: '#ccc' }
|
||||
}
|
||||
}
|
||||
|
||||
function roundUpToOdd(val) {
|
||||
return val % 2 === 0 ? val + 1 : val
|
||||
}
|
||||
|
||||
function preferredWidthOf(str, options) {
|
||||
// Increase chances of pixel grid alignment.
|
||||
return roundUpToOdd(anafanafo(str, options) | 0)
|
||||
}
|
||||
|
||||
function createAccessibleText({ label, message }) {
|
||||
const labelPrefix = label ? `${label}: ` : ''
|
||||
return labelPrefix + message
|
||||
}
|
||||
|
||||
function hasLinks({ links }) {
|
||||
const [leftLink, rightLink] = links || []
|
||||
const hasLeftLink = leftLink && leftLink.length
|
||||
const hasRightLink = rightLink && rightLink.length
|
||||
const hasLink = hasLeftLink && hasRightLink
|
||||
return { hasLink, hasLeftLink, hasRightLink }
|
||||
}
|
||||
|
||||
function shouldWrapBodyWithLink({ links }) {
|
||||
const { hasLeftLink, hasRightLink } = hasLinks({ links })
|
||||
return hasLeftLink && !hasRightLink
|
||||
}
|
||||
|
||||
function renderAriaAttributes({ accessibleText, links }) {
|
||||
const { hasLink } = hasLinks({ links })
|
||||
return hasLink ? '' : `role="img" aria-label="${escapeXml(accessibleText)}"`
|
||||
}
|
||||
|
||||
function renderTitle({ accessibleText, links }) {
|
||||
const { hasLink } = hasLinks({ links })
|
||||
return hasLink ? '' : `<title>${escapeXml(accessibleText)}</title>`
|
||||
}
|
||||
|
||||
function renderLogo({
|
||||
logo,
|
||||
badgeHeight,
|
||||
horizPadding,
|
||||
logoWidth = 14,
|
||||
logoPadding = 0,
|
||||
}) {
|
||||
if (logo) {
|
||||
const logoHeight = 14
|
||||
const y = (badgeHeight - logoHeight) / 2
|
||||
const x = horizPadding
|
||||
return {
|
||||
hasLogo: true,
|
||||
totalLogoWidth: logoWidth + logoPadding,
|
||||
renderedLogo: `<image x="${x}" y="${y}" width="${logoWidth}" height="${logoHeight}" xlink:href="${escapeXml(
|
||||
logo
|
||||
)}"/>`,
|
||||
}
|
||||
} else {
|
||||
return { hasLogo: false, totalLogoWidth: 0, renderedLogo: '' }
|
||||
}
|
||||
}
|
||||
|
||||
function renderLink({
|
||||
link,
|
||||
height,
|
||||
textLength,
|
||||
horizPadding,
|
||||
leftMargin,
|
||||
renderedText,
|
||||
}) {
|
||||
const rectHeight = height
|
||||
const rectWidth = textLength + horizPadding * 2
|
||||
const rectX = leftMargin > 1 ? leftMargin + 1 : 0
|
||||
return `<a target="_blank" xlink:href="${escapeXml(link)}">
|
||||
<rect width="${rectWidth}" x="${rectX}" height="${rectHeight}" fill="rgba(0,0,0,0)" />
|
||||
${renderedText}
|
||||
</a>`
|
||||
}
|
||||
|
||||
function renderText({
|
||||
leftMargin,
|
||||
horizPadding = 0,
|
||||
content,
|
||||
link,
|
||||
height,
|
||||
verticalMargin = 0,
|
||||
shadow = false,
|
||||
color,
|
||||
}) {
|
||||
if (!content.length) {
|
||||
return { renderedText: '', width: 0 }
|
||||
}
|
||||
|
||||
const textLength = preferredWidthOf(content, { font: '11px Verdana' })
|
||||
const escapedContent = escapeXml(content)
|
||||
|
||||
const shadowMargin = 150 + verticalMargin
|
||||
const textMargin = 140 + verticalMargin
|
||||
|
||||
const outTextLength = 10 * textLength
|
||||
const x = 10 * (leftMargin + 0.5 * textLength + horizPadding)
|
||||
|
||||
let renderedText = ''
|
||||
const { textColor, shadowColor } = colorsForBackground(color)
|
||||
if (shadow) {
|
||||
renderedText = `<text aria-hidden="true" x="${x}" y="${shadowMargin}" fill="${shadowColor}" fill-opacity=".3" transform="scale(.1)" textLength="${outTextLength}">${escapedContent}</text>`
|
||||
}
|
||||
renderedText += `<text x="${x}" y="${textMargin}" transform="scale(.1)" fill="${textColor}" textLength="${outTextLength}">${escapedContent}</text>`
|
||||
|
||||
return {
|
||||
renderedText: link
|
||||
? renderLink({
|
||||
link,
|
||||
height,
|
||||
textLength,
|
||||
horizPadding,
|
||||
leftMargin,
|
||||
renderedText,
|
||||
})
|
||||
: renderedText,
|
||||
width: textLength,
|
||||
}
|
||||
}
|
||||
|
||||
function renderBadge(
|
||||
{ links, leftWidth, rightWidth, height, accessibleText },
|
||||
main
|
||||
) {
|
||||
const width = leftWidth + rightWidth
|
||||
const leftLink = escapeXml(links[0])
|
||||
|
||||
return `
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="${width}" height="${height}" ${renderAriaAttributes(
|
||||
{ links, accessibleText }
|
||||
)}>
|
||||
|
||||
${renderTitle({ accessibleText, links })}
|
||||
${
|
||||
shouldWrapBodyWithLink({ links })
|
||||
? `<a target="_blank" xlink:href="${leftLink}">${main}</a>`
|
||||
: main
|
||||
}
|
||||
</svg>`
|
||||
}
|
||||
|
||||
class Badge {
|
||||
static get fontFamily() {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
|
||||
static get height() {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
|
||||
static get verticalMargin() {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
|
||||
static get shadow() {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
|
||||
constructor({
|
||||
label,
|
||||
message,
|
||||
links,
|
||||
logo,
|
||||
logoWidth,
|
||||
logoPadding,
|
||||
color = '#4c1',
|
||||
labelColor,
|
||||
}) {
|
||||
const horizPadding = 5
|
||||
const { hasLogo, totalLogoWidth, renderedLogo } = renderLogo({
|
||||
logo,
|
||||
badgeHeight: this.constructor.height,
|
||||
horizPadding,
|
||||
logoWidth,
|
||||
logoPadding,
|
||||
})
|
||||
const hasLabel = label.length || labelColor
|
||||
if (labelColor == null) {
|
||||
labelColor = '#555'
|
||||
}
|
||||
|
||||
const [leftLink, rightLink] = links
|
||||
|
||||
labelColor = hasLabel || hasLogo ? labelColor : color
|
||||
labelColor = escapeXml(labelColor)
|
||||
color = escapeXml(color)
|
||||
|
||||
const labelMargin = totalLogoWidth + 1
|
||||
|
||||
const { renderedText: renderedLabel, width: labelWidth } = renderText({
|
||||
leftMargin: labelMargin,
|
||||
horizPadding,
|
||||
content: label,
|
||||
link: !shouldWrapBodyWithLink({ links }) && leftLink,
|
||||
height: this.constructor.height,
|
||||
verticalMargin: this.constructor.verticalMargin,
|
||||
shadow: this.constructor.shadow,
|
||||
color: labelColor,
|
||||
})
|
||||
|
||||
const leftWidth = hasLabel
|
||||
? labelWidth + 2 * horizPadding + totalLogoWidth
|
||||
: 0
|
||||
|
||||
let messageMargin = leftWidth - (message.length ? 1 : 0)
|
||||
if (!hasLabel) {
|
||||
if (hasLogo) {
|
||||
messageMargin = messageMargin + totalLogoWidth + horizPadding
|
||||
} else {
|
||||
messageMargin = messageMargin + 1
|
||||
}
|
||||
}
|
||||
|
||||
const { renderedText: renderedMessage, width: messageWidth } = renderText({
|
||||
leftMargin: messageMargin,
|
||||
horizPadding,
|
||||
content: message,
|
||||
link: rightLink,
|
||||
height: this.constructor.height,
|
||||
verticalMargin: this.constructor.verticalMargin,
|
||||
shadow: this.constructor.shadow,
|
||||
color,
|
||||
})
|
||||
|
||||
let rightWidth = messageWidth + 2 * horizPadding
|
||||
if (hasLogo && !hasLabel) {
|
||||
rightWidth += totalLogoWidth + horizPadding - 1
|
||||
}
|
||||
|
||||
const width = leftWidth + rightWidth
|
||||
|
||||
const accessibleText = createAccessibleText({ label, message })
|
||||
|
||||
this.links = links
|
||||
this.leftWidth = leftWidth
|
||||
this.rightWidth = rightWidth
|
||||
this.width = width
|
||||
this.labelColor = labelColor
|
||||
this.color = color
|
||||
this.label = label
|
||||
this.message = message
|
||||
this.accessibleText = accessibleText
|
||||
this.renderedLogo = renderedLogo
|
||||
this.renderedLabel = renderedLabel
|
||||
this.renderedMessage = renderedMessage
|
||||
}
|
||||
|
||||
static render(params) {
|
||||
return new this(params).render()
|
||||
}
|
||||
|
||||
render() {
|
||||
throw new Error('Not implemented')
|
||||
}
|
||||
}
|
||||
|
||||
class Plastic extends Badge {
|
||||
static get fontFamily() {
|
||||
return fontFamily
|
||||
}
|
||||
|
||||
static get height() {
|
||||
return 18
|
||||
}
|
||||
|
||||
static get verticalMargin() {
|
||||
return -10
|
||||
}
|
||||
|
||||
static get shadow() {
|
||||
return true
|
||||
}
|
||||
|
||||
render() {
|
||||
return renderBadge(
|
||||
{
|
||||
links: this.links,
|
||||
leftWidth: this.leftWidth,
|
||||
rightWidth: this.rightWidth,
|
||||
accessibleText: this.accessibleText,
|
||||
height: this.constructor.height,
|
||||
},
|
||||
`
|
||||
<linearGradient id="s" x2="0" y2="100%">
|
||||
<stop offset="0" stop-color="#fff" stop-opacity=".7"/>
|
||||
<stop offset=".1" stop-color="#aaa" stop-opacity=".1"/>
|
||||
<stop offset=".9" stop-color="#000" stop-opacity=".3"/>
|
||||
<stop offset="1" stop-color="#000" stop-opacity=".5"/>
|
||||
</linearGradient>
|
||||
|
||||
<clipPath id="r">
|
||||
<rect width="${this.width}" height="${this.constructor.height}" rx="4" fill="#fff"/>
|
||||
</clipPath>
|
||||
|
||||
<g clip-path="url(#r)">
|
||||
<rect width="${this.leftWidth}" height="${this.constructor.height}" fill="${this.labelColor}"/>
|
||||
<rect x="${this.leftWidth}" width="${this.rightWidth}" height="${this.constructor.height}" fill="${this.color}"/>
|
||||
<rect width="${this.width}" height="${this.constructor.height}" fill="url(#s)"/>
|
||||
</g>
|
||||
|
||||
<g fill="#fff" text-anchor="middle" ${this.constructor.fontFamily} text-rendering="geometricPrecision" font-size="110">
|
||||
${this.renderedLogo}
|
||||
${this.renderedLabel}
|
||||
${this.renderedMessage}
|
||||
</g>`
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
class Flat extends Badge {
|
||||
static get fontFamily() {
|
||||
return fontFamily
|
||||
}
|
||||
|
||||
static get height() {
|
||||
return 20
|
||||
}
|
||||
|
||||
static get verticalMargin() {
|
||||
return 0
|
||||
}
|
||||
|
||||
static get shadow() {
|
||||
return true
|
||||
}
|
||||
|
||||
render() {
|
||||
return renderBadge(
|
||||
{
|
||||
links: this.links,
|
||||
leftWidth: this.leftWidth,
|
||||
rightWidth: this.rightWidth,
|
||||
accessibleText: this.accessibleText,
|
||||
height: this.constructor.height,
|
||||
},
|
||||
`
|
||||
<linearGradient id="s" x2="0" y2="100%">
|
||||
<stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
|
||||
<stop offset="1" stop-opacity=".1"/>
|
||||
</linearGradient>
|
||||
|
||||
<clipPath id="r">
|
||||
<rect width="${this.width}" height="${this.constructor.height}" rx="3" fill="#fff"/>
|
||||
</clipPath>
|
||||
|
||||
<g clip-path="url(#r)">
|
||||
<rect width="${this.leftWidth}" height="${this.constructor.height}" fill="${this.labelColor}"/>
|
||||
<rect x="${this.leftWidth}" width="${this.rightWidth}" height="${this.constructor.height}" fill="${this.color}"/>
|
||||
<rect width="${this.width}" height="${this.constructor.height}" fill="url(#s)"/>
|
||||
</g>
|
||||
|
||||
<g fill="#fff" text-anchor="middle" ${this.constructor.fontFamily} text-rendering="geometricPrecision" font-size="110">
|
||||
${this.renderedLogo}
|
||||
${this.renderedLabel}
|
||||
${this.renderedMessage}
|
||||
</g>`
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
class FlatSquare extends Badge {
|
||||
static get fontFamily() {
|
||||
return fontFamily
|
||||
}
|
||||
|
||||
static get height() {
|
||||
return 20
|
||||
}
|
||||
|
||||
static get verticalMargin() {
|
||||
return 0
|
||||
}
|
||||
|
||||
static get shadow() {
|
||||
return false
|
||||
}
|
||||
|
||||
render() {
|
||||
return renderBadge(
|
||||
{
|
||||
links: this.links,
|
||||
leftWidth: this.leftWidth,
|
||||
rightWidth: this.rightWidth,
|
||||
accessibleText: this.accessibleText,
|
||||
height: this.constructor.height,
|
||||
},
|
||||
`
|
||||
<g shape-rendering="crispEdges">
|
||||
<rect width="${this.leftWidth}" height="${this.constructor.height}" fill="${this.labelColor}"/>
|
||||
<rect x="${this.leftWidth}" width="${this.rightWidth}" height="${this.constructor.height}" fill="${this.color}"/>
|
||||
</g>
|
||||
|
||||
<g fill="#fff" text-anchor="middle" ${this.constructor.fontFamily} text-rendering="geometricPrecision" font-size="110">
|
||||
${this.renderedLogo}
|
||||
${this.renderedLabel}
|
||||
${this.renderedMessage}
|
||||
</g>`
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
function social({
|
||||
label,
|
||||
message,
|
||||
links = [],
|
||||
logo,
|
||||
logoWidth,
|
||||
logoPadding,
|
||||
color = '#4c1',
|
||||
labelColor = '#555',
|
||||
}) {
|
||||
// Social label is styled with a leading capital. Convert to caps here so
|
||||
// width can be measured using the correct characters.
|
||||
label = capitalize(label)
|
||||
|
||||
const externalHeight = 20
|
||||
const internalHeight = 19
|
||||
const labelHorizPadding = 5
|
||||
const messageHorizPadding = 4
|
||||
const horizGutter = 6
|
||||
const { totalLogoWidth, renderedLogo } = renderLogo({
|
||||
logo,
|
||||
badgeHeight: externalHeight,
|
||||
horizPadding: labelHorizPadding,
|
||||
logoWidth,
|
||||
logoPadding,
|
||||
})
|
||||
const hasMessage = message.length
|
||||
|
||||
const font = 'bold 11px Helvetica'
|
||||
const labelTextWidth = preferredWidthOf(label, { font })
|
||||
const messageTextWidth = preferredWidthOf(message, { font })
|
||||
const labelRectWidth = labelTextWidth + totalLogoWidth + 2 * labelHorizPadding
|
||||
const messageRectWidth = messageTextWidth + 2 * messageHorizPadding
|
||||
|
||||
let [leftLink, rightLink] = links
|
||||
leftLink = escapeXml(leftLink)
|
||||
rightLink = escapeXml(rightLink)
|
||||
const { hasLeftLink, hasRightLink, hasLink } = hasLinks({ links })
|
||||
|
||||
const accessibleText = createAccessibleText({ label, message })
|
||||
|
||||
function renderMessageBubble() {
|
||||
const messageBubbleMainX = labelRectWidth + horizGutter + 0.5
|
||||
const messageBubbleNotchX = labelRectWidth + horizGutter
|
||||
return `
|
||||
<rect x="${messageBubbleMainX}" y="0.5" width="${messageRectWidth}" height="${internalHeight}" rx="2" fill="#fafafa"/>
|
||||
<rect x="${messageBubbleNotchX}" y="7.5" width="0.5" height="5" stroke="#fafafa"/>
|
||||
<path d="M${messageBubbleMainX} 6.5 l-3 3v1 l3 3" stroke="d5d5d5" fill="#fafafa"/>
|
||||
`
|
||||
}
|
||||
|
||||
function renderLabelText() {
|
||||
const labelTextX =
|
||||
10 * (totalLogoWidth + labelTextWidth / 2 + labelHorizPadding)
|
||||
const labelTextLength = 10 * labelTextWidth
|
||||
const escapedLabel = escapeXml(label)
|
||||
const shouldWrapWithLink = hasLeftLink && !shouldWrapBodyWithLink({ links })
|
||||
|
||||
const rect = `<rect id="llink" stroke="#d5d5d5" fill="url(#a)" x=".5" y=".5" width="${labelRectWidth}" height="${internalHeight}" rx="2" />`
|
||||
const shadow = `<text aria-hidden="true" x="${labelTextX}" y="150" fill="#fff" transform="scale(.1)" textLength="${labelTextLength}">${escapedLabel}</text>`
|
||||
const text = `<text x="${labelTextX}" y="140" transform="scale(.1)" textLength="${labelTextLength}">${escapedLabel}</text>`
|
||||
|
||||
return shouldWrapWithLink
|
||||
? `
|
||||
<a target="_blank" xlink:href="${leftLink}">
|
||||
${shadow}
|
||||
${text}
|
||||
${rect}
|
||||
</a>
|
||||
`
|
||||
: `
|
||||
${rect}
|
||||
${shadow}
|
||||
${text}
|
||||
`
|
||||
}
|
||||
|
||||
function renderMessageText() {
|
||||
const messageTextX =
|
||||
10 * (labelRectWidth + horizGutter + messageRectWidth / 2)
|
||||
const messageTextLength = 10 * messageTextWidth
|
||||
const escapedMessage = escapeXml(message)
|
||||
|
||||
const rect = `<rect width="${messageRectWidth + 1}" x="${
|
||||
labelRectWidth + horizGutter
|
||||
}" height="${internalHeight + 1}" fill="rgba(0,0,0,0)" />`
|
||||
const shadow = `<text aria-hidden="true" x="${messageTextX}" y="150" fill="#fff" transform="scale(.1)" textLength="${messageTextLength}">${escapedMessage}</text>`
|
||||
const text = `<text id="rlink" x="${messageTextX}" y="140" transform="scale(.1)" textLength="${messageTextLength}">${escapedMessage}</text>`
|
||||
|
||||
return hasRightLink
|
||||
? `
|
||||
<a target="_blank" xlink:href="${rightLink}">
|
||||
${rect}
|
||||
${shadow}
|
||||
${text}
|
||||
</a>
|
||||
`
|
||||
: `
|
||||
${shadow}
|
||||
${text}
|
||||
`
|
||||
}
|
||||
|
||||
return renderBadge(
|
||||
{
|
||||
links,
|
||||
leftWidth: labelRectWidth + 1,
|
||||
rightWidth: hasMessage ? horizGutter + messageRectWidth : 0,
|
||||
accessibleText,
|
||||
height: externalHeight,
|
||||
},
|
||||
`
|
||||
<style>a:hover #llink{fill:url(#b);stroke:#ccc}a:hover #rlink{fill:#4183c4}</style>
|
||||
<linearGradient id="a" x2="0" y2="100%">
|
||||
<stop offset="0" stop-color="#fcfcfc" stop-opacity="0"/>
|
||||
<stop offset="1" stop-opacity=".1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="b" x2="0" y2="100%">
|
||||
<stop offset="0" stop-color="#ccc" stop-opacity=".1"/>
|
||||
<stop offset="1" stop-opacity=".1"/>
|
||||
</linearGradient>
|
||||
<g stroke="#d5d5d5">
|
||||
<rect stroke="none" fill="#fcfcfc" x="0.5" y="0.5" width="${labelRectWidth}" height="${internalHeight}" rx="2"/>
|
||||
${hasMessage ? renderMessageBubble() : ''}
|
||||
</g>
|
||||
${renderedLogo}
|
||||
<g aria-hidden="${!hasLink}" fill="#333" text-anchor="middle" ${socialFontFamily} text-rendering="geometricPrecision" font-weight="700" font-size="110px" line-height="14px">
|
||||
${renderLabelText()}
|
||||
${hasMessage ? renderMessageText() : ''}
|
||||
</g>
|
||||
`
|
||||
)
|
||||
}
|
||||
|
||||
function forTheBadge({
|
||||
label,
|
||||
message,
|
||||
links,
|
||||
logo,
|
||||
logoWidth,
|
||||
color = '#4c1',
|
||||
labelColor,
|
||||
}) {
|
||||
const FONT_SIZE = 10
|
||||
const BADGE_HEIGHT = 28
|
||||
const LOGO_HEIGHT = 14
|
||||
const TEXT_MARGIN = 12
|
||||
const LOGO_MARGIN = 9
|
||||
const LOGO_TEXT_GUTTER = 6
|
||||
const LETTER_SPACING = 1.25
|
||||
|
||||
// Prepare content. For the Badge is styled in all caps. It's important to to
|
||||
// convert to uppercase first so the widths can be measured using the correct
|
||||
// symbols.
|
||||
label = label.toUpperCase()
|
||||
message = message.toUpperCase()
|
||||
|
||||
const [leftLink, rightLink] = links
|
||||
const { hasLeftLink, hasRightLink } = hasLinks({ links })
|
||||
|
||||
const outLabelColor = labelColor || '#555'
|
||||
|
||||
// Compute text width.
|
||||
// TODO: This really should count the symbols rather than just using `.length`.
|
||||
// https://mathiasbynens.be/notes/javascript-unicode
|
||||
// This is not using `preferredWidthOf()` as it tends to produce larger
|
||||
// inconsistencies in the letter spacing. The badges look fine, however if you
|
||||
// replace `textLength` with `letterSpacing` in the rendered SVG, you can see
|
||||
// the discrepancy. Ideally, swapping out `textLength` for `letterSpacing`
|
||||
// should not affect the appearance.
|
||||
const labelTextWidth = label.length
|
||||
? (anafanafo(label, { font: `${FONT_SIZE}px Verdana` }) | 0) +
|
||||
LETTER_SPACING * label.length
|
||||
: 0
|
||||
const messageTextWidth = message.length
|
||||
? (anafanafo(message, { font: `bold ${FONT_SIZE}px Verdana` }) | 0) +
|
||||
LETTER_SPACING * message.length
|
||||
: 0
|
||||
|
||||
// Compute horizontal layout.
|
||||
// If a `labelColor` is set, the logo is always set against it, even when
|
||||
// there is no label. When `needsLabelRect` is true, render a label rect and a
|
||||
// message rect; when false, only a message rect.
|
||||
const hasLabel = Boolean(label.length)
|
||||
const needsLabelRect = hasLabel || (logo && labelColor)
|
||||
let logoMinX, labelTextMinX
|
||||
if (logo) {
|
||||
logoMinX = LOGO_MARGIN
|
||||
labelTextMinX = logoMinX + logoWidth + LOGO_TEXT_GUTTER
|
||||
} else {
|
||||
labelTextMinX = TEXT_MARGIN
|
||||
}
|
||||
let labelRectWidth, messageTextMinX, messageRectWidth
|
||||
if (needsLabelRect) {
|
||||
if (hasLabel) {
|
||||
labelRectWidth = labelTextMinX + labelTextWidth + TEXT_MARGIN
|
||||
} else {
|
||||
labelRectWidth = 2 * LOGO_MARGIN + logoWidth
|
||||
}
|
||||
messageTextMinX = labelRectWidth + TEXT_MARGIN
|
||||
messageRectWidth = 2 * TEXT_MARGIN + messageTextWidth
|
||||
} else {
|
||||
if (logo) {
|
||||
messageTextMinX = TEXT_MARGIN + logoWidth + LOGO_TEXT_GUTTER
|
||||
messageRectWidth =
|
||||
2 * TEXT_MARGIN + logoWidth + LOGO_TEXT_GUTTER + messageTextWidth
|
||||
} else {
|
||||
messageTextMinX = TEXT_MARGIN
|
||||
messageRectWidth = 2 * TEXT_MARGIN + messageTextWidth
|
||||
}
|
||||
}
|
||||
|
||||
const logoElement = new XmlElement({
|
||||
name: 'image',
|
||||
attrs: {
|
||||
x: logoMinX,
|
||||
y: 0.5 * (BADGE_HEIGHT - LOGO_HEIGHT),
|
||||
width: logoWidth,
|
||||
height: LOGO_HEIGHT,
|
||||
'xlink:href': logo,
|
||||
},
|
||||
})
|
||||
|
||||
function getLabelElement() {
|
||||
const { textColor } = colorsForBackground(outLabelColor)
|
||||
const midX = labelTextMinX + 0.5 * labelTextWidth
|
||||
const text = new XmlElement({
|
||||
name: 'text',
|
||||
content: [label],
|
||||
attrs: {
|
||||
transform: FONT_SCALE_DOWN_VALUE,
|
||||
x: FONT_SCALE_UP_FACTOR * midX,
|
||||
y: 175,
|
||||
textLength: FONT_SCALE_UP_FACTOR * labelTextWidth,
|
||||
fill: textColor,
|
||||
},
|
||||
})
|
||||
|
||||
if (hasLeftLink && !shouldWrapBodyWithLink({ links })) {
|
||||
const rect = new XmlElement({
|
||||
name: 'rect',
|
||||
attrs: {
|
||||
width: labelRectWidth,
|
||||
height: BADGE_HEIGHT,
|
||||
fill: 'rgba(0,0,0,0)',
|
||||
},
|
||||
})
|
||||
return new XmlElement({
|
||||
name: 'a',
|
||||
content: [rect, text],
|
||||
attrs: {
|
||||
target: '_blank',
|
||||
'xlink:href': leftLink,
|
||||
},
|
||||
})
|
||||
} else {
|
||||
return text
|
||||
}
|
||||
}
|
||||
|
||||
function getMessageElement() {
|
||||
const { textColor } = colorsForBackground(color)
|
||||
const midX = messageTextMinX + 0.5 * messageTextWidth
|
||||
const text = new XmlElement({
|
||||
name: 'text',
|
||||
content: [message],
|
||||
attrs: {
|
||||
transform: FONT_SCALE_DOWN_VALUE,
|
||||
x: FONT_SCALE_UP_FACTOR * midX,
|
||||
y: 175,
|
||||
textLength: FONT_SCALE_UP_FACTOR * messageTextWidth,
|
||||
fill: textColor,
|
||||
'font-weight': 'bold',
|
||||
},
|
||||
})
|
||||
|
||||
if (hasRightLink) {
|
||||
const rect = new XmlElement({
|
||||
name: 'rect',
|
||||
attrs: {
|
||||
width: messageRectWidth,
|
||||
height: BADGE_HEIGHT,
|
||||
x: labelRectWidth || 0,
|
||||
fill: 'rgba(0,0,0,0)',
|
||||
},
|
||||
})
|
||||
return new XmlElement({
|
||||
name: 'a',
|
||||
content: [rect, text],
|
||||
attrs: {
|
||||
target: '_blank',
|
||||
'xlink:href': rightLink,
|
||||
},
|
||||
})
|
||||
} else {
|
||||
return text
|
||||
}
|
||||
}
|
||||
|
||||
let backgroundContent
|
||||
if (needsLabelRect) {
|
||||
backgroundContent = [
|
||||
new XmlElement({
|
||||
name: 'rect',
|
||||
attrs: {
|
||||
width: labelRectWidth,
|
||||
height: BADGE_HEIGHT,
|
||||
fill: outLabelColor,
|
||||
},
|
||||
}),
|
||||
new XmlElement({
|
||||
name: 'rect',
|
||||
attrs: {
|
||||
x: labelRectWidth,
|
||||
width: messageRectWidth,
|
||||
height: BADGE_HEIGHT,
|
||||
fill: color,
|
||||
},
|
||||
}),
|
||||
]
|
||||
} else {
|
||||
backgroundContent = [
|
||||
new XmlElement({
|
||||
name: 'rect',
|
||||
attrs: {
|
||||
width: messageRectWidth,
|
||||
height: BADGE_HEIGHT,
|
||||
fill: color,
|
||||
},
|
||||
}),
|
||||
]
|
||||
}
|
||||
|
||||
const backgroundGroup = new XmlElement({
|
||||
name: 'g',
|
||||
content: backgroundContent,
|
||||
attrs: {
|
||||
'shape-rendering': 'crispEdges',
|
||||
},
|
||||
})
|
||||
const foregroundGroup = new XmlElement({
|
||||
name: 'g',
|
||||
content: [
|
||||
logo ? logoElement : '',
|
||||
hasLabel ? getLabelElement() : '',
|
||||
getMessageElement(),
|
||||
],
|
||||
attrs: {
|
||||
fill: '#fff',
|
||||
'text-anchor': 'middle',
|
||||
'font-family': FONT_FAMILY,
|
||||
'text-rendering': 'geometricPrecision',
|
||||
'font-size': FONT_SCALE_UP_FACTOR * FONT_SIZE,
|
||||
},
|
||||
})
|
||||
|
||||
// Render.
|
||||
return renderBadge(
|
||||
{
|
||||
links,
|
||||
leftWidth: labelRectWidth || 0,
|
||||
rightWidth: messageRectWidth,
|
||||
accessibleText: createAccessibleText({ label, message }),
|
||||
height: BADGE_HEIGHT,
|
||||
},
|
||||
[backgroundGroup.render(), foregroundGroup.render()].join('')
|
||||
)
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
plastic: params => Plastic.render(params),
|
||||
flat: params => Flat.render(params),
|
||||
'flat-square': params => FlatSquare.render(params),
|
||||
social,
|
||||
'for-the-badge': forTheBadge,
|
||||
}
|
||||
88
node_modules/badge-maker/lib/color.js
generated
vendored
Normal file
88
node_modules/badge-maker/lib/color.js
generated
vendored
Normal file
@@ -0,0 +1,88 @@
|
||||
'use strict'
|
||||
|
||||
const { fromString } = require('css-color-converter')
|
||||
|
||||
// When updating these, be sure also to update the list in `badge-maker/README.md`.
|
||||
const namedColors = {
|
||||
brightgreen: '#4c1',
|
||||
green: '#97ca00',
|
||||
yellow: '#dfb317',
|
||||
yellowgreen: '#a4a61d',
|
||||
orange: '#fe7d37',
|
||||
red: '#e05d44',
|
||||
blue: '#007ec6',
|
||||
grey: '#555',
|
||||
lightgrey: '#9f9f9f',
|
||||
}
|
||||
|
||||
const aliases = {
|
||||
gray: 'grey',
|
||||
lightgray: 'lightgrey',
|
||||
critical: 'red',
|
||||
important: 'orange',
|
||||
success: 'brightgreen',
|
||||
informational: 'blue',
|
||||
inactive: 'lightgrey',
|
||||
}
|
||||
|
||||
const resolvedAliases = {}
|
||||
Object.entries(aliases).forEach(([alias, original]) => {
|
||||
resolvedAliases[alias] = namedColors[original]
|
||||
})
|
||||
|
||||
// This function returns false for `#ccc`. However `isCSSColor('#ccc')` is
|
||||
// true.
|
||||
const hexColorRegex = /^([\da-f]{3}){1,2}$/i
|
||||
function isHexColor(s = '') {
|
||||
return hexColorRegex.test(s)
|
||||
}
|
||||
|
||||
function isCSSColor(color) {
|
||||
return typeof color === 'string' && fromString(color.trim())
|
||||
}
|
||||
|
||||
function normalizeColor(color) {
|
||||
if (color === undefined) {
|
||||
return undefined
|
||||
} else if (color in namedColors) {
|
||||
return color
|
||||
} else if (color in aliases) {
|
||||
return aliases[color]
|
||||
} else if (isHexColor(color)) {
|
||||
return `#${color.toLowerCase()}`
|
||||
} else if (isCSSColor(color)) {
|
||||
return color.toLowerCase()
|
||||
} else {
|
||||
return undefined
|
||||
}
|
||||
}
|
||||
|
||||
function toSvgColor(color) {
|
||||
const normalized = normalizeColor(color)
|
||||
if (normalized in namedColors) {
|
||||
return namedColors[normalized]
|
||||
} else if (normalized in resolvedAliases) {
|
||||
return resolvedAliases[normalized]
|
||||
} else {
|
||||
return normalized
|
||||
}
|
||||
}
|
||||
|
||||
function brightness(color) {
|
||||
if (color) {
|
||||
const cssColor = fromString(color)
|
||||
if (cssColor) {
|
||||
const rgb = cssColor.toRgbaArray()
|
||||
return +((rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 255000).toFixed(2)
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
namedColors,
|
||||
isHexColor,
|
||||
normalizeColor,
|
||||
toSvgColor,
|
||||
brightness,
|
||||
}
|
||||
81
node_modules/badge-maker/lib/index.js
generated
vendored
Normal file
81
node_modules/badge-maker/lib/index.js
generated
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
'use strict'
|
||||
/**
|
||||
* @module badge-maker
|
||||
*/
|
||||
|
||||
const _makeBadge = require('./make-badge')
|
||||
|
||||
class ValidationError extends Error {}
|
||||
|
||||
function _validate(format) {
|
||||
if (format !== Object(format)) {
|
||||
throw new ValidationError('makeBadge takes an argument of type object')
|
||||
}
|
||||
|
||||
if (!('message' in format)) {
|
||||
throw new ValidationError('Field `message` is required')
|
||||
}
|
||||
|
||||
const stringFields = ['labelColor', 'color', 'message', 'label']
|
||||
stringFields.forEach(function (field) {
|
||||
if (field in format && typeof format[field] !== 'string') {
|
||||
throw new ValidationError(`Field \`${field}\` must be of type string`)
|
||||
}
|
||||
})
|
||||
|
||||
const styleValues = [
|
||||
'plastic',
|
||||
'flat',
|
||||
'flat-square',
|
||||
'for-the-badge',
|
||||
'social',
|
||||
]
|
||||
if ('style' in format && !styleValues.includes(format.style)) {
|
||||
throw new ValidationError(
|
||||
`Field \`style\` must be one of (${styleValues.toString()})`
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
function _clean(format) {
|
||||
const expectedKeys = ['label', 'message', 'labelColor', 'color', 'style']
|
||||
|
||||
const cleaned = {}
|
||||
Object.keys(format).forEach(key => {
|
||||
if (format[key] != null && expectedKeys.includes(key)) {
|
||||
cleaned[key] = format[key]
|
||||
} else {
|
||||
throw new ValidationError(
|
||||
`Unexpected field '${key}'. Allowed values are (${expectedKeys.toString()})`
|
||||
)
|
||||
}
|
||||
})
|
||||
|
||||
// Legacy.
|
||||
cleaned.label = cleaned.label || ''
|
||||
|
||||
return cleaned
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a badge
|
||||
*
|
||||
* @param {object} format Object specifying badge data
|
||||
* @param {string} format.label (Optional) Badge label (e.g: 'build')
|
||||
* @param {string} format.message (Required) Badge message (e.g: 'passing')
|
||||
* @param {string} format.labelColor (Optional) Label color
|
||||
* @param {string} format.color (Optional) Message color
|
||||
* @param {string} format.style (Optional) Visual style e.g: 'flat'
|
||||
* @returns {string} Badge in SVG format
|
||||
* @see https://github.com/badges/shields/tree/master/badge-maker/README.md
|
||||
*/
|
||||
function makeBadge(format) {
|
||||
_validate(format)
|
||||
const cleanedFormat = _clean(format)
|
||||
return _makeBadge(cleanedFormat)
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
makeBadge,
|
||||
ValidationError,
|
||||
}
|
||||
63
node_modules/badge-maker/lib/make-badge.js
generated
vendored
Normal file
63
node_modules/badge-maker/lib/make-badge.js
generated
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
'use strict'
|
||||
|
||||
const { normalizeColor, toSvgColor } = require('./color')
|
||||
const badgeRenderers = require('./badge-renderers')
|
||||
const { stripXmlWhitespace } = require('./xml')
|
||||
|
||||
/*
|
||||
note: makeBadge() is fairly thinly wrapped so if we are making changes here
|
||||
it is likely this will impact on the package's public interface in index.js
|
||||
*/
|
||||
module.exports = function makeBadge({
|
||||
format,
|
||||
style = 'flat',
|
||||
label,
|
||||
message,
|
||||
color,
|
||||
labelColor,
|
||||
logo,
|
||||
logoPosition,
|
||||
logoWidth,
|
||||
links = ['', ''],
|
||||
}) {
|
||||
// String coercion and whitespace removal.
|
||||
label = `${label}`.trim()
|
||||
message = `${message}`.trim()
|
||||
|
||||
// This ought to be the responsibility of the server, not `makeBadge`.
|
||||
if (format === 'json') {
|
||||
return JSON.stringify({
|
||||
label,
|
||||
message,
|
||||
logoWidth,
|
||||
// Only call normalizeColor for the JSON case: this is handled
|
||||
// internally by toSvgColor in the SVG case.
|
||||
color: normalizeColor(color),
|
||||
labelColor: normalizeColor(labelColor),
|
||||
link: links,
|
||||
name: label,
|
||||
value: message,
|
||||
})
|
||||
}
|
||||
|
||||
const render = badgeRenderers[style]
|
||||
if (!render) {
|
||||
throw new Error(`Unknown badge style: '${style}'`)
|
||||
}
|
||||
|
||||
logoWidth = +logoWidth || (logo ? 14 : 0)
|
||||
|
||||
return stripXmlWhitespace(
|
||||
render({
|
||||
label,
|
||||
message,
|
||||
links,
|
||||
logo,
|
||||
logoPosition,
|
||||
logoWidth,
|
||||
logoPadding: logo && label.length ? 3 : 0,
|
||||
color: toSvgColor(color),
|
||||
labelColor: toSvgColor(labelColor),
|
||||
})
|
||||
)
|
||||
}
|
||||
76
node_modules/badge-maker/lib/xml.js
generated
vendored
Normal file
76
node_modules/badge-maker/lib/xml.js
generated
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
/**
|
||||
* @module
|
||||
*/
|
||||
|
||||
'use strict'
|
||||
|
||||
function stripXmlWhitespace(xml) {
|
||||
return xml.replace(/>\s+/g, '>').replace(/<\s+/g, '<').trim()
|
||||
}
|
||||
|
||||
function escapeXml(s) {
|
||||
if (typeof s === 'number') {
|
||||
return s
|
||||
} else if (s === undefined || typeof s !== 'string') {
|
||||
return undefined
|
||||
} else {
|
||||
return s
|
||||
.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"')
|
||||
.replace(/'/g, ''')
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Representation of an XML element
|
||||
*/
|
||||
class XmlElement {
|
||||
/**
|
||||
* Xml Element Constructor
|
||||
*
|
||||
* @param {object} attrs Refer to individual attrs
|
||||
* @param {string} attrs.name
|
||||
* Name of the XML tag
|
||||
* @param {Array.<string|module:badge-maker/lib/xml-element~XmlElement>} [attrs.content=[]]
|
||||
* Array of objects to render inside the tag. content may contain a mix of
|
||||
* string and XmlElement objects. If content is `[]` or ommitted the
|
||||
* element will be rendered as a self-closing element.
|
||||
* @param {object} [attrs.attrs={}]
|
||||
* Object representing the tag's attributes as name/value pairs
|
||||
*/
|
||||
constructor({ name, content = [], attrs = {} }) {
|
||||
this.name = name
|
||||
this.content = content
|
||||
this.attrs = attrs
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the XML element to a string, applying appropriate escaping
|
||||
*
|
||||
* @returns {string} String representation of the XML element
|
||||
*/
|
||||
render() {
|
||||
const attrsStr = Object.entries(this.attrs)
|
||||
.map(([k, v]) => ` ${k}="${escapeXml(v)}"`)
|
||||
.join('')
|
||||
if (this.content.length > 0) {
|
||||
const content = this.content
|
||||
.map(function (el) {
|
||||
if (el instanceof XmlElement) {
|
||||
return el.render()
|
||||
} else {
|
||||
return escapeXml(el)
|
||||
}
|
||||
})
|
||||
.join(' ')
|
||||
return stripXmlWhitespace(
|
||||
`<${this.name}${attrsStr}>${content}</${this.name}>`
|
||||
)
|
||||
}
|
||||
return stripXmlWhitespace(`<${this.name}${attrsStr}/>`)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { escapeXml, stripXmlWhitespace, XmlElement }
|
||||
44
node_modules/badge-maker/package.json
generated
vendored
Normal file
44
node_modules/badge-maker/package.json
generated
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"name": "badge-maker",
|
||||
"version": "3.3.1",
|
||||
"description": "Shields.io badge library",
|
||||
"keywords": [
|
||||
"GitHub",
|
||||
"badge",
|
||||
"SVG",
|
||||
"image",
|
||||
"shields.io"
|
||||
],
|
||||
"types": "index.d.ts",
|
||||
"main": "lib/index.js",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/badges/shields.git",
|
||||
"directory": "badge-maker"
|
||||
},
|
||||
"author": "Thaddée Tyl <thaddee.tyl@gmail.com>",
|
||||
"license": "CC0-1.0",
|
||||
"bugs": {
|
||||
"url": "https://github.com/badges/shields/issues"
|
||||
},
|
||||
"homepage": "http://shields.io",
|
||||
"bin": {
|
||||
"badge": "lib/badge-cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10",
|
||||
"npm": ">= 5"
|
||||
},
|
||||
"collective": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/shields",
|
||||
"logo": "https://opencollective.com/opencollective/logo.txt"
|
||||
},
|
||||
"dependencies": {
|
||||
"anafanafo": "2.0.0",
|
||||
"css-color-converter": "^2.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "echo 'Run tests from parent dir'; false"
|
||||
}
|
||||
}
|
||||
6
node_modules/binary-search/.travis.yml
generated
vendored
Normal file
6
node_modules/binary-search/.travis.yml
generated
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- '6'
|
||||
cache:
|
||||
directories:
|
||||
- node_modules
|
||||
46
node_modules/binary-search/README.md
generated
vendored
Normal file
46
node_modules/binary-search/README.md
generated
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
binary-search
|
||||
=============
|
||||
|
||||
This is a really tiny, stupid, simple binary search library for Node.JS. We
|
||||
wrote it because existing solutions were bloated and incorrect.
|
||||
|
||||
This version is a straight port of the Java version mentioned by Joshua Bloch
|
||||
in his article, [Nearly All Binary Searches and Merge Sorts are Broken](http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html).
|
||||
|
||||
Thanks to [Conrad Irwin](https://github.com/ConradIrwin) and [Michael
|
||||
Marino](https://github.com/mgmarino) for, ironically, pointing out bugs.
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
```js
|
||||
var bs = require("binary-search");
|
||||
|
||||
bs([1, 2, 3, 4], 3, function(element, needle) { return element - needle; });
|
||||
// => 2
|
||||
|
||||
bs([1, 2, 4, 5], 3, function(element, needle) { return element - needle; });
|
||||
// => -3
|
||||
```
|
||||
|
||||
Be advised that passing in a comparator function is *required*. Since you're
|
||||
probably using one for your sort function anyway, this isn't a big deal.
|
||||
|
||||
The comparator takes a 1st and 2nd argument of element and needle, respectively.
|
||||
|
||||
The comparator also takes a 3rd and 4th argument, the current index and array,
|
||||
respectively. You shouldn't normally need the index or array to compare values,
|
||||
but it's there if you do.
|
||||
|
||||
You may also, optionally, specify an input range as the final two parameters,
|
||||
in case you want to limit the search to a particular range of inputs. However,
|
||||
be advised that this is generally a bad idea (but sometimes bad ideas are
|
||||
necessary).
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
To the extent possible by law, The Dark Sky Company, LLC has [waived all
|
||||
copyright and related or neighboring rights][cc0] to this library.
|
||||
|
||||
[cc0]: http://creativecommons.org/publicdomain/zero/1.0/
|
||||
22
node_modules/binary-search/binary-search.d.ts
generated
vendored
Normal file
22
node_modules/binary-search/binary-search.d.ts
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
//Typescript type definition for:
|
||||
//https://github.com/darkskyapp/binary-search
|
||||
declare module 'binary-search' {
|
||||
|
||||
function binarySearch<A, B>(
|
||||
haystack: ArrayLike<A>,
|
||||
needle: B,
|
||||
comparator: (a: A, b: B, index?: number, haystack?: A[]) => any,
|
||||
// Notes about comparator return value:
|
||||
// * when a<b the comparator's returned value should be:
|
||||
// * negative number or a value such that `+value` is a negative number
|
||||
// * examples: `-1` or the string `"-1"`
|
||||
// * when a>b the comparator's returned value should be:
|
||||
// * positive number or a value such that `+value` is a positive number
|
||||
// * examples: `1` or the string `"1"`
|
||||
// * when a===b
|
||||
// * any value other than the return cases for a<b and a>b
|
||||
// * examples: undefined, NaN, 'abc'
|
||||
low?: number,
|
||||
high?: number): number; //returns index of found result or number < 0 if not found
|
||||
export = binarySearch;
|
||||
}
|
||||
45
node_modules/binary-search/index.js
generated
vendored
Normal file
45
node_modules/binary-search/index.js
generated
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
module.exports = function(haystack, needle, comparator, low, high) {
|
||||
var mid, cmp;
|
||||
|
||||
if(low === undefined)
|
||||
low = 0;
|
||||
|
||||
else {
|
||||
low = low|0;
|
||||
if(low < 0 || low >= haystack.length)
|
||||
throw new RangeError("invalid lower bound");
|
||||
}
|
||||
|
||||
if(high === undefined)
|
||||
high = haystack.length - 1;
|
||||
|
||||
else {
|
||||
high = high|0;
|
||||
if(high < low || high >= haystack.length)
|
||||
throw new RangeError("invalid upper bound");
|
||||
}
|
||||
|
||||
while(low <= high) {
|
||||
// The naive `low + high >>> 1` could fail for array lengths > 2**31
|
||||
// because `>>>` converts its operands to int32. `low + (high - low >>> 1)`
|
||||
// works for array lengths <= 2**32-1 which is also Javascript's max array
|
||||
// length.
|
||||
mid = low + ((high - low) >>> 1);
|
||||
cmp = +comparator(haystack[mid], needle, mid, haystack);
|
||||
|
||||
// Too low.
|
||||
if(cmp < 0.0)
|
||||
low = mid + 1;
|
||||
|
||||
// Too high.
|
||||
else if(cmp > 0.0)
|
||||
high = mid - 1;
|
||||
|
||||
// Key found.
|
||||
else
|
||||
return mid;
|
||||
}
|
||||
|
||||
// Key not found.
|
||||
return ~low;
|
||||
}
|
||||
28
node_modules/binary-search/package.json
generated
vendored
Normal file
28
node_modules/binary-search/package.json
generated
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"name": "binary-search",
|
||||
"version": "1.3.6",
|
||||
"description": "tiny binary search function with comparators",
|
||||
"license": "CC0-1.0",
|
||||
"typings": "./binary-search.d.ts",
|
||||
"author": {
|
||||
"name": "The Dark Sky Company, LLC",
|
||||
"email": "support@darkskyapp.com"
|
||||
},
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Darcy Parker",
|
||||
"web": "https://github.com/darcyparker"
|
||||
}
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/darkskyapp/binary-search.git"
|
||||
},
|
||||
"devDependencies": {
|
||||
"chai": "^4.2.0",
|
||||
"mocha": "^5.2.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "mocha"
|
||||
}
|
||||
}
|
||||
46
node_modules/binary-search/test.js
generated
vendored
Normal file
46
node_modules/binary-search/test.js
generated
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
var expect = require("chai").expect;
|
||||
|
||||
describe("binarysearch", function() {
|
||||
var bs = require("./"),
|
||||
arr = [1, 2, 2, 2, 3, 5, 9],
|
||||
cmp = function(a, b) { return a - b; };
|
||||
|
||||
it("should bail if not passed an array", function() {
|
||||
expect(function() { bs(undefined, 3, cmp); }).to.throw(TypeError);
|
||||
});
|
||||
|
||||
it("should bail if not passed a comparator", function() {
|
||||
expect(function() { bs(arr, 3, undefined); }).to.throw(TypeError);
|
||||
});
|
||||
|
||||
it("should return the index of an item in a sorted array", function() {
|
||||
expect(bs(arr, 3, cmp)).to.equal(4);
|
||||
});
|
||||
|
||||
it("should return the index of where the item would go plus one, negated, if the item is not found", function() {
|
||||
expect(bs(arr, 4, cmp)).to.equal(-6);
|
||||
});
|
||||
|
||||
it("should return any valid index if an item exists multiple times in the array", function() {
|
||||
expect(bs(arr, 2, cmp)).to.equal(3);
|
||||
});
|
||||
|
||||
it("should work even on empty arrays", function() {
|
||||
expect(bs([], 42, cmp)).to.equal(-1);
|
||||
});
|
||||
|
||||
it("should work even on arrays of doubles", function() {
|
||||
expect(bs([0.0, 0.1, 0.2, 0.3, 0.4], 0.25, cmp)).to.equal(-4);
|
||||
});
|
||||
|
||||
it("should pass the index and array parameters to the comparator", function() {
|
||||
var indexes = [],
|
||||
indexCmp = function(a, b, i, array) {
|
||||
expect(array).to.equal(arr);
|
||||
indexes.push(i);
|
||||
return cmp(a, b);
|
||||
};
|
||||
bs(arr, 3, indexCmp);
|
||||
expect(indexes).to.deep.equal([3, 5, 4])
|
||||
});
|
||||
});
|
||||
18
node_modules/char-width-table-consumer/CHANGELOG.md
generated
vendored
Normal file
18
node_modules/char-width-table-consumer/CHANGELOG.md
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
# Changelog
|
||||
|
||||
## 1.0.0 – Apr 12, 2019
|
||||
|
||||
- Update dependencies.
|
||||
- Same API as previous release.
|
||||
|
||||
## 0.2.1 – Nov 15, 2018
|
||||
|
||||
No external changes.
|
||||
|
||||
## 0.2.0 – Nov 13, 2018
|
||||
|
||||
- Add `loadConsumerSync()` function.
|
||||
|
||||
## 0.1.0 – Nov 13, 2018
|
||||
|
||||
Initial release.
|
||||
21
node_modules/char-width-table-consumer/LICENSE
generated
vendored
Normal file
21
node_modules/char-width-table-consumer/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018 Metabolize LLC
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
32
node_modules/char-width-table-consumer/README.md
generated
vendored
Normal file
32
node_modules/char-width-table-consumer/README.md
generated
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
# char-width-table-consumer
|
||||
|
||||
[][npm]
|
||||
[][npm]
|
||||
[][build]
|
||||
[][prettier]
|
||||
[][lerna]
|
||||
|
||||
[npm]: https://npmjs.com/char-width-table-consumer
|
||||
[build]: https://circleci.com/gh/metabolize/anafanafo/tree/master
|
||||
[prettier]: https://prettier.io/
|
||||
[lerna]: https://lernajs.io/
|
||||
|
||||
Measure text using a character width table.
|
||||
|
||||
[puppeteer]: https://pptr.dev/
|
||||
|
||||
## Features
|
||||
|
||||
This library allows efficient text measuring using a character width table.
|
||||
Create the tables using companion package [char-width-table-builder][].
|
||||
|
||||
This performs a simple lookup, without considering kerning.
|
||||
|
||||
Built with [Shields][] in mind.
|
||||
|
||||
[char-width-table-builder]: https://www.npmjs.com/package/char-width-table-builder
|
||||
[shields]: https://github.com/badges/shields/
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT license.
|
||||
16
node_modules/char-width-table-consumer/package.json
generated
vendored
Normal file
16
node_modules/char-width-table-consumer/package.json
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "char-width-table-consumer",
|
||||
"version": "1.0.0",
|
||||
"repository": "metabolize/anafanafo",
|
||||
"description": "Measure text using a character width table",
|
||||
"main": "src",
|
||||
"scripts": {
|
||||
"test": "jest"
|
||||
},
|
||||
"author": "Metabolize",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"binary-search": "^1.3.5"
|
||||
},
|
||||
"gitHead": "4bd230d372ffe93cd9bf7f036b83be6ef5dab75e"
|
||||
}
|
||||
79
node_modules/char-width-table-consumer/src/consumer.js
generated
vendored
Normal file
79
node_modules/char-width-table-consumer/src/consumer.js
generated
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
'use strict'
|
||||
|
||||
const fs = require('fs')
|
||||
const bs = require('binary-search')
|
||||
const { promisify } = require('util')
|
||||
const readFile = promisify(fs.readFile)
|
||||
|
||||
module.exports = class CharWidthTableConsumer {
|
||||
constructor(data) {
|
||||
this.data = data
|
||||
this.emWidth = this.widthOf('m')
|
||||
}
|
||||
|
||||
static create(data) {
|
||||
return new CharWidthTableConsumer(data)
|
||||
}
|
||||
|
||||
static async load(path) {
|
||||
const json = await readFile(path)
|
||||
const data = JSON.parse(json)
|
||||
return new CharWidthTableConsumer(data)
|
||||
}
|
||||
|
||||
static loadSync(path) {
|
||||
const json = fs.readFileSync(path)
|
||||
const data = JSON.parse(json)
|
||||
return new CharWidthTableConsumer(data)
|
||||
}
|
||||
|
||||
static isControlChar(charCode) {
|
||||
return charCode <= 31 || charCode === 127
|
||||
}
|
||||
|
||||
widthOfCharCode(charCode) {
|
||||
if (this.constructor.isControlChar(charCode)) {
|
||||
return 0.0
|
||||
}
|
||||
|
||||
// https://github.com/darkskyapp/binary-search/pull/18
|
||||
const index = bs(this.data, charCode, ([lower], needle) => lower - needle)
|
||||
if (index >= 0) {
|
||||
// The index matches the beginning of a range.
|
||||
const [, , width] = this.data[index]
|
||||
return width
|
||||
} else {
|
||||
// The index does not match the beginning of a range, which means it
|
||||
// should be in the preceeding range A return value of `-x` means the
|
||||
// needle would be at `x - 1`, and we want to check the element before
|
||||
// that.
|
||||
const candidateIndex = -index - 2
|
||||
const [lower, upper, width] = this.data[candidateIndex]
|
||||
if (charCode >= lower && charCode <= upper) {
|
||||
return width
|
||||
} else {
|
||||
return undefined
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
widthOf(text, { guess = true } = {}) {
|
||||
// Array.from() will split a string into an array of strings, each of
|
||||
// which contains a single code point.
|
||||
// https://stackoverflow.com/a/42596897/893113
|
||||
return Array.from(text).reduce((accumWidth, char) => {
|
||||
const charWidth = this.widthOfCharCode(char.codePointAt(0))
|
||||
if (charWidth === undefined) {
|
||||
if (guess) {
|
||||
return accumWidth + this.emWidth
|
||||
} else {
|
||||
throw Error(
|
||||
`No width available for character code ${char.codePointAt(0)}`
|
||||
)
|
||||
}
|
||||
} else {
|
||||
return accumWidth + charWidth
|
||||
}
|
||||
}, 0.0)
|
||||
}
|
||||
}
|
||||
16
node_modules/char-width-table-consumer/src/index.js
generated
vendored
Normal file
16
node_modules/char-width-table-consumer/src/index.js
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
'use strict'
|
||||
|
||||
const CharWidthTableConsumer = require('./consumer')
|
||||
|
||||
const {
|
||||
create: createConsumer,
|
||||
load: loadConsumer,
|
||||
loadSync: loadConsumerSync,
|
||||
} = CharWidthTableConsumer
|
||||
|
||||
module.exports = {
|
||||
createConsumer,
|
||||
loadConsumer,
|
||||
loadConsumerSync,
|
||||
CharWidthTableConsumer,
|
||||
}
|
||||
1
node_modules/color-convert/.travis.yml
generated
vendored
Normal file
1
node_modules/color-convert/.travis.yml
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
language: node_js
|
||||
4
node_modules/color-convert/CHANGELOG.md
generated
vendored
Normal file
4
node_modules/color-convert/CHANGELOG.md
generated
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
# 0.5.3 - 2015-06-02
|
||||
|
||||
- Fixed: hsl2hsv does not return `NaN` anymore when using `[0,0,0]`
|
||||
([#15](https://github.com/harthur/color-convert/issues/15))
|
||||
21
node_modules/color-convert/LICENSE
generated
vendored
Normal file
21
node_modules/color-convert/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
Copyright (c) 2011 Heather Arthur <fayearthur@gmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
57
node_modules/color-convert/README.md
generated
vendored
Normal file
57
node_modules/color-convert/README.md
generated
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
# color-convert [](https://travis-ci.org/harthur/color-convert)
|
||||
Color-convert is a color conversion library for JavaScript and node. It converts all ways between `rgb`, `hsl`, `hsv`, `hwb`, `cmyk`, and CSS keywords:
|
||||
|
||||
```js
|
||||
var converter = require("color-convert")();
|
||||
|
||||
converter.rgb(140, 200, 100).hsl() // [96, 48, 59]
|
||||
|
||||
converter.keyword("blue").rgb() // [0, 0, 255]
|
||||
```
|
||||
|
||||
# Install
|
||||
|
||||
```console
|
||||
npm install color-convert
|
||||
```
|
||||
|
||||
# API
|
||||
|
||||
Color-convert exports a converter object with getter/setter methods for each color space. It caches conversions:
|
||||
|
||||
```js
|
||||
var converter = require("color-convert")();
|
||||
|
||||
converter.rgb(140, 200, 100).hsl() // [96, 48, 59]
|
||||
|
||||
converter.rgb([140, 200, 100]) // args can be an array
|
||||
```
|
||||
|
||||
### Plain functions
|
||||
Get direct conversion functions with no fancy objects:
|
||||
|
||||
```js
|
||||
require("color-convert").rgb2hsl([140, 200, 100]); // [96, 48, 59]
|
||||
```
|
||||
|
||||
### Unrounded
|
||||
To get the unrounded conversion, append `Raw` to the function name:
|
||||
|
||||
```js
|
||||
convert.rgb2hslRaw([140, 200, 100]); // [95.99999999999999, 47.619047619047606, 58.82352941176471]
|
||||
```
|
||||
|
||||
### Hash
|
||||
There's also a hash of the conversion functions keyed first by the "from" color space, then by the "to" color space:
|
||||
|
||||
```js
|
||||
convert["hsl"]["hsv"]([160, 0, 20]) == convert.hsl2hsv([160, 0, 20])
|
||||
```
|
||||
|
||||
### Other spaces
|
||||
|
||||
There are some conversions from rgb (sRGB) to XYZ and LAB too, available as `rgb2xyz()`, `rgb2lab()`, `xyz2rgb()`, and `xyz2lab()`.
|
||||
|
||||
# Contribute
|
||||
|
||||
Please fork, add conversions, figure out color profile stuff for XYZ, LAB, etc. This is meant to be a basic library that can be used by other libraries to wrap color calculations in some cool way.
|
||||
9
node_modules/color-convert/component.json
generated
vendored
Normal file
9
node_modules/color-convert/component.json
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"name": "color-convert",
|
||||
"description": "Plain color conversion functions",
|
||||
"version": "0.5.3",
|
||||
"author": "Heather Arthur <fayearthur@gmail.com>",
|
||||
"repository": "harthur/color-convert",
|
||||
"keywords": ["color", "colour", "rgb"],
|
||||
"scripts": ["index.js", "conversions.js"]
|
||||
}
|
||||
698
node_modules/color-convert/conversions.js
generated
vendored
Normal file
698
node_modules/color-convert/conversions.js
generated
vendored
Normal file
@@ -0,0 +1,698 @@
|
||||
/* MIT license */
|
||||
|
||||
module.exports = {
|
||||
rgb2hsl: rgb2hsl,
|
||||
rgb2hsv: rgb2hsv,
|
||||
rgb2hwb: rgb2hwb,
|
||||
rgb2cmyk: rgb2cmyk,
|
||||
rgb2keyword: rgb2keyword,
|
||||
rgb2xyz: rgb2xyz,
|
||||
rgb2lab: rgb2lab,
|
||||
rgb2lch: rgb2lch,
|
||||
|
||||
hsl2rgb: hsl2rgb,
|
||||
hsl2hsv: hsl2hsv,
|
||||
hsl2hwb: hsl2hwb,
|
||||
hsl2cmyk: hsl2cmyk,
|
||||
hsl2keyword: hsl2keyword,
|
||||
|
||||
hsv2rgb: hsv2rgb,
|
||||
hsv2hsl: hsv2hsl,
|
||||
hsv2hwb: hsv2hwb,
|
||||
hsv2cmyk: hsv2cmyk,
|
||||
hsv2keyword: hsv2keyword,
|
||||
|
||||
hwb2rgb: hwb2rgb,
|
||||
hwb2hsl: hwb2hsl,
|
||||
hwb2hsv: hwb2hsv,
|
||||
hwb2cmyk: hwb2cmyk,
|
||||
hwb2keyword: hwb2keyword,
|
||||
|
||||
cmyk2rgb: cmyk2rgb,
|
||||
cmyk2hsl: cmyk2hsl,
|
||||
cmyk2hsv: cmyk2hsv,
|
||||
cmyk2hwb: cmyk2hwb,
|
||||
cmyk2keyword: cmyk2keyword,
|
||||
|
||||
keyword2rgb: keyword2rgb,
|
||||
keyword2hsl: keyword2hsl,
|
||||
keyword2hsv: keyword2hsv,
|
||||
keyword2hwb: keyword2hwb,
|
||||
keyword2cmyk: keyword2cmyk,
|
||||
keyword2lab: keyword2lab,
|
||||
keyword2xyz: keyword2xyz,
|
||||
|
||||
xyz2rgb: xyz2rgb,
|
||||
xyz2lab: xyz2lab,
|
||||
xyz2lch: xyz2lch,
|
||||
|
||||
lab2xyz: lab2xyz,
|
||||
lab2rgb: lab2rgb,
|
||||
lab2lch: lab2lch,
|
||||
|
||||
lch2lab: lch2lab,
|
||||
lch2xyz: lch2xyz,
|
||||
lch2rgb: lch2rgb
|
||||
}
|
||||
|
||||
|
||||
function rgb2hsl(rgb) {
|
||||
var r = rgb[0]/255,
|
||||
g = rgb[1]/255,
|
||||
b = rgb[2]/255,
|
||||
min = Math.min(r, g, b),
|
||||
max = Math.max(r, g, b),
|
||||
delta = max - min,
|
||||
h, s, l;
|
||||
|
||||
if (max == min)
|
||||
h = 0;
|
||||
else if (r == max)
|
||||
h = (g - b) / delta;
|
||||
else if (g == max)
|
||||
h = 2 + (b - r) / delta;
|
||||
else if (b == max)
|
||||
h = 4 + (r - g)/ delta;
|
||||
|
||||
h = Math.min(h * 60, 360);
|
||||
|
||||
if (h < 0)
|
||||
h += 360;
|
||||
|
||||
l = (min + max) / 2;
|
||||
|
||||
if (max == min)
|
||||
s = 0;
|
||||
else if (l <= 0.5)
|
||||
s = delta / (max + min);
|
||||
else
|
||||
s = delta / (2 - max - min);
|
||||
|
||||
return [h, s * 100, l * 100];
|
||||
}
|
||||
|
||||
function rgb2hsv(rgb) {
|
||||
var r = rgb[0],
|
||||
g = rgb[1],
|
||||
b = rgb[2],
|
||||
min = Math.min(r, g, b),
|
||||
max = Math.max(r, g, b),
|
||||
delta = max - min,
|
||||
h, s, v;
|
||||
|
||||
if (max == 0)
|
||||
s = 0;
|
||||
else
|
||||
s = (delta/max * 1000)/10;
|
||||
|
||||
if (max == min)
|
||||
h = 0;
|
||||
else if (r == max)
|
||||
h = (g - b) / delta;
|
||||
else if (g == max)
|
||||
h = 2 + (b - r) / delta;
|
||||
else if (b == max)
|
||||
h = 4 + (r - g) / delta;
|
||||
|
||||
h = Math.min(h * 60, 360);
|
||||
|
||||
if (h < 0)
|
||||
h += 360;
|
||||
|
||||
v = ((max / 255) * 1000) / 10;
|
||||
|
||||
return [h, s, v];
|
||||
}
|
||||
|
||||
function rgb2hwb(rgb) {
|
||||
var r = rgb[0],
|
||||
g = rgb[1],
|
||||
b = rgb[2],
|
||||
h = rgb2hsl(rgb)[0],
|
||||
w = 1/255 * Math.min(r, Math.min(g, b)),
|
||||
b = 1 - 1/255 * Math.max(r, Math.max(g, b));
|
||||
|
||||
return [h, w * 100, b * 100];
|
||||
}
|
||||
|
||||
function rgb2cmyk(rgb) {
|
||||
var r = rgb[0] / 255,
|
||||
g = rgb[1] / 255,
|
||||
b = rgb[2] / 255,
|
||||
c, m, y, k;
|
||||
|
||||
k = Math.min(1 - r, 1 - g, 1 - b);
|
||||
c = (1 - r - k) / (1 - k) || 0;
|
||||
m = (1 - g - k) / (1 - k) || 0;
|
||||
y = (1 - b - k) / (1 - k) || 0;
|
||||
return [c * 100, m * 100, y * 100, k * 100];
|
||||
}
|
||||
|
||||
function rgb2keyword(rgb) {
|
||||
return reverseKeywords[JSON.stringify(rgb)];
|
||||
}
|
||||
|
||||
function rgb2xyz(rgb) {
|
||||
var r = rgb[0] / 255,
|
||||
g = rgb[1] / 255,
|
||||
b = rgb[2] / 255;
|
||||
|
||||
// assume sRGB
|
||||
r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
|
||||
g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
|
||||
b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);
|
||||
|
||||
var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
|
||||
var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
|
||||
var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
|
||||
|
||||
return [x * 100, y *100, z * 100];
|
||||
}
|
||||
|
||||
function rgb2lab(rgb) {
|
||||
var xyz = rgb2xyz(rgb),
|
||||
x = xyz[0],
|
||||
y = xyz[1],
|
||||
z = xyz[2],
|
||||
l, a, b;
|
||||
|
||||
x /= 95.047;
|
||||
y /= 100;
|
||||
z /= 108.883;
|
||||
|
||||
x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);
|
||||
y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);
|
||||
z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);
|
||||
|
||||
l = (116 * y) - 16;
|
||||
a = 500 * (x - y);
|
||||
b = 200 * (y - z);
|
||||
|
||||
return [l, a, b];
|
||||
}
|
||||
|
||||
function rgb2lch(args) {
|
||||
return lab2lch(rgb2lab(args));
|
||||
}
|
||||
|
||||
function hsl2rgb(hsl) {
|
||||
var h = hsl[0] / 360,
|
||||
s = hsl[1] / 100,
|
||||
l = hsl[2] / 100,
|
||||
t1, t2, t3, rgb, val;
|
||||
|
||||
if (s == 0) {
|
||||
val = l * 255;
|
||||
return [val, val, val];
|
||||
}
|
||||
|
||||
if (l < 0.5)
|
||||
t2 = l * (1 + s);
|
||||
else
|
||||
t2 = l + s - l * s;
|
||||
t1 = 2 * l - t2;
|
||||
|
||||
rgb = [0, 0, 0];
|
||||
for (var i = 0; i < 3; i++) {
|
||||
t3 = h + 1 / 3 * - (i - 1);
|
||||
t3 < 0 && t3++;
|
||||
t3 > 1 && t3--;
|
||||
|
||||
if (6 * t3 < 1)
|
||||
val = t1 + (t2 - t1) * 6 * t3;
|
||||
else if (2 * t3 < 1)
|
||||
val = t2;
|
||||
else if (3 * t3 < 2)
|
||||
val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
|
||||
else
|
||||
val = t1;
|
||||
|
||||
rgb[i] = val * 255;
|
||||
}
|
||||
|
||||
return rgb;
|
||||
}
|
||||
|
||||
function hsl2hsv(hsl) {
|
||||
var h = hsl[0],
|
||||
s = hsl[1] / 100,
|
||||
l = hsl[2] / 100,
|
||||
sv, v;
|
||||
|
||||
if(l === 0) {
|
||||
// no need to do calc on black
|
||||
// also avoids divide by 0 error
|
||||
return [0, 0, 0];
|
||||
}
|
||||
|
||||
l *= 2;
|
||||
s *= (l <= 1) ? l : 2 - l;
|
||||
v = (l + s) / 2;
|
||||
sv = (2 * s) / (l + s);
|
||||
return [h, sv * 100, v * 100];
|
||||
}
|
||||
|
||||
function hsl2hwb(args) {
|
||||
return rgb2hwb(hsl2rgb(args));
|
||||
}
|
||||
|
||||
function hsl2cmyk(args) {
|
||||
return rgb2cmyk(hsl2rgb(args));
|
||||
}
|
||||
|
||||
function hsl2keyword(args) {
|
||||
return rgb2keyword(hsl2rgb(args));
|
||||
}
|
||||
|
||||
|
||||
function hsv2rgb(hsv) {
|
||||
var h = hsv[0] / 60,
|
||||
s = hsv[1] / 100,
|
||||
v = hsv[2] / 100,
|
||||
hi = Math.floor(h) % 6;
|
||||
|
||||
var f = h - Math.floor(h),
|
||||
p = 255 * v * (1 - s),
|
||||
q = 255 * v * (1 - (s * f)),
|
||||
t = 255 * v * (1 - (s * (1 - f))),
|
||||
v = 255 * v;
|
||||
|
||||
switch(hi) {
|
||||
case 0:
|
||||
return [v, t, p];
|
||||
case 1:
|
||||
return [q, v, p];
|
||||
case 2:
|
||||
return [p, v, t];
|
||||
case 3:
|
||||
return [p, q, v];
|
||||
case 4:
|
||||
return [t, p, v];
|
||||
case 5:
|
||||
return [v, p, q];
|
||||
}
|
||||
}
|
||||
|
||||
function hsv2hsl(hsv) {
|
||||
var h = hsv[0],
|
||||
s = hsv[1] / 100,
|
||||
v = hsv[2] / 100,
|
||||
sl, l;
|
||||
|
||||
l = (2 - s) * v;
|
||||
sl = s * v;
|
||||
sl /= (l <= 1) ? l : 2 - l;
|
||||
sl = sl || 0;
|
||||
l /= 2;
|
||||
return [h, sl * 100, l * 100];
|
||||
}
|
||||
|
||||
function hsv2hwb(args) {
|
||||
return rgb2hwb(hsv2rgb(args))
|
||||
}
|
||||
|
||||
function hsv2cmyk(args) {
|
||||
return rgb2cmyk(hsv2rgb(args));
|
||||
}
|
||||
|
||||
function hsv2keyword(args) {
|
||||
return rgb2keyword(hsv2rgb(args));
|
||||
}
|
||||
|
||||
// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
|
||||
function hwb2rgb(hwb) {
|
||||
var h = hwb[0] / 360,
|
||||
wh = hwb[1] / 100,
|
||||
bl = hwb[2] / 100,
|
||||
ratio = wh + bl,
|
||||
i, v, f, n;
|
||||
|
||||
// wh + bl cant be > 1
|
||||
if (ratio > 1) {
|
||||
wh /= ratio;
|
||||
bl /= ratio;
|
||||
}
|
||||
|
||||
i = Math.floor(6 * h);
|
||||
v = 1 - bl;
|
||||
f = 6 * h - i;
|
||||
if ((i & 0x01) != 0) {
|
||||
f = 1 - f;
|
||||
}
|
||||
n = wh + f * (v - wh); // linear interpolation
|
||||
|
||||
switch (i) {
|
||||
default:
|
||||
case 6:
|
||||
case 0: r = v; g = n; b = wh; break;
|
||||
case 1: r = n; g = v; b = wh; break;
|
||||
case 2: r = wh; g = v; b = n; break;
|
||||
case 3: r = wh; g = n; b = v; break;
|
||||
case 4: r = n; g = wh; b = v; break;
|
||||
case 5: r = v; g = wh; b = n; break;
|
||||
}
|
||||
|
||||
return [r * 255, g * 255, b * 255];
|
||||
}
|
||||
|
||||
function hwb2hsl(args) {
|
||||
return rgb2hsl(hwb2rgb(args));
|
||||
}
|
||||
|
||||
function hwb2hsv(args) {
|
||||
return rgb2hsv(hwb2rgb(args));
|
||||
}
|
||||
|
||||
function hwb2cmyk(args) {
|
||||
return rgb2cmyk(hwb2rgb(args));
|
||||
}
|
||||
|
||||
function hwb2keyword(args) {
|
||||
return rgb2keyword(hwb2rgb(args));
|
||||
}
|
||||
|
||||
function cmyk2rgb(cmyk) {
|
||||
var c = cmyk[0] / 100,
|
||||
m = cmyk[1] / 100,
|
||||
y = cmyk[2] / 100,
|
||||
k = cmyk[3] / 100,
|
||||
r, g, b;
|
||||
|
||||
r = 1 - Math.min(1, c * (1 - k) + k);
|
||||
g = 1 - Math.min(1, m * (1 - k) + k);
|
||||
b = 1 - Math.min(1, y * (1 - k) + k);
|
||||
return [r * 255, g * 255, b * 255];
|
||||
}
|
||||
|
||||
function cmyk2hsl(args) {
|
||||
return rgb2hsl(cmyk2rgb(args));
|
||||
}
|
||||
|
||||
function cmyk2hsv(args) {
|
||||
return rgb2hsv(cmyk2rgb(args));
|
||||
}
|
||||
|
||||
function cmyk2hwb(args) {
|
||||
return rgb2hwb(cmyk2rgb(args));
|
||||
}
|
||||
|
||||
function cmyk2keyword(args) {
|
||||
return rgb2keyword(cmyk2rgb(args));
|
||||
}
|
||||
|
||||
|
||||
function xyz2rgb(xyz) {
|
||||
var x = xyz[0] / 100,
|
||||
y = xyz[1] / 100,
|
||||
z = xyz[2] / 100,
|
||||
r, g, b;
|
||||
|
||||
r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
|
||||
g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
|
||||
b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
|
||||
|
||||
// assume sRGB
|
||||
r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
|
||||
: r = (r * 12.92);
|
||||
|
||||
g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
|
||||
: g = (g * 12.92);
|
||||
|
||||
b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
|
||||
: b = (b * 12.92);
|
||||
|
||||
r = Math.min(Math.max(0, r), 1);
|
||||
g = Math.min(Math.max(0, g), 1);
|
||||
b = Math.min(Math.max(0, b), 1);
|
||||
|
||||
return [r * 255, g * 255, b * 255];
|
||||
}
|
||||
|
||||
function xyz2lab(xyz) {
|
||||
var x = xyz[0],
|
||||
y = xyz[1],
|
||||
z = xyz[2],
|
||||
l, a, b;
|
||||
|
||||
x /= 95.047;
|
||||
y /= 100;
|
||||
z /= 108.883;
|
||||
|
||||
x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);
|
||||
y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);
|
||||
z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);
|
||||
|
||||
l = (116 * y) - 16;
|
||||
a = 500 * (x - y);
|
||||
b = 200 * (y - z);
|
||||
|
||||
return [l, a, b];
|
||||
}
|
||||
|
||||
function xyz2lch(args) {
|
||||
return lab2lch(xyz2lab(args));
|
||||
}
|
||||
|
||||
function lab2xyz(lab) {
|
||||
var l = lab[0],
|
||||
a = lab[1],
|
||||
b = lab[2],
|
||||
x, y, z, y2;
|
||||
|
||||
if (l <= 8) {
|
||||
y = (l * 100) / 903.3;
|
||||
y2 = (7.787 * (y / 100)) + (16 / 116);
|
||||
} else {
|
||||
y = 100 * Math.pow((l + 16) / 116, 3);
|
||||
y2 = Math.pow(y / 100, 1/3);
|
||||
}
|
||||
|
||||
x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);
|
||||
|
||||
z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);
|
||||
|
||||
return [x, y, z];
|
||||
}
|
||||
|
||||
function lab2lch(lab) {
|
||||
var l = lab[0],
|
||||
a = lab[1],
|
||||
b = lab[2],
|
||||
hr, h, c;
|
||||
|
||||
hr = Math.atan2(b, a);
|
||||
h = hr * 360 / 2 / Math.PI;
|
||||
if (h < 0) {
|
||||
h += 360;
|
||||
}
|
||||
c = Math.sqrt(a * a + b * b);
|
||||
return [l, c, h];
|
||||
}
|
||||
|
||||
function lab2rgb(args) {
|
||||
return xyz2rgb(lab2xyz(args));
|
||||
}
|
||||
|
||||
function lch2lab(lch) {
|
||||
var l = lch[0],
|
||||
c = lch[1],
|
||||
h = lch[2],
|
||||
a, b, hr;
|
||||
|
||||
hr = h / 360 * 2 * Math.PI;
|
||||
a = c * Math.cos(hr);
|
||||
b = c * Math.sin(hr);
|
||||
return [l, a, b];
|
||||
}
|
||||
|
||||
function lch2xyz(args) {
|
||||
return lab2xyz(lch2lab(args));
|
||||
}
|
||||
|
||||
function lch2rgb(args) {
|
||||
return lab2rgb(lch2lab(args));
|
||||
}
|
||||
|
||||
function keyword2rgb(keyword) {
|
||||
return cssKeywords[keyword];
|
||||
}
|
||||
|
||||
function keyword2hsl(args) {
|
||||
return rgb2hsl(keyword2rgb(args));
|
||||
}
|
||||
|
||||
function keyword2hsv(args) {
|
||||
return rgb2hsv(keyword2rgb(args));
|
||||
}
|
||||
|
||||
function keyword2hwb(args) {
|
||||
return rgb2hwb(keyword2rgb(args));
|
||||
}
|
||||
|
||||
function keyword2cmyk(args) {
|
||||
return rgb2cmyk(keyword2rgb(args));
|
||||
}
|
||||
|
||||
function keyword2lab(args) {
|
||||
return rgb2lab(keyword2rgb(args));
|
||||
}
|
||||
|
||||
function keyword2xyz(args) {
|
||||
return rgb2xyz(keyword2rgb(args));
|
||||
}
|
||||
|
||||
var cssKeywords = {
|
||||
aliceblue: [240,248,255],
|
||||
antiquewhite: [250,235,215],
|
||||
aqua: [0,255,255],
|
||||
aquamarine: [127,255,212],
|
||||
azure: [240,255,255],
|
||||
beige: [245,245,220],
|
||||
bisque: [255,228,196],
|
||||
black: [0,0,0],
|
||||
blanchedalmond: [255,235,205],
|
||||
blue: [0,0,255],
|
||||
blueviolet: [138,43,226],
|
||||
brown: [165,42,42],
|
||||
burlywood: [222,184,135],
|
||||
cadetblue: [95,158,160],
|
||||
chartreuse: [127,255,0],
|
||||
chocolate: [210,105,30],
|
||||
coral: [255,127,80],
|
||||
cornflowerblue: [100,149,237],
|
||||
cornsilk: [255,248,220],
|
||||
crimson: [220,20,60],
|
||||
cyan: [0,255,255],
|
||||
darkblue: [0,0,139],
|
||||
darkcyan: [0,139,139],
|
||||
darkgoldenrod: [184,134,11],
|
||||
darkgray: [169,169,169],
|
||||
darkgreen: [0,100,0],
|
||||
darkgrey: [169,169,169],
|
||||
darkkhaki: [189,183,107],
|
||||
darkmagenta: [139,0,139],
|
||||
darkolivegreen: [85,107,47],
|
||||
darkorange: [255,140,0],
|
||||
darkorchid: [153,50,204],
|
||||
darkred: [139,0,0],
|
||||
darksalmon: [233,150,122],
|
||||
darkseagreen: [143,188,143],
|
||||
darkslateblue: [72,61,139],
|
||||
darkslategray: [47,79,79],
|
||||
darkslategrey: [47,79,79],
|
||||
darkturquoise: [0,206,209],
|
||||
darkviolet: [148,0,211],
|
||||
deeppink: [255,20,147],
|
||||
deepskyblue: [0,191,255],
|
||||
dimgray: [105,105,105],
|
||||
dimgrey: [105,105,105],
|
||||
dodgerblue: [30,144,255],
|
||||
firebrick: [178,34,34],
|
||||
floralwhite: [255,250,240],
|
||||
forestgreen: [34,139,34],
|
||||
fuchsia: [255,0,255],
|
||||
gainsboro: [220,220,220],
|
||||
ghostwhite: [248,248,255],
|
||||
gold: [255,215,0],
|
||||
goldenrod: [218,165,32],
|
||||
gray: [128,128,128],
|
||||
green: [0,128,0],
|
||||
greenyellow: [173,255,47],
|
||||
grey: [128,128,128],
|
||||
honeydew: [240,255,240],
|
||||
hotpink: [255,105,180],
|
||||
indianred: [205,92,92],
|
||||
indigo: [75,0,130],
|
||||
ivory: [255,255,240],
|
||||
khaki: [240,230,140],
|
||||
lavender: [230,230,250],
|
||||
lavenderblush: [255,240,245],
|
||||
lawngreen: [124,252,0],
|
||||
lemonchiffon: [255,250,205],
|
||||
lightblue: [173,216,230],
|
||||
lightcoral: [240,128,128],
|
||||
lightcyan: [224,255,255],
|
||||
lightgoldenrodyellow: [250,250,210],
|
||||
lightgray: [211,211,211],
|
||||
lightgreen: [144,238,144],
|
||||
lightgrey: [211,211,211],
|
||||
lightpink: [255,182,193],
|
||||
lightsalmon: [255,160,122],
|
||||
lightseagreen: [32,178,170],
|
||||
lightskyblue: [135,206,250],
|
||||
lightslategray: [119,136,153],
|
||||
lightslategrey: [119,136,153],
|
||||
lightsteelblue: [176,196,222],
|
||||
lightyellow: [255,255,224],
|
||||
lime: [0,255,0],
|
||||
limegreen: [50,205,50],
|
||||
linen: [250,240,230],
|
||||
magenta: [255,0,255],
|
||||
maroon: [128,0,0],
|
||||
mediumaquamarine: [102,205,170],
|
||||
mediumblue: [0,0,205],
|
||||
mediumorchid: [186,85,211],
|
||||
mediumpurple: [147,112,219],
|
||||
mediumseagreen: [60,179,113],
|
||||
mediumslateblue: [123,104,238],
|
||||
mediumspringgreen: [0,250,154],
|
||||
mediumturquoise: [72,209,204],
|
||||
mediumvioletred: [199,21,133],
|
||||
midnightblue: [25,25,112],
|
||||
mintcream: [245,255,250],
|
||||
mistyrose: [255,228,225],
|
||||
moccasin: [255,228,181],
|
||||
navajowhite: [255,222,173],
|
||||
navy: [0,0,128],
|
||||
oldlace: [253,245,230],
|
||||
olive: [128,128,0],
|
||||
olivedrab: [107,142,35],
|
||||
orange: [255,165,0],
|
||||
orangered: [255,69,0],
|
||||
orchid: [218,112,214],
|
||||
palegoldenrod: [238,232,170],
|
||||
palegreen: [152,251,152],
|
||||
paleturquoise: [175,238,238],
|
||||
palevioletred: [219,112,147],
|
||||
papayawhip: [255,239,213],
|
||||
peachpuff: [255,218,185],
|
||||
peru: [205,133,63],
|
||||
pink: [255,192,203],
|
||||
plum: [221,160,221],
|
||||
powderblue: [176,224,230],
|
||||
purple: [128,0,128],
|
||||
rebeccapurple: [102, 51, 153],
|
||||
red: [255,0,0],
|
||||
rosybrown: [188,143,143],
|
||||
royalblue: [65,105,225],
|
||||
saddlebrown: [139,69,19],
|
||||
salmon: [250,128,114],
|
||||
sandybrown: [244,164,96],
|
||||
seagreen: [46,139,87],
|
||||
seashell: [255,245,238],
|
||||
sienna: [160,82,45],
|
||||
silver: [192,192,192],
|
||||
skyblue: [135,206,235],
|
||||
slateblue: [106,90,205],
|
||||
slategray: [112,128,144],
|
||||
slategrey: [112,128,144],
|
||||
snow: [255,250,250],
|
||||
springgreen: [0,255,127],
|
||||
steelblue: [70,130,180],
|
||||
tan: [210,180,140],
|
||||
teal: [0,128,128],
|
||||
thistle: [216,191,216],
|
||||
tomato: [255,99,71],
|
||||
turquoise: [64,224,208],
|
||||
violet: [238,130,238],
|
||||
wheat: [245,222,179],
|
||||
white: [255,255,255],
|
||||
whitesmoke: [245,245,245],
|
||||
yellow: [255,255,0],
|
||||
yellowgreen: [154,205,50]
|
||||
};
|
||||
|
||||
var reverseKeywords = {};
|
||||
for (var key in cssKeywords) {
|
||||
reverseKeywords[JSON.stringify(cssKeywords[key])] = key;
|
||||
}
|
||||
92
node_modules/color-convert/index.js
generated
vendored
Normal file
92
node_modules/color-convert/index.js
generated
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
var conversions = require("./conversions");
|
||||
|
||||
var convert = function() {
|
||||
return new Converter();
|
||||
}
|
||||
|
||||
for (var func in conversions) {
|
||||
// export Raw versions
|
||||
convert[func + "Raw"] = (function(func) {
|
||||
// accept array or plain args
|
||||
return function(arg) {
|
||||
if (typeof arg == "number")
|
||||
arg = Array.prototype.slice.call(arguments);
|
||||
return conversions[func](arg);
|
||||
}
|
||||
})(func);
|
||||
|
||||
var pair = /(\w+)2(\w+)/.exec(func),
|
||||
from = pair[1],
|
||||
to = pair[2];
|
||||
|
||||
// export rgb2hsl and ["rgb"]["hsl"]
|
||||
convert[from] = convert[from] || {};
|
||||
|
||||
convert[from][to] = convert[func] = (function(func) {
|
||||
return function(arg) {
|
||||
if (typeof arg == "number")
|
||||
arg = Array.prototype.slice.call(arguments);
|
||||
|
||||
var val = conversions[func](arg);
|
||||
if (typeof val == "string" || val === undefined)
|
||||
return val; // keyword
|
||||
|
||||
for (var i = 0; i < val.length; i++)
|
||||
val[i] = Math.round(val[i]);
|
||||
return val;
|
||||
}
|
||||
})(func);
|
||||
}
|
||||
|
||||
|
||||
/* Converter does lazy conversion and caching */
|
||||
var Converter = function() {
|
||||
this.convs = {};
|
||||
};
|
||||
|
||||
/* Either get the values for a space or
|
||||
set the values for a space, depending on args */
|
||||
Converter.prototype.routeSpace = function(space, args) {
|
||||
var values = args[0];
|
||||
if (values === undefined) {
|
||||
// color.rgb()
|
||||
return this.getValues(space);
|
||||
}
|
||||
// color.rgb(10, 10, 10)
|
||||
if (typeof values == "number") {
|
||||
values = Array.prototype.slice.call(args);
|
||||
}
|
||||
|
||||
return this.setValues(space, values);
|
||||
};
|
||||
|
||||
/* Set the values for a space, invalidating cache */
|
||||
Converter.prototype.setValues = function(space, values) {
|
||||
this.space = space;
|
||||
this.convs = {};
|
||||
this.convs[space] = values;
|
||||
return this;
|
||||
};
|
||||
|
||||
/* Get the values for a space. If there's already
|
||||
a conversion for the space, fetch it, otherwise
|
||||
compute it */
|
||||
Converter.prototype.getValues = function(space) {
|
||||
var vals = this.convs[space];
|
||||
if (!vals) {
|
||||
var fspace = this.space,
|
||||
from = this.convs[fspace];
|
||||
vals = convert[fspace][space](from);
|
||||
|
||||
this.convs[space] = vals;
|
||||
}
|
||||
return vals;
|
||||
};
|
||||
|
||||
["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) {
|
||||
Converter.prototype[space] = function(vals) {
|
||||
return this.routeSpace(space, arguments);
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = convert;
|
||||
20
node_modules/color-convert/package.json
generated
vendored
Normal file
20
node_modules/color-convert/package.json
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "color-convert",
|
||||
"description": "Plain color conversion functions",
|
||||
"version": "0.5.3",
|
||||
"author": "Heather Arthur <fayearthur@gmail.com>",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "http://github.com/harthur/color-convert.git"
|
||||
},
|
||||
"devDependencies": {
|
||||
},
|
||||
"scripts": {
|
||||
"test": "node test/basic.js"
|
||||
},
|
||||
"keywords": [
|
||||
"color",
|
||||
"colour",
|
||||
"rgb"
|
||||
]
|
||||
}
|
||||
187
node_modules/color-convert/test/basic.js
generated
vendored
Normal file
187
node_modules/color-convert/test/basic.js
generated
vendored
Normal file
@@ -0,0 +1,187 @@
|
||||
var convert = require("../index"),
|
||||
assert = require("assert");
|
||||
|
||||
assert.deepEqual(convert.rgb2hsl([140, 200, 100]), [96, 48, 59]);
|
||||
assert.deepEqual(convert.rgb2hsv([140, 200, 100]), [96, 50, 78]);
|
||||
assert.deepEqual(convert.rgb2hwb([140, 200, 100]), [96, 39, 22]);
|
||||
assert.deepEqual(convert.rgb2cmyk([140, 200, 100]), [30, 0, 50, 22]);
|
||||
assert.deepEqual(convert.rgb2cmyk([0,0,0,1]), [0,0,0,100]);
|
||||
assert.deepEqual(convert.rgb2keyword([255, 228, 196]), "bisque");
|
||||
assert.deepEqual(convert.rgb2xyz([92, 191, 84]), [25, 40, 15]);
|
||||
assert.deepEqual(convert.rgb2lab([92, 191, 84]), [70, -50, 45]);
|
||||
assert.deepEqual(convert.rgb2lch([92, 191, 84]), [70, 67, 138]);
|
||||
|
||||
assert.deepEqual(convert.hsl2rgb([96, 48, 59]), [140, 201, 100]);
|
||||
assert.deepEqual(convert.hsl2hsv([96, 48, 59]), [96, 50, 79]); // colorpicker says [96,50,79]
|
||||
assert.deepEqual(convert.hsl2hwb([96, 48, 59]), [96, 39, 21]); // computer round to 21, should be 22
|
||||
assert.deepEqual(convert.hsl2cmyk([96, 48, 59]), [30, 0, 50, 21]);
|
||||
assert.deepEqual(convert.hsl2keyword([240, 100, 50]), "blue");
|
||||
|
||||
assert.deepEqual(convert.hsv2rgb([96, 50, 78]), [139, 199, 99]);
|
||||
assert.deepEqual(convert.hsv2hsl([96, 50, 78]), [96, 47, 59]);
|
||||
assert.deepEqual(convert.hsv2hsl([0,0,0]), [0,0,0]);
|
||||
assert.deepEqual(convert.hsv2hwb([96, 50, 78]), [96, 39, 22]);
|
||||
assert.deepEqual(convert.hsv2cmyk([96, 50, 78]), [30, 0, 50, 22]);
|
||||
assert.deepEqual(convert.hsv2keyword([240, 100, 100]), "blue");
|
||||
|
||||
assert.deepEqual(convert.cmyk2rgb([30, 0, 50, 22]), [139, 199, 99]);
|
||||
assert.deepEqual(convert.cmyk2hsl([30, 0, 50, 22]), [96, 47, 59]);
|
||||
assert.deepEqual(convert.cmyk2hsv([30, 0, 50, 22]), [96, 50, 78]);
|
||||
assert.deepEqual(convert.cmyk2hwb([30, 0, 50, 22]), [96, 39, 22]);
|
||||
assert.deepEqual(convert.cmyk2keyword([100, 100, 0, 0]), "blue");
|
||||
|
||||
assert.deepEqual(convert.keyword2rgb("blue"), [0, 0, 255]);
|
||||
assert.deepEqual(convert.keyword2hsl("blue"), [240, 100, 50]);
|
||||
assert.deepEqual(convert.keyword2hsv("blue"), [240, 100, 100]);
|
||||
assert.deepEqual(convert.keyword2hwb("blue"), [240, 0, 0]);
|
||||
assert.deepEqual(convert.keyword2cmyk("blue"), [100, 100, 0, 0]);
|
||||
assert.deepEqual(convert.keyword2lab("blue"), [32, 79, -108]);
|
||||
assert.deepEqual(convert.keyword2xyz("blue"), [18, 7, 95]);
|
||||
|
||||
assert.deepEqual(convert.xyz2rgb([25, 40, 15]), [97, 190, 85]);
|
||||
assert.deepEqual(convert.xyz2rgb([50, 100, 100]), [0, 255, 241]);
|
||||
assert.deepEqual(convert.xyz2lab([25, 40, 15]), [69, -48, 44]);
|
||||
assert.deepEqual(convert.xyz2lch([25, 40, 15]), [69, 65, 137]);
|
||||
|
||||
assert.deepEqual(convert.lab2xyz([69, -48, 44]), [25, 39, 15]);
|
||||
assert.deepEqual(convert.lab2rgb([75, 20, -30]), [194, 175, 240]);
|
||||
assert.deepEqual(convert.lab2lch([69, -48, 44]), [69, 65, 137]);
|
||||
|
||||
assert.deepEqual(convert.lch2lab([69, 65, 137]), [69, -48, 44]);
|
||||
assert.deepEqual(convert.lch2xyz([69, 65, 137]), [25, 39, 15]);
|
||||
assert.deepEqual(convert.lch2rgb([69, 65, 137]), [98, 188, 83]);
|
||||
|
||||
// non-array arguments
|
||||
assert.deepEqual(convert.hsl2rgb(96, 48, 59), [140, 201, 100]);
|
||||
|
||||
// raw functions
|
||||
function round(vals) {
|
||||
for (var i = 0; i < vals.length; i++)
|
||||
vals[i] = vals[i].toFixed(1);
|
||||
return vals;
|
||||
}
|
||||
|
||||
assert.deepEqual(round(convert.hsl2rgbRaw([96, 48, 59])), [140.4, 200.6, 100.3]);
|
||||
assert.deepEqual(round(convert.rgb2hslRaw([140, 200, 100])), [96, 47.6, 58.8]);
|
||||
|
||||
assert.deepEqual(round(convert.hsv2rgbRaw([96, 50, 78])), [139.2, 198.9, 99.5]);
|
||||
assert.deepEqual(round(convert.rgb2hsvRaw([140, 200, 100])), [96, 50, 78.4]);
|
||||
|
||||
assert.deepEqual(round(convert.hwb2rgbRaw([96, 39, 22])), [139.2, 198.9, 99.5]);
|
||||
assert.deepEqual(round(convert.rgb2hwbRaw([140, 200, 100])), [96, 39.2, 21.6]);
|
||||
|
||||
assert.deepEqual(round(convert.cmyk2rgbRaw([30, 0, 50, 22])), [139.2, 198.9, 99.5]);
|
||||
assert.deepEqual(round(convert.rgb2cmykRaw([140, 200, 100])), [30, 0, 50, 21.6]);
|
||||
|
||||
assert.deepEqual(round(convert.keyword2rgbRaw("blue")), [0, 0, 255]);
|
||||
assert.deepEqual(convert.rgb2keywordRaw([255, 228, 196]), "bisque");
|
||||
|
||||
assert.deepEqual(round(convert.hsv2hslRaw([96, 50, 78])), [96, 47, 58.5]);
|
||||
assert.deepEqual(round(convert.hsl2hsvRaw([96, 48, 59])), [96, 50, 78.7]);
|
||||
|
||||
assert.deepEqual(round(convert.hsl2hsvRaw([96, 48, 59])), [96, 50, 78.7]);
|
||||
|
||||
assert.deepEqual(round(convert.xyz2rgbRaw([25, 40, 15])), [97.4, 189.9, 85]);
|
||||
assert.deepEqual(round(convert.rgb2xyzRaw([92, 191, 84])), [24.6, 40.2, 14.8]);
|
||||
|
||||
assert.deepEqual(round(convert.rgb2labRaw([92, 191, 84])), [69.6, -50.1, 44.6]);
|
||||
|
||||
// hashed
|
||||
var val = [140, 200, 100];
|
||||
assert.deepEqual(convert["rgb"]["hsl"](val), convert.rgb2hsl(val));
|
||||
assert.deepEqual(convert["rgb"]["hsv"](val), convert.rgb2hsv(val));
|
||||
assert.deepEqual(convert["rgb"]["hwb"](val), convert.rgb2hwb(val));
|
||||
assert.deepEqual(convert["rgb"]["cmyk"](val), convert.rgb2cmyk(val));
|
||||
assert.deepEqual(convert["rgb"]["xyz"](val), convert.rgb2xyz(val));
|
||||
assert.deepEqual(convert["rgb"]["lab"](val), convert.rgb2lab(val));
|
||||
assert.deepEqual(convert["rgb"]["keyword"]([255, 228, 196]), "bisque");
|
||||
|
||||
val = [96, 48, 59];
|
||||
assert.deepEqual(convert["hsl"]["rgb"](val), convert.hsl2rgb(val));
|
||||
assert.deepEqual(convert["hsl"]["hsv"](val), convert.hsl2hsv(val));
|
||||
assert.deepEqual(convert["hsl"]["hwb"](val), convert.hsl2hwb(val));
|
||||
assert.deepEqual(convert["hsl"]["cmyk"](val), convert.hsl2cmyk(val));
|
||||
assert.deepEqual(convert["hsl"]["keyword"](val), convert.hsl2keyword(val ));
|
||||
|
||||
val = [96, 50, 78];
|
||||
assert.deepEqual(convert["hsv"]["rgb"](val), convert.hsv2rgb(val));
|
||||
assert.deepEqual(convert["hsv"]["hsl"](val), convert.hsv2hsl(val));
|
||||
assert.deepEqual(convert["hsv"]["hwb"](val), convert.hsv2hwb(val));
|
||||
assert.deepEqual(convert["hsv"]["cmyk"](val), convert.hsv2cmyk(val));
|
||||
assert.deepEqual(convert["hsv"]["keyword"](val), convert.hsv2keyword(val));
|
||||
|
||||
val = [30, 0, 50, 22];
|
||||
assert.deepEqual(convert["cmyk"]["rgb"](val), convert.cmyk2rgb(val));
|
||||
assert.deepEqual(convert["cmyk"]["hsl"](val), convert.cmyk2hsl(val));
|
||||
assert.deepEqual(convert["cmyk"]["hsv"](val), convert.cmyk2hsv(val));
|
||||
assert.deepEqual(convert["cmyk"]["hwb"](val), convert.cmyk2hwb(val));
|
||||
assert.deepEqual(convert["cmyk"]["keyword"](val), convert.cmyk2keyword(val));
|
||||
|
||||
val = "blue";
|
||||
assert.deepEqual(convert["keyword"]["rgb"](val), convert.keyword2rgb(val));
|
||||
assert.deepEqual(convert["keyword"]["hsl"](val), convert.keyword2hsl(val));
|
||||
assert.deepEqual(convert["keyword"]["hsv"](val), convert.keyword2hsv(val));
|
||||
assert.deepEqual(convert["keyword"]["hwb"](val), convert.keyword2hwb(val));
|
||||
assert.deepEqual(convert["keyword"]["cmyk"](val), convert.keyword2cmyk(val));
|
||||
assert.deepEqual(convert["keyword"]["lab"](val), convert.keyword2lab(val));
|
||||
assert.deepEqual(convert["keyword"]["xyz"](val), convert.keyword2xyz(val));
|
||||
|
||||
val = [25, 40, 15]
|
||||
assert.deepEqual(convert["xyz"]["rgb"](val), convert.xyz2rgb(val));
|
||||
assert.deepEqual(convert["xyz"]["lab"](val), convert.xyz2lab(val));
|
||||
|
||||
val = [69, -48, 44];
|
||||
assert.deepEqual(convert["lab"]["xyz"](val), [25, 39, 15]);
|
||||
|
||||
|
||||
// converter
|
||||
var converter = convert();
|
||||
|
||||
var vals = [140, 200, 100];
|
||||
converter.rgb(140, 200, 100);
|
||||
|
||||
assert.deepEqual(converter.hsl(), convert.rgb2hsl(vals));
|
||||
assert.deepEqual(converter.hsv(), convert.rgb2hsv(vals));
|
||||
assert.deepEqual(converter.cmyk(), convert.rgb2cmyk(vals));
|
||||
assert.deepEqual(converter.rgb(), vals);
|
||||
assert.deepEqual(converter.rgb([255, 228, 196]).keyword(), "bisque");
|
||||
|
||||
vals = [96, 48, 59];
|
||||
converter.hsl(vals);
|
||||
assert.deepEqual(converter.rgb(), convert.hsl2rgb(vals));
|
||||
assert.deepEqual(converter.hsv(), convert.hsl2hsv(vals));
|
||||
assert.deepEqual(converter.cmyk(), convert.hsl2cmyk(vals));
|
||||
assert.deepEqual(converter.keyword(), convert.hsl2keyword(vals));
|
||||
|
||||
// hwb
|
||||
// http://dev.w3.org/csswg/css-color/#hwb-examples
|
||||
|
||||
// all extrem value should give black, white or grey
|
||||
for(var angle = 0; angle <= 360; angle ++) {
|
||||
assert.deepEqual(convert.hwb2rgb([angle, 0, 100]), [0, 0, 0]);
|
||||
assert.deepEqual(convert.hwb2rgb([angle, 100, 0]), [255, 255, 255]);
|
||||
assert.deepEqual(convert.hwb2rgb([angle, 100, 100]), [128, 128, 128]);
|
||||
}
|
||||
|
||||
assert.deepEqual(convert.hwb2rgb([0, 0, 0]), [255,0,0]);
|
||||
assert.deepEqual(convert.hwb2rgb([0, 20, 40]), [153, 51, 51]);
|
||||
assert.deepEqual(convert.hwb2rgb([0, 40, 40]), [153, 102, 102]);
|
||||
assert.deepEqual(convert.hwb2rgb([0, 40, 20]), [204, 102, 102]);
|
||||
|
||||
assert.deepEqual(convert.hwb2rgb([120, 0, 0]), [0,255,0]);
|
||||
assert.deepEqual(convert.hwb2rgb([120, 20, 40]), [51, 153, 51]);
|
||||
assert.deepEqual(convert.hwb2rgb([120, 40, 40]), [102, 153, 102]);
|
||||
assert.deepEqual(convert.hwb2rgb([120, 40, 20]), [102, 204, 102]);
|
||||
|
||||
assert.deepEqual(convert.hwb2rgb([240, 0, 0]), [0,0,255]);
|
||||
assert.deepEqual(convert.hwb2rgb([240, 20, 40]), [51, 51, 153]);
|
||||
assert.deepEqual(convert.hwb2rgb([240, 40, 40]), [102, 102, 153]);
|
||||
assert.deepEqual(convert.hwb2rgb([240, 40, 20]), [102, 102, 204]);
|
||||
|
||||
|
||||
// black should always stay black
|
||||
val = [0, 0, 0];
|
||||
assert.deepEqual(convert.hsl2hsv(val), val);
|
||||
assert.deepEqual(convert.hsl2rgb(val), val);
|
||||
assert.deepEqual(convert.hsl2hwb(val), [0, 0, 100]);
|
||||
assert.deepEqual(convert.hsl2cmyk(val), [0, 0, 0, 100]);
|
||||
23
node_modules/color-convert/test/speed.js
generated
vendored
Normal file
23
node_modules/color-convert/test/speed.js
generated
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
var convert = require("../index");
|
||||
|
||||
var converter = convert();
|
||||
|
||||
var times = 10000;
|
||||
|
||||
console.time("cached");
|
||||
converter.rgb(10, 2, 30);
|
||||
for(var i = 0; i < times; i++) {
|
||||
converter.hsv();
|
||||
converter.hsl();
|
||||
converter.cmyk();
|
||||
}
|
||||
console.timeEnd("cached");
|
||||
|
||||
console.time("uncached");
|
||||
for(var i = 0; i < times; i++) {
|
||||
convert.rgb2hsl(10, 2, 30);
|
||||
convert.rgb2hsv(10, 2, 30);
|
||||
convert.rgb2cmyk(10, 2, 30);
|
||||
}
|
||||
console.timeEnd("uncached");
|
||||
|
||||
8
node_modules/color-name/LICENSE
generated
vendored
Normal file
8
node_modules/color-name/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
The MIT License (MIT)
|
||||
Copyright (c) 2015 Dmitry Ivanov
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
11
node_modules/color-name/README.md
generated
vendored
Normal file
11
node_modules/color-name/README.md
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
A JSON with color names and its values. Based on http://dev.w3.org/csswg/css-color/#named-colors.
|
||||
|
||||
[](https://nodei.co/npm/color-name/)
|
||||
|
||||
|
||||
```js
|
||||
var colors = require('color-name');
|
||||
colors.red //[255,0,0]
|
||||
```
|
||||
|
||||
<a href="LICENSE"><img src="https://upload.wikimedia.org/wikipedia/commons/0/0c/MIT_logo.svg" width="120"/></a>
|
||||
152
node_modules/color-name/index.js
generated
vendored
Normal file
152
node_modules/color-name/index.js
generated
vendored
Normal file
@@ -0,0 +1,152 @@
|
||||
'use strict'
|
||||
|
||||
module.exports = {
|
||||
"aliceblue": [240, 248, 255],
|
||||
"antiquewhite": [250, 235, 215],
|
||||
"aqua": [0, 255, 255],
|
||||
"aquamarine": [127, 255, 212],
|
||||
"azure": [240, 255, 255],
|
||||
"beige": [245, 245, 220],
|
||||
"bisque": [255, 228, 196],
|
||||
"black": [0, 0, 0],
|
||||
"blanchedalmond": [255, 235, 205],
|
||||
"blue": [0, 0, 255],
|
||||
"blueviolet": [138, 43, 226],
|
||||
"brown": [165, 42, 42],
|
||||
"burlywood": [222, 184, 135],
|
||||
"cadetblue": [95, 158, 160],
|
||||
"chartreuse": [127, 255, 0],
|
||||
"chocolate": [210, 105, 30],
|
||||
"coral": [255, 127, 80],
|
||||
"cornflowerblue": [100, 149, 237],
|
||||
"cornsilk": [255, 248, 220],
|
||||
"crimson": [220, 20, 60],
|
||||
"cyan": [0, 255, 255],
|
||||
"darkblue": [0, 0, 139],
|
||||
"darkcyan": [0, 139, 139],
|
||||
"darkgoldenrod": [184, 134, 11],
|
||||
"darkgray": [169, 169, 169],
|
||||
"darkgreen": [0, 100, 0],
|
||||
"darkgrey": [169, 169, 169],
|
||||
"darkkhaki": [189, 183, 107],
|
||||
"darkmagenta": [139, 0, 139],
|
||||
"darkolivegreen": [85, 107, 47],
|
||||
"darkorange": [255, 140, 0],
|
||||
"darkorchid": [153, 50, 204],
|
||||
"darkred": [139, 0, 0],
|
||||
"darksalmon": [233, 150, 122],
|
||||
"darkseagreen": [143, 188, 143],
|
||||
"darkslateblue": [72, 61, 139],
|
||||
"darkslategray": [47, 79, 79],
|
||||
"darkslategrey": [47, 79, 79],
|
||||
"darkturquoise": [0, 206, 209],
|
||||
"darkviolet": [148, 0, 211],
|
||||
"deeppink": [255, 20, 147],
|
||||
"deepskyblue": [0, 191, 255],
|
||||
"dimgray": [105, 105, 105],
|
||||
"dimgrey": [105, 105, 105],
|
||||
"dodgerblue": [30, 144, 255],
|
||||
"firebrick": [178, 34, 34],
|
||||
"floralwhite": [255, 250, 240],
|
||||
"forestgreen": [34, 139, 34],
|
||||
"fuchsia": [255, 0, 255],
|
||||
"gainsboro": [220, 220, 220],
|
||||
"ghostwhite": [248, 248, 255],
|
||||
"gold": [255, 215, 0],
|
||||
"goldenrod": [218, 165, 32],
|
||||
"gray": [128, 128, 128],
|
||||
"green": [0, 128, 0],
|
||||
"greenyellow": [173, 255, 47],
|
||||
"grey": [128, 128, 128],
|
||||
"honeydew": [240, 255, 240],
|
||||
"hotpink": [255, 105, 180],
|
||||
"indianred": [205, 92, 92],
|
||||
"indigo": [75, 0, 130],
|
||||
"ivory": [255, 255, 240],
|
||||
"khaki": [240, 230, 140],
|
||||
"lavender": [230, 230, 250],
|
||||
"lavenderblush": [255, 240, 245],
|
||||
"lawngreen": [124, 252, 0],
|
||||
"lemonchiffon": [255, 250, 205],
|
||||
"lightblue": [173, 216, 230],
|
||||
"lightcoral": [240, 128, 128],
|
||||
"lightcyan": [224, 255, 255],
|
||||
"lightgoldenrodyellow": [250, 250, 210],
|
||||
"lightgray": [211, 211, 211],
|
||||
"lightgreen": [144, 238, 144],
|
||||
"lightgrey": [211, 211, 211],
|
||||
"lightpink": [255, 182, 193],
|
||||
"lightsalmon": [255, 160, 122],
|
||||
"lightseagreen": [32, 178, 170],
|
||||
"lightskyblue": [135, 206, 250],
|
||||
"lightslategray": [119, 136, 153],
|
||||
"lightslategrey": [119, 136, 153],
|
||||
"lightsteelblue": [176, 196, 222],
|
||||
"lightyellow": [255, 255, 224],
|
||||
"lime": [0, 255, 0],
|
||||
"limegreen": [50, 205, 50],
|
||||
"linen": [250, 240, 230],
|
||||
"magenta": [255, 0, 255],
|
||||
"maroon": [128, 0, 0],
|
||||
"mediumaquamarine": [102, 205, 170],
|
||||
"mediumblue": [0, 0, 205],
|
||||
"mediumorchid": [186, 85, 211],
|
||||
"mediumpurple": [147, 112, 219],
|
||||
"mediumseagreen": [60, 179, 113],
|
||||
"mediumslateblue": [123, 104, 238],
|
||||
"mediumspringgreen": [0, 250, 154],
|
||||
"mediumturquoise": [72, 209, 204],
|
||||
"mediumvioletred": [199, 21, 133],
|
||||
"midnightblue": [25, 25, 112],
|
||||
"mintcream": [245, 255, 250],
|
||||
"mistyrose": [255, 228, 225],
|
||||
"moccasin": [255, 228, 181],
|
||||
"navajowhite": [255, 222, 173],
|
||||
"navy": [0, 0, 128],
|
||||
"oldlace": [253, 245, 230],
|
||||
"olive": [128, 128, 0],
|
||||
"olivedrab": [107, 142, 35],
|
||||
"orange": [255, 165, 0],
|
||||
"orangered": [255, 69, 0],
|
||||
"orchid": [218, 112, 214],
|
||||
"palegoldenrod": [238, 232, 170],
|
||||
"palegreen": [152, 251, 152],
|
||||
"paleturquoise": [175, 238, 238],
|
||||
"palevioletred": [219, 112, 147],
|
||||
"papayawhip": [255, 239, 213],
|
||||
"peachpuff": [255, 218, 185],
|
||||
"peru": [205, 133, 63],
|
||||
"pink": [255, 192, 203],
|
||||
"plum": [221, 160, 221],
|
||||
"powderblue": [176, 224, 230],
|
||||
"purple": [128, 0, 128],
|
||||
"rebeccapurple": [102, 51, 153],
|
||||
"red": [255, 0, 0],
|
||||
"rosybrown": [188, 143, 143],
|
||||
"royalblue": [65, 105, 225],
|
||||
"saddlebrown": [139, 69, 19],
|
||||
"salmon": [250, 128, 114],
|
||||
"sandybrown": [244, 164, 96],
|
||||
"seagreen": [46, 139, 87],
|
||||
"seashell": [255, 245, 238],
|
||||
"sienna": [160, 82, 45],
|
||||
"silver": [192, 192, 192],
|
||||
"skyblue": [135, 206, 235],
|
||||
"slateblue": [106, 90, 205],
|
||||
"slategray": [112, 128, 144],
|
||||
"slategrey": [112, 128, 144],
|
||||
"snow": [255, 250, 250],
|
||||
"springgreen": [0, 255, 127],
|
||||
"steelblue": [70, 130, 180],
|
||||
"tan": [210, 180, 140],
|
||||
"teal": [0, 128, 128],
|
||||
"thistle": [216, 191, 216],
|
||||
"tomato": [255, 99, 71],
|
||||
"turquoise": [64, 224, 208],
|
||||
"violet": [238, 130, 238],
|
||||
"wheat": [245, 222, 179],
|
||||
"white": [255, 255, 255],
|
||||
"whitesmoke": [245, 245, 245],
|
||||
"yellow": [255, 255, 0],
|
||||
"yellowgreen": [154, 205, 50]
|
||||
};
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user