Compare commits
22 Commits
test-fix-p
...
0.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 34cc58529b | |||
| 2be5b2a1bc | |||
| cbbd0e64e8 | |||
| dee3bff2ed | |||
| 2a1480e46b | |||
| 150f8fc15f | |||
| 96f131369e | |||
| 684cc88afb | |||
| c07372bfa5 | |||
| d918fd764c | |||
| 4a3dbb707c | |||
| bfa059df07 | |||
| c5a58026fa | |||
| c05341c0a7 | |||
| 6a098d425e | |||
| 4a77ba188a | |||
| 6c7a0961a7 | |||
| 3ff19001a7 | |||
| a14206d32c | |||
| 8e305f9126 | |||
| a7552f74fa | |||
| 3f19a64809 |
@@ -20,7 +20,8 @@
|
|||||||
],
|
],
|
||||||
"settings": {
|
"settings": {
|
||||||
"editor.formatOnSave": true,
|
"editor.formatOnSave": true,
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||||
|
"files.eol": "\n"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ git config --global --add safe.directory $(pwd)
|
|||||||
|
|
||||||
# In your setup.sh or postCreateCommand
|
# In your setup.sh or postCreateCommand
|
||||||
sudo chown -R node:node /home/node/.cache/
|
sudo chown -R node:node /home/node/.cache/
|
||||||
|
sudo chown -R node:node /workspaces/screeps-deploy-action/.git/hooks
|
||||||
# 2. Re-connect Git Hooks
|
# 2. Re-connect Git Hooks
|
||||||
pre-commit install
|
pre-commit install
|
||||||
pre-commit install-hooks
|
pre-commit install-hooks
|
||||||
|
|||||||
8
.editorconfig
Normal file
8
.editorconfig
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
charset = utf-8
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
* text=auto eol=lf
|
||||||
@@ -10,9 +10,9 @@ jobs:
|
|||||||
runs-on: pi
|
runs-on: pi
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: '22'
|
node-version: '24'
|
||||||
- run: npm install
|
- run: npm install
|
||||||
shell: bash
|
shell: bash
|
||||||
- run: npm test
|
- run: npm test
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1075,4 +1075,6 @@ FodyWeavers.xsd
|
|||||||
*.vsix
|
*.vsix
|
||||||
|
|
||||||
/node_modules/
|
/node_modules/
|
||||||
|
/node_modules/.cache/
|
||||||
/coverage/
|
/coverage/
|
||||||
|
!/dist/
|
||||||
|
|||||||
@@ -5,28 +5,20 @@ repos:
|
|||||||
hooks:
|
hooks:
|
||||||
- id: check-yaml
|
- id: check-yaml
|
||||||
- id: check-json
|
- id: check-json
|
||||||
- id: check-toml
|
|
||||||
- id: check-xml
|
|
||||||
- id: check-added-large-files
|
- id: check-added-large-files
|
||||||
args: [--enforce-all]
|
args: [--enforce-all]
|
||||||
exclude: ^dist/index\.js$
|
exclude: ^dist/index\.js$
|
||||||
- id: name-tests-test
|
|
||||||
- id: detect-private-key
|
- id: detect-private-key
|
||||||
- id: check-case-conflict
|
- id: check-case-conflict
|
||||||
- id: check-symlinks
|
- id: check-symlinks
|
||||||
- id: check-docstring-first
|
|
||||||
- id: pretty-format-json
|
- id: pretty-format-json
|
||||||
args: [--autofix, --no-sort-keys, --no-ensure-ascii]
|
args: [--autofix, --no-sort-keys, --no-ensure-ascii]
|
||||||
- id: check-merge-conflict
|
- id: check-merge-conflict
|
||||||
- id: no-commit-to-branch
|
- id: no-commit-to-branch
|
||||||
|
|
||||||
- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks
|
- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks
|
||||||
rev: v2.15.0
|
rev: v2.16.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: pretty-format-ini
|
|
||||||
args: [--autofix]
|
|
||||||
- id: pretty-format-toml
|
|
||||||
args: [--autofix]
|
|
||||||
- id: pretty-format-yaml
|
- id: pretty-format-yaml
|
||||||
args: [--autofix]
|
args: [--autofix]
|
||||||
|
|
||||||
@@ -37,7 +29,7 @@ repos:
|
|||||||
types_or: [css, javascript]
|
types_or: [css, javascript]
|
||||||
|
|
||||||
- repo: https://github.com/python-jsonschema/check-jsonschema
|
- repo: https://github.com/python-jsonschema/check-jsonschema
|
||||||
rev: 0.36.0
|
rev: 0.37.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: check-renovate
|
- id: check-renovate
|
||||||
- id: check-github-actions
|
- id: check-github-actions
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
const { validateAuthentication, replacePlaceholders } = require("../index");
|
import {
|
||||||
const fs = require("fs");
|
validateAuthentication,
|
||||||
const path = require("path");
|
replacePlaceholders,
|
||||||
const os = require("os");
|
readReplaceAndWriteFiles,
|
||||||
const { glob } = require("glob");
|
readFilesIntoDict,
|
||||||
|
} from "../index.js";
|
||||||
|
import fs from "fs";
|
||||||
|
import path from "path";
|
||||||
|
import os from "os";
|
||||||
|
import { glob } from "glob";
|
||||||
|
|
||||||
describe("validateAuthentication", () => {
|
describe("validateAuthentication", () => {
|
||||||
it("should return null when only token is provided", () => {
|
it("should return null when only token is provided", () => {
|
||||||
@@ -67,6 +72,83 @@ describe("replacePlaceholders", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("readReplaceAndWriteFiles", () => {
|
||||||
|
let tempDir;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
tempDir = await fs.promises.mkdtemp(
|
||||||
|
path.join(os.tmpdir(), "replace-test-"),
|
||||||
|
);
|
||||||
|
process.env.GITHUB_SHA = "test-sha";
|
||||||
|
process.env.GITHUB_REF = "test-ref";
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
if (tempDir) {
|
||||||
|
await fs.promises.rm(tempDir, { recursive: true, force: true });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should find files and replace placeholders", async () => {
|
||||||
|
const fileName = "test.js";
|
||||||
|
const filePath = path.join(tempDir, fileName);
|
||||||
|
const content = "hash: {{gitHash}}, ref: {{gitRef}}, host: {{hostname}}";
|
||||||
|
await fs.promises.writeFile(filePath, content);
|
||||||
|
|
||||||
|
const pattern = "*.js";
|
||||||
|
// We pass tempDir as the prefix so glob searches inside it
|
||||||
|
await readReplaceAndWriteFiles(pattern, tempDir, "test-host");
|
||||||
|
|
||||||
|
const updatedContent = await fs.promises.readFile(filePath, "utf8");
|
||||||
|
|
||||||
|
expect(updatedContent).toContain("hash: test-sha");
|
||||||
|
expect(updatedContent).toContain("ref: test-ref");
|
||||||
|
expect(updatedContent).toContain("host: test-host");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("readFilesIntoDict", () => {
|
||||||
|
let tempDir;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
tempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "read-test-"));
|
||||||
|
await fs.promises.mkdir(path.join(tempDir, "subdir"), { recursive: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
if (tempDir) {
|
||||||
|
await fs.promises.rm(tempDir, { recursive: true, force: true });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should read files into a dictionary with correct keys", async () => {
|
||||||
|
const file1 = "file1.js";
|
||||||
|
const content1 = "content1";
|
||||||
|
await fs.promises.writeFile(path.join(tempDir, file1), content1);
|
||||||
|
|
||||||
|
const file2 = "subdir/file2.js";
|
||||||
|
const content2 = "content2";
|
||||||
|
await fs.promises.writeFile(path.join(tempDir, file2), content2);
|
||||||
|
|
||||||
|
const pattern = "**/*.js";
|
||||||
|
const result = await readFilesIntoDict(pattern, tempDir);
|
||||||
|
|
||||||
|
// Keys should be relative paths without extension
|
||||||
|
// On Windows, the path separator might differ, so we should be careful or just check contents
|
||||||
|
|
||||||
|
// Based on implementation:
|
||||||
|
// key = key.slice(prefix.length);
|
||||||
|
// key = path.basename(key, path.extname(key)); // Drop the file suffix -> THIS IS BUGGY for subdirs?
|
||||||
|
|
||||||
|
// Let's check the implementation of readFilesIntoDict again in index.js
|
||||||
|
// It does: key = path.basename(key, path.extname(key));
|
||||||
|
// This removes the directory part! So subdir/file2.js becomes file2
|
||||||
|
|
||||||
|
expect(result["file1"]).toBe(content1);
|
||||||
|
expect(result["file2"]).toBe(content2);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe("glob functionality", () => {
|
describe("glob functionality", () => {
|
||||||
let tempDir;
|
let tempDir;
|
||||||
|
|
||||||
|
|||||||
56821
dist/index.js
vendored
56821
dist/index.js
vendored
File diff suppressed because one or more lines are too long
3
dist/package.json
vendored
Normal file
3
dist/package.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"type": "module"
|
||||||
|
}
|
||||||
30
index.js
30
index.js
@@ -1,8 +1,9 @@
|
|||||||
const { ScreepsAPI } = require("screeps-api");
|
import { ScreepsAPI } from "screeps-api";
|
||||||
const core = require("@actions/core");
|
import * as core from "@actions/core";
|
||||||
const fs = require("fs");
|
import fs from "fs";
|
||||||
const { glob } = require("glob");
|
import { glob } from "glob";
|
||||||
const path = require("path");
|
import path from "path";
|
||||||
|
import { fileURLToPath } from "url";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replaces specific placeholder strings within the provided content with corresponding dynamic values.
|
* Replaces specific placeholder strings within the provided content with corresponding dynamic values.
|
||||||
@@ -17,7 +18,7 @@ const path = require("path");
|
|||||||
* @param {string} content - The string content in which placeholders are to be replaced.
|
* @param {string} content - The string content in which placeholders are to be replaced.
|
||||||
* @returns {string} The content with placeholders replaced by their respective dynamic values.
|
* @returns {string} The content with placeholders replaced by their respective dynamic values.
|
||||||
*/
|
*/
|
||||||
function replacePlaceholders(content, hostname) {
|
export function replacePlaceholders(content, hostname) {
|
||||||
const deployTime = new Date().toISOString();
|
const deployTime = new Date().toISOString();
|
||||||
return content
|
return content
|
||||||
.replace(/{{gitHash}}/g, process.env.GITHUB_SHA)
|
.replace(/{{gitHash}}/g, process.env.GITHUB_SHA)
|
||||||
@@ -37,7 +38,7 @@ function replacePlaceholders(content, hostname) {
|
|||||||
* @param {string} [prefix] - An optional directory prefix to prepend to the glob pattern. This allows searching within a specific directory.
|
* @param {string} [prefix] - An optional directory prefix to prepend to the glob pattern. This allows searching within a specific directory.
|
||||||
* @returns {Promise<string[]>} A promise that resolves with an array of file paths that were processed, or rejects with an error if the process fails.
|
* @returns {Promise<string[]>} A promise that resolves with an array of file paths that were processed, or rejects with an error if the process fails.
|
||||||
*/
|
*/
|
||||||
async function readReplaceAndWriteFiles(pattern, prefix, hostname) {
|
export async function readReplaceAndWriteFiles(pattern, prefix, hostname) {
|
||||||
const globPattern = prefix ? path.join(prefix, pattern) : pattern;
|
const globPattern = prefix ? path.join(prefix, pattern) : pattern;
|
||||||
const files = await glob(globPattern);
|
const files = await glob(globPattern);
|
||||||
|
|
||||||
@@ -58,7 +59,7 @@ async function readReplaceAndWriteFiles(pattern, prefix, hostname) {
|
|||||||
* @param {string} prefix - Directory prefix for file paths.
|
* @param {string} prefix - Directory prefix for file paths.
|
||||||
* @returns {Promise<Object>} - Promise resolving to a dictionary of file contents keyed by filenames.
|
* @returns {Promise<Object>} - Promise resolving to a dictionary of file contents keyed by filenames.
|
||||||
*/
|
*/
|
||||||
async function readFilesIntoDict(pattern, prefix) {
|
export async function readFilesIntoDict(pattern, prefix) {
|
||||||
// Prepend the prefix to the glob pattern
|
// Prepend the prefix to the glob pattern
|
||||||
const globPattern = prefix ? path.join(prefix, pattern) : pattern;
|
const globPattern = prefix ? path.join(prefix, pattern) : pattern;
|
||||||
const files = await glob(globPattern);
|
const files = await glob(globPattern);
|
||||||
@@ -88,7 +89,7 @@ async function readFilesIntoDict(pattern, prefix) {
|
|||||||
* @param {string} password - The password.
|
* @param {string} password - The password.
|
||||||
* @returns {string|null} - Returns an error message if validation fails, otherwise null.
|
* @returns {string|null} - Returns an error message if validation fails, otherwise null.
|
||||||
*/
|
*/
|
||||||
function validateAuthentication(token, username, password) {
|
export function validateAuthentication(token, username, password) {
|
||||||
if (token) {
|
if (token) {
|
||||||
if (username || password) {
|
if (username || password) {
|
||||||
return "Token is defined along with username and/or password.";
|
return "Token is defined along with username and/or password.";
|
||||||
@@ -110,7 +111,7 @@ function validateAuthentication(token, username, password) {
|
|||||||
/**
|
/**
|
||||||
* Posts code to Screeps server.
|
* Posts code to Screeps server.
|
||||||
*/
|
*/
|
||||||
async function postCode() {
|
export async function postCode() {
|
||||||
const protocol = core.getInput("protocol") || "https";
|
const protocol = core.getInput("protocol") || "https";
|
||||||
const hostname = core.getInput("hostname") || "screeps.com";
|
const hostname = core.getInput("hostname") || "screeps.com";
|
||||||
const port = core.getInput("port") || "443";
|
const port = core.getInput("port") || "443";
|
||||||
@@ -174,9 +175,8 @@ async function postCode() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
postCode();
|
|
||||||
|
|
||||||
module.exports = {
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
validateAuthentication,
|
if (process.argv[1] === __filename) {
|
||||||
replacePlaceholders,
|
postCode();
|
||||||
};
|
}
|
||||||
|
|||||||
869
package-lock.json
generated
869
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -2,15 +2,16 @@
|
|||||||
"name": "screeps-deploy-action",
|
"name": "screeps-deploy-action",
|
||||||
"version": "0.1.1",
|
"version": "0.1.1",
|
||||||
"description": "Deploys screeps code to the official game or an pirvate server.",
|
"description": "Deploys screeps code to the official game or an pirvate server.",
|
||||||
|
"type": "module",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node index.js",
|
"start": "node index.js",
|
||||||
"test": "vitest run --globals --coverage",
|
"test": "vitest run --globals --coverage",
|
||||||
"build": "ncc build index.js -o dist --external utf-8-validate --external bufferutil"
|
"build": "ncc build index.js -o dist -m --external utf-8-validate --external bufferutil"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.11.1",
|
"@actions/core": "^3.0.0",
|
||||||
"glob": "^11.0.1",
|
"glob": "^13.0.0",
|
||||||
"screeps-api": "^1.7.2"
|
"screeps-api": "^1.7.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
Reference in New Issue
Block a user