-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmklib.js
More file actions
93 lines (90 loc) · 3.46 KB
/
mklib.js
File metadata and controls
93 lines (90 loc) · 3.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import * as fs from "fs/promises";
import {Writable} from "stream";
import luamin from "luamin";
/**
* @param {string} str
* @param {number} len
* @param {string|undefined} c
*/
function pad(str, len, c) {return str.length < len ? str.substring(0, len) + (c ?? " ").repeat(len - str.length) : str;}
/**
* Saves a table to an archive file
* @param {Array} data
* @param {Writable|undefined} file
* @returns {Buffer}
*/
function ar_save(data, file) {
let retval = Buffer.alloc(0);
if (file === undefined || file === null) {
file = new Writable();
file._write = (chunk, enc, cb) => {retval += chunk; cb();}
file._final = () => {};
file._destroy = () => {};
}
file.write("!<arch>\n")
let name_table = {}
let name_str = null
for (let v of data) if (v.name.length > 15) {
name_table[v.name] = (name_str ?? "").length
name_str = (name_str ?? "") + v.name + "/\n"
}
if (name_str !== null) {
file.write("// 0 0 0 666 " + pad(name_str.length.toString(), 10) + "`\n" + name_str)
if (name_str.length % 2 == 1) file.write("\n")
}
for (let v of data) {
let name = name_table[v.name] !== undefined ? "/" + name_table[v.name] : v.name + (name_str !== null ? "/" : "")
file.write(pad(name, 16) + pad(v.timestamp.toString(), 12) + pad(v.owner.toString(), 6) + pad(v.group.toString(), 6))
file.write(pad(v.mode.toString(8), 8) + pad(v.data.length.toString(), 10) + "`\n" + v.data)
if (v.data.length % 2 == 1) file.write("\n")
}
return retval
}
let files = []
fs.readdir("bin/CCKit2")
.then(names => Promise.all(names.flatMap(name => name.indexOf(".lua") !== -1 && name.indexOf(".d.lua") === -1 ?
fs.readFile("bin/CCKit2/" + name)
.then(data => data.indexOf("local ____exports = {}\nreturn ____exports") === -1 ? files.push({
name: name,
timestamp: Math.floor(Date.now() / 1000),
owner: 0,
group: 0,
mode: 0o755,
data: luamin.minify(data.toString('latin1'))
}) : null)
: null)))
.then(() => fs.readFile("src/CCKit2/LuaWrappers.lua"))
.then(data => files.push({
name: "LuaWrappers.lua",
timestamp: Math.floor(Date.now() / 1000),
owner: 0,
group: 0,
mode: 0o755,
data: luamin.minify(data.toString('latin1'))
}))
.then(() => fs.writeFile("bin/libCCKit2.a", ar_save(files)))
.then(() => fs.readFile("bin/typescript.lua"))
.then(data => files.push({
name: "typescript.lua",
timestamp: Math.floor(Date.now() / 1000),
owner: 0,
group: 0,
mode: 0o755,
data: luamin.minify(data.toString('latin1'))
}))
.then(() => fs.readFile("../CCKit2-craftos/bin/CCCraftOSWindowManagerConnection.lua"))
.then(data => files.push({
name: "CCCraftOSWindowManagerConnection.lua",
timestamp: Math.floor(Date.now() / 1000),
owner: 0,
group: 0,
mode: 0o755,
data: luamin.minify(data.toString('latin1'))
}))
.then(() => fs.readFile("../CCKit2-craftos/bin/CCDefaultWindowManagerConnection.lua"))
.then(data => {
for (let file of files)
if (file.name === "CCDefaultWindowManagerConnection.lua")
file.data = luamin.minify(data.toString('latin1'));
})
.then(() => fs.writeFile("bin/libCCKit2-craftos.a", ar_save(files)));