1+ #!/usr/bin/env node
2+
3+ const fs = require ( 'fs' ) ;
4+ const path = require ( 'path' ) ;
5+ const { execSync } = require ( 'child_process' ) ;
6+
7+ // Configuration
8+ const PASSPORT_ROOT = './sample/Assets/Scripts/Passport' ;
9+ const OUTPUT_DIR = './_parsed' ;
10+ const OUTPUT_FILE = path . join ( OUTPUT_DIR , 'passport-features.json' ) ;
11+ const FEATURES_JSON_PATH = path . join ( PASSPORT_ROOT , 'features.json' ) ;
12+
13+ // Ensure output directory exists
14+ if ( ! fs . existsSync ( OUTPUT_DIR ) ) {
15+ fs . mkdirSync ( OUTPUT_DIR , { recursive : true } ) ;
16+ }
17+
18+ console . log ( 'Processing Passport features metadata...' ) ;
19+
20+ // Load features.json to map script files to feature names
21+ let featuresMap = { } ;
22+ try {
23+ const featuresContent = fs . readFileSync ( FEATURES_JSON_PATH , 'utf8' ) ;
24+ const featuresJson = JSON . parse ( featuresContent ) ;
25+
26+ // Create mapping of script filename to feature name
27+ featuresJson . features . forEach ( feature => {
28+ const [ featureName , scriptFile ] = Object . entries ( feature ) [ 0 ] ;
29+ featuresMap [ scriptFile ] = featureName ;
30+ } ) ;
31+ } catch ( error ) {
32+ console . error ( `Error reading features.json: ${ error . message } ` ) ;
33+ process . exit ( 1 ) ;
34+ }
35+
36+ // Find all metadata.json files
37+ const findMetadataFiles = ( ) => {
38+ const result = execSync ( `find "${ PASSPORT_ROOT } " -name "metadata.json" -type f` ) . toString ( ) . trim ( ) ;
39+ return result . split ( '\n' ) . filter ( Boolean ) ;
40+ } ;
41+
42+ // Process metadata files
43+ const processMetadataFiles = ( metadataFiles ) => {
44+ const features = [ ] ;
45+
46+ metadataFiles . forEach ( metadataFile => {
47+ console . log ( `Processing ${ metadataFile } ` ) ;
48+
49+ // Extract feature directory
50+ const featureDir = path . dirname ( metadataFile ) ;
51+
52+ // Find script file in this directory
53+ let featureName = '' ;
54+ try {
55+ const dirFiles = fs . readdirSync ( featureDir ) ;
56+ const scriptFiles = dirFiles . filter ( file => file . endsWith ( '.cs' ) ) ;
57+
58+ if ( scriptFiles . length > 0 ) {
59+ // Look up the feature name in featuresMap
60+ const scriptFile = scriptFiles [ 0 ] ;
61+ featureName = featuresMap [ scriptFile ] || '' ;
62+ }
63+
64+ // If not found in features.json, fallback to directory name
65+ if ( ! featureName ) {
66+ console . warn ( `Feature for script in ${ featureDir } not found in features.json, using directory name` ) ;
67+ featureName = path . basename ( featureDir ) ;
68+ }
69+ } catch ( error ) {
70+ console . warn ( `Error processing directory ${ featureDir } : ${ error . message } ` ) ;
71+ featureName = path . basename ( featureDir ) ;
72+ }
73+
74+ console . log ( `Feature name: ${ featureName } ` ) ;
75+
76+ // Read and process metadata
77+ try {
78+ const metadataContent = fs . readFileSync ( metadataFile , 'utf8' ) ;
79+ const metadata = JSON . parse ( metadataContent ) ;
80+
81+ // Add feature name to metadata
82+ metadata . name = featureName ;
83+ features . push ( metadata ) ;
84+ } catch ( error ) {
85+ console . error ( `Error processing metadata file ${ metadataFile } : ${ error . message } ` ) ;
86+ }
87+ } ) ;
88+
89+ return features ;
90+ } ;
91+
92+ // Main execution
93+ const metadataFiles = findMetadataFiles ( ) ;
94+ const features = processMetadataFiles ( metadataFiles ) ;
95+
96+ // Create the final passport-features.json
97+ const passportFeatures = { features } ;
98+ fs . writeFileSync ( OUTPUT_FILE , JSON . stringify ( passportFeatures , null , 2 ) ) ;
99+
100+ console . log ( `Created ${ OUTPUT_FILE } ` ) ;
0 commit comments