@herb-tools/core 0.8.10 → 0.9.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 (39) hide show
  1. package/dist/herb-core.browser.js +22728 -320
  2. package/dist/herb-core.browser.js.map +1 -1
  3. package/dist/herb-core.cjs +22815 -321
  4. package/dist/herb-core.cjs.map +1 -1
  5. package/dist/herb-core.esm.js +22728 -320
  6. package/dist/herb-core.esm.js.map +1 -1
  7. package/dist/herb-core.umd.js +22815 -321
  8. package/dist/herb-core.umd.js.map +1 -1
  9. package/dist/types/ast-utils.d.ts +185 -4
  10. package/dist/types/backend.d.ts +6 -6
  11. package/dist/types/diagnostic.d.ts +6 -0
  12. package/dist/types/errors.d.ts +390 -25
  13. package/dist/types/extract-ruby-options.d.ts +6 -0
  14. package/dist/types/herb-backend.d.ts +15 -7
  15. package/dist/types/index.d.ts +2 -0
  16. package/dist/types/node-type-guards.d.ts +113 -32
  17. package/dist/types/nodes.d.ts +465 -49
  18. package/dist/types/parse-result.d.ts +7 -1
  19. package/dist/types/parser-options.d.ts +33 -2
  20. package/dist/types/prism/index.d.ts +28 -0
  21. package/dist/types/prism/inspect.d.ts +3 -0
  22. package/dist/types/util.d.ts +0 -1
  23. package/dist/types/visitor.d.ts +19 -1
  24. package/package.json +4 -1
  25. package/src/ast-utils.ts +564 -8
  26. package/src/backend.ts +7 -7
  27. package/src/diagnostic.ts +7 -0
  28. package/src/errors.ts +1221 -76
  29. package/src/extract-ruby-options.ts +11 -0
  30. package/src/herb-backend.ts +30 -15
  31. package/src/index.ts +2 -0
  32. package/src/node-type-guards.ts +281 -33
  33. package/src/nodes.ts +1309 -100
  34. package/src/parse-result.ts +11 -0
  35. package/src/parser-options.ts +62 -2
  36. package/src/prism/index.ts +44 -0
  37. package/src/prism/inspect.ts +118 -0
  38. package/src/util.ts +0 -12
  39. package/src/visitor.ts +66 -1
@@ -2,15 +2,18 @@ import { Result } from "./result.js";
2
2
  import { DocumentNode } from "./nodes.js";
3
3
  import { HerbError } from "./errors.js";
4
4
  import { HerbWarning } from "./warning.js";
5
+ import { ParserOptions } from "./parser-options.js";
5
6
  import type { SerializedHerbError } from "./errors.js";
6
7
  import type { SerializedHerbWarning } from "./warning.js";
7
8
  import type { SerializedDocumentNode } from "./nodes.js";
9
+ import type { SerializedParserOptions } from "./parser-options.js";
8
10
  import type { Visitor } from "./visitor.js";
9
11
  export type SerializedParseResult = {
10
12
  value: SerializedDocumentNode;
11
13
  source: string;
12
14
  warnings: SerializedHerbWarning[];
13
15
  errors: SerializedHerbError[];
16
+ options: SerializedParserOptions;
14
17
  };
15
18
  /**
16
19
  * Represents the result of a parsing operation, extending the base `Result` class.
@@ -19,6 +22,8 @@ export type SerializedParseResult = {
19
22
  export declare class ParseResult extends Result {
20
23
  /** The document node generated from the source code. */
21
24
  readonly value: DocumentNode;
25
+ /** The parser options used during parsing. */
26
+ readonly options: ParserOptions;
22
27
  /**
23
28
  * Creates a `ParseResult` instance from a serialized result.
24
29
  * @param result - The serialized parse result containing the value and source.
@@ -31,8 +36,9 @@ export declare class ParseResult extends Result {
31
36
  * @param source - The source code that was parsed.
32
37
  * @param warnings - An array of warnings encountered during parsing.
33
38
  * @param errors - An array of errors encountered during parsing.
39
+ * @param options - The parser options used during parsing.
34
40
  */
