Skip to content

Commit

Permalink
split codegen exports and improve support for impl-style modules (#34)
Browse files Browse the repository at this point in the history
fubhy authored Nov 10, 2023
1 parent b6506f3 commit 01d02ba
Showing 5 changed files with 58 additions and 12 deletions.
5 changes: 5 additions & 0 deletions .changeset/mean-otters-burn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@effect/build-utils": minor
---

Improve support for `impl`-style modules
5 changes: 5 additions & 0 deletions .changeset/spicy-wombats-knock.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@effect/build-utils": minor
---

Split codegen config and allow for both include & exclude glob patterns
8 changes: 6 additions & 2 deletions src/PackV2.ts
Original file line number Diff line number Diff line change
@@ -17,10 +17,14 @@ export const run = Effect.gen(function*(_) {
const ctx = yield* _(PackageContext)

const modules = yield* _(
fsUtils.glob(ctx.packageJson.effect.publicModules, {
fsUtils.glob(ctx.packageJson.effect.generateExports.include, {
nodir: true,
cwd: "src",
ignore: ["**/internal/**", "**/impl/**", "**/index.ts"],
ignore: [
...ctx.packageJson.effect.generateExports.exclude,
"**/internal/**",
"**/index.ts",
],
}),
Effect.map(ReadonlyArray.map(String.replace(/\.ts$/, ""))),
Effect.map(ReadonlyArray.sort(Order.string)),
33 changes: 27 additions & 6 deletions src/PackageContext.ts
Original file line number Diff line number Diff line change
@@ -2,14 +2,35 @@ import * as FileSystem from "@effect/platform-node/FileSystem"
import * as Schema from "@effect/schema/Schema"
import { Context, Effect, Layer } from "effect"

const effectConfigDefaults = {
generateExports: {
include: ["*.ts", "impl/*.ts"],
exclude: [],
},
generateIndex: {
include: ["*.ts"],
exclude: [],
},
}
export class EffectConfig extends Schema.Class<EffectConfig>()({
publicModules: Schema.optional(Schema.array(Schema.string)).withDefault(
() => ["*.ts"],
),
generateExports: Schema.optional(Schema.struct({
include: Schema.optional(Schema.array(Schema.string)).withDefault(
() => effectConfigDefaults.generateExports.include,
),
exclude: Schema.optional(Schema.array(Schema.string)).withDefault(
() => effectConfigDefaults.generateExports.exclude,
),
})).withDefault(() => effectConfigDefaults.generateExports),
generateIndex: Schema.optional(Schema.struct({
include: Schema.optional(Schema.array(Schema.string)).withDefault(
() => effectConfigDefaults.generateIndex.include,
),
exclude: Schema.optional(Schema.array(Schema.string)).withDefault(
() => effectConfigDefaults.generateIndex.exclude,
),
})).withDefault(() => effectConfigDefaults.generateIndex),
}) {
static readonly default = new EffectConfig({
publicModules: ["*.ts"],
})
static readonly default = new EffectConfig(effectConfigDefaults)
}

export class PackageJson extends Schema.Class<PackageJson>()({
19 changes: 15 additions & 4 deletions src/PrepareV2.ts
Original file line number Diff line number Diff line change
@@ -11,10 +11,14 @@ export const run = Effect.gen(function*(_) {
const pkgRaw = yield* _(fsUtils.readJson("package.json"))
const pkg = yield* _(PackageJson.parse(pkgRaw))
const entrypoints = yield* _(
fsUtils.glob(pkg.effect.publicModules, {
fsUtils.glob(pkg.effect.generateIndex.include, {
nodir: true,
cwd: "src",
ignore: ["**/internal/**", "**/impl/**", "**/index.ts"],
ignore: [
...pkg.effect.generateIndex.exclude,
"**/internal/**",
"**/index.ts",
],
}),
)

@@ -39,9 +43,16 @@ export const run = Effect.gen(function*(_) {
const hasImpl = yield* _(
fs.exists(path.join("src", "impl", `${module}.ts`)),
)

const topComment = content.match(/\/\*\*\n.+?\*\//s)?.[0] ?? ""
const exportPattern = hasImpl ? `{ ${module} }` : `* as ${module}`
return `${topComment}\nexport ${exportPattern} from "./${module}.js"`

if (hasImpl) {
return `export {\n ${
topComment.split("\n").join("\n ")
}\n ${module}\n} from "./${module}.js"`
}

return `${topComment}\nexport * as ${module} from "./${module}.js"`
}),
{ concurrency: "inherit" },
),

0 comments on commit 01d02ba

Please sign in to comment.