@forthix/forthic 0.4.0 → 0.5.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 (88) hide show
  1. package/README.md +8 -2
  2. package/dist/cjs/forthic/decorators/schemaUtils.d.ts +70 -0
  3. package/dist/cjs/forthic/decorators/schemaUtils.js +77 -0
  4. package/dist/cjs/forthic/decorators/schemaUtils.js.map +1 -0
  5. package/dist/cjs/forthic/decorators/stackEffect.d.ts +63 -0
  6. package/dist/cjs/forthic/decorators/stackEffect.js +179 -0
  7. package/dist/cjs/forthic/decorators/stackEffect.js.map +1 -0
  8. package/dist/cjs/forthic/errors.d.ts +2 -0
  9. package/dist/cjs/forthic/errors.js +13 -2
  10. package/dist/cjs/forthic/errors.js.map +1 -1
  11. package/dist/cjs/forthic/interpreter.d.ts +11 -1
  12. package/dist/cjs/forthic/interpreter.js +50 -14
  13. package/dist/cjs/forthic/interpreter.js.map +1 -1
  14. package/dist/cjs/forthic/literals.d.ts +6 -1
  15. package/dist/cjs/forthic/literals.js +13 -2
  16. package/dist/cjs/forthic/literals.js.map +1 -1
  17. package/dist/cjs/forthic/module.d.ts +23 -1
  18. package/dist/cjs/forthic/module.js +63 -3
  19. package/dist/cjs/forthic/module.js.map +1 -1
  20. package/dist/cjs/forthic/tokenizer.js +28 -3
  21. package/dist/cjs/forthic/tokenizer.js.map +1 -1
  22. package/dist/cjs/grpc/client.js +10 -10
  23. package/dist/cjs/grpc/client.js.map +1 -1
  24. package/dist/esm/forthic/decorators/schemaUtils.d.ts +70 -0
  25. package/dist/esm/forthic/decorators/schemaUtils.js +72 -0
  26. package/dist/esm/forthic/decorators/schemaUtils.js.map +1 -0
  27. package/dist/esm/forthic/decorators/stackEffect.d.ts +63 -0
  28. package/dist/esm/forthic/decorators/stackEffect.js +174 -0
  29. package/dist/esm/forthic/decorators/stackEffect.js.map +1 -0
  30. package/dist/esm/forthic/errors.d.ts +2 -0
  31. package/dist/esm/forthic/errors.js +13 -2
  32. package/dist/esm/forthic/errors.js.map +1 -1
  33. package/dist/esm/forthic/interpreter.d.ts +11 -1
  34. package/dist/esm/forthic/interpreter.js +51 -15
  35. package/dist/esm/forthic/interpreter.js.map +1 -1
  36. package/dist/esm/forthic/literals.d.ts +6 -1
  37. package/dist/esm/forthic/literals.js +13 -2
  38. package/dist/esm/forthic/literals.js.map +1 -1
  39. package/dist/esm/forthic/module.d.ts +23 -1
  40. package/dist/esm/forthic/module.js +62 -3
  41. package/dist/esm/forthic/module.js.map +1 -1
  42. package/dist/esm/forthic/tokenizer.js +28 -3
  43. package/dist/esm/forthic/tokenizer.js.map +1 -1
  44. package/dist/esm/grpc/client.js +2 -2
  45. package/dist/esm/grpc/client.js.map +1 -1
  46. package/package.json +1 -1
  47. package/dist/cjs/grpc/server.test.d.ts +0 -1
  48. package/dist/cjs/grpc/server.test.js +0 -156
  49. package/dist/cjs/grpc/server.test.js.map +0 -1
  50. package/dist/cjs/grpc/temporal_utils.d.ts +0 -36
  51. package/dist/cjs/grpc/temporal_utils.js +0 -80
  52. package/dist/cjs/grpc/temporal_utils.js.map +0 -1
  53. package/dist/cjs/websocket/action_cable_client.d.ts +0 -106
  54. package/dist/cjs/websocket/action_cable_client.js +0 -269
  55. package/dist/cjs/websocket/action_cable_client.js.map +0 -1
  56. package/dist/cjs/websocket/client.d.ts +0 -103
  57. package/dist/cjs/websocket/client.js +0 -266
  58. package/dist/cjs/websocket/client.js.map +0 -1
  59. package/dist/cjs/websocket/remote_module.d.ts +0 -68
  60. package/dist/cjs/websocket/remote_module.js +0 -107
  61. package/dist/cjs/websocket/remote_module.js.map +0 -1
  62. package/dist/cjs/websocket/remote_word.d.ts +0 -53
  63. package/dist/cjs/websocket/remote_word.js +0 -93
  64. package/dist/cjs/websocket/remote_word.js.map +0 -1
  65. package/dist/cjs/websocket/runtime_manager.d.ts +0 -69
  66. package/dist/cjs/websocket/runtime_manager.js +0 -112
  67. package/dist/cjs/websocket/runtime_manager.js.map +0 -1
  68. package/dist/esm/grpc/server.test.d.ts +0 -1
  69. package/dist/esm/grpc/server.test.js +0 -121
  70. package/dist/esm/grpc/server.test.js.map +0 -1
  71. package/dist/esm/grpc/temporal_utils.d.ts +0 -36
  72. package/dist/esm/grpc/temporal_utils.js +0 -72
  73. package/dist/esm/grpc/temporal_utils.js.map +0 -1
  74. package/dist/esm/websocket/action_cable_client.d.ts +0 -106
  75. package/dist/esm/websocket/action_cable_client.js +0 -265
  76. package/dist/esm/websocket/action_cable_client.js.map +0 -1
  77. package/dist/esm/websocket/client.d.ts +0 -103
  78. package/dist/esm/websocket/client.js +0 -262
  79. package/dist/esm/websocket/client.js.map +0 -1
  80. package/dist/esm/websocket/remote_module.d.ts +0 -68
  81. package/dist/esm/websocket/remote_module.js +0 -103
  82. package/dist/esm/websocket/remote_module.js.map +0 -1
  83. package/dist/esm/websocket/remote_word.d.ts +0 -53
  84. package/dist/esm/websocket/remote_word.js +0 -89
  85. package/dist/esm/websocket/remote_word.js.map +0 -1
  86. package/dist/esm/websocket/runtime_manager.d.ts +0 -69
  87. package/dist/esm/websocket/runtime_manager.js +0 -108
  88. package/dist/esm/websocket/runtime_manager.js.map +0 -1
