Files
insights-js/packages/convex/babel-plugin-import-meta-glob.cjs
Richard SolomouGitHubCopilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
165f048c28 feat: add @posthog/convex package (#3077)
* chore: move progress from posthog-convex repo

* Switch from vitest to jest

* fix readme link

* add changeset

* Potential fix for code scanning alert no. 2135: Incomplete string escaping or encoding

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* fix(convex): stabilize example tests in CI

* fix(react-native): declare missing babel preset-react

* Revert "fix(react-native): declare missing babel preset-react"

This reverts commit 9fe94730. The change was a fix for a
broken test from a different PR, not needed here.

* refactor(convex): move example app to examples/example-convex

Move the Convex example from packages/convex/example/ to the
top-level examples/ directory for consistency with other SDK examples.

- Create standalone package.json with own dependencies
- Exclude test files from convex tsconfig (Convex dev typecheck)
- Update jest config roots and moduleNameMapper to resolve
  @posthog/convex from workspace source for integration tests
- Update convex.json functions path
- Remove example-only devDeps from package (chokidar-cli, react, etc.)

* fix(react-native): declare @babel/preset-react as devDependency

The react-native package uses @babel/preset-react in its babel config
but never declared it explicitly. Also add typescript to convex package's
devDependencies via catalog to prevent lockfile version drift from
cascading to unrelated packages.

* chore(convex): address PR review feedback

- Remove unnecessary client/_generated directory (convex-test finds component/_generated)
- Remove placeholder lib.test.ts
- Use pnpm instead of npm in README install instructions

* fix: regenerate lockfile from main to resolve babel side effects

Reset pnpm-lock.yaml to main and regenerated with only the convex
package dependencies on top, eliminating hoisting changes that were
causing posthog-js-lite build failures on Vercel.

* fix: declare babel presets as explicit devDependencies

Add @babel/preset-env and @babel/preset-typescript to packages that
reference them in babel.config but never declared them. These were
resolving via hoisting, which broke when the dependency tree changed.

---------

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2026-02-16 12:12:19 +02:00

74 lines
2.3 KiB
JavaScript

/**
* Babel plugin that transforms Vite's import.meta.glob() calls into
* static module maps with dynamic import() for use with Jest in ESM mode.
*
* Transforms:
* import.meta.glob('./**\/*.ts')
* Into:
* { './foo.ts': () => import('./foo.ts'), './bar.ts': () => import('./bar.ts') }
*/
const fs = require('fs')
const path = require('path')
function matchGlob(pattern, filePath) {
// Convert glob pattern to regex
// First escape all regex metacharacters, then translate glob tokens.
const escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
const regexStr = escaped
// Handle **/ separately: it matches zero or more directory segments
.replace(/\\\*\\\*\//g, '(?:.*/)?')
.replace(/\\\*/g, '[^/]*')
return new RegExp('^' + regexStr + '$').test(filePath)
}
function findFiles(dir) {
const entries = fs.readdirSync(dir, { recursive: true, withFileTypes: false })
return entries
.map((entry) => './' + entry.toString().replace(/\\/g, '/'))
.filter((entry) => {
try {
return fs.statSync(path.join(dir, entry)).isFile()
} catch {
return false
}
})
}
module.exports = function ({ types: t }) {
return {
visitor: {
CallExpression(nodePath, state) {
const callee = nodePath.node.callee
if (
callee.type === 'MemberExpression' &&
callee.object.type === 'MetaProperty' &&
callee.object.meta.name === 'import' &&
callee.object.property.name === 'meta' &&
callee.property.name === 'glob' &&
nodePath.node.arguments.length >= 1 &&
nodePath.node.arguments[0].type === 'StringLiteral'
) {
const pattern = nodePath.node.arguments[0].value
const sourceDir = path.dirname(state.filename)
const files = findFiles(sourceDir)
.filter((f) => matchGlob(pattern, f))
.filter((f) => !f.includes('/node_modules/'))
.sort()
const properties = files.map((file) =>
t.objectProperty(
t.stringLiteral(file),
t.arrowFunctionExpression(
[],
t.callExpression(t.import(), [t.stringLiteral(file)])
)
)
)
nodePath.replaceWith(t.objectExpression(properties))
}
},
},
}
}