funcity-cli 1.1.0 → 1.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.
- package/dist/index.cjs +123 -13
- package/dist/index.cjs.map +1 -1
- package/package.json +7 -7
package/dist/index.cjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/*!
|
|
3
3
|
* name: funcity-cli
|
|
4
|
-
* version: 1.
|
|
4
|
+
* version: 1.2.0
|
|
5
5
|
* description: A functional language interpreter with text processing
|
|
6
6
|
* author: Kouji Matsui (@kekyo@mi.kekyo.net)
|
|
7
7
|
* license: MIT
|
|
8
8
|
* repository.url: https://github.com/kekyo/funcity
|
|
9
|
-
* git.commit.hash:
|
|
9
|
+
* git.commit.hash: ef0c333859e785404f4939a0050e42207f7af230
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
"use strict";
|
|
@@ -36,10 +36,10 @@ function _interopNamespaceDefault(e) {
|
|
|
36
36
|
const os__namespace = /* @__PURE__ */ _interopNamespaceDefault(os);
|
|
37
37
|
const path__namespace = /* @__PURE__ */ _interopNamespaceDefault(path);
|
|
38
38
|
const name = "funcity-cli";
|
|
39
|
-
const version = "1.
|
|
39
|
+
const version = "1.2.0";
|
|
40
40
|
const description = "A functional language interpreter with text processing";
|
|
41
41
|
const repository_url = "https://github.com/kekyo/funcity";
|
|
42
|
-
const git_commit_hash = "
|
|
42
|
+
const git_commit_hash = "ef0c333859e785404f4939a0050e42207f7af230";
|
|
43
43
|
const continuationPromptText = "? ";
|
|
44
44
|
let replReadlineInterface;
|
|
45
45
|
const createReplReadline = () => {
|
|
@@ -120,6 +120,79 @@ const getErrorCode = (error) => {
|
|
|
120
120
|
}
|
|
121
121
|
return error.code;
|
|
122
122
|
};
|
|
123
|
+
const fromError = (error) => {
|
|
124
|
+
return error instanceof Error ? error.message : String(error);
|
|
125
|
+
};
|
|
126
|
+
const isRecordObject = (value) => {
|
|
127
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
128
|
+
};
|
|
129
|
+
const parseDefineOption = (definition) => {
|
|
130
|
+
const separatorIndex = definition.indexOf("=");
|
|
131
|
+
if (separatorIndex < 0) {
|
|
132
|
+
if (definition.length <= 0) {
|
|
133
|
+
throw new Error("invalid -D option: variable name is empty");
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
name: definition,
|
|
137
|
+
value: true
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const name2 = definition.slice(0, separatorIndex);
|
|
141
|
+
const value = definition.slice(separatorIndex + 1);
|
|
142
|
+
if (name2.length <= 0) {
|
|
143
|
+
throw new Error(
|
|
144
|
+
`invalid -D option: variable name is empty (${definition})`
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
return { name: name2, value };
|
|
148
|
+
};
|
|
149
|
+
const readPredefinedVariablesFromJson = async (filePath) => {
|
|
150
|
+
const absolutePath = path__namespace.resolve(filePath);
|
|
151
|
+
let source = "";
|
|
152
|
+
try {
|
|
153
|
+
source = await promises.readFile(absolutePath, "utf8");
|
|
154
|
+
} catch (error) {
|
|
155
|
+
throw new Error(
|
|
156
|
+
`failed to read JSON file: ${filePath} (${fromError(error)})`
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
let parsed;
|
|
160
|
+
try {
|
|
161
|
+
parsed = JSON.parse(source);
|
|
162
|
+
} catch (error) {
|
|
163
|
+
throw new Error(
|
|
164
|
+
`failed to parse JSON file: ${filePath} (${fromError(error)})`
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
if (!isRecordObject(parsed)) {
|
|
168
|
+
throw new Error(
|
|
169
|
+
`JSON root must be an object: ${filePath} (actual: ${typeof parsed})`
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
return parsed;
|
|
173
|
+
};
|
|
174
|
+
const resolvePredefinedVariables = async (options) => {
|
|
175
|
+
const predefinedVariables = {};
|
|
176
|
+
for (const jsonFilePath of options.defineJson) {
|
|
177
|
+
const record = await readPredefinedVariablesFromJson(jsonFilePath);
|
|
178
|
+
Object.assign(predefinedVariables, record);
|
|
179
|
+
}
|
|
180
|
+
for (const definition of options.define) {
|
|
181
|
+
const { name: name2, value } = parseDefineOption(definition);
|
|
182
|
+
predefinedVariables[name2] = value;
|
|
183
|
+
}
|
|
184
|
+
return predefinedVariables;
|
|
185
|
+
};
|
|
186
|
+
const applyPredefinedVariablesToContext = (context, predefinedVariables) => {
|
|
187
|
+
Object.entries(predefinedVariables).forEach(([name2, value]) => {
|
|
188
|
+
context.setValue(name2, value, void 0);
|
|
189
|
+
});
|
|
190
|
+
};
|
|
191
|
+
const applyPredefinedVariablesToReplSession = (session, predefinedVariables) => {
|
|
192
|
+
Object.entries(predefinedVariables).forEach(([name2, value]) => {
|
|
193
|
+
session.setVariable(name2, value);
|
|
194
|
+
});
|
|
195
|
+
};
|
|
123
196
|
const readRcScript = async () => {
|
|
124
197
|
const rcPath = path__namespace.join(os__namespace.homedir(), ".funcityrc");
|
|
125
198
|
try {
|
|
@@ -194,7 +267,7 @@ const runScriptWithContext = async (context, warningLogs, script, signal, onOutp
|
|
|
194
267
|
throw error;
|
|
195
268
|
}
|
|
196
269
|
};
|
|
197
|
-
const createReplSession = () => {
|
|
270
|
+
const createReplSession = (predefinedVariables = {}) => {
|
|
198
271
|
const exitSymbol = /* @__PURE__ */ Symbol("exit");
|
|
199
272
|
const replReadline = createReplReadline();
|
|
200
273
|
const require2 = node.createRequireFunction();
|
|
@@ -202,6 +275,7 @@ const createReplSession = () => {
|
|
|
202
275
|
funcity.objectVariables,
|
|
203
276
|
funcity.fetchVariables,
|
|
204
277
|
node.nodeJsVariables,
|
|
278
|
+
predefinedVariables,
|
|
205
279
|
{
|
|
206
280
|
require: require2,
|
|
207
281
|
prompt: "funcity> ",
|
|
@@ -303,7 +377,7 @@ const loadRcForRepl = async (session) => {
|
|
|
303
377
|
console.log(output);
|
|
304
378
|
}
|
|
305
379
|
};
|
|
306
|
-
const runRepl = async (loadRc) => {
|
|
380
|
+
const runRepl = async (loadRc, predefinedVariables) => {
|
|
307
381
|
console.log(
|
|
308
382
|
`${name} [${version}-${git_commit_hash}]`
|
|
309
383
|
);
|
|
@@ -311,10 +385,11 @@ const runRepl = async (loadRc) => {
|
|
|
311
385
|
console.log(`${repository_url}`);
|
|
312
386
|
console.log(`Type 'exit' to exit CLI`);
|
|
313
387
|
console.log("");
|
|
314
|
-
const session = createReplSession();
|
|
388
|
+
const session = createReplSession(predefinedVariables);
|
|
315
389
|
if (loadRc) {
|
|
316
390
|
await loadRcForRepl(session);
|
|
317
391
|
}
|
|
392
|
+
applyPredefinedVariablesToReplSession(session, predefinedVariables);
|
|
318
393
|
session.setVariable("require", node.createRequireFunction(process.cwd()));
|
|
319
394
|
const rl = readline.createInterface({
|
|
320
395
|
input: process.stdin,
|
|
@@ -435,7 +510,7 @@ const loadRcForContext = async (context, warningLogs) => {
|
|
|
435
510
|
console.log(output);
|
|
436
511
|
}
|
|
437
512
|
};
|
|
438
|
-
const runScript = async (input, loadRc) => {
|
|
513
|
+
const runScript = async (input, loadRc, predefinedVariables) => {
|
|
439
514
|
const isStdin = input === "-";
|
|
440
515
|
const source = isStdin ? "<stdin>" : input;
|
|
441
516
|
const script = isStdin ? await readStream(process.stdin) : await promises.readFile(input, "utf8");
|
|
@@ -444,6 +519,7 @@ const runScript = async (input, loadRc) => {
|
|
|
444
519
|
funcity.objectVariables,
|
|
445
520
|
funcity.fetchVariables,
|
|
446
521
|
node.nodeJsVariables,
|
|
522
|
+
predefinedVariables,
|
|
447
523
|
{
|
|
448
524
|
require: node.createRequireFunction(loadRc ? os__namespace.homedir() : basePath)
|
|
449
525
|
}
|
|
@@ -453,6 +529,7 @@ const runScript = async (input, loadRc) => {
|
|
|
453
529
|
if (loadRc) {
|
|
454
530
|
await loadRcForContext(reducerContext, warningLogs);
|
|
455
531
|
}
|
|
532
|
+
applyPredefinedVariablesToContext(reducerContext, predefinedVariables);
|
|
456
533
|
reducerContext.setValue(
|
|
457
534
|
"require",
|
|
458
535
|
node.createRequireFunction(basePath),
|
|
@@ -486,7 +563,15 @@ const findExplicitCommand = (args) => {
|
|
|
486
563
|
index += 1;
|
|
487
564
|
continue;
|
|
488
565
|
}
|
|
489
|
-
if (arg
|
|
566
|
+
if (arg === "-D" || arg === "--define") {
|
|
567
|
+
index += 1;
|
|
568
|
+
continue;
|
|
569
|
+
}
|
|
570
|
+
if (arg === "-d" || arg === "--define-json") {
|
|
571
|
+
index += 1;
|
|
572
|
+
continue;
|
|
573
|
+
}
|
|
574
|
+
if (arg.startsWith("--input=") || arg.startsWith("--define=") || arg.startsWith("--define-json=")) {
|
|
490
575
|
continue;
|
|
491
576
|
}
|
|
492
577
|
if (arg.startsWith("-")) {
|
|
@@ -523,6 +608,17 @@ const injectDefaultCommand = (argv) => {
|
|
|
523
608
|
const [execPath = "node", scriptPath = "funcity"] = argv;
|
|
524
609
|
return [execPath, scriptPath, command, ...args];
|
|
525
610
|
};
|
|
611
|
+
const collectOptionValues = (value, previous) => {
|
|
612
|
+
return [...previous, value];
|
|
613
|
+
};
|
|
614
|
+
const getRootOptions = (command) => {
|
|
615
|
+
const options = command.parent?.opts() ?? {};
|
|
616
|
+
return {
|
|
617
|
+
rc: options.rc ?? true,
|
|
618
|
+
define: options.define ?? [],
|
|
619
|
+
defineJson: options.defineJson ?? []
|
|
620
|
+
};
|
|
621
|
+
};
|
|
526
622
|
const runMain = async (argv = process.argv) => {
|
|
527
623
|
const program = new commander.Command();
|
|
528
624
|
program.name(name);
|
|
@@ -538,9 +634,22 @@ ${description}
|
|
|
538
634
|
);
|
|
539
635
|
program.showHelpAfterError(true);
|
|
540
636
|
program.addOption(new commander.Option("--no-rc", "Do not load ~/.funcityrc"));
|
|
637
|
+
program.addOption(
|
|
638
|
+
new commander.Option(
|
|
639
|
+
"-D, --define <name[=value]>",
|
|
640
|
+
"Predefine a variable. If value is omitted, it becomes true."
|
|
641
|
+
).argParser(collectOptionValues).default([])
|
|
642
|
+
);
|
|
643
|
+
program.addOption(
|
|
644
|
+
new commander.Option(
|
|
645
|
+
"-d, --define-json <path>",
|
|
646
|
+
"Load predefined variables from a JSON file (root must be object)."
|
|
647
|
+
).argParser(collectOptionValues).default([])
|
|
648
|
+
);
|
|
541
649
|
program.command("repl").summary("Start an interactive REPL session").action(async (_options, command) => {
|
|
542
|
-
const
|
|
543
|
-
await
|
|
650
|
+
const rootOptions = getRootOptions(command);
|
|
651
|
+
const predefinedVariables = await resolvePredefinedVariables(rootOptions);
|
|
652
|
+
await runRepl(rootOptions.rc, predefinedVariables);
|
|
544
653
|
});
|
|
545
654
|
program.command("run").summary("Run a script from a file or stdin").addOption(
|
|
546
655
|
new commander.Option(
|
|
@@ -548,8 +657,9 @@ ${description}
|
|
|
548
657
|
'Input file path or "-" for stdin'
|
|
549
658
|
).default("-")
|
|
550
659
|
).action(async (options, command) => {
|
|
551
|
-
const
|
|
552
|
-
await
|
|
660
|
+
const rootOptions = getRootOptions(command);
|
|
661
|
+
const predefinedVariables = await resolvePredefinedVariables(rootOptions);
|
|
662
|
+
await runScript(options.input, rootOptions.rc, predefinedVariables);
|
|
553
663
|
});
|
|
554
664
|
await program.parseAsync(injectDefaultCommand(argv));
|
|
555
665
|
};
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/generated/packageMetadata.ts","../src/cli.ts","../src/index.ts"],"sourcesContent":["// @ts-nocheck\n// This file is auto-generated by screw-up plugin\n// Do not edit manually\n\nexport const name = \"funcity-cli\";\nexport const version = \"1.1.0\";\nexport const description = \"A functional language interpreter with text processing\";\nexport const author = \"Kouji Matsui (@kekyo@mi.kekyo.net)\";\nexport const license = \"MIT\";\nexport const repository_url = \"https://github.com/kekyo/funcity\";\nexport const git_commit_hash = \"bd9ca1189122a6a81cf5363705508020eef87a84\";\n","// funcity - A functional language interpreter with text processing\n// Copyright (c) Kouji Matsui (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/funcity/\n\nimport { readFile } from 'fs/promises';\nimport * as os from 'os';\nimport * as path from 'path';\nimport readline from 'readline';\nimport { Command, Option } from 'commander';\n\nimport * as packageMetadata from './generated/packageMetadata';\nimport {\n FunCityBlockNode,\n FunCityFunctionContext,\n FunCityLogEntry,\n FunCityReducerError,\n FunCityReducerContext,\n FunCityWarningEntry,\n} from 'funcity';\nimport {\n buildCandidateVariables,\n convertToString,\n createReducerContext,\n emptyRange,\n fetchVariables,\n objectVariables,\n outputErrors,\n parseExpressions,\n reduceExpressionNode,\n reduceNode,\n runParser,\n runCodeTokenizer,\n runTokenizer,\n runScriptOnceToText,\n} from 'funcity';\nimport { createRequireFunction, nodeJsVariables } from 'funcity/node';\n\n//////////////////////////////////////////////////////////////////////////////\n\nconst continuationPromptText = '? ';\n\nlet replReadlineInterface: readline.Interface | undefined;\n\nconst createReplReadline = () => {\n const fallbackReadline = nodeJsVariables.readline as (\n this: FunCityFunctionContext,\n prompt?: unknown\n ) => Promise<string>;\n\n return async function (this: FunCityFunctionContext, prompt?: unknown) {\n if (!replReadlineInterface) {\n return await fallbackReadline.call(this, prompt);\n }\n\n const question = prompt === undefined ? '' : this.convertToString(prompt);\n const signal = this.abortSignal;\n\n if (signal?.aborted) {\n const abortError = new Error('Aborted');\n (abortError as { name?: string }).name = 'AbortError';\n throw abortError;\n }\n\n return await new Promise<string>((resolve, reject) => {\n const rl = replReadlineInterface!;\n let settled = false;\n\n const cleanup = () => {\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n };\n\n const finishResolve = (value: string) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(value);\n };\n\n const finishReject = (error: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(error);\n };\n\n const onAbort = () => {\n const abortError = new Error('Aborted');\n (abortError as { name?: string }).name = 'AbortError';\n finishReject(abortError);\n };\n\n if (signal) {\n signal.addEventListener('abort', onAbort, { once: true });\n rl.question(question, { signal }, (answer) => {\n finishResolve(answer);\n });\n } else {\n rl.question(question, (answer) => {\n finishResolve(answer);\n });\n }\n });\n };\n};\n\nconst readStream = async (stream: NodeJS.ReadableStream): Promise<string> => {\n return await new Promise((resolve, reject) => {\n let data = '';\n if (typeof stream.setEncoding === 'function') {\n stream.setEncoding('utf8');\n }\n stream.on('data', (chunk) => {\n data += String(chunk);\n });\n stream.on('end', () => {\n resolve(data);\n });\n stream.on('error', (error) => {\n reject(error);\n });\n });\n};\n\nconst getErrorCode = (error: unknown): string | undefined => {\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n return (error as { code?: string }).code;\n};\n\nconst readRcScript = async (): Promise<{\n path: string;\n script?: string;\n}> => {\n const rcPath = path.join(os.homedir(), '.funcityrc');\n try {\n const script = await readFile(rcPath, 'utf8');\n return { path: rcPath, script };\n } catch (error) {\n if (getErrorCode(error) !== 'ENOENT') {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`warning: failed to read ${rcPath}: ${message}`);\n }\n return { path: rcPath };\n }\n};\n\nconst reduceAndCollectResults = async (\n context: FunCityReducerContext,\n nodes: readonly FunCityBlockNode[],\n signal: AbortSignal,\n options: {\n onResult?: (result: unknown) => void;\n includeUndefined?: boolean;\n } = {}\n): Promise<unknown[]> => {\n const resultList: unknown[] = [];\n const includeUndefined = options.includeUndefined ?? false;\n for (const node of nodes) {\n const results = await reduceNode(context, node, signal);\n for (const result of results) {\n if (result !== undefined || includeUndefined) {\n if (result !== undefined) {\n options.onResult?.(result);\n }\n resultList.push(result);\n }\n }\n }\n return resultList;\n};\n\nconst runCodeWithContext = async (\n context: FunCityReducerContext,\n warningLogs: FunCityWarningEntry[],\n script: string,\n signal: AbortSignal\n): Promise<{ output: string | undefined; logs: FunCityLogEntry[] }> => {\n const logs: FunCityLogEntry[] = [];\n const tokens = runCodeTokenizer(script, logs);\n const nodes = parseExpressions(tokens, logs);\n if (logs.length >= 1) {\n return { output: undefined, logs };\n }\n\n try {\n warningLogs.length = 0;\n const results = await reduceAndCollectResults(context, nodes, signal);\n const output =\n results.length > 0\n ? results.map((result) => context.convertToString(result)).join('\\n')\n : '';\n return { output, logs: [...warningLogs] };\n } catch (error: unknown) {\n if (error instanceof FunCityReducerError) {\n return { output: undefined, logs: [...warningLogs, error.info] };\n }\n throw error;\n }\n};\n\nconst runScriptWithContext = async (\n context: FunCityReducerContext,\n warningLogs: FunCityWarningEntry[],\n script: string,\n signal: AbortSignal,\n onOutput?: (chunk: string) => void\n): Promise<{ output: string | undefined; logs: FunCityLogEntry[] }> => {\n const logs: FunCityLogEntry[] = [];\n const tokens = runTokenizer(script, logs);\n const nodes = runParser(tokens, logs);\n if (logs.length >= 1) {\n return { output: undefined, logs };\n }\n\n try {\n warningLogs.length = 0;\n const outputChunks: string[] = [];\n await reduceAndCollectResults(context, nodes, signal, {\n onResult: (result) => {\n const chunk = context.convertToString(result);\n outputChunks.push(chunk);\n onOutput?.(chunk);\n },\n });\n const output = outputChunks.join('');\n return { output, logs: [...warningLogs] };\n } catch (error: unknown) {\n if (error instanceof FunCityReducerError) {\n return { output: undefined, logs: [...warningLogs, error.info] };\n }\n throw error;\n }\n};\n\n//////////////////////////////////////////////////////////////////////////////\n\nexport interface ReplEvaluationResult {\n readonly output: string | undefined;\n readonly logs: FunCityLogEntry[];\n readonly shouldExit: boolean;\n}\n\nexport interface ReplSession {\n evaluateLine: (\n line: string,\n signal: AbortSignal,\n options?: {\n emitIt?: boolean;\n }\n ) => Promise<ReplEvaluationResult>;\n getPrompt: () => Promise<string>;\n setVariable: (name: string, value: unknown) => void;\n}\n\nexport const createReplSession = (): ReplSession => {\n const exitSymbol = Symbol('exit');\n const replReadline = createReplReadline();\n const require = createRequireFunction();\n const variables = buildCandidateVariables(\n objectVariables,\n fetchVariables,\n nodeJsVariables,\n {\n require,\n prompt: 'funcity> ',\n exit: exitSymbol,\n readline: replReadline,\n }\n );\n\n const warningLogs: FunCityWarningEntry[] = [];\n const reducerContext = createReducerContext(variables, warningLogs);\n\n const evaluateLine = async (\n line: string,\n signal: AbortSignal,\n options?: {\n emitIt?: boolean;\n }\n ): Promise<ReplEvaluationResult> => {\n // Tokenize and parse step\n const logs: FunCityLogEntry[] = [];\n const tokens = runCodeTokenizer(line, logs);\n const nodes = parseExpressions(tokens, logs);\n if (logs.length >= 1) {\n return {\n output: undefined,\n logs,\n shouldExit: false,\n };\n }\n\n // Reduce step\n try {\n warningLogs.length = 0;\n const results = await reduceAndCollectResults(\n reducerContext,\n nodes,\n signal,\n { includeUndefined: true }\n );\n const shouldExit = results.some((result) => result === exitSymbol);\n const evaluatableResults = results.filter(\n (result) => result !== exitSymbol\n );\n const emitIt = options?.emitIt ?? true;\n let output = '';\n if (evaluatableResults.length > 0) {\n const itValue = evaluatableResults[evaluatableResults.length - 1];\n const itsValue = evaluatableResults.filter(\n (result) => result !== undefined\n );\n reducerContext.setValue('it', itValue, signal);\n reducerContext.setValue('its', itsValue, signal);\n if (emitIt) {\n output = `it: ${convertToString(itValue)}`;\n }\n }\n return {\n output,\n logs: [...warningLogs],\n shouldExit,\n };\n } catch (error: unknown) {\n if (error instanceof FunCityReducerError) {\n const logs: FunCityLogEntry[] = [...warningLogs];\n logs.push(error.info);\n return {\n output: undefined,\n logs,\n shouldExit: false,\n };\n }\n throw error;\n }\n };\n\n const getPrompt = async () => {\n const prompt = await reduceExpressionNode(reducerContext, {\n kind: 'variable',\n name: 'prompt',\n range: emptyRange,\n });\n return reducerContext.convertToString(prompt);\n };\n\n const setVariable = (name: string, value: unknown) => {\n reducerContext.setValue(name, value, undefined);\n };\n\n return { evaluateLine, getPrompt, setVariable };\n};\n\nconst isAbortError = (error: unknown): boolean => {\n if (!error || typeof error !== 'object') {\n return false;\n }\n const errorRecord = error as { name?: string; code?: string };\n return errorRecord.name === 'AbortError' || errorRecord.code === 'ABORT_ERR';\n};\n\nconst loadRcForRepl = async (session: ReplSession): Promise<void> => {\n const { path: rcPath, script } = await readRcScript();\n if (!script) {\n return;\n }\n\n session.setVariable('require', createRequireFunction(os.homedir()));\n const { output, logs } = await session.evaluateLine(\n script,\n new AbortController().signal,\n { emitIt: false }\n );\n if (logs.length > 0) {\n outputErrors(rcPath, logs, console);\n }\n if (output) {\n console.log(output);\n }\n};\n\nconst runRepl = async (loadRc: boolean): Promise<void> => {\n console.log(\n `${packageMetadata.name} [${packageMetadata.version}-${packageMetadata.git_commit_hash}]`\n );\n console.log(`Copyright (c) kouji Matsui (@kekyo@mi.kekyo.net)`);\n console.log(`${packageMetadata.repository_url}`);\n console.log(`Type 'exit' to exit CLI`);\n console.log('');\n\n const session = createReplSession();\n if (loadRc) {\n await loadRcForRepl(session);\n }\n session.setVariable('require', createRequireFunction(process.cwd()));\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: await session.getPrompt(),\n });\n replReadlineInterface = rl;\n\n let bufferedLine = '';\n let isEvaluating = false;\n let abortController = new AbortController();\n\n const setPrompt = async (isContinuation: boolean) => {\n rl.setPrompt(\n isContinuation ? continuationPromptText : await session.getPrompt()\n );\n };\n\n const hasLineContinuation = (line: string): boolean => line.endsWith('\\\\');\n\n const evaluateAndPrint = async (line: string, signal: AbortSignal) => {\n try {\n const { output, logs, shouldExit } = await session.evaluateLine(\n line,\n signal\n );\n if (logs.length > 0) {\n outputErrors('<repl>', logs, console);\n }\n if (output) {\n console.log(output);\n }\n return shouldExit;\n } catch (error) {\n if (isAbortError(error)) {\n return false;\n }\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n return false;\n }\n };\n\n await setPrompt(false);\n rl.prompt();\n\n const clearInputLine = () => {\n if (rl.line.length === 0) {\n return;\n }\n rl.write(null, { ctrl: true, name: 'u' });\n };\n\n const handleInterrupt = async () => {\n if (!abortController.signal.aborted) {\n abortController.abort();\n }\n abortController = new AbortController();\n bufferedLine = '';\n process.stdout.write('\\nInterrupted\\n');\n clearInputLine();\n if (!isEvaluating) {\n await setPrompt(false);\n rl.prompt();\n }\n };\n\n rl.on('SIGINT', () => {\n void handleInterrupt();\n });\n\n let shouldExit = false;\n\n for await (const line of rl) {\n if (bufferedLine) {\n bufferedLine += `\\n${line}`;\n } else {\n bufferedLine = line;\n }\n\n if (hasLineContinuation(line)) {\n await setPrompt(true);\n rl.prompt();\n continue;\n }\n\n const logicalLine = bufferedLine;\n bufferedLine = '';\n isEvaluating = true;\n try {\n shouldExit = await evaluateAndPrint(logicalLine, abortController.signal);\n } finally {\n isEvaluating = false;\n }\n if (shouldExit) {\n bufferedLine = '';\n break;\n }\n await setPrompt(false);\n rl.prompt();\n }\n\n if (!shouldExit && bufferedLine) {\n isEvaluating = true;\n try {\n await evaluateAndPrint(bufferedLine, abortController.signal);\n } finally {\n isEvaluating = false;\n }\n }\n\n rl.close();\n replReadlineInterface = undefined;\n};\n\n//////////////////////////////////////////////////////////////////////////////\n\nexport const runScriptToText = async (script: string, basePath?: string) => {\n const require = createRequireFunction(basePath);\n const variables = buildCandidateVariables(\n objectVariables,\n fetchVariables,\n nodeJsVariables,\n {\n require,\n }\n );\n const logs: FunCityLogEntry[] = [];\n const output = await runScriptOnceToText(script, { variables, logs });\n return { output, logs };\n};\n\nexport const runScriptToTextStreaming = async (\n script: string,\n basePath?: string,\n onOutput?: (chunk: string) => void\n) => {\n const require = createRequireFunction(basePath);\n const variables = buildCandidateVariables(\n objectVariables,\n fetchVariables,\n nodeJsVariables,\n {\n require,\n }\n );\n const warningLogs: FunCityWarningEntry[] = [];\n const reducerContext = createReducerContext(variables, warningLogs);\n const { output, logs } = await runScriptWithContext(\n reducerContext,\n warningLogs,\n script,\n new AbortController().signal,\n onOutput\n );\n return { output, logs };\n};\n\nconst loadRcForContext = async (\n context: FunCityReducerContext,\n warningLogs: FunCityWarningEntry[]\n): Promise<void> => {\n const { path: rcPath, script } = await readRcScript();\n if (!script) {\n return;\n }\n\n context.setValue('require', createRequireFunction(os.homedir()), undefined);\n const { output, logs } = await runCodeWithContext(\n context,\n warningLogs,\n script,\n new AbortController().signal\n );\n if (logs.length > 0) {\n outputErrors(rcPath, logs, console);\n }\n if (output) {\n console.log(output);\n }\n};\n\nconst runScript = async (input: string, loadRc: boolean): Promise<void> => {\n const isStdin = input === '-';\n const source = isStdin ? '<stdin>' : input;\n const script = isStdin\n ? await readStream(process.stdin)\n : await readFile(input, 'utf8');\n\n const basePath = isStdin ? process.cwd() : path.dirname(path.resolve(input));\n const variables = buildCandidateVariables(\n objectVariables,\n fetchVariables,\n nodeJsVariables,\n {\n require: createRequireFunction(loadRc ? os.homedir() : basePath),\n }\n );\n const warningLogs: FunCityWarningEntry[] = [];\n const reducerContext = createReducerContext(variables, warningLogs);\n\n if (loadRc) {\n await loadRcForContext(reducerContext, warningLogs);\n }\n reducerContext.setValue(\n 'require',\n createRequireFunction(basePath),\n undefined\n );\n const result = await runScriptWithContext(\n reducerContext,\n warningLogs,\n script,\n new AbortController().signal,\n (chunk) => {\n process.stdout.write(chunk);\n }\n );\n\n const hasError = outputErrors(source, result.logs, console);\n if (hasError) {\n process.exitCode = 1;\n }\n};\n\n//////////////////////////////////////////////////////////////////////////////\n\nconst findExplicitCommand = (\n args: readonly string[]\n): 'repl' | 'run' | undefined => {\n for (let index = 0; index < args.length; index++) {\n const arg = args[index]!;\n if (arg === '--') {\n const next = args[index + 1];\n if (next === 'repl' || next === 'run') {\n return next;\n }\n return undefined;\n }\n if (arg === '-i' || arg === '--input') {\n index += 1;\n continue;\n }\n if (arg.startsWith('--input=')) {\n continue;\n }\n if (arg.startsWith('-')) {\n continue;\n }\n return arg === 'repl' || arg === 'run' ? arg : undefined;\n }\n return undefined;\n};\n\nconst hasInputOption = (args: readonly string[]): boolean => {\n for (const arg of args) {\n if (arg === '--') {\n break;\n }\n if (arg === '-i' || arg === '--input' || arg.startsWith('--input=')) {\n return true;\n }\n }\n return false;\n};\n\nconst injectDefaultCommand = (argv: string[]): string[] => {\n const args = argv.slice(2);\n const explicitCommand = findExplicitCommand(args);\n if (explicitCommand) {\n return argv;\n }\n\n const hasHelp = args.some(\n (arg) =>\n arg === '-h' || arg === '--help' || arg === '-V' || arg === '--version'\n );\n if (hasHelp) {\n return argv;\n }\n\n const command = hasInputOption(args) ? 'run' : 'repl';\n const [execPath = 'node', scriptPath = 'funcity'] = argv;\n return [execPath, scriptPath, command, ...args];\n};\n\nexport const runMain = async (argv: string[] = process.argv): Promise<void> => {\n const program = new Command();\n\n program.name(packageMetadata.name);\n program.summary(packageMetadata.description);\n program.addHelpText(\n 'beforeAll',\n `${packageMetadata.name}\\n${packageMetadata.description}\\n`\n );\n program.version(\n `${packageMetadata.version}-${packageMetadata.git_commit_hash}`\n );\n program.showHelpAfterError(true);\n program.addOption(new Option('--no-rc', 'Do not load ~/.funcityrc'));\n\n program\n .command('repl')\n .summary('Start an interactive REPL session')\n .action(async (_options, command) => {\n const { rc } = command.parent?.opts() ?? { rc: true };\n await runRepl(rc);\n });\n\n program\n .command('run')\n .summary('Run a script from a file or stdin')\n .addOption(\n new Option(\n '-i, --input <path>',\n 'Input file path or \"-\" for stdin'\n ).default('-')\n )\n .action(async (options: { input: string }, command) => {\n const { rc } = command.parent?.opts() ?? { rc: true };\n await runScript(options.input, rc);\n });\n\n await program.parseAsync(injectDefaultCommand(argv));\n};\n","// funcity - A functional language interpreter with text processing\n// Copyright (c) Kouji Matsui (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/funcity/\n\nimport { runMain } from './cli';\n\nrunMain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n});\n"],"names":["nodeJsVariables","path","os","readFile","node","reduceNode","runCodeTokenizer","parseExpressions","FunCityReducerError","runTokenizer","runParser","require","createRequireFunction","buildCandidateVariables","objectVariables","fetchVariables","createReducerContext","convertToString","logs","reduceExpressionNode","emptyRange","name","outputErrors","packageMetadata.name","packageMetadata.version","packageMetadata.git_commit_hash","packageMetadata.repository_url","shouldExit","Command","packageMetadata.description","Option"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/generated/packageMetadata.ts","../src/cli.ts","../src/index.ts"],"sourcesContent":["// @ts-nocheck\n// This file is auto-generated by screw-up plugin\n// Do not edit manually\n\nexport const name = \"funcity-cli\";\nexport const version = \"1.2.0\";\nexport const description = \"A functional language interpreter with text processing\";\nexport const author = \"Kouji Matsui (@kekyo@mi.kekyo.net)\";\nexport const license = \"MIT\";\nexport const repository_url = \"https://github.com/kekyo/funcity\";\nexport const git_commit_hash = \"ef0c333859e785404f4939a0050e42207f7af230\";\n","// funcity - A functional language interpreter with text processing\n// Copyright (c) Kouji Matsui (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/funcity/\n\nimport { readFile } from 'fs/promises';\nimport * as os from 'os';\nimport * as path from 'path';\nimport readline from 'readline';\nimport { Command, Option } from 'commander';\n\nimport * as packageMetadata from './generated/packageMetadata';\nimport {\n FunCityBlockNode,\n FunCityFunctionContext,\n FunCityLogEntry,\n FunCityReducerError,\n FunCityReducerContext,\n FunCityWarningEntry,\n} from 'funcity';\nimport {\n buildCandidateVariables,\n convertToString,\n createReducerContext,\n emptyRange,\n fetchVariables,\n objectVariables,\n outputErrors,\n parseExpressions,\n reduceExpressionNode,\n reduceNode,\n runParser,\n runCodeTokenizer,\n runTokenizer,\n runScriptOnceToText,\n} from 'funcity';\nimport { createRequireFunction, nodeJsVariables } from 'funcity/node';\n\n//////////////////////////////////////////////////////////////////////////////\n\nconst continuationPromptText = '? ';\n\nlet replReadlineInterface: readline.Interface | undefined;\n\ntype PredefinedVariables = Record<string, unknown>;\n\ninterface RootCliOptions {\n readonly rc: boolean;\n readonly define: readonly string[];\n readonly defineJson: readonly string[];\n}\n\nconst createReplReadline = () => {\n const fallbackReadline = nodeJsVariables.readline as (\n this: FunCityFunctionContext,\n prompt?: unknown\n ) => Promise<string>;\n\n return async function (this: FunCityFunctionContext, prompt?: unknown) {\n if (!replReadlineInterface) {\n return await fallbackReadline.call(this, prompt);\n }\n\n const question = prompt === undefined ? '' : this.convertToString(prompt);\n const signal = this.abortSignal;\n\n if (signal?.aborted) {\n const abortError = new Error('Aborted');\n (abortError as { name?: string }).name = 'AbortError';\n throw abortError;\n }\n\n return await new Promise<string>((resolve, reject) => {\n const rl = replReadlineInterface!;\n let settled = false;\n\n const cleanup = () => {\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n };\n\n const finishResolve = (value: string) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(value);\n };\n\n const finishReject = (error: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(error);\n };\n\n const onAbort = () => {\n const abortError = new Error('Aborted');\n (abortError as { name?: string }).name = 'AbortError';\n finishReject(abortError);\n };\n\n if (signal) {\n signal.addEventListener('abort', onAbort, { once: true });\n rl.question(question, { signal }, (answer) => {\n finishResolve(answer);\n });\n } else {\n rl.question(question, (answer) => {\n finishResolve(answer);\n });\n }\n });\n };\n};\n\nconst readStream = async (stream: NodeJS.ReadableStream): Promise<string> => {\n return await new Promise((resolve, reject) => {\n let data = '';\n if (typeof stream.setEncoding === 'function') {\n stream.setEncoding('utf8');\n }\n stream.on('data', (chunk) => {\n data += String(chunk);\n });\n stream.on('end', () => {\n resolve(data);\n });\n stream.on('error', (error) => {\n reject(error);\n });\n });\n};\n\nconst getErrorCode = (error: unknown): string | undefined => {\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n return (error as { code?: string }).code;\n};\n\nconst fromError = (error: unknown): string => {\n return error instanceof Error ? error.message : String(error);\n};\n\nconst isRecordObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n};\n\nconst parseDefineOption = (\n definition: string\n): { name: string; value: unknown } => {\n const separatorIndex = definition.indexOf('=');\n\n if (separatorIndex < 0) {\n if (definition.length <= 0) {\n throw new Error('invalid -D option: variable name is empty');\n }\n return {\n name: definition,\n value: true,\n };\n }\n\n const name = definition.slice(0, separatorIndex);\n const value = definition.slice(separatorIndex + 1);\n if (name.length <= 0) {\n throw new Error(\n `invalid -D option: variable name is empty (${definition})`\n );\n }\n return { name, value };\n};\n\nconst readPredefinedVariablesFromJson = async (\n filePath: string\n): Promise<Record<string, unknown>> => {\n const absolutePath = path.resolve(filePath);\n\n let source = '';\n try {\n source = await readFile(absolutePath, 'utf8');\n } catch (error: unknown) {\n throw new Error(\n `failed to read JSON file: ${filePath} (${fromError(error)})`\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch (error: unknown) {\n throw new Error(\n `failed to parse JSON file: ${filePath} (${fromError(error)})`\n );\n }\n\n if (!isRecordObject(parsed)) {\n throw new Error(\n `JSON root must be an object: ${filePath} (actual: ${typeof parsed})`\n );\n }\n return parsed;\n};\n\nconst resolvePredefinedVariables = async (\n options: Pick<RootCliOptions, 'define' | 'defineJson'>\n): Promise<PredefinedVariables> => {\n const predefinedVariables: PredefinedVariables = {};\n\n for (const jsonFilePath of options.defineJson) {\n const record = await readPredefinedVariablesFromJson(jsonFilePath);\n Object.assign(predefinedVariables, record);\n }\n\n for (const definition of options.define) {\n const { name, value } = parseDefineOption(definition);\n predefinedVariables[name] = value;\n }\n\n return predefinedVariables;\n};\n\nconst applyPredefinedVariablesToContext = (\n context: FunCityReducerContext,\n predefinedVariables: PredefinedVariables\n) => {\n Object.entries(predefinedVariables).forEach(([name, value]) => {\n context.setValue(name, value, undefined);\n });\n};\n\nconst applyPredefinedVariablesToReplSession = (\n session: ReplSession,\n predefinedVariables: PredefinedVariables\n) => {\n Object.entries(predefinedVariables).forEach(([name, value]) => {\n session.setVariable(name, value);\n });\n};\n\nconst readRcScript = async (): Promise<{\n path: string;\n script?: string;\n}> => {\n const rcPath = path.join(os.homedir(), '.funcityrc');\n try {\n const script = await readFile(rcPath, 'utf8');\n return { path: rcPath, script };\n } catch (error) {\n if (getErrorCode(error) !== 'ENOENT') {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`warning: failed to read ${rcPath}: ${message}`);\n }\n return { path: rcPath };\n }\n};\n\nconst reduceAndCollectResults = async (\n context: FunCityReducerContext,\n nodes: readonly FunCityBlockNode[],\n signal: AbortSignal,\n options: {\n onResult?: (result: unknown) => void;\n includeUndefined?: boolean;\n } = {}\n): Promise<unknown[]> => {\n const resultList: unknown[] = [];\n const includeUndefined = options.includeUndefined ?? false;\n for (const node of nodes) {\n const results = await reduceNode(context, node, signal);\n for (const result of results) {\n if (result !== undefined || includeUndefined) {\n if (result !== undefined) {\n options.onResult?.(result);\n }\n resultList.push(result);\n }\n }\n }\n return resultList;\n};\n\nconst runCodeWithContext = async (\n context: FunCityReducerContext,\n warningLogs: FunCityWarningEntry[],\n script: string,\n signal: AbortSignal\n): Promise<{ output: string | undefined; logs: FunCityLogEntry[] }> => {\n const logs: FunCityLogEntry[] = [];\n const tokens = runCodeTokenizer(script, logs);\n const nodes = parseExpressions(tokens, logs);\n if (logs.length >= 1) {\n return { output: undefined, logs };\n }\n\n try {\n warningLogs.length = 0;\n const results = await reduceAndCollectResults(context, nodes, signal);\n const output =\n results.length > 0\n ? results.map((result) => context.convertToString(result)).join('\\n')\n : '';\n return { output, logs: [...warningLogs] };\n } catch (error: unknown) {\n if (error instanceof FunCityReducerError) {\n return { output: undefined, logs: [...warningLogs, error.info] };\n }\n throw error;\n }\n};\n\nconst runScriptWithContext = async (\n context: FunCityReducerContext,\n warningLogs: FunCityWarningEntry[],\n script: string,\n signal: AbortSignal,\n onOutput?: (chunk: string) => void\n): Promise<{ output: string | undefined; logs: FunCityLogEntry[] }> => {\n const logs: FunCityLogEntry[] = [];\n const tokens = runTokenizer(script, logs);\n const nodes = runParser(tokens, logs);\n if (logs.length >= 1) {\n return { output: undefined, logs };\n }\n\n try {\n warningLogs.length = 0;\n const outputChunks: string[] = [];\n await reduceAndCollectResults(context, nodes, signal, {\n onResult: (result) => {\n const chunk = context.convertToString(result);\n outputChunks.push(chunk);\n onOutput?.(chunk);\n },\n });\n const output = outputChunks.join('');\n return { output, logs: [...warningLogs] };\n } catch (error: unknown) {\n if (error instanceof FunCityReducerError) {\n return { output: undefined, logs: [...warningLogs, error.info] };\n }\n throw error;\n }\n};\n\n//////////////////////////////////////////////////////////////////////////////\n\nexport interface ReplEvaluationResult {\n readonly output: string | undefined;\n readonly logs: FunCityLogEntry[];\n readonly shouldExit: boolean;\n}\n\nexport interface ReplSession {\n evaluateLine: (\n line: string,\n signal: AbortSignal,\n options?: {\n emitIt?: boolean;\n }\n ) => Promise<ReplEvaluationResult>;\n getPrompt: () => Promise<string>;\n setVariable: (name: string, value: unknown) => void;\n}\n\nexport const createReplSession = (\n predefinedVariables: PredefinedVariables = {}\n): ReplSession => {\n const exitSymbol = Symbol('exit');\n const replReadline = createReplReadline();\n const require = createRequireFunction();\n const variables = buildCandidateVariables(\n objectVariables,\n fetchVariables,\n nodeJsVariables,\n predefinedVariables,\n {\n require,\n prompt: 'funcity> ',\n exit: exitSymbol,\n readline: replReadline,\n }\n );\n\n const warningLogs: FunCityWarningEntry[] = [];\n const reducerContext = createReducerContext(variables, warningLogs);\n\n const evaluateLine = async (\n line: string,\n signal: AbortSignal,\n options?: {\n emitIt?: boolean;\n }\n ): Promise<ReplEvaluationResult> => {\n // Tokenize and parse step\n const logs: FunCityLogEntry[] = [];\n const tokens = runCodeTokenizer(line, logs);\n const nodes = parseExpressions(tokens, logs);\n if (logs.length >= 1) {\n return {\n output: undefined,\n logs,\n shouldExit: false,\n };\n }\n\n // Reduce step\n try {\n warningLogs.length = 0;\n const results = await reduceAndCollectResults(\n reducerContext,\n nodes,\n signal,\n { includeUndefined: true }\n );\n const shouldExit = results.some((result) => result === exitSymbol);\n const evaluatableResults = results.filter(\n (result) => result !== exitSymbol\n );\n const emitIt = options?.emitIt ?? true;\n let output = '';\n if (evaluatableResults.length > 0) {\n const itValue = evaluatableResults[evaluatableResults.length - 1];\n const itsValue = evaluatableResults.filter(\n (result) => result !== undefined\n );\n reducerContext.setValue('it', itValue, signal);\n reducerContext.setValue('its', itsValue, signal);\n if (emitIt) {\n output = `it: ${convertToString(itValue)}`;\n }\n }\n return {\n output,\n logs: [...warningLogs],\n shouldExit,\n };\n } catch (error: unknown) {\n if (error instanceof FunCityReducerError) {\n const logs: FunCityLogEntry[] = [...warningLogs];\n logs.push(error.info);\n return {\n output: undefined,\n logs,\n shouldExit: false,\n };\n }\n throw error;\n }\n };\n\n const getPrompt = async () => {\n const prompt = await reduceExpressionNode(reducerContext, {\n kind: 'variable',\n name: 'prompt',\n range: emptyRange,\n });\n return reducerContext.convertToString(prompt);\n };\n\n const setVariable = (name: string, value: unknown) => {\n reducerContext.setValue(name, value, undefined);\n };\n\n return { evaluateLine, getPrompt, setVariable };\n};\n\nconst isAbortError = (error: unknown): boolean => {\n if (!error || typeof error !== 'object') {\n return false;\n }\n const errorRecord = error as { name?: string; code?: string };\n return errorRecord.name === 'AbortError' || errorRecord.code === 'ABORT_ERR';\n};\n\nconst loadRcForRepl = async (session: ReplSession): Promise<void> => {\n const { path: rcPath, script } = await readRcScript();\n if (!script) {\n return;\n }\n\n session.setVariable('require', createRequireFunction(os.homedir()));\n const { output, logs } = await session.evaluateLine(\n script,\n new AbortController().signal,\n { emitIt: false }\n );\n if (logs.length > 0) {\n outputErrors(rcPath, logs, console);\n }\n if (output) {\n console.log(output);\n }\n};\n\nconst runRepl = async (\n loadRc: boolean,\n predefinedVariables: PredefinedVariables\n): Promise<void> => {\n console.log(\n `${packageMetadata.name} [${packageMetadata.version}-${packageMetadata.git_commit_hash}]`\n );\n console.log(`Copyright (c) kouji Matsui (@kekyo@mi.kekyo.net)`);\n console.log(`${packageMetadata.repository_url}`);\n console.log(`Type 'exit' to exit CLI`);\n console.log('');\n\n const session = createReplSession(predefinedVariables);\n if (loadRc) {\n await loadRcForRepl(session);\n }\n applyPredefinedVariablesToReplSession(session, predefinedVariables);\n session.setVariable('require', createRequireFunction(process.cwd()));\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: await session.getPrompt(),\n });\n replReadlineInterface = rl;\n\n let bufferedLine = '';\n let isEvaluating = false;\n let abortController = new AbortController();\n\n const setPrompt = async (isContinuation: boolean) => {\n rl.setPrompt(\n isContinuation ? continuationPromptText : await session.getPrompt()\n );\n };\n\n const hasLineContinuation = (line: string): boolean => line.endsWith('\\\\');\n\n const evaluateAndPrint = async (line: string, signal: AbortSignal) => {\n try {\n const { output, logs, shouldExit } = await session.evaluateLine(\n line,\n signal\n );\n if (logs.length > 0) {\n outputErrors('<repl>', logs, console);\n }\n if (output) {\n console.log(output);\n }\n return shouldExit;\n } catch (error) {\n if (isAbortError(error)) {\n return false;\n }\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n return false;\n }\n };\n\n await setPrompt(false);\n rl.prompt();\n\n const clearInputLine = () => {\n if (rl.line.length === 0) {\n return;\n }\n rl.write(null, { ctrl: true, name: 'u' });\n };\n\n const handleInterrupt = async () => {\n if (!abortController.signal.aborted) {\n abortController.abort();\n }\n abortController = new AbortController();\n bufferedLine = '';\n process.stdout.write('\\nInterrupted\\n');\n clearInputLine();\n if (!isEvaluating) {\n await setPrompt(false);\n rl.prompt();\n }\n };\n\n rl.on('SIGINT', () => {\n void handleInterrupt();\n });\n\n let shouldExit = false;\n\n for await (const line of rl) {\n if (bufferedLine) {\n bufferedLine += `\\n${line}`;\n } else {\n bufferedLine = line;\n }\n\n if (hasLineContinuation(line)) {\n await setPrompt(true);\n rl.prompt();\n continue;\n }\n\n const logicalLine = bufferedLine;\n bufferedLine = '';\n isEvaluating = true;\n try {\n shouldExit = await evaluateAndPrint(logicalLine, abortController.signal);\n } finally {\n isEvaluating = false;\n }\n if (shouldExit) {\n bufferedLine = '';\n break;\n }\n await setPrompt(false);\n rl.prompt();\n }\n\n if (!shouldExit && bufferedLine) {\n isEvaluating = true;\n try {\n await evaluateAndPrint(bufferedLine, abortController.signal);\n } finally {\n isEvaluating = false;\n }\n }\n\n rl.close();\n replReadlineInterface = undefined;\n};\n\n//////////////////////////////////////////////////////////////////////////////\n\nexport const runScriptToText = async (script: string, basePath?: string) => {\n const require = createRequireFunction(basePath);\n const variables = buildCandidateVariables(\n objectVariables,\n fetchVariables,\n nodeJsVariables,\n {\n require,\n }\n );\n const logs: FunCityLogEntry[] = [];\n const output = await runScriptOnceToText(script, { variables, logs });\n return { output, logs };\n};\n\nexport const runScriptToTextStreaming = async (\n script: string,\n basePath?: string,\n onOutput?: (chunk: string) => void\n) => {\n const require = createRequireFunction(basePath);\n const variables = buildCandidateVariables(\n objectVariables,\n fetchVariables,\n nodeJsVariables,\n {\n require,\n }\n );\n const warningLogs: FunCityWarningEntry[] = [];\n const reducerContext = createReducerContext(variables, warningLogs);\n const { output, logs } = await runScriptWithContext(\n reducerContext,\n warningLogs,\n script,\n new AbortController().signal,\n onOutput\n );\n return { output, logs };\n};\n\nconst loadRcForContext = async (\n context: FunCityReducerContext,\n warningLogs: FunCityWarningEntry[]\n): Promise<void> => {\n const { path: rcPath, script } = await readRcScript();\n if (!script) {\n return;\n }\n\n context.setValue('require', createRequireFunction(os.homedir()), undefined);\n const { output, logs } = await runCodeWithContext(\n context,\n warningLogs,\n script,\n new AbortController().signal\n );\n if (logs.length > 0) {\n outputErrors(rcPath, logs, console);\n }\n if (output) {\n console.log(output);\n }\n};\n\nconst runScript = async (\n input: string,\n loadRc: boolean,\n predefinedVariables: PredefinedVariables\n): Promise<void> => {\n const isStdin = input === '-';\n const source = isStdin ? '<stdin>' : input;\n const script = isStdin\n ? await readStream(process.stdin)\n : await readFile(input, 'utf8');\n\n const basePath = isStdin ? process.cwd() : path.dirname(path.resolve(input));\n const variables = buildCandidateVariables(\n objectVariables,\n fetchVariables,\n nodeJsVariables,\n predefinedVariables,\n {\n require: createRequireFunction(loadRc ? os.homedir() : basePath),\n }\n );\n const warningLogs: FunCityWarningEntry[] = [];\n const reducerContext = createReducerContext(variables, warningLogs);\n\n if (loadRc) {\n await loadRcForContext(reducerContext, warningLogs);\n }\n applyPredefinedVariablesToContext(reducerContext, predefinedVariables);\n reducerContext.setValue(\n 'require',\n createRequireFunction(basePath),\n undefined\n );\n const result = await runScriptWithContext(\n reducerContext,\n warningLogs,\n script,\n new AbortController().signal,\n (chunk) => {\n process.stdout.write(chunk);\n }\n );\n\n const hasError = outputErrors(source, result.logs, console);\n if (hasError) {\n process.exitCode = 1;\n }\n};\n\n//////////////////////////////////////////////////////////////////////////////\n\nconst findExplicitCommand = (\n args: readonly string[]\n): 'repl' | 'run' | undefined => {\n for (let index = 0; index < args.length; index++) {\n const arg = args[index]!;\n if (arg === '--') {\n const next = args[index + 1];\n if (next === 'repl' || next === 'run') {\n return next;\n }\n return undefined;\n }\n if (arg === '-i' || arg === '--input') {\n index += 1;\n continue;\n }\n if (arg === '-D' || arg === '--define') {\n index += 1;\n continue;\n }\n if (arg === '-d' || arg === '--define-json') {\n index += 1;\n continue;\n }\n if (\n arg.startsWith('--input=') ||\n arg.startsWith('--define=') ||\n arg.startsWith('--define-json=')\n ) {\n continue;\n }\n if (arg.startsWith('-')) {\n continue;\n }\n return arg === 'repl' || arg === 'run' ? arg : undefined;\n }\n return undefined;\n};\n\nconst hasInputOption = (args: readonly string[]): boolean => {\n for (const arg of args) {\n if (arg === '--') {\n break;\n }\n if (arg === '-i' || arg === '--input' || arg.startsWith('--input=')) {\n return true;\n }\n }\n return false;\n};\n\nconst injectDefaultCommand = (argv: string[]): string[] => {\n const args = argv.slice(2);\n const explicitCommand = findExplicitCommand(args);\n if (explicitCommand) {\n return argv;\n }\n\n const hasHelp = args.some(\n (arg) =>\n arg === '-h' || arg === '--help' || arg === '-V' || arg === '--version'\n );\n if (hasHelp) {\n return argv;\n }\n\n const command = hasInputOption(args) ? 'run' : 'repl';\n const [execPath = 'node', scriptPath = 'funcity'] = argv;\n return [execPath, scriptPath, command, ...args];\n};\n\nconst collectOptionValues = (value: string, previous: string[]): string[] => {\n return [...previous, value];\n};\n\nconst getRootOptions = (command: Command): RootCliOptions => {\n const options = (command.parent?.opts() ?? {}) as Partial<RootCliOptions>;\n return {\n rc: options.rc ?? true,\n define: options.define ?? [],\n defineJson: options.defineJson ?? [],\n };\n};\n\nexport const runMain = async (argv: string[] = process.argv): Promise<void> => {\n const program = new Command();\n\n program.name(packageMetadata.name);\n program.summary(packageMetadata.description);\n program.addHelpText(\n 'beforeAll',\n `${packageMetadata.name}\\n${packageMetadata.description}\\n`\n );\n program.version(\n `${packageMetadata.version}-${packageMetadata.git_commit_hash}`\n );\n program.showHelpAfterError(true);\n program.addOption(new Option('--no-rc', 'Do not load ~/.funcityrc'));\n program.addOption(\n new Option(\n '-D, --define <name[=value]>',\n 'Predefine a variable. If value is omitted, it becomes true.'\n )\n .argParser(collectOptionValues)\n .default([])\n );\n program.addOption(\n new Option(\n '-d, --define-json <path>',\n 'Load predefined variables from a JSON file (root must be object).'\n )\n .argParser(collectOptionValues)\n .default([])\n );\n\n program\n .command('repl')\n .summary('Start an interactive REPL session')\n .action(async (_options, command) => {\n const rootOptions = getRootOptions(command);\n const predefinedVariables = await resolvePredefinedVariables(rootOptions);\n await runRepl(rootOptions.rc, predefinedVariables);\n });\n\n program\n .command('run')\n .summary('Run a script from a file or stdin')\n .addOption(\n new Option(\n '-i, --input <path>',\n 'Input file path or \"-\" for stdin'\n ).default('-')\n )\n .action(async (options: { input: string }, command) => {\n const rootOptions = getRootOptions(command);\n const predefinedVariables = await resolvePredefinedVariables(rootOptions);\n await runScript(options.input, rootOptions.rc, predefinedVariables);\n });\n\n await program.parseAsync(injectDefaultCommand(argv));\n};\n","// funcity - A functional language interpreter with text processing\n// Copyright (c) Kouji Matsui (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/funcity/\n\nimport { runMain } from './cli';\n\nrunMain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n});\n"],"names":["nodeJsVariables","name","path","readFile","os","node","reduceNode","runCodeTokenizer","parseExpressions","FunCityReducerError","runTokenizer","runParser","require","createRequireFunction","buildCandidateVariables","objectVariables","fetchVariables","createReducerContext","convertToString","logs","reduceExpressionNode","emptyRange","outputErrors","packageMetadata.name","packageMetadata.version","packageMetadata.git_commit_hash","packageMetadata.repository_url","shouldExit","Command","packageMetadata.description","Option"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"git": {
|
|
3
3
|
"tags": [
|
|
4
|
-
"1.
|
|
4
|
+
"1.2.0"
|
|
5
5
|
],
|
|
6
6
|
"branches": [
|
|
7
7
|
"main"
|
|
8
8
|
],
|
|
9
|
-
"version": "1.
|
|
9
|
+
"version": "1.2.0",
|
|
10
10
|
"commit": {
|
|
11
|
-
"hash": "
|
|
12
|
-
"shortHash": "
|
|
13
|
-
"date": "2026-
|
|
11
|
+
"hash": "ef0c333859e785404f4939a0050e42207f7af230",
|
|
12
|
+
"shortHash": "ef0c333",
|
|
13
|
+
"date": "2026-02-06T22:00:51+09:00",
|
|
14
14
|
"message": "Merge branch 'develop'"
|
|
15
15
|
}
|
|
16
16
|
},
|
|
17
|
-
"version": "1.
|
|
17
|
+
"version": "1.2.0",
|
|
18
18
|
"author": "Kouji Matsui (@kekyo@mi.kekyo.net)",
|
|
19
19
|
"license": "MIT",
|
|
20
20
|
"repository": {
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"vite-plugin-dts": ">=3.0.0",
|
|
72
72
|
"vitest": ">=1.0.0"
|
|
73
73
|
},
|
|
74
|
-
"buildDate": "2026-
|
|
74
|
+
"buildDate": "2026-02-06T22:03:11+09:00"
|
|
75
75
|
}
|