@tokens-studio/tokenscript-interpreter 0.36.4 → 0.37.1

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.
Files changed (79) hide show
  1. package/dist/chunk-3D6X7EAK.js +6605 -0
  2. package/dist/chunk-3D6X7EAK.js.map +1 -0
  3. package/dist/chunk-6KHDVYST.js +6616 -0
  4. package/dist/chunk-6KHDVYST.js.map +1 -0
  5. package/dist/chunk-6MXPTXGR.js +6591 -0
  6. package/dist/chunk-6MXPTXGR.js.map +1 -0
  7. package/dist/chunk-EM64RW7I.js +6592 -0
  8. package/dist/chunk-EM64RW7I.js.map +1 -0
  9. package/dist/chunk-H7YXFZ4I.js +6605 -0
  10. package/dist/chunk-H7YXFZ4I.js.map +1 -0
  11. package/dist/chunk-Z437BNC5.js +107 -0
  12. package/dist/chunk-Z437BNC5.js.map +1 -0
  13. package/dist/cli.js +149 -16
  14. package/dist/cli.js.map +1 -1
  15. package/dist/compliance-suite.js +3 -5
  16. package/dist/compliance-suite.js.map +1 -1
  17. package/dist/config-B-kbeoff.d.ts +927 -0
  18. package/dist/config-Mw_Iq324.d.ts +921 -0
  19. package/dist/lib/{chunk-S7WGJBSX.js → chunk-24FMHL6W.js} +16 -3
  20. package/dist/lib/chunk-24FMHL6W.js.map +1 -0
  21. package/dist/lib/{chunk-2BDFE7U4.js → chunk-4L54VFWU.js} +132 -15
  22. package/dist/lib/chunk-4L54VFWU.js.map +1 -0
  23. package/dist/lib/{chunk-UF6I25ED.cjs → chunk-KX5QZ5G2.cjs} +685 -567
  24. package/dist/lib/chunk-KX5QZ5G2.cjs.map +1 -0
  25. package/dist/lib/{chunk-K65UI6KX.cjs → chunk-OABJLZRZ.cjs} +113 -100
  26. package/dist/lib/chunk-OABJLZRZ.cjs.map +1 -0
  27. package/dist/lib/{chunk-AEOBCHBK.js → chunk-SLITBMFB.js} +10 -3
  28. package/dist/lib/chunk-SLITBMFB.js.map +1 -0
  29. package/dist/lib/{chunk-KHF2VXWO.cjs → chunk-ZMMIYWFF.cjs} +10 -2
  30. package/dist/lib/chunk-ZMMIYWFF.cjs.map +1 -0
  31. package/dist/lib/index.cjs +99 -91
  32. package/dist/lib/index.d.cts +4 -4
  33. package/dist/lib/index.d.ts +4 -4
  34. package/dist/lib/index.js +3 -3
  35. package/dist/lib/{interpreter-DdF_Hj-J.d.ts → interpreter-B7BcLEBz.d.cts} +54 -4
  36. package/dist/lib/{interpreter-Cz_vWDDa.d.cts → interpreter-wKto6JTb.d.ts} +54 -4
  37. package/dist/lib/interpreter.cjs +81 -73
  38. package/dist/lib/interpreter.d.cts +7 -6
  39. package/dist/lib/interpreter.d.ts +7 -6
  40. package/dist/lib/interpreter.js +3 -3
  41. package/dist/lib/processor-node.cjs +12 -12
  42. package/dist/lib/processor-node.d.cts +3 -3
  43. package/dist/lib/processor-node.d.ts +3 -3
  44. package/dist/lib/processor-node.js +3 -3
  45. package/dist/lib/processor.cjs +17 -17
  46. package/dist/lib/processor.d.cts +4 -4
  47. package/dist/lib/processor.d.ts +4 -4
  48. package/dist/lib/processor.js +3 -3
  49. package/dist/lib/schema.cjs +5 -5
  50. package/dist/lib/schema.d.cts +1 -1
  51. package/dist/lib/schema.d.ts +1 -1
  52. package/dist/lib/schema.js +3 -3
  53. package/dist/lib/syntax-highlighting.cjs +15 -15
  54. package/dist/lib/syntax-highlighting.d.cts +1 -1
  55. package/dist/lib/syntax-highlighting.d.ts +1 -1
  56. package/dist/lib/syntax-highlighting.js +2 -2
  57. package/dist/lib/{types-DRpZJjkx.d.ts → types-BHcQYEQ-.d.ts} +2 -2
  58. package/dist/lib/{types-CxQPMHn1.d.ts → types-BMYcHiSq.d.cts} +9 -1
  59. package/dist/lib/{types-CxQPMHn1.d.cts → types-BMYcHiSq.d.ts} +9 -1
  60. package/dist/lib/{types-6QQt-XVS.d.cts → types-BOyxzACN.d.cts} +2 -2
  61. package/dist/lib/types.cjs +10 -6
  62. package/dist/lib/types.d.cts +1 -1
  63. package/dist/lib/types.d.ts +1 -1
  64. package/dist/lib/types.js +1 -1
  65. package/dist/processor/index.d.ts +1 -1
  66. package/dist/processor/index.js +18 -2
  67. package/dist/processor/index.js.map +1 -1
  68. package/dist/repl.d.ts +15 -3
  69. package/dist/repl.js +6 -8
  70. package/dist/repl.js.map +1 -1
  71. package/dist/types.d.ts +1 -1
  72. package/dist/types.js +1 -1
  73. package/package.json +1 -1
  74. package/dist/lib/chunk-2BDFE7U4.js.map +0 -1
  75. package/dist/lib/chunk-AEOBCHBK.js.map +0 -1
  76. package/dist/lib/chunk-K65UI6KX.cjs.map +0 -1
  77. package/dist/lib/chunk-KHF2VXWO.cjs.map +0 -1
  78. package/dist/lib/chunk-S7WGJBSX.js.map +0 -1
  79. package/dist/lib/chunk-UF6I25ED.cjs.map +0 -1
