Documented target-specific properties

Also, GitHub should no longer emit warnings when someone uses them.

Closes #13
This commit is contained in:
Kir_Antipov 2022-07-04 20:19:25 +03:00
parent f89c9cab04
commit 7aa44c48ce
7 changed files with 103 additions and 55 deletions

View file

@ -124,6 +124,36 @@ jobs:
| [retry-attempts](#user-content-retry-attempts) | The maximum number of attempts to publish assets | `2` | `2` <br> `10` <br> `-1` |
| [retry-delay](#user-content-retry-delay) | Time delay between attempts to publish assets (in milliseconds) | `10000` | `10000` <br> `60000` <br> `0` |
Note, that you can use any top-level property *(`name`, `version`, `dependencies`, `files`, etc.)* as a target-specific one. This can help you fine-tune `mc-publish` to suit your tastes and needs. For example, consider the following configuration:
```yaml
# It is a good idea to share the same primary file among different targets
files-primary: build/libs/!(*-@(dev\|sources)).jar
modrinth-id: aaaAAAaa
modrinth-token: ${{ secrets.MODRINTH_TOKEN }}
# Modrinth-specific name for your mod
modrinth-name: Modrinth Mod
# Modrinth-specific secondary files
modrinth-files-secondary: build/libs/*-@(dev\|sources).jar
# Modrinth-specific dependencies
# It is possible to use project ids instead of slugs
modrinth-dependencies: |
AANobbMI | depends | *
sodium
curseforge-id: 0
curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }}
# CurseForge-specific name for your mod
curseforge-name: CurseForge Mod
# CurseForge-specific secondary files
curseforge-files-secondary: ""
# CurseForge-specific dependencies
# It is not possible to use project ids instead of slugs
curseforge-dependencies: |
sodium | depends | *
```
#### modrinth-id
The ID of the Modrinth project to upload to.

View file

@ -5,125 +5,80 @@ branding:
color: orange
icon: upload
inputs:
modrinth:
publisher: true
curseforge:
publisher: true
github:
publisher: true
modrinth-id:
description: The ID of the Modrinth project to upload to
required: false
default: ${undefined}
modrinth-featured:
description: Indicates whether the version should be featured on Modrinth or not
required: false
default: ${undefined}
modrinth-unfeature-mode:
description: Determines the way automatic unfeaturing of older Modrinth versions works
required: false
default: ${undefined}
modrinth-token:
description: A valid token for the Modrinth API
required: false
default: ${undefined}
curseforge-id:
description: The ID of the CurseForge project to upload to
required: false
default: ${undefined}
curseforge-token:
description: A valid token for the CurseForge API
required: false
default: ${undefined}
github-tag:
description: The tag name of the release to upload assets to
required: false
default: ${undefined}
github-generate-changelog:
description: Indicates whether to automatically generate the changelog for this release. If changelog is specified, it will be pre-pended to the automatically generated notes. Unused if the GitHub Release already exists
required: false
default: ${undefined}
github-draft:
description: true to create a draft (unpublished) release, false to create a published one. Unused if the GitHub Release already exists
required: false
default: ${undefined}
github-prerelease:
description: true to identify the release as a prerelease, false to identify the release as a full release. Unused if the GitHub Release already exists
required: false
default: ${undefined}
github-commitish:
description: Specifies the commitish value that determines where the Git tag is created from. Can be any branch or commit SHA. Unused if the Git tag already exists
required: false
default: ${undefined}
github-discussion:
description: If specified, a discussion of the specified category is created and linked to the release. Unused if the GitHub Release already exists
required: false
default: ${undefined}
github-token:
description: A valid token for the GitHub API
required: false
default: ${undefined}
files:
description: A glob of the files to upload
required: false
default: ${undefined}
files-primary:
description: A glob of the primary files to upload
required: false
default: ${undefined}
files-secondary:
description: A glob of the secondary files to upload
required: false
default: ${undefined}
name:
description: The name of the version
required: false
default: ${undefined}
version:
description: The version number
required: false
default: ${undefined}
version-type:
description: The type of the release - alpha, beta, or release
required: false
default: ${undefined}
changelog:
description: The changelog for this version
required: false
default: ${undefined}
changelog-file:
description: A glob of the changelog file
required: false
default: ${undefined}
loaders:
description: A list of supported mod loaders
required: false
default: ${undefined}
game-versions:
description: A list of supported Minecraft versions
required: false
default: ${undefined}
dependencies:
description: A list of dependencies
required: false
default: ${undefined}
version-resolver:
description: Determines the way automatic game-versions resolvement works
required: false
default: ${undefined}
java:
description: A list of supported Java versions
required: false
default: ${undefined}
retry-attempts:
description: The maximum number of attempts to publish assets
required: false
default: 2
unique: true
retry-delay:
description: Time delay between attempts to publish assets (in milliseconds)
required: false
default: 10000
unique: true
runs:
using: node12
main: dist/index.js

6
package-lock.json generated
View file

@ -6481,6 +6481,12 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
"yaml": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0.tgz",
"integrity": "sha512-JbfdlHKGP2Ik9IHylzWlGd4pPK++EU46/IxMykphS2ZKw7a7h+dHNmcXObLgpRDriBY+rpWslldikckX8oruWQ==",
"dev": true
},
"yargs": {
"version": "17.5.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz",

View file

@ -39,6 +39,7 @@
"eslint": "^8.16.0",
"jest": "^28.1.0",
"typescript": "^4.7.2",
"yaml": "2.0.0",
"yazl": "^2.5.1"
},
"dependencies": {

View file

@ -1,3 +1,5 @@
import fixDeprecatedBuffer from "./buffer-fix";
import fixDeprecatedBuffer from "./fixes/buffer-fix";
import processActionYamlTemplate from "./templates/action-yml";
fixDeprecatedBuffer();
processActionYamlTemplate();

View file

@ -0,0 +1,54 @@
import fs from "fs";
import yaml from "yaml";
interface ActionInput {
description?: string;
required?: boolean;
default?: string;
unique?: boolean;
publisher?: boolean;
}
export default function processActionYamlTemplate() {
processActionTemplate("./action.template.yml", "./action.yml");
}
function processActionTemplate(pathIn: string, pathOut: string) {
const content = fs.readFileSync(pathIn, "utf8");
const action = yaml.parse(content) as { inputs?: Record<string, ActionInput> };
if (!action.inputs) {
action.inputs = {};
}
action.inputs = processInputs(action.inputs);
const updatedContent = yaml.stringify(action);
fs.writeFileSync(pathOut, updatedContent, "utf8");
}
function processInputs(inputs: Record<string, ActionInput>) {
const publishers = Object.entries(inputs).filter(([_, input]) => input.publisher).map(([key, _]) => key);
const nestedInputs = Object.entries(inputs).filter(([key, input]) => !input.publisher && !input.unique && !publishers.find(p => key.startsWith(p)));
for (const [key, input] of Object.entries(inputs)) {
if (input.publisher) {
delete inputs[key];
}
delete input.unique;
if (typeof input.required !== "boolean") {
input.required = false;
}
if (input.default === undefined) {
input.default = "${undefined}";
}
}
for (const publisher of publishers) {
for (const [name, input] of nestedInputs) {
inputs[`${publisher}-${name}`] = { ...input };
}
}
return inputs;
}