@kalada/core 0.2.0 → 0.4.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.
Files changed (140) hide show
  1. package/README.md +62 -3
  2. package/dist/kalada-v1/canonical-input.cjs +133 -0
  3. package/dist/kalada-v1/canonical-input.cjs.map +1 -0
  4. package/dist/kalada-v1/canonical-input.d.cts +26 -0
  5. package/dist/kalada-v1/canonical-input.d.ts +26 -0
  6. package/dist/kalada-v1/canonical-input.js +122 -0
  7. package/dist/kalada-v1/canonical-input.js.map +1 -0
  8. package/dist/kalada-v1/canonicalize.cjs +93 -130
  9. package/dist/kalada-v1/canonicalize.cjs.map +1 -1
  10. package/dist/kalada-v1/canonicalize.d.cts +1 -0
  11. package/dist/kalada-v1/canonicalize.d.ts +1 -0
  12. package/dist/kalada-v1/canonicalize.js +71 -108
  13. package/dist/kalada-v1/canonicalize.js.map +1 -1
  14. package/dist/kalada-v1/codec.cjs +24 -0
  15. package/dist/kalada-v1/codec.cjs.map +1 -1
  16. package/dist/kalada-v1/codec.d.cts +5 -0
  17. package/dist/kalada-v1/codec.d.ts +5 -0
  18. package/dist/kalada-v1/codec.js +24 -0
  19. package/dist/kalada-v1/codec.js.map +1 -1
  20. package/dist/kalada-v1/compile.cjs +24 -1
  21. package/dist/kalada-v1/compile.cjs.map +1 -1
  22. package/dist/kalada-v1/compile.d.cts +1 -0
  23. package/dist/kalada-v1/compile.d.ts +1 -0
  24. package/dist/kalada-v1/compile.js +25 -2
  25. package/dist/kalada-v1/compile.js.map +1 -1
  26. package/dist/kalada-v1/dependencies.cjs +55 -2
  27. package/dist/kalada-v1/dependencies.cjs.map +1 -1
  28. package/dist/kalada-v1/dependencies.d.cts +1 -0
  29. package/dist/kalada-v1/dependencies.d.ts +1 -0
  30. package/dist/kalada-v1/dependencies.js +55 -2
  31. package/dist/kalada-v1/dependencies.js.map +1 -1
  32. package/dist/kalada-v1/diagnostics.cjs +29 -4
  33. package/dist/kalada-v1/diagnostics.cjs.map +1 -1
  34. package/dist/kalada-v1/diagnostics.d.cts +5 -3
  35. package/dist/kalada-v1/diagnostics.d.ts +5 -3
  36. package/dist/kalada-v1/diagnostics.js +29 -4
  37. package/dist/kalada-v1/diagnostics.js.map +1 -1
  38. package/dist/kalada-v1/evaluate.cjs +23 -117
  39. package/dist/kalada-v1/evaluate.cjs.map +1 -1
  40. package/dist/kalada-v1/evaluate.d.cts +4 -2
  41. package/dist/kalada-v1/evaluate.d.ts +4 -2
  42. package/dist/kalada-v1/evaluate.js +24 -118
  43. package/dist/kalada-v1/evaluate.js.map +1 -1
  44. package/dist/kalada-v1/evaluation-delivery.cjs +286 -0
  45. package/dist/kalada-v1/evaluation-delivery.cjs.map +1 -0
  46. package/dist/kalada-v1/evaluation-delivery.d.cts +13 -0
  47. package/dist/kalada-v1/evaluation-delivery.d.ts +13 -0
  48. package/dist/kalada-v1/evaluation-delivery.js +284 -0
  49. package/dist/kalada-v1/evaluation-delivery.js.map +1 -0
  50. package/dist/kalada-v1/evaluation-frames.cjs +16 -0
  51. package/dist/kalada-v1/evaluation-frames.cjs.map +1 -0
  52. package/dist/kalada-v1/evaluation-frames.d.cts +83 -0
  53. package/dist/kalada-v1/evaluation-frames.d.ts +83 -0
  54. package/dist/kalada-v1/evaluation-frames.js +14 -0
  55. package/dist/kalada-v1/evaluation-frames.js.map +1 -0
  56. package/dist/kalada-v1/evaluation-machine.cjs +226 -0
  57. package/dist/kalada-v1/evaluation-machine.cjs.map +1 -0
  58. package/dist/kalada-v1/evaluation-machine.d.cts +9 -0
  59. package/dist/kalada-v1/evaluation-machine.d.ts +9 -0
  60. package/dist/kalada-v1/evaluation-machine.js +224 -0
  61. package/dist/kalada-v1/evaluation-machine.js.map +1 -0
  62. package/dist/kalada-v1/evaluation-resolution.cjs +80 -0
  63. package/dist/kalada-v1/evaluation-resolution.cjs.map +1 -0
  64. package/dist/kalada-v1/evaluation-resolution.d.cts +11 -0
  65. package/dist/kalada-v1/evaluation-resolution.d.ts +11 -0
  66. package/dist/kalada-v1/evaluation-resolution.js +78 -0
  67. package/dist/kalada-v1/evaluation-resolution.js.map +1 -0
  68. package/dist/kalada-v1/evaluation-state.cjs +94 -0
  69. package/dist/kalada-v1/evaluation-state.cjs.map +1 -0
  70. package/dist/kalada-v1/evaluation-state.d.cts +38 -0
  71. package/dist/kalada-v1/evaluation-state.d.ts +38 -0
  72. package/dist/kalada-v1/evaluation-state.js +81 -0
  73. package/dist/kalada-v1/evaluation-state.js.map +1 -0
  74. package/dist/kalada-v1/factories.cjs +46 -0
  75. package/dist/kalada-v1/factories.cjs.map +1 -1
  76. package/dist/kalada-v1/factories.d.cts +24 -1
  77. package/dist/kalada-v1/factories.d.ts +24 -1
  78. package/dist/kalada-v1/factories.js +46 -0
  79. package/dist/kalada-v1/factories.js.map +1 -1
  80. package/dist/kalada-v1/function-contracts.cjs +150 -0
  81. package/dist/kalada-v1/function-contracts.cjs.map +1 -0
  82. package/dist/kalada-v1/function-contracts.d.cts +15 -0
  83. package/dist/kalada-v1/function-contracts.d.ts +15 -0
  84. package/dist/kalada-v1/function-contracts.js +144 -0
  85. package/dist/kalada-v1/function-contracts.js.map +1 -0
  86. package/dist/kalada-v1/index.cjs +30 -0
  87. package/dist/kalada-v1/index.d.cts +5 -3
  88. package/dist/kalada-v1/index.d.ts +5 -3
  89. package/dist/kalada-v1/index.js +4 -2
  90. package/dist/kalada-v1/limits.cjs +23 -2
  91. package/dist/kalada-v1/limits.cjs.map +1 -1
  92. package/dist/kalada-v1/limits.d.cts +6 -3
  93. package/dist/kalada-v1/limits.d.ts +6 -3
  94. package/dist/kalada-v1/limits.js +23 -3
  95. package/dist/kalada-v1/limits.js.map +1 -1
  96. package/dist/kalada-v1/runtime-values.cjs +112 -0
  97. package/dist/kalada-v1/runtime-values.cjs.map +1 -0
  98. package/dist/kalada-v1/runtime-values.d.cts +35 -0
  99. package/dist/kalada-v1/runtime-values.d.ts +35 -0
  100. package/dist/kalada-v1/runtime-values.js +105 -0
  101. package/dist/kalada-v1/runtime-values.js.map +1 -0
  102. package/dist/kalada-v1/schemas.cjs +136 -3
  103. package/dist/kalada-v1/schemas.cjs.map +1 -1
  104. package/dist/kalada-v1/schemas.d.cts +2 -1
  105. package/dist/kalada-v1/schemas.d.ts +2 -1
  106. package/dist/kalada-v1/schemas.js +137 -5
  107. package/dist/kalada-v1/schemas.js.map +1 -1
  108. package/dist/kalada-v1/static-analysis.cjs +177 -0
  109. package/dist/kalada-v1/static-analysis.cjs.map +1 -0
  110. package/dist/kalada-v1/static-analysis.d.cts +9 -0
  111. package/dist/kalada-v1/static-analysis.d.ts +9 -0
  112. package/dist/kalada-v1/static-analysis.js +175 -0
  113. package/dist/kalada-v1/static-analysis.js.map +1 -0
  114. package/dist/kalada-v1/static-types.cjs +229 -0
  115. package/dist/kalada-v1/static-types.cjs.map +1 -0
  116. package/dist/kalada-v1/static-types.d.cts +8 -0
  117. package/dist/kalada-v1/static-types.d.ts +8 -0
  118. package/dist/kalada-v1/static-types.js +227 -0
  119. package/dist/kalada-v1/static-types.js.map +1 -0
  120. package/dist/kalada-v1/temporal-evaluation.cjs +95 -0
  121. package/dist/kalada-v1/temporal-evaluation.cjs.map +1 -0
  122. package/dist/kalada-v1/temporal-evaluation.d.cts +18 -0
  123. package/dist/kalada-v1/temporal-evaluation.d.ts +18 -0
  124. package/dist/kalada-v1/temporal-evaluation.js +90 -0
  125. package/dist/kalada-v1/temporal-evaluation.js.map +1 -0
  126. package/dist/kalada-v1/temporal.cjs +42 -0
  127. package/dist/kalada-v1/temporal.cjs.map +1 -0
  128. package/dist/kalada-v1/temporal.d.cts +22 -0
  129. package/dist/kalada-v1/temporal.d.ts +22 -0
  130. package/dist/kalada-v1/temporal.js +37 -0
  131. package/dist/kalada-v1/temporal.js.map +1 -0
  132. package/dist/kalada-v1/types.d.cts +108 -5
  133. package/dist/kalada-v1/types.d.ts +108 -5
  134. package/dist/kalada-v1/values.cjs +13 -1
  135. package/dist/kalada-v1/values.cjs.map +1 -1
  136. package/dist/kalada-v1/values.d.cts +2 -1
  137. package/dist/kalada-v1/values.d.ts +2 -1
  138. package/dist/kalada-v1/values.js +13 -1
  139. package/dist/kalada-v1/values.js.map +1 -1
  140. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/schemas.ts"],"names":[],"mappings":"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","file":"schemas.js","sourcesContent":["import { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\n\nexport type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;\n\nconst jsonValue = jsonValueSchema(\"#/$defs/jsonValue\", DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 1);\nconst encodedJsonValue = jsonValueSchema(\n \"#/$defs/encodedJsonValue\",\n DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 2,\n);\n\nfunction jsonValueSchema(reference: string, maxContainerSize: number): Record<string, unknown> {\n return {\n anyOf: [\n { type: \"null\" },\n { type: \"boolean\" },\n { type: \"number\", minimum: -1.7976931348623157e308, maximum: 1.7976931348623157e308 },\n { type: \"string\", maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n {\n type: \"array\",\n maxItems: maxContainerSize,\n items: { $ref: reference },\n },\n {\n type: \"object\",\n maxProperties: maxContainerSize,\n propertyNames: {\n allOf: [\n { maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n { not: { enum: [\"__proto__\", \"constructor\", \"prototype\"] } },\n ],\n },\n additionalProperties: { $ref: reference },\n },\n ],\n };\n}\n\nconst expression = {\n oneOf: [\n node(\"literal\", { value: { $ref: \"#/$defs/jsonValue\" } }, [\"value\"]),\n node(\n \"ref\",\n {\n ref: {\n type: \"string\",\n minLength: 1,\n maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength,\n },\n },\n [\"ref\"],\n ),\n node(\"binding\", { name: bindingName(), value: expressionRef(), body: expressionRef() }, [\n \"name\",\n \"value\",\n \"body\",\n ]),\n node(\"option\", { variant: { const: \"none\" } }, [\"variant\"]),\n node(\"option\", { variant: { const: \"some\" }, value: expressionRef() }, [\"variant\", \"value\"]),\n node(\"result\", { variant: { enum: [\"ok\", \"err\"] }, value: expressionRef() }, [\n \"variant\",\n \"value\",\n ]),\n matchNode(\"Option\", [arm(\"some\", true), arm(\"none\", false)]),\n matchNode(\"Result\", [arm(\"ok\", true), arm(\"err\", true)]),\n ],\n};\n\nexport const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/program/kalada-v1\",\n $comment:\n \"The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.\",\n type: \"object\",\n properties: {\n format: { const: \"kalada-program\" },\n version: { const: 1 },\n profile: { const: \"kalada-v1\" },\n expression: expressionRef(),\n },\n required: [\"format\", \"version\", \"profile\", \"expression\"],\n additionalProperties: false,\n $defs: { jsonValue, expression },\n});\n\nexport const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/value/kalada-value-v1\",\n $ref: \"#/$defs/encodedValue\",\n $defs: {\n encodedJsonValue,\n encodedValue: {\n oneOf: [\n valueEnvelope(\"Json\", \"value\", { $ref: \"#/$defs/encodedJsonValue\" }),\n valueEnvelope(\"Option\", \"none\"),\n valueEnvelope(\"Option\", \"some\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"ok\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"err\", { $ref: \"#/$defs/encodedValue\" }),\n ],\n },\n },\n});\n\nfunction node(\n kind: string,\n properties: Record<string, unknown>,\n required: string[],\n): Record<string, unknown> {\n return {\n type: \"object\",\n properties: { kind: { const: kind }, ...properties },\n required: [\"kind\", ...required],\n additionalProperties: false,\n };\n}\n\nfunction matchNode(\n type: \"Option\" | \"Result\",\n arms: readonly Record<string, unknown>[],\n): Record<string, unknown> {\n return node(\n \"match\",\n {\n type: { const: type },\n value: expressionRef(),\n arms: { type: \"array\", prefixItems: arms, minItems: 2, maxItems: 2 },\n },\n [\"type\", \"value\", \"arms\"],\n );\n}\n\nfunction arm(variant: string, payload: boolean): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n variant: { const: variant },\n body: expressionRef(),\n };\n if (payload) properties.binding = bindingName();\n return { type: \"object\", properties, required: [\"variant\", \"body\"], additionalProperties: false };\n}\n\nfunction valueEnvelope(\n type: string,\n variant: string,\n value?: Record<string, unknown>,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n format: { const: \"kalada-value\" },\n version: { const: 1 },\n type: { const: type },\n variant: { const: variant },\n };\n if (value) properties.value = value;\n return {\n type: \"object\",\n properties,\n required: Object.keys(properties),\n additionalProperties: false,\n };\n}\n\nfunction expressionRef(): Record<string, string> {\n return { $ref: \"#/$defs/expression\" };\n}\n\nfunction bindingName(): Record<string, unknown> {\n return { type: \"string\", minLength: 1, maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n for (const child of Object.values(value)) deepFreeze(child);\n return Object.freeze(value);\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/schemas.ts"],"names":[],"mappings":"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","file":"schemas.js","sourcesContent":["import { DEFAULT_KALADA_V1_FUNCTION_LIMITS, DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\n\nexport type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;\n\nconst jsonValue = jsonValueSchema(\"#/$defs/jsonValue\", DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 1);\nconst encodedJsonValue = jsonValueSchema(\n \"#/$defs/encodedJsonValue\",\n DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 2,\n);\n\nfunction jsonValueSchema(reference: string, maxContainerSize: number): Record<string, unknown> {\n return {\n anyOf: [\n { type: \"null\" },\n { type: \"boolean\" },\n { type: \"number\", minimum: -1.7976931348623157e308, maximum: 1.7976931348623157e308 },\n { type: \"string\", maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n {\n type: \"array\",\n maxItems: maxContainerSize,\n items: { $ref: reference },\n },\n {\n type: \"object\",\n maxProperties: maxContainerSize,\n propertyNames: {\n allOf: [\n { maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n { not: { enum: [\"__proto__\", \"constructor\", \"prototype\"] } },\n ],\n },\n additionalProperties: { $ref: reference },\n },\n ],\n };\n}\n\nconst expression = {\n oneOf: [\n node(\"literal\", { value: { $ref: \"#/$defs/jsonValue\" } }, [\"value\"]),\n node(\n \"ref\",\n {\n ref: {\n type: \"string\",\n minLength: 1,\n maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength,\n },\n },\n [\"ref\"],\n ),\n node(\"binding\", { name: bindingName(), value: expressionRef(), body: expressionRef() }, [\n \"name\",\n \"value\",\n \"body\",\n ]),\n node(\"option\", { variant: { const: \"none\" } }, [\"variant\"]),\n node(\"option\", { variant: { const: \"some\" }, value: expressionRef() }, [\"variant\", \"value\"]),\n node(\"result\", { variant: { enum: [\"ok\", \"err\"] }, value: expressionRef() }, [\n \"variant\",\n \"value\",\n ]),\n node(\"instant\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"duration\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"current-instant\", {}, []),\n temporalNode(\"temporal-arithmetic\", [\"add\", \"subtract\"]),\n temporalNode(\"temporal-comparison\", [\n \"equal\",\n \"not-equal\",\n \"less-than\",\n \"less-than-or-equal\",\n \"greater-than\",\n \"greater-than-or-equal\",\n ]),\n matchNode(\"Option\", [arm(\"some\", true), arm(\"none\", false)]),\n matchNode(\"Result\", [arm(\"ok\", true), arm(\"err\", true)]),\n node(\n \"function\",\n { parameters: parametersSchema(), returns: typeRef(), body: expressionRef() },\n [\"parameters\", \"returns\", \"body\"],\n ),\n node(\n \"call\",\n {\n callee: expressionRef(),\n arguments: {\n type: \"array\",\n maxItems: DEFAULT_KALADA_V1_LIMITS.maxAstNodes,\n items: expressionRef(),\n },\n },\n [\"callee\", \"arguments\"],\n ),\n node(\n \"function-group\",\n {\n functions: {\n type: \"array\",\n maxItems: DEFAULT_KALADA_V1_FUNCTION_LIMITS.maxFunctionGroupSize,\n items: { $ref: \"#/$defs/namedFunction\" },\n },\n body: expressionRef(),\n },\n [\"functions\", \"body\"],\n ),\n node(\"core-function\", { name: { enum: [\"map\", \"filter\", \"some\", \"every\"] } }, [\"name\"]),\n ],\n};\n\nexport const KALADA_V1_FUNCTION_PROGRAM_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/program/kalada-v1-functions\",\n $comment:\n \"The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.\",\n type: \"object\",\n properties: {\n format: { const: \"kalada-program\" },\n version: { const: 1 },\n profile: { const: \"kalada-v1\" },\n expression: expressionRef(),\n },\n required: [\"format\", \"version\", \"profile\", \"expression\"],\n additionalProperties: false,\n $defs: {\n jsonValue,\n expression,\n kaladaType: typeSchema(),\n parameter: {\n type: \"object\",\n properties: { name: bindingName(), type: typeRef() },\n required: [\"name\", \"type\"],\n additionalProperties: false,\n },\n namedFunction: {\n type: \"object\",\n properties: {\n name: bindingName(),\n parameters: parametersSchema(),\n returns: typeRef(),\n body: expressionRef(),\n },\n required: [\"name\", \"parameters\", \"returns\", \"body\"],\n additionalProperties: false,\n },\n },\n});\n\nconst legacyExpression = { oneOf: expression.oneOf.slice(0, 13) };\n\nexport const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/program/kalada-v1\",\n $comment:\n \"The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.\",\n type: \"object\",\n properties: {\n format: { const: \"kalada-program\" },\n version: { const: 1 },\n profile: { const: \"kalada-v1\" },\n expression: expressionRef(),\n },\n required: [\"format\", \"version\", \"profile\", \"expression\"],\n additionalProperties: false,\n $defs: { jsonValue, expression: legacyExpression },\n});\n\nexport const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/value/kalada-value-v1\",\n $ref: \"#/$defs/encodedValue\",\n $defs: {\n encodedJsonValue,\n encodedValue: {\n oneOf: [\n valueEnvelope(\"Json\", \"value\", { $ref: \"#/$defs/encodedJsonValue\" }),\n valueEnvelope(\"Option\", \"none\"),\n valueEnvelope(\"Option\", \"some\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"ok\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"err\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Instant\", \"milliseconds\", safeInteger()),\n valueEnvelope(\"Duration\", \"milliseconds\", safeInteger()),\n ],\n },\n },\n});\n\nfunction node(\n kind: string,\n properties: Record<string, unknown>,\n required: string[],\n): Record<string, unknown> {\n return {\n type: \"object\",\n properties: { kind: { const: kind }, ...properties },\n required: [\"kind\", ...required],\n additionalProperties: false,\n };\n}\n\nfunction temporalNode(kind: string, operators: readonly string[]): Record<string, unknown> {\n return node(\n kind,\n { operator: { enum: operators }, left: expressionRef(), right: expressionRef() },\n [\"operator\", \"left\", \"right\"],\n );\n}\n\nfunction safeInteger(): Record<string, unknown> {\n return {\n type: \"integer\",\n minimum: Number.MIN_SAFE_INTEGER,\n maximum: Number.MAX_SAFE_INTEGER,\n };\n}\n\nfunction matchNode(\n type: \"Option\" | \"Result\",\n arms: readonly Record<string, unknown>[],\n): Record<string, unknown> {\n return node(\n \"match\",\n {\n type: { const: type },\n value: expressionRef(),\n arms: { type: \"array\", prefixItems: arms, minItems: 2, maxItems: 2 },\n },\n [\"type\", \"value\", \"arms\"],\n );\n}\n\nfunction arm(variant: string, payload: boolean): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n variant: { const: variant },\n body: expressionRef(),\n };\n if (payload) properties.binding = bindingName();\n return { type: \"object\", properties, required: [\"variant\", \"body\"], additionalProperties: false };\n}\n\nfunction valueEnvelope(\n type: string,\n variant: string,\n value?: Record<string, unknown>,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n format: { const: \"kalada-value\" },\n version: { const: 1 },\n type: { const: type },\n variant: { const: variant },\n };\n if (value) properties.value = value;\n return {\n type: \"object\",\n properties,\n required: Object.keys(properties),\n additionalProperties: false,\n };\n}\n\nfunction expressionRef(): Record<string, string> {\n return { $ref: \"#/$defs/expression\" };\n}\n\nfunction bindingName(): Record<string, unknown> {\n return { type: \"string\", minLength: 1, maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };\n}\n\nfunction parametersSchema(): Record<string, unknown> {\n return {\n type: \"array\",\n maxItems: DEFAULT_KALADA_V1_FUNCTION_LIMITS.maxFunctionParameters,\n items: { $ref: \"#/$defs/parameter\" },\n };\n}\n\nfunction typeRef(): Record<string, string> {\n return { $ref: \"#/$defs/kaladaType\" };\n}\n\nfunction typeSchema(): Record<string, unknown> {\n const primitive = node(\n \"primitive-type\",\n { name: { enum: [\"null\", \"boolean\", \"number\", \"string\", \"json\", \"Instant\", \"Duration\"] } },\n [\"name\"],\n );\n return {\n oneOf: [\n primitive,\n node(\"option-type\", { value: typeRef() }, [\"value\"]),\n node(\"result-type\", { ok: typeRef(), error: typeRef() }, [\"ok\", \"error\"]),\n node(\"array-type\", { element: typeRef() }, [\"element\"]),\n node(\n \"function-type\",\n {\n parameters: {\n type: \"array\",\n maxItems: DEFAULT_KALADA_V1_FUNCTION_LIMITS.maxFunctionParameters,\n items: typeRef(),\n },\n returns: typeRef(),\n },\n [\"parameters\", \"returns\"],\n ),\n ],\n };\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n for (const child of Object.values(value)) deepFreeze(child);\n return Object.freeze(value);\n}\n"]}
