mirror of
https://github.com/actions/configure-pages.git
synced 2026-03-30 10:04:52 +00:00
Merge pull request #38 from actions/support-wrapped-exports
Support wrapped exports
This commit is contained in:
217
dist/index.js
vendored
217
dist/index.js
vendored
@@ -15271,7 +15271,7 @@ Pages's path based routing (and work).
|
|||||||
|
|
||||||
Supported configuration initializations:
|
Supported configuration initializations:
|
||||||
|
|
||||||
(1) Default export:
|
(1) Direct default export:
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
// configuration object here
|
// configuration object here
|
||||||
@@ -15283,19 +15283,69 @@ Supported configuration initializations:
|
|||||||
// configuration object here
|
// configuration object here
|
||||||
}
|
}
|
||||||
|
|
||||||
(3) Indirect module export:
|
(3) Indirect default export:
|
||||||
|
|
||||||
const config = // configuration object here
|
const config = {
|
||||||
|
// configuration object here
|
||||||
|
}
|
||||||
|
export default config
|
||||||
|
|
||||||
|
(4) Indirect module export:
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
// configuration object here
|
||||||
|
}
|
||||||
module.exports = config
|
module.exports = config
|
||||||
|
|
||||||
|
(5) Direct default export with wrapping call:
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
// configuration object here
|
||||||
|
})
|
||||||
|
|
||||||
|
(6) Direct module export with wrapping call:
|
||||||
|
|
||||||
|
module.exports = defineConfig({
|
||||||
|
// configuration object here
|
||||||
|
})
|
||||||
|
|
||||||
|
(7) Indirect default export with wrapping call at the definition:
|
||||||
|
|
||||||
|
const config = defineConfig({
|
||||||
|
// configuration object here
|
||||||
|
})
|
||||||
|
export default config
|
||||||
|
|
||||||
|
(8) Indirect default export with wrapping call at the export:
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
// configuration object here
|
||||||
|
}
|
||||||
|
export default defineConfig(config)
|
||||||
|
|
||||||
|
(9) Indirect module export with wrapping call at the definition:
|
||||||
|
|
||||||
|
const config = defineConfig({
|
||||||
|
// configuration object here
|
||||||
|
})
|
||||||
|
module.exports = config
|
||||||
|
|
||||||
|
(10) Indirect module export with wrapping call at the export:
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
// configuration object here
|
||||||
|
}
|
||||||
|
module.exports = defineConfig(config)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class ConfigParser {
|
class ConfigParser {
|
||||||
// Ctor
|
// Ctor
|
||||||
// - configurationFile: path to the configuration file
|
// - configurationFile: path to the configuration file
|
||||||
// - blankConfigurationFile: a blank configuration file to use if non was previously found
|
// - blankConfigurationFile: a blank configuration file to use if non was previously found
|
||||||
constructor({ configurationFile, blankConfigurationFile, properties }) {
|
constructor({ configurationFile, blankConfigurationFile, allowWrappingCall = false, properties }) {
|
||||||
// Save field
|
// Save field
|
||||||
this.configurationFile = configurationFile
|
this.configurationFile = configurationFile
|
||||||
|
this.allowWrappingCall = allowWrappingCall === true
|
||||||
this.properties = properties
|
this.properties = properties
|
||||||
|
|
||||||
// If the configuration file does not exist, initialize it with the blank configuration file
|
// If the configuration file does not exist, initialize it with the blank configuration file
|
||||||
@@ -15311,12 +15361,43 @@ class ConfigParser {
|
|||||||
this.configuration = fs.readFileSync(this.configurationFile, 'utf8')
|
this.configuration = fs.readFileSync(this.configurationFile, 'utf8')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
findTopLevelVariableDeclarator(ast, identifierName) {
|
||||||
|
let targetDeclarator
|
||||||
|
ast.body.find(
|
||||||
|
node =>
|
||||||
|
node.type === 'VariableDeclaration' &&
|
||||||
|
node.declarations &&
|
||||||
|
node.declarations.length > 0 &&
|
||||||
|
node.declarations.find(declarator => {
|
||||||
|
if (
|
||||||
|
declarator.type === 'VariableDeclarator' &&
|
||||||
|
declarator.id &&
|
||||||
|
declarator.id.type === 'Identifier' &&
|
||||||
|
declarator.id.name === identifierName
|
||||||
|
) {
|
||||||
|
targetDeclarator = declarator
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
return targetDeclarator
|
||||||
|
}
|
||||||
|
|
||||||
// Find the configuration object in an AST.
|
// Find the configuration object in an AST.
|
||||||
// Look for a default export, a direct module export or an indirect module
|
// Look for, in order:
|
||||||
// export (in that order).
|
// - a direct default export
|
||||||
|
// - a direct default export with a wrapping call
|
||||||
|
// - an indirect default export
|
||||||
|
// - an indirect default export with a wrapping call at the definition
|
||||||
|
// - an indirect default export with a wrapping call at the export
|
||||||
|
// - a direct module export
|
||||||
|
// - a direct module export with a wrapping call
|
||||||
|
// - an indirect module export
|
||||||
|
// - an indirect module export with a wrapping call at the definition
|
||||||
|
// - an indirect module export with a wrapping call at the export
|
||||||
//
|
//
|
||||||
// Return the configuration object or null.
|
// Return the configuration object or null.
|
||||||
findConfigurationObject(ast) {
|
findConfigurationObject(ast, allowWrappingCall = false) {
|
||||||
// Try to find a default export
|
// Try to find a default export
|
||||||
var defaultExport = ast.body.find(node => node.type === 'ExportDefaultDeclaration')
|
var defaultExport = ast.body.find(node => node.type === 'ExportDefaultDeclaration')
|
||||||
|
|
||||||
@@ -15326,21 +15407,61 @@ class ConfigParser {
|
|||||||
return defaultExport.declaration
|
return defaultExport.declaration
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Direct default export with a wrapping call
|
||||||
|
else if (
|
||||||
|
allowWrappingCall &&
|
||||||
|
defaultExport &&
|
||||||
|
defaultExport.declaration.type === 'CallExpression' &&
|
||||||
|
defaultExport.declaration.arguments.length > 0 &&
|
||||||
|
defaultExport.declaration.arguments[0] &&
|
||||||
|
defaultExport.declaration.arguments[0].type === 'ObjectExpression'
|
||||||
|
) {
|
||||||
|
core.info('Found configuration object in direct default export declaration with a wrapping call')
|
||||||
|
return defaultExport.declaration.arguments[0]
|
||||||
|
}
|
||||||
|
|
||||||
// Indirect default export
|
// Indirect default export
|
||||||
else if (defaultExport && defaultExport.declaration.type === 'Identifier') {
|
else if (defaultExport && defaultExport.declaration.type === 'Identifier') {
|
||||||
const identifierName = defaultExport.declaration.name
|
const identifierName = defaultExport.declaration.name
|
||||||
const identifierDefinition = ast.body.find(
|
const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
|
||||||
node =>
|
const identifierInitialization = identifierDeclarator && identifierDeclarator.init
|
||||||
node.type === 'VariableDeclaration' &&
|
if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
|
||||||
node.declarations.length == 1 &&
|
|
||||||
node.declarations[0].type === 'VariableDeclarator' &&
|
|
||||||
node.declarations[0].id.type === 'Identifier' &&
|
|
||||||
node.declarations[0].id.name === identifierName &&
|
|
||||||
node.declarations[0].init.type === 'ObjectExpression'
|
|
||||||
)
|
|
||||||
if (identifierDefinition) {
|
|
||||||
core.info('Found configuration object in indirect default export declaration')
|
core.info('Found configuration object in indirect default export declaration')
|
||||||
return identifierDefinition.declarations[0].init
|
return identifierInitialization
|
||||||
|
}
|
||||||
|
// Indirect default export with a wrapping call at the definition
|
||||||
|
else if (
|
||||||
|
allowWrappingCall &&
|
||||||
|
identifierInitialization &&
|
||||||
|
identifierInitialization.type === 'CallExpression' &&
|
||||||
|
identifierInitialization.arguments.length > 0 &&
|
||||||
|
identifierInitialization.arguments[0] &&
|
||||||
|
identifierInitialization.arguments[0].type === 'ObjectExpression'
|
||||||
|
) {
|
||||||
|
core.info(
|
||||||
|
'Found configuration object in indirect default export declaration with a wrapping call at the definition'
|
||||||
|
)
|
||||||
|
return identifierInitialization.arguments[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Indirect default export with a wrapping call at the export
|
||||||
|
else if (
|
||||||
|
allowWrappingCall &&
|
||||||
|
defaultExport &&
|
||||||
|
defaultExport.declaration.type === 'CallExpression' &&
|
||||||
|
defaultExport.declaration.arguments.length > 0 &&
|
||||||
|
defaultExport.declaration.arguments[0] &&
|
||||||
|
defaultExport.declaration.arguments[0].type === 'Identifier'
|
||||||
|
) {
|
||||||
|
const identifierName = defaultExport.declaration.arguments[0].name
|
||||||
|
const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
|
||||||
|
const identifierInitialization = identifierDeclarator && identifierDeclarator.init
|
||||||
|
if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
|
||||||
|
core.info(
|
||||||
|
'Found configuration object in indirect default export declaration with a wrapping call at the export'
|
||||||
|
)
|
||||||
|
return identifierInitialization
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -15363,21 +15484,57 @@ class ConfigParser {
|
|||||||
return moduleExport.expression.right
|
return moduleExport.expression.right
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Direct default export with a wrapping call
|
||||||
|
else if (
|
||||||
|
allowWrappingCall &&
|
||||||
|
moduleExport &&
|
||||||
|
moduleExport.expression.right.type === 'CallExpression' &&
|
||||||
|
moduleExport.expression.right.arguments.length > 0 &&
|
||||||
|
moduleExport.expression.right.arguments[0] &&
|
||||||
|
moduleExport.expression.right.arguments[0].type === 'ObjectExpression'
|
||||||
|
) {
|
||||||
|
core.info('Found configuration object in direct module export with a wrapping call')
|
||||||
|
return moduleExport.expression.right.arguments[0]
|
||||||
|
}
|
||||||
|
|
||||||
// Indirect module export
|
// Indirect module export
|
||||||
else if (moduleExport && moduleExport.expression.right.type === 'Identifier') {
|
else if (moduleExport && moduleExport.expression.right.type === 'Identifier') {
|
||||||
const identifierName = moduleExport && moduleExport.expression.right.name
|
const identifierName = moduleExport && moduleExport.expression.right.name
|
||||||
const identifierDefinition = ast.body.find(
|
const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
|
||||||
node =>
|
const identifierInitialization = identifierDeclarator && identifierDeclarator.init
|
||||||
node.type === 'VariableDeclaration' &&
|
if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
|
||||||
node.declarations.length == 1 &&
|
|
||||||
node.declarations[0].type === 'VariableDeclarator' &&
|
|
||||||
node.declarations[0].id.type === 'Identifier' &&
|
|
||||||
node.declarations[0].id.name === identifierName &&
|
|
||||||
node.declarations[0].init.type === 'ObjectExpression'
|
|
||||||
)
|
|
||||||
if (identifierDefinition) {
|
|
||||||
core.info('Found configuration object in indirect module export')
|
core.info('Found configuration object in indirect module export')
|
||||||
return identifierDefinition.declarations[0].init
|
return identifierInitialization
|
||||||
|
}
|
||||||
|
// Indirect module export with a wrapping call at the definition
|
||||||
|
else if (
|
||||||
|
allowWrappingCall &&
|
||||||
|
identifierInitialization &&
|
||||||
|
identifierInitialization.type === 'CallExpression' &&
|
||||||
|
identifierInitialization.arguments.length > 0 &&
|
||||||
|
identifierInitialization.arguments[0] &&
|
||||||
|
identifierInitialization.arguments[0].type === 'ObjectExpression'
|
||||||
|
) {
|
||||||
|
core.info('Found configuration object in indirect module export with a wrapping call at the definition')
|
||||||
|
return identifierInitialization.arguments[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Indirect module export with a wrapping call at the export
|
||||||
|
else if (
|
||||||
|
allowWrappingCall &&
|
||||||
|
moduleExport &&
|
||||||
|
moduleExport.expression.right.type === 'CallExpression' &&
|
||||||
|
moduleExport.expression.right.arguments.length > 0 &&
|
||||||
|
moduleExport.expression.right.arguments[0] &&
|
||||||
|
moduleExport.expression.right.arguments[0].type === 'Identifier'
|
||||||
|
) {
|
||||||
|
const identifierName = moduleExport.expression.right.arguments[0].name
|
||||||
|
const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
|
||||||
|
const identifierInitialization = identifierDeclarator && identifierDeclarator.init
|
||||||
|
if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
|
||||||
|
core.info('Found configuration object in indirect module export declaration with a wrapping call at the export')
|
||||||
|
return identifierInitialization
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -15441,7 +15598,7 @@ class ConfigParser {
|
|||||||
const ast = espree.parse(this.configuration, espreeOptions)
|
const ast = espree.parse(this.configuration, espreeOptions)
|
||||||
|
|
||||||
// Find the configuration object
|
// Find the configuration object
|
||||||
var configurationObject = this.findConfigurationObject(ast)
|
var configurationObject = this.findConfigurationObject(ast, this.allowWrappingCall)
|
||||||
if (!configurationObject) {
|
if (!configurationObject) {
|
||||||
throw 'Could not find a configuration object in the configuration file'
|
throw 'Could not find a configuration object in the configuration file'
|
||||||
}
|
}
|
||||||
|
|||||||
2
dist/index.js.map
vendored
2
dist/index.js.map
vendored
File diff suppressed because one or more lines are too long
@@ -9,7 +9,7 @@ Pages's path based routing (and work).
|
|||||||
|
|
||||||
Supported configuration initializations:
|
Supported configuration initializations:
|
||||||
|
|
||||||
(1) Default export:
|
(1) Direct default export:
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
// configuration object here
|
// configuration object here
|
||||||
@@ -21,19 +21,69 @@ Supported configuration initializations:
|
|||||||
// configuration object here
|
// configuration object here
|
||||||
}
|
}
|
||||||
|
|
||||||
(3) Indirect module export:
|
(3) Indirect default export:
|
||||||
|
|
||||||
const config = // configuration object here
|
const config = {
|
||||||
|
// configuration object here
|
||||||
|
}
|
||||||
|
export default config
|
||||||
|
|
||||||
|
(4) Indirect module export:
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
// configuration object here
|
||||||
|
}
|
||||||
module.exports = config
|
module.exports = config
|
||||||
|
|
||||||
|
(5) Direct default export with wrapping call:
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
// configuration object here
|
||||||
|
})
|
||||||
|
|
||||||
|
(6) Direct module export with wrapping call:
|
||||||
|
|
||||||
|
module.exports = defineConfig({
|
||||||
|
// configuration object here
|
||||||
|
})
|
||||||
|
|
||||||
|
(7) Indirect default export with wrapping call at the definition:
|
||||||
|
|
||||||
|
const config = defineConfig({
|
||||||
|
// configuration object here
|
||||||
|
})
|
||||||
|
export default config
|
||||||
|
|
||||||
|
(8) Indirect default export with wrapping call at the export:
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
// configuration object here
|
||||||
|
}
|
||||||
|
export default defineConfig(config)
|
||||||
|
|
||||||
|
(9) Indirect module export with wrapping call at the definition:
|
||||||
|
|
||||||
|
const config = defineConfig({
|
||||||
|
// configuration object here
|
||||||
|
})
|
||||||
|
module.exports = config
|
||||||
|
|
||||||
|
(10) Indirect module export with wrapping call at the export:
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
// configuration object here
|
||||||
|
}
|
||||||
|
module.exports = defineConfig(config)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class ConfigParser {
|
class ConfigParser {
|
||||||
// Ctor
|
// Ctor
|
||||||
// - configurationFile: path to the configuration file
|
// - configurationFile: path to the configuration file
|
||||||
// - blankConfigurationFile: a blank configuration file to use if non was previously found
|
// - blankConfigurationFile: a blank configuration file to use if non was previously found
|
||||||
constructor({ configurationFile, blankConfigurationFile, properties }) {
|
constructor({ configurationFile, blankConfigurationFile, allowWrappingCall = false, properties }) {
|
||||||
// Save field
|
// Save field
|
||||||
this.configurationFile = configurationFile
|
this.configurationFile = configurationFile
|
||||||
|
this.allowWrappingCall = allowWrappingCall === true
|
||||||
this.properties = properties
|
this.properties = properties
|
||||||
|
|
||||||
// If the configuration file does not exist, initialize it with the blank configuration file
|
// If the configuration file does not exist, initialize it with the blank configuration file
|
||||||
@@ -49,12 +99,43 @@ class ConfigParser {
|
|||||||
this.configuration = fs.readFileSync(this.configurationFile, 'utf8')
|
this.configuration = fs.readFileSync(this.configurationFile, 'utf8')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
findTopLevelVariableDeclarator(ast, identifierName) {
|
||||||
|
let targetDeclarator
|
||||||
|
ast.body.find(
|
||||||
|
node =>
|
||||||
|
node.type === 'VariableDeclaration' &&
|
||||||
|
node.declarations &&
|
||||||
|
node.declarations.length > 0 &&
|
||||||
|
node.declarations.find(declarator => {
|
||||||
|
if (
|
||||||
|
declarator.type === 'VariableDeclarator' &&
|
||||||
|
declarator.id &&
|
||||||
|
declarator.id.type === 'Identifier' &&
|
||||||
|
declarator.id.name === identifierName
|
||||||
|
) {
|
||||||
|
targetDeclarator = declarator
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
return targetDeclarator
|
||||||
|
}
|
||||||
|
|
||||||
// Find the configuration object in an AST.
|
// Find the configuration object in an AST.
|
||||||
// Look for a default export, a direct module export or an indirect module
|
// Look for, in order:
|
||||||
// export (in that order).
|
// - a direct default export
|
||||||
|
// - a direct default export with a wrapping call
|
||||||
|
// - an indirect default export
|
||||||
|
// - an indirect default export with a wrapping call at the definition
|
||||||
|
// - an indirect default export with a wrapping call at the export
|
||||||
|
// - a direct module export
|
||||||
|
// - a direct module export with a wrapping call
|
||||||
|
// - an indirect module export
|
||||||
|
// - an indirect module export with a wrapping call at the definition
|
||||||
|
// - an indirect module export with a wrapping call at the export
|
||||||
//
|
//
|
||||||
// Return the configuration object or null.
|
// Return the configuration object or null.
|
||||||
findConfigurationObject(ast) {
|
findConfigurationObject(ast, allowWrappingCall = false) {
|
||||||
// Try to find a default export
|
// Try to find a default export
|
||||||
var defaultExport = ast.body.find(node => node.type === 'ExportDefaultDeclaration')
|
var defaultExport = ast.body.find(node => node.type === 'ExportDefaultDeclaration')
|
||||||
|
|
||||||
@@ -64,21 +145,61 @@ class ConfigParser {
|
|||||||
return defaultExport.declaration
|
return defaultExport.declaration
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Direct default export with a wrapping call
|
||||||
|
else if (
|
||||||
|
allowWrappingCall &&
|
||||||
|
defaultExport &&
|
||||||
|
defaultExport.declaration.type === 'CallExpression' &&
|
||||||
|
defaultExport.declaration.arguments.length > 0 &&
|
||||||
|
defaultExport.declaration.arguments[0] &&
|
||||||
|
defaultExport.declaration.arguments[0].type === 'ObjectExpression'
|
||||||
|
) {
|
||||||
|
core.info('Found configuration object in direct default export declaration with a wrapping call')
|
||||||
|
return defaultExport.declaration.arguments[0]
|
||||||
|
}
|
||||||
|
|
||||||
// Indirect default export
|
// Indirect default export
|
||||||
else if (defaultExport && defaultExport.declaration.type === 'Identifier') {
|
else if (defaultExport && defaultExport.declaration.type === 'Identifier') {
|
||||||
const identifierName = defaultExport.declaration.name
|
const identifierName = defaultExport.declaration.name
|
||||||
const identifierDefinition = ast.body.find(
|
const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
|
||||||
node =>
|
const identifierInitialization = identifierDeclarator && identifierDeclarator.init
|
||||||
node.type === 'VariableDeclaration' &&
|
if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
|
||||||
node.declarations.length == 1 &&
|
|
||||||
node.declarations[0].type === 'VariableDeclarator' &&
|
|
||||||
node.declarations[0].id.type === 'Identifier' &&
|
|
||||||
node.declarations[0].id.name === identifierName &&
|
|
||||||
node.declarations[0].init.type === 'ObjectExpression'
|
|
||||||
)
|
|
||||||
if (identifierDefinition) {
|
|
||||||
core.info('Found configuration object in indirect default export declaration')
|
core.info('Found configuration object in indirect default export declaration')
|
||||||
return identifierDefinition.declarations[0].init
|
return identifierInitialization
|
||||||
|
}
|
||||||
|
// Indirect default export with a wrapping call at the definition
|
||||||
|
else if (
|
||||||
|
allowWrappingCall &&
|
||||||
|
identifierInitialization &&
|
||||||
|
identifierInitialization.type === 'CallExpression' &&
|
||||||
|
identifierInitialization.arguments.length > 0 &&
|
||||||
|
identifierInitialization.arguments[0] &&
|
||||||
|
identifierInitialization.arguments[0].type === 'ObjectExpression'
|
||||||
|
) {
|
||||||
|
core.info(
|
||||||
|
'Found configuration object in indirect default export declaration with a wrapping call at the definition'
|
||||||
|
)
|
||||||
|
return identifierInitialization.arguments[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Indirect default export with a wrapping call at the export
|
||||||
|
else if (
|
||||||
|
allowWrappingCall &&
|
||||||
|
defaultExport &&
|
||||||
|
defaultExport.declaration.type === 'CallExpression' &&
|
||||||
|
defaultExport.declaration.arguments.length > 0 &&
|
||||||
|
defaultExport.declaration.arguments[0] &&
|
||||||
|
defaultExport.declaration.arguments[0].type === 'Identifier'
|
||||||
|
) {
|
||||||
|
const identifierName = defaultExport.declaration.arguments[0].name
|
||||||
|
const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
|
||||||
|
const identifierInitialization = identifierDeclarator && identifierDeclarator.init
|
||||||
|
if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
|
||||||
|
core.info(
|
||||||
|
'Found configuration object in indirect default export declaration with a wrapping call at the export'
|
||||||
|
)
|
||||||
|
return identifierInitialization
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,21 +222,57 @@ class ConfigParser {
|
|||||||
return moduleExport.expression.right
|
return moduleExport.expression.right
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Direct default export with a wrapping call
|
||||||
|
else if (
|
||||||
|
allowWrappingCall &&
|
||||||
|
moduleExport &&
|
||||||
|
moduleExport.expression.right.type === 'CallExpression' &&
|
||||||
|
moduleExport.expression.right.arguments.length > 0 &&
|
||||||
|
moduleExport.expression.right.arguments[0] &&
|
||||||
|
moduleExport.expression.right.arguments[0].type === 'ObjectExpression'
|
||||||
|
) {
|
||||||
|
core.info('Found configuration object in direct module export with a wrapping call')
|
||||||
|
return moduleExport.expression.right.arguments[0]
|
||||||
|
}
|
||||||
|
|
||||||
// Indirect module export
|
// Indirect module export
|
||||||
else if (moduleExport && moduleExport.expression.right.type === 'Identifier') {
|
else if (moduleExport && moduleExport.expression.right.type === 'Identifier') {
|
||||||
const identifierName = moduleExport && moduleExport.expression.right.name
|
const identifierName = moduleExport && moduleExport.expression.right.name
|
||||||
const identifierDefinition = ast.body.find(
|
const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
|
||||||
node =>
|
const identifierInitialization = identifierDeclarator && identifierDeclarator.init
|
||||||
node.type === 'VariableDeclaration' &&
|
if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
|
||||||
node.declarations.length == 1 &&
|
|
||||||
node.declarations[0].type === 'VariableDeclarator' &&
|
|
||||||
node.declarations[0].id.type === 'Identifier' &&
|
|
||||||
node.declarations[0].id.name === identifierName &&
|
|
||||||
node.declarations[0].init.type === 'ObjectExpression'
|
|
||||||
)
|
|
||||||
if (identifierDefinition) {
|
|
||||||
core.info('Found configuration object in indirect module export')
|
core.info('Found configuration object in indirect module export')
|
||||||
return identifierDefinition.declarations[0].init
|
return identifierInitialization
|
||||||
|
}
|
||||||
|
// Indirect module export with a wrapping call at the definition
|
||||||
|
else if (
|
||||||
|
allowWrappingCall &&
|
||||||
|
identifierInitialization &&
|
||||||
|
identifierInitialization.type === 'CallExpression' &&
|
||||||
|
identifierInitialization.arguments.length > 0 &&
|
||||||
|
identifierInitialization.arguments[0] &&
|
||||||
|
identifierInitialization.arguments[0].type === 'ObjectExpression'
|
||||||
|
) {
|
||||||
|
core.info('Found configuration object in indirect module export with a wrapping call at the definition')
|
||||||
|
return identifierInitialization.arguments[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Indirect module export with a wrapping call at the export
|
||||||
|
else if (
|
||||||
|
allowWrappingCall &&
|
||||||
|
moduleExport &&
|
||||||
|
moduleExport.expression.right.type === 'CallExpression' &&
|
||||||
|
moduleExport.expression.right.arguments.length > 0 &&
|
||||||
|
moduleExport.expression.right.arguments[0] &&
|
||||||
|
moduleExport.expression.right.arguments[0].type === 'Identifier'
|
||||||
|
) {
|
||||||
|
const identifierName = moduleExport.expression.right.arguments[0].name
|
||||||
|
const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
|
||||||
|
const identifierInitialization = identifierDeclarator && identifierDeclarator.init
|
||||||
|
if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
|
||||||
|
core.info('Found configuration object in indirect module export declaration with a wrapping call at the export')
|
||||||
|
return identifierInitialization
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,7 +336,7 @@ class ConfigParser {
|
|||||||
const ast = espree.parse(this.configuration, espreeOptions)
|
const ast = espree.parse(this.configuration, espreeOptions)
|
||||||
|
|
||||||
// Find the configuration object
|
// Find the configuration object
|
||||||
var configurationObject = this.findConfigurationObject(ast)
|
var configurationObject = this.findConfigurationObject(ast, this.allowWrappingCall)
|
||||||
if (!configurationObject) {
|
if (!configurationObject) {
|
||||||
throw 'Could not find a configuration object in the configuration file'
|
throw 'Could not find a configuration object in the configuration file'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ const tempFolder = getTempFolder()
|
|||||||
// Cases to test
|
// Cases to test
|
||||||
const cases = [
|
const cases = [
|
||||||
//
|
//
|
||||||
// Default export
|
// Direct default export
|
||||||
//
|
//
|
||||||
{
|
{
|
||||||
property: 'property',
|
property: 'property',
|
||||||
@@ -97,11 +97,13 @@ const cases = [
|
|||||||
source: 'const config = {}; export default config',
|
source: 'const config = {}; export default config',
|
||||||
expected: 'const config = { property: "value"}; export default config'
|
expected: 'const config = { property: "value"}; export default config'
|
||||||
},
|
},
|
||||||
|
// with more than 1 declaration chained together
|
||||||
{
|
{
|
||||||
property: 'property',
|
property: 'property',
|
||||||
source: 'var config = {}; export default config',
|
source: 'var temp = {}, config = {}; export default config',
|
||||||
expected: 'var config = { property: "value"}; export default config'
|
expected: 'var temp = {}, config = { property: "value"}; export default config'
|
||||||
},
|
},
|
||||||
|
// deeper
|
||||||
{
|
{
|
||||||
property: 'a.b.c',
|
property: 'a.b.c',
|
||||||
source: 'var config = {}; export default config',
|
source: 'var config = {}; export default config',
|
||||||
@@ -140,11 +142,13 @@ const cases = [
|
|||||||
source: 'const config = {}; module.exports = config',
|
source: 'const config = {}; module.exports = config',
|
||||||
expected: 'const config = { property: "value"}; module.exports = config'
|
expected: 'const config = { property: "value"}; module.exports = config'
|
||||||
},
|
},
|
||||||
|
// with more than 1 declaration chained together
|
||||||
{
|
{
|
||||||
property: 'property',
|
property: 'property',
|
||||||
source: 'var config = {}; module.exports = config',
|
source: 'var temp = {}, config = {}; module.exports = config',
|
||||||
expected: 'var config = { property: "value"}; module.exports = config'
|
expected: 'var temp = {}, config = { property: "value"}; module.exports = config'
|
||||||
},
|
},
|
||||||
|
// deeper
|
||||||
{
|
{
|
||||||
property: 'a.b.c',
|
property: 'a.b.c',
|
||||||
source: 'var config = {}; module.exports = config',
|
source: 'var config = {}; module.exports = config',
|
||||||
@@ -154,6 +158,109 @@ const cases = [
|
|||||||
property: 'a.b.c',
|
property: 'a.b.c',
|
||||||
source: 'var config = { a: { b: [], c: "hello" } }; module.exports = config',
|
source: 'var config = { a: { b: [], c: "hello" } }; module.exports = config',
|
||||||
expected: 'var config = { a: { b: { c: "value"}, c: "hello" } }; module.exports = config'
|
expected: 'var config = { a: { b: { c: "value"}, c: "hello" } }; module.exports = config'
|
||||||
|
},
|
||||||
|
|
||||||
|
//
|
||||||
|
// Direct default export with wrapping call
|
||||||
|
//
|
||||||
|
{
|
||||||
|
property: 'property',
|
||||||
|
source: 'import { defineConfig } from "astro/config"; export default defineConfig({ p1: 0 })',
|
||||||
|
expected: 'import { defineConfig } from "astro/config"; export default defineConfig({ property: "value", p1: 0 })',
|
||||||
|
allowWrappingCall: true
|
||||||
|
},
|
||||||
|
|
||||||
|
//
|
||||||
|
// Direct module exports with wrapping call
|
||||||
|
//
|
||||||
|
{
|
||||||
|
property: 'property',
|
||||||
|
source: 'const { defineConfig } = require("astro/config"); module.exports = defineConfig({ p1: 0 })',
|
||||||
|
expected:
|
||||||
|
'const { defineConfig } = require("astro/config"); module.exports = defineConfig({ property: "value", p1: 0 })',
|
||||||
|
allowWrappingCall: true
|
||||||
|
},
|
||||||
|
|
||||||
|
//
|
||||||
|
// Indirect default export with wrapping call at the definition
|
||||||
|
//
|
||||||
|
{
|
||||||
|
property: 'property',
|
||||||
|
source: 'import { defineConfig } from "astro/config"; const config = defineConfig({}); export default config',
|
||||||
|
expected:
|
||||||
|
'import { defineConfig } from "astro/config"; const config = defineConfig({ property: "value" }); export default config',
|
||||||
|
allowWrappingCall: true
|
||||||
|
},
|
||||||
|
// with more than 1 declaration chained together
|
||||||
|
{
|
||||||
|
property: 'property',
|
||||||
|
source:
|
||||||
|
'import { defineConfig } from "astro/config"; const temp = {}, config = defineConfig({}); export default config',
|
||||||
|
expected:
|
||||||
|
'import { defineConfig } from "astro/config"; const temp = {}, config = defineConfig({ property: "value" }); export default config',
|
||||||
|
allowWrappingCall: true
|
||||||
|
},
|
||||||
|
|
||||||
|
//
|
||||||
|
// Indirect default export with wrapping call at the export
|
||||||
|
//
|
||||||
|
{
|
||||||
|
property: 'property',
|
||||||
|
source: 'import { defineConfig } from "astro/config"; const config = {}; export default defineConfig(config)',
|
||||||
|
expected:
|
||||||
|
'import { defineConfig } from "astro/config"; const config = { property: "value" }; export default defineConfig(config)',
|
||||||
|
allowWrappingCall: true
|
||||||
|
},
|
||||||
|
// with more than 1 declaration chained together
|
||||||
|
{
|
||||||
|
property: 'property',
|
||||||
|
source:
|
||||||
|
'import { defineConfig } from "astro/config"; const temp = {}, config = {}; export default defineConfig(config)',
|
||||||
|
expected:
|
||||||
|
'import { defineConfig } from "astro/config"; const temp = {}, config = { property: "value" }; export default defineConfig(config)',
|
||||||
|
allowWrappingCall: true
|
||||||
|
},
|
||||||
|
|
||||||
|
//
|
||||||
|
// Indirect module exports with wrapping call at the definition
|
||||||
|
//
|
||||||
|
{
|
||||||
|
property: 'property',
|
||||||
|
source:
|
||||||
|
'const { defineConfig } = require("astro/config"); const config = defineConfig({}); module.exports = config',
|
||||||
|
expected:
|
||||||
|
'const { defineConfig } = require("astro/config"); const config = defineConfig({ property: "value"}); module.exports = config',
|
||||||
|
allowWrappingCall: true
|
||||||
|
},
|
||||||
|
// with more than 1 declaration chained together
|
||||||
|
{
|
||||||
|
property: 'property',
|
||||||
|
source:
|
||||||
|
'const { defineConfig } = require("astro/config"); const temp = {}, config = defineConfig({}); module.exports = config',
|
||||||
|
expected:
|
||||||
|
'const { defineConfig } = require("astro/config"); const temp = {}, config = defineConfig({ property: "value"}); module.exports = config',
|
||||||
|
allowWrappingCall: true
|
||||||
|
},
|
||||||
|
|
||||||
|
//
|
||||||
|
// Indirect module exports with wrapping call at the export
|
||||||
|
//
|
||||||
|
{
|
||||||
|
property: 'property',
|
||||||
|
source:
|
||||||
|
'const { defineConfig } = require("astro/config"); const config = {}; module.exports = defineConfig(config)',
|
||||||
|
expected:
|
||||||
|
'const { defineConfig } = require("astro/config"); const config = { property: "value"}; module.exports = defineConfig(config)',
|
||||||
|
allowWrappingCall: true
|
||||||
|
},
|
||||||
|
// with more than 1 declaration chained together
|
||||||
|
{
|
||||||
|
property: 'property',
|
||||||
|
source:
|
||||||
|
'const { defineConfig } = require("astro/config"); const temp = {}, config = {}; module.exports = defineConfig(config)',
|
||||||
|
expected:
|
||||||
|
'const { defineConfig } = require("astro/config"); const temp = {}, config = { property: "value"}; module.exports = defineConfig(config)',
|
||||||
|
allowWrappingCall: true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -168,7 +275,7 @@ describe('config-parser', () => {
|
|||||||
jest.spyOn(core, 'debug').mockImplementation(jest.fn())
|
jest.spyOn(core, 'debug').mockImplementation(jest.fn())
|
||||||
})
|
})
|
||||||
|
|
||||||
cases.forEach(({ property, source, expected }, index) => {
|
cases.forEach(({ property, source, expected, allowWrappingCall = false }, index) => {
|
||||||
it(`injects path properly for case #${index}`, () => {
|
it(`injects path properly for case #${index}`, () => {
|
||||||
// Write the source file
|
// Write the source file
|
||||||
const sourceFile = `${tempFolder}/source.js`
|
const sourceFile = `${tempFolder}/source.js`
|
||||||
@@ -180,7 +287,8 @@ describe('config-parser', () => {
|
|||||||
|
|
||||||
// Update the settings and do the injection
|
// Update the settings and do the injection
|
||||||
new ConfigParser({
|
new ConfigParser({
|
||||||
configurationFile: sourceFile
|
configurationFile: sourceFile,
|
||||||
|
allowWrappingCall
|
||||||
}).inject(property, 'value')
|
}).inject(property, 'value')
|
||||||
|
|
||||||
// Compare the files
|
// Compare the files
|
||||||
|
|||||||
Reference in New Issue
Block a user