35
- constructor(value: DocumentNode, source: string, warnings?: HerbWarning[], errors?: HerbError[]);
41
+ constructor(value: DocumentNode, source: string, warnings?: HerbWarning[], errors?: HerbError[], options?: ParserOptions);
36
42
  /**
37
43
  * Determines if the parsing failed.
38
44
  * @returns `true` if there are errors, otherwise `false`.
@@ -1,4 +1,35 @@
1
- export interface ParserOptions {
1
+ export interface ParseOptions {
2
2
  track_whitespace?: boolean;
3
+ analyze?: boolean;
4
+ strict?: boolean;
5
+ action_view_helpers?: boolean;
6
+ render_nodes?: boolean;
7
+ prism_nodes?: boolean;
8
+ prism_nodes_deep?: boolean;
9
+ prism_program?: boolean;
10
+ }
11
+ export type SerializedParserOptions = Required<ParseOptions>;
12
+ export declare const DEFAULT_PARSER_OPTIONS: SerializedParserOptions;
13
+ /**
14
+ * Represents the parser options used during parsing.
15
+ */
16
+ export declare class ParserOptions {
17
+ /** Whether strict mode was enabled during parsing. */
18
+ readonly strict: boolean;
19
+ /** Whether whitespace tracking was enabled during parsing. */
20
+ readonly track_whitespace: boolean;
21
+ /** Whether analysis was performed during parsing. */
22
+ readonly analyze: boolean;
23
+ /** Whether ActionView tag helper transformation was enabled during parsing. */
24
+ readonly action_view_helpers: boolean;
25
+ /** Whether ActionView render call detection was enabled during parsing. */
26
+ readonly render_nodes: boolean;
27
+ /** Whether Prism node serialization was enabled during parsing. */
28
+ readonly prism_nodes: boolean;
29
+ /** Whether deep Prism node serialization was enabled during parsing. */
30
+ readonly prism_nodes_deep: boolean;
31
+ /** Whether the full Prism ProgramNode was serialized on the DocumentNode. */
32
+ readonly prism_program: boolean;
33
+ static from(options: SerializedParserOptions): ParserOptions;
34
+ constructor(options?: ParseOptions);
3
35
  }
4
- export declare const DEFAULT_PARSER_OPTIONS: ParserOptions;
@@ -0,0 +1,28 @@
1
+ import type { ParseResult as PrismParseResult } from "@ruby/prism/src/deserialize.js";
2
+ export * as PrismNodes from "@ruby/prism/src/nodes.js";
3
+ export { Visitor as PrismVisitor, BasicVisitor as PrismBasicVisitor } from "@ruby/prism/src/visitor.js";
4
+ export type PrismNode = any;
5
+ export type PrismLocation = {
6
+ startOffset: number;
7
+ length: number;
8
+ };
9
+ export type { PrismParseResult };
10
+ export { inspectPrismNode, inspectPrismSerialized } from "./inspect.js";
11
+ /**
12
+ * Deserialize a Prism parse result from the raw bytes produced by pm_serialize().
13
+ *
14
+ * @param bytes - The serialized bytes (from prism_serialized field on ERB nodes)
15
+ * @param source - The original source string that was parsed
16
+ * @returns The deserialized Prism ParseResult containing the AST
17
+ */
18
+ export declare function deserializePrismParseResult(bytes: Uint8Array, source: string): PrismParseResult;
19
+ /**
20
+ * Deserialize a Prism node from the raw bytes produced by pm_serialize().
21
+ * pm_serialize() serializes a single node subtree, so the ParseResult's
22
+ * value is the Prism node directly (not wrapped in ProgramNode).
23
+ *
24
+ * @param bytes - The serialized bytes (from prism_serialized field on ERB nodes)
25
+ * @param source - The original source string that was parsed
26
+ * @returns The Prism node, or null if deserialization fails
27
+ */
28
+ export declare function deserializePrismNode(bytes: Uint8Array, source: string): PrismNode | null;
@@ -0,0 +1,3 @@
1
+ import type { PrismNode } from "./index.js";
2
+ export declare function inspectPrismNode(node: PrismNode, source: string, prefix?: string): string;
3
+ export declare function inspectPrismSerialized(bytes: Uint8Array, source: string, prefix?: string): string;
@@ -1,2 +1 @@
1
1
  export declare function ensureString(object: any): string;
