11const fs = require ( 'fs' )
22const path = require ( 'path' )
3+ const Handlebars = require ( 'handlebars' )
34
45const ENTRY_FOLDER = path . join ( __dirname , '../src/entry' )
56
6- const FACTORIES_ANY_LINK = '../factoriesAny.js'
7- const ALL_ANY_LINK = './allFactoriesAny.js'
8- const DEPENDENCIES_ANY_INDEX = 'dependenciesAny.generated.js'
9- const DEPENDENCIES_ANY_FOLDER = 'dependenciesAny'
10-
11- const FACTORIES_NUMBER_LINK = '../factoriesNumber.js'
12- const ALL_NUMBER_LINK = './allFactoriesNumber.js'
13- const DEPENDENCIES_NUMBER_INDEX = 'dependenciesNumber.generated.js'
14- const DEPENDENCIES_NUMBER_FOLDER = 'dependenciesNumber'
15-
167const IGNORED_DEPENDENCIES = {
178 'on' : true ,
189 'config' : true ,
@@ -21,41 +12,63 @@ const IGNORED_DEPENDENCIES = {
2112 'classes' : true
2213}
2314
15+ const dependenciesIndexTemplate = Handlebars . compile ( `/**
16+ * THIS FILE IS AUTO-GENERATED
17+ * DON'T MAKE CHANGES HERE
18+ */
19+ {{#factories}}
20+ export { {{name}} } from '{{fileName}}'{{eslintComment}}
21+ {{/factories}}
22+
23+ export { all } from './allFactories{{suffix}}.js'
24+ ` )
25+
26+ const dependenciesFileTemplate = Handlebars . compile ( `/**
27+ * THIS FILE IS AUTO-GENERATED
28+ * DON'T MAKE CHANGES HERE
29+ */
30+ {{#dependencies}}
31+ import { {{name}} } from '{{fileName}}'
32+ {{/dependencies}}
33+ import { {{factoryName}} } from '../../factories{{suffix}}.js'{{eslintComment}}
34+
35+ export const {{name}} = {{braceOpen}}{{eslintComment}}
36+ {{#dependencies}}
37+ {{name}},
38+ {{/dependencies}}
39+ {{factoryName}}
40+ }
41+ ` )
42+
2443exports . generateEntryFiles = function ( ) {
2544 const factoriesAny = require ( '../lib/factoriesAny' )
2645 const factoriesNumber = require ( '../lib/factoriesNumber' )
2746
2847 generateIndexFile ( {
48+ suffix : 'Any' ,
2949 factories : factoriesAny ,
30- factoriesLink : FACTORIES_ANY_LINK ,
31- allLink : ALL_ANY_LINK ,
32- entryFolder : ENTRY_FOLDER ,
33- dependenciesFolder : DEPENDENCIES_ANY_FOLDER ,
34- dependenciesIndexFile : DEPENDENCIES_ANY_INDEX
50+ entryFolder : ENTRY_FOLDER
3551 } )
3652
3753 generateIndexFile ( {
54+ suffix : 'Number' ,
3855 factories : factoriesNumber ,
39- factoriesLink : FACTORIES_NUMBER_LINK ,
40- allLink : ALL_NUMBER_LINK ,
41- entryFolder : ENTRY_FOLDER ,
42- dependenciesFolder : DEPENDENCIES_NUMBER_FOLDER ,
43- dependenciesIndexFile : DEPENDENCIES_NUMBER_INDEX
56+ entryFolder : ENTRY_FOLDER
4457 } )
4558}
4659
60+ exports . generateEntryFiles ( ) // TODO: cleanup
61+
4762/**
4863 * Generate the following index files
4964 * dependenciesAny.js
5065 * dependenciesNumber.js
5166 */
67+ // TODO: refactor this function: create template files and fill these in
5268function generateIndexFile ( {
69+ suffix,
5370 factories,
54- factoriesLink,
55- allLink,
56- entryFolder,
57- dependenciesFolder,
58- dependenciesIndexFile
71+ entryFolder
5972} ) {
6073 // a map containing:
6174 // {
@@ -69,83 +82,63 @@ function generateIndexFile ({
6982 exists [ factory . fn ] = true
7083 } )
7184
72- // TODO: create template files and fill these in
73- const header = '/**\n' +
74- ' * THIS FILE IS AUTO-GENERATED\n' +
75- ' * DON\'T MAKE CHANGES HERE\n' +
76- ' */\n'
77-
78- mkdirSyncIfNotExists ( path . join ( entryFolder , dependenciesFolder ) )
79-
80- // for each factory, create a separate file
81- Object . keys ( factories ) . map ( ( factoryName ) => {
82- const factory = factories [ factoryName ]
83- // const transform = factory.meta && factory.meta.isTransformFunction ? 'Transform' : ''
84- const eslint = factory . fn === 'SQRT1_2' ? ' // eslint-disable-line camelcase' : ''
85- // const name = factory.fn + transform + 'Dependencies'
86- const name = getDependenciesName ( factoryName , factories )
87- const fileName = getDependenciesFileName ( factoryName )
88-
89- const filteredDependencies = factory . dependencies
90- . map ( stripOptionalNotation )
91- . filter ( dependency => ! IGNORED_DEPENDENCIES [ dependency ] )
92- . filter ( dependency => {
93- if ( ! exists [ dependency ] ) {
94- if ( factory . dependencies . indexOf ( dependency ) !== - 1 ) {
95- throw new Error ( `Required dependency "${ dependency } " missing for factory "${ factory . fn } "` )
96- }
97-
98- return false
99- }
100-
101- return true
102- } )
103-
104- // add header
105- let src = header
106-
107- // imports
108- filteredDependencies . forEach ( dependency => {
109- // const name = dependency + 'Dependencies'
110- const factoryName = findFactoryName ( factories , dependency )
111- const name = getDependenciesName ( factoryName , factories )
112- const fileName = getDependenciesFileName ( factoryName )
113- src += `import { ${ name } } from './${ fileName } .generated'\n`
114- } )
115- src += `import { ${ factoryName } } from '../${ factoriesLink } '${ eslint } \n`
116- src += '\n'
117-
118- // exports
119- src += 'export const ' + name + ' = {' + eslint + '\n'
120- filteredDependencies . forEach ( dependency => {
121- const name = getDependenciesName ( findFactoryName ( factories , dependency ) , factories )
122- src += ' ' + name + ',\n'
85+ mkdirSyncIfNotExists ( path . join ( entryFolder , 'dependencies' + suffix ) )
86+
87+ const data = {
88+ suffix,
89+ factories : Object . keys ( factories ) . map ( ( factoryName ) => {
90+ const factory = factories [ factoryName ]
91+
92+ return {
93+ suffix,
94+ factoryName,
95+ braceOpen : '{' ,
96+ name : getDependenciesName ( factoryName , factories ) ,
97+ fileName : './dependencies' + suffix + '/' + getDependenciesFileName ( factoryName ) + '.generated' ,
98+ eslintComment : factoryName === 'createSQRT1_2'
99+ ? ' // eslint-disable-line camelcase'
100+ : undefined ,
101+
102+ dependencies : factory . dependencies
103+ . map ( stripOptionalNotation )
104+ . filter ( dependency => ! IGNORED_DEPENDENCIES [ dependency ] )
105+ . filter ( dependency => {
106+ if ( ! exists [ dependency ] ) {
107+ if ( factory . dependencies . indexOf ( dependency ) !== - 1 ) {
108+ throw new Error ( `Required dependency "${ dependency } " missing for factory "${ factory . fn } "` )
109+ }
110+
111+ return false
112+ }
113+
114+ return true
115+ } )
116+ . map ( dependency => {
117+ const factoryName = findFactoryName ( factories , dependency )
118+ const name = getDependenciesName ( factoryName , factories )
119+ const fileName = './' + getDependenciesFileName ( factoryName ) + '.generated'
120+
121+ return {
122+ suffix,
123+ name,
124+ fileName
125+ }
126+ } )
127+ }
123128 } )
124- src += ' ' + factoryName + '\n'
125- src += '}\n'
126-
127- const p = path . join ( entryFolder , dependenciesFolder , fileName + '.generated.js' )
128- fs . writeFileSync ( p , src )
129- } )
130-
131- // create one index file linking to all dependencies files
132- let src = header
129+ }
133130
134- Object . keys ( factories ) . map ( ( factoryName ) => {
135- // const factory = factories[factoryName]
136- // const transform = factory.meta && factory.meta.isTransformFunction ? 'Transform' : ''
137- const eslint = factoryName === 'createSQRT1_2' ? ' // eslint-disable-line camelcase' : ''
138- // const name = factory.fn + transform + 'Dependencies'
139- const name = getDependenciesName ( factoryName , factories )
140- const fileName = getDependenciesFileName ( factoryName )
131+ // generate a file for every dependency
132+ data . factories . forEach ( factoryData => {
133+ const generatedFactory = dependenciesFileTemplate ( factoryData )
141134
142- src += `export { ${ name } } from './${ dependenciesFolder } /${ fileName } .generated'${ eslint } \n`
135+ const p = path . join ( entryFolder , factoryData . fileName + '.js' )
136+ fs . writeFileSync ( p , generatedFactory )
143137 } )
144138
145- src += '\n'
146- src += 'export { all } from \'' + allLink + '\'\n'
147-
148- fs . writeFileSync ( path . join ( entryFolder , dependenciesIndexFile ) , src )
139+ // generate a file with links to all dependencies
140+ const generated = dependenciesIndexTemplate ( data )
141+ fs . writeFileSync ( path . join ( entryFolder , 'dependencies' + suffix + '.generated.js' ) , generated )
149142}
150143
151144function getDependenciesName ( factoryName , factories ) {
0 commit comments