arc-lang 0.5.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,180 @@
1
+ // Arc Package Manager
2
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
3
+ import { resolve } from "path";
4
+ export function parseArcToml(content) {
5
+ const result = {
6
+ package: { name: "", version: "0.1.0", description: "", author: "", license: "MIT" },
7
+ dependencies: {},
8
+ "dev-dependencies": {},
9
+ };
10
+ let currentSection = "";
11
+ for (const line of content.split("\n")) {
12
+ const trimmed = line.trim();
13
+ if (!trimmed || trimmed.startsWith("#"))
14
+ continue;
15
+ const sectionMatch = trimmed.match(/^\[(.+)\]$/);
16
+ if (sectionMatch) {
17
+ currentSection = sectionMatch[1];
18
+ continue;
19
+ }
20
+ const kvMatch = trimmed.match(/^(\S+)\s*=\s*"(.*)"\s*$/);
21
+ if (kvMatch) {
22
+ const [, key, value] = kvMatch;
23
+ if (currentSection === "package") {
24
+ result.package[key] = value;
25
+ }
26
+ else if (currentSection === "dependencies") {
27
+ result.dependencies[key] = value;
28
+ }
29
+ else if (currentSection === "dev-dependencies") {
30
+ result["dev-dependencies"][key] = value;
31
+ }
32
+ }
33
+ }
34
+ return result;
35
+ }
36
+ export function serializeArcToml(toml) {
37
+ let out = "[package]\n";
38
+ for (const [k, v] of Object.entries(toml.package)) {
39
+ out += `${k} = "${v}"\n`;
40
+ }
41
+ out += "\n[dependencies]\n";
42
+ if (Object.keys(toml.dependencies).length === 0) {
43
+ out += "# name = \"version\"\n";
44
+ }
45
+ else {
46
+ for (const [k, v] of Object.entries(toml.dependencies)) {
47
+ out += `${k} = "${v}"\n`;
48
+ }
49
+ }
50
+ out += "\n[dev-dependencies]\n";
51
+ if (Object.keys(toml["dev-dependencies"]).length === 0) {
52
+ out += "# test-utils = \"0.2.0\"\n";
53
+ }
54
+ else {
55
+ for (const [k, v] of Object.entries(toml["dev-dependencies"])) {
56
+ out += `${k} = "${v}"\n`;
57
+ }
58
+ }
59
+ return out;
60
+ }
61
+ export function findArcToml(startDir) {
62
+ const dir = startDir || process.cwd();
63
+ const p = resolve(dir, "arc.toml");
64
+ if (existsSync(p))
65
+ return p;
66
+ throw new Error("No arc.toml found in current directory");
67
+ }
68
+ export function readToml(dir) {
69
+ const p = findArcToml(dir);
70
+ return parseArcToml(readFileSync(p, "utf-8"));
71
+ }
72
+ export function writeToml(toml, dir) {
73
+ const d = dir || process.cwd();
74
+ writeFileSync(resolve(d, "arc.toml"), serializeArcToml(toml));
75
+ }
76
+ export function generateLockFile(toml) {
77
+ let out = "# arc.lock - Auto-generated. Do not edit.\n\n";
78
+ const allDeps = { ...toml.dependencies, ...toml["dev-dependencies"] };
79
+ for (const [name, version] of Object.entries(allDeps)) {
80
+ out += `[[package]]\n`;
81
+ out += `name = "${name}"\n`;
82
+ out += `version = "${version}"\n`;
83
+ out += `source = "${version.startsWith("github:") ? version : "registry"}"\n`;
84
+ out += `\n`;
85
+ }
86
+ return out;
87
+ }
88
+ export function pkgInit(dir) {
89
+ const d = dir || process.cwd();
90
+ const tomlPath = resolve(d, "arc.toml");
91
+ if (existsSync(tomlPath)) {
92
+ console.log("arc.toml already exists");
93
+ return;
94
+ }
95
+ const name = d.split(/[\\/]/).pop() || "my-project";
96
+ const toml = {
97
+ package: { name, version: "0.1.0", description: "", author: "", license: "MIT" },
98
+ dependencies: {},
99
+ "dev-dependencies": {},
100
+ };
101
+ writeFileSync(tomlPath, serializeArcToml(toml));
102
+ console.log("Created arc.toml");
103
+ }
104
+ export function pkgAdd(name, options = {}) {
105
+ const toml = readToml(options.dir);
106
+ const section = options.dev ? "dev-dependencies" : "dependencies";
107
+ // Support github:user/repo format
108
+ let version = "latest";
109
+ if (name.startsWith("github:")) {
110
+ version = name;
111
+ name = name.replace("github:", "").split("/").pop() || name;
112
+ }
113
+ toml[section][name] = version;
114
+ writeToml(toml, options.dir);
115
+ console.log(`Added ${name} to [${section}]`);
116
+ }
117
+ export function pkgRemove(name, dir) {
118
+ const toml = readToml(dir);
119
+ let found = false;
120
+ if (name in toml.dependencies) {
121
+ delete toml.dependencies[name];
122
+ found = true;
123
+ }
124
+ if (name in toml["dev-dependencies"]) {
125
+ delete toml["dev-dependencies"][name];
126
+ found = true;
127
+ }
128
+ if (!found) {
129
+ console.log(`Package '${name}' not found in dependencies`);
130
+ return;
131
+ }
132
+ writeToml(toml, dir);
133
+ console.log(`Removed ${name}`);
134
+ }
135
+ export function pkgList(dir) {
136
+ const toml = readToml(dir);
137
+ const deps = Object.entries(toml.dependencies);
138
+ const devDeps = Object.entries(toml["dev-dependencies"]);
139
+ if (deps.length === 0 && devDeps.length === 0) {
140
+ console.log("No dependencies");
141
+ return;
142
+ }
143
+ if (deps.length > 0) {
144
+ console.log("Dependencies:");
145
+ for (const [k, v] of deps)
146
+ console.log(` ${k}: ${v}`);
147
+ }
148
+ if (devDeps.length > 0) {
149
+ console.log("Dev Dependencies:");
150
+ for (const [k, v] of devDeps)
151
+ console.log(` ${k}: ${v}`);
152
+ }
153
+ }
154
+ export function pkgInstall(dir) {
155
+ const d = dir || process.cwd();
156
+ const toml = readToml(d);
157
+ const modulesDir = resolve(d, "arc_modules");
158
+ if (!existsSync(modulesDir)) {
159
+ mkdirSync(modulesDir, { recursive: true });
160
+ }
161
+ // Generate lock file
162
+ const lockContent = generateLockFile(toml);
163
+ writeFileSync(resolve(d, "arc.lock"), lockContent);
164
+ const allDeps = { ...toml.dependencies, ...toml["dev-dependencies"] };
165
+ const count = Object.keys(allDeps).length;
166
+ if (count === 0) {
167
+ console.log("No dependencies to install");
168
+ }
169
+ else {
170
+ // For now, create placeholder directories for each dependency
171
+ for (const [name] of Object.entries(allDeps)) {
172
+ const pkgDir = resolve(modulesDir, name);
173
+ if (!existsSync(pkgDir)) {
174
+ mkdirSync(pkgDir, { recursive: true });
175
+ }
176
+ }
177
+ console.log(`Installed ${count} package(s)`);
178
+ }
179
+ console.log("Generated arc.lock");
180
+ }
@@ -0,0 +1,42 @@
1
+ import { Token } from "./lexer.js";
2
+ import * as AST from "./ast.js";
3
+ export declare class ParseError extends Error {
4
+ loc: AST.Loc;
5
+ constructor(msg: string, loc: AST.Loc);
6
+ }
7
+ export declare class Parser {
8
+ private pos;
9
+ private tokens;
10
+ constructor(tokens: Token[]);
11
+ private peek;
12
+ private at;
13
+ private loc;
14
+ private advance;
15
+ private expect;
16
+ private skipSemicolons;
17
+ parse(): AST.Program;
18
+ private parseStmt;
19
+ private parsePub;
20
+ private parseLet;
21
+ private parseAsync;
22
+ private parseFn;
23
+ private parseFor;
24
+ private parseDo;
25
+ private parseUse;
26
+ private parseType;
27
+ private parseTypeExpr;
28
+ private parseTypeAtom;
29
+ private parseBlock;
30
+ private parseExpr;
31
+ private infixPrec;
32
+ private binaryOp;
33
+ private parsePrefix;
34
+ private parseStringInterp;
35
+ private parseListOrComprehension;
36
+ private parseMapOrBlock;
37
+ private parseIf;
38
+ private parseMatch;
39
+ private parsePattern;
40
+ private parseToolCall;
41
+ }
42
+ export declare function parse(tokens: Token[]): AST.Program;