11#!/usr/bin/env node
22
33import _hyperscript from '../_hyperscript.js' ;
4- import { Parser } from '../core/parser.js' ;
5- import { Feature } from '../parsetree/base.js' ;
64import fs from 'node:fs' ;
75import path from 'node:path' ;
86import { createRequire } from 'node:module' ;
@@ -23,47 +21,34 @@ function run(modulePath) {
2321 . catch ( e => console . error ( "Cannot execute file:" , e ) ) ;
2422}
2523
26- class RequireFeature extends Feature {
27- static keyword = "require" ;
28-
29- constructor ( id , name ) {
30- super ( ) ;
31- this . moduleId = id ;
32- this . moduleName = name ;
33- }
34-
35- static parse ( parser ) {
36- if ( ! parser . matchToken ( "require" ) ) return ;
37- var id = parser . requireElement ( "nakedString" ) . evalStatically ( ) ;
38- var name ;
39- if ( parser . matchToken ( "as" ) ) {
40- name = parser . requireTokenType ( "IDENTIFIER" ) . value ;
41- } else {
42- name = path . basename ( id ) . replace ( / \. [ ^ . ] * $ / , '' ) ;
43- }
44- return new RequireFeature ( id , name ) ;
24+ _hyperscript . addFeature ( "require" , function parseRequire ( parser ) {
25+ if ( ! parser . matchToken ( "require" ) ) return ;
26+ const id = parser . requireElement ( "nakedString" ) . evalStatically ( ) ;
27+ let name ;
28+ if ( parser . matchToken ( "as" ) ) {
29+ name = parser . requireTokenType ( "IDENTIFIER" ) . value ;
30+ } else {
31+ name = path . basename ( id ) . replace ( / \. [ ^ . ] * $ / , '' ) ;
4532 }
46-
47- install ( target , source , args , runtime ) {
48- var id = this . moduleId ;
49- if ( id . startsWith ( './' ) || id . startsWith ( '../' ) ) {
50- id = path . join ( args . module . dir , id ) ;
51- }
52-
53- var mod ;
54- if ( id . endsWith ( hsExt ) ) {
55- mod = run ( id ) ;
56- } else if ( fs . existsSync ( id + hsExt ) ) {
57- mod = run ( id + hsExt ) ;
58- } else {
59- var nodeRequire = createRequire ( args . module . id ) ;
60- mod = nodeRequire ( id ) ;
33+ return {
34+ install ( target , source , args , runtime ) {
35+ let resolved = id ;
36+ if ( resolved . startsWith ( './' ) || resolved . startsWith ( '../' ) ) {
37+ resolved = path . join ( args . module . dir , resolved ) ;
38+ }
39+ let mod ;
40+ if ( resolved . endsWith ( hsExt ) ) {
41+ mod = run ( resolved ) ;
42+ } else if ( fs . existsSync ( resolved + hsExt ) ) {
43+ mod = run ( resolved + hsExt ) ;
44+ } else {
45+ const nodeRequire = createRequire ( args . module . id ) ;
46+ mod = nodeRequire ( resolved ) ;
47+ }
48+ runtime . assignToNamespace ( target , [ ] , name , mod ) ;
6149 }
62- runtime . assignToNamespace ( target , [ ] , this . moduleName , mod ) ;
63- }
64- }
65-
66- _hyperscript . addFeature ( RequireFeature . keyword , RequireFeature . parse . bind ( RequireFeature ) ) ;
50+ } ;
51+ } ) ;
6752
6853// ===== Validate mode =====
6954
0 commit comments