@@ -0,0 +1,70 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Registry metadata types for stack objects and class instances.
4
+ */
5
+ type StackObjectMetadata = {
6
+ objectType: "stackObject";
7
+ stackObjectType: string;
8
+ className?: undefined;
9
+ OriginalClass?: undefined;
10
+ } | {
11
+ objectType: "class";
12
+ OriginalClass: new (...args: any[]) => any;
13
+ className: string;
14
+ stackObjectType?: undefined;
15
+ };
16
+ /**
17
+ * Track metadata for schema comparison in tests and documentation.
18
+ * Only required for schemas that can't be compared out of the box,
19
+ * like custom schemas or instanceof schemas.
20
+ */
21
+ export declare const stackObjectRegistry: z.core.$ZodRegistry<StackObjectMetadata, z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
22
+ /**
23
+ * Creates a Zod schema for stack objects that have a stackObjectType property.
24
+ * This is a helper to reduce boilerplate when creating custom stack object schemas.
25
+ * It also ensures the schema is registered in stackObjectRegistry, which enables
26
+ * proper type string generation in stack effects.
27
+ *
28
+ * Use this instead of z.custom() directly for stack objects.
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * interface StackEmail {
33
+ * stackObjectType: "email";
34
+ * to: string;
35
+ * subject: string;
36
+ * body: string;
37
+ * }
38
+ *
39
+ * const stackEmailSchema = createStackObjectSchema<StackEmail>("email");
40
+ *
41
+ * // Use in stack effect:
42
+ * @ForthicWord(se`(email:${stackEmailSchema} -- sent:${z.boolean()})`, "Send email")
43
+ * async SEND(email: StackEmail): Promise<boolean> { ... }
44
+ * ```
45
+ */
46
+ export declare function createStackObjectSchema<T extends {
47
+ stackObjectType: string;
48
+ }>(stackObjectType: string, errorMessage?: string): z.ZodCustom<T>;
49
+ /**
50
+ * Creates a Zod instanceof schema with automatic metadata registration.
51
+ * This ensures the schema is registered in stackObjectRegistry, which enables
52
+ * proper type string generation in stack effects.
53
+ *
54
+ * Use this instead of z.instanceof() directly.
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * import { Temporal } from "temporal-polyfill";
59
+ *
60
+ * const plainDateSchema = createInstanceOfSchema(Temporal.PlainDate);
61
+ *
62
+ * // Use in stack effect:
63
+ * @ForthicWord(se`(date:${plainDateSchema} -- formatted:${z.string()})`, "Format date")
64
+ * async FORMAT(date: Temporal.PlainDate): Promise<string> { ... }
65
+ * ```
66
+ */
67
+ export declare function createInstanceOfSchema<T extends abstract new (...args: any[]) => any>(ClassToSchematize: T,
68
+ /** If not passed, falls back to class.name */
69
+ className?: string): z.ZodType<InstanceType<T>>;
70
+ export {};
@@ -0,0 +1,72 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Track metadata for schema comparison in tests and documentation.
4
+ * Only required for schemas that can't be compared out of the box,
5
+ * like custom schemas or instanceof schemas.
6
+ */
7
+ export const stackObjectRegistry = z.registry();
8
+ /**
9
+ * Creates a Zod schema for stack objects that have a stackObjectType property.
10
+ * This is a helper to reduce boilerplate when creating custom stack object schemas.
11
+ * It also ensures the schema is registered in stackObjectRegistry, which enables
12
+ * proper type string generation in stack effects.
13
+ *
14
+ * Use this instead of z.custom() directly for stack objects.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * interface StackEmail {
19
+ * stackObjectType: "email";
20
+ * to: string;
21
+ * subject: string;
22
+ * body: string;
23
+ * }
24
+ *
25
+ * const stackEmailSchema = createStackObjectSchema<StackEmail>("email");
26
+ *
27
+ * // Use in stack effect:
28
+ * @ForthicWord(se`(email:${stackEmailSchema} -- sent:${z.boolean()})`, "Send email")
29
+ * async SEND(email: StackEmail): Promise<boolean> { ... }
30
+ * ```
31
+ */
32
+ export function createStackObjectSchema(stackObjectType, errorMessage) {
33
+ const schema = z.custom((maybeStackObject) => maybeStackObject?.stackObjectType === stackObjectType, errorMessage ?? `expected ${stackObjectType} stackObjectType`);
34
+ // Register schema with metadata
35
+ stackObjectRegistry.add(schema, {
36
+ objectType: "stackObject",
37
+ stackObjectType,
38
+ });
39
+ return schema;
40
+ }
41
+ /**
42
+ * Creates a Zod instanceof schema with automatic metadata registration.
43
+ * This ensures the schema is registered in stackObjectRegistry, which enables
44
+ * proper type string generation in stack effects.
45
+ *
46
+ * Use this instead of z.instanceof() directly.
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * import { Temporal } from "temporal-polyfill";
51
+ *
52
+ * const plainDateSchema = createInstanceOfSchema(Temporal.PlainDate);
53
+ *
54
+ * // Use in stack effect:
55
+ * @ForthicWord(se`(date:${plainDateSchema} -- formatted:${z.string()})`, "Format date")
56
+ * async FORMAT(date: Temporal.PlainDate): Promise<string> { ... }
57
+ * ```
58
+ */
59
+ export function createInstanceOfSchema(ClassToSchematize,
60
+ /** If not passed, falls back to class.name */
61
+ className) {
62
+ const schema = z.instanceof(ClassToSchematize);
63
+ // Register schema with metadata
64
+ const resolvedClassName = className ?? ClassToSchematize.name;
65
+ stackObjectRegistry.add(schema, {
66
+ objectType: "class",
67
+ OriginalClass: ClassToSchematize,
68
+ className: resolvedClassName,
69
+ });
70
+ return schema;
71
+ }
72
+ //# sourceMappingURL=schemaUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaUtils.js","sourceRoot":"","sources":["../../../../src/forthic/decorators/schemaUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmBxB;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,QAAQ,EAAuB,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,uBAAuB,CACrC,eAAuB,EACvB,YAAqB;IAErB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CACrB,CAAC,gBAAgB,EAAE,EAAE,CAAE,gBAAkC,EAAE,eAAe,KAAK,eAAe,EAC9F,YAAY,IAAI,YAAY,eAAe,kBAAkB,CAC9D,CAAC;IAEF,gCAAgC;IAChC,mBAAmB,CAAC,GAAG,CAAC,MAAM,EAAE;QAC9B,UAAU,EAAE,aAAa;QACzB,eAAe;KAChB,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,sBAAsB,CACpC,iBAAoB;AACpB,8CAA8C;AAC9C,SAAkB;IAElB,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAE/C,gCAAgC;IAChC,MAAM,iBAAiB,GAAG,SAAS,IAAI,iBAAiB,CAAC,IAAI,CAAC;IAC9D,mBAAmB,CAAC,GAAG,CAAC,MAAM,EAAE;QAC9B,UAAU,EAAE,OAAO;QACnB,aAAa,EAAE,iBAAiB;QAChC,SAAS,EAAE,iBAAiB;KAC7B,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { z } from "zod";
2
+ import type { util as zodUtil } from "zod/v4/core";
3
+ /**
4
+ * Map the set of Zod types to the strings we use in Forthic stack effects.
5
+ * Uses Zod's internal def.type for comprehensive type detection.
6
+ */
7
+ export declare const mapZodToStackEffectType: (zodType: z.ZodTypeAny) => string;
8
+ type InferTupleTypes<T extends zodUtil.TupleItems> = {
9
+ [K in keyof T]: T[K] extends z.ZodTypeAny ? z.infer<T[K]> : never;
10
+ };
11
+ /**
12
+ * Represents a type-safe stack effect with Zod schemas for validation.
13
+ *
14
+ * @template Args - Tuple of Zod schemas for input parameters
15
+ * @template Return - Zod schema for the return type
16
+ */
17
+ export type TaggedStackEffect<Args extends zodUtil.TupleItems, Return extends z.core.$ZodFunctionOut = z.core.$ZodFunctionOut> = {
18
+ /** The human-readable stack effect string (e.g., "( a:number b:string -- result:string )") */
19
+ stackEffect: string;
20
+ /** Zod schemas for runtime validation */
21
+ schema: {
22
+ inputSchemas: z.ZodTypeAny[];
23
+ outputSchema: z.ZodTypeAny;
24
+ };
25
+ /**
26
+ * Phantom property to convey the expected function signature, constructed from the input + output types.
27
+ * DO NOT USE AT RUNTIME - it's only used for type inference.
28
+ */
29
+ _implType: (...args: InferTupleTypes<Args>) => Promise<z.infer<Return>>;
30
+ };
31
+ /**
32
+ * Tagged template literal for stack effects. Use with the @ForthicWord decorator to
33
+ * create a type-safe stack effect.
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * // Type-safe stack effect with Zod validation
38
+ * @ForthicWord(se`(a:${z.number()} b:${z.string()} -- result:${z.string()})`, "Concatenate number and string")
39
+ * async CONCAT(a: number, b: string): Promise<string> {
40
+ * return `${a}${b}`;
41
+ * }
42
+ * ```
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * // No parameters, returns string
47
+ * @ForthicWord(se`( -- message:${z.string()})`, "Get greeting")
48
+ * async GREET(): Promise<string> {
49
+ * return "Hello!";
50
+ * }
51
+ * ```
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * // Takes string, no return (void)
56
+ * @ForthicWord(se`(input:${z.string()} -- ${z.void()})`, "Log to console")
57
+ * async LOG(input: string): Promise<void> {
58
+ * console.log(input);
59
+ * }
60
+ * ```
61
+ */
62
+ export declare const se: <Args extends zodUtil.TupleItems, Return extends z.core.$ZodFunctionOut>(template: TemplateStringsArray, ...values: [...Args, Return]) => TaggedStackEffect<Args, Return>;
63
+ export {};
@@ -0,0 +1,174 @@
1
+ import { stackObjectRegistry } from "./schemaUtils.js";
2
+ /**
3
+ * Map the set of Zod types to the strings we use in Forthic stack effects.
4
+ * Uses Zod's internal def.type for comprehensive type detection.
5
+ */
6
+ export const mapZodToStackEffectType = (zodType) => {
7
+ const def = zodType.def;
8
+ switch (def.type) {
9
+ case "string":
10
+ return "string";
11
+ case "int":
12
+ case "bigint":
13
+ return "number";
14
+ case "number":
15
+ return "number";
16
+ case "boolean":
17
+ return "boolean";
18
+ case "null":
19
+ return "null";
20
+ case "undefined":
21
+ case "void":
22
+ return "";
23
+ case "date":
24
+ return "date";
25
+ case "symbol":
26
+ return "symbol";
27
+ case "object": {
28
+ const objectDef = def;
29
+ const objectShape = objectDef.shape;
30
+ // Get all property types
31
+ const properties = Object.entries(objectShape).map(([key, fieldSchema]) => {
32
+ const fieldType = mapZodToStackEffectType(fieldSchema);
33
+ return `${key}: ${fieldType}`;
34
+ });
35
+ // Return formatted object type
36
+ return properties.length > 0 ? `{ ${properties.join(", ")} }` : "{}";
37
+ }
38
+ case "literal": {
39
+ const literalDef = def;
40
+ const value = literalDef.values[0];
41
+ // Quote string literals
42
+ return typeof value === "string" ? `"${value}"` : String(value);
43
+ }
44
+ case "enum": {
45
+ const enumDef = def;
46
+ const enumEntries = Object.values(enumDef.entries);
47
+ // Return union of quoted values - zod enums are always strings
48
+ return enumEntries.map((entry) => `"${entry}"`).join("|");
49
+ }
50
+ case "optional": {
51
+ const optionalDef = def;
52
+ const innerType = mapZodToStackEffectType(optionalDef.innerType);
53
+ // Optional is a union with undefined
54
+ return innerType ? `${innerType}|undefined` : "undefined";
55
+ }
56
+ case "nullable": {
57
+ const nullableDef = def;
58
+ const innerType = mapZodToStackEffectType(nullableDef.innerType);
59
+ // Nullable is a union with null
60
+ return innerType ? `${innerType}|null` : "null";
61
+ }
62
+ case "union": {
63
+ const unionDef = def;
64
+ const unionOptions = unionDef.options;
65
+ // Recursively get types for all union options
66
+ const optionTypes = unionOptions.map((option) => mapZodToStackEffectType(option));
67
+ // Dedupe
68
+ return [...new Set(optionTypes)].join("|");
69
+ }
70
+ case "tuple": {
71
+ const tupleDef = def;
72
+ const tupleItems = tupleDef.items;
73
+ const elementTypes = tupleItems.map((item) => mapZodToStackEffectType(item));
74
+ return `[${elementTypes.join(", ")}]`;
75
+ }
76
+ case "array": {
77
+ const arrayDef = def;
78
+ const elementType = mapZodToStackEffectType(arrayDef.element);
79
+ // If the element is a union (contains "|") but not already an array type (doesn't end with "]"),
80
+ // wrap it in parentheses
81
+ const needsParens = elementType.includes("|") && !elementType.endsWith("]");
82
+ const wrappedType = needsParens ? `(${elementType})` : elementType;
83
+ return `${wrappedType}[]`;
84
+ }
85
+ case "custom": {
86
+ const metadata = stackObjectRegistry.get(zodType);
87
+ if (!metadata) {
88
+ throw new Error(`Custom schema found without stack object registry entry. Consider using createStackObjectSchema or createInstanceOfSchema or manually registering the schema.`);
89
+ }
90
+ return metadata.stackObjectType ?? metadata.className ?? "object";
91
+ }
92
+ case "any":
93
+ return "any";
94
+ case "record":
95
+ case "function":
96
+ case "promise":
97
+ case "map":
98
+ case "set":
99
+ case "lazy":
100
+ case "never":
101
+ case "unknown":
102
+ case "file":
103
+ case "nonoptional":
104
+ case "success":
105
+ case "transform":
106
+ case "prefault":
107
+ case "nan":
108
+ case "pipe":
109
+ case "template_literal":
110
+ case "intersection":
111
+ case "catch":
112
+ case "default":
113
+ case "readonly":
114
+ // Unsupported types - throw error to ensure we handle everything
115
+ throw new Error(`Stack effect string generation not supported for type: "${def.type}" - you may either update mapZodToStackEffectType or use a simpler type (e.g. use createStackObjectSchema)`);
116
+ default:
117
+ throw new Error(`Unknown type: "${def.type}". You either need to update mapZodToStackEffectType, or zod is doing something unexpected.`);
118
+ }
119
+ };
120
+ /**
121
+ * Tagged template literal for stack effects. Use with the @ForthicWord decorator to
122
+ * create a type-safe stack effect.
123
+ *
124
+ * @example
125
+ * ```ts
126
+ * // Type-safe stack effect with Zod validation
127
+ * @ForthicWord(se`(a:${z.number()} b:${z.string()} -- result:${z.string()})`, "Concatenate number and string")
128
+ * async CONCAT(a: number, b: string): Promise<string> {
129
+ * return `${a}${b}`;
130
+ * }
131
+ * ```
132
+ *
133
+ * @example
134
+ * ```ts
135
+ * // No parameters, returns string
136
+ * @ForthicWord(se`( -- message:${z.string()})`, "Get greeting")
137
+ * async GREET(): Promise<string> {
138
+ * return "Hello!";
139
+ * }
140
+ * ```
141
+ *
142
+ * @example
143
+ * ```ts
144
+ * // Takes string, no return (void)
145
+ * @ForthicWord(se`(input:${z.string()} -- ${z.void()})`, "Log to console")
146
+ * async LOG(input: string): Promise<void> {
147
+ * console.log(input);
148
+ * }
149
+ * ```
150
+ */
151
+ export const se = (template, ...values) => {
152
+ const stackEffectTypes = values.map((value) => mapZodToStackEffectType(value));
153
+ // Outputs the template string as if it weren't tagged, e.g. "( a:string b:number -- c:number )"
154
+ const parts = [];
155
+ for (let i = 0; i < template.length; i++) {
156
+ parts.push(template[i]);
157
+ if (i < stackEffectTypes.length) {
158
+ parts.push(stackEffectTypes[i]);
159
+ }
160
+ }
161
+ const outStr = parts.join("");
162
+ const taggedStackEffect = {
163
+ stackEffect: outStr,
164
+ schema: {
165
+ inputSchemas: values.slice(0, -1),
166
+ outputSchema: values[values.length - 1],
167
+ },
168
+ _implType: async () => {
169
+ throw new Error("This function should not be called at runtime, it's only used for type inference");
170
+ },
171
+ };
172
+ return taggedStackEffect;
173
+ };
174
+ //# sourceMappingURL=stackEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stackEffect.js","sourceRoot":"","sources":["../../../../src/forthic/decorators/stackEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,OAAqB,EAAU,EAAE;IACvE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAExB,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAElB,KAAK,KAAK,CAAC;QACX,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAElB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAElB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QAEnB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAEhB,KAAK,WAAW,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,EAAE,CAAC;QAEZ,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAEhB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAElB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,SAAS,GAAG,GAAyB,CAAC;YAC5C,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC;YAEpC,yBAAyB;YACzB,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE;gBACxE,MAAM,SAAS,GAAG,uBAAuB,CAAC,WAA2B,CAAC,CAAC;gBACvE,OAAO,GAAG,GAAG,KAAK,SAAS,EAAE,CAAC;YAChC,CAAC,CAAC,CAAC;YAEH,+BAA+B;YAC/B,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACvE,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,UAAU,GAAG,GAA0B,CAAC;YAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnC,wBAAwB;YACxB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClE,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,OAAO,GAAG,GAAuB,CAAC;YACxC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,+DAA+D;YAC/D,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5D,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,WAAW,GAAG,GAA2B,CAAC;YAChD,MAAM,SAAS,GAAG,uBAAuB,CAAC,WAAW,CAAC,SAAyB,CAAC,CAAC;YAEjF,qCAAqC;YACrC,OAAO,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;QAC5D,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,WAAW,GAAG,GAA2B,CAAC;YAChD,MAAM,SAAS,GAAG,uBAAuB,CAAC,WAAW,CAAC,SAAyB,CAAC,CAAC;YAEjF,gCAAgC;YAChC,OAAO,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAClD,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,QAAQ,GAAG,GAAwB,CAAC;YAC1C,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC;YAEtC,8CAA8C;YAC9C,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,uBAAuB,CAAC,MAAsB,CAAC,CAAC,CAAC;YAElG,SAAS;YACT,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,QAAQ,GAAG,GAAwB,CAAC;YAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC;YAClC,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAoB,CAAC,CAAC,CAAC;YAC7F,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACxC,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,QAAQ,GAAG,GAAwB,CAAC;YAC1C,MAAM,WAAW,GAAG,uBAAuB,CAAC,QAAQ,CAAC,OAAuB,CAAC,CAAC;YAE9E,iGAAiG;YACjG,yBAAyB;YACzB,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC5E,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;YAEnE,OAAO,GAAG,WAAW,IAAI,CAAC;QAC5B,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAEnC,CAAC;YACd,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CACb,+JAA+J,CAChK,CAAC;YACJ,CAAC;YAED,OAAO,QAAQ,CAAC,eAAe,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC;QACpE,CAAC;QAED,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QAEf,KAAK,QAAQ,CAAC;QACd,KAAK,UAAU,CAAC;QAChB,KAAK,SAAS,CAAC;QACf,KAAK,KAAK,CAAC;QACX,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,aAAa,CAAC;QACnB,KAAK,SAAS,CAAC;QACf,KAAK,WAAW,CAAC;QACjB,KAAK,UAAU,CAAC;QAChB,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC;QACZ,KAAK,kBAAkB,CAAC;QACxB,KAAK,cAAc,CAAC;QACpB,KAAK,OAAO,CAAC;QACb,KAAK,SAAS,CAAC;QACf,KAAK,UAAU;YACb,iEAAiE;YACjE,MAAM,IAAI,KAAK,CACb,2DAA2D,GAAG,CAAC,IAAI,4GAA4G,CAChL,CAAC;QAEJ;YACE,MAAM,IAAI,KAAK,CACb,kBAAmB,GAAW,CAAC,IAAI,6FAA6F,CACjI,CAAC;IACN,CAAC;AACH,CAAC,CAAC;AA+BF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,MAAM,EAAE,GAAG,CAChB,QAA8B,EAC9B,GAAG,MAAyB,EACK,EAAE;IACnC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAqB,CAAC,CAAC,CAAC;IAE/F,gGAAgG;IAChG,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE9B,MAAM,iBAAiB,GAAoC;QACzD,WAAW,EAAE,MAAM;QACnB,MAAM,EAAE;YACN,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAmB;YACnD,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAiB;SACxD;QACD,SAAS,EAAE,KAAK,IAAI,EAAE;YACpB,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;QACtG,CAAC;KACF,CAAC;IAEF,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC"}
@@ -15,6 +15,7 @@ export declare class ForthicError extends Error {
15
15
  getError(): Error;
16
16
  getForthic(): string;
17
17
  getNote(): string;
18
+ getMessage(): string;
18
19
  }
