Some checks failed
Deploy analytics worker / Deploy analytics worker to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
i18n upload strings / Upload latest strings (push) Failing after 1s
Deploy bemo / Deploy bemo to ${{ (github.ref == 'refs/heads/bemo-production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
Deploy grafana resources / ${{ github.event_name == 'push' && 'Deploy grafana resources' || 'Validate grafana resources (dry run)' }} (push) Failing after 0s
End to end tests (dotcom) / Check for relevant changes (push) Failing after 0s
End to end tests (examples) / Check for relevant changes (push) Failing after 0s
End to end tests (mermaid readability) / Check for relevant changes (push) Failing after 1s
End to end tests (perf) / Check for relevant changes (push) Failing after 0s
Publish editor extensions / Publish editor extensions (push) Failing after 1s
Publish SDK packages / Remove the publish-packages label (push) Has been skipped
Checks / Tests & checks (push) Has been cancelled
Checks / Build all projects (push) Has been cancelled
Deploy templates / Deploy templates (push) Has been cancelled
End to end tests (dotcom) / End to end tests (dotcom) (push) Has been cancelled
End to end tests (mermaid readability) / End to end tests (mermaid readability) (push) Has been cancelled
End to end tests (perf) / End to end tests (perf) (push) Has been cancelled
Deploy .com / Deploy dotcom to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Has been cancelled
End to end tests (examples) / End to end tests (examples) (push) Has been cancelled
Publish SDK packages / Publish SDK packages (push) Has been cancelled
Publish SDK packages / Tell user released version (push) Has been cancelled
Publish SDK packages / Publishes code templates to separate repositories (push) Has been cancelled
Publish SDK packages / Deploys the template demos with the new SDK version (push) Has been cancelled
78 lines
2.2 KiB
TypeScript
78 lines
2.2 KiB
TypeScript
import { existsSync, readFileSync, statSync, writeFileSync } from 'fs'
|
|
import path from 'path'
|
|
import { glob } from 'glob'
|
|
import { parse, print, visit } from 'recast'
|
|
|
|
const extensions = ['.js', '.mjs', '.cjs']
|
|
function resolveRelativePath(importingFile: string, relativePath: string) {
|
|
if (!relativePath.startsWith('.')) {
|
|
return relativePath
|
|
}
|
|
|
|
const containingDir = path.dirname(importingFile)
|
|
|
|
if (
|
|
existsSync(path.join(containingDir, relativePath)) &&
|
|
!statSync(path.join(containingDir, relativePath)).isDirectory()
|
|
) {
|
|
// if the file already exists, e.g. .css files, just use it
|
|
return relativePath
|
|
}
|
|
|
|
// strip the file extension if applicable
|
|
relativePath.replace(/\.(m|c)?js$/, '')
|
|
|
|
for (const extension of extensions) {
|
|
if (relativePath.endsWith(extension)) {
|
|
return relativePath
|
|
} else {
|
|
let candidate = `${relativePath}${extension}`
|
|
if (existsSync(path.join(containingDir, candidate))) {
|
|
return candidate
|
|
}
|
|
|
|
candidate = `${relativePath}/index${extension}`
|
|
|
|
if (existsSync(path.join(containingDir, candidate))) {
|
|
return candidate
|
|
}
|
|
}
|
|
}
|
|
|
|
throw new Error(`Could not resolve relative path ${relativePath} from ${importingFile}`)
|
|
}
|
|
|
|
export function addJsExtensions(distDir: string) {
|
|
for (const file of glob.sync(path.join(distDir, '**/*.{mjs,cjs,js}'))) {
|
|
const code = parse(readFileSync(file, 'utf8'), { parser: require('recast/parsers/typescript') })
|
|
|
|
visit(code, {
|
|
visitImportDeclaration(path) {
|
|
path.value.source.value = resolveRelativePath(file, path.value.source.value)
|
|
return false
|
|
},
|
|
visitExportAllDeclaration(path) {
|
|
path.value.source.value = resolveRelativePath(file, path.value.source.value)
|
|
return false
|
|
},
|
|
visitExportNamedDeclaration(path) {
|
|
if (path.value.source) {
|
|
path.value.source.value = resolveRelativePath(file, path.value.source.value)
|
|
}
|
|
this.traverse(path)
|
|
},
|
|
visitCallExpression(path) {
|
|
if (
|
|
path.value.callee.type === 'Import' &&
|
|
path.value.arguments[0]?.type === 'StringLiteral'
|
|
) {
|
|
path.value.arguments[0].value = resolveRelativePath(file, path.value.arguments[0].value)
|
|
}
|
|
this.traverse(path)
|
|
},
|
|
})
|
|
|
|
writeFileSync(file, print(code).code)
|
|
}
|
|
}
|