@hyperfixi/core 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/api/hyperscript-api.d.ts +6 -1
  2. package/dist/chunks/{bridge-CZfeDyEz.js → bridge-D2DBo02Z.js} +2 -2
  3. package/dist/chunks/browser-modular-BA3JFmkq.js +2 -0
  4. package/dist/chunks/index-C6Fn0jGB.js +2 -0
  5. package/dist/commands/dom/toggle.d.ts +2 -0
  6. package/dist/commands/index.js +35 -0
  7. package/dist/commands/index.mjs +35 -0
  8. package/dist/expressions/index.js +0 -27
  9. package/dist/expressions/index.mjs +0 -27
  10. package/dist/hyperfixi-classic-i18n.js +1 -1
  11. package/dist/hyperfixi-minimal.js +1 -1
  12. package/dist/hyperfixi-multilingual.js +1 -1
  13. package/dist/hyperfixi-standard.js +1 -1
  14. package/dist/hyperfixi.js +1 -1
  15. package/dist/hyperfixi.mjs +1 -1
  16. package/dist/i18n/error-catalog.d.ts +12 -0
  17. package/dist/index.js +31352 -23495
  18. package/dist/index.min.js +1 -1
  19. package/dist/index.mjs +31352 -23495
  20. package/dist/lokascript-browser-classic-i18n.js +1 -1
  21. package/dist/lokascript-browser-minimal.js +1 -1
  22. package/dist/lokascript-browser-standard.js +1 -1
  23. package/dist/lokascript-browser.js +1 -1
  24. package/dist/lokascript-multilingual.js +1 -1
  25. package/dist/lse/index.d.ts +15 -0
  26. package/dist/lse/index.js +84 -0
  27. package/dist/lse/index.mjs +71 -0
  28. package/dist/parser/full-parser.js +596 -240
  29. package/dist/parser/full-parser.mjs +596 -240
  30. package/dist/parser/helpers/ast-helpers.d.ts +1 -0
  31. package/dist/parser/parser-types.d.ts +22 -7
  32. package/dist/parser/parser.d.ts +7 -0
  33. package/dist/parser/pratt-parser.d.ts +42 -0
  34. package/dist/parser/token-consumer.d.ts +1 -2
  35. package/dist/parser/tokenizer.d.ts +0 -33
  36. package/dist/registry/index.js +0 -27
  37. package/dist/registry/index.mjs +0 -27
  38. package/dist/runtime/runtime-base.d.ts +3 -0
  39. package/dist/types/base-types.d.ts +11 -0
  40. package/dist/types/core.d.ts +1 -0
  41. package/package.json +12 -3
  42. package/dist/chunks/browser-modular-CwTpxqdt.js +0 -2
@@ -18,5 +18,6 @@ export declare function createArrayLiteral(elements: ASTNode[], pos: Position):
18
18
  export declare function createPropertyOfExpression(property: ASTNode, target: ASTNode, pos: Position): PropertyOfExpressionNode;
19
19
  export declare function createCommandSequence(commands: ASTNode[]): CommandSequenceNode;
20
20
  export declare function createErrorNode(pos: Position): IdentifierNode;
21
+ export declare function createErrorCommandNode(pos: Position, message: string, source?: string): ASTNode;
21
22
  export declare function createProgramNode(statements: ASTNode[]): ASTNode;
22
23
  //# sourceMappingURL=ast-helpers.d.ts.map
@@ -1,5 +1,4 @@
1
1
  import type { Token, ASTNode, CommandNode } from '../types/core';