19
20
  export declare class UnknownWordError extends ForthicError {
20
21
  private word;
@@ -26,6 +27,7 @@ export declare class WordExecutionError extends ForthicError {
26
27
  private definition_location?;
27
28
  constructor(message: string, error: Error, call_location?: CodeLocationData, definition_location?: CodeLocationData);
28
29
  getError(): Error;
30
+ getRootError(): Error;
29
31
  getDefinitionLocation(): CodeLocationData | undefined;
30
32
  }
31
33
  export declare class MissingSemicolonError extends ForthicError {
@@ -15,7 +15,7 @@ export class ForthicError extends Error {
15
15
  }
16
16
  }
17
17
  getDescription() {
18
- throw new Error("Not implemented");
18
+ return this.note;
19
19
  }
20
20
  getError() {
21
21
  return this;
@@ -26,6 +26,9 @@ export class ForthicError extends Error {
26
26
  getNote() {
27
27
  return this.note;
28
28
  }
29
+ getMessage() {
30
+ return this.note;
31
+ }
29
32
  }
30
33
  export class UnknownWordError extends ForthicError {
31
34
  word;
@@ -43,13 +46,21 @@ export class WordExecutionError extends ForthicError {
43
46
  innerError;
44
47
  definition_location;
45
48
  constructor(message, error, call_location, definition_location) {
46
- super("", message, call_location);
49
+ // Pass the error as cause to maintain compatibility with code that checks .cause
50
+ super("", message, call_location, error);
47
51
  this.innerError = error;
48
52
  this.definition_location = definition_location;
49
53
  }
50
54
  getError() {
51
55
  return this.innerError;
52
56
  }
57
+ getRootError() {
58
+ let current = this.innerError;
59
+ while (current.cause instanceof Error) {
60
+ current = current.cause;
61
+ }
62
+ return current;
63
+ }
53
64
  getDefinitionLocation() {
54
65
  return this.definition_location;
55
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/forthic/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/forthic/errors.ts"],"names":[],"mappings":"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"}
@@ -81,6 +81,16 @@ export declare class Interpreter {
81
81
  execute_with_recovery(numAttempts?: number): Promise<number>;
82
82
  continue(): Promise<void>;
83
83
  run_with_tokenizer(tokenizer: Tokenizer): Promise<boolean>;
84
+ /**
85
+ * Execute a sequence of word tokens with deferred word lookup.
86
+ * This resolves words at execution time (not parse time) to support
87
+ * dynamically defined words (e.g., words defined by LOAD).
88
+ *
89
+ * Words are looked up and executed ONE AT A TIME to ensure that
90
+ * words defined during execution (e.g., by LOAD) are available
91
+ * for subsequent words in the same batch.
92
+ */
93
+ private executeBatchedWordTokens;
84
94
  /**
85
95
  * Execute a sequence of words with batching optimization
86
96
  */
@@ -107,7 +117,7 @@ export declare class Interpreter {
107
117
  private register_standard_literals;
108
118
  /**
109
119
  * Register a custom literal handler
110
- * Handlers are checked in registration order
120
+ * New handlers are added first so they can override existing ones
111
121
  */
112
122
  register_literal_handler(handler: LiteralHandler): void;
113
123
  /**
@@ -1,7 +1,7 @@
1
1
  import { TokenType, Token, Tokenizer, CodeLocation } from "./tokenizer.js";
2
2
  import { Module, Word, PushValueWord, DefinitionWord } from "./module.js";
3
3
  import { PositionedString } from "./tokenizer.js";
4
- import { UnknownWordError, UnknownModuleError, StackUnderflowError, UnknownTokenError, MissingSemicolonError, ExtraSemicolonError, ModuleError, TooManyAttemptsError, } from "./errors.js";
4
+ import { UnknownWordError, UnknownModuleError, StackUnderflowError, UnknownTokenError, MissingSemicolonError, ExtraSemicolonError, ModuleError, TooManyAttemptsError, WordExecutionError, ForthicError, IntentionalStopError, } from "./errors.js";
5
5
  import { to_bool, to_float, to_int, to_time, to_literal_date, to_zoned_datetime } from "./literals.js";
6
6
  import { CoreModule } from "./modules/standard/core_module.js";
7
7
  import { ArrayModule } from "./modules/standard/array_module.js";
@@ -288,30 +288,30 @@ export class Interpreter {
288
288
  return;
289
289
  }
290
290
  async run_with_tokenizer(tokenizer) {
291
- // Collect all words first for batching optimization
292
- const words = [];
291
+ // Collect word tokens first for batching optimization
292
+ // We store tokens (not resolved Words) to defer word lookup until execution time.
293
+ // This allows dynamically defined words (e.g., from LOAD) to be found.
294
+ const wordTokens = [];
293
295
  let token;
294
296
  do {
295
297
  this.previous_token = token;
296
298
  token = tokenizer.next_token();
297
- // For word tokens, collect them instead of executing immediately
299
+ // For word tokens, collect the token (defer word lookup until execution)
298
300
  if (token.type === TokenType.WORD && !this.is_compiling) {
299
- const word = this.find_word(token.string);
300
- word.set_location(token.location);
301
- words.push(word);
301
+ wordTokens.push(token);
302
302
  }
303
303
  else {
304
304
  // For non-word tokens, execute any collected words first, then handle the token
305
- if (words.length > 0) {
306
- await this.executeBatchedWords(words);
307
- words.length = 0; // Clear the array
305
+ if (wordTokens.length > 0) {
306
+ await this.executeBatchedWordTokens(wordTokens);
307
+ wordTokens.length = 0; // Clear the array
308
308
  }
309
309
  await this.handle_token(token);
310
310
  }
311
311
  if (token.type === TokenType.EOS) {
312
312
  // Execute any remaining words
313
- if (words.length > 0) {
314
- await this.executeBatchedWords(words);
313
+ if (wordTokens.length > 0) {
314
+ await this.executeBatchedWordTokens(wordTokens);
315
315
  }
316
316
  break;
317
317
  }
@@ -319,6 +319,25 @@ export class Interpreter {
319
319
  } while (true);
320
320
  return true; // Done executing
321
321
  }
322
+ /**
323
+ * Execute a sequence of word tokens with deferred word lookup.
324
+ * This resolves words at execution time (not parse time) to support
325
+ * dynamically defined words (e.g., words defined by LOAD).
326
+ *
327
+ * Words are looked up and executed ONE AT A TIME to ensure that
328
+ * words defined during execution (e.g., by LOAD) are available
329
+ * for subsequent words in the same batch.
330
+ */
331
+ async executeBatchedWordTokens(tokens) {
332
+ // Look up and execute each word one at a time
333
+ // This ensures words defined during execution are available for later words
334
+ for (const token of tokens) {
335
+ const word = this.find_word(token.string);
336
+ word.set_location(token.location);
337
+ this.count_word(word);
338
+ await word.execute(this);
339
+ }
340
+ }
322
341
  /**
323
342
  * Execute a sequence of words with batching optimization
324
343
  */
@@ -341,7 +360,24 @@ export class Interpreter {
341
360
  // Execute local words one by one
342
361
  for (const word of batch.words) {
343
362
  this.count_word(word);
344
- await word.execute(this);
363
+ try {
364
+ await word.execute(this);
365
+ }
366
+ catch (e) {
367
+ // Don't wrap IntentionalStopError - it's a control-flow mechanism for debugging
368
+ if (e instanceof IntentionalStopError) {
369
+ throw e;
370
+ }
371
+ // Don't wrap ForthicError subclasses - they already have location context
372
+ if (e instanceof ForthicError) {
373
+ throw e;
374
+ }
375
+ // Wrap generic errors in WordExecutionError to add location context
376
+ if (e instanceof Error) {
377
+ throw new WordExecutionError(e.message, e, this.get_tokenizer()?.get_token_location(), word.get_location() || undefined);
378
+ }
379
+ throw e;
380
+ }
345
381
  }
346
382
  }
347
383
  else {
@@ -489,10 +525,10 @@ export class Interpreter {
489
525
  }
490
526
  /**
491
527
  * Register a custom literal handler
492
- * Handlers are checked in registration order
528
+ * New handlers are added first so they can override existing ones
493
529
  */
494
530
  register_literal_handler(handler) {
495
- this.literal_handlers.push(handler);
531
+ this.literal_handlers.unshift(handler);
496
532
  }
497
533
  /**
498
534
  * Unregister a literal handler