@@ -0,0 +1,177 @@
1
+ 'use strict';
2
+
3
+ var diagnostics_js = require('./diagnostics.js');
4
+ var staticTypes_js = require('./static-types.js');
5
+
6
+ function analyzeKaladaV1Functions(expression, limits) {
7
+ const state = { limits, functions: [] };
8
+ scan(expression, ["expression"], /* @__PURE__ */ new Set(), state);
9
+ staticTypes_js.checkKaladaV1Types(expression);
10
+ return Object.freeze(state.functions);
11
+ }
12
+ function scan(node, path, scope, state) {
13
+ if (node.kind === "function") {
14
+ const parameters = node.parameters.map((item) => item.name);
15
+ record(path, null, collectCaptures(node.body, scope, new Set(parameters)), state);
16
+ scan(node.body, [...path, "body"], extendedMany(scope, parameters), state);
17
+ return;
18
+ }
19
+ if (node.kind === "function-group") {
20
+ scanGroup(node, path, scope, state);
21
+ return;
22
+ }
23
+ scanChildren(node, path, scope, state);
24
+ }
25
+ function scanGroup(node, path, scope, state) {
26
+ const names = node.functions.map((item) => item.name);
27
+ const groupScope = extendedMany(scope, names);
28
+ node.functions.forEach((fn, index) => {
29
+ const memberPath = [...path, "functions", index];
30
+ const parameters = fn.parameters.map((item) => item.name);
31
+ const locals = /* @__PURE__ */ new Set([...names, ...parameters]);
32
+ record(memberPath, fn.name, collectCaptures(fn.body, scope, locals), state);
33
+ scan(fn.body, [...memberPath, "body"], extendedMany(groupScope, parameters), state);
34
+ });
35
+ scan(node.body, [...path, "body"], groupScope, state);
36
+ }
37
+ function scanChildren(node, path, scope, state) {
38
+ if (isLeaf(node)) return;
39
+ if (node.kind === "binding") {
40
+ scan(node.value, [...path, "value"], scope, state);
41
+ scan(node.body, [...path, "body"], extended(scope, node.name), state);
42
+ return;
43
+ }
44
+ if (node.kind === "call") {
45
+ scan(node.callee, [...path, "callee"], scope, state);
46
+ node.arguments.forEach((item, index) => {
47
+ scan(item, [...path, "arguments", index], scope, state);
48
+ });
49
+ return;
50
+ }
51
+ if (node.kind === "match") {
52
+ scanMatch(node, path, scope, state);
53
+ return;
54
+ }
55
+ if (node.kind === "temporal-arithmetic" || node.kind === "temporal-comparison") {
56
+ scan(node.left, [...path, "left"], scope, state);
57
+ scan(node.right, [...path, "right"], scope, state);
58
+ return;
59
+ }
60
+ if (node.kind === "option" && node.variant === "some")
61
+ scan(node.value, [...path, "value"], scope, state);
62
+ if (node.kind === "result") scan(node.value, [...path, "value"], scope, state);
63
+ }
64
+ function scanMatch(node, path, scope, state) {
65
+ scan(node.value, [...path, "value"], scope, state);
66
+ node.arms.forEach((arm, index) => {
67
+ const armScope = arm.binding ? extended(scope, arm.binding) : scope;
68
+ scan(arm.body, [...path, "arms", index, "body"], armScope, state);
69
+ });
70
+ }
71
+ function collectCaptures(node, outer, locals) {
72
+ const found = [];
73
+ const seen = /* @__PURE__ */ new Set();
74
+ visitReferences(node, new Set(locals), (name) => {
75
+ if (outer.has(name) && !seen.has(name)) {
76
+ seen.add(name);
77
+ found.push(name);
78
+ }
79
+ });
80
+ return found;
81
+ }
82
+ function visitReferences(node, locals, add) {
83
+ if (node.kind === "ref") {
84
+ if (typeof node.ref === "string" && !locals.has(node.ref)) add(node.ref);
85
+ return;
86
+ }
87
+ if (isLeaf(node)) return;
88
+ if (node.kind === "binding") {
89
+ visitReferences(node.value, locals, add);
90
+ visitReferences(node.body, added(locals, node.name), add);
91
+ return;
92
+ }
93
+ if (node.kind === "function") {
94
+ visitReferences(
95
+ node.body,
96
+ addedMany(
97
+ locals,
98
+ node.parameters.map((item) => item.name)
99
+ ),
100
+ add
101
+ );
102
+ return;
103
+ }
104
+ if (node.kind === "function-group") {
105
+ visitGroupReferences(node, locals, add);
106
+ return;
107
+ }
108
+ visitReferenceChildren(node, locals, add);
109
+ }
110
+ function visitReferenceChildren(node, locals, add) {
111
+ if (node.kind === "call") {
112
+ visitReferences(node.callee, locals, add);
113
+ for (const item of node.arguments) visitReferences(item, locals, add);
114
+ return;
115
+ }
116
+ if (node.kind === "match") {
117
+ visitReferences(node.value, locals, add);
118
+ for (const arm of node.arms)
119
+ visitReferences(arm.body, arm.binding ? added(locals, arm.binding) : locals, add);
120
+ return;
121
+ }
122
+ if (node.kind === "temporal-arithmetic" || node.kind === "temporal-comparison") {
123
+ visitReferences(node.left, locals, add);
124
+ visitReferences(node.right, locals, add);
125
+ return;
126
+ }
127
+ if (node.kind === "option" && node.variant === "some") visitReferences(node.value, locals, add);
128
+ if (node.kind === "result") visitReferences(node.value, locals, add);
129
+ }
130
+ function visitGroupReferences(node, locals, add) {
131
+ const group = addedMany(
132
+ locals,
133
+ node.functions.map((item) => item.name)
134
+ );
135
+ for (const fn of node.functions)
136
+ visitReferences(
137
+ fn.body,
138
+ addedMany(
139
+ group,
140
+ fn.parameters.map((item) => item.name)
141
+ ),
142
+ add
143
+ );
144
+ visitReferences(node.body, group, add);
145
+ }
146
+ function isLeaf(node) {
147
+ return node.kind === "literal" || node.kind === "ref" || node.kind === "instant" || node.kind === "duration" || node.kind === "current-instant" || node.kind === "core-function" || node.kind === "option" && node.variant === "none";
148
+ }
149
+ function record(path, name, captures, state) {
150
+ if (captures.length > state.limits.maxCapturesPerClosure)
151
+ throw new diagnostics_js.KaladaFailure("KALADA_CAPTURE_LIMIT", path);
152
+ state.functions.push(
153
+ Object.freeze({
154
+ path: Object.freeze([...path]),
155
+ name,
156
+ captures: Object.freeze(captures)
157
+ })
158
+ );
159
+ }
160
+ function extended(scope, name) {
161
+ return extendedMany(scope, [name]);
162
+ }
163
+ function extendedMany(scope, names) {
164
+ const output = new Set(scope);
165
+ for (const name of names) output.add(name);
166
+ return output;
167
+ }
168
+ function added(scope, name) {
169
+ return addedMany(scope, [name]);
170
+ }
171
+ function addedMany(scope, names) {
172
+ return /* @__PURE__ */ new Set([...scope, ...names]);
173
+ }
174
+
175
+ exports.analyzeKaladaV1Functions = analyzeKaladaV1Functions;
176
+ //# sourceMappingURL=static-analysis.cjs.map
177
+ //# sourceMappingURL=static-analysis.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/static-analysis.ts"],"names":["checkKaladaV1Types","KaladaFailure"],"mappings":"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","file":"static-analysis.cjs","sourcesContent":["import { KaladaFailure } from \"./diagnostics.js\";\nimport type { JsonValue } from \"./json.js\";\nimport type { ResolvedKaladaV1Limits } from \"./limits.js\";\nimport { checkKaladaV1Types } from \"./static-types.js\";\nimport type { KaladaV1Expression, KaladaV1FunctionCapture } from \"./types.js\";\n\ntype Path = readonly (string | number)[];\ntype Names = ReadonlySet<string>;\n\ninterface AnalysisState {\n readonly limits: ResolvedKaladaV1Limits;\n readonly functions: KaladaV1FunctionCapture[];\n}\n\nexport function analyzeKaladaV1Functions<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n limits: ResolvedKaladaV1Limits,\n): readonly KaladaV1FunctionCapture[] {\n const state: AnalysisState = { limits, functions: [] };\n scan(expression, [\"expression\"], new Set(), state);\n checkKaladaV1Types(expression);\n return Object.freeze(state.functions);\n}\n\nfunction scan<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n path: Path,\n scope: Names,\n state: AnalysisState,\n): void {\n if (node.kind === \"function\") {\n const parameters = node.parameters.map((item) => item.name);\n record(path, null, collectCaptures(node.body, scope, new Set(parameters)), state);\n scan(node.body, [...path, \"body\"], extendedMany(scope, parameters), state);\n return;\n }\n if (node.kind === \"function-group\") {\n scanGroup(node, path, scope, state);\n return;\n }\n scanChildren(node, path, scope, state);\n}\n\nfunction scanGroup<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"function-group\" }>,\n path: Path,\n scope: Names,\n state: AnalysisState,\n): void {\n const names = node.functions.map((item) => item.name);\n const groupScope = extendedMany(scope, names);\n node.functions.forEach((fn, index) => {\n const memberPath = [...path, \"functions\", index];\n const parameters = fn.parameters.map((item) => item.name);\n const locals = new Set([...names, ...parameters]);\n record(memberPath, fn.name, collectCaptures(fn.body, scope, locals), state);\n scan(fn.body, [...memberPath, \"body\"], extendedMany(groupScope, parameters), state);\n });\n scan(node.body, [...path, \"body\"], groupScope, state);\n}\n\nfunction scanChildren<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n path: Path,\n scope: Names,\n state: AnalysisState,\n): void {\n if (isLeaf(node)) return;\n if (node.kind === \"binding\") {\n scan(node.value, [...path, \"value\"], scope, state);\n scan(node.body, [...path, \"body\"], extended(scope, node.name), state);\n return;\n }\n if (node.kind === \"call\") {\n scan(node.callee, [...path, \"callee\"], scope, state);\n node.arguments.forEach((item, index) => {\n scan(item, [...path, \"arguments\", index], scope, state);\n });\n return;\n }\n if (node.kind === \"match\") {\n scanMatch(node, path, scope, state);\n return;\n }\n if (node.kind === \"temporal-arithmetic\" || node.kind === \"temporal-comparison\") {\n scan(node.left, [...path, \"left\"], scope, state);\n scan(node.right, [...path, \"right\"], scope, state);\n return;\n }\n if (node.kind === \"option\" && node.variant === \"some\")\n scan(node.value, [...path, \"value\"], scope, state);\n if (node.kind === \"result\") scan(node.value, [...path, \"value\"], scope, state);\n}\n\nfunction scanMatch<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"match\" }>,\n path: Path,\n scope: Names,\n state: AnalysisState,\n): void {\n scan(node.value, [...path, \"value\"], scope, state);\n node.arms.forEach((arm, index) => {\n const armScope = arm.binding ? extended(scope, arm.binding) : scope;\n scan(arm.body, [...path, \"arms\", index, \"body\"], armScope, state);\n });\n}\n\nfunction collectCaptures<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n outer: Names,\n locals: Names,\n): string[] {\n const found: string[] = [];\n const seen = new Set<string>();\n visitReferences(node, new Set(locals), (name) => {\n if (outer.has(name) && !seen.has(name)) {\n seen.add(name);\n found.push(name);\n }\n });\n return found;\n}\n\nfunction visitReferences<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n locals: Set<string>,\n add: (name: string) => void,\n): void {\n if (node.kind === \"ref\") {\n if (typeof node.ref === \"string\" && !locals.has(node.ref)) add(node.ref);\n return;\n }\n if (isLeaf(node)) return;\n if (node.kind === \"binding\") {\n visitReferences(node.value, locals, add);\n visitReferences(node.body, added(locals, node.name), add);\n return;\n }\n if (node.kind === \"function\") {\n visitReferences(\n node.body,\n addedMany(\n locals,\n node.parameters.map((item) => item.name),\n ),\n add,\n );\n return;\n }\n if (node.kind === \"function-group\") {\n visitGroupReferences(node, locals, add);\n return;\n }\n visitReferenceChildren(node, locals, add);\n}\n\nfunction visitReferenceChildren<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n locals: Set<string>,\n add: (name: string) => void,\n): void {\n if (node.kind === \"call\") {\n visitReferences(node.callee, locals, add);\n for (const item of node.arguments) visitReferences(item, locals, add);\n return;\n }\n if (node.kind === \"match\") {\n visitReferences(node.value, locals, add);\n for (const arm of node.arms)\n visitReferences(arm.body, arm.binding ? added(locals, arm.binding) : locals, add);\n return;\n }\n if (node.kind === \"temporal-arithmetic\" || node.kind === \"temporal-comparison\") {\n visitReferences(node.left, locals, add);\n visitReferences(node.right, locals, add);\n return;\n }\n if (node.kind === \"option\" && node.variant === \"some\") visitReferences(node.value, locals, add);\n if (node.kind === \"result\") visitReferences(node.value, locals, add);\n}\n\nfunction visitGroupReferences<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"function-group\" }>,\n locals: Set<string>,\n add: (name: string) => void,\n): void {\n const group = addedMany(\n locals,\n node.functions.map((item) => item.name),\n );\n for (const fn of node.functions)\n visitReferences(\n fn.body,\n addedMany(\n group,\n fn.parameters.map((item) => item.name),\n ),\n add,\n );\n visitReferences(node.body, group, add);\n}\n\nfunction isLeaf<R extends JsonValue>(node: KaladaV1Expression<R>): boolean {\n return (\n node.kind === \"literal\" ||\n node.kind === \"ref\" ||\n node.kind === \"instant\" ||\n node.kind === \"duration\" ||\n node.kind === \"current-instant\" ||\n node.kind === \"core-function\" ||\n (node.kind === \"option\" && node.variant === \"none\")\n );\n}\n\nfunction record(path: Path, name: string | null, captures: string[], state: AnalysisState): void {\n if (captures.length > state.limits.maxCapturesPerClosure)\n throw new KaladaFailure(\"KALADA_CAPTURE_LIMIT\", path);\n state.functions.push(\n Object.freeze({\n path: Object.freeze([...path]),\n name,\n captures: Object.freeze(captures),\n }),\n );\n}\n\nfunction extended(scope: Names, name: string): Names {\n return extendedMany(scope, [name]);\n}\n\nfunction extendedMany(scope: Names, names: readonly string[]): Names {\n const output = new Set(scope);\n for (const name of names) output.add(name);\n return output;\n}\n\nfunction added(scope: Set<string>, name: string): Set<string> {\n return addedMany(scope, [name]);\n}\n\nfunction addedMany(scope: Set<string>, names: readonly string[]): Set<string> {\n return new Set([...scope, ...names]);\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { JsonValue } from './json.cjs';
2
+ import { ResolvedKaladaV1Limits } from './limits.cjs';
3
+ import { KaladaV1Expression, KaladaV1FunctionCapture } from './types.cjs';
4
+ import './temporal.cjs';
5
+ import './values.cjs';
6
+
7
+ declare function analyzeKaladaV1Functions<R extends JsonValue>(expression: KaladaV1Expression<R>, limits: ResolvedKaladaV1Limits): readonly KaladaV1FunctionCapture[];
8
+
9
+ export { analyzeKaladaV1Functions };
@@ -0,0 +1,9 @@
1
+ import { JsonValue } from './json.js';
2
+ import { ResolvedKaladaV1Limits } from './limits.js';
3
+ import { KaladaV1Expression, KaladaV1FunctionCapture } from './types.js';
4
+ import './temporal.js';
5
+ import './values.js';
6
+
7
+ declare function analyzeKaladaV1Functions<R extends JsonValue>(expression: KaladaV1Expression<R>, limits: ResolvedKaladaV1Limits): readonly KaladaV1FunctionCapture[];
8
+
9
+ export { analyzeKaladaV1Functions };
@@ -0,0 +1,175 @@
1
+ import { KaladaFailure } from './diagnostics.js';
2
+ import { checkKaladaV1Types } from './static-types.js';
3
+
4
+ function analyzeKaladaV1Functions(expression, limits) {
5
+ const state = { limits, functions: [] };
6
+ scan(expression, ["expression"], /* @__PURE__ */ new Set(), state);
7
+ checkKaladaV1Types(expression);
8
+ return Object.freeze(state.functions);
9
+ }
10
+ function scan(node, path, scope, state) {
11
+ if (node.kind === "function") {
12
+ const parameters = node.parameters.map((item) => item.name);
13
+ record(path, null, collectCaptures(node.body, scope, new Set(parameters)), state);
14
+ scan(node.body, [...path, "body"], extendedMany(scope, parameters), state);
15
+ return;
16
+ }
17
+ if (node.kind === "function-group") {
18
+ scanGroup(node, path, scope, state);
19
+ return;
20
+ }
21
+ scanChildren(node, path, scope, state);
22
+ }
23
+ function scanGroup(node, path, scope, state) {
24
+ const names = node.functions.map((item) => item.name);
25
+ const groupScope = extendedMany(scope, names);
26
+ node.functions.forEach((fn, index) => {
27
+ const memberPath = [...path, "functions", index];
28
+ const parameters = fn.parameters.map((item) => item.name);
29
+ const locals = /* @__PURE__ */ new Set([...names, ...parameters]);
30
+ record(memberPath, fn.name, collectCaptures(fn.body, scope, locals), state);
31
+ scan(fn.body, [...memberPath, "body"], extendedMany(groupScope, parameters), state);
32
+ });
33
+ scan(node.body, [...path, "body"], groupScope, state);
34
+ }
35
+ function scanChildren(node, path, scope, state) {
36
+ if (isLeaf(node)) return;
37
+ if (node.kind === "binding") {
38
+ scan(node.value, [...path, "value"], scope, state);
39
+ scan(node.body, [...path, "body"], extended(scope, node.name), state);
40
+ return;
41
+ }
42
+ if (node.kind === "call") {
43
+ scan(node.callee, [...path, "callee"], scope, state);
44
+ node.arguments.forEach((item, index) => {
45
+ scan(item, [...path, "arguments", index], scope, state);
46
+ });
47
+ return;
48
+ }
49
+ if (node.kind === "match") {
50
+ scanMatch(node, path, scope, state);
51
+ return;
52
+ }
53
+ if (node.kind === "temporal-arithmetic" || node.kind === "temporal-comparison") {
54
+ scan(node.left, [...path, "left"], scope, state);
55
+ scan(node.right, [...path, "right"], scope, state);
56
+ return;
57
+ }
58
+ if (node.kind === "option" && node.variant === "some")
59
+ scan(node.value, [...path, "value"], scope, state);
60
+ if (node.kind === "result") scan(node.value, [...path, "value"], scope, state);
61
+ }
62
+ function scanMatch(node, path, scope, state) {
63
+ scan(node.value, [...path, "value"], scope, state);
64
+ node.arms.forEach((arm, index) => {
65
+ const armScope = arm.binding ? extended(scope, arm.binding) : scope;
66
+ scan(arm.body, [...path, "arms", index, "body"], armScope, state);
67
+ });
68
+ }
69
+ function collectCaptures(node, outer, locals) {
70
+ const found = [];
71
+ const seen = /* @__PURE__ */ new Set();
72
+ visitReferences(node, new Set(locals), (name) => {
73
+ if (outer.has(name) && !seen.has(name)) {
74
+ seen.add(name);
75
+ found.push(name);
76
+ }
77
+ });
78
+ return found;
79
+ }
80
+ function visitReferences(node, locals, add) {
81
+ if (node.kind === "ref") {
82
+ if (typeof node.ref === "string" && !locals.has(node.ref)) add(node.ref);
83
+ return;
84
+ }
85
+ if (isLeaf(node)) return;
86
+ if (node.kind === "binding") {
87
+ visitReferences(node.value, locals, add);
88
+ visitReferences(node.body, added(locals, node.name), add);
89
+ return;
90
+ }
91
+ if (node.kind === "function") {
92
+ visitReferences(
93
+ node.body,
94
+ addedMany(
95
+ locals,
96
+ node.parameters.map((item) => item.name)
97
+ ),
98
+ add
99
+ );
100
+ return;
101
+ }
102
+ if (node.kind === "function-group") {
103
+ visitGroupReferences(node, locals, add);
104
+ return;
105
+ }
106
+ visitReferenceChildren(node, locals, add);
107
+ }
108
+ function visitReferenceChildren(node, locals, add) {
109
+ if (node.kind === "call") {
110
+ visitReferences(node.callee, locals, add);
111
+ for (const item of node.arguments) visitReferences(item, locals, add);
112
+ return;
113
+ }
114
+ if (node.kind === "match") {
115
+ visitReferences(node.value, locals, add);
116
+ for (const arm of node.arms)
117
+ visitReferences(arm.body, arm.binding ? added(locals, arm.binding) : locals, add);
118
+ return;
119
+ }
120
+ if (node.kind === "temporal-arithmetic" || node.kind === "temporal-comparison") {
121
+ visitReferences(node.left, locals, add);
122
+ visitReferences(node.right, locals, add);
123
+ return;
124
+ }
125
+ if (node.kind === "option" && node.variant === "some") visitReferences(node.value, locals, add);
126
+ if (node.kind === "result") visitReferences(node.value, locals, add);
127
+ }
128
+ function visitGroupReferences(node, locals, add) {
129
+ const group = addedMany(
130
+ locals,
131
+ node.functions.map((item) => item.name)
132
+ );
133
+ for (const fn of node.functions)
134
+ visitReferences(
135
+ fn.body,
136
+ addedMany(
137
+ group,
138
+ fn.parameters.map((item) => item.name)
139
+ ),
140
+ add
141
+ );
142
+ visitReferences(node.body, group, add);
143
+ }
144
+ function isLeaf(node) {
145
+ return node.kind === "literal" || node.kind === "ref" || node.kind === "instant" || node.kind === "duration" || node.kind === "current-instant" || node.kind === "core-function" || node.kind === "option" && node.variant === "none";
146
+ }
147
+ function record(path, name, captures, state) {
148
+ if (captures.length > state.limits.maxCapturesPerClosure)
149
+ throw new KaladaFailure("KALADA_CAPTURE_LIMIT", path);
150
+ state.functions.push(
151
+ Object.freeze({
152
+ path: Object.freeze([...path]),
153
+ name,
154
+ captures: Object.freeze(captures)
155
+ })
156
+ );
157
+ }
158
+ function extended(scope, name) {
159
+ return extendedMany(scope, [name]);
160
+ }
161
+ function extendedMany(scope, names) {
162
+ const output = new Set(scope);
163
+ for (const name of names) output.add(name);
164
+ return output;
165
+ }
166
+ function added(scope, name) {
167
+ return addedMany(scope, [name]);
168
+ }
169
+ function addedMany(scope, names) {
170
+ return /* @__PURE__ */ new Set([...scope, ...names]);
171
+ }
172
+
173
+ export { analyzeKaladaV1Functions };
174
+ //# sourceMappingURL=static-analysis.js.map
175
+ //# sourceMappingURL=static-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/static-analysis.ts"],"names":[],"mappings":"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","file":"static-analysis.js","sourcesContent":["import { KaladaFailure } from \"./diagnostics.js\";\nimport type { JsonValue } from \"./json.js\";\nimport type { ResolvedKaladaV1Limits } from \"./limits.js\";\nimport { checkKaladaV1Types } from \"./static-types.js\";\nimport type { KaladaV1Expression, KaladaV1FunctionCapture } from \"./types.js\";\n\ntype Path = readonly (string | number)[];\ntype Names = ReadonlySet<string>;\n\ninterface AnalysisState {\n readonly limits: ResolvedKaladaV1Limits;\n readonly functions: KaladaV1FunctionCapture[];\n}\n\nexport function analyzeKaladaV1Functions<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n limits: ResolvedKaladaV1Limits,\n): readonly KaladaV1FunctionCapture[] {\n const state: AnalysisState = { limits, functions: [] };\n scan(expression, [\"expression\"], new Set(), state);\n checkKaladaV1Types(expression);\n return Object.freeze(state.functions);\n}\n\nfunction scan<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n path: Path,\n scope: Names,\n state: AnalysisState,\n): void {\n if (node.kind === \"function\") {\n const parameters = node.parameters.map((item) => item.name);\n record(path, null, collectCaptures(node.body, scope, new Set(parameters)), state);\n scan(node.body, [...path, \"body\"], extendedMany(scope, parameters), state);\n return;\n }\n if (node.kind === \"function-group\") {\n scanGroup(node, path, scope, state);\n return;\n }\n scanChildren(node, path, scope, state);\n}\n\nfunction scanGroup<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"function-group\" }>,\n path: Path,\n scope: Names,\n state: AnalysisState,\n): void {\n const names = node.functions.map((item) => item.name);\n const groupScope = extendedMany(scope, names);\n node.functions.forEach((fn, index) => {\n const memberPath = [...path, \"functions\", index];\n const parameters = fn.parameters.map((item) => item.name);\n const locals = new Set([...names, ...parameters]);\n record(memberPath, fn.name, collectCaptures(fn.body, scope, locals), state);\n scan(fn.body, [...memberPath, \"body\"], extendedMany(groupScope, parameters), state);\n });\n scan(node.body, [...path, \"body\"], groupScope, state);\n}\n\nfunction scanChildren<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n path: Path,\n scope: Names,\n state: AnalysisState,\n): void {\n if (isLeaf(node)) return;\n if (node.kind === \"binding\") {\n scan(node.value, [...path, \"value\"], scope, state);\n scan(node.body, [...path, \"body\"], extended(scope, node.name), state);\n return;\n }\n if (node.kind === \"call\") {\n scan(node.callee, [...path, \"callee\"], scope, state);\n node.arguments.forEach((item, index) => {\n scan(item, [...path, \"arguments\", index], scope, state);\n });\n return;\n }\n if (node.kind === \"match\") {\n scanMatch(node, path, scope, state);\n return;\n }\n if (node.kind === \"temporal-arithmetic\" || node.kind === \"temporal-comparison\") {\n scan(node.left, [...path, \"left\"], scope, state);\n scan(node.right, [...path, \"right\"], scope, state);\n return;\n }\n if (node.kind === \"option\" && node.variant === \"some\")\n scan(node.value, [...path, \"value\"], scope, state);\n if (node.kind === \"result\") scan(node.value, [...path, \"value\"], scope, state);\n}\n\nfunction scanMatch<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"match\" }>,\n path: Path,\n scope: Names,\n state: AnalysisState,\n): void {\n scan(node.value, [...path, \"value\"], scope, state);\n node.arms.forEach((arm, index) => {\n const armScope = arm.binding ? extended(scope, arm.binding) : scope;\n scan(arm.body, [...path, \"arms\", index, \"body\"], armScope, state);\n });\n}\n\nfunction collectCaptures<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n outer: Names,\n locals: Names,\n): string[] {\n const found: string[] = [];\n const seen = new Set<string>();\n visitReferences(node, new Set(locals), (name) => {\n if (outer.has(name) && !seen.has(name)) {\n seen.add(name);\n found.push(name);\n }\n });\n return found;\n}\n\nfunction visitReferences<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n locals: Set<string>,\n add: (name: string) => void,\n): void {\n if (node.kind === \"ref\") {\n if (typeof node.ref === \"string\" && !locals.has(node.ref)) add(node.ref);\n return;\n }\n if (isLeaf(node)) return;\n if (node.kind === \"binding\") {\n visitReferences(node.value, locals, add);\n visitReferences(node.body, added(locals, node.name), add);\n return;\n }\n if (node.kind === \"function\") {\n visitReferences(\n node.body,\n addedMany(\n locals,\n node.parameters.map((item) => item.name),\n ),\n add,\n );\n return;\n }\n if (node.kind === \"function-group\") {\n visitGroupReferences(node, locals, add);\n return;\n }\n visitReferenceChildren(node, locals, add);\n}\n\nfunction visitReferenceChildren<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n locals: Set<string>,\n add: (name: string) => void,\n): void {\n if (node.kind === \"call\") {\n visitReferences(node.callee, locals, add);\n for (const item of node.arguments) visitReferences(item, locals, add);\n return;\n }\n if (node.kind === \"match\") {\n visitReferences(node.value, locals, add);\n for (const arm of node.arms)\n visitReferences(arm.body, arm.binding ? added(locals, arm.binding) : locals, add);\n return;\n }\n if (node.kind === \"temporal-arithmetic\" || node.kind === \"temporal-comparison\") {\n visitReferences(node.left, locals, add);\n visitReferences(node.right, locals, add);\n return;\n }\n if (node.kind === \"option\" && node.variant === \"some\") visitReferences(node.value, locals, add);\n if (node.kind === \"result\") visitReferences(node.value, locals, add);\n}\n\nfunction visitGroupReferences<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"function-group\" }>,\n locals: Set<string>,\n add: (name: string) => void,\n): void {\n const group = addedMany(\n locals,\n node.functions.map((item) => item.name),\n );\n for (const fn of node.functions)\n visitReferences(\n fn.body,\n addedMany(\n group,\n fn.parameters.map((item) => item.name),\n ),\n add,\n );\n visitReferences(node.body, group, add);\n}\n\nfunction isLeaf<R extends JsonValue>(node: KaladaV1Expression<R>): boolean {\n return (\n node.kind === \"literal\" ||\n node.kind === \"ref\" ||\n node.kind === \"instant\" ||\n node.kind === \"duration\" ||\n node.kind === \"current-instant\" ||\n node.kind === \"core-function\" ||\n (node.kind === \"option\" && node.variant === \"none\")\n );\n}\n\nfunction record(path: Path, name: string | null, captures: string[], state: AnalysisState): void {\n if (captures.length > state.limits.maxCapturesPerClosure)\n throw new KaladaFailure(\"KALADA_CAPTURE_LIMIT\", path);\n state.functions.push(\n Object.freeze({\n path: Object.freeze([...path]),\n name,\n captures: Object.freeze(captures),\n }),\n );\n}\n\nfunction extended(scope: Names, name: string): Names {\n return extendedMany(scope, [name]);\n}\n\nfunction extendedMany(scope: Names, names: readonly string[]): Names {\n const output = new Set(scope);\n for (const name of names) output.add(name);\n return output;\n}\n\nfunction added(scope: Set<string>, name: string): Set<string> {\n return addedMany(scope, [name]);\n}\n\nfunction addedMany(scope: Set<string>, names: readonly string[]): Set<string> {\n return new Set([...scope, ...names]);\n}\n"]}