2
- import { TokenType } from './tokenizer';
3
2
  export interface Position {
4
3
  start: number;
5
4
  end: number;
@@ -86,14 +85,20 @@ export interface MultiWordPattern {
86
85
  minArgs?: number;
87
86
  maxArgs?: number;
88
87
  }
89
- export interface ParserContext {
88
+ export interface TokenStream {
90
89
  readonly tokens: Token[];
91
90
  current: number;
92
91
  advance(): Token;
93
92
  peek(): Token;
94
93
  previous(): Token;
95
- consume(expected: string | TokenType, message: string): Token;
94
+ consume(expected: string, message: string): Token;
96
95
  check(value: string): boolean;
96
+ match(...types: string[]): boolean;
97
+ matchOperator(operator: string): boolean;
98
+ isAtEnd(): boolean;
99
+ peekAt(offset: number): Token | null;
100
+ }
101
+ export interface TokenPredicates {
97
102
  checkIdentifierLike(): boolean;
98
103
  checkSelector(): boolean;
99
104
  checkAnySelector(): boolean;
@@ -103,9 +108,8 @@ export interface ParserContext {
103
108
  checkEvent(): boolean;
104
109
  checkIsCommand(): boolean;
105
110
  checkContextVar(): boolean;
106
- match(...types: Array<string | TokenType>): boolean;
107
- matchOperator(operator: string): boolean;
108
- isAtEnd(): boolean;
111
+ }
112
+ export interface ASTFactory {
109
113
  createIdentifier(name: string): IdentifierNode;
110
114
  createLiteral(value: unknown, raw: string): ASTNode;
111
115
  createSelector(value: string): ASTNode;
@@ -117,6 +121,8 @@ export interface ParserContext {
117
121
  createErrorNode(): ASTNode;
118
122
  createProgramNode(statements: ASTNode[]): ASTNode;
119
123
  createCommandFromIdentifier(identifierNode: IdentifierNode): CommandNode;
124
+ }
125
+ export interface ExpressionParser {
120
126
  parseExpression(): ASTNode;
121
127
  parsePrimary(): ASTNode;
122
128
  parseCall(): ASTNode;
@@ -139,15 +145,22 @@ export interface ParserContext {
139
145
  parseAttributeOrArrayLiteral(): ASTNode;
140
146
  parseObjectLiteral(): ASTNode;
141
147
  parseCSSObjectLiteral(): ASTNode;
148
+ }
149
+ export interface CommandParser {
142
150
  parseCommand(): CommandNode;
143
151
  parseCommandSequence(): ASTNode;
144
152
  parseCommandListUntilEnd(): ASTNode[];
153
+ }
154
+ export interface PositionCheckpoint {
145
155
  savePosition(): number;
146
156
  restorePosition(pos: number): void;
147
- peekAt(offset: number): Token | null;
148
157
  getPosition(): Position;
158
+ }
159
+ export interface ParserErrorHandler {
149
160
  addError(message: string): void;
150
161
  addWarning(warning: string): void;
162
+ }
163
+ export interface ParserUtilities {
151
164
  isCommand(name: string): boolean;
152
165
  isCompoundCommand(name: string): boolean;
153
166
  isKeyword(name: string): boolean;
@@ -155,6 +168,8 @@ export interface ParserContext {
155
168
  resolveKeyword(value: string): string;
156
169
  getInputSlice(start: number, end?: number): string;
157
170
  }
171
+ export interface ParserContext extends TokenStream, TokenPredicates, ASTFactory, ExpressionParser, CommandParser, PositionCheckpoint, ParserErrorHandler, ParserUtilities {
172
+ }
158
173
  export type CommandParserFunction = (token: Token, context: ParserContext) => CommandNode;
159
174
  export type CompoundCommandParserFunction = (identifierNode: IdentifierNode, context: ParserContext) => CommandNode | null;
160
175
  export type TokenNavigationFunction = (context: ParserContext) => Token | boolean;
@@ -6,17 +6,23 @@ export declare class Parser {
6
6
  private tokens;
7
7
  private current;
8
8
  private error;
9
+ private errors;
9
10
  private warnings;
10
11
  private keywordResolver?;
11
12
  private semanticAdapter?;
12
13
  private originalInput?;
13
14
  private registryIntegration?;
15
+ private prattCache;
14
16
  private static readonly POSTFIX_UNARY_OPERATORS;
15
17
  constructor(tokens: Token[], options?: ParserOptions, originalInput?: string);
16
18
  private resolveKeyword;
17
19
  private addWarning;
18
20
  parse(): ParseResult;
21
+ private parseInternal;
19
22
  private parseExpression;
23
+ private static readonly PRATT_TABLE;
24
+ private parseExpressionPratt;
25
+ private makePrattContext;
20
26
  private parseAssignment;
21
27
  private parseLogicalOr;
22
28
  private parseLogicalAnd;
@@ -138,6 +144,7 @@ export declare class Parser {
138
144
  private previous;
139
145
  private consume;
140
146
  private addError;
147
+ private synchronizeToCommandBoundary;
141
148
  private parseAttributeOrArrayLiteral;
142
149
  private getPosition;
143
150
  getContext(): import('./parser-types').ParserContext;
@@ -0,0 +1,42 @@
1
+ import type { Token } from '../types/core';
2
+ import type { ASTNode } from '../types/base-types';
3
+ export type BindingPower = [left: number, right: number];
4
+ export type PrefixHandler = (token: Token, ctx: PrattContext) => ASTNode;
5
+ export type InfixHandler = (left: ASTNode, token: Token, ctx: PrattContext) => ASTNode;
6
+ export interface BindingPowerEntry {
7
+ prefix?: {
8
+ bp: number;
9
+ handler: PrefixHandler;
10
+ };
11
+ infix?: {
12
+ bp: BindingPower;
13
+ handler: InfixHandler;
14
+ };
15
+ }
16
+ export type BindingPowerFragment = Map<string, BindingPowerEntry>;
17
+ export interface PrattContext {
18
+ peek(): Token | undefined;
19
+ advance(): Token;
20
+ parseExpr(minBp: number): ASTNode;
21
+ isStopToken(): boolean;
22
+ atEnd(): boolean;
23
+ }
24
+ export declare const STOP_TOKENS: Set<string>;
25
+ export declare const STOP_DELIMITERS: Set<string>;
26
+ export declare function mergeFragments(...fragments: BindingPowerFragment[]): BindingPowerFragment;
27
+ export declare function createPrattParser(table: BindingPowerFragment, parsePrimary: PrefixHandler): (tokens: Token[], pos: {
28
+ value: number;
29
+ }, minBp?: number) => ASTNode;
30
+ export declare function binaryHandler(left: ASTNode, token: Token, ctx: PrattContext): ASTNode;
31
+ export declare function unaryHandler(token: Token, ctx: PrattContext): ASTNode;
32
+ export declare function leftAssoc(bp: number, handler?: InfixHandler): Pick<BindingPowerEntry, 'infix'>;
33
+ export declare function rightAssoc(bp: number, handler?: InfixHandler): Pick<BindingPowerEntry, 'infix'>;
34
+ export declare function prefix(bp: number, handler?: PrefixHandler): Pick<BindingPowerEntry, 'prefix'>;
35
+ export declare const CORE_FRAGMENT: BindingPowerFragment;
36
+ export declare const POSITIONAL_FRAGMENT: BindingPowerFragment;
37
+ export declare const PROPERTY_FRAGMENT: BindingPowerFragment;
38
+ export declare const PARSER_COMPARISON_FRAGMENT: BindingPowerFragment;
39
+ export declare const ASSIGNMENT_FRAGMENT: BindingPowerFragment;
40
+ export declare const FULL_TABLE: BindingPowerFragment;
41
+ export declare const PARSER_TABLE: BindingPowerFragment;
42
+ //# sourceMappingURL=pratt-parser.d.ts.map
@@ -1,9 +1,8 @@
1
1
  import type { ASTNode, Token } from '../types/core';
2
- import type { TokenType } from './tokenizer';
3
2
  export interface ParserInterface {
4
3
  isAtEnd(): boolean;
5
4
  check(value: string): boolean;
6
- checkTokenType(type: TokenType): boolean;
5
+ checkTokenType(type: string): boolean;
7
6
  advance(): Token;
8
7
  peek(): Token;
9
8
  parsePrimary(): ASTNode;
@@ -12,39 +12,6 @@ export declare enum TokenKind {
12
12
  SYMBOL = "symbol",
13
13
  UNKNOWN = "unknown"
14
14
  }
15
- export declare function getTokenKind(tokenType: TokenType): TokenKind;
16
- export declare enum TokenType {
17
- KEYWORD = "keyword",
18
- COMMAND = "command",
19
- EXPRESSION = "expression",
20
- STRING = "string",
21
- NUMBER = "number",
22
- BOOLEAN = "boolean",
23
- TEMPLATE_LITERAL = "template_literal",
24
- CSS_SELECTOR = "css_selector",
25
- ID_SELECTOR = "id_selector",
26
- CLASS_SELECTOR = "class_selector",
27
- QUERY_REFERENCE = "query_reference",
28
- CONTEXT_VAR = "context_var",
29
- GLOBAL_VAR = "global_var",
30
- EVENT = "event",
31
- OPERATOR = "operator",
32
- LOGICAL_OPERATOR = "logical_operator",
33
- COMPARISON_OPERATOR = "comparison_operator",
34
- TIME_EXPRESSION = "time_expression",
35
- OBJECT_LITERAL = "object_literal",
36
- ARRAY_LITERAL = "array_literal",
37
- SYMBOL = "symbol",
38
- COMMENT = "comment",
39
- IDENTIFIER = "identifier",
40
- UNKNOWN = "unknown"
41
- }
42
- export declare function enableDeferredClassification(): void;
43
- export declare function disableDeferredClassification(): void;
44
- export declare function isDeferredClassificationEnabled(): boolean;
45
- export declare function enableDualOutput(): void;
46
- export declare function disableDualOutput(): void;
47
- export declare function isDualOutputEnabled(): boolean;
48
15
  export interface Tokenizer {
49
16
  input: string;
50
17
  position: number;
@@ -3592,33 +3592,6 @@ var TokenKind;
3592
3592
  TokenKind["SYMBOL"] = "symbol";
3593
3593
  TokenKind["UNKNOWN"] = "unknown";
3594
3594
  })(TokenKind || (TokenKind = {}));
3595
- var TokenType;
3596
- (function (TokenType) {
3597
- TokenType["KEYWORD"] = "keyword";
3598
- TokenType["COMMAND"] = "command";
3599
- TokenType["EXPRESSION"] = "expression";
3600
- TokenType["STRING"] = "string";
3601
- TokenType["NUMBER"] = "number";
3602
- TokenType["BOOLEAN"] = "boolean";
3603
- TokenType["TEMPLATE_LITERAL"] = "template_literal";
3604
- TokenType["CSS_SELECTOR"] = "css_selector";
3605
- TokenType["ID_SELECTOR"] = "id_selector";
3606
- TokenType["CLASS_SELECTOR"] = "class_selector";
3607
- TokenType["QUERY_REFERENCE"] = "query_reference";
3608
- TokenType["CONTEXT_VAR"] = "context_var";
3609
- TokenType["GLOBAL_VAR"] = "global_var";
3610
- TokenType["EVENT"] = "event";
3611
- TokenType["OPERATOR"] = "operator";
3612
- TokenType["LOGICAL_OPERATOR"] = "logical_operator";
3613
- TokenType["COMPARISON_OPERATOR"] = "comparison_operator";
3614
- TokenType["TIME_EXPRESSION"] = "time_expression";
3615
- TokenType["OBJECT_LITERAL"] = "object_literal";
3616
- TokenType["ARRAY_LITERAL"] = "array_literal";
3617
- TokenType["SYMBOL"] = "symbol";
3618
- TokenType["COMMENT"] = "comment";
3619
- TokenType["IDENTIFIER"] = "identifier";
3620
- TokenType["UNKNOWN"] = "unknown";
3621
- })(TokenType || (TokenType = {}));
3622
3595
 
3623
3596
  class PerformanceTracker {
3624
3597
  constructor() {
@@ -3590,33 +3590,6 @@ var TokenKind;
3590
3590
  TokenKind["SYMBOL"] = "symbol";
3591
3591
  TokenKind["UNKNOWN"] = "unknown";
3592
3592
  })(TokenKind || (TokenKind = {}));
3593
- var TokenType;
3594
- (function (TokenType) {
3595
- TokenType["KEYWORD"] = "keyword";
3596
- TokenType["COMMAND"] = "command";
3597
- TokenType["EXPRESSION"] = "expression";
3598
- TokenType["STRING"] = "string";
3599
- TokenType["NUMBER"] = "number";
3600
- TokenType["BOOLEAN"] = "boolean";
3601
- TokenType["TEMPLATE_LITERAL"] = "template_literal";
3602
- TokenType["CSS_SELECTOR"] = "css_selector";
3603
- TokenType["ID_SELECTOR"] = "id_selector";
3604
- TokenType["CLASS_SELECTOR"] = "class_selector";
3605
- TokenType["QUERY_REFERENCE"] = "query_reference";
3606
- TokenType["CONTEXT_VAR"] = "context_var";
3607
- TokenType["GLOBAL_VAR"] = "global_var";
3608
- TokenType["EVENT"] = "event";
3609
- TokenType["OPERATOR"] = "operator";
3610
- TokenType["LOGICAL_OPERATOR"] = "logical_operator";
3611
- TokenType["COMPARISON_OPERATOR"] = "comparison_operator";
3612
- TokenType["TIME_EXPRESSION"] = "time_expression";
3613
- TokenType["OBJECT_LITERAL"] = "object_literal";
3614
- TokenType["ARRAY_LITERAL"] = "array_literal";
3615
- TokenType["SYMBOL"] = "symbol";
3616
- TokenType["COMMENT"] = "comment";
3617
- TokenType["IDENTIFIER"] = "identifier";
3618
- TokenType["UNKNOWN"] = "unknown";
3619
- })(TokenType || (TokenType = {}));
3620
3593
 
3621
3594
  class PerformanceTracker {
3622
3595
  constructor() {
@@ -30,6 +30,7 @@ export declare class RuntimeBase {
30
30
  protected cleanupRegistry: CleanupRegistry;
31
31
  private autoCleanupObserver;
32
32
  protected registryIntegration: RegistryIntegration | null;
33
+ protected runtimeWarnings: string[];
33
34
  constructor(options: RuntimeBaseOptions);
34
35
  private setupAutoCleanup;
35
36
  registerHooks(name: string, hooks: RuntimeHooks): void;
@@ -39,6 +40,8 @@ export declare class RuntimeBase {
39
40
  cleanupTree(element: Element): number;
40
41
  getCleanupStats(): ReturnType<CleanupRegistry['getStats']>;
41
42
  destroy(): void;
43
+ private hasErrorDiagnostics;
44
+ getWarnings(): readonly string[];
42
45
  execute(node: ASTNode, context: ExecutionContext): Promise<unknown>;
43
46
  protected processCommand(node: CommandNode, context: ExecutionContext): Promise<unknown>;
44
47
  protected toSignal(error: unknown): ExecutionSignal | null;
@@ -86,6 +86,16 @@ export interface ParseError {
86
86
  readonly position?: number;
87
87
  readonly source?: string;
88
88
  }
89
+ export type ParseDiagnosticSeverity = 'error' | 'warning' | 'info';
90
+ export interface ParseDiagnostic {
91
+ readonly message: string;
92
+ readonly severity: ParseDiagnosticSeverity;
93
+ readonly code?: string;
94
+ readonly line?: number;
95
+ readonly column?: number;
96
+ readonly source?: string;
97
+ readonly suggestions?: readonly string[];
98
+ }
89
99
  export interface ASTNode {
90
100
  readonly type: string;
91
101
  readonly line?: number;
@@ -93,6 +103,7 @@ export interface ASTNode {
93
103
  readonly start?: number;
94
104
  readonly end?: number;
95
105
  readonly raw?: string;
106
+ readonly diagnostics?: readonly ParseDiagnostic[];
96
107
  [key: string]: unknown;
97
108
  }
98
109
  export interface EnhancedError {
@@ -119,6 +119,7 @@ export interface ParseResult<T = ASTNode> {
119
119
  node?: T;
120
120
  ast?: T;
121
121
  error?: ParseError;
122
+ errors?: ParseError[];
122
123
  warnings?: ParseWarning[];
123
124
  tokens: Token[];
124
125
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperfixi/core",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "description": "Multilingual, tree-shakeable hyperscript",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -143,6 +143,11 @@
143
143
  "types": "./dist/ast-utils/index.d.ts",
144
144
  "import": "./dist/ast-utils/index.mjs",
145
145
  "require": "./dist/ast-utils/index.js"
146
+ },
147
+ "./lse": {
148
+ "types": "./dist/lse/index.d.ts",
149
+ "import": "./dist/lse/index.mjs",
150
+ "require": "./dist/lse/index.js"
146
151
  }
147
152
  },
148
153
  "files": [
@@ -224,7 +229,7 @@
224
229
  "@rollup/plugin-commonjs": "^28.0.9",
225
230
  "@rollup/plugin-node-resolve": "^16.0.3",
226
231
  "@rollup/plugin-replace": "^6.0.3",
227
- "@rollup/plugin-terser": "^0.4.4",
232
+ "@rollup/plugin-terser": "^1.0.0",
228
233
  "@rollup/plugin-typescript": "^12.3.0",
229
234
  "@typescript-eslint/eslint-plugin": "^6.21.0",
230
235
  "@typescript-eslint/parser": "^6.21.0",
@@ -279,11 +284,15 @@
279
284
  "tslib": "^2.8.1"
280
285
  },
281
286
  "peerDependencies": {
282
- "@hyperfixi/patterns-reference": "*"
287
+ "@hyperfixi/patterns-reference": "*",
288
+ "@lokascript/framework": "*"
283
289
  },
284
290
  "peerDependenciesMeta": {
285
291
  "@hyperfixi/patterns-reference": {
286
292
  "optional": true
293
+ },
294
+ "@lokascript/framework": {
295
+ "optional": true
287
296
  }
288
297
  },
289
298
  "directories": {