Skip to content

Commit

Permalink
Further improve treeshaking / hydrating ASAP with aws-lite
Browse files Browse the repository at this point in the history
  • Loading branch information
ryanblock committed Apr 9, 2024
1 parent 51d3cd2 commit 8d274d6
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 31 deletions.
2 changes: 1 addition & 1 deletion changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

---

## [4.0.4] 2024-04-08
## [4.0.4 - 4.0.5] 2024-04-08

### Fixed

Expand Down
10 changes: 1 addition & 9 deletions src/actions/autoinstall/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,6 @@ module.exports = function autoinstaller (params) {
let { dirs, inventory, update, verbose } = params
if (!dirs.length) return []

let asap = inventory.inv.http?.find(l => l.arcStaticAssetProxy)
if (asap) {
dirs.push(asap.src)
}

update.start('Finding dependencies')

// Generated manifests to be hydrated later (if there are no parsing failures)
Expand Down Expand Up @@ -73,10 +68,7 @@ module.exports = function autoinstaller (params) {
function getRuntimeDirs (dirs, inventory, runtimeName) {
let runtimeDirs = dirs.filter(dir => {
let lambda = inventory.inv.lambdasBySrcDir[dir]
if (!lambda) {
lambda = inventory.inv.http?.find(l => l.arcStaticAssetProxy)
if (!lambda) throw ReferenceError(`Cannot find Lambda at: ${dir}`)
}
if (!lambda) lambda = inventory.inv.http?.find(l => l.arcStaticAssetProxy)
if (Array.isArray(lambda)) lambda = lambda[0] // Multi-tenant Lambda check
let { runtime, hydrate } = lambda.config
return runtime.startsWith(runtimeName) && hydrate !== false
Expand Down
5 changes: 1 addition & 4 deletions src/actions/autoinstall/node/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,7 @@ module.exports = function treeshakeNode (nodeDirs, params) {
nodeDirs.forEach(dir => {
projectDirs++
let lambda = inventory.inv.lambdasBySrcDir[dir]
if (!lambda) {
lambda = inventory.inv.http?.find(l => l.arcStaticAssetProxy)
if (!lambda) throw ReferenceError(`Cannot find Lambda at: ${dir}`)
}
if (!lambda) lambda = inventory.inv.http?.find(l => l.arcStaticAssetProxy)
if (Array.isArray(lambda)) lambda = lambda[0] // Multi-tenant Lambda check
let { config, name, pragma } = lambda
let { runtime } = config
Expand Down
44 changes: 27 additions & 17 deletions src/hydrate.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,10 @@ function hydrator (inventory, installing, params, callback) {

// Does this project have any Lambdae?
let hasLambdae = inv.lambdaSrcDirs?.length
let hasASAP = inventory.inv.http?.find(l => l.arcStaticAssetProxy)
let manifestFiles = [ 'package.json', 'requirements.txt', 'Gemfile' ]
let possibleLambdaManifests = []
if (hasLambdae) possibleLambdaManifests = inv.lambdaSrcDirs.reduce((acc, dir) => {
if (hasLambdae) possibleLambdaManifests = inv.lambdaSrcDirs?.reduce((acc, dir) => {
acc.push(...manifestFiles.map(manifest => stripCwd(join(dir, manifest), cwd)))
return acc
}, [])
Expand Down Expand Up @@ -120,24 +121,33 @@ function hydrator (inventory, installing, params, callback) {
})

// Run the autoinstaller first in case we need to add any new manifests to the ops
if (autoinstall && installing && hasLambdae) {
if (autoinstall && installing && (hasLambdae || hasASAP)) {
let srcDirsWithoutManifests = []

// Ignore directories already known to have a manifest
let srcDirsWithoutManifests = Object.entries(inv.lambdasBySrcDir).map(([ src, lambda ]) => {
if (Array.isArray(lambda)) lambda = lambda[0] // Multi-tenant Lambda check
let rel = stripCwd(src, cwd)
let lambdaHasManifest = manifests.some(file => dirname(file) === rel)
// TODO this should be enumerated in inventory
if (lambdaHasManifest && lambda.config.runtime.startsWith('nodejs')) {
try {
let pkg = JSON.parse(readFileSync(join(src, 'package.json')))
if (!pkg.dependencies && !pkg.peerDependencies && !pkg.devDependencies) return src
}
catch (err) {
update.error(`Invalid or unable to read ${src}${sep}package.json`)
if (hasLambdae) {
srcDirsWithoutManifests = Object.entries(inv.lambdasBySrcDir).map(([ src, lambda ]) => {
if (Array.isArray(lambda)) lambda = lambda[0] // Multi-tenant Lambda check
let rel = stripCwd(src, cwd)
let lambdaHasManifest = manifests.some(file => dirname(file) === rel)
// TODO this should be enumerated in inventory
if (lambdaHasManifest && lambda.config.runtime.startsWith('nodejs')) {
try {
let pkg = JSON.parse(readFileSync(join(src, 'package.json')))
if (!pkg.dependencies && !pkg.peerDependencies && !pkg.devDependencies) return src
}
catch (err) {
update.error(`Invalid or unable to read ${src}${sep}package.json`)
}
}
}
else if (!lambdaHasManifest) return src
}).filter(Boolean)
else if (!lambdaHasManifest) return src
}).filter(Boolean)
}

// Handle special case: ASAP doesn't appear in lambdasBySrcDir since it's not userland
if (hasASAP) {
srcDirsWithoutManifests.push(hasASAP.src)
}

// Allow scoping to a single directory
if (basepath) {
Expand Down

0 comments on commit 8d274d6

Please sign in to comment.