purus 0.0.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+ const { execFileSync } = require("child_process");
6
+ const { loadConfig } = require("./config.js");
7
+ const { compile } = require("./purus-core.js");
8
+
9
+ const args = process.argv.slice(3);
10
+
11
+ let file = null;
12
+ let directory = null;
13
+ let noHeader = false;
14
+
15
+ for (let i = 0; i < args.length; i++) {
16
+ if (args[i] === "--no-header") {
17
+ noHeader = true;
18
+ } else if (args[i] === "--directory" || args[i] === "-d") {
19
+ directory = args[++i];
20
+ } else if (!args[i].startsWith("-")) {
21
+ file = args[i];
22
+ }
23
+ }
24
+
25
+ if (file) {
26
+ // Single file - compile and run
27
+ const source = fs.readFileSync(file, "utf8");
28
+ const js = compile(source, { header: false });
29
+ const m = new (require("module"))();
30
+ m._compile(js, file);
31
+ } else {
32
+ let entryDir;
33
+ let useHeader;
34
+
35
+ if (directory) {
36
+ entryDir = path.resolve(directory);
37
+ useHeader = false;
38
+ } else {
39
+ const result = loadConfig();
40
+ if (!result) {
41
+ console.log("Error: no input file specified and no config.purus found");
42
+ console.log("");
43
+ console.log("Usage:");
44
+ console.log(" purus run <file> Run a single file");
45
+ console.log(
46
+ " purus run --directory <dir> Run all files in directory"
47
+ );
48
+ console.log(" purus run Run using config.purus");
49
+ process.exit(1);
50
+ }
51
+
52
+ const { config, configDir } = result;
53
+ entryDir = path.resolve(configDir, config.entry || "src");
54
+ useHeader = false;
55
+ }
56
+
57
+ if (!fs.existsSync(entryDir)) {
58
+ console.log(`Error: entry directory '${entryDir}' not found`);
59
+ process.exit(1);
60
+ }
61
+
62
+ const stat = fs.statSync(entryDir);
63
+ let files;
64
+
65
+ if (stat.isFile()) {
66
+ files = [entryDir];
67
+ } else {
68
+ files = findPurusFiles(entryDir);
69
+ }
70
+
71
+ if (files.length === 0) {
72
+ console.log(`No .purus files found in ${entryDir}`);
73
+ process.exit(0);
74
+ }
75
+
76
+ for (const f of files) {
77
+ const source = fs.readFileSync(f, "utf8");
78
+ const js = compile(source, { header: false });
79
+
80
+ const tmpFile = path.join(
81
+ require("os").tmpdir(),
82
+ `purus_run_${Date.now()}_${Math.random().toString(36).slice(2)}.js`
83
+ );
84
+ try {
85
+ fs.writeFileSync(tmpFile, js, "utf8");
86
+ execFileSync(process.execPath, [tmpFile], {
87
+ stdio: "inherit",
88
+ cwd: path.dirname(f),
89
+ });
90
+ } finally {
91
+ try {
92
+ fs.unlinkSync(tmpFile);
93
+ } catch {
94
+ // ignore cleanup errors
95
+ }
96
+ }
97
+ }
98
+ }
99
+
100
+ function findPurusFiles(dir) {
101
+ const results = [];
102
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
103
+ const fullPath = path.join(dir, entry.name);
104
+ if (entry.isDirectory()) {
105
+ results.push(...findPurusFiles(fullPath));
106
+ } else if (/\.(c|m)?purus$/.test(entry.name)) {
107
+ results.push(fullPath);
108
+ }
109
+ }
110
+ return results;
111
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "purus",
3
- "version": "0.0.3",
3
+ "version": "0.2.0",
4
4
  "description": "A language that compiles to JavaScript — no Shift key required",
5
5
  "main": "index.js",
6
6
  "module": "index.mjs",