2
- export declare function convertToUTF8(string: string): string;
@@ -1,4 +1,4 @@
1
- import { Node, ERBNode, DocumentNode, LiteralNode, HTMLOpenTagNode, HTMLCloseTagNode, HTMLElementNode, HTMLAttributeValueNode, HTMLAttributeNameNode, HTMLAttributeNode, HTMLTextNode, HTMLCommentNode, HTMLDoctypeNode, XMLDeclarationNode, CDATANode, WhitespaceNode, ERBContentNode, ERBEndNode, ERBElseNode, ERBIfNode, ERBBlockNode, ERBWhenNode, ERBCaseNode, ERBCaseMatchNode, ERBWhileNode, ERBUntilNode, ERBForNode, ERBRescueNode, ERBEnsureNode, ERBBeginNode, ERBUnlessNode, ERBYieldNode, ERBInNode } from "./nodes.js";
1
+ import { Node, ERBNode, DocumentNode, LiteralNode, HTMLOpenTagNode, HTMLConditionalOpenTagNode, HTMLCloseTagNode, HTMLOmittedCloseTagNode, HTMLVirtualCloseTagNode, HTMLElementNode, HTMLConditionalElementNode, HTMLAttributeValueNode, HTMLAttributeNameNode, HTMLAttributeNode, RubyLiteralNode, RubyHTMLAttributesSplatNode, ERBOpenTagNode, HTMLTextNode, HTMLCommentNode, HTMLDoctypeNode, XMLDeclarationNode, CDATANode, WhitespaceNode, ERBContentNode, ERBEndNode, ERBElseNode, ERBIfNode, ERBBlockNode, ERBWhenNode, ERBCaseNode, ERBCaseMatchNode, ERBWhileNode, ERBUntilNode, ERBForNode, ERBRescueNode, ERBEnsureNode, ERBBeginNode, ERBUnlessNode, RubyRenderLocalNode, ERBRenderNode, ERBYieldNode, ERBInNode } from "./nodes.js";
2
2
  /**
3
3
  * Interface that enforces all node visit methods are implemented
4
4
  * This ensures that any class implementing IVisitor must have a visit method for every node type
@@ -10,11 +10,18 @@ export interface IVisitor {
10
10
  visitDocumentNode(node: DocumentNode): void;
11
11
  visitLiteralNode(node: LiteralNode): void;
12
12
  visitHTMLOpenTagNode(node: HTMLOpenTagNode): void;
13
+ visitHTMLConditionalOpenTagNode(node: HTMLConditionalOpenTagNode): void;
13
14
  visitHTMLCloseTagNode(node: HTMLCloseTagNode): void;
15
+ visitHTMLOmittedCloseTagNode(node: HTMLOmittedCloseTagNode): void;
16
+ visitHTMLVirtualCloseTagNode(node: HTMLVirtualCloseTagNode): void;
14
17
  visitHTMLElementNode(node: HTMLElementNode): void;
18
+ visitHTMLConditionalElementNode(node: HTMLConditionalElementNode): void;
15
19
  visitHTMLAttributeValueNode(node: HTMLAttributeValueNode): void;
16
20
  visitHTMLAttributeNameNode(node: HTMLAttributeNameNode): void;
17
21
  visitHTMLAttributeNode(node: HTMLAttributeNode): void;
22
+ visitRubyLiteralNode(node: RubyLiteralNode): void;
23
+ visitRubyHTMLAttributesSplatNode(node: RubyHTMLAttributesSplatNode): void;
24
+ visitERBOpenTagNode(node: ERBOpenTagNode): void;
18
25
  visitHTMLTextNode(node: HTMLTextNode): void;
19
26
  visitHTMLCommentNode(node: HTMLCommentNode): void;
20
27
  visitHTMLDoctypeNode(node: HTMLDoctypeNode): void;
@@ -36,6 +43,8 @@ export interface IVisitor {
36
43
  visitERBEnsureNode(node: ERBEnsureNode): void;
37
44
  visitERBBeginNode(node: ERBBeginNode): void;
38
45
  visitERBUnlessNode(node: ERBUnlessNode): void;
46
+ visitRubyRenderLocalNode(node: RubyRenderLocalNode): void;
47
+ visitERBRenderNode(node: ERBRenderNode): void;
39
48
  visitERBYieldNode(node: ERBYieldNode): void;
40
49
  visitERBInNode(node: ERBInNode): void;
41
50
  visitNode(node: Node): void;
@@ -50,11 +59,18 @@ export declare class Visitor implements IVisitor {
50
59
  visitDocumentNode(node: DocumentNode): void;
51
60
  visitLiteralNode(node: LiteralNode): void;
52
61
  visitHTMLOpenTagNode(node: HTMLOpenTagNode): void;
62
+ visitHTMLConditionalOpenTagNode(node: HTMLConditionalOpenTagNode): void;
53
63
  visitHTMLCloseTagNode(node: HTMLCloseTagNode): void;
64
+ visitHTMLOmittedCloseTagNode(node: HTMLOmittedCloseTagNode): void;
65
+ visitHTMLVirtualCloseTagNode(node: HTMLVirtualCloseTagNode): void;
54
66
  visitHTMLElementNode(node: HTMLElementNode): void;
67
+ visitHTMLConditionalElementNode(node: HTMLConditionalElementNode): void;
55
68
  visitHTMLAttributeValueNode(node: HTMLAttributeValueNode): void;
56
69
  visitHTMLAttributeNameNode(node: HTMLAttributeNameNode): void;
57
70
  visitHTMLAttributeNode(node: HTMLAttributeNode): void;
71
+ visitRubyLiteralNode(node: RubyLiteralNode): void;
72
+ visitRubyHTMLAttributesSplatNode(node: RubyHTMLAttributesSplatNode): void;
73
+ visitERBOpenTagNode(node: ERBOpenTagNode): void;
58
74
  visitHTMLTextNode(node: HTMLTextNode): void;
59
75
  visitHTMLCommentNode(node: HTMLCommentNode): void;
60
76
  visitHTMLDoctypeNode(node: HTMLDoctypeNode): void;
@@ -76,6 +92,8 @@ export declare class Visitor implements IVisitor {
76
92
  visitERBEnsureNode(node: ERBEnsureNode): void;
77
93
  visitERBBeginNode(node: ERBBeginNode): void;
78
94
  visitERBUnlessNode(node: ERBUnlessNode): void;
95
+ visitRubyRenderLocalNode(node: RubyRenderLocalNode): void;
96
+ visitERBRenderNode(node: ERBRenderNode): void;
79
97
  visitERBYieldNode(node: ERBYieldNode): void;
80
98
  visitERBInNode(node: ERBInNode): void;
81
99
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@herb-tools/core",
3
- "version": "0.8.10",
3
+ "version": "0.9.1",
4
4
  "description": "Core module exporting shared interfaces, AST node definitions, and common utilities for Herb",
5
5
  "license": "MIT",
6
6
  "homepage": "https://herb-tools.dev",
@@ -30,6 +30,9 @@
30
30
  }
31
31
  },
32
32
  "dependencies": {},
33
+ "devDependencies": {
34
+ "@ruby/prism": "^1.9.0"
35
+ },
33
36
  "files": [
34
37
  "package.json",
35
38
  "README.md",