diff --git a/scripts/lib/portable-package.mjs b/scripts/lib/portable-package.mjs index b99d572..af6d4a0 100644 --- a/scripts/lib/portable-package.mjs +++ b/scripts/lib/portable-package.mjs @@ -98,7 +98,11 @@ function copyRuntimeDependencies(sourceRoot, destinationRoot, rootNames) { try { entry = requireFrom.resolve(name); } catch (error) { - throw new Error(`Runtime dependency ${name} is unavailable from ${sourceRoot}.`, { cause: error }); + try { + entry = requireFrom.resolve(`${name}/package`); + } catch { + throw new Error(`Runtime dependency ${name} is unavailable from ${sourceRoot}.`, { cause: error }); + } } const root = packageRootFromEntry(entry, name); const manifest = json(join(root, "package.json")); @@ -117,6 +121,14 @@ function copyRuntimeDependencies(sourceRoot, destinationRoot, rootNames) { for (const dependency of Object.keys(manifest.dependencies ?? {})) { copyResolved(dependency, nestedRequire, join(destination, "node_modules"), nestedAncestors); } + for (const dependency of Object.keys(manifest.optionalDependencies ?? {})) { + try { + copyResolved(dependency, nestedRequire, join(destination, "node_modules"), nestedAncestors); + } catch (error) { + if (error?.cause?.code !== "MODULE_NOT_FOUND") throw error; + debug(`skip unavailable optional dependency ${dependency}`); + } + } } const rootRequire = createRequire(join(sourceRoot, "package.json")); for (const name of rootNames) copyResolved(name, rootRequire, join(destinationRoot, "node_modules"), new Set()); @@ -306,7 +318,7 @@ export async function buildAndValidatePortablePackage({ evidenceDirectory, outpu const serverRoot = join(packageDirectory, "server"); debug("copy API application"); - const apiDependencies = copyApplication(join(repositoryRoot, "apps", "api"), join(serverRoot, "api"), ["@fastify/multipart", "@fastify/swagger", "@sinclair/typebox", "better-sqlite3", "fastify"]); + const apiDependencies = copyApplication(join(repositoryRoot, "apps", "api"), join(serverRoot, "api"), ["@fastify/multipart", "@fastify/swagger", "@sinclair/typebox", "better-sqlite3", "fastify", "sharp"]); debug("copy Worker application"); const workerDependencies = copyApplication(join(repositoryRoot, "apps", "worker"), join(serverRoot, "worker"), ["better-sqlite3"]); const sharedDestination = join(serverRoot, "api", "node_modules", "@dada", "shared-contracts");