nomoreide 0.1.19 → 0.1.20

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,27 @@
1
+ export type ConfigFileFormat = "env" | "json" | "yaml";
2
+ export interface ConfigFileInfo {
3
+ path: string;
4
+ relativePath: string;
5
+ format: ConfigFileFormat;
6
+ }
7
+ export declare function formatFromName(name: string): ConfigFileFormat | undefined;
8
+ export declare function detectConfigFiles(cwd: string): Promise<ConfigFileInfo[]>;
9
+ export interface BrowseEntry {
10
+ name: string;
11
+ relativePath: string;
12
+ kind: "directory" | "file";
13
+ format?: ConfigFileFormat;
14
+ supported: boolean;
15
+ }
16
+ export interface BrowseResult {
17
+ cwd: string;
18
+ currentPath: string;
19
+ relativePath: string;
20
+ isRoot: boolean;
21
+ entries: BrowseEntry[];
22
+ }
23
+ export declare function browseDirectory(cwd: string, requested: string | undefined): Promise<BrowseResult>;
24
+ export declare class ConfigFilePathError extends Error {
25
+ }
26
+ export declare function resolveConfigFile(cwd: string, requested: string): ConfigFileInfo;
27
+ export declare function validateJson(text: string): void;
@@ -0,0 +1,154 @@
1
+ import { readdir } from "node:fs/promises";
2
+ import { basename, isAbsolute, join, relative, resolve, sep } from "node:path";
3
+ export function formatFromName(name) {
4
+ if (name === ".env" || name.startsWith(".env."))
5
+ return "env";
6
+ if (/^appsettings(\..+)?\.json$/i.test(name))
7
+ return "json";
8
+ if (/^application(-.+)?\.ya?ml$/i.test(name))
9
+ return "yaml";
10
+ return undefined;
11
+ }
12
+ const IGNORED_DIRS = new Set([
13
+ ".git",
14
+ "node_modules",
15
+ "dist",
16
+ "build",
17
+ "out",
18
+ "bin",
19
+ "obj",
20
+ ".next",
21
+ ".nuxt",
22
+ ".turbo",
23
+ ".vite",
24
+ ".cache",
25
+ "coverage",
26
+ "target",
27
+ "venv",
28
+ ".venv",
29
+ "__pycache__",
30
+ ]);
31
+ const MAX_DEPTH = 4;
32
+ const MAX_FILES = 200;
33
+ export async function detectConfigFiles(cwd) {
34
+ const root = resolve(cwd);
35
+ const results = [];
36
+ await walk(root, root, 0, results);
37
+ results.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
38
+ return results;
39
+ }
40
+ async function walk(root, current, depth, results) {
41
+ if (results.length >= MAX_FILES)
42
+ return;
43
+ let entries;
44
+ try {
45
+ entries = await readdir(current, { withFileTypes: true });
46
+ }
47
+ catch {
48
+ return;
49
+ }
50
+ for (const entry of entries) {
51
+ if (results.length >= MAX_FILES)
52
+ return;
53
+ if (entry.name.startsWith(".") && entry.isDirectory() && IGNORED_DIRS.has(entry.name)) {
54
+ continue;
55
+ }
56
+ if (entry.isDirectory()) {
57
+ if (IGNORED_DIRS.has(entry.name))
58
+ continue;
59
+ if (depth + 1 > MAX_DEPTH)
60
+ continue;
61
+ await walk(root, join(current, entry.name), depth + 1, results);
62
+ continue;
63
+ }
64
+ if (!entry.isFile())
65
+ continue;
66
+ const format = formatFromName(entry.name);
67
+ if (!format)
68
+ continue;
69
+ const path = join(current, entry.name);
70
+ results.push({ path, relativePath: relative(root, path), format });
71
+ }
72
+ }
73
+ export async function browseDirectory(cwd, requested) {
74
+ const root = resolve(cwd);
75
+ const current = requested
76
+ ? assertWithinRoot(root, isAbsolute(requested) ? resolve(requested) : resolve(root, requested))
77
+ : root;
78
+ const rel = relative(root, current);
79
+ const entries = await readdir(current, { withFileTypes: true }).catch(() => []);
80
+ const items = [];
81
+ for (const entry of entries) {
82
+ if (entry.name.startsWith(".") && IGNORED_DIRS.has(entry.name))
83
+ continue;
84
+ if (entry.isDirectory()) {
85
+ if (IGNORED_DIRS.has(entry.name))
86
+ continue;
87
+ const fullPath = join(current, entry.name);
88
+ items.push({
89
+ name: entry.name,
90
+ relativePath: relative(root, fullPath),
91
+ kind: "directory",
92
+ supported: true,
93
+ });
94
+ continue;
95
+ }
96
+ if (!entry.isFile())
97
+ continue;
98
+ const format = formatFromName(entry.name);
99
+ const fullPath = join(current, entry.name);
100
+ items.push({
101
+ name: entry.name,
102
+ relativePath: relative(root, fullPath),
103
+ kind: "file",
104
+ format,
105
+ supported: !!format,
106
+ });
107
+ }
108
+ items.sort((a, b) => {
109
+ if (a.kind !== b.kind)
110
+ return a.kind === "directory" ? -1 : 1;
111
+ return a.name.localeCompare(b.name);
112
+ });
113
+ return {
114
+ cwd: root,
115
+ currentPath: current,
116
+ relativePath: rel,
117
+ isRoot: current === root,
118
+ entries: items,
119
+ };
120
+ }
121
+ function assertWithinRoot(root, candidate) {
122
+ const rel = relative(root, candidate);
123
+ if (rel.startsWith("..") || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
124
+ throw new ConfigFilePathError("Path must live inside the service directory.");
125
+ }
126
+ return candidate;
127
+ }
128
+ export class ConfigFilePathError extends Error {
129
+ }
130
+ export function resolveConfigFile(cwd, requested) {
131
+ if (!requested || requested.includes("\0")) {
132
+ throw new ConfigFilePathError("Invalid config file path.");
133
+ }
134
+ const absolute = isAbsolute(requested) ? resolve(requested) : resolve(cwd, requested);
135
+ const rel = relative(cwd, absolute);
136
+ if (rel.startsWith("..") || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
137
+ throw new ConfigFilePathError("Config file must live inside the service directory.");
138
+ }
139
+ const name = basename(absolute);
140
+ const format = formatFromName(name);
141
+ if (!format) {
142
+ throw new ConfigFilePathError(`Unsupported config file: ${name}`);
143
+ }
144
+ return { path: absolute, relativePath: rel, format };
145
+ }
146
+ export function validateJson(text) {
147
+ try {
148
+ JSON.parse(text);
149
+ }
150
+ catch (error) {
151
+ throw new Error(`Invalid JSON: ${error instanceof Error ? error.message : String(error)}`);
152
+ }
153
+ }
154
+ //# sourceMappingURL=config-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-files.js","sourceRoot":"","sources":["../../src/core/config-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface EnvEntry {
2
+ key: string;
3
+ value: string;
4
+ }
5
+ export type EnvLine = {
6
+ kind: "kv";
7
+ key: string;
8
+ value: string;
9
+ quote: "" | "'" | '"';
10
+ } | {
11
+ kind: "raw";
12
+ text: string;
13
+ };
14
+ export declare function envFilePath(serviceCwd: string): string;
15
+ export declare function parseEnvFile(content: string): EnvLine[];
16
+ export declare function serializeEnvLines(lines: EnvLine[]): string;
17
+ export declare function mergeEntries(existing: EnvLine[], entries: EnvEntry[]): EnvLine[];
18
+ export declare function entriesFromLines(lines: EnvLine[]): EnvEntry[];
19
+ export declare function readEnvFile(path: string): Promise<{
20
+ exists: boolean;
21
+ lines: EnvLine[];
22
+ }>;
23
+ export declare function writeEnvFile(path: string, lines: EnvLine[]): Promise<void>;
24
+ export declare function looksSecret(key: string): boolean;
@@ -0,0 +1,122 @@
1
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ const KV_RE = /^([A-Za-z_][A-Za-z0-9_.]*)=(.*)$/;
4
+ export function envFilePath(serviceCwd) {
5
+ return join(serviceCwd, ".env");
6
+ }
7
+ export function parseEnvFile(content) {
8
+ const lines = content.split(/\r?\n/);
9
+ if (lines.length > 0 && lines[lines.length - 1] === "") {
10
+ lines.pop();
11
+ }
12
+ return lines.map((line) => {
13
+ const trimmed = line.trimStart();
14
+ if (trimmed === "" || trimmed.startsWith("#")) {
15
+ return { kind: "raw", text: line };
16
+ }
17
+ const match = KV_RE.exec(line);
18
+ if (!match) {
19
+ return { kind: "raw", text: line };
20
+ }
21
+ const key = match[1];
22
+ const rawValue = match[2];
23
+ const { value, quote } = unquote(rawValue);
24
+ return { kind: "kv", key, value, quote };
25
+ });
26
+ }
27
+ export function serializeEnvLines(lines) {
28
+ return lines
29
+ .map((line) => {
30
+ if (line.kind === "raw")
31
+ return line.text;
32
+ return `${line.key}=${quote(line.value, line.quote)}`;
33
+ })
34
+ .join("\n") + "\n";
35
+ }
36
+ export function mergeEntries(existing, entries) {
37
+ const keep = new Set(entries.map((entry) => entry.key));
38
+ const byKey = new Map(entries.map((entry) => [entry.key, entry.value]));
39
+ const seen = new Set();
40
+ const result = [];
41
+ for (const line of existing) {
42
+ if (line.kind === "raw") {
43
+ result.push(line);
44
+ continue;
45
+ }
46
+ if (!keep.has(line.key))
47
+ continue;
48
+ seen.add(line.key);
49
+ const value = byKey.get(line.key) ?? "";
50
+ result.push({
51
+ kind: "kv",
52
+ key: line.key,
53
+ value,
54
+ quote: pickQuote(value, line.quote),
55
+ });
56
+ }
57
+ for (const entry of entries) {
58
+ if (seen.has(entry.key))
59
+ continue;
60
+ result.push({
61
+ kind: "kv",
62
+ key: entry.key,
63
+ value: entry.value,
64
+ quote: pickQuote(entry.value, ""),
65
+ });
66
+ }
67
+ return result;
68
+ }
69
+ export function entriesFromLines(lines) {
70
+ return lines
71
+ .filter((line) => line.kind === "kv")
72
+ .map((line) => ({ key: line.key, value: line.value }));
73
+ }
74
+ export async function readEnvFile(path) {
75
+ try {
76
+ const content = await readFile(path, "utf8");
77
+ return { exists: true, lines: parseEnvFile(content) };
78
+ }
79
+ catch (error) {
80
+ if (error.code === "ENOENT") {
81
+ return { exists: false, lines: [] };
82
+ }
83
+ throw error;
84
+ }
85
+ }
86
+ export async function writeEnvFile(path, lines) {
87
+ await mkdir(dirname(path), { recursive: true });
88
+ await writeFile(path, serializeEnvLines(lines));
89
+ }
90
+ function unquote(raw) {
91
+ if (raw.length >= 2) {
92
+ const first = raw[0];
93
+ const last = raw[raw.length - 1];
94
+ if (first === '"' && last === '"') {
95
+ return { value: raw.slice(1, -1).replace(/\\"/g, '"').replace(/\\n/g, "\n"), quote: '"' };
96
+ }
97
+ if (first === "'" && last === "'") {
98
+ return { value: raw.slice(1, -1), quote: "'" };
99
+ }
100
+ }
101
+ return { value: raw, quote: "" };
102
+ }
103
+ function quote(value, preferred) {
104
+ const needsQuoting = /[\s#"']/.test(value) || value === "";
105
+ if (!needsQuoting && preferred === "")
106
+ return value;
107
+ if (preferred === "'" && !value.includes("'"))
108
+ return `'${value}'`;
109
+ const escaped = value.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\n");
110
+ return `"${escaped}"`;
111
+ }
112
+ function pickQuote(value, current) {
113
+ if (current !== "")
114
+ return current;
115
+ return /[\s#"']/.test(value) || value === "" ? '"' : "";
116
+ }
117
+ const SECRET_HINTS = ["secret", "token", "key", "password", "passwd", "auth", "credential"];
118
+ export function looksSecret(key) {
119
+ const lower = key.toLowerCase();
120
+ return SECRET_HINTS.some((hint) => lower.includes(hint));
121
+ }
122
+ //# sourceMappingURL=env-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-file.js","sourceRoot":"","sources":["../../src/core/env-file.ts"],"names":[],"mappings":"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"}