package/dist/repl.d.ts CHANGED
@@ -1,7 +1,19 @@
1
- import { R as ReferenceRecord, C as Config } from './config-Bsd6DPFy.js';
1
+ import { R as ReferenceRecord, C as Config } from './config-B-kbeoff.js';
2
2
  import '@tokens-studio/schema-validation';
3
3
 
4
- type ReplMode = "inline" | "script";
4
+ /**
5
+ * Parsing mode — determines how the lexer and parser behave.
6
+ *
7
+ * - `"inline"` — Expression-only mode for token `$value` fields.
8
+ * Enables greedy strings (URLs, dotted paths parsed as single tokens).
9
+ * No statements (variable, if, while, etc.).
10
+ *
11
+ * - `"script"` — Full statement mode for schema/function bodies.
12
+ * Standard lexing (`:`, `.`, `/` produce separate tokens).
13
+ */
14
+ type ParseMode = "inline" | "script";
15
+
16
+ type ReplMode = ParseMode;
5
17
  interface ReplOptions {
6
18
  mode?: ReplMode;
7
19
  schemas?: string[];
@@ -11,6 +23,6 @@ interface ReplOptions {
11
23
  * Start interactive REPL mode for TokenScript
12
24
  */
13
25
  declare function startRepl(options?: ReplOptions): Promise<void>;
14
- declare function interpretExpression(code: string, references: ReferenceRecord, config: Config | undefined, isInline: boolean): string | undefined;
26
+ declare function interpretExpression(code: string, references: ReferenceRecord, config: Config | undefined, mode: ParseMode): string | undefined;
15
27
 
16
28
  export { type ReplMode, type ReplOptions, interpretExpression, startRepl };
package/dist/repl.js CHANGED
@@ -1,5 +1,5 @@
1
- import { Lexer, Parser, Interpreter, Config, getAssignmentInfo, getReassignmentInfo, isNone, parseColorSpec, parseFunctionSpec } from './chunk-OCQX3WYJ.js';
2
- import './chunk-LZTXD3LN.js';
1
+ import { parseExpression, Interpreter, Config, getAssignmentInfo, getReassignmentInfo, isNone, parseColorSpec, parseFunctionSpec } from './chunk-6KHDVYST.js';
2
+ import './chunk-Z437BNC5.js';
3
3
  import { ZodError } from '@tokens-studio/schema-validation';
4
4
  import * as readlineSync from 'readline-sync';
5
5
 
@@ -142,12 +142,12 @@ async function startRepl(options = {}) {
142
142
  }
143
143
  let result;
144
144
  if (mode === "inline") {
145
- result = interpretExpression(input, references, config, true);
145
+ result = interpretExpression(input, references, config, "inline");
146
146
  } else {
147
147
  const autoSemiLastLineInput = input.endsWith(";") ? input : `${input};`;
148
148
  scriptLines.push(autoSemiLastLineInput);
149
149
  const fullScript = scriptLines.join("\n");
150
- result = interpretExpression(fullScript, references, config, false);
150
+ result = interpretExpression(fullScript, references, config, "script");
151
151
  }
152
152
  if (result) {
153
153
  console.log(result);
@@ -187,11 +187,9 @@ function getDisplayValue(ast, interpreter, result) {
187
187
  }
188
188
  return result.toString();
189
189
  }
190
- function interpretExpression(code, references, config, isInline) {
190
+ function interpretExpression(code, references, config, mode) {
191
191
  try {
192
- const lexer = new Lexer(code);
193
- const parser = new Parser(lexer);
194
- const ast = parser.parse(isInline);
192
+ const { ast } = parseExpression(code, { mode });
195
193
  if (!ast) {
196
194
  return "No result (empty input)";
197
195
  }
package/dist/repl.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/schema-fetcher.ts","../src/repl.ts"],"names":[],"mappings":"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","file":"repl.js","sourcesContent":["import { Config } from \"@interpreter/config\";\nimport { type ColorSpecification, parseColorSpec } from \"@interpreter/config/managers/color/schema\";\nimport {\n type FunctionSpecification,\n parseFunctionSpec,\n} from \"@interpreter/config/managers/functions/schema\";\nimport { ZodError } from \"@tokens-studio/schema-validation\";\n\n// The TokenScript schema-server response envelope. The inner `content`\n// is the actual schema specification (color or function); everything else\n// is registry metadata.\n//\n// Validated by hand here rather than via the schema-validation library\n// because the envelope is registry-server specific and not part of the\n// schema language itself. The library handles the inner `content` field.\nexport interface TokenScriptSchemaResponse {\n id: string;\n type: string;\n schema: string;\n slug: string;\n version: string;\n content: TokenScriptSchemaContent;\n license_name?: string | null;\n}\n\nexport type TokenScriptSchemaContent = ColorSpecification | FunctionSpecification;\n\nexport interface SchemaFetcherOptions {\n timeout?: number;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction summarizeZodError(err: ZodError): string {\n return err.issues.map((i) => `${i.path.join(\".\") || \"<root>\"}: ${i.message}`).join(\"; \");\n}\n\n/**\n * Validate a parsed JSON value as a TokenScriptSchemaResponse envelope\n * and parse the inner `content` as a color or function specification.\n *\n * Throws an `Error` describing the first violation on failure.\n */\nfunction parseTokenScriptSchemaResponse(data: unknown): TokenScriptSchemaResponse {\n if (!isPlainObject(data)) {\n throw new Error(\"Invalid schema structure: expected an object\");\n }\n\n const requireString = (key: string): string => {\n const value = data[key];\n if (typeof value !== \"string\") {\n throw new Error(`Invalid schema structure: missing or non-string field \"${key}\"`);\n }\n return value;\n };\n\n const id = requireString(\"id\");\n const type = requireString(\"type\");\n const schema = requireString(\"schema\");\n const slug = requireString(\"slug\");\n const version = requireString(\"version\");\n\n if (!(\"content\" in data)) {\n throw new Error('Invalid schema structure: missing field \"content\"');\n }\n const rawContent = data.content;\n if (!isPlainObject(rawContent)) {\n throw new Error('Invalid schema structure: \"content\" must be an object');\n }\n\n const contentType = rawContent.type;\n let content: TokenScriptSchemaContent;\n try {\n if (contentType === \"color\") {\n content = parseColorSpec(rawContent);\n } else if (contentType === \"function\") {\n content = parseFunctionSpec(rawContent);\n } else {\n throw new Error(\n `Unsupported content.type \"${String(contentType)}\" — expected \"color\" or \"function\"`,\n );\n }\n } catch (err) {\n const detail =\n err instanceof ZodError\n ? summarizeZodError(err)\n : err instanceof Error\n ? err.message\n : String(err);\n throw new Error(`Invalid schema structure: content: ${detail}`);\n }\n\n let license_name: string | null | undefined;\n if (\"license_name\" in data) {\n const raw = data.license_name;\n if (raw !== null && raw !== undefined && typeof raw !== \"string\") {\n throw new Error('Invalid schema structure: \"license_name\" must be a string or null');\n }\n license_name = raw as string | null | undefined;\n }\n\n return { id, type, schema, slug, version, content, license_name };\n}\n\nexport async function fetchTokenScriptSchema(\n schemaUri: string,\n options: SchemaFetcherOptions = {},\n): Promise<TokenScriptSchemaResponse> {\n const { timeout = 10000, headers = {}, signal } = options;\n\n const controller = signal ? new AbortController() : new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n if (signal) {\n signal.addEventListener(\"abort\", () => controller.abort());\n }\n\n try {\n const response = await fetch(schemaUri, {\n signal: controller.signal,\n headers: {\n Accept: \"application/json\",\n \"User-Agent\": \"TokenScript-Interpreter/1.0\",\n ...headers,\n },\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status} - ${response.statusText}`);\n }\n\n const data = await response.json();\n return parseTokenScriptSchemaResponse(data);\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new Error(`Schema fetch timeout after ${timeout}ms`);\n }\n // Validation errors are already wrapped with \"Invalid schema structure\".\n if (\n error.message.startsWith(\"Invalid schema structure\") ||\n error.message.startsWith(\"HTTP error\")\n ) {\n throw error;\n }\n throw new Error(`Failed to fetch schema: ${error.message}`);\n }\n\n throw new Error(\"Unknown error occurred while fetching schema\");\n }\n}\n\nexport async function fetchAndRegisterSchemas(\n schemaUris: string[],\n config?: Config,\n): Promise<Config> {\n const configInstance = config || new Config();\n\n if (!schemaUris || schemaUris.length === 0) {\n return configInstance;\n }\n\n const schemas = await Promise.all(\n schemaUris.map(async (uri) => {\n const schemaResponse = await fetchTokenScriptSchema(uri);\n return {\n uri,\n schema: schemaResponse.content as ColorSpecification | FunctionSpecification,\n };\n }),\n );\n\n return configInstance.registerSchemas(schemas);\n}\n","import { getAssignmentInfo, getReassignmentInfo } from \"@interpreter/ast\";\nimport type { Config } from \"@interpreter/config\";\nimport { Interpreter } from \"@interpreter/interpreter\";\nimport { Lexer } from \"@interpreter/lexer\";\nimport { Parser } from \"@interpreter/parser\";\nimport { isNone } from \"@interpreter/utils/type\";\nimport type { ReferenceRecord } from \"@src/types\";\nimport { fetchAndRegisterSchemas } from \"@src/utils/schema-fetcher\";\nimport * as readlineSync from \"readline-sync\";\n\nexport type ReplMode = \"inline\" | \"script\";\n\nexport interface ReplOptions {\n mode?: ReplMode;\n schemas?: string[];\n references?: ReferenceRecord;\n}\n\n/**\n * Start interactive REPL mode for TokenScript\n */\nexport async function startRepl(options: ReplOptions = {}): Promise<void> {\n const { mode = \"inline\", schemas, references: initialReferences } = options;\n\n const config = await fetchAndRegisterSchemas(schemas ?? []);\n const references: ReferenceRecord = { ...initialReferences };\n let scriptLines: string[] = [];\n\n console.log(\n `Mode: ${mode === \"inline\" ? \"inline (execute each line)\" : \"script (accumulate and execute)\"}`,\n );\n console.log('\"exit()\" to exit, \"clear()\" to clear.');\n console.log(\"\");\n\n while (true) {\n try {\n const input = readlineSync.question(\"> \");\n const cmd = input.toLowerCase().trim();\n\n if (cmd === \"exit()\") {\n break;\n }\n\n if (cmd === \"clear()\") {\n scriptLines = [];\n console.clear();\n console.log(\n `Mode: ${mode === \"inline\" ? \"inline (execute each line)\" : \"script (accumulate and execute)\"}`,\n );\n console.log('\"exit()\" to exit, \"clear()\" to clear.');\n console.log(\"\");\n continue;\n }\n\n if (input.trim() === \"\") {\n continue;\n }\n\n let result: string | undefined;\n if (mode === \"inline\") {\n result = interpretExpression(input, references, config, true);\n } else {\n const autoSemiLastLineInput = input.endsWith(\";\") ? input : `${input};`;\n scriptLines.push(autoSemiLastLineInput);\n const fullScript = scriptLines.join(\"\\n\");\n result = interpretExpression(fullScript, references, config, false);\n }\n if (result) {\n console.log(result);\n }\n } catch (error: any) {\n console.error(`Error: ${error.message}`);\n if (mode === \"script\") {\n scriptLines.pop();\n }\n }\n }\n}\n\n/**\n * Get the output value for a REPL display.\n * Handles special cases for assignments and reassignments.\n */\nfunction getDisplayValue(\n ast: import(\"@interpreter/ast\").ASTNode,\n interpreter: Interpreter,\n result: unknown,\n): string | undefined {\n const assignmentInfo = getAssignmentInfo(ast);\n const reassignmentInfo = getReassignmentInfo(ast);\n\n // Check if the last statement is an assignment or reassignment first\n // This takes priority over the result value (important for script mode)\n if (assignmentInfo) {\n // For assignments, only print if there's an assigned value\n if (assignmentInfo.hasAssignment) {\n const varValue = interpreter.getSymbol(assignmentInfo.varName);\n if (varValue) {\n return varValue.toString();\n }\n }\n // Nullable assignment without value - don't print anything\n return;\n }\n\n if (reassignmentInfo) {\n const varValue = interpreter.getSymbol(reassignmentInfo.varName);\n if (varValue) {\n return varValue.toString();\n }\n return;\n }\n\n // Not an assignment/reassignment, print the result\n if (isNone(result)) {\n return;\n }\n\n if (typeof result === \"string\") {\n return result;\n }\n\n return result.toString();\n}\n\nexport function interpretExpression(\n code: string,\n references: ReferenceRecord,\n config: Config | undefined,\n isInline: boolean,\n): string | undefined {\n try {\n const lexer = new Lexer(code);\n const parser = new Parser(lexer);\n const ast = parser.parse(isInline);\n\n if (!ast) {\n return \"No result (empty input)\";\n }\n\n const interpreter = new Interpreter(ast, { references, config });\n const result = interpreter.interpret();\n\n return getDisplayValue(ast, interpreter, result);\n } catch (error: any) {\n throw new Error(`Interpretation failed: ${error.message}`);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/schema-fetcher.ts","../src/repl.ts"],"names":[],"mappings":"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","file":"repl.js","sourcesContent":["import { Config } from \"@interpreter/config\";\nimport { type ColorSpecification, parseColorSpec } from \"@interpreter/config/managers/color/schema\";\nimport {\n type FunctionSpecification,\n parseFunctionSpec,\n} from \"@interpreter/config/managers/functions/schema\";\nimport { ZodError } from \"@tokens-studio/schema-validation\";\n\n// The TokenScript schema-server response envelope. The inner `content`\n// is the actual schema specification (color or function); everything else\n// is registry metadata.\n//\n// Validated by hand here rather than via the schema-validation library\n// because the envelope is registry-server specific and not part of the\n// schema language itself. The library handles the inner `content` field.\nexport interface TokenScriptSchemaResponse {\n id: string;\n type: string;\n schema: string;\n slug: string;\n version: string;\n content: TokenScriptSchemaContent;\n license_name?: string | null;\n}\n\nexport type TokenScriptSchemaContent = ColorSpecification | FunctionSpecification;\n\nexport interface SchemaFetcherOptions {\n timeout?: number;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction summarizeZodError(err: ZodError): string {\n return err.issues.map((i) => `${i.path.join(\".\") || \"<root>\"}: ${i.message}`).join(\"; \");\n}\n\n/**\n * Validate a parsed JSON value as a TokenScriptSchemaResponse envelope\n * and parse the inner `content` as a color or function specification.\n *\n * Throws an `Error` describing the first violation on failure.\n */\nfunction parseTokenScriptSchemaResponse(data: unknown): TokenScriptSchemaResponse {\n if (!isPlainObject(data)) {\n throw new Error(\"Invalid schema structure: expected an object\");\n }\n\n const requireString = (key: string): string => {\n const value = data[key];\n if (typeof value !== \"string\") {\n throw new Error(`Invalid schema structure: missing or non-string field \"${key}\"`);\n }\n return value;\n };\n\n const id = requireString(\"id\");\n const type = requireString(\"type\");\n const schema = requireString(\"schema\");\n const slug = requireString(\"slug\");\n const version = requireString(\"version\");\n\n if (!(\"content\" in data)) {\n throw new Error('Invalid schema structure: missing field \"content\"');\n }\n const rawContent = data.content;\n if (!isPlainObject(rawContent)) {\n throw new Error('Invalid schema structure: \"content\" must be an object');\n }\n\n const contentType = rawContent.type;\n let content: TokenScriptSchemaContent;\n try {\n if (contentType === \"color\") {\n content = parseColorSpec(rawContent);\n } else if (contentType === \"function\") {\n content = parseFunctionSpec(rawContent);\n } else {\n throw new Error(\n `Unsupported content.type \"${String(contentType)}\" — expected \"color\" or \"function\"`,\n );\n }\n } catch (err) {\n const detail =\n err instanceof ZodError\n ? summarizeZodError(err)\n : err instanceof Error\n ? err.message\n : String(err);\n throw new Error(`Invalid schema structure: content: ${detail}`);\n }\n\n let license_name: string | null | undefined;\n if (\"license_name\" in data) {\n const raw = data.license_name;\n if (raw !== null && raw !== undefined && typeof raw !== \"string\") {\n throw new Error('Invalid schema structure: \"license_name\" must be a string or null');\n }\n license_name = raw as string | null | undefined;\n }\n\n return { id, type, schema, slug, version, content, license_name };\n}\n\nexport async function fetchTokenScriptSchema(\n schemaUri: string,\n options: SchemaFetcherOptions = {},\n): Promise<TokenScriptSchemaResponse> {\n const { timeout = 10000, headers = {}, signal } = options;\n\n const controller = signal ? new AbortController() : new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n if (signal) {\n signal.addEventListener(\"abort\", () => controller.abort());\n }\n\n try {\n const response = await fetch(schemaUri, {\n signal: controller.signal,\n headers: {\n Accept: \"application/json\",\n \"User-Agent\": \"TokenScript-Interpreter/1.0\",\n ...headers,\n },\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status} - ${response.statusText}`);\n }\n\n const data = await response.json();\n return parseTokenScriptSchemaResponse(data);\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new Error(`Schema fetch timeout after ${timeout}ms`);\n }\n // Validation errors are already wrapped with \"Invalid schema structure\".\n if (\n error.message.startsWith(\"Invalid schema structure\") ||\n error.message.startsWith(\"HTTP error\")\n ) {\n throw error;\n }\n throw new Error(`Failed to fetch schema: ${error.message}`);\n }\n\n throw new Error(\"Unknown error occurred while fetching schema\");\n }\n}\n\nexport async function fetchAndRegisterSchemas(\n schemaUris: string[],\n config?: Config,\n): Promise<Config> {\n const configInstance = config || new Config();\n\n if (!schemaUris || schemaUris.length === 0) {\n return configInstance;\n }\n\n const schemas = await Promise.all(\n schemaUris.map(async (uri) => {\n const schemaResponse = await fetchTokenScriptSchema(uri);\n return {\n uri,\n schema: schemaResponse.content as ColorSpecification | FunctionSpecification,\n };\n }),\n );\n\n return configInstance.registerSchemas(schemas);\n}\n","import { getAssignmentInfo, getReassignmentInfo } from \"@interpreter/ast\";\nimport type { Config } from \"@interpreter/config\";\nimport { Interpreter } from \"@interpreter/interpreter\";\nimport { type ParseMode, parseExpression } from \"@interpreter/parser\";\nimport { isNone } from \"@interpreter/utils/type\";\nimport type { ReferenceRecord } from \"@src/types\";\nimport { fetchAndRegisterSchemas } from \"@src/utils/schema-fetcher\";\nimport * as readlineSync from \"readline-sync\";\n\nexport type ReplMode = ParseMode;\n\nexport interface ReplOptions {\n mode?: ReplMode;\n schemas?: string[];\n references?: ReferenceRecord;\n}\n\n/**\n * Start interactive REPL mode for TokenScript\n */\nexport async function startRepl(options: ReplOptions = {}): Promise<void> {\n const { mode = \"inline\", schemas, references: initialReferences } = options;\n\n const config = await fetchAndRegisterSchemas(schemas ?? []);\n const references: ReferenceRecord = { ...initialReferences };\n let scriptLines: string[] = [];\n\n console.log(\n `Mode: ${mode === \"inline\" ? \"inline (execute each line)\" : \"script (accumulate and execute)\"}`,\n );\n console.log('\"exit()\" to exit, \"clear()\" to clear.');\n console.log(\"\");\n\n while (true) {\n try {\n const input = readlineSync.question(\"> \");\n const cmd = input.toLowerCase().trim();\n\n if (cmd === \"exit()\") {\n break;\n }\n\n if (cmd === \"clear()\") {\n scriptLines = [];\n console.clear();\n console.log(\n `Mode: ${mode === \"inline\" ? \"inline (execute each line)\" : \"script (accumulate and execute)\"}`,\n );\n console.log('\"exit()\" to exit, \"clear()\" to clear.');\n console.log(\"\");\n continue;\n }\n\n if (input.trim() === \"\") {\n continue;\n }\n\n let result: string | undefined;\n if (mode === \"inline\") {\n result = interpretExpression(input, references, config, \"inline\");\n } else {\n const autoSemiLastLineInput = input.endsWith(\";\") ? input : `${input};`;\n scriptLines.push(autoSemiLastLineInput);\n const fullScript = scriptLines.join(\"\\n\");\n result = interpretExpression(fullScript, references, config, \"script\");\n }\n if (result) {\n console.log(result);\n }\n } catch (error: any) {\n console.error(`Error: ${error.message}`);\n if (mode === \"script\") {\n scriptLines.pop();\n }\n }\n }\n}\n\n/**\n * Get the output value for a REPL display.\n * Handles special cases for assignments and reassignments.\n */\nfunction getDisplayValue(\n ast: import(\"@interpreter/ast\").ASTNode,\n interpreter: Interpreter,\n result: unknown,\n): string | undefined {\n const assignmentInfo = getAssignmentInfo(ast);\n const reassignmentInfo = getReassignmentInfo(ast);\n\n // Check if the last statement is an assignment or reassignment first\n // This takes priority over the result value (important for script mode)\n if (assignmentInfo) {\n // For assignments, only print if there's an assigned value\n if (assignmentInfo.hasAssignment) {\n const varValue = interpreter.getSymbol(assignmentInfo.varName);\n if (varValue) {\n return varValue.toString();\n }\n }\n // Nullable assignment without value - don't print anything\n return;\n }\n\n if (reassignmentInfo) {\n const varValue = interpreter.getSymbol(reassignmentInfo.varName);\n if (varValue) {\n return varValue.toString();\n }\n return;\n }\n\n // Not an assignment/reassignment, print the result\n if (isNone(result)) {\n return;\n }\n\n if (typeof result === \"string\") {\n return result;\n }\n\n return result.toString();\n}\n\nexport function interpretExpression(\n code: string,\n references: ReferenceRecord,\n config: Config | undefined,\n mode: ParseMode,\n): string | undefined {\n try {\n const { ast } = parseExpression(code, { mode });\n\n if (!ast) {\n return \"No result (empty input)\";\n }\n\n const interpreter = new Interpreter(ast, { references, config });\n const result = interpreter.interpret();\n\n return getDisplayValue(ast, interpreter, result);\n } catch (error: any) {\n throw new Error(`Interpretation failed: ${error.message}`);\n }\n}\n"]}
package/dist/types.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { A as ASTNode, I as ISymbolType, O as Operations, R as ReferenceRecord, a as ReferenceRecordValue, b as ReservedKeyword, c as SupportedFormats, S as SymbolMetadata, T as Token, d as TokenType, U as UNINTERPRETED_KEYWORDS } from './config-Bsd6DPFy.js';
1
+ export { A as ASTNode, I as ISymbolType, O as Operations, R as ReferenceRecord, a as ReferenceRecordValue, b as ReservedKeyword, c as SCRIPT_ONLY_STATEMENT_KEYWORDS, d as SupportedFormats, S as SymbolMetadata, T as Token, e as TokenType, U as UNINTERPRETED_KEYWORDS } from './config-B-kbeoff.js';
2
2
  import '@tokens-studio/schema-validation';
package/dist/types.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Operations, ReservedKeyword, SupportedFormats, TokenType, UNINTERPRETED_KEYWORDS } from './chunk-LZTXD3LN.js';
1
+ export { Operations, ReservedKeyword, SCRIPT_ONLY_STATEMENT_KEYWORDS, SupportedFormats, TokenType, UNINTERPRETED_KEYWORDS } from './chunk-Z437BNC5.js';
2
2
  //# sourceMappingURL=types.js.map
3
3
  //# sourceMappingURL=types.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tokens-studio/tokenscript-interpreter",
3
- "version": "0.36.4",
3
+ "version": "0.37.1",
4
4
  "description": "A TypeScript interpreter for TokenScript, a domain-specific language for design token manipulation and computation",
5
5
  "type": "module",
6
6
  "main": "./dist/lib/index.js",