Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 52cc01e

Browse files
committed
Use templates and handlebars to generate entry files
1 parent 68eb9d9 commit 52cc01e

2 files changed

Lines changed: 91 additions & 97 deletions

File tree

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@
134134
"glob": "7.1.3",
135135
"gulp": "4.0.1",
136136
"gulp-babel": "8.0.0",
137+
"handlebars": "4.1.2",
137138
"istanbul": "0.4.5",
138139
"jsep": "0.3.4",
139140
"karma": "4.1.0",

tools/entryGenerator.js

Lines changed: 90 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,9 @@
11
const fs = require('fs')
22
const path = require('path')
3+
const Handlebars = require('handlebars')
34

45
const 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-
167
const 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+
2443
exports.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
5268
function 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

151144
function getDependenciesName (factoryName, factories) {

0 commit comments

Comments
 (0)