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 CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  /*!
3
3
  * name: funcity-cli
4
- * version: 1.1.0
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: bd9ca1189122a6a81cf5363705508020eef87a84
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.1.0";
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 = "bd9ca1189122a6a81cf5363705508020eef87a84";
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.startsWith("--input=")) {
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 { rc } = command.parent?.opts() ?? { rc: true };
543
- await runRepl(rc);
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 { rc } = command.parent?.opts() ?? { rc: true };
552
- await runScript(options.input, rc);
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
  };
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,MAAM,OAAO;AACb,MAAM,UAAU;AAChB,MAAM,cAAc;AAGpB,MAAM,iBAAiB;AACvB,MAAM,kBAAkB;AC8B/B,MAAM,yBAAyB;AAE/B,IAAI;AAEJ,MAAM,qBAAqB,MAAM;AAC/B,QAAM,mBAAmBA,KAAAA,gBAAgB;AAKzC,SAAO,eAA8C,QAAkB;AACrE,QAAI,CAAC,uBAAuB;AAC1B,aAAO,MAAM,iBAAiB,KAAK,MAAM,MAAM;AAAA,IACjD;AAEA,UAAM,WAAW,WAAW,SAAY,KAAK,KAAK,gBAAgB,MAAM;AACxE,UAAM,SAAS,KAAK;AAEpB,QAAI,QAAQ,SAAS;AACnB,YAAM,aAAa,IAAI,MAAM,SAAS;AACrC,iBAAiC,OAAO;AACzC,YAAM;AAAA,IACR;AAEA,WAAO,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AACpD,YAAM,KAAK;AACX,UAAI,UAAU;AAEd,YAAM,UAAU,MAAM;AACpB,YAAI,QAAQ;AACV,iBAAO,oBAAoB,SAAS,OAAO;AAAA,QAC7C;AAAA,MACF;AAEA,YAAM,gBAAgB,CAAC,UAAkB;AACvC,YAAI,SAAS;AACX;AAAA,QACF;AACA,kBAAU;AACV,gBAAA;AACA,gBAAQ,KAAK;AAAA,MACf;AAEA,YAAM,eAAe,CAAC,UAAiB;AACrC,YAAI,SAAS;AACX;AAAA,QACF;AACA,kBAAU;AACV,gBAAA;AACA,eAAO,KAAK;AAAA,MACd;AAEA,YAAM,UAAU,MAAM;AACpB,cAAM,aAAa,IAAI,MAAM,SAAS;AACrC,mBAAiC,OAAO;AACzC,qBAAa,UAAU;AAAA,MACzB;AAEA,UAAI,QAAQ;AACV,eAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,MAAM;AACxD,WAAG,SAAS,UAAU,EAAE,OAAA,GAAU,CAAC,WAAW;AAC5C,wBAAc,MAAM;AAAA,QACtB,CAAC;AAAA,MACH,OAAO;AACL,WAAG,SAAS,UAAU,CAAC,WAAW;AAChC,wBAAc,MAAM;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,MAAM,aAAa,OAAO,WAAmD;AAC3E,SAAO,MAAM,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC5C,QAAI,OAAO;AACX,QAAI,OAAO,OAAO,gBAAgB,YAAY;AAC5C,aAAO,YAAY,MAAM;AAAA,IAC3B;AACA,WAAO,GAAG,QAAQ,CAAC,UAAU;AAC3B,cAAQ,OAAO,KAAK;AAAA,IACtB,CAAC;AACD,WAAO,GAAG,OAAO,MAAM;AACrB,cAAQ,IAAI;AAAA,IACd,CAAC;AACD,WAAO,GAAG,SAAS,CAAC,UAAU;AAC5B,aAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACH;AAEA,MAAM,eAAe,CAAC,UAAuC;AAC3D,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AACA,SAAQ,MAA4B;AACtC;AAEA,MAAM,eAAe,YAGf;AACJ,QAAM,SAASC,gBAAK,KAAKC,cAAG,QAAA,GAAW,YAAY;AACnD,MAAI;AACF,UAAM,SAAS,MAAMC,kBAAS,QAAQ,MAAM;AAC5C,WAAO,EAAE,MAAM,QAAQ,OAAA;AAAA,EACzB,SAAS,OAAO;AACd,QAAI,aAAa,KAAK,MAAM,UAAU;AACpC,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAQ,KAAK,2BAA2B,MAAM,KAAK,OAAO,EAAE;AAAA,IAC9D;AACA,WAAO,EAAE,MAAM,OAAA;AAAA,EACjB;AACF;AAEA,MAAM,0BAA0B,OAC9B,SACA,OACA,QACA,UAGI,CAAA,MACmB;AACvB,QAAM,aAAwB,CAAA;AAC9B,QAAM,mBAAmB,QAAQ,oBAAoB;AACrD,aAAWC,SAAQ,OAAO;AACxB,UAAM,UAAU,MAAMC,QAAAA,WAAW,SAASD,OAAM,MAAM;AACtD,eAAW,UAAU,SAAS;AAC5B,UAAI,WAAW,UAAa,kBAAkB;AAC5C,YAAI,WAAW,QAAW;AACxB,kBAAQ,WAAW,MAAM;AAAA,QAC3B;AACA,mBAAW,KAAK,MAAM;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,MAAM,qBAAqB,OACzB,SACA,aACA,QACA,WACqE;AACrE,QAAM,OAA0B,CAAA;AAChC,QAAM,SAASE,QAAAA,iBAAiB,QAAQ,IAAI;AAC5C,QAAM,QAAQC,QAAAA,iBAAiB,QAAQ,IAAI;AAC3C,MAAI,KAAK,UAAU,GAAG;AACpB,WAAO,EAAE,QAAQ,QAAW,KAAA;AAAA,EAC9B;AAEA,MAAI;AACF,gBAAY,SAAS;AACrB,UAAM,UAAU,MAAM,wBAAwB,SAAS,OAAO,MAAM;AACpE,UAAM,SACJ,QAAQ,SAAS,IACb,QAAQ,IAAI,CAAC,WAAW,QAAQ,gBAAgB,MAAM,CAAC,EAAE,KAAK,IAAI,IAClE;AACN,WAAO,EAAE,QAAQ,MAAM,CAAC,GAAG,WAAW,EAAA;AAAA,EACxC,SAAS,OAAgB;AACvB,QAAI,iBAAiBC,QAAAA,qBAAqB;AACxC,aAAO,EAAE,QAAQ,QAAW,MAAM,CAAC,GAAG,aAAa,MAAM,IAAI,EAAA;AAAA,IAC/D;AACA,UAAM;AAAA,EACR;AACF;AAEA,MAAM,uBAAuB,OAC3B,SACA,aACA,QACA,QACA,aACqE;AACrE,QAAM,OAA0B,CAAA;AAChC,QAAM,SAASC,QAAAA,aAAa,QAAQ,IAAI;AACxC,QAAM,QAAQC,QAAAA,UAAU,QAAQ,IAAI;AACpC,MAAI,KAAK,UAAU,GAAG;AACpB,WAAO,EAAE,QAAQ,QAAW,KAAA;AAAA,EAC9B;AAEA,MAAI;AACF,gBAAY,SAAS;AACrB,UAAM,eAAyB,CAAA;AAC/B,UAAM,wBAAwB,SAAS,OAAO,QAAQ;AAAA,MACpD,UAAU,CAAC,WAAW;AACpB,cAAM,QAAQ,QAAQ,gBAAgB,MAAM;AAC5C,qBAAa,KAAK,KAAK;AACvB,mBAAW,KAAK;AAAA,MAClB;AAAA,IAAA,CACD;AACD,UAAM,SAAS,aAAa,KAAK,EAAE;AACnC,WAAO,EAAE,QAAQ,MAAM,CAAC,GAAG,WAAW,EAAA;AAAA,EACxC,SAAS,OAAgB;AACvB,QAAI,iBAAiBF,QAAAA,qBAAqB;AACxC,aAAO,EAAE,QAAQ,QAAW,MAAM,CAAC,GAAG,aAAa,MAAM,IAAI,EAAA;AAAA,IAC/D;AACA,UAAM;AAAA,EACR;AACF;AAsBO,MAAM,oBAAoB,MAAmB;AAClD,QAAM,oCAAoB,MAAM;AAChC,QAAM,eAAe,mBAAA;AACrB,QAAMG,WAAUC,KAAAA,sBAAA;AAChB,QAAM,YAAYC,QAAAA;AAAAA,IAChBC,QAAAA;AAAAA,IACAC,QAAAA;AAAAA,IACAf,KAAAA;AAAAA,IACA;AAAA,MACE,SAAAW;AAAA,MACA,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,EACZ;AAGF,QAAM,cAAqC,CAAA;AAC3C,QAAM,iBAAiBK,QAAAA,qBAAqB,WAAW,WAAW;AAElE,QAAM,eAAe,OACnB,MACA,QACA,YAGkC;AAElC,UAAM,OAA0B,CAAA;AAChC,UAAM,SAASV,QAAAA,iBAAiB,MAAM,IAAI;AAC1C,UAAM,QAAQC,QAAAA,iBAAiB,QAAQ,IAAI;AAC3C,QAAI,KAAK,UAAU,GAAG;AACpB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR;AAAA,QACA,YAAY;AAAA,MAAA;AAAA,IAEhB;AAGA,QAAI;AACF,kBAAY,SAAS;AACrB,YAAM,UAAU,MAAM;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,kBAAkB,KAAA;AAAA,MAAK;AAE3B,YAAM,aAAa,QAAQ,KAAK,CAAC,WAAW,WAAW,UAAU;AACjE,YAAM,qBAAqB,QAAQ;AAAA,QACjC,CAAC,WAAW,WAAW;AAAA,MAAA;AAEzB,YAAM,SAAS,SAAS,UAAU;AAClC,UAAI,SAAS;AACb,UAAI,mBAAmB,SAAS,GAAG;AACjC,cAAM,UAAU,mBAAmB,mBAAmB,SAAS,CAAC;AAChE,cAAM,WAAW,mBAAmB;AAAA,UAClC,CAAC,WAAW,WAAW;AAAA,QAAA;AAEzB,uBAAe,SAAS,MAAM,SAAS,MAAM;AAC7C,uBAAe,SAAS,OAAO,UAAU,MAAM;AAC/C,YAAI,QAAQ;AACV,mBAAS,OAAOU,wBAAgB,OAAO,CAAC;AAAA,QAC1C;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,QACA,MAAM,CAAC,GAAG,WAAW;AAAA,QACrB;AAAA,MAAA;AAAA,IAEJ,SAAS,OAAgB;AACvB,UAAI,iBAAiBT,QAAAA,qBAAqB;AACxC,cAAMU,QAA0B,CAAC,GAAG,WAAW;AAC/CA,cAAK,KAAK,MAAM,IAAI;AACpB,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,MAAAA;AAAAA,UACA,YAAY;AAAA,QAAA;AAAA,MAEhB;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,YAAY,YAAY;AAC5B,UAAM,SAAS,MAAMC,QAAAA,qBAAqB,gBAAgB;AAAA,MACxD,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAOC,QAAAA;AAAAA,IAAA,CACR;AACD,WAAO,eAAe,gBAAgB,MAAM;AAAA,EAC9C;AAEA,QAAM,cAAc,CAACC,OAAc,UAAmB;AACpD,mBAAe,SAASA,OAAM,OAAO,MAAS;AAAA,EAChD;AAEA,SAAO,EAAE,cAAc,WAAW,YAAA;AACpC;AAEA,MAAM,eAAe,CAAC,UAA4B;AAChD,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AACA,QAAM,cAAc;AACpB,SAAO,YAAY,SAAS,gBAAgB,YAAY,SAAS;AACnE;AAEA,MAAM,gBAAgB,OAAO,YAAwC;AACnE,QAAM,EAAE,MAAM,QAAQ,OAAA,IAAW,MAAM,aAAA;AACvC,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,UAAQ,YAAY,WAAWT,KAAAA,sBAAsBV,cAAG,QAAA,CAAS,CAAC;AAClE,QAAM,EAAE,QAAQ,SAAS,MAAM,QAAQ;AAAA,IACrC;AAAA,IACA,IAAI,kBAAkB;AAAA,IACtB,EAAE,QAAQ,MAAA;AAAA,EAAM;AAElB,MAAI,KAAK,SAAS,GAAG;AACnBoB,yBAAa,QAAQ,MAAM,OAAO;AAAA,EACpC;AACA,MAAI,QAAQ;AACV,YAAQ,IAAI,MAAM;AAAA,EACpB;AACF;AAEA,MAAM,UAAU,OAAO,WAAmC;AACxD,UAAQ;AAAA,IACN,GAAGC,IAAoB,KAAKC,OAAuB,IAAIC,eAA+B;AAAA,EAAA;AAExF,UAAQ,IAAI,kDAAkD;AAC9D,UAAQ,IAAI,GAAGC,cAA8B,EAAE;AAC/C,UAAQ,IAAI,yBAAyB;AACrC,UAAQ,IAAI,EAAE;AAEd,QAAM,UAAU,kBAAA;AAChB,MAAI,QAAQ;AACV,UAAM,cAAc,OAAO;AAAA,EAC7B;AACA,UAAQ,YAAY,WAAWd,KAAAA,sBAAsB,QAAQ,IAAA,CAAK,CAAC;AAEnE,QAAM,KAAK,SAAS,gBAAgB;AAAA,IAClC,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,QAAQ,MAAM,QAAQ,UAAA;AAAA,EAAU,CACjC;AACD,0BAAwB;AAExB,MAAI,eAAe;AACnB,MAAI,eAAe;AACnB,MAAI,kBAAkB,IAAI,gBAAA;AAE1B,QAAM,YAAY,OAAO,mBAA4B;AACnD,OAAG;AAAA,MACD,iBAAiB,yBAAyB,MAAM,QAAQ,UAAA;AAAA,IAAU;AAAA,EAEtE;AAEA,QAAM,sBAAsB,CAAC,SAA0B,KAAK,SAAS,IAAI;AAEzE,QAAM,mBAAmB,OAAO,MAAc,WAAwB;AACpE,QAAI;AACF,YAAM,EAAE,QAAQ,MAAM,YAAAe,YAAAA,IAAe,MAAM,QAAQ;AAAA,QACjD;AAAA,QACA;AAAA,MAAA;AAEF,UAAI,KAAK,SAAS,GAAG;AACnBL,6BAAa,UAAU,MAAM,OAAO;AAAA,MACtC;AACA,UAAI,QAAQ;AACV,gBAAQ,IAAI,MAAM;AAAA,MACpB;AACA,aAAOK;AAAAA,IACT,SAAS,OAAO;AACd,UAAI,aAAa,KAAK,GAAG;AACvB,eAAO;AAAA,MACT;AACA,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAQ,MAAM,OAAO;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,UAAU,KAAK;AACrB,KAAG,OAAA;AAEH,QAAM,iBAAiB,MAAM;AAC3B,QAAI,GAAG,KAAK,WAAW,GAAG;AACxB;AAAA,IACF;AACA,OAAG,MAAM,MAAM,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA,EAC1C;AAEA,QAAM,kBAAkB,YAAY;AAClC,QAAI,CAAC,gBAAgB,OAAO,SAAS;AACnC,sBAAgB,MAAA;AAAA,IAClB;AACA,sBAAkB,IAAI,gBAAA;AACtB,mBAAe;AACf,YAAQ,OAAO,MAAM,iBAAiB;AACtC,mBAAA;AACA,QAAI,CAAC,cAAc;AACjB,YAAM,UAAU,KAAK;AACrB,SAAG,OAAA;AAAA,IACL;AAAA,EACF;AAEA,KAAG,GAAG,UAAU,MAAM;AACpB,SAAK,gBAAA;AAAA,EACP,CAAC;AAED,MAAI,aAAa;AAEjB,mBAAiB,QAAQ,IAAI;AAC3B,QAAI,cAAc;AAChB,sBAAgB;AAAA,EAAK,IAAI;AAAA,IAC3B,OAAO;AACL,qBAAe;AAAA,IACjB;AAEA,QAAI,oBAAoB,IAAI,GAAG;AAC7B,YAAM,UAAU,IAAI;AACpB,SAAG,OAAA;AACH;AAAA,IACF;AAEA,UAAM,cAAc;AACpB,mBAAe;AACf,mBAAe;AACf,QAAI;AACF,mBAAa,MAAM,iBAAiB,aAAa,gBAAgB,MAAM;AAAA,IACzE,UAAA;AACE,qBAAe;AAAA,IACjB;AACA,QAAI,YAAY;AACd,qBAAe;AACf;AAAA,IACF;AACA,UAAM,UAAU,KAAK;AACrB,OAAG,OAAA;AAAA,EACL;AAEA,MAAI,CAAC,cAAc,cAAc;AAC/B,mBAAe;AACf,QAAI;AACF,YAAM,iBAAiB,cAAc,gBAAgB,MAAM;AAAA,IAC7D,UAAA;AACE,qBAAe;AAAA,IACjB;AAAA,EACF;AAEA,KAAG,MAAA;AACH,0BAAwB;AAC1B;AA6CA,MAAM,mBAAmB,OACvB,SACA,gBACkB;AAClB,QAAM,EAAE,MAAM,QAAQ,OAAA,IAAW,MAAM,aAAA;AACvC,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,UAAQ,SAAS,WAAWf,KAAAA,sBAAsBV,cAAG,QAAA,CAAS,GAAG,MAAS;AAC1E,QAAM,EAAE,QAAQ,KAAA,IAAS,MAAM;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI,kBAAkB;AAAA,EAAA;AAExB,MAAI,KAAK,SAAS,GAAG;AACnBoB,yBAAa,QAAQ,MAAM,OAAO;AAAA,EACpC;AACA,MAAI,QAAQ;AACV,YAAQ,IAAI,MAAM;AAAA,EACpB;AACF;AAEA,MAAM,YAAY,OAAO,OAAe,WAAmC;AACzE,QAAM,UAAU,UAAU;AAC1B,QAAM,SAAS,UAAU,YAAY;AACrC,QAAM,SAAS,UACX,MAAM,WAAW,QAAQ,KAAK,IAC9B,MAAMnB,SAAAA,SAAS,OAAO,MAAM;AAEhC,QAAM,WAAW,UAAU,QAAQ,IAAA,IAAQF,gBAAK,QAAQA,gBAAK,QAAQ,KAAK,CAAC;AAC3E,QAAM,YAAYY,QAAAA;AAAAA,IAChBC,QAAAA;AAAAA,IACAC,QAAAA;AAAAA,IACAf,KAAAA;AAAAA,IACA;AAAA,MACE,SAASY,KAAAA,sBAAsB,SAASV,cAAG,QAAA,IAAY,QAAQ;AAAA,IAAA;AAAA,EACjE;AAEF,QAAM,cAAqC,CAAA;AAC3C,QAAM,iBAAiBc,QAAAA,qBAAqB,WAAW,WAAW;AAElE,MAAI,QAAQ;AACV,UAAM,iBAAiB,gBAAgB,WAAW;AAAA,EACpD;AACA,iBAAe;AAAA,IACb;AAAA,IACAJ,KAAAA,sBAAsB,QAAQ;AAAA,IAC9B;AAAA,EAAA;AAEF,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI,kBAAkB;AAAA,IACtB,CAAC,UAAU;AACT,cAAQ,OAAO,MAAM,KAAK;AAAA,IAC5B;AAAA,EAAA;AAGF,QAAM,WAAWU,QAAAA,aAAa,QAAQ,OAAO,MAAM,OAAO;AAC1D,MAAI,UAAU;AACZ,YAAQ,WAAW;AAAA,EACrB;AACF;AAIA,MAAM,sBAAsB,CAC1B,SAC+B;AAC/B,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS;AAChD,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,QAAQ,MAAM;AAChB,YAAM,OAAO,KAAK,QAAQ,CAAC;AAC3B,UAAI,SAAS,UAAU,SAAS,OAAO;AACrC,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,QAAQ,QAAQ,WAAW;AACrC,eAAS;AACT;AAAA,IACF;AACA,QAAI,IAAI,WAAW,UAAU,GAAG;AAC9B;AAAA,IACF;AACA,QAAI,IAAI,WAAW,GAAG,GAAG;AACvB;AAAA,IACF;AACA,WAAO,QAAQ,UAAU,QAAQ,QAAQ,MAAM;AAAA,EACjD;AACA,SAAO;AACT;AAEA,MAAM,iBAAiB,CAAC,SAAqC;AAC3D,aAAW,OAAO,MAAM;AACtB,QAAI,QAAQ,MAAM;AAChB;AAAA,IACF;AACA,QAAI,QAAQ,QAAQ,QAAQ,aAAa,IAAI,WAAW,UAAU,GAAG;AACnE,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,MAAM,uBAAuB,CAAC,SAA6B;AACzD,QAAM,OAAO,KAAK,MAAM,CAAC;AACzB,QAAM,kBAAkB,oBAAoB,IAAI;AAChD,MAAI,iBAAiB;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,KAAK;AAAA,IACnB,CAAC,QACC,QAAQ,QAAQ,QAAQ,YAAY,QAAQ,QAAQ,QAAQ;AAAA,EAAA;AAEhE,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,eAAe,IAAI,IAAI,QAAQ;AAC/C,QAAM,CAAC,WAAW,QAAQ,aAAa,SAAS,IAAI;AACpD,SAAO,CAAC,UAAU,YAAY,SAAS,GAAG,IAAI;AAChD;AAEO,MAAM,UAAU,OAAO,OAAiB,QAAQ,SAAwB;AAC7E,QAAM,UAAU,IAAIM,kBAAA;AAEpB,UAAQ,KAAKL,IAAoB;AACjC,UAAQ,QAAQM,WAA2B;AAC3C,UAAQ;AAAA,IACN;AAAA,IACA,GAAGN,IAAoB;AAAA,EAAKM,WAA2B;AAAA;AAAA,EAAA;AAEzD,UAAQ;AAAA,IACN,GAAGL,OAAuB,IAAIC,eAA+B;AAAA,EAAA;AAE/D,UAAQ,mBAAmB,IAAI;AAC/B,UAAQ,UAAU,IAAIK,UAAAA,OAAO,WAAW,0BAA0B,CAAC;AAEnE,UACG,QAAQ,MAAM,EACd,QAAQ,mCAAmC,EAC3C,OAAO,OAAO,UAAU,YAAY;AACnC,UAAM,EAAE,OAAO,QAAQ,QAAQ,UAAU,EAAE,IAAI,KAAA;AAC/C,UAAM,QAAQ,EAAE;AAAA,EAClB,CAAC;AAEH,UACG,QAAQ,KAAK,EACb,QAAQ,mCAAmC,EAC3C;AAAA,IACC,IAAIA,UAAAA;AAAAA,MACF;AAAA,MACA;AAAA,IAAA,EACA,QAAQ,GAAG;AAAA,EAAA,EAEd,OAAO,OAAO,SAA4B,YAAY;AACrD,UAAM,EAAE,OAAO,QAAQ,QAAQ,UAAU,EAAE,IAAI,KAAA;AAC/C,UAAM,UAAU,QAAQ,OAAO,EAAE;AAAA,EACnC,CAAC;AAEH,QAAM,QAAQ,WAAW,qBAAqB,IAAI,CAAC;AACrD;AChtBA,UAAU,MAAM,CAAC,UAAmB;AAClC,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAQ,MAAM,OAAO;AACrB,UAAQ,WAAW;AACrB,CAAC;"}
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.1.0"
4
+ "1.2.0"
5
5
  ],
6
6
  "branches": [
7
7
  "main"
8
8
  ],
9
- "version": "1.1.0",
9
+ "version": "1.2.0",
10
10
  "commit": {
11
- "hash": "bd9ca1189122a6a81cf5363705508020eef87a84",
12
- "shortHash": "bd9ca11",
13
- "date": "2026-01-26T16:48:29+09:00",
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.1.0",
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-01-26T16:49:40+09:00"
74
+ "buildDate": "2026-02-06T22:03:11+09:00"
